Быстрое перенаправление консольного ввода-вывода для приложения c#

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

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

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

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

1 ответ

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

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

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

    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);
            }
        }
    }
    

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