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

时间:2009-07-02 14:17:58

标签: .net vb.net msbuild 64-bit 32-bit

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

我已经尝试了许多命令行参数给MSBuild而没有运气:

  • / P:平台= win32的
  • / P:平台= 86
  • / P:ProcessorArchitecture用于= 86

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

8 个答案:

答案 0 :(得分:47)

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

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

答案 1 :(得分:20)

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

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

即可
<PlatformTarget>x86</PlatformTarget>

答案 2 :(得分:14)

为了防止这种情况发生,我使用此命令行构建了我的x86平台目标:

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

答案 3 :(得分:3)

在解决方案资源管理器中,右键单击根节点 - &gt; 配置管理器。您需要定义一个解决方案范围的配置,指示每个项目内部构建为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 - 它可能有用,我不确定。但它肯定会阻止您在单个构建定义中构建多个配置。出于这个原因,我坚持上面的建议。

答案 4 :(得分:2)

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

答案 5 :(得分:2)

对于MSBuild版本15,它是 / P:PlatformTarget = 86

答案 6 :(得分:1)

Nant msbuild-Task回答了这个问题:

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

答案 7 :(得分:0)

我用来查找正确属性的更实用的方法是打开一个.csproj项目  文件(如果是c#)并在选择&#34; x64&#34;时看到受影响的属性/&#34; AnyCPU&#34; /&#34; x86&#34;来自Visual stdio。无论改变什么属性,您都需要从命令行设置它。使用Visual Studio 2015,它似乎是&lt; Platform&gt;。所以你可以使用参数 / p:Platform = x64 来调用msbuild,它应该可以工作。

相关问题