Возможно ли перехватить вывод консоли?

#c# #.net #.net-3.5 #console

#c# #.net #.net-3.5 #консоль

Вопрос:

Я вызываю метод, скажем, FizzBuzz() , над которым у меня нет контроля. Этот метод выводит кучу данных на консоль с помощью Console.WriteLine .

Возможно ли для меня перехватить вывод, генерируемый FizzBuzz методом? Обратите внимание, что мое приложение само по себе является консольным приложением.

Ответ №1:

Да, очень возможно:

 var consoleOut = new StringWriter();
Console.SetOut(consoleOut);
Console.WriteLine("This is intercepted."); // This is not written to console
File.WriteAllText("ConsoleOutput.txt", consoleOut.ToString());
  

Позже, если вы захотите прекратить перехватывать вывод консоли, используйте модификацию ниже:

 var stdOut = Console.Out;
// Above interceptor code here..
Console.SetOut(stdOut); // Now all output start going back to console window
  

Или OpenStandardOutput делает то же самое без необходимости сначала сохранять стандартный поток:

 // Above interceptor code here..
var standardOutput = new StreamWriter(Console.OpenStandardOutput());
standardOutput.AutoFlush = true;
Console.SetOut(standardOutput); // Now all output starts flowing back to console
  

Комментарии:

1. Не забудьте сохранить Console.Out перед выполнением этого, чтобы вы могли восстановить его.

2. @Rick: Если только кто-то уже не отключил его! 🙂 Console.OpenStandardOutput() всегда выдаст вам реальный.

3. @Porges: Если FizzBuzz придерживается той же точки зрения, нам не повезло 🙂

4. @Teoman Soygul: стоит отметить, что это работает, только если FizzBuzz выполняется в том же домене приложения. Скорее всего, это не проблема для OP, просто отмечу, для полноты картины.

5. Как насчет перехвата цветного вывода: т.Е.: var oldColor = Console.ForegroundColor; Console.ForegroundColor = color ?? oldColor; Console.Write(message); Console.ForegroundColor = oldColor;