Erstellen einer WPF-Anwendung (WPF)Building a WPF Application (WPF)

Windows Presentation Foundation (WPF)-Anwendungen erstellt werden können, als .NET Framework.NET Framework ausführbare Dateien (.exe), Bibliotheken (DLL) oder eine Kombination beider Typen von Assemblys.Windows Presentation Foundation (WPF) applications can be built as .NET Framework.NET Framework executables (.exe), libraries (.dll), or a combination of both types of assemblies. In diesem Thema wird beschrieben, wie WPFWPF-Anwendungen erstellt werden, und die wichtigsten Schritte im Buildprozess werden erläutert.This topic introduces how to build WPFWPF applications and describes the key steps in the build process.

Erstellen einer WPF-AnwendungBuilding a WPF Application

Zum Kompilieren einer WPF-Anwendung stehen folgende Methoden zur Verfügung:A WPF application can be compiled in the following ways:

WPF-BuildpipelineWPF Build Pipeline

Beim Erstellen eines WPFWPF-Projekts wird die Kombination aus sprachspezifischen und WPFWPF-spezifischen Zielen aufgerufen.When a WPFWPF project is built, the combination of language-specific and WPFWPF-specific targets are invoked. Das Ausführen dieser Ziele wird als Buildpipeline bezeichnet. Die wichtigsten Schritte werden in der folgenden Abbildung dargestellt.The process of executing these targets is called the build pipeline, and the key steps are illustrated by the following figure.

WPF-BuildprozessWPF build process

PräbuildinitialisierungenPre-Build Initializations

Vor Beginn der Erstellung bestimmt MSBuildMSBuild den Speicherort wichtiger Tools und Bibliotheken, darunter die folgenden:Before building, MSBuildMSBuild determines the location of important tools and libraries, including the following:

  • .NET Framework.The .NET Framework.

  • Die Windows SDKWindows SDK-Verzeichnisse.The Windows SDKWindows SDK directories.

  • Der Speicherort von WPFWPF-Verweisassemblys.The location of WPFWPF reference assemblies.

  • Die Eigenschaft für die Assemblysuchpfade.The property for the assembly search paths.

Der erste Speicherort, an dem MSBuildMSBuild nach Assemblys sucht, ist das Verzeichnis für Verweisassemblys (%Programme%\Reference Assemblies\Microsoft\Framework\v3.0\).The first location where MSBuildMSBuild searches for assemblies is the reference assembly directory (%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.0\). In diesem Schritt initialisiert der Buildprozess auch die verschiedenen Eigenschaften und Elementgruppen und führt die erforderlichen Bereinigungen durch.During this step, the build process also initializes the various properties and item groups and performs any required cleanup work.

Auflösen von VerweisenResolving References

Der Buildprozess sucht und bindet die Assemblys, die zum Erstellen des Anwendungsprojekts erforderlich sind.The build process locates and binds the assemblies required to build the application project. Diese Logik ist in der ResolveAssemblyReference-Aufgabe enthalten.This logic is contained in the ResolveAssemblyReference task. 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.All assemblies declared as Reference in the project file are provided to the task along with information on the search paths and metadata on assemblies already installed on the system. Die Aufgabe sucht Assemblys und verwendet die Metadaten der installierten Assembly, um die WPFWPF-Kernassemblys herauszufiltern, die in den Ausgabemanifesten nicht angezeigt werden müssen.The task looks up assemblies and uses the installed assembly's metadata to filter out those core WPFWPF assemblies that need not show up in the output manifests. Auf diese Weise vermeiden Sie redundante Informationen in den ClickOnce-Manifesten.This is done to avoid redundant information in the ClickOnce manifests. Angenommen, da PresentationFramework.dll repräsentativ berücksichtigt werden, können eine Anwendung erstellt und für die WPFWPF und darüber seit alle WPFWPF Assemblys vorhanden sind, am gleichen Ort auf jedem Computer mit .NET Framework ist installiert, es nicht erforderlich, alle Informationen für alle .NET Framework-Verweisassemblys in den Manifesten eingeschlossen sind.For example, since PresentationFramework.dll can be considered representative of an application built on and for the WPFWPF and moreover since all WPFWPF assemblies exist at the same location on every machine that has the .NET Framework installed, there is no need to include all information on all .NET Framework reference assemblies in the manifests.

