0

基本的に、C++ メモリ マップド ライブラリを使用して作成されたバイナリ ファイルがあります。C ++の構造体に関するすべての情報があります。C#でメモリマップライブラリを使用してそのバイナリファイルを読み込もうとしています。誰かがそれを達成する方法を示す記事/ブログを見せてもらえますか?

私は、c++ 構造体を c# 構造体にマッピングするのに苦労しています。また、コンテンツを読み取ってマッピングするために必要な手順も苦労しています。

前もって感謝します。

4

1 に答える 1

0

まず、ファイルをFileStream.

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

次にBinaryReader、そのストリームから a をインスタンス化します。これは完全に必須というわけではありませんが、バイナリ データの操作が容易になります。

var reader = new BinaryReader(stream);

次に、次のように、構造体に必要な数のバイトを読み込みますMarshal.SizeOf

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

次に、以下を使用して、そのマネージド メモリを「固定」して、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;
}

これは、ジェネリック関数にラップされた一部の例です


MemoryMappedFile私は試していませんが、これは a を使用して呼び出しても機能すると確信してCreateViewStreamいます (これを . に渡しBinaryReaderます)。

var mmfile = MemoryMappedFile.CreateFromFile(path);
var stream = mmfile.CreateViewStream();
var reader = new BinaryReader(stream);
// ...
于 2013-09-26T04:27:11.120 に答える