我应该使用哪个gacutil.exe?

11

因此,在Win 2008 R2 Std x64上,我有6(六)个gacutil.exe,它们都不同(不计算VS文件夹中的文件),分别位于:

  1. c:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin
  2. c:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\x64
  3. c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin
  4. c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\x64
  5. c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools
  6. c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64

问题如下:

  1. x64版本在行为上是否有任何区别?
  2. 我应该偏好v7.0A版本而不是其他v6.0A版本吗?
  3. 我应该使用NETFX 4.0 Tools版本来处理.NET 4.0程序集,并使用标准版本来处理其余部分吗?

或者,如果有一些通用类型的文章可以阅读,我会非常感激。

更新1. 关于Hans Passant的答案:

  1. gacutil.exe是.NET Framework的一个工具,属于“构建、部署和配置工具(.NET Framework)”,现在已经过时。而shfusion.dll就是之前的版本;
  2. 实际上,v6.0A是从VS2008安装中获取的,可以忽略(1,2);
  3. 64位解释理论听起来也很合理。 我还假设有一个IA64版本的gacutil.exe,因此对于每个平台都有一份“工具副本”,只是由于Wow64,x86版本在任何地方都可以运行良好。 从列表中减去2个gacutil版本 (4,6);
  4. 关于使用哪个版本的部分似乎是错误的。 V4.0 gacutil.exe会根据其目标CLR检测和放置程序集,并且可用于.NET 4.0和早期版本的程序集。那么问题是为什么还要保留V2.0 gacutil.exe?我猜为了在没有.NET4.0的环境中进行部署。
  5. 问题并非在于是否使用GAC,因此我不对最后一段进行评论。
  6. 更新2。

    因此,在Windows x86和x64上进行所有GAC操作时,我认为可以安全地使用3号(如果.NET4.0不可用)或5号。问题的答案是:

    1. 没有。
    2. 无所谓,但使用更新版本更合理。
    3. 不需要,只要.NETFX 4.0 Tools可用就可以完成所有GAC操作。

2
真的想回答……“没有一种方法比nuget或bin部署更好”!! - Daniel Elliott
@DanielElliott 不错的一条评论;-)但是这次我真的想澄清这个问题。 - Petr Abdulin
我也对答案很感兴趣...祝你好运! - Daniel Elliott
3个回答

5
Gacutil.exe是一个Windows SDK工具,而不是.NET Framework工具。您的计算机上安装了两个版本的SDK。您从VS2008安装中获得了6.0A,从VS2010安装中获得了7.0A。由于您还有64位操作系统,因此您也拥有64位工具。这对于gacutil.exe并不重要,不确定为什么它们单独包含它。可能是为了使Visual Studio命令提示符正常工作。请注意,您有32位和64位版本的分开的Visual Studio命令提示符,这对于C++项目非常重要。VS2010允许同时针对CLR版本4和CLR版本2进行目标设置,因此总共有6个版本。
很重要的一点是,您的计算机上有两个GAC。.NET 4程序集的GAC存储在c:\windows\microsoft.net\assembly中。对于早期版本,它存储在c:\windows\assembly中。您必须使用正确版本的gacutil.exe将程序集放入正确的GAC中。对于针对.NET 4的程序集,您必须使用Bin\NETFX 4.0 Tools中的程序集。对于早期版本,则必须使用Bin中的程序集。
最好根本不使用它,应该在开发计算机上设置程序集的Copy Local属性。 GAC是部署细节,当您的GAC具有用户的GAC没有的程序集时,您会遇到麻烦。

此外,没有管理员权限的用户将无法安装需要程序集位于GAC(如Oracle ODP.NET)中的应用程序。在ODP.NET的情况下,本地复制不起作用。 - Joseph Yaduvanshi

3
简短版:如果您已安装.NET 4.0,请使用NETFX 4.0工具版本。否则没有太大关系。
问题解答:
1. 不需要。 2. 如果未安装.NET 4.0,则应使用NETFX 4.0工具版本。不确定是否可能拥有v7.0 SDK但未安装.NET 4.0。 3. 没有必要,您可以始终(并且应该)对所有GAC操作使用NETFX 4.0工具版本。

0

这不是最好的答案,但我注意到一个观察结果。根据你正在为关联的Visual Studio安装开发应用程序所使用的版本,使用最新版本的文件夹。

C:\Program Files (x86)\Microsoft SDKs\Windows\{SDK version}\bin\NETFX 4.5.1 Tools\gacutil.exe

当我比较控制面板>程序和功能>"安装于"日期时,发现我的Visual Studio安装下有许多不同的文件夹。我猜测在这两次安装期间更新了多个文件夹。

"gacutil.exe"所在文件夹及修改日期:

C:\Program Files (x86)\Microsoft SDKs\Windows\
C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\ - 3/20/2014
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\ - 3/20/2014
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\ - 5/15/2015
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0\ - 3/20/2014
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\ - 5/15/2015
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1\ - 5/15/2015
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\ - 5/15/2015

Windows Visual Studio 安装及其“安装于”日期:

Visual Studio 2012 - 3/20/2014
Visual Studio 2013 - 5/15/2015

为了比较GAC中的内容,我运行了这个命令并对文件进行了diff以进行比较。
cd C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\
gacutil /l > c:\v8.1A.gac.txt

然后我针对每个版本适当地更改了文件夹。

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