将c ++创建的内存映射文件读入c#

时间:2013-09-26 04:17:08

标签: c# c++ memory-mapped-files

基本上我有一个使用c ++内存映射库创建的二进制文件。我在c ++中有关于struct的所有信息。我试图在c#中使用内存映射库读取该二进制文件。有人可以向我展示任何展示如何实现这一目标的文章/博客吗?

我正在努力将c ++结构映射到c#struct以及读取和映射内容所需的步骤。

提前致谢。

1 个答案:

答案 0 :(得分:0)

首先,使用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)));

然后,我们" pin"管理内存所以GC不会使用GCHandle.Alloc

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

最后,我们使用Marshal.PtrToStructure

将该缓冲区转换为托管结构
var myStruct = (MyStruct)Marshal.PtrToStructure(
                   handle.AddrOfPinnedObject(), typeof (MyStruct));

不要忘记释放GCHandle:

handle.Free();

    return theStructure;
}

Here is一个包含在泛型函数中的部分示例。


虽然我还没有尝试过,但我相信这也适用于使用MemoryMappedFile并调用CreateViewStream(您传递给BinaryReader }。)

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