我想知道 Marshal.GetFunctionPointerForDelegate。即我想知道它如何将委托转换为非静态函数到函数指针。
它是否动态生成以某种方式附加实例的代码存根?如果是这样,这不会泄漏内存吗?也许委托在其终结器中释放了它?
看起来 System.Delegate 没有终结器,所以我对这个机制如何工作非常感兴趣。我假设函数指针需要 4 个字节,实例(32 位)需要 4 个字节,但它返回一个简单的 IntPtr。
大问题是,代表们在 CLR 中拥有与他们相关的代码冰山一角。所以只是一些提示。下载SSCLI20分布 http://www.microsoft.com/en-us/download/details.aspx?id=4917查看源码。所有相关代码都位于 clr/src/vm 子目录中。
UMEntryThunk 是封送调用的 thunk 的包装器。它由 comdelegate.cpp 中的 COMDelegate::ConvertToCallback() 创建,由 MarshalNative::GetFunctionPointerForDelegateInternal()(Marshal 方法的内部实现)调用。
指向 UMEntryThunk 的指针存储在委托对象的syncblk 中,syncblk.h,InteropSyncBlockInfo::SetUMentryThunk() 方法。
当垃圾收集器销毁委托对象时,它还会为其清理同步块并调用 ~InteropSyncBlockInfo 析构函数。它调用 UMEntryThunk::FreeUMEntryThunk() 方法来再次清理 thunk。
所以,不,不存在内存泄漏。不完全是终结器,只是正常 GC 清理的一部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)