ICorProfilerInfo6::EnumNgenModuleMethodsInliningThisMethod メソッド
特定の NGen モジュールで定義されており、特定のメソッドをインライン化するすべてのメソッドに列挙子を返します。
構文
HRESULT EnumNgenModuleMethodsInliningThisMethod(
[in] ModuleID inlinersModuleId,
[in] ModuleID inlineeModuleId,
[in] mdMethodDef inlineeMethodId,
[out] BOOL *incompleteData,
[out] ICorProfilerMethodEnum** ppEnum
);
パラメーター
inlinersModuleId
[入力] NGen モジュールの識別子。
inlineeModuleId
[入力] inlineeMethodId
を定義するモジュールの識別子。 詳細については、次の「解説」を参照してください。
inlineeMethodId
[入力] インライン化されたモジュールの識別子。 詳細については、次の「解説」を参照してください。
incompleteData
[出力] 特定のメソッドをインライン化するすべてのメソッドが ppEnum
に含まれるかどうかを示すフラグ。 詳細については、次の「解説」を参照してください。
ppEnum
[出力] 列挙子のアドレスへのポインター。
解説
インライン化される可能性があるメソッドの完全識別子を inlineeModuleId
と inlineeMethodId
で形成します。 たとえば、モジュール A
によりメソッド Simple.Add
が定義されます。
Simple.Add(int a, int b)
{ return a + b; }
そして、モジュール B により Fancy.AddTwice
が定義されます。
Fancy.AddTwice(int a, int b)
{ return Simple.Add(a,b) + Simple.Add(a,b); }
また、SimpleAdd
の呼び出しが Fancy.AddTwice
でインライン化されると想定しましょう。 Simple.Add
をインライン化するモジュール B に定義されているすべてのメソッドを見つけるため、あるプロファイラーでこの列挙子が使用されることがありえます。結果的に、たとえば、AddTwice
が列挙されます。 inlineeModuleId
はモジュール A
の識別子で、inlineeMethodId
は Simple.Add(int a, int b)
の識別子です。
関数が返された後、incompleteData
が true であれば、列挙子には、特定のメソッドをインライン化するメソッドがすべて含まれることはありません。 インライナー モジュールの 1 つまたは複数の直接的または間接的な依存関係がまだ読み込まれていないとき、これは起こりえます。 プロファイラーで正確なデータが必要とされる場合、後でもっと多くのモジュールが読み込まれたとき、再試行してください。モジュールを読み込むたびに試行することをお勧めします。
EnumNgenModuleMethodsInliningThisMethod
メソッドは、ReJIT のインライン化に関する制限を回避する目的で使用できます。 ReJIT を使用すると、プロファイラーでは、メソッドの実装を変更し、その場でそれに新しいコードを作成できます。 たとえば、Simple.Add
を次のように変更できます。
Simple.Add(int a, int b)
{ return 42; }
ただし、Fancy.AddTwice
によって Simple.Add
が既にインライン化されているため、引き続き、前と同じ動作が与えられます。 この制限を回避するには、呼び出し元は、Simple.Add
をインライン化し、それらのメソッドのそれぞれで ICorProfilerInfo5::RequestRejit
を使用するすべてのモジュールに含まれるすべてのメソッドを検索する必要があります。 メソッドが再コンパイルされると、古い動作ではなく、Simple.Add
の新しい動作をするようになります。
必要条件
:「システム要件」を参照してください。
ヘッダー : CorProf.idl、CorProf.h
ライブラリ: CorGuids.lib
.NET Framework のバージョン: 4.6 以降で使用可能
関連項目
.NET