马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
C# 应用进程间通信(IPC)技术方案
进程间通信(Inter-Process Communication, IPC)是不同进程之间互换数据和消息的机制。以下是C#中常用的IPC技术方案:
1. 定名管道(Named Pipes)
适用于本地机器上的进程通信,支持双向通信。
服务端示例:- [/code]csharp
- [code]
- using System.IO.Pipes;
- var server = new NamedPipeServerStream("MyPipe", PipeDirection.InOut);
- server.WaitForConnection();
- using (StreamReader reader = new StreamReader(server))
- using (StreamWriter writer = new StreamWriter(server))
- {
- string message = reader.ReadLine();
- Console.WriteLine($"Received: {message}");
- writer.WriteLine("Hello from server!");
- writer.Flush();
- }
复制代码 客户端示例:- [/code]csharp
- [code]
- using System.IO.Pipes;
- var client = new NamedPipeClientStream(".", "MyPipe", PipeDirection.InOut);
- client.Connect();
- using (StreamReader reader = new StreamReader(client))
- using (StreamWriter writer = new StreamWriter(client))
- {
- writer.WriteLine("Hello from client!");
- writer.Flush();
- string response = reader.ReadLine();
- Console.WriteLine($"Server response: {response}");
- }
复制代码 2. 内存映射文件(Memory-Mapped Files)
允许不同进程通过共享内存进行通信。
写入进程:- [/code]csharp
- [code]
- using System.IO.MemoryMappedFiles;
- using (var mmf = MemoryMappedFile.CreateOrOpen("MySharedMemory", 1024))
- using (var accessor = mmf.CreateViewAccessor())
- {
- byte[] message = Encoding.UTF8.GetBytes("Hello from Process 1!");
- accessor.WriteArray(0, message, 0, message.Length);
- }
复制代码 读取进程:- [/code]csharp
- [code]
- using (var mmf = MemoryMappedFile.OpenExisting("MySharedMemory"))
- using (var accessor = mmf.CreateViewAccessor())
- {
- byte[] buffer = new byte[1024];
- accessor.ReadArray(0, buffer, 0, buffer.Length);
- string message = Encoding.UTF8.GetString(buffer).TrimEnd('\0');
- Console.WriteLine($"Received: {message}");
- }
复制代码 3. WCF (Windows Communication Foundation)
.NET框架提供的强大通信框架,支持多种协议。
服务端:- [/code]csharp
- [code]
- using System.ServiceModel;
- [ServiceContract]
- public interface IMyService
- {
- [OperationContract]
- string GetMessage();
- }
- public class MyService : IMyService
- {
- public string GetMessage() => "Hello from WCF service!";
- }
- var host = new ServiceHost(typeof(MyService), new Uri("net.pipe://localhost"));
- host.AddServiceEndpoint(typeof(IMyService), new NetNamedPipeBinding(), "MyService");
- host.Open();
复制代码 客户端:- [/code]csharp
- [code]
- var factory = new ChannelFactory<IMyService>(
- new NetNamedPipeBinding(),
- new EndpointAddress("net.pipe://localhost/MyService"));
-
- IMyService proxy = factory.CreateChannel();
- string message = proxy.GetMessage();
- Console.WriteLine($"Service response: {message}");
复制代码 4. 套接字(Sockets)
适用于网络通信,也可用于本地进程间通信。
TCP服务端:- [/code]csharp
- [code]
- var listener = new TcpListener(IPAddress.Loopback, 12345);
- listener.Start();
- var client = listener.AcceptTcpClient();
- using (var stream = client.GetStream())
- using (var reader = new StreamReader(stream))
- using (var writer = new StreamWriter(stream))
- {
- string request = reader.ReadLine();
- writer.WriteLine($"Echo: {request}");
- writer.Flush();
- }
复制代码 TCP客户端:- [/code]csharp
- [code]
- var client = new TcpClient("localhost", 12345);
- using (var stream = client.GetStream())
- using (var reader = new StreamReader(stream))
- using (var writer = new StreamWriter(stream))
- {
- writer.WriteLine("Hello from client!");
- writer.Flush();
- string response = reader.ReadLine();
- Console.WriteLine(response);
- }
复制代码 5. 消息队列(MSMQ)
适用于异步、可靠的进程间通信。
发送消息:- [/code]csharp
- [code]
- using System.Messaging;
- if (!MessageQueue.Exists(@".\Private$\MyQueue"))
- MessageQueue.Create(@".\Private$\MyQueue");
- var queue = new MessageQueue(@".\Private$\MyQueue");
- queue.Send("Hello from sender process!", "Test Message");
复制代码 接收消息:- [/code]csharp
- [code]
- var queue = new MessageQueue(@".\Private$\MyQueue");
- queue.Formatter = new XmlMessageFormatter(new[] { typeof(string) });
- Message message = queue.Receive();
- Console.WriteLine($"Received: {message.Body}");
复制代码 6. 文件监视(File System Watcher)
通过共享文件和文件系统变乱进行通信。
写入进程:- [/code]csharp
- [code]
- File.WriteAllText("shared.txt", "Hello from Process 1!");
复制代码 监视进程:- [/code]csharp
- [code]
- var watcher = new FileSystemWatcher
- {
- Path = Directory.GetCurrentDirectory(),
- Filter = "shared.txt",
- NotifyFilter = NotifyFilters.LastWrite
- };
- watcher.Changed += (s, e) =>
- {
- string content = File.ReadAllText(e.FullPath);
- Console.WriteLine($"File changed: {content}");
- };
- watcher.EnableRaisingEvents = true;
复制代码 7. COM/DCOM
适用于与遗留系统或非.NET应用程序通信。
COM服务器示例:- [/code]csharp
- [code]
- [ComVisible(true)]
- [Guid("...")]
- [ClassInterface(ClassInterfaceType.AutoDual)]
- public class MyComServer
- {
- public string GetMessage() => "Hello from COM server!";
- }
复制代码 COM客户端:- [/code]csharp
- [code]
- Type comType = Type.GetTypeFromProgID("MyComServer");
- dynamic comObject = Activator.CreateInstance(comType);
- string message = comObject.GetMessage();
复制代码 选择建议
- 高性能需求:内存映射文件或定名管道
- 跨机器通信:WCF或套接字
- 可靠异步通信:MSMQ
- 简单临时通信:文件监视
- 与旧系统集成:COM/DCOM
每种方案都有其适用场景,应根据具体需求选择最合适的IPC技术。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|