C P Invoke中傳遞陣列引數

2022-07-05 16:06:08 字數 1623 閱讀 2371

c#在呼叫動態庫介面,有時需要在c#中分配非託管記憶體,以便動態庫可以寫入返回的資料;有時我們需要傳遞乙個複雜的陣列等等。在c++的方法原型中,是乙個*即指標,在c#的方法原型,相對應的可以是intptr,有些也可以直接使用[out,in]等屬性。

對於基礎陣列的陣列,可以使用

byte photodata = new byte[compressphotosize];

gchandle gh = gchandle.alloc(photodata, gchandletype.pinned);

intptr addrofphotodata = gh.addrofpinnedobject();

來獲取到陣列的開始指標。但對於具有非基元(非直接複製到本機結構中的)成員的例項不能被固定。即屬性中有如字串等屬性的結構體,就不能被固化,會報argumentexception異常。這時我們就要手動分配記憶體了。

基本的成員方法有如下一些

///

/// 非託管**輔助工具。

///

public class marshalhelper

return rroot;

}///

/// 從非託管的記憶體資料轉換成託管資料。

///

/// 結構的型別

/// 資料指標

/// 陣列的長度

///

public static t stuctarrayfromintptr(intptr outarray, int size) where t : new()

marshal.freecotaskmem(outarray);

return resarray;

}///

/// 將資料從託管物件封送到非託管記憶體塊。使用完得釋放指標。

///

///

///

///

public static intptr structuretoptr(t structure) where t : new()

///

/// 從指標中獲取乙個結構。

///

///

///

///

public static t ptrtostructure(intptr ptr) where t : new()

public static void freehglobal(ref intptr ptr)

///

/// 把乙個結構轉為乙個byte陣列。

///

///

///

///

public static byte structtobytes(t structure) where t : new()

finally

//2、byte轉換為struct

///

/// 把陣列轉為結構。

///

///

///

///

public static t bytestostruct(byte bytes) where t : new()

finally

}通過上方法獲取到指標,傳到動態庫就行了,記得,操作完成後得顯式刪除該指標所分配的記憶體,以免產生洩露。

C 中陣列引數傳遞

include 傳遞陣列引數的幾種方式 void printvalues const int a 10 void printvalues2 int a 10 控制邊界 方法1 void printvalues4 int start,int end void printvalues5 const in...

C 中傳遞陣列引數

將陣列作為引數進行傳遞有兩種傳遞方法,一種是 function int a 另一種是 function int a 這兩種兩種方法在函式中對陣列引數的修改都會影響到實參本身的值!對於第一種,根據之前所學,形參是實參的乙份拷貝,是區域性變數。但是陣列是個例外,因為陣列的資料太多了,將其一一賦值既麻煩又...

頁面傳遞陣列引數

1 將陣列轉化成字串,用特殊字元如 將陣列的元素隔開,用普通的字串引數傳遞 2 使用json方式傳遞引數 解析c 後台得到的是個string objstr內容 從js陣列中解析出json物件返回該物件的字串表示 private static string getjsonstr string arra...