次の方法で共有


ICorProfilerInfo3::RequestProfilerDetach メソッド

プロファイラーをデタッチするようにランタイムに指示します。

構文

HRESULT RequestProfilerDetach(
   [in] DWORD    dwExpectedCompletionMilliseconds);

パラメーター

dwExpectedCompletionMilliseconds[in]共通言語ランタイム (CLR) は、プロファイラーを安全にアンロードできるかどうかを確認するためにチェックするまで待機する必要があります (ミリ秒単位)。

戻り値

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

HRESULT 説明
S_OK デタッチ要求は有効です。またデタッチ プロシージャは別のスレッドで継続しています。 デタッチが完了すると、ProfilerDetachSucceeded イベントが発行されます。
E_CORPROF_E_CALLBACK3_REQUIRED プロファイラーは、デタッチ操作をサポートするために実装する必要がある ICorProfilerCallback3 インターフェイスに対する IUnknown::QueryInterface に失敗しました。 デタッチは試行されませんでした。
CORPROF_E_IMMUTABLE_FLAGS_SET プロファイラーが起動時に変更できないフラグを設定しているため、デタッチできません。 デタッチは試行されませんでした。プロファイラーは完全にアタッチされたままです。
CORPROF_E_IRREVERSIBLE_INSTRUMENTATION_PRESENT プロファイラーがインストルメント化された共通中間言語 (CIL) コードまたは挿入された enter/leave フックを使用したため、デタッチは不可能です。 デタッチは試行されませんでした。プロファイラーは完全にアタッチされたままです。

注: インストルメント化された CIL は、SetILFunctionBody メソッドを使用してプロファイラーによって提供されるコードです。
CORPROF_E_RUNTIME_UNINITIALIZED マネージド アプリケーションでランタイムがまだ初期化されていません。 (つまり、ランタイムは完全には読み込まれていません。)このエラー コードは、プロファイラー コールバックの ICorProfilerCallback::Initialize メソッド内でデタッチが要求されたときに返されることがあります。
CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT サポートされていないタイミングで RequestProfilerDetach が呼び出されました。 このような状況が発生するのは、ガベージ コレクションを許容できない ICorProfilerCallback メソッドまたは ICorProfilerCallback メソッド内からではなく、マネージド スレッドでメソッドが呼び出された場合です。 詳細については、CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT を参照してください。

解説

デタッチ プロシージャの実行中に、デタッチ スレッド (プロファイラーのデタッチのために作成されたスレッド) は、すべてのスレッドがプロファイラーのコードを終了したかどうかを時々チェックします。 プロファイラーは、退避が終了するまでの予想時間を、dwExpectedCompletionMilliseconds パラメーターを介して提供する必要があります。 使用に適した値は、特定の ICorProfilerCallback* メソッド内でプロファイラーが使う通常の時間です。この値は、プロファイラーが使うと想定される最大時間の半分未満にしないでください。

デタッチ スレッドでは dwExpectedCompletionMilliseconds を使用して、プロファイラーのコールバック コードがすべてのスタックからポップされたかどうかをチェックする前にスリープする時間の長さを指定します。 次のアルゴリズムの詳細は今後の CLR のリリースで変更される可能性がありますが、これはプロファイラーをアンロードしても安全なタイミングを決定するために dwExpectedCompletionMilliseconds を利用する 1 つの方法を示しています。 デタッチ スレッドはまず dwExpectedCompletionMilliseconds ミリ秒間、スリープ状態になります。 スリープから復帰した後に、プロファイラーのコールバック コードがまだ存在することが CLR で検出された場合、今回は dwExpectedCompletionMilliseconds ミリ秒の 2 倍の時間、デタッチ スレッドが再度スリープ状態になります。 この 2 回目のスリープから復帰した後に、プロファイラーのコールバック コードがまだ存在することがデタッチ スレッドで検出された場合、再チェックが行われる前に 10 分間、スリープ状態になります。 デタッチ スレッドは継続して 10 分ごとに再チェックを行います。

プロファイラーが dwExpectedCompletionMilliseconds を 0 (ゼロ) に指定している場合、CLR は既定値 5000 を使用します。この設定では、チェックが 5 秒後に行われ、その次は 10 秒後に、それ以降は 10 分ごとに再チェックが行われます。

必要条件

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

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

ライブラリ: CorGuids.lib

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

関連項目