콘솔 대신 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.