2010-06-02 49 views
2

我試圖寫一個包裝,這樣我的C#應用​​程序可以使用C語言編寫的 這裏一個DLL的是,我想換一個方法定義:C#包裝

void methodA(const uint32_t *data); //c header declaration 

我遇到的問題是想弄清楚如何從c#中提供一個等價的指針。在c#我希望它運行在:

UInt32 data[] //my c# object i want to be able to pass in 

但我如何給我的包裝等價的指針?我試過

ref data //my attempt at giving an equivalent pointer to the DLL 

但這似乎沒有工作。在DLL中使用調試語句我可以看到,它獲得的值不是我想要通過的。

所以我的問題歸結爲我有正確的包裝ac函數使用指針引用一個數組?

回答

3

一個數組已經是一個引用,所以它將被編組爲一個指向它的指針。這應該工作:

[DllImport("my.dll")] 
static extern void methodA(UInt32[] data); 

如果需要回數據傳遞到託管代碼,你需要裝飾與Out attribute參數:

[DllImport("my.dll")] 
static extern void methodA([In, Out] UInt32[] data); 

用法:

uint[] data = new uint[] { 1, 2, 3, 4, 5 }; 
methodA(data); 
Console.WriteLine(data[0]); 

另一種解決方案是聲明該參數爲IntPtr類型:

[DllImport("my.dll")] 
static extern void methodA(IntPtr data); 

爲了做到這一點,您需要固定數組以獲取IntPtr,或者在非託管空間中分配內存並將數組內容複製到其中。不過,我不會推薦這些選項。

[DllImport("my.dll")] 
static extern void methodB(ref UInt32 data); 
1

P中聲明用了methodA的IntPtr參數/調用的聲明:如果你想通過引用傳遞值類型的單個值


ref是必需的。要將UInt32陣列轉換爲非託管陣列,請使用Marshal.Copy Method (Int32[], Int32, IntPtr, Int32)。從這篇文章

代碼示例是給你的好,叫這個了methodA行後:

Marshal.Copy(managedArray, 0, pnt, managedArray.Length); 
// now call methodA with pmt parameter