Ngen.exe (Generator obrazu natywnego)

Generator obrazów natywnych (Ngen.exe) jest narzędziem, które poprawia wydajność zarządzanych aplikacji. Program Ngen.exe tworzy obrazy natywne, które są plikami zawierającymi skompilowany kod maszynowy specyficzny dla procesora, i instaluje je w pamięci podręcznej obrazów natywnych na komputerze lokalnym. Środowisko uruchomieniowe może używać obrazów natywnych z tej pamięci podręcznej, zamiast używać kompilatora JIT (Just-In-Time) w celu skompilowania oryginalnego zestawu.

Uwaga

Ngen.exe kompiluje obrazy natywne dla zestawów przeznaczonych tylko dla .NET Framework. Odpowiednikiem generatora obrazów natywnych dla platformy .NET Core jest CrossGen.

Zmiany Ngen.exe w .NET Framework 4:

  • Program Ngen.exe obecnie kompiluje zestawy w trybie pełnego zaufania, a zasady zabezpieczeń dostępu kodu (CAS) nie są już uwzględniane.

  • Obrazy natywne generowane przez program Ngen.exe nie mogą już być ładowane do aplikacji, które działają w trybie częściowego zaufania.

Zmiany w programie Ngen.exe wprowadzone w programie .NET Framework w wersji 2.0:

  • Instalacja zestawu powoduje także instalację jego zależności, co upraszcza składnię programu Ngen.exe.

  • Obrazy natywne mogą być współużytkowane w różnych domenach aplikacji.

  • Nowa akcja , updateponownie tworzy obrazy, które zostały unieważnione.

  • Akcje mogą być odraczane w celu wykonania przez usługę, która korzysta z czasu bezczynności komputera, aby generować i instalować obrazy.

  • Niektóre przyczyny unieważnienia obrazu zostały wyeliminowane.

W 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

Ngen.exe składni dla wersji 1.0 i 1.1 .NET Framework można znaleźć w starszej składni generatora obrazów natywnych (Ngen.exe).

To narzędzie jest instalowane automatycznie z programem Visual Studio. Aby uruchomić to narzędzie, użyj wiersza polecenia dla deweloperów programu Visual Studio lub programu Visual Studio Developer PowerShell.

W wierszu polecenia wpisz następujące polecenie:

Składnia

ngen action [options]
ngen /? | /help

Akcje

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 Config . W tabeli Options opisano options przełączniki i pomoc.

Akcja Opis
install [assemblyName | assemblyPath] [scenarios] [config] [/queue[:{1|2|3}]] Generuje obrazy natywne dla zestawu i jego zależności, a także instaluje obrazy w pamięci podręcznej obrazów natywnych.

Jeśli /queue zostanie określona, akcja zostanie w kolejce dla natywnej usługi obrazów. Domyślnym priorytetem jest 3. Zobacz tabelę Poziomy priorytetów .
uninstall [assemblyName | assemblyPath] [scenarios] [config] Usuwa obrazy natywne zestawu i jego zależności z pamięci podręcznej obrazów natywnych.

Aby odinstalować pojedynczy obraz i jego zależności, należy użyć tych samych argumentów wiersza polecenia, które zostały użyte podczas instalacji obrazu. Uwaga: Począwszy od .NET Framework 4, akcja uninstall * nie jest już obsługiwana.
update [/queue] Aktualizuje 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 planowane z priorytetem 3, więc są uruchamiane, gdy komputer znajduje się w stanie bezczynności.
display [assemblyName | assemblyPath] Wyświetla stan obrazów natywnych dla zestawu i jego zależności.

Jeśli nie zostaną dostarczone argumenty, będą wyświetlane wszystkie dane z pamięci podręcznej obrazów natywnych.
executeQueuedItems [1|2|3]

-lub-

eqi [1|2|3]
Wykonuje umieszczone w kolejce zadania kompilacji.

