gpt4 book ai didi

c# - PInvoke、指针和数组复制

转载 作者:太空狗 更新时间:2023-10-29 22:55:11 26 4
gpt4 key购买 nike

我们正在基于 c#、.net 4.0、Win7 x64、目标 x32 构建应用程序。

我们在我们的应用程序中使用了第 3 方库。我们知道这个库是用 C++ 编写的。但是,为了让 c# 开发人员使用这个库,他们使用 P/Invoke 对其进行了包装,这就是我们调用 API 函数的方式。

其中一个API调用如下:

ReadFromDevice(int deviceAddress, int numBytes, Byte[] data);

此函数从外部设备读取 numBytes 的数据并将其放入 data[]。如您所见,它希望看到一个 C# 字节数组作为第三个参数。现在,我们的问题是,我们想将数据读取到预先声明的数组中的任意位置。例如:

Byte[] myData = new Byte[1024*1024*16];
ReadFromDevice(0x100, 20000, &myData[350]) // Obviously not possible in C#

如果我们使用 C/C++,这将是微不足道的。鉴于底层 API 是用 C++ 编写的,我觉得我们也应该能够在 c# 中执行此操作,但是,我无法弄清楚如何在 c# 中执行此操作。也许我们可以不通过提供的 P/Invoke 接口(interface)以某种方式调用底层库并编写自定义接口(interface)?

如有任何想法,我们将不胜感激。

问候,

最佳答案

虽然这里的其他答案很接近,但没有一个是很完整的。

首先,您只需声明您自己的 p/invoke 声明。这是 p/invoke 的妙处;从来没有只有一种方法可以做到这一点。

[DllImport("whatever.dll")]
unsafe extern static void ReadFromDevice(int deviceAddress, int numBytes, byte* data);

现在你可以调用它了

unsafe static void ReadFromDevice(int deviceAddress, byte[] data, int offset, int numBytes)
{
fixed (byte* p = data)
{
ReadFromDevice(deviceAddress, numBytes, p + offset);
}
}

关于c# - PInvoke、指针和数组复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4895799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com