Задача сообщества MSBuild GacUtil тихо терпит неудачу для меня

У меня есть проект .NET с открытым исходным кодом, основным артефактом которого является DLL, которую необходимо установить в GAC для его основной вариант использования. Поэтому я хочу установить его во время выполнения задачи AfterBuild. Я использую задачу GacUtil msbuild из расширений сообщества MSBuild. Это не работает.

Мой код MSBuild, который я получил от здесь это:

<Target Name="AfterBuild">
  <GacUtil Assemblies="$(TargetName)" />
</Target>

Я использую команду msbuild /t:AfterBuild /verbosity:diagnostic. Я получаю следующую ошибку:

Done building target "_CheckForInvalidConfigurationAndPlatform" in project "JustAProgrammer.ADPR.csproj".
Target "AfterBuild" in project "e:\src\JustAProgrammer.ADPR\JustAProgrammer.ADPR\JustAProgrammer.ADPR.csproj" (entry point):
Using "GacUtil" task from assembly "C:\Program Files (x86)\MSBuild\MSBuildCommunityTasks\MSBuild.Community.Tasks.dll".
Task "GacUtil"
Done executing task "GacUtil" -- FAILED.
Done building target "AfterBuild" in project "JustAProgrammer.ADPR.csproj" -- FAILED.
Done Building Project "e:\src\JustAProgrammer.ADPR\JustAProgrammer.ADPR\JustAProgrammer.ADPR.csproj" (AfterBuild target(s)) -- FAILED.

Я выполняю эту команду из копии cmd.exe, запущенной от имени администратора, с gacutil.exe на своем пути. Я использовал ту же самую командную строку, чтобы успешно установить и удалить эту сборку из GAC, и дважды проверил, нет ли сборки в папке c: \ windows \ assembly.

Как мне понять, почему GacUtil дает сбой?


person Justin Dearing    schedule 26.09.2011    source источник
comment
Есть ли шанс msbuild или задача не находит gacutil? Я не смотрел на dll, чтобы узнать, вызывает ли CE сам gacutil или они написали свою собственную реализацию. Это был наш подход к поиску gacutil, но я уверен задача msbuild будет лучше, если вы сможете заставить ее работать. Еще одна мысль - запустить проводник процессов и посмотреть, какие файлы получают доступ, возможно, происходит что-то странное.   -  person billinkc    schedule 03.10.2011
comment
. @billinkc Хороший общий совет, но в данном конкретном случае Задача не зависит от exe в версии 1.4.   -  person Ruben Bartelink    schedule 01.11.2012


Ответы (2)


Похоже, что путь, по которому он пытается добраться до инструмента, неправильный (по крайней мере, в моем случае). Установите для свойства ToolPath в задаче GacUtil значение «$ (FrameworkSDKDir) bin» следующим образом:

<Target Name="BeforeBuild">
    <GacUtil Command="Uninstall" ToolPath="$(FrameworkSDKDir)bin" Assemblies="$(TargetName)" ContinueOnError="true"/>
</Target>
<Target Name="AfterBuild">
  <GacUtil ToolPath="$(FrameworkSDKDir)bin" Assemblies="$(TargetPath)"/>
</Target>
person Josh Gallagher    schedule 05.10.2011
comment
Теперь я получаю ошибку MSBUILD: предупреждение MSB6006: gacutil.exe завершился с кодом 1. E: \ src \ JustAProgrammer.ADPR \ JustAProgrammer.ADPR \ JustAProgrammer.ADPR.csproj (78,5): ошибка MSB6006: gacutil.exe завершился с кодом 1 - person Justin Dearing; 07.10.2011
comment
Что ж, это помогло вам решить исходную проблему. Можете ли вы успешно выполнить отдельную команду gacutil из командной строки, передав ей значение $ (TargetPath) (т.е. gacutil -i. \ Bin \ Debug \ JustAProgrammer.ADPR.dll из корня проекта)? - person Josh Gallagher; 10.10.2011
comment
Я только что заметил, что в GacUtil вы используете $ (TargetName), а не $ (TargetPath). Последний необходимо использовать для ссылки на саму сборку, а не только на путь к сборке. - person Josh Gallagher; 11.10.2011
comment
Джастин, теперь твоя проблема решена? Если бы я не идентифицировал часть TargetName / TargetPath, не могли бы вы поделиться фактическим решением в ответе? - person Josh Gallagher; 24.10.2011
comment
Извините, вернусь к вам на этой неделе. - person Justin Dearing; 24.10.2011
comment
Хорошо, я все еще получаю ошибку 1 Вот новый xml: ‹GacUtil Command = Uninstall ToolPath = $ (FrameworkSDKDir) bin Assemblies = $ (TargetPath) ContinueOnError = true /› ‹GacUtil ToolPath = $ (FrameworkSDKDir) bin Assemblies = $ ( TargetPath) / › - person Justin Dearing; 18.11.2011
comment
@JustinDearing, теперь я понимаю, что мой предыдущий комментарий был непонятен. Посмотрите на XML в моем ответе, и вы увидите, что при удалении используется TargetName, а при установке используется TargetPath. XML, который вы добавили в свой комментарий для исправления, использует TargetPath для удаления. - person Josh Gallagher; 18.11.2011
comment
Для ясности, v1.4 (и, предположительно, более поздняя версия) не зависит от gacutil.exe. - person Ruben Bartelink; 01.11.2012

Вы проверили значение $ (TargetName) с помощью задачи «Сообщение»?

Возможно, вам придется указать свойство в файле build.proj:

  <PropertyGroup>
    <AssemblyPath></AssemblyPath>
  </PropertyGroup>

  <Target Name="AfterBuild">
    <GacUtil Assemblies="$(AssemblyPath)" />
  </Target>

Затем передайте значение свойства из события после сборки Visual Studio:

msbuild /t:AfterBuild /verbosity:diagnostic /p:AssemblyPath="$(TargetPath)"
person Ashfaq Hussain    schedule 03.10.2011