写一个C#双管道进行进程通讯的 Demo
时间: 2023-11-23 08:25:14 浏览: 34
以下是一个使用 C# 双管道进行进程通讯的 Demo:
```csharp
using System;
using System.Diagnostics;
using System.IO;
using System.IO.Pipes;
using System.Text;
namespace DualPipeDemo
{
class Program
{
static void Main(string[] args)
{
// 创建两个管道,一个用于父进程向子进程发送数据,另一个用于子进程向父进程发送数据
NamedPipeServerStream parentToChildPipe = new NamedPipeServerStream("ParentToChildPipe");
NamedPipeServerStream childToParentPipe = new NamedPipeServerStream("ChildToParentPipe");
// 启动子进程
Process childProcess = new Process();
childProcess.StartInfo.FileName = "child.exe";
childProcess.StartInfo.Arguments = "arg1 arg2";
childProcess.StartInfo.UseShellExecute = false;
childProcess.StartInfo.RedirectStandardOutput = true;
childProcess.StartInfo.RedirectStandardInput = true;
// 将子进程的标准输入和输出重定向到管道
childProcess.StartInfo.RedirectStandardInput = true;
childProcess.StartInfo.RedirectStandardOutput = true;
childProcess.StartInfo.StandardOutputEncoding = Encoding.UTF8;
childProcess.StartInfo.Arguments = string.Format("{0} {1}", parentToChildPipe.GetClientHandleAsString(), childToParentPipe.GetClientHandleAsString());
childProcess.Start();
childToParentPipe.WaitForConnection();
parentToChildPipe.WaitForConnection();
// 父进程向子进程发送数据
string message = "Hello, child process!";
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
parentToChildPipe.Write(messageBytes, 0, messageBytes.Length);
// 子进程向父进程发送数据
string response = childProcess.StandardOutput.ReadLine();
byte[] responseBytes = Encoding.UTF8.GetBytes(response);
childToParentPipe.Write(responseBytes, 0, responseBytes.Length);
// 关闭管道和子进程
parentToChildPipe.Close();
childToParentPipe.Close();
childProcess.WaitForExit();
}
}
}
```
在上面的代码中,我们使用了 NamedPipeServerStream 类来创建两个管道,一个用于父进程向子进程发送数据,另一个用于子进程向父进程发送数据。然后,我们使用 Process 类启动子进程,并将子进程的标准输入和输出重定向到管道中。父进程向子进程发送数据时,我们使用管道的 Write 方法将数据写入管道中。子进程向父进程发送数据时,我们使用子进程的 StandardOutput 属性读取管道中的数据,并使用管道的 Write 方法将数据写入到管道中。最后,我们关闭管道和子进程。