C # Shell - przekierowanie IO
Piszę zastępczą powłokę Windows w C #, a funkcja, którą obecnie implementuję, ma wszystkie IO wewnątrz tego samego okna powłoki - tzn. Nie otwiera cmd.exe w innym oknie.
W tej chwili mam częściowe rozwiązanie wyjścia. To jest mój kod (gdzie p to działający proces):
while ( !p.HasExited ) {
/* ... - irrelevant */
if ( redirect ) {
try {
p.BeginOutputReadLine();
} catch { }
}
}
Proces jest skonfigurowany ze wszystkimi właściwymi właściwościami, takimi jakUseShellExecute
= False
, RedirectStandard{Input, Output, Error}
= True
, a moduły obsługi zdarzeń są skonfigurowane poprawnie, ale są niespójne.
Próbowałem wyjąć try / catch (co wiem, że jest to bardzo zła praktyka) i używając zajęty bool, który jest ustawiony na false, gdy działa obsługa, ale z jakiegoś powodu nadal otrzymuję InvalidOperationException na p.BeginOutputReadLine ( ) - stwierdzające, że działa już operacja asynchroniczna.
Każda pomoc zostanie doceniona, nawet jeśli wymaga zupełnie innego rozwiązania niż powyższe, a nie tylko jej naprawienia.
Dzięki.
EDYTOWAĆ: Oto kod, który rozpoczyna proces:
if (redirect)
{
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.UseShellExecute = false;
p.OutputDataReceived += new DataReceivedEventHandler(redirectHandler_StdOut);
p.ErrorDataReceived += new DataReceivedEventHandler(redirectHandler_StdErr);
}
p.Start();
Również zdałem sobie sprawę, że nie tłumaczę tego, co rozumiem przez niekonsekwencję. Jak mówią, obraz jest wart2^3
słowa: