Ответ
Файл .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#.