简单地说,我有一个C本机DLL(根本没有CLR /托管支持)从C#代码中回拨.本机端存储stdcall回调函数,该函数由C#端提供.我一直认为回调METHOD(在C#中)必须是静态的,但是非静态和lambda表达式两种工作都很简单!? “this”指针是如何从本机代码编组的?我一直以为本机代码只存储非实例函数指针?
现在,我确实找到了一篇文章,其中一些人发出了IL代码,以便在本地和非静态托管回调之间“桥接”.我还注意到了这种折旧的方法:“Marshal.GetUnmanagedThunkForManagedMethodPtr()”.不再支持该方法,我假设它意味着它是内置的?
问题摘要:
>现在通过发送IL代码将thunking本地构建到.NET中吗?如果是这样,在什么版本的.NET中,这会被本机支持?
> Mono也支持隐含的“thunking”吗?
>当为托管回调发出IL时,会发生什么
thunk引用的实例被删除了吗?是否删除了IL,或
这可能导致记忆“泄漏”吗?
谢谢.
解决方法
Is thunking now built natively into .NET by emitting IL code? If so,at what version of .NET did this become natively supported?
没有IL参与thunk,它通过发出本机代码 – 一个重新排列参数以满足.NET的调用约定的蹦床,包括在关闭委托的情况下保存的this指针,然后执行尾调用. NET方法本身.
Is implicit “thunking” supported in Mono as well?
这称为“反向调用/调用”,应该可以在Mono文档中轻松查找.
When the IL is emitted for the managed callbacks,what happens when the instance the thunk refers to is deleted?