33

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

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

  • /p:平台=win32
  • /p:平台=x86
  • /p:处理器架构=x86

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

4

8 回答 8

53

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

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

于 2009-07-02T14:24:18.393 回答
22

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

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

<PlatformTarget>x86</PlatformTarget>
于 2009-07-02T14:23:46.583 回答
19

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

C:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe my.sln /t:build /p:Configuration=Release;Platform=x86
于 2012-05-09T07:39:30.277 回答
4

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

然后,您在Team Build .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直接在命令行上进行设置——它可能会起作用,我不确定。但它肯定会阻止您在单个构建定义中构建多个配置。出于这个原因,我坚持我上面的建议。

于 2009-07-02T14:30:53.340 回答
3

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

于 2017-07-20T08:24:22.383 回答
2

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

于 2010-08-23T18:32:29.913 回答
1

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

<msbuild project="your.sln">
    <property name="PlatformTarget" value="x86" />
</msbuild>
于 2012-10-16T10:56:39.193 回答
0

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

于 2018-06-19T08:17:59.773 回答