仮想モジュールの分割を有効または無効にします。
構文
HRESULT EnableVirtualModuleSplitting(
BOOL enableSplitting
);
パラメーター
enableSplitting
true 仮想モジュールの分割を有効にする場合。 false して無効にします。
注釈
仮想モジュールの分割により、 ICorDebug はビルド プロセス中にマージされたモジュールを認識し、それらを 1 つの大きなモジュールではなく、個別のモジュールのグループとして表示します。 これを行うと、以下で説明するさまざまな ICorDebug メソッドの動作が変更されます。
注
このメソッドは、.NET ネイティブでのみ使用できます。
このメソッドを呼び出し、 enableSplitting の値はいつでも変更できます。
ICorDebug オブジェクトではステートフルな機能変更は発生しません。これは、呼び出された時点で仮想モジュールの分割とアンマネージド デバッグ API セクションに記載されているメソッドの動作を変更する以外に発生しません。 仮想モジュールを使用すると、これらのメソッドを呼び出すときにパフォーマンスが低下します。 さらに、 IMetaDataImport API を正しく実装するには、仮想化メタデータのメモリ内キャッシュが大幅に必要になる場合があり、仮想モジュールの分割がオフになった後でもこれらのキャッシュが保持される場合があります。
用語
仮想モジュールの分割を記述する場合は、次の用語が使用されます。
コンテナー モジュール、またはコンテナー 集計モジュール。
サブモジュール、または仮想モジュール コンテナー内にあるモジュール。
通常のモジュール ビルド時にマージされなかったモジュール。 これらはコンテナー モジュールでもサブモジュールでもありません。
コンテナー モジュールとサブモジュールの両方が、 ICorDebugModule インターフェイス オブジェクトによって表されます。 ただし、インターフェイスの動作は、それぞれのケースで若干異なります。
モジュールとアセンブリ
複数モジュールアセンブリはアセンブリマージシナリオではサポートされていないため、モジュールとアセンブリの間には一対一の関係があります。 各 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 を返します。 |
Requirements
プラットフォーム:サポートされている .NET オペレーティング システムを参照してください。
ヘッダ: CorDebug.idl、CorDebug.h
図書館: CorGuids.lib
.NET のバージョン: .NET Framework 4.6 以降で使用可能
こちらも参照ください
.NET