【问题标题】:MSBuild task to Build other solution projects fails in VS but works with MSBuild.exe command line在 VS 中构建其他解决方案项目的 MSBuild 任务失败,但可以使用 MSBuild.exe 命令行
【发布时间】:2011-11-09 19:39:32
【问题描述】:

我有一个自定义 MSBuild 任务,其中包括将嵌入式资源添加到解决方案中的其他项目。添加资源后,我想构建这些项目,但发现我无法在 Visual Studio 中使用它。

为了进行测试,我完全剥离了自定义任务,并在 Silverlight 解决方案的 Web 项目中重新定义了一个简单的 AfterBuild 目标。目标使用 MSBuild 任务在解决方案中构建 Silverlight 应用程序项目,如下所示:

<Target Name="AfterBuild">
  <PropertyGroup>
    <LinkedProject>..\SilverlightApplication1\SilverlightApplication1.csproj</LinkedProject> 
  </PropertyGroup>

  <MSBuild Condition="'$(LinkedProject)' != '' "
    Projects="$(LinkedProject)"
    Targets="Build"
    Properties="CustomFlag=true" >
  </MSBuild>
</Target>

奇怪的是,这在从命令行使用 MSBuild 时完美运行,但在构建 Web 项目时在 Visual Studio 中不起作用。我认为这可能是某种 Silverlight 问题,并让任务构建了一个 .NET 类库项目,但结果是一样的——它可以从命令行工作,但不能在 VS 中工作。在 VS 中没有实际错误 - 只是 Csc 任务没有编译程序集并且没有生成输出。

我需要做什么才能在 Visual Studio 中进行这项工作?

【问题讨论】:

    标签: visual-studio-2010 msbuild


    【解决方案1】:

    将“UseHostCompilerIfAvailable=false”属性传递给 MSBuild 任务。

    如果从 MSBuild 任务调用 csc,看起来 Visual Studio 会严重损坏,因为它会为其进程内宿主编译器重用初始项目构建设置。就我而言,我两次构建同一个项目 - 默认构建使用目标框架 v3.5,AfterBuild MSBuild 任务指定 v4.0。我最终遇到了同样的问题 - csc 似乎运行但没有产生输出。我认为发生的事情是,将 UseHostCompilerIfAvailable 属性设置为 true,csc 正在调用托管编译器,它重用了我的初始项目设置,所以即使命令行显示 csc “构建”我的 v4.0 程序集,宿主编译器也只是简单的覆盖我刚刚构建的 v3.5!

    【讨论】:

      【解决方案2】:

      将 Visual Studio 详细程度更改为详细并检查构建日志。我认为如果您的文件没有更改,则不会执行 CoreBuild,因此您可以尝试使用 AfterCompile 而不是 AfterBuild。

      【讨论】:

      • 我一直在使用详细的诊断,但它没有告诉我为什么 Csc 任务不会产生输出。在调用 Build 目标时我一直在使用自定义属性,在测试用例中我只是将其称为“CustomFlag”,我认为这足以确保 MSBuild 任务即使已经构建了项目也能构建项目。 CoreCompile 目标被调用,即使是 Csc 任务,它也不做任何事情。另外,我在测试中的 web 应用程序项目中使用 AfterBuild 目标,但我的应用程序使用的是 .targets 文件,该文件注入到 CoreBuild 的末尾。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 2011-01-13
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多