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