Posiadanie danych wyjściowych aplikacji konsolowej w programie Visual Studio zamiast konsoli

120

Podczas wykonywania aplikacji konsolowej w Javie z Eclipse widzę, że dane wyjściowe są umieszczane w polu tekstowym w samym IDE, zamiast wyświetlać konsolę, jak w Visual Studio. Jest to przydatne, ponieważ nawet po zamknięciu programu nadal mogę dobrze wykorzystać tekst, który został w nim napisany, ponieważ nie zostanie on usunięty, dopóki nie uruchomię go ponownie. Czy w Visual Studio można osiągnąć coś takiego? Wiem to zamiast robić

System.Console.WriteLine(str);

mogę zrobić

System.Diagnostics.Debug.WriteLine(str);

ale to nie to samo, ponieważ dostajesz dużo "śmieci" w oknie Output, jak wszystkie załadowane symbole i tym podobne.

Co więcej, czy możliwe jest wykonanie wszystkiego w samym IDE podczas uruchamiania aplikacji zamiast uruchamiania konsoli?

pożarł elizjum
źródło
Jakiej wersji VS używasz?
Gabe
Czy masz okienko z wynikami testu?
Gabe
Nigdy tego nie zauważyłem. Sprawdzę to. Powinienem to mieć?
pożarł Elizjum

Odpowiedzi:

52

W oknie dialogowym Narzędzia -> Opcje programu Visual Studio -> Debugowanie -> zaznacz opcję „Przekieruj cały tekst okna wyjściowego do okna bezpośredniego”.

