Разница Между .Dll И .Exe

Скачать

📦 Разница между .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#

⚙️ Как это работает под капотом?

  1. При сборке в Visual Studio / .NET CLI:

  2. Указывается тип проекта: exe или library.

  3. Компилятор csc (или dotnet build) создает соответствующий PE-файл (Portable Executable).

  4. CLR (Common Language Runtime) загружает:

  5. .exe — как приложение, и запускает Main().

  6. .dll — при вызове Assembly.Load() или через ссылку (Add Reference).

  7. Система сборки (.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, чтобы достичь модульности, переиспользуемости и тестируемости.