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?
Copies data from a managed array to an unmanaged memory pointer, or from an unmanaged memory pointer to a managed array.
The IntPtr type can be used by languages that support pointers and as a common means of referring to data between languages that do and do not support pointers. IntPtr objects can also be used to hold handles. For example, instances of IntPtr are used extensively in the System. IO.
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); } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With