如何将可变长度结构传递给C#中的pinvoke C函数

时间:2014-11-28 06:08:35

标签: pinvoke

我的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

1 个答案:

答案 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;
}