SharpSteve
źródło
68
Zaznaczam to pole wyboru, ale nadal pojawia się wyskakujące okienko konsoli i nic w oknie „Wyjście” (debugowanie, testowanie, kompilacja itp.) Ani w „oknie bezpośrednim”.
GuiSim
6
@EvenLisle musisz zmienić typ aplikacji na aplikację Windows, tak jak w odpowiedzi stolsvik . W każdym razie opcja wymieniona w tej odpowiedzi była dla mnie domyślnie włączona.
TooTone
3
Co dokładnie oznacza „Przekieruj cały tekst z okna wyjściowego do okna bezpośredniego”? W razie potrzeby użyj różnych kontekstów. Nie wiem, co to jest „bezpośrednie okno”.
Xonatron,
11
@TooTone Pytanie wyraźnie mówi o „aplikacji konsolowej” i zmienianiu jej na coś innego tylko w celach debugowania, gdzie nie mogę nawet Console.ReadKey () jest po prostu śmieszne!
MickyD
1
Działa tylko z Debug.WriteLine (), nie działa z Console.WriteLine () :(
Y2i
45

W oknie dialogowym opcji programu Visual Studio -> Debugowanie -> zaznacz opcję „Przekieruj cały tekst okna wyjściowego do okna bezpośredniego”. Następnie przejdź do ustawień projektu i zmień typ z „Aplikacja konsoli” na „Aplikacja Windows”. W tym momencie program Visual Studio nie otwiera już okna konsoli, a dane wyjściowe są przekierowywane do okna danych wyjściowych w programie Visual Studio. Nie możesz jednak zrobić niczego „kreatywnego”, na przykład zażądać klucza lub wprowadzenia tekstu lub wyczyścić konsolę - otrzymasz wyjątki w czasie wykonywania.

stolsvik
źródło
25
Uważam to za szczególnie niezdarne. Zastanawiam się, jakie jest uzasadnienie tego w VS? Wszystkie współczesne IDE powinny mieć możliwość posiadania panelu w samym IDE, zachowującego się jak konsola dla wejścia i wyjścia. (drapie głowę)
12
Pytanie wyraźnie dotyczy „aplikacji konsolowej” i zmiana jej na coś innego tylko w celu debugowania, gdzie nie mogę, Console.ReadKey()jest po prostu śmieszne!
MickyD
Nie wiem, dlaczego, ale kiedy próbowałem przywrócić Output typemoją aplikację z aplikacji Windows do konsoli, okno konsoli nie jest widoczne, gdy uruchamiam moją aplikację. Jestem w stanie debugować aplikację, a Mainpunkt wejścia również jest trafiony. Przywróciłem również ustawienie opcji wspomniane w tym poście, ale bezskutecznie. Używam wersji społeczności VS 2017. Zgubiłem okno konsoli (szlochając).
RBT
3
Co jest warte, w VS 15.8.7 jedynym sposobem, w jaki mogłem uzyskać dane wyjściowe do przekierowania dla aplikacji konsolowej, była zmiana jej na aplikację systemu Windows i pozostawienie pola Przekierowanie NIEZALEŻNE. Jeśli zaznaczę to pole, nie wyświetla danych wyjściowych.
dpberry178
6

Posługiwać się System.Diagnostics.Trace

W zależności od podłączonych odbiorników dane wyjściowe śledzenia mogą trafiać do okna debugowania, konsoli, pliku, bazy danych lub wszystkich naraz. Możliwości są dosłownie nieograniczone, ponieważ wdrożenie własnego TraceListener jest niezwykle proste.

Joel Coehoorn
źródło
Tak, ale chcę wiedzieć, czy można to po prostu zrobić, bez konieczności samodzielnego wdrażania.
pożarł Elizjum
@devoured Klasa Trace domyślnie wyświetla tylko okno debugowania. Musisz tylko dołączyć dodatkowe odbiorniki (a jest już napisanych kilka, których możesz użyć), jeśli chcesz zobaczyć wyjście również w innym miejscu.
Joel Coehoorn
1
Poszedłem do mojego okna dialogowego Opcje debugowania i wybrałem „Przekieruj cały tekst z okna wyjściowego do okna bezpośredniego”, aby dane wyjściowe śledzenia trafiały do ​​okna bezpośredniego, aby nie zostały pomieszane z bzdurami debugowania.
Gabe
2

Ludzie, czas sprawdzić najnowsze wersje programu Visual Studio. Najbardziej sugerowane rozwiązanie, które wcześniej nie działało dla niektórych z was, może teraz działać.

W programie Visual Studio 2017 ( wersja 15.4.2 i nowsze ) Tools > Options > Debugging > General > (Check Box) Redirect all Output Window text to Immediate Windowdziałało dla mnie.

Kilka uwag: 1. Aby wyświetlić okno bezpośrednie, upewnij się, że jesteś w trybie debugowania . 2. Powinny być teraz dostępne 3 inne narzędzia do debugowania, a mianowicie stos wywołań, punkty przerwania i okno poleceń, jak pokazano poniżej:

wprowadź opis obrazu tutaj

Wszystkiego najlepszego!

kuzevni
źródło
Testowany w wersji 15.9.4, nie działa (przynajmniej nie dla aplikacji konsolowej).
bta
Hmm. Jeśli możesz udostępnić zrzut ekranu swoich konfiguracji, mogę spróbować odtworzyć problem po mojej stronie. W przeciwnym razie możesz udostępnić swoje rozwiązanie, jeśli zostało rozwiązane. Informacje o wersji programu Visual Studio 15.9.4 są dostępne pod adresem docs.microsoft.com/en-us/visualstudio/releasenotes/…. W zależności od środowiska można tam znaleźć przydatne wskazówki. Dokumentacja programu
kuzevni,
Dokładnie sprawdź, czy projekt, w którym testujesz, został utworzony jako „aplikacja konsoli”, a nie „aplikacja systemu Windows”. Twoje podejście działa z aplikacją Windows, ale nie to określa OP.
bta
1

Możesz utworzyć aplikację opakowującą, którą uruchamiasz zamiast bezpośrednio uruchamiać swoją prawdziwą aplikację. Aplikacja opakowująca może nasłuchiwać wyjścia standardowego i przekierowywać wszystko do programu Trace. Następnie zmień ustawienia uruchamiania, aby uruchomić opakowanie i przekazać ścieżkę do prawdziwej aplikacji do uruchomienia.

Można również ustawić automatyczne dołączanie debugera przez opakowanie do nowego procesu, jeśli debuger jest dołączony do opakowania.

Samuel Neff
źródło
0

Wiem, że to tylko kolejna odpowiedź, ale pomyślałem, że napiszę coś dla nowych programistów sieci Web, którzy mogą być zdezorientowani częścią „Zmiana na aplikację Windows”, ponieważ myślę, że domyślnie aplikacja MVC w Visual Studio 2013 domyślnie jest to typ wyjściowy biblioteki klas.

Moja aplikacja internetowa jest domyślnie ustawiona jako typ wyjściowy „Biblioteka klas”. Nie musisz tego zmieniać. Wszystko, co musiałem zrobić, to postępować zgodnie z sugestiami, aby przejść do Narzędzia> Opcje> Debugowanie> Przekieruj cały tekst okna wyjściowego do okna bezpośredniego. Następnie skorzystałem z powyższej System.Diagnostics.Tracesugestii Joela Coehoorna.

joshmcode
źródło
0

Proste rozwiązanie, które działa dla mnie, do pracy z możliwością konsoli (ReadKey, String with Format i arg itp.) Oraz do przeglądania i zapisywania danych wyjściowych:

Piszę TextWriter, który pisze do Consolei do Tracei zamieniam na Console.Outto.

jeśli używasz Dialog -> Debugging -> Zaznacz „Przekieruj cały tekst z okna wyjściowego do okna bezpośredniego”, otrzymasz go w oknie bezpośrednim i całkiem czysty.

mój kod: na początku mojego kodu:

   Console.SetOut(new TextHelper());

i klasa:

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

        }

    }

