使用 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 的东西

yieldvar、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 和 4.0 中的新功能列表 [关闭]

C# 2.0 中的新增功能03 匿名方法

如何在 c# 2.0/3.0 上选择指定值的 xmlelements xmlnodes xmlattributes

如何在 C# 2.0 中支持泛型表达式

如何使用 C# 4.0 编译器让 MonoDevelop 以 .NET 2.0 框架为目标?

C# 3.0中的新增功能10 表达式树 02 说明