C# 如何从本机代码执行非静态回调?

C# 如何从本机代码执行非静态回调?,c#,c++,callback,thunk,C#,C++,Callback,Thunk,问这个问题有点奇怪,因为我的代码似乎不应该工作,但它确实工作,尽管我没有抱怨,但我想确认一下为什么?哈哈 简单地说,我有一个C++原生DLL(没有CLR/托管支持),它调用C代码来调用。本机端存储一个stdcall回调函数,该函数由C#端提供。我一直认为回调方法(在C#中)必须是静态的,但非静态和lambda表达式都可以正常工作!?如何从本机代码封送“this”指针?我一直认为本机代码只存储非实例函数指针 现在,我确实发现了一篇文章,其中有人发出IL代码来“桥接”本机和非静态托管回调。我还注意到

问这个问题有点奇怪,因为我的代码似乎不应该工作,但它确实工作,尽管我没有抱怨,但我想确认一下为什么?哈哈

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

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

问题摘要:

  • thunking现在是否通过发出IL代码以本机方式构建到.NET中?如果是这样的话,在.NET的哪个版本上本机支持此功能

  • Mono中是否也支持隐式“thunking”

  • 当为托管回调发出IL时,当 thunk引用的实例是否已删除?IL是否已移除,或 可以说,这会导致内存“泄漏”吗


  • 谢谢。

    互操作封送员只需封送一个委托即可。委托可以是类委托(无
    )或实例委托(有
    )。从C#的角度来看,它只是调用一个委托。i、 e.使用实例委托管理
    所使用的相同语义(例如,类实例的解耦)得到有效使用

    很明显,在封面下还有更多的事情要做(比如钉,等等)——但它们通常与你的要求无关

    thunking现在是否通过发出IL代码以本机方式构建到.NET中?如果是这样的话,在.NET的哪个版本上本机支持此功能

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

    Mono中是否也支持隐式“thunking”

    这被称为“反向p/invoke”,这应该使在Mono文档中查找变得容易

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


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

    我确实明白了这一点,但为其他人显式声明它很好,因为我很难找到关于它的可靠信息。;)