C#访问C++动态分配的数组指针(实例讲解)
2017-12-14 14:50
609 查看
项目中遇到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++动态分配的数组指针(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
相关文章推荐
- C/C++ 二维数据 静态动态声明和初始化及访问方法实例
- 如何在C/C++中动态分配地址连续访问快速的二维数组
- 关于C#调用C++动态库中的内存对齐的讲解
- 如何在C/C++中动态分配二维数组并访问其中的数据
- c++ 基类、派生类都使用了动态内存分配的实例
- C++实现动态分配const对象实例
- <win8>(四)实例讲解win8(XAML+C#)开发--------课程表:Snapped模式和动态磁贴,徽章(badge)
- C#调用的C++动态库里到底能分配多大的内存(实验)
- <win8>(四)实例讲解win8(XAML+C#)开发--------课程表:Snapped模式和动态磁贴,徽章(badge)
- C/C++ 二维数据 静态动态声明和初始化及访问方法实例
- Windows内存管理机制及C++内存分配实例
- C#反射实例讲解
- 从Delphi返回动态数组到C#和C++
- C#动态执行字符串(动态创建代码)的实例代码
- C++ 动态分配 和 内存分配和内存释放
- 动态分配及对动态申请获得的结构体变量进行访问
- C#反射实例讲解
- C#日历样式的下拉式计算器实例讲解
- 全面介绍Windows内存管理机制及C++内存分配实例之虚拟内存(3)
- 如何在C/C++中动态分配二维数组