Jeśli określono priorytet, wykonywane są zadania kompilacji z większym lub równym priorytetem. Jeśli nie określono priorytetu, wykonywane są wszystkie skolejkowane zadania kompilacji.
queue {pause | continue | status} Wstrzymuje usługę obrazów natywnych, zezwala wstrzymanej usłudze na kontynuowanie działania lub bada stan usługi.

Argumenty

Argument Opis
assemblyName Pełna nazwa wyświetlana zestawu. Na przykład "myAssembly, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5". Uwaga: Możesz podać częściową nazwę zestawu, taką jak myAssembly, dla display akcji i uninstall .

W jednym wierszu polecenia programu Ngen.exe można określić tylko jeden zestaw.
assemblyPath Jawna ścieżka zestawu. Można określić pełną lub względną ścieżkę.

Jeśli użytkownik określi nazwę pliku bez ścieżki, zestaw musi znajdować się w bieżącym katalogu.

W jednym wierszu polecenia programu Ngen.exe można określić tylko jeden zestaw.

Poziomy priorytetów

Priorytet Opis
1 Obrazy natywne są generowane i instalowane natychmiast, bez czekania na okres bezczynności.
2 Obrazy natywne są generowane i instalowane bez czekania na okres bezczynności, ale po zakończeniu wszystkich akcji z priorytetem 1 (i ich zależności).
3 Obrazy natywne są instalowane, gdy usługa obrazów natywnych wykryje, że komputer jest w stanie bezczynności. Zobacz Usługa obrazów natywnych.

Scenariusze

Scenariusz Opis
/Debug Generuje obrazy natywne, których można używać w debugerze.
/Profile Generuje obrazy natywne, które mogą być używane w profilerze.
/NoDependencies Generuje minimalną liczbę obrazów natywnych wymaganą przez opcje określonego scenariusza.

Config

Konfiguracja Opis
/ExeConfig: exePath Używa konfiguracji określonego zestawu wykonywalnego.

Program Ngen.exe musi podjąć te same decyzje, co moduł ładowania podczas tworzenia powiązania z zależnościami. Po załadowaniu współużytkowanego składnika w czasie wykonywania przy użyciu Load metody plik konfiguracji aplikacji określa zależności ładowane dla składnika udostępnionego — na przykład wersję załadowanej zależności. Przełącznik /ExeConfig zapewnia 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 należy użyć określonego katalogu jako podstawy aplikacji.

Opcje

Opcja Opis
/nologo Pomija wyświetlanie transparentu startowego firmy Microsoft.
/silent Pomija wyświetlanie komunikatów o sukcesie.
/verbose Wyświetla szczegółowe informacje na potrzeby debugowania.
/help, /? Wyświetla składnię polecenia i opcje dla aktualnego wydania.

Uwagi

Użytkownik musi mieć uprawnienia administracyjne, aby uruchomić program Ngen.exe.

Przestroga

Nie należy uruchamiać programu Ngen.exe dla zestawów, które nie są w pełni zaufane. Począwszy od .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 .NET Framework 4, obrazy natywne generowane przy użyciu Ngen.exe nie mogą być już ładowane do aplikacji, które działają w częściowej relacji zaufania. Zamiast tego wywoływany jest kompilator JIT (Just-In-Time).

Ngen.exe generuje obrazy natywne dla zestawu określonego assemblyname przez argument do install akcji i wszystkich jego zależności. Zależności są ustalane na podstawie odwołań w manifeście zestawu. Jedynym scenariuszem, w którym trzeba zainstalować zależność oddzielnie, jest to, gdy aplikacja ładuje ją przy użyciu odbicia, na przykład przez wywołanie Assembly.Load metody .

Ważne

Nie należy używać Assembly.LoadFrom metody z obrazami natywnymi. Obraz załadowany za pomocą tej metody nie może być używany przez inne zestawy w kontekście wykonywania.

Program Ngen.exe utrzymuje licznik 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 jest generowany obraz natywny dla zestawu przechowywanego w globalnej pamięci podręcznej zestawów, należy określić jego nazwę wyświetlaną. Zobacz: Assembly.FullName.

