将非托管字节数组写入内存映射文件

Write unmanaged byte array to memory mapped file

有没有一种方法可以将非托管内存传输到内存映射文件中,而无需先编组非托管内存?

我正在使用 API,它通过委托为我提供翻录的 PDF 数据。我得到一个指向数据的 IntPtr,然后我使用该数据将非托管字节数组编组为托管字节数组。然后我将该数组写入内存映射文件。我没有对字节数组进行任何处理。我所做的就是将数组写入内存映射文件,然后在稍后的某个时间点,我从文件中读回数据并将其通过网络发送到另一个应用程序(不是 .Net 应用程序)。

有没有一种方法可以在不封送处理的情况下做到这一点?有没有办法可以将非托管数据直接写入内存映射文件?

private void Callback( IntPtr data, int length )
{
    var buffer = new byte[ length ];
    Marshal.Copy( data, buffer, 0, length );
    _memoryMappedViewStream.Write( buffer, 0, length );
}

最终,这归结为:是否有一个 API 允许您将 in 指针传递给要写入的 PDF 代码。如果是这样,您大概可以通过视图访问器 (CreateViewAccessor) 和 .SafeMemoryMappedViewHandle.AcquirePointer() 获取内存映射文件的非托管指针 - 将该指针指向 other API 直接写信给,而无需中间介入。完成后记得调用 ReleasePointer()

如果不存在,那么您需要复制一次数据,这就是您正在做的。我可能会想使用 Unsafe.CopyBlock(来自 System.Runtime.CompilerServices.Unsafe)而不是 Marshal.Copy,但我希望他们在做同样的事情。