如何为 MSBuild 指定平台?

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

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

然而,如果平台不同于“任意 CPU”,那么构建总是失败。我做错了什么?

这是 while 输出 MSBuild 打印的结果:

C: WINDOWS Microsoft.NET Framework v3.5 > MsBuild Sln/t: 重建 /p: 配置 = 释放 平台 = “ x86”Microsoft (R) Build 引擎版本3.5.30729.1[ Microsoft .NET 框架,版本 2.0.50727.3082]微软公司2007年版权所有 保留意见。

构建开始于1.7。2010年8:28:10。 上的“ SolutionPath Solution.sln”项目 节点0(重建目标 t (s))。 Sln: error MSB4126: 指定的解决方案 配置“ Release | x86”是 无效。请指定一个有效的 解决方案 c 配置使用 配置和平台属性 (例如 MSBuild.exe Solutions. sln /p: 配置 = 调试 /p: Platform = “ Any CPU”)或者离开这些 将 rties 空白化以使用默认值 解决方案配置。完成建设 项目“ SolutionPath Solutions. sln” (重建 t 目标)——失败。

建造失败。

“ SolutionPath Solution.sln”(重新生成 目标)(1)-> (ValidateSolutionConfiguration 目标) - > SolutionPath Solutions. sln: error MSB4126: 指定的解决方案 配置“ Release | x86”是 无效。请指定一个有效的 解决方案配置使用 配置和平台属性 (例如 MSBuild.ex e Solutions. sln /p: 配置 = 调试 /p: Platform = “ Any CPU”)或者离开这些 使用默认的 pro 属性空白 解决方案配置。

0 Warning(s)
1 Error(s)

时间流逝00.00.00.03

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

262040 次浏览

如果要为 X86X64构建解决方案,则必须为这两个平台配置解决方案。实际上,您只有一个 任何中央处理器配置。

如何检查项目的可用配置

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

如果您想为 x86构建 Release模式,那么您的项目文件中必须包含以下内容:

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

如何在 VisualStudio 中创建和编辑配置

Configuration Manager panel
(来源: Microsoft.com)

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

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

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

如果你试图从命令行做这件事,你可能会遇到一个问题,一个机器范围的环境变量“平台”正在为你设置,工作对你不利。如果我使用 VS2012命令窗口而不是普通的窗口命令窗口,我可以重现这一点。

在命令提示符下键入:

固定平台固定平台

在 VS2012 Command 窗口中,我有一个“ X64”预设值。这似乎干扰了我的解决方案文件。

在常规 Command 窗口中,“ set”命令会产生一个“ variable not Definition”消息... 这很好。

如果上面的“ set”命令的结果没有返回任何环境变量值,那么你应该没有问题。

在 MSBuild 或 Teamcity 中使用命令行

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

或使用简短形式:

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

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

对于 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>设置。

当您使用诸如 配置变换之类的工具在您的可视化工作室解决方案中为项目定义不同的生成配置时,您可能希望您的 Teamcity 生成为您生成指定的生成配置。您可能定义了构建配置,例如,Debug、 Release、 Dev、 UAT、 Prod 等。这意味着,您将为不同的配置建立 MSBuild 配置转换设置。这些不同的配置通常用于不同环境的不同配置,例如不同的数据库连接字符串。这是非常常见的,因为您的生产环境与操场开发环境有不同的数据库。

他们说一张图片胜过千言万语,请看下面的图片,你将如何在 Teamcity 指定多个构建配置。

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

/p:OutputPath=Publish;Configuration=Dev

在这里,我指定了两个命令行构建配置/参数 OutputPath和构建值分别为 PublishDevConfiguration,但它可以是 UATProd配置。如果你想知道更多,只需用分号 ;把它们分开

Teamcity MSBuild Commandline build configuration screenshot

我在 VS2017中遇到了一个奇怪的情况,关于“ Any”和“ CPU”之间的空间 < strong > 。 这里是 而不是使用命令提示符

如果你有一个 建立项目文件,这可能是 调用其他解决方案文件。您可以尝试添加 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”用于调用项目文件,但不用于调用解决方案文件, 使用“ AnyCPU”调用解决方案文件(添加空间)

现在,我不确定它是 VS 项目文件的 bug 还是 MSBuild 的 bug。 我正在使用安装了 VS2017构建工具的 VS2017。

希望这能帮到别人。

对于平台,我指定了“ AnyCPU”,将它改为“ AnyCPU”,这样就解决了问题。

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

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

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

<Prefer32Bit>false</Prefer32Bit>