MSBuildのプラットフォームを指定するにはどうすればよいですか?


155

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:Rebuild / p:Configuration = Release / p:Platform = "x86" Microsoft(R)Build Engineバージョン3.5.30729.1 [ Microsoft .NET Framework、バージョン2.0.50727.3082] Copyright(C)Microsoft Corporation 2007。

ビルドは1.7.2010 8:28:10に開始されました。ノード0のプロジェクト「SolutionPath \ Solution.sln」(ターゲットを再構築(s))。SolutionPath \ Solution.sln:エラーMSB4126:指定されたソリューション構成 "Release | x86"は無効です。構成とプラットフォームのプロパティ(例:MSBuild.exe Solution.sln / p:Configuration = Debug / p:Platform = "Any CPU")を使用して有効なソリューション構成を指定するか、プロパティを空白のままにしてデフォルトのソリューション構成を使用してください。ビルドプロジェクト "SolutionPath \ Solution.sln"(ターゲットの再構築)を実行しました-失敗しました。

ビルドに失敗しました。

"SolutionPath \ Solution.sln"(ターゲットの再構築)(1)->(ValidateSolutionConfigurationターゲット)-> SolutionPath \ Solution.sln:エラーMSB4126:指定されたソリューション構成 "Release | x86"は無効です。構成とプラットフォームのプロパティ(例:MSBuild.ex e Solution.sln / p:Configuration = Debug / p:Platform = "Any CPU")を使用して有効なソリューション構成を指定するか、これらのプロパティを空白のままにしてデフォルトのソリューション構成を使用してください。

0 Warning(s)
1 Error(s)

経過時間00:00:00.03

devenvでx86 / x64用にビルドしようとすると、完全に機能しますが、必要なバージョンのVisual Studioをすべてインストールせずにビルドサーバーをセットアップしようとしています。ちなみに、(。NET Framework 4をサポートする)より優れた無料のツールがある場合は、ぜひ聞いてみたいと思います。


1
どのように失敗しますか?多分いくつかのプロジェクトはx86プラットフォームをサポートしていませんか?
ブライアン

3
/ p:Platform = "Win32"は不要ですか?
Andrew Wyatt

ここにアクセスして、Visual Studioをインストールせずに、2017バージョンのMSBuildをマシンにインストールする方法を知りたい将来の読者は、この別の質問を参照してください。
Wai Ha Lee

@AndrewWyatt-afaik- Win32現代の.NETが使用している間C ++が使用x86
Elliot Woods

@ElliotWoods-説明をありがとうre:Win32 / x86-私の見解はC ++の観点からのみだったでしょう。
Andrew Wyatt

回答:


106

x86およびx64向けのソリューションを構築する場合は、ソリューションを両方のプラットフォーム用に構成する必要があります。実際には、Any CPU構成があります。

プロジェクトで使用可能な構成を確認する方法

特定のプロジェクトで使用可能な構成を確認するには、プロジェクトファイル(*.csprojたとえば)を開きPropertyGroup、右側にあるを探しますCondition

Releaseモードでビルドする場合x86は、プロジェクトファイルに次のようなものが必要です。

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

Visual Studioで構成を作成および編集する方法

構成マネージャーパネル
(ソース:microsoft.com

新しいソリューションプラットフォームボタン
(ソース:msdn.com

新しいソリューションプラットフォームパネル
(ソース:msdn.com

構成を作成および編集する方法(MSDN)


x86とx64の違いは何ですか?
Acaz Souza

2
x86は32ビットdll /実行可能ファイルをビルドし、x64は64ビットdll /実行可能ファイルをビルドします。
ベンジャミンバウマン

@Julienは共有構成のセットアップに.targetsファイルを使用できますか?
Jan 'splite' K.

4
たとえば、生成されたプロジェクトのWin32代わりに使用するプロジェクト(使用)もあります。x86CMakelibssh2CMake
Jeroen Wiert Pluimers 2016

211

MSBuildまたはTeamcityでコマンドラインを使用する

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

または短い形式を使用します:

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

ただし、とにかくプロジェクトにプラットフォームを設定する必要があります。JulienHoarauの回答を参照してください。


構成とプラットフォームの両方を識別するための/ propertyのサブセットを認識しませんでした。ありがとう
DRapp 2016年

7
MSBuildはVisual Studioの「ソリューション構成」を考慮せず、ソリューションの各プロジェクトに対してxxprojを実行する前にプロパティを設定することに注意してください。プラットフォームと構成は、Visual Studioで選択したプロジェクト構成の組み合わせに関係なく、ソリューションの各プロジェクトで同じになります。
Laurent LA RIZZA 16年

2
またはおそらくより短い:/ p:Configuration = Release; AnyOtherParameter = Abc123; Platform = x86
granadaCoder

1
それが誰かを助けるなら、コマンドラインのマルチワード引数は二重引用符で囲まれます。だから、Platform="Any CPU"またはPlatform="Mixed Platforms"それを必要とする人のために。
John Doe

14

コマンドラインからこれを行おうとすると、マシン全体の環境変数「プラットフォーム」が設定されて動作するという問題が発生する可能性があります。通常のWindowsコマンドウィンドウの代わりにVS2012コマンドウィンドウを使用すると、これを再現できます。

コマンドプロンプトで次のように入力します。

プラットホーム

VS2012コマンドウィンドウで、「X64」という値がプリセットされています。それは私のソリューションファイルにあるものに干渉するようです。

通常のコマンドウィンドウでは、「set」コマンドを実行すると、「変数が定義されていません」というメッセージが表示されます。

上記の「set」コマンドの結果が環境変数値を返さない場合は、問題ありません。


2
もちろん、これがVS2012 x64コマンドウィンドウとVS2012 x86コマンドウィンドウとの違いです。「干渉」ではなく、設計によるIOW
MSalters 2017年

0

最新のコアライブラリSDKプロジェクトファイルを使用する VS2017および2019の場合、ビルドプロセス中にプラットフォームを変更できます。次に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>

私の場合、私はFPGAを構築していますBeforeTargetsし、AfterTargetsタスクが、メインのC#アプリケーションをコンパイルしますCoreCompile。(一部はある種のコマンドラインアプリが必要な場合があり、一部は省略またはオーバーライドの方法がわからなかったためCoreCompile

x86やx64などの複数の同時バイナリ用にビルドするには、個別の手動ビルドタスクが必要になるか、上記の例のそれぞれの設定を持つ2つの個別のプロジェクトファイルが必要に<PlatformTarget>x86</PlatformTarget>なり<PlatformTarget>x64</PlatformTarget>ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.