使用 C# 3.0 编译的 C# 2.0 代码使用程序集
Posted
技术标签:
【中文标题】使用 C# 3.0 编译的 C# 2.0 代码使用程序集【英文标题】:C# 2.0 code consuming assemblies compiled with C# 3.0 【发布时间】:2010-09-05 18:54:59 【问题描述】:这应该没问题,因为 CLR 实际上并没有改变?
运行 C# 2.0 代码的盒子已经推出了 .NET 3.5。
背景是我们有一个 Windows 服务(使用 VS2005 构建的 .NET 2.0 exe,部署到大约 150 台服务器),它可以动态加载程序集(几乎像插件)以完成要求它的各种工作项。每当我们推出新版本的总线逻辑时,我们只需将程序集放到 FTP 服务器上,Windows 服务就会知道如何检查、获取和存储最新版本。现在使用 VS2008 构建新的程序集并以 .NET 2.0 为目标,我们知道这可以正常工作。但是,我们希望开始利用 C# 3.0 语言功能(例如 LINQ)并将程序集针对 .NET 3.5,而无需构建和部署新版本的 Windows 服务。
【问题讨论】:
【参考方案1】:C#3 和 .Net 3.5 添加了新的程序集,但 IL 没有改变。
这意味着您可以使用 .Net 2 程序集编译和使用 C#3,只要您不使用 Linq 或其他任何引用 System.Linq 或 System.Core 的东西
yield
、var
、lambda 语法、匿名类型和初始化器都是编译器的聪明之处。他们产生的 IL 是交叉兼容的。
如果您可以引用 3.5 的新程序集,它应该都能正常工作。
没有新版本的 ASP.Net - 它仍然应该是 2.0.50727 - 但您仍然应该为 3.5 编译
【讨论】:
【参考方案2】:yield、var、lambda 语法、匿名类型 和初始化器都是编译器 聪明。他们产生的 IL 是 交叉兼容。
次要的挑剔点,但产量无论如何都是 2.0 的功能。
【讨论】:
【参考方案3】:这是有趣的东西。昨天我在看LinqBridge,在这个论坛上有人向我建议之后,他们正在做类似的事情。
我觉得奇怪的是,微软将框架命名为 2.0、3.0 和 3.5,因为它们都编译下来生成 2.0 CLR 所需的相同 IL。我原以为将版本添加到 2.0 会更有意义,尽管我想也很难让人们了解存在不同版本的运行时、编译器和语言这一事实。
【讨论】:
以上是关于使用 C# 3.0 编译的 C# 2.0 代码使用程序集的主要内容,如果未能解决你的问题,请参考以下文章
如何在 c# 2.0/3.0 上选择指定值的 xmlelements xmlnodes xmlattributes