参考文章http://blog.csdn.net/jadeflute/article/details/5684687
但是这里面第一个方案我没有测试成功,第二个方案我感觉有点复杂。
然后自己写啦一个:
第一:c++ 方法的结构数组参数设置为指针,指向第一个元素的地址。定义结构体。
typedef struct { float X; float Y; }Point_2F; extern "C" __declspec(dllexport) bool GetPoints(char *s,Point_2F *arr);
for(int i=0;i<4;i++)//在方法体内赋值 { Point_2F f; f.X=i+1; f.Y=i+2; arr[i]=f; }
第二:c#调用声明c++方法时,设置传入的参数为指针类型,也就是IntPtr。定义结构体。
[StructLayout(LayoutKind.Sequential)] public struct Point_2F { public float X; public float Y; };
[DllImport("dll名子", EntryPoint = "GetPoints", CallingConvention = CallingConvention.Cdecl)] static extern bool GetPoints(string s, IntPtr arr);//错误应该返回byte类型
Point_2F[] arrP = new Point_2F[4]; arrP[0] = new Point_2F(); arrP[0].X = 100; arrP[0].Y = 100; IntPtr ptr = System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(arrP, 0);//获取地址 bool ret = GetPoints(s, ptr);//数值里面值发生改变。
这样是不是简单点呢?不知道这样是否存在其他问题,比如操作系统环境,还有其他我没想到的。
(PS:中间有一个错误,就是C++中bool占一个字节,C#中bool占4个字节,所以C声明方法应该返回byte类型。)
当然也可以有个变通的方案.不用new来申请数组 用stackalloc
比如Point_2F* array = stackalloc Point_2F[2];//这个是要求在c#非安全代码的上下文的
这样可以直接在栈区申请数组并获得指针(类似C语言的静态数组了...但是要考虑你这个对象的生命周期)