Verwalteter AusführungsprozessManaged Execution Process

Der verwaltete Ausführungsprozess schließt die folgenden Schritte ein, die weiter unten in diesem Thema ausführlich erläutert werden:The managed execution process includes the following steps, which are discussed in detail later in this topic:

  1. Auswählen eines Compilers.Choosing a compiler.

    Um die Vorzüge der Common Language Runtime nutzen zu können, müssen Sie mindestens einen Sprachcompiler mit Unterstützung der Laufzeit verwenden.To obtain the benefits provided by the common language runtime, you must use one or more language compilers that target the runtime.

  2. Kompilieren des Codes in MSIL.Compiling your code to MSIL.

    Beim Kompilieren wird der Quellcode in Microsoft Intermediate Language (MSIL) übersetzt, und die erforderlichen Metadaten werden generiert.Compiling translates your source code into Microsoft intermediate language (MSIL) and generates the required metadata.

  3. Kompilieren von MSIL in systemeigenen Code.Compiling MSIL to native code.

    Zur Ausführungszeit übersetzt ein JIT-Compiler (Just-In-Time) die MSIL in systemeigenen Code.At execution time, a just-in-time (JIT) compiler translates the MSIL into native code. Während dieser Kompilierung muss der Code eine Überprüfung der MSIL und der Metadaten durchlaufen, um zu ermitteln, ob der Code als typsicher gelten kann.During this compilation, code must pass a verification process that examines the MSIL and metadata to find out whether the code can be determined to be type safe.

  4. Ausführen von Code.Running code.

    Die Common Language Runtime stellt eine Infrastruktur bereit, die die Ausführung des Codes sowie von Diensten ermöglicht, die während der Ausführung verwendet werden können.The common language runtime provides the infrastructure that enables execution to take place and services that can be used during execution.

Auswählen eines CompilersChoosing a Compiler

Um die Vorteile der Common Language Runtime (CLR) nutzen zu können, müssen Sie mindestens einen Sprachcompiler für die Laufzeit verwenden, z. B. Compiler für Visual Basic, C#, Visual C++, F# oder einen der vielen Compiler von Drittanbietern, wie etwa einen Eiffel-, Perl- oder COBOL-Compiler.To obtain the benefits provided by the common language runtime (CLR), you must use one or more language compilers that target the runtime, such as Visual Basic, C#, Visual C++, F#, or one of many third-party compilers such as an Eiffel, Perl, or COBOL compiler.

Da es sich um eine mehrsprachige Ausführungsumgebung handelt, unterstützt die Laufzeit eine große Zahl von Datentypen und Sprachfeatures.Because it is a multilanguage execution environment, the runtime supports a wide variety of data types and language features. Die verfügbaren Laufzeitfunktionen hängen vom verwendeten Sprachcompiler ab. Mithilfe dieser Funktionen entwerfen Sie den Code.The language compiler you use determines which runtime features are available, and you design your code using those features. Die vom Code zu verwendende Syntax wird durch den Compiler, nicht durch die Laufzeit festgelegt.Your compiler, not the runtime, establishes the syntax your code must use. Wenn eine Komponente für in anderen Sprachen geschriebene Komponenten vollständig verwendbar sein soll, dürfen die exportierten Typen der Komponente ausschließlich Sprachfunktionen verfügbar machen, die in der Language Independence and Language-Independent Components (CLS) enthalten sind.If your component must be completely usable by components written in other languages, your component's exported types must expose only language features that are included in the Language Independence and Language-Independent Components (CLS). Sie können das CLSCompliantAttribute -Attribut verwenden, um sicherzustellen, dass der Code CLS-kompatibel ist.You can use the CLSCompliantAttribute attribute to ensure that your code is CLS-compliant. Weitere Informationen finden Sie unter Language Independence and Language-Independent Components.For more information, see Language Independence and Language-Independent Components.

Zurück nach obenBack to top

Kompilieren in MSILCompiling to MSIL

