Sdílet prostřednictvím


Kompilace aplikace WPF

Aplikace Windows Presentation Foundation (WPF) lze sestavit jako spustitelné soubory rozhraní .NET Framework (.exe), knihovny (.dll) nebo kombinaci obou typů sestavení. Toto téma představuje, jak sestavovat aplikace WPF a popisuje klíčové kroky v procesu sestavení.

Sestavení aplikace WPF

Aplikaci WPF lze zkompilovat následujícími způsoby:

Kanál sestavení WPF

Při sestavení projektu WPF se vyvolá kombinace cílů specifických pro jazyk a WPF. Proces provádění těchto cílů se nazývá kanál buildu a klíčové kroky jsou znázorněny na následujícím obrázku.

WPF build process

Inicializace před sestavením

Před sestavením nástroj MSBuild určuje umístění důležitých nástrojů a knihoven, včetně následujících:

  • The .NET Framework.

  • Adresáře sady Windows SDK.

  • Umístění referenčních sestavení WPF.

  • Vlastnost pro cesty hledání sestavení.

První umístění, kde nástroj MSBuild hledá sestavení, je referenční adresář sestavení (%ProgramFiles%\Referenční sestavení\Microsoft\Framework\v3.0\). Během tohoto kroku proces sestavení také inicializuje různé vlastnosti a skupiny položek a provede všechny požadované vyčištění.

Překlad odkazů

Proces sestavení vyhledá a vytvoří vazbu sestavení potřebná k sestavení projektu aplikace. Tato logika je obsažena ResolveAssemblyReference v úkolu. Všechna sestavení deklarovaná jako Reference v souboru projektu jsou k dispozici úkolu spolu s informacemi o cestách hledání a metadatech sestavení, která jsou již v systému nainstalována. Úloha vyhledá sestavení a použije metadata nainstalovaného sestavení k vyfiltrování základních sestavení WPF, která se nemusí zobrazit ve výstupních manifestech. Tím se zabrání nadbytečným informacím v manifestech ClickOnce. Například vzhledem k tomu, že PresentationFramework.dll lze považovat za zástupce aplikace postavené na WPF a vzhledem k tomu, že všechna sestavení WPF existují ve stejném umístění na každém počítači s nainstalovaným rozhraním .NET Framework, není nutné do manifestů zahrnout všechny informace o všech referenčních sestaveních rozhraní .NET Framework.

Kompilace značek – Pass 1

V tomto kroku se soubory XAML analyzují a kompilují tak, aby modul runtime netrávit čas analýzou XML a ověřováním hodnot vlastností. Zkompilovaný soubor XAML je předem tokenizován tak, aby při načítání souboru XAML v době běhu mělo být mnohem rychlejší než načtení souboru XAML.

Během tohoto kroku se pro každý soubor XAML, který je položkou Page sestavení, provádí následující aktivity:

  1. Soubor XAML je analyzován kompilátorem značek.

  2. Vytvoří se zkompilovaná reprezentace pro tento XAML a zkopíruje se do složky obj\Release.

  3. Vytvoří se reprezentace nové částečné třídy CodeDOM a zkopíruje se do složky obj\Release.

Kromě toho se pro každý soubor XAML vygeneruje soubor kódu specifický pro jazyk. Například pro stránku Page1.xaml v projektu Jazyka Visual Basic se vygeneruje Page1.g.vb; Pro stránku Page1.xaml v projektu jazyka C# se vygeneruje soubor Page1.g.cs. Znak ".g" v názvu souboru označuje, že soubor je generován kód, který má částečnou deklaraci třídy pro prvek nejvyšší úrovně souboru revizí (například Page nebo Window). Třída je deklarována pomocí partial modifikátoru v jazyce C# (Extends v jazyce Visual Basic), která indikuje, že existuje další deklarace třídy jinde, obvykle v souboru Page1.xaml.cs s kódem.

Částečná třída se rozšiřuje z příslušné základní třídy (například Page pro stránku) a implementuje System.Windows.Markup.IComponentConnector rozhraní. Rozhraní IComponentConnector má metody inicializace komponenty a propojení názvů a událostí u prvků v jeho obsahu. V důsledku toho má vygenerovaný soubor kódu implementaci metody, jako je následující:

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

Ve výchozím nastavení se kompilace značek spouští ve stejném AppDomain jazyce jako modul MSBuild. To poskytuje významné zvýšení výkonu. Toto chování lze přepnout pomocí AlwaysCompileMarkupFilesInSeparateDomain vlastnosti. To má výhodu uvolnění všech referenčních sestavení uvolněním samostatného AppDomain.

Kompilace revizí – Pass 2

Ne všechny stránky XAML jsou zkompilovány při průchodu 1 kompilace značek. Soubory XAML, které mají místně definované odkazy na typy (odkazy na typy definované v kódu jinde ve stejném projektu), jsou v tuto chvíli vyloučeny z kompilace. Důvodem je to, že tyto místně definované typy existují pouze ve zdroji a ještě nebyly zkompilovány. Aby to bylo možné zjistit, analyzátor používá heuristiku, která zahrnuje hledání položek, jako x:Name je například v souboru s revizemi. Pokud je taková instance nalezena, kompilace souboru revizí je odložena, dokud se soubory kódu nezkompilují, poté druhá kompilace revizí tyto soubory zpracuje.

Klasifikace souborů

