Unter einem Assembly versteht man vereinfacht gesagt alle Komponenten, die eine Anwendung referenziert. Es wird über ein Manifest bekannt gemacht und beinhaltet ein oder mehrere Module. Das Mannifest enthält die Assembly-Identität (bestehend aus Name, Version und Ländercode), eine Liste der Module aus denen das Assemlby besteht, referenzierte Assemblies, exportierte Ressourcen und Typen und Attribute.
Ein Modul wiederum enthält MSIL-Code und Metadaten. Die Metadaten beschreiben sämtliche Typen, die in einer Komponente definiert sind. Dazu zählen Schnittstellen, Klassen und deren Membervariablen.
Auf Basis der Informationen einer Assembly kann die CLR Klassen auffinden und laden, Instanzen im Arbeitsspeicher anordnen, Methodenaufrufe lösen, systemeigenen Code generieren, Sicherheit erzwingen und Laufzeitkontextgrenzen festlegen.
Bei Programmstart müssen die direkt notwendige Assemblies vorhanden sein - andere können später nachgeladen werden.
Statische Assemblies werden in der PE-Form gespeichert und können Code und Ressourcen wie Ressource-Dateien, Bitmaps, ... enthalten.
Dynamische Assamblies werden vom Framework erzeugt und nicht auf die Platte geschrieben.
Ein Assembly kann eine Bibliothek sein, sowie in Java packages. Mit Hilfe von Assemblies wird die verwaltete Codearchitektur des .NET Framework von der CLR und von den Klassenbibliotheken implementiert.
Das .NET Framework unterscheidet zwischen Private Assembly und Shared Assembly.
Ein Private Assembly wird nur von einer Anwendung benutzt. Hier werden alle Komponenten in das Verzeichnis der Anwendung oder in ein Unterverzeichnis kopiert. Die Identifikation des Assembly findet anhand eines einfache Namens statt.
Ein Shared Assembly kann global von allen Anwendungen benutzt werden. Es muss im Global Assembly Cache (GAC) installiert sein. Dies ist ein systemweiter Speicherbereich. Shared Assemblies unterliegen einer Versionsüberprüfung durch die CLR und werden über einen Strong Name identifiziert. Die Eindeutigkeit des Namens wird mit Hilfe der Puplic-Key-Verschlüsselung sichergestellt. So kann sichergestellt werden, dass Code nicht unerlaubt manipuliert wird.
Als Reflection wird das Auslesen der Metadaten bezeichnet.
Sobald die Common Language Runtime einen Typ instantiiert (z.B. eine Klasse) wird gleichzeitig ein Objekt vom Typ System.Typ angelegt und der soeben erzeugten Typinstanz zugeordnet. Über die Methoden dieses "Typobjektes" können dann die Metadaten ausgelesen werden. Die folgende Abbildung verdeutlicht diesen Zusammenhang.