我有两个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/

10-13 05:56