如何使用 PInvoke 将数组指针从 C# 传递到 C 库

问题描述 投票:0回答:1

我正在用 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
并手动读取和翻译该内存地址后面的数据?如何检查传递的内存是否真正被写入?

c# pointers pinvoke
1个回答
0
投票

也许您忘记将 dll 文件放在可执行文件旁边。有吗?

© www.soinside.com 2019 - 2024. All rights reserved.