Має вихід консольного додатку в Visual Studio замість консолі


120

Роблячи консольну програму в Java з Eclipse, я бачу, що вихідний текст буде розміщений у текстовому полі в самому IDE, замість того, щоб консоль вискакувала, як у Visual Studio. Це стане в нагоді, оскільки навіть після закінчення програми я все ще можу добре використати текст, який був написаний в ній, оскільки він не стирається, поки я не запускаю його знову. Чи можна чогось подібного досягти за допомогою Visual Studio? Я знаю, що замість того, щоб робити

System.Console.WriteLine(str);

я можу зробити

System.Diagnostics.Debug.WriteLine(str);

але це не зовсім те саме, оскільки ви отримуєте багато "мотлоху" у вікні виводу, як і всі завантажені символи тощо.

Ще краще, чи можливо все зробити в самому IDE під час запуску програми, замість того, щоб консоль працювала?


Яку версію VS ви використовуєте?
Гейб

Чи є у вас панель результатів тесту?
Гейб

Я ніколи цього не помічав. Я перевірю це. Чи повинен я його мати?
пожирав елізіум

Відповіді:


52

У діалоговому вікні «Інструменти» - «Вікно візуальної студії» -> «Налагодження» -> Установіть прапорець «Перенаправити весь текст вікна виводу на негайне вікно».


68
Я встановив цей прапорець, але я все одно отримую спливаюче вікно консолі і нічого у вікні "Вихід" (налагодження, тест, збірка, ..) або "негайне вікно".
GuiSim

6
@EvenLisle вам потрібно змінити тип програми на додаток Windows, як у відповіді stolsvik . Варіант, згаданий у цій відповіді, був для мене за замовчуванням у будь-якому випадку.
TooTone

3
Що точно означає «Перенаправити весь текст вихідного вікна на негайне вікно»? Використовуйте різні контексти, якщо вам потрібно. Мене бентежить те, що таке «безпосереднє вікно».
Xonatron

11
@TooTone У питанні чітко зазначено "консольне додаток" та зміна його на щось інше лише для налагодження, де я не можу навіть Console.ReadKey () - це просто смішно!
MickyD

1
Працює лише з Debug.WriteLine (), не працює з Console.WriteLine () :(
Y2i

45

У діалоговому вікні «Параметри візуальної студії » -> налагодження -> встановіть прапорець «Перенаправити весь текст вікна виводу на негайне вікно». Потім перейдіть до налаштувань свого проекту та змініть тип "Консольна програма" на "Додаток Windows". У цей момент Visual Studio більше не відкриває вікно консолі, а висновок переспрямовується на вікно Output у Visual Studio. Однак ви не можете зробити нічого "креативного", як-от запит на введення ключа або тексту чи очищення консолі - ви отримаєте винятки з виконання.


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 інструменти налагодження, а саме: стек виклику, точки зупинки та вікно команд, як показано нижче:

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

Найкращі побажання!


Тестований у v15.9.4, не працює (принаймні, для консольного додатка).
BTA

Хм. Якщо ви можете поділитися скріншотом своїх конфігурацій, я можу спробувати повторити проблему на своєму кінці. В іншому випадку ви можете поділитися своїм рішенням, якщо воно було вирішено. Примітки до випуску для 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, але це не те, що вказано в ОП.
BTA

1

Ви можете створити програму для обгортки, яку запускаєте замість того, щоб безпосередньо запускати реальну програму. Додаток для обгортки може прослуховувати stdout і перенаправляти все на Trace. Потім змініть налаштування запуску, щоб запустити обгортку, і перейдіть по шляху до реального додатка для запуску.

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


0

Я знаю, що це лише інша відповідь, але я подумав, що я напишу щось для нових веб-розробників, які можуть заплутатися у частині "Змінити додаток для Windows", тому що я вважаю, що за замовчуванням додаток MVC у Visual Studio 2013 за замовчуванням для вихідного типу бібліотеки класів.

Моя веб-програма за замовчуванням встановлена ​​як тип виводу "Бібліотека класів". Не потрібно це змінювати. Все, що мені потрібно було зробити, - це дотримуватися пропозицій перейти до Інструменти> Параметри> Налагодження> Перенаправити весь текст вікна виводу на негайне вікно. Тоді я використав System.Diagnostics.Traceпропозицію Джоела Когурна вище.


0

Просте рішення, яке працює для мене, працювати з консольною здатністю (ReadKey, String з форматом і arg тощо) та бачити та зберігати вихід:

Я пишу TextWriter, який записує до Consoleта, Traceі заміняюConsole.Out його.

якщо ви використовуєте діалогове вікно -> налагодження -> встановіть прапорець "Перенаправити весь текст вихідного вікна на негайне вікно", ви отримаєте його в "Негайне вікно" і досить чисто.

мій код: на початку мого коду:

   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створення багато "мотлоху" у вікні Виведення: Ви можете вимкнути це, натиснувши правою кнопкою миші у вікні виводу. Наприклад, є пункт "Повідомлення для завантаження модуля", який ви хочете відключити, і пункт "Вихід програми", який ви хочете зберегти.


0

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

  1. Ви можете реалізувати власний механізм налагодження для Visual Studio. Налагодження управління двигуном налагодження та налагодження програми. Приклади цього ви можете знайти, як це зробити на 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 # Inththth, виконаний Джоном Скетом: Приклад взято з C # In Depth від Джона Скіта Цей результат виводиться в Text Explorer: Провідник завдань

Коли ми натискаємо на синій вихід, під полем минулого часу, праворуч, і він створює таке: Стандартний вихід

Стандартний вихід - це бажаний вихід, який виробляє Console.WriteLine.

Він функціонує для консолі та для додатків форм Windows у VS 2017, але лише для вихідних даних, генерованих для Test Explorer при налагодженні або запуску; у будь-якому випадку, це моя головна потреба у виведенні 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]);
        }
    }
}

-7

Крок 1: Клацніть правою кнопкою миші на назві проекту в Провіднику рішень, а потім зробіть тип виводу у вигляді програми Windows

Крок 2: Налагодження -> Параметри ..--> Налагодження (розширення) -> Загальне -> Перенаправити весь текст у вікні виводу на негайне вікно


3
Цю відповідь раніше було дано тричі. Це не стосується заданого питання.
Клай
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.