มีเอาต์พุตของแอปพลิเคชันคอนโซลใน Visual Studio แทนที่จะเป็นคอนโซล


120

เมื่อทำแอปพลิเคชันคอนโซลใน Java ด้วย Eclipse ฉันเห็นเอาต์พุตถูกใส่ในกล่องข้อความใน IDE เองแทนที่จะมีคอนโซลโผล่ขึ้นมาเหมือนใน Visual Studio สิ่งนี้มีประโยชน์แม้ว่าหลังจากออกจากโปรแกรมไปแล้วฉันก็ยังสามารถใช้ประโยชน์จากข้อความที่เขียนไว้ได้อย่างเต็มที่เนื่องจากจะไม่ถูกลบจนกว่าฉันจะเรียกใช้อีกครั้ง เป็นไปได้ไหมที่จะบรรลุสิ่งนั้นด้วย Visual Studio? ฉันรู้ว่าแทนที่จะทำ

System.Console.WriteLine(str);

ที่ฉันสามารถทำได้

System.Diagnostics.Debug.WriteLine(str);

แต่มันก็ไม่เหมือนกันเสียทีเดียวเนื่องจากคุณได้รับ "ขยะ" จำนวนมากในหน้าต่างเอาท์พุทเนื่องจากสัญลักษณ์ที่โหลดทั้งหมดและอื่น ๆ

ยิ่งไปกว่านั้นเป็นไปได้ไหมที่จะทำทุกอย่างใน IDE เองเมื่อคุณเรียกใช้แอปพลิเคชันแทนที่จะให้คอนโซลทำงาน


คุณใช้ VS เวอร์ชันอะไร
Gabe

คุณมีบานหน้าต่างผลการทดสอบหรือไม่
Gabe

ฉันไม่เคยสังเกตเห็นมัน ฉันจะตรวจสอบ ควรมีหรือไม่
กินเอลิเซียม

คำตอบ:


52

ในกล่องโต้ตอบ Tools -> Visual Studio Options -> Debugging -> เลือก "Redirect All Output Window Text to the Immediate Window"


68
ฉันได้เลือกช่องทำเครื่องหมายนี้แล้ว แต่ฉันยังคงได้รับป๊อปอัปคอนโซลและไม่มีอะไรเลยในหน้าต่าง "เอาต์พุต" (Debug, Test, Build, .. ) หรือ "หน้าต่างทันที"
GuiSim

6
@EvenLisle คุณจำเป็นต้องเปลี่ยนประเภทการประยุกต์ใช้ในการ Windows Application เช่นเดียวกับในคำตอบของ stolsvik ตัวเลือกที่กล่าวถึงในคำตอบนี้ถูกเปิดใช้โดยค่าเริ่มต้นสำหรับฉันไม่ว่าในกรณีใด ๆ
TooTone

3
"เปลี่ยนเส้นทางข้อความหน้าต่างเอาต์พุตทั้งหมดไปยังหน้าต่างทันที" หมายความว่าอย่างไร ใช้บริบทต่างๆหากคุณต้องการ ฉันสับสนกับ "หน้าต่างทันที" คืออะไร
Xonatron

11
@TooTone คำถามระบุอย่างชัดเจนสำหรับ "แอปพลิเคชันคอนโซล" และเปลี่ยนเป็นอย่างอื่นเพียงเพื่อวัตถุประสงค์ในการดีบักโดยที่ฉันไม่สามารถแม้แต่Console.ReadKey ()เป็นเพียงเรื่องไร้สาระ!
MickyD

