如何为 MSBuild 指定平台?

Posted

技术标签:

【中文标题】如何为 MSBuild 指定平台?【英文标题】:How do I specify the platform for MSBuild? 【发布时间】:2011-03-10 11:43:37 【问题描述】:

我正在尝试使用 MSBuild 构建具有指定目标平台的解决方案(我需要二进制文件,x86 和 x64)。我就是这样尝试的:

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

但是,如果平台与“任何 CPU”不同,则构建总是会失败。我做错了什么?

这是 MSBuild 打印的 while 输出:

C:\WINDOWS\Microsoft.NET\Framework\v3.5>MsBuild SolutionPath\Solution.sln /t:重建 /p:配置=发布 /p:Platform="x86" Microsoft (R) 构建 引擎版本 3.5.30729.1 [微软 .NET 框架,版本 2.0.50727.3082] 版权所有 (C) Microsoft Corporation 2007。所有权利 保留。

构建开始于 1.7.2010 8:28:10。 项目“SolutionPath\Solution.sln” 节点 0(重建目标 t(s))。 解决方案路径\解决方案.sln:错误 MSB4126:指定的解决方案 配置“Release|x86”是 无效的。请指定一个有效的 解决方案配置使用 配置和平台属性 (例如 MSBuild.exe Solution.sln /p:配置=调试 /p:Platform="Any CPU") 或离开那些 属性空白以使用默认值 解决方案配置。完成建筑 项目“SolutionPath\Solution.sln” (重建目标)--失败。

构建失败。

“SolutionPath\Solution.sln”(重建 目标)(1)-> (ValidateSolutionConfiguration 目标) -> SolutionPath\Solution.sln : 错误 MSB4126: 指定的解决方案 配置“Release|x86”是 无效的。请指定一个有效的 解决方案配置使用 配置和平台属性 (例如 MSBuild.exe e Solution.sln /p:配置=调试 /p:Platform="Any CPU") 或离开那些 属性空白以使用默认值 解决方案配置。

0 Warning(s)
1 Error(s)

经过时间 00:00:00.03

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

【问题讨论】:

它是如何失败的?可能有些项目不支持x86平台? 你确定不需要 /p:Platform="Win32" 吗? 对于来到这里并想知道如何在不安装 Visual Studio 的机器上安装 2017 版 MSBuild 的未来读者,请参阅this other question。 @AndrewWyatt - afaik - C++ 使用 Win32 而现代 .NET 使用 x86 @ElliotWoods - 感谢您的澄清:Win32/x86 - 我的观点仅来自 C++ 的观点。 【参考方案1】:

如果您想为 x86x64 构建解决方案,您的解决方案必须针对这两个平台进行配置。实际上你只是有一个Any CPU配置。

如何检查项目的可用配置

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

如果你想为x86 构建Release 模式,你的项目文件中必须有这样的东西:

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

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

(来源:microsoft.com)

(来源:msdn.com)

(来源:msdn.com)

How to create and edit the configuration(在 MSDN 上)

【讨论】:

使用x86和x64有什么区别? x86 构建 32 位 dll/可执行文件,x64 构建 64 位 dll/可执行文件。 @Julien 可以/我应该使用 .targets 文件来设置共享配置吗? 一些项目使用Win32而不是x86,例如CMake生成的项目使用(libssh2使用CMake)。【参考方案2】:

如果您尝试从命令行执行此操作,您可能会遇到一个问题,即正在为您设置机器范围的环境变量“平台”并且对您不利。如果我使用 VS2012 命令窗口而不是常规 Windows 命令窗口,我可以重现此问题。

在命令提示符下键入:

设置平台

在 VS2012 命令窗口中,我预设了一个“X64”值。这似乎会干扰我的解决方案文件中的任何内容。

在常规命令窗口中,“set”命令会导致“变量未定义”消息...这很好。

如果你上面的“set”命令的结果没有返回环境变量值,你应该很好。

【讨论】:

这当然是 VS2012 x64 命令窗口与 VS2012 x86 命令窗口的区别。 IOW,按照设计,而不是“干涉”【参考方案3】:

在 MSBuild 或 Teamcity 中使用命令行

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

或使用更短的形式:

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

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

【讨论】:

没有实现 /property 的子设置来识别配置和平台。谢谢 请注意,MSBuild 不考虑 Visual Studio“解决方案配置”,而是在为解决方案的每个项目执行 xxproj 之前设置属性。无论您在 Visual Studio 中选择何种项目配置组合,解决方案的每个项目的平台和配置都是相同的。 或者可能更短:/p:Configuration=Release;AnyOtherParameter=Abc123;Platform=x86 如果它对任何人有帮助,命令行上的多字参数会用双引号括起来。所以Platform="Any CPU"Platform="Mixed Platforms" 对于那些需要它的人。【参考方案4】:

对于 VS2017 和 2019... 使用 modern core library SDK project files,可以在构建过程中更改平台。这是一个在内置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)构建:需要单独的手动构建任务,或者需要两个单独的项目文件,在上面的示例中分别使用 &lt;PlatformTarget&gt;x86&lt;/PlatformTarget&gt;&lt;PlatformTarget&gt;x64&lt;/PlatformTarget&gt; 设置。

【讨论】:

【参考方案5】:

当您在 Visual Studio 解决方案中使用 ConfigurationTransform 之类的工具为您的项目定义不同的构建配置时,您可能希望您的 Teamcity 构建能够为您构建指定的构建配置。您可能已经定义了构建配置,例如 Debug、Release、Dev、UAT、Prod 等。这意味着,您将为不同的配置设置 MSBuild 配置转换。当您有不同的配置时,通常会使用这些不同的配置,例如不同的数据库连接字符串,用于不同的环境。这很常见,因为您的生产环境与 Playground 开发环境的数据库不同。

他们说一张图片值一千字,请参阅下图,您将如何在 Teamcity 中指定多个构建配置。

在命令行输入文本框中,指定如下

/p:OutputPath=Publish;Configuration=Dev

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

【讨论】:

【参考方案6】:

我在 VS2017 中遇到了一个奇怪的案例,关于 “Any”和“CPU”之间的空间。不是关于使用命令提示符

如果您有一个构建项目文件,它可以调用其他解决方案文件。您可以尝试在 Any 和 CPU 之间添加空格,如下所示(Platform 属性值):

<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' 适用于调用项目文件,但不适用于调用解决方案文件, 用于调用解决方案文件,使用“任何 CPU”(添加空格。)

目前,我不确定这是 VS 项目文件还是 MSBuild 的错误。 我正在使用安装了 VS2017 构建工具的 VS2017。

【讨论】:

【参考方案7】:

希望这对那里的人有所帮助。

对于我指定“Any CPU”的平台,将其更改为“AnyCPU”并解决了问题。

msbuild C:\Users\Project\Project.publishproj /p:Platform="AnyCPU"  /p:DeployOnBuild=true /p:PublishProfile=local /p:Configuration=Debug

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

【讨论】:

【参考方案8】:

在 Visual Studio 2019 版本 16.8.4 中,您只需添加

<Prefer32Bit>false</Prefer32Bit>

【讨论】:

以上是关于如何为 MSBuild 指定平台?的主要内容,如果未能解决你的问题,请参考以下文章

如何为msbuild安装nuget.build.tasks.pack.targets

如何在 MSBuild 的 Exec 命令中转义引号

配置 Jenkins 以在 Linux 平台上运行 MSBuild

怎样使用 MSBuild 自动编译和发布 NET 网站

MSBUILD : 错误 MSB1008: 只能指定一个项目

MSBUILD : 错误 MSB1008: teamcity 中只能指定一个项目