我想知道Marshal.GetFunctionPointerForDelegate。即我想知道它如何将委托转换为非静态函数到函数指针。
它是否动态生成以某种方式附加实例的代码存根?如果是这样,这不是泄密记忆吗?也许代表在终结者中解放了它?
它看起来不像System.Delegate有一个终结器,所以我对这个机制的工作原理非常感兴趣。我假设函数指针需要4个字节,实例需要4个字节(32位),但它返回一个简单的IntPtr。
答案 0 :(得分:6)
很大的问题,代表们在CLR中有与他们相关的代码的冰山。所以只是一些提示。下载SSCLI20 distribution以查看来源。所有相关代码都在clr / src / vm子目录中。
UMEntryThunk是整理呼叫的thunk的包装器。它由comdelegate.cpp中的COMDelegate :: ConvertToCallback()创建,由MarshalNative :: GetFunctionPointerForDelegateInternal()调用,Marshal方法的内部实现。
指向UMEntryThunk的指针存储在syncblk中,用于委托对象syncblk.h,InteropSyncBlockInfo :: SetUMEntryThunk()方法。
当垃圾收集器销毁委托对象时,它还会清除它的syncblk并调用~interopSyncBlockInfo析构函数。它调用UMEntryThunk :: FreeUMEntryThunk()方法再次清除thunk。
所以,不,没有内存泄漏。不完全是终结器,只是正常GC清理的一部分。