Obrazy natywne, które generuje program Ngen.exe, mogą być współużytkowane w różnych domenach aplikacji. Oznacza to, że można używać programu Ngen.exe w scenariuszach aplikacji, które wymagają współużytkowania zestawów w różnych domenach aplikacji. Aby określić neutralność domeny:

Zawsze należy używać kodu neutralnego względem domeny podczas ładowania jego zestawu do wielu domen aplikacji. Jeśli obraz natywny zostanie załadowany do niewspółużytkowanej domeny aplikacji po załadowaniu do domeny współużytkowanej, nie będzie można go użyć.

Uwaga

Kod neutralny względem domeny nie może zostać zwolniony i 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 generować wiele obrazów.

Jeśli na przykład uruchamiasz zestaw w scenariuszu debugowania lub profilowania, środowisko uruchomieniowe szuka obrazu natywnego wygenerowanego przy użyciu /Debug opcji lub /Profile . Jeśli nie można odnaleźć pasującego obrazu natywnego, środowisko uruchomieniowe przywraca standardową kompilację 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 zapewniają poprawę wydajności w dwóch obszarach: ulepszone wykorzystanie pamięci i skrócenie czasu uruchamiania.

Uwaga

Wydajność obrazów natywnych zależy od kilku czynników, które utrudniają analizę, takich jak wzorce dostępu kodu i danych, liczba wywołań, jakie miały miejsce między granicami modułów, a także liczba zależności, które zostały już załadowane przez inne aplikacje. Jedynym sposobem ustalenia, czy obrazy natywne przynoszą korzyść aplikacji, są dokładne pomiary wydajności w kluczowych scenariuszach wdrażania.

Ulepszone użycie pamięci

Obrazy natywne mogą znacznie poprawić wykorzystanie pamięci, gdy kod jest współużytkowany w różnych procesach. Obrazy natywne są plikami środowiska Windows PE, więc pojedyncza kopia pliku dll może być współużytkowana przez wiele procesów, natomiast kod natywny wytworzony przez kompilator JIT jest przechowywany w pamięci prywatnej i nie może być współużytkowany.

Aplikacje uruchamiane w ramach usług terminalowych również mogą korzystać z udostępnionych stron kodowych.

Ponadto rezygnacja z ładowania kompilatora JIT umożliwia oszczędzenie określonej ilości pamięci dla każdego wystąpienia aplikacji.

Szybsze uruchamianie aplikacji

Wstępna kompilacja zestawów przy użyciu programu Ngen.exe może poprawić czas uruchamiania niektórych aplikacji. Ogólnie rzecz biorąc, współużytkowanie zestawów składnika przez aplikacje przynosi zyski, ponieważ po uruchomieniu pierwszej aplikacji składniki współużytkowane są już załadowane dla kolejnych aplikacji. Podczas zimnego uruchamiania nie występują takie zyski z wykorzystania obrazów natywnych, ponieważ każdy zestaw aplikacji musi zostać załadowany z dysku twardego, przez co czas dostępu do dysku twardego przeważa zyski ze współużytkowania.

Trwałe powiązania mogą wpływać na czas uruchamiania, ponieważ wszystkie obrazy trwale powiązane z głównym zestawem aplikacji muszą zostać załadowane w tym samym czasie.

Uwaga

Przed .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 wykonuje 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 .NET Framework 3.5 SP1 usunęły dodatkową walidację.

Podsumowanie zagadnień dotyczących użycia

