Зарелизил небольшой проект для лабораторной, из библиотек только системная, забираю exe и он не работает. Проверяю в папке Release все работает. Выяснил, что для запуска ему необходимы dll, создаваемая вместе с проектом и runtimeconfig.json. Это баг или так и должно быть? И можно ли как-нибудь скомпилировать все в один exe файл?
-
1@EvgeniyZ ни разу не дубликат, тот вопрос вообще не касается однофайловых сборок – Pavel Mayorov Dec 21 '20 at 11:33
-
@PavelMayorov С чего это вдруг не касается? Вы вон дали ответ, где делаете публикацию через консольную команду, а там тоже самое, только через интерфейс студии. – EvgeniyZ Dec 21 '20 at 11:38
-
@EvgeniyZ вы правда не видите разницы между Self-contained и Single file? Попробуйте сделать эти публикации и увидите разницу. – Pavel Mayorov Dec 21 '20 at 11:39
-
@PavelMayorov Я сейчас не про разницу говорю, а про аналогичные действия решения задачи. То, что требуется в этом вопросе, решается теми же средствами, что описаны и в том вопросе, разницей лишь может быть пару галочек. Вот если мы откроем тот ответ, сделаем все по нему, настроим под себя как надо, то на выходе что мы получим? Сможем-ли мы получить один exe файл? Да. Это аналогично вашей консольной команде? Да. Ну так почему это "ни разу не дубликат"? – EvgeniyZ Dec 21 '20 at 11:44
-
@EvgeniyZ ну вот эта разница и делает вопросы не-дубликатами – Pavel Mayorov Dec 21 '20 at 14:54
-
@PavelMayorov Спорить тут бессмысленно, я вам лишь обосновал свое видение ситуации, по которому до сих пор считаю, что тот ответ отвечает на поставленный здесь вопрос. Там сразу видно, что надо сделать публикацию, на скрине вон видна четко галка "Produce single file" (что является полной копией вашей команды из ответа), а информация про "Self-contained" лишней не будет. Да, там акцент больше идет именно на "Self-contained", но ведь тот ответ решает сразу и поставленный тут вопрос, верно? Поэтому я все же считаю это дубликатом. Это как вопросы вон про XML, где разный код, но решение одно. – EvgeniyZ Dec 21 '20 at 15:25
1 Answers
Так и должно быть: .NET Core штука кросс-платформенная, а .exe-файлы запускаются только на Windows. Вот и решили отделить саму программу от платформозависимой "запускалки".
Фактически, ваша программа на самом деле является именно тем самым .dll-файлом, и может быть запущена командой
dotnet ВашаПрограмма.dll
А exe-файл - это просто что-то вроде ярлыка.
Однако, можно попытаться и в один файл всё запихнуть. Для этого надо в папке с проектом выполнить следующую команду:
dotnet publish -r win10-x64 -p:Configuration=Release -p:PublishSingleFile=true
Здесь win10-x64 - это идентификатор рантайма, который указывает для какой из платформ делать публикацию. Полный их список можно найти вот тут: Каталог идентификаторов сред выполнения (RID) в .NET Core
Результат публикации найти можно по пути bin\…\Release\win10-x64\publish, также можно указать свой путь с помощью параметра -o:
dotnet publish … -o ваш\путь
Получив такую команду, сборщик .NET Core SDK попытается упихнуть в один файл что сможет. Но не факт что получится: если вы используете какие-нибудь недоработанные пакеты, возможны баги (и не думайте что сам .NET Core доработан). Однако, попробовать никто не мешает.
Подробности: https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0#single-file-executables
- 58,537