.NET 6与.NET Framework 4.8桌面应用进程间通信方案咨询
适配.NET Framework 4.8与.NET 6 WPF的简单跨版本通信方案
方案一:gRPC(跨版本通用,性能优异)
gRPC是官方支持的跨平台RPC框架,两端都能无缝集成,适合结构化数据交互。
- 定义.proto协议文件,统一通信格式:
syntax = "proto3"; package crossapp; service DataExchange { rpc SyncData (DataRequest) returns (DataResponse); } message DataRequest { string tag = 1; double variable = 2; } message DataResponse { bool success = 1; string msg = 2; } - .NET Framework 4.8端(客户端):
安装Grpc.Tools和Grpc.CoreNuGet包,通过.proto生成客户端代码后发起调用:var channel = new Channel("localhost:50051", ChannelCredentials.Insecure); var client = new DataExchange.DataExchangeClient(channel); var resp = client.SyncData(new DataRequest { Tag = "SampleTag", Variable = 123.45 }); Console.WriteLine($"状态:{resp.Success},消息:{resp.Msg}"); channel.ShutdownAsync().Wait(); - .NET 6 WPF端(服务端):
安装Grpc.AspNetCore和Grpc.ToolsNuGet包,生成服务端代码并实现逻辑:// Program.cs var builder = WebApplication.CreateBuilder(args); builder.Services.AddGrpc(); var app = builder.Build(); app.MapGrpcService<DataExchangeServiceImpl>(); app.Run("http://localhost:50051"); // 服务实现类 public class DataExchangeServiceImpl : DataExchange.DataExchangeBase { public override Task<DataResponse> SyncData(DataRequest request, ServerCallContext context) { // 处理收到的标记与变量,比如更新WPF界面 Console.WriteLine($"收到标记:{request.Tag},变量值:{request.Variable}"); return Task.FromResult(new DataResponse { Success = true, Msg = "数据接收成功" }); } }
方案二:HTTP API(零额外依赖,快速上手)
利用原生HTTP能力实现通信,无需复杂框架,适合轻量数据交互。
- .NET 6 WPF端(API服务端):
// Program.cs var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapPost("/api/data", (DataModel data) => { Console.WriteLine($"标记:{data.Tag},变量:{data.Variable}"); return Results.Ok(new { Success = true, Message = "已接收" }); }); app.Run("http://localhost:5000"); public class DataModel { public string Tag { get; set; } public double Variable { get; set; } } - .NET Framework 4.8端(HTTP客户端):
安装Newtonsoft.JsonNuGet包处理JSON序列化,发送请求:using (var client = new HttpClient()) { var data = new { Tag = "TestTag", Variable = 67.89 }; var json = JsonConvert.SerializeObject(data); var content = new StringContent(json, Encoding.UTF8, "application/json"); var resp = client.PostAsync("http://localhost:5000/api/data", content).Result; var respJson = resp.Content.ReadAsStringAsync().Result; Console.WriteLine(respJson); }
方案三:命名管道(Windows专属,轻量高效)
仅适用于Windows环境,本地通信延迟极低,适合高频小数据交互。
- .NET 6 WPF端(管道服务端):
using (var pipeServer = new NamedPipeServerStream("CrossAppPipe", PipeDirection.InOut)) { pipeServer.WaitForConnection(); using var reader = new StreamReader(pipeServer); using var writer = new StreamWriter(pipeServer) { AutoFlush = true }; string dataStr = reader.ReadLine(); var data = JsonConvert.DeserializeObject<DataModel>(dataStr); Console.WriteLine($"收到:{data.Tag},{data.Variable}"); writer.WriteLine("{\"Success\":true,\"Message\":\"处理完成\"}"); } - .NET Framework 4.8端(管道客户端):
using (var pipeClient = new NamedPipeClientStream(".", "CrossAppPipe", PipeDirection.InOut)) { pipeClient.Connect(); using var reader = new StreamReader(pipeClient); using var writer = new StreamWriter(pipeClient) { AutoFlush = true }; var data = new DataModel { Tag = "PipeTag", Variable = 100.0 }; writer.WriteLine(JsonConvert.SerializeObject(data)); string resp = reader.ReadLine(); Console.WriteLine(resp); }
内容的提问来源于stack exchange,提问作者Marcos
相关产品推荐
相关产品推荐

