我正在用 C# 编写一个软件,它需要调用以 dll 形式提供的 C 库中的函数。在这个库里面,有一个函数叫做
getData(uint16_t *buffer, const uint16_t dataIndex)
填充提供的数组
buffer
,其长度为 4096,其中数据对应于 dataIndex
.
在C#中,我尝试了以下方法来调用这个函数:
[DllImport(DllPath, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
static private extern int getData(ushort[] buffer, ushort dataIndex);
ushort[] buffer = new ushort[4096];
int response = getData(buffer, 1);
此编译并运行,但是缓冲区始终仅包含从 0 到 65535 的随机值。我还尝试将
[In, Out]
添加到 DllImport 语句,但它也没有帮助。之前,我编写了一些可用的 C++ 代码来使用该库,但不得不将代码库更改为 C#,因为我被迫使用仅适用于 C# 的库,所以我知道该库可以工作。
C++ 中的函数调用如下所示:
uint16_t Buffer[4096];
uint Respose = getFrame(Buffer, 1);
我的猜测是类型编组在某种程度上不正确,但我不知道如何正确执行。我研究了 C# 中的类型编组,但找不到问题的解决方案。
如何使用该库获取数据?是否还有其他选择,也许使用
IntPtr
或使用 unsafe
并手动读取和翻译该内存地址后面的数据?如何检查传递的内存是否真正被写入?
也许您忘记将 dll 文件放在可执行文件旁边。有吗?