有没有办法将非托管内存转移到内存映射文件中,而无需先将非托管内存编组?
我使用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 );
}
答案 0 :(得分:0)
最终,这归结为:是否有一个API允许您在中传递指向要写入的PDF代码的指针。如果是这样,您可以通过视图访问器(CreateViewAccessor
)和.SafeMemoryMappedViewHandle.AcquirePointer()
获取内存映射文件的非托管指针 - 将该指针指向其他 API直接写,没有你必须在中间。完成后请务必致电ReleasePointer()
。
如果不存在,那么您需要复制一次数据,这就是您正在做的事情。我可能很想使用Unsafe.CopyBlock
(来自System.Runtime.CompilerServices.Unsafe
)而不是Marshal.Copy
,但我希望他们做同样的事情。