MSBuild社区任务GacUtil在我的计算机上默默失败

4

我有一个开源.NET项目,其主要产物是一个DLL,需要在其主要使用情况下安装到GAC中。因此,我希望在AfterBuild任务期间安装它。我正在使用MSBuild社区扩展中的GacUtil 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失败的原因?

有没有可能是msbuild或任务找不到gacutil?我还没有查看dll,以查看CE是否调用gacutil本身,还是他们编写了自己的实现。这是我们寻找gacutil的方法,但如果您能使其正常工作,我相信msbuild任务会更好。另一个想法是启动进程资源管理器并查看访问的所有文件,也许发生了一些奇怪的事情。 - billinkc
@billinkc 给出了很好的一般建议,但在这种特定情况下,任务不依赖于 v1.4 中的 exe。 - Ruben Bartelink
2个回答

2

看起来它试图使用的路径不正确(或者至少在我的情况下是这样)。将"GacUtil"任务上的"ToolPath"属性设置为"$(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>

好的,这解决了您最初的问题。您能否仍然成功地执行独立的gacutil命令从命令行中传递$(TargetPath)值(即从项目根目录执行“gacutil -i .\bin\Debug\JustAProgrammer.ADPR.dll”)? - Josh Gallagher
我刚刚注意到你在GacUtil中使用的是$(TargetName)而不是$(TargetPath)。你需要使用后者来引用程序集本身,而不仅仅是程序集的路径。 - Josh Gallagher
好的,我仍然得到一个错误代码1。这是新的XML代码: <GacUtil Command="Uninstall" ToolPath="$(FrameworkSDKDir)bin" Assemblies="$(TargetPath)" ContinueOnError="true"/> <GacUtil ToolPath="$(FrameworkSDKDir)bin" Assemblies="$(TargetPath)" /> - Justin Dearing
@JustinDearing 我现在意识到我之前的评论并不清楚。看看我的答案中的 XML,你会发现卸载使用 TargetName,而安装使用 TargetPath。你在评论中放置的 XML 错误地使用了 TargetPath 进行卸载。 - Josh Gallagher
为了明确,v1.4(以及后续版本)不依赖于 gacutil.exe。 - Ruben Bartelink
显示剩余3条评论

0
你是否使用Message任务验证了$(TargetName)的值?
在build.proj文件中,你可能需要指定一个属性:
  <PropertyGroup>
    <AssemblyPath></AssemblyPath>
  </PropertyGroup>

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

然后从Visual Studio的后期构建事件中传递属性值:

msbuild /t:AfterBuild /verbosity:diagnostic /p:AssemblyPath="$(TargetPath)"

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