Beim Kompilieren in verwalteten Code übersetzt der Compiler den Quellcode in MSIL (Microsoft Intermediate Language), ein prozessorunabhängiger Satz von Anweisungen, die auf einfache Weise in systemeigenen Code konvertiert werden können.When compiling to managed code, the compiler translates your source code into Microsoft intermediate language (MSIL), which is a CPU-independent set of instructions that can be efficiently converted to native code. MSIL enthält Anweisungen zum Laden, Speichern, Initialisieren und Aufrufen von Methoden für Objekte sowie Anweisungen für arithmetische und logische Operationen, Ablaufsteuerung, direkten Speicherzugriff, Ausnahmebehandlung und andere Operationen.MSIL includes instructions for loading, storing, initializing, and calling methods on objects, as well as instructions for arithmetic and logical operations, control flow, direct memory access, exception handling, and other operations. Bevor Code ausgeführt werden kann, muss MSIL in prozessorspezifischen Code konvertiert werden, i. d. R. durch eine JIT-Kompilierung.Before code can be run, MSIL must be converted to CPU-specific code, usually by a just-in-time (JIT) compiler. Da die Common Language Runtime für jede unterstützte Computerarchitektur mindestens einen JIT-Compiler bereitstellt, können MSIL-Anweisungen unter jeder unterstützten Architektur JIT-kompiliert und ausgeführt werden.Because the common language runtime supplies one or more JIT compilers for each computer architecture it supports, the same set of MSIL can be JIT-compiled and run on any supported architecture.

Wenn ein Compiler MSIL erstellt, erstellt er auch Metadaten.When a compiler produces MSIL, it also produces metadata. Metadaten beschreiben im Code vorhandene Typen und enthalten die Definition jedes Typs, die Signaturen der Member jedes Typs, die Member, auf die der Code verweist, sowie weitere Daten, die von der Laufzeit zur Ausführungszeit verwendet werden.Metadata describes the types in your code, including the definition of each type, the signatures of each type's members, the members that your code references, and other data that the runtime uses at execution time. MSIL und Metadaten befinden sich in einer PE (Portable Executable)-Datei, die auf dem traditionell für ausführbare Inhalte verwendeten, veröffentlichten PE-Dateiformat und COFF (Common Object File Format) von Microsoft beruht und dieses erweitert.The MSIL and metadata are contained in a portable executable (PE) file that is based on and that extends the published Microsoft PE and common object file format (COFF) used historically for executable content. Mit diesem für MSIL oder systemeigenen Code sowie für Metadaten ausgelegten Dateiformat kann das Betriebssystem Common Language Runtime-Abbilder erkennen.This file format, which accommodates MSIL or native code as well as metadata, enables the operating system to recognize common language runtime images. Da in der Datei Metadaten und MSIL gleichzeitig vorhanden sind, kann sich der Code selbst beschreiben. Dies bedeutet, dass Typbibliotheken oder eine IDL (Interface Definition Language, Schnittstellendefinitionssprache) nicht erforderlich sind.The presence of metadata in the file together with MSIL enables your code to describe itself, which means that there is no need for type libraries or Interface Definition Language (IDL). Die Laufzeit sucht und extrahiert die Metadateien aus der Datei je nach Bedarf während der Ausführung.The runtime locates and extracts the metadata from the file as needed during execution.

Zurück nach obenBack to top

Kompilieren von MSIL in systemeigenen CodeCompiling MSIL to Native Code

Bevor Microsoft Intermediate Language (MSIL) ausgeführt werden kann, muss sie in der Common Language Runtime in systemeigenen Code für die Architektur des Zielcomputers kompiliert werden.Before you can run Microsoft intermediate language (MSIL), it must be compiled against the common language runtime to native code for the target machine architecture. .NET Framework.NET Framework bietet zwei Möglichkeiten zum Ausführen dieser Konvertierung:The .NET Framework.NET Framework provides two ways to perform this conversion:

Kompilierung durch den JIT-CompilerCompilation by the JIT Compiler

