我正在处理具有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中的函数。这是我们的默认计划,除非可以做更直接的事情。
有什么想法吗?
答案 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;
}