我试图从我在C#程序中用C编写的DLL中获取一个字节数组。 DLL用于与NI 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,因此我可以看到正确的数据输出并返回。
我做错了什么?我无法看到它,这真的令人沮丧。感谢。
答案 0 :(得分:1)
安德罗,you nailed it。谢谢!松口气。我以前曾尝试过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
);