将字节数组从C dll返回到C#

时间:2016-11-07 20:43:26

标签: c# c arrays dll dllimport

我试图从我在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,因此我可以看到正确的数据输出并返回。

我做错了什么?我无法看到它,这真的令人沮丧。感谢。

1 个答案:

答案 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    
        );