2013-02-23 124 views
0

這是頭文件的簽名和C代碼,我想在C#中使用:PInvoke的 - 方法的類型簽名不是的PInvoke兼容

__declspec(dllexport) emxArray_real_T *emxCreateWrapper_real_T(real_T *data, int32_T rows, int32_T cols); 

struct emxArray_real_T 
{ 
    real_T *data; 
    int32_T *size; 
    int32_T allocatedSize; 
    int32_T numDimensions; 
    boolean_T canFreeData; 
}; 

emxArray_real_T *emxCreateWrapper_real_T(real_T *data, int32_T rows, int32_T 
    cols) 
{ 
    emxArray_real_T *emx; 
    int32_T size[2]; 
    int32_T numEl; 
    int32_T i; 
    size[0] = rows; 
    size[1] = cols; 
    emxInit_real_T(&emx, 2); 
    numEl = 1; 
    for (i = 0; i < 2; i++) { 
    numEl *= size[i]; 
    emx->size[i] = size[i]; 
    } 

    emx->data = data; 
    emx->numDimensions = 2; 
    emx->allocatedSize = numEl; 
    emx->canFreeData = FALSE; 
    return emx; 
} 

目前我想在C#如下調用它:

[DllImport(@"C:\bla\bla.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern emxArray_real_T emxCreateWrapper_real_T(double[,] data, int rows, int cols); 

double[,] array2D = new double[,] { { 1 }, { 3 }, { 5 }, { 7 } }; 
var x = emxCreateWrapper_real_T(array2D, 1, 4); 

,但得到:

Method's type signature is not PInvoke compatible. 

emxArray_real_T目前看起來是這樣的:

[StructLayout(LayoutKind.Sequential)] 
public struct emxArray_real_T 
{ 
    //public IntPtr data; 
    //public IntPtr size; 
    double[] data; 
    int[] size; 
    public int allocatedSize; 
    public int numDimensions; 
    [MarshalAs(UnmanagedType.U1)] 
    public bool canFreeData; 
} 
+0

什麼是'emxArray_real_T'?問題可能在於這個方向。 – 2013-02-23 08:47:03

回答

1

存在多個問題。首先你的C++函數返回一個指針(emxArray_real_T *),但是你的導入聲明返回一個結構。這是行不通的。另外,您在導入聲明中將數據聲明爲double [,],但在結構中聲明爲double []。建議:

  • 一類
  • 更換結構確定數據是否應該是一個double []或雙[,]
  • 同時檢查real_T的最終大小。我相信這是一個依賴於平臺的變量,可以是浮點(32位)或雙精度(64位)。
+0

我已經完成了你的建議,但得到了:嘗試讀取或寫入受保護的內存。這通常表明其他內存已損壞。順便說一句,typedef雙real_T - 我已經使用C#double沒有問題在過去real_T ... – cs0815 2013-02-23 09:15:40

+0

是的,所以你已經走過了第一步。現在你還有其他問題。我相信你在這裏有另一個關於正確封送這個emxArray_real_T的問題。你做了什麼建議?如果您需要更多幫助,請粘貼完整的C++結構定義。 – 2013-02-23 09:17:52

+0

會寫另一個問題。謝謝! – cs0815 2013-02-23 09:18:23