我已经将包含多个项目的.NET 2.0解决方案从Visual Studio 2008(其中所有内容都正确构建)转换为Visual Studio 2010.我在Visual Studio 2010中加载了以Admistrator模式运行的解决方案并选择了“Build Solution”。在某些项目的某些后期构建步骤中构建失败:
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会失败,但只有在构建解决方案中的单个项目时才会成功?
答案 0 :(得分: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
在构建期间没有再次失败。