c# – 非静态回调如何在本机代码中运行?
提问这个问题有点奇怪,因为我的代码似乎不应该起作用,但确实如此,虽然我没有抱怨,但我想确认原因?大声笑
简单地说,我有一个C本机DLL(根本没有CLR /托管支持)从C#代码中回拨.本机端存储stdcall回调函数,该函数由C#端提供.我一直认为回调METHOD(在C#中)必须是静态的,但是非静态和lambda表达式两种工作都很简单!? “this”指针是如何从本机代码编组的?我一直以为本机代码只存储非实例函数指针? 现在,我确实找到了一篇文章,其中一些人发出了IL代码,以便在本地和非静态托管回调之间“桥接”.我还注意到了这种折旧的方法:“Marshal.GetUnmanagedThunkForManagedMethodPtr()”.不再支持该方法,我假设它意味着它是内置的? 问题摘要: >现在通过发送IL代码将thunking本地构建到.NET中吗?如果是这样,在什么版本的.NET中,这会被本机支持? 谢谢. 解决方法
没有IL参与thunk,它通过发出本机代码 – 一个重新排列参数以满足.NET的调用约定的蹦床,包括在关闭委托的情况下保存的this指针,然后执行尾调用. NET方法本身.
这称为“反向调用/调用”,应该可以在Mono文档中轻松查找.
当委托被垃圾收集时,蹦床使用的内存也被释放.因此,只要本机代码具有指向蹦床的指针,您就需要保持委托存活. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |