Memiliki output aplikasi konsol di Visual Studio, bukan konsol

120

Saat melakukan aplikasi konsol di Java dengan Eclipse, saya melihat keluarannya dimasukkan ke dalam kotak teks di IDE itu sendiri, alih-alih memunculkan konsol seperti di Visual Studio. Ini berguna, karena bahkan setelah program keluar, saya masih dapat memanfaatkan teks yang tertulis di dalamnya, karena tidak terhapus sampai saya menjalankannya lagi. Apakah mungkin untuk mencapai hal seperti itu dengan Visual Studio? Saya tahu itu daripada melakukan

System.Console.WriteLine(str);

dapat saya lakukan

System.Diagnostics.Debug.WriteLine(str);

tetapi itu tidak persis sama, karena Anda mendapatkan banyak "sampah" di jendela Output, karena semua simbol yang dimuat dan semacamnya.

Lebih baik lagi, mungkinkah semuanya dilakukan di IDE itu sendiri, saat Anda menjalankan aplikasi, alih-alih menjalankan konsol?

melahap elysium
sumber
Versi VS apa yang Anda gunakan?
Gabe
Apakah Anda memiliki panel Hasil Tes?
Gabe
Saya tidak pernah menyadarinya. Aku akan memeriksanya. Haruskah saya memilikinya?
melahap elysium

Jawaban:

52

Pada Tools -> Visual Studio Options Dialog -> Debugging -> Check the "Redirect All Output Window Text to the Immediate Window".

SharpSteve
sumber
68
Saya telah mencentang kotak centang ini tetapi saya masih mendapatkan munculan Konsol dan tidak ada apa pun di jendela "Output" (Debug, Test, Build, ..) atau "Jendela Segera".
GuiSim
6
@EvenLisle Anda perlu mengubah jenis aplikasi ke Aplikasi Windows seperti dalam jawaban stolsvik . Opsi yang disebutkan dalam jawaban ini diaktifkan secara default untuk saya.
TooTone
3
Apa yang dimaksud dengan "Redirect All Output Window Text to the Immediate Window"? Gunakan berbagai konteks jika Anda perlu. Saya bingung dengan apa itu "jendela langsung".
Xonatron
11
@TooTone Pertanyaannya dengan jelas menyatakan untuk "aplikasi konsol" dan mengubahnya menjadi sesuatu yang lain hanya untuk tujuan debugging, di mana saya bahkan tidak bisa Console.ReadKey () benar-benar konyol!
MickyD
1
Hanya berfungsi dengan Debug.WriteLine (), tidak berfungsi dengan Console.WriteLine () :(
Y2i
45

Dalam Visual Studio Options Dialog -> Debugging -> Centang "Redirect All Output Window Text to the Immediate Window". Lalu pergi ke pengaturan proyek Anda dan ubah jenis dari "Aplikasi Konsol" menjadi "Aplikasi Windows". Pada saat itu Visual Studio tidak membuka jendela konsol lagi, dan output diarahkan ke jendela Output di Visual Studio. Namun, Anda tidak dapat melakukan apa pun yang "kreatif", seperti meminta kunci atau input teks, atau membersihkan konsol - Anda akan mendapatkan pengecualian waktu proses.

stolsvik
sumber
25
Saya merasa ini sangat kikuk. Apa, saya bertanya-tanya, alasan di balik ini di VS? Ini harus menjadi kemampuan dari semua IDE modern untuk memiliki panel di dalam IDE itu sendiri yang berfungsi sebagai konsol untuk input dan output. (goresan kepala)
12
Pertanyaannya dengan jelas menyatakan untuk "aplikasi konsol" dan mengubahnya menjadi sesuatu yang lain hanya untuk tujuan debugging, di mana saya bahkan tidak bisa Console.ReadKey()benar-benar konyol!
MickyD
Tidak yakin mengapa tetapi ketika saya mencoba mengembalikan Output typeaplikasi saya kembali dari Aplikasi Windows ke Konsol maka jendela konsol tidak ada tempat untuk dilihat ketika saya menjalankan aplikasi saya. Saya dapat men-debug aplikasi dan Maintitik masuk juga terkena. Saya juga mengembalikan pengaturan opsi yang disebutkan dalam posting ini tetapi tidak berhasil. Saya menggunakan edisi komunitas VS 2017. Saya kehilangan jendela konsol saya (terisak).
RBT
3
Untuk apa nilainya, di VS 15.8.7 satu-satunya cara saya bisa mendapatkan output untuk dialihkan untuk aplikasi konsol adalah mengubahnya menjadi aplikasi Windows, dan biarkan kotak Redirect TIDAK DIPERBAIKI. Jika saya mencentang kotaknya, itu tidak menampilkan output.
dpberry178
6

Menggunakan System.Diagnostics.Trace

Bergantung pada pemroses yang Anda lampirkan, keluaran pelacakan bisa masuk ke jendela debug, konsol, file, database, atau semuanya sekaligus. Kemungkinannya benar-benar tidak terbatas, karena menerapkan TraceListener Anda sendiri sangat sederhana.

Joel Coehoorn
sumber
Ya, tapi yang ingin saya ketahui adalah apakah mungkin melakukannya saja, tanpa harus mengimplementasikannya sendiri.
melahap elysium
@devoured Kelas Trace mengeluarkan hanya ke jendela debug secara default. Anda hanya perlu melampirkan listener tambahan (dan ada beberapa yang sudah ditulis yang dapat Anda gunakan) jika Anda juga ingin melihat outputnya di tempat lain.
Joel Coehoorn
1
Saya pergi ke dialog Opsi Debug dan memilih "Alihkan semua teks Jendela Keluaran ke Jendela Segera" untuk membuat keluaran Trace masuk ke jendela Segera sehingga tidak semuanya tercampur dengan debug omong kosong.
Gabe
2

Saatnya mengecek rilis terbaru untuk Visual Studio, kawan. Solusi yang paling disarankan yang sebelumnya tidak berhasil untuk beberapa dari Anda mungkin berhasil sekarang.

Dalam Visual Studio 2017 ( Rilis Versi 15.4.2 dan yang lebih baru), akan Tools > Options > Debugging > General > (Check Box) Redirect all Output Window text to Immediate Windowberhasil untuk saya.

Beberapa Catatan: 1. Untuk melihat Jendela Segera, pastikan Anda berada dalam mode Debugging . 2. Sekarang seharusnya ada 3 alat debugging lain yang tersedia yang Anda inginkan, yaitu Call Stack, Breakpoints, dan Command Window, seperti yang ditunjukkan di bawah ini:

masukkan deskripsi gambar di sini

Semoga sukses!

kuzevni
sumber
Diuji di v15.9.4, tidak berfungsi (setidaknya tidak untuk aplikasi konsol).
bta
Hmm. Jika Anda dapat membagikan tangkapan layar konfigurasi Anda, saya dapat mencoba mereplikasi masalah di pihak saya. Jika tidak, Anda dapat membagikan solusi Anda jika telah diselesaikan. Catatan rilis untuk Visual Studio 15.9.4 tersedia di docs.microsoft.com/en-us/visualstudio/releasenotes/… , Anda mungkin menemukan beberapa tip berguna tergantung pada lingkungan Anda. Visual Studio 2017 (Output Window) Dokumentasi : docs.microsoft.com/en-us/visualstudio/ide/reference/…
kuzevni
Periksa kembali apakah proyek yang Anda uji dibuat sebagai "aplikasi konsol", bukan "aplikasi windows". Pendekatan Anda bekerja dengan aplikasi windows, tapi bukan itu yang ditentukan OP.
bta
1

Anda dapat membuat aplikasi pembungkus yang Anda jalankan daripada langsung menjalankan aplikasi Anda yang sebenarnya. Aplikasi wrapper dapat mendengarkan stdout dan mengarahkan semuanya ke Trace. Kemudian ubah pengaturan proses untuk meluncurkan pembungkus Anda dan meneruskan jalur ke aplikasi nyata untuk dijalankan.

Anda juga dapat meminta wrapper untuk otomatis memasang debugger ke proses baru jika debugger dipasang ke wrapper.

Samuel Neff
sumber
0

Saya tahu ini hanyalah jawaban lain, tetapi saya pikir saya akan menulis sesuatu untuk Pengembang Web baru, yang mungkin bingung tentang bagian "Ubah ke Aplikasi Windows", karena saya pikir secara default aplikasi MVC di Visual Studio 2013 default ke Output Type of Class Library.

Aplikasi Web saya secara default disetel sebagai tipe keluaran "Perpustakaan Kelas." Anda tidak perlu mengubahnya. Yang harus saya lakukan adalah mengikuti saran untuk membuka Tools> Options> Debugging> Redirect all Output Window text to the Immediate Window. Saya kemudian menggunakan System.Diagnostics.Tracesaran dari Joel Coehoorn di atas.

joshmcode
sumber
0

Solusi sederhana yang bekerja untuk saya, untuk bekerja dengan kemampuan konsol (ReadKey, String dengan Format dan arg dll) dan untuk melihat dan menyimpan hasilnya:

Saya menulis TextWriter yang menulis ke Consoledan ke Tracedan menggantinya Console.Outdengan itu.

jika Anda menggunakan Dialog -> Debugging -> Centang "Redirect All Output Window Text to the Immediate Window" Anda mendapatkannya di Immediate Window dan cukup bersih.

kode saya: di awal kode saya:

   Console.SetOut(new TextHelper());

dan kelasnya:

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

        }

    }

