Как скрыть вывод (не окно) в консольном приложении? - PullRequest
2 голосов
/ 14 сентября 2011

Хорошо, позвольте мне прояснить это снова.У меня есть консольное приложение со многими классами, в каждом классе есть по крайней мере одна строка Console.WriteLine ("text").Я определил некоторые аргументы, что при запуске приложения оно выводит именно то, что я написал в классах.Там я хочу определить аргумент, что при запуске приложения с этим аргументом на экране консоли не будет никакого вывода, но окно консоли все равно появится.Аргумент может быть что-то вроде "-s".Так есть ли способ сделать это, не используя условие «если» в каждом классе и передавая параметр через классы?Большое спасибо.

P / S: Я искал в интернете и нашел несколько статей, связанных с этим, но большинство ответов было скрыть окно консоли.Я думаю, что этот вопрос должен быть тем, что имели в виду другие.

Ответы [ 7 ]

7 голосов
/ 14 сентября 2011

Используйте Console.SetOut (http://msdn.microsoft.com/en-us/library/system.console.setout.aspx) и передайте "нулевой" текстовый редактор. Идея -s выполнить Console.SetOut(new StreamWriter()).

Пример использования метода Console.SetOut поможет вам начать работу.

Кроме того, вы можете легко добавить протоколирование, используя этот метод.

4 голосов
/ 18 октября 2016

Метод Console.SetOut выдает ArgumentNullException, если вы передаете null напрямую;то же самое для StreamWriter (если вы передаете поток или если вы пропускаете строку .

Я использую передачу специального Stream.Null*Поле 1015 * для StreamWriter:

System.Console.SetOut(new System.IO.StreamWriter(System.IO.Stream.Null);

Это перенаправляет поток на то, что по сути является нулевым устройством (/dev/null на * машинах NIX).

4 голосов
/ 14 сентября 2011

Используйте эти методы для перенаправления вывода (программно):

    Console.SetIn(...);
    Console.SetOut(...);
    Console.SetError(...);
3 голосов
/ 14 сентября 2011
app.exe > nul

перенаправляет вывод в никуда. К вашему сведению: Использование операторов перенаправления команд

0 голосов
/ 13 марта 2018

Это сработало очень хорошо для меня !:

Console.SetOut(StreamWriter.Null);
Console.SetError(StreamWriter.Null);

Это не работает:

Console.SetOut(null);
Console.SetError(null);

В результате получается ArgumentNullException.

Это не работает:

Console.SetOut(new StreamWriter(null));
Console.SetError(new StreamWriter(null));

Потому что это неоднозначно между new StreamWriter(string path) и new StreamWriter(Stream stream).

И наконец , ни одна из этих работ:

Console.SetOut(new StreamWriter(default(string)));
Console.SetError(new StreamWriter(default(Stream)));

Потому что они также приводят к ArgumentNullException.

0 голосов
/ 14 сентября 2011

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

0 голосов
/ 14 сентября 2011

Если вы сталкивались с Console.Clear () , вы можете вызвать это так, чтобы казалось, что текст вообще не выводился.

Что касается необходимости избегать отдельного определенияэто в каждом классе вы должны смотреть на наследование.Это позволяет вам определять функциональность в одном месте, и каждый «подчиненный» класс унаследует это.

...