Ngen.exe (natív képgenerátor)

A natív képgenerátor (Ngen.exe) egy olyan eszköz, amely javítja a felügyelt alkalmazások teljesítményét. Ngen.exe létrehoz natív lemezképeket, amelyek lefordított processzorspecifikus gépkódot tartalmazó fájlok, és telepíti őket a helyi számítógépen található natív rendszerkép-gyorsítótárba. A futtatókörnyezet a gyorsítótár natív rendszerképeit használhatja ahelyett, hogy az igény szerinti (JIT) fordítót használna az eredeti szerelvény fordításához.

Feljegyzés

Ngen.exe natív képeket állít össze olyan szerelvényekhez, amelyek csak .NET-keretrendszer céloznak meg. A .NET Core megfelelő natív képgenerátora a CrossGen.

A 4. .NET-keretrendszer Ngen.exe változásai:

  • Ngen.exe most már teljes megbízhatósággal állítja össze a szerelvényeket, és a kódhozzáférés biztonsági (CAS) szabályzata már nem lesz kiértékelve.

  • A Ngen.exe létrehozott natív rendszerképek már nem tölthetők be részleges megbízhatósággal futó alkalmazásokba.

A Ngen.exe módosítása a .NET-keretrendszer 2.0-s verziójában:

  • A szerelvény telepítése a függőségeket is telepíti, leegyszerűsítve a Ngen.exe szintaxisát.

  • A natív rendszerképek mostantól megoszthatók az alkalmazástartományokban.

  • Egy új művelet, updateamely újra létrehozza az érvénytelenített képeket.

  • A műveleteket késleltetheti egy olyan szolgáltatás, amely üresjárati időt használ a számítógépen a rendszerképek létrehozásához és telepítéséhez.

  • A rendszerkép érvénytelenítésének néhány oka megszűnt.

Windows 8 rendszeren lásd : Natív rendszerkép-feladat.

További információ a Ngen.exe és a natív képszolgáltatás használatáról: Native Image Service.

Feljegyzés

Ngen.exe .NET-keretrendszer 1.0-s és 1.1-s verzióinak szintaxisa a natív képgenerátor (Ngen.exe) örökölt szintaxisában található.

Ez az eszköz automatikusan telepítve van a Visual Studióval. Az eszköz futtatásához használja a Visual Studio fejlesztői parancssorát vagy a Visual Studio Developer PowerShellt.

A parancssorba írja be a következőt:

Syntax

ngen action [options]
ngen /? | /help

Műveletek

Az alábbi táblázat az egyes actionfüggvények szintaxisát mutatja be. Az egyes részek actionleírásáért tekintse meg az argumentumokat, a prioritási szinteket, a forgatókönyveket és a konfigurációs táblákat. A Beállítások tábla a súgó kapcsolóját options ismerteti.

Művelet Leírás
install[assemblyName | assemblyPath] [scenarios] [config/queue[{|3:12|}]] Hozzon létre natív lemezképeket egy szerelvényhez és annak függőségeihez, és telepítse a lemezképeket a natív képgyorsítótárba.

Ha /queue meg van adva, a művelet várólistára kerül a natív képszolgáltatás számára. Az alapértelmezett prioritás a 3. Lásd a Prioritási szintek táblát.
uninstall[assemblyName | assemblyPath] [scenariosconfig] Törölje egy szerelvény natív rendszerképeit és függőségeit a natív képgyorsítótárból.

Egyetlen rendszerkép és függőségeinek eltávolításához használja ugyanazokat a parancssori argumentumokat, amelyeket a rendszerkép telepítéséhez használt. Megjegyzés: A 4. .NET-keretrendszer kezdve a * művelet uninstall már nem támogatott.
update [/queue] Érvénytelenné vált natív rendszerképek frissítése.

Ha /queue meg van adva, a frissítések várólistára kerülnek a natív képszolgáltatáshoz. Frissítések mindig a 3. prioritásra vannak ütemezve, ezért a számítógép tétlen állapotában futnak.
display [assemblyName | assemblyPath] Megjeleníti egy szerelvény natív lemezképeinek állapotát és függőségeit.

Ha nincs megadva argumentum, a natív képgyorsítótárban minden megjelenik.
executeQueuedItems [1|2|3]

-vagy-

eqi [1|2|3]
Várólistán lévő fordítási feladatok végrehajtása.

Prioritás megadása esetén a rendszer végrehajtja a nagyobb vagy egyenlő prioritású fordítási feladatokat. Ha nincs megadva prioritás, a rendszer minden várólistán lévő fordítási feladatot végrehajt.
queue{pause | | continuestatus} Szüneteltetheti a natív képszolgáltatást, engedélyezheti a szüneteltetett szolgáltatás folytatását, vagy lekérdezheti a szolgáltatás állapotát.

Argumentumok

Argumentum Leírás
assemblyName A szerelvény teljes megjelenítendő neve. Például: "myAssembly, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5". Megjegyzés: Megadhat egy részleges szerelvénynevet, például myAssemblya műveletekhez és uninstall a display műveletekhez.

