Я пишу заменяющую оболочку Windows в C #, и функция, которую я сейчас реализую, заключается в том, чтобы все операции ввода-вывода были в одном и том же окне оболочки, т. Е. Не открывать cmd.exe в другом окне.
Прямо сейчас у меня есть частичное решение для вывода. Это мой код (где p - это запущенный процесс):
while ( !p.HasExited ) {
/* ... - irrelevant */
if ( redirect ) {
try {
p.BeginOutputReadLine();
} catch { }
}
}
Процесс настроен со всеми правильными свойствами, такими как UseShellExecute
= False
, RedirectStandard{Input, Output, Error}
= True
, и обработчики событий настроены правильно, но это противоречиво.
Я пытался убрать try / catch (что я знаю, что это очень плохая практика) и использовал занятый bool, который устанавливается в false при запуске обработчика, но по какой-то причине я все еще получаю InvalidOperationException на p .BeginOutputReadLine () - указывает, что асинхронная операция уже запущена.
Буду признателен за любую помощь, даже если она потребует совершенно иного решения, чем приведенное выше, а не просто исправления.
Спасибо.
РЕДАКТИРОВАТЬ : Вот код, который запускает процесс:
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();
Кроме того, я понял, что не объясняю, что я имею в виду под непоследовательным. Как говорится, картинка стоит 2^3
слова:
![screenshot](https://lucjon.fogbugz.com/default.asp?pg=pgDownload&pgType=pgFile&ixBugEvent=36&ixAttachment=2&sTicket=&sFileName=lshell%20-%20rdrio.bmp)