C#中的非托管dll函数byte *参数返回

时间:2010-11-01 09:26:22

标签: c# byte unmanaged dllimport

我需要使用非托管VC ++ dll。

它有以下两个需要C#包装器的函数:

bool ReadData(byte* byteData, byte dataSize);
bool WriteData(byte* byteData, byte dataSize);

如果成功则返回true,否则返回false。

目前在C#中我有一个带有函数的类(WRAP):

[DllImport("kirf.dll", EntryPoint = "ReadData", SetLastError=true)]
[return: MarshalAs(UnmanagedType.VariantBool)]
public static extern Boolean ReadData([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)]out Byte[] bytesData, Byte dataSize);

[DllImport("kirf.dll", EntryPoint = "WriteRFCard", SetLastError = true)]
[return: MarshalAs(UnmanagedType.VariantBool)]
public static extern Boolean WriteRFCard[In]Byte[] bytesData, [In]Byte dataSize);

然后我

byte[] newData = new byte[17];
byte dataSize = 17;
bool result = WRAP.ReadData(out newData, dataSize);

这总是给我一个结果= false,newData = null,并且没有抛出错误(或者它总是回来成功)。

byte[] bytesData = new Byte[] { (byte)0x9B, (byte)0x80, (byte)0x12, (byte)0x38, (byte)0x5E, (byte)0x0A, (byte)0x74, (byte)0x6E, (byte)0xE6, (byte)0xC0, (byte)0x68, (byte)0xCB, (byte)0xD3, (byte)0xE6, (byte)0xAB, (byte)0x9C, (byte)0x00 };
byte dataSize = 17; 
bool actual = WRAP.WriteData(bytesData, dataSize);

关于我可能做错什么的任何想法?

修改

这就是我最终管理它的方式:

        [DllImport("kirf.dll", EntryPoint = "ReadData", SetLastError=true)]
        [return: MarshalAs(UnmanagedType.VariantBool)]
        public static extern Boolean ReadData([Out] Byte[] bytesData, Byte dataSize);

[DllImport("kirf.dll", EntryPoint = "WriteData", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.VariantBool)]
        public static extern Boolean WriteData([In] Byte[] bytesData, Byte dataSize);

Byte[] newData=new byte[17];
bool result = KABA_KIRF.ReadData(newData, (Byte)newData.Length);

bool result = KABA_KIRF.WriteData(data, datasize);

其中data是传递给函数的Byte[]参数。

1 个答案:

答案 0 :(得分:1)

ReadData是否创建了一个新的字节数组?否则,我认为bytesData不应该是out参数。

查看the PInvoke spec of ReadFile进行比较:

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool ReadFile(IntPtr hFile, [Out] byte[] lpBuffer,
   uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, IntPtr lpOverlapped);

lpNumberOfBytesRead是一个out参数,因为ReadFile会更改它的值。即如果为lpNumberOfBytesRead传递局部变量,ReadFile将更改堆栈上的值。另一方面,lpBuffer的值是更改:它仍然指向调用后的相同字节数组。 [In,Out] - 属性告诉PInvoke如何处理您传递的数组的内容