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

Posted

技术标签:

【中文标题】如何通过引用从 c# 到 c++ 传递字节数组【英文标题】:How can I pass a byte array by reference from c# to c++ 【发布时间】:2020-04-11 13:30:49 【问题描述】:

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

感谢任何帮助,非常感谢。

【问题讨论】:

您可以获得指向非托管数据的指针。 This 回答可能会有所帮助。 【参考方案1】:

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

【讨论】:

在链接的示例中,一个已知大小的 C# 数组被传递给 C++ 方法。我想通过引用传递一个数组,C++ 方法将数据存储在数组中,然后传回 C#。我想问题是,需要事先知道数组的大小才能分配内存,并且需要传递这些信息。

以上是关于如何通过引用从 c# 到 c++ 传递字节数组的主要内容,如果未能解决你的问题,请参考以下文章

将字节数组从 c++ 传递到 c# 程序集都有哪些不同的方法?

将字节数组从 C# 传递到 C++ DLL 作为 char*

将字节数组从 Unity C# 传递到 C++ 库方法

使用 Dllimport 将一个非常大的字符串作为字节数组从 C++ 传递到 C#

将 C# 3D 数组作为 1D 字节数组传递给 C++ 库

C# 程序无法从 C++ COM 程序中获取字节数组