System.Diagnostics.Process를 사용하여 stdin/out/err이 리디렉션 된 타사 콘솔 응용 프로그램과 상호 작용합니다. (외부 프로그램은 C++로 작성되었으며 제어 할 수 없습니다.)ProcessStartInfo.CreateNoWindow가 true로 설정된 경우 RedirectStandardInput이 효과가없는 이유는 무엇입니까?
ProcessStartInfo info = new ProcessStartInfo(fileName, arg);
info.CreateNoWindow = false; // <- if true, stdin writes don't make it through
info.UseShellExecute = false;
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
var proc = new Process() { StartInfo = info };
proc.OutputDataReceived += new DataReceivedEventHandler(myOutputHandler);
proc.ErrorDataReceived += new DataReceivedEventHandler(myErrorHandler);
proc.Start();
proc.BeginOutputReadLine();
proc.BeginErrorReadLine();
나중에 ...
proc.StandardInput.WriteLine("some-short-command");
는 테스트 콘솔 응용 프로그램에서 작동 확인하면 info.CreateNoWindow = 거짓; info.CreateNoWindow = true 일 때는 효과가 없습니다.
두 경우 모두 출력 및 오류 리디렉션이 정상적으로 작동합니다.
위의 코드는 FinalBuilder에 대한 사용자 지정 동작을 정의하는 클래스 라이브러리의 일부입니다. 설명 된 동작은 테스트 콘솔 응용 프로그램이나 FinalBuilder 데스크탑 응용 프로그램에서 실행 중일 때 관찰 할 수 있습니다.
흥미롭게도 동일한 사용자 및 환경에서 세 번째 컨텍스트 인 FinalBuilder 서버에서 실행하면 info.CreateNoWindow가 true인지 false인지에 관계없이 StandardInput.WriteLine은 아무런 영향을주지 않습니다.
무슨 일입니까?
실행 컨텍스트에 관계없이 stdin 리디렉션을 작동시킬 수 있습니까?
콘솔 모드 앱에는 콘솔에 쓸 수있는 두 가지 방법이 있습니다. * nix 프로그램처럼 stdout에 쓸 수 있습니다. 또는 원시 콘솔 api를 사용하여 작성할 수 있습니다. 단일 키 누름에 응답하고 색상을 추가하는 것과 같은 맛을 추가합니다. 첫 번째는 리디렉션하고 두 번째는 리디렉션하지 않습니다. 너는 운이없는 끌기가있다. –
통찰력에 감사드립니다. 네이티브 콘솔 API를 사용하여 이러한 콘솔 앱에 입력을 보내는 문제 해결 방법이 있습니까? – 0li
네이티브 콘솔 api 앱이 리디렉션되지 않는 경우 내 작업이 리디렉션되지만 모든 경우에 해당하지 않으므로 혼란 스럽습니다 ... 여기에 뭔가 빠져 있어야합니다. – 0li