我的C structure
格式为:
typedef struct pt_data {
int Length; ///< Length of the Data field in bytes
uchar Data[1]; ///< The data itself, variable length
} PT_DATA;
我的C function
就是这样:
PT_STATUS PTSetFingerData (
IN PT_CONNECTION hConnection,
IN PT_LONG lSlotNr,
IN PT_DATA *pFingerData
)
现在我想在C#
中为这个函数添加一个包装器。
我该怎么做?特别是,如何将C# PT_DATA struct
传递给PT_DATA C struct
?
答案 0 :(得分:0)
您需要手动编组数据。 p / invoke marshaller无法编组可变长度结构。
在您的情况下,显而易见的方法是在您的p / invoke中将PTDATA*
参数声明为byte[]
。然后你只需要在调用函数之前填充字节数组。前4个字节是后续数据的长度。
static byte[] GetPTData(byte[] arr)
{
byte[] len = BitConverter.GetBytes(arr.Length);
byte[] data = new byte[sizeof(int) + arr.Length];
Array.Copy(len, data, sizeof(int));
Array.Copy(arr, 0, data, sizeof(int), arr.Length);
return data;
}