Bei der JIT-Kompilierung wird MSIL zur Anwendungslaufzeit auf Abruf in systemeigenen Code konvertiert, sobald der Inhalt einer Assembly geladen und ausgeführt wird.JIT compilation converts MSIL to native code on demand at application run time, when the contents of an assembly are loaded and executed. Da die Common Language Runtime für jede unterstützte CPU-Architektur einen JIT-Compiler bereitstellt, können Entwickler eine Reihe von MSIL-Assemblys erstellen, die JIT-kompiliert und auf unterschiedlichen Computern mit abweichender Architektur ausgeführt werden können.Because the common language runtime supplies a JIT compiler for each supported CPU architecture, developers can build a set of MSIL assemblies that can be JIT-compiled and run on different computers with different machine architectures. Wenn der verwaltete Code jedoch plattformspezifische systemeigene APIs oder eine plattformspezifische Klassenbibliothek aufruft, kann er nur unter diesem Betriebssystem ausgeführt werden.However, if your managed code calls platform-specific native APIs or a platform-specific class library, it will run only on that operating system.

Bei der JIT-Kompilierung wird berücksichtigt, dass ein Teil des Codes bei der Ausführung möglicherweise nicht aufgerufen wird.JIT compilation takes into account the possibility that some code might never be called during execution. Statt für das Konvertieren der gesamten MSIL einer PE-Datei in systemeigenen Code Zeit und Speicherplatz zu beanspruchen, wird die MSIL während der Ausführung nach Bedarf konvertiert. Der resultierende systemeigene Code wird im Arbeitsspeicher gespeichert, sodass bei nachfolgenden Aufrufen im Kontext dieses Prozesses darauf zugegriffen werden kann.Instead of using time and memory to convert all the MSIL in a PE file to native code, it converts the MSIL as needed during execution and stores the resulting native code in memory so that it is accessible for subsequent calls in the context of that process. Das Ladeprogramm erstellt einen Stub und fügt diesen an jede Methode des Typs an, wenn dieser Typ geladen und initialisiert wird.The loader creates and attaches a stub to each method in a type when the type is loaded and initialized. Beim ersten Aufruf der Methode übergibt der Stub die Steuerung an den JIT-Compiler, der die MSIL für diese Methode in systemeigenen Code konvertiert und den Stub so ändert, dass er direkt auf den generierten systemeigenen Code verweist.When a method is called for the first time, the stub passes control to the JIT compiler, which converts the MSIL for that method into native code and modifies the stub to point directly to the generated native code. Nachfolgende Aufrufe der JIT-kompilierten Methode setzen deshalb direkt beim systemeigenen Code an.Therefore, subsequent calls to the JIT-compiled method go directly to the native code.

Codegenerierung bei der Installation mithilfe von NGen.exeInstall-Time Code Generation Using NGen.exe

Da der JIT-Compiler die MSIL einer Assembly in systemeigenen Code konvertiert, wenn einzelne in dieser Assembly definierte Methoden aufgerufen werden, treten zur Laufzeit unweigerlich Leistungseinbußen auf.Because the JIT compiler converts an assembly's MSIL to native code when individual methods defined in that assembly are called, it affects performance adversely at run time. In den meisten Fällen sind diese Leistungseinbußen hinnehmbar.In most cases, that diminished performance is acceptable. Eine größere Rolle spielt jedoch, dass der vom JIT-Compiler generierte Code an den Prozess gebunden ist, durch den die Kompilierung ausgelöst wurde.More importantly, the code generated by the JIT compiler is bound to the process that triggered the compilation. Er kann also nicht für mehrere Prozesse verwendet werden.It cannot be shared across multiple processes. Damit der generierte Code für mehrere Aufrufe einer Anwendung oder mehrere Prozesse verwendet werden kann, die eine Gruppe von Assemblys gemeinsam nutzen, unterstützt die Common Language Runtime einen vorzeitigen Kompilierungsmodus.To allow the generated code to be shared across multiple invocations of an application or across multiple processes that share a set of assemblies, the common language runtime supports an ahead-of-time compilation mode. Dieser vorzeitige Kompilierungsmodus verwendet den Native Image Generator (Ngen.exe), um MSIL-Assemblys ähnlich wie der JIT-Compiler in nativen Code zu konvertieren.This ahead-of-time compilation mode uses the Ngen.exe (Native Image Generator) to convert MSIL assemblies to native code much like the JIT compiler does. Die Ausführung von Ngen.exe unterscheidet sich jedoch auf drei Weisen von der Ausführung des JIT-Compilers:However, the operation of Ngen.exe differs from that of the JIT compiler in three ways:

  • Die Konvertierung von MSIL in systemeigenen Code wird vor und nicht während der Ausführung der Anwendung durchgeführt.It performs the conversion from MSIL to native code before running the application instead of while the application is running.

  • Es werden jeweils ganze Assemblys und nicht einzelne Methoden kompiliert.It compiles an entire assembly at a time, instead of one method at a time.

  • Der generierte Code im Cache für systemeigene Abbilder wird als Datei auf dem Datenträger beibehalten.It persists the generated code in the Native Image Cache as a file on disk.

