Публикация .NET Core App как переносимого исполняемого файла - PullRequest
0 голосов
/ 05 июня 2018

У меня есть простое приложение .net core, и я публикую его с помощью следующей команды:

 dotnet publish -c Release -r win10-x64

SqlLocalDbStarter.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Win32.Registry" Version="4.5.0" />
  </ItemGroup>

</Project>

Когда процесс публикации завершен dotnetсоздайте папку win10-x64 в папке bin\Release, затем, после ее открытия, папка содержит папку publish и некоторые файлы dll и exe.

Есть некоторые проблемы для меня:

  • Какой из exe файлов (внутри / снаружи папки публикации) мне нужен для PE-приложения?
  • Почему когдая вырезал exe файл и переместил его в другое место, где он не запускается (без сообщения)?
  • Если мне нужны все файлы dll для запуска приложения, так что есть варианты буксировки для меня (внутри/ за пределами папки публикации), размер внутренней папки публикации - 66 МБ, а внешней папки публикации - 1 МБ.
  • Я хочу иметь один exe файл для запуска моей программы без файлов DLL.

Folder Size Image

.Net Info

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Net.Core 3.0

Net.Core 3.0 (в настоящее время в режиме предварительного просмотра) поддерживает его из коробки.Он упаковывает все данные в один .exe файл (~ 68 МБ для базового консольного приложения).Существует опция PublishTrimmed=true, которая может уменьшить размер до ~ 28 МБ путем анализа ссылок на статический код и исключения неиспользуемых сборок фреймворка из окончательной сборки.

Подробнее см. Хороший ответ, данный Гопи.

Автономные утилиты

Warp (спасибо Дариену Шеннону за упоминание этого вкомментарий) и dotnet CoreRT.Оба работают с предыдущими версиями .Net Core также

Деформация

Это инструмент, аналогичный ILMerge для классического .NET Framework.Он очень прост в использовании.Для базового консольного приложения оно может выдавать .exe ~ 35 МБ без шейкера и около 10-15 МБ с шейкером.

Dotnet CoreRT

На данный момент вы можете попытаться предварительно скомпилировать приложение в собственный однофайловый исполняемый файл, используя проект dotnet CoreRT.Я говорю «попробуй», потому что в документации написано :

Этот проект находится на ранней стадии разработки.

Тем не менее, он работает нахотя бы для простых приложений.Смотрите образец здесь .Согласно его описанию, вам нужно выполнить следующую команду в папке проекта:

dotnet new nuget 

Это добавит файл nuget.config в ваше приложение.Откройте файл и в элементе добавьте следующее:

<add key="dotnet-core" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />

Затем запустите:

dotnet add package Microsoft.DotNet.ILCompiler -v 1.0.0-alpha-* 

Затем запустите:

dotnet publish -r win-x64 -c release

После завершения вы можете найти собственный исполняемый файл в корневой папке вашего проекта в /bin/x64//netcoreapp2.0/publish/

0 голосов
/ 22 июня 2019

До .NET CORE 3.0

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

Довольно понятно:

  • Опубликоватьпроект из текущего каталога.
  • Сборка проекта для запуска на 64-битных компьютерах с Windows.
  • Сборка в режиме конфигурации выпуска
  • Публикация всего как «автономного», чтобы все необходимое для запуска приложения было упаковано с нашим исполняемым файлом

Так что этоработает правильно, мы получаем папку с нашим exe-файлом и всем необходимым для его запуска, но проблема в том, что для запуска даже приложения консоли HelloWorld требуется тонна.

Publish folder

После .NET CORE 3.0

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

Все, что мы делаем, - запускаем нашу команду публикации, но сообщаем ее пакетуэто в одном файле.Вы заметите, что мы больше не указываем автономный флаг.Это потому, что предполагается, что если вы упаковываете как один exe-файл, вам понадобятся все его зависимости вместе с ним.Имеет смысл.

Publish folder

Один аккуратный 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

Ссылка :

  1. https://dotnetcoretutorials.com/2019/06/20/publishing-a-single-exe-file-in-net-core-3-0/
  2. https://www.hanselman.com/blog/MakingATinyNETCore30EntirelySelfcontainedSingleExecutable.aspx
0 голосов
/ 05 июня 2018

Эта документация от Microsoft использует тот же dotnet publish -c Release -r win10-x64, который вы использовали, и документирует его следующим образом (выделение добавлено):

Это создает выпуск (а неотладочная версия вашего приложения для каждой целевой платформы. Полученные файлы помещаются в подкаталог с именем publish , который находится в подкаталоге подкаталога вашего проекта. \ Bin \ Release \ netcoreapp1.1. Обратите внимание, что в каждом подкаталоге содержится полный набор файлов (как файлов вашего приложения, так и всех файлов .NET Core), необходимых для запуска вашего приложения.

Наряду с файлами вашего приложения процесс публикации выдаетфайл базы данных программы (.pdb), который содержит отладочную информацию о вашем приложении.Файл полезен прежде всего для отладки исключений.Вы можете не упаковывать его с файлами вашего приложения.Однако вам следует сохранить его на тот случай, если вы захотите отладить сборку Release вашего приложения.

Поэтому правильные файлы для развертывания - это те, которые находятся в подкаталоге publish.Этот каталог составляет более 60 МБ, поскольку он включает в себя основные библиотеки .NET, необходимые для автономного развертывания.

...