1
ใช้งานได้กับ Debug.WriteLine () เท่านั้นไม่ทำงานกับ Console.WriteLine () :(
Y2i

45

ในกล่องโต้ตอบตัวเลือกVisual Studio -> การดีบัก -> เลือก "เปลี่ยนเส้นทางข้อความหน้าต่างเอาต์พุตทั้งหมดไปยังหน้าต่างทันที" จากนั้นไปที่การตั้งค่าโครงการของคุณและเปลี่ยนประเภทจาก "แอปพลิเคชันคอนโซล" เป็น "แอปพลิเคชัน Windows" ณ จุดนั้น Visual Studio จะไม่เปิดหน้าต่างคอนโซลอีกต่อไปและเอาต์พุตจะถูกเปลี่ยนเส้นทางไปยังหน้าต่างเอาต์พุตใน Visual Studio อย่างไรก็ตามคุณไม่สามารถทำอะไร "สร้างสรรค์" เช่นการขอคีย์หรือการป้อนข้อความหรือการล้างคอนโซลคุณจะได้รับข้อยกเว้นรันไทม์


25
ฉันพบว่ามันเงอะงะเป็นพิเศษ ฉันสงสัยว่าอะไรคือเหตุผลเบื้องหลังสิ่งนี้ใน VS? มันควรจะเป็นความสามารถของ IDE ในยุคปัจจุบันทั้งหมดที่จะมีพาเนลภายใน IDE ทำหน้าที่เป็นคอนโซลสำหรับอินพุตและเอาต์พุต (เกาหัว)

12
คำถามระบุไว้อย่างชัดเจนสำหรับ"แอปพลิเคชันคอนโซล"และเปลี่ยนเป็นอย่างอื่นเพียงเพื่อจุดประสงค์ในการดีบักโดยที่ฉันทำไม่ได้แม้แต่Console.ReadKey()ตรงประเด็นไร้สาระ!
MickyD

ไม่แน่ใจว่าทำไม แต่เมื่อฉันพยายามเปลี่ยนOutput typeแอปพลิเคชันของฉันกลับจาก Windows Application เป็น Console หน้าต่างคอนโซลจะไม่ปรากฏให้เห็นเมื่อฉันเรียกใช้แอปพลิเคชัน ฉันสามารถแก้ไขข้อบกพร่องของแอปพลิเคชันได้และMainจุดเริ่มต้นก็ถูกโจมตีเช่นกัน ฉันยังเปลี่ยนกลับการตั้งค่าตัวเลือกที่กล่าวถึงในโพสต์นี้ แต่ไม่มีประโยชน์ ฉันใช้ VS 2017 community edition ฉันทำหน้าต่างคอนโซลหาย (สะอื้น)
RBT

3
สำหรับสิ่งที่คุ้มค่าใน VS 15.8.7 วิธีเดียวที่ฉันจะได้รับผลลัพธ์เพื่อเปลี่ยนเส้นทางสำหรับแอปคอนโซลคือเปลี่ยนเป็นแอป Windows และปล่อยให้กล่องเปลี่ยนเส้นทาง UNCHECKED ถ้าฉันทำเครื่องหมายในช่องนี้จะไม่แสดงผลลัพธ์
dpberry178

6

ใช้ System.Diagnostics.Trace

เอาต์พุตการติดตามสามารถไปที่หน้าต่างดีบักคอนโซลไฟล์ฐานข้อมูลหรือทั้งหมดพร้อมกันทั้งนี้ขึ้นอยู่กับสิ่งที่ฟังที่คุณแนบ ความเป็นไปได้นั้นไม่มีที่สิ้นสุดอย่างแท้จริงเนื่องจากการใช้ TraceListener ของคุณเองนั้นง่ายมาก


ใช่ แต่สิ่งที่ฉันอยากรู้ก็คือทำได้หรือไม่โดยไม่ต้องลงมือทำเอง
กินเอลิเซียม

@devoured คลาส Trace จะส่งออกไปยังหน้าต่างดีบักตามค่าเริ่มต้น คุณจำเป็นต้องแนบผู้ฟังพิเศษเท่านั้น (และมีหลายคนที่เขียนไว้แล้วที่คุณสามารถใช้ได้) หากคุณต้องการดูผลลัพธ์ที่อื่นด้วย
Joel Coehoorn

1
ฉันไปที่กล่องโต้ตอบตัวเลือกการดีบักของฉันและเลือก "เปลี่ยนเส้นทางข้อความหน้าต่างผลลัพธ์ทั้งหมดไปยังหน้าต่างทันที" เพื่อให้ผลลัพธ์การติดตามไปที่หน้าต่างทันทีเพื่อไม่ให้ทั้งหมดปะปนกับอึแก้จุดบกพร่อง
Gabe

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 รายการให้คุณใช้งาน ได้แก่ Call Stack, Breakpoints และ Command Window ดังที่แสดงด้านล่าง:

ใส่คำอธิบายภาพที่นี่

ด้วยความปรารถนาดี!


ทดสอบใน v15.9.4 ไม่ทำงาน (ไม่ใช่สำหรับแอปพลิเคชันคอนโซลอย่างน้อย)
bta

อืมมม หากคุณสามารถแชร์ภาพหน้าจอของการกำหนดค่าของคุณได้ฉันสามารถลองแก้ไขปัญหานี้ซ้ำได้ มิฉะนั้นคุณสามารถแบ่งปันวิธีแก้ปัญหาของคุณได้หากได้รับการแก้ไขแล้ว บันทึกประจำรุ่นสำหรับ Visual Studio 15.9.4 มีอยู่ที่docs.microsoft.com/en-us/visualstudio/releasenotes/…คุณอาจพบคำแนะนำที่เป็นประโยชน์ซึ่งขึ้นอยู่กับสภาพแวดล้อมของคุณ Visual Studio 2017 (Output Window) เอกสารประกอบ : docs.microsoft.com/en-us/visualstudio/ide/reference/…
kuzevni

ตรวจสอบอีกครั้งว่าโครงการที่คุณกำลังทดสอบนั้นสร้างขึ้นเป็น "แอปพลิเคชันคอนโซล" ไม่ใช่ "แอปพลิเคชัน windows" แนวทางของคุณใช้ได้กับแอปพลิเคชัน windows แต่นั่นไม่ใช่สิ่งที่ OP ระบุ
bta

1

คุณสามารถสร้างแอปพลิเคชัน Wrapper ที่คุณเรียกใช้แทนที่จะเรียกใช้แอปจริงของคุณโดยตรง แอปพลิเคชัน Wrapper สามารถฟัง stdout และเปลี่ยนเส้นทางทุกอย่างไปที่ Trace จากนั้นเปลี่ยนการตั้งค่าการเรียกใช้เพื่อเปิด Wrapper ของคุณและส่งต่อไปยังแอปจริงเพื่อเรียกใช้

คุณยังสามารถให้ Wrapper แนบตัวดีบักเกอร์เข้ากับกระบวนการใหม่โดยอัตโนมัติได้หากมีการแนบดีบักเกอร์กับ Wrapper


0

ฉันรู้ว่านี่เป็นเพียงคำตอบอื่น แต่ฉันคิดว่าฉันจะเขียนบางอย่างสำหรับนักพัฒนาเว็บรายใหม่ซึ่งอาจสับสนเกี่ยวกับส่วน "เปลี่ยนเป็นแอปพลิเคชัน Windows" เพราะฉันคิดว่าโดยค่าเริ่มต้นแอปพลิเคชัน MVC ใน Visual Studio 2013 ค่าเริ่มต้นเป็นประเภทเอาต์พุตของไลบรารีคลาส

โดยค่าเริ่มต้นเว็บแอปพลิเคชันของฉันจะตั้งเป็นประเภทเอาต์พุตของ "Class Library" คุณไม่จำเป็นต้องเปลี่ยนสิ่งนั้น สิ่งที่ฉันต้องทำคือทำตามคำแนะนำในการไปที่ Tools> Options> Debugging> Redirect all Output Window text to the Immediate Window จากนั้นฉันก็ใช้System.Diagnostics.Traceคำแนะนำของ Joel Coehoorn ข้างต้น


0

วิธีแก้ปัญหาง่ายๆที่เหมาะกับฉันในการทำงานกับความสามารถของคอนโซล (ReadKey, String with Format and arg ฯลฯ ) และเพื่อดูและบันทึกผลลัพธ์:

ฉันเขียน TextWriter ที่เขียนConsoleและถึงTraceและแทนที่ไฟล์Console.Outด้วย

หากคุณใช้ Dialog -> Debugging -> เลือก "Redirect All Output Window Text to the 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การสร้าง "ขยะ" จำนวนมากในหน้าต่างผลลัพธ์: คุณสามารถปิดได้โดยคลิกขวาในหน้าต่างผลลัพธ์ เช่นมีรายการ "Module Load Messages" ที่คุณต้องการปิดใช้งานและรายการ "Program Output" ที่คุณต้องการเก็บไว้


0

คุณมีความเป็นไปได้สามอย่างที่จะทำสิ่งนี้ แต่ก็ไม่สำคัญ แนวคิดหลักของ IDE ทั้งหมดคือทุกคนเป็นผู้ปกครองของกระบวนการ (debug) ของเด็ก ในกรณีนี้เป็นไปได้ที่จะจัดการกับอินพุตมาตรฐานเอาต์พุตและตัวจัดการข้อผิดพลาด ดังนั้น IDE จึงเริ่มต้นแอปพลิเคชันลูกและเปลี่ยนเส้นทางไปยังหน้าต่างเอาต์พุตภายใน ฉันรู้เกี่ยวกับความเป็นไปได้อีกอย่างหนึ่ง แต่มันจะเกิดขึ้นในอนาคต

  1. คุณสามารถใช้กลไกการดีบักของคุณเองสำหรับ Visual Studio การควบคุม Debug Engine เริ่มต้นและการดีบักสำหรับแอปพลิเคชัน ตัวอย่างสำหรับสิ่งนี้คุณสามารถค้นหาวิธีดำเนินการได้ที่ docs.microsoft.com ( Visual Studio Debug engine )
  2. เปลี่ยนเส้นทางแอปพลิเคชันโดยใช้การทำสำเนาตัวจัดการ std สำหรับ c ++ หรือใช้ Console.SetOut (TextWriter) สำหรับ c # หากคุณต้องการพิมพ์ลงในหน้าต่างผลลัพธ์คุณต้องใช้ Visual Studio extension SDK ตัวอย่างตัวแปรที่สองที่คุณสามารถพบได้ในGithub Github
  3. เริ่มแอปพลิเคชันที่ใช้ System.Diagnostics.Debug.WriteLine (สำหรับการพิมพ์ลงในเอาต์พุต) และกว่าจะเริ่มแอปพลิเคชันลูก ในการเริ่มต้นเด็กคุณต้องเปลี่ยนเส้นทาง stdout ไปยังพาเรนต์ด้วยไพพ์ คุณสามารถดูตัวอย่างใน MSDN แต่ฉันคิดว่านี่ไม่ใช่วิธีที่ดีที่สุด

0

หากคุณต้องการเอาต์พุตจาก Console.WriteLine และการ เปลี่ยนเส้นทางข้อความหน้าต่างผลลัพธ์ทั้งหมดไปยังหน้าต่างทันทีไม่ทำงานและคุณจำเป็นต้องทราบผลลัพธ์ของการทดสอบจาก Integrated Test Explorer โดยใช้ NUnit กรอบปัญหาของเราได้รับการแก้ไขแล้วที่ VS 2017 :

ตัวอย่างที่นำมาจาก C # In Depth โดย Jon Skeet: ตัวอย่างจาก C # In Depth โดย Jon Skeet สิ่งนี้สร้างผลลัพธ์นี้ที่ Text Explorer: Task Explorer

เมื่อเราคลิกที่ Blue Output ภายใต้ Elapsed Time ทางด้านขวาและจะสร้างสิ่งนี้: เอาต์พุตมาตรฐาน

เอาต์พุตมาตรฐานคือเอาต์พุตที่เราต้องการซึ่งผลิตโดย Console.WriteLine

มันทำงานสำหรับคอนโซลและสำหรับ Windows Form Applications ที่ VS 2017 แต่สำหรับเอาต์พุตที่สร้างขึ้นสำหรับ Test Explorer ที่ Debug หรือ Run เท่านั้น อย่างไรก็ตามนี่คือความต้องการหลักของฉันในเอาต์พุต 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: คลิกขวาที่ Project Name ใน Solution Explorer จากนั้นสร้างประเภท Output เป็น Window Application

ขั้นตอนที่ 2: Debug -> Options .. -> Debugging (Expand) -> General -> Redirect All Output Window Text ไปยังหน้าต่างทันที


3
คำตอบนี้ได้รับสามครั้งก่อนหน้านี้ มันไม่ได้ตอบคำถามที่ถาม
Klay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.