2008-11-14 28 views
20

實施例C API的簽名:如何將指針傳遞給在C#中使用p/invoke的數組?

void Func(unsigned char* bytes);

在C中,當我想傳遞一個指針數組,我可以這樣做:

unsigned char* bytes = new unsigned char[1000]; 
Func(bytes); // call 

如何翻譯上述API至P /調用,我可以傳遞一個指針到C#字節數組?

回答

31

傳遞字節數組的最簡單的方法是聲明參數在import語句作爲一個字節數組。

[DllImport EntryPoint="func" CharSet=CharSet.Auto, SetLastError=true] 
public extern static void Func(byte[]); 

byte[] ar = new byte[1000]; 
Func(ar); 

您還應該能夠將該參數聲明爲IntPtr並手動編制數據。

[DllImport EntryPoint="func" CharSet=CharSet.Auto, SetLastError=true] 
public extern static void Func(IntPtr p); 

byte[] ar = new byte[1000]; 
IntPtr p = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(byte)) * ar.Length); 
Marshal.Copy(ar, 0, p, ar.Length); 
Func(p); 
Marshal.FreeHGlobal(p); 
+0

第一種方法爲什麼會起作用,第二種方法不起作用。這是我在Windows Phone應用程序上面臨的問題。 – moubarak 2014-11-18 15:29:53

6

您可以使用不安全的代碼:如果你需要使用安全的代碼,你可以使用一些小技巧

unsafe 
{ 
    fixed(byte* pByte = byteArray) 
    IntPtr intPtr = new IntPtr((void *) pByte); 
    Func(intPtr); 
} 

IntPtr intPtr = Marshal.AllocHGlobal(Marshal.SizeOf(byteArray)); 
Marshal.Copy(byteArray, 0, intPtr, Marshal.SizeOf(byteArray)); 

Func(intPtr); 

Marshal.FreeHGlobal(intPtr); 

但是,安全的代碼將是緩慢恕我直言。

3

以下是本機功能的適當簽名。

[System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="Func")] 
public static extern void Func(System.IntPtr bytes) ; 
相關問題