c#中Marshal.Copy()方法的使用
c#中Marshal.Copy方法的使用
Marshal.copy()方法用來在託管物件(陣列)和非託管物件(IntPtr)之間進行內容的複製
函式有很多過載,如下所示:
Copy(array<Byte>[]()[], Int32, IntPtr, Int32) 將一維的託管 8 位無符號整數陣列中的資料複製到非託管記憶體指標。
Copy(array<Char>[]()[], Int32, IntPtr, Int32) 將資料從一維的託管字元陣列複製到非託管記憶體指標。
Copy(array<Double>[]()[], Int32, IntPtr, Int32) 將資料從一維的託管雙精度浮點陣列複製到非託管記憶體指標。
Copy(array<Int16>[]()[], Int32, IntPtr, Int32) 將資料從一維的託管 16 位帶符號整數陣列複製到非託管記憶體指標。
Copy(array<Int32>[]()[], Int32, IntPtr, Int32) 將資料從一維的託管 32 位帶符號整數陣列複製到非託管記憶體指標。
Copy(array<Int64>[]()[], Int32, IntPtr, Int32) 將資料從一維的託管 64 位帶符號整數陣列複製到非託管記憶體指標。
Copy(IntPtr, array<Byte>[]()[], Int32, Int32) 將資料從非託管記憶體指標複製到託管 8 位無符號整數陣列。
Copy(IntPtr, array<Char>[]()[], Int32, Int32) 將資料從非託管記憶體指標複製到託管字元陣列。
Copy(IntPtr, array<Double>[]()[], Int32, Int32) 將資料從非託管記憶體指標複製到託管雙精度浮點陣列。
Copy(IntPtr, array<Int16>[]()[], Int32, Int32) 將資料從非託管記憶體指標複製到託管 16 位帶符號整數陣列。
Copy(IntPtr, array<Int32>[]()[], Int32, Int32) 將資料從非託管記憶體指標複製到託管 32 位帶符號整數陣列。
Copy(IntPtr, array<Int64>[]()[], Int32, Int32) 將資料從非託管記憶體指標複製到託管 64 位帶符號整數陣列。
Copy(IntPtr, array<IntPtr>[]()[], Int32, Int32) 將資料從非託管記憶體指標複製到託管 IntPtr 陣列。
Copy(IntPtr, array<Single>[]()[], Int32, Int32) 將資料從非託管記憶體指標複製到託管單精度浮點陣列。
Copy(array<IntPtr>[]()[], Int32, IntPtr, Int32) 將資料從一維託管 IntPtr 陣列複製到非託管記憶體指標。
Copy(array<Single>[]()[], Int32, IntPtr, Int32) 將資料從一維的託管單精度浮點陣列複製到非託管記憶體指標。
這裡需要注意的是兩個引數Int32型別的使用
Int32型別的兩個引數都是用來限定陣列的,其中一個限定開始位置,一個限定長度
注意:長度是指陣列元素的個數,而不是指位元組數
示例:
很經典哦
- string name = "xuwei";
- IntPtr pName = Marshal.AllocHGlobal(2*name.Length);
- Marshal.Copy(name.ToCharArray(), 0, pName, name.Length);
- char[] cName = newchar[name.Length];
- Marshal.Copy(pName, cName, 0, name.Length);
易知name.Length=5
(1) 給pName指標分配了2*name.Length位元組的空間注意:Marshal.AllocHGlobal(Int32 cb)中的引數cb是分配的位元組數
(2) 將name轉換的char[]中的內容複製到pName所指的記憶體中,所取長度為char的個數,即name.Length
(3) 給cName分配name.Length個char位置
(4) 將pName中的內容複製到cName陣列中,長度同樣為name.Length
原文地址:http://blog.csdn.net/xiaobai1593/article/details/7065955