Как выглядит файл библиотеки (.dll) на диске с точки зрения .NET?

«Как выглядит файл библиотеки (.dll) на диске с точки зрения .NET?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Файл .NET сборки (DLL или EXE) — это PE-файл (Portable Executable), содержащий как стандартные Windows-заголовки, так и специфичные для .NET данные. Его структура выглядит так:

1. PE-заголовки (Portable Executable):

  • Стандартный заголовок DOS (для совместимости).
  • Заголовок PE, описывающий структуру файла для загрузчика Windows.
  • Таблицы секций (например, .text, .rsrc).

2. CLR-заголовок:

  • Указывает, что это управляемый .NET-модуль.
  • Содержит метаданные о требуемой версии CLR, точку входа (Main метод) и расположение других критических структур.

3. Метаданные .NET:

  • Это сердце сборки. Таблицы, полностью описывающие её содержимое:
    • Таблица TypeDef: все классы, структуры, интерфейсы.
    • Таблица MethodDef: все методы с сигнатурами.
    • Таблицы FieldDef, PropertyDef, EventDef.
    • Таблица AssemblyRef: ссылки на другие зависимые сборки.
  • Метаданные позволяют CLR безопасно загружать и исполнять код, а также обеспечивают рефлексию.

4. IL-код (Intermediate Language):

  • Скомпилированный, но не нативный код ваших методов.
  • Хранится в секции .text.
  • JIT-компилятор (Just-In-Time) преобразует этот IL в машинный код во время выполнения.

5. Ресурсы (опционально):

  • Внедрённые файлы (иконки, строки, изображения), хранятся в секции .rsrc или как managed-ресурсы в метаданных.

Практический пример: Сборка, скомпилированная для .NET 6.0, будет иметь путь вида: C:ProjectsMyAppbinReleasenet6.0MyLibrary.dll

Как исследовать: Используйте инструменты вроде ildasm.exe (из .NET SDK) или dotPeek от JetBrains, чтобы увидеть эту структуру и декомпилировать IL-код обратно в C#.