【问题标题】:MSBuild community task GacUtil silently failing for meMSBuild 社区任务 GacUtil 默默地为我失败
【发布时间】:2011-11-24 21:11:21
【问题描述】:

我有一个open source .NET project,它的主要工件是一个DLL,需要将它安装到GAC 以用于其主要用例。因此我想在 AfterBuild 任务期间安装它。我正在使用来自MSBuild Community Extensions 的 GacUtil msbuild 任务。它不工作。

我从here 获得的 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 很好的一般建议,但在这种特定情况下,任务不依赖 v1.4 中的 exe

标签: msbuild msbuildcommunitytasks gacutil


【解决方案1】:

看起来它试图使用该工具的路径是错误的(或者至少在我的情况下是错误的)。将“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>

【讨论】:

  • 我现在得到的错误是 MSBUILD : 警告 MSB6006: "gacutil.exe" exited with code 1. E:\src\JustAProgrammer.ADPR\JustAProgrammer.ADPR\JustAProgrammer.ADPR.csproj(78, 5): error MSB6006: "gacutil.exe" exited with code 1
  • 嗯,这已经让你超越了最初的问题。您是否仍然可以从命令行成功执行单独的 gacutil 命令,将 $(TargetPath) 值传递给它(即项目根目录中的“gacutil -i .\bin\Debug\JustAProgrammer.ADPR.dll”)?
  • 我刚刚注意到您在 GacUtil 中使用的是 $(TargetName) 而不是 $(TargetPath)。您需要使用后者来引用程序集本身,而不仅仅是程序集的路径。
  • 贾斯汀,你的问题现在解决了吗?如果不是我确定的 TargetName/TargetPath 部分,您能否在答案中分享实际的解决方案?
  • 抱歉,这周会重温。
【解决方案2】:

您是否使用 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)"

【讨论】:

    猜你喜欢
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多