.NET Native und Kompilierung.NET Native and Compilation

Die meisten auf das .NET Framework ausgerichteten Windows 8.1- und Windows Desktop-Anwendungen sind in einer bestimmten Programmiersprache geschrieben und in eine Zwischensprache (Intermediate Language, IL) kompiliert.Windows 8.1 applications and Windows Desktop applications that target the.NET Framework are written in a particular programming language and compiled into intermediate language (IL). Zur Laufzeit ist ein JIT-Compiler (Just-In-Time) dafür zuständig, die Zwischensprache für den lokalen Computer in systemeigenen Code zu kompilieren, unmittelbar bevor eine Methode zum ersten Mal ausgeführt wird.At runtime, a just-in-time (JIT) compiler is responsible for compiling the IL into native code for the local machine just before a method is executed for the first time. Im Gegensatz dazu konvertiert die .NET Native-Toolkette den Quellcode zur Kompilierzeit in systemeigenen Code.In contrast, the .NET Native tool chain converts source code to native code at compile time. In diesem Abschnitt wird .NET Native mit anderen Kompilierungsverfahren verglichen, die für .NET Framework-Apps verfügbar sind. Zudem enthält dieser Abschnitt einen konkreten Überblick über die Erzeugung von nativem Code mit .NET Native, der Ihnen dabei helfen kann zu verstehen, warum Ausnahmen nicht im JIT-kompilierten Code auftreten, die hingegen in Code auftreten, der mit .NET Native kompiliert wurde.This topic compares .NET Native with other compilation technologies available for .NET Framework apps, and also provides a practical overview of how .NET Native produces native code that can help you understand why exceptions that occur in code compiled with .NET Native do not occur in JIT-compiled code.

.Net Native: Native Binärdateien werden generiert.NET Native: Generating native binaries

Eine Anwendung, die auf das .NET Framework ausgerichtet ist und nicht mithilfe der .NET Native-Toolkette kompiliert wurde, besteht aus Ihrer Anwendungsassembly, die Folgendes umfasst:An application that targets the .NET Framework and that is not compiled by using the .NET Native tool chain consists of your application assembly, which includes the following:

  • Metadaten, die die Assembly, ihre Abhängigkeiten, die enthaltenen Typen und ihre Member beschreiben.Metadata that describes the assembly, its dependencies, the types it contains, and their members. Die Metadaten werden für die Reflektion und den spät gebunden Zugriff sowie in einigen Fällen auch vom Compiler und den Buildtools verwendet.The metadata is used for reflection and late-bound access, and in some cases by compiler and build tools as well.

  • Implementierungscode.Implementation code. Dieser besteht aus Opcodes der Zwischensprache (Intermediate Language, IL).This consists of intermediate language (IL) opcodes. Zur Laufzeit übersetzt der JIT-Compiler (Just-In-Time) den Implementierungscode für die Zielplattform in systemeigenen Code.At runtime, the just-in-time (JIT) compiler translates it into native code for the target platform.

Zusätzlich zur Assembly der Hauptanwendung erfordert eine App Folgendes:In addition to your main application assembly, an app requires that the following be present:

  • Alle zusätzlichen Klassenbibliotheken oder Assemblys von Drittanbietern, die für die App erforderlich sind.Any additional class libraries or third-party assemblies that are required by your app. Diese Assemblys schließen gleichermaßen die Assembly, ihre Typen und Member beschreibende Metadaten sowie die Zwischensprache (IL) ein, die alle Typmember implementiert.These assemblies similarly include metadata that describes the assembly, its types, and their members, as well as the IL that implements all type members.

  • Die .NET Framework-Klassenbibliothek.The .NET Framework Class Library. Hierbei handelt es sich um eine Auflistung von Assemblys, die während der Installation des .NET Frameworks auf dem lokalen System installiert werden.This is a collection of assemblies that is installed on the local system with the .NET Framework installation. Die in der .NET Framework-Klassenbibliothek einbezogenen Assemblys umfassen einen vollständigen Satz von Metadaten und Implementierungscode.The assemblies included in the .NET Framework Class Library include a complete set of metadata and implementation code.

  • Die Common Language Runtime.The common language runtime. Hierbei handelt es sich um eine Auflistung von DLLs (Dynamic Link Library), die Dienste wie die Folgenden ausführen: Laden von Assemblys, Speicherverwaltung und Garbage Collection, Ausnahmebehandlung, JIT-Kompilierung (Just-In-Time), Remoting und Interoperabilität.This is a collection of dynamic link libraries that perform such services as assembly loading, memory management and garbage collection, exception handling, just-in-time compilation, remoting, and interop. Wie die Klassenbibliothek wird die Common Language Runtime im Rahmen der .NET Framework-Installation auf dem lokalen System installiert.Like the class library, the runtime is installed on the local system as part of the .NET Framework installation.

