次の方法で共有


ICorProfilerInfo4::RequestReJIT メソッド

指定された関数のすべてのインスタンスの JIT 再コンパイルを要求します。

構文

HRESULT RequestReJIT (  
   [in] ULONG    cFunctions,  
   [in, size_is(cFunctions)]  ModuleID    moduleIds[],  
   [in, size_is(cFunctions)]  mdMethodDef methodIds[]);  

パラメーター

cFunctions
[in] 再コンパイルする関数の数。

moduleIds
[in] 再コンパイルする関数を識別する (modulemethodDef) ペアの moduleId の部分を指定します。

methodIds
[in] 再コンパイルする関数を識別する (modulemethodDef) ペアの methodId の部分を指定します。

戻り値

このメソッドは、次の特定の HRESULT と、メソッドの失敗を示す HRESULT エラーも返します。

HRESULT 説明
S_OK すべてのメソッドを JIT 再コンパイル対象としてマークする操作が試行されました。 JIT 再コンパイル対象として正常にマークされたメソッドを判別するため、プロファイラーは ICorProfilerCallback4::ReJITError メソッドを実装する必要があります。
CORPROF_E_CALLBACK4_REQUIRED この呼び出しをサポートするため、プロファイラーは ICorProfilerCallback4 インターフェイスを実装する必要があります。
CORPROF_E_REJIT_NOT_ENABLED JIT 再コンパイルが有効になっていませんでした。 ICorProfilerInfo::SetEventMask メソッドを使用して COR_PRF_ENABLE_REJIT フラグを設定し、初期化中に JIT 再コンパイルを有効にする必要があります。
E_INVALIDARG cFunctions が 0 であるか、moduleIds または methodIdsNULL です。
E_OUTOFMEMORY メモリが不足しているために、CLR は要求を完了できませんでした。

解説

指定された一連の関数をこのラインタイムで再コンパイルするため、RequestReJIT を呼び出します。 その後コード プロファイラーが ICorProfilerFunctionControl インターフェイスを使用して、関数の再コンパイル時に生成されるコードを調整できます。 これは、今後の関数呼び出しにのみ影響し、現在実行中の関数には影響しません。 指定されている関数のいずれかが以前に JIT 再コンパイルされている場合、再コンパイルを要求する操作は、関数を元に戻して再コンパイルする操作と同等です。 可逆性を維持するため、JIT コンパイラは関数の元のバージョンのコンパイル時に、インライン処理の決定のために呼び出し先の元のバージョンだけを考慮します。 JIT コンパイラは関数の再コンパイル時に、インライン処理のためにその呼び出し先の現行バージョン (再コンパイル バージョンまたは元のバージョン) を考慮します。

プロファイラーは一般に、プロファイラーが 1 つ以上のメソッドをインストルメント化することを求めるユーザー入力に対応して RequestReJIT を呼び出します。 RequestReJIT は一般に、一部の処理を実行するためにランタイムを一時停止します。また、ガベージ コレクションをトリガーする可能性があります。 このためプロファイラーは、現在プロファイラー コールバックを実行している CLR 作成スレッドではなく、以前に作成したスレッドから RequestReJIT を呼び出す必要があります。

必要条件

:システム要件」を参照してください。

ヘッダー : CorProf.idl、CorProf.h

ライブラリ: CorGuids.lib

.NET Framework のバージョン: 4.5 以降で使用可能

関連項目