Создание автономного .exe в C#: понятное руководство для начинающих

Если вы написали программу на C#, естественно хочется, чтобы она запускалась без необходимости устанавливать .NET SDK или дополнительных библиотек. Для этого существует возможность собрать автономный .exe — полноценный исполняемый файл, который работает на любом компьютере с Windows. В этой статье мы разберём, как это делается, почему это удобно и как избежать типичных ошибок.

Введение

Язык C# и платформа .NET позволяют легко собирать программы в формат .exe. По умолчанию такие файлы зависят от установленной версии .NET. Однако, если вы хотите передать приложение пользователю, у которого .NET не установлен, можно собрать self-contained (автономный) вариант. Он включает в себя все нужные библиотеки и даже сам .NET, превращая вашу программу в полностью самостоятельный пакет.

Основная теория

Когда вы создаёте проект C# в Visual Studio или через командную строку, по умолчанию сборка использует режим framework-dependent — то есть исполняемый файл полагается на уже установленный .NET. Это делает размер файла меньше, но требует, чтобы у пользователя был установлен соответствующая среда выполнения.

Режим self-contained включает все зависимости внутрь одного пакета. Такой .exe может быть больше по размеру, но зато не требует ничего дополнительно — его можно запускать на любом компьютере с Windows, даже без установленного .NET Framework.

Другими словами: автономный .exe — это как упакованный чемодан с одеждой, инструментами и всем, что нужно. Неважно, где вы его откроете — внутри всё уже есть.

Пошаговая практика

Давайте соберём автономный .exe из простого C# проекта. Для примера возьмём консольное приложение.

Шаг 1. Создайте проект

dotnet new console -n MyApp
cd MyApp

Шаг 2. Соберите обычный .exe

dotnet publish -c Release

Результат появится в папке bin/Release/net8.0/publish (или другой, в зависимости от версии .NET). Но этот файл будет зависеть от установленного .NET.

Шаг 3. Соберите автономный .exe

dotnet publish -c Release -r win-x64 --self-contained true

Параметры:

  • -r win-x64 — целевая платформа (можно указать win-arm64, linux-x64 и др.)
  • --self-contained true — включает .NET Runtime внутрь сборки

Шаг 4. Соберите один файл

Чтобы сделать один исполняемый файл без кучи дополнительных DLL, добавьте флаг /p:PublishSingleFile=true:

dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true

Теперь в папке publish появится один единственный файл MyApp.exe, готовый к запуску.

Шаг 5. (Опционально) Уменьшите размер

Чтобы сжать итоговый файл и удалить ненужные части, используйте параметр /p:PublishTrimmed=true:

dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true /p:PublishTrimmed=true

Это включит встроенный триммер .NET, который анализирует используемые сборки и убирает всё лишнее.

Типичные ошибки

  • Ошибка “Framework not found”: вы забыли добавить --self-contained true.
  • Огромный размер файла: автономная сборка включает весь .NET, поэтому используйте /p:PublishTrimmed=true.
  • Отсутствуют нужные файлы: если вы читаете внешние ресурсы (например, конфиги), убедитесь, что они копируются в каталог publish.
  • Проблемы с антивирусом: некоторые антивирусы ошибочно помечают самосборные .exe как подозрительные. Добавьте папку проекта в исключения.

Вывод / Заключение

Создание автономного .exe в C# — это простой способ упаковать вашу программу так, чтобы она работала на любом компьютере. Благодаря инструментам .NET вы можете за пару команд собрать полностью независимый исполняемый файл, не требующий дополнительных установок. Это особенно полезно для небольших утилит, корпоративных инструментов или офлайн-приложений.

Используя параметры --self-contained и /p:PublishSingleFile=true, вы превращаете свой код в настоящий продукт, готовый к распространению.