Beachten Sie, dass die gesamte Common Language Runtime sowie die Metadaten und die Zwischensprache (Intermediate Language, IL) für alle Typen in anwendungsspezifischen Assemblys, Assemblys von Drittanbietern und Systemassemblys vorhanden sein müssen, damit die App erfolgreich ausgeführt werden kann.Note that the entire common language runtime, as well as metadata and IL for all types in application-specific assemblies, third-party assemblies, and system assemblies must be present for the app to execute successfully.

.NET Native- und JIT-Kompilierung (Just-In-Time).NET Native and just-in-time compilation

Die Eingabe für die .NET Native-Toolkette ist die vom C#- oder Visual Basic-Compiler erstellte Windows Store-App.The input for the .NET Native tool chain is the Windows store app built by the C# or Visual Basic compiler. Die .NET Native-Toolkette beginnt die Ausführung somit nach Abschluss der Kompilierung einer Windows Store-App durch den Sprachcompiler.In other words, the .NET Native tool chain begins execution when the language compiler has finished compilation of a Windows Store app.

Tipp

Da es sich bei der Eingabe für .NET Native um die in verwaltete Assemblys geschriebene Zwischensprache (Intermediate Language) und die Metadaten handelt, können Sie weiterhin benutzerdefinierten Code generieren oder andere benutzerdefinierte Operationen mithilfe von Bildvorstufen- oder Postbuild-Ereignissen oder durch Ändern der MSBuild-Projektdatei ausführen.Because the input to .NET Native is the IL and metadata written to managed assemblies, you can still perform custom code generation or other custom operations by using pre-build or post-build events or by modifying the MSBuild project file.

Kategorien von Tools, die die Zwischensprache ändern und dadurch die .NET-Toolkette daran hindern, die Zwischensprache einer App zu analysieren, werden jedoch nicht unterstützt.However, categories of tools that modify IL and thereby prevent the .NET tool chain from analyzing an app's IL are not supported. Obfuskatoren sind die bemerkenswertesten Tools dieses Typs.Obfuscators are the most notable tools of this type.

