WPF アプリケーション (WPF) のビルド

更新 : 2008 年 7 月

Windows Presentation Foundation (WPF) アプリケーションは、.NET Framework の実行可能ファイル (.exe)、ライブラリ (.dll)、またはこれらの両方のタイプのアセンブリの組み合わせとしてビルドできます。ここでは、まずコマンド プロンプトから単純な WPF アプリケーションをビルドする方法を示します。その次に、WPF で Microsoft ビルド エンジン (MSBuild) の機能拡張を利用して複雑なアプリケーションをビルドする方法を示します。最後に、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"

この例では、次のように記述されています。

  • /out パラメータでは、ビルドされる実行可能アセンブリの名前を指定します (WPFApplication.exe)。

  • /target パラメータでは、コンパイルするアセンブリの種類を指定します (Microsoft Windows 実行可能ファイル)。

  • アプリケーションを構成する C# ソース コード ファイルを指定します (app.cs および mainwindow.cs)。

  • /reference パラメータでは、アプリケーションで使用する型を実装する参照アセンブリを識別します。

コマンド ライン コンパイルを使用すると、さらに複雑なアプリケーションをビルドできますが、コンパイラは、Extensible Application Markup Language (XAML) ソース コードを含む 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 アプリケーションに、Extensible Application Markup Language (XAML) ソース コード ファイルを追加したバージョン用の 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 プロジェクト ファイルに共通する要素が含まれています。

Project 要素

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 マークアップ ファイルを指定します。ApplicationDefinition は、Install が true で、OutputType が winexe の場合に必須です。WPF アプリケーション、つまり MSBuild プロジェクトごとに指定できる ApplicationDefinition は 1 つのみです。

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 リソースとコンテンツ ファイルの処理などがあります。

処理手順

タスクは、特定のビルド アクションを実行するクラスです。ターゲットによって 1 つ以上のタスクが結合されて、ビルド プロセスが定義されます。MSBuild はターゲットを処理するときに、ターゲットによって結合されたタスクを実行します。共通および言語固有のターゲットが使用するタスクは Microsoft.Build.Tasks アセンブリによって実装され、WPF に固有のタスクは PresentationBuildTasks アセンブリによって実装されます。

ターゲットは、標準的なすべての WPF アプリケーションのビルドのサポートを提供します。タスクの組み合わせを変えて、カスタム ビルドの動作を実装することもできます。たとえば、次の MSBuild の GetWinFXPath タスクを使用して、タスクが 64 ビット プロセッサ上で実行されているかどうかに依存する、.NET Framework ランタイムへのネイティブ パスを検出します。

<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 の 2 つのビルド構成があります (「ビルド構成」を参照)。ビルド構成は、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 プロジェクト ファイルに格納されます。また、Windows Presentation Foundation (WPF) プロジェクト テンプレートはファイルを生成して、厳密に型指定された設定やリソースのサポートを提供します。これを次の図に示します。

ソリューション エクスプローラのスクリーン ショット

これは、次のようにして、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 で生成された言語固有のプロジェクトのビルド

