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 在不支持时调用了 RequestProfilerDetach。 如果在托管线程上(而不是从 ICorProfilerCallback 方法内或从无法容忍垃圾回收的 ICorProfilerCallback 方法内)调用方法,则会发生这种情况。 有关详细信息,请参阅 CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT

注解

在分离过程中,分离线程(专为分离探查器创建的线程)有时会检查是否所有线程均已退出探查器的代码。 探查器应通过 dwExpectedCompletionMilliseconds 参数估计此操作的耗时。 最佳使用值是探查器在任何给定 ICorProfilerCallback* 方法内通常花费的时间量;此值不应小于探查器预计花费时间量的一半。

分离线程使用 dwExpectedCompletionMilliseconds 决定在检查探查器回调代码是否已从所有堆栈中弹出之前需要休眠多长时间。 尽管以下算法的详细信息在 CLR 的未来版本中可能有所更改,但它展示了在确定何时可安全卸载探查器时可使用 dwExpectedCompletionMilliseconds 的一种方法。 分离线程先休眠 dwExpectedCompletionMilliseconds 毫秒。 如果从睡眠状态唤醒后,CLR 发现探查器回叫代码仍然存在,分离线程则将再次睡眠,这次的睡眠时长是 dwExpectedCompletionMilliseconds 毫秒的两倍。 如果从第二次休眠状态唤醒后,分离线程仍发现存在探查器回调代码,则将休眠 10 分钟再进行检查。 分离线程每隔 10 分钟继续进行重新检查。

如果探查器将 dwExpectedCompletionMilliseconds 指定为 0(零),CLR 使用默认值 5000,这意味着探查器在 5 秒钟后执行检查,10 秒后再次检查,然后每隔 10 分钟进行重新检查。

要求

平台:请参阅系统要求

头文件: CorProf.idl、CorProf.h

库:CorGuids.lib

.NET Framework 版本:自 4 起可用

另请参阅