我有两个IntPtr
值,指向length
字节的某些数据区域。 length
的数量级为200k至400k。
int length = /* ..*/
IntPtr ptrSrc = /*.. */;
IntPtr ptrDst = /* .. */;
现在,我想将数据从
ptrSrc
复制到ptrDst
。这段代码可以正常工作: byte[] data = new byte[length];
Marshal.Copy(ptrSrc, data, 0, length);
Marshal.Copy(data, 0, ptrDst, length);
但是它的缺点是需要一个额外的临时(可能很大)数组。不幸的是,我无法在.NET框架中找到
Marshal.Copy
变体来直接从IntPtr
复制到IntPtr
,因此我正在寻找替代方法。我对可在32位Windows和64位Windows上运行的解决方案感兴趣。有什么建议?
最佳答案
您可以P/调用适当的C函数。那可能是最简单的方法。示例:
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);
}
}
关于c# - 将数据从IntPtr复制到IntPtr,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15975972/