콘솔 대신 Visual Studio에 콘솔 응용 프로그램의 출력이 있음


120

Eclipse를 사용하여 Java에서 콘솔 응용 프로그램을 수행 할 때 Visual Studio 에서처럼 콘솔이 팝업되는 대신 IDE 자체의 텍스트 상자에 출력이 표시되는 것을 볼 수 있습니다. 이것은 프로그램이 종료 된 후에도 다시 실행할 때까지 지워지지 않기 때문에 그 안에 쓰여진 텍스트를 잘 사용할 수 있기 때문에 편리합니다. Visual Studio로 이와 같은 것을 달성 할 수 있습니까? 하는 대신 알아

System.Console.WriteLine(str);

내가 할 수있는

System.Diagnostics.Debug.WriteLine(str);

그러나로드 된 모든 심볼과 같은 출력 창에 많은 "정크"가 표시되므로 동일한 것은 아닙니다.

더 좋은 점은 콘솔을 실행하는 대신 애플리케이션을 실행할 때 IDE 자체에서 모든 작업을 수행 할 수 있다는 것입니다.


어떤 버전의 VS를 사용하고 있습니까?
— Gabe

테스트 결과 창이 있습니까?
— Gabe

나는 그것을 본 적이 없다. 확인하겠습니다. 내가 가져야할까요?
— 삼켜 진 elysium

답변:


52

도구-> Visual Studio 옵션 대화 상자-> 디버깅-> "모든 출력 창 텍스트를 직접 실행 창으로 리디렉션"을 선택합니다.


68
이 확인란을 선택했지만 여전히 콘솔 팝업이 표시되고 "출력"창 (디버그, 테스트, 빌드, ..) 또는 "즉시 창"에 아무것도 표시되지 않습니다.
— GuiSim

6
@EvenLisle stolsvik의 답변 에서와 같이 응용 프로그램 유형을 Windows 응용 프로그램으로 변경해야합니다 . 이 답변에 언급 된 옵션은 어떤 경우에도 기본적으로 켜져 있습니다.
— TooTone 2014

3
"모든 출력 창 텍스트를 직접 실행 창으로 리디렉션"이란 정확히 무엇을 의미합니까? 필요한 경우 다양한 컨텍스트를 사용하십시오. "즉시 창"이 무엇인지 혼란 스럽습니다.
— Xonatron

11
@TooTone이 질문은 "콘솔 응용 프로그램"에 대해 명확하게 설명하고 디버깅 목적으로 만 다른 것으로 변경합니다. Console.ReadKey () 조차도 불가능 합니다.
— MickyD

1
Debug.WriteLine ()에서만 작동하고 Console.WriteLine ()에서는 작동하지 않습니다. :(
— Y2i

45

에서 비주얼 스튜디오 옵션 대화 상자 -> 디버깅 ->은 "직접 실행 창에 리디렉션 모든 출력 창 텍스트"를 확인합니다. 그런 다음 프로젝트 설정으로 이동하여 유형을 "콘솔 응용 프로그램"에서 "Windows 응용 프로그램"으로 변경합니다. 이 시점에서 Visual Studio는 더 이상 콘솔 창을 열지 않으며 출력은 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를 구현하는 것이 매우 간단하기 때문에 가능성은 말 그대로 무한합니다.


예,하지만 제가 알고 싶은 것은 직접 구현할 필요없이 그냥 할 수 있는지 여부입니다.
— 삼켜 진 elysium

@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 2019

흠. 구성 스크린 샷을 공유해 주시면 제 쪽에서 문제를 복제 해 볼 수 있습니다. 그렇지 않으면 해결 된 솔루션을 공유 할 수 있습니다. 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 응용 프로그램으로 변경"부분에 대해 혼란 스러울 수있는 새로운 웹 개발자를 위해 무언가를 적어 둘 것이라고 생각했습니다. 기본적으로 Visual Studio 2013의 MVC 응용 프로그램이라고 생각하기 때문입니다. 기본값은 클래스 라이브러리의 출력 유형입니다.

내 웹 애플리케이션은 기본적으로 "클래스 라이브러리"의 출력 유형으로 설정됩니다. 그것을 변경할 필요가 없습니다. 내가해야 할 일은 도구> 옵션> 디버깅> 모든 출력 창 텍스트를 직접 실행 창으로 리디렉션하는 제안을 따르는 것입니다. 그런 다음 System.Diagnostics.Trace위의 Joel Coehoorn 의 제안 을 사용했습니다 .


0

나를 위해 작동하는 간단한 솔루션은 콘솔 기능 (ReadKey, String with Format 및 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. C ++의 경우 std 처리기의 복제를 사용하여 양식 응용 프로그램을 리디렉션하거나 C #의 경우 Console.SetOut (TextWriter)을 사용합니다. 출력 창에 인쇄해야하는 경우 Visual Studio 확장 SDK를 사용해야합니다. Github에서 찾을 수있는 두 번째 변형의 예입니다 .
  3. System.Diagnostics.Debug.WriteLine (출력으로 인쇄용)을 사용하는 응용 프로그램을 시작하고 자식 응용 프로그램을 시작합니다. 자식을 시작할 때 파이프를 사용하여 stdout을 부모로 리디렉션해야합니다. MSDN에서 예제를 찾을 수 있습니다. 하지만 이것이 최선의 방법은 아니라고 생각합니다.

0

Console.WriteLine의 출력이 필요하고 모든 출력 창 텍스트를 직접 실행 창으로 리디렉션 이 작동하지 않고 NUnit.Framework를 사용하여 통합 테스트 탐색기에서 테스트의 출력을 알아야하는 경우 VS 2017에서 문제가 이미 해결되었습니다. :

Jon Skeet의 C # In Depth에서 가져온 예제 : Jon Skeet의 C # In Depth에서 가져온 예제 이것은 텍스트 탐색기에서 다음 출력을 생성합니다. 작업 탐색기

오른쪽에있는 Elapsed Time 아래의 Blue Output을 클릭하면 다음과 같이 생성됩니다. 표준 출력

표준 출력 은 Console.WriteLine에 의해 생성 된 원하는 출력입니다.

VS 2017의 콘솔 ​​및 Windows Form 애플리케이션에 대해 작동하지만 디버그 또는 실행시 테스트 탐색기에 대해 생성 된 출력에 대해서만 작동합니다. 어쨌든 이것은 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 단계 : 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭 한 다음 출력 유형을 창 응용 프로그램으로 만듭니다.

2 단계 : 디버그-> 옵션 ..--> 디버깅 (확장)-> 일반-> 모든 출력 창 텍스트를 직접 실행 창으로 리디렉션


3
이 대답은 이전에 세 번 주어졌습니다. 질문에 대한 답변이 아닙니다.
— Klay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.