ICorDebugProcess6::EnableVirtualModuleSplitting メソッド
仮想モジュール分割を有効または無効にします。
構文
HRESULT EnableVirtualModuleSplitting(
BOOL enableSplitting
);
パラメーター
仮想モジュール分割を有効にするには、enableSplitting
true
。無効にするには、false
。
解説
仮想モジュール分割により、ビルド プロセス中にマージされたモジュールが ICorDebug によって認識され、1 つの大規模なモジュールではなく、個別のモジュールのグループとして表されます。 これにより、以下に説明するさまざまな ICorDebug メソッドの動作が変更されます。
Note
このメソッドは .NET ネイティブでのみ使用できます。
このメソッドを呼び出し、enableSplitting
の値をいつでも変更できます。 これにより、「仮想モジュール分割とアンマネージ デバッグ API」セクションに一覧表示されているメソッドの動作が呼び出されたときに変更される以外に、ICorDebug オブジェクトのステートフル関数変更は発生しません。 仮想モジュールを使用しても、これらのメソッドの呼び出し時にパフォーマンスの低下は発生しません。 また、IMetaDataImport API を正しく実装するには、仮想化されたメタデータの大量のインメモリ キャッシュが必要となる場合があり、これらのキャッシュは、仮想モジュール分割がオフになった後も保持される可能性があります。
用語
仮想モジュール分割について説明する場合には、次の用語が使用されます。
コンテナー モジュール、またはコンテナー 集計モジュール。
サブモジュール、または仮想モジュール コンテナー内にあるモジュール。
通常のモジュール ビルド時にマージされなかったモジュール。 コンテナー モジュールでもサブモジュールでもありません。
コンテナー モジュールとサブモジュールは、どちらも ICorDebugModuleインターフェイス オブジェクトによって表されます。 ただし、インターフェイスの動作は、<x-ref to section> セクションに示すように、それぞれの場合でわずかに異なります。
モジュールとアセンブリ
アセンブリ マージ シナリオではマルチモジュール アセンブリはサポートされないため、モジュールとアセンブリの間には一対一リレーションシップがあります。 各 ICorDebugModule オブジェクトには、コンテナー モジュールを表すかサブモジュールを表すかに関係なく、対応する ICorDebugAssembly オブジェクトがあります。 ICorDebugModule::GetAssembly メソッドではモジュールからアセンブリに変換します。 他の方向にマップするために、ICorDebugAssembly::EnumerateModules メソッドでは 1 つのモジュールのみを列挙します。 この場合、アセンブリとモジュールは緊密に結合されたペアとなるため、アセンブリとモジュールはほぼ同義の用語となります。
動作の違い
コンテナー モジュールには、次の動作と特性があります。
構成要素であるすべてのサブモジュールのメタデータはマージされます。
型名は変形する可能性があります。
ICorDebugModule::GetName メソッドによって、ディスク上のモジュールへのパスが返されます。
ICorDebugModule::GetSize メソッドによって、そのイメージのサイズが返されます。
ICorDebugAssembly3.EnumerateContainedAssemblies メソッドは、サブモジュールを一覧表示します。
ICorDebugAssembly3.GetContainerAssembly メソッドは、
S_FALSE
を返します。
サブモジュールには、次の動作と特性があります。
マージされた元のアセンブリのみに対応する削減されたメタデータのセットがあります。
メタデータ名は、変形しません。
メタデータ トークンは、ビルド プロセスでマージされる前の元のアセンブリ内のトークンと一致することはほとんどありません。
ICorDebugModule::GetName メソッドによって、ファイル パスではなくアセンブリ名が返されます。
ICorDebugModule::GetSize メソッドによって、マージされていない元のイメージのサイズが返されます。
ICorDebugModule3.EnumerateContainedAssemblies メソッドは、
S_FALSE
を返します。ICorDebugAssembly3.GetContainerAssembly メソッドは、格納しているモジュールを返します。
モジュールから取得されるインターフェイス
さまざまなインターフェイスをモジュールから作成または取得できます。 たとえば、次のようなシナリオがあります。
ICorDebugModule::GetClassFromToken メソッドによって返される ICorDebugClass オブジェクト。
ICorDebugModule::GetAssembly メソッドによって返される ICorDebugAssembly オブジェクト。
これらのオブジェクトは、常に ICorDebug によってキャッシュされ、コンテナー モジュールまたはサブモジュールから作成または照会されたかどうかに関係なく、同じポインター ID を持ちます。 サブモジュールは、独自のコピーを持つ個別のキャッシュではなく、これらのキャッシュされたオブジェクトのフィルター処理されたビューを提供します。
仮想モジュール分割とアンマネージ デバッグ API
次の表に、仮想モジュール分割がアンマネージ デバッグ API の他のメソッドの動作に影響する方法を示します。
方法 | enableSplitting = true |
enableSplitting = false |
---|---|---|
ICorDebugFunction::GetModule | この関数が最初に定義されたサブモジュールを返します | この関数がマージされたコンテナー モジュールを返します |
ICorDebugClass::GetModule | このクラスが最初に定義されたサブモジュールを返します。 | このクラスがマージされたコンテナー モジュールを返します。 |
ICorDebugModuleDebugEvent::GetModule | 読み込まれたコンテナー モジュールを返します。 サブモジュールは、この設定に関係なく、読み込みイベントを提供されません。 | 読み込まれたコンテナー モジュールを返します。 |
ICorDebugAppDomain::EnumerateAssemblies | サブアセンブリと標準アセンブリのリストを返します。コンテナー アセンブリは含まれません。 注: いずれかのコンテナー アセンブリにシンボルがない場合、そのサブアセンブリは列挙されません。 いずれかの標準アセンブリにシンボルがない場合、列挙される場合と列挙されない場合があります。 | コンテナー アセンブリと標準アセンブリのリストを返します。サブアセンブリは含まれません。 注: いずれかの標準アセンブリにシンボルがない場合、列挙される場合とされない場合があります。 |
ICorDebugCode::GetCode (IL コードのみを参照する場合) | マージ前のアセンブリ イメージ内で有効な IL を返します。 具体的には、参照先の型が IL を含む仮想モジュールで定義されていない場合、インライン メタデータ トークンは正確に TypeRef または MemberRef トークンになります。 これらの TypeRef または MemberRef トークンは、対応する仮想 ICorDebugModule オブジェクトを IMetaDataImport オブジェクトで検索できます。 | マージ後のアセンブリ イメージ内の IL を返します。 |
必要条件
:「システム要件」を参照してください。
ヘッダー: CorDebug.idl、CorDebug.h
ライブラリ: CorGuids.lib
.NET Framework のバージョン: 4.6 以降で使用可能、.NET ネイティブのみ
関連項目
.NET