如何通过引用将字节数组从c#传递到c++; 我使用了C++中的函数。.dll是部分文档化的,创建它是为了从结果数据库中读取结果。该函数具有以下签名: cdb_get(int index, int kwh, int kwl, void *s, int *ls, int nrew);

如何通过引用将字节数组从c#传递到c++; 我使用了C++中的函数。.dll是部分文档化的,创建它是为了从结果数据库中读取结果。该函数具有以下签名: cdb_get(int index, int kwh, int kwl, void *s, int *ls, int nrew);,c#,c++,interop,marshalling,C#,C++,Interop,Marshalling,在许多情况下,我知道我正在读取的数据的结构,因此我可以创建一个具有正确格式的结构,并使用常规pInvoke读取它 但是在某些情况下,我需要知道数据的第一个字节,以确定正确的数据类型。理想情况下,我希望将数据读入字节数组,然后将其进一步转换为所需的结构。我想这样做: [DllImport("name_of_dll", CallingConvention = CallingConvention.Cdecl)] public static extern int cdb_get( int inde

在许多情况下,我知道我正在读取的数据的结构,因此我可以创建一个具有正确格式的结构,并使用常规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);

非常感谢您的帮助。

我无法发表评论,所以我写在这里。
您的问题似乎也是如此,它可能会对您有所帮助。

您可以获得指向非托管数据的指针。答案可能会有帮助。在链接的例子中,一个已知大小的C数组被传递给C++方法。我想通过引用传递一个数组,C++方法将数据存储在数组中,并传递回C。我想问题是,需要事先知道数组的大小才能分配内存,并且需要传递信息。