Решение, преобразованное из 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
не сбой снова во время сборок.