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

时间:2014-08-06 17:36:26

标签: c# arrays struct marshalling dllimport

我正在处理具有C API的商业工具DLL,因此代码无法更改。我们使用DLLIMPORT在C#代码中使用API​​例程。一个函数需要一个指向复杂结构的指针,这个对我来说不是很明显,我们是否可以编组它。

typedef struct eibuf
{
   unsigned short buftype;
   struct
   {
      unsigned char etype;
      unsigned int edata;
   } error[33];
} EIBUF;

我的研究表明,C#结构中允许的唯一固定数组是具有原始数据的数组,因此我无法构建等效的数据类型。

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

[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;
}