/// メッセージを作成する /// @pre 事前にInitMessageが実行されている必要がある /// @param message 作成されるmessage /// @return 作成が成功したか public bool SendMessage(Message message) { // 初期化されていなければ失敗 if (!this.IsMessageInitialized()) { Trace.WriteLine("****Interprocess: SendMessage FAILED"); return false; } Trace.WriteLine("****Interprocess: SendMessage"); // ロック取得 this.mutexMessage.WaitOne(); // そのままコピー this.WriteMessage(message); // ロック解放 this.mutexMessage.ReleaseMutex(); return true; }
/// Messageを書き込む private void WriteMessage(Message message) { // 書き込み用のIntPtrを準備 var ptr = Marshal.AllocHGlobal(this.sizeOfMessage); try { // MessageをIntPtrに変換 Marshal.StructureToPtr(message, ptr, false); // byte[]に書き込み var buffer = new byte[this.sizeOfMessage]; Marshal.Copy(ptr, buffer, 0, this.sizeOfMessage); // byte[]を共有メモリに書き込み this.viewOfMessage.Seek(0, SeekOrigin.Begin); this.viewOfMessage.Write(buffer, 0, this.sizeOfMessage); } finally { Marshal.FreeHGlobal(ptr); } }
/// メッセージを受け取る /// @pre 事前にInitMessageが実行されている必要がある /// @param[out] message 受けとったメッセージ /// @return メッセージ受け取りに成功 public bool ReceiveMessage(out Message message) { // 初期化されていなければ失敗 if (!this.IsMessageInitialized()) { Trace.WriteLine("****Interprocess: ReceiveMessage FAILED"); message = new Message(); return false; } // Trace.WriteLine("****Interprocess: ReceiveMessage"); // ロック取得 this.mutexMessage.WaitOne(); // そのままコピー message = this.ReadMessage(); // ロック解放 this.mutexMessage.ReleaseMutex(); return true; }