基本的に、C++ メモリ マップド ライブラリを使用して作成されたバイナリ ファイルがあります。C ++の構造体に関するすべての情報があります。C#でメモリマップライブラリを使用してそのバイナリファイルを読み込もうとしています。誰かがそれを達成する方法を示す記事/ブログを見せてもらえますか?
私は、c++ 構造体を c# 構造体にマッピングするのに苦労しています。また、コンテンツを読み取ってマッピングするために必要な手順も苦労しています。
前もって感謝します。
基本的に、C++ メモリ マップド ライブラリを使用して作成されたバイナリ ファイルがあります。C ++の構造体に関するすべての情報があります。C#でメモリマップライブラリを使用してそのバイナリファイルを読み込もうとしています。誰かがそれを達成する方法を示す記事/ブログを見せてもらえますか?
私は、c++ 構造体を c# 構造体にマッピングするのに苦労しています。また、コンテンツを読み取ってマッピングするために必要な手順も苦労しています。
前もって感謝します。
まず、ファイルを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);
// ...