互操作性c c#struct sequence

时间:2013-06-02 20:56:16

标签: c# c++

我有一个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函数的调用会返回错误的结果。

我错过了什么?垫声明错了吗?是否有另一个属性要声明才能将正确的参数序列存入内存?

感谢。

1 个答案:

答案 0 :(得分:1)

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