Catatan: Saya mengganti apa yang saya butuhkan jadi jika Anda menulis jenis lain, Anda harus menimpa lebih banyak

Sarel Foyerlicht
sumber
0

mengenai System.Diagnostics.Debugmenghasilkan banyak "sampah" di jendela Keluaran: Anda dapat mematikannya dengan mengklik kanan di jendela keluaran. Misalnya ada item "Module Load Messages" yang ingin Anda nonaktifkan dan item "Program Output" yang ingin Anda simpan.

pengguna829755
sumber
0

Anda memiliki tiga kemungkinan untuk melakukan ini, tetapi ini tidak sepele. Ide utama dari semua IDE adalah bahwa semuanya adalah induk dari proses anak (debug). Dalam hal ini, dimungkinkan untuk memanipulasi dengan input standar, output dan penanganan kesalahan. Jadi IDE memulai aplikasi anak dan mengalihkan ke jendela keluaran internal. Saya tahu tentang satu kemungkinan lagi, tetapi itu akan datang di masa depan

  1. Anda dapat menerapkan mesin debug Anda sendiri untuk Visual Studio. Kontrol Debug Engine mulai dan debugging untuk aplikasi. Contoh untuk ini, Anda dapat menemukan cara melakukannya di docs.microsoft.com ( mesin Visual Studio Debug )
  2. Alihkan aplikasi formulir menggunakan duplikasi std handler untuk c ++ atau gunakan Console.SetOut (TextWriter) untuk c #. Jika Anda perlu mencetak ke jendela keluaran Anda perlu menggunakan SDK ekstensi Visual Studio. Contoh varian kedua yang dapat Anda temukan di Github .
  3. Mulai aplikasi yang menggunakan System.Diagnostics.Debug.WriteLine (untuk mencetak ke keluaran) dan kemudian akan memulai aplikasi anak. Saat memulai anak, Anda perlu mengarahkan stdout ke induk dengan pipa. Anda dapat menemukan contoh di MSDN. Tapi saya pikir ini bukan cara terbaik.
Galina Khrychikova
sumber
0

Jika Anda membutuhkan output dari Console.WriteLine, dan Redirect All Output Window Text to the Immediate Window tidak berfungsi dan Anda perlu mengetahui output Test dari Integrated Test Explorer, menggunakan NUnit.Framework masalah kita sudah diselesaikan di VS 2017 :

Contoh diambil dari C # In Depth oleh Jon Skeet: Contoh diambil dari C # In Depth oleh Jon Skeet Ini menghasilkan output ini di Text Explorer: Penjelajah Tugas

Ketika kita mengklik Blue Output, di bawah Elapsed Time, di kanan, dan menghasilkan ini: Output Standar

Output Standar adalah Output yang kami inginkan, diproduksi oleh Console.WriteLine.

Ini berfungsi untuk Konsol dan untuk Aplikasi Formulir Windows di VS 2017, tetapi hanya untuk Output yang dihasilkan untuk Test Explorer di Debug atau Run; bagaimanapun, ini adalah kebutuhan utama saya akan keluaran Console.WriteLine.

Marcelo Scofano
sumber
-1

Sebagai gantinya, Anda dapat mengumpulkan output dalam hasil tes.

Anda tidak dapat memberikan masukan, tetapi Anda dapat dengan mudah memberikan beberapa pengujian dengan argumen baris perintah yang berbeda, setiap pengujian mengumpulkan keluaran.

Jika tujuan Anda adalah men-debug, ini adalah cara yang mudah untuk menawarkan skenario debugging yang berulang.

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

    [TestClass]
    public class CommandlineTests
    {
        [TestMethod]
        public void RunNoArguments()
        {
            Commandline.Program.Main(new string[0]);
        }
    }
}
uffehellum
sumber
-7

Langkah 1: Klik kanan pada Project Name di Solution Explorer lalu buat Output type sebagai Window Application

Langkah 2: Debug -> Options ..--> Debugging (Expand) -> General -> Redirect All Output Window Text to the Immediate Window

Balaji Dinakaran
sumber
3
Jawaban ini telah diberikan tiga kali sebelumnya. Itu tidak menjawab pertanyaan yang diajukan.
Klay