static void Main(string[] args)
        {
            string input = "";

            byte[]      bytes2send;
            PipeMessage pmsg;

            XmlConfigurator.Configure(new FileInfo("logging.config"));

            // default config
            string confFile = "VoiceCmdClientSetting.json";

            try {
                if (args.Length >= 2)
                {
                    confFile = args[1];
                }

                // decide which configuration to use
                VoiceCmdSetting vs = JsonConvert.DeserializeObject <VoiceCmdSetting>(File.ReadAllText(confFile));

                StartListen(vs);

                Console.WriteLine("- Recognised voice messages will be listed below.");
                Console.WriteLine("- Enter anything to receive echo message.");
                Console.WriteLine("- Enter 'stop' to close program.\n\n");

                while (true)
                {
                    try
                    {
                        input = Console.ReadLine();
                        if (input == "stop")
                        {
                            Console.WriteLine("Stopping..");
                            StopListen();
                            break;
                        }
                        pmsg       = new PipeMessage(EVENT_TYPE_ECHO, input);
                        bytes2send = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(pmsg));
                        SendStream.Write(bytes2send, 0, bytes2send.Length);
                        pmsg       = null;
                        bytes2send = null;
                    }
                    catch (Exception ex)
                    {
                        log.Error("Namedpipe exception: ex: " + ex);
                    }
                }

                return;
            } catch (Exception ex)
            {
                log.Error("Failed to start test client, ex: " + ex);
                Console.WriteLine("enter to close program.");
                Console.ReadLine();
                return;
            }
        }
        public void loadGrammer(VoiceCmdSetting vs)
        {
            foreach (VoiceCmdSetting.VoiceGrammar voiceGrammar in vs.grammars)
            {
                Grammar g = ToGrammar(vs.channelName, voiceGrammar);

                if (!grammarMap.ContainsKey(g.Name))
                {
                    // load grammar
                    s_recognizer.LoadGrammar(g);
                    // add grammar to map
                    grammarMap[g.Name]    = g;
                    confidenceMap[g.Name] = voiceGrammar.confidence;
                }
                else
                {
                    log.Warn("Ignore duplicate grammar: " + g.Name);
                }
            }
        }
        static void StartListen(VoiceCmdSetting vs)
        {
            try
            {
                log.Debug($"try to connect to {vs.cmdPipeName}, {vs.ctrlPipeName}");
                // Connect to receive_pipe and send start message
                RecvStream = new NamedPipeClientStream(".", vs.cmdPipeName, PipeDirection.InOut, PipeOptions.Asynchronous | PipeOptions.WriteThrough);
                RecvStream.Connect(500);
                RecvStream.ReadMode = PipeTransmissionMode.Message;

                // Connect to send_pipe
                SendStream = new NamedPipeClientStream(".", vs.ctrlPipeName, PipeDirection.InOut, PipeOptions.Asynchronous | PipeOptions.WriteThrough);
                SendStream.Connect(500);
                SendStream.ReadMode = PipeTransmissionMode.Message;

                // Start listening to event
                RecvStream.BeginRead(MsgBuf, 0, BufferSize, EndReadCallBack, null);
            }
            catch (Exception ex)
            {
                // Swallow the exception
                log.Error("Namedpipe exception: " + ex.Message + "\n" + ex.StackTrace);
            }
        }