如何为MSBuild指定平台?

时间:2010-07-01 06:24:00

标签: msbuild

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

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

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

这是while输出MSBuild打印:

  

C:\ Windows \ Microsoft.NET \框架\ v3.5版本>的MSBuild   SolutionPath \ Solution.sln / t:重建   / P:配置=推出   / p:Platform =“x86”Microsoft(R)Build   引擎版本3.5.30729.1 [微软   .NET Framework,版本   2.0.50727.3082]版权所有(C)Microsoft Corporation 2007.所有权利   保留

     

Build build 1.7.2010 8:28:10。   项目“SolutionPath \ Solution.sln”上   节点0(重建目标t(s))。   SolutionPath \ Solution.sln:错误   MSB4126:指定的解决方案   配置“Release | x86”是   无效。请注明有效   解决方案配置使用   配置和平台属性   (例如MSBuild.exe Solution.sln   / P:配置=调试   / p:Platform =“任何CPU”)或保留这些   prope rties为空以使用默认值   解决方案配置完成建设   项目“SolutionPath \ Solution.sln”   (Rebuild t arget(s)) - FAILED。

     

构建失败。

     

“SolutionPath \ Solution.sln”(重建   目标)(1) - >   (ValidateSolutionConfiguration目标)    - > SolutionPath \ Solution.sln:错误MSB4126:指定的解决方案   配置“Release | x86”是   无效。请注明有效   解决方案配置使用   配置和平台属性   (例如MSBuild.ex e Solution.sln   / P:配置=调试   / p:Platform =“任何CPU”)或保留这些   pro使空白使用默认值   解决方案配置。

0 Warning(s)
1 Error(s)
     

时间流逝00:00:00.03

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

8 个答案:

答案 0 :(得分:161)

在MSBuild或Teamcity中使用命令行

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

或使用更短的形式:

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

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

答案 1 :(得分:97)

如果您要为 x86 x64 构建解决方案,则必须为两个平台配置您的解决方案。实际上你只有一个任何CPU 配置。

如何检查项目的可用配置

要检查给定项目的可用配置,请打开项目文件(例如*.csproj),然后查找右PropertyGroup的{​​{1}}。

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

x86

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

Configuration Manager panel http://i.msdn.microsoft.com/Cc563937.11a492fe-e240-4cdd-9b53-b6aae7224b09(en-us,office.12).jpg

New solution platform button http://blogs.msdn.com/blogfiles/habibh/WindowsLiveWriter/9d46e66e51d6_13278/image_15.png

New solution platform panel http://blogs.msdn.com/blogfiles/habibh/WindowsLiveWriter/9d46e66e51d6_13278/image_18.png

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

答案 2 :(得分:13)

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

在命令提示符下键入:

  

设置平台

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

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

如果上面'set'命令的结果没有返回环境变量值,那么你应该好好去。

答案 3 :(得分:0)

对于VS2017和2019 ...使用modern core library SDK project files,可以在构建过程中更改平台。这是在内置anycpu任务运行之前更改为CoreCompile平台的示例:

<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>,以上。

答案 4 :(得分:0)

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

他们说一张图片值一千字,请看下面的图片,在Teamcity中如何指定多个构建配置。

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

/p:OutputPath=Publish;Configuration=Dev

在这里,我已经指定了两个命令行构建配置/参数OutputPath并分别使用值ConfigurationPublish来构建Dev,但是可能是{{1 }}或UAT配置。如果您想要更多,只需将它们用分号隔开,Prod

Teamcity MSBuild Commandline build configuration screenshot

答案 5 :(得分:0)

我在VS2017中遇到了一个奇怪的情况,关于“任意”和“ 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”适用于调用项目文件,但不适用于调用解决方案文件, 使用“任何CPU”(添加空格)调用解决方案文件。

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

答案 6 :(得分:0)

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

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

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

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

答案 7 :(得分:0)

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

<Prefer32Bit>false</Prefer32Bit>