问题 在仅具有4.0框架的机器上参考2.0库运行.NET 4.0应用程序


尝试重复这将是一个真正的痛苦,所以我希望有人能快速回答......

假设我有一个.NET 4.0应用程序,引用了.NET 2.0库(在本例中为SharpZipLib)。这当然可以在安装了.NET 2.0和4.0的普通机器上正常工作。

如果运行此应用程序的服务器只有.NET 4.0而不是2.0(或3.0 / 3.5等),那么我需要做些什么才能让.NET 2.0库正常运行?

从我所读到的,看起来我可能能够进入配置设置 supportedRuntime,但我不太明白究竟是什么。

配置设置是否有效,或者只有.NET 4.0库在此环境中运行?

(这是一个假设的环境 - 我不打算永远拥有我自己的服务器4.0而不是2.0,但如果有人疯狂到可以做到这一点,我希望能够支持他们)。

谢谢


7142
2018-01-14 18:32


起源

像SharpZipLib这样的常规2.0组件没有什么特别之处。它在目标4.0的EXE中加载没有问题或配置 - Hans Passant
汉斯是正确的 - 拥有4.0应用程序可以加载2.0目标库。请参阅下面的答案 - 您不需要安装2.0,3.0或3.5 fx - bryanmac


答案:


CLR可以在.net 4.0框架中加载较旧的程序集。

这是一个很好的阅读:

http://msdn.microsoft.com/en-us/magazine/ee819091.aspx

编辑:文章更新报价。特别注意大胆

.NET Framework 4运行时以及所有未来的运行时将能够实现   彼此在进行中。虽然我们没有支持这个   对于较旧的运行时(1.0到3.5)的功能,我们确实做到了   4及以上版本将能够在任何一个旧版本的进程中运行   运行。 换句话说,您将能够加载4,5和2.0   相同的过程,但你将无法加载1.1和2.0   同样的过程。 .NET Frameworks 2.0到3.5都在2.0上运行   运行时因此彼此之间没有冲突,如图所示   2。


7
2018-01-14 18:35



谢谢,这是一篇很好的文章。它没有提到 <supportedRuntimes> 设置,但确实提供了很多见解。 - Joe Enos
请注意,要完成In-Proc SxS,必须安装两个运行时。 - Daniel Rose
@JoeEnos:我觉得 supportedRuntimes bit仅适用于主应用程序。请参阅Daniel的答案 - 用于依赖项的运行时由主应用程序确定。 - Ben Voigt
@Daniel - 右 - 和.net 4.0,你不需要这样做,它将直接加载2.0而不安装2.0。这就是它的酷。 - bryanmac
它说明4.0运行时包含2.0运行时?不同的是,在4.0(及更高版本)中,您可以在同一进程中激活多个运行时。 - Daniel Rose


http://neilblackburn.blogspot.com/2009/10/net-framework-40-backward-compatibility.html (并且,传递地, http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2009/08/03/installing-net-framework-v4-0-and-running-net-2-0-3-0-3-5- 3-5sp1-applications.aspx):

现在,我知道您不能只使用3.5 Service Pack 1应用程序   并在V4.0 CLR上运行它。它需要V2.0 CLR或重新配置   一个 <supportedRuntimes/> 标记以便弯曲应用程序以运行   V4.0 CLR和弯曲可能是你不想要的   去做。


6
2018-01-14 18:37



很有道理。谢谢。 - Joe Enos
这适用于将应用程序迁移到新运行时,而不是库。 - Ben Voigt


从bryanmac的回答链接(在制品并排):

这意味着如果重新编译应用程序以针对.NET Framework 4运行时运行,并且仍然具有针对.NET 2.0构建的依赖程序集,那么这些依赖项也将加载到.NET 4运行时。

但是,这可能意味着由于在不同的运行时上运行可能存在错误。


2
2018-01-14 18:58





如果您拥有SharpZipLib的源代码,您可以将其重建为.NET 4.0


1
2018-01-14 18:37



谢谢 - 在这个特定情况下可能不会有什么大不了的,但我不希望这是我将来可能使用的其他库的默认答案。 - Joe Enos