如何指定MSBuild的平台?

199

我正在尝试使用MSBuild来构建一个指定目标平台的解决方案(我需要x86和x64两种二进制文件)。这是我的尝试方法:

C:\WINDOWS\Microsoft.NET\Framework\v3.5>MsBuild SolutionPath\Solution.sln /t:Rebuild /p:Configuration=Release /p:Platform="x86"

然而,如果平台与"Any CPU"不同,则构建始终失败。我做错了什么吗?
这是MSBuild打印的完整输出内容:

C:\WINDOWS\Microsoft.NET\Framework\v3.5>MsBuild SolutionPath\Solution.sln /t:Rebuild /p:Configuration=Release /p:Platform="x86" Microsoft (R) Build Engine Version 3.5.30729.1 [Microsoft .NET Framework, Version 2.0.50727.3082] Copyright (C) Microsoft Corporation 2007. All rights reserved.

Build started 1.7.2010 8:28:10. Project "SolutionPath\Solution.sln" on node 0 (Rebuild targe t(s)). SolutionPath\Solution.sln : error MSB4126: The specified sol ution configuration "Release|x86" is invalid. Please specify a valid solution c onfiguration using the Configuration and Platform properties (e.g. MSBuild.exe Solution.sln /p:Configuration=Debug /p:Platform="Any CPU") or leave those prope rties blank to use the default solution configuration. Done Building Project "SolutionPath\Solution.sln" (Rebuild t arget(s)) -- FAILED.

Build FAILED.

"SolutionPath\Solution.sln" (Rebuild target) (1) -> (ValidateSolutionConfiguration target) -> SolutionPath\Solution.sln : error MSB4126: The specified s olution configuration "Release|x86" is invalid. Please specify a valid solution configuration using the Configuration and Platform properties (e.g. MSBuild.ex e Solution.sln /p:Configuration=Debug /p:Platform="Any CPU") or leave those pro perties blank to use the default solution configuration.

0 Warning(s)
1 Error(s)

Time Elapsed 00:00:00.03

如果我使用devenv尝试为x86/x64构建它,它可以完美工作。但是,我正在尝试设置一个构建服务器,而不安装所有必要的Visual Studio版本。顺便说一句,如果有更好的免费工具(支持.NET framework 4),我很想听听。


1
它是如何失败的?也许有些项目不支持x86平台? - Brian
3
你确定不需要 /p:Platform="Win32" 吗? - Andrew Wyatt
1
对于未来的读者,如果想在没有安装Visual Studio的计算机上安装2017版本的MSBuild,请参阅此其他问题 - Wai Ha Lee
据我所知,C++使用Win32,而现代.NET使用x86 - Elliot Woods
@ElliotWoods - 感谢您对Win32/x86的澄清 - 我的观点只是从C++的角度出发。 - Andrew Wyatt
8个回答

293

在 MSBuild 或 TeamCity 中使用命令行

MSBuild yourproject.sln /property:Configuration=Release /property:Platform=x64

或使用更短的形式:

MSBuild yourproject.sln /p:Configuration=Release /p:Platform=x64

无论如何,您仍需要在项目中设置平台,请参阅Julien Hoarau的答案。


1
没有意识到 /property 的子设置可以同时识别配置和平台。谢谢。 - DRapp
9
请注意,MSBuild 不考虑 Visual Studio 的 "解决方案配置",而是在执行解决方案中每个项目的 xxproj 之前设置属性。无论您在 Visual Studio 中选择了哪种项目配置混合,解决方案中每个项目的平台和配置都将相同。 - Laurent LA RIZZA
3
可能更简洁的写法是:/p:Configuration=Release;AnyOtherParameter=Abc123;Platform=x86。 - granadaCoder
9
如果有帮助的话,命令行上的多词参数需要用双引号括起来。因此,对于那些需要的人,可以使用 Platform="Any CPU"Platform="Mixed Platforms" - John Doe

114

如果你想构建适用于 x86x64 的解决方案,则需要为这两个平台都进行配置。实际上,你只有一个 Any CPU 配置。

如何检查项目的可用配置

要检查给定项目的可用配置,请打开项目文件(例如 *.csproj)并查找具有正确 ConditionPropertyGroup

如果你想以 x86 模式构建,则必须在项目文件中包含以下内容:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
  ...
</PropertyGroup>

如何在Visual Studio中创建和编辑配置

Configuration Manager panel
(来源:microsoft.com)

New solution platform button
(来源:msdn.com)

New solution platform panel
(来源:msdn.com)

如何在MSDN上创建和编辑配置


使用x86或x64有什么区别? - Acaz Souza
2
x86 构建 32 位 DLL/可执行文件,而 x64 构建 64 位 DLL/可执行文件。 - Benjamin Baumann
@Julien 我可以/应该使用.targets文件来设置共享配置吗? - Jan 'splite' K.
5
有些项目使用 Win32 而不是 x86,例如使用 CMake 生成的项目(如 libssh2)。请注意,此处为直译,可能存在更佳表达方式。 - Jeroen Wiert Pluimers

