3

Win32DLLで定義されている構造体を持っています:

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

そして、機能があります:

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;
}

P/InvokeC#アプリケーションから使用している場合、この関数の戻り値を取得するにはどうすればよいですか?

4

2 に答える 2

5

それが機能するかどうかはわかりませんが、メモリから:データを 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;
}
于 2012-09-24T09:19:31.620 に答える
1

答えは短いですが、残念です。多次元配列を一次元配列に変換する必要があります。

AllocHGlobalを使用した答えがあります:マネージコードからアンマネージコードに多次元配列を渡す

このソリューションは同様のことを行いますが、あなたの場合のC#定義では、dataフィールドをIntPtrタイプにする必要があり、アンマネージコードでは、それが1次元配列であると想定する必要があります。

Marshal.UnsafeAddrOfPinnedArrayElementMSDNStackOverflow )を使用する別の解決策がありますが、それでも1次元配列を使用していることを前提としています。

あなたが解決しようとしている問題が何であるかをあなたが言うならば、より良いオプションが続くでしょう。それは、純粋に1つの非常に重要な機能からの復帰であり、このPInvokeを忘れているのでしょうか、それとも、一定の双方向マーシャリングを実行しようとしているのでしょうか。

于 2012-09-24T08:54:23.183 に答える