将非托管字节数组写入内存映射文件
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
,但我希望他们在做同样的事情。
有没有一种方法可以将非托管内存传输到内存映射文件中,而无需先编组非托管内存?
我正在使用 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
,但我希望他们在做同样的事情。