Visual Studio の統合 (MSBuild)
更新 : 2007 年 11 月
Visual Studio 2005 は、マネージ プロジェクトの読み込みとビルドを行う MSBuild をホストしています。MSBuild はプロジェクトに対応しているため、そのプロジェクトが他のツールで作成されていたり、ビルド処理がカスタマイズされていたりしても、MSBuild 形式のほとんどすべてのプロジェクトを Visual Studio で問題なく使用できます。
このトピックでは、Visual Studio に読み込んでビルドするプロジェクトおよび .targets ファイルをカスタマイズする際に考慮が必要な、Visual Studio による MSBuild のホストに固有な事項について説明します。これらの事項は、IntelliSense やデバッグなどの Visual Studio の機能をカスタム プロジェクトに対して有効にするうえで役立ちます。
プロジェクト ファイルの拡張子
MSBuild.exe は、.*proj のパターンに一致するすべてのプロジェクト ファイル拡張子を認識します。ただし、Visual Studio は、プロジェクトを読み込む言語固有のプロジェクト システムを決定する、これらのプロジェクト ファイル拡張子のサブセットしか認識しません。Visual Studio には、言語に依存しない MSBuild ベースのプロジェクト システムが備わっていないためです。
たとえば、Visual C# のプロジェクト システムは .csproj ファイルを読み込みますが、Visual Studio では .xxproj ファイルを読み込むことができません。任意の言語のソース ファイル用のプロジェクト ファイルには、Visual Studio に読み込む Visual Basic、Visual C#、または Visual J# プロジェクト ファイルと同じ拡張子を使用する必要があります。
既知のターゲット名
Visual Studio の [ビルド] をクリックすると、プロジェクトの既定のターゲットが実行されます。このターゲットも Build という名前になっていることがよくあります。[リビルド] または [消去] を選択すると、プロジェクト内の同じ名前のターゲットが実行されます。[発行] をクリックすると、プロジェクト内の PublishOnly という名前のターゲットが実行されます。
構成とプラットフォーム
MSBuild プロジェクトの構成は、Condition 属性を含む PropertyGroup 要素内にグループ化されているプロパティによって表されます。Visual Studio は、表示するプロジェクト構成およびプラットフォームのリストを作成するために、これらの条件を確認します。このリストを正常に抽出するには、条件の形式が次のようになっている必要があります。
Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "
Condition=" '$(Configuration)' == 'Release' "
Condition=" '$(Something)|$(Configuration)|$(SomethingElse)' == 'xxx|Debug|yyy' "
Visual Studio はこの目的のために、PropertyGroup、ItemGroup、Import、プロパティ、および項目要素の条件を確認します。
その他のビルド アクション
Visual Studio では、[ファイルのプロパティ] ウィンドウの [ビルド アクション] プロパティを使用して、プロジェクト内のファイルの項目コレクションの名前を変更できます。Compile、EmbeddedResource、Content、および None 項目コレクション名は、プロジェクトの既存の他の項目コレクション名と共に、常にこのメニューに表示されます。このメニューにすべてのカスタム項目コレクション名が常に表示されるようにするには、AvailableItemName という名前の項目コレクションに名前を追加します。たとえば、プロジェクト ファイルに次の内容を追加すると、このファイルをインポートするすべてのプロジェクトの当該メニューに、カスタム型 JScript が追加されます。
<ItemGroup>
<AvailableItemName Include="JScript"/>
</ItemGroup>
メモ : |
---|
一部の項目コレクション名は Visual Studio に固有ですが、このドロップダウン リストには表示されません。 |
インプロセス コンパイラ
Visual Studio では、可能な限り Visual Basic コンパイラまたは Visual C# コンパイラのインプロセス バージョンを使用して、パフォーマンスの向上を計ります。これが正しく機能するためには、次の条件が満たされている必要があります。
プロジェクトのターゲットには、Csc (Visual C# プロジェクトの場合) または Vbc (Visual Basic プロジェクトの場合) という名前のタスクが存在すること。
このタスクの UseHostCompilerIfAvailable パラメータが true に設定されていること。
サポートされるパラメータ値のみが指定されていること。タスクに対して指定するパラメータはすべて、インプロセス コンパイラによってサポートされますが、一部のパラメータ値はサポートされていません。Visual C# インプロセス コンパイラは、次に示す Csc タスクのパラメータ値をサポートしていません。
NoConfig では、false および空の値はサポートされていません。
ResponseFiles では、空でない値はサポートされていません。
AdditionalLibPaths では、空でない値はサポートされていません。
AddModules では、空でない値はサポートされていません。
CodePage では、ゼロ以外の値はサポートされていません。
GenerateFullPaths では、true はサポートされていません。
LinkResources では、空でない値はサポートされていません。
これらの条件が満たされていない場合、プロジェクトはインプロセス コンパイラの代わりにコマンド ライン コンパイラを使用してコンパイルを行います。
デザイン時における IntelliSense のサポート
ビルドによって出力アセンブリが生成される前に、Visual Studio で IntelliSense がサポートされるようにするには、次の条件が満たされている必要があります。
Compile という名前のターゲットが存在すること。
Compile ターゲットまたはその依存関係のいずれかによって、Csc や Vbc などの、プロジェクトのコンパイラ タスクが呼び出されること。
Compile ターゲットまたはその依存関係のいずれかによって、IntelliSense に必要なすべてのパラメータ (特にすべての参照) をコンパイラが受け取ること。
「インプロセス コンパイラ」のセクションに示した条件が満たされていること。
ソリューションの構築
Visual Studio 内では、ソリューション ファイルおよびプロジェクトのビルドの順序は Visual Studio 自体によって制御されます。コマンド ラインで msbuild.exe を使用してソリューションをビルドする場合、MSBuild はソリューション ファイルを解析し、プロジェクトのビルドの順序を指定します。どちらの場合も、プロジェクトは依存関係の順序で個別にビルドされ、プロジェクト間参照は走査されません。逆に、msbuild.exe を使用して個々のプロジェクトをビルドする場合は、プロジェクト間参照が走査されます。
Visual Studio の内部でビルドする場合は、$(BuildingInsideVisualStudio) プロパティを true に設定します。これをプロジェクトまたは .targets ファイル内で使用することにより、ビルドの動作を変更できます。
プロパティと項目の表示
Visual Studio は、特定のプロパティ名とプロパティ値を認識します。たとえば、プロジェクト内で次のプロパティを使用すると、プロジェクト デザイナの [アプリケーションの種類] ボックスに Windows アプリケーションが表示されます。
<OutputType>WinExe</OutputType>
プロパティ値は、プロジェクト デザイナで編集してプロジェクト ファイルに保存できます。このようなプロパティを編集する際に無効な値を指定した場合、プロジェクトを読み込むと Visual Studio によって警告メッセージが表示され、無効な値が既定値に置き換えられます。
Visual Studio は一部のプロパティの既定値を認識しています。これらのプロパティは、既定値以外の値を持つ場合だけプロジェクト ファイルに保存されます。
恣意的な名前のプロパティは Visual Studio では表示されません。Visual Studio で恣意的な名前のプロパティを変更するには、XML エディタでプロジェクト ファイルを開き、手動で編集する必要があります。詳細については、「方法 : プロジェクト ファイルを編集する」を参照してください。
任意の項目コレクション名を使用してプロジェクト内で定義された項目は、既定では、ソリューション エクスプローラのプロジェクト ノードの下に表示されます。項目が表示されないようにするには、Visible メタデータを false に設定します。たとえば、次の項目はビルド処理に参加しますが、ソリューション エクスプローラには表示されません。
<ItemGroup>
<IntermediateFile Include="cache.temp">
<Visible>false</Visible>
</IntermediateFile>
</ItemGroup>
プロジェクトにインポートしたファイルで宣言されている項目は、既定では表示されません。ビルド処理中に作成された項目がソリューション エクスプローラに表示されることは決してありません。
項目とプロパティの条件
ビルド時には、すべての条件が完全に遵守されます。
表示するプロパティ値を決定する際、Visual Studio が、構成に依存すると見なすプロパティは、構成に依存しないと見なすプロパティとは評価方法が異なります。構成に依存すると見なされるプロパティの場合、Visual Studio は Configuration プロパティと Platform プロパティを適切に設定し、MSBuild に対しプロジェクトを再評価するように指示します。構成に依存しないと見なされるプロパティの場合、条件の評価方法は不確定です。
項目の条件式は、その項目をソリューション エクスプローラに表示するかどうかを決めるという目的では常に無視されます。
デバッグ
出力アセンブリを見つけて起動し、デバッガをアタッチするには、OutputPath、AssemblyName、および OutputType の各プロパティが Visual Studio で正しく定義されている必要があります。ビルド処理においてコンパイラが .pdb ファイルを生成しない場合、デバッガはアタッチされません。
デザイン時におけるターゲットの実行
Visual Studio は、プロジェクトを読み込む際に、特定の名前を持つターゲットを実行しようとします。このようなターゲットとしては、Compile、ResolveAssemblyReferences、ResolveCOMReferences、GetFrameworkPaths、CopyRunEnvironmentFiles などがあります。Visual Studio はこれらのターゲットを実行することにより、IntelliSense が使用できるようにコンパイラを初期化し、デバッガを初期化し、さらにソリューション エクスプローラに表示される参照を解決します。これらのターゲットが存在しない場合、プロジェクトは正常に読み込まれてビルドされますが、Visual Studio のデザイン時環境は完全には機能しません。
Visual Studio でのプロジェクト ファイルの編集
MSBuild プロジェクトを直接編集する必要がある場合は、Visual Studio の XML エディタでプロジェクト ファイルを開きます。詳細については、「方法 : プロジェクト ファイルを編集する」を参照してください。
IntelliSense と検証
XML エディタを使用してプロジェクト ファイルを編集する際、MSBuild のスキーマ ファイルによって IntelliSense と検証が実行されます。スキーマ ファイルは Visual Studio によってスキーマ キャッシュにインストールされます。スキーマ キャッシュは [Visual Studio のインストール場所]\Xml\Schemas フォルダにあります。
MSBuild の中心となる型は Microsoft.Build.Core.xsd で定義され、Visual Studio が使用する共通の型は Microsoft.Build.CommonTypes.xsd で定義されます。カスタム項目コレクションの名前、プロパティ、およびタスク用に IntelliSense と検証を使用できるようスキーマをカスタマイズするには、Microsoft.Build.xsd を編集するか、CommonTypes スキーマまたは Core スキーマを含む独自のスキーマを作成します。独自のスキーマを作成する場合は、[プロパティ] ウィンドウを使用してこのスキーマを見つけるように XML エディタに指示する必要があります。
読み込んだプロジェクト ファイルの編集
Visual Studio は、プロジェクト ファイルの内容やプロジェクト ファイルによってインポートしたファイルの内容をキャッシュします。読み込んだプロジェクト ファイルを編集すると、プロジェクトを再読み込みして変更を有効にするように求めるメッセージが Visual Studio によって自動的に表示されます。ただし、読み込んだプロジェクトによってインポートされたファイルを編集した場合は、再読み込みを求めるメッセージが表示されないため、手動でプロジェクトのアンロードと再読み込みを行い、変更内容を有効にする必要があります。
出力グループ
Microsoft.Common.targets で定義したいくつかのターゲットの名前は、最後の部分が OutputGroups または OutputGroupDependencies となります。Visual Studio はこれらのターゲットを呼び出して、特定のプロジェクト出力のリストを取得します。たとえば、SatelliteDllsProjectOutputGroup ターゲットを呼び出すと、ビルドが作成したすべてのサテライト アセンブリのリストが作成されます。これらの出力グループは、発行、配置、およびプロジェクト間参照などの機能によって使用されます。これらのターゲットを定義していなくても、プロジェクトは Visual Studio に読み込まれてビルドされますが、一部の機能が正常に動作しない場合があります。
参照の解決
参照の解決とは、プロジェクト ファイルに格納されている参照項目を使用して、実際のアセンブリを検索する処理をいいます。Visual Studio では、[プロパティ] ウィンドウに参照ごとに詳細なプロパティを表示するために、参照の解決を実行する必要があります。次の一覧では、3 種類の参照とその解決方法について説明します。
アセンブリ参照
プロジェクト システムは、ResolveAssemblyReferences という既知の名前を持つターゲットを呼び出します。このターゲットは、ReferencePath という項目コレクション名を持つ項目を生成します。これらの項目のそれぞれが、参照への完全パスを含む項目規定 (項目の Include 属性の値) を持ちます。これらの項目には、以下の新しいメタデータに加え、入力項目のすべてのメタデータも渡されます。
アセンブリを出力フォルダにコピーするかどうかを示す CopyLocal。true または false に設定されます。
参照の元の項目規定を格納している OriginalItemSpec。
.NET Framework ディレクトリから解決された場合に "{TargetFrameworkDirectory}" に設定される ResolvedFrom。
COM 参照
プロジェクト システムは、ResolveCOMReferences という既知の名前を持つターゲットを呼び出します。このターゲットは、ComReferenceWrappers という項目コレクション名を持つ項目を生成します。これらの項目のそれぞれが、COM 参照のための相互運用機能アセンブリへの完全パスを含む項目規定を持ちます。これらの項目には、アセンブリを出力フォルダにコピーするかどうかを示す CopyLocal という名前の新しいメタデータ (true または false に設定) に加え、入力項目のすべてのメタデータも渡されます。
ネイティブ参照
プロジェクト システムは、ResolveNativeReferences という既知の名前を持つターゲットを呼び出します。このターゲットは、NativeReferenceFile という項目コレクション名を持つ項目を生成します。これらの項目には、参照の元の項目規定を格納する OriginalItemSpec という名前の新しいメタデータに加え、入力項目のすべてのメタデータも渡されます。