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

Posted

技术标签:

【中文标题】如何强制 MSBuild 编译为 32 位模式?【英文标题】:How do I force MSBuild to compile for 32-bit mode? 【发布时间】:2010-11-07 15:52:23 【问题描述】:

我正在使用 MSBuild(通过 NAnt)编译一堆 VB.NET 程序集。因为这些程序集依赖于 COM 互操作,所以我需要保证它们在 64 位操作系统上以 32 位模式运行。我可以通过在 Visual Studio 中更改项目来将可执行程序集编译为 32 位,但我真的希望能够在构建服务器上强制将所有可执行程序编译为 32 位模式。

我尝试了一些 MSBuild 的命令行参数,但没有成功:

/p:Platform=win32 /p:Platform=x86 /p:ProcessorArchitecture=x86

我做错了什么?在编译 VB 项目时,是否对 MSBuild 使用的属性有一些参考?

【问题讨论】:

【参考方案1】:

根据MSDN,您做的是正确的事情。看起来像/p:Platform=x86,但实际上,可能是/p:PlatformTarget=x86

尝试使用该参数直接调用 MSBuild(确保您的 NAnt 文件没有问题。查看正确构建配置的构建输出(Debug / Release em>)。

【讨论】:

实际上Platform是“解决方案”Platform,PlatformTarget是项目Platform。您可以在 Platform 中拥有任何您想要的自定义值,但 PlatformTarget 必须是以下之一:x86、x64、Itanium 或 anycpu。 是的,例如我刚刚使用:MSBuild /p:PlatformTarget="x86" /p:RunCodeAnalysis=False 它是 /p:Platform=x86,而不是 PlatformTarget(使用 MSBuild 14.0 测试) 我的测试表明,对于 DLL,它需要 /p:Platform=x86,但对于控制台应用程序,它需要 /p:PlatformTarget=x86。我只是设置了两者,它确保我的应用程序和任何库项目都被正确编译。 正如另一个答案中提到的,MSBuild 15 需要 PlatformTarget。我的在更新 MSBuild(到 V15)后停止工作,并在更改为 PlatformTarget 后再次工作。【参考方案2】:

如果程序集本身总是 32 位,为什么不将设置添加到 .vbproj 文件?这将使 MSBuild 脱离等式。

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

<PlatformTarget>x86</PlatformTarget>

【讨论】:

不是我正在寻找的答案,但最终成为最简单/最安全的答案。 如果这不是您要寻找的答案,为什么会被接受? ;-) @Nader 的答案应该是被接受的。 :-)【参考方案3】:

为了以防万一,我使用这个命令行来构建我的 x86 平台目标:

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

【讨论】:

【参考方案4】:

在解决方案资源管理器中,右键单击根节点 → 配置管理器。您需要定义一个解决方案范围的配置,指示其中的每个项目构建为 32 位。 (注意:如果您曾经将至少一个项目设置为构建为 32 位,那么您可能已经拥有一个。)有关分步演练,请参阅 MSDN 博客文章Solution Configurations .

然后,您在 Team Build .proj / .targets 文件中指定所需的“平台”和“风格”。例如:

<ConfigurationToBuild Include="Release|x86">
    <FlavorToBuild>Release</FlavorToBuild>
    <PlatformToBuild>x86</PlatformToBuild>
</ConfigurationToBuild>

您可以指定多个这些属性部分来构建多个组合。我会直接从您的.sln 文件中复制/粘贴“Release|x86”字符串(或任何类似的字符串),以确保它完全匹配——您无法直接从解决方案资源管理器中获取它。

关于您的评论:

MSBuild 属性评估非常复杂,因为它混合了声明式和命令式风格。有关详细信息,请参阅博文 MSBuild Property Evaluation。我不想依赖它的微妙之处。

在命令行中指定的属性确实应该覆盖其他所有属性,但 Team Build 具有另一层复杂性。 The ComputeConfigurationList task is called repeatedly via a recursive MSBuild invokation, not as an ordinary task。它实现这一点的方法是采用像PlatformToBuild 这样的普通属性并将它们包装在一组名为ConfigurationToBuild.PlatformToBuild(等)的全局属性中,这些属性是动态生成的,每个配置一次。这使得 Team Build 引擎在内部更加灵活,但也使得破解您想要的命令行行为变得更加困难。

您可以尝试直接在命令行上设置ConfigurationToBuild.PlatformToBuild — 它可能会起作用,我不确定。但它肯定会阻止您在单个构建定义中构建多个配置。出于这个原因,我坚持上面的建议。

【讨论】:

那么我得到的是,除非开发人员将项目设置为具有 x86 平台,否则没有办法从命令行强制特定平台?如果可能的话,我真的很想避免这一步(因为在创建新项目时我无法控制它们)。 是和不是。我已经编辑了我的答案以提供更多详细信息。如果您真的想知道这些东西是如何工作的,请阅读(但不要触摸!)%ProgramFiles%\MSBuild 中的 Microsoft.TeamFoundation.Build.targets 文件【参考方案5】:

对于 MSBuild 版本 15,它是 /p:平台目标=x86

【讨论】:

嗨,@DominicJonas 如果我没记错的话,在我写这个答案时并没有提到他。感谢您的反馈。【参考方案6】:

在遇到完全相同的问题后,我从使用 C:\WINDOWS\Microsoft.NET\Framework64... 的 MSBuild 版本切换到使用 C:\WINDOWS\Microsoft.NET\Framework 的版本(没有 64),并且编译得很好。

【讨论】:

组件实际上在 32 位操作系统上成功编译(未安装 64 位框架),然后在 64 位操作系统上运行时失败。但我怀疑你甚至无法在 64 位框架上编译某些组件,所以这是一个很好的提示。【参考方案7】:

Nant msbuild-Task 对这个问题的回答:

<msbuild project="your.sln">
    <property name="PlatformTarget" value="x86" />
</msbuild>

【讨论】:

【参考方案8】:

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

【讨论】:

以上是关于如何强制 MSBuild 编译为 32 位模式?的主要内容,如果未能解决你的问题,请参考以下文章

强制 gcc 在 64 位平台上编译 32 位程序

Monaca 将应用程序 iOS 应用程序编译为 32 位,而不是 64 位

MATLAB编译器

尝试在 64 位机器上将 Detours.lib 编译为 32 位:LNK1112:模块机器类型“x86”与目标机器类型“x64”冲突

如何确定我的 python shell 是以 32 位还是 64 位执行的?

强制将特定文件编译为 Objective-C/文件类型,但将整个项目编译为 Objective-C++