2013-07-21 7 views
3

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 리디렉션을 작동시킬 수 있습니까?

+1

콘솔 모드 앱에는 콘솔에 쓸 수있는 두 가지 방법이 있습니다. * nix 프로그램처럼 stdout에 쓸 수 있습니다. 또는 원시 콘솔 api를 사용하여 작성할 수 있습니다. 단일 키 누름에 응답하고 색상을 추가하는 것과 같은 맛을 추가합니다. 첫 번째는 리디렉션하고 두 번째는 리디렉션하지 않습니다. 너는 운이없는 끌기가있다. –

+0

통찰력에 감사드립니다. 네이티브 콘솔 API를 사용하여 이러한 콘솔 앱에 입력을 보내는 문제 해결 방법이 있습니까? – 0li

+0

네이티브 콘솔 api 앱이 리디렉션되지 않는 경우 내 작업이 리디렉션되지만 모든 경우에 해당하지 않으므로 혼란 스럽습니다 ... 여기에 뭔가 빠져 있어야합니다. – 0li

답변

0

확실한 이유가 있지만 여기에 명시 적으로 사용자를 지정하지 않으면 문제 해결 :

proc.UserName = user; 
proc.Domain= domain; 
proc.Password= password; 

매우 우아하지 않음을하지만 나를 위해 작동하고 사람을 도움이 될 수 있습니다.