/// メッセージを作成する
        /// @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;
        }