如何建设简单小型网站,黑龙江建设网监理证书,小程序制作流程,西安公司网站制作要多少钱原文:dot net core 使用 IPC 进程通信版权声明#xff1a;博客已迁移到 http://lindexi.gitee.io 欢迎访问。如果当前博客图片看不到#xff0c;请到 http://lindexi.gitee.io 访问博客。本文地址 https://blog.csdn.net/lindexi_gd/article/details/79946496 dot net core 使…原文:dot net core 使用 IPC 进程通信 版权声明博客已迁移到 http://lindexi.gitee.io 欢迎访问。如果当前博客图片看不到请到 http://lindexi.gitee.io 访问博客。本文地址 https://blog.csdn.net/lindexi_gd/article/details/79946496 dot net core 使用 IPC 进程通信 本文告诉大家如何使用dot net core 和其他进程进行通信。 文章目录dot net core 使用 IPC 进程通信原理例子序列化 一般都是使用 WCF 或 remoting 做远程通信但是 dot net core 不支持 WCF 所以暂时我就只能使用 管道通信。 原理 管道通信使用的是 Pipe 需要启动一对服务器和客户端才可以使用。在 NamedPipeServerStream 启动之后可以接受其他 NamedPipeClientStream 连接。 因为现在已经使用了 await 了所以建议全部都可以写异步古老的程序员喜欢使用回调但是现在的程序员还是建议使用 await 比较好因为比较容易用。 创建的 NamedPipeServerStream 需要告诉管道的命名和通信方式通信可以分为单向和双向大家使用枚举去看一下就可以知道。我来创建一个管道名是lindexi可以双向通信的管道。 var pipe new NamedPipeServerStream(lindexi, PipeDirection.InOut); 上面代码就创建了一个管道之后需要等待有连接才可以发送数据。 await pipe.WaitForConnectionAsync();等待了连接之后就可以发送数据发生的数据使用的是字节发送所以需要转换编码。 string str 发送消息;var spxnfSrxldhhv Encoding.UTF8.GetBytes(str);pipe.Write(spxnfSrxldhhv, 0, spxnfSrxldhhv.Length);注意需要指定发送数据的长度和数据通过这个方法发送是不建议的。 如果需要使用一个比较高级的方法传输请看文章最后 这时另一个程序就需要下面代码连接 var pipe new NamedPipeClientStream(., lindexi, PipeDirection.InOut, PipeOptions.None);pipe.Connect()上面代码使用的 NamedPipeClientStream 需要指定管道的命名才可以找到。 连接之后可以通过这个方式读取数据 var spxnfSrxldhhv new byte[65535];var n pipe.Read(spxnfSrxldhhv, 0, spxnfSrxldhhv.Length);var str Encoding.UTF8.GetString(spxnfSrxldhhv, 0, n);对于读写数据很多时候就使用 pipe 的读写写入字节读出字节。 因为一次读取可能会卡很多时间所以建议使用异步读。 如果觉得每次发送都需要转 byte 然后进行写代码很多可以使用下面的代码 var stream new StreamWriter(pipe);stream.Write(发送消息);stream.Flush();注意不要使用下面的代码 using (var stream new StreamWriter(pipe)){stream.Write(发送消息);}原因是 using 会关闭 pipe 所以使用之后就不能在写。 例子 首先创建两个程序一个是 WPF 程序 DgvlzKixtdin 另一个是 dot net core 控制台 HclkvyDanuiag 。接着需要从 DgvlzKixtdin 发送数据从 HclkvyDanuiag 接收数据。 在 WPF 程序添加一个 TextBlock 和 Button 点击 Button 就发送消息到 dot net core 程序。收到消息就在 TextBlock 显示。 在 Button 点击的代码写下面代码 private async void HixKkikjgp_OnClick(object sender, RoutedEventArgs e){var pipe new NamedPipeServerStream(lindexi, PipeDirection.InOut);await pipe.WaitForConnectionAsync();string str 发送消息;var spxnfSrxldhhv Encoding.UTF8.GetBytes(str);pipe.Write(spxnfSrxldhhv, 0, spxnfSrxldhhv.Length);spxnfSrxldhhv new byte[100];var n pipe.Read(spxnfSrxldhhv, 0, 100);str Encoding.UTF8.GetString(spxnfSrxldhhv, 0, n);TjdsguhmKzj.Text str;}然后在 dot net core 程序写下面代码 static void Main(string[] args){Console.WriteLine(Hello World!);var pipe new NamedPipeClientStream(., lindexi, PipeDirection.InOut, PipeOptions.None);pipe.Connect();var spxnfSrxldhhv new byte[65535];var n pipe.Read(spxnfSrxldhhv, 0, spxnfSrxldhhv.Length);var str Encoding.UTF8.GetString(spxnfSrxldhhv, 0, n);Console.WriteLine(str);str 收到;spxnfSrxldhhv Encoding.UTF8.GetBytes(str);pipe.Write(spxnfSrxldhhv, 0, spxnfSrxldhhv.Length);Console.Read();}先启动 WPF 程序然后启动控制台 这时点击按钮之后就打开控制台可以看到控制台可以收到消息 然后 WPF 也收到控制台发过来的消息 序列化 虽然使用StreamWriter可以减少写入读取的代码但是实际上这样只能用来传字符串需要把类传输还是比较难所以我找到了 Protobuf 使用这个库可以简单使用。 首先打开 Nuget 安装 Protobuf 第一个 我这里使用 protobuf-net 然后创建一个类用来传输 [ProtoContract]public class TyfxxTlkbjn{public string DczSwdsun { get; set; }}使用下面代码可以进行写入 Serializer.Serialize(pipe, 实例);所以修改一下上面的按钮按下 {var pipe new NamedPipeServerStream(lindexi, PipeDirection.InOut);await pipe.WaitForConnectionAsync();var tyfxxTlkbjn new TyfxxTlkbjn(){DczSwdsun 发送消息};Serializer.Serialize(pipe, tyfxxTlkbjn);pipe.Disconnect();修改 dot net core的代码 static void Main(string[] args){var pipe new NamedPipeClientStream(., lindexi, PipeDirection.InOut, PipeOptions.None);pipe.Connect();var tyfxxTlkbjn Serializer.DeserializeTyfxxTlkbjn(pipe);Console.WriteLine(tyfxxTlkbjn.DczSwdsun);Console.Read();}如果使用 wcf 请看 .NET Core调用WCF的最佳实践 如果需要使用 grpc 请看.net core grpc 实现通信 我搭建了自己的博客 https://lindexi.gitee.io/ 欢迎大家访问里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园但是一旦发布了就不再更新 如果在博客看到有任何不懂的欢迎交流我搭建了 dotnet 职业技术学院 欢迎大家加入 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd )不得用于商业目的基于本文修改后的作品务必以相同的许可发布。如有任何疑问请与我联系。