2012-08-30 61 views
5

我寫了一個小小的MSBuild腳本來構建我的項目在多個版本。當我從VS2012命令提示符運行它時,它不起作用,我沒有遇到任何錯誤或異常。但是,當我比較生產的組件時,它們是相同的。我的腳本中有錯嗎?我的構建腳本是否針對多個目標框架正常工作?

<Target Name="Build"> 

    <MSBuild Projects=".\WcfClientBase\WcfClientBase.csproj" 
      Properties="Configuration=Release;OutputPath=.\BuildArtifacts\net45;TargetFrameworkVersion=v4.5" /> 

    <MSBuild Projects=".\WcfClientBase\WcfClientBase.csproj" 
      Properties="Configuration=Release;OutputPath=.\BuildArtifacts\net40;TargetFrameworkVersion=v4.0" /> 

    <MSBuild Projects=".\WcfClientBase\WcfClientBase.csproj" 
      Properties="Configuration=Release;OutputPath=.\BuildArtifacts\net35;TargetFrameworkVersion=v3.5" /> 

</Target> 

我安裝了VS2012專業版。我也注意到.NET 4.5沒有自己的MSBuild.exe。它使用的是4.0版本嗎?

更新

我與Visual Studio每個版本建立了它和所有的組件是不同的。我的腳本有問題。我故意錯誤輸入了TargetFrameworkVersion參數名稱,但仍然構建並生成了相同的輸出。也許它無法覆蓋項目文件中的參數,或者我缺少其他參數。還有什麼想法?

+0

我只是使用ILMerge將.NET 2可執行文件更改爲.NET 4; p請記住,入口點決定了運行時版本。在我的情況下,所有程序集都是以.NET 2爲目標並使用AnyCPU構建的。然後,我使用ILMerge和corflags爲.NET版本和位組合生成一組4個可執行文件。作品魅力(在我的情況下,專門爲所有4種配置使用ngen)。 – leppie

+0

你最近怎麼做比較?你比較字節爲字節? –

+0

@splatteredbits是 –

回答

4

您還需要自定義IntermediateOutputPath屬性,否則所有3種口味共享相同的中間目錄obj\Release。試試這個:

<Target Name="Build"> 
    <MSBuild Projects="WcfClientBase\WcfClientBase.csproj" 
     Properties="Configuration=Release;OutputPath=BuildArtifacts\net45\;IntermediateOutputPath=obj\Release\net45\;TargetFrameworkVersion=v4.5" /> 
    <MSBuild Projects="WcfClientBase\WcfClientBase.csproj" 
     Properties="Configuration=Release;OutputPath=BuildArtifacts\net40\;IntermediateOutputPath=obj\Release\net40\;TargetFrameworkVersion=v4.0" /> 
    <MSBuild Projects="WcfClientBase\WcfClientBase.csproj" 
     Properties="Configuration=Release;OutputPath=BuildArtifacts\net35\;IntermediateOutputPath=obj\Release\net35\;TargetFrameworkVersion=v3.5" /> 
</Target> 
+0

沒有幫助。組件仍然是相同的。 –

+1

@Ufuk,比較3.5與4.0二進制。他們會有所不同。比較的一種方法是在'ildasm'中打開二進制文件,並檢查在彙編元數據中鏈接了哪個版本的mscorlib。 –

+0

請檢查我的更新。 –

相關問題