例えばアプリAからアプリBへデータを渡したい時の話。
これまでクリップボード経由で実現させていました、 こんな感じ。
1. アプリA データをクリップボードにコピー
2. アプリB ちょっとだけ待つ(200mS程度:おまじないですね)
3. アプリB クリップボードからデータを貼り付け
難点は、クリップボードってAB以外のアプリも使ってる訳なので、
想定外に思わぬところでデータが消えたり、化けてしまったり。
クリップボード以外で別の手法は無いものだろうか? ってことで、
MemoryMappedFileを使ってみたのが、今回のネタになります。
詳細は"C# MemoryMappedFiles" 等で検索してみて下さい、
今回も色々なサイトを参考にさせて頂きました、感謝。
データ送信側(アプリA)
button1を押すと現在の日時をMemoryMappedFileに書き込みます。
3行目でMemoryMappedFileとしてmmfを定義し、10行目でOpen。
TestがMemoryMappedFileの名称、1024がサイズです。(1024Byte)
22、23行目で、mmfをStreamWriterとして使えるようにします、
これにより、普通のテキストファイルみたいに扱えるので簡単。
36行目、終了時にDisposeするのを忘れずに。
データ受信側(アプリB)
button1を押すと共有メモリを読み出し、textBox1に表示します。
13行目でMemoryMappedFile mmfをOpenします、
アプリAでOpen済みなので、MemoryMappedFile.OpenExistingを使用、
もちろんアプリAと同じ”Test"を指定することを忘れずに。
14、16行目で、mmfをStreamReaderとして使えるようにします、
これにより、受信側もテキストファイルを読む感覚で扱えます。
あと送信側との違いは、ボタンを押す毎にMemoryMappedFileをOpenし、
読み終わった時点で(usingで)閉じていることです。
(送信側は、Formを閉じるまではOpenしっぱなし)
アプリBの実行結果は、こんな感じ。
もし送信側のアプリAが終了した状態でボタンを押すと、
MemoryMappedFileがOpen出来ないので、”ファイルが見つかりません”
みたいなエラーが表示されます。
ちなみに、上記はSystem.IO.MemoryMappedFiles.MemoryMappedFileという
クラスを使っていますが、.NET4.0から追加されたもののようです。
思ったより簡単にMemoryMappedFileが扱えることが判りました!