一篇用C++/CLI讲述在托管委托(delegate)和非托管函数指针之间相互转化的文章

我们的图书《精通.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)和由委托转化成的函数指针处于不同的堆上。所以一定要保证非托管代码执行过程中,托管对象没有被回收。 希望大家觉得有用。
已发表 27 十月 09 01:54 作者 P/Invoke.Book.Master

评论

尚无任何评论
注册后即可发表评论

About P/Invoke.Book.Master

Master