Parancssoronként csak egy szerelvény adható meg Ngen.exe.
assemblyPath A szerelvény explicit útvonala. Megadhat egy teljes vagy relatív elérési utat.

Ha elérési út nélküli fájlnevet ad meg, a szerelvénynek az aktuális könyvtárban kell lennie.

Parancssoronként csak egy szerelvény adható meg Ngen.exe.

Prioritási szintek

Prioritás Leírás
1 A natív képeket a rendszer azonnal létrehozza és telepíti anélkül, hogy tétlen időre vár.
2 A natív rendszerképek létrehozása és telepítése tétlen időre való várakozás nélkül történik, de az 1. prioritású műveletek (és függőségeik) befejeződése után.
3 A natív rendszerképek akkor lesznek telepítve, amikor a natív rendszerkép-szolgáltatás észleli, hogy a számítógép tétlen. Lásd: Natív képszolgáltatás.

Forgatókönyvek

Eset Leírás
/Debug Hozzon létre natív képeket, amelyek hibakereső alatt használhatók.
/Profile Hozzon létre natív képeket, amelyek a profilkészítőben használhatók.
/NoDependencies Hozza létre a megadott forgatókönyv-beállításokhoz szükséges natív képek minimális számát.

Konfigurálás

Konfiguráció Leírás
/ExeConfig: exePath Használja a megadott végrehajtható szerelvény konfigurációját.

Ngen.exe ugyanazokat a döntéseket kell meghoznia, mint a betöltőnek a függőségek kötésekor. Amikor egy megosztott összetevőt futtatáskor tölt be, a Load metódus használatával az alkalmazás konfigurációs fájlja határozza meg a megosztott összetevőhöz betöltött függőségeket – például a betöltött függőségek verzióját. A /ExeConfig kapcsoló Ngen.exe útmutatást nyújt arra vonatkozóan, hogy mely függőségek legyenek betöltve futásidőben.
/AppBase: directoryPath Függőségek keresésekor használja a megadott könyvtárat alkalmazásbázisként.

Beállítások

Lehetőség Leírás
/nologo Tiltsa le a Microsoft indítási szalagcímének megjelenítését.
/silent A sikeres üzenetek megjelenítésének letiltása.
/verbose A hibakeresés részletes információinak megjelenítése.
/help, /? Az aktuális kiadás parancsszintaxisának és beállításainak megjelenítése.

Megjegyzések

A Ngen.exe futtatásához rendszergazdai jogosultságokkal kell rendelkeznie.

Figyelemfelhívás

Ne futtasson Ngen.exe olyan szerelvényeken, amelyek nem teljesen megbízhatóak. A 4. .NET-keretrendszer kezdve a Ngen.exe teljes megbízhatósággal állítja össze a szerelvényeket, és a kódhozzáférés biztonsági (CAS) szabályzata már nem lesz kiértékelve.

A .NET-keretrendszer 4-től kezdve a Ngen.exe létrehozott natív rendszerképek már nem tölthetők be részleges megbízhatósággal futó alkalmazásokba. Ehelyett a rendszer meghívja a just-in-time (JIT) fordítót.

Ngen.exe natív képeket hoz létre a művelet argumentuma és az összes függősége által assemblyname megadott szerelvényhez install . A függőségeket a rendszer a szerelvényjegyzék hivatkozásaiból határozza meg. Az egyetlen olyan forgatókönyv, amelyben külön kell telepítenie egy függőséget, ha az alkalmazás tükröződés használatával tölti be, például a Assembly.Load metódus meghívásával.

Fontos

Ne használja a metódust Assembly.LoadFrom natív képekkel. Az ezzel a módszerrel betöltött rendszerképet más szerelvények nem használhatják a végrehajtási környezetben.

Ngen.exe fenntartja a függőségek számát. Tegyük fel például, hogy MyAssembly.exeYourAssembly.exe mindkettő telepítve van a natív képgyorsítótárban, és mindkettőre hivatkozik OurDependency.dll. Ha MyAssembly.exe a rendszer eltávolítja, OurDependency.dll a rendszer nem távolítja el. A rendszer csak akkor távolítja el, ha YourAssembly.exe az is eltávolításra kerül.

Ha natív rendszerképet hoz létre egy szerelvényhez a globális szerelvény-gyorsítótárban, adja meg annak megjelenítendő nevét. Lásd: Assembly.FullName.

Az Ngen.exe által létrehozott natív képek megoszthatók az alkalmazástartományokban. Ez azt jelenti, hogy Ngen.exe használhat olyan alkalmazásforgatókönyvekben, amelyekhez szerelvényeket kell megosztani az alkalmazástartományokban. Tartománysemlegesség megadása:

Mindig használjon tartománysemleges kódot, amikor ugyanazt a szerelvényt több alkalmazástartományba tölti be. Ha egy natív rendszerképet megosztott tartományba való betöltése után nem osztott alkalmazástartományba tölt be, az nem használható.

Feljegyzés

A tartománysemleges kód nem távolítható el, és a teljesítmény kissé lassabb lehet, különösen statikus tagok elérésekor.

Ebben a Megjegyzés szakaszban:

