簡體   English   中英

將c ++創建的內存映射文件讀入c#

[英]Read memory mapped file created by c++ into c#

基本上我有一個二進制文件,它是使用c ++內存映射庫創建的。 我擁有有關c ++中的struct的所有信息。 我正在嘗試使用c#中的內存映射庫讀取該二進制文件。 有人可以告訴我任何文章或博客來顯示如何實現這一目標嗎?

我正在努力將c ++結構映射到c#結構,以及讀取和映射內容所需的步驟。

提前致謝。

首先,使用FileStream打開文件。

var stream = new FileStream(path, FileMode.Open, FileAccess.Read);

然后從該流實例化BinaryReader 這不是完全必需的,但是使處理二進制數據更加容易。

var reader = new BinaryReader(stream);

接下來,根據結構需要讀入盡可能多的字節,如Marshal.SizeOf

var bytes = reader.ReadBytes(Marshal.SizeOf(typeof (MyStruct)));

然后,我們使用GCHandle.Alloc “固定”托管的內存,以使GC不會移動它:

var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);

最后,我們使用Marshal.PtrToStructure將該緩沖區轉換為托管結構:

var myStruct = (MyStruct)Marshal.PtrToStructure(
                   handle.AddrOfPinnedObject(), typeof (MyStruct));

不要忘記釋放GCHandle:

handle.Free();

    return theStructure;
}

這是包裝在通用函數中的一部分示例。


雖然我還沒有嘗試過,但是我非常有信心這也可以通過使用MemoryMappedFile並調用CreateViewStream (將其傳遞給BinaryReader )來實現。

var mmfile = MemoryMappedFile.CreateFromFile(path);
var stream = mmfile.CreateViewStream();
var reader = new BinaryReader(stream);
// ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM