代码之家  ›  专栏  ›  技术社区  ›  John Feminella

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

  •  2
  • John Feminella  · 技术社区  · 15 年前

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

    假设我有两个集会, A B . 是旧的并引用.NET 2.0程序集; 引用.NET 3.5程序集。我有消息来源 , Ax Bx 分别,它们是在2.0和3.0语言级别用C_编写的。(也就是说, 斧头 不使用比C 2.0更晚引入的功能;同样 BX 不使用3.0之后引入的功能。)

    我有两个环境, C D . C 已安装.NET 2.0框架; D 已安装.NET 3.5框架。

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

    运行:

    1. C ?运行 A D ?
    2. 运行 C ?运行 C D ?

    编译:

    1. 编译 斧子 C ?编译 斧子 D ?
    2. 编译 BX C ?编译 BX D ?

    改写:

    1. 重写 斧子 使用C 3语言级别的功能,并在 D 当它还在工作时 C ?
    2. 重写 BX 在另一个环境中使用C 4语言级别的功能 E 有.NET 4,但仍在工作 D

    引用其他程序集:

    1. 参考 A 并且有一个客户端应用程序 C 用它吗?
    2. 参考 并且有一个客户端应用程序 D 用它吗?
    3. 参考 并且有一个客户端应用程序 C 用它吗?
    4. 参考 并且有一个客户端应用程序 D 用它吗?

    更重要的是,什么规则控制这些假设场景的真实性或虚假性?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Darin Dimitrov    15 年前

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

    没问题。

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

    你不能跑 B C 因为它引用了3.5个在上不可用的程序集 C . 跑起来没问题 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的程序集)。