WPF-14 进程间相互通信

业务背景:笔者当初在做餐馆收银软件的时候,客户提了一个需求,由于老外比较喜欢刷卡支付,所以在做支付订单时需要多外接几个pos刷卡机,当4-5个人同时结账时,不用排队,这是一个再合理不过的需求,但是,当我们同时拿到两台pos刷卡机做实验时,当我们加载dll到我们WPF应用程序中时,发现不能同时启动多个pos刷卡机的实例,一个进程只能加载一个实例,如果同时启动多个实例,只有一个有效,于是我们在应用程序启动的时候,根据客户的配置,动态启动我们预先设置好的exe程序,我们将pos刷卡机提供的组件宿主到不同的exe文件中,这样我们主程序只需要和不同exe文件之间进行通信就可以了.

管道之间通信主要用到C#中两个类分别为NamedPipeClientStream和NamedPipeServerStream类

客户端:

WPF-14 进程间相互通信

 private void SendMessage_Click(object sender, RoutedEventArgs e) {   using (NamedPipeClientStream namedPipeClient = new NamedPipeClientStream("Server-pipe"))   {         namedPipeClient.Connect(3000);         var message = "How are you";         byte[] outMessageByte = UTF8Encoding.UTF8.GetBytes(message);         namedPipeClient.Write(outMessageByte, 0, outMessageByte.Length);         byte[] inMessageByte = new byte[2048];         namedPipeClient.Read(inMessageByte, 0, 2048);         var inMessage = UTF8Encoding.UTF8.GetString(inMessageByte).TrimEnd('\0');          txtMesage.Text=inMessage;     }}
服务器端:
using (NamedPipeServerStream namedPipeServer = new NamedPipeServerStream("Server-pipe", PipeDirection.InOut, 4, PipeTransmissionMode.Message)){    while (true)    {        if (!namedPipeServer.IsConnected)        {            namedPipeServer.WaitForConnection();        }        byte[] inMessageByte = new byte[2048];        namedPipeServer.Read(inMessageByte, 0, 2048);        string message = UTF8Encoding.UTF8.GetString(inMessageByte);        string result = "I'm fine ,thank you";        try        {            Console.WriteLine(message);        }        catch (Exception ex)        {            Console.WriteLine(ex.Message);        }        if (result != string.Empty)        {            byte[] payResult = UTF8Encoding.UTF8.GetBytes(result);            namedPipeServer.Write(payResult, 0, payResult.Length);        }        namedPipeServer.Disconnect();    }}

WPF-14 进程间相互通信

这节我们主要介绍C#中如何在不同进程之间进行通信,希望对各位有帮助。