我们正在 c#、.net 4.0、Win7 x64 上构建一个应用程序,目标为 x32。
我们在我们的应用程序中使用第三方库。我们知道这个库是用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 接口来调用底层库并编写自定义接口?
任何想法,将不胜感激。
Regards,
虽然这里的其他答案很接近,但没有一个是完全完整的。
首先,您只需声明您自己的 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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)