3

我已将包含多个项目的 .NET 2.0 解决方案从 Visual Studio 2008(一切都正确构建)转换为 Visual Studio 2010。我在以管理员模式运行的 Visual Studio 2010 中加载了解决方案并选择了“构建解决方案”。在某些项目中的某些构建后步骤中构建失败:

Microsoft (R) .NET Global Assembly Cache Utility.  Version 3.5.30729.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Failure adding assembly to the cache: Access denied. You might not have administrative credentials to perform this task. Contact your system administrator for assistance.
36>C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.Targets(3717,9): error MSB3073: The command ""C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\gacutil.exe" /i MyAssembly.dll" exited with code 1.

如果我选择这些相同的项目,并且只构建单个项目,而不是整个解决方案,那么 gacutil 命令是成功的。

错误消息听起来好像是权限问题(“拒绝访问”),但我已验证 Visual Studio 2010 正在管理员模式下运行——我在标题栏中看到它(“MySolution - Microsoft Visual Studio(管理员) ”)。

为什么 gacutil 在构建整个解决方案时会失败,但在解决方案中只构建一个项目时会成功?

4

1 回答 1

2

在将我们的一种解决方案转换为 Visual Studio 2010 后,我最近遇到了完全相同的问题。

分析表明,如果两个连续编译的项目gacutil在其构建后步骤中调用,并且第二个项目足够小,并且构建机器足够快,那么第二次调用gacutil将系统性地失败并出现“拒绝访问”错误。

这看起来像是某种竞争条件,但我们无法确定确切的根本原因。在有一个正在运行的实例时用繁忙的循环阻塞构建后步骤gacutil并没有改变这种情况。

最后,我们能够通过使用 4.0 版gacutil而不是 3.5 版来解决这个问题。我们将构建后步骤中的所有调用从:

"$(FrameworkSDKDir)Bin\gacutil.exe" /if "$(TargetPath)" /nologo

到:

"$(FrameworkSDKDir)Bin\NETFX 4.0 Tools\gacutil.exe" /if "$(TargetPath)" /nologo

应用这些更改后,gacutil在构建期间没有再次失败。

于 2013-12-03T10:02:18.240 回答