可执行文件和程序集能在不同版本的.NET框架上运行吗?

5

这可能是一个愚蠢的问题,但请听我解释…… 我有一个使用另一个.NET程序集的.NET exe文件。如果exe文件针对.NET 4.0版本,而程序集则针对.NET 3.5版本,那么当我运行exe文件时,程序集是否实际上在.NET 4.0框架上运行?我认为它是这样的。那么我的问题是:是否可能让exe文件运行在4.0框架上,但同时使用一个在3.5框架上运行的程序集呢?


1
是的,这是可能的。反过来是不可能的。请注意,托管可执行文件和DLL都是程序集。 - Marius Bancila
太好了,谢谢。我该如何让这个发生呢? - Mark J
1
如果程序集是混合模式的,则需要在配置文件中使用useLegacyV2RuntimeActivationPolicy设置(请参见https://dev59.com/mXI-5IYBdhLWcg3w8NSB)。否则,您不需要做任何事情。 - Marius Bancila
参见同时加载多个CLR运行时进行讨论。简而言之:如果您仅编写.NET代码,则在进程中只会获得一个CLR。 如果需要在单个进程中实际获取多个CLR,则需要在某个地方添加一些本机代码。 - Damien_The_Unbeliever
我误解了。你希望在你的进程中同时有两个运行时?4.0用于你的4.0程序集,3.5用于你的3.5程序集?不,它们都在同一个运行时下运行,即4.0。但是,使用.NET 4.0及以后版本的应用程序内并置功能,可以在同一个进程中托管两个运行时,但这不适用于纯托管解决方案。http://msdn.microsoft.com/en-us/magazine/ee819091.aspx - Marius Bancila
谢谢你们的回答。我想我需要的不是CLR运行时的不同版本,而是框架库的不同版本。基本上,在3.5和4.0之间有一个变化,我想要避免它,我想要一个使用4.0的exe,但它使用一个使用3.5的程序集。 - Mark J
2个回答

5
不可能。在.NET 4.0中,基本类(如System.String)已更改。您的.NET 3.5程序集将显示它依赖于mscorlib v2.0.0.0。但CLR会重新映射它,实际上会得到4.0.0.0版本的程序集。因此,进程中的每个程序集都将同意字符串对象的外观。当然非常重要 :)
.NET 4.0支持进程内并行CLR版本,一个进程可以加载多个CLR版本。但在您的情况下不会发生这种情况,它是为解决未管理的进程加载.NET代码的问题而设计的。比如COM服务器。它运行时与进程中存在的任何其他.NET代码无关。因此可以承担不同的CLR版本。与您的情况完全不同。
.NET 4.0与3.5非常兼容,很少有可能在3.5程序集中的代码失败。从技术上讲,微软使用4.0版本来修复了一些悬而未决的错误,这些错误有可能破坏现有的代码。您的代码可能偶然地依赖于此类错误。这种情况非常罕见,我只看到过几个SO上关于这种错误的问题。

好的,谢谢汉斯,我明白了。在3.5和4.0框架之间有一个变化,这给我带来了问题。我有相同的代码,适用于3.5但不适用于4.0,这就是为什么我希望程序集仍然使用3.5的原因。这与使用Web服务有关,我认为NTLM身份验证已更改,因此现在在4.0中返回HTTP 401错误,而在3.5中可以正常工作。查看4.0的HTTP请求时,缺少了3个NTLM auth标志,而这些标志在3.5中存在。 - Mark J

0

我有很多使用 .Net 2 dll 的 .Net 4 项目(其中 .Net 2 库也支持遗留系统),运行良好。所以是的,但我不确定在不同版本之间的完全兼容性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接