c# – 非静态回调如何在本机代码中运行?

前端之家收集整理的这篇文章主要介绍了c# – 非静态回调如何在本机代码中运行?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
提问这个问题有点奇怪,因为我的代码似乎不应该起作用,但确实如此,虽然我没有抱怨,但我想确认原因?大声笑

简单地说,我有一个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?

当委托被垃圾收集时,蹦床使用的内存也被释放.因此,只要本机代码具有指向蹦床的指针,您就需要保持委托存活.

猜你在找的C#相关文章