Beim Konvertieren einer App aus der Zwischensprache in nativen Code führt die .NET Native-Toolkette Vorgänge wie die Folgenden aus:In the course of converting an app from IL to native code, the .NET Native tool chain performs operations like the following:

  • Für bestimmte Codepfade wird Code ersetzt, der auf Reflektion und Metadaten mit statischem systemeigenem Code beruht.For certain code paths, it replaces code that relies on reflection and metadata with static native code. Wenn ein Werttyp z. B. die ValueType.Equals-Methode nicht außer Kraft setzt, verwendet der Standardtest zur Ermittlung der Gleichheit die Reflektion, um FieldInfo-Objekte abzurufen, die die Felder des Werttyps darstellen. Anschließend werden die Feldwerte von zwei Instanzen verglichen.For example, if a value type does not override the ValueType.Equals method, the default test for equality uses reflection to retrieve FieldInfo objects that represent the value type's fields, then compares the field values of two instances. Beim Kompilieren in nativen Code ersetzt die .NET Native-Toolkette den Reflektionscode und die Metadaten durch einen statischen Vergleich der Feldwerte.When compiling to native code, the .NET Native tool chain replaces the reflection code and metadata with a static comparison of the field values.

  • Dabei wird nach Möglichkeit versucht, alle Metadaten zu beseitigen.Where possible, it attempts to eliminate all metadata.

  • In die Assemblys der endgültigen App wird nur der Implementierungscode einbezogen, der tatsächlich von der App aufgerufen wird.It includes in the final app assemblies only the implementation code that is actually invoked by the app. Dies betrifft vor allem Code in Bibliotheken von Drittanbietern und in der .NET Framework-Klassenbibliothek.This particularly affects code in third-party libraries and in the .NET Framework Class Library. Eine Anwendung hängt demzufolge nicht mehr von Bibliotheken von Drittanbietern oder der vollständigen .NET Framework-Klassenbibliothek ab. Der Code in Bibliotheken von Drittanbietern und in .NET Framework-Klassenbibliotheken ist jetzt stattdessen im Hinblick auf die Anwendung lokal verfügbar.As a result, an application no longer depends on either third-party libraries or the full .NET Framework Class Library; instead, code in third-party and .NET Framework class libraries is now local to the app.

  • Dadurch wird die vollständige Common Language Runtime (CLR) durch eine umgestaltete Common Language Runtime ersetzt, die in erster Linie den Garbage Collector enthält.It replaces the full CLR with a refactored runtime that primarily contains the garbage collector. Die umgestaltete Common Language Runtime befindet sich in einer Bibliothek namens "mrt100_app.dll", die für die Anwendung lokal verfügbar und nur wenige hundert Kilobyte groß ist.The refactored runtime is found in a library named mrt100_app.dll that is local to the app and is only a few hundred kilobytes in size. Dies ist dadurch möglich, dass die statische Verknüpfung den Bedarf an vielen der von der Common Language Runtime ausgeführten Dienste beseitigt.This is possible because static linking eliminates the need for many of the services performed by the common language runtime.

    Hinweis

    .NET Native verwendet denselben Garbage Collector als Standard-CLR (Common Language Runtime)..NET Native uses the same garbage collector as the standard common language runtime. Beim .NET Native Garbage Collector ist die Garbage Collection im Hintergrund standardmäßig aktiviert.In the .NET Native garbage collector, background garbage collection is enabled by default. Weitere Informationen zur Garbage Collection finden Sie unter Grundlagen der Garbage Collection.For more information about garbage collection, see Fundamentals of Garbage Collection.

Wichtig

.NET Native kompiliert eine gesamte Anwendung in eine systemeigene Anwendung..NET Native compiles an entire application to a native application. Es ist Ihnen dabei nicht gestattet, einzelne Assemblys, die eine Klassenbibliothek enthalten, in nativen Code zu kompilieren, damit diese unabhängig vom verwalteten Code aufgerufen werden können.It does not allow you to compile a single assembly that contains a class library to native code so that it can be called independently from managed code.

Die von der .NET Native-Toolkette erzeugte resultierende App wird im Debug- oder Releaseverzeichnis Ihres Projektverzeichnisses in ein Verzeichnis namens „ilc.out“ geschrieben.The resulting app that is produced by the .NET Native tool chain is written to a directory named ilc.out in the Debug or Release directory of your project directory. Die App besteht aus den folgenden Dateien:It consists of the following files:

  • <Anwendungsname> .exe: Eine ausführbare Stubdatei, die die Kontrolle an einen speziellen Main-Export in der Datei <Anwendungsname> .dll übergibt.<appName>.exe, a stub executable that simply transfers control to a special Main export in <appName>.dll.

  • <Anwendungsname> .dll: Eine Windows-DLL (Dynamic Link Library), die sämtlichen Anwendungscode sowie den Code aus der .NET Framework-Klassenbibliothek und allen Bibliotheken von Drittanbietern enthält, zu denen Abhängigkeiten bestehen.<appName>.dll, a Windows dynamic link library that contains all your application code, as well as code from the .NET Framework Class Library and any third-party libraries that you have a dependency on. Sie enthält auch Unterstützungscode, z. B. den für die Zusammenarbeit mit Windows und zum Serialisieren von Objekten in der App erforderlichen Code.It also contains support code, such as the code necessary to interoperate with Windows and to serialize objects in your app.

  • "mrt100_app.dll": Eine umgestaltete Common Language Runtime, die Laufzeitdienste wie die Garbage Collection bereitstellt.mrt100_app.dll, a refactored runtime that provides runtime services such as garbage collection.

