如何强制 MSBuild 编译为 32 位模式?
解决方案
如果程序集本身始终是 32 位,为什么不将设置添加到 .vbproj 文件中?这将把 MSBuild 排除在外。
只需将以下行添加到 .vbproj 文件中的初始 PropertyGroup 中
<PlatformTarget>x86</PlatformTarget>
其他提示
根据 微软软件定义网络, ,你做的是正确的事。好像 /p:Platform=x86
, ,但实际上,也许是 /p:PlatformTarget=x86
.
尝试使用该参数直接调用 MSBuild(确保这不是您的 NAnt 文件的问题。查看构建输出以获得正确的构建配置(调试 / 发布).
为了以防万一这有帮助,我使用此命令行来构建我的 x86 平台目标:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe my.sln /t:build /p:Configuration=Release;Platform=x86
在解决方案资源管理器中,右键单击根节点 -> 配置管理器. 。您需要定义一个解决方案范围的配置,指示其中的每个项目构建为 32 位。(笔记:如果您曾经将至少一个项目设置为 32 位构建,那么您可能已经拥有一个。)有关分步演练,请参阅 MSDN 博客文章 解决方案配置.
然后,您在您的应用程序中指定所需的“平台”和“风味” 团队建设 .proj
/ .targets
文件。例如:
<ConfigurationToBuild Include="Release|x86">
<FlavorToBuild>Release</FlavorToBuild>
<PlatformToBuild>x86</PlatformToBuild>
</ConfigurationToBuild>
您可以指定多个属性部分来构建多种组合。我会直接从您的系统中复制/粘贴“Release|x86”字符串(或任何看起来像的内容) .sln
文件以确保它完全匹配 - 您无法直接从解决方案资源管理器获取它。
关于您的评论:
MSBuild 属性评估非常复杂,因为它混合了声明式和命令式样式。请参阅博客文章 MSBuild 属性评估 了解详情。我宁愿不依赖它的微妙之处。
确实,在命令行上指定的属性应该覆盖其他所有内容,但 Team Build 还有另一层复杂性。 ComputeConfigurationList 任务通过递归 MSBuild 调用重复调用,而不是作为普通任务. 。它实现这一点的方法是采用普通属性,例如 PlatformToBuild
并将它们包装在一组名为的全局属性中 ConfigurationToBuild.PlatformToBuild
(等),它们是动态生成的,每个配置一次。这使得 Team Build 引擎内部更加灵活,但也使得破解您想要的命令行行为变得更加困难。
你可以尝试设置 ConfigurationToBuild.PlatformToBuild
直接在命令行上——它可能有效,我不确定。但它肯定会阻止您在单个构建定义中构建多个配置。出于这个原因,我坚持上面的建议。
遇到完全相同的问题后,我不再使用 MSBuild 版本 C:\WINDOWS\Microsoft.NET\Framework64
...到版本 C:\WINDOWS\Microsoft.NET\Framework
(不 64
)并且编译得很好。
对于MSBUILD版本15,它是 /p:platformTarget = x86
Nant msbuild-Task 对这个问题的回答:
<msbuild project="your.sln">
<property name="PlatformTarget" value="x86" />
</msbuild>
我用来找到合适属性的一种更实用的方法是打开一个.csproj项目文件之一(如果在C#的情况下),然后查看当您从Visual中选择“ x64” /“ anycpu” /“ x86”时,该属性会受到影响。斯蒂奥。无论更改什么属性,您都需要从命令行进行设置。对于 Visual studio 2015,它似乎是 <Platform>。所以你可以用参数调用 msbuild /p:平台=x64 它应该有效。