Képek létrehozása különböző forgatókönyvekhez

Miután létrehozott egy natív lemezképet egy szerelvényhez, a futtatókörnyezet automatikusan megpróbálja megkeresni és használni ezt a natív lemezképet minden alkalommal, amikor az szerelvényt futtatja. A használati helyzetektől függően több rendszerkép is létrehozható.

Ha például hibakeresési vagy profilkészítési forgatókönyvben futtat egy szerelvényt, a futtatókörnyezet egy natív rendszerképet keres, amely a beállításokkal vagy /Profile beállításokkal /Debug lett létrehozva. Ha nem talál egyező natív képet, a futtatókörnyezet visszaáll a szokásos JIT-fordításra. A natív képek hibakeresésének egyetlen módja egy natív rendszerkép létrehozása a /Debug beállítással.

A uninstall művelet felismeri a forgatókönyveket is, így eltávolíthatja az összes forgatókönyvet vagy csak a kiválasztott forgatókönyveket.

Natív képek használatának meghatározása

A natív rendszerképek két területen biztosíthatnak teljesítménybeli javulást: jobb memóriahasználatot és csökkentett indítási időt.

Feljegyzés

A natív képek teljesítménye számos olyan tényezőtől függ, amelyek megnehezítik az elemzést, például a kód- és adatelérési mintákat, a modulhatárokon keresztüli hívások számát, valamint azt, hogy a többi alkalmazás hány függőséget töltött be. A natív rendszerképek használatának egyetlen módja a kulcsfontosságú üzembe helyezési forgatókönyvek gondos teljesítménymérése.

Továbbfejlesztett memóriahasználat

A natív képek jelentősen javíthatják a memóriahasználatot, ha a kód meg van osztva a folyamatok között. A natív rendszerképek Windows PE-fájlok, így egy .dll fájl egyetlen példányát több folyamat is megoszthatja; ezzel szemben a JIT-fordító által előállított natív kód magánmemóriában van tárolva, és nem osztható meg.

A terminálszolgáltatások alatt futó alkalmazások is élvezhetik a megosztott kódlapokat.

Emellett a JIT-fordító betöltése helyett fix mennyiségű memóriát takarít meg az egyes alkalmazáspéldányok számára.

Gyorsabb alkalmazásindítás

A szerelvények Ngen.exe való előkomponálása javíthatja egyes alkalmazások indítási idejét. Általában akkor lehet nyereséget elérni, ha az alkalmazások megosztják az összetevő-szerelvényeket, mert az első alkalmazás elindítása után a megosztott összetevők már betöltve vannak a későbbi alkalmazásokhoz. A hideg indítás, amelyben egy alkalmazás összes szerelvényét be kell tölteni a merevlemezről, nem előnyös annyira a natív képekből, mert a merevlemez hozzáférési ideje túlsúlyban van.

A kemény kötés befolyásolhatja az indítási időt, mivel a fő alkalmazásszerelvényhez kötött összes lemezképet egyszerre kell betölteni.

Feljegyzés

A .NET-keretrendszer 3.5 Service Pack 1 szervizcsomag előtt a globális szerelvény-gyorsítótárba kell helyeznie a megosztott, erős nevű összetevőket, mivel a betöltő extra ellenőrzést végez olyan erős nevű szerelvényeken, amelyek nincsenek a globális szerelvénygyorsítótárban, így hatékonyan kiküszöbölheti a natív rendszerképek használatával szerzett indítási idő javulását. A .NET-keretrendszer 3.5 SP1-ben bevezetett optimalizálások eltávolították a további ellenőrzést.

A használati szempontok összefoglalása

Az alábbi általános szempontok és alkalmazásokkal kapcsolatos szempontok segíthetnek annak eldöntésében, hogy vállalja-e a natív képek kiértékelését az alkalmazás számára:

  • A natív képek gyorsabban töltődnek be, mint a CIL, mert nem igényelnek sok indítási tevékenységet, például a JIT fordítását és a típusbiztonsági ellenőrzést.

  • A natív képek kisebb kezdeti munkakészletet igényelnek, mert nincs szükség a JIT-fordítóra.

  • A natív képek lehetővé teszik a kódmegosztást a folyamatok között.

  • A natív rendszerképek több lemezterületet igényelnek, mint a CIL-szerelvények, és jelentős időt igényelnek a létrehozásukhoz.

  • A natív képeket meg kell őrizni.

    • A rendszerképeket újra kell létrehozni az eredeti szerelvény vagy annak egyik függőségének szervizelésekor.

    • Előfordulhat, hogy egy szerelvénynek több natív rendszerképre van szüksége a különböző alkalmazásokban vagy különböző forgatókönyvekben való használatra. A két alkalmazás konfigurációs adatai például eltérő kötési döntéseket eredményezhetnek ugyanahhoz a függő szerelvényhez.

    • A natív rendszerképeket egy rendszergazdának kell létrehoznia; vagyis egy Windows-fiókból a Rendszergazda istrators csoportban.

