Marshal.GetFunctionPointerForDelegate如何在实例成员上工作?

我想知道Marshal.GetFunctionPointerForDelegate。 即我想知道它如何将委托转换为非静态函数到函数指针。

它是否动态生成以某种方式附加实例的代码存根? 如果是这样,这不是泄密记忆吗? 也许代表在终结者中解放了它?

它看起来不像System.Delegate有一个终结器,所以我对这个机制的工作原理非常感兴趣。 我假设函数指针需要4个字节,实例需要4个字节(32位),但它返回一个简单的IntPtr。

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

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

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

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

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