zoukankan      html  css  js  c++  java
  • 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语言的静态数组了...但是要考虑你这个对象的生命周期)
  • 相关阅读:
    Animation(三)
    布局
    AutoCommpleteText
    PHP数组中常用函数
    Animation(四)
    转:JAVA内存映射文件
    Ubuntu安装jdk
    转:Java NIO 详解
    转:长连接与短连接
    Direct or Nondirect ByteBuffer
  • 原文地址:https://www.cnblogs.com/kissfu/p/3368073.html
Copyright © 2011-2022 走看看