Ezen általános szempontok mellett az alkalmazás természetét is figyelembe kell venni annak meghatározásakor, hogy a natív képek teljesítménybeli előnyt jelenthetnek-e:

  • Ha az alkalmazás olyan környezetben fut, amely sok megosztott összetevőt használ, a natív rendszerképek lehetővé teszik, hogy az összetevőket több folyamat is megossza.

  • Ha az alkalmazás több alkalmazástartományt használ, a natív rendszerképek lehetővé teszik a kódlapok tartományok közötti megosztását.

    Feljegyzés

    Az .NET-keretrendszer 1.0-s és 1.1-s verzióiban a natív rendszerképek nem oszthatók meg az alkalmazástartományokban. Ez a 2.0-s vagy újabb verzióban nem így van.

  • Ha az alkalmazás a Terminálkiszolgáló alatt fog futni, a natív rendszerképek lehetővé teszik a kódlapok megosztását.

  • A nagy alkalmazások általában a natív képekre való fordítás előnyeit élvezik. A kis alkalmazások általában nem hasznosak.

  • A hosszú ideig futó alkalmazások esetében a futásidejű JIT-fordítás valamivel jobb teljesítményt nyújt, mint a natív képek. (A kemény kötés bizonyos mértékig csökkentheti ezt a teljesítménybeli különbséget.)

Az összeállítási alapcímek fontossága

Mivel a natív rendszerképek Windows PE-fájlok, a többi végrehajtható fájlhoz hasonlóan ugyanazok a visszaállítási problémák vonatkoznak rájuk. Az áthelyezés teljesítményköltsége még hangsúlyosabb a kemény kötés alkalmazása esetén.

A natív rendszerkép alapcímének beállításához használja a fordító megfelelő beállítását a szerelvény alapcímének beállításához. Ngen.exe ezt az alapcímet használja a natív rendszerképhez.

Feljegyzés

A natív képek nagyobbak, mint azok a felügyelt szerelvények, amelyekből létrehozták őket. Az alapcímeket úgy kell kiszámítani, hogy ezek a nagyobb méretek engedélyezve legyenek.

A natív rendszerképek elsődleges alapcímének megtekintéséhez használhat például dumpbin.exe eszközt.

Kemény kötés

A kemény kötés növeli az átviteli sebességet, és csökkenti a natív képek munkakészletének méretét. A kemény kötés hátránya, hogy a szerelvény betöltésekor a szerelvényhez kötött összes lemezképet be kell tölteni. Ez jelentősen növelheti a nagy alkalmazások indítási idejét.

A kemény kötés az alkalmazás összes teljesítménykritikus forgatókönyvében betöltött függőségekhez megfelelő. A natív képhasználathoz hasonlóan a gondos teljesítménymérés az egyetlen módszer annak meghatározására, hogy a kemény kötés javítja-e az alkalmazás teljesítményét.

Az DependencyAttribute és DefaultDependencyAttribute az attribútumok lehetővé teszik, hogy kemény kötési tippeket adjon Ngen.exe.

Feljegyzés

Ezek az attribútumok Ngen.exe, nem parancsokra utalnak. A használatuk nem garantálja a kemény kötést. Ezeknek az attribútumoknak a jelentése változhat a jövőbeli kiadásokban.

Kötési tipp megadása függőséghez

Alkalmazza a DependencyAttribute szerelvényt egy adott függőség betöltésének valószínűségére. LoadHint.Always azt jelzi, hogy a kemény kötés megfelelő, azt jelzi, Default hogy a függőség alapértelmezett értékét kell használni, és Sometimes azt jelzi, hogy a kötés nem megfelelő.

Az alábbi kód egy két függőséget tartalmazó szerelvény attribútumait mutatja be. Az első függőség (Assembly1) megfelelő jelölt a kemény kötéshez, a második (Assembly2) pedig nem.

Imports System.Runtime.CompilerServices
<Assembly:DependencyAttribute("Assembly1", LoadHint.Always)>
<Assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)>
using System.Runtime.CompilerServices;
[assembly:DependencyAttribute("Assembly1", LoadHint.Always)]
[assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)]
using namespace System::Runtime::CompilerServices;
[assembly:DependencyAttribute("Assembly1", LoadHint.Always)];
[assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)];

A szerelvény neve nem tartalmazza a fájlnévkiterjesztést. Megjelenítendő nevek használhatók.

Alapértelmezett kötési tipp megadása egy szerelvényhez

Az alapértelmezett kötési tippekre csak olyan szerelvényekhez van szükség, amelyeket minden olyan alkalmazás azonnal és gyakran használ, amely függőséget okoz rajtuk. Alkalmazza a DefaultDependencyAttribute következőt LoadHint.Always az ilyen szerelvényekre, és határozza meg, hogy a kemény kötést használni kell.

Feljegyzés

Nincs ok arra, hogy olyan .dll szerelvényekre vonatkozzanak DefaultDependencyAttribute , amelyek nem ebbe a kategóriába tartoznak, mert az attribútum bármilyen más értékkel LoadHint.Always való alkalmazása nem ugyanazzal a hatással van, mint az attribútum egyáltalán nem való alkalmazása.