Markupkompilierungsdurchlauf 1Markup Compilation—Pass 1

In diesem Schritt werden XAMLXAML-Dateien analysiert und kompiliert, sodass während der Laufzeit keine XMLXML analysiert und Eigenschaftswerte überprüft werden.In this step, XAMLXAML files are parsed and compiled so that the runtime does not spend time parsing XMLXML and validating property values. Die kompilierte XAMLXAML-Datei wird zuvor mit Token versehen, sodass das Laden zur Laufzeit sehr viel schneller verläuft als das Laden einer XAMLXAML-Datei.The compiled XAMLXAML file is pre-tokenized so that, at run time, loading it should be much faster than loading a XAMLXAML file.

In diesem Schritt werden für jede XAMLXAML-Datei, die ein Page-Buildelement ist, die folgenden Aktionen ausgeführt:During this step, the following activities take place for every XAMLXAML file that is a Page build item:

  1. Die XAMLXAML-Datei wird vom Markupcompiler analysiert.The XAMLXAML file is parsed by the markup compiler.

  2. Eine kompilierte Darstellung wird für diese XAMLXAML erstellt und in den Ordner „obj\Release“ kopiert.A compiled representation is created for that XAMLXAML and copied to the obj\Release folder.

  3. Eine CodeDOM-Darstellung einer neuen Teilklasse wird erstellt und in den Ordner „obj\Release“ kopiert.A CodeDOM representation of a new partial class is created and copied to the obj\Release folder.

Außerdem wird eine sprachspezifische Codedatei für jede XAMLXAML-Datei generiert.In addition, a language-specific code file is generated for every XAMLXAML file. Beispielsweise wird für eine Seite "Page1.xaml" in einem Visual Basic-Projekt, ein Page1.g.vb generiert; für eine Seite "Page1.xaml" in einem C#-Projekt wird eine Page1.g.cs generiert.For example, for a Page1.xaml page in a Visual Basic project, a Page1.g.vb is generated; for a Page1.xaml page in a C# project, a Page1.g.cs is generated. 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).The ".g" in the file name indicates the file is generated code that has a partial class declaration for the top-level element of the markup file (such as Page or Window). Die Klasse wird deklariert, mit der partial in c# (Extends in Visual Basic) an eine andere Deklaration für die Klasse an anderer Stelle vorhanden ist, in der Regel in den Code-Behind-Datei Page1.xaml.cs.The class is declared with the partial modifier in C# (Extends in Visual Basic) to indicate there is another declaration for the class elsewhere, usually in the code-behind file Page1.xaml.cs.

Die partielle Klasse erstreckt sich von der entsprechenden Basisklasse (z. B. Page für eine Seite) und implementiert die System.Windows.Markup.IComponentConnector Schnittstelle.The partial class extends from the appropriate base class (such as Page for a page) and implements the System.Windows.Markup.IComponentConnector interface. Die IComponentConnector Schnittstelle verfügt über Methoden zum Initialisieren einer Komponente, und verbinden Sie Namen und Ereignissen für Elemente im Inhalt.The IComponentConnector interface has methods to initialize a component and connect names and events on elements in its content. Folglich sieht die Methodenimplementierung der generierten Codedatei folgendermaßen aus:Consequently, the generated code file has a method implementation like the following:

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);  
}  
Public Sub InitializeComponent() _  

    If _contentLoaded Then  
        Return  
    End If  

    _contentLoaded = True  
    Dim resourceLocater As System.Uri = _  
        New System.Uri("mainwindow.xaml", System.UriKind.Relative)  

    System.Windows.Application.LoadComponent(Me, resourceLocater)  

End Sub  

