MSBuild ツールセット (ToolsVersion)
MSBuild ツールセットには、microsoft.common.tasks ファイル、microsoft.common.targets ファイル、および csc.exe や vbc.exe などのコンパイラが含まれています。 ほとんどのツールセットは、複数のバージョンの .NET Framework や複数のシステム プラットフォームを対象としてアプリケーションをコンパイルするために使用できます。 ただし、MSBuild 2.0 ツールセットは .NET Framework 2.0 のみを対象として使用できます。
Visual Studio と MSBuild プロジェクト ファイルの Project 要素の MSBuild ToolsVersion
属性は、Visual Studio 2019 以降では廃止されたと見なされており、安全に削除できます。 この記事では、以前のバージョンの MSBuild またはカスタム ツールセットでの使用について説明します。 「標準ツールセット構成とカスタム ツールセット構成」をご覧ください。
ToolsVersion 属性
プロジェクト ファイルにある Project 要素の ToolsVersion
属性でツールセットを指定します。 次の例では、MSBuild "Current" ツールセットを使用してプロジェクトをビルドすることを指定します。
<Project ToolsVersion="Current" ... </Project>
Note
一部のプロジェクトの種類は、ToolsVersion
の代わりに sdk
属性を使います。 詳細については、「.NET Core の csproj 形式に追加されたもの」を参照してください。
ToolsVersion 属性の動作
Visual Studio でプロジェクトを作成するとき、または既存のプロジェクトをアップグレードするときに、ToolsVersion
という名前の属性が自動的にプロジェクト ファイルに含まれ、その値は、Visual Studio エディションに付属している MSBuild のバージョンに対応します。 詳細については、フレームワークのターゲット設定に関するページを参照してください。
ToolsVersion
の値をプロジェクト ファイルで定義すると、MSBuild ではその値に基づいて、プロジェクトで使用できるツールセットのプロパティの値を判別します。 ツールセットのプロパティの 1 つに $(MSBuildToolsPath)
があります。このプロパティは、.NET Framework ツールのパスを指定します。 このツールセットのプロパティ (または $(MSBuildBinPath)
) は、唯一の必須のプロパティです。
Visual Studio 2013 以降、MSBuild ツールセットのバージョンは Visual Studio のバージョン番号と同じになりました。 プロジェクト ファイルで指定されたツールセットのバージョンにかかわりなく、MSBuild は Visual Studio 内とコマンド ラインでこのツールセットを既定として使用します。 この動作は、-ToolsVersion フラグを使用してオーバーライドできます。 詳細については、「ToolsVersion 設定をオーバーライドする」を参照してください。
次の例では、MSBuild は MSBuildToolsPath
予約済みプロパティを使用して Microsoft.CSharp.targets ファイルを検索します。
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
MSBuildToolsPath
の値を変更するには、カスタム ツールセットを定義します。 詳細については、「標準ツールセット構成とカスタム ツールセット構成」を参照してください。
ソリューションをコマンド ラインでビルドするとき、msbuild.exe に対して ToolsVersion
を指定すると、すべてのプロジェクトとそのプロジェクト間の依存関係がその ToolsVersion
に基づいてビルドされます。ソリューション内の各プロジェクトで固有の ToolsVersion
が指定されていても、その値は無視されます。 プロジェクトごとに ToolsVersion
値を定義する場合は、「ToolsVersion 設定のオーバーライド」を参照してください。
ToolsVersion
属性はプロジェクトの移行でも使用されます。 たとえば、Visual Studio 2010 で Visual Studio 2008 プロジェクトを開く場合、プロジェクト ファイルは ToolsVersion="4.0" を含むように更新されます。 次に、そのプロジェクトを Visual Studio 2008 で開こうとすると、アップグレードされた ToolsVersion
は認識されないため、プロジェクトは属性が 3.5 に設定された場合と同様にビルドされます。
Visual Studio 2010 と Visual Studio 2012 は、4.0 の ToolsVersion を使用します。 Visual Studio 2013 は、12.0 の ToolsVersion を使用します。 Visual Studio 2015 は ToolsVersion 14.0 を使用し、Visual Studio 2017 は ToolsVersion 15.0 を使用します。 多くの場合、複数のバージョンの Visual Studio でプロジェクトを開くことができます。変更する必要はありません。 Visual Studio は常に正しいツールセットを使用しますが、使用されているバージョンがプロジェクト ファイルのバージョンと一致しない場合は、そのことが通知されます。 ほとんどの場合、ツールセットには互換性があるため、この警告は問題にはなりません。
このトピックの後半で説明するサブツールセットを使用すると、MSBuild では、ビルドが実行されるコンテキストに基づいて、使用するツールのセットを自動的に切り替えることができます。 たとえば、プロジェクト ファイルを明示的に変更しなくても、MSBuild では、Visual Studio 2010 での実行時に Visual Studio 2010 での実行時よりも新しいツールのセットを使用できるようになります。
ツールセットの実装
ツールセットを実装するには、ツールセットを構成するさまざまなツール、ターゲット、およびタスクのパスを選択します。 MSBuild で定義されるツールセットに含まれるツールは、次のソースから取得されます。
.NET Framework フォルダー
追加のマネージド ツール
マネージド ツールには ResGen.exe と TlbImp.exe があります。
MSBuild には、ツールセットにアクセスするための 2 つの方法が用意されています。
ツールセットのプロパティの使用
ToolLocationHelper メソッドの使用
ツールセットのプロパティは、ツールのパスを指定します。 Visual Studio 2017 以降、MSBuild には決まった場所はなくなりました。 既定では、Visual Studio のインストール場所を基準とする MSBuild\15.0\Bin フォルダーに格納されます。 以前のバージョンでは、MSBuild はプロジェクト ファイル内にある ToolsVersion
属性の値を使って、対応するレジストリ キーを検索します。その後、レジストリ キーの情報を使って、ツールセットのプロパティを設定します。 たとえば、ToolsVersion
の値が 12.0
である場合、MSBuild は、レジストリ キー (HKLM\Software\Microsoft\MSBuild\ToolsVersions\12.0) に従ってツールセットのプロパティを設定します。
ツールセットのプロパティを次に示します。
MSBuildToolsPath
: MSBuild のバイナリのパスを指定します。SDK40ToolsPath
は、MSBuild 4.x (4.0 または 4.5) に必要な追加のマネージド ツールのパスを指定します。SDK35ToolsPath
: MSBuild 3.5 に必要な追加のマネージド ツールのパスを指定します。
また、ToolLocationHelper クラスのメソッドを呼び出すことによって、ツールセットをプログラムで確認することもできます。 このクラスには、次のメソッドが含まれています。
GetPathToDotNetFramework: .NET Framework フォルダーのパスを返します。
GetPathToDotNetFrameworkFile: .NET Framework フォルダーに格納されているファイルのパスを返します。
GetPathToDotNetFrameworkSdk: マネージド ツール フォルダーのパスを返します。
GetPathToDotNetFrameworkSdkFile: マネージド ツール フォルダーに通常格納されているファイルのパスを返します。
GetPathToBuildTools: ビルド ツールのパスを返します。