构建其他解决方案项目的MSBuild任务在VS中失败,但与MSBuild.exe命令行一起使用

时间:2011-11-09 19:39:32

标签: visual-studio-2010 msbuild

我有一个自定义的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中使用它需要做什么?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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