c# - 我们如何复制两个均由 Marshal.AllocHGlobal 分配的缓冲区?

标签 c# pinvoke unsafe

Marshal 中有多种方法可以将 AllocHGlobal 分配的原始缓冲区复制到 C# 数组或从 C# 数组复制。但我的问题是,我有两个缓冲区都是由 AllocHGlobal 分配的,我想简单地将一个缓冲区复制到另一个缓冲区。

var buffer1 = Marshal.AllocHGlobal(size);
var buffer2 = Marshal.AllocHGlobal(size);
nativeOpOn(buffer1);
SomeCopy(buffer1, buffer2, size);

我知道一种可能的解决方案是为 memcpy P/Invoke 系统 C lib,但随后我必须编写不同的 P/Invoke 来支持 Windows、Linux 和 MacOS,因为它们可能有不同的P/调用东西。

最佳答案

如果您使用的是.Net 4.6或更高版本,则可以使用Buffer.MemoryCopy() :

unsafe
{
    Buffer.MemoryCopy(p1.ToPointer(), p2.ToPointer(), destSizeBytes, sourceBytesToCopy);
}

当然,这是不安全

关于c# - 我们如何复制两个均由 Marshal.AllocHGlobal 分配的缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35175162/

相关文章:

c# - 如何使用 EWS 获取电子邮件正文、收据、发件人和抄送信息?

c# - 为什么 "UInt64[] arr=new UInt64[UInt64.MaxValue];"抛出异常?

c# - 如何在 Windows 窗体上动态绑定(bind)数据源到 ReportViewer C#

c# - 无法使用 pinvoke 将 WM_CLOSE 发送到 Windows 资源管理器窗口

c# - 宪兵不安全代码检测

c# - 使用 View 注册演示者

c# - 在 C++ 和 C# ByRef 之间传递字节数组引发 AccessViolationException

c# - 哪些 `IntPtr` 风格是 `SafeHandle` 的候选者

syntax - 将结构成员替换为使用先前值的新值

c# - 使用表达式树调用不安全方法