C#访问C++动态分配的数组指针(实例讲解)
程序员文章站
2023-12-19 21:00:22
项目中遇到c#调用c++算法库的情况,c++内部运算结果返回矩形坐标数组(事先长度未知且不可预计),下面方法适用于访问c++内部分配的任何结构体类型数组。当时想当然的用re...
项目中遇到c#调用c++算法库的情况,c++内部运算结果返回矩形坐标数组(事先长度未知且不可预计),下面方法适用于访问c++内部分配的任何结构体类型数组。当时想当然的用ref array[]传递参数,能计算能分配,但是在c#里只得到arr长度是1,无法访问后续数组item。
c++
接口示例:
void call(int *count, rect **arr) { //….. //重新malloc一段内存,指针复制给入参,外部调用前并不知道长度,另外提供接口free内存 //…. }
结构体:
struct rect { int x; int y; int width; int height; };
c#:
结构体:
struct rect { public int x; public int y; public int width; public int height; }
外部dll方法声明:
[dllimport("xxx.dll", entrypoint = "call", callingconvention = callingconvention.cdecl, exactspelling = true)] public static extern void call( ref int count, ref intptr parray);
方法调用:
intptr parray = intptr.zero; //数组指针 int count = 0; call(ref count, ref parray); var rects = new rect[count]; //结果数组 for (int i = 0; i < count; i++) { var itemptr = (intptr)((int64)rect + i * marshal.sizeof(typeof(rect))); //这里有人用的uint32,我用的时候溢出了,换成int64 rects[i] = (rect)marshal.ptrtostructure(itemptr, typeof(rect)); }
以上这篇c#访问c++动态分配的数组指针(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。