哪些规则管理 .NET 应用程序和 C# 语言的跨版本兼容性?

Posted

技术标签:

【中文标题】哪些规则管理 .NET 应用程序和 C# 语言的跨版本兼容性?【英文标题】:What rules govern cross-version compatibility for .NET applications and the C# language? 【发布时间】:2010-02-25 13:01:17 【问题描述】:

由于某种原因,我一直难以记住框架做出的向后/向前兼容性保证,所以我想永远把它放在床上。

假设我有两个程序集,ABA 较旧并引用 .NET 2.0 程序集; B 引用 .NET 3.5 程序集。我分别有ABAxBx 的来源;它们是在 2.0 和 3.0 语言级别用 C# 编写的。 (也就是说,Ax 不使用 C# 2.0 之后引入的功能;同样Bx 不使用 3.0 之后引入的功能。)

我有两个环境,CDC 已安装 .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 环境中使用AB 为所欲为。 .Net 3.5 确实(应该?)安装 2.0 程序集,因为它们都使用相同版本的 CLR。您可以根据自己的选择重写AxBx - 如果您重写它们以使用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# 语言的跨版本兼容性?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net和winform程序上的区别都有哪些?

.Net C# 接口,了解只需3分钟

.net 技术都有哪些主流框架应用?

.NET开发是啥?需要用到哪些开发语言?

基于 c# 的规则语言的示例?

go语言学习笔记 — 基础 — 复合数据类型 — 结构体(9.1):结构体可见性规则,结构体和结构体成员字段的跨包导出