我正在使用C#中的c ++ .dll中的函数。 .dll已部分记录在案,它的创建是为了从结果数据库中读取结果。该函数具有以下签名:
cdb_get(int index, int kwh, int kwl, void *s, int *ls, int nrew);
在许多情况下,我知道我正在读取的数据的结构,因此我可以创建具有正确格式的结构,然后使用常规pInvoke将其读入。
但是,在某些情况下,我需要知道数据的第一个字节以找出正确的数据类型。因此,理想情况下,我希望将数据读取到字节数组中,然后将其进一步转换为所需的结构。我想做这样的事情:
[DllImport("name_of_dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int cdb_get(
int index,
int kwh,
int kwl,
ref byte[] data,
ref int dataLen,
int pos);
但这似乎不起作用(理论上应该吗?)。有没有办法使它与字节数组一起工作并通过引用传递它?
到目前为止,我一直在使用IntPtr进行手工编组,以实现这一目标。但是我需要猜测指针的大小,这是不可避免的吗?有没有其他方法来处理编组?
IntPtr data = Marshal.AllocHGlobal(128);
int size = 128;
int returnValue = cdbGet(index, kwh, kwl, data, ref size, 1);
byteArray = new byte[size];
Marshal.Copy(data, byteArray, 0, size);
Marshal.FreeHGlobal(data);
感谢您的帮助,非常感谢。