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

vybvopom  于 2023-11-16  发布在  C#
关注(0)|答案(2)|浏览(156)

我正在用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手动阅读和转换该内存地址后面的数据?如何检查传递的内存是否实际上正在写入?

ni65a41a

ni65a41a1#

如果使用不安全的上下文(通常是与本机代码进行互操作的最简单方法),可以使用指向数组第一个元素的fixed指针,这样GC就不会移动它。

ushort[] buffer = new ushort[4096];
      int response = 0;
      unsafe {
        fixed (ushort *pbuff = buffer) {
          response = getData(pbuff, 1);
        }
      }

字符串

brqmpdu1

brqmpdu12#

我找到了问题所在:我错误地使用了提供的库。由于没有文档,我联系了开发人员,我们能够解决它。数组一直正确地传输和编组,问题在于另一个函数调用。

相关问题