如何强制 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,它似乎是
【讨论】:
以上是关于如何强制 MSBuild 编译为 32 位模式?的主要内容,如果未能解决你的问题,请参考以下文章
Monaca 将应用程序 iOS 应用程序编译为 32 位,而不是 64 位
尝试在 64 位机器上将 Detours.lib 编译为 32 位:LNK1112:模块机器类型“x86”与目标机器类型“x64”冲突