2013-06-02 100 views
0

我有一个C++ DLL,它导出使用structs作为输入和输出的函数。互操作性c c#结构序列

我想从C#应用程序调用DLL。在C++中struct定义看起来是这样的:

struct stIn 
{ 
    double A; 
    double B; 
    double C; 
    int D; 

    double dArray[3]; 
    double dArra2; 

    double E; 
    double mat[10][4]; 
    double F; 
    int G; 
} 

我已经宣布与LayoutKind.Sequential属性的C#结构。

在struct所述阵列被声明用[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]属性

垫被声明用[MarshalAs(UnmanagedType.SafeArray)]

我注意到内存中的数组布局不是按照声明的顺序 - 数组位于struct(内存序列是ABCDEFG,darray等)的“内存块”的末尾,并因此调用DLL函数返回错误的结果。

我错过了什么?垫子声明是否错误?是否有另一个属性来声明为了获得正确的参数序列到内存中?

谢谢。

+0

请在您的问题中包含您的C#结构定义 – shf301

+1

正如shf301所说,您需要在您的问题中包含C#结构定义,但乍一看,SafeArray不是'mat'的正确选择。看看[这个答案](http://stackoverflow.com/a/6197651/351301)有帮助。 – shambulator

+0

c#struct:[StructLayout(LayoutKind.Sequential)] public struct stIn {public double A;公共双B;公共双C; public int D; [MarshalAs(UnmanagedType.ByValArray,SizeConst = 3)] public double [] dArray; public double dArr2;公共双E; [MarshalAs(UnmanagedType.SafeArray)] public double [,] mat;公共双F; public int G;} – user346134

回答

1

感谢shambulator的链接我已经意识到错误确实是[,] mat属性。 它应该被声明为 [MarshallAs(UnmanagedType.ByValArray,SizeConst = 25)] 25行是否与列 - mat [5,5]相乘。