다음을 통해 공유


WPF 응용 프로그램 만들기(WPF)

업데이트: 2008년 7월

WPF(Windows Presentation Foundation) 응용 프로그램은 .NET Framework 실행 파일(.exe)이나 라이브러리(.dll)로 만들거나 두 형식의 어셈블리를 결합하여 만들 수 있습니다. 이 항목에서는 우선 명령 프롬프트에서 간단한 WPF 응용 프로그램을 빌드하는 방법을 설명한 다음 WPF에서 MSBuild(Microsoft Build Engine)의 확장성을 이용하여 더 복잡한 응용 프로그램을 빌드하는 방법을 보여 줍니다. 그런 다음 마지막으로 MSBuild 빌드 프로세스의 주요 단계를 자세히 설명합니다.

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

  • 명령줄 컴파일을 사용하여 WPF 응용 프로그램 빌드
  • MSBuild를 사용하여 WPF 응용 프로그램 빌드
  • WPF의 MSBuild 프로젝트 파일
  • Visual Studio를 사용하여 WPF의 MSBuild 프로젝트 만들기
  • WPF의 MSBuild 프로젝트 빌드
  • Windows Presentation Foundation 빌드 파이프라인
  • 증분 빌드 지원
  • 관련 항목

명령줄 컴파일을 사용하여 WPF 응용 프로그램 빌드

태그 없이 전체를 코드로 작성한 WPF는 명령줄 컴파일러로 빌드할 수 있습니다. 예를 들어 다음 소스 코드 파일이 포함된 C# WPF 독립 실행형 응용 프로그램을 살펴보겠습니다.

  • 응용 프로그램 정의 파일(app.cs)

  • 창(mainwindow.cs)

이 응용 프로그램은 다음 예제에서처럼 명령 프롬프트에서 C# 컴파일러 csc.exe를 사용하여 빌드할 수 있습니다.

csc.exe
  /out:WPFApplication.exe
  /target:winexe 
  app.cs mainwindow.cs 
  /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\presentationframework.dll" 
  /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\windowsbase.dll" 
  /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\presentationcore.dll"

이 예제에 대한 설명:

  • 빌드된 실행 가능 어셈블리(WPFApplication.exe)의 이름을 지정하는 /out 매개 변수

  • 컴파일된 어셈블리의 형식(Microsoft Windows 실행 파일)을 지정하는 /target 매개 변수

  • 응용 프로그램을 구성하는 C# 소스 코드 파일(app.cs 및 mainwindow.cs)

  • 응용 프로그램에 사용된 형식을 구현하는 참조된 어셈블리를 식별하는 /reference 매개 변수

컴파일러는 XAML(Extensible Application Markup Language) 소스 코드가 포함된 WPF 응용 프로그램은 지원하지 않지만 명령줄 컴파일을 사용하여 더 복잡한 응용 프로그램을 빌드할 수 있습니다. 또한 명령줄 컴파일은 구성 관리 및 ClickOnce 매니페스트 생성을 비롯하여 일반적인 WPF 응용 프로그램의 빌드 요구 사항을 완벽하게 지원하지는 않습니다. 이러한 요구 사항 및 기타 더 복잡한 빌드 요구 사항을 지원하기 위해 WPF에서는 MSBuild와 통합하고 이를 확장합니다.

참고

명령줄 컴파일에 대한 자세한 내용은 csc.exe를 사용한 명령줄 빌드 또는 명령줄에서 빌드(Visual Basic)를 참조하십시오.

MSBuild를 사용하여 WPF 응용 프로그램 빌드

MSBuild는 .NET Framework에 포함된 강력하고 확장성 높은 기술입니다. MSBuild 기술의 핵심은 다음 표에서 설명하는 여러 어셈블리에서 구현됩니다.

어셈블리

설명

Microsoft.Build.Engine.dll

MSBuild 프로젝트 파일을 읽고 처리합니다.

Microsoft.Build.Tasks.dll

