出于某种原因,我总是很难记住框架所做的向后/向前兼容性保证,所以我想把它永远地放在床上。
假设我有两个程序集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框架。
现在,我可以/不能做以下哪一项?
运行:
A
上运行C
?在A
上运行D
?B
上运行C
?在C
上运行D
?编译:
Ax
上汇编C
?在Ax
上编译D
?Bx
上汇编C
?在Bx
上编译D
?重写:
Ax
以使用C#3语言级别的功能,并在D
上进行编译,同时让它仍在C
上工作?Bx
以在具有.NET 4的另一个环境E
上使用C#4语言级别的功能,同时让它仍在D
上工作?“从另一个程序集引用:
B
引用A
并在C
上有一个客户端应用使用它?B
引用A
并在D
上有一个客户端应用使用它?A
引用B
并在C
上有一个客户端应用使用它?A
引用B
并在D
上有一个客户端应用使用它?更重要的是,有哪些规则可以控制这些假设情景的真实性或虚假性?
答案 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的其他程序集)。