Voraussetzung für den gemeinsamen Zwischencode MSIL sind:
Die Common Language Runtime ist die Laufzeitumgebung des .NET Framework und vergleichbar mit der virtuellen Maschine von Java, der JVM.
Unter Aufsicht der CLR wird aus dem Quelltext der Zwischensprache MSIL bei Bedarf nativer Code kompiliert und ausgeführt. Die Runtime des .NET Framework agiert also als Manager für den Code, der ausgeführt werden soll. Aktionen wie das Anlegen eines Objektes oder das Ausführen eines Methodenaufrufs werden nicht direkt ausgeführt, sondern an die CLR delegiert.
Die CLR stellt die folgenden Dienste bereit:
Der Überprüfungsprozess während der JIT-Kompilierung verhindert häufige Programmierfehler, wie beispielsweise das Verwenden eines Integerwertes als Zeiger zum Zugreifen auf zufällige Speicherorte, das Behandeln eines Objekts als einen anderen Typ zum Zulassen des Lesezugriffs auf private Speicherbereiche außerhalb der Objektgrenzen, das Zugreifen auf ein privates Feld oder eine private Methode außerhalb der Klasse, das Zugreifen auf ein neu erstelltes Objekt vor dem Initialisieren, um eine falsche Funktionsweise zu verursachen oder um auf andere Informationen in einem Speicher zuzugreifen. Weitere Beispiele für durch den Überprüfungsprozess verhinderte Fehler sind Pufferüberschreitungen (das Ausgeben von Parametern, die die von der aufgerufenen Methode erwartete Größe überschreiten), das Referieren auf Speicher mit anderem Inhalt als die definierten Variablen- oder Methodeneinstiegspunkte, das Referieren auf Stackspeicherorte außerhalb des zugewiesenen Stackrahmens (ungültige Referenzen) sowie das Übermitteln der Ausführung an zufällige Orte innerhalb eines Prozesses.
Die CLR erleichtert das Entwerfen von Komponenten und Anwendungen, deren Objekte sprachübergreifend interagieren. Diese sprachübergreifende Integration wird durch die Verwendung eines von der CLR definierten allgemeinen Typensystems, durch Sprachcompiler und Tools für die CLR ermöglicht.
Das Common Type System ist ein allgemeines Typensystem das die Regeln für die Vorgehensweise der CLR beim Deklarieren, Verwenden und Verwalten von Typen vorgibt. Es gewährleistet die sprachenübergreifende Integration und die Typsicherheit. Dadurch dass die CLR allen .NET Sprachen ein umfassendes Typsystem zur Verfügung stellt, ist dieses nicht mehr Bestandteil einer Sprache. Das Typsystem wandert sozusagen vom Compiler in die Runtime. Typen werden damit eindeutig, weil es nicht mehr verschiedene Repräsentationen ein und desselben Typs gibt. Eine Zeichenkette unter Visual Basic ist identisch mit eine Zeichenkette unter C#. Sprachen sind somit per Definition interoperabel, da sie das gleiche Typsystem benutzen.
Die spezifizierten Datentypen müssen sprachübergreifend geltend. Sämtliche Typen, die über das CTS definiert sind werden als Managed Types bezeichnet. Sie werden grundsätzlich von Typ System.Object abgeleitet.
Kurz gesagt: Alles ist ein Objekt!
Im .NET Framework wird zwischen ValueTypes und Reference Types unterschieden.
ValueTypes werden auf dem Stack angelegt, enthalten Daten, können nicht den Wert null annehmen und repräsentieren im Wesentlichen Primitive Datentypen wie int, Aufzählungen und Strukturen.
Reference Type werden auf dem Heap angelegt, enthalten Referenzen auf Objekte, können den Wert null annehmen und repräsentieren im Wesentlichen folgende Typen: Zeichenketten, Klassen und Felder.
Wie kann aber ein ValueType eine Objektmethode aufrufen?
Die Runtime legt automatisch ein temporäres Objekt auf dem Heap an und kopiert den Wert des ValueTypes dort hinein. Dann kann der Methodenaufruf erfolgen. Anschließend wird das Objekt wieder entfernt und man arbeitet mit dem ValueType weiter. Diese Techniken nennt man Boxing und Unboxing. Boxing wird das Konvertieren eines ValueTypes in einen ReferenceType bezeichnet, mit Unboxing der umgekehrte Vorgang.
Man kann Boxing und Unboxing allerdings auch explizit einsetzen, um das Arbeiten mit temporären Objekten zu vermeiden.
Im Hinblick auf die Performance ist diese Vorgehensweise ein guter Kompromiss. Es ist nur dann ein echtes Objekt auf dem Heap vorhanden, wenn es wirklich gebraucht wird. Für den Entwickler ist dies vollkommen transparent. Aus seiner Sicht sind alle Typen Objekte und die Runtime erledigt "den Rest" hinter den Kulissen.
Von Bedeutung ist diese Technik, wenn Programmierer eigene Typen implementieren. Sie können so auf einfache Art und Weise "leichtgewichige" Objekte erzeugen, in dem sie einen Typ als Struktur (ValueTyp, auf dem Stack abgelegt) definieren.
Die Common Language Specification ist eine offengelegte Spezifikation von Microsoft, um die heterogenen Sprachen auf einen kleinsten gemeinsamen Nenner zu bringen.
Beim Hinzufügen einer neuen Programmiersprache zum .NET Framework müssen Konstruktionsrichtlinien und Möglichkeiten der CLS beachtet werden. Sie stellen Vorschriften für den Compilerbau dar. Die CLS beschreibt Funktionen, über die jede Sprache verfügen muss, um das .NET Framework und die CLR verwenden zu können und damit Komponenten interagieren, die in anderen Sprachen entwickelt wurden. Die Typisierung der Variablen ist in der CLR durch die Common Language Spezification standardisiert. Durch das Befolgen der CLS-Standards kann sichergestellt werden, dass bei Übergabe einer Integer-Variablen aus einem VB-Programm an eine in C# geschriebene Komponente der Typ exakt der gleiche ist.