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

时间:2013-12-15 22:02:35

标签: c# .net clr marshalling unsafe

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

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

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

1 个答案:

答案 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清理的一部分。