C# 将带有嵌入式结构数组的结构编组到非托管代码
我正在处理的是一个商业检测DLL,它有一个C API,所以代码不能更改。我们使用DLLIMPORT在C代码中使用API例程。一个函数接受一个指向复杂结构的指针,而这一个对于我来说并不明显,我们是否可以封送它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; 我的
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代理,它似乎通过传递数据。