ICorProfilerCallback5::ConditionalWeakTableElementReferences 方法
标识这些根通过直接成员字段引用和 ConditionalWeakTable
依赖关系引用的对象的传递闭包。
语法
HRESULT ConditionalWeakTableElementReferences(
[in] ULONG cRootRefs,
[in, size_is(cRootRefs)] ObjectID keyRefIds[],
[in, size_is(cRootRefs)] ObjectID valueRefIds[],
[in, size_is(cRootRefs)] GCHandleID rootIds[]
);
参数
cRootRefs
[in] keyRefIds
、valueRefIds
和 rootIds
数组中的元素数。
keyRefIds
[in] 一个包含对象 ID 的数组,其中每个对象 ID 都包含相关句柄对中主要元素的 ObjectID
。
valueRefIds
[in] 一个包含对象 ID 的数组,其中每个对象 ID 都包含相关句柄对中次要元素的 ObjectID
。 (keyRefIds[i]
将 valueRefIds[i]
保持为活动状态。)
rootIds
[in] 一个包含 GCHandleID
值的数组,这些值指向包含有关垃圾回收根的附加信息的整数。
在该回调本身中,由 ObjectID
方法返回的任何 ConditionalWeakTableElementReferences
值都无效,因为垃圾回收器可能正处于将对象从旧位置移到新位置的过程中。 因此,探查器不应在 ConditionalWeakTableElementReferences
调用期间尝试检查对象。 在 GarbageCollectionFinished
时,已经将所有对象都移动到其新位置,并且检查可能已完成。
示例
以下代码示例演示了如何实现 ICorProfilerCallback5 以及如何使用此方法。
HRESULT Callback5Impl::ConditionalWeakTableElementReferences(
ULONG cRootRefs,
ObjectID keyRefIds[],
ObjectID valueRefIds[],
GCHandleID rootIds[])
{
printf("Callback5Impl::ConditionalWeakTableElementReferences called\n");
for (unsigned int i = 0; i < cRootRefs; ++i)
{
// Save dependency to XML for later retrieval
PersistDependencyToXml(rootIds[i], keyRefIds[i], valueRefIds[i]);
// or store dependency to an internal map
m_cwt_deps->add_dep(rootIds[i], keyRefIds[i], valueRefIds[i]);
// or add arc to object graph
m_obj_graph->add_arc(keyRefIds[i], valueRefIds[i], rootIds[i]);
}
return S_OK;
}
注解
.NET Framework 4.5 或更高版本的探查器将实现 ICorProfilerCallback5 接口并记录由 ConditionalWeakTableElementReferences
方法指定的依赖关系。 ICorProfilerCallback5
提供由 ConditionalWeakTable
条目表示的活动对象间的依赖关系的完整集。 由 ICorProfilerCallback::ObjectReferences 方法指定的这些依赖关系和成员字段引用将使托管的探查器能够生成活动对象的完整对象图。
要求
平台:请参阅系统要求。
头文件: CorProf.idl、CorProf.h
.NET Framework 版本:自 4.5 起可用