.NET 4.0有一个新的GAC,为什么呢?.NET 4.0有一个新的GAC,为什么呢?(.NET

2019-05-10 09:22发布

%windir%\Microsoft.NET\assembly\是新的GAC 。 这是否意味着现在我们要管理两个GACS,一个用于.NET应用程序2.0-3.5,另一个用于.NET 4.0的应用程序?

现在的问题是,为什么呢?

Answer 1:

是的,因为有2个不同的全局程序集缓存(GAC),你将不得不单独管理它们。

在.NET Framework 4.0中,海关总署通过一些变化去。 海关总署分成两种,一种为每个CLR。

同时用于.NET Framework 2.0和.NET Framework 3.5的CLR的版本是2.0 CLR。 有前两个框架​​的版本没有需要分割GAC。 在.Net框架4.0打破旧的应用程序的问题。

为了避免CLR 2.0和4.0 CLR之间的问题,海关总署现在被分成私人GAC的每个runtime.The主要变化在于CLR 2.0版应用程序现在无法看到GAC CLR 4.0版组件。

资源

为什么?

这似乎是因为在.NET 4.0中的CLR变化,但不是在2.0至3.5。 同样的事情发生1.1至2.0 CLR。 看来,GAC具有存储不同版本的组件,只要他们是来自同一个CLR的能力。 他们不希望打破旧的应用程序。

请参阅以下信息MSDN关于在4.0 GAC变化 。

例如,如果两个.NET 1.1和.NET 2.0共享同一GAC,则.NET 1.1应用程序,加载组件,其从该共享GAC,可以得到NET 2.0组件,从而断开.NET 1.1应用

同时用于.NET Framework 2.0和.NET Framework 3.5的CLR的版本是2.0 CLR。 作为这样的结果,有一个在前面的两个框架的版本没有需要分割GAC。 打破了旧的问题(在这种情况下,.NET 2.0)应用复出在.Net框架4.0在这一点CLR 4.0发布。 因此,为了避免CLR 2.0和4.0 CLR之间的干扰问题,海关总署现在被分成私人GACS为每个运行。

由于CLR在未来的版本更新,你可以期望同样的事情。 如果仅仅是语言的变化,那么你可以使用相同的GAC。



Answer 2:

我也想知道为什么2 GAC,发现如下马克·米勒解释在评论部分的.NET 4.0有2全局程序集缓存(GAC) :

马克·米勒说...... 2010年6月28日下午12时13分

谢谢你的职位。 “干扰问题”是故意含糊其辞。 在写这篇文章的时候,这些问题还在调查中,但很明显有几个破损的情况。

例如,一些应用程序使用Assemby.LoadWithPartialName加载程序集的最高版本。 如果最高版本与V4编译,然后V2(3.0或3.5)的应用程序无法加载它,并且应用程序会崩溃,即使有迹象表明会工作的一个版本。 本来,我们分区下它的原始位置的GAC,但引起了一些问题与Windows升级方案。 这两个是已经发运这些涉及代码,让我们感动我们的(版本分区GAC到另一个地方。

这不应该大多数应用程序产生任何影响,并且不添加任何维护负担。 这两个地点应该只使用本地GAC API,它们处理分区预期被访问或修改。 其中这确实表面的地方是通过暴露如GetCachePath,或检查的mscorlib的加载到托管代码的路径GAC的路径的API。

值得一提的是,我们修改GAC的位置,当我们发布了V2以及当我们介绍架构集标识的一部分。 这些添加GAC_MSIL,GAC_32和GAC_64,虽然都尚在%WINDIR%\组装。 不幸的是,这不是此版本的选项。

希望它可以帮助未来的读者。



Answer 3:

它没有很大的意义,原来GAC已经很能够存储不同版本的组件组成。 还有什么理由假设一个程序都不会意外引用错误的组装,所有的.NET 4集得到了颠簸到4.0.0.0 [的AssemblyVersion。 新进程并排侧的功能不应该改变这一点。

我的猜测:已经有太多的.NET项目,在那里,打破了“从未在GAC直接引用任何东西”的规则。 我看到在这个网站上几次进行。

只有一个办法,以避免破坏这些项目:移动GAC。 回到-compat的是Microsoft神圣。



文章来源: .NET 4.0 has a new GAC, why?