Erstellen einer WPF-Anwendung (WPF)
Aktualisiert: Juli 2008
Windows Presentation Foundation (WPF)-Anwendungen können als .NET Framework-EXE-, -DLL-Datei oder als Kombination aus beiden Assemblytypen erstellt werden. In diesem Thema wird zunächst das Erstellen von einfachen WPF-Anwendungen über die Eingabeaufforderung veranschaulicht, bevor gezeigt wird, wie WPF die Erweiterbarkeit von Microsoft-Buildmodul (MSBuild) zum Erstellen komplexerer Anwendungen nutzt. Dieses Thema wird mit einer ausführlichen Erörterung der wesentlichen Schritte im MSBuild-Buildprozess abgeschlossen.
Dieses Thema enthält folgende Abschnitte.
- Erstellen einer WPF-Anwendung mithilfe der Befehlszeilenkompilierung
- Erstellen einer WPF-Anwendung mithilfe von MSBuild
- MSBuild-Projektdateien für WPF
- Erstellen eines MSBuild-Projekts für WPF mit Visual Studio
- Erstellen eines MSBuild-Projekts für WPF
- Windows Presentation Foundation-Buildpipeline
- Unterstützung für inkrementelle Builds
- Verwandte Abschnitte
Erstellen einer WPF-Anwendung mithilfe der Befehlszeilenkompilierung
Eine vollständig in Code geschriebene WPF-Anwendung (kein Markup) kann mit einem Befehlszeilencompiler erstellt werden. Stellen Sie sich beispielsweise eine eigenständige C# WPF-Anwendung mit den folgenden Quellcodedateien vor:
Anwendungsdefinitionsdatei (app.cs)
Fenster (mainwindow.cs)
Diese Anwendung lässt sich wie im folgenden Beispiel mithilfe des C#-Compilers (csc.exe) über eine Eingabeaufforderung erstellen:
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"
In diesem Beispiel:
Der /out-Parameter gibt den Namen der erstellten ausführbaren Assembly (WPFApplication.exe) an.
Der /target-Parameter gibt den kompilierten Assemblytyp an (eine ausführbare Microsoft Windows-Datei).
Die C#-Quellcodedateien, die die Anwendung (app.cs und mainwindow.cs) bilden.
Der /reference-Parameter, der die Assemblys, auf die verwiesen wird, identifiziert, die die von der Anwendung verwendeten Typen implementieren.
Befehlszeilenkompilierung kann zum Erstellen von komplexeren Anwendungen verwendet werden, obwohl der Compiler WPF-Anwendungen mit Extensible Application Markup Language (XAML)-Quellcode nicht unterstützt. Darüber hinaus unterstützt die Befehlszeilenkompilierung nicht alle Buildanforderungen typischer WPF-Anwendungen, einschließlich Konfigurationsverwaltung und ClickOnce-Manifestgenerierung. Um diese und andere komplexere Buildanforderungen zu unterstützen, wird WPF mit MSBuild integriert und erweitert dieses Modul.
Tipp
Weitere Informationen zur Befehlszeilenkompilierung finden Sie unter Erstellen über die Befehlszeile mit csc.exe oder Erstellen von der Befehlszeile aus (Visual Basic).
Erstellen einer WPF-Anwendung mithilfe von MSBuild
MSBuild ist eine robuste, erweiterbare Technologie, die mit .NET Framework eingeführt wurde. Der Kern der MSBuild-Technologie wird über die in der folgenden Tabelle beschriebenen Assemblys implementiert.
Assembly |
Beschreibung |
---|---|
Microsoft.Build.Engine.dll |
Liest und verarbeitet MSBuild-Projektdateien. |
Microsoft.Build.Tasks.dll |
Implementiert Funktionen, die in allen MSBuild-Projekten vorkommen, z. B. Aufruf der Befehlszeilenkompilierung (beispielsweise csc.exe für C#, vbc.exe für Visual Basic). |
Microsoft.Build.Utilities.dll |
Macht Dienstprogrammklassen verfügbar, die MSBuild mit benutzerdefinierten Buildfunktionen erweitern. |
Microsoft.Build.Framework.dll |
Implementiert Schnittstellen, die definieren, wie MSBuild-Funktionalität mit dem MSBuild-Modul interagiert. |
Microsoft.Build.Conversion.dll |
Unterstützt Konvertierung vom Microsoft Visual Studio .NET 2002-Legacy- und Microsoft Visual Studio .NET 2003-Projektdateiformat in das Microsoft Visual Studio 2005MSBuild-Projektdateiformat. |
Tipp
Weitere Informationen zu den MSBuild-Assemblys finden Sie unter MSBuild-Referenz.
MSBuild-Projektdateien für WPF
Die Assemblys, die MSBuild bilden, werden als MSBuild-Modul bezeichnet. Um Anwendungen zu erstellen, benötigt das MSBuild-Modul normalerweise folgende Informationen:
Verweise auf die Quellcodedatei
Verweise auf abhängige Assemblys
Konfigurationsdetails
Buildanforderungen
Um von MSBuild verarbeitet zu werden, werden diese Informationen in XML-Dateien gepackt, die dem benutzerdefinierten MSBuild-Schema entsprechen (siehe Referenz zum MSBuild-Projektdateischema). Solche Dateien werden als MSBuild-Projektdateien bezeichnet. Im Folgenden sehen Sie die MSBuild-Projektdatei für eine Version der WPF-Anwendung, die zu einem früheren Zeitpunkt mithilfe eines Befehlszeilencompilers und zusätzlichen Extensible Application Markup Language (XAML)-Quellcodedateien erstellt wurde.
<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>
In diesem Beispiel sind die Elemente enthalten, die in den meisten MSBuild-Projektdateien enthalten sind, einschließlich Project-Tag, Eigenschaften, Elemente, Ziele und Aufgaben.
Das Projektelement
Entsprechend dem MSBuild-Projektdateischema ist eine MSBuild-Projektdatei eine XML-Datei mit Project als Element der obersten Ebene:
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
...
</Project>
Das Project-Element befindet sich dort, wo das MSBuild-Modul mit der Verarbeitung einer Projektdatei beginnt. Um die Version von MSBuild anzugeben, auf das die MSBuild-Projektdatei abzielt, wird eine entsprechende XML-Namespacedeklaration zur Verfügung gestellt.
Eigenschaften
Eigenschaften sind Variablen, mit denen MSBuild-Projekte sowohl konfiguriert als auch dem MSBuild-Modul buildrelevante Informationen zur Verfügung gestellt werden. Eigenschaften sind in PropertyGroup-Elementen enthalten, wie im folgenden Beispiel gezeigt.
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<AssemblyName>WPFApplication</AssemblyName>
<OutputType>winexe</OutputType>
</PropertyGroup>
...
</Project>
Einige Eigenschaften, z. B. AssemblyName und OutputType, sind allen Anwendungstypen gemein und werden in Gemeinsame MSBuild-Projekteigenschaften beschrieben. Die MSBuild-Eigenschaften, die für WPF spezifisch sind, werden in der folgenden Tabelle aufgelistet.
Property |
Beschreibung |
---|---|
OutputType |
Gibt den Typ der erstellten Assembly an und entspricht einem der folgenden Werte:
|
HostInBrowser |
Gibt an, ob eine WPF-Anwendung in einem Browser gehostet wird und entspricht einem der folgenden Werte:
Wenn HostInBrowser true ist, muss OutputType winexe sein. |
Install |
Gibt an, ob eine XBAP auf dem Client installiert ist. Install kann true oder false sein und hat den entgegengesetzten Wert von HostInBrowser. |
GenerateManifests |
Gibt an, ob eine eigenständige Anwendung mithilfe der ClickOnce-Bereitstellung veröffentlicht wurde und entspricht einem der folgenden Werte:
GenerateManifests wird nur verwendet, wenn Install über den Wert true verfügt. |
UICulture |
Gibt das Gebietsschema an, für das die Assembly erstellt wird. Wenn diese Option angegeben wird, werden Dateien, die als Resource-Projektelemente und sprachspezifische Ressourcen deklariert sind, in eine Satellitenassembly für das gewünschte Gebietsschema kompiliert. Andererseits wird sprachneutraler Inhalt in die Hauptassembly kompiliert. Standardmäßig werden Anwendungen nicht lokalisiert, und Ressourcendateien werden infolgedessen in die Hauptassembly eingebettet. Tipp Wenn UICulture festgelegt wird, muss die neutrale Ressourcensprache mit NeutralResourcesLanguageAttribute angegeben werden. Dieses Attribut muss der AssemblyInfo-Datei einer WPF-Anwendung hinzugefügt werden. |
Elemente
Elemente sind MSBuild-Eingaben, die während des Buildprozesses vom MSBuild-Modul verarbeitet werden. Elemente sind in einem ItemGroup-Element enthalten.
<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>
Ein Elementtyp kann mit Metadaten konfiguriert werden. Im vorangehenden Beispiel wurden Assemblyverweise als Reference-Elemente konfiguriert, und Quellcodedateien werden als Compile-Elemente konfiguriert. Das Reference-Element und das Compile-Element sind in allen .NET Framework-Anwendungen enthalten und werden unter Gemeinsame MSBuild-Projektelemente genauer beschrieben.
Die WPF-spezifischen MSBuild-Elemente werden in der folgenden Tabelle aufgelistet.
Property |
Beschreibung |
---|---|
ApplicationDefinition |
Gibt die XAML-Markupdatei an, die die Anwendungsdefinition enthält (eine XAML-Markupdatei, deren Stammelement Application ist). ApplicationDefinition ist erforderlich, wenn Install true und OutputType winexe ist. Eine WPF-Anwendung und folglich auch ein MSBuild-Projekt können nur eine ApplicationDefinition haben. |
Page |
Gibt eine XAML-Markupdatei an, deren Inhalt in ein Binärformat konvertiert und in eine Assembly kompiliert wurde. Page-Elemente werden normalerweise in Verbindung mit einer Code-Behind-Klasse implementiert. Die gebräuchlichsten Page-Elemente sind XAML-Dateien, deren Elemente der obersten Ebene eines der folgenden Elemente darstellen:
|
Resource |
Gibt eine Ressourcendatei an, die in eine Anwendungsassembly kompiliert wird. Wie bereits erwähnt, verarbeitet UICulture Resource-Elemente. |
Content |
Gibt eine Inhaltsdatei an, die mit einer Anwendung verteilt wird. Metadaten zur Beschreibung der Inhaltsdatei werden (mit AssemblyAssociatedContentFileAttribute) in die Anwendung kompiliert. |
SplashScreen |
Identifiziert eine Bilddatei, die für das Startfenster der Anwendung verwendet wird. Die PresentationBuildTasks-Assembly generiert Code in App.g.cs oder Application.g.vb, mit dem eine SplashScreen-Instanz erstellt wird, und zeigt sie während des Ladens der Anwendung an. Dieses Element ist verfügbar in Visual Studio 2008 SP1. |
Ziele
Ziele bestimmen, wie Projekte erstellt werden. Sie hängen sowohl von Eigenschaften als auch von Elementen ab. Eine WPF-Anwendung muss ein sprachspezifisches Ziel und ein WPF-spezifisches Ziel haben.
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
...
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildBinPath)\Microsoft.WinFX.targets" />
</Project>
Ziele sind separate Dateien, die mit der Erweiterung .targets enden. Die in .NET Framework enthaltenen Zieldateien werden an folgendem Speicherort installiert:
%WINDIR%\Microsoft.NET\Framework\vX.X.X
Das sprachspezifische Ziel erstellt den sprachspezifischen Quellcode. Das sprachspezifische Ziel für C# ist Microsoft.CSharp.targets und Microsoft.VisualBasic.targets für Visual Basic. Beide Ziele werden vom Ziel Microsoft.Common.targets abgeleitet und erweitern dieses. Dieses Ziel übernimmt den größten Teil der allgemeinen, sprachunabhängigen Erstellung. Weitere Informationen zu allgemeinen und sprachspezifischen MSBuild-Zielen finden Sie unter .Targets-Dateien von MSBuild.
WPF-spezifische Erstellung wird durch das Ziel Microsoft.WinFX.targets ausgeführt. Diese Arbeit umfasst XAML-Markupkompilierung, Manifestgenerierung für XBAP-Anwendungen und das Verarbeiten von WPF-Ressourcen- und -Inhaltsdateien.
Aufgaben
Eine Aufgabe ist eine Klasse, die einen bestimmten Buildvorgang ausführt. Es werden eine oder mehrere Aufgaben durch Ziele kombiniert, um einen Buildprozess zu definieren. Wenn MSBuild ein Ziel verarbeitet, führt es die Aufgaben aus, die im Ziel enthalten sind. Die von allgemeinen sprachspezifischen Zielen verwendeten Aufgaben werden durch die Assembly Microsoft.Build.Tasks implementiert. Die Aufgaben, die für WPF spezifisch sind, werden durch die Assembly PresentationBuildTasks implementiert.
Ziele stellen die Unterstützung zur Erstellung aller WPF-Standardanwendungen bereit. Aufgaben können auch anders kombiniert werden, um benutzerdefiniertes Buildverhalten zu implementieren. Die folgende MSBuild GetWinFXPath-Aufgabe wird beispielsweise dazu verwendet, den systemeigenen Pfad zur .NET Framework-Laufzeit zu ermitteln. Das hängt auch davon ab, ob die Aufgabe auf eine 64-Bit-Prozessor ausgeführt wird:
<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>
Weitere Informationen zu allgemeinen MSBuild-Aufgaben finden Sie unter Referenz zu MSBuild-Aufgaben.
MSBuild-Projektbeispiele für Windows Presentation Foundation
Das Windows Software Development Kit (SDK) enthält mehrere Beispiele für MSBuild-Projektdateien für die gebräuchlichsten WPF-Anwendungstypen:
Erstellen eines MSBuild-Projekts für WPF mit Visual Studio
Visual Studio generiert MSBuild-Projektdateien automatisch, wenn neue WPF-Anwendungen mit den Visual Studio-Projektvorlagen erstellt werden. Die Projektvorlage der WPF-Anwendung erzeugt beispielsweise die folgende Projektdatei (für 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>
Der Name der generierten MSBuild-Projektdateierweiterung integriert die Quellcodesprache:
Für C#-Projekte lautet die Erweiterung .csproj.
Für Visual Basic-Projekte lautet die Erweiterung **.**vbproj.
Die Projektdatei ist größer als die vorherigen Beispiele. Dies ist zum Teil auf mehrere zusätzliche Eigenschaften zurückzuführen. Diese zusätzlichen Informationen sind allerdings Visual Studio-spezifisch und umfassen Folgendes:
Projektkonfiguration
Buildkonfiguration
Zuordnung der Quellcodedatei
Standardprojekteigenschaft, Ressource und Verwaltung von Einstellungen
Projektkonfiguration
Die Details zur Projektkonfiguration umfassen einen eindeutigen Bezeichner für das Projekt, einen eindeutigen Bezeichner für den Projekttyp und verschiedene Daten, die die .NET Framework- und Visual Studio-Version identifizieren:
<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>
Buildkonfiguration
Ein standardmäßiges Visual Studio-Projekt hat zwei Buildkonfigurationen: Debug und Release (siehe Buildkonfigurationen). In einer MSBuild-Projektdatei werden diese mit Eigenschaften konfiguriert:
<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>
Die aktuelle Buildkonfiguration wird durch die Configuration-Eigenschaft angegeben:
<Project ... >
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">
Debug
</Configuration>
...
</PropertyGroup>
...
</Project>
Zuordnung der Quellcodedatei
Visual Studio verwaltet eine Zuordnung zwischen verknüpften Quellcodedateien, z. B. Markup- und Code-Behind-Dateien. Infolgedessen kann Visual Studio die Zuordnung im Fenster Visual Studio Projektmappen-Explorer visuell darstellen:
Die Zuordnung zwischen verknüpften Quellcodedateien wird mit DependentUpon-Metadaten und SubType-Metadaten durchgeführt:
<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>
In diesem Projekt wird App.xaml (Markup) mit App.xaml.cs (Code-Behind) verknüpft, und Window1.xaml (Markup) wird mit Window1.xaml.cs (Code-Behind) verknüpft.
Standardprojekteigenschaft, Ressource und Verwaltung von Einstellungen
Mit Visual Studio können Sie die Eigenschaften eines Visual Studio-Projekts visuell bearbeiten. Die meisten dieser Eigenschaften wirken sich auf den Buildprozess aus und werden in der Visual Studio-verwalteten Visual Studio-Projektdatei gespeichert. Die Windows Presentation Foundation (WPF)-Projektvorlagen generieren außerdem Dateien, um Unterstützung für strikt typisierte Einstellungen und Ressourcen zur Verfügung stellen. In der folgenden Abbildung werden alle dargestellt:
Diese werden von der MSBuild-Projektdatei wie folgt verwaltet:
<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>
Erstellen eines MSBuild-Projekts für WPF
MSBuild-Projekte können entweder über eine Eingabeaufforderung oder über Visual Studio erstellt werden.
Erstellen eines MSBuild-Projekts für WPF über die Eingabeaufforderung
MSBuild-Projekte können durch Aufrufen von msbuild.exe über die Windows-Eingabeaufforderung oder über die Windows Software Development Kit (SDK)-Eingabeaufforderung erstellt werden.
Erstellen eines Projekts
Um ein MSBuild-Projekt zu erstellen, führen Sie msbuild.exe aus und übergeben den Dateinamen des gewünschten MSBuild-Projekts:
msbuild.exe msbuildprojectfile.proj
Erstellen eines sprachspezifischen von Visual Studio generierten Projekts
Sprachspezifische MSBuild-Projektdateien, die von Visual Studio wurden:
Wählen Sie eine relevante Dateierweiterung (.csproj, .vbproj) aus.
Fügen Sie ein sprachspezifisches Ziel ein (Microsoft.CSharp.targets, Microsoft.VisualBasic.targets).
Im Folgenden wird veranschaulicht, wie Sie ein C#-Projekt über die Eingabeaufforderung erstellen:
msbuild.exe VSGeneratedProjectFileForCSharp.csproj
Im Folgenden wird veranschaulicht, wie Sie ein Visual Basic-Projekt über die Eingabeaufforderung erstellen:
msbuild.exe VSGeneratedProjectFileForVisualBasic.vbproj
Erstellen einer von Visual Studio generierten Projektmappe
msbuild.exe erstellt auch Projektmappendateien (.sln), die von Visual Studio generiert wurden:
msbuild.exe VSGeneratedSolutionFile.sln
Erstellen eines MSBuild-Projekts für WPF in Visual Studio
Wenn Sie Visual Studio verwenden, müssen Sie Ihre Projekte und Projektmappen nicht über die Eingabeaufforderung erstellen. Mit Visual Studio lässt sich beides über IDE ausführen.
Erstellen eines Projekts in Visual Studio
Wenn Sie ein Projekt in Visual Studio erstellen möchten, klicken Sie im Fenster Projektmappen-Explorer mit der rechten Maustaste auf das Projekt und wählen Erstellen.
Erstellen einer Projektmappe in Visual Studio
Zum Erstellen einer Projektmappe führen Sie eine der folgenden Aktionen aus:
Drücken Sie F6, um die Projektmappe zu erstellen.
Drücken Sie F5, um mit dem Debuggen der Projektmappe zu beginnen.
Wählen Sie Erstellen | Projektmappe erstellen aus.
Wählen Sie Debuggen | Debuggen starten aus.
Wählen Sie Debuggen | Starten ohne Debuggen aus.
Jeder dieser Schritte, der für ein Projekt oder eine Projektmappe ausgeführt wird, veranlasst Visual Studio, msbuild.exe auszuführen, um die entsprechenden MSBuild-Dateien zu erstellen.
Windows Presentation Foundation-Buildpipeline
Beim Erstellen eines WPF-Projekts wird die Kombination aus sprachspezifischen und WPF-spezifischen Zielen aufgerufen. Das Ausführen dieser Ziele wird als Buildpipeline bezeichnet. Die wichtigsten Schritte werden in der folgenden Abbildung dargestellt.
Diese Schritte werden in den folgenden Abschnitten ausführlicher erläutert.
Präbuildinitialisierungen
Vor Beginn der Erstellung bestimmt MSBuild den Speicherort wichtiger Tools und Bibliotheken, darunter die folgenden:
Der .NET Framework.
Die Windows SDK-Verzeichnisse
Der Speicherort von WPF-Verweisassemblys
Die Eigenschaft für die Assemblysuchpfade
Das Verzeichnis für Verweisassemblys (%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.0\) ist der erste Speicherort, in dem nach Assemblys gesucht wird. In diesem Schritt initialisiert der Buildprozess auch die verschiedenen Eigenschaften und Elementgruppen und führt die erforderlichen Bereinigungen durch.
Auflösen von Verweisen
Der Buildprozess sucht und bindet die Assemblys, die zum Erstellen des Anwendungsprojekts erforderlich sind. Diese Logik ist in der ResolveAssemblyReference-Aufgabe enthalten. Alle in der Projektdatei als Reference deklarierten Assemblys werden der Aufgabe mit Informationen zu Suchpfaden und Metadaten für Assemblys, die bereits im System installiert sind, zur Verfügung gestellt. Die Aufgabe sucht Assemblys und verwendet die Metadaten der installierten Assembly, um die WPF-Kernassemblys herauszufiltern, die in den Ausgabemanifesten nicht angezeigt werden müssen. Auf diese Weise vermeiden Sie redundante Informationen in den ClickOnce-Manifesten. Da die PresentationFramework.dll ein Beispiel für eine Anwendung ist, die auf und für WPF erstellt wurde, insbesondere da sich alle WPF-Assemblys auf jedem Computer, auf dem .NET Framework installiert ist, am selben Speicherort befinden, ist das Einfügen sämtlicher Informationen für alle .NET Framework-Verweisassemblys in den Manifesten nicht erforderlich.
Markupkompilierungsdurchlauf 1
In diesem Schritt werden XAML-Dateien analysiert und kompiliert, sodass während der Laufzeit keine XML analysiert und Eigenschaftenwerte überprüft werden. Die kompilierte XAML-Datei wird zuvor mit Token versehen, sodass das Laden zur Laufzeit sehr viel schneller verläuft als das Laden einer XAML-Datei.
In diesem Schritt werden für jede XAML-Datei, die ein Page-Buildelement ist, die folgenden Aktionen ausgeführt:
Die XAML-Datei wird vom Markupcompiler analysiert.
Eine kompilierte Darstellung wird für diese XAML erstellt und in den Ordner obj\Release kopiert.
Eine CodeDOM-Darstellung einer neuen Teilklasse wird erstellt und in den Ordner obj\Release kopiert.
Außerdem wird eine sprachspezifische Codedatei für jede XAML-Datei generiert. Für eine Page1.xaml-Seite in einem Visual Basic-Projekt wird beispielsweise eine Datei Page1.g.vb generiert und für eine Page1.xaml-Seite in einem C#-Projekt eine Datei Page1.g.cs. Das ".g" im Dateinamen gibt an, dass die Datei generierten Code darstellt, der über eine Deklaration der partiellen Klasse für das Element der oberen Ebene der Markupdatei entspricht (z. B. Page oder Window). Die Klasse wird mit dem partial-Modifizierer in C# (Extends in Visual Basic) deklariert, um anzugeben, dass an einer anderen Stelle noch eine weitere Deklaration für die Klasse vorhanden ist, normalerweise in der Code-Behind-Datei Page1.xaml.cs.
Die partielle Klasse wird von der entsprechenden Basisklasse erweitert (z. B. Page für eine Seite) und implementiert die System.Windows.Markup.IComponentConnector-Schnittstelle. Die IComponentConnector-Schnittstelle verfügt über Methoden zum Initialisieren einer Komponente sowie zum Verbinden von Namen und Ereignissen für Elemente im Inhalt. Folglich sieht die Methodenimplementierung der generierten Codedatei folgendermaßen aus:
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);
}
Standardmäßig wird Markupkompilierung in derselben AppDomain ausgeführt wie das MSBuild-Modul. Dies ermöglicht einen erheblichen Leistungszuwachs. Dieses Verhalten kann mit der AlwaysCompileMarkupFilesInSeparateDomain-Eigenschaft umgeschaltet werden. Dies hat den Vorteil, dass alle Verweisassemblys durch Entladen der separaten AppDomain entladen werden.
Markupkompilierungsdurchlauf 2
Während des Durchlaufs 1 der Markupkompilierung werden nicht alle XAML-Seiten kompiliert. XAML-Dateien, die lokal definierte Typverweise aufweisen (Verweise auf Typen, die im Code an anderer Stelle im selben Projekt definiert sind), werden derzeit von der Kompilierung ausgenommen. Das liegt daran, dass diese lokal definierten Typen nur im Quellcode existieren und noch nicht kompiliert wurden. Um dies zu bestimmen, verwendet der Parser heuristische Verfahren, die das Suchen nach Elementen umfassen, z. B. x:Name in der Markupdatei. Wird eine solche Instanz gefunden, wird die Kompilierung der Markupdatei bis zur Kompilierung der Codedateien zurückgestellt. Anschließend werden diese Dateien im zweiten Durchlauf der Markupkompilierung verarbeitet.
Dateiklassifizierung
Der Buildprozess fügt Ausgabedateien in verschiedene Ressourcengruppen ein, und zwar abhängig von der Anwendungsassembly, in die sie platziert werden. In einer normalen nicht lokalisierten Anwendung werden alle als Resource markierten Datendateien in der Hauptassembly platziert (ausführbare Datei oder Bibliothek). Wenn UICulture im Projekt festgelegt ist, werden alle kompilierten XAML-Dateien und speziell als sprachspezifisch markierte Ressourcen in die Satellitenressourcenassembly eingefügt. Außerdem werden alle sprachneutralen Ressourcen in die Hauptassembly eingefügt. In diesem Schritt des Buildprozesses wird diese Bestimmung vorgenommen.
Die Buildaktionen ApplicationDefinition, Page und Resource in der Projektdatei können mit den Localizable-Metadaten erweitert werden (zulässige Werte sind true und false), die festlegen, ob die Datei sprachspezifisch oder sprachneutral ist.
Kernkompilierung
In dem Schritt der Kernkompilierung wird die Kompilierung von Codedateien ausgeführt. Dieser Vorgang wird in den sprachspezifischen Zieldateien Microsoft.CSharp.targets und Microsoft.VisualBasic.targets logisch koordiniert. Die Hauptassembly wird generiert, wenn die Heuristik einen einzelnen Durchlauf des Markupcompilers als ausreichend einschätzt. Wenn jedoch eine oder mehrere XAML-Dateien im Projekt Verweise auf lokal definierte Typen aufweisen, wird eine temporäre DLL-Datei generiert, damit die finalen Anwendungsassemblys nach Abschluss des zweiten Durchlaufs der Markupkompilierung erstellt werden können.
Manifestgenerierung
Nachdem alle Anwendungsassemblys und Inhaltsdateien fertiggestellt wurden, werden die ClickOnce-Manifeste am Ende des Buildprozesses für die Anwendung generiert.
Mit der Bereiststellungsmanifestdatei wird das Bereitstellungsmodell beschrieben: die aktuelle Version, Aktualisierungsverhalten und die Identität des Publishers mit der digitalen Signatur. Dieses Manifest sollte von Administratoren erstellt werden, die für die Bereitstellung zuständig sind. Die Dateierweiterung ist .xbap (für XAML-Browseranwendungen (XBAPs)) und .application für installierte Anwendungen. Erstere wird durch die HostInBrowser-Projekteigenschaft vorgeschrieben. Als Ergebnis identifiziert das Manifest die Anwendung als vom Browser gehostet.
Im Anwendungsmanifest (die Datei .exe.manifest) werden die Anwendungsassemblys und abhängigen Bibliotheken beschrieben und die von der Anwendung benötigten Berechtigungen aufgeführt. Diese Datei sollte vom Anwendungsentwickler erstellt werden. Um eine ClickOnce-Anwendung zu starten, öffnet ein Benutzer die Bereitstellungsmanifestdatei der Anwendung.
Diese Manifestdateien werden stets für XBAPs erstellt. Für installierte Anwendungen werden sie nicht erstellt, sofern die GenerateManifests-Eigenschaft in der Projektdatei nicht mit dem Wert true angegeben wird.
XBAPs erhalten zwei zusätzliche Berechtigungen über die Berechtigungen hinaus, die herkömmlichen Anwendungen der Internetzone zugewiesen werden: WebBrowserPermission und MediaPermission. Das WPF-Buildsystem deklariert diese Berechtigungen im Anwendungsmanifest.
Unterstützung für inkrementelle Builds
Das WPF-Buildsystem unterstützt inkrementelle Builds. An Markup oder Code vorgenommene Änderungen werden auf intelligente Weise ermittelt. Außerdem werden nur jene Artefakte kompiliert, die von den Änderungen beeinflusst wurden. Der Mechanismus für inkrementelle Builds verwendet die folgenden Dateien:
Die Datei $ (AssemblyName) _MarkupCompiler.Cache zum Verwalten des aktuellen Compilerzustands.
Die Datei $ (AssemblyName) _MarkupCompiler.lref, um XAML-Dateien mit Verweisen auf lokal definierte Typen zwischenzuspeichern.
Im Folgenden finden Sie einen Satz von Regeln für inkrementelle Builds:
Die Datei ist die kleinste Einheit, bei der das Buildsystem eine Änderung erkennt. Demnach kann das Buildsystem bei einer Codedatei nicht erkennen, ob ein Typ geändert oder ob Code hinzugefügt wurde. Dasselbe gilt für Projektdateien.
Der Mechanismus für inkrementelle Builds muss wissen, ob eine XAML-Seite entweder eine Klasse definiert oder andere Klassen verwendet.
Wenn sich Reference-Einträge ändern, kompilieren Sie alle Seiten neu.
Wenn sich eine Codedatei ändert, kompilieren Sie alle Seiten mit lokal definierten Typverweisen neu.
Wenn sich eine XAML-Datei ändert:
Wenn XAML als Page im Projekt deklariert wird: Wenn XAML keine lokal definierten Typverweise besitzt, kompilieren Sie diese XAML und alle XAML-Seiten mit lokalen Verweisen neu. Wenn XAML lokale Verweise aufweist, kompilieren Sie alle XAML-Seiten mit lokalen Verweisen neu.
Wenn XAML als ApplicationDefinition im Projekt deklariert ist: Kompilieren Sie alle XAML-Seiten neu (Grund: jede XAML verfügt über einen Verweis auf einen eventuell geänderten Application-Typ).
Wenn die Projektdatei statt einer XAML-Datei eine Codedatei als Anwendungsdefinition deklariert:
Überprüfen Sie, ob sich der ApplicationClassName-Wert in der Projektdatei geändert hat (gibt es einen neuen Anwendungstyp?). Kompilieren Sie in diesem Fall die gesamte Anwendung neu.
Kompilieren Sie ansonsten alle XAML-Seiten mit lokalen Verweisen neu.
Wenn sich eine Projektdatei ändert: Wenden Sie alle vorangehenden Regeln an, und stellen Sie fest, was neu kompiliert werden muss. Änderungen an den folgenden Eigenschaften lösen eine vollständige Neukompilierung aus: AssemblyName, IntermediateOutputPath, RootNamespace und HostInBrowser.
Folgende Rekompilierungsszenarien sind möglich:
Die gesamte Anwendung wird neu kompiliert.
Nur XAML-Dateien, die lokal definierte Typverweise enthalten, werden neu kompiliert.
Nichts wird neu kompiliert (es hat keine Änderung im Projekt stattgefunden).
Siehe auch
Konzepte
Bereitstellen von WPF-Anwendungen (WPF)
Paket-URIs in Windows Presentation Foundation
Windows Presentation Foundation-Anwendungsressource, Inhalts- und Datendateien
Weitere Ressourcen
Windows Presentation Foundation MSBuild-Referenz
Änderungsprotokoll
Date |
Versionsgeschichte |
Grund |
---|---|---|
Juli 2008 |
Hinzugefügte Informationen über die SplashScreen-Buildeigenschaft. |
SP1-Featureänderung. |