До .NET CORE 3.0
dotnet publish -r win-x64 -c Release --self-contained
Довольно понятно:
- Опубликоватьпроект из текущего каталога.
- Сборка проекта для запуска на 64-битных компьютерах с Windows.
- Сборка в режиме конфигурации выпуска
- Публикация всего как «автономного», чтобы все необходимое для запуска приложения было упаковано с нашим исполняемым файлом
Так что этоработает правильно, мы получаем папку с нашим exe-файлом и всем необходимым для его запуска, но проблема в том, что для запуска даже приложения консоли HelloWorld требуется тонна.
![Publish folder](https://i.stack.imgur.com/4SUcb.png)
После .NET CORE 3.0
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
Все, что мы делаем, - запускаем нашу команду публикации, но сообщаем ее пакетуэто в одном файле.Вы заметите, что мы больше не указываем автономный флаг.Это потому, что предполагается, что если вы упаковываете как один exe-файл, вам понадобятся все его зависимости вместе с ним.Имеет смысл.
![Publish folder](https://i.stack.imgur.com/aGGoe.png)
Один аккуратный exe!Когда это выполняется, зависимости извлекаются во временный каталог, а затем все запускается оттуда.По сути это zip нашей предыдущей папки публикации!У меня было несколько игр с этим и, честно говоря, это просто работает.Больше нечего сказать по этому поводу.Это просто работает.
Размер файла и стоимость запуска
- Зоркие глаза заметят что-то о скриншоте выше.Размер файла.Это более 70 МБ!Это безумие для приложения, которое делает только вывод Hello World на экран!Это решено в Preview 6 .NET Core 3.0 с функцией под названием IL Linker или триммер публикации, которая пропускает неиспользуемые библиотеки DLL.
- Другая проблема, с которой вы можете столкнуться, это небольшая стоимость запуска при первом запуске автономного исполняемого файла.Поскольку при первом запуске необходимо по существу разархивировать все зависимости во временный каталог, для его завершения потребуется немного времени.Это не безумие (5 секунд или около того), но это заметно.К счастью, при последующих запусках он использует эту уже разархивированную временную папку, поэтому запуск происходит немедленно.
Измените csproj и добавьте PublishTrimmed = true.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>
</Project>
Теперь выполните следующую команду:
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
Ссылка :
- https://dotnetcoretutorials.com/2019/06/20/publishing-a-single-exe-file-in-net-core-3-0/
- https://www.hanselman.com/blog/MakingATinyNETCore30EntirelySelfcontainedSingleExecutable.aspx