我正在尝试使用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),我很乐意听到它。
答案 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
答案 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>
就我而言,我正在构建一个具有BeforeTargets
和AfterTargets
任务的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
并分别使用值Configuration
和Publish
来构建Dev
,但是可能是{{1 }}或UAT
配置。如果您想要更多,只需将它们用分号隔开,Prod
答案 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>