プロジェクト サブタイプでは、後で使用するために、サブタイプ固有のデータをプロジェクト ファイルに保持することが必要になる場合があります。 プロジェクト サブタイプでは、プロジェクト ファイルの永続化を使用して、次の要件を満たします。
プロジェクトのビルドの一部として使用されるデータを保持します。 (Microsoft ビルド エンジンの詳細については、 MSBuild を参照してください)。ビルド関連の情報は、次のいずれかになります。
構成に依存しないデータ。 つまり、MSBuild 要素に格納されているデータが空白または不足している状態です。
構成に依存するデータ。 つまり、特定のプロジェクト構成に合わせて条件付けされる MSBuild 要素に格納されているデータです。 例えば次が挙げられます。
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
ビルドに関連しないデータを保持します。 このデータは、XML スキーマに対して検証されない自由形式の XML で表すことができます。
構成に依存しないデータ。
構成に依存するデータ。
ビルド関連情報の永続化
プロジェクトの構築に役立つデータの永続化は、MSBuild を通じて処理されます。 MSBuild システムは、ビルド関連の情報のマスター テーブルを保持します。 プロジェクト サブタイプは、このデータにアクセスしてプロパティ値を取得および設定する役割を担います。 プロジェクト サブタイプでは、永続化するプロパティを追加し、プロパティを削除して永続化されないようにすることで、ビルド関連のデータ テーブルを拡張することもできます。
MSBuild データを変更するために、プロジェクト サブタイプは、基本プロジェクト システムから IVsBuildPropertyStorage を介して MSBuild プロパティ オブジェクトを取得する役割を担います。
IVsBuildPropertyStorage は、コア プロジェクト システムに実装されたインターフェイスであり、 QueryInterfaceを実行して集計プロジェクト サブタイプ クエリを実行します。
次の手順では、 IVsBuildPropertyStorageを使用してプロパティを削除する手順について説明します。
MSBuild プロジェクト ファイルからプロパティを削除するには
プロジェクト サブタイプの
QueryInterfaceに対してIVsBuildPropertyStorageを呼び出します。pszPropNameを削除したいプロパティに設定してRemovePropertyを呼び出します。
ビルド以外の関連情報の保持
ビルドする必要のないプロジェクト ファイル内のデータの永続化は、 IPersistXMLFragmentによって処理されます。
メイン IPersistXMLFragment オブジェクト、project subtype aggregator オブジェクト、またはその両方にproject subtype project configurationを実装できます。
次の点は、ビルド以外の関連情報の永続化に関する主な概念の概要です。
基本プロジェクトは、メイン プロジェクト サブタイプ (つまり、最も外側のプロジェクト サブタイプ) アグリゲーター オブジェクトを呼び出して、構成に依存しないデータを読み込んで保存し、プロジェクト サブタイプ プロジェクト構成オブジェクトを呼び出して、構成依存データを読み込むか保存します。
基本プロジェクトは、プロジェクト サブタイプ集計の各レベルに対して IPersistXMLFragment のメソッドを複数回呼び出し、各レベルの GUID を渡します。
ベース プロジェクトは、特定のプロジェクト サブタイプ専用の XML フラグメントを受け取り、集計レベル間で状態を保持する方法としてこのメカニズムを使用します。
基本プロジェクトは、最も外側のプロジェクト サブタイプの IPersistXMLFragment実装を呼び出して GUID を渡します。 GUID が最も外側のプロジェクト サブタイプに属している場合は、呼び出し自体を処理します。それ以外の場合は、GUID が対応するプロジェクト サブタイプが見つかるまで、内部プロジェクト サブタイプなどの呼び出しを委任します。
プロジェクト サブタイプは、内部プロジェクト サブタイプへの呼び出しを委任する前または後に XML フラグメントを変更することもできます。 次の例は、プロジェクト サブタイプに固有のプロパティを含むファイルの名前がそのプロジェクト サブタイプに渡されるプロジェクト ファイルからの抜粋を示しています。
<ProjectExtensions> <VisualStudio> <FlavorProperties GUID="{<FlavorGUID>}"> <FlavorProject TestFileFolder="TestFile" /> </FlavorProperties> </VisualStudio> </ProjectExtensions>