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:
Příkazového řádku. Aplikace musí obsahovat pouze kód (bez XAML) a definiční soubor aplikace. Další informace naleznete v tématu Sestavení příkazového řádku pomocí csc.exe nebo Sestavení z příkazového řádku (Visual Basic).
Microsoft Build Engine (MSBuild). Kromě kódu a souborů XAML musí aplikace obsahovat soubor projektu MSBuild. Další informace naleznete v tématu MSBuild.
Visual Studio. Visual Studio je integrované vývojové prostředí, které kompiluje aplikace WPF pomocí nástroje MSBuild a obsahuje vizuální návrhář pro vytváření uživatelského rozhraní. Další informace naleznete v tématu Psaní a správa kódu pomocí sady Visual Studio a návrh XAML v sadě Visual Studio.
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.
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:
Soubor XAML je analyzován kompilátorem značek.
Vytvoří se zkompilovaná reprezentace pro tento XAML a zkopíruje se do složky obj\Release.
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
, Page
a 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
,RootNamespace
aHostInBrowser
.
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é
.NET Desktop feedback