Share via


응용 프로그램 관리 개요

업데이트: 2008년 7월

이 항목에서는 응용 프로그램을 만들고 관리하는 WPF(Windows Presentation Foundation) 서비스에 대해 간략하게 설명합니다. WPF 응용 프로그램 커널은 다양한 핵심 응용 프로그램 서비스를 지원하는 Application 클래스입니다. 이 항목에서는 이러한 서비스 중에서 가장 중요한 몇 가지 서비스를 소개합니다.

이 항목에는 다음 단원이 포함되어 있습니다.

  • 응용 프로그램 클래스
  • 응용 프로그램 정의
  • 현재 응용 프로그램 가져오기
  • 응용 프로그램 수명
  • 기타 응용 프로그램 서비스
  • 관련 항목

응용 프로그램 클래스

응용 프로그램은 UI(사용자 인터페이스), 비즈니스 논리, 데이터 액세스 논리, 컨트롤 및 데이터를 비롯한 많은 응용 프로그램 관련 요소로 구성됩니다. 대개 이러한 요소는 응용 프로그램마다 다릅니다. 하지만 모든 응용 프로그램은 응용 프로그램 구현 및 관리를 원활하게 하는 공통 기능 집합을 공유하는 경향이 있습니다. WPF에서는 이러한 공통 응용 프로그램 범위 기능이 다음과 같은 서비스를 제공하는 Application 클래스로 캡슐화됩니다.

  • 공통 응용 프로그램 인프라 만들기 및 관리

  • 응용 프로그램 수명 추적 및 상호 작용

  • 명령줄 매개 변수 검색 및 처리

  • 응용 프로그램 범위에 속한 속성 및 리소스 공유

  • 처리되지 않은 예외 검색 및 응답

  • 종료 코드 반환

  • 독립 실행형 응용 프로그램에서 창 관리(WPF 창 개요 참조)

  • 탐색 추적 및 관리(탐색 개요 참조)

응용 프로그램에서 이러한 서비스를 사용하려면 Application 클래스를 사용하여 응용 프로그램 정의를 구현해야 합니다.

응용 프로그램 정의

WPF 응용 프로그램 정의는 Application에서 파생된 클래스이며 특수한 MSBuild(Microsoft Build Engine) 설정으로 구성됩니다.

응용 프로그램 정의 구현

일반적인 WPF 응용 프로그램 정의는 태그와 코스 숨김을 모두 사용하여 구현됩니다. 따라서 코드 숨김을 사용하여 응용 프로그램별 동작을 구현하고 이벤트를 처리하는 동시에 태그를 사용하여 응용 프로그램 속성과 리소스를 선언적으로 설정하고 이벤트를 등록할 수 있습니다.

다음 예제에서는 태그와 코드 숨김을 함께 사용하여 응용 프로그램 정의를 구현하는 방법을 보여 줍니다.

<Application 
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" 
  x:Class="SDKSample.App" />
using System.Windows;  // Application

namespace SDKSample
{
    public partial class App : Application { }
}

