欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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++dll结构体数组指针的问题详解

以上这篇c#访问c++动态分配的数组指针(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

上一篇:

下一篇: