C++アプリケーションとのメモリ共有

C++アプリケーションでのメモリ共有方法には,名前付きパイプなど色々な方法があると思う.
その中でもメモリマップドファイルはバイナリの共有としては優れていると思う.


C++同士ではコンソール,MFC,ATL問わず容易に実装できるが,C#と共有しようとすると難しい.
.NET 4.0からはライブラリ内にメモリマップドファイル用のシステムが存在する.
しかし,3.5以前では同様の仕組みは見当たらない(管理人は歴が浅いが).


この場合,C++でのライブラリをマネージドC++でDLLとして作成する.
このDLLにC++C#の仲介をさせる.


DLLの作成方法として,Visual Studioのプロジェクトの作成の際に,DLL(CRT)を選択して作成する.
その時,refで指定されるclassがC#で利用できるようになる.
ただし,注意として,ヘッダに書くクラス定義はC#の文法,内部の処理はC++の文法となる.
なので,データの受け渡しにはシビアに計画しなければならない.


例えば,C#のデータはbyte型データでも,C++に持ち込むと3byte分消費しているようだ.
なので,C++の配列メンバにMarshal.Copyで書き込むと意図した結果にならないと思われる.