A Microsoft ezzel DefaultDependencyAttribute a beállítással határozza meg, hogy a kemény kötés az alapértelmezett a .NET-keretrendszer nagyon kis számú szerelvények esetében, például mscorlib.dll.

Halasztott feldolgozás

Egy nagyon nagy alkalmazás natív lemezképeinek létrehozása jelentős időt vehet igénybe. Hasonlóképpen, a megosztott összetevők módosítása vagy a számítógép beállításainak módosítása számos natív rendszerkép frissítését igényelheti. Az install és update a műveletek rendelkeznek egy /queue lehetőséggel, amely várólistára állítja a műveletet a natív rendszerkép-szolgáltatás késleltetett végrehajtásához. Emellett Ngen.exe rendelkezik queue olyan műveletekkel és executeQueuedItems műveletekkel, amelyek némi vezérlést biztosítanak a szolgáltatás felett. További információ: Natív képszolgáltatás.

Natív képek és JIT-összeállítás

Ha Ngen.exe olyan metódusokkal találkozik egy szerelvényben, amelyeket nem tud létrehozni, kizárja őket a natív rendszerképből. Amikor a futtatókörnyezet végrehajtja ezt a szerelvényt, visszaáll a JIT-fordításra a natív rendszerképben nem szereplő metódusok esetében.

Emellett a rendszer nem használ natív képeket, ha a szerelvényt frissítették, vagy ha a rendszerkép bármilyen okból érvénytelenítve lett.

Érvénytelen képek

Ha a Ngen.exe használatával hoz létre natív rendszerképet egy szerelvényről, a kimenet a megadott parancssori beállításoktól és a számítógép bizonyos beállításaitól függ. Ezek a beállítások a következőket tartalmazzák:

  • A .NET-keretrendszer verziója.

  • A szerelvény pontos identitása (az újrafordítás megváltoztatja az identitást).

  • A szerelvény által hivatkozott összes szerelvény pontos identitása (az újrafordítás megváltoztatja az identitást).

  • Biztonsági tényezők.

Ngen.exe rögzíti ezeket az adatokat, amikor natív rendszerképet hoz létre. Szerelvény végrehajtásakor a futtatókörnyezet megkeresi a számítógép aktuális környezetének megfelelő beállításokkal és beállításokkal létrehozott natív rendszerképet. A futtatókörnyezet visszaáll egy szerelvény JIT-fordítására, ha nem talál egyező natív képet. A számítógép beállításainak és környezetének alábbi módosításai miatt a natív képek érvénytelenné válnak:

  • A .NET-keretrendszer verziója.

    Ha frissítést alkalmaz .NET-keretrendszer, a Ngen.exe használatával létrehozott összes natív rendszerkép érvénytelenné válik. Ezért .NET-keretrendszer összes frissítése végrehajtja a Ngen Update parancsot, hogy az összes natív rendszerkép újragenerálva legyen. .NET-keretrendszer automatikusan létrehoz új natív képeket a telepített .NET-keretrendszer kódtárakhoz.

  • A szerelvény pontos személyazonossága.

    Egy szerelvény újrafordítása esetén a szerelvény megfelelő natív rendszerképe érvénytelenné válik.

  • A szerelvények referenciáinak pontos identitása.

    Felügyelt szerelvény frissítésekor minden olyan natív rendszerkép érvénytelenné válik, amely közvetlenül vagy közvetve az adott szerelvénytől függ, és újra létre kell hozni. Ez magában foglalja a szokásos hivatkozásokat és a kötött függőségeket is. Amikor szoftverfrissítést alkalmaz, a telepítőprogramnak végre kell hajtania egy Ngen Update parancsot, amely biztosítja az összes függő natív rendszerkép újragenerálását.

  • Biztonsági tényezők.

    Ha módosítja a gép biztonsági szabályzatát a korábban a szerelvénynek adott engedélyek korlátozására, az a korábban lefordított natív rendszerkép érvénytelenné válását okozhatja.

    A közös nyelvi futtatókörnyezet a kódhozzáférés biztonságának és az engedélyek használatának módjával kapcsolatos részletes információkat a Code Access Securityben találja.

Hibaelhárítás

Az alábbi hibaelhárítási témakörök segítségével megtekintheti, hogy mely natív rendszerképeket használja, és melyeket nem használhat az alkalmazás, hogyan állapíthatja meg, hogy a JIT-fordító mikor kezdi el lefordítani a metódust, és bemutatja, hogyan tilthatja le a megadott metódusok natív rendszerkép-fordítását.

Szerelvénykötési naplómegjelenítő

Annak ellenőrzéséhez, hogy az alkalmazás natív lemezképeket használ-e, használhatja a Fuslogvw.exe (szerelvénykötési naplónapló-megjelenítő) használatát. A kötésnapló-megjelenítő ablak Naplókategóriák mezőjében válassza a Natív képek lehetőséget. Fuslogvw.exe információt nyújt arról, hogy miért utasítottak el egy natív képet.

A JITCompilationStart felügyelt hibakeresési asszisztense

A jitCompilationStart felügyelt hibakeresési segéd (MDA) segítségével meghatározhatja, hogy a JIT-fordító mikor kezdi meg a függvény fordítását.

