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, które są .NET Framework docelowe. Równoważnym generatorem obrazów natywnych dla .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 update akcja, , ponownie 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.

Na Windows 8 zobacz Native Image Task (Zadanie obrazu natywnego).

Aby uzyskać dodatkowe informacje na temat używania Ngen.exe i usługi obrazów natywnych, zobacz Native Image Service.

Uwaga

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

To narzędzie jest instalowane automatycznie z programem Visual Studio. Aby uruchomić narzędzie, użyj programu Visual Studio wiersz polecenia dla deweloperów lub 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 z action nich. Opisy poszczególnych części tabeli można znaleźć w tematach action Argumenty, Poziomy priorytetu, Scenariuszei Tabele konfiguracji. W tabeli Opcje opisano options przełączniki i pomocy.

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ślony, akcja jest do kolejki dla usługi obrazu natywnego. 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 usługi obrazu natywnego. 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 akcji i display 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. Gdy składnik udostępniony jest ładowany w czasie działania przy użyciu metody , plik konfiguracji aplikacji określa zależności, które są ładowane dla składnika udostępnionego — na przykład wersję załadowanej Load zależności. Przełącznik /ExeConfig zawiera Ngen.exe, które zależności będą ładowane w czasie rzeczywistym.
/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 wersji .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 za pomocą Ngen.exe nie mogą już być ładowane do aplikacji, które są uruchomione w częściowej relacji zaufania. Zamiast tego wywoływany jest kompilator JIT (Just-In-Time).

Ngen.exe generuje obrazy natywne dla zestawu określonego przez argument akcji i assemblyname install wszystkie jego zależności. Zależności są ustalane na podstawie odwołań w manifeście zestawu. Jedynym scenariuszem, w którym należy zainstalować zależność oddzielnie, jest ładowanie jej przez aplikację przy użyciu odbicia, na przykład przez wywołanie Assembly.Load metody .

Ważne

Nie używaj metody z Assembly.LoadFrom 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 zarówno pliki i są zainstalowane w pamięci podręcznej obrazów natywnych, jak i mają MyAssembly.exe YourAssembly.exe odwołania do OurDependency.dll . Jeśli MyAssembly.exe program zostanie odinstalowany, OurDependency.dll nie zostanie odinstalowany. Jest on usuwany tylko YourAssembly.exe wtedy, gdy zostanie również odinstalowany.

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, który został wygenerowany przy użyciu /Debug opcji /Profile lub . 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 /Debug opcją .

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 programem .NET Framework 3.5 z dodatkiem Service Pack 1 należy umieścić współużytkowane składniki o silnej nazwie w globalnej pamięci podręcznej zestawów, ponieważ program ładujący przeprowadza dodatkową walidację zestawów o silnych nazwach, które nie znajdują się w globalnej pamięci podręcznej zestawów, skutecznie eliminując wszelkie ulepszenia czasu uruchamiania uzyskane dzięki obrazom natywnym. Optymalizacje wprowadzone w programie .NET Framework 3.5 SP1 usunęła dodatkową walidację.

Podsumowanie uwagi dotyczące 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 zestawu

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 i umożliwiają zapewnienie wskazówek dotyczących DependencyAttribute DefaultDependencyAttribute twardych powiązań 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 dotyczącej powiązania dla zależności

Zastosuj DependencyAttribute element do zestawu, aby wskazać prawdopodobieństwo załadowania określonej zależności. LoadHint.Always wskazuje, że twarde powiązanie jest odpowiednie, wskazuje, że należy użyć domyślnej zależności i wskazuje, że twarde powiązanie Default Sometimes 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 do takich zestawów wartość z , DefaultDependencyAttribute LoadHint.Always aby określić, że należy użyć powiązania twardego.

Uwaga

Nie ma powodu, aby zastosować do zestawów .dll, które nie należą do tej kategorii, ponieważ zastosowanie atrybutu z dowolną wartością inną niż ma taki sam efekt, jak nie stosowanie DefaultDependencyAttribute LoadHint.Always atrybutu w ogóle.