14
如果您正在尝试从命令行执行此操作,您可能会遇到一个问题,即一个名为“Platform”的机器范围环境变量被设置并且正在干扰您。如果我使用VS2012命令窗口而不是常规Windows命令窗口,则可以复现此问题。
在命令提示符下键入:
set platform
在VS2012命令窗口中,我预设了一个值为“X64”。它似乎干扰了我的解决方案文件中的任何内容。
在常规命令窗口中,“set”命令的结果是“未定义变量”的消息……这很好。
如果您上面的“set”命令的结果未返回任何环境变量值,则应该没问题了。

2
这当然是如何区分VS2012 x64命令窗口和VS2012 x86命令窗口的方法。也就是说,按设计来说,并不是“干扰”。 - MSalters

4
希望这能帮到某些人。
我在指定平台时选择了“Any CPU”,将其更改为“AnyCPU”后问题得到解决。
msbuild C:\Users\Project\Project.publishproj /p:Platform="AnyCPU"  /p:DeployOnBuild=true /p:PublishProfile=local /p:Configuration=Debug

如果您查看您的 .csproj 文件,您将看到要使用的正确平台名称。

0
在 Visual Studio 2019 版本 16.8.4 中,您只需添加即可。
<Prefer32Bit>false</Prefer32Bit>

0
当您在Visual Studio解决方案中为项目定义不同的构建配置时,使用ConfigurationTransform等工具,您可能希望Teamcity构建按照指定的构建配置进行构建。您可能已经定义了构建配置,例如Debug、Release、Dev、UAT、Prod等。这意味着,您将为不同的配置设置MSBuild配置转换。通常在有不同环境的情况下使用这些不同的配置,例如不同的数据库连接字符串。这很常见,因为您的生产环境和开发环境之间会有不同的数据库。
他们说一张图片胜过千言万语,请参见下面的图片,了解如何在Teamcity中指定多个构建配置。
在命令行输入文本框中,按以下方式指定: /p:OutputPath=Publish;Configuration=Dev

在这里,我指定了两个命令行构建配置/参数 OutputPath 和构建 Configuration,值分别为 PublishDev,但它也可以是 UATProd 配置。如果您需要更多,请用分号;分隔。

Teamcity MSBuild Commandline build configuration screenshot


0

我在VS2017中遇到了一个奇怪的问题,与“Any”和“CPU”之间的空格有关。 这与使用命令提示符无关。

如果您有一个构建项目文件,可以调用其他解决方案文件。您可以尝试在Any和CPU之间添加空格,就像这样(平台属性值):

<MSBuild Projects="@(SolutionToBuild2)" Properties ="Configuration=$(ProjectConfiguration);Platform=Any CPU;Rerun=$(MsBuildReRun);" />

在我解决这个构建问题之前,它是这样的(ProjectPlatform 是一个全局变量,被设置为 'AnyCPU'):
<MSBuild Projects="@(SolutionToBuild1)" Properties ="Configuration=$(ProjectConfiguration);Platform=$(ProjectPlatform);Rerun=$(MsBuildReRun);" />

此外,我们有很多项目使用 $ (ProjectPlatform) 进行调用,它是“AnyCPU”,并且运行良好。如果我们打开 proj 文件,我们可以看到类似这样的行,这是有意义的。
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">

所以我的结论是,“AnyCPU”适用于调用项目文件,但不适用于调用解决方案文件,对于调用解决方案文件,请使用“Any CPU”(加上空格)。
目前,我不确定这是否是VS项目文件或MSBuild的错误。我正在使用安装了VS2017构建工具的VS2017。

0

对于VS2017和2019...使用现代核心库SDK项目文件,平台可以在构建过程中更改。以下是一个示例,可以在内置的CoreCompile任务运行之前切换到anycpu平台:

<Project Sdk="Microsoft.NET.Sdk" >

  <Target Name="SwitchToAnyCpu" BeforeTargets="CoreCompile" >
    <Message Text="Current Platform=$(Platform)" />
    <Message Text="Current PlatformTarget=$(PlatformName)" />
    <PropertyGroup>
      <Platform>anycpu</Platform>
      <PlatformTarget>anycpu</PlatformTarget>
    </PropertyGroup>
    <Message Text="New Platform=$(Platform)" />
    <Message Text="New PlatformTarget=$(PlatformTarget)" />
  </Target>

</Project>

在我的情况下,我正在使用BeforeTargetsAfterTargets任务构建FPGA,但在主要的CoreCompile中编译C#应用程序。(部分原因是我可能需要某种命令行应用程序,部分原因是我无法弄清如何省略或覆盖CoreCompile
要为多个并发二进制文件(例如x86和x64)构建:需要一个单独的手动构建任务或两个具有相应<PlatformTarget>x86</PlatformTarget><PlatformTarget>x64</PlatformTarget>设置的项目文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接