2013-02-18 3 views
1

Мое приложение App использует другую мою заявку SubApp. Когда App нуждается в SubApp, он создает процесс с SubApp, помещая данные в SubAppstdin и читает с SubAppstdout.Стандартный ввод/вывод в процессе C#

Проблема заключается в том, что SubApp использует библиотеку, которая иногда записывается в stdout.

Фрагмент SubApp кода:

OutsideLibrary.DoSomeInitialization(); // <-- this sometimes writes to stdout 
Stream input = Console.OpenStandardInput(); 
Stream output = Console.OpenStandardOutput(); 
data = (dataFormat)formatter.Deserialize(input); 
//do some job 
formatter.Serialize(output, result); 

Есть ли способ, чтобы предотвратить код я не имею писать на стандартный вывод?

ответ

2

Предполагая, что вы хотите отключить внешний компонент компонента, и у вас есть контроль над остальным кодом SubApp, вы можете выполнить следующий трюк: перенаправить стандартный вывод на нуль при загрузке приложения. Когда вам нужно что-то записать в стандартный вывод стандартного вывода стандартного вывода, напишите и снова установите значение null.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace stdio 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.SetOut(System.IO.TextWriter.Null); 
      Console.WriteLine("This will go to > null"); 
      WriteOutput("This is written to standard output"); 
      Console.WriteLine("This will also go to > null"); 
      Console.ReadKey(); 
     } 

     static void WriteOutput(String someString) 
     { 
      Console.SetOut(Console.Out); 
      Stream output = Console.OpenStandardOutput(); 
      StreamWriter sw = new StreamWriter(output); 
      sw.Write(someString); 
      sw.Flush(); 
      sw.Close(); 
      output.Close(); 
      Console.SetOut(System.IO.TextWriter.Null); 
     } 



    } 
} 
1

Я попытался это:

StreamWriter sw = new StreamWriter(@"c:\nul"); 
Console.SetOut(sw); 
Console.WriteLine("hello!"); 

Но он бросает исключение в новом StreamWriter().

Следующая могли бы работать (назовем его, прежде чем ваш внешний модуль становится активным):

StreamWriter sw = new StreamWriter(Stream.Null); 
Console.SetOut(sw); 

Обходной бы открыть реальный текстовый файл и удалить его.

Смежные вопросы