加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 05:37:24 所属栏目:百科 来源:网络整理
导读:提问这个问题有点奇怪,因为我的代码似乎不应该起作用,但确实如此,虽然我没有抱怨,但我想确认原因?大声笑 简单地说,我有一个C本机DLL(根本没有CLR /托管支持)从C#代码中回拨.本机端存储stdcall回调函数,该函数由C#端提供.我一直认为回调METHOD(在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?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读