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 |
由于探查器使用了已检测的 Microsoft 中间语言 (MSIL) 代码或已插入的 enter/leave 挂钩,因此无法进行分离。 尚未尝试分离;仍会完全附加探查器。 Note 检测后的 MSIL 是由探查器通过使用 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,这意味着 CLR 将在 5 秒后执行清空检查,然后会在 10 秒后再次执行清空检查,此后会每隔 10 分钟执行一次清空检查。
有关分离探查器的更多信息,请参见探查器附加和分离
要求
**平台:**请参见 .NET Framework 系统要求。
**头文件:**CorProf.idl、CorProf.h
**库:**CorGuids.lib
**.NET Framework 版本:**4