Ответ
DLL (Dynamic Link Library) — это исполняемый файл, содержащий код, данные и ресурсы, которые могут использоваться несколькими приложениями одновременно. Его структура зависит от платформы (нативная Windows vs. .NET).
Основные компоненты нативной (C/C++) DLL:
- PE-заголовок (Portable Executable): Определяет структуру файла.
- Секции кода (.text): Скомпилированный машинный код функций.
- Секции данных (.data, .rdata): Инициализированные и константные данные.
- Таблица экспорта: Список функций, которые библиотека предоставляет внешним программам.
- Таблица импорта: Ссылки на функции из других DLL, которые использует эта библиотека.
- Ресурсы (.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):
- PE-заголовок: Аналогично нативным DLL.
- CLR-заголовок: Информация для загрузки Common Language Runtime.
- Метаданные: Полное описание всех типов, их членов, зависимостей и атрибутов сборки. Это основа рефлексии и безопасного выполнения.
- Промежуточный язык (MSIL): Код, скомпилированный в инструкции IL, а не в машинный код.
- Ресурсы (манифестные): Внедренные ресурсы, специфичные для .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.