📦 Разница между .dll
и .exe
в .NET
🧠 Что такое .exe
и .dll
Расширение | Название | Назначение |
---|---|---|
.exe |
Executable (исполняемый файл) | Это программа, которую можно запустить |
.dll |
Dynamic Link Library (библиотека) | Набор функций и классов, который нельзя запустить напрямую |
🔧 Структурные различия
.exe
- Содержит точку входа:
Main()
— это метод, с которого начинается выполнение программы. - Является полноценным приложением: консольным, WinForms, WPF, и т.д.
- Обычно один на проект, это "точка запуска".
.dll
- Не содержит точки входа — её нельзя "запустить".
- Используется как плагин, модуль, библиотека.
- Содержит классы, интерфейсы, методы — которые могут быть переиспользованы другими проектами.
📦 Что конкретно находится внутри .exe
и .dll
Элемент | .exe |
.dll |
---|---|---|
PE-заголовок | Да (Portable Executable header) | Да (тот же формат PE) |
CLR metadata | Да | Да |
IL код (CIL) | Да | Да |
Точка входа (Entry Point) | Обязательно (Main method) | Отсутствует |
Ресурсы | Может содержать (иконки, строки) | Может содержать |
Импортируемые функции | Да | Да |
Экспортируемые символы | Нет | Да (функции и классы, доступные извне) |
Исполняемый код | Да | Да (но вызывается через другие сборки) |
Отладочные символы | Обычно отдельно (.pdb) | Обычно отдельно (.pdb) |
- Важный момент: по формату
.exe
и.dll
в .NET — это почти один и тот же формат, различие — в наличии точки входа (Entry Point) и некоторых PE-флагов, указывающих ОС, что файл — исполняемый или библиотека. .dll
не запускается самостоятельно, она загружается в процессе работы.exe
или другого процесса.
🛠 Зачем использовать .dll
?
Причина | Пример |
---|---|
Повторное использование кода | Классы, которые используются в нескольких проектах (например, логгер) |
Разделение логики | UI — в .exe , бизнес-логика — в .dll |
Плагины/модули | Подгрузка через Assembly.Load |
Interop с другими языками | C++ → DLL → C# |
⚙️ Как это работает под капотом?
-
При сборке в Visual Studio / .NET CLI:
-
Указывается тип проекта:
exe
илиlibrary
. -
Компилятор
csc
(илиdotnet build
) создает соответствующий PE-файл (Portable Executable). -
CLR (Common Language Runtime) загружает:
-
.exe
— как приложение, и запускаетMain()
. -
.dll
— при вызовеAssembly.Load()
или через ссылку (Add Reference
). -
Система сборки (.csproj) определяет:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType> <!-- или Library -->
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
</Project>
🕹 Когда использовать .dll
, а когда .exe
?
Хочешь... | Используй |
---|---|
Запустить приложение | .exe |
Написать модуль, подключаемый в другие | .dll |
Разбить проект на части (архитектура) | .dll |
Сделать библиотеку для других разработчиков | .dll |
🔗 Пример: использование DLL в EXE
1. Создай проект-библиотеку:
dotnet new classlib -n MyLibrary
// MyLibrary/MyMath.cs
namespace MyLibrary;
public class MyMath {
public static int Add(int a, int b) => a + b;
}
2. Создай консольный проект и подключи библиотеку:
dotnet new console -n MyApp
cd MyApp
dotnet add reference ../MyLibrary/MyLibrary.csproj
// MyApp/Program.cs
using MyLibrary;
Console.WriteLine(MyMath.Add(2, 3)); // 5
🧬 DLL и EXE в C/C++
В C/C++ .dll
содержит __declspec(dllexport)
и extern "C"
, а в C# можно подключить через:
[DllImport("mydll.dll")]
public static extern int Add(int a, int b);
🧩 Сравнение по возможностям
Функция | .exe |
.dll |
---|---|---|
Точка входа (Main ) |
✅ | ❌ |
Можно запустить напрямую | ✅ | ❌ |
Можно подключить к другому проекту | ❌ | ✅ |
Используется в Interop | ❌ | ✅ |
Может содержать классы/методы | ✅ | ✅ |
📎 Заключение
.exe
— это приложение..dll
— это модуль для переиспользования.- В реальных проектах лучше разделять логику между
.exe
и.dll
, чтобы достичь модульности, переиспользуемости и тестируемости.