Następujące zagadnienia ogólne i dotyczące aplikacji mogą pomóc zadecydować, czy warto używać obrazów natywnych dla swojej aplikacji:

  • Obrazy natywne są ładowane szybciej niż pliki MSIL, ponieważ eliminują potrzebę wykonywania wielu działań podczas uruchamiania, takich jak kompilacja JIT i weryfikacja bezpieczeństwa typów.

  • Obrazy natywne wymagają mniejszego początkowego zestawu roboczego, ponieważ nie ma potrzeby wczytywania kompilatora JIT.

  • Obrazy natywne umożliwiają współużytkowanie kodu przez różne procesy.

  • Obrazy natywne wymagają więcej miejsca na dysku twardym niż zestawy MSIL, a ich generowanie może długo trwać.

  • Obrazy natywne muszą być obsługiwane.

    • Obrazy muszą być generowane ponownie, gdy oryginalny zestaw lub jedna z jego zależności jest zmieniana.

    • Pojedynczy zestaw może wymagać wielu obrazów natywnych, aby można było używać go w różnych aplikacjach lub scenariuszach. Na przykład informacje o konfiguracji w dwóch aplikacjach mogą powodować różne decyzje dotyczące powiązań dla tego samego zestawu zależnego.

    • Obrazy natywne muszą być generowane przez administratora, czyli za pomocą konta systemu Windows z grupy Administratorzy.

Podczas określania, czy obrazy natywne mogą spowodować poprawę wydajności, oprócz tych ogólnych zagadnień, należy też rozważyć naturę aplikacji.

  • Jeśli aplikacja działa w środowisku, w którym jest używanych wiele współużytkowanych składników, obrazy natywne umożliwią współużytkowanie składników przez wiele procesów.

  • Jeśli aplikacja używa wielu domen aplikacji, obrazy natywne umożliwią współużytkowanie stron kodu w różnych domenach.

    Uwaga

    W wersjach 1.0 i 1.1 programu .NET Framework obrazów natywnych nie można współużytkować w różnych domenach aplikacji. Inaczej jest w wersji 2.0 i późniejszych.

  • Jeśli aplikacja będzie uruchamiana na serwerze terminali, obrazy natywne umożliwią współużytkowanie stron kodu.

  • Zazwyczaj korzystne jest kompilowanie do obrazów natywnych dużych aplikacji. Taka kompilacja małych aplikacje zazwyczaj nie przynosi korzyści.

  • W przypadku aplikacji działających przez długi czas kompilacja JIT w czasie wykonywania sprawdza się nieco lepiej niż obrazy natywne. (Trwałe powiązania mogą do pewnego stopnia złagodzić różnicę w wydajności).

Znaczenie adresów bazowych zestawów

Obrazy natywne są plikami środowiska Windows PE, więc dotyczą ich te same problemy zmiany podstawy, co innych plików wykonywalnych. Spadek wydajności przy relokacji jest jeszcze bardziej widoczny, jeśli są stosowane powiązania trwałe.

Aby ustawić adres podstawowy dla obrazu natywnego, należy użyć odpowiedniej opcji kompilatora, aby ustawić adres podstawowy dla zestawu. Program Ngen.exe używa tego adresu podstawowego dla obrazu natywnego.

Uwaga

Obrazy natywne są większe niż zestawy zarządzane, na podstawie których zostały utworzone. Adresy podstawowe muszą być obliczane tak, aby zezwalały na te większe rozmiary.

Można użyć narzędzia, takiego jak dumpbin.exe, aby wyświetlić preferowany adres podstawowy obrazu natywnego.

Twarde powiązanie

Trwałe powiązania zwiększają przepustowość i zmniejszają rozmiar zestawu roboczego dla obrazów natywnych. Wadą trwałych powiązań jest fakt, że wszystkie obrazy, które są trwale powiązane z zestawem, muszą być ładowane razem z zestawem. Może to znacznie zwiększyć czas uruchamiania dużych aplikacji.

Trwałe powiązanie jest odpowiednie dla zależności, które są ładowane we wszystkich krytycznych pod względem wydajności scenariuszach aplikacji. Podobnie jak w przypadku każdego aspektu wykorzystania obrazu natywnego, staranne wykonywanie pomiarów wydajności jest jedynym sposobem ustalenia, czy trwałe powiązanie zwiększa wydajność aplikacji.

Atrybuty DependencyAttribute i DefaultDependencyAttribute umożliwiają podanie wskazówek dotyczących twardych powiązań do Ngen.exe.

