2011-11-09 36 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!

相關問題