非静态回调如何在本机代码中工作?

2023-11-26

问这个问题有点奇怪,因为我的代码看起来不应该工作,但它确实工作,虽然我没有抱怨,但我想确认为什么?哈哈

简而言之,我有一个 C++ 本机 DLL(根本没有 CLR/托管支持),它接受来自 C# 代码的回调。 Native端存储了一个stdcall回调函数,该函数由C#端提供。我一直认为回调方法(在 C# 中)必须是静态的,但非静态和 lambda 表达式都可以正常工作!?如何从本机代码中整理“this”指针?我一直以为原生代码只存储非实例函数指针?

现在,我确实找到了一篇文章,其中有人发出了 IL 代码来在本机和非静态托管回调之间“桥接”。我还注意到这个已贬值的方法:“Marshal.GetUnmanagementThunkForManagedMethodPtr()”。该方法不再受支持,我假设这意味着它是内置的?

问题摘要:

  1. thunking 现在是否通过发出 IL 代码本地构建到 .NET 中?如果是,那么在哪个版本的 .NET 中本机支持此功能?

  2. Mono 也支持隐式“thunking”吗?

  3. 当为托管回调发出 IL 时,会发生什么 thunk 引用的实例被删除了吗? IL 是否被移除,或者 可以这么说,这可能会导致内存“泄漏”吗?

Thanks.


thunking 现在是否通过发出 IL 代码本地构建到 .NET 中?如果是,那么在哪个版本的 .NET 中本机支持此功能?

thunk 中不涉及 IL,它是通过发出本机代码来发生的——一个重新排列参数以满足 .NET 调用约定的蹦床,包括this在关闭委托的情况下保存的指针,然后对 .NET 方法本身执行尾调用。

Mono 也支持隐式“thunking”吗?

这称为“反向 p/invoke”,这应该可以很容易地在 Mono 文档中查找。

当为托管回调发出 IL 时,当 thunk 引用的实例被删除时会发生什么?

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

非静态回调如何在本机代码中工作? 的相关文章

随机推荐