更新:2007 年 11 月
提供公共语言运行库 (CLR) 在代码探查器订阅的事件发生时用来通知该探查器的方法。
interface ICorProfilerCallback : IUnknown
{
HRESULT Initialize(
[in] IUnknown *pICorProfilerInfoUnk);
HRESULT Shutdown();
HRESULT AppDomainCreationStarted(
[in] AppDomainID appDomainId);
HRESULT AppDomainCreationFinished(
[in] AppDomainID appDomainId,
[in] HRESULT hrStatus);
HRESULT AppDomainShutdownStarted(
[in] AppDomainID appDomainId);
HRESULT AppDomainShutdownFinished(
[in] AppDomainID appDomainId,
[in] HRESULT hrStatus);
HRESULT AssemblyLoadStarted(
[in] AssemblyID assemblyId);
HRESULT AssemblyLoadFinished(
[in] AssemblyID assemblyId,
[in] HRESULT hrStatus);
HRESULT AssemblyUnloadStarted(
[in] AssemblyID assemblyId);
HRESULT AssemblyUnloadFinished(
[in] AssemblyID assemblyId,
[in] HRESULT hrStatus);
HRESULT ModuleLoadStarted(
[in] ModuleID moduleId);
HRESULT ModuleLoadFinished(
[in] ModuleID moduleId,
[in] HRESULT hrStatus);
HRESULT ModuleUnloadStarted(
[in] ModuleID moduleId);
HRESULT ModuleUnloadFinished(
[in] ModuleID moduleId,
[in] HRESULT hrStatus);
HRESULT ModuleAttachedToAssembly(
[in] ModuleID moduleId,
[in] AssemblyID AssemblyId);
HRESULT ClassLoadStarted(
[in] ClassID classId);
HRESULT ClassLoadFinished(
[in] ClassID classId,
[in] HRESULT hrStatus);
HRESULT ClassUnloadStarted(
[in] ClassID classId);
HRESULT ClassUnloadFinished(
[in] ClassID classId,
[in] HRESULT hrStatus);
HRESULT FunctionUnloadStarted(
[in] FunctionID functionId);
HRESULT JITCompilationStarted(
[in] FunctionID functionId,
[in] BOOL fIsSafeToBlock);
HRESULT JITCompilationFinished(
[in] FunctionID functionId,
[in] HRESULT hrStatus,
[in] BOOL fIsSafeToBlock);
HRESULT JITCachedFunctionSearchStarted(
[in] FunctionID functionId,
[out] BOOL *pbUseCachedFunction);
HRESULT JITCachedFunctionSearchFinished(
[in] FunctionID functionId,
[in] COR_PRF_JIT_CACHE result);
HRESULT JITFunctionPitched(
[in] FunctionID functionId);
HRESULT JITInlining(
[in] FunctionID callerId,
[in] FunctionID calleeId,
[out] BOOL *pfShouldInline);
HRESULT ThreadDestroyed(
[in] ThreadID threadId);
HRESULT ThreadAssignedToOSThread(
[in] ThreadID managedThreadId,
[in] DWORD osThreadId);
HRESULT RemotingClientInvocationStarted();
HRESULT RemotingClientSendingMessage(
[in] GUID *pCookie,
[in] BOOL fIsAsync);
HRESULT RemotingClientReceivingReply(
[in] GUID *pCookie,
[in] BOOL fIsAsync);
HRESULT RemotingClientInvocationFinished();
HRESULT RemotingServerReceivingMessage(
[in] GUID *pCookie,
[in] BOOL fIsAsync);
HRESULT RemotingServerInvocationStarted();
HRESULT RemotingServerInvocationReturned();
HRESULT RemotingServerSendingReply(
[in] GUID *pCookie,
[in] BOOL fIsAsync);
HRESULT UnmanagedToManagedTransition(
[in] FunctionID functionId,
[in] COR_PRF_TRANSITION_REASON reason);
HRESULT ManagedToUnmanagedTransition(
[in] FunctionID functionId,
[in] COR_PRF_TRANSITION_REASON reason);
HRESULT RuntimeSuspendStarted(
[in] COR_PRF_SUSPEND_REASON suspendReason);
HRESULT RuntimeSuspendFinished();
HRESULT RuntimeSuspendAborted();
HRESULT RuntimeResumeStarted();
HRESULT RuntimeResumeFinished();
HRESULT RuntimeThreadSuspended(
[in] ThreadID threadId);
HRESULT RuntimeThreadResumed(
[in] ThreadID threadId);
HRESULT MovedReferences(
[in] ULONG cMovedObjectIDRanges,
[in, size_is(cMovedObjectIDRanges)] ObjectID oldObjectIDRangeStart[] ,
[in, size_is(cMovedObjectIDRanges)] ObjectID newObjectIDRangeStart[] ,
[in, size_is(cMovedObjectIDRanges)] ULONG cObjectIDRangeLength[] );
HRESULT ObjectAllocated(
[in] ObjectID objectId,
[in] ClassID classId);
HRESULT ObjectsAllocatedByClass(
[in] ULONG cClassCount,
[in, size_is(cClassCount)] ClassID classIds[] ,
[in, size_is(cClassCount)] ULONG cObjects[] );
HRESULT ObjectReferences(
[in] ObjectID objectId,
[in] ClassID classId,
[in] ULONG cObjectRefs,
[in, size_is(cObjectRefs)] ObjectID objectRefIds[] );
HRESULT RootReferences(
[in] ULONG cRootRefs,
[in, size_is(cRootRefs)] ObjectID rootRefIds[] );
HRESULT ExceptionThrown(
[in] ObjectID thrownObjectId);
HRESULT ExceptionSearchFunctionEnter(
[in] FunctionID functionId);
HRESULT ExceptionSearchFunctionLeave();
HRESULT ExceptionSearchFilterEnter(
[in] FunctionID functionId);
HRESULT ExceptionSearchFilterLeave();
HRESULT ExceptionSearchCatcherFound(
[in] FunctionID functionId);
HRESULT ExceptionOSHandlerEnter(
[in] UINT_PTR __unused);
HRESULT ExceptionOSHandlerLeave(
[in] UINT_PTR __unused);
HRESULT ExceptionUnwindFunctionEnter(
[in] FunctionID functionId);
HRESULT ExceptionUnwindFunctionLeave();
HRESULT ExceptionUnwindFinallyEnter(
[in] FunctionID functionId);
HRESULT ExceptionUnwindFinallyLeave();
HRESULT ExceptionCatcherEnter(
[in] FunctionID functionId,
[in] ObjectID objectId);
HRESULT ExceptionCatcherLeave();
HRESULT COMClassicVTableCreated(
[in] ClassID wrappedClassId,
[in] REFGUID implementedIID,
[in] void *pVTable,
[in] ULONG cSlots);
HRESULT COMClassicVTableDestroyed(
[in] ClassID wrappedClassId,
[in] REFGUID implementedIID,
[in] void *pVTable);
HRESULT ExceptionCLRCatcherFound();
HRESULT ExceptionCLRCatcherExecute();
}
方法
方法 |
说明 |
---|---|
通知探查器已创建应用程序域。 |
|
通知探查器正在创建应用程序域。 |
|
通知探查器已从某个进程卸载应用程序域。 |
|
通知探查器正在从某个进程卸载应用程序域。 |
|
通知探查器已完成某个程序集的加载。 |
|
通知探查器正在加载某个程序集。 |
|
通知探查器已卸载某个程序集。 |
|
通知探查器正在卸载某个程序集。 |
|
通知探查器已完成某个类的加载。 |
|
通知探查器正在加载某个类。 |
|
通知探查器已完成某个类的卸载。 |
|
通知探查器正在卸载某个类。 |
|
通知探查器已创建指定 IID 和类的运行库可调用包装 (RCW)。 |
|
通知探查器某个 RCW 将被销毁。 |
|
通知探查器正在将控件传递给适当的 catch 块。 |
|
通知探查器正在将控制传递到适当的 catch 块之外。 |
|
在 .NET Framework 2.0 版中已过时。 |
|
在 .NET Framework 2.0 中已过时。 |
|
未实现。需要非托管异常信息的探查器必须通过其他方式获取此信息。 |
|
未实现。需要非托管异常信息的探查器必须通过其他方式获取此信息。 |
|
通知探查器异常处理的搜索阶段已找到针对所引发的异常的处理程序。 |
|
通知探查器正在执行某个用户筛选器。 |
|
通知探查器用户筛选器刚执行完毕。 |
|
通知探查器异常处理的搜索阶段已进入一个函数。 |
|
通知探查器异常处理的搜索阶段已完成某个函数的搜索。 |
|
通知探查器已引发某个异常。 |
|
通知探查器异常处理的展开阶段正在进入指定函数所包含的某个 finally 子句。 |
|
通知探查器异常处理的展开阶段已离开某个 finally 子句。 |
|
通知探查器异常处理的展开阶段已进入一个函数。 |
|
通知探查器异常处理的展开阶段已完成一个函数的展开。 |
|
通知探查器运行库已开始卸载某个函数。 |
|
每当启动新的 CLR 应用程序时,都将调用此方法来初始化探查器。 |
|
通知探查器已完成以前使用 NGen.exe 编译的函数的搜索。 |
|
通知探查器已开始搜索以前使用 NGen.exe 编译的函数。 |
|
通知探查器 JIT 编译器已完成某个函数的编译。 |
|
通知探查器实时 (JIT) 编译器已开始编译某个函数。 |
|
通知探查器已从内存中移除 JIT 编译的某个函数。 |
|
通知探查器 JIT 编译器即将插入一个嵌入另一个函数的函数。 |
|
通知探查器已发生从托管代码到非托管代码的转换。 |
|
通知探查器正在向模块的父程序集附加模块。 |
|
通知探查器已完成某个模块的加载。 |
|
通知探查器正在加载某个模块。 |
|
通知探查器已完成某个模块的卸载。 |
|
通知探查器正在卸载某个模块。 |
|
通知探查器有关在垃圾回收期间移动的对象引用的信息。 |
|
通知探查器已将堆中的内存分配给某个对象。 |
|
通知探查器有关由指定对象引用的内存中的对象的信息。 |
|
通知探查器有关自上次垃圾回收以来为每个指定类创建的实例数的信息。 |
|
通知探查器某个远程处理调用已在客户端上完成运行。 |
|
通知探查器已启动某个远程处理调用。 |
|
通知探查器某个远程处理调用的服务器端部分已完成,而客户端正在接收并即将处理答复。 |
|
通知探查器客户端正在向服务器发送请求。 |
|
通知探查器进程已完成应某个远程方法调用请求而对某个方法的调用。 |
|
通知探查器进程正在调用某个方法来响应某个远程方法调用请求。 |
|
通知探查器进程正在接收某个远程方法调用或激活请求。 |
|
通知探查器进程已完成某个远程方法调用请求的处理并即将通过某个通道传输答复。 |
|
在垃圾回收后向探查器通知有关根引用的信息。 |
|
通知探查器运行库已继续所有运行库线程并恢复正常操作状态。 |
|
通知探查器运行库正在继续所有运行时线程。 |
|
通知探查器运行库已中止所发生的运行时挂起。 |
|
通知探查器运行库已完成所有运行时线程的挂起。 |
|
通知探查器运行库将挂起所有的运行时线程。 |
|
通知探查器指定的线程已在挂起后继续。 |
|
通知探查器指定的线程已挂起或即将挂起。 |
|
通知探查器应用程序正在关闭。 |
|
通知探查器正在使用特定的操作系统 (OS) 线程实现某个托管线程。 |
|
通知探查器已创建线程。 |
|
通知探查器已销毁某个线程。 |
|
通知探查器已发生从非托管代码到托管代码的转换。 |
备注
当探查器订阅的事件发生时,CLR 将调用 ICorProfilerCallback(或 ICorProfilerCallback2)接口中的方法来通知该探查器。这是 CLR 用来与代码探查器通信的主回调接口。
代码探查器必须实现 ICorProfilerCallback 接口的方法。对于 .NET Framework 2.0 版或更高版本,该探查器还必须实现 ICorProfilerCallback2 方法。每个方法实现都必须返回一个 HRESULT,如果成功,则它的值为 S_OK,否则它的值为 E_FAIL。目前,CLR 会忽略每个回调(ICorProfilerCallback::ObjectReferences 除外)返回的 HRESULT。
在 Microsoft Windows 注册表中,代码探查器必须注册其用于实现 ICorProfilerCallback 和 ICorProfilerCallback2 接口的组件对象模型 (COM) 对象。代码探查器通过调用 ICorProfilerInfo::SetEventMask 来订阅需要接收其相关通知的事件。此操作通常在探查器实现 ICorProfilerCallback::Initialize 时完成。这样,当执行中的运行库进程内即将发生或已发生某个事件时,探查器便能收到来自该运行库的通知。
![]() |
---|
探查器注册单个 COM 对象。如果探查器面向的是 .NET Framework 1.0 或 1.1 版,则该 COM 对象仅需实现 ICorProfilerCallback 的方法。如果探查器面向的是 .NET Framework 2.0 版或更高版本,则该 COM 对象还必须实现 ICorProfilerCallback2 的方法。 |
要求
**平台:**请参见 .NET Framework 系统要求。
**头文件:**CorProf.idl
**库:**CorGuids.lib
**.NET Framework 版本:**3.5 SP1、3.5、3.0 SP1、3.0、2.0 SP1、2.0、1.1、1.0