Standardmäßig Markupkompilierung ausgeführt wird, in der gleichen AppDomain als die MSBuildMSBuild Modul.By default, markup compilation runs in the same AppDomain as the MSBuildMSBuild engine. Dies ermöglicht einen erheblichen Leistungszuwachs.This provides significant performance gains. Dieses Verhalten kann mit der AlwaysCompileMarkupFilesInSeparateDomain-Eigenschaft umgeschaltet werden.This behavior can be toggled with the AlwaysCompileMarkupFilesInSeparateDomain property. Dies hat den Vorteil, dass alle Verweisassemblys durch das Entladen der separaten AppDomain.This has the advantage of unloading all reference assemblies by unloading the separate AppDomain.

Markupkompilierungsdurchlauf 2Markup Compilation—Pass 2

Während des Durchlaufs 1 der Markupkompilierung werden nicht alle XAMLXAML-Seiten kompiliert.Not all XAMLXAML pages are compiled at during pass 1 of markup compilation. XAMLXAML-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. files that have locally defined type references (references to types defined in code elsewhere in the same project) are exempt from compilation at this time. Das liegt daran, dass diese lokal definierten Typen nur im Quellcode existieren und noch nicht kompiliert wurden.This is because those locally defined types exist only in source and have not yet been compiled. Um dies zu bestimmen, verwendet der Parser heuristische Verfahren, die das Suchen nach Elementen umfassen, z. B. x:Name in der Markupdatei.In order to determine this, the parser uses heuristics that involve looking for items such as x:Name in the markup file. 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.When such an instance is found, that markup file’s compilation is postponed until the code files have been compiled, after which, the second markup compilation pass processes these files.

DateiklassifizierungFile Classification

Der Buildprozess fügt Ausgabedateien in verschiedene Ressourcengruppen ein, und zwar abhängig von der Anwendungsassembly, in die sie platziert werden.The build process puts output files into different resource groups based on which application assembly they will be placed in. In einer normalen nicht lokalisierten Anwendung werden alle als Resource markierten Datendateien in der Hauptassembly platziert (ausführbare Datei oder Bibliothek).In a typical nonlocalized application, all data files marked as Resource are placed in the main assembly (executable or library). Wenn UICulture im Projekt festgelegt ist, werden alle kompilierten XAMLXAML-Dateien und speziell als sprachspezifisch markierte Ressourcen in die Satellitenressourcenassembly eingefügt.When UICulture is set in the project, all compiled XAMLXAML files and those resources specifically marked as language-specific are placed in the satellite resource assembly. Außerdem werden alle sprachneutralen Ressourcen in die Hauptassembly eingefügt.Furthermore, all language-neutral resources are placed in the main assembly. In diesem Schritt des Buildprozesses wird diese Bestimmung vorgenommen.In this step of the build process, that determination is made.

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.The ApplicationDefinition, Page, and Resource build actions in the project file can be augmented with the Localizable metadata (acceptable values are true and false), which dictates whether the file is language-specific or language-neutral.

KernkompilierungCore Compilation

In dem Schritt der Kernkompilierung wird die Kompilierung von Codedateien ausgeführt.The core compile step involves compilation of code files. Dieser Vorgang wird in den sprachspezifischen Zieldateien „Microsoft.CSharp.targets“ und „Microsoft.VisualBasic.targets“ logisch koordiniert.This is orchestrated by logic in the language-specific targets files Microsoft.CSharp.targets and Microsoft.VisualBasic.targets. Die Hauptassembly wird generiert, wenn die Heuristik einen einzelnen Durchlauf des Markupcompilers als ausreichend einschätzt.If heuristics have determined that a single pass of the markup compiler is sufficient, then the main assembly is generated. Wenn jedoch eine oder mehrere XAMLXAML-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.However, if one or more XAMLXAML files in the project have references to locally defined types, then a temporary .dll file is generated so the final application assemblies may be created after the second pass of markup compilation is complete.

ManifestgenerierungManifest Generation

