C# Process重定向StandardInput时出错,寻求解决方法
解决C#进程标准输入重定向报错"StandardIn has not been redirected."
可能的原因及修复方案
1. 输出读取时机错误导致阻塞
你的代码中先调用process.WaitForExit()再读取StandardOutput,如果子进程输出缓冲区被填满,会导致子进程挂起,进而引发输入流状态异常。调整读取输出的顺序,在写入输入前先异步读取输出,避免缓冲区阻塞:
static void ExecuteExecutable(string executablePath, string file, string fileName) { ProcessStartInfo psi = new ProcessStartInfo { FileName = executablePath, UseShellExecute = false, RedirectStandardInput = true, RedirectStandardOutput = true, CreateNoWindow = true }; using (Process process = new Process()) { process.StartInfo = psi; // 验证进程是否成功启动 if (!process.Start()) { Console.WriteLine("无法启动目标进程,请检查路径是否正确"); return; } // 异步读取输出,避免缓冲区阻塞子进程 Task<string> outputTask = process.StandardOutput.ReadToEndAsync(); // 写入输入数据 process.StandardInput.WriteLine(file); process.StandardInput.WriteLine(fileName); // 关闭输入流,告知子进程没有更多输入 process.StandardInput.Close(); process.WaitForExit(); // 获取输出结果 string output = outputTask.Result; Console.WriteLine(output); } }
2. 进程启动失败
如果目标可执行文件路径错误、权限不足或不存在,进程启动失败后StandardInput会处于未初始化状态,触发该错误。你可以通过process.Start()的返回值判断是否启动成功,同时确认executablePath是绝对路径,或目标文件在当前进程的工作目录下。
3. 启动信息被意外修改
检查代码中是否有其他地方修改了process.StartInfo的属性,比如在process.Start()之前,是否有代码将RedirectStandardInput改回false,或把UseShellExecute设为true——这两个属性必须严格保持UseShellExecute=false、RedirectStandardInput=true才能启用输入重定向。
4. 目标进程不支持标准输入
如果dist.exe本身不接收标准输入数据,即使重定向配置正确,写入操作也可能引发异常,但这种情况通常不会触发"StandardIn has not been redirected"错误,可以先测试用命令行手动向dist.exe输入数据,确认它支持标准输入读取。
内容的提问来源于stack exchange,提问作者Frost Dream
相关产品推荐
相关产品推荐

