我们的图书《精通.NET互操作》出版有一个月的时间了,有一些朋友会想我请教一些问题。并反馈说,没有专门详细地介绍有关用委托实现函数指针、回调函数的章节。我觉得大家的建议很有道理。现在这里做个记号,挖个坑。
之所以推荐这篇文章是有两个原因:
1. 它介绍了在托管委托和非托管函数指针,回调函数之间相互转换的方法
2. 它使用C++/CLI实现了对整个问题的描述。因为网络上有关C++ Interop的相关资料很少。所以值得一看
Marshalling native function pointers
我读后,发现作者主要强调了以下几点:
1.在定义托管委托(delegate)的时候,可以使用UnmanagedFunctionPointer属性(Attribute)指定CallingConvention,以使其托管签名与非托管函数定义相匹配。
2.使用System.Runtime.InteropServices.Marshal类的方法实现托管委托和非托管函数指针之间的封送。
- Marshal.GetFunctionPointerForDelegate方法,用于将托管委托转化为非托管代码可以调用的方法。
- Marshal.GetDelegateForFunctionPointer方法,用于将非托管函数转化为托管委托。
3.垃圾回收器(GC)对封送委托到非托管代码时的影响。由于委托(delegate)和由委托转化成的函数指针处于不同的堆上。所以一定要保证非托管代码执行过程中,托管对象没有被回收。
希望大家觉得有用。