如何通过引用从 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*