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

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

问题是,为什么?

是的,因为有2个不同的全局程序集caching(GAC),您将不得不分别pipe理它们中的每一个。

在.NET Framework 4.0中,GAC进行了一些更改。 GAC分为两个,每个CLR一个。

用于.NET Framework 2.0和.NET Framework 3.5的CLR版本是CLR 2.0。 在前两个框架​​版本中没有必要拆分GAC。 Net Framework 4.0中的旧应用程序的问题。

为了避免CLR 2.0和CLR 4.0之间的问题,GAC现在被分解为每个运行时的私有GAC。主要的变化是CLR v2.0应用程序现在无法在GAC中看到CLR v4.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,则从此共享GAC加载程序集的.NET 1.1应用程序可能会获得.NET 2.0程序集,从而打破了.NET 1.1应用程序

用于.NET Framework 2.0和.NET Framework 3.5的CLR版本是CLR 2.0。 因此,在前两个框架​​版本中,不需要拆分GAC。 CLR 4.0发布的时候,在Net Framework 4.0中,破旧的(在这个例子中是.NET 2.0)应用程序重新出现了。 因此,为了避免CLR 2.0和CLR 4.0之间的干扰问题,GAC现在分为每个运行时的专用GAC。

由于CLR在未来版本中更新,您可以期待同样的事情。 如果只有语言改变,那么您可以使用相同的GAC。

我也想知道为什么2 GAC在.NET 4.0的注释部分中findMark Miller的以下解释,其中 有2个全局程序集caching(GAC) :

马克·米勒说… 2010年6月28日12:13 PM

感谢您的post。 “干扰问题”故意含糊不清。 在撰写本文时,这些问题仍在调查中,但很明显有几个破碎的情况。

例如,某些应用程序使用Assemby.LoadWithPartialName加载程序集的最高版本。 如果最高版本是使用v4编译的,那么v2(3.0或3.5)应用程序无法加载它,即使存在可以工作的版本,应用程序也会崩溃。 最初,我们将GAC划分到原来的位置,但是这导致了Windows升级场景的一些问题。 这两个都涉及已经发货的代码,所以我们将我们的(版本分区的GAC)移到另一个地方。

这对大多数应用程序不应该有任何影响,并且不会增加任何维护负担。 只能使用原生GAC API访问或修改这两个位置,这些API会按预期处理分区。 这些表面上的地方是通过暴露GACpath的API(例如GetCachePath),或者检查加载到托pipe代码中的mscorlib的path。

值得注意的是,当我们发布v2时,我们也修改了GAC位置,当我们将体系结构作为程序集标识的一部分引入时。 那些添加了GAC_MSIL,GAC_32和GAC_64,虽然都在%windir%\ assembly下。 不幸的是,这不是这个版本的select。

希望它有助于未来的读者。

这并没有多大意义,原来的GAC已经能够存储不同版本的程序集了。 而且没有什么理由认为一个程序会偶然引用错误的程序集,所有的.NET 4程序集都将[AssemblyVersion]碰到了4.0.0.0。 新的进程内并行function不应该改变这一点。

我的猜测是:那里已经有太多的.NET项目打破了“从不直接引用GAC中的任何东西”的规则。 我已经看过几次这个网站。

避免打破这些项目只有一个办法:移动GAC。 Back-compat在微软是神圣的。