为什么框架dll会在多个位置重复出现?

6

安装完 .Net 4 后,遇到了一些已经在 这里 得到解答的问题。我也意识到,不同版本的框架 dll 在多个地方被重复放置 (这并不新鲜,之前版本也是如此,但直到现在才注意到)。

1 - GAC: %systemroot%\assembly

2- 框架安装目录: %systemroot%\Microsoft.NET\Framework\v...

3- 如果您安装了 Windows SDK,则还在 C:\Program Files\Microsoft SDKs\Windows\ 中

我想最后一个是所谓的“引用程序集”,具有额外的元数据以帮助 Visual Studio,但是第二个位置呢?为什么会在那里重复使用程序集?


猜测:用于修复安装? - spender
2个回答

2
  1. 不是的,这是.NET 1.x到3.5版本的GAC位置。4.0版本的GAC位于c:\windows\microsoft.net\assembly。为什么要移动它并不清楚,可能是为了避免引用程序集直接从GAC中进行,这是个大忌,但确实做过。

  2. 是的,引用程序集就在那里。还有在c:\program files\reference assemblies中。它们最初是GAC中存储程序集的逐字副本。直到您部署某种热修复为止。将它们分开确保您构建针对“正确”框架程序集的程序,而不是您在GAC中存储的内容。

  3. 是的,没有框架程序集,只有构建工具。


@Jared,非常感谢您的回答。为什么我们在SDK文件夹和Framework文件夹中都有程序集,尽管文件大小似乎相同,这仍然很奇怪。 对于GAC和其他文件夹之间的重复,现在对我来说更有意义了。 - Xose Lluis

1

这更像是一种有根据的猜测而不是实际答案,但是...

为了最初将 DLL 放入全局程序集缓存 (GAC),您需要拥有一个完整的 DLL(也称为非引用程序集),供 GAC 使用。引用程序集无法工作,因为它没有可执行代码。因此,您需要一个真正的 DLL 来源于 GAC,以便获得位置 #2。


示例:c:\windows\microsoft.net\framework\v2.0.50727\system.dll: 3178496字节。GAC版本:c:\windows\assembly\gac_msil\system\2.0.0.0__b77a5c561934e089\system.dll: 3178496字节。剥离了什么? - Hans Passant
@Hans,c:\windows\Microsoft.Net下的版本永远不会是引用程序集。它们将是完整的.Net程序集。我指的是c:\program files下的那些程序集。而且我认为直到4.0之前它们也不是引用程序集。 - JaredPar
c:\program files\reference assemblies\microsoft\framework\v3.5\system.net.dll: 237568 字节。c:\windows\assembly\gac_msil\system.net\3.5.0.0__b03f5ff115d50a3a\system.net.dll: 237568 字节。你比这里任何人都更接近火源。到底发生了什么事? - Hans Passant
@Hans,那仍然是3.5安装程序。我不确定我们是否支持真正的引用程序集直到4.0版本。话虽如此,我并不特别知道为什么我们要这样做。我正在询问周围的人,看看是否有原因。 - JaredPar
我确实看到了4.0的重复项,包括剥离和逐字逐句。请同时询问他们使用的工具,这应该是工具供应商中比较流行的。 - Hans Passant
显示剩余2条评论

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