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 | 是 |
调试技巧
- 管道调试 :使用
Process Explorer查看命名管道状态 - 网络抓包 :Wireshark过滤
tcp.port == 5000分析TCP通信 - 内存监控 :使用
VMMap工具观察内存映射文件使用情况
高级应用
- 混合通信:结合TCP套接字(传输)+ 内存映射文件(实时数据)
- 加密传输:在TCP套接字中集成AES加密
- 协议扩展:自定义二进制协议提升传输效率