Uwaga: zastępuję to, czego potrzebowałem, więc jeśli napiszesz inne typy, powinieneś zastąpić więcej

Sarel Foyerlicht
źródło
0

dotyczące System.Diagnostics.Debugtworzenia dużej ilości „śmieci” w oknie Output: Możesz to wyłączyć, klikając prawym przyciskiem myszy w oknie wyjściowym. Np. Istnieje pozycja "Komunikaty ładowania modułu", którą chcesz wyłączyć i "Wyjście programu", którą chcesz zachować.

user829755
źródło
0

Masz na to trzy możliwości, ale nie jest to trywialne. Główną ideą wszystkich IDE jest to, że wszystkie są rodzicami procesów potomnych (debugowania). W takim przypadku można manipulować za pomocą standardowego wejścia, wyjścia i obsługi błędów. Tak więc IDE uruchamiają aplikacje potomne i przekierowują do wewnętrznego okna wyjściowego. Wiem o jeszcze jednej możliwości, ale nadejdzie w przyszłości

  1. Możesz zaimplementować własny silnik debugowania dla programu Visual Studio. Uruchamianie i debugowanie sterowania mechanizmem debugowania aplikacji. Przykłady tego można znaleźć w witrynie docs.microsoft.com ( silnik debugowania programu Visual Studio )
  2. Przekieruj aplikację formularza przy użyciu zduplikowanej procedury obsługi standardu dla języka c ++ lub użyj Console.SetOut (TextWriter) dla języka C #. Jeśli chcesz drukować w oknie wyjściowym, musisz użyć zestawu SDK rozszerzenia programu Visual Studio. Przykład drugiego wariantu, który można znaleźć na Github .
  3. Uruchom aplikację, która używa System.Diagnostics.Debug.WriteLine (do drukowania na wyjściu), a następnie uruchomi aplikację potomną. Rozpoczynając dziecko, musisz przekierować standardowe wyjście do rodzica za pomocą potoków. Przykład można znaleźć w witrynie MSDN. Ale myślę, że to nie jest najlepszy sposób.
Galina Khrychikova
źródło
0

Jeśli potrzebujesz danych wyjściowych z Console.WriteLine, a tekst z okna Przekieruj wszystkie dane wyjściowe do okna bezpośredniego nie działa i musisz znać dane wyjściowe testów ze zintegrowanego eksploratora testów, używając NUnit.Framework, nasz problem został już rozwiązany w VS 2017 :

Przykład zaczerpnięty z C # In Depth autorstwa Jona Skeeta: Przykład zaczerpnięty z C # In Depth autorstwa Jona Skeeta To daje takie dane wyjściowe w Eksploratorze tekstu: Eksplorator zadań

Kiedy klikniemy na Blue Output, pod Elapsed Time, po prawej stronie, otrzymamy to: Wyjście standardowe

Wyjście standardowe to nasze pożądane wyjście, wyprodukowane przez Console.WriteLine.

Działa dla konsoli i aplikacji Windows Form w VS 2017, ale tylko dla danych wyjściowych generowanych dla Eksploratora testów podczas debugowania lub uruchamiania; w każdym razie jest to moja główna potrzeba wyjścia Console.WriteLine.

Marcelo Scofano
źródło
-1

Zamiast tego możesz zebrać dane wyjściowe w wyniku testu.

Nie możesz podać danych wejściowych, ale możesz łatwo dostarczyć kilka testów z różnymi argumentami wiersza poleceń, a każdy test zbiera dane wyjściowe.

Jeśli Twoim celem jest debugowanie, jest to łatwy sposób oferowania powtarzalnego scenariusza debugowania.

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

    [TestClass]
    public class CommandlineTests
    {
        [TestMethod]
        public void RunNoArguments()
        {
            Commandline.Program.Main(new string[0]);
        }
    }
}
uffehellum
źródło
-7

Krok 1: Kliknij prawym przyciskiem myszy nazwę projektu w Eksploratorze rozwiązań, a następnie ustaw typ danych wyjściowych jako aplikację okna

Krok 2: Debuguj -> Opcje .. -> Debugowanie (rozwiń) -> Ogólne -> Przekieruj cały tekst z okna wyjściowego do okna bezpośredniego

Balaji Dinakaran
źródło
3
Ta odpowiedź została udzielona wcześniej trzy razy. Nie odpowiada na zadane pytanie.
Klay