C# 将带有嵌入式结构数组的结构编组到非托管代码

C# 将带有嵌入式结构数组的结构编组到非托管代码,c#,arrays,struct,marshalling,dllimport,C#,Arrays,Struct,Marshalling,Dllimport,我正在处理的是一个商业检测DLL,它有一个C API,所以代码不能更改。我们使用DLLIMPORT在C代码中使用API例程。一个函数接受一个指向复杂结构的指针,而这一个对于我来说并不明显,我们是否可以封送它 typedef struct eibuf { unsigned short buftype; struct { unsigned char etype; unsigned int edata; } error[33]; } EIBUF; 我的

我正在处理的是一个商业检测DLL,它有一个C API,所以代码不能更改。我们使用DLLIMPORT在C代码中使用API例程。一个函数接受一个指向复杂结构的指针,而这一个对于我来说并不明显,我们是否可以封送它

typedef struct eibuf
{
   unsigned short buftype;
   struct
   {
      unsigned char etype;
      unsigned int edata;
   } error[33];
} EIBUF;
我的研究表明,C#structs中唯一允许的固定数组是那些具有原始数据的数组,因此我无法构造等效的数据类型

处理这一问题的一种方法是在C中创建一个接口包装器,它将结构展平为整数类型的数组,当然可以很容易地从C代码中封送

包装器函数只需声明一个EIBUF变量并设置数组元素中的所有字段,然后使用该变量从instrumentation API调用该函数。这是我们的默认计划,除非有更直接的事情可以做


有什么想法吗?

这是可能的。只需为错误项声明显式结构类型:

[StructLayout(LayoutKind.Sequential)]
struct ErrorDescriptor
{
      Byte etype;
      Uint32 edata;
}

[StructLayout(LayoutKind.Sequential)]
struct EIBUF
{
   Uint16 buftype;
   [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 33)]
   ErrorDescriptor[] error;
}

看起来很结实。我尝试了一个虚拟的DLL代理,它似乎通过传递数据。