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] keyRefIdsvalueRefIdsrootIds 数组中的元素数。

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 起可用

另请参阅