C# 将数据从IntPtr复制到IntPtr

C# 将数据从IntPtr复制到IntPtr,c#,intptr,C#,Intptr,我有两个IntPtr值,它们指向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, p

我有两个
IntPtr
值,它们指向
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 framework中找不到用于直接从
IntPtr
复制到
IntPtr
Marshal.Copy
变体,因此我正在寻找替代方案


我对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);
    }
}

我认为答案需要在.NET4.6中更新

 Buffer.MemoryCopy Method (Void*, Void*, Int64, Int64)
此方法将sourceBytesToCopy字节从源指定的地址复制到目标指定的地址。如果缓冲区重叠且目标减去源之间的差值小于sourceBytesToCopy,则源块将按相反顺序复制到目标块

因此,如果您不在4.6或通用windows app 10上,请使用前面的答案。

正如现代答案一样,它是.NET core 1.0、.NET standard 1.3和.NET framework 4.6的一部分

以下是您在上下文中如何使用它:

Buffer.MemoryCopy(ptrSrc.ToPointer(), ptrDest.ToPointer(), length, length) 

你能使用不安全的吗?@driis:是的,那是可能的
memcpy
复制字节,因此不存在指针大小或字边界问题。C#marhsalling将负责为底层C函数提供正确的指针大小。我可以假设msvcrt安装在用户计算机上,还是必须提供自己的?我的意思是,32位和64位窗口有不同的msvcrt.dll,对吗?我不担心指针大小。更新时,您可能需要使用内置的Win32函数来确保该函数可用。我从
kernel32.dll
更新了示例以使用
CopyMemory
。您的解决方案在64位模式和32位模式下(在交换源和目标之后;-)似乎都能正常工作,请参见我对您答案的编辑。Count arg在64位平台上为64位,在32位平台上为32位。我想这不会导致ABI问题,因为x86是little endian(因此在64位上,32位部分仍将被完全复制并正确解释),但更准确的P/INVOKE应该在两个不同的签名之间切换,具体取决于32/64位平台。感谢此更新。确定此解决方案也适用于UWP应用程序?我想被接受的答案是不会的。是的,当你在C#中直接访问内存时,这是正常的。C是C++,在这种情况下,这种行为更常见。