Решение, преобразованное из Visual Studio 2008, не выполняет этапы Gacutil после сборки в Visual Studio 2010

Я преобразовал решение.NET 2.0, содержащее несколько проектов, из Visual Studio 2008 (где все выполняется правильно) в Visual Studio 2010. Я загрузил решение в Visual Studio 2010, работающее в режиме Admistrator, и выбрал "Построить решение". Сбой сборки на некоторых этапах после сборки в некоторых проектах:

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 ответ

Решение

Недавно я столкнулся с точно такой же проблемой после преобразования одного из наших решений в 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 не сбой снова во время сборок.

Другие вопросы по тегам