次の方法で共有


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
[出力] 列挙子のアドレスへのポインター。

解説

インライン化される可能性があるメソッドの完全識別子を inlineeModuleIdinlineeMethodId で形成します。 たとえば、モジュール 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 の識別子で、inlineeMethodIdSimple.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 以降で使用可能

関連項目