태그 파일과 코드 숨김 파일이 함께 작동하도록 하려면 다음이 필요합니다.

  • 태그에서 Application 요소에 x:Class 특성이 포함되어야 합니다. 응용 프로그램을 빌드할 때 태그 파일에 x:Class가 있으면 MSBuild에서는 Page에서 파생되고 x:Class 특성에 의해 이름이 지정되는 partial 클래스가 만들어집니다. 이렇게 하려면 XAML 스키마에 대한 XML 네임스페이스 선언을 추가해야 합니다(xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml").

  • 코드 숨김에서 클래스는 태그의 x:Class 특성으로 지정된 이름과 이름이 같은 partial 클래스여야 하며 Application에서 파생되어야 합니다. 이를 통해 응용 프로그램 빌드 시 태그 파일에 대해 생성되는 partial 클래스와 코드 숨김 파일을 연결할 수 있습니다(WPF 응용 프로그램 만들기(WPF) 참조).

참고

Microsoft Visual Studio를 사용하여 새 WPF 응용 프로그램 프로젝트나 WPF 브라우저 응용 프로그램 프로젝트를 만들면 응용 프로그램 정의가 기본적으로 포함되고 태그와 코드 숨김을 모두 사용하여 정의됩니다.

이 코드는 응용 프로그램 정의를 구현하는 데 필요한 최소한의 코드이지만, 응용 프로그램을 빌드하고 실행하려면 먼저 응용 프로그램 정의에 대해 추가 MSBuild 구성이 이루어져야 합니다.

MSBuild용으로 응용 프로그램 정의 구성

독립 실행형 응용 프로그램과 XBAP(XAML 브라우저 응용 프로그램)를 사용하려면 이를 실행할 수 있는 특정 수준의 인프라를 구현해야 합니다. 이 인프라의 가장 중요한 부분은 진입점입니다. 사용자가 응용 프로그램을 시작하면 운영 체제에서는 잘 알려진 응용 프로그램 시작 함수인 진입점을 호출합니다.

일반적으로는 사용하는 기술에 따라 개발자가 직접 이 코드 일부나 전체를 작성해야 합니다. 하지만 다음 MSBuild 프로젝트 파일에서 볼 수 있는 것처럼 응용 프로그램 정의의 태그 파일을 MSBuild ApplicationDefinition 항목으로 구성하면 WPF에서 이 코드가 자동으로 생성됩니다.

<Project 
  DefaultTargets="Build"
  xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
  ...
  <ApplicationDefinition Include="App.xaml" />
  <Compile Include="App.xaml.cs" />
  ...
</Project>

코드 숨김 파일에 코드가 들어 있으므로 이 코드는 일반적인 MSBuild Compile 항목으로 표시됩니다.

응용 프로그램 정의의 태그 및 코드 숨김 파일에 이러한 MSBuild 구성을 적용하면 MSBuild에서 다음과 같은 코드가 생성됩니다.

using System; // STAThread
using System.Windows; // Application

namespace SDKSample
{
    public class App : Application
    {
        public App() { }
        [STAThread]
        public static void Main()
        {
            // Create new instance of application subclass
            App app = new App();

            // Code to register events and set properties that were
            // defined in XAML in the application definition
            app.InitializeComponent();

            // Start running the application
            app.Run();
        }

        public void InitializeComponent()
        {


...


        }
    }
}

결과 코드는 진입점 메서드인 Main을 포함하는 추가 인프라 코드로 응용 프로그램 정의를 보완합니다. STAThreadAttribute 특성은 Main 메서드에 적용되어 WPF 응용 프로그램에 대한 기본 UI 스레드가 WPF 응용 프로그램에 필요한 STA 스레드임을 나타냅니다. Main을 호출하면 이벤트를 등록하고 태그에서 구현되는 속성을 설정하는 InitializeComponent 메서드를 호출하기 전에 새 App 인스턴스가 생성됩니다. InitializeComponent가 자동으로 생성되기 때문에 PageWindow 구현에서 수행하는 것처럼 응용 프로그램 정의에서 InitializeComponent를 명시적으로 호출할 필요가 없습니다. 마지막으로 Run 메서드가 호출되어 응용 프로그램이 시작됩니다.

현재 응용 프로그램 가져오기

Application 클래스의 서비스는 응용 프로그램 간에서 공유되기 때문에 Application 클래스의 인스턴스는 AppDomain별로 하나만 있을 수 있습니다. 이를 강제하기 위해 Application 클래스는 singleton 클래스로 구현됩니다(Implementing Singleton in C# 참조). 그러면 singleton 클래스는 자체적인 단일 인스턴스를 생성하고 static Current 속성으로 해당 인스턴스에 대한 공유 액세스를 제공합니다.

다음 코드에서는 현재 AppDomainApplication 개체에 대한 참조를 가져오는 방법을 보여 줍니다.

// Get current application
Application current = App.Current;

CurrentApplication 클래스의 인스턴스에 대한 참조를 반환합니다. Application 파생 클래스를 참조하려면 다음 예제와 같이 Current 속성 값을 캐스팅해야 합니다.

// Get strongly-typed current application
App app = (App)App.Current;

Application 개체의 수명 중 언제라도 Current 값을 검사할 수 있습니다. 하지만 이러한 검사를 수행할 때는 주의해야 합니다. Application 클래스가 인스턴스화된 후 Application 개체의 상태가 일치하지 않는 기간이 존재하기 때문입니다. 이 기간 중에는 Application이 응용 프로그램 인프라 설정, 속성 설정, 이벤트 등록을 비롯하여 코드를 실행하는 데 필요한 다양한 초기화 작업을 수행합니다. 이 기간 중에 Application 개체를 사용하려고 하면 코드가 예기치 않은 결과를 반환할 수 있습니다. 특히 코드가 현재 설정 중인 다양한 Application 속성에 의존하는 경우에 그렇습니다.

Application이 초기화 작업을 완료하면 실제 수명이 시작됩니다.

응용 프로그램 수명

WPF 응용 프로그램의 수명은 Application에 의해 발생되는 몇 가지 이벤트로 표시되므로 응용 프로그램의 시작, 활성화 및 비활성화 시점, 종료 시점을 알 수 있습니다.

시작 화면

.NET Framework 3.5 SP1부터는 시작 창 또는 시작 화면에 사용할 이미지를 지정할 수 있습니다. SplashScreen 클래스를 사용하면 응용 프로그램이 로드되는 동안 손쉽게 시작 창을 표시할 수 있습니다. SplashScreen 창은 Run이 호출되기 전에 만들어져 표시됩니다. 자세한 내용은 응용 프로그램 시작 시간방법: WPF 응용 프로그램에 시작 화면 추가을 참조하십시오.

응용 프로그램 시작

Run이 호출되고 응용 프로그램이 초기화된 후에는 응용 프로그램을 실행할 수 있습니다. 이 시점은 Startup 이벤트가 발생하는 시점입니다.

using System.Windows; // Application, StartupEventArgs, WindowState

namespace SDKSample
{
    public partial class App : Application
    {
        void App_Startup(object sender, StartupEventArgs e)
        {
            // Application is running


...


        }
    }
}

응용 프로그램 수명 중 이 시점에서 가장 일반적으로 수행되는 작업은 UI를 표시하는 것입니다.

사용자 인터페이스 표시

대부분의 독립 실행형 Windows 응용 프로그램은 실행이 시작되면 Window를 엽니다. 다음 코드와 같이 Startup 이벤트 처리기가 이 작업을 수행할 수 있는 위치입니다.

<Application
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.App" 
  Startup="App_Startup" />
using System.Windows; // Application, StartupEventArgs

namespace SDKSample
{
    public partial class App : Application
    {
        void App_Startup(object sender, StartupEventArgs e)
        {
            // Open a window
            MainWindow window = new MainWindow();
            window.Show();
        }
    }
}

참고

독립 실행형 응용 프로그램에서 처음 인스턴스화되는 Window가 기본적으로 기본 응용 프로그램 창이 됩니다. 이 Window 개체는 Application.MainWindow 속성이 참조합니다. 처음 인스턴스화된 Window 대신 다른 창이 기본 창이 되어야 하는 경우 MainWindow 속성 값을 프로그래밍 방식으로 변경할 수 있습니다.

XBAP를 처음 시작하면 대부분 Page로 이동합니다. 이는 다음 코드에서 볼 수 있습니다.

Startup을 처리하여 Window만 열거나 Page로 이동하려는 경우에는 태그에서 StartupUri 특성을 대신 설정할 수 있습니다.

다음 예제에서는 독립 실행형 응용 프로그램에서 StartupUri를 사용하여 Window를 여는 방법을 보여 줍니다.

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    StartupUri="MainWindow.xaml" />

다음 예제에서는 XBAP에서 StartupUri를 사용하여 Page로 이동하는 방법을 보여 줍니다.

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    StartupUri="HomePage.xaml" />

이 태그는 창을 여는 이전 코드와 같은 효과를 갖습니다.

참고

탐색에 대한 자세한 내용은 탐색 개요를 참조하십시오.

Window를 기본 생성자가 아닌 생성자를 사용하여 인스턴스화하거나, 해당 속성을 설정하거나, 표시하기 전에 해당 이벤트를 등록해야 하는 경우 Startup 이벤트를 처리하거나 응용 프로그램이 시작될 때 제공된 모든 명령줄 인수를 처리해야 합니다.

명령줄 인수 처리

Windows에서는 명령 프롬프트나 바탕 화면에서 독립 실행형 응용 프로그램을 시작할 수 있습니다. 두 경우 모두 명령줄 인수를 응용 프로그램으로 전달할 수 있습니다. 다음 예제에서는 단일 명령줄 인수 "/StartMinimized"를 사용하여 시작되는 응용 프로그램을 보여 줍니다.

wpfapplication.exe /StartMinimized

응용 프로그램이 초기화되는 중에 WPF는 StartupEventArgs 매개 변수의 Args 속성을 통해 운영 체제에서 명령줄 인수를 검색하고 Startup 이벤트 처리기로 전달합니다. 다음과 같은 코드를 사용하여 명령줄 인수를 검색하고 저장할 수 있습니다.

<Application
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.App"
  Startup="App_Startup" />
using System.Windows; // Application, StartupEventArgs, WindowState

namespace SDKSample
{
    public partial class App : Application
    {
        void App_Startup(object sender, StartupEventArgs e)
        {
            // Application is running
            // Process command line args
            bool startMinimized = false;
            for (int i = 0; i != e.Args.Length; ++i)
            {
                if (e.Args[i] == "/StartMinimized")
                {
                    startMinimized = true;
                }
            }

            // Create main application window, starting minimized if specified
            MainWindow mainWindow = new MainWindow();
            if (startMinimized)
            {
                mainWindow.WindowState = WindowState.Minimized;
            }
            mainWindow.Show();
        }
    }
}

코드에서는 Startup을 처리하여 /StartMinimized 명령줄 인수가 제공되었는지 확인합니다. 인수가 제공된 경우 WindowStateMinimized인 기본 창을 엽니다. WindowState 속성은 프로그래밍 방식으로 설정되어야 하므로 기본 Window는 코드에서 명시적으로 열려야 합니다.

정규식을 사용하는 보다 강력한 명령줄 구문 분석 기법을 보여 주는 샘플은 명령줄 인수 처리 샘플을 참조하십시오.

XBAP는 ClickOnce 배포를 사용하여 시작되기 때문에 명령줄 인수를 검색하고 처리할 수 없습니다(WPF 응용 프로그램 배포(WPF) 참조). 하지만 XBAP는 XBAP를 시작하는 데 사용되는 URL에서 쿼리 문자열 매개 변수를 검색하고 처리할 수 있습니다. 예제를 보려면 URI 쿼리 문자열 매개 변수 샘플을 참조하십시오.

응용 프로그램 활성화 및 비활성화

Windows를 사용하면 다른 응용 프로그램으로 전환할 수가 있습니다. 가장 일반적인 방법은 Alt+Tab 키 조합을 사용하는 것입니다. 응용 프로그램은 사용자가 선택할 수 있는 Window가 표시되어 있는 경우에만 전환할 수 있습니다. 현재 선택된 Window는 활성 창(전경 창이라고도 함)이며 사용자 입력을 받는 Window입니다. 활성 창이 있는 응용 프로그램을 활성 응용 프로그램(또는 전경 응용 프로그램)이라고 하는데, 다음과 같은 경우에 응용 프로그램이 활성 응용 프로그램이 됩니다.

  • 응용 프로그램이 시작되어 Window를 표시하는 경우

  • 응용 프로그램에서 Window를 선택하여 다른 응용 프로그램으로 전환하는 경우

Application.Activated 이벤트를 처리하면 응용 프로그램이 활성화되는 시점을 감지할 수 있습니다.

마찬가지로 다음과 같은 경우에는 응용 프로그램이 비활성화됩니다.

  • 현재 응용 프로그램에서 다른 응용 프로그램으로 전환하는 경우

  • 응용 프로그램이 종료되는 경우

Application.Deactivated 이벤트를 처리하면 응용 프로그램이 비활성화되는 시점을 감지할 수 있습니다.

다음 코드에서는 ActivatedDeactivated 이벤트를 처리하여 응용 프로그램이 활성화되었는지 확인하는 방법을 보여 줍니다.

<Application 
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.App"
  StartupUri="MainWindow.xaml"
  Activated="App_Activated" 
  Deactivated="App_Deactivated" />
using System; // EventArgs
using System.Windows; // Application

namespace SDKSample
{
    public partial class App : Application
    {
        bool isApplicationActive;

        void App_Activated(object sender, EventArgs e)
        {
            // Application activated
            this.isApplicationActive = true;
        }

        void App_Deactivated(object sender, EventArgs e)
        {
            // Application deactivated
            this.isApplicationActive = false;
        }
    }
}

Window도 활성화 및 비활성화할 수 있습니다. 자세한 내용은 Window.ActivatedWindow.Deactivated를 참조하십시오.

참고

XBAP의 경우에는 Application.ActivatedApplication.Deactivated도 발생하지 않습니다.

응용 프로그램 종료

응용 프로그램이 종료되면 응용 프로그램 수명이 끝납니다. 이러한 경우는 다음과 같은 이유 때문에 발생합니다.

  • 사용자가 모든 Window를 닫은 경우

  • 사용자가 기본 Window를 닫은 경우

  • 사용자가 로그오프나 종료를 통해 Windows를 끝낸 경우

  • 응용 프로그램별 조건이 충족된 경우

응용 프로그램 종료를 쉽게 관리할 수 있도록 Application에서는 Shutdown 메서드, ShutdownMode 속성, 그리고 SessionEndingExit 이벤트를 제공합니다.

참고

ShutdownUIPermission이 있는 응용 프로그램에서만 호출할 수 있습니다. 독립 실행형 WPF 응용 프로그램에는 항상 이 권한이 있습니다. 하지만 인터넷 영역의 부분 신뢰 보안 샌드박스에서 실행되는 XBAP에는 이 권한이 없습니다.

종료 모드

대부분의 응용 프로그램은 모든 창을 닫거나 기본 창을 닫으면 종료됩니다. 하지만 다른 응용 프로그램과 관련된 조건이 특정 응용 프로그램의 종료 시기를 결정하는 경우가 있습니다. 다음 ShutdownMode 열거형 값 중 하나로 ShutdownMode를 설정하여 응용 프로그램이 종료되는 조건을 지정할 수 있습니다.

ShutdownMode의 기본값은 OnLastWindowClose로, 이는 사용자가 응용 프로그램의 마지막 창을 닫으면 응용 프로그램이 자동으로 종료된다는 것을 의미합니다. 하지만 기본 창이 닫힐 때 응용 프로그램을 종료해야 하는 경우 ShutdownModeOnMainWindowClose로 설정하면 WPF에서 자동으로 기본 창이 닫힙니다. 다음 예제에서 이를 확인할 수 있습니다.

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    ShutdownMode="OnMainWindowClose" />

응용 프로그램별 종료 조건이 있는 경우 ShutdownModeOnExplicitShutdown으로 설정합니다. 이 경우 Shutdown 메서드를 호출하여 명시적으로 응용 프로그램을 종료하는 것은 사용자의 책임입니다. 그렇지 않으면 모든 창을 닫은 경우에도 응용 프로그램이 계속 실행됩니다. ShutdownModeOnLastWindowClose 또는 OnMainWindowClose인 경우에는 Shutdown이 암시적으로 호출됩니다.

참고

XBAP에서 ShutdownMode를 설정할 수 있지만 이 설정은 무시됩니다. 브라우저에서 다른 위치를 탐색하거나 XBAP를 호스팅하는 브라우저가 닫히면 XBAP가 항상 종료됩니다. 자세한 내용은 탐색 개요를 참조하십시오.

세션 종료

ShutdownMode 속성으로 기술되는 종료 조건은 응용 프로그램에 한정됩니다. 하지만 외부 조건에 따라 응용 프로그램이 종료되는 경우도 있습니다. 가장 일반적인 외부 조건은 다음과 같은 작업으로 사용자가 Windows 세션을 끝내는 경우에 발생합니다.

  • 로그오프

  • 종료

  • 다시 시작

  • 최대 절전 모드

Windows 세션이 종료되는 시점을 감지하려면 다음 예제에서 보여 주는 것처럼 SessionEnding 이벤트를 처리하면 됩니다.

<Application 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    StartupUri="MainWindow.xaml"
    SessionEnding="App_SessionEnding" />
using System.Windows; // Application, SessionEndingCancelEventArgs, MessageBox, MessageBoxResult, MessageBoxButton

namespace SDKSample
{
    public partial class App : Application
    {
        void App_SessionEnding(object sender, SessionEndingCancelEventArgs e)
        {
            // Ask the user if they want to allow the session to end
            string msg = string.Format("{0}. End session?", e.ReasonSessionEnding);
            MessageBoxResult result = MessageBox.Show(msg, "Session Ending", MessageBoxButton.YesNo);

            // End session, if specified
            if (result == MessageBoxResult.No)
            {
                e.Cancel = true;
            }
        }
    }
}

이 예제에서는 코드가 ReasonSessionEnding 속성을 검사하여 Windows 세션이 종료되는 방식을 결정합니다. 또한 이 값을 사용하여 사용자에게 확인 메시지를 표시합니다. 사용자가 세션이 종료되길 원하지 않는 경우에는 코드에서 Cancel을 true로 설정하여 Windows 세션이 종료되지 않게 합니다.

참고

XBAP의 경우에는 SessionEnding이 발생하지 않습니다.

끝내기

응용 프로그램이 종료될 때 응용 프로그램 상태 유지와 같은 몇 가지 최종 처리를 수행해야 할 경우가 있습니다. 이러한 경우에는 Exit 이벤트를 처리할 수 있습니다.

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    StartupUri="MainWindow.xaml" 
    Startup="App_Startup" 
    Exit="App_Exit">


...


</Application>
using System.Windows; // Application, StartupEventArgs
using System.IO; // StreamReader, FileMode
using System.IO.IsolatedStorage; // IsolatedStorageFile, IsolatedStorageFileStream

namespace SDKSample
{
    public partial class App : Application
    {
        string filename = "App.txt";

전체 예제를 보려면 방법: 응용 프로그램 세션 간의 응용 프로그램 범위 속성 유지 및 복원을 참조하십시오.

독립 실행형 응용 프로그램 및 XBAP 모두에서 Exit를 처리할 수 있습니다. XBAP의 경우 다음과 같은 상황에서 Exit가 발생합니다.

  • 탐색 위치가 XBAP를 벗어나는 경우

  • Internet Explorer 7에서 XBAP를 호스팅하는 탭이 닫힌 경우

  • 브라우저가 닫힌 경우

종료 코드

대부분의 경우 응용 프로그램은 운영 체제에서 사용자 요청에 대한 응답으로 시작하게 됩니다. 하지만 다른 응용 프로그램에서 특정 작업을 수행하기 위해 응용 프로그램을 시작할 수도 있습니다. 이렇게 시작된 응용 프로그램이 종료될 경우 시작하는 응용 프로그램에서 시작된 응용 프로그램이 종료되는 조건을 알아야 할 수 있습니다. 이런 경우 Windows에서는 응용 프로그램이 종료될 때 응용 프로그램 종료 코드를 반환할 수 있습니다. 기본적으로 WPF 응용 프로그램은 종료 코드 값으로 0을 반환합니다.

참고

Visual Studio에서 디버깅할 경우 응용 프로그램이 종료되면 출력 창에 응용 프로그램 종료 코드가 다음과 같은 메시지로 표시됩니다.

The program '[5340] AWPFApp.vshost.exe: Managed' has exited with code 0 (0x0).

보기 메뉴에서 출력을 클릭하여 출력 창을 엽니다.

종료 코드를 변경하려면 정수 인수를 종료 코드로 받아들이는 Shutdown(Int32) 오버로드를 호출할 수 있습니다.

// Shutdown and return a non-default exit code
Application.Current.Shutdown(-1);

Exit 이벤트를 처리하면 종료 코드 값을 감지하고 변경할 수 있습니다. Exit 이벤트 처리기는 ApplicationExitCode 속성이 있는 종료 코드에 대한 액세스를 제공하는 ExitEventArgs를 전달합니다. 자세한 내용은 Exit를 참조하십시오.

참고

독립 실행형 응용 프로그램 및 XBAP 모두에서 종료 코드를 설정할 수 있습니다. 하지만 XBAP의 경우 종료 코드 값이 무시됩니다.

처리되지 않은 예외

원하지 않는 예외를 throw하는 경우와 같이 응용 프로그램이 비정상적인 상황에서 종료되는 경우가 있습니다. 이런 경우에는 응용 프로그램에 예외를 감지하고 처리할 코드가 없을 수 있습니다. 이런 형식의 예외가 처리되지 않은 예외이며, 응용 프로그램이 닫히기 전에 다음 그림에 표시된 것과 비슷한 알림으로 표시됩니다.

처리되지 않은 예외 알림

사용자 환경의 관점에서는 응용 프로그램에서 다음과 같은 작업의 일부 또는 전부를 수행하여 이러한 기본 동작을 방지하는 것이 바람직합니다.

  • 사용자에게 친숙한 정보 표시

  • 응용 프로그램을 실행 상태로 유지

  • Windows 이벤트 로그에 개발자에게 친숙한 세부적인 예외 정보 기록

이러한 지원을 구현하는 것은 처리되지 않은 예외, 다시 말해 DispatcherUnhandledException 이벤트가 발생하는 원인을 감지할 수 있는지에 따라 달라집니다.

<Application
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.App"
  StartupUri="MainWindow.xaml"
  DispatcherUnhandledException="App_DispatcherUnhandledException" />
using System.Windows; // Application
using System.Windows.Threading; // DispatcherUnhandledExceptionEventArgs

namespace SDKSample
{
    public partial class App : Application
    {
        void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            // Process unhandled exception


...


            // Prevent default unhandled exception processing
            e.Handled = true;
        }
    }
}

참고

DispatcherUnhandledException을 처리하는 방법에 대한 자세한 예제는 처리되지 않은 응용 프로그램 예외 샘플을 참조하십시오.

DispatcherUnhandledException 이벤트 처리기는 예외 자체(DispatcherUnhandledExceptionEventArgs.Exception)를 포함하여 처리되지 않은 예외와 관련된 컨텍스트 정보를 포함하는 DispatcherUnhandledExceptionEventArgs 매개 변수를 전달합니다. 이 정보를 사용하여 예외를 처리하는 방법을 결정할 수 있습니다.

DispatcherUnhandledException을 처리할 때는 DispatcherUnhandledExceptionEventArgs.Handled 속성을 true로 설정해야 합니다. 그렇지 않으면 WPF에서 계속해서 예외가 처리되지 않은 것으로 간주하고 이전에 설명한 기본 동작으로 돌아갑니다. 처리되지 않은 예외가 발생하고 DispatcherUnhandledException 이벤트가 처리되지 않거나 이벤트가 처리되지만 Handled가 false로 설정되는 경우 응용 프로그램이 즉시 종료됩니다. 또한 다른 Application 이벤트가 발생되지 않습니다. 따라서 응용 프로그램에 응용 프로그램이 종료되기 전에 실행되어야 하는 코드가 있는 경우 DispatcherUnhandledException을 처리해야 합니다.

처리되지 않은 예외의 결과로 응용 프로그램이 종료될 수는 있지만 응용 프로그램은 대개 다음 단원에서 설명하는 것처럼 사용자 요청에 대한 응답으로 종료됩니다.

응용 프로그램 수명 이벤트

독립 실행형 응용 프로그램과 XBAP는 수명이 동일하지 않습니다. 다음 그림에서는 독립 실행형 응용 프로그램의 주요 수명 이벤트와 이러한 이벤트가 발생하는 순서를 보여 줍니다.

독립 실행형 응용 프로그램 - 응용 프로그램 개체 이벤트

마찬가지로 다음 그림에서는 XBAP의 주요 수명 이벤트와 이러한 이벤트가 발생하는 순서를 보여 줍니다.

XBAP - 응용 프로그램 개체 이벤트

기타 응용 프로그램 서비스

Application에서는 응용 프로그램 수명을 관리하는 서비스뿐만 아니라 다음과 같은 서비스를 제공합니다.

  • 공유 응용 프로그램 범위 속성

  • 공유 응용 프로그램 범위 리소스

  • 응용 프로그램 리소스, 콘텐츠 및 원본 사이트 데이터 파일

  • 창 관리

  • 탐색 관리

공유 응용 프로그램 범위 속성

응용 프로그램에서는 응용 프로그램의 경계를 넘어 공유할 수 있는 상태를 노출하는 Properties 속성을 제공합니다. 다음 예제에서는 Properties의 사용 방법을 보여 줍니다.

// Set an application-scope property with a custom type
CustomType customType = new CustomType();
Application.Current.Properties["CustomType"] = customType;


...


// Get an application-scope property
// NOTE: Need to convert since Application.Properties is a dictionary of System.Object
CustomType customType = (CustomType)Application.Current.Properties["CustomType"];

자세한 내용은 다음 항목을 참조하십시오.

공유 응용 프로그램 범위 리소스

응용 프로그램에서는 개발자가 응용 프로그램 간에 UI 리소스를 공유할 수 있도록 Resources 속성을 제공합니다. 다음 예제에서는 Properties의 사용 방법을 보여 줍니다.

// Set an application-scope resource
Application.Current.Resources["ApplicationScopeResource"] = Brushes.White;


...


// Get an application-scope resource
Brush whiteBrush = (Brush)Application.Current.Resources["ApplicationScopeResource"];

자세한 내용은 다음 항목을 참조하십시오.

응용 프로그램 리소스, 콘텐츠 및 원본 사이트 데이터 파일

WPF 응용 프로그램은 리소스 파일, 콘텐츠 파일 및 원본 사이트 파일을 비롯한 다양한 형식의 비코드 데이터 파일을 관리할 수 있습니다. 다음 도우미 메서드를 사용하여 이러한 형식의 데이터 파일을 로드할 수 있습니다.

창 관리

ApplicationWindow는 밀접한 관계가 있습니다. 앞서 살펴 본 것처럼 응용 프로그램의 수명은 ShutdownMode 속성으로 지정된 창의 수명에 따라 달라질 수 있습니다. Application은 기본 응용 프로그램 창으로 지정된 창을 기록하고(Application.MainWindow), 현재 인스턴스화된 창 목록 유지합니다(Application.Windows).

자세한 내용은 WPF 창 개요를 참조하십시오.

탐색 관리

탐색 기능이 있는 독립 실행형 응용 프로그램(NavigationWindowFrame 사용) 또는 XBAP의 경우 Application은 응용 프로그램 내의 모든 탐색을 감지하고 그에 따라 다음과 같은 이벤트를 발생시킵니다.

또한 ApplicationGetCookieSetCookie를 사용하여 모든 종류의 응용 프로그램에서 쿠키를 생성하고, 유지하고, 검색하는 기능을 제공합니다.

자세한 내용은 탐색 개요를 참조하십시오.

참고 항목

개념

WPF 창 개요

탐색 개요

Windows Presentation Foundation 응용 프로그램 리소스, 콘텐츠 및 데이터 파일

참조

Application

변경 기록

날짜

변경 내용

이유

2008년 7월

시작 화면 사용에 대한 단원이 추가되었습니다.

SP1 기능 변경