Microsoft MVP성태의 닷넷 이야기
.NET Framework: 851. WinForm/WPF에서 Console 창을 띄워 출력하는 방법 [링크 복사], [링크+제목 복사],
조회: 29117
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 2개 있습니다.)
(시리즈 글이 3개 있습니다.)
.NET Framework: 851. WinForm/WPF에서 Console 창을 띄워 출력하는 방법
; https://www.sysnet.pe.kr/2/0/12000

.NET Framework: 1031. WinForm/WPF에서 Console 창을 띄워 출력하는 방법 (2) - Output 디버깅 출력을 AllocConsole로 우회
; https://www.sysnet.pe.kr/2/0/12581

C/C++: 173. Windows / C++ - AllocConsole로 할당한 콘솔과 CRT 함수 연동
; https://www.sysnet.pe.kr/2/0/13729




WinForm/WPF에서 Console 창을 띄워 출력하는 방법

아래의 질문이 있었는데요.

안녕하세요 디버깅시 콘솔창을 띠어서 볼수가 없나요?
; https://www.sysnet.pe.kr/3/0/5204

덧글에 쓴 대로, 다음의 글에서 아주 간단하게 설명해 주고 있습니다.

Console and WinForm together for easy debugging
; https://www.codeproject.com/Articles/9197/Console-and-WinForm-together-for-easy-debugging

일례로 WPF 응용 프로그램이라면 다음과 같이 작성해 테스트하면 됩니다.

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            NativeMethods.AllocConsole();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Console.WriteLine("test");
        }
    }


    static class NativeMethods
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool AllocConsole();
    }
}

여기서 한 가지 알아두어야 할 점이 있다면? Visual Studio에서 F5 디버깅으로 시작하는 경우라면 Console.WriteLine의 출력이 Visual Studio에 의해 Output 창으로 나오므로 AllocConsole로 띄운 창에는 나오지 않습니다. 따라서, Ctrl + F5 (Start Without Debugging)으로 응용 프로그램을 시작해야 정상적인 콘솔 출력을 확인할 수 있습니다.

이런 실수를 고려한다면 AllocConsole 호출 부분을 다음과 같이 수정하는 것이 좋습니다.

public MainWindow()
{
    InitializeComponent();
#if DEBUG
    if (Debugger.IsAttached == false)
    {
        NativeMethods.AllocConsole();
    }
#endif
}

이 외에 또 하나 주의할 것이 있는데요, AllocConsole을 호출하기 전 Console.Write... 관련 호출을 해서는 안 됩니다. 가령 다음의 코드는,

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Console.WriteLine("test");
        if (Debugger.IsAttached == false)
        {
            NativeMethods.AllocConsole();
        }
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Console.WriteLine("test");
    }
}

Button_Click의 Console.WriteLine 출력이 AllocConsole 창에 나오지 않게 됩니다. 마찬가지로 이런 실수를 줄이려면 AllocConsole 호출을 (WPF의 경우) App.xaml.cs에 다음과 같이 먼저 처리해 주는 것이 좋습니다.

using System.Diagnostics;
using System.Windows;

namespace WpfApp1
{
    public partial class App : Application
    {
        public App()
        {
#if DEBUG
            if (Debugger.IsAttached == false)
            {
                NativeMethods.AllocConsole();
            }
#endif
        }
    }
}

(첨부 파일은 이 글의 예제 코드를 포함합니다.)




참고로, 다음의 글도 한 번 보시고. ^^

Process.Start의 cmd.exe에서 stdin만 redirect 하는 방법
; https://www.sysnet.pe.kr/2/0/11029




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 3/31/2022]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 46  47  48  49  50  51  [52]  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12732정성태7/23/202116966오류 유형: 742. SharePoint - The super user account utilized by the cache is not configured.
12731정성태7/23/202119064개발 환경 구성: 584. Add Internal URLs 화면에서 "Save" 버튼이 비활성화 된 경우
12730정성태7/23/202121553개발 환경 구성: 583. Visual Studio Code - Go 코드에서 입력을 받는 경우
12729정성태7/22/202118617.NET Framework: 1080. xUnit 단위 테스트에 메서드/클래스 수준의 문맥 제공 - Fixture
12728정성태7/22/202120371.NET Framework: 1079. MSTestv2 단위 테스트에 메서드/클래스/어셈블리 수준의 문맥 제공
12727정성태7/21/202121152.NET Framework: 1078. C# 단위 테스트 - MSTestv2/NUnit의 Assert.Inconclusive 사용법(?) [1]
12726정성태7/21/202120034VS.NET IDE: 169. 비주얼 스튜디오 - 단위 테스트 선택 시 MSTestv2 외의 xUnit, NUnit 사용법 [1]
12725정성태7/21/202119334오류 유형: 741. Failed to find the "go" binary in either GOROOT() or PATH
12724정성태7/21/202122874개발 환경 구성: 582. 윈도우 환경에서 Visual Studio Code + Go (Zip) 개발 환경 [1]
12723정성태7/21/202117134오류 유형: 740. SharePoint - Alternate access mappings have not been configured 경고
12722정성태7/20/202117487오류 유형: 739. MSVCR110.dll이 없어 exe 실행이 안 되는 경우
12721정성태7/20/202124281오류 유형: 738. The trust relationship between this workstation and the primary domain failed. - 세 번째 이야기
12720정성태7/19/202119337Linux: 43. .NET Core/5+ 응용 프로그램의 Ubuntu (Debian) 패키지 준비
12719정성태7/19/202118482오류 유형: 737. SharePoint 설치 시 "0x800710D8 The object identifier does not represent a valid object." 오류 발생
12718정성태7/19/202117480개발 환경 구성: 581. Windows에서 WSL로 파일 복사 시 root 소유권으로 적용되는 문제파일 다운로드1
12717정성태7/18/202118405Windows: 195. robocopy에서 파일의 ADS(Alternate Data Stream) 정보 복사를 제외하는 방법
12716정성태7/17/202118380개발 환경 구성: 580. msbuild의 Exec Task에 robocopy를 사용하는 방법파일 다운로드1
12715정성태7/17/202125836오류 유형: 736. Windows - MySQL zip 파일 버전의 "mysqld --skip-grant-tables" 실행 시 비정상 종료 [1]
12714정성태7/16/202118831오류 유형: 735. VCRUNTIME140.dll, MSVCP140.dll, VCRUNTIME140.dll, VCRUNTIME140_1.dll이 없어 exe 실행이 안 되는 경우
12713정성태7/16/202121799.NET Framework: 1077. C# - 동기 방식이면서 비동기 규약을 따르게 만드는 Task.FromResult파일 다운로드1
12712정성태7/15/202120104개발 환경 구성: 579. Azure - 리눅스 호스팅의 Site Extension 제작 방법
12711정성태7/15/202118860개발 환경 구성: 578. Azure - Java Web App Service를 위한 Site Extension 제작 방법
12710정성태7/15/202123774개발 환경 구성: 577. MQTT - emqx.io 서비스 소개
12709정성태7/14/202118732Linux: 42. 실행 중인 docker 컨테이너에 대한 구동 시점의 docker run 명령어를 확인하는 방법
12708정성태7/14/202123683Linux: 41. 리눅스 환경에서 디스크 용량 부족 시 원인 분석 방법
12707정성태7/14/202188944오류 유형: 734. MySQL - Authentication method 'caching_sha2_password' not supported by any of the available plugins.
... 46  47  48  49  50  51  [52]  53  54  55  56  57  58  59  60  ...