A natív képlétrehozás letiltása

Bizonyos esetekben előfordulhat, hogy NGen.exe nehézségekbe ütközik egy natív rendszerkép létrehozása egy adott metódushoz, vagy inkább azt szeretné, hogy a metódust a JIT lefordítsa, majd egy natív rendszerképre fordítsa. Ebben az esetben az System.Runtime.BypassNGenAttribute attribútummal megakadályozhatja, hogy NGen.exe natív képet generáljon egy adott metódushoz. Az attribútumot egyenként kell alkalmazni minden olyan metódusra, amelynek kódját nem szeretné belefoglalni a natív rendszerképbe. NGen.exe felismeri az attribútumot, és nem hoz létre kódot a natív rendszerképben a megfelelő metódushoz.

Ne feledje azonban, hogy BypassNGenAttribute ez nem a .NET-keretrendszer Osztálytár típusaként van definiálva. A kódban szereplő attribútum használatához először a következőképpen kell definiálnia:

namespace System.Runtime
{
   [AttributeUsage(AttributeTargets.Method |
                   AttributeTargets.Constructor |
                   AttributeTargets.Property)]
   public class BypassNGenAttribute : Attribute
   {
   }
}
Namespace System.Runtime
    <AttributeUsage(AttributeTargets.Method Or
                    AttributeTargets.Constructor Or
                    AttributeTargets.Property)>
    Public Class BypassNGenAttribute : Inherits Attribute
    End Class
End Namespace

Ezután metódusonként alkalmazhatja az attribútumot. Az alábbi példa arra utasítja a natív képgenerátort, hogy ne hozzon létre natív képet a ExampleClass.ToJITCompile metódushoz.

using System;
using System.Runtime;

public class ExampleClass
{
   [BypassNGen]
   public void ToJITCompile()
   {
   }
}
Imports System.Runtime

Public Class ExampleClass
    <BypassNGen>
    Public Sub ToJITCompile()
    End Sub
End Class

Példák

Az alábbi parancs létrehoz egy natív lemezképet ClientApp.exeaz aktuális könyvtárban, és telepíti a lemezképet a natív képgyorsítótárba. Ha létezik konfigurációs fájl a szerelvényhez, Ngen.exe használja. Emellett natív rendszerképek jönnek létre minden olyan .dll fájlhoz, amely ClientApp.exe hivatkozik.

ngen install ClientApp.exe

A Ngen.exe telepített rendszerképet gyökérnek is nevezik. A gyökér lehet alkalmazás vagy megosztott összetevő.

Az alábbi parancs létrehoz egy natív képet MyAssembly.exe a megadott elérési úttal.

ngen install c:\myfiles\MyAssembly.exe

A szerelvények és függőségeik keresésekor Ngen.exe ugyanazt a próbai logikát használja, amelyet a közös nyelvi futtatókörnyezet használ. Alapértelmezés szerint a benne található ClientApp.exe könyvtár lesz az alkalmazás alapkönyvtára, és az összes szerelvénypróba ebben a könyvtárban kezdődik. Ezt a viselkedést felülbírálhatja a /AppBase beállítással.

Feljegyzés

Ez a .NET-keretrendszer 1.0-s és 1.1-es verziójának Ngen.exe viselkedésétől való változás, ahol az alkalmazásbázis az aktuális könyvtárra van állítva.

Egy szerelvény függőséget tartalmazhat hivatkozás nélkül, például ha egy .dll fájlt tölt be a Assembly.Load módszerrel. Egy ilyen .dll-fájlhoz létrehozhat natív lemezképet az alkalmazásszerelvény konfigurációs adatainak használatával./ExeConfig Az alábbi parancs létrehoz egy natív rendszerképet MyLib.dll, a konfigurációs információk MyApp.exehasználatához.

ngen install c:\myfiles\MyLib.dll /ExeConfig:c:\myapps\MyApp.exe

Az ilyen módon telepített szerelvények nem lesznek eltávolítva az alkalmazás eltávolításakor.

A függőségek eltávolításához használja ugyanazokat a parancssori beállításokat, amelyeket a telepítéshez használtak. Az alábbi parancs eltávolítja az MyLib.dll előző példából.

ngen uninstall c:\myfiles\MyLib.dll /ExeConfig:c:\myapps\MyApp.exe

Ha natív rendszerképet szeretne létrehozni egy szerelvényhez a globális szerelvény-gyorsítótárban, használja a szerelvény megjelenítendő nevét. Példa:

ngen install "ClientApp, Version=1.0.0.0, Culture=neutral,
  PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL"

NGen.exe minden telepített forgatókönyvhöz külön rendszerképkészletet hoz létre. Az alábbi parancsok például teljes natív lemezképkészletet telepítenek a normál működéshez, egy másik teljes készletet a hibakereséshez, egy harmadikat a profilkészítéshez:

ngen install MyApp.exe
ngen install MyApp.exe /debug
ngen install MyApp.exe /profile

A natív képgyorsítótár megjelenítése

