【发布时间】: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 回答可能会有所帮助。
标签: c# c++ interop marshalling