ICorProfilerInfo2::GetClassLayout メソッド
指定したクラスで定義されるフィールドのメモリ内レイアウトに関する情報を取得します。 つまり、このメソッドはクラスのフィールドのオフセットを取得します。
HRESULT GetClassLayout(
[in] ClassID classID,
[in, out] COR_FIELD_OFFSET rFieldOffset[],
[in] ULONG cFieldOffset,
[out] ULONG *pcFieldOffset,
[out] ULONG *pulClassSize);
パラメーター
classID
[入力] レイアウトを取得するクラスの ID。rFieldOffset
[入力、出力] COR_FIELD_OFFSET 構造体の配列。それぞれにクラスのフィールドのトークンとオフセットが含まれています。cFieldOffset
[入力] rFieldOffset 配列のサイズ。pcFieldOffset
[出力] 使用できる要素の総数へのポインター。 cFieldOffset が 0 である場合、この値は必要な要素数を示します。pulClassSize
[出力] クラスのバイト単位によるサイズを含む位置へのポインター。
解説
GetClassLayout メソッドは、クラス自体によって定義されているフィールドのみを返します。 クラスの親クラスもフィールドを定義している場合、プロファイラーは親クラスで GetClassLayout を呼び出してそのフィールドを取得する必要があります。
GetClassLayout を文字列クラスと一緒に使用する場合、このメソッドは E_INVALIDARG というエラー コードで失敗します。 ICorProfilerInfo2::GetStringLayout を使用して、文字列のレイアウトに関する情報を取得します。 GetClassLayout も配列クラスと一緒に呼び出されると失敗します。
GetClassLayout から制御が戻ったら、rFieldOffset バッファーのサイズが十分で、すべての使用可能な COR_FIELD_OFFSET 構造体を格納できたかどうかを確認する必要があります。 これを行うには、pcFieldOffset が指している値と、rFieldOffset のサイズを COR_FIELD_OFFSET 構造体のサイズで割った値を比較します。 rFieldOffset が十分に大きくない場合は、rFieldOffset バッファーの割り当てを増やし、cFieldOffset を新しい大きいサイズに更新して、GetClassLayout を再度呼び出します。
別の方法として、最初に GetClassLayout を長さゼロの rFieldOffset バッファーで呼び出して、適切なバッファーのサイズを取得します。 その後、バッファーのサイズを pcFieldOffset で返された値に設定し、GetClassLayout を再度呼び出します。
この 2 つの方法の詳細については、「API メソッド規則のプロファイリング」を参照してください。
必要条件
プラットフォーム: 「.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