.NET 程序集文件格式

.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 是经常用于此目的的工具的一个很好的示例。

注意

System.Reflection.Metadata 库 和 PEReader 并非设计用于处理不受信任的输入。 格式不正确或恶意的 PE 文件可能会导致意外行为,包括越界内存访问、崩溃或挂起。 仅将这些 API 与受信任的程序集一起使用。