CodeüberprüfungCode Verification

Beim Kompilieren in systemeigenen Code muss der MSIL-Code eine Überprüfung durchlaufen. Dies ist nicht erforderlich, wenn der Administrator Sicherheitsrichtlinien erstellt hat, mit denen die Überprüfung des Codes umgangen werden kann.As part of its compilation to native code, the MSIL code must pass a verification process unless an administrator has established a security policy that allows the code to bypass verification. MSIL und Metadaten werden daraufhin überprüft, ob der Code typsicher ist, d. h., ob er nur auf Speicherorte zugreift, für die ihm der Zugriff gewährt ist.Verification examines MSIL and metadata to find out whether the code is type safe, which means that it accesses only the memory locations it is authorized to access. Typsicherheit ermöglicht das Isolieren von Objekten voneinander und trägt zum Schutz dieser Objekte vor unabsichtlicher oder böswilliger Beschädigung bei.Type safety helps isolate objects from each other and helps protect them from inadvertent or malicious corruption. Typsicherheit bietet außerdem die Gewissheit, dass Sicherheitsbeschränkung für Code zuverlässig erzwungen werden können.It also provides assurance that security restrictions on code can be reliably enforced.

Für die Laufzeit ist erforderlich, dass die folgenden Aussagen auf überprüfbar typsicheren Code zutreffen:The runtime relies on the fact that the following statements are true for code that is verifiably type safe:

  • Ein Verweis auf einen Typ ist vollständig kompatibel mit dem Typ, auf den verwiesen wird.A reference to a type is strictly compatible with the type being referenced.

  • Für ein Objekt werden nur angemessen definierte Operationen aufgerufen.Only appropriately defined operations are invoked on an object.

  • Identitäten sind, was sie von sich behaupten.Identities are what they claim to be.

Während der Überprüfung von MSIL-Code wird versucht sicherzustellen, dass dieser nur über ordnungsgemäß definierte Typen auf Speicherorte zugreifen und Methoden aufrufen kann.During the verification process, MSIL code is examined in an attempt to confirm that the code can access memory locations and call methods only through properly defined types. Code muss z. B. die Überlastung von Speicherorten beim Zugriff auf Felder eines Objekts verhindern.For example, code cannot allow an object's fields to be accessed in a manner that allows memory locations to be overrun. Code wird außerdem daraufhin überprüft, ob die MSIL fehlerfrei generiert wurde, da fehlerhafte MSIL zu einer Verletzung der Regeln für die Typsicherheit führen kann.Additionally, verification inspects code to determine whether the MSIL has been correctly generated, because incorrect MSIL can lead to a violation of the type safety rules. Bei der Überprüfung wird ein genau definierter Abschnitt typsicheren Codes übergeben, und es wird ausschließlich Code übergeben, der typsicher ist.The verification process passes a well-defined set of type-safe code, and it passes only code that is type safe. Aufgrund einiger Einschränkungen während der Überprüfung ist es jedoch möglich, dass ein Teil des typsicheren Codes die Überprüfung nicht besteht. Zudem kann in einigen Sprachen kein überprüfbar typsicherer Code erstellt werden.However, some type-safe code might not pass verification because of some limitations of the verification process, and some languages, by design, do not produce verifiably type-safe code. Wenn die Sicherheitsrichtlinien typsicheren Code erfordern, aber der Code die Überprüfung nicht besteht, wird bei der Ausführung des Codes eine Ausnahme ausgelöst.If type-safe code is required by the security policy but the code does not pass verification, an exception is thrown when the code is run.

