[英]Returning a byte array from a C dll to C#
我正在尝试从C#程序中用C编写的DLL中获取字节数组。 DLL用于与National Instruments USB-8451通信。 我正在尝试使用的函数将指向数组的指针作为输出参数返回。 我在网上针对此类问题找到的大多数问题/答案都具有将指针返回数组的功能(不使用参数)。
c中的函数具有以下原型。
int32 ni845xI2cWriteRead (
NiHandle DeviceHandle,
NiHandle ConfigurationHandle,
uInt32 WriteSize,
uInt8 * WriteData,
uInt32 NumBytesToRead,
uInt32 * ReadSize,
uInt8 * ReadData
);
在C#中,我具有以下代码来访问DLL。
[DllImport("NI845x.dll")]
public static extern Int32 ni845xI2cWriteRead(
IntPtr DeviceHandle,
IntPtr ConfigurationHandle,
UInt32 WriteSize,
byte[] WriteData,
UInt32 NumBytesToRead,
out UInt32 ReadSize,
out IntPtr ReadData
);
以下是我用来访问ni845xI2cWriteRead函数的代码。
Int32 err = 0;
IntPtr ptrToRead = IntPtr.Zero;
err = ni845xI2cWriteRead(DeviceHandle, I2CHandle, WriteSize,WriteData,
NumBytesToRead, out ReadSize, out ptrToRead);
byte[] rd = new byte[ReadSize];
Marshal.Copy(ptrToRead, rd,0, (int)ReadSize);
我遇到的问题是获取ReadData数组。 ReadSize返回正确。 我得到的字节数组似乎是相当随机的。 有时全零,有时具有(不正确的)值,有时我会遇到访问冲突错误。 我知道命令正在正确地从USB-8451发送和接收数据,因为我正在使用NI I / O Trace,因此我可以看到正确的数据传出并返回。
我究竟做错了什么? 我看不到,这真令人沮丧。 谢谢。
安德罗, 你钉了它 。 谢谢! 松口气。 我以前曾尝试过out byte[] ReadData
,但那没有用,但还没有尝试过byte[] ReadData
。 正确的DllImport在下面。
[DllImport("NI845x.dll")]
public static extern Int32 ni845xI2cWriteRead(
IntPtr DeviceHandle,
IntPtr ConfigurationHandle,
UInt32 WriteSize,
byte[] WriteData,
UInt32 NumBytesToRead,
out UInt32 ReadSize,
byte[] ReadData
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.