Alle Abhängigkeiten werden vom APPX-Manifest der App erfasst.All dependencies are captured by the app's APPX manifest. Zusätzlich zur EXE- und DLL-Datei der Anwendung sowie zur Datei "mrt100_app.dll", die direkt im AppX-Paket gebündelt werden, sind zwei weitere Dateien enthalten:In addition to the application exe, dll, and mrt100_app.dll, which are bundled directly in the appx package, this includes two more files:

  • „msvcr140_app.dll“: Die von der Datei „mrt100_app.dll“ verwendete C-Laufzeitbibliothek (CRT).msvcr140_app.dll, the C run-time (CRT) library used by mrt100_app.dll. Sie ist über einen Frameworkverweis in das Paket einbezogen.It is included by a framework reference in the package.

  • "mrt100.dll":mrt100.dll. Diese Bibliothek enthält Funktionen, die die Leistung der Datei "mrt100_app.dll" verbessern können, obwohl die Funktionalität der Datei "mrt100_app.dll" nicht verhindert wird, wenn diese Bibliothek nicht vorhanden ist.This library includes functions that can improve the performance of mrt100_app.dll, although its absence does not prevent mrt100_app.dll from functioning. Wenn die Bibliothek verfügbar ist, wird sie auf dem lokalen Computer aus dem Verzeichnis "system32" geladen.It is loaded from the system32 directory on the local machine, if it is present.

Da die .NET Native-Toolkette den Implementierungscode in Ihrer App nur verknüpft, wenn ihr bekannt ist, dass die App den Code tatsächlich aufruft, werden die Metadaten oder der Implementierungscode möglicherweise nicht in die App einbezogen, die in den folgenden Szenarien erforderlich sind:Because the .NET Native tool chain links implementation code into your app only if it knows that your app actually invokes that code, either the metadata or the implementation code required in the following scenarios may not be included with your app:

  • Reflektion.Reflection.

  • Dynamischer oder spät gebundener AufrufDynamic or late-bound invocation.

  • Serialisierung und DeserialisierungSerialization and deserialization.

  • COM-InteropCOM interop.

Fehlen die erforderlichen Metadaten oder der Implementierungscode zur Laufzeit, löst die .NET Native Common Language Runtime eine Ausnahme aus.If the necessary metadata or implementation code is absent at runtime, the .NET Native runtime throws an exception. Sie können diese Ausnahmen verhindern und sicherstellen, dass die .NET Native-Toolkette die erforderlichen Metadaten und den Implementierungscode enthält, indem Sie eine Laufzeitanweisungsdatei (eine XML-Datei) verwenden, die die Programmelemente bezeichnet, deren Metadaten oder Implementierungscode zur Laufzeit verfügbar sein müssen, und ihnen eine Laufzeitrichtlinie zuweist.You can prevent these exceptions, and ensure that the .NET Native tool chain includes the required metadata and implementation code, by using a runtime directives file, an XML file that designates the program elements whose metadata or implementation code must be available at runtime and assigns a runtime policy to them. Nachfolgend finden Sie die standardmäßige Laufzeitdirektivendatei, die zu einem Windows Store-Projekt hinzugefügt wird, das von der .NET Native-Toolkette kompiliert wird:The following is the default runtime directives file that is added to a Windows Store project that is compiled by the .NET Native tool chain:

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
  <Application>
    <Assembly Name="*Application*" Dynamic="Required All" />
  </Application>
