我有两个程序。为简单起见,程序 A 从控制台获取任何输入并将其打印出来。程序 B(在 C# 中)应该将输入发送到程序 A。
程序 A 从 .bat 文件启动,类似于“start ProgramA.exe”。在程序 B 中,当我尝试访问程序 A 的标准输入时:
programAProcess.StandardInput
我收到错误 System.InvalidOperationException: StandardIn has not been redirected
如果我通过程序 B 启动了程序 A,我通常会执行类似
process.StartInfo.RedirectStandardInput = true;
的操作,但我无法使用已在程序外部启动的进程来执行此操作。
我可以在命令中添加什么来启动程序 A 并能够从程序 B 访问其输入?
方案A:
internal class Program
{
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("Input: ");
string input = Console.ReadLine();
if (input.ToLower() == "q")
break;
else
Console.WriteLine(input);
}
}
}
方案B:
internal class Program
{
static void Main(string[] args)
{
Process programA = Process.GetProcessesByName("ProgramA")[0];
while (true)
{
Console.WriteLine("Input: ");
string input = Console.ReadLine();
if (input.ToLower() == "q")
break;
else
{
if (programA == null)
return;
Console.WriteLine(programA.ProcessName + " : " + programA.ToString());
StreamWriter inputWriter = programA.StandardInput;
inputWriter.WriteLine("input");
}
}
}
}
一般来说,据我所知,你不能。
输入/输出不能从外部自由连接。也就是说,如果程序 A 的进程是用某个标准输入(例如控制台窗口或管道或文件)启动的,那么它就专门附加到该输入 - 另一个程序不能单方面将其他东西拼接到该连接中,即使如果您仍然想保留原始输入(一对一),则更是如此。
可以使用多种解决方法;例如如果有一个控制台窗口,那么那个窗口可以发送输入事件(例如,类似于 AHK 的方式),它将尽职地转发到进程。
如果您通常控制该进程的启动方式,则可以预先创建一个命名管道 (
\\.\pipe\foo
) 并在启动时重定向其中的输入,然后进程 B 可以单独启动并打开同一个管道。
如果您对正在运行的进程拥有必要的权限,您可能可以像调试器一样附加到它,并强制它从其他源重新打开自己的标准输入(必须关闭原始源),例如创建一个命名管道并以某种方式将其读取端注入到另一个进程中。