C# 不同框架如何调用framework 和 net core

在 C# 中实现进程间通信(IPC,Inter-Process Communication)有多种方式,适用于不同场景。以下是常见 IPC 方法的实现方案、代码示例及适用场景对比:


1. 命名管道(Named Pipes)

特点:适用于同一台机器上的进程通信,支持双向流式传输,性能较高。

服务端(.NET Framework 或 .NET Core)
cs 复制代码
using System.IO.Pipes;

// 服务端代码
var server = new NamedPipeServerStream("MyPipe", PipeDirection.InOut);
server.WaitForConnection(); // 等待客户端连接

// 写入数据到管道
using (var writer = new StreamWriter(server))
{
    writer.WriteLine("Hello from Server!");
    writer.Flush();
}

// 读取客户端数据
using (var reader = new StreamReader(server))
{
    string message = reader.ReadLine();
    Console.WriteLine($"Received: {message}");
}

server.Close();
客户端(.NET Framework 或 .NET Core)

csharp

cs 复制代码
using System.IO.Pipes;

var client = new NamedPipeClientStream(".", "MyPipe", PipeDirection.InOut);
client.Connect(); // 连接服务端

// 读取服务端数据
using (var reader = new StreamReader(client))
{
    string message = reader.ReadLine();
    Console.WriteLine($"Received: {message}");
}

// 向服务端发送数据
using (var writer = new StreamWriter(client))
{
    writer.WriteLine("Hello from Client!");
    writer.Flush();
}

client.Close();

2. 内存映射文件(Memory-Mapped Files)

特点:适合大量数据共享,支持跨进程内存直接访问。

写入数据(进程 A)

csharp

cs 复制代码
using System.IO.MemoryMappedFiles;

// 创建内存映射文件
using (var mmf = MemoryMappedFile.CreateOrOpen("MySharedMemory", 1024))
using (var accessor = mmf.CreateViewAccessor())
{
    // 写入字符串
    accessor.Write(0, 123); // 写入整数
    accessor.Write(4, (byte)1); // 写入字节
    accessor.WriteArray(5, Encoding.UTF8.GetBytes("Hello from Process A"), 0, 20);
}
读取数据(进程 B)

csharp

cs 复制代码
using System.IO.MemoryMappedFiles;

using (var mmf = MemoryMappedFile.OpenExisting("MySharedMemory"))
using (var accessor = mmf.CreateViewAccessor())
{
    int number = accessor.ReadInt32(0);
    byte flag = accessor.ReadByte(4);
    byte[] buffer = new byte[20];
    accessor.ReadArray(5, buffer, 0, 20);
    string text = Encoding.UTF8.GetString(buffer).TrimEnd('\0');
    Console.WriteLine($"{number}, {flag}, {text}");
}

3. 套接字(TCP/UDP Sockets)

特点:支持跨机器通信,灵活性高。

服务端(TCP)

csharp

cs 复制代码
using System.Net;
using System.Net.Sockets;

var listener = new TcpListener(IPAddress.Any, 8080);
listener.Start();

var client = listener.AcceptTcpClient();
using (var stream = client.GetStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
{
    writer.WriteLine("Hello from Server!");
    writer.Flush();
    string response = reader.ReadLine();
    Console.WriteLine($"Received: {response}");
}

listener.Stop();
客户端(TCP)

csharp

cs 复制代码
using (var client = new TcpClient("localhost", 8080))
using (var stream = client.GetStream())
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
{
    string message = reader.ReadLine();
    Console.WriteLine($"Received: {message}");
    writer.WriteLine("Hello from Client!");
    writer.Flush();
}

4. gRPC(跨平台 RPC 框架)

特点:高性能、跨语言、支持 HTTP/2,适合分布式系统。

定义 Proto 文件(greet.proto

protobuf

cs 复制代码
syntax = "proto3";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}
服务端(.NET Core)
cs 复制代码
using Grpc.Core;

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply { Message = $"Hello {request.Name}" });
    }
}

var server = new Server
{
    Services = { Greeter.BindService(new GreeterService()) },
    Ports = { new ServerPort("localhost", 50051, ServerCredentials.Insecure) }
};
server.Start();
Console.WriteLine("Server running...");
Console.ReadLine();
server.ShutdownAsync().Wait();
客户端(.NET Framework 或 .NET Core)
cs 复制代码
using Grpc.Core;

