如何通过引用将字节数组从c#传递到c ++

时间:2020-04-11 13:30:49

标签: c# c++ interop marshalling

我正在使用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);

感谢您的帮助,非常感谢。

1 个答案:

答案 0 :(得分:1)

我无法发表评论,所以我在这里写。 This对您的问题似乎相同,可能会对您有所帮助。