.NET-Assemblydateiformat
.NET definiert das Binärdateiformat Assembly, das .NET-Programme vollständig beschreiben und enthalten kann. Assemblys werden sowohl für die Programme selbst als auch alle abhängigen Bibliotheken verwendet. Ein .NET-Programm kann in Form einer oder mehrerer Assemblys, ohne sonstige erforderliche Artefakte, außerhalb der entsprechenden .NET-Implementierung ausgeführt werden. Dies gilt allerdings nicht für native Abhängigkeiten wie Betriebssystem-APIs, die nicht im .NET-Assemblyformat enthalten sind, obwohl sie manchmal in diesem Format (z. B. WinRT) beschrieben werden.
Jede CLI-Komponente enthält die Metadaten für Deklarationen, Implementierungen und Verweisen, die für diese Komponente spezifisch sind. Darum werden die komponentenspezifischen Metadaten als Komponentenmetadaten und die resultierende Komponente als selbstbeschreibend bezeichnet – laut ECMA 335 I.9.1, „Components and assemblies“ (Komponenten und Assemblys).
Das Format ist als ECMA 335 vollständig spezifiziert und standardisiert. Alle .NET-Compiler und -Runtimes verwenden dieses Format. Das Vorhandensein eines dokumentierten und unregelmäßig aktualisierten Binärformats ist ein großer Vorteil (wenn nicht gar eine Voraussetzung) für die Interoperabilität gewesen. Die letzte wesentliche Aktualisierung des Formats fand 2005 (.NET Framework 2.0) statt, um Generics und die Prozessorarchitektur darin aufzunehmen.
Das Format ist agnostisch gegenüber CPU und Betriebssystem. Es wurde als Teil von .NET-Implementierungen verwendet, die auf viele Chips und CPUs abzielen. Trotz seines Windows-Erbes ist das Format unter jedem Betriebssystem implementierbar. Das wohl wichtigste Argument für die Betriebssysteminteroperabilität ist, dass die meisten Werte im Little-Endian-Format gespeichert werden. Es besteht keine bestimmte Affinität zur Zeigergröße des Computers (z.B. 32-Bit, 64-Bit).
Das .NET-Assemblyformat ist auch sehr aussagekräftig über die Struktur einer bestimmten Anwendung oder Bibliothek. Es beschreibt die internen Komponenten einer Assembly, insbesondere Assemblyverweise und definierte Typen sowie deren interne Struktur. Tools oder APIs können diese Informationen für die Anzeige lesen und verarbeiten, oder um programmatische Entscheidungen zu treffen.
Format
Das .NET-Binärformat basiert auf dem Windows PE-Dateiformat. In der Tat sind .NET-Klassenbibliotheken konforme Windows PE-Dateien und scheinen auf den ersten Blick Windows-Dynamic Link Librarys (DLLs) oder ausführbare Anwendungsdateien (EXE-Dateien) zu sein. Dies ist ein sehr nützliches Merkmal unter Windows, wo sie sich als native ausführbare Binärdateien tarnen können und weithin als solche behandelt werden (z.B. Laden durch das Betriebssystem, PE-Tools).
Assemblyheader aus ECMA 335 II.25.1, „Structure of the runtime file format“ (Struktur des Runtimedateiformats).
Verarbeiten der Assemblys
Es ist möglich, Tools oder APIs zum Verarbeiten von Assemblys zu schreiben. Assemblyinformationen ermöglichen es Ihnen, programmatische Entscheidungen zur Laufzeit zu treffen, Assemblys neu zu schreiben, API IntelliSense in einem Editor bereitzustellen und Dokumentation zu generieren. System.Reflection, System.Reflection.MetadataLoadContext und Mono.Cecil sind gute Beispiele für Tools, die häufig für diesen Zweck verwendet werden.