Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A Windows Presentation Foundation (WPF) alkalmazások .NET keretrendszerű végrehajtható fájlokként (.exe), könyvtárakként (.dll), vagy a kettő kombinációjaként hozhatók létre. Ez a témakör bemutatja, hogyan hozhat létre WPF-alkalmazásokat, és ismerteti a buildelési folyamat főbb lépéseit.
WPF-alkalmazás létrehozása
A WPF-alkalmazások a következő módokon állíthatók össze:
Parancssor. Az alkalmazásnak csak kódot (XAML nélkül) és alkalmazásdefiníciós fájlt kell tartalmaznia. További információ: parancssori épület csc.exe vagy Épület a parancssorból (Visual Basic).
Microsoft Build Engine (MSBuild). A kód- és XAML-fájlok mellett az alkalmazásnak tartalmaznia kell egy MSBuild projektfájlt is. További információ: "MSBuild".
Visual Studio. A Visual Studio egy integrált fejlesztői környezet, amely WPF-alkalmazásokat fordít le az MSBuild használatával, és tartalmaz egy vizuális tervezőt a felhasználói felület létrehozásához. További információ: Kód írása és kezelése a Visual Studio használatával, valamint XAML tervezése a Visual Studiohasználatával.
WPF buildfolyamat
A WPF-projekt létrehozásakor a rendszer meghívja a nyelvspecifikus és a WPF-specifikus célok kombinációját. A célok végrehajtásának folyamatát buildelési folyamatnak nevezzük, a fő lépéseket pedig az alábbi ábra szemlélteti.
Build előtti inicializálások
Az MSBuild az építés előtt meghatározza a fontos eszközök és kódtárak helyét, beleértve a következőket:
A .NET-keretrendszer.
A Windows SDK-címtárak.
A WPF-referenciaszerelvények helye.
A szerelvény keresési útvonalainak tulajdonsága.
Az ELSŐ hely, ahol az MSBuild szerelvényeket keres, a referenciaszerelvény könyvtára (%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.0\). Ebben a lépésben a buildelési folyamat inicializálja a különböző tulajdonságokat és elemcsoportokat, és elvégzi a szükséges karbantartási műveleteket.
Hivatkozások feloldása
A buildelési folyamat megkeresi és összeköti az alkalmazásprojekt létrehozásához szükséges szerelvényeket. Ezt a logikát a ResolveAssemblyReference feladat tartalmazza. A projektfájlban Reference-ként deklarált összes szerelvényt a feladat megkapja, a keresési útvonalakkal és a már a rendszeren telepített szerelvények metaadataival együtt. A feladat megkeresi a szerelvényeket, és a telepített szerelvény metaadataival kiszűri azokat az alapvető WPF-szerelvényeket, amelyeknek nem kell megjelennie a kimeneti jegyzékekben. Ez azért történik, hogy elkerülje a ClickOnce-jegyzékek redundáns információit. Például, mivel a PresentationFramework.dll tekinthető egy WPF-en és WPF-re épített alkalmazás reprezentatív példájának, és mivel minden WPF-szerelvény ugyanazon a helyen található minden gépen, ahol a .NET-keretrendszer telepítve van, nem szükséges az összes .NET-keretrendszer referencia-szerelvényről minden információt feltüntetni a jegyzékekben.
Jelölők összeállítása – Első kör
Ebben a lépésben az XAML-fájlok elemzése és fordítása úgy történik, hogy a futtatókörnyezet ne töltsön időt az XML elemzése és a tulajdonságértékek érvényesítése során. A lefordított XAML-fájl előre jogkivonatos, így futásidőben sokkal gyorsabbnak kell lennie, mint egy XAML-fájl betöltése.
Ebben a lépésben a következő tevékenységek történnek minden olyan XAML-fájl esetében, amely egy Page buildelem:
Az XAML-fájlt a korrektúrafordító elemzi.
Az XAML-hez lefordított reprezentáció jön létre, és az obj\Release mappába másolódik.
Létrejön egy új részleges osztály CodeDOM-reprezentációja, és átmásolódik az obj\Release mappába.
Emellett minden XAML-fájlhoz létrehoz egy nyelvspecifikus kódfájlt. Egy Visual Basic-projekt Page1.xaml-lapja esetében például Page1.g.vb jön létre; Egy C#-projekt Page1.xaml-lapja esetén a rendszer létrehoz egy Page1.g.cs. A fájlnévben szereplő ".g" azt jelzi, hogy a fájl olyan kód jön létre, amely részleges osztálydeklarációval rendelkezik a korrektúrafájl legfelső szintű eleméhez (például Page vagy Window). Az osztály deklarálva van a C# partial módosítójával (Extends a Visual Basicben), hogy jelezze, hogy az osztály máshol is deklarálva van, általában a kód mögötti fájlban Page1.xaml.cs.
A részleges osztály a megfelelő alaposztálytól (például egy lap Page) terjed ki, és implementálja a System.Windows.Markup.IComponentConnector felületet. A IComponentConnector felület metódusokkal inicializálhat egy összetevőt, és összekapcsolhatja a tartalmának elemein lévő neveket és eseményeket. Következésképpen a létrehozott kódfájl egy olyan metódus-implementációval rendelkezik, mint a következő:
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
Alapértelmezés szerint a jelölőnyelv fordítás ugyanabban a AppDomain fut, mint az MSBuild motor. Ez jelentős teljesítménynövekedést biztosít. Ez a viselkedés a AlwaysCompileMarkupFilesInSeparateDomain tulajdonsággal kapcsolható. Ennek az az előnye, hogy az összes referenciaszerelvényt a külön AppDomainkipakolásával távolítja el.
Jelölési összeállítás – Pass 2
Nem minden XAML-oldal van lefordítva a jelölési fordítás első lépése során. Az olyan XAML-fájlok, amelyek helyileg meghatározott típushivatkozásokkal rendelkeznek (a kódban meghatározott típusokra mutató hivatkozások ugyanabban a projektben máshol) jelenleg mentesülnek a fordítás alól. Ennek az az oka, hogy ezek a helyileg meghatározott típusok csak a forrásban léteznek, és még nem lettek lefordítva. Ennek meghatározásához az elemző heurisztikus elemeket használ, amelyek olyan elemeket keresnek, mint például a x:Name a korrektúrafájlban. Ha ilyen példányt talál, a jelölőfájl fordítása el lesz halasztva addig, amíg a kódfájlok le nem fordulnak, ezután a második jelölőfordítási lépés ezeket a fájlokat dolgozza fel.
Fájlbesorolás
A buildelési folyamat különböző erőforráscsoportokba helyezi a kimeneti fájlokat attól függően, hogy melyik alkalmazásszerelvénybe helyezik őket. Egy tipikus nem lokalizált alkalmazásban az Resource jelölt összes adatfájl a fő összeállításba kerül (végrehajtható vagy könyvtár). Ha UICulture be van állítva a projektben, az összes lefordított XAML-fájl és a kifejezetten nyelvspecifikusként megjelölt erőforrások a műholdas erőforrás-szerelvénybe kerülnek. Ezenkívül minden nyelvsemleges erőforrás a fő szerelvénybe kerül. A buildelési folyamat ezen lépésében ez a meghatározás történik.
A projektfájlban található ApplicationDefinition, Pageés Resource buildelési műveletek bővíthetők a Localizable metaadatokkal (az elfogadható értékek true és false), amely meghatározza, hogy a fájl nyelvspecifikus vagy nyelvsemleges-e.
Fő összeállítás
Az alapvető fordítási lépés magában foglalja a kódfájlok fordítását. Ezt a microsoft.CSharp.targets és a Microsoft.VisualBasic.targets nyelvspecifikus célfájlok logikája vezényli. Ha a heurisztika meghatározta, hogy a jelölő fordító egyetlen futtatására van szükség, akkor létrejön a fő összeszerelési egység. Ha azonban a projekt egy vagy több XAML-fájlja helyileg meghatározott típusokra hivatkozik, akkor egy ideiglenes .dll fájl jön létre, így a végleges alkalmazásszerelvények a korrektúra-fordítás második sikeres befejezése után hozhatók létre.
Manifesztum generálása
A buildelési folyamat végén, miután az összes alkalmazásszerelvény és tartalomfájl elkészült, létrejön az alkalmazás ClickOnce-jegyzékfájlja.
Az üzembehelyezési jegyzékfájl a telepítési modellt írja le: az aktuális verziót, a frissítési viselkedést és a közzétevő identitását, valamint a digitális aláírást. Ezt a jegyzékfájlt az üzembe helyezést kezelő rendszergazdáknak szánták. A fájlkiterjesztés .xbap (XAML böngészőalkalmazásokhoz (XBAPs)) és .application a telepített alkalmazásokhoz. Az előbbiet a HostInBrowser projekttulajdonság szabja meg, ezért a jegyzék az alkalmazást böngésző által üzemeltetettként azonosítja.
Az alkalmazásjegyzék (egy .exe.manifest fájl) leírja az alkalmazásszerelvényeket és a függő kódtárakat, valamint felsorolja az alkalmazás által igényelt engedélyeket. Ezt a fájlt az alkalmazás fejlesztőjének kell létrehoznia. ClickOnce-alkalmazás indításához a felhasználó megnyitja az alkalmazás üzembehelyezési jegyzékfájlját.
Ezek a jegyzékfájlok mindig XBAP-khez jönnek létre. A telepített alkalmazások csak akkor jönnek létre, ha a GenerateManifests tulajdonság meg van adva a projektfájlban trueértékkel.
Az XBAP-k két további engedélyt kapnak a tipikus internetzóna-alkalmazásokhoz rendelt engedélyek felett: WebBrowserPermission és MediaPermission. A WPF buildrendszer deklarálja ezeket az engedélyeket az alkalmazásjegyzékben.
Növekményes fordítási támogatás
A WPF buildrendszer támogatja a növekményes buildeket. Meglehetősen intelligens a korrektúra vagy a kód módosításainak észleléséhez, és csak a módosítás által érintett összetevőket fordítja le. A növekményes buildelési mechanizmus a következő fájlokat használja:
$(AssemblyName)_MarkupCompiler.Cache fájl az aktuális fordítóállapot fenntartásához.
$(AssemblyName)_MarkupCompiler.lref fájl az XAML-fájlok gyorsítótárazásához helyileg meghatározott típusokra mutató hivatkozásokkal.
A növekményes buildet szabályozó szabályok a következők:
A fájl a legkisebb egység, amelyben a buildrendszer észleli a változást. Egy kódfájl esetében tehát a buildelési rendszer nem tudja megállapítani, hogy módosították-e a típust, vagy hozzáadták-e a kódot. Ugyanez vonatkozik a projektfájlokra is.
A növekményes buildelési mechanizmusnak biztosnak kell lennie abban, hogy egy XAML-oldal vagy osztályt határoz meg, vagy más osztályokat használ.
Ha
Referencebejegyzései megváltoznak, akkor az összes oldalt újrafordítással végezze el.Ha megváltozik egy kódfájl, fordítsa újra az összes oldalt, amelyek helyileg definiált típushivatkozásokat tartalmaznak.
Ha egy XAML-fájl megváltozik:
Ha az XAML
Page-ként van deklarálva a projektben: ha az XAML nem rendelkezik helyileg meghatározott típushivatkozásokkal, akkor fordítsa újra az XAML-t és az összes XAML-lapot helyi hivatkozásokkal; különben, ha az XAML helyi hivatkozásokkal rendelkezik, az összes XAML-lapot újra kell fordítani helyi hivatkozásokkal.Ha az XAML
ApplicationDefinitiondeklarálva van a projektben: az összes XAML-lap újrafordítása (ok: minden XAML hivatkozik egy Application típusra, amely esetleg megváltozott).
Ha a projektfájl XAML-fájl helyett alkalmazásdefinícióként deklarál egy kódfájlt:
Ellenőrizze, hogy megváltozott-e a projektfájl
ApplicationClassNameértéke (van-e új alkalmazástípus?). Ha igen, akkor a teljes alkalmazást újra kell fordítani.Máskülönben az összes XAML-lapot helyi hivatkozásokkal újra kell fordítani.
Ha megváltozik egy projektfájl: alkalmazza az összes előző szabályt, és nézze meg, mit kell újrafordíteni. A következő tulajdonságok módosításai teljes újrafordítást váltanak ki:
AssemblyName,IntermediateOutputPath,RootNamespaceésHostInBrowser.
A következő újrafordítási forgatókönyvek lehetségesek:
A teljes alkalmazás újrafordításra kerül.
Csak azok az XAML-fájlok lesznek újra lefordítva, amelyek helyileg definiált típushivatkozásokkal rendelkeznek.
Semmi sem lesz újrafordítve (ha a projektben semmi sem változott).
Lásd még
.NET Desktop feedback