Exemple #1
0
        /// <summary>コンストラクタ</summary>
        /// <param name="dstEventClass">送信先イベント区分</param>
        /// <param name="dstFuncID">送信先機能ID(最大36文字)</param>
        /// <param name="srcEventClass">送信元イベント区分</param>
        /// <param name="srcFuncID">送信元機能ID(最大36文字)</param>
        /// <param name="srcPipeName">送信元 名前付きパイプ名(最大36文字)</param>
        /// <param name="dataLength">データ部のバイト長</param>
        public AsyncEventHeader(
            AsyncEventEnum.EventClass dstEventClass, string dstFuncID,
            AsyncEventEnum.EventClass srcEventClass, string srcFuncID,
            string srcPipeName, uint dataLength)
        {
            // 送信先イベント区分
            this.DstEventClass = (int)dstEventClass;

            // 送信先機能ID
            this.DstFuncID = new char[36];
            this.DstFuncID = dstFuncID.PadRight(36,' ').ToCharArray(0, 36);

            // 送信元イベント区分
            this.SrcEventClass = (int)srcEventClass;

            // 送信元機能ID
            this.SrcFuncID = new char[36];
            this.SrcFuncID = srcFuncID.PadRight(36, ' ').ToCharArray(0, 36);

            // 送信元 名前付きパイプ名
            this.SrcPipeName = new char[36];
            this.SrcPipeName = srcPipeName.PadRight(36, ' ').ToCharArray(0, 36);

            // データ部のバイト長
            this.DataLength = dataLength;
        }
        /// <summary>非同期イベント通知</summary>
        /// <param name="dstEventClass">送信先イベント区分(最大36文字)</param>
        /// <param name="dstFuncID">送信先機能ID(最大36文字)</param>
        /// <param name="srcEventClass">送信元イベント区分(最大36文字)</param>
        /// <param name="srcFuncID">送信元機能ID(最大36文字)</param>
        /// <param name="dstPipeName">送信先 名前付きパイプ名</param>
        /// <param name="srcPipeName">送信元 名前付きパイプ名</param>
        /// <param name="dataLength">データ部のバイト長</param>
        /// <param name="bodyBytes">データ部のバイト表現</param>
        /// <returns>
        /// ・成功:true
        /// ・失敗:false(名前付きパイプ クライアントが見つからない)
        /// </returns>
        /// <remarks>スレッド セーフ</remarks>
        public static bool SendAsyncEvent(
            AsyncEventEnum.EventClass dstEventClass, string dstFuncID,
            AsyncEventEnum.EventClass srcEventClass, string srcFuncID,
            string dstPipeName, string srcPipeName,
            uint dataLength, byte[] bodyBytes)
        {
            lock (AsyncEventFx._lock) // staticなのでロックする。
            {
                if (AsyncEventFx.NPCS.ContainsKey(dstPipeName))
                {
                    // 名前付きパイプ クライアントを取得
                    NamedPipeClient npc = AsyncEventFx.NPCS[dstPipeName];

                    // ヘッダ部のバイト表現を生成

                    // ヘッダ部を生成
                    AsyncEventHeader aeh = new AsyncEventHeader(
                        dstEventClass, dstFuncID,
                        srcEventClass, srcFuncID,
                        srcPipeName, dataLength);

                    // ヘッダ部のマーシャリング
                    byte[] headerBytes = CustomMarshaler.StructureToBytes(aeh);

                    // ヘッダ・データ部のバイト表現をマージ
                    byte[] bytes = new byte[headerBytes.Length + bodyBytes.Length];
                    Array.Copy(headerBytes, bytes, headerBytes.Length);
                    Array.Copy(bodyBytes, 0, bytes, headerBytes.Length, bodyBytes.Length);

                    // Threadを生成してThread関数(SendData)を実行
                    Thread th = new Thread(npc.SendData);
                    th.Start(bytes);

                    return true;
                }
                else
                {
                    return false;
                }
            }
        }