c++ - PInvoke 返回带有二维数组的结构

标签 c++ interop pinvoke marshalling managed

我有在 中定义的结构Win32 DLL 如下所示:

typedef struct matrix
{
  double** data;
  int m;
  int n;
} Matrix;

还有一个函数:

矩阵 getMatrix(void);

Matrix getMatrix()
{
    Matrix mat;

    mat.m = 2;
    mat.n = 2;

    mat.data    = (double**)  malloc (sizeof(double*) * 4);

    mat.data[0] = (double* )  malloc (sizeof(double) * 2);
    mat.data[1] = (double* )  malloc (sizeof(double) * 2);

    mat.data [0][0]=1;
    mat.data [0][1]=2;
    mat.data [1][0]=3;
    mat.data [1][1]=4;

    return mat;
}

如果我在 C# 应用程序中使用 P/Invoke,我如何捕获此函数的返回值

最佳答案

我不确定它是否有效,但根据内存:将数据声明为 IntPtr 并使用它 :

static double[][] FromNative (IntPtr data, int m,int n)
{
   var matrix=new double[m][];

   for(int i=0;i<m;i++)
   {
       matrix[i]=new double[n];
       Marshal.Copy(Marshal.ReadIntPtr(data),matrix[i],0,n);
       data =(IntPtr)(data.ToInt64()+IntPtr.Size);
   }

   return matrix;
}

关于c++ - PInvoke 返回带有二维数组的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12561418/

相关文章:

c# - 使用平台调用 (C#) 在非托管代码中分配和释放内存

c# - 等效于 c# 中的 unsigned char *

c++ - 使用直接函数 VS std::invoke

c++ - 为什么我不能将 2 个 const char* 连接到一个 std::string?

c# - Excel 互操作货币格式

c# - 释放一个 Com 对象

c# - 从 native C++ 或 C 调用 C# 函数

c++ - 如果文件/目录大小增加到配置级别以上,有没有办法在 linux 中回调

c++ - gcc-4.8无法编译测试程序?

java - 如何使用 Kotlin 互操作强制泛型类型