如何强制MSBuild以32位模式编译?

37
我正在使用MSBuild(通过NAnt)编译一堆VB.NET程序集。因为这些程序集依赖于COM互操作,所以我需要保证它们在64位操作系统上以32位模式运行。我可以通过更改Visual Studio中的项目将可执行程序集编译为32位,但我真的希望能够强制所有可执行文件在构建服务器上编译为32位模式。
我尝试了许多MSBuild命令行参数,但都没有成功:
  • /p:Platform=win32
  • /p:Platform=x86
  • /p:ProcessorArchitecture=x86
我做错了什么?是否有关于MSBuild编译VB项目时使用的属性的参考资料?
8个回答

55
根据MSDN的说法,你正在做正确的事情。看起来像是/p:Platform=x86,但实际上可能是/p:PlatformTarget=x86
尝试直接使用该参数调用MSBuild(确保这不是与你的NAnt文件有关的问题)。查看构建输出以获取正确的构建配置(Debug / Release)。

10
实际上,Platform是指“解决方案”平台,而PlatformTarget是项目所用的平台。你可以在Platform中使用任何自定义值,但PlatformTarget必须是以下之一:x86、x64、Itanium或anycpu。 - Benjamin Baumann
是的,例如我刚刚使用了:MSBuild /p:PlatformTarget="x86" /p:RunCodeAnalysis=False - Dinis Cruz
2
这是使用 /p:Platform=x86 参数,而非 PlatformTarget 参数(已在 MSBuild 14.0 上进行测试)。 - Miha Markic
我的测试表明,对于DLL文件,需要使用/p:Platform=x86,但对于控制台应用程序,则需要使用/p:PlatformTarget=x86。我只是将两者都设置了一下,以确保我的应用程序和任何库项目都能正确编译。 - Frank
正如另一个答案中所提到的,MSBuild 15需要PlatformTarget。在更新MSBuild(至V15)后,我的编译停止工作了,但是通过更改为PlatformTarget后又可以工作了。 - Mickael V.

25

如果程序集本身始终是32位的,为什么不将设置添加到.vbproj文件中?这将排除MSBuild的影响。

只需在.vbproj文件中的初始PropertyGroup中添加以下行:

<PlatformTarget>x86</PlatformTarget>

不是我想要的答案,但最终却是最简单/最安全的。 - Eric Nicholson
如果这不是你想要的答案,为什么会被接受呢?;-) @Nader的回答应该被接受。 :-) - darrenp

22

如果有帮助的话,我使用了以下命令行构建我的x86平台目标:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe my.sln /t:build /p:Configuration=Release;Platform=x86

4
在解决方案资源管理器中,右键单击根节点→配置管理器。您需要定义一种方案范围的配置,指示其中的每个项目都应构建为32位。 (注意:如果您曾经将至少一个项目设置为32位构建,则可能已经有一个。)有关逐步操作,请参见MSDN博客文章解决方案配置
然后,在您的Team Build .proj/.targets文件中指定所需的“平台”和“版本”。例如:
<ConfigurationToBuild Include="Release|x86">
    <FlavorToBuild>Release</FlavorToBuild>
    <PlatformToBuild>x86</PlatformToBuild>
</ConfigurationToBuild>

你可以指定多个属性部分来构建几种组合。我建议你直接从.sln文件中复制/粘贴“Release|x86”字符串(或其它类似的字符串),以确保完全匹配,因为你无法从“解决方案资源管理器”中获取这些信息。
关于你的评论:
由于混合了声明性和命令式样式,所以MSBuild属性评估非常复杂。有关详细信息,请参阅博客文章MSBuild Property Evaluation。我更倾向于不依赖于它的微妙之处。
尽管命令行上指定的属性应该覆盖其他所有属性,但Team Build还有另一层复杂性。ComputeConfigurationList任务通过递归MSBuild调用重复调用,而不是作为普通任务。它实现这一点的方式是将普通属性(如PlatformToBuild)包装在一组全局属性ConfigurationToBuild.PlatformToBuild(等等)中,这些属性会根据需要动态生成,每个配置生成一次。这使得Team Build引擎在内部更加灵活,但也使得实现想要的命令行行为更加困难。
你可以尝试直接在命令行上设置ConfigurationToBuild.PlatformToBuild,这可能有效,但我不确定。但是这肯定会阻止你在单个构建定义中构建多个配置。出于这个原因,我还是坚持以上的建议。

所以我的理解是,除非开发人员设置项目具有x86平台,否则没有办法从命令行强制使用特定平台?如果可能的话,我真的很想避免这一步骤(因为当新项目被创建时,我无法控制它们)。 - Eric Nicholson
是的和不是。我已经编辑了我的答案,提供更多细节。如果你真的想知道这些东西是如何工作的,请阅读(但不要触摸!)在%ProgramFiles%\MSBuild中找到的Microsoft.TeamFoundation.Build.targets文件。 - Richard Berg

3
对于MSBuild版本15,它是/p:PlatformTarget=x86。

嗨,@DominicJonas 当我写这个答案时,他好像没有提到过。谢谢你的反馈。 - Turker Tunali

2

经历了相同的问题后,我从使用位于 C:\WINDOWS\Microsoft.NET\Framework64 的 MSBuild 版本切换到位于 C:\WINDOWS\Microsoft.NET\Framework(没有 64)的版本,然后编译就正常了。


这些组件实际上在32位操作系统上(没有64位框架安装)成功编译,但在64位操作系统上运行时失败。但我怀疑您甚至无法在64位框架上编译某些组件,所以这是一个好提示。 - Eric Nicholson

1
Nant的msbuild-Task回答了这个问题:
<msbuild project="your.sln">
    <property name="PlatformTarget" value="x86" />
</msbuild>

0
我使用的更实际的找到正确属性的方法是打开其中一个.csproj项目文件(在C#的情况下),并查看当您从Visual Studio中选择“x64”/“AnyCPU”/“x86”时受影响的属性。无论更改了哪个属性,您都需要从命令行设置它。在Visual Studio 2015中,似乎是<Platform>。因此,您可以使用参数/p:Platform=x64调用msbuild,然后它应该可以工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接