0

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

我错过了什么?垫子声明错了吗?为了将正确的参数序列放入内存,是否需要声明另一个属性?

谢谢。

4

1 回答 1

1

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

于 2013-06-03T07:10:15.730 回答