Kompilieren von MSIL in systemeigenen Code

Bevor Microsoft Intermediate Language (MSIL) ausgeführt werden kann, muss sie mit einem JIT-Compiler (Just-In-Time) von .NET Framework in systemeigenen Code konvertiert werden. Dies ist prozessorspezifischer Code, der in derselben Computerarchitektur wie der JIT-Compiler ausgeführt wird. Da die Common Language Runtime für jede unterstützte Prozessorarchitektur einen JIT-Compiler bereitstellt, können Entwickler MSIL-Anweisungen schreiben, die auf Computern unterschiedlicher Architektur sowohl JIT-kompiliert als auch ausgeführt werden können. Verwalteter Code kann jedoch unter einem bestimmten Betriebssystem nur dann ausgeführt werden, wenn dieser plattformspezifische, systemeigene APIs oder eine plattformspezifische Klassenbibliothek aufruft.

Bei der JIT-Kompilierung wird berücksichtigt, dass ein Teil des Codes bei der Ausführung möglicherweise nicht aufgerufen wird. Statt für das Konvertieren der gesamten MSIL einer PE-Datei (Portable Executable) in systemeigenen Code Zeit und Speicherplatz zu beanspruchen, wird die MSIL während der Ausführung nach Bedarf konvertiert. Der resultierende systemeigene Code wird gespeichert, sodass darauf bei nachfolgenden Aufrufen zugegriffen werden kann. Das Ladeprogramm erstellt einen Stub und fügt diesen an jede Methode des Typs an, wenn dieser geladen wird. 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 die Ausführung an den Speicherort des systemeigenen Codes geleitet wird. Nachfolgende Aufrufe der JIT-kompilierten Methode gehen direkt an den zuvor generierten systemeigenen Code, wodurch die Zeit für die JIT-Kompilierung und Ausführung des Codes reduziert wird.

Die Common Language Runtime unterstützt noch einen weiteren Kompilierungsmodus, die Codegenerierung bei Installation. Dabei wird MSIL wie durch einen normalen JIT-Compiler in systemeigenen Code konvertiert. Es werden jedoch umfangreichere Codeeinheiten auf einmal konvertiert und der entstandene systemeigene Code gespeichert, um später beim Laden und Ausführen der Assembly verwendet zu werden. Bei Verwendung von Codegenerierung bei Installation wird die gesamte Assembly, die gerade installiert wird, in systemeigenen Code konvertiert. Dabei wird berücksichtigt, was über bereits installierte Assemblys bekannt ist. Die erstellte Datei kann schneller geladen und gestartet werden, als wenn sie im Standard-JIT-Verfahren in systemeigenen Code konvertiert worden wäre.

Beim Kompilieren der MSIL in systemeigenen Code muss der 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. 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. Typsicherheit ermöglicht das Isolieren von Objekten voneinander und trägt damit zum Schutz dieser Objekte vor unabsichtlicher oder böswilliger Beschädigung bei. Typsicherheit bietet außerdem die Gewissheit, dass Sicherheitsbeschränkung für Code zuverlässig erzwungen werden können.

Für die Laufzeit ist erforderlich, dass die folgenden Aussagen auf überprüfbar typsicheren Code zutreffen:

  • Ein Verweis auf einen Typ ist vollständig kompatibel mit dem Typ, auf den verwiesen wird.

  • Für ein Objekt werden nur angemessen definierte Operationen aufgerufen.

  • Identitäten sind, was sie von sich behaupten.

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. Code muss z. B. die Überlastung von Speicherorten beim Zugriff auf Felder eines Objekts verhindern. 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. Bei der Überprüfung wird ein genau definierter Abschnitt typsicheren Codes übergeben, und es wird ausschließlich Code übergeben, der typsicher ist. Aufgrund der 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. Wenn die Sicherheitsrichtlinien typsicheren Code erfordern und der Code die Überprüfung nicht besteht, wird bei der Ausführung des Codes eine Ausnahme ausgelöst.

Siehe auch

Konzepte

Der verwaltete Ausführungsprozess