ICorProfilerCallback2::RootReferences2 メソッド
ガベージ コレクションが発生した後に、ルート参照についてプロファイラーに通知します。 このメソッドは、ICorProfilerCallback::RootReferences メソッドの拡張です。
HRESULT RootReferences2(
[in] ULONG cRootRefs,
[in, size_is(cRootRefs)] ObjectID rootRefIds[],
[in, size_is(cRootRefs)] COR_PRF_GC_ROOT_KIND rootKinds[],
[in, size_is(cRootRefs)] COR_PRF_GC_ROOT_FLAGS rootFlags[],
[in, size_is(cRootRefs)] UINT_PTR rootIds[]);
パラメーター
cRootRefs
[入力] rootRefIds、rootKinds、rootFlags、および rootIds の各配列内の要素数。rootRefIds
[入力] オブジェクト ID の配列。各オブジェクト ID は、静的オブジェクトまたはスタック上のオブジェクトを参照します。 rootKinds 配列内の要素は、rootRefIds 配列内の対応する要素を分類するための情報を提供します。rootKinds
[入力] ガベージ コレクション ルートの種類を示す COR_PRF_GC_ROOT_KIND 値の配列。rootFlags
[入力] ガベージ コレクション ルートのプロパティを記述する COR_PRF_GC_ROOT_FLAGS 値の配列。rootIds
[入力] rootKinds パラメーターの値に応じて、ガベージ コレクション ルートに関する追加情報を含む整数を指す UINT_PTR 値の配列。ルートの種類がスタックの場合、ルート ID は変数を含む関数に対するものです。 ルート ID が 0 の場合、関数は CLR にとって内部のアンマネージ関数です。 ルートの種類がハンドルの場合、ルート ID はガベージ コレクション ハンドルに対するものです。 その他のルートの場合、ID は非透過値のため、無視する必要があります。
解説
rootRefIds、rootKinds、rootFlags、rootIds の各配列は、並列配列です。 つまり、rootRefIds[i]、rootKinds[i]、rootFlags[i]、rootIds[i] はすべて、同じルートに関係します。
プロファイラーへの通知には RootReferences と RootReferences2 の両方が呼び出されます。 RootReferences2 に渡される情報は RootReferences に渡される情報のスーパーセットであるため、通常、プロファイラーは、両方ではなく、いずれか一方のメソッドのみを実装します。
rootRefIds 内のエントリをゼロに設定できます。これは、対応するルート参照が null であり、マネージ ヒープ上のオブジェクトを参照しないことを意味します。
RootReferences2 によって返されるオブジェクト ID は、コールバック自体の間は無効です。これは、ガベージ コレクションが古いアドレスから新しいアドレスにオブジェクトを移動している可能性があるためです。 したがって、プロファイラーは RootReferences2 の呼び出し中にオブジェクトを検査する必要はありません。 ICorProfilerCallback2::GarbageCollectionFinished が呼び出されたときには、すべてのオブジェクトは新しい場所に移動しているため、安全に検査を実行できます。
必要条件
プラットフォーム: 「.NET Framework システム要件」を参照
ヘッダー: CorProf.idl、CorProf.h
ライブラリ: CorGuids.lib
.NET Framework のバージョン: 4、3.5 SP1、3.5、3.0 SP1、3.0、2.0 SP1、2.0