var channel = new Channel("localhost:50051", ChannelCredentials.Insecure);
var client = new Greeter.GreeterClient(channel);
var reply = client.SayHello(new HelloRequest { Name = "World" });
Console.WriteLine(reply.Message);
channel.ShutdownAsync().Wait();

5. 消息队列(例如 RabbitMQ)

特点:异步、解耦,适合分布式系统。

生产者
cs 复制代码
using RabbitMQ.Client;

var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
    channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null);
    string message = "Hello from Producer!";
    var body = Encoding.UTF8.GetBytes(message);
    channel.BasicPublish(exchange: "", routingKey: "hello", basicProperties: null, body: body);
}
消费者
cs 复制代码
using RabbitMQ.Client;
using RabbitMQ.Client.Events;

var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
    channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null);
    var consumer = new EventingBasicConsumer(channel);
    consumer.Received += (model, ea) =>
    {
        var body = ea.Body.ToArray();
        var message = Encoding.UTF8.GetString(body);
        Console.WriteLine($"Received: {message}");
    };
    channel.BasicConsume(queue: "hello", autoAck: true, consumer: consumer);
    Console.ReadLine();
}

6. WCF(仅限 Windows,.NET Framework)

特点:支持多种协议(HTTP、TCP、Named Pipes),但需在 .NET Core 中使用替代方案(如 CoreWCF)。

服务端(.NET Framework)
cs 复制代码
[ServiceContract]
public interface IGreeter
{
    [OperationContract]
    string SayHello(string name);
}

public class GreeterService : IGreeter
{
    public string SayHello(string name) => $"Hello {name}";
}

// 宿主代码
var baseAddress = new Uri("http://localhost:8000/");
using (var host = new ServiceHost(typeof(GreeterService), baseAddress))
{
    host.AddServiceEndpoint(typeof(IGreeter), new BasicHttpBinding(), "");
    host.Open();
    Console.WriteLine("Server running...");
    Console.ReadLine();
    host.Close();
}
客户端(.NET Framework)
cs 复制代码
var binding = new BasicHttpBinding();
var endpoint = new EndpointAddress("http://localhost:8000/");
var channelFactory = new ChannelFactory<IGreeter>(binding, endpoint);
var greeter = channelFactory.CreateChannel();
Console.WriteLine(greeter.SayHello("World"));

IPC 方法对比

方法 适用场景 优点 缺点
命名管道 同一机器上的高速双向通信 低延迟,简单易用 仅限同一机器,Windows 支持更成熟
内存映射文件 共享大量数据(如图像、日志) 高性能,直接内存访问 需手动处理同步机制
套接字(TCP) 跨机器通信或复杂网络场景 跨平台,灵活性强 需处理网络协议和序列化
gRPC 跨语言、跨平台的高性能 RPC 自动代码生成,支持流式通信 需定义 Proto 文件,依赖 HTTP/2
消息队列 异步解耦的分布式系统 高可靠性,支持负载均衡 需中间件(如 RabbitMQ)
WCF/CoreWCF 企业级复杂通信(Windows 为主) 统一多种协议,安全性高 .NET Core 支持有限,配置复杂

选择建议

  1. 同一机器 :优先使用 命名管道 (简单高效)或 内存映射文件(大数据共享)。

  2. 跨机器/跨平台 :选择 gRPC (高性能 RPC)或 TCP 套接字(灵活性高)。

  3. 异步解耦 :使用 消息队列(如 RabbitMQ)实现可靠的消息传递。

  4. 遗留系统整合 :若必须使用 WCF,可在 .NET Core 中尝试 CoreWCF

相关推荐
二进制漫游记7 小时前
FastAPI项目集成 Qdrant向量数据库+阿里云Embedding完整实战(工具封装+业务调用)
数据库·python·阿里云·embedding
2501_928996227 小时前
GPT-4o换DeepSeek迁移成本多少?中科热备解析API聚合平台技术账本
前端·数据库·人工智能
zww89491119 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
泡干脆面就番茄9 小时前
MySQL_子查询_分页查询与联合查询详解
数据库·mysql
黑马程序员毕设10 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳10 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
白山编程大哥10 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
公子小六10 小时前
基于.NET的Windows窗体编程之WinForms滑块与上下控件
windows·microsoft·c#·.net·winforms
devpotato10 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
天若有情67310 小时前
Node+MySQL小型全栈笔记项目实战课程分享
数据库·笔记·mysql