gpt4 book ai didi

c# - Marshal.GetFunctionPointerForDelegate 如何作用于实例成员?

转载 作者:太空狗 更新时间:2023-10-30 00:52:38 29 4
gpt4 key购买 nike

我想知道 Marshal.GetFunctionPointerForDelegate。也就是说,我想知道它如何将委托(delegate)转换为非静态函数的函数指针。

它是否动态生成以某种方式附加了实例的代码 stub ?如果是这样,这不会泄漏内存吗?也许代表在终结器中释放了它?

看起来System.Delegate 没有finalizer,所以我对这个机制是如何工作的很感兴趣。我假设函数指针需要 4 个字节,实例需要 4 个字节(在 32 位上),但它返回一个简单的 IntPtr。

最佳答案

大问题,委托(delegate)在 CLR 中有一大堆与之相关的代码。所以只是一些提示。下载SSCLI20 distribution查看源代码。所有相关代码都在 clr/src/vm 子目录中。

UMEntryThunk 是编码(marshal)调用的 thunk 的包装器。它由 comdelegate.cpp 中的 COMDelegate::ConvertToCallback() 创建,由 MarshalNative::GetFunctionPointerForDelegateInternal() 调用,Marshal 方法的内部实现。

指向 UMEntryThunk 的指针存储在委托(delegate)对象的 syncblk 中,syncblk.h,InteropSyncBlockInfo::SetUMEntryThunk() 方法。

当垃圾收集器销毁委托(delegate)对象时,它还会为它清理 syncblk 并调用 ~InteropSyncBlockInfo 析构函数。它调用 UMEntryThunk::FreeUMEntryThunk() 方法再次清理 thunk。

所以,不,没有内存泄漏。不完全是终结器,只是正常 GC 清理的一部分。

关于c# - Marshal.GetFunctionPointerForDelegate 如何作用于实例成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20600380/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com