[英]Marshalling struct with embedded struct array to unmanaged code
我正在处理具有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变量并设置数组元素中的所有字段,然后从检测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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.