从Visual Studio 2008转换的解决方案在Visual Studio 2010中执行Gacutil后构建步骤失败

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会失败,但只构建解决方案中的单个项目就能成功呢?
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 不再失败。


你在解决方案中的项目之间使用了项目引用还是dll引用? - denfromufa

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