實施例C API的簽名:如何將指針傳遞給在C#中使用p/invoke的數組?
void Func(unsigned char* bytes);
在C中,當我想傳遞一個指針數組,我可以這樣做:
unsigned char* bytes = new unsigned char[1000];
Func(bytes); // call
如何翻譯上述API至P /調用,我可以傳遞一個指針到C#字節數組?
實施例C API的簽名:如何將指針傳遞給在C#中使用p/invoke的數組?
void Func(unsigned char* bytes);
在C中,當我想傳遞一個指針數組,我可以這樣做:
unsigned char* bytes = new unsigned char[1000];
Func(bytes); // call
如何翻譯上述API至P /調用,我可以傳遞一個指針到C#字節數組?
傳遞字節數組的最簡單的方法是聲明參數在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);
您可以使用不安全的代碼:如果你需要使用安全的代碼,你可以使用一些小技巧
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);
但是,安全的代碼將是緩慢恕我直言。
以下是本機功能的適當簽名。
[System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="Func")]
public static extern void Func(System.IntPtr bytes) ;
第一種方法爲什麼會起作用,第二種方法不起作用。這是我在Windows Phone應用程序上面臨的問題。 – moubarak 2014-11-18 15:29:53