c#结构序列的互操作性

Interoperability c c# struct sequence

本文关键字:互操作性 结构      更新时间:2023-10-16

我有一个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)]声明mat

我注意到内存中的数组布局不符合声明的顺序-数组位于struct的"内存块"的末尾(内存序列是A B C D E F G,数组等),因此调用DLL函数返回错误的结果。

我错过了什么?垫子申报有问题吗?是否有另一个属性声明,以获得正确的参数序列进入内存?

谢谢。

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