Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Generator obrazów natywnych (Ngen.exe) to narzędzie, które poprawia wydajność zarządzanych aplikacji. Ngen.exe tworzy obrazy natywne, które są plikami zawierającymi skompilowany kod komputera specyficzny dla procesora i instaluje je w natywnej pamięci podręcznej obrazów na komputerze lokalnym. Środowisko uruchomieniowe może używać obrazów natywnych z pamięci podręcznej zamiast kompilatora just in time (JIT) w celu skompilowania oryginalnego zestawu.
Uwaga / Notatka
Ngen.exe kompiluje obrazy natywne dla zestawów przeznaczonych tylko dla platformy .NET Framework. Równoważny generator obrazów natywnych dla platformy .NET Core to CrossGen.
Zmiany Ngen.exe w programie .NET Framework 4:
Ngen.exe teraz kompiluje zestawy z pełnym zaufaniem, a zasady zabezpieczeń dostępu do kodu (CAS) nie są już oceniane.
Obrazy natywne generowane przy użyciu Ngen.exe nie mogą być już ładowane do aplikacji działających w częściowym zaufaniu.
Zmiany Ngen.exe w programie .NET Framework w wersji 2.0:
Zainstalowanie zestawu również instaluje jego zależności, upraszczając składnię Ngen.exe.
Obrazy natywne można teraz udostępniać w różnych domenach aplikacji.
Nowa akcja ,
updateponownie tworzy obrazy, które zostały unieważnione.Akcje można odroczyć do wykonania przez usługę, która używa czasu bezczynności na komputerze do generowania i instalowania obrazów.
Usunięto niektóre przyczyny unieważnienia obrazu.
W systemie Windows 8 zobacz Native Image Task (Zadanie obrazu natywnego).
Aby uzyskać dodatkowe informacje na temat korzystania z Ngen.exe i natywnej usługi obrazów, zobacz Native Image Service.
Uwaga / Notatka
Ngen.exe składni dla wersji 1.0 i 1.1 programu .NET Framework można znaleźć w sekcji Native Image Generator (Ngen.exe) Starsza składnia.
To narzędzie jest instalowane automatycznie z programem Visual Studio. Aby uruchomić narzędzie, użyj wiersza polecenia dla deweloperów programu Visual Studio lub programu Visual Studio Developer PowerShell.
W wierszu polecenia wpisz:
Składnia
ngen action [options]
ngen /? | /help
Czynności
W poniższej tabeli przedstawiono składnię każdego actionelementu . Opisy poszczególnych części elementu actionmożna znaleźć w tabelach Argumenty, Poziomy priorytetów, Scenariusze i Konfiguracje . W tabeli Opcje opisano options przełączniki i pomocy.
| Akcja | Description |
|---|---|
install[assemblyName | assemblyPath] [] [configscenarios] [/queue[:{1||23}]] |
Generowanie obrazów natywnych dla zestawu i jego zależności oraz instalowanie obrazów w natywnej pamięci podręcznej obrazów. Jeśli /queue zostanie określona, akcja zostanie w kolejce dla natywnej usługi obrazów. Domyślny priorytet to 3. Zobacz tabelę Poziomy priorytetów . |
uninstall[] [assemblyNamescenarios | assemblyPath] [] []config |
Usuń obrazy natywne zestawu i jego zależności z natywnej pamięci podręcznej obrazów. Aby odinstalować pojedynczy obraz i jego zależności, użyj tych samych argumentów wiersza polecenia, które zostały użyte do zainstalowania obrazu. Nuta: Począwszy od programu .NET Framework 4, akcja uninstall * nie jest już obsługiwana. |
update [/queue] |
Zaktualizuj obrazy natywne, które stały się nieprawidłowe. Jeśli /queue zostanie określony, aktualizacje są kolejkowane dla natywnej usługi obrazów. Aktualizacje są zawsze zaplanowane według priorytetu 3, więc są uruchamiane, gdy komputer jest bezczynny. |
display [assemblyName | assemblyPath] |
Wyświetl stan obrazów natywnych dla zestawu i jego zależności. Jeśli argument nie zostanie podany, zostanie wyświetlona cała pamięć podręczna obrazu natywnego. |
executeQueuedItems [1|2|3]— lub — eqi [1|2|3] |
Wykonywanie zadań kompilacji w kolejce. Jeśli określono priorytet, zadania kompilacji z większym lub równym priorytetem są wykonywane. Jeśli nie określono priorytetu, wszystkie zadania kompilacji w kolejce są wykonywane. |
queue{pause | | continuestatus} |
Wstrzymaj natywną usługę obrazów, zezwól na kontynuowanie wstrzymanej usługi lub wykonaj zapytanie dotyczące stanu usługi. |
Arguments
| Argument | Description |
|---|---|
assemblyName |
Pełna nazwa wyświetlana zestawu. Na przykład "myAssembly, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5".
Nuta: Możesz podać częściową nazwę zestawu, taką jak myAssembly, dla display akcji i uninstall . Na Ngen.exe wiersza polecenia można określić tylko jeden zestaw. |
assemblyPath |
Jawna ścieżka zestawu. Możesz określić pełną lub względną ścieżkę. Jeśli określisz nazwę pliku bez ścieżki, zestaw musi znajdować się w bieżącym katalogu. Na Ngen.exe wiersza polecenia można określić tylko jeden zestaw. |
Poziomy priorytetów
| Priority | Description |
|---|---|
1 |
Obrazy natywne są generowane i instalowane natychmiast, bez oczekiwania na czas bezczynności. |
2 |
Obrazy natywne są generowane i instalowane bez oczekiwania na czas bezczynności, ale po zakończeniu wszystkich akcji priorytetu 1 (i ich zależności). |
3 |
Obrazy natywne są instalowane, gdy usługa obrazu natywnego wykryje, że komputer jest w stanie bezczynności. Zobacz Natywna usługa obrazów. |
Scenariusze
| Scenario | Description |
|---|---|
/Debug |
Generowanie obrazów natywnych, których można używać w debugerze. |
/Profile |
Generowanie obrazów natywnych, których można używać w profilerze. |
/NoDependencies |
Wygeneruj minimalną liczbę obrazów natywnych wymaganych przez określone opcje scenariusza. |
Config
| Konfiguracja | Description |
|---|---|
/ExeConfig:
exePath
|
Użyj konfiguracji określonego zestawu wykonywalnego. Ngen.exe musi podejmować takie same decyzje jak moduł ładujący podczas wiązania z zależnościami. Gdy składnik udostępniony jest ładowany w czasie wykonywania przy użyciu Load metody, plik konfiguracji aplikacji określa zależności załadowane dla składnika udostępnionego — na przykład wersję załadowanej zależności. Przełącznik /ExeConfig udostępnia Ngen.exe wskazówki dotyczące tego, które zależności będą ładowane w czasie wykonywania. |
/AppBase:
directoryPath
|
Podczas lokalizowania zależności użyj określonego katalogu jako bazy aplikacji. |
Opcje
| Option | Description |
|---|---|
/nologo |
Pomiń wyświetlanie baneru startowego firmy Microsoft. |
/silent |
Pomija wyświetlanie komunikatów o powodzeniu. |
/verbose |
Wyświetl szczegółowe informacje na temat debugowania. |
/help, /? |
Wyświetl składnię polecenia i opcje dla bieżącej wersji. |
Uwagi
Aby uruchomić Ngen.exe, musisz mieć uprawnienia administracyjne.
Ostrzeżenie
Nie uruchamiaj Ngen.exe na zestawach, które nie są w pełni zaufane. Począwszy od programu .NET Framework 4, Ngen.exe kompiluje zestawy z pełnym zaufaniem, a zasady zabezpieczeń dostępu do kodu (CAS) nie są już oceniane.
Począwszy od programu .NET Framework 4, obrazy natywne generowane przy użyciu Ngen.exe nie mogą być już ładowane do aplikacji, które działają w częściowym zaufaniu. Zamiast tego wywoływany jest kompilator just in time (JIT).
Ngen.exe generuje obrazy natywne dla zestawu określonego assemblyname przez argument install akcji i wszystkie jego zależności. Zależności są określane na podstawie odwołań w manifeście zestawu. Jedynym scenariuszem, w którym trzeba zainstalować zależność oddzielnie, jest to, że aplikacja ładuje ją przy użyciu odbicia, na przykład wywołując metodę Assembly.Load .
Ważne
Nie używaj Assembly.LoadFrom metody z obrazami natywnymi. Obraz załadowany przy użyciu tej metody nie może być używany przez inne zestawy w kontekście wykonywania.
Ngen.exe utrzymuje liczbę zależności. Załóżmy na przykład, że MyAssembly.exe obie YourAssembly.exe te elementy są zainstalowane w natywnej pamięci podręcznej obrazów i mają odwołania do OurDependency.dllelementu . Jeśli MyAssembly.exe program zostanie odinstalowany, OurDependency.dll nie zostanie odinstalowany. Jest on usuwany tylko wtedy, gdy YourAssembly.exe jest również odinstalowywane.
Jeśli generujesz obraz natywny dla zestawu w globalnej pamięci podręcznej zestawów, określ jego nazwę wyświetlaną. Zobacz: Assembly.FullName.
Obrazy natywne, które Ngen.exe generują, mogą być współużytkowane w różnych domenach aplikacji. Oznacza to, że można użyć Ngen.exe w scenariuszach aplikacji, które wymagają udostępniania zestawów między domenami aplikacji. Aby określić neutralność domeny:
LoaderOptimizationAttribute Zastosuj atrybut do aplikacji.
AppDomainSetup.LoaderOptimization Ustaw właściwość podczas tworzenia informacji o konfiguracji dla nowej domeny aplikacji.
Zawsze używaj kodu neutralnego dla domeny podczas ładowania tego samego zestawu do wielu domen aplikacji. Jeśli obraz natywny jest ładowany do domeny aplikacji nieudostępnej po załadowaniu do domeny udostępnionej, nie można go użyć.
Uwaga / Notatka
Nie można zwolnić kodu neutralnego pod względem domeny, a wydajność może być nieco niższa, szczególnie w przypadku uzyskiwania dostępu do statycznych elementów członkowskich.
W tej sekcji uwagi:
Generowanie obrazów dla różnych scenariuszy
Po wygenerowaniu obrazu natywnego dla zestawu środowisko uruchomieniowe automatycznie próbuje zlokalizować i użyć tego obrazu natywnego za każdym razem, gdy uruchamia zestaw. W zależności od scenariuszy użycia można wygenerować wiele obrazów.
Jeśli na przykład uruchamiasz zestaw w scenariuszu debugowania lub profilowania, środowisko uruchomieniowe szuka obrazu natywnego wygenerowanego za pomocą /Debug opcji lub /Profile . Jeśli nie można odnaleźć pasującego obrazu natywnego, środowisko uruchomieniowe powróci do standardowej kompilacji JIT. Jedynym sposobem debugowania obrazów natywnych jest utworzenie obrazu natywnego z opcją /Debug .
Akcja uninstall rozpoznaje również scenariusze, dzięki czemu można odinstalować wszystkie scenariusze lub tylko wybrane scenariusze.
Określanie, kiedy używać obrazów natywnych
Obrazy natywne mogą zwiększyć wydajność w dwóch obszarach: ulepszone użycie pamięci i skrócenie czasu uruchamiania.
Uwaga / Notatka
Wydajność obrazów natywnych zależy od wielu czynników, które utrudniają analizę, na przykład wzorce dostępu do kodu i danych, liczbę wywołań w granicach modułu oraz liczbę zależności, które zostały już załadowane przez inne aplikacje. Jedynym sposobem określenia, czy obrazy natywne korzystają z aplikacji, są dokładne pomiary wydajności w kluczowych scenariuszach wdrażania.
Ulepszone użycie pamięci
Obrazy natywne mogą znacznie poprawić użycie pamięci, gdy kod jest współużytkowany między procesami. Obrazy natywne to pliki systemu Windows PE, więc pojedyncza kopia pliku .dll może być współużytkowany przez wiele procesów; Natomiast kod natywny utworzony przez kompilator JIT jest przechowywany w pamięci prywatnej i nie może być udostępniany.
Aplikacje uruchamiane w ramach usług terminalowych mogą również korzystać ze współużytkowanych stron kodu.
Ponadto nie ładuje kompilatora JIT oszczędza stałą ilość pamięci dla każdego wystąpienia aplikacji.
Szybsze uruchamianie aplikacji
Wstępne komplikowanie zestawów przy użyciu Ngen.exe może poprawić czas uruchamiania niektórych aplikacji. Ogólnie rzecz biorąc, zyski można uzyskać, gdy aplikacje współużytkują zestawy składników, ponieważ po uruchomieniu pierwszej aplikacji składniki udostępnione są już ładowane dla kolejnych aplikacji. Zimne uruchamianie, w którym wszystkie zestawy w aplikacji muszą być ładowane z dysku twardego, nie przynosi tyle korzyści z obrazów natywnych, ponieważ czas dostępu do dysku twardego jest w większości.
Twarde powiązanie może mieć wpływ na czas uruchamiania, ponieważ wszystkie obrazy, które są trwale powiązane z głównym zestawem aplikacji, muszą być ładowane w tym samym czasie.
Uwaga / Notatka
Przed programem .NET Framework 3.5 z dodatkiem Service Pack 1 należy umieścić udostępnione składniki o silnych nazwach w globalnej pamięci podręcznej zestawów, ponieważ moduł ładujący przeprowadza dodatkową walidację na zestawach o silnych nazwach, które nie znajdują się w globalnej pamięci podręcznej zestawów, skutecznie eliminując wszelkie ulepszenia czasu uruchamiania uzyskane przy użyciu obrazów natywnych. Optymalizacje wprowadzone w programie .NET Framework 3.5 SP1 usunęły dodatkową walidację.
Podsumowanie zagadnień dotyczących użycia
Poniższe ogólne zagadnienia i zagadnienia dotyczące aplikacji mogą pomóc w podejmowaniu decyzji, czy należy podjąć próbę oceny obrazów natywnych dla aplikacji:
Obrazy natywne ładują się szybciej niż CIL, ponieważ eliminują potrzebę wielu działań uruchamiania, takich jak kompilacja JIT i weryfikacja bezpieczeństwa typu.
Obrazy natywne wymagają mniejszego początkowego zestawu roboczego, ponieważ nie ma potrzeby kompilatora JIT.
Obrazy natywne umożliwiają udostępnianie kodu między procesami.
Obrazy natywne wymagają więcej miejsca na dysku twardym niż zestawy CIL i mogą wymagać znacznego czasu na wygenerowanie.
Obrazy natywne muszą być utrzymywane.
Obrazy muszą być generowane ponownie, gdy oryginalny zestaw lub jeden z jego zależności są obsługiwane.
Jeden zestaw może potrzebować wielu obrazów natywnych do użycia w różnych aplikacjach lub różnych scenariuszach. Na przykład informacje o konfiguracji w dwóch aplikacjach mogą powodować różne decyzje dotyczące powiązania dla tego samego zestawu zależnego.
Obrazy natywne muszą być generowane przez administratora; oznacza to, z konta systemu Windows w grupie Administratorzy.
Oprócz tych ogólnych zagadnień należy wziąć pod uwagę charakter aplikacji podczas określania, czy obrazy natywne mogą zapewnić korzyść w zakresie wydajności:
Jeśli aplikacja działa w środowisku korzystającym z wielu składników udostępnionych, obrazy natywne umożliwiają współdzielenie składników przez wiele procesów.
Jeśli aplikacja używa wielu domen aplikacji, obrazy natywne umożliwiają udostępnianie stron kodu między domenami.
Uwaga / Notatka
W programie .NET Framework w wersji 1.0 i 1.1 obrazy natywne nie mogą być współużytkowane w domenach aplikacji. Nie jest tak w wersji 2.0 lub nowszej.
Jeśli aplikacja zostanie uruchomiona w obszarze Serwer terminali, obrazy natywne umożliwiają udostępnianie stron kodu.
Duże aplikacje zazwyczaj korzystają z kompilacji do obrazów natywnych. Małe aplikacje zazwyczaj nie przynoszą korzyści.
W przypadku długotrwałych aplikacji kompilacja JIT środowiska uruchomieniowego działa nieco lepiej niż obrazy natywne. (Twarde powiązanie może złagodzić tę różnicę wydajności do pewnego stopnia).
Znaczenie adresów bazowych zestawów
Ponieważ obrazy natywne to pliki systemu Windows PE, podlegają tym samym problemom ponownego łączenia co inne pliki wykonywalne. Koszt relokacji wydajności jest jeszcze bardziej wyraźny, jeśli stosuje się twarde powiązanie.
Aby ustawić adres podstawowy dla obrazu natywnego, użyj odpowiedniej opcji kompilatora, aby ustawić adres podstawowy zestawu. Ngen.exe używa tego adresu podstawowego dla obrazu natywnego.
Uwaga / Notatka
Obrazy natywne są większe niż zarządzane zestawy, z których zostały utworzone. Adresy podstawowe muszą być obliczane, aby umożliwić korzystanie z tych większych rozmiarów.
Aby wyświetlić preferowany adres podstawowy obrazu natywnego, można użyć narzędzia takiego jak dumpbin.exe.
Twarde powiązanie
Twarde powiązanie zwiększa przepływność i zmniejsza rozmiar zestawu roboczego dla obrazów natywnych. Wadą twardego powiązania jest to, że wszystkie obrazy, które są trwale powiązane z zestawem, muszą zostać załadowane po załadowaniu zestawu. Może to znacznie zwiększyć czas uruchamiania dużej aplikacji.
Twarde powiązanie jest odpowiednie dla zależności, które są ładowane we wszystkich scenariuszach o znaczeniu krytycznym dla wydajności aplikacji. Podobnie jak w przypadku każdego aspektu użycia obrazu natywnego, dokładne pomiary wydajności są jedynym sposobem ustalenia, czy twarde powiązanie poprawia wydajność aplikacji.
Atrybuty DependencyAttribute i DefaultDependencyAttribute umożliwiają podanie wskazówek dotyczących twardych powiązań w celu Ngen.exe.
Uwaga / Notatka
Te atrybuty to wskazówki dotyczące Ngen.exe, a nie poleceń. Korzystanie z nich nie gwarantuje twardego powiązania. Znaczenie tych atrybutów może ulec zmianie w przyszłych wersjach.
Określanie wskazówki dotyczącej powiązania dla zależności
Zastosuj element DependencyAttribute do zestawu, aby wskazać prawdopodobieństwo załadowania określonej zależności. LoadHint.Always wskazuje, że twarde powiązanie jest odpowiednie, Default wskazuje, że należy użyć wartości domyślnej dla zależności i Sometimes wskazuje, że twarde powiązanie nie jest odpowiednie.
Poniższy kod przedstawia atrybuty zestawu, który ma dwie zależności. Pierwsza zależność (Assembly1) jest odpowiednim kandydatem do twardego powiązania, a druga (Assembly2) nie.
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)];
Nazwa zestawu nie zawiera rozszerzenia nazwy pliku. Nazwy wyświetlane mogą być używane.
Określanie domyślnej wskazówki powiązania dla zestawu
Domyślne wskazówki dotyczące powiązań są potrzebne tylko dla zestawów, które będą używane natychmiast i często przez dowolną aplikację, która ma na nich zależność. DefaultDependencyAttribute Zastosuj element with LoadHint.Always do takich zestawów, aby określić, że należy użyć twardego powiązania.
Uwaga / Notatka
Nie ma powodu, aby zastosować DefaultDependencyAttribute zestawy .dll, które nie należą do tej kategorii, ponieważ zastosowanie atrybutu z dowolną wartością inną niż LoadHint.Always ma taki sam efekt, jak nie stosowanie atrybutu w ogóle.
Firma Microsoft używa DefaultDependencyAttribute elementu , aby określić, że twarde powiązanie jest ustawieniem domyślnym dla bardzo małej liczby zestawów w programie .NET Framework, takich jak mscorlib.dll.
Przetwarzanie odroczone
Generowanie obrazów natywnych dla bardzo dużej aplikacji może zająć dużo czasu. Podobnie zmiany w składniku udostępnionym lub zmiany ustawień komputera mogą wymagać zaktualizowania wielu obrazów natywnych. Akcje install i update mają /queue opcję kolejkowania operacji odroczonego wykonywania przez natywną usługę obrazów. Ponadto Ngen.exe ma queue akcje i executeQueuedItems , które zapewniają pewną kontrolę nad usługą. Aby uzyskać więcej informacji, zobacz Natywna usługa obrazów.
Obrazy natywne i kompilacja JIT
Jeśli Ngen.exe napotka jakiekolwiek metody w zestawie, którego nie może wygenerować, wyklucza je z obrazu natywnego. Gdy środowisko uruchomieniowe wykonuje ten zestaw, przywraca kompilację JIT dla metod, które nie zostały uwzględnione w obrazie natywnym.
Ponadto obrazy natywne nie są używane, jeśli zestaw został uaktualniony lub jeśli obraz został unieważniony z jakiegokolwiek powodu.
Nieprawidłowe obrazy
Jeśli używasz Ngen.exe do utworzenia obrazu natywnego zestawu, dane wyjściowe zależą od opcji wiersza polecenia określonych i niektórych ustawień na komputerze. Te ustawienia obejmują następujące ustawienia:
Wersja programu .NET Framework.
Dokładna tożsamość zestawu (ponowna kompilacja zmienia tożsamość).
Dokładna tożsamość wszystkich zestawów, do których odwołuje się zestaw (ponowne komplikowanie zmienia tożsamość).
Czynniki bezpieczeństwa.
Ngen.exe rejestruje te informacje podczas generowania obrazu natywnego. Podczas wykonywania zestawu środowisko uruchomieniowe wyszukuje obraz natywny wygenerowany z opcjami i ustawieniami zgodnymi z bieżącym środowiskiem komputera. Środowisko uruchomieniowe przywraca kompilację zestawu JIT, jeśli nie może znaleźć pasującego obrazu natywnego. Następujące zmiany w ustawieniach komputera i środowisku powodują, że obrazy natywne stają się nieprawidłowe:
Wersja programu .NET Framework.
Jeśli zastosujesz aktualizację do programu .NET Framework, wszystkie obrazy natywne utworzone przy użyciu Ngen.exe staną się nieprawidłowe. Z tego powodu wszystkie aktualizacje programu .NET Framework wykonują
Ngen Updatepolecenie, aby upewnić się, że wszystkie obrazy natywne są generowane ponownie. Program .NET Framework automatycznie tworzy nowe obrazy natywne dla zainstalowanych bibliotek programu .NET Framework.Dokładna tożsamość zestawu.
Jeśli ponownie skompilujesz zestaw, odpowiedni obraz macierzysty zestawu stanie się nieprawidłowy.
Dokładna tożsamość wszystkich zestawów, do których odwołuje się zestaw.
Jeśli zaktualizujesz zestaw zarządzany, wszystkie obrazy natywne, które bezpośrednio lub pośrednio zależą od tego zestawu, staną się nieprawidłowe i muszą zostać ponownie wygenerowane. Obejmuje to zarówno zwykłe odwołania, jak i twarde zależności. Za każdym razem, gdy zostanie zastosowana aktualizacja oprogramowania, program instalacyjny powinien wykonać
Ngen Updatepolecenie, aby upewnić się, że wszystkie zależne obrazy natywne są ponownie generowane.Czynniki bezpieczeństwa.
Zmiana zasad zabezpieczeń maszyny w celu ograniczenia uprawnień przyznanych wcześniej zestawowi może spowodować, że wcześniej skompilowany obraz natywny dla tego zestawu stanie się nieprawidłowy.
Aby uzyskać szczegółowe informacje na temat sposobu administrowania zabezpieczeniami dostępu do kodu i sposobu używania przez środowisko uruchomieniowe języka wspólnego, zobacz Zabezpieczenia dostępu kodu.
Rozwiązywanie problemów
Poniższe tematy rozwiązywania problemów umożliwiają sprawdzenie, które obrazy natywne są używane i których nie można używać przez aplikację, aby określić, kiedy kompilator JIT rozpoczyna kompilowanie metody i pokazuje, jak zrezygnować z natywnej kompilacji obrazów określonych metod.
Podgląd dziennika powiązań zestawów
Aby potwierdzić, że obrazy natywne są używane przez aplikację, możesz użyć Fuslogvw.exe (Podgląd dziennika powiązań zestawów). Wybierz pozycję Obrazy natywne w polu Kategorie dzienników w oknie podglądu dziennika powiązań. Fuslogvw.exe zawiera informacje o tym, dlaczego obraz natywny został odrzucony.
Asystent debugowania zarządzanego JITCompilationStart
Możesz użyć narzędzia jitCompilationStart zarządzanego asystenta debugowania (MDA), aby określić, kiedy kompilator JIT rozpoczyna kompilowanie funkcji.
Rezygnacja z generowania obrazów natywnych
W niektórych przypadkach NGen.exe mogą mieć trudności z generowaniem obrazu natywnego dla określonej metody lub wolisz, że metoda jest kompilowana JIT, a nie kompilowana do obrazu natywnego. W takim przypadku można użyć atrybutu System.Runtime.BypassNGenAttribute , aby uniemożliwić NGen.exe generowanie obrazu natywnego dla określonej metody. Atrybut musi być stosowany indywidualnie do każdej metody, której kod nie ma być dołączany do obrazu natywnego. NGen.exe rozpoznaje atrybut i nie generuje kodu na obrazie natywnym dla odpowiedniej metody.
Należy jednak pamiętać, że BypassNGenAttribute nie jest on zdefiniowany jako typ w bibliotece klas programu .NET Framework. Aby móc korzystać z atrybutu w kodzie, należy najpierw zdefiniować go w następujący sposób:
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
Następnie można zastosować atrybut dla poszczególnych metod. Poniższy przykład instruuje generator obrazów natywnych, że nie powinien wygenerować obrazu natywnego dla ExampleClass.ToJITCompile metody .
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
Przykłady
Następujące polecenie generuje obraz natywny dla ClientApp.exeprogramu , znajdujący się w bieżącym katalogu i instaluje obraz w natywnej pamięci podręcznej obrazów. Jeśli plik konfiguracji istnieje dla zestawu, Ngen.exe go używa. Ponadto obrazy natywne są generowane dla wszystkich plików .dll, które ClientApp.exe się odwołują.
ngen install ClientApp.exe
Obraz zainstalowany z Ngen.exe jest również nazywany katalogiem głównym. Katalog główny może być aplikacją lub składnikiem udostępnionym.
Następujące polecenie generuje obraz natywny dla MyAssembly.exe elementu z określoną ścieżką.
ngen install c:\myfiles\MyAssembly.exe
Podczas lokalizowania zestawów i ich zależności Ngen.exe używa tej samej logiki sondowania używanej przez środowisko uruchomieniowe języka wspólnego. Domyślnie katalog zawierający ClientApp.exe jest używany jako katalog podstawowy aplikacji, a wszystkie sondowanie zestawów rozpoczyna się w tym katalogu. To zachowanie można zastąpić przy użyciu /AppBase opcji .
Uwaga / Notatka
Jest to zmiana zachowania Ngen.exe w programach .NET Framework w wersji 1.0 i 1.1, gdzie baza aplikacji jest ustawiona na bieżący katalog.
Zestaw może mieć zależność bez odwołania, na przykład jeśli ładuje plik .dll przy użyciu Assembly.Load metody . Obraz natywny dla takiego pliku .dll można utworzyć przy użyciu informacji o konfiguracji dla zestawu aplikacji z opcją /ExeConfig . Następujące polecenie generuje obraz macierzysty na potrzeby MyLib.dll używania informacji o konfiguracji z programu MyApp.exe.
ngen install c:\myfiles\MyLib.dll /ExeConfig:c:\myapps\MyApp.exe
Zestawy zainstalowane w ten sposób nie są usuwane po usunięciu aplikacji.
Aby odinstalować zależność, użyj tych samych opcji wiersza polecenia, które zostały użyte do jej zainstalowania. Następujące polecenie powoduje odinstalowanie elementu MyLib.dll z poprzedniego przykładu.
ngen uninstall c:\myfiles\MyLib.dll /ExeConfig:c:\myapps\MyApp.exe
Aby utworzyć obraz natywny dla zestawu w globalnej pamięci podręcznej zestawów, użyj nazwy wyświetlanej zestawu. Przykład:
ngen install "ClientApp, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL"
NGen.exe generuje oddzielny zestaw obrazów dla każdego instalowanego scenariusza. Na przykład następujące polecenia instalują kompletny zestaw obrazów natywnych dla normalnego działania, inny kompletny zestaw do debugowania i trzeci do profilowania:
ngen install MyApp.exe
ngen install MyApp.exe /debug
ngen install MyApp.exe /profile
Wyświetlanie natywnej pamięci podręcznej obrazów
Po zainstalowaniu obrazów natywnych w pamięci podręcznej można je wyświetlić przy użyciu Ngen.exe. Poniższe polecenie wyświetla wszystkie obrazy natywne w natywnej pamięci podręcznej obrazów.
ngen display
Akcja display najpierw wyświetla listę wszystkich zestawów głównych, a następnie listę wszystkich obrazów natywnych na komputerze.
Użyj prostej nazwy zestawu, aby wyświetlić informacje tylko dla tego zestawu. Następujące polecenie wyświetla wszystkie obrazy natywne w pamięci podręcznej obrazów natywnych, które pasują do częściowej nazwy MyAssembly, ich zależności i wszystkich katalogów głównych, które mają zależność od MyAssembly:
ngen display MyAssembly
Znajomość elementów głównych zależy od współużytkowanego zestawu składników jest przydatna w ocenie wpływu update akcji po uaktualnieniu składnika udostępnionego.
Jeśli określisz rozszerzenie pliku zestawu, musisz określić ścieżkę lub wykonać Ngen.exe z katalogu zawierającego zestaw:
ngen display c:\myApps\MyAssembly.exe
Poniższe polecenie wyświetla wszystkie obrazy natywne w pamięci podręcznej obrazów natywnych o nazwie MyAssembly i wersji 1.0.0.0.
ngen display "myAssembly, version=1.0.0.0"
Aktualizowanie obrazów
Obrazy są zwykle aktualizowane po uaktualnieniu składnika udostępnionego. Aby zaktualizować wszystkie obrazy natywne, które uległy zmianie lub których zależności uległy zmianie, użyj update akcji bez argumentów.
ngen update
Aktualizowanie wszystkich obrazów może być długotrwałym procesem. Aktualizacje do wykonania można kolejkować za pomocą natywnej usługi obrazów /queue przy użyciu opcji . Aby uzyskać więcej informacji na /queue temat opcji i priorytetów instalacji, zobacz Native Image Service (Usługa obrazów natywnych).
ngen update /queue
Odinstalowywanie obrazów
Ngen.exe utrzymuje listę zależności, dzięki czemu współużytkowane składniki są usuwane tylko wtedy, gdy wszystkie zestawy, które są od nich zależne, zostały usunięte. Ponadto składnik udostępniony nie jest usuwany, jeśli został zainstalowany jako główny.
Następujące polecenie odinstalowuje wszystkie scenariusze katalogu głównego ClientApp.exe:
ngen uninstall ClientApp
Akcja uninstall może służyć do usuwania określonych scenariuszy. Następujące polecenie powoduje odinstalowanie wszystkich scenariuszy debugowania dla programu ClientApp.exe:
ngen uninstall ClientApp /debug
Uwaga / Notatka
Odinstalowywanie /debug scenariuszy nie powoduje odinstalowania scenariusza obejmującego zarówno scenariusz, jak /profile i /debug.
Następujące polecenie powoduje odinstalowanie wszystkich scenariuszy dla określonej wersji programu ClientApp.exe:
ngen uninstall "ClientApp, Version=1.0.0.0"
Następujące polecenia odinstalowują wszystkie scenariusze dla "ClientApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL"programu lub tylko scenariusz debugowania dla tego zestawu:
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
Podobnie jak w przypadku install akcji, podanie rozszerzenia wymaga wykonania Ngen.exe z katalogu zawierającego zestaw lub określenia pełnej ścieżki.
Przykłady dotyczące natywnej usługi obrazów można znaleźć w temacie Native Image Service (Usługa obrazów natywnych).
Zadanie obrazu natywnego
Zadanie obrazu natywnego to zadanie systemu Windows, które generuje i utrzymuje obrazy natywne. Zadanie obrazu natywnego generuje i odzyskuje obrazy natywne automatycznie w obsługiwanych scenariuszach. Umożliwia również instalatorom używanie Ngen.exe (generatora obrazów natywnych) do tworzenia i aktualizowania obrazów natywnych w czasie odroczonym.
Zadanie obrazu natywnego jest rejestrowane raz dla każdej architektury procesora CPU obsługiwanej na komputerze, aby umożliwić kompilację aplikacji przeznaczonych dla każdej architektury:
| Nazwa zadania | Komputer 32-bitowy | Komputer 64-bitowy |
|---|---|---|
| NET Framework NGEN v4.0.30319 | Tak | Tak |
| NET Framework NGEN v4.0.30319 64 | Nie. | Tak |
Zadanie obrazu natywnego jest dostępne w programie .NET Framework 4.5 lub nowszym w przypadku uruchamiania w systemie Windows 8 lub nowszym. We wcześniejszych wersjach systemu Windows program .NET Framework używa natywnej usługi obrazów.
Okres istnienia zadania
Ogólnie rzecz biorąc, harmonogram zadań systemu Windows uruchamia zadanie obrazu natywnego każdej nocy, gdy komputer jest w stanie bezczynności. Zadanie sprawdza wszelkie odroczone prace, które są kolejkowane przez instalatory aplikacji, wszelkie odroczone żądania aktualizacji obrazów natywnych i wszelkie automatyczne tworzenie obrazów. Zadanie wykonuje zaległe elementy robocze, a następnie zamyka je. Jeśli komputer przestanie być w stanie bezczynności podczas uruchamiania zadania, zadanie zostanie zatrzymane.
Możesz również ręcznie uruchomić zadanie obrazu natywnego za pomocą interfejsu użytkownika harmonogramu zadań lub ręcznie wywołań do NGen.exe. Jeśli zadanie zostanie uruchomione za pomocą jednej z tych metod, będzie ono nadal działać, gdy komputer nie jest już bezczynny. Obrazy tworzone ręcznie przy użyciu NGen.exe mają priorytet, aby umożliwić przewidywalne zachowanie instalatorów aplikacji.
Natywna usługa obrazów
Natywna usługa obrazów to usługa systemu Windows, która generuje i utrzymuje obrazy natywne. Natywna usługa obrazów umożliwia deweloperowi odroczenie instalacji i aktualizacji obrazów natywnych w okresach bezczynności komputera.
Zwykle usługa obrazu natywnego jest inicjowana przez program instalacyjny (instalator) dla aplikacji lub aktualizacji. W przypadku akcji priorytet 3 usługa jest wykonywana w czasie bezczynności na komputerze. Usługa zapisuje swój stan i jest w stanie kontynuować wiele ponownych uruchomień w razie potrzeby. Można kolejkować wiele kompilacji obrazów.
Usługa współdziała również z ręcznym poleceniem Ngen.exe. Polecenia ręczne mają pierwszeństwo przed działaniem w tle.
Uwaga / Notatka
W systemie Windows Vista nazwa wyświetlana dla usługi obrazu natywnego to "Microsoft.NET Framework NGEN v2.0.50727_X86" lub "Microsoft.NET Framework NGEN v2.0.50727_X64". We wszystkich wcześniejszych wersjach systemu Microsoft Windows nazwa to ".NET Runtime Optimization Service v2.0.50727_X86" lub ".NET Runtime Optimization Service v2.0.50727_X64".
Uruchamianie operacji odroczonych
Przed rozpoczęciem instalacji lub uaktualnienia zaleca się wstrzymanie usługi. Dzięki temu usługa nie jest wykonywana, gdy instalator kopiuje pliki lub umieszcza zestawy w globalnej pamięci podręcznej zestawów. Następujące Ngen.exe wiersza polecenia wstrzymuje usługę:
ngen queue pause
Po utworzeniu kolejki wszystkich odroczonych operacji następujące polecenie umożliwia wznowienie działania usługi:
ngen queue continue
Aby odroczyć generowanie obrazu natywnego podczas instalowania nowej aplikacji lub podczas aktualizowania składnika udostępnionego, użyj /queue opcji z akcjami install lub update . Następujące Ngen.exe wiersza polecenia instalują obraz macierzysty dla udostępnionego składnika i wykonują aktualizację wszystkich katalogów głównych, które mogły mieć wpływ:
ngen install MyComponent /queue
ngen update /queue
Akcja update ponownie generuje wszystkie obrazy natywne, które zostały unieważnione, a nie tylko te, które używają elementu MyComponent.
Jeśli aplikacja składa się z wielu elementów głównych, możesz kontrolować priorytet odroczonych akcji. Następujące polecenia kolejki instalacji trzech katalogów głównych.
Assembly1 program jest instalowany jako pierwszy, bez oczekiwania na czas bezczynności.
Assembly2 program jest również instalowany bez oczekiwania na czas bezczynności, ale po zakończeniu wszystkich akcji priorytetu 1.
Assembly3 program jest instalowany, gdy usługa wykryje, że komputer jest w stanie bezczynności.
ngen install Assembly1 /queue:1
ngen install Assembly2 /queue:2
ngen install Assembly3 /queue:3
Akcje w kolejce można wymusić synchronicznie za pomocą executeQueuedItems akcji. Jeśli podasz opcjonalny priorytet, ta akcja ma wpływ tylko na akcje w kolejce, które mają równy lub niższy priorytet. Domyślny priorytet to 3, więc następujące polecenie Ngen.exe przetwarza wszystkie akcje w kolejce natychmiast i nie zwraca się do momentu ich zakończenia:
ngen executeQueuedItems
Polecenia synchroniczne są wykonywane przez Ngen.exe i nie używają natywnej usługi obrazów. Akcje można wykonywać przy użyciu Ngen.exe, gdy usługa obrazu natywnego jest uruchomiona.
Zamykanie usługi
Po zainicjowaniu przez wykonanie polecenia Ngen.exe zawierającego /queue opcję usługa jest uruchamiana w tle do momentu ukończenia wszystkich akcji. Usługa zapisuje swój stan, aby w razie potrzeby można było kontynuować wiele ponownych uruchomień. Gdy usługa wykryje, że nie ma więcej akcji w kolejce, resetuje jego stan, aby nie uruchamiał się ponownie przy następnym uruchomieniu komputera, a następnie zamyka się.
Interakcja z usługą z klientami
W programie .NET Framework w wersji 2.0 jedyną interakcją z natywną usługą obrazu jest użycie narzędzia wiersza polecenia Ngen.exe. Użyj narzędzia wiersza polecenia w skryptach instalacji, aby kolejkować akcje dla natywnej usługi obrazów i wchodzić w interakcje z usługą.