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

时间:2010-02-25 13:01:17

标签: c# .net

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

假设我有两个程序集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框架。

现在,我可以/不能做以下哪一项?

运行:

  1. A上运行C?在A上运行D
  2. B上运行C?在C上运行D
  3. 编译:

    1. Ax上汇编C?在Ax上编译D
    2. Bx上汇编C?在Bx上编译D
    3. 重写:

      1. 重写Ax以使用C#3语言级别的功能,并在D上进行编译,同时让它仍在C上工作?
      2. 重写Bx以在具有.NET 4的另一个环境E上使用C#4语言级别的功能,同时让它仍在D上工作?“
      3. 从另一个程序集引用:

        1. B引用A并在C上有一个客户端应用使用它?
        2. B引用A并在D上有一个客户端应用使用它?
        3. A引用B并在C上有一个客户端应用使用它?
        4. A引用B并在D上有一个客户端应用使用它?
        5. 更重要的是,有哪些规则可以控制这些假设情景的真实性或虚假性?

1 个答案:

答案 0 :(得分:2)

  

在C上运行A?在D上运行A?

这里没问题。

  

在C上运行B?在D上运行C?

您无法在B上运行C,因为它引用了C上没有的3.5个程序集。在C上运行D没问题。

  

在C上编译Ax?在D?

上编译Ax

这里没问题。

  

在C上编译Bx?在D?

上编译Bx

您无法在Bx上编译C,因为它没有安装它引用的3.5程序集。在Bx上编译D没问题。

  

重写Ax以使用C#中的功能   3个语言级别,并在D上编译,   虽然它仍在C上工作?

是的,这是可能的。

  

重写Bx以使用C#中的功能   另一个是4个语言水平   环境E有.NET 4,而   让它仍在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的其他程序集)。