Zurück nach obenBack to top

Ausführen von CodeRunning Code

Die Common Language Runtime stellt eine Infrastruktur bereit, die die verwaltete Ausführung des Codes sowie von Diensten ermöglicht, die während der Ausführung verwendet werden können.The common language runtime provides the infrastructure that enables managed execution to take place and services that can be used during execution. Vor Ausführung einer Methode muss diese in prozessorspezifischen Code kompiliert werden.Before a method can be run, it must be compiled to processor-specific code. Jede Methode, für die MSIL generiert wurde, wird beim ersten Aufruf JIT-kompiliert und anschließend ausgeführt.Each method for which MSIL has been generated is JIT-compiled when it is called for the first time, and then run. Beim nächsten Ausführen der Methode wird der vorhandene JIT-kompilierte, systemeigene Code ausgeführt.The next time the method is run, the existing JIT-compiled native code is run. Das JIT-Kompilieren und anschließende Ausführen des Codes wird so lange wiederholt, bis die Ausführung vollständig abgeschlossen ist.The process of JIT-compiling and then running the code is repeated until execution is complete.

Verwaltetem Code stehen während der Ausführung verschiedene Dienste zur Verfügung, z. B. Garbage Collection, Sicherheit, Interoperabilität mit nicht verwaltetem Code, sprachübergreifende Debugunterstützung sowie verbesserte Unterstützung der Bereitstellung und Versionserstellung.During execution, managed code receives services such as garbage collection, security, interoperability with unmanaged code, cross-language debugging support, and enhanced deployment and versioning support.

Unter Microsoft Windows XPWindows XP und Windows VistaWindows Vistasucht das Ladeprogramm des Betriebssystems nach verwalteten Modulen, indem ein Bit im COFF-Header überprüft wird.In Microsoft Windows XPWindows XP and Windows VistaWindows Vista, the operating system loader checks for managed modules by examining a bit in the COFF header. Das festgelegte Bit steht dabei für ein verwaltetes Modul.The bit being set denotes a managed module. Wenn das Ladeprogramm verwaltete Module erkennt, lädt es mscoree.dll. _CorValidateImage und _CorImageUnloading benachrichtigen das Ladeprogramm, wenn die Images der verwalteten Module geladen und entladen werden.If the loader detects managed modules, it loads mscoree.dll, and _CorValidateImage and _CorImageUnloading notify the loader when the managed module images are loaded and unloaded. _CorValidateImage führt die folgenden Aktionen aus:_CorValidateImage performs the following actions:

  1. Überprüfen, dass es sich um gültigen verwalteten Code handeltEnsures that the code is valid managed code.

  2. Ändern des Einstiegspunktes im Image in einen Einstiegspunkt zur LaufzeitChanges the entry point in the image to an entry point in the runtime.

Bei 64-Bit-Versionen von Windows ändert _CorValidateImage das Image im Arbeitsspeicher vom Format PE32 in das Format PE32+.On 64-bit Windows, _CorValidateImage modifies the image that is in memory by transforming it from PE32 to PE32+ format.

Zurück nach obenBack to top

Siehe auchSee Also

ÜbersichtOverview
Sprachunabhängigkeit und sprachunabhängige KomponentenLanguage Independence and Language-Independent Components
Metadaten und selbstbeschreibende KomponentenMetadata and Self-Describing Components
Ilasm.exe (IL-Assembler)Ilasm.exe (IL Assembler)
SicherheitSecurity
Interoperabilität mit nicht verwaltetem CodeInteroperating with Unmanaged Code
BereitstellungDeployment
Assemblys in der Common Language Runtime (CLR)Assemblies in the Common Language Runtime
AnwendungsdomänenApplication Domains