Uwaga

Te atrybuty są wskazówkami dla programu Ngen.exe, a nie poleceniami. Użycie ich nie gwarantuje uzyskania trwałego powiązania. Znaczenie tych atrybutów może się zmieniać w przyszłych wersjach.

Określanie wskazówki 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 zależności i Sometimes wskazuje, że twarde powiązanie nie jest odpowiednie.

Poniższy kod pokazuje atrybuty dla zestawu mającego dwie zależności. Pierwsza zależność (Assembly1) jest odpowiednim kandydatem dla trwałego powiązania, ale druga zależność (Assembly2) nie jest.

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. Można używać nazw wyświetlanych.

Określanie domyślnej wskazówki dotyczącej powiązania dla zestawu

Domyślne wskazówki powiązania potrzebne są tylko zestawom, które będą stosowane natychmiastowo i często przez dowolną aplikację, która jest od nich zależna. Zastosuj element DefaultDependencyAttribute z LoadHint.Always do takich zestawów, aby określić, że należy użyć twardego powiązania.

Uwaga

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 elementu DefaultDependencyAttribute , aby określić, że twarde powiązanie jest ustawieniem domyślnym dla bardzo małej liczby zestawów w .NET Framework, takich jak mscorlib.dll.

Przetwarzanie odroczone

Generowanie obrazów natywnych dla bardzo dużych aplikacji może zająć znaczną ilość czasu. Podobnie zmiany składnika współużytkowanego lub zmiany w ustawieniach komputera mogą wymagać aktualizacji wielu obrazów natywnych. Akcje install i update mają /queue opcję kolejkowania operacji do odroczonego wykonywania przez natywną usługę obrazów. Ponadto Ngen.exe ma queue i executeQueuedItems akcje, 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 program Ngen.exe napotka w zestawie jakiekolwiek metody, których nie może wygenerować, wyklucza je z obrazu natywnego. Gdy środowisko uruchomieniowe wykonuje 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

Użycie programu Ngen.exe w celu utworzenia obrazu natywnego zestawu powoduje, że dane wyjściowe zależą od opcji wiersza polecenia, które można określić, i niektórych ustawień na komputerze. Są to m.in. następujące ustawienia:

  • Wersja .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 (ponowna kompilacja zmienia tożsamość).

  • Czynniki związane z zabezpieczeniami.

Program Ngen.exe rejestruje te informacje podczas generowania obrazu natywnego. Podczas wykonywania zestawu środowisko uruchomieniowe poszukuje obrazu natywnego wygenerowanego z użyciem opcji i ustawień, które odpowiadają bieżącemu środowisku komputera. Jeśli nie można odnaleźć pasującego obrazu natywnego, środowisko uruchomieniowe przywraca kompilację JIT zestawu. Następujące zmiany w ustawieniach komputera i środowiska powodują, że obrazy natywne stają się nieprawidłowe:

  • Wersja .NET Framework.

    Jeśli zastosujesz aktualizację do .NET Framework, wszystkie obrazy natywne utworzone przy użyciu Ngen.exe staną się nieprawidłowe. Z tego powodu wszystkie aktualizacje .NET Framework wykonują Ngen Update polecenie, aby upewnić się, że wszystkie obrazy natywne są ponownie generowane. .NET Framework automatycznie tworzy nowe obrazy natywne dla zainstalowanych bibliotek .NET Framework.

  • Dokładna tożsamość zestawu.

    Jeśli zestaw zostanie ponownie skompilowany, obraz natywny odpowiadający zestawowi staje się nieprawidłowy.

  • Dokładna tożsamość jakichkolwiek zestawów, do których odwołuje się zestaw.

    Jeżeli zestaw zarządzany zostanie zaktualizowany, wszystkie obrazy natywne zależne bezpośrednio lub pośrednio od tego zestawu stają się nieprawidłowe i muszą zostać wygenerowane ponownie. Obejmuje to zarówno zwykłe odwołania, jak i trwale powiązane zależności. Za każdym razem, gdy zostanie zastosowana aktualizacja oprogramowania, program instalacyjny powinien wykonać Ngen Update polecenie, aby upewnić się, że wszystkie zależne obrazy natywne są ponownie generowane.

  • Czynniki związane z zabezpieczeniami.

    Zmiana zasad zabezpieczeń komputera ograniczająca uprawnienia udzielone uprzednio zestawowi może spowodować, że poprzednio skompilowane obrazy natywne dla tego zestawu staną się nieprawidłowe.

    Aby uzyskać szczegółowe informacje o sposobie administrowania zabezpieczeniami dostępu do kodu i sposobu używania uprawnień w środowisku uruchomieniowym języka wspólnego, zobacz Zabezpieczenia dostępu do 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ń. Program Fuslogvw.exe dostarcza 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 obrazu natywnego