</Directives>

Auf diese Weise werden sämtliche Typen und ihre Member in allen Assemblys im Anwendungspaket für die Reflektion und den dynamischen Aufruf aktiviert.This enables all the types, as well as all their members, in all the assemblies in your app package for reflection and dynamic invocation. Die Reflektion oder dynamische Aktivierung von Typen in Assemblys der .NET Framework-Klassenbibliothek werden jedoch nicht aktiviert.However, it does not enable reflection or dynamic activation of types in .NET Framework Class Library assemblies. In vielen Fällen ist dies ausreichend.In many cases, this is adequate.

.NET Native und NGEN.NET Native and NGEN

Der Native Image Generator (NGEN) kompiliert Assemblys in nativen Code und installiert sie auf dem lokalen Computer im nativen Imagecache.The (Native Image Generator (NGEN) compiles assemblies to native code and installs them in the native image cache on the local computer. Obwohl NGEN wie .NET Native systemeigenen Code erzeugt, unterscheidet sich NGEN jedoch in einigen entscheidenden Punkten von .NET Native:However, although NGEN, like .NET Native, produces native code, it differs from .NET Native in some significant ways:

  • Wenn für eine bestimmte Methode kein systemeigenes Image verfügbar ist, greift NGEN für den Code auf den JIT-Compiler zurück.If no native image is available for a particular method, NGEN falls back to JITing code. Das bedeutet, dass systemeigene Images für den Fall weiterhin Metadaten und die Zwischensprache (Intermediate Language, IL) einbeziehen müssen, dass NGEN auf die JIT-Kompilierung zurückgreift.This means that native images must continue to include metadata and IL in the event that NGEN needs to fall back to JIT compilation. .NET Native erzeugt im Gegensatz dazu nur systemeigene Images und greift nicht auf die JIT-Kompilierung zurück.In contrast, .NET Native produces only native images and does not fall back to JIT compilation. Daher müssen nur Metadaten erhalten bleiben, die für einige Reflektions-, Serialisierungs- und Interop-Szenarien erforderlich sind.As a result, only metadata required for some reflection, serialization, and interop scenarios must be preserved.

  • NGEN beruht für Dienste wie Laden von Assemblys, Remoting, Interop, Speicherverwaltung, Garbage Collection und ggf. JIT-Kompilierung weiterhin auf der vollständigen Common Language Runtime.NGEN continues to rely on the full common language runtime for services such as assembly loading, remoting, interop, memory management, garbage collection, and, if necessary, JIT compilation. In .NET Native sind viele dieser Dienste entweder nicht erforderlich (JIT-Kompilierung) oder werden zur Buildzeit aufgelöst und in die App-Assembly einbezogen.In .NET Native, many of these services are either unnecessary (JIT compilation) or are resolved at build-time and incorporated in the app assembly. Die verbleibenden Dienste, von denen der wichtigste die Garbage Collection ist, sind in einer wesentlich kleineren, umgestalteten Common Language Runtime namens "mrt100_app.dll" enthalten.The remaining services, the most important of which is garbage collection, are included in a much smaller, refactored runtime named mrt100_app.dll.

  • NGEN-Images sind eher anfällig.NGEN images tend to be fragile. Ein Patch oder eine Änderung für eine Abhängigkeit erfordert z. B. in der Regel, dass NGEN für die Assemblys, die diese verwenden, ebenfalls erneut durchgeführt wird.For example, a patch or change to a dependency typically requires that the assemblies that use it also be re-NGENed. Dies gilt insbesondere für Systemassemblys in der .NET Framework-Klassenbibliothek.This is particularly true of system assemblies in the .NET Framework Class Library. Im Gegensatz dazu gestattet .NET Native, dass Anwendungen unabhängig voneinander bereitgestellt werden.In contrast, .NET Native allows applications to be served independently of one another.

Siehe auchSee also