Наличие вывода консольного приложения в Visual Studio вместо консоли

120

Когда я выполняю консольное приложение на Java с Eclipse, я вижу, что вывод помещается в текстовое поле в самой среде IDE, вместо того, чтобы выскакивать консоль, как в Visual Studio. Это удобно, поскольку даже после выхода из программы я все еще могу эффективно использовать текст, который был в ней написан, поскольку он не стирается, пока я не запустил его снова. Возможно ли добиться чего-то подобного с помощью Visual Studio? Я знаю, что вместо того, чтобы делать

System.Console.WriteLine(str);

я могу сделать

System.Diagnostics.Debug.WriteLine(str);

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

Еще лучше, можно ли все сделать в самой среде IDE, когда вы запускаете приложение, вместо того, чтобы запускать консоль?

пожрал элизиум
источник
Какую версию VS вы используете?
Гейб
У вас есть панель результатов теста?
Гейб
Я этого никогда не замечал. Я проверю его. Мне это нужно?
пожрал элизиум

Ответы:

52

В меню «Инструменты» -> «Параметры Visual Studio» -> «Отладка» -> установите флажок «Перенаправить весь текст окна вывода в непосредственное окно».

SharpSteve
источник
68
Я установил этот флажок, но я все еще получаю всплывающее окно консоли и ничего не вижу в окне «Вывод» (отладка, тест, сборка, ..) или в «Немедленное окно».
GuiSim
6
@EvenLisle вам нужно изменить тип приложения на приложение Windows, как в ответе stolsvik . Опция, упомянутая в этом ответе, в любом случае для меня была включена по умолчанию.
TooTone
3
Что именно означает «Перенаправить весь текст окна вывода в окно непосредственного вывода»? Если нужно, используйте различные контексты. Меня смущает, что такое «ближайшее окно».
Xonatron
11
@TooTone В этом вопросе четко говорится о «консольном приложении», и изменение его на что-то другое только для целей отладки, когда я не могу даже Console.ReadKey () , просто смешно!
MickyD
1
Работает только с Debug.WriteLine (), не работает с Console.WriteLine () :(
Y2i
45

В диалоговом окне параметров Visual Studio -> Отладка -> установите флажок «Перенаправить весь текст окна вывода в непосредственное окно». Затем перейдите в настройки вашего проекта и измените тип с «Консольное приложение» на «Приложение для Windows». В этот момент Visual Studio больше не открывает окно консоли, а вывод перенаправляется в окно вывода в Visual Studio. Однако вы не можете делать ничего «творческого», например, запрашивать ввод ключа или текста или очищать консоль - вы получите исключения во время выполнения.

stolsvik
источник
25
Я считаю это особенно неуклюжим. Интересно, в чем причина этого в VS? У всех современных IDE должна быть возможность иметь панель внутри самой IDE, которая ведет себя как консоль для ввода и вывода. (чешет голову)
12
В вопросе четко говорится о «консольном приложении» и его замене на что-то другое только для целей отладки, где я даже не могу, Console.ReadKey()это просто смешно!
MickyD
Не уверен, почему, но когда я попытался вернуть Output typeсвое приложение из приложения Windows в консоль, окно консоли не было видно, когда я запускаю свое приложение. Я могу отлаживать приложение, и Mainточка входа тоже попадает. Я также отменил настройку параметра, упомянутого в этом сообщении, но безрезультатно. Я использую версию сообщества VS 2017. Я потерял окно консоли (рыдает).
RBT
3
Как бы то ни было, в VS 15.8.7 единственный способ получить вывод для перенаправления для консольного приложения - это изменить его на приложение Windows и оставить поле «Перенаправление» НЕ ПРОВЕРЕННО. Если я поставлю флажок, вывод не будет отображаться.
dpberry178
6

использование System.Diagnostics.Trace

В зависимости от того, какие слушатели вы подключаете, вывод трассировки может идти в окно отладки, консоль, файл, базу данных или все сразу. Возможности буквально безграничны, поскольку реализовать собственный TraceListener чрезвычайно просто.

Джоэл Кохорн
источник
Да, но я хочу знать, возможно ли это просто сделать, без необходимости реализовывать это самостоятельно.
пожрал элизиум
@devoured По умолчанию класс Trace выводит только в окно отладки. Вам нужно только прикрепить дополнительных слушателей (а есть несколько уже написанных, которые вы можете использовать), если вы хотите также видеть результат в другом месте.
Joel Coehoorn
1
Я зашел в диалоговое окно «Параметры отладки» и выбрал «Перенаправить весь текст окна вывода в окно немедленного выполнения», чтобы выходные данные трассировки переходили в окно «Немедленное», чтобы не было путаницы с отладочной чушью.
Гейб
2

Пришло время проверить последнюю версию Visual Studio, ребята. Наиболее рекомендуемое решение, которое раньше не работало для некоторых из вас, может сработать сейчас.

В Visual Studio 2017 ( версия выпуска 15.4.2 и выше) Tools > Options > Debugging > General > (Check Box) Redirect all Output Window text to Immediate Windowу меня сработало.

Несколько примечаний: 1. Чтобы увидеть непосредственное окно, убедитесь, что вы находитесь в режиме отладки . 2. Теперь в вашем распоряжении должны быть 3 других инструмента отладки, а именно стек вызовов, точки останова и окно команд, как показано ниже:

введите описание изображения здесь

С наилучшими пожеланиями!

kuzevni
источник
Протестировано в v15.9.4, не работает (по крайней мере, для консольного приложения).
bta 05
Хм. Если вы можете поделиться снимком экрана своих конфигураций, я могу попытаться воспроизвести проблему со своей стороны. В противном случае вы можете поделиться своим решением, если оно решено. Примечания к выпуску Visual Studio 15.9.4 доступны по адресу docs.microsoft.com/en-us/visualstudio/releasenotes/… , в зависимости от среды вы можете найти там несколько полезных советов. Visual Studio 2017 (окно вывода) Документация : docs.microsoft.com/en-us/visualstudio/ide/reference/…
kuzevni
Дважды убедитесь, что проект, с которым вы тестируете, был создан как «консольное приложение», а не как «приложение Windows». Ваш подход работает с приложением Windows, но это не то, что указано в OP.
bta
1

Вы можете создать приложение-оболочку, которое вы запускаете, вместо того, чтобы напрямую запускать свое настоящее приложение. Приложение-оболочка может прослушивать stdout и перенаправлять все на Trace. Затем измените параметры запуска, чтобы запустить оболочку и передать путь к реальному приложению для запуска.

Вы также можете настроить автоматическое присоединение отладчика к новому процессу, если отладчик прикреплен к оболочке.

Сэмюэл Нефф
источник
0

Я знаю, что это просто еще один ответ, но я подумал, что напишу что-нибудь для новых веб-разработчиков, которые могут запутаться в части «Переход на приложение Windows», потому что я думаю, что по умолчанию приложение MVC в Visual Studio 2013 по умолчанию используется выходной тип библиотеки классов.

Мое веб-приложение по умолчанию настроено как выходной тип «Библиотеки классов». Вам не нужно это менять. Все, что мне нужно было сделать, это последовать советам: «Инструменты»> «Параметры»> «Отладка»> «Перенаправить весь текст окна вывода в окно немедленного выполнения». Затем я использовал System.Diagnostics.Traceпредложение Джоэла Кохорна выше.

joshmcode
источник
0

Простое решение, которое работает для меня, для работы с возможностью консоли (ReadKey, String with Format и arg и т. Д.), А также для просмотра и сохранения вывода:

Я пишу TextWriter, который пишет в Consoleи в Traceи заменяет Console.Outим.

если вы используете Dialog -> Debugging -> Отметьте «Перенаправить весь текст окна вывода в Immediate Window», вы получите его в Immediate Window и довольно чисто.

мой код: в начале моего кода:

   Console.SetOut(new TextHelper());

и класс:

public class TextHelper : TextWriter
    {
        TextWriter console;

        public TextHelper() {
            console = Console.Out;
        }

        public override Encoding Encoding { get { return this.console.Encoding; } }
        public override void WriteLine(string format, params object[] arg)
        {
            string s = string.Format(format, arg);
            WriteLine(s);
        }
        public override void Write(object value)
        {
            console.Write(value);
            System.Diagnostics.Trace.Write(value);
        }

        public override void WriteLine(object value)
        {
            Write(value);
            Write("\n");
        }
        public override void WriteLine(string value)
        {
            console.WriteLine(value);
            System.Diagnostics.Trace.WriteLine(value);

        }

    }

Примечание: я переопределяю только то, что мне нужно, поэтому, если вы пишете другие типы, вам следует переопределить больше

Сарел Фойерлихт
источник
0

относительно System.Diagnostics.Debugсоздания большого количества «мусора» в окне вывода: вы можете отключить это, щелкнув правой кнопкой мыши в окне вывода. Например, есть элемент «Сообщения о загрузке модуля», который вы хотите отключить, и элемент «Вывод программы», который вы хотите сохранить.

user829755
источник
0

У вас есть три возможности сделать это, но это нетривиально. Основная идея всех IDE заключается в том, что все они являются родителями дочерних (отладочных) процессов. В этом случае можно работать со стандартным вводом, выводом и обработчиком ошибок. Таким образом, IDE запускают дочерние приложения и перенаправляют их во внутреннее окно вывода. Я знаю еще об одной возможности, но она появится в будущем

  1. Вы можете реализовать свой собственный механизм отладки для Visual Studio. Запуск и отладка управления Debug Engine для приложения. Примеры этого вы можете найти на docs.microsoft.com ( движок отладки Visual Studio ).
  2. Перенаправление приложения формы с использованием дублирования обработчика std для c ++ или использование Console.SetOut (TextWriter) для c #. Если вам нужно печатать в окне вывода, вам необходимо использовать SDK расширения Visual Studio. Пример второго варианта вы можете найти на Github .
  3. Запустите приложение, которое использует System.Diagnostics.Debug.WriteLine (для вывода на печать), и оно запустит дочернее приложение. При запуске дочернего элемента вам необходимо перенаправить stdout в родительский с каналами. Вы можете найти пример на MSDN. Но я считаю, что это не лучший способ.
Галина Хрычикова
источник
0

Если вам нужен вывод из Console.WriteLine, а перенаправить весь текст окна вывода в немедленное окно не работает, и вам нужно знать вывод тестов из интегрированного обозревателя тестов, используя NUnit.Framework, наша проблема уже решена в VS 2017 :

Пример взят из C # In Depth от Джона Скита: Пример взят из C # In Depth от Джона Скита это дает следующий результат в Text Explorer: Обозреватель задач

Когда мы щелкаем синий вывод в разделе Истекшее время справа, и получается следующее: Стандартный выход

Стандартный вывод - это желаемый результат, создаваемый Console.WriteLine.

Он работает для консоли и для приложений Windows Form в VS 2017, но только для вывода, созданного для обозревателя тестов при отладке или запуске; в любом случае, это моя основная потребность в выводе Console.WriteLine.

Марсело Скофано
источник
-1

Вместо этого вы можете собрать результат в результате теста.

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

Если вашей целью является отладка, это простой способ предложить повторяемый сценарий отладки.

namespace Commandline.Test
{
    using Microsoft.VisualStudio.TestTools.UnitTesting;

    [TestClass]
    public class CommandlineTests
    {
        [TestMethod]
        public void RunNoArguments()
        {
            Commandline.Program.Main(new string[0]);
        }
    }
}
uffehellum
источник
-7

Шаг 1. Щелкните правой кнопкой мыши имя проекта в обозревателе решений, затем выберите тип вывода как оконное приложение.

Шаг 2: Отладка -> Параметры .. -> Отладка (развернуть) -> Общие -> Перенаправить весь текст окна вывода в окно немедленного доступа

Баладжи Динакаран
источник
3
Ранее этот ответ давался трижды. Он не отвечает на заданный вопрос.
Клей