哪些规则管理 .NET 应用程序和 C# 语言的跨版本兼容性?
Posted
技术标签:
【中文标题】哪些规则管理 .NET 应用程序和 C# 语言的跨版本兼容性?【英文标题】:What rules govern cross-version compatibility for .NET applications and the C# language? 【发布时间】:2010-02-25 13:01:17 【问题描述】:由于某种原因,我一直难以记住框架做出的向后/向前兼容性保证,所以我想永远把它放在床上。
假设我有两个程序集,A
和 B
。 A
较旧并引用 .NET 2.0 程序集; B
引用 .NET 3.5 程序集。我分别有A
和B
、Ax
和Bx
的来源;它们是在 2.0 和 3.0 语言级别用 C# 编写的。 (也就是说,Ax
不使用 C# 2.0 之后引入的功能;同样Bx
不使用 3.0 之后引入的功能。)
我有两个环境,C
和 D
。 C
已安装 .NET 2.0 框架; D
已安装 .NET 3.5 框架。
现在,我可以/不可以做什么?
跑步:
-
在
C
上运行A
?在D
上运行A
?
在C
上运行B
?在D
上运行C
?
编译:
-
在
C
上编译Ax
?在D
上编译Ax
?
在C
上编译Bx
?在D
上编译Bx
?
重写:
-
重写
Ax
以使用 C# 3 语言级别的功能,并在 D
上编译它,同时在 C
上仍然可以工作?
重写 Bx
以在另一个具有 .NET 4 的环境 E
上使用 C# 4 语言级别的功能,同时它仍然可以在 D
上工作?'
从另一个程序集引用:
-
从
A
引用B
并在C
上使用客户端应用程序?
从A
引用B
并在D
上有一个客户端应用程序使用它?
从B
引用A
并在C
上使用客户端应用程序?
从B
引用A
并在D
上使用客户端应用程序?
更重要的是,哪些规则可以控制这些假设场景的真假?
【问题讨论】:
必须了解更多才能了解这个问题! 【参考方案1】:在 C 上运行 A?在 D 上运行 A?
这里没问题。
在 C 上运行 B?在 D 上运行 C?
您不能在 C
上运行 B
,因为它引用了在 C
上不可用的 3.5 程序集。在D
上运行C
没问题。
在 C 上编译 Ax?在 D 上编译 Ax?
这里没问题。
在 C 上编译 Bx?在 D 上编译 Bx?
您无法在 C
上编译 Bx
,因为它没有安装它引用的 3.5 程序集。在D
上编译Bx
没问题。
重写 Ax 以使用 C# 中的功能 3语言级别,并在D上编译, 虽然它仍然可以在 C 上工作?
是的,这是可能的。
重写 Bx 以使用 C# 中的功能 4 语言水平在另一个 具有 .NET 4 的环境 E,而 它仍然在 D 上工作吗?
不,这是不可能的,因为如果您以 CLR 4.0 为目标,则程序集将无法在以前的 CLR 版本上运行。
作为结论:
ildasm.exe yourassembly.dll
。双击MANIFEST
,查看Metadata version
。如果是v2.0.50727
,则表示该程序集已针对 CLR 2 版本进行编译。然后查看引用的程序集。如果在引用中您看到一个名为 System.***
的引用程序集,版本为 3.5.0.0,则意味着需要 .NET 3.5 框架。如果不是,它可能只安装 .NET 2.0 就可以正常运行(当然它不应该引用任何其他本身依赖于 .NET 3.5 的程序集)。
【讨论】:
我的理解是,通过安装 .NET 3.5,您还可以安装 2.0 程序集(即,它是一个超集)。不是这样吗?另外,为什么我可以重写Bx
而不是Ax
? CLR 4 有什么特别之处吗?
是的,当然,这就是为什么您可以在D
环境中使用A
和B
为所欲为。
.Net 3.5 确实(应该?)安装 2.0 程序集,因为它们都使用相同版本的 CLR。您可以根据自己的选择重写Ax
和Bx
- 如果您重写它们以使用C# 3.0 功能,您将无法在.Net 2.0 环境中运行它们;如果您重写它们以使用 C# 4.0 功能,则需要在安装了 .Net 4.0 的环境中运行它们。
@Graham:C#3.0 不需要 .NET 3.5。您可以在 .NET 2.0 程序中使用 C#3.0 功能。以上是关于哪些规则管理 .NET 应用程序和 C# 语言的跨版本兼容性?的主要内容,如果未能解决你的问题,请参考以下文章