Miután a natív rendszerképek telepítve lettek a gyorsítótárban, Ngen.exe használatával jeleníthetők meg. Az alábbi parancs megjeleníti az összes natív képet a natív képgyorsítótárban.

ngen display

A display művelet először az összes gyökérszerelvényt listázza, majd a számítógépen található összes natív rendszerkép listáját.

A szerelvény egyszerű nevével csak az adott szerelvény adatait jelenítheti meg. Az alábbi parancs megjeleníti az összes natív lemezképet a natív képgyorsítótárban, amely megfelel a részleges névnek MyAssembly, a függőségeknek és az összes olyan gyökérnek, amely függőséget MyAssemblytartalmaz:

ngen display MyAssembly

A megosztott összetevő frissítését követően hasznos tudni, hogy milyen gyökerek függnek a megosztott összetevők szerelvényétől update .

Ha megadja egy szerelvény fájlkiterjesztését, meg kell adnia az elérési utat, vagy végre kell hajtania Ngen.exe a szerelvényt tartalmazó könyvtárból:

ngen display c:\myApps\MyAssembly.exe

Az alábbi parancs az összes natív képet megjeleníti a natív képgyorsítótárban a névvel MyAssembly és az 1.0.0.0-s verzióval.

ngen display "myAssembly, version=1.0.0.0"

Képek frissítése

A rendszerképek általában egy megosztott összetevő frissítése után frissülnek. Az összes olyan natív rendszerkép frissítéséhez, amely módosult, vagy amelyek függőségei megváltoztak, használja a update műveletet argumentumok nélkül.

ngen update

Az összes kép frissítése hosszadalmas folyamat lehet. A natív rendszerkép-szolgáltatás által futtatott frissítéseket a beállítás használatával várólistára helyezheti /queue . A beállítási és telepítési prioritásokról további információt a /queue Native Image Service-ben talál.

ngen update /queue

Képek eltávolítása

Ngen.exe fenntartja a függőségek listáját, így a megosztott összetevők csak akkor lesznek eltávolítva, ha azoktól függő összes szerelvény el lett távolítva. Emellett a megosztott összetevők nem lesznek eltávolítva, ha gyökérként lettek telepítve.

A következő parancs eltávolítja a gyökér ClientApp.exeösszes forgatókönyvét:

ngen uninstall ClientApp

A uninstall művelet adott forgatókönyvek eltávolítására használható. Az alábbi parancs eltávolítja az összes hibakeresési forgatókönyvet a következőhöz ClientApp.exe:

ngen uninstall ClientApp /debug

Feljegyzés

Az eltávolítási /debug forgatókönyvek nem távolítják el azokat a forgatókönyveket, amelyek /profile/debug.

A következő parancs eltávolítja az összes forgatókönyvet a következő egy adott verziójához ClientApp.exe:

ngen uninstall "ClientApp, Version=1.0.0.0"

Az alábbi parancsok "ClientApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL", eltávolítják az adott szerelvény hibakeresési forgatókönyvének összes forgatókönyvét:

ngen uninstall "ClientApp, Version=1.0.0.0, Culture=neutral,
  PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL"
ngen uninstall "ClientApp, Version=1.0.0.0, Culture=neutral,
  PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL" /debug

A művelethez hasonlóan a install bővítmény megadásához Ngen.exe kell végrehajtani a szerelvényt tartalmazó könyvtárból, vagy meg kell adnia egy teljes elérési utat.

A natív képszolgáltatással kapcsolatos példákért lásd : Native Image Service.

Natív rendszerkép-feladat

A natív rendszerkép-feladat olyan Windows-feladat, amely natív képeket hoz létre és tart fenn. A natív rendszerkép-feladat automatikusan létrehozza és visszaigényeli a natív képeket a támogatott forgatókönyvek esetében. Lehetővé teszi továbbá, hogy a telepítők a Ngen.exe (natív képgenerátor) használatával halasztott időpontban natív képeket hozzanak létre és frissítsenek.

A natív rendszerkép-feladat egyszer van regisztrálva a számítógépen támogatott processzorarchitektúrákhoz, hogy lehetővé tegye az egyes architektúráknak szánt alkalmazások fordítását:

Feladat neve 32 bites számítógép 64 bites számítógép
NET-keretrendszer NGEN v4.0.30319 Igen Igen
NET-keretrendszer NGEN v4.0.30319 64 Nem Igen

A natív rendszerkép-feladat .NET-keretrendszer 4.5-ös és újabb verziókban érhető el Windows 8-on vagy újabb verziókban. A Windows korábbi verzióiban a .NET-keretrendszer a natív képszolgáltatást használja.

Tevékenység élettartama

A Windows Feladatütemező általában minden éjjel elindítja a natív rendszerkép-feladatot, amikor a számítógép tétlen. A feladat ellenőrzi az alkalmazástelepítők által várólistára helyezett halasztott munkákat, a késleltetett natív rendszerkép-frissítési kérelmeket és az automatikus rendszerkép-létrehozást. A tevékenység befejezi a befejezetlen munkaelemeket, majd leáll. Ha a számítógép tétlen állapotban marad a feladat futtatása közben, a feladat leáll.

