我有一个C ++ DLL,它导出使用structs
作为输入和输出的函数。
我想从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#结构。
结构中的数组使用[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
属性
垫子用[MarshalAs(UnmanagedType.SafeArray)]
声明。
我注意到内存中的数组布局不是声明的顺序 - 数组位于struct
的“内存块”的末尾(内存序列是ABCDEFG,darray等) 。),因此对DLL函数的调用会返回错误的结果。
我错过了什么?垫声明错了吗?是否有另一个属性要声明才能将正确的参数序列存入内存?
感谢。
答案 0 :(得分:1)
感谢shambulator的链接我已经意识到错误确实在[,] mat属性中。 应该声明为 [MarshallAs(UnmanagedType.ByValArray,SizeConst = 25)] 25行是否与列相乘 - mat [5,5]。