MSBuild で特定の .NET Framework を対象にする
更新 : 2007 年 11 月
Visual Studio 2008 および MSBuild 3.5 では、プロジェクトを作成またはビルドするときに、.NET Framework の複数のバージョン (Version 2.0、3.0、3.5) を対象とすることができます。この機能をマルチ ターゲットといいます。MSBuild では、ToolsVersion と呼ばれる Project 要素 (MSBuild) の新しい属性を使用してマルチ ターゲットを実現しています。
ツールセット、ターゲット フレームワーク、および ToolsVersion
MSBuild がどのように Visual Studio 2008 と連携するかを理解するためには、ツールセットとターゲット フレームワークの違いとそれぞれの新しい ToolsVersion 属性との関係について把握する必要があります。これらのすべてに基づいて MSBuild 3.5 によるプロジェクトのビルド方法が決定されます。
ツールセット
ツールセットは、MSBuild タスク、MSBuild ターゲット、および MSBuild と .NET Framework に付属のツールを集め、対応付けたものです。ツールセットには、csc.exe や vbc.exe などのコンパイラ、共通 targets ファイル (microsoft.common.targets)、および共通 tasks ファイル (microsoft.common.tasks) が含まれています。3.5 ツールセットは対象とする .NET Framework Versions 2.0 および 3.0 で使用できます。これに対し、2.0 ツールセットは対象とする .NET Framework Version 2.0 でのみ使用できます。
Visual Studio 2008 には .NET Framework 3.5 が付属しています。これには 2 つの定義済みツールセットが含まれています。1 つは .NET Framework 2.0 用、もう 1 つは .NET Framework 3.5 用です。Windows Vista に付属の .NET Framework 3.0 には定義済みツールセットはありません。.NET Framework 2.0 のツールセットでは .NET Framework 2.0 のみ対象とすることができますが、.NET Framework 3.5 のツールセットでは .NET Framework Version 2.0、3.0、または 3.5 を対象とすることができます。
カスタム ツールセットを独自に作成することもできます。詳細については、「標準ツールセット構成とカスタム ツールセット構成」を参照してください。
ターゲット フレームワーク
ターゲット フレームワークとは、ビルドするプロジェクトの実行対象とする .NET Framework の特定のバージョンを意味します。ターゲット フレームワークが必要なのは、.NET Framework 2.0 バージョンにのみ対応するコンパイラ機能や .NET Framework の特定のバージョンにのみ付属するアセンブリへの参照が使用可能になるからです。
現在、Visual Studio 2008 では .NET Framework のバージョンのうち次の 3 種類を使用できます。
.NET Framework 2.0 (Visual Studio に付属)
.NET Framework 3.0 (Windows Vista に付属)
.NET Framework 3.5 (Visual Studio 2008 に付属)
.NET Framework には 3 つのバージョンがありますが、いずれも Visual Studio 2005 に付属の共通言語ランタイム (CLR: Common Language Runtime) バージョン 2.0 を基礎としています。
ターゲット フレームワークのバージョンは、TargetFrameworkVersion プロパティによってプロジェクト ファイルに指定されます。この値は、統合開発環境 (IDE: Integrated Development Environment) でターゲット フレームワークのバージョンを変更した場合に、Visual Studio によって設定されます。詳細については、「方法 : 特定の .NET Framework を対象にする」を参照してください。TargetFrameworkVersion の有効な値は、v2.0、v3.0、および v3.5 です。TargetFrameworkVersion は、次のように MSBuild プロパティとして指定されます。
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
ToolsVersion 属性
ツールセットのバージョンは、Project 要素 (MSBuild) の ToolsVersion 属性を使用してプロジェクト ファイルに指定できます。次の例は、.NET Framework 2.0 2.0 ツールセットを使用してプロジェクトをビルドすることを示しています。
<Project ToolsVersion="2.0" ... </Project>
ソリューションまたはプロジェクトをコマンド ラインでビルドする場合、msbuild.exe に対して ToolsVersion を指定すると、すべてのプロジェクトとそのプロジェクト間の依存関係がその ToolsVersion に基づいてビルドされます。ソリューション内の各プロジェクトの Project 要素 (MSBuild) に固有の ToolsVersion が指定されていても、その値は無視されます。
.NET Framework のバージョン間の相違点
.NET Framework の 3 つのバージョンは、いずれも CLR のバージョン 2.0 を基礎としています。.NET Framework の各バージョンでは、プロジェクトで参照できるアセンブリのリストがそれぞれ異なっています。たとえば、LINQ は Visual Studio 2008 に含まれる新しいテクノロジです。LINQ 関連のアセンブリが含まれる .NET Framework のバージョンは .NET Framework 3.5 だけです。したがって、プロジェクトの対象を .NET Framework 3.5 としなければ、LINQ を使用することはできません。同様に、Windows Presentation Foundation (WPF) は Windows Vista に含まれています。プロジェクトの対象を .NET Framework 3.0 およびそれ以降の .NET Framework バージョンとしない限り、WPF アプリケーションをビルドすることはできません。
詳細については、「標準ツールセット構成とカスタム ツールセット構成」を参照してください。
プロジェクトがツールセットを検索する方法
プロジェクトを作成する場合、Visual Studio 2008 にはツールセットが必要です。MSBuild は、$(MSBuildToolsPath) プロパティを使用してターゲットとタスクを検索します。たとえば、MSBuild は次のような XML 要素を使用して Microsoft.CSharp.targets ファイルを検索します。
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Microsoft.CSharp.targets は、Visual Studio 2008 で Visual C# プロジェクトのビルドに使用される言語固有のビルド プロセスの一例です。$(MSBuildToolsPath) は、Microsoft.CSharp.targets がインストールされている、.NET Framework の適切なバージョンのパス (C:\Windows\Microsoft.Net\Framework\v2.0.50727 など) に解決されます。
MSBuild 3.5 ツールセットがこのプロジェクトをビルドするためには、$(MSBuildToolsPath) を MSBuild 3.5 のインストール先に解決し、ツールセットが Microsoft.CSharp.targets の Visual Studio 2008 バージョンをインポートできるようにする必要があります。
$(MSBuildToolsPath) の値は ToolsVersion によって異なるため、インポートされるツールセットは ToolsVersion 値によって異なります。このような柔軟性があるため、プロジェクト、MSBuild ホスト、またはユーザーがプロジェクトのビルドに使用するツールセットを指定でき、さらに MSBuild が場所情報を使用して正しいツールセットを選択する方法も指定できます。
ToolsVersion 属性の動作
Visual Studio 2008 で新しいプロジェクトを作成したり既存のプロジェクトをアップグレードしたりすると、ToolsVersion という属性が自動的にプロジェクト ファイルに追加され、既定値の "3.5" に設定されます。詳細については、「特定の .NET Framework を対象にする」を参照してください。
プロジェクト ファイルに ToolsVersion 値が定義されている場合、MSBuild はそれを使用して MSBuild ツールのパスである $(MSBuildToolsPath) (または $(MSBuildBinPath)) の値を決定します。ToolsVersion 値が定義されていない場合、MSBuild は、プロジェクトが Visual Studio 2005 であると仮定し、元のツールセットのパスを使用します。
Visual Studio 2008 で既存の Visual Studio 2005 プロジェクトを開くと、Visual Studio 2008 は 3.5 ツールセットでのビルドのみサポートしているため、そのプロジェクトが物理的に "アップグレード" され、"ToolsVersion=3.5" が追加されます。その結果、プロジェクトを Visual Studio 2008 でビルドする場合、Visual Studio ツールセット (2.0) ではなく Visual Studio 2008 ツールセット (3.5) が使用されます。
2.0 ツールセットで作成されたプロジェクトは .NET Framework 2.0 を対象とすることができ、3.5 ツールセットで作成されたプロジェクトは .NET Framework の Version 2.0、3.0、および 3.5 を対象とすることができます。Visual Studio プロジェクトを Visual Studio 2008 に移行し、3.5 ツールセットを使用するようにアップグレードしたとしても、そのプロジェクトのターゲット フレームワークは以前と同じ .NET Framework 2.0 を使用します。これによって、プロジェクトを Visual Studio 2008 に移行した場合に、新しい依存関係が発生しません。プロジェクトは Visual Studio で行った場合とまったく同じようにビルドされます。
メモ : |
---|
ToolsVersion がプロジェクトに定義されている場合、その値は Visual Studio 2008 によって変更されません。ToolsVersion の値はオーバーライドできます。詳細については、「ToolsVersion 設定のオーバーライド」を参照してください。 |
Visual Studio 2005 と MSBuild 3.5 の互換性
Visual Studio 2005 では、Visual Studio 2008 プロジェクトまたは Visual Studio 2008 にアップグレードされたプロジェクトを開いたりビルドしたりできません。ただし、MSBuild 2.0 ツールセットは、LINQ、新しい Visual C# 2008、または Visual Basic 2008 の構文機能など、Visual Studio 2008 ツールセットに固有の新機能を使用していなければ、Visual Studio 2008 プロジェクトのビルドに使用できます。