2010-08-27 120 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位机器上工作。