.net/C#进程间通信技术方案总结

[复制链接]
发表于 2025-9-10 02:47:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
C# 应用进程间通信(IPC)技术方案

进程间通信(Inter-Process Communication, IPC)是不同进程之间互换数据和消息的机制。以下是C#中常用的IPC技术方案:
1. 定名管道(Named Pipes)

适用于本地机器上的进程通信,支持双向通信。
​服务端示例​​:
  1. [/code]csharp
  2. [code]
  3. using System.IO.Pipes;
  4. var server = new NamedPipeServerStream("MyPipe", PipeDirection.InOut);
  5. server.WaitForConnection();
  6. using (StreamReader reader = new StreamReader(server))
  7. using (StreamWriter writer = new StreamWriter(server))
  8. {
  9.     string message = reader.ReadLine();
  10.     Console.WriteLine($"Received: {message}");
  11.     writer.WriteLine("Hello from server!");
  12.     writer.Flush();
  13. }
复制代码
​客户端示例​​:
  1. [/code]csharp
  2. [code]
  3. using System.IO.Pipes;
  4. var client = new NamedPipeClientStream(".", "MyPipe", PipeDirection.InOut);
  5. client.Connect();
  6. using (StreamReader reader = new StreamReader(client))
  7. using (StreamWriter writer = new StreamWriter(client))
  8. {
  9.     writer.WriteLine("Hello from client!");
  10.     writer.Flush();
  11.     string response = reader.ReadLine();
  12.     Console.WriteLine($"Server response: {response}");
  13. }
复制代码
2. 内存映射文件(Memory-Mapped Files)

允许不同进程通过共享内存进行通信。
​写入进程​​:
  1. [/code]csharp
  2. [code]
  3. using System.IO.MemoryMappedFiles;
  4. using (var mmf = MemoryMappedFile.CreateOrOpen("MySharedMemory", 1024))
  5. using (var accessor = mmf.CreateViewAccessor())
  6. {
  7.     byte[] message = Encoding.UTF8.GetBytes("Hello from Process 1!");
  8.     accessor.WriteArray(0, message, 0, message.Length);
  9. }
复制代码
​读取进程​​:
  1. [/code]csharp
  2. [code]
  3. using (var mmf = MemoryMappedFile.OpenExisting("MySharedMemory"))
  4. using (var accessor = mmf.CreateViewAccessor())
  5. {
  6.     byte[] buffer = new byte[1024];
  7.     accessor.ReadArray(0, buffer, 0, buffer.Length);
  8.     string message = Encoding.UTF8.GetString(buffer).TrimEnd('\0');
  9.     Console.WriteLine($"Received: {message}");
  10. }
复制代码
3. WCF (Windows Communication Foundation)

.NET框架提供的强大通信框架,支持多种协议。
​服务端​​:
  1. [/code]csharp
  2. [code]
  3. using System.ServiceModel;
  4. [ServiceContract]
  5. public interface IMyService
  6. {
  7.     [OperationContract]
  8.     string GetMessage();
  9. }
  10. public class MyService : IMyService
  11. {
  12.     public string GetMessage() => "Hello from WCF service!";
  13. }
  14. var host = new ServiceHost(typeof(MyService), new Uri("net.pipe://localhost"));
  15. host.AddServiceEndpoint(typeof(IMyService), new NetNamedPipeBinding(), "MyService");
  16. host.Open();
复制代码
​客户端​​:
  1. [/code]csharp
  2. [code]
  3. var factory = new ChannelFactory<IMyService>(
  4.     new NetNamedPipeBinding(),
  5.     new EndpointAddress("net.pipe://localhost/MyService"));
  6.    
  7. IMyService proxy = factory.CreateChannel();
  8. string message = proxy.GetMessage();
  9. Console.WriteLine($"Service response: {message}");
复制代码
4. 套接字(Sockets)

适用于网络通信,也可用于本地进程间通信。
​TCP服务端​​:
  1. [/code]csharp
  2. [code]
  3. var listener = new TcpListener(IPAddress.Loopback, 12345);
  4. listener.Start();
  5. var client = listener.AcceptTcpClient();
  6. using (var stream = client.GetStream())
  7. using (var reader = new StreamReader(stream))
  8. using (var writer = new StreamWriter(stream))
  9. {
  10.     string request = reader.ReadLine();
  11.     writer.WriteLine($"Echo: {request}");
  12.     writer.Flush();
  13. }
复制代码
​TCP客户端​​:
  1. [/code]csharp
  2. [code]
  3. var client = new TcpClient("localhost", 12345);
  4. using (var stream = client.GetStream())
  5. using (var reader = new StreamReader(stream))
  6. using (var writer = new StreamWriter(stream))
  7. {
  8.     writer.WriteLine("Hello from client!");
  9.     writer.Flush();
  10.     string response = reader.ReadLine();
  11.     Console.WriteLine(response);
  12. }
复制代码
5. 消息队列(MSMQ)

适用于异步、可靠的进程间通信。
​发送消息​​:
  1. [/code]csharp
  2. [code]
  3. using System.Messaging;
  4. if (!MessageQueue.Exists(@".\Private$\MyQueue"))
  5.     MessageQueue.Create(@".\Private$\MyQueue");
  6. var queue = new MessageQueue(@".\Private$\MyQueue");
  7. queue.Send("Hello from sender process!", "Test Message");
复制代码
​接收消息​​:
  1. [/code]csharp
  2. [code]
  3. var queue = new MessageQueue(@".\Private$\MyQueue");
  4. queue.Formatter = new XmlMessageFormatter(new[] { typeof(string) });
  5. Message message = queue.Receive();
  6. Console.WriteLine($"Received: {message.Body}");
复制代码
6. 文件监视(File System Watcher)

通过共享文件和文件系统变乱进行通信。
​写入进程​​:
  1. [/code]csharp
  2. [code]
  3. File.WriteAllText("shared.txt", "Hello from Process 1!");
复制代码
​监视进程​​:
  1. [/code]csharp
  2. [code]
  3. var watcher = new FileSystemWatcher
  4. {
  5.     Path = Directory.GetCurrentDirectory(),
  6.     Filter = "shared.txt",
  7.     NotifyFilter = NotifyFilters.LastWrite
  8. };
  9. watcher.Changed += (s, e) =>
  10. {
  11.     string content = File.ReadAllText(e.FullPath);
  12.     Console.WriteLine($"File changed: {content}");
  13. };
  14. watcher.EnableRaisingEvents = true;
复制代码
7. COM/DCOM

适用于与遗留系统或非.NET应用程序通信。
​COM服务器示例​​:
  1. [/code]csharp
  2. [code]
  3. [ComVisible(true)]
  4. [Guid("...")]
  5. [ClassInterface(ClassInterfaceType.AutoDual)]
  6. public class MyComServer
  7. {
  8.     public string GetMessage() => "Hello from COM server!";
  9. }
复制代码
​COM客户端​​:
  1. [/code]csharp
  2. [code]
  3. Type comType = Type.GetTypeFromProgID("MyComServer");
  4. dynamic comObject = Activator.CreateInstance(comType);
  5. string message = comObject.GetMessage();
复制代码
选择建议


  • ​高性能需求​​:内存映射文件或定名管道
  • ​跨机器通信​​:WCF或套接字
  • ​可靠异步通信​​:MSMQ
  • ​简单临时通信​​:文件监视
  • ​与旧系统集成​​:COM/DCOM
每种方案都有其适用场景,应根据具体需求选择最合适的IPC技术。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表