I have two IntPtr
values pointing to some data areas of length
bytes. length
may have an order of magnitude of 200k to 400k.
int length = /* ..*/
IntPtr ptrSrc = /*.. */;
IntPtr ptrDst = /* .. */;
Now I want to copy the data from ptrSrc
to ptrDst
. This code works fine:
byte[] data = new byte[length];
Marshal.Copy(ptrSrc, data, 0, length);
Marshal.Copy(data, 0, ptrDst, length);
but it has the drawback of needing an additional temporary (potentially huge) array. Unfortunately, I could not find a Marshal.Copy
variant in the .NET framework for copying directly from IntPtr
to IntPtr
, so I am looking for alternatives.
I am interested in a solution which works on 32-bit Windows as well as 64-bit Windows. Any suggestions?
You can P/Invoke into the appropiate C function. That is probably the easiest way of doing that. Example:
class Program
{
[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]
public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);
static void Main()
{
const int size = 200;
IntPtr memorySource = Marshal.AllocHGlobal(size);
IntPtr memoryTarget = Marshal.AllocHGlobal(size);
CopyMemory(memoryTarget,memorySource,size);
}
}