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

时间:2017-11-20 16:09:08

标签: c# c++-cli

有没有办法将非托管内存转移到内存映射文件中,而无需先将非托管内存编组?

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

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

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

1 个答案:

答案 0 :(得分:0)

最终,这归结为:是否有一个API允许您在中传递指向要写入的PDF代码的指针。如果是这样,您可以通过视图访问器(CreateViewAccessor)和.SafeMemoryMappedViewHandle.AcquirePointer()获取内存映射文件的非托管指针 - 将该指针指向其他 API直接写,没有你必须在中间。完成后请务必致电ReleasePointer()

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