Nachdem alle Anwendungsassemblys und Inhaltsdateien fertiggestellt wurden, werden die ClickOnceClickOnce-Manifeste am Ende des Buildprozesses für die Anwendung generiert.At the end of the build process, after all the application assemblies and content files are ready, the ClickOnceClickOnce manifests for the application are generated.

Mit der Bereiststellungsmanifestdatei wird das Bereitstellungsmodell beschrieben: die aktuelle Version, Aktualisierungsverhalten und die Identität des Herausgebers mit der digitalen Signatur.The deployment manifest file describes the deployment model: the current version, update behavior, and publisher identity along with digital signature. Dieses Manifest sollte von Administratoren erstellt werden, die für die Bereitstellung zuständig sind.This manifest is intended to be authored by administrators who handle deployment. Die Dateierweiterung ist .xbap (für XAML-Browseranwendungen (XAML browser applications; XBAPs)XAML browser applications (XBAPs)) und .application für installierte Anwendungen.The file extension is .xbap (for XAML-Browseranwendungen (XAML browser applications; XBAPs)XAML browser applications (XBAPs)) and .application for installed applications. Erstere wird durch die HostInBrowser-Projekteigenschaft vorgeschrieben. Als Ergebnis identifiziert das Manifest die Anwendung als vom Browser gehostet.The former is dictated by the HostInBrowser project property and as a result the manifest identifies the application as browser-hosted.

Im Anwendungsmanifest (die Datei „.exe.manifest“) werden die Anwendungsassemblys und abhängigen Bibliotheken beschrieben und die von der Anwendung benötigten Berechtigungen aufgeführt.The application manifest (an .exe.manifest file) describes the application assemblies and dependent libraries and lists permissions required by the application. Diese Datei sollte vom Anwendungsentwickler erstellt werden.This file is intended to be authored by the application developer. Um eine ClickOnceClickOnce-Anwendung zu starten, öffnet ein Benutzer die Bereitstellungsmanifestdatei der Anwendung.In order to launch a ClickOnceClickOnce application, a user opens the application's deployment manifest file.

Diese Manifestdateien werden stets für XBAPsXBAPss erstellt.These manifest files are always created for XBAPsXBAPs. Für installierte Anwendungen werden sie nicht erstellt, sofern die GenerateManifests-Eigenschaft in der Projektdatei nicht mit dem Wert true angegeben wird.For installed applications, they are not created unless the GenerateManifests property is specified in the project file with value true.

XBAPsXBAPs erhalten Sie zwei zusätzliche Berechtigungen über diese Berechtigungen, die typische Anwendungen für die Internetzone zugewiesen: WebBrowserPermission und MediaPermission. get two additional permissions over and above those permissions assigned to typical Internet zone applications: WebBrowserPermission and MediaPermission. Das WPFWPF-Buildsystem deklariert diese Berechtigungen im Anwendungsmanifest.The WPFWPF build system declares those permissions in the application manifest.

Unterstützung für inkrementelle BuildsIncremental Build Support

Das WPFWPF-Buildsystem unterstützt inkrementelle Builds.The WPFWPF build system provides support for incremental 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.It is fairly intelligent about detecting changes made to markup or code, and it compiles only those artifacts affected by the change. Der Mechanismus für inkrementelle Builds verwendet die folgenden Dateien:The incremental build mechanism uses the following files:

  • Die Datei $(AssemblyName)_MarkupCompiler.Cache zum Verwalten des aktuellen Compilerzustands.An $(AssemblyName)_MarkupCompiler.Cache file to maintain current compiler state.

  • Die Datei $(AssemblyName)_MarkupCompiler.lref, um XAMLXAML-Dateien mit Verweisen auf lokal definierte Typen zwischenzuspeichern.An $(AssemblyName)_MarkupCompiler.lref file to cache the XAMLXAML files with references to locally defined types.

