.NET 4.6之前的Buffer.MemoryCopy的最佳替代方案

Loo*_*cid 5 .net c#

我正在尝试将某些.NET 4.6代码降级到.NET 4.5.

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

fixed (byte* destination = dataBytes)
{
    Buffer.MemoryCopy(data, destination, dataLength, dataLength);
}
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

AAA*_*ddd 6

你是对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];
Run Code Online (Sandbox Code Playgroud)

如果所有其他方法都失败了,您可以从msvcrt.dll中取消memcpy

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

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

Unsafe.CopyBlock方法

CopyBlock(Void*, Void*, UInt32)
Run Code Online (Sandbox Code Playgroud)

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


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

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