Proces sestavení umístí výstupní soubory do různých skupin prostředků na základě toho, do kterého sestavení aplikace se umístí. V typické nelokalizované aplikaci jsou všechny datové soubory označené jako Resource umístěné v hlavním sestavení (spustitelný soubor nebo knihovna). Při UICulture nastavení v projektu se všechny kompilované soubory XAML a tyto prostředky, které jsou speciálně označené jako specifické pro jazyk, umístí do sestavení satelitních zdrojů. Kromě toho se všechny prostředky neutrální jazyka umístí do hlavního sestavení. V tomto kroku procesu sestavení se toto rozhodnutí provede.

Akce ApplicationDefinition, Pagea Resource sestavení v souboru projektu mohou být rozšířeny o Localizable metadata (přijatelné hodnoty jsou true a false), který určuje, zda je soubor jazykově specifický nebo jazykově neutrální.

Kompilace jádra

Základní krok kompilace zahrnuje kompilaci souborů kódu. Tato funkce je orchestrována logikou v souborech cíle specifických pro jazyk Microsoft.CSharp.targets a Microsoft.VisualBasic.targets. Pokud heuristiky zjistily, že stačí jeden průchod kompilátoru značek, vygeneruje se hlavní sestavení. Pokud však jeden nebo více souborů XAML v projektu obsahuje odkazy na místně definované typy, pak se vygeneruje dočasný soubor .dll, takže konečná sestavení aplikace mohou být vytvořena po druhém průchodu kompilace značek.

Generování manifestu

Po dokončení procesu sestavení se po dokončení všech sestavení aplikace a souborů obsahu vygenerují manifesty ClickOnce pro aplikaci.

Soubor manifestu nasazení popisuje model nasazení: aktuální verzi, chování aktualizace a identitu vydavatele spolu s digitálním podpisem. Tento manifest má vytvářet správci, kteří zpracovávají nasazení. Přípona souboru je .xbap (pro aplikace prohlížeče XAML (XBAPs)) a .application pro nainstalované aplikace. První vlastnost je diktována HostInBrowser vlastností projektu a v důsledku toho manifest identifikuje aplikaci jako hostovanou v prohlížeči.

Manifest aplikace (soubor .exe.manifest) popisuje sestavení aplikace a závislé knihovny a uvádí oprávnění vyžadovaná aplikací. Tento soubor má vytvořit vývojář aplikace. Aby bylo možné spustit aplikaci ClickOnce, uživatel otevře soubor manifestu nasazení aplikace.

Tyto soubory manifestu se vždy vytvářejí pro XBAPs. Pro nainstalované aplikace nejsou vytvořeny, pokud GenerateManifests není vlastnost určena v souboru projektu s hodnotou true.

XBAPs získají dvě další oprávnění nad a nad těmito oprávněními přiřazenými typickým aplikacím internetové zóny: WebBrowserPermission a MediaPermission. Systém sestavení WPF deklaruje tato oprávnění v manifestu aplikace.

Podpora přírůstkového sestavení

Systém sestavení WPF poskytuje podporu přírůstkových sestavení. Je poměrně inteligentní pro detekci změn provedených ve značkách nebo kódu a zkompiluje pouze ty artefakty ovlivněné změnou. Mechanismus přírůstkového sestavení používá následující soubory:

  • Soubor $(AssemblyName)_MarkupCompiler.Cache pro zachování aktuálního stavu kompilátoru.

  • Soubor $(AssemblyName)_MarkupCompiler.lref pro ukládání souborů XAML do mezipaměti s odkazy na místně definované typy.

Následuje sada pravidel pro přírůstkové sestavení:

  • Soubor je nejmenší jednotka, ve které systém sestavení detekuje změnu. V případě souboru kódu tedy systém sestavení nemůže zjistit, jestli byl typ změněn nebo jestli byl přidán kód. Totéž platí pro soubory projektu.

  • Mechanismus přírůstkového sestavení musí být obeznámen s tím, že stránka XAML buď definuje třídu, nebo používá jiné třídy.

  • Pokud Reference se položky změní, překompilujte všechny stránky.

  • Pokud se soubor kódu změní, překompilujte všechny stránky s místně definovanými odkazy na typ.

  • Pokud se soubor XAML změní:

    • Pokud je XAML deklarován jako Page v projektu: pokud XAML nemá místně definované odkazy na typy, překompilujte xaml a všechny stránky XAML s místními odkazy; pokud XAML obsahuje místní odkazy, překompilujte všechny stránky XAML s místními odkazy.

    • Pokud je XAML deklarován jako ApplicationDefinition v projektu: překompilujte všechny stránky XAML (důvod: každý XAML má odkaz na Application typ, který se mohl změnit).

  • Pokud soubor projektu deklaruje soubor kódu jako definici aplikace místo souboru XAML:

    • Zkontrolujte, ApplicationClassName jestli se změnila hodnota v souboru projektu (existuje nový typ aplikace?). Pokud ano, překompilujte celou aplikaci.

    • V opačném případě překompilujte všechny stránky XAML s místními odkazy.

  • Pokud se soubor projektu změní: použijte všechna předchozí pravidla a zjistěte, co je potřeba překompilovat. Změny následujících vlastností aktivují úplné překompilování: AssemblyName, IntermediateOutputPath, RootNamespacea HostInBrowser.

Možné jsou následující scénáře rekompilu:

  • Celá aplikace je rekompilována.

  • Rekompilují se pouze soubory XAML, které mají místně definované odkazy na typy.

  • Nic se nekompiluje (pokud se nic v projektu nezměnilo).

Viz také