명령줄 컴파일러 호출(예: C#의 경우 csc.exe, Visual Basic의 경우 vbc.exe)을 포함하여 모든 MSBuild 프로젝트에 공통적인 기능을 구현합니다.

Microsoft.Build.Utilities.dll

사용자 지정 빌드 기능으로 MSBuild를 확장하는 유틸리티 클래스를 노출합니다.

Microsoft.Build.Framework.dll

MSBuild 기능이 MSBuild 엔진과 상호 작용하는 방법을 정의하는 인터페이스를 구현합니다.

Microsoft.Build.Conversion.dll

레거시 Microsoft Visual Studio .NET 2002 및 Microsoft Visual Studio .NET 2003 프로젝트 파일 형식을 Microsoft Visual Studio 2005 MSBuild 프로젝트 파일 형식으로 변환할 수 있도록 지원합니다.

참고

MSBuild 어셈블리에 대한 자세한 내용은 MSBuild 참조를 참조하십시오.

WPF의 MSBuild 프로젝트 파일

MSBuild를 구성하는 어셈블리를 MSBuild 엔진이라고 합니다. 응용 프로그램을 빌드하려면 일반적으로 MSBuild 엔진에 다음 정보가 필요합니다.

  • 소스 코드 파일 참조

  • 종속 어셈블리 참조

  • 구성 정보

  • 빌드 요구 사항

MSBuild에서 처리하기 위해 이러한 정보를 사용자 지정 MSBuild 스키마를 따르는 XML 파일에 패키지합니다(MSBuild 프로젝트 파일 스키마 참조 참조). 이러한 파일을 MSBuild 프로젝트 파일이라고 합니다. 다음은 앞에서 명령줄 컴파일러를 사용하여 빌드한 WPF 응용 프로그램 버전에 XAML(Extensible Application Markup Language) 소스 코드 파일을 추가한 MSBuild 프로젝트 파일입니다.

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
     <PropertyGroup>
         <AssemblyName>WPFApplication</AssemblyName>
         <OutputType>winexe</OutputType>
     </PropertyGroup>
     <ItemGroup>
         <Reference Include="System" />
         <Reference Include="WindowsBase" />
         <Reference Include="PresentationCore" />
         <Reference Include="PresentationFramework" />
     </ItemGroup>
     <ItemGroup>
         <ApplicationDefinition Include="App.xaml" />
         <Compile Include="App.xaml.cs" />
         <Page Include="MainWindow.xaml" />
         <Compile Include="MainWindow.xaml.cs" />
     </ItemGroup>
     <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
     <Import Project="$(MSBuildBinPath)\Microsoft.WinFX.targets" />
</Project>

이 예제에는 Project 태그, 속성, 항목, 대상 및 작업을 포함하여 대부분의 MSBuild 프로젝트 파일에 공통되는 요소가 포함됩니다.

프로젝트 요소

MSBuild 프로젝트 파일 스키마로 지정되는 MSBuild 프로젝트 파일은 Project가 최상위 요소인 XML 파일입니다.

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
     ...
</Project>

MSBuild 엔진은 Project 요소에서 프로젝트 파일 처리를 시작합니다. MSBuild 프로젝트 파일의 대상이 되는 MSBuild 버전을 지정하려면 적절한 XML 네임스페이스 선언을 제공합니다.

속성

속성은 MSBuild 프로젝트를 구성하고 MSBuild 엔진에 빌드 관련 정보를 제공하는 데 사용되는 변수입니다. 속성은 다음 예제에서처럼 PropertyGroup 요소 안에 포함됩니다.

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
     <PropertyGroup>
         <AssemblyName>WPFApplication</AssemblyName>
         <OutputType>winexe</OutputType>
     </PropertyGroup>
     ...
</Project>

AssemblyName 및 OutputType과 같은 몇 가지 속성은 모든 종류의 응용 프로그램에 공통되며 일반적인 MSBuild 프로젝트 속성에 설명되어 있습니다. 다음 표에서는 WPF와 관련된 MSBuild 속성을 보여 줍니다.

속성

설명

OutputType

빌드된 어셈블리의 형식을 지정하며 다음 값 중 하나입니다.

  • winexe: 실행 가능 어셈블리(.exe)를 빌드합니다. 독립 실행형 응용 프로그램과 XBAP가 이 출력 형식으로 구성됩니다.

  • library: 라이브러리 어셈블리(.dll)를 빌드합니다. 공유 어셈블리 및 사용자 지정 컨트롤 라이브러리가 이 출력 형식으로 구성됩니다.

HostInBrowser

WPF 응용 프로그램을 브라우저에 호스팅할지 여부를 지정하며 다음 값 중 하나입니다.

  • true: 주 응용 프로그램 어셈블리(.exe), 배포 매니페스트(applicationName.xbap) 및 응용 프로그램 매니페스트(applicationName.exe.manifest)가 포함된 XBAP를 만듭니다.

  • false: 독립 실행형 응용 프로그램을 만듭니다.

HostInBrowser가 true이면 OutputType은 winexe여야 합니다.

Install

XBAP를 클라이언트에 설치할지 여부를 지정합니다. Install은 true이거나 false일 수 있으며 HostInBrowser의 값과 반대입니다.

GenerateManifests

독립 실행형 응용 프로그램을 ClickOnce 배포를 사용하여 게시할지 여부를 지정하며 다음 값 중 하나입니다.

  • true: 주 응용 프로그램 실행 파일, 배포 매니페스트(applicationName.application) 및 응용 프로그램 매니페스트(applicationName.exe.manifest)를 만듭니다.

  • false: 응용 프로그램 실행 파일(.exe)만 만듭니다.

GenerateManifests는 Install의 값이 true인 경우에만 사용됩니다.

UICulture

어셈블리를 빌드할 로캘을 지정합니다. 지정한 경우 Resource 프로젝트 항목으로 선언된 파일과 언어 관련 리소스가 원하는 로캘의 위성 어셈블리로 컴파일됩니다. 반면에 언어 중립 콘텐츠는 주 어셈블리로 컴파일됩니다. 기본적으로 응용 프로그램은 지역화되지 않으므로 리소스 파일은 주 어셈블리에 포함됩니다.

참고

UICulture를 설정한 경우 NeutralResourcesLanguageAttribute를 사용하여 중립 리소스 언어를 지정해야 합니다. 이 특성을 WPF 응용 프로그램의 AssemblyInfo 파일에 추가해야 합니다.

항목

항목은 빌드 프로세스 도중 MSBuild 엔진이 처리하는 MSBuild 입력입니다. 항목은 ItemGroup 요소 안에 포함됩니다.

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
     ...
     <ItemGroup>
         <Reference Include="System" />
         <Reference Include="WindowsBase" />
         <Reference Include="PresentationCore" />
         <Reference Include="PresentationFramework" />
     </ItemGroup>
     <ItemGroup>
         <ApplicationDefinition Include="App.xaml" />
         <Compile Include="App.xaml.cs" />
         <Page Include="MainWindow.xaml" />
         <Compile Include="MainWindow.xaml.cs" />
     </ItemGroup>
     ...
</Project>

항목의 형식은 메타데이터로 구성할 수 있습니다. 앞의 예제에서 어셈블리 참조는 Reference 항목으로 구성되며 소스 코드 파일은 Compile 항목으로 구성됩니다. Reference 및 Compile 항목은 모든 .NET Framework 응용 프로그램에 공통되며 이에 대해서는 일반적인 MSBuild 프로젝트 항목에서 자세히 다룹니다.

다음 표에서는 WPF 관련 MSBuild 항목을 보여 줍니다.

속성

설명

ApplicationDefinition

응용 프로그램 정의(루트 요소가 Application인 XAML 태그 파일)를 포함하는 XAML 태그 파일을 식별합니다. Install이 true이고 OutputType이 winexe인 경우에는 ApplicationDefinition이 필수입니다. WPF 응용 프로그램 및 MSBuild 프로젝트에는 하나의 ApplicationDefinition만 있을 수 있습니다.

Page

콘텐츠가 이진 형식으로 변환되어 어셈블리로 컴파일되는 XAML 태그 파일을 식별합니다. Page 항목은 일반적으로 코드 숨김 클래스와 함께 구현됩니다.

가장 많이 사용되는 Page 항목은 최상위 요소가 다음 중 하나인 XAML 파일입니다.

Resource

응용 프로그램 어셈블리로 컴파일되는 리소스 파일을 식별합니다. 앞서 살펴보았듯이 UICulture가 Resource 항목을 처리합니다.

Content

응용 프로그램과 함께 배포되는 콘텐츠 파일을 식별합니다. 콘텐츠 파일을 설명하는 메타데이터는 AssemblyAssociatedContentFileAttribute를 사용하여 응용 프로그램으로 컴파일됩니다.

SplashScreen

응용 프로그램의 시작 창에 사용되는 이미지 파일을 식별합니다. PresentationBuildTasks 어셈블리는 SplashScreen 인스턴스를 만들어 응용 프로그램 로드 시 표시하는 코드를 App.g.cs 또는 Application.g.vb에 생성합니다. 이 항목은 Visual Studio 2008 SP1부터 사용할 수 있습니다.

대상

대상은 프로젝트를 빌드하는 방법을 결정하며 속성과 항목에 따라 달라집니다. WPF 응용 프로그램에는 언어 관련 대상과 WPF 관련 대상이 있어야 합니다.

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
     ...
     <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
     <Import Project="$(MSBuildBinPath)\Microsoft.WinFX.targets" />
</Project>

대상은 확장명이 .targets인 별도의 파일입니다. .NET Framework에 포함된 대상 파일은 다음 위치에 설치됩니다.

%WINDIR%\Microsoft.NET\Framework\vX.X.X

언어 관련 대상은 언어 관련 소스 코드를 빌드합니다. C#의 언어 관련 대상은 Microsoft.CSharp.targets이며  Visual Basic의 경우에는 Microsoft.VisualBasic.targets입니다. 이 두 대상 모두 여러 가지 공통된 언어 독립적 빌드 작업을 수행하는 Microsoft.Common.targets 대상에서 파생되어 이를 확장합니다. 공통 및 언어 관련 MSBuild 대상에 대한 자세한 내용은 MSBuild .Targets 파일을 참조하십시오.

WPF 관련 빌드 작업은 Microsoft.WinFX.targets 대상에서 수행합니다. 여기에는 XAML 태그 컴파일, XBAP 응용 프로그램의 매니페스트 생성 및 WPF 리소스와 콘텐츠 파일 처리 작업이 포함됩니다.

작업

작업은 특정 빌드 작업을 수행하는 클래스입니다. 대상에서 하나 이상의 작업을 결합하여 빌드 프로세스를 정의할 수 있습니다. MSBuild는 대상을 처리할 때 대상에 포함된 작업을 실행합니다. 공통 및 언어 관련 대상에 사용되는 작업은 Microsoft.Build.Tasks 어셈블리로 구현되며, WPF 관련 작업은 PresentationBuildTasks 어셈블리로 구현됩니다.

대상은 모든 표준 WPF 응용 프로그램을 빌드할 수 있도록 지원합니다. 또한 대체 작업 조합을 사용하여 사용자 지정 빌드 동작을 구현할 수도 있습니다. 예를 들어 다음 MSBuild GetWinFXPath 작업은 .NET Framework 런타임의 기본 경로를 찾는 데 사용됩니다. 이것은 작업이 64비트 프로세서에서 실행 중인지 여부에 따라 다릅니다.

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
     <UsingTask 
         TaskName="Microsoft.Build.Tasks.Windows.GetWinFXPath" 
         AssemblyFile="C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\PresentationBuildTasks.dll" />
     <Target Name="GetWinFXPathTask">
         <GetWinFXPath
             WinFXNativePath="c:\DOTNet3Native" 
             WinFXWowPath="c:\DOTNet3WowNative" />
     </Target>
     <Import Project="$(MSBuildBinPath)\Microsoft.WinFX.targets" />
</Project>

공통 MSBuild 작업에 대한 자세한 내용은 MSBuild 작업 참조를 참조하십시오.

Windows Presentation Foundation MSBuild 프로젝트 샘플

Windows SDK(소프트웨어 개발 키트)에는 일반적인 WPF 응용 프로그램 종류에 대한 몇 가지 예제 MSBuild 프로젝트 파일이 들어 있습니다.

Visual Studio를 사용하여 WPF의 MSBuild 프로젝트 만들기

Visual Studio 프로젝트 템플릿을 사용하여 새 WPF 응용 프로그램을 만들면 Visual Studio에서는 자동으로 MSBuild 프로젝트 파일을 생성합니다. 예를 들어 WPF 응용 프로그램 프로젝트 템플릿은 다음 프로젝트 파일을 생성합니다(C#의 경우).

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>9.0.20726</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{E0EA3EBA-718C-4122-B20C-EB97B7DC6604}</ProjectGuid>
    <OutputType>WinExe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>WpfApplication1</RootNamespace>
    <AssemblyName>WpfApplication1</AssemblyName>
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <ProjectTypeGuids>
      {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};
      {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
    </ProjectTypeGuids>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core">
      <RequiredTargetFramework>3.5</RequiredTargetFramework>
    </Reference>
    <Reference Include="System.Xml.Linq">
      <RequiredTargetFramework>3.5</RequiredTargetFramework>
    </Reference>
    <Reference Include="System.Data.DataSetExtensions">
      <RequiredTargetFramework>3.5</RequiredTargetFramework>
    </Reference>
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
    <Reference Include="WindowsBase" />
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
  </ItemGroup>
  <ItemGroup>
    <ApplicationDefinition Include="App.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </ApplicationDefinition>
    <Page Include="Window1.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </Page>
    <Compile Include="App.xaml.cs">
      <DependentUpon>App.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    <Compile Include="Window1.xaml.cs">
      <DependentUpon>Window1.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Properties\AssemblyInfo.cs">
      <SubType>Code</SubType>
    </Compile>
    <Compile Include="Properties\Resources.Designer.cs">
      <AutoGen>True</AutoGen>
      <DesignTime>True</DesignTime>
      <DependentUpon>Resources.resx</DependentUpon>
    </Compile>
    <Compile Include="Properties\Settings.Designer.cs">
      <AutoGen>True</AutoGen>
      <DependentUpon>Settings.settings</DependentUpon>
      <DesignTimeSharedInput>True</DesignTimeSharedInput>
    </Compile>
    <EmbeddedResource Include="Properties\Resources.resx">
      <Generator>ResXFileCodeGenerator</Generator>
      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
      <SubType>Designer</SubType>
    </EmbeddedResource>
    <None Include="Properties\Settings.settings">
      <Generator>SettingsSingleFileGenerator</Generator>
      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
    </None>
    <AppDesigner Include="Properties\" />
  </ItemGroup>
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>

생성된 MSBuild 프로젝트 파일 확장명의 이름에는 소스 코드 언어가 반영됩니다.

  • C# 프로젝트의 경우 확장명은 .csproj입니다.

  • Visual Basic 프로젝트의 경우 확장명은 **.**vbproj입니다.

프로젝트 파일은 몇 가지 추가적인 속성으로 인해 이전 예제보다 약간 큽니다. 하지만 추가 정보는 Visual Studio에만 관련이 있으며 다음을 포함합니다.

  • 프로젝트 구성

  • 빌드 구성

  • 소스 코드 파일 연결

  • 기본 프로젝트 속성, 리소스 및 설정 관리

프로젝트 구성

프로젝트 구성 정보에는 프로젝트에 대한 고유 식별자, 프로젝트 형식에 대한 고유 식별자 및 .NET Framework와 Visual Studio 버전을 식별하는 여러 데이터가 포함됩니다.

<Project 
  ToolsVersion="3.5"
  DefaultTargets="Build"
  xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <ProductVersion>9.0.20726</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{E0EA3EBA-718C-4122-B20C-EB97B7DC6604}</ProjectGuid>
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
    <ProjectTypeGuids>
      {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};
      {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
    </ProjectTypeGuids>
  </PropertyGroup>
  ...
</Project>

빌드 구성

기본 Visual Studio 프로젝트에는 Debug 및 Release의 두 가지 빌드 구성이 있습니다(빌드 구성 참조). MSBuild 프로젝트 파일에서 이것은 다음 속성을 사용하여 구성됩니다.

<Project ... >
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">
      Debug
    </Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <OutputType>WinExe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>WpfApplication1</RootNamespace>
    <AssemblyName>WpfApplication1</AssemblyName>
    <FileAlignment>512</FileAlignment>
    <WarningLevel>4</WarningLevel>
    ...
  </PropertyGroup>
  ...
</Project>

현재 빌드 구성은 Configuration 속성으로 지정됩니다.

<Project ... >
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">
      Debug
    </Configuration>
    ...
  </PropertyGroup>
  ...
</Project>

소스 코드 파일 연결

Visual Studio에서는 태그 및 코드 숨김 파일과 같은 관련된 소스 코드 파일 간의 연결이 유지됩니다. 이를 통해 Visual Studio에서는 Visual Studio 솔루션 탐색기 창에서 연결을 시각화합니다.

솔루션 탐색기 스크린 샷

관련된 소스 코드 파일 간의 연결은 DependentUpon 및 SubType 메타데이터를 사용하여 만들어집니다.

<Project ... >
  ...
  <ItemGroup>
    <ApplicationDefinition Include="App.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </ApplicationDefinition>
    <Page Include="Window1.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </Page>
    <Compile Include="App.xaml.cs">
      <DependentUpon>App.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    <Compile Include="Window1.xaml.cs">
      <DependentUpon>Window1.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
  </ItemGroup>
  ...
</Project>

이 프로젝트에서는 App.xaml(태그)이 App.xaml.cs(코드 숨김)와 연결되고 Window1.xaml(태그)이 Window1.xaml.cs(코드 숨김)와 연결됩니다.

기본 프로젝트 속성, 리소스 및 설정 관리

Visual Studio에서는 Visual Studio 프로젝트의 속성을 시각적으로 편집할 수 있습니다. 이러한 속성의 대부분은 빌드 프로세스에 영향을 주며 Visual Studio에서 관리하는 Visual Studio 프로젝트 파일에 저장됩니다. WPF(Windows Presentation Foundation) 프로젝트 템플릿은 강력한 형식의 설정과 리소스 지원을 제공하기 위한 파일도 생성합니다. 이에 대해서는 다음 그림에서 확인할 수 있습니다.

솔루션 탐색기 스크린 샷

이것은 다음을 사용하여 MSBuild 프로젝트 파일로 관리합니다.

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
  ...
  <ItemGroup>
    <Compile Include="Properties\AssemblyInfo.cs">
      <SubType>Code</SubType>
    </Compile>
    <Compile Include="Properties\Resources.Designer.cs">
      <AutoGen>True</AutoGen>
      <DesignTime>True</DesignTime>
      <DependentUpon>Resources.resx</DependentUpon>
    </Compile>
    <Compile Include="Properties\Settings.Designer.cs">
      <AutoGen>True</AutoGen>
      <DependentUpon>Settings.settings</DependentUpon>
      <DesignTimeSharedInput>True</DesignTimeSharedInput>
    </Compile>
    <EmbeddedResource Include="Properties\Resources.resx">
      <Generator>ResXFileCodeGenerator</Generator>
      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
      <SubType>Designer</SubType>
    </EmbeddedResource>
    <None Include="Properties\Settings.settings">
      <Generator>SettingsSingleFileGenerator</Generator>
      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
    </None>
    <AppDesigner Include="Properties\" />
  </ItemGroup>
  ...
</Project>

WPF의 MSBuild 프로젝트 빌드

MSBuild 프로젝트는 명령 프롬프트 또는 Visual Studio에서 빌드할 수 있습니다.

명령 프롬프트에서 WPF의 MSBuild 프로젝트 빌드

MSBuild 프로젝트는 Windows 명령 프롬프트 또는 Windows SDK(소프트웨어 개발 키트) 명령 프롬프트에서 msbuild.exe를 호출하여 빌드할 수 있습니다.

프로젝트 빌드

MSBuild 프로젝트를 빌드하려면 원하는 MSBuild 프로젝트의 파일 이름을 전달하여 msbuild.exe를 실행합니다.

msbuild.exe msbuildprojectfile.proj

Visual Studio에서 생성된 언어 관련 프로젝트 빌드

언어 관련 MSBuild 프로젝트 파일은 Visual Studio에서 생성됩니다.

  • 관련 파일 확장명(.csproj, .vbproj)이 사용됩니다.

  • 언어 관련 대상(Microsoft.CSharp.targets, Microsoft.VisualBasic.targets)을 포함합니다.

다음 예제에서는 명령 프롬프트에서 C# 프로젝트를 빌드하는 방법을 보여 줍니다.

msbuild.exe VSGeneratedProjectFileForCSharp.csproj

다음 예제에서는 명령 프롬프트에서 Visual Basic 프로젝트를 빌드하는 방법을 보여 줍니다.

msbuild.exe VSGeneratedProjectFileForVisualBasic.vbproj

Visual Studio에서 생성된 솔루션 빌드

msbuild.exe는 Visual Studio에서 생성된 솔루션 파일(.sln)도 빌드합니다.

msbuild.exe VSGeneratedSolutionFile.sln

Visual Studio에서 WPF의 MSBuild 프로젝트 빌드

Visual Studio를 사용할 때는 명령 프롬프트에서 프로젝트와 솔루션을 빌드할 필요가 없습니다. Visual Studio에서는 IDE에서 이 작업을 수행할 수 있습니다.

Visual Studio에서 프로젝트 빌드

Visual Studio에서 프로젝트를 빌드하려면 솔루션 탐색기 창에서 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 빌드를 선택합니다.

Visual Studio에서 솔루션 빌드

솔루션을 빌드하려면 다음을 수행하십시오.

  • F6 키를 눌러 솔루션을 빌드합니다.

  • F5 키를 눌러 솔루션 디버깅을 시작합니다.

  • 빌드 | 솔루션 빌드를 선택합니다.

  • 디버그 | 디버깅 시작을 선택합니다.

  • 디버그 | 디버깅하지 않고 시작을 선택합니다.

프로젝트 또는 솔루션에 대해 이 작업을 수행하면 Visual Studio에서 msbuild.exe를 실행하여 적절한 MSBuild 파일을 빌드합니다.

Windows Presentation Foundation 빌드 파이프라인

WPF 프로젝트를 빌드할 때 언어 관련 및 WPF 관련 대상의 조합이 호출됩니다. 이러한 대상을 실행하는 프로세스를 빌드 파이프라인이라고 합니다. 다음 그림에서는 주요 단계를 보여 줍니다.

WPF 빌드 프로세스

이러한 단계는 다음 단원에서 자세하게 설명합니다.

빌드 전 초기화

빌드하기 전에 MSBuild에서 다음을 포함한 중요한 도구 및 라이브러리의 위치를 확인합니다.

  • .NET Framework

  • Windows SDK 디렉터리

  • WPF 참조 어셈블리의 위치

  • 어셈블리 검색 경로의 속성

참조 어셈블리 디렉터리(%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.0\)는 어셈블리를 찾는 첫 번째 위치입니다. 이 단계 중에 빌드 프로세스는 여러 속성 및 항목 그룹을 초기화하고 필요한 모든 정리 작업을 수행합니다.

참조 확인

빌드 프로세스에서 응용 프로그램 프로젝트를 빌드하는 데 필요한 어셈블리를 찾아서 바인딩합니다. 이 논리는 ResolveAssemblyReference 작업에 포함되어 있습니다. 프로젝트 파일에서 Reference로 선언된 모든 어셈블리는 검색 경로에 대한 정보와 시스템에 이미 설치된 어셈블리에 대한 메타데이터와 함께 작업에 제공됩니다. 작업은 어셈블리를 찾고 설치된 어셈블리의 메타데이터를 사용하여 출력 매니페스트에 표시할 필요가 없는 핵심 WPF 어셈블리를 필터링합니다. 이를 통해 ClickOnce 매니페스트에 정보가 중복되는 것을 피할 수 있습니다. 예를 들어 PresentationFramework.dll은 WPF를 기반으로 하는 응용 프로그램을 나타내는 것으로 간주할 수 있으며 모든 WPF 어셈블리는 .NET Framework이 설치된 모든 시스템에서 동일한 위치에 있기 때문에 매니페스트에 모든 .NET Framework 참조 어셈블리에 대한 모든 정보를 포함할 필요가 없습니다.

태그 컴파일—패스 1

이 단계에서는 XAML 파일을 구문 분석하고 컴파일하여 런타임에서 XML을 구문 분석하고 속성 값의 유효성을 검사하는 데 시간이 소비되지 않도록 합니다. 컴파일된 XAML 파일은 미리 토큰화되어 런타임에 XAML 파일을 로드하는 것보다 훨씬 빠르게 로드됩니다.

이 단계에서 Page 빌드 항목인 모든 XAML 파일에 대해 다음 작업이 수행됩니다.

  1. 태그 컴파일러에서 XAML 파일을 구문 분석합니다.

  2. 해당 XAML에 대해 컴파일된 표현을 만들고 obj\Release 폴더에 복사합니다.

  3. 새 부분 클래스의 CodeDOM 표현을 만들어 obj\Release 폴더에 복사합니다.

또한 모든 XAML 파일에 대한 언어 관련 코드 파일을 생성합니다. 예를 들어 Visual Basic 프로젝트의 Page1.xaml 페이지에 대해서는 Page1.g.vb가 생성되고 C# 프로젝트의 Page1.xaml 페이지에 대해서는 Page1.g.cs가 생성됩니다. 파일 이름의 ".g"는 해당 파일이 태그 파일의 최상위 요소에 대한 부분 클래스 선언이 있는 생성된 코드임을 나타냅니다(예: Page 또는 Window). 클래스는 C#에서 partial 한정자(Visual Basic의 경우 Extends)로 선언되어 클래스에 대한 다른 선언이 다른 곳(일반적으로 코드 숨김 파일 Page1.xaml.cs)에 있음을 나타냅니다.

부분 클래스는 적절한 기본 클래스(예: 페이지에 대한 Page)에서 확장되며 System.Windows.Markup.IComponentConnector 인터페이스를 구현합니다. IComponentConnector 인터페이스에는 구성 요소를 초기화하고 해당 콘텐츠에서 요소의 이름과 이벤트를 연결하기 위한 메서드가 있습니다. 결과적으로, 생성된 코드 파일에는 다음과 같은 메서드 구현이 있습니다.

public void InitializeComponent() {
    if (_contentLoaded) {
        return;
    }
    _contentLoaded = true;
    System.Uri resourceLocater = 
        new System.Uri(
            "window1.xaml", 
            System.UriKind.RelativeOrAbsolute);
    System.Windows.Application.LoadComponent(this, resourceLocater);
}

기본적으로 태그 컴파일은 MSBuild 엔진과 동일한 AppDomain에서 실행됩니다. 이를 통해 성능이 크게 향상됩니다. AlwaysCompileMarkupFilesInSeparateDomain 속성을 사용하여 이 동작을 설정/해제할 수 있습니다. 이렇게 하면 별도의 AppDomain을 언로드하여 모든 참조 어셈블리를 언로드할 수 있다는 이점이 있습니다.

태그 컴파일—패스 2

모든 XAML 페이지가 태그 컴파일의 패스 1에서 컴파일되는 것은 아닙니다. 로컬에서 정의된 형식 참조(동일한 프로젝트의 다른 위치에 있는 코드에서 정의된 형식에 대한 참조)가 있는 XAML 파일은 이 단계의 컴파일에서 제외됩니다. 이러한 로컬에서 정의된 형식은 소스에만 존재하며 아직 컴파일되지 않았기 때문입니다. 이를 확인하기 위해 파서는 태그 파일에서 x:Name과 같은 항목을 찾는 작업을 포함한 경험적 접근을 사용합니다. 이러한 인스턴스가 발견되면 해당 태그 파일의 컴파일은 코드 파일이 컴파일될 때까지 연기됩니다. 그런 다음 두 번째 태그 컴파일 패스가 해당 파일을 처리합니다.

파일 분류

빌드 프로세스는 출력 파일이 배치될 응용 프로그램 어셈블리를 기반으로 하여 해당 출력 파일을 여러 리소스 그룹에 넣습니다. 일반적인 지역화되지 않은 응용 프로그램에서 Resource로 표시된 모든 데이터 파일은 주 어셈블리(실행 파일 또는 라이브러리)에 배치됩니다. 프로젝트에 UICulture를 설정한 경우 컴파일된 모든 XAML 파일과 언어에 한정된 것으로 표시된 리소스는 위성 리소스 어셈블리에 배치됩니다. 또한 모든 언어 중립 리소스는 주 어셈블리에 배치됩니다. 빌드 프로세스의 이 단계에서 이에 대한 결정이 수행됩니다.

프로젝트 파일에서 ApplicationDefinition, Page 및 Resource 빌드 작업은 파일이 언어에 한정되는지 아니면 언어 중립인지 여부를 지정하는 Localizable 메타데이터(허용되는 값은 true와 false)로 확대할 수 있습니다.

핵심 컴파일

핵심 컴파일 단계에는 코드 파일의 컴파일이 포함됩니다. 이 작업은 언어 관련 대상 파일 Microsoft.CSharp.targets 및 Microsoft.VisualBasic.targets의 논리로 조정됩니다. 경험적 접근에 의해 태그 컴파일러의 단일 패스로 충분하다고 결정되면 주 어셈블리가 생성됩니다. 하지만 프로젝트의 하나 이상의 XAML 파일에 로컬로 정의된 형식에 대한 참조가 있는 경우에는 temporary .dll 파일이 생성되므로 최종 응용 프로그램 어셈블리는 태그 컴파일의 두 번째 패스가 완료된 뒤에 생성될 수 있습니다.

매니페스트 생성

빌드 프로세스의 후반부에서 모든 응용 프로그램 어셈블리와 콘텐츠 파일이 준비되면 응용 프로그램에 대한 ClickOnce 매니페스트가 생성됩니다.

배포 매니페스트 파일은 배포 모델, 즉 현재 버전, 업데이트 동작, 게시자 ID 및 디지털 서명을 설명합니다. 이 매니페스트는 배포를 처리하는 관리자가 작성합니다. 파일 확장명은 .xbap(XBAP(XAML 브라우저 응용 프로그램)의 경우)이며 설치된 응용 프로그램의 경우에는 .application입니다. 전자는 HostInBrowser 프로젝트 속성으로 지정하며 이에 따라 매니페스트가 응용 프로그램을 브라우저에 호스팅되는 것으로 식별합니다.

응용 프로그램 매니페스트(.exe.manifest 파일)는 응용 프로그램 어셈블리와 종속 라이브러리를 설명하고 응용 프로그램에 필요한 권한을 나열합니다. 이 파일은 응용 프로그램 개발자가 작성합니다. ClickOnce 응용 프로그램을 시작하려면 사용자는 응용 프로그램의 배포 매니페스트 파일을 엽니다.

이러한 매니페스트 파일은 항상 XBAP에 대해 생성됩니다. 설치된 응용 프로그램의 경우에는 GenerateManifests 속성이 프로젝트 파일에서 true 값으로 지정된 경우가 아니면 생성되지 않습니다.

XBAP에서는 일반적인 인터넷 영역 응용 프로그램에 할당되는 권한을 초과하는 두 개의 추가적인 권한인 WebBrowserPermissionMediaPermission을 가집니다. WPF 빌드 시스템이 이 권한을 응용 프로그램 매니페스트에서 선언합니다.

증분 빌드 지원

WPF 빌드 시스템에서는 증분 빌드를 지원합니다. 태그나 코드의 변경 내용을 상당히 지능적으로 검색하여 변경의 영향을 받은 아티팩트만 컴파일합니다. 증분 빌드 메커니즘에서는 다음 파일을 사용합니다.

  • 현재 컴파일러 상태를 유지하기 위한 $(AssemblyName)_MarkupCompiler.Cache 파일

  • 로컬에서 정의된 형식에 대한 참조로 XAML 파일을 캐시하기 위한 $(AssemblyName)_MarkupCompiler.lref 파일

다음은 증분 빌드에 적용되는 규칙 집합입니다.

  • 파일은 빌드 시스템이 변경을 검색하는 최소 단위입니다. 따라서 코드 파일의 경우에는 형식이 변경되었는지 또는 코드가 추가되었는지를 빌드 시스템이 파악할 수 없습니다. 이것은 프로젝트 파일의 경우에도 마찬가지입니다.

  • 증분 빌드 메커니즘은 XAML 페이지가 클래스를 정의하는지 또는 다른 클래스를 사용하는지 여부를 인식해야 합니다.

  • Reference 항목이 변경되면 모든 페이지를 다시 컴파일합니다.

  • 코드 파일이 변경되면 로컬에서 정의된 형식 참조가 있는 모든 페이지를 다시 컴파일합니다.

  • XAML 파일이 변경된 경우에는 다음이 수행됩니다.

    • XAML이 프로젝트에서 Page로 선언된 경우: XAML에 로컬로 정의된 형식 참조가 없으면 해당 XAML과 로컬 참조가 있는 모든 XAML 페이지를 다시 컴파일합니다. XAML에 로컬 참조가 있으면 로컬 참조가 있는 모든 XAML 페이지를 다시 컴파일합니다.

    • XAML이 프로젝트에서 ApplicationDefinition으로 선언된 경우: 모든 XAML 페이지를 다시 컴파일합니다. 그 이유는 각 XAML에 변경되었을 수 있는 Application 형식에 대한 참조가 있기 때문입니다.

  • 프로젝트 파일이 코드 파일을 XAML 파일이 아닌 응용 프로그램 정의로 선언하는 경우에는 다음이 수행됩니다.

    • 프로젝트 파일의 ApplicationClassName 값이 변경되었는지 확인합니다(새 응용 프로그램 종류가 있는지 여부 확인). 변경되었으면 전체 응용 프로그램을 다시 컴파일합니다.

    • 그렇지 않은 경우에는 로컬 참조가 있는 모든 XAML 페이지를 다시 컴파일합니다.

  • 프로젝트 파일이 변경된 경우에는 앞의 모든 규칙을 적용하고 다시 컴파일해야 하는 대상을 확인합니다. AssemblyName, IntermediateOutputPath, RootNamespace 및 HostInBrowser 속성이 변경되면 전체 다시 컴파일이 트리거됩니다.

다음과 같은 다시 컴파일 시나리오가 가능합니다.

  • 전체 응용 프로그램을 다시 컴파일합니다.

  • 로컬로 정의된 형식 참조가 있는 XAML 파일만 다시 컴파일합니다.

  • 아무것도 다시 컴파일하지 않습니다(프로젝트에서 아무것도 변경되지 않은 경우).

참고 항목

개념

WPF 응용 프로그램 배포(WPF)

Windows Presentation Foundation의 Pack URI

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

기타 리소스

Windows Presentation Foundation MSBuild 참조

변경 기록

날짜

변경 내용

이유

2008년 7월

SplashScreen 빌드 속성에 대한 정보가 추가되었습니다.

SP1 기능 변경