2017-01-15 3 views
0

Я считаю, что это хорошо известная проблема последних версий Visual Studio IDE. Если мы попытаемся добавить команды перенаправления в поле «Параметры командной строки» в «Параметры запуска» на странице «Свойства проекта», например «> output.txt», тогда мы попадаем в беду.Быстрое перенаправление консоли ввода-вывода для приложения C#

Мы можем получить обходной путь, сняв флажок «Включить визуальный процесс хостинга Studio», но когда мы запускаем программу «без отладки» (control-F5), перенаправление не работает и «> output.txt», возвращается как аргумент программы.

Вопрос в том, как мы можем сделать перенаправление для работы во всех конфигурациях?

Ну, поиск StackOverflow Я нашел несколько вариантов, и я разработал средство для быстрого и грязного решения, хорошего для отладки и nop для выпуска. Я хотел бы поделиться этим с вами.

ответ

0

Я предлагаю создать статический конструктор в классе Program (класс, который имеет метод Main), и сделать там перенаправление. Таким образом мы можем быстро активировать или деактивировать его.

Мы можем улучшить решение, возможно, используя Environment.CommandLine для анализа аргументов программы, ища аргументы, начинающиеся с «<» или «>», но я предпочитаю более простую вещь.

Следующая простая программа использует этот подход.

using System; 

namespace RedirectConsoleSample 
{ 
    class Program 
    { 
#if DEBUG 
     static Program() 
     { 
      System.IO.TextReader oldConsoleTextReader = Console.In; 
      System.IO.TextWriter oldConsoleTextWriter = Console.Out; 
      System.IO.TextReader newConsoleTextReader = null; 
      System.IO.TextWriter newConsoleTextWriter = null; 

      AppDomain.CurrentDomain.ProcessExit += delegate (object sender, EventArgs e) 
      { 
       try 
       { 
        Console.Out.Flush(); 
        Console.SetOut(oldConsoleTextWriter); 
        Console.SetIn(oldConsoleTextReader); 

        if (newConsoleTextWriter != null) 
        { 
         newConsoleTextWriter.Close(); 
         newConsoleTextWriter = null; 
        } 

        if (newConsoleTextReader != null) 
        { 
         newConsoleTextReader.Close(); 
         newConsoleTextReader = null; 
        } 
       } 
       catch (Exception ex) 
       { 
        System.Diagnostics.Trace.TraceError("ProcessExit: " + ex.Message); 
       } 
      }; 

      newConsoleTextReader = new System.IO.StreamReader("Input.txt", System.Text.Encoding.Default, true); 
      newConsoleTextWriter = new System.IO.StreamWriter("Output.txt", false, System.Text.Encoding.Default); 

      Console.Out.Flush(); 
      Console.SetIn(newConsoleTextReader); 
      Console.SetOut(newConsoleTextWriter); 
     } 
#endif 
     static void Main(string[] args) 
     { 
      for (int i = 0; i < args.Length; i++) 
       Console.Out.WriteLine("argument[{0}] = '{1}'", i, args[i]); 

      for (string line = Console.In.ReadLine(); line != null; line = Console.In.ReadLine()) 
       Console.Out.WriteLine(line); 
     } 
    } 
} 

Надеюсь, это может быть полезно.

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