A natív rendszerkép-feladatot manuálisan is elindíthatja a Feladatütemező felhasználói felületén vagy a NGen.exe manuális hívásával. Ha a feladat ezen módszerek valamelyikével indul el, akkor akkor is fut, ha a számítógép már nem tétlen. A manuálisan NGen.exe használatával létrehozott képek prioritást kapnak, hogy kiszámítható viselkedést tegyenek lehetővé az alkalmazástelepítők számára.

Natív képszolgáltatás

A natív képszolgáltatás egy Windows-szolgáltatás, amely natív képeket hoz létre és tart fenn. A natív képszolgáltatás lehetővé teszi a fejlesztő számára, hogy a natív rendszerképek telepítését és frissítését olyan időszakokra halasztsa, amikor a számítógép tétlen.

A natív képszolgáltatást általában egy alkalmazás vagy frissítés telepítőprogramja (telepítője) kezdeményezi. A 3. prioritású műveletek esetében a szolgáltatás tétlenségi idő alatt fut a számítógépen. A szolgáltatás menti az állapotát, és szükség esetén több újraindítást is képes folytatni. Több képfordítás is várólistára állítható.

A szolgáltatás a manuális Ngen.exe parancsot is használja. A manuális parancsok elsőbbséget élveznek a háttértevékenységek felett.

Feljegyzés

Windows Vista rendszeren a natív képszolgáltatás neve "Microsoft.NET-keretrendszer NGEN v2.0.50727_X86" vagy "Microsoft.NET-keretrendszer NGEN v2.0.50727_X64". A Microsoft Windows összes korábbi verziójában a név ".NET futtatókörnyezet-optimalizálási szolgáltatás v2.0.50727_X86" vagy ".NET futtatókörnyezet-optimalizálási szolgáltatás v2.0.50727_X64".

Halasztott műveletek indítása

A telepítés vagy frissítés megkezdése előtt ajánlott szüneteltetni a szolgáltatást. Ez biztosítja, hogy a szolgáltatás ne fut, amíg a telepítő fájlokat másol vagy szerelvényeket helyez el a globális szerelvény-gyorsítótárban. A következő Ngen.exe parancssor szünetelteti a szolgáltatást:

ngen queue pause

Ha az összes halasztott művelet várólistára lett helyezve, a következő parancs lehetővé teszi a szolgáltatás folytatását:

ngen queue continue

Ha el szeretné halasztani a natív képgenerálást egy új alkalmazás telepítésekor vagy megosztott összetevő frissítésekor, használja a /queue beállítást a installupdate műveletekkel. A következő Ngen.exe parancssorok natív rendszerképet telepítenek egy megosztott összetevőhöz, és elvégzik az érintett gyökerek frissítését:

ngen install MyComponent /queue
ngen update /queue

A update művelet az összes érvénytelenített natív lemezképet újragenerálja, nem csak a használt MyComponentképeket.

Ha az alkalmazás több gyökérből áll, szabályozhatja a késleltetett műveletek prioritását. A következő parancsok három gyökér telepítését várják. Assembly1 először telepítve van, anélkül, hogy tétlen időre vár. Assembly2 az inaktív időre való várakozás nélkül is telepítve van, de az 1. prioritású művelet végrehajtása után. Assembly3 akkor van telepítve, ha a szolgáltatás észleli, hogy a számítógép inaktív.

ngen install Assembly1 /queue:1
ngen install Assembly2 /queue:2
ngen install Assembly3 /queue:3

A művelettel executeQueuedItems kényszerítheti az üzenetsoros műveletek szinkron végrehajtását. Ha megadja az opcionális prioritást, ez a művelet csak az azonos vagy alacsonyabb prioritású várólistás műveleteket érinti. Az alapértelmezett prioritás 3, ezért az alábbi Ngen.exe parancs azonnal feldolgozza az összes várólistán lévő műveletet, és nem ad vissza, amíg be nem fejeződnek:

ngen executeQueuedItems

A szinkron parancsokat Ngen.exe hajtja végre, és nem használja a natív képszolgáltatást. Műveleteket hajthat végre Ngen.exe a natív képszolgáltatás futtatása közben.

Szolgáltatás leállítása

Miután egy lehetőséget tartalmazó /queue Ngen.exe parancs végrehajtása indította el, a szolgáltatás a háttérben fut, amíg az összes művelet be nem fejeződik. A szolgáltatás menti az állapotát, hogy szükség esetén több újraindításon is keresztülhaladjon. Amikor a szolgáltatás azt észleli, hogy nincs több üzenetsorba helyezett művelet, visszaállítja az állapotát, hogy a számítógép következő indításakor ne induljon újra, majd leállítsa magát.

Szolgáltatás-interakció ügyfelekkel

.NET-keretrendszer 2.0-s verziójában az egyetlen interakció a natív képszolgáltatással a parancssori eszköz Ngen.exe. A telepítési szkriptekben a parancssori eszközzel várhatja a natív rendszerkép-szolgáltatás műveleteit, és kezelheti a szolgáltatást.

Lásd még