问这个问题有点奇怪,因为我的代码似乎不应该工作,但它确实有效,虽然我没有抱怨,但我想确认为什么?哈哈
简单地说,我有一个 C++ 本机 DLL(根本没有 CLR/托管支持),它从 C# 代码中获取回调。native 端存储一个 stdcall 回调函数,由 C# 端提供。我一直认为回调方法(在 C# 中)必须是静态的,但非静态和 lambda 表达式都可以正常工作!?如何从本机代码封送“this”指针?我一直以为原生代码只存储非实例函数指针?
现在,我确实找到了一篇文章,其中有人发出 IL 代码以在本机和非静态托管回调之间“架起”桥梁。我还注意到了这种贬值的方法:“Marshal.GetUnmanagedThunkForManagedMethodPtr()”。该方法不再受支持,我假设这意味着它是内置的?
问题总结:
thunking 现在是通过发出 IL 代码在 .NET 中内置的吗?如果是这样,它在哪个版本的 .NET 中成为本机支持的?
Mono 是否也支持隐式“thunking”?
当为托管回调发出 IL 时,当 thunk 引用的实例被删除时会发生什么?IL 是否被删除,或者这可能会导致内存“泄漏”?
谢谢。