在C#中,調(diào)用API中的CopyMemory()
函數(shù)可以使用DllImport
特性來導(dǎo)入kernel32.dll
,然后使用Marshal.Copy()
方法來實(shí)現(xiàn)內(nèi)存拷貝。以下是一個示例:
首先,在代碼文件的頂部添加以下命名空間:
using System.Runtime.InteropServices;
然后,使用DllImport
特性導(dǎo)入kernel32.dll
,并聲明CopyMemory()
函數(shù):
[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]
public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);
接下來,可以在需要調(diào)用CopyMemory()
函數(shù)的地方使用以下代碼:
byte[] srcArray = { 1, 2, 3, 4, 5 };
byte[] destArray = new byte[srcArray.Length];
// 將源數(shù)組的內(nèi)容復(fù)制到目標(biāo)數(shù)組
GCHandle srcHandle = GCHandle.Alloc(srcArray, GCHandleType.Pinned);
GCHandle destHandle = GCHandle.Alloc(destArray, GCHandleType.Pinned);
CopyMemory(destHandle.AddrOfPinnedObject(), srcHandle.AddrOfPinnedObject(), (uint)srcArray.Length);
srcHandle.Free();
destHandle.Free();
// 打印目標(biāo)數(shù)組的內(nèi)容
foreach (byte b in destArray)
{
Console.WriteLine(b);
}
在上面的示例中,首先創(chuàng)建了源數(shù)組srcArray
和目標(biāo)數(shù)組destArray
。然后,使用GCHandle.Alloc()
方法將數(shù)組固定在內(nèi)存中,以獲取數(shù)組的內(nèi)存地址。接下來,調(diào)用CopyMemory()
函數(shù)將源數(shù)組的內(nèi)容復(fù)制到目標(biāo)數(shù)組。最后,使用GCHandle.Free()
方法釋放通過GCHandle.Alloc()
方法獲取的內(nèi)存地址。
注意:由于CopyMemory()
函數(shù)是將源數(shù)組的內(nèi)容直接復(fù)制到目標(biāo)數(shù)組中,因此請確保目標(biāo)數(shù)組的長度足夠大以容納源數(shù)組的內(nèi)容,以避免訪問越界錯誤。