首页 > 解决方案 > Buffer.MemoryCopy pre .NET 4.6 的最佳替代品

问题描述

我正在尝试将一些 .NET 4.6 代码降级为 .NET 4.5。

这是我目前正在使用的代码块:

fixed (byte* destination = dataBytes)
{
    Buffer.MemoryCopy(data, destination, dataLength, dataLength);
}

databyte*类型,所以我不知道是否Buffer.BlockCopy()是一个合理的替代品,因为它需要数组。

有任何想法吗?

标签: c#.net

解决方案


您是对的,Buffer.MemoryCopy即 .Net 4.6 或更高版本,Buffer.BlockCopy没有所需的重载,也不存在Array.Copy问题。

您可以使用以下内容,但它会很慢

fixed (byte* pSource = source, pTarget = target)
    for (int i = 0; i < count; i++)
        pTarget[targetOffset + i] = pSource[sourceOffset + i];

如果一切都失败了,您可以从 msvcrt.dll pinvoke memcpy

[DllImport("msvcrt.dll", EntryPoint = "memcpy", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
public static extern IntPtr memcpy(IntPtr dest, IntPtr src, UIntPtr count);

同样对于 .Net 4.5,您可以使用System.Runtime.CompilerServices.Unsafe

Unsafe.CopyBlock 方法

CopyBlock(Void*, Void*, UInt32)

将指定为长整数值的多个字节从内存中的一个地址复制到另一个地址。


最后,Marshal.Copy如果您不介意以数组结尾,则可以使用。但是它没有指向指针重载的指针。

将数据从托管数组复制到非托管内存指针,或从非托管内存指针复制到托管数组。


推荐阅读