2010-11-01 133 views
2

我需要使用非託管VC++ dll。非託管dll函數字節*參數在C#中返回

它需要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); 

這總是給我一個結果=假,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); 

其中數據是傳遞給函數的Byte[]參數。

+0

您是否確認函數在非託管代碼中工作?一個簡單的C線束? – 2010-11-01 09:36:23

回答

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是一個不折不扣PARAM,因爲ReadFile的改變了它的價值。即如果您通過lpNumberOfBytesRead的本地變量,則ReadFile將更改堆棧中的值。另一方面,lpBuffer的值是而不是已更改:在調用後它仍指向相同的字節數組。 [In,Out] - 屬性告訴PInvoke如何處理您傳遞的數組的內容

相關問題