C#中实现不同进程(EXE)间通信的方案

C#中实现不同进程(EXE)间通信的方案,7种主流技术及代码实现:


一、命名管道(Named Pipes)【推荐本地高效通信】

1. 服务端实现
csharp 复制代码
using System.IO.Pipes;
using System.Text;

var server = new NamedPipeServerStream("TestPipe", PipeDirection.InOut);
server.WaitForConnection();
Console.WriteLine("客户端已连接");

// 接收数据
byte[] buffer = new byte[256];
int bytesRead = server.Read(buffer, 0, buffer.Length);
string msg = Encoding.UTF8.GetString(buffer).TrimEnd('\0');
Console.WriteLine($"收到消息:{msg}");

// 发送响应
string response = "Hello from server!";
byte[] respBytes = Encoding.UTF8.GetBytes(response);
server.Write(respBytes, 0, respBytes.Length);
server.Close();
2. 客户端实现
csharp 复制代码
using System.IO.Pipes;
using System.Text;

var client = new NamedPipeClientStream(".", "TestPipe", PipeDirection.InOut);
client.Connect();
Console.WriteLine("已连接到服务端");

// 发送数据
string message = "Hello from client!";
byte[] msgBytes = Encoding.UTF8.GetBytes(message);
client.Write(msgBytes, 0, msgBytes.Length);

// 接收响应
buffer = new byte[256];
bytesRead = client.Read(buffer, 0, buffer.Length);
string resp = Encoding.UTF8.GetString(buffer).TrimEnd('\0');
Console.WriteLine($"服务端响应:{resp}");
client.Close();

适用场景:本地双向实时通信,高性能数据传输


二、内存映射文件(Memory-Mapped Files)【推荐大数据量共享】

1. 写入进程
csharp 复制代码
using System.IO.MemoryMappedFiles;
using System.Text;

using (var mmf = MemoryMappedFile.CreateOrOpen("SharedMemory", 1024))
using (var accessor = mmf.CreateViewAccessor())
{
    string data = "共享内存数据";
    byte[] bytes = Encoding.UTF8.GetBytes(data);
    accessor.WriteArray(0, bytes, 0, bytes.Length);
}
2. 读取进程
csharp 复制代码
using System.IO.MemoryMappedFiles;
using System.Text;

using (var mmf = MemoryMappedFile.OpenExisting("SharedMemory"))
using (var accessor = mmf.CreateViewAccessor())
{
    byte[] buffer = new byte[1024];
    accessor.ReadArray(0, buffer, 0, buffer.Length);
    string msg = Encoding.UTF8.GetString(buffer).TrimEnd('\0');
    Console.WriteLine($"读取数据:{msg}");
}

特点:零拷贝传输,适合频繁读写的大数据场景


三、WCF服务【推荐复杂服务交互】

1. 服务端定义
csharp 复制代码
[ServiceContract]
public interface IMyService
{
    [OperationContract]
    string ProcessData(string input);
}

public class MyService : IMyService
{
    public string ProcessData(string input) => $"处理结果:{input.ToUpper()}";
}

// 启动服务
var host = new ServiceHost(typeof(MyService), new Uri("net.pipe://localhost"));
host.AddServiceEndpoint(typeof(IMyService), new NetNamedPipeBinding(), "MyService");
host.Open();
2. 客户端调用
csharp 复制代码
var factory = new ChannelFactory<IMyService>(
    new NetNamedPipeBinding(),
    new EndpointAddress("net.pipe://localhost/MyService"));
IMyService proxy = factory.CreateChannel();
string result = proxy.ProcessData("test data");
Console.WriteLine(result);

优势:支持多种协议(TCP/HTTP),适合分布式系统


四、TCP套接字【推荐跨网络通信】

1. 服务端
csharp 复制代码
using System.Net.Sockets;
using System.Text;

var listener = new TcpListener(IPAddress.Any, 5000);
listener.Start();
using (var client = await listener.AcceptTcpClientAsync())
using (var stream = client.GetStream())
{
    byte[] buffer = new byte[1024];
    int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
    string msg = Encoding.UTF8.GetString(buffer, 0, bytesRead);
    
    string response = "TCP响应数据";
    await stream.WriteAsync(Encoding.UTF8.GetBytes(response), 0, response.Length);
}
2. 客户端
csharp 复制代码
using System.Net.Sockets;
using System.Text;

var client = new TcpClient("127.0.0.1", 5000);
using (var stream = client.GetStream())
{
    string msg = "Hello Server";
    await stream.WriteAsync(Encoding.UTF8.GetBytes(msg), 0, msg.Length);
    
    byte[] buffer = new byte[1024];
    int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
    string resp = Encoding.UTF8.GetString(buffer, 0, bytesRead);
    Console.WriteLine(resp);
}

特点:支持跨网络通信,灵活控制协议


五、消息队列(MSMQ)【推荐异步可靠通信】

1. 发送消息
csharp 复制代码
using System.Messaging;

