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

标签 c# .net clr marshalling unsafe

我想知道 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/

相关文章:

c# - 编译内容项目时出错

C# CS0079 事件处理编译错误

c# - WCF - 让客户端检查服务可用性

c# - 为什么 C# 不支持 Protected 和 Internal 可访问性的交集?

c# - 使用 LINQ 获取数字列表中的下一个数字

c# - 如何使用 C# 在 Unity 中解析复杂的 JSON 对象

c# - .NET 的缩略图库

c# - T4 模板和 Assembly.Load

c# - 如果 16 位最大值为 65,535,为什么 int16 类型限制为 32,768?

clr - ILASM 不设置 FileVersion