【问题标题】:Write unmanaged byte array to memory mapped file将非托管字节数组写入内存映射文件
【发布时间】:2017-11-20 16:09:07
【问题描述】:

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

我正在使用一个 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 );
}

【问题讨论】:

    标签: c# c++-cli


    【解决方案1】:

    归根结底,这归结为:是否有一个 API 可以让您将要写入的 PDF 代码的指针传递给 in。如果是这样,您大概可以通过视图访问器 (CreateViewAccessor) 和 .SafeMemoryMappedViewHandle.AcquirePointer() 获取内存映射文件的非托管指针 - 将该指针交给 other API 以直接写入,而您不必夹在中间。完成后记得致电ReleasePointer()

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

    【讨论】:

    • 是的,我想会是这样。谢谢马克。
    猜你喜欢
    • 2016-02-23
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多