.NET 定义二进制文件格式( 程序集),用于完全描述和包含 .NET 程序。 程序集用于程序本身以及所有依赖库。 可以将 .NET 程序作为一个或多个程序集执行,没有其他必需的组件,除了适当的 .NET 实现之外。 本机依赖项(包括操作系统 API)是一个独立的问题,并不包含在 .NET 程序集格式中,虽然有时它们会被描述为使用该格式(例如 WinRT)。
每个 CLI 组件承载特定于该组件的声明、实现和引用的元数据。 因此,特定于组件的元数据称为组件元数据,因此生成的组件据说是自描述的 – 来自 ECMA 335 I.9.1、组件和程序集。
格式已完全指定并标准化为 ECMA 335。 所有 .NET 编译器和运行时都使用此格式。 记录和不经常更新的二进制格式的存在是互作性的主要好处(可以说是一项要求)。 该格式是在 2005 年(.NET Framework 2.0)中以实质性方式更新的,以适应泛型和处理器体系结构。
格式与 CPU 和 OS 无关。 它已被用作面向许多芯片和 CPU 的 .NET 实现的一部分。 虽然格式本身具有 Windows 遗产,但它在任何作系统上都可实现。 对于 OS 互操作性,这可以说是一项最重大的选择,因为大部分值存储在 Little-endian 格式中。 它与计算机指针大小没有特定的关联(例如,32 位、64 位)。
.NET 程序集格式也非常描述给定程序或库的结构。 它描述程序集的内部组件,特别是定义的程序集引用和类型及其内部结构。 工具或 API 可以读取和处理此信息,以便显示或做出编程决策。
格式
.NET 二进制格式基于 Windows PE 文件格式 。 事实上,.NET 类库符合 Windows PES,并一目了然地显示为 Windows 动态链接库(DLL)或应用程序可执行文件(EXE)。 这是 Windows 上非常有用的特征,他们可以将其伪装为本机可执行二进制文件并获取一些相同的处理(例如 OS 加载、PE 工具)。
ECMA 335 II.25.1 中的程序集标头(运行时文件格式的结构)。
处理程序集
可以编写工具或 API 来处理程序集。 程序集信息支持在运行时做出编程决策、重写程序集、在编辑器中提供 API IntelliSense 以及生成文档。 System.Reflection、 System.Reflection.MetadataLoadContext和 Mono.Cecil 是经常用于此目的的工具的一个很好的示例。