C#调用c++Dll 结构体数组指针的问题

参考文章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语言的静态数组了...但是要考虑你这个对象的生命周期)
原文地址:https://www.cnblogs.com/kissfu/p/3368073.html