var queue = new MessageQueue(@".\Private$\MyQueue");
queue.Send("异步消息内容", MessageQueueTransactionType.Single);
2. 接收消息
csharp 复制代码
var queue = new MessageQueue(@".\Private$\MyQueue");
queue.Formatter = new XmlMessageFormatter(new[] { typeof(string) });

queue.ReceiveCompleted += (s, e) => {
    var msg = queue.EndReceive(e.AsyncResult);
    Console.WriteLine($"收到消息:{msg.Body}");
};
queue.BeginReceive();

适用场景:需要可靠异步传输的场景


六、文件系统监控【推荐简单同步场景】

1. 写入进程
csharp 复制代码
File.WriteAllText("shared.txt", "同步数据:" + DateTime.Now);
2. 监控进程
csharp 复制代码
var watcher = new FileSystemWatcher {
    Path = ".",
    Filter = "shared.txt",
    NotifyFilter = NotifyFilters.LastWrite
};

watcher.Changed += (s, e) => {
    string content = File.ReadAllText(e.FullPath);
    Console.WriteLine($"文件更新:{content}");
};
watcher.EnableRaisingEvents = true;

特点:实现简单,适合临时数据同步


七、Windows API消息传递【推荐GUI应用交互】

1. 发送消息(C#调用Win32 API)
csharp 复制代码
[DllImport("User32.dll")]
static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);

public struct COPYDATASTRUCT {
    public int dwData;
    public int cbData;
    [MarshalAs(UnmanagedType.LPStr)] public string lpData;
}

// 发送消息示例
int hWnd = FindWindow(null, "目标窗口标题");
byte[] data = Encoding.Default.GetBytes("消息内容");
int len = data.Length;
COPYDATASTRUCT cds = new COPYDATASTRUCT {
    dwData = 100,
    cbData = len + 1,
    lpData = Encoding.Default.GetString(data)
};
SendMessage(hWnd, 0x004A, 0, ref cds);
2. 接收消息(目标进程)
csharp 复制代码
protected override void WndProc(ref Message m) {
    if (m.Msg == 0x004A) {
        COPYDATASTRUCT cds = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));
        textBox1.Text = cds.lpData;
    }
    base.WndProc(ref m);
}

适用场景:Windows窗体应用间的直接交互


八、互斥体同步【推荐资源竞争控制】

csharp 复制代码
var mutex = new Mutex(false, "Global\\ProcessMutex");

// 进程A
mutex.WaitOne();
try {
    // 访问共享资源
} finally {
    mutex.ReleaseMutex();
}

// 进程B同理

作用:防止多进程同时访问临界区资源

参考代码 c#进程之间通信,c#exe 之间发消息,c#exe 相互通信 www.youwenfan.com/contentcsp/116346.html

选择建议

场景 推荐方案 优势
本地实时双向通信 命名管道 高性能,低延迟
跨网络通信 TCP套接字/WCF 支持远程,协议灵活
异步可靠传输 MSMQ 消息持久化,断点续传
简单数据同步 文件监控 实现简单,无需复杂配置
GUI应用交互 Win32消息传递 直接操作窗口控件
资源竞争控制 互斥体 避免数据竞争

性能对比

方法 吞吐量 (MB/s) 延迟 (ms) 跨网络支持
命名管道 120-200 0.1-1
内存映射文件 500-800 <0.01
TCP套接字 80-150 1-5
MSMQ 10-30 50-200

调试技巧

  1. 管道调试 :使用Process Explorer查看命名管道状态
  2. 网络抓包 :Wireshark过滤tcp.port == 5000分析TCP通信
  3. 内存监控 :使用VMMap工具观察内存映射文件使用情况

高级应用

  1. 混合通信:结合TCP套接字(传输)+ 内存映射文件(实时数据)
  2. 加密传输:在TCP套接字中集成AES加密
  3. 协议扩展:自定义二进制协议提升传输效率
相关推荐
山峰哥1 小时前
JOIN - 多表关联的魔法——3000字实战指南
java·大数据·开发语言·数据库·sql·编辑器
波波0071 小时前
C# 中静态类的正确与错误用法
c#
阿蒙Amon1 小时前
C#每日面试题-简述匿名类型
开发语言·c#
Mr.朱鹏1 小时前
Spring Boot 配置文件加载顺序与优先级详解
java·spring boot·后端·spring·maven·配置文件·yml
m0_579146651 小时前
Maven 编译的settings配置和pom、idea配置关系
java·maven·intellij-idea
洛阳泰山1 小时前
一个人,一个项目,一年的坚持:关于我的 2025年 技术突围之路
java·人工智能·spring boot
虫小宝2 小时前
企业微信API接口的Java SDK封装:可复用、可测试的工具类设计方法
java·开发语言·企业微信
hanjq_code2 小时前
java使用阿里的easyExcel解决把excel每行的数据转成excel表格格式数据并打包成ZIP下载
java·开发语言·excel
独自破碎E2 小时前
包含min函数的栈
android·java·开发语言·leetcode