MSBuild ツールセット (ToolsVersion)

MSBuild ツールセットには、microsoft.common.tasks ファイル、microsoft.common.targets ファイル、および csc.exevbc.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.exeTlbImp.exe があります。

MSBuild には、ツールセットにアクセスするための 2 つの方法が用意されています。

ツールセットのプロパティは、ツールのパスを指定します。 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 クラスのメソッドを呼び出すことによって、ツールセットをプログラムで確認することもできます。 このクラスには、次のメソッドが含まれています。