我正在用C#写一个软件,它需要从一个以dll形式提供的C库中调用一个函数。
第一个月
它用对应于dataIndex
的数据填充所提供的长度为4096的数组buffer
。
在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);
字符串
这个库可以编译并运行,但是buffer总是只包含从0到65535的随机值。我也试过在DllImport语句中添加[In, Out]
,但是也没有用。以前,我写了一些工作C代码来使用这个库,但是不得不将代码库更改为C#,因为我被迫使用一个只存在于C#的库,所以我知道这个库可以工作。
C中的函数调用看起来像这样:
uint16_t Buffer[4096];
uint Respose = getFrame(Buffer, 1);
型
我的猜测是类型编组是不正确的,但我不知道如何正确地做。我研究了C#中的类型编组,但我找不到解决问题的方法。
如何使用这个库获取数据?是否有其他选择,可能使用IntPtr
或使用unsafe
手动阅读和转换该内存地址后面的数据?如何检查传递的内存是否实际上正在写入?
2条答案
按热度按时间ni65a41a1#
如果使用不安全的上下文(通常是与本机代码进行互操作的最简单方法),可以使用指向数组第一个元素的
fixed
指针,这样GC就不会移动它。字符串
brqmpdu12#
我找到了问题所在:我错误地使用了提供的库。由于没有文档,我联系了开发人员,我们能够解决它。数组一直正确地传输和编组,问题在于另一个函数调用。