W niektórych przypadkach NGen.exe mogą mieć trudności z generowaniem obrazu natywnego dla określonej metody lub wolisz, że metoda jest skompilowana JIT, a następnie skompilowana 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ć uwzględniny w obrazie natywnym. 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 .NET Framework. Aby używać 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 na podstawie metody. Poniższy przykład instruuje generator obrazów natywnych, że nie powinien wygenerować obrazu natywnego ExampleClass.ToJITCompile dla 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 macierzysty dla programu ClientApp.exe, znajdujący się w bieżącym katalogu i instaluje obraz w natywnej pamięci podręcznej obrazów. Jeśli istnieje plik konfiguracji zestawu, program Ngen.exe go użyje. Ponadto obrazy natywne są generowane dla wszystkich plików .dll, do których ClientApp.exe się odwołuje.

ngen install ClientApp.exe

Obraz instalowany za pomocą programu Ngen.exe jest również nazywany elementem głównym. Elementem głównym może być aplikacja albo składnik współużytkowany.

Następujące polecenie generuje obraz natywny dla elementu MyAssembly.exe z określoną ścieżką.

ngen install c:\myfiles\MyAssembly.exe

Podczas lokalizowania zestawów i ich zależności program Ngen.exe używa tej samej logiki badania, co środowisko uruchomieniowe języka wspólnego (CLR). Domyślnie katalog, który zawiera 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ć za pomocą /AppBase opcji .

Uwaga

Zachowanie to różni się od zachowania programu Ngen.exe w wersjach 1.0 i 1.1 programu .NET Framework, gdzie podstawa aplikacji znajduje się w bieżącym katalogu.

Zestaw może mieć zależność bez odwołania, na przykład jeśli ładuje plik .dll przy użyciu Assembly.Load metody . Możesz utworzyć obraz natywny dla takiego pliku .dll, korzystając z informacji o konfiguracji zestawu aplikacji z opcją /ExeConfig . Następujące polecenie generuje obraz macierzysty do MyLib.dll, używania informacji o konfiguracji z MyApp.exeprogramu .

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

Zestawy instalowane w ten sposób nie są usuwane, gdy jest usuwana aplikacja.

Aby odinstalować zależność, należy użyć tych samych opcji wiersza polecenia, które zostały użyte podczas jej instalowania. Następujące polecenie odinstalowuje element 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, należy użyć nazwy wyświetlanej zestawu. Przykład:

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

Program NGen.exe generuje oddzielny zestaw obrazów dla każdego instalowanego scenariusza. Na przykład poniższe polecenia instalują kompletny zestaw obrazów natywnych dla normalnych operacji, drugi kompletny zestaw na potrzeby debugowania i trzeci na potrzeby profilowania:

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

Wyświetlanie pamięci podręcznej obrazów natywnych

Obrazy natywne zainstalowane w pamięci podręcznej można wyświetlić przy użyciu programu Ngen.exe. Poniższe polecenie wyświetla wszystkie obrazy natywne znajdujące się w pamięci podręcznej obrazów natywnych.

ngen display

Akcja display najpierw wyświetla listę wszystkich zestawów głównych, a następnie listę wszystkich obrazów natywnych na komputerze.

Prosta nazwa zestawu służy do wyświetlania informacji dotyczących tylko tego zestawu. Następujące polecenie wyświetla wszystkie obrazy natywne w pamięci podręcznej obrazów natywnych, które pasują do nazwy MyAssemblyczęściowej , 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 udostępnionego zestawu składników jest przydatna w ocenie wpływu update akcji po uaktualnieniu udostępnionego składnika.

Aby określić rozszerzenie pliku zestawu, należy określić ścieżkę lub wykonać program 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"

Aktualizacja obrazów

Obrazy są zazwyczaj aktualizowane po uaktualnieniu składnika współużytkowanego. 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

Aktualizacja 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.

ngen update /queue

Odinstalowywanie obrazów

Program Ngen.exe utrzymuje listę zależności, aby składniki współużytkowane były usuwane tylko wtedy, gdy wszystkie zestawy, które od nich zależą, zostały usunięte. Ponadto współużytkowany składnik nie zostanie usunięty, jeśli został zainstalowany jako element 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 odinstalowuje wszystkie scenariusze debugowania dla programu ClientApp.exe:

ngen uninstall ClientApp /debug

Uwaga

Odinstalowywanie /debug scenariuszy nie powoduje odinstalowania scenariusza obejmującego zarówno scenariusz, jak /profile i /debug.

Następujące polecenie odinstalowuje wszystkie scenariusze dla określonej wersji programu ClientApp.exe:

ngen uninstall "ClientApp, Version=1.0.0.0"

Następujące polecenia umożliwiają odinstalowanie wszystkich scenariuszy dla "ClientApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL", tego zestawu lub tylko scenariusz debugowania:

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).

Obraz macierzysty — zadanie

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 4.0.30319 Tak Tak
NET Framework NGEN 4.0.30319 64 Nie Tak

Zadanie obrazu natywnego jest dostępne w wersji .NET Framework 4.5 lub nowszej podczas uruchamiania w Windows 8 lub nowszym. We wcześniejszych wersjach systemu Windows .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 zadania, które są kolejkowane przez instalatorów aplikacji, wszelkie odroczone żądania aktualizacji obrazów natywnych i automatyczne tworzenie obrazów. Zadanie wykonuje zaległe elementy robocze, a następnie zamyka je. Jeśli komputer przestanie być bezczynny podczas wykonywania zadania, zadanie zostanie zatrzymane.

Zadanie obrazu natywnego można również uruchomić ręcznie 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 utworzone ręcznie przy użyciu NGen.exe mają priorytet, aby umożliwić przewidywalne zachowanie instalatorów aplikacji.

Usługa obrazu macierzystego

Natywna usługa obrazów to usługa systemu Windows, która generuje i utrzymuje obrazy natywne. Usługa obrazów natywnych 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 priorytetu 3 usługa jest wykonywana w czasie bezczynności na komputerze. Usługa zapisuje stan i w razie potrzeby może kontynuować wiele ponownych uruchomień. 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

W systemie Windows Vista nazwa wyświetlana dla natywnej usługi obrazów 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 zakończeniu 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 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órych dotyczy problem:

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 umożliwiają kolejkowanie 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 przy użyciu executeQueuedItems akcji . Jeśli podasz opcjonalny priorytet, ta akcja wpłynie 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 zakończenia:

ngen executeQueuedItems

Polecenia synchroniczne są wykonywane przez Ngen.exe i nie korzystają z 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, które zawiera /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 rozruchu komputera, a następnie zamyka się.

Interakcja z usługą z klientami

W .NET Framework wersji 2.0 jedyną interakcją z natywną usługą obrazów jest użycie narzędzia wiersza polecenia Ngen.exe. Użyj narzędzia wiersza polecenia w skryptach instalacyjnych, aby kolejkować akcje dla natywnej usługi obrazów i wchodzić w interakcje z usługą.

Zobacz też