Im Folgenden finden Sie einen Satz von Regeln für inkrementelle Builds:The following is a set of rules governing incremental build:

  • Die Datei ist die kleinste Einheit, bei der das Buildsystem eine Änderung erkennt.The file is the smallest unit at which the build system detects change. Demnach kann das Buildsystem bei einer Codedatei nicht erkennen, ob ein Typ geändert oder ob Code hinzugefügt wurde.So, for a code file, the build system cannot tell if a type was changed or if code was added. Dasselbe gilt für Projektdateien.The same holds for project files.

  • Der Mechanismus für inkrementelle Builds muss wissen, ob eine XAMLXAML-Seite entweder eine Klasse definiert oder andere Klassen verwendet.The incremental build mechanism must be cognizant that a XAMLXAML page either defines a class or uses other classes.

  • Wenn sich Reference-Einträge ändern, kompilieren Sie alle Seiten neu.If Reference entries change, then recompile all pages.

  • Wenn sich eine Codedatei ändert, kompilieren Sie alle Seiten mit lokal definierten Typverweisen neu.If a code file changes, recompile all pages with locally defined type references.

  • Wenn sich eine XAMLXAML-Datei ändert:If a XAMLXAML file changes:

    • Wenn XAMLXAML als Page Page Projekt deklariert wird: Wenn XAMLXAML keine lokal definierten Typverweise besitzt, kompilieren Sie diese XAMLXAML und alle XAMLXAML-Seiten mit lokalen Verweisen neu. Wenn XAMLXAML lokale Verweise aufweist, kompilieren Sie alle XAMLXAML-Seiten mit lokalen Verweisen neu.If XAMLXAML is declared as Page in the project: if the XAMLXAML does not have locally defined type references, recompile that XAMLXAML plus all XAMLXAML pages with local references; if the XAMLXAML has local references, recompile all XAMLXAML pages with local references.

    • Wenn XAMLXAML ist als deklariert ApplicationDefinition im Projekt: alle neu kompilieren XAMLXAML Seiten (Ursache: jede XAMLXAML Verweis auf ein Application Typ, der möglicherweise geändert haben).If XAMLXAML is declared as ApplicationDefinition in the project: recompile all XAMLXAML pages (reason: each XAMLXAML has reference to an Application type that may have changed).

  • Wenn die Projektdatei statt einer XAMLXAML-Datei eine Codedatei als Anwendungsdefinition deklariert:If the project file declares a code file as application definition instead of a XAMLXAML file:

    • Überprüfen Sie, ob sich der ApplicationClassName-Wert in der Projektdatei geändert hat (gibt es einen neuen Anwendungstyp?).Check if the ApplicationClassName value in the project file has changed (is there a new application type?). Kompilieren Sie in diesem Fall die gesamte Anwendung neu.If so, recompile the entire application.

    • Kompilieren Sie ansonsten alle XAMLXAML-Seiten mit lokalen Verweisen neu.Otherwise, recompile all XAMLXAML pages with local references.

  • Wenn sich eine Projektdatei ändert: Wenden Sie alle vorangehenden Regeln an, und stellen Sie fest, was neu kompiliert werden muss.If a project file changes: apply all preceding rules and see what needs to be recompiled. Änderungen an den folgenden Eigenschaften lösen eine vollständige Neukompilierung aus: AssemblyName, IntermediateOutputPath, RootNamespace und HostInBrowser.Changes to the following properties trigger a complete recompile: AssemblyName, IntermediateOutputPath, RootNamespace, and HostInBrowser.

Folgende Rekompilierungsszenarien sind möglich:The following recompile scenarios are possible:

  • Die gesamte Anwendung wird neu kompiliert.The entire application is recompiled.

  • Nur XAMLXAML-Dateien, die lokal definierte Typverweise enthalten, werden neu kompiliert.Only those XAMLXAML files that have locally defined type references are recompiled.

  • Nichts wird neu kompiliert (es hat keine Änderung im Projekt stattgefunden).Nothing is recompiled (if nothing in the project has changed).

Siehe auchSee Also

Bereitstellen von WPF-AnwendungenDeploying a WPF Application
WPF-MSBuild-ReferenzWPF MSBuild Reference
Paket-URI in WPFPack URIs in WPF
WPF-Anwendungsressource, Inhalts- und DatendateienWPF Application Resource, Content, and Data Files