Из чего состоит DLL-файл?

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

Ответ

DLL (Dynamic Link Library) — это исполняемый файл, содержащий код, данные и ресурсы, которые могут использоваться несколькими приложениями одновременно. Его структура зависит от платформы (нативная Windows vs. .NET).

Основные компоненты нативной (C/C++) DLL:

  1. PE-заголовок (Portable Executable): Определяет структуру файла.
  2. Секции кода (.text): Скомпилированный машинный код функций.
  3. Секции данных (.data, .rdata): Инициализированные и константные данные.
  4. Таблица экспорта: Список функций, которые библиотека предоставляет внешним программам.
  5. Таблица импорта: Ссылки на функции из других DLL, которые использует эта библиотека.
  6. Ресурсы (.rsrc): Иконки, строки, диалоговые окна, меню.

Пример экспорта функции в C++:

// mathlib.h
#ifdef MATHLIB_EXPORTS
#define MATHLIB_API __declspec(dllexport)
#else
#define MATHLIB_API __declspec(dllimport)
#endif

extern "C" MATHLIB_API int Add(int a, int b);

Структура .NET-сборки (DLL):

  1. PE-заголовок: Аналогично нативным DLL.
  2. CLR-заголовок: Информация для загрузки Common Language Runtime.
  3. Метаданные: Полное описание всех типов, их членов, зависимостей и атрибутов сборки. Это основа рефлексии и безопасного выполнения.
  4. Промежуточный язык (MSIL): Код, скомпилированный в инструкции IL, а не в машинный код.
  5. Ресурсы (манифестные): Внедренные ресурсы, специфичные для .NET.

Пример .NET-библиотеки:

// Calculator.cs
namespace MyLibrary;
public static class Calculator
{
    public static int Add(int a, int b) => a + b;
}
// После компиляции в `MyLibrary.dll` другой проект может добавить ссылку на эту DLL и использовать класс Calculator.

Ключевое отличие: .NET DLL содержит метаданные и IL, что позволяет использовать их без регистрации в системе (в отличие от COM) и обеспечивает кроссплатформенность через .NET Runtime.