我正在使用MSBuild(通过NAnt)来编译一堆VB.NET程序集。因为这些程序集依赖于COM Interop,所以我需要保证它们在64位OS上以32位模式运行。我可以通过在Visual Studio中更改项目来将可执行程序集编译为32位,但我真的希望能够在构建服务器上强制将所有可执行文件编译为32位模式。
我已经尝试了许多命令行参数给MSBuild而没有运气:
我做错了什么?是否有一些对MSBuild在编译VB项目时使用的属性的引用?
答案 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,它应该可以工作。