Visual Studio で生成された言語固有の MSBuild プロジェクト ファイルには、次のような特徴があります。

  • ファイル拡張子 (.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

マークアップ コンパイルのパス 1 ですべての XAML ページがコンパイルされるとは限りません。ローカルで定義された型参照 (つまり、同じプロジェクト内の他のコードで定義された型の参照) を含む XAML ファイルは、この時点ではコンパイルから除外されます。これは、ローカルで定義された型はソース内にのみ存在し、まだコンパイルされていないためです。これを判別するために、パーサーはマークアップ ファイル内で x:Name などの項目を検索するヒューリスティックを使用します。このようなインスタンスが見つかると、そのマークアップ ファイルのコンパイルはコード ファイルがコンパイルされるまで延期されます。その後、2 回目のマークアップ コンパイル パスでこれらのファイルが処理されます。

ファイルの分類

ビルド プロセスは、配置するアプリケーション アセンブリに基づいて出力ファイルを別のリソース グループに配置します。通常、ローカライズされないアプリケーションでは、Resource とマークされたすべてのデータ ファイルはメイン アセンブリ (実行可能ファイルまたはライブラリ) に配置されます。UICulture がプロジェクト内に設定されると、コンパイル済みのすべての XAML ファイルおよび言語固有と明示的にマークされたリソースは、サテライト リソース アセンブリに配置されます。また、言語に依存しないすべてのリソースは、メイン アセンブリに配置されます。ビルド プロセスのこの手順で、この決定が行われます。

プロジェクト ファイル内の ApplicationDefinition、Page、および Resource ビルド アクションは、Localizable メタデータで拡張できます (入力可能値は true および false)。これにより、ファイルが言語固有か、言語に依存しないかを指定します。

コア コンパイル

コア コンパイルの手順では、コード ファイルをコンパイルします。これは、Microsoft.CSharp.targets や Microsoft.VisualBasic.targets など、言語固有のターゲット ファイル内のロジックによって調整されます。ヒューリスティックによってマークアップ コンパイラの 1 回のパスでは不十分であることが判断されると、メイン アセンブリが生成されます。ただし、プロジェクト内の 1 つ以上の XAML ファイルにローカルで定義された型の参照が含まれている場合は、一時的な .dll ファイルが生成されます。これにより、マークアップ コンパイルの 2 回目のパスが完了すると、最終的なアプリケーション アセンブリが作成されます。

マニフェストの生成

ビルド プロセスの終わりに、すべてのアプリケーション アセンブリとコンテンツ ファイルの準備が整った後で、アプリケーションの ClickOnce マニフェストが生成されます。

配置マニフェスト ファイルには、配置モデル (現在のバージョン、更新動作、および発行元の ID とデジタル署名) が記述されています。このマニフェストは、配置を処理する管理者が作成します。ファイル拡張子は、XAML ブラウザ アプリケーション (XBAP) を表す .xbap とインストール型のアプリケーションを表す .application です。前者は HostInBrowser プロジェクト プロパティによって指定されるため、マニフェストはアプリケーションがブラウザによってホストされることを識別します。

アプリケーション マニフェスト (.exe.manifest ファイル) には、アプリケーション アセンブリ、依存ライブラリ、およびアプリケーションで必要なアクセス許可のリストが記述されています。このファイルは、アプリケーション開発者が作成します。ClickOnce アプリケーションを起動するには、ユーザーはアプリケーションの配置マニフェスト ファイルを開きます。

これらのマニフェスト ファイルは、常に XBAP 用に作成されています。インストール型のアプリケーションでは、プロジェクト ファイル内で GenerateManifests プロパティ値を true に指定しない限り作成されません。

XBAP は、一般的なインターネット ゾーン アプリケーションに割り当てられるこれらの許可のほかに、2 つの追加の許可を取得します。追加の許可とは、WebBrowserPermissionMediaPermission です。WPF のビルド システムは、アプリケーション マニフェストでこれらのアクセス許可を宣言します。

インクリメンタル ビルドのサポート

WPF のビルド システムは、インクリメンタル ビルドをサポートします。これは、マークアップやコードの変更を検出し、変更の影響を受けるアイテムだけをコンパイルするという高度な機能です。インクリメンタル ビルド メカニズムでは、次のファイルを使用します。

  • $(AssemblyName)_MarkupCompiler.Cache ファイル。現在のコンパイラの状態を保持します。

  • $(AssemblyName)_MarkupCompiler.lref ファイル。ローカルで定義された型への参照を持つ XAML ファイルをキャッシュします。

インクリメンタル ビルドの規則を次に示します。

  • ビルド システムが変更を検出できるのは、ファイル単位以上です。そのため、コード ファイルの場合、ビルド システムは型が変更されたかどうか、またはコードが追加されたかどうかを通知できません。同じことはプロジェクト ファイルにも当てはまります。

  • インクリメンタル ビルドのメカニズムは、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 におけるパッケージの URI

Windows Presentation Foundation アプリケーションのリソース、コンテンツ、およびデータ ファイル

その他の技術情報

Windows Presentation Foundation MSBuild のリファレンス

履歴の変更

日付

履歴

原因

2008 年 7 月

SplashScreen ビルド プロパティに関する情報を追加。

SP1 機能変更