元帅怎么样.GetFunctionPointerForDelegate处理实例成员



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

它是否会动态生成一个以某种方式附加实例的代码存根?如果是这样的话,这不会泄露内存吗?也许委托在其终结器中释放它?

它看起来不像System。委托有一个终结器,所以我对这个机制的工作方式很感兴趣。我假设函数指针需要4个字节,实例需要4个比特(在32位上),但它返回一个简单的IntPtr。

大问题是,委托在CLR中有一个与之相关的代码冰山。所以只是一些提示。下载SSCLI20发行版以查看源代码。所有相关的代码都在clr/src/vm子目录中。

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

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

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

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

相关内容

最新更新