2010-08-27 39 views
9

我試圖在64位機器上使用MSBuild(v4.0)構建項目。出於某種原因,MSBuild正在嘗試加載一個32位的擴展名,我無法弄清楚原因。爲了證明這個問題,我將這個問題縮小到了最小的範圍。爲什麼64位MSBuild加載32位擴展?

使用下面的MSBuild項目文件:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> 
    <Target Name="test"> 
     <Message Text="bin path: $(MSBuildBinPath)" /> 
     <Message Text="extensions path: $(MSBuildExtensionsPath)" /> 
     <Message Text="extensions path (x86): $(MSBuildExtensionsPath32)" /> 
     <Message Text="extensions path (x64): $(MSBuildExtensionsPath64)" /> 
    </Target> 
</Project> 

我得到這樣的輸出:

Microsoft (R) Build Engine Version 4.0.30319.1 
[Microsoft .NET Framework, Version 4.0.30319.1] 
Copyright (C) Microsoft Corporation 2007. All rights reserved. 

Build started 8/27/2010 9:56:35 AM. 
Project "D:\5\test.proj" on node 1 (default targets). 
test: 
    bin path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319 
    extensions path: C:\Program Files (x86)\MSBuild 
    extensions path (x86): C:\Program Files (x86)\MSBuild 
    extensions path (x64): C:\Program Files\MSBuild 
Done Building Project "D:\5\test.proj" (default targets). 


Build succeeded. 
    0 Warning(s) 
    0 Error(s) 

Time Elapsed 00:00:00.03 

的MSBuild顯然知道有關32位和64位擴展路徑,從二進制路徑似乎很清楚,我正在運行64位MSBuild.exe,但由於某種原因,它認爲擴展應該從Program Files (x86)而不是Program Files加載。這給我帶來了麻煩,因爲我有一個需要加載的擴展,必須在32位/ 64位進程中正確加載,並且不會加載(MSBuild試圖在64位進程中加載​​32位版本)。

爲什麼?

回答

14

filed a bug微軟連接,並且它關閉爲「按設計」,用這樣的解釋:

你是完全正確的 - 這種情況已經改變,而且嚴格來說,它現在是錯誤的。但是,這是一個有意識的決定。它被更改的原因是,其他產品安裝的很多擴展名(如.targets文件)僅安裝在32位程序文件位置中。他們沒有預料到64位的情況,但通常在64位MSBuild中工作得很好。當用戶運行64位MSBuild時,現在這很常見,因爲它是Team Build 2010的默認設置,MSBuildExtensionsPath過去將按照您的預期解析爲64位程序文件。但是這意味着所有這些.targets文件都不再被發現,並且構建失敗。讓所有這些產品都能夠修復他們的設置創作是不現實的,尤其是因爲它已經發貨給了客戶。所以我們做了修改,使MSBuildExetnsionsPath始終指向32位的位置。幾乎沒有人似乎真的想要64位位置,這些人可以更改爲MSBuildExtensionsPath64。這真是一個最不好的選擇的問題。

我接受證據​​,但我不同意這個結論。我相信破碎的安裝程序的作者應該讓他們的擴展不能在64位機器上工作。