2011-11-09 35 views
1

我有一个自定义的MSBuild任务,其中包括其他东西添加嵌入式资源解决方案中的其他项目。添加资源后,我想然后建立这些项目,但发现我无法在Visual Studio中使用它。MSBuild任务构建其他解决方案项目VS失败,但与MSBuild.exe命令行一起工作

为了测试,我完全剥离了自定义任务,并在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时完美的作品,但不可视工作Studio构建Web项目时。我认为这可能是某种Silverlight问题,并且它的任务是建立一个.NET类库项目,但结果是一样的 - 它在命令行上工作,但不在VS中。在VS中没有实际的错误 - 只是Csc任务不会编译程序集并且不会生成输出。

我需要做什么才能在Visual Studio中正常工作?

回答

0

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

+0

我一直在使用诊断的冗长,但它不告诉我为什么Csc任务不会产生输出。在调用构建目标时,我一直在使用自定义属性,在测试用例中,我将其称为“CustomFlag”,我认为这足以确保MSBuild任务即使已经构建也能构建项目。 CoreCompile目标被调用,即使是Csc任务,它也不会执行任何操作。另外,我在测试中的Web应用程序项目中使用AfterBuild目标,但是我的应用程序使用注入CoreBuild结尾的.targets文件。 –

1

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

如果csc从MSBuild任务调用时,它看起来像Visual Studio坏掉了,因为它重新使用它的进程内主机编译器的初始项目构建设置。在我的情况下,我构建了两个相同的项目 - 默认构建使用了目标框架v3.5,并且具有指定v4.0的AfterBuild MSBuild任务。我结束了同样的问题 - csc似乎运行,但没有产生输出。我认为发生了什么事情是因为UseHostCompilerIfAvailable属性设置为true,csc正在调用托管编译器,它重用了我的初始项目设置,所以即使命令行显示csc“构建”了我的v4.0程序集,主编译器也只是覆盖我刚刚构建的v3.5!

相关问题