从Visual Studio 2008转换的解决方案在Visual Studio 2010中失败了Gacutil Post-Build步骤

时间:2012-12-11 21:22:47

标签: visual-studio-2010 visual-studio-2008 gacutil post-build

我已经将包含多个项目的.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会失败,但只有在构建解决方案中的单个项目时才会成功?

1 个答案:

答案 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在构建期间没有再次失败。