C# 什么规则管理.NET应用程序和C语言的跨版本兼容性?
出于某种原因,我总是很难记住框架所做的向后/向前兼容性保证,所以我想永远忘记这一点 假设我有两个程序集,C# 什么规则管理.NET应用程序和C语言的跨版本兼容性?,c#,.net,C#,.net,出于某种原因,我总是很难记住框架所做的向后/向前兼容性保证,所以我想永远忘记这一点 假设我有两个程序集,A和BA较旧,并且引用.NET 2.0程序集B引用.NET 3.5程序集。我分别拥有A和B、Ax和Bx的源代码;它们是在2.0和3.0语言级别用C#编写的。(也就是说,Ax不使用在C#2.0之后引入的功能;同样地,Bx也不使用在3.0之后引入的功能。) 我有两个环境,C和DC安装了.NET2.0框架D安装了.NET 3.5 framework 现在,我能/不能做以下哪项 运行: 在C上运行A?
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
安装了.NET2.0框架D
安装了.NET 3.5 framework
现在,我能/不能做以下哪项
运行:
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
上使用客户端应用程序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另一个语言级别
具有.NET4的环境E,而
让它仍然在D上工作
否这是不可能的,因为如果以CLR 4.0为目标,程序集将无法在以前的CLR版本上运行
作为结论:
ildasm.exe yoursassembly.dll
。双击清单
,查看元数据版本
。如果是v2.0.50727
,则表示此程序集已针对CLR 2版本编译。然后查看引用的程序集。如果在引用中看到一个名为System.***
且版本为3.5.0.0的引用程序集,则表示需要.NET 3.5 framework。如果没有,它可能只在安装了.NET 2.0的情况下运行良好(当然,它不应该引用任何其他依赖于.NET 3.5的程序集)。必须了解更多信息才能了解这个问题!我的理解是,通过安装.NET3.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。您可以在.NET2.0程序中使用C#3.0功能。