Firma Microsoft używa do określenia, że twarde powiązanie jest ustawieniem domyślnym dla bardzo małej liczby zestawów w DefaultDependencyAttribute .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 i mają opcję, która kolejkuje operację w celu install update wykonania /queue odroczonego przez usługę obrazu natywnego. Ponadto usługa Ngen.exe akcje queue executeQueuedItems i , które zapewniają pewien sposób kontroli nad usługą. Aby uzyskać więcej informacji, zobacz Native Image Service.

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 zastosujemy aktualizację do .NET Framework, wszystkie obrazy natywne utworzone przy użyciu Ngen.exe staną się nieprawidłowe. Z tego powodu wszystkie aktualizacje programu .NET Framework polecenie , aby upewnić się, że wszystkie obrazy Ngen Update natywne są ponownie wygenerowane. .NET Framework automatycznie tworzy nowe obrazy natywne dla bibliotek .NET Framework, które instaluje.

  • 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 jest stosowana aktualizacja oprogramowania, program instalacyjny powinien wykonać polecenie w celu zapewnienia ponownego wygenerowania wszystkich zależnych Ngen Update obrazów natywnych.

  • 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 na temat administrowania zabezpieczeniami dostępu kodu przez środowisko uruchomieniowe języka wspólnego i używania uprawnień, zobacz Zabezpieczenia dostępu kodu.

Rozwiązywanie problemów

Poniższe tematy dotyczące rozwiązywania problemów umożliwiają określenie, które obrazy natywne są używane, a które nie mogą być używane przez aplikację, w celu określenia, kiedy kompilator JIT zacznie kompilować metodę, i pokazują, jak zrezygnować z kompilacji obrazów natywnych określonych metod.

podgląd dziennika powiązań zestawów

Aby upewnić się, że obrazy natywne są używane przez aplikację, można użyćFuslogvw.exe (Podgląd dziennika powiązań zestawu). 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 zarządzanego debugowania JITCompilationStart

Możesz użyć asystenta debugowania zarządzanego jitCompilationStart (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 wygenerowaniem obrazu natywnego dla określonej metody lub preferowanie, aby metoda została skompilowana JIT, a następnie skompilowana do obrazu natywnego. W takim przypadku można użyć atrybutu , aby uniemożliwić NGen.exe generowania obrazu natywnego System.Runtime.BypassNGenAttribute dla określonej metody. Atrybut musi być stosowany indywidualnie do każdej metody, której kod nie ma być uwzględniany w obrazie natywnym. NGen.exe rozpoznaje atrybut i nie generuje kodu w obrazie natywnym dla odpowiedniej metody.

Należy jednak pamiętać, że BypassNGenAttribute nie jest on zdefiniowany jako typ w .NET Framework Class Library. 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 per-method basis. Poniższy przykład instruuje generator obrazów natywnych, że nie powinien generować 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 , znajduje się w bieżącym katalogu i instaluje obraz ClientApp.exe w pamięci podręcznej obrazu macierzystego. Jeśli istnieje plik konfiguracji zestawu, program Ngen.exe go użyje. Ponadto obrazy natywne są generowane dla wszystkich plików .dll, które się ClientApp.exe odwołań.

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 z MyAssembly.exe 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 zawierający plik jest używany jako katalog podstawowy aplikacji, a w tym katalogu rozpoczyna się całe ClientApp.exe sondowanie zestawu. 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 . Obraz natywny dla takiego pliku .dll można utworzyć przy użyciu informacji o konfiguracji dla zestawu aplikacji z /ExeConfig opcją . Następujące polecenie generuje obraz natywny do korzystania MyLib.dll, z informacji o konfiguracji z programu MyApp.exe .

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 polecenie 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. Na 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 najpierw wyświetla listę wszystkich zestawów głównych, a następnie listę wszystkich obrazów natywnych display 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 częściowej nazwy, ich zależności i wszystkich katalogów głównych, które MyAssembly mają zależność MyAssembly od :

ngen display MyAssembly

Wiedza, jakie elementy główne zależą od zestawu składników udostępnionych, jest przydatna podczas oceniania wpływu akcji update po uaktualnieniu składnika współużytkowania.

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

Następujące polecenie wyświetla wszystkie obrazy natywne w pamięci podręcznej obrazów natywnych o nazwie i wersji MyAssembly 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 przez usługę obrazu natywnego można dodać do kolejki przy użyciu /queue opcji . Aby uzyskać więcej informacji na temat /queue 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 dla 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 ClientApp.exe programu :

ngen uninstall ClientApp /debug

Uwaga

Scenariusze /debug odinstalowywania nie odinstalowuje scenariusza, który obejmuje zarówno programy /profile , jak 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 odinstalowuje wszystkie scenariusze dla tego zestawu lub tylko "ClientApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL", 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 akcji, podanie rozszerzenia wymaga wykonania Ngen.exe z katalogu zawierającego zestaw lub określenia install pełnej ścieżki.

Przykłady dotyczące usługi obrazów natywnych można znaleźć w tesłudze obrazów natywnych.

Obraz macierzysty — zadanie

Zadanie obrazu natywnego to zadanie Windows, które generuje i utrzymuje obrazy natywne. Zadanie obrazu natywnego automatycznie generuje i odzyskuje obrazy natywne dla obsługiwanych scenariuszy. Umożliwia również instalatorom używanieNgen.exe (Generator 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, które są celem 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 .NET Framework 4.5 i nowszych, gdy jest uruchomione na Windows 8 lub nowszym. We wcześniejszych wersjach programu Windows usługa .NET Framework używa usługi obrazów natywnych.

Okres istnienia zadania

Ogólnie rzecz biorąc, Windows Harmonogram zadań zadanie obrazu natywnego każdej nocy, gdy komputer jest bezczynny. Zadanie sprawdza wszelkie odroczone prace, które są w kolejce przez instalatory aplikacji, wszelkie odroczone żądania aktualizacji obrazu natywnego i wszelkie automatyczne tworzenie obrazu. Zadanie kończy zaległe elementy robocze, a następnie zamyka. Jeśli komputer przestanie być bezczynny, gdy zadanie jest uruchomione, zadanie zostanie zatrzymane.

Zadanie obrazu natywnego można również uruchomić ręcznie za pomocą interfejsu Harmonogram zadań użytkownika lub za pomocą ręcznych wywołań NGen.exe. Jeśli zadanie zostanie uruchomione za pomocą jednej z tych metod, będzie nadal działać, gdy komputer nie będzie 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

Usługa obrazów natywnych to Windows, która generuje i utrzymuje obrazy natywne. Usługa obrazów natywnych umożliwia deweloperowi odroczenie instalacji i aktualizacji obrazów natywnych na okresy bezczynności komputera.

Zwykle usługa obrazu natywnego jest inicjowana przez program instalacyjny (instalator) dla aplikacji lub aktualizacji. W przypadku akcji o priorytecie 3 usługa jest wykonywana w czasie bezczynności na komputerze. Usługa zapisuje swój stan i może w razie potrzeby przejść przez wiele ponownych uruchomień. Można dodać wiele kompilacji obrazów do kolejki.

Usługa współdziała również z ręcznym Ngen.exe polecenia. Polecenia ręczne mają pierwszeństwo przed działaniem w tle.

Uwaga

W 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 programu 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 podczas kopiowania plików przez instalatora ani umieszczania zestawów w globalnej pamięci podręcznej zestawów. Następujące polecenie Ngen.exe polecenie wstrzymuje usługę:

ngen queue pause

Po do kolejce wszystkich odroczonych operacji następujące polecenie umożliwia usłudze wznowienie:

ngen queue continue

Aby odroczyć generowanie obrazu natywnego podczas instalowania nowej aplikacji lub aktualizowania składnika udostępnionego, użyj opcji /queue z install akcjami update lub . Następujące Ngen.exe polecenia instalują obraz natywny dla składnika udostępnionego i wykonują aktualizację wszystkich katalogów głównych, których to dotyczyło:

ngen install MyComponent /queue
ngen update /queue

Akcja powoduje ponowne wygenerowanie wszystkich unieważnionych obrazów natywnych, update a nie tylko tych, które używają . MyComponent

Jeśli aplikacja składa się z wielu katalogów głównych, możesz kontrolować priorytet odroczonych akcji. Następujące polecenia do kolejki instalacji trzech katalogów głównych. Assembly1 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 o priorytecie 1. Assembly3 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

Za pomocą akcji można wymusić synchroniczne działanie w executeQueuedItems kolejce. W przypadku poania opcjonalnego priorytetu ta akcja ma wpływ tylko na akcje w kolejce, które mają taki sam lub niższy priorytet. Domyślny priorytet to 3, dlatego następujące polecenie Ngen.exe natychmiast przetwarza wszystkie akcje w kolejce i nie zwraca ich, dopóki nie zostaną zakończone:

ngen executeQueuedItems

Polecenia synchroniczne są wykonywane przez Ngen.exe i nie korzystają z usługi obrazów natywnych. 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 opcję , usługa jest uruchamiana w tle do momentu ukończenia /queue wszystkich akcji. Usługa zapisuje swój stan, aby w razie potrzeby kontynuować wiele ponownych uruchomień. Gdy usługa wykryje, że nie ma więcej akcji w kolejce, resetuje swój stan, aby nie uruchamiał się ponownie przy następnym rozruchu komputera, a następnie zamyka się.

Interakcja usługi z klientami

W .NET Framework wersji 2.0 jedyną interakcją z usługą obrazu natywnego jest interakcja za pośrednictwem narzędzia wiersza polecenia Ngen.exe. Użyj narzędzia wiersza polecenia w skryptach instalacji, aby kolejkować akcje dla usługi obrazu natywnego i wchodzić w interakcje z usługą.

Zobacz też