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 (Administrator)」 」)。

ソリューション全体をビルドすると gacutil が失敗するのに、ソリューション内の 1 つのプロジェクトだけをビルドすると成功するのはなぜですか?

4

1 に答える 1

2

最近、ソリューションの 1 つを Visual Studio 2010 に変換した後、まったく同じ問題に遭遇しました。

分析により、2 つの連続してコンパイルされたプロジェクトがgacutilビルド後の手順で呼び出さ、2 番目のプロジェクトが十分に小さくビルド マシンが十分に高速である場合、2 番目の の呼び出しはgacutil「アクセスが拒否されました」エラーで体系的に失敗することが示されました。

これはある種の競合状態のように見えましたが、正確な根本原因を特定することはできませんでした。実行中のインスタンスがある間にビジー ループでビルド後の手順をブロックしてもgacutil、状況は変わりませんでした。

gacutil最終的に、バージョン 3.5 の代わりにバージョン 4.0 を使用することで問題を解決することができました。ビルド後の手順ですべての呼び出しを次のように変更しました。

"$(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 に答える