Решил я тут попробовать этот ваш новый модный .NET5
Создал пустое приложение "Hello world" и откомпилил в release.
И что я вижу... Что бы запустился ехе нужно что бы рядом лежала dll и пара конфигов.
Т.е. что бы вывести "Hello World!" нужны
ConsoleApp1.exe
ConsoleApp1.dll
ConsoleApp1.runtimeconfig.json
ConsoleApp1.deps.json
Плюс еще создается какой то Ref директорий
Seriously?
Можно ли как то собрать просто один exe? В настройках проекта ничего не нашел.
Здравствуйте, HotDog, Вы писали:
HD>Решил я тут попробовать этот ваш новый модный .NET5 HD>Создал пустое приложение "Hello world" и откомпилил в release. HD>И что я вижу... Что бы запустился ехе нужно что бы рядом лежала dll и пара конфигов. HD>Т.е. что бы вывести "Hello World!" нужны HD>ConsoleApp1.exe HD>ConsoleApp1.dll HD>ConsoleApp1.runtimeconfig.json HD>ConsoleApp1.deps.json
HD>Плюс еще создается какой то Ref директорий HD>Seriously?
HD>Можно ли как то собрать просто один exe? В настройках проекта ничего не нашел.
_NN>Или задать эти свойства во время публикации: dotnet publish --self-contained /p:SelfContained=true ..
Ок, я взял эти настройки. Скомпилировал. Теперь в релиз директории лежат 226 файлов (большинство из них это "api-ms-win-*" и "System.*" dlls)...
Среди этой кучи файлов нахожу свой ConsoleApp1.exe, копирую его пару директорий выше и запускаю.
The application to execute does not exist: 'C:\@work\Temp\ConsoleApp1\bin\Release\ConsoleApp1.dll'.
Здравствуйте, HotDog, Вы писали:
HD>Ок, я взял эти настройки. Скомпилировал. Теперь в релиз директории лежат 226 файлов (большинство из них это "api-ms-win-*" и "System.*" dlls)... HD>Среди этой кучи файлов нахожу свой ConsoleApp1.exe, копирую его пару директорий выше и запускаю. HD>
HD>The application to execute does not exist: 'C:\@work\Temp\ConsoleApp1\bin\Release\ConsoleApp1.dll'.
HD>
Хорошо, работает... Работает в том смысле, что я получил один exe файл размером в 60 Mb и работающим только на win64
Но это не то, чего я хотел добиться. Хотелось бы получить один ехе, который работает на компе где уже предустановлен .NET5, независимо от платформы (х86,х64)
Т.е. аналог консольной программы написанной на .NET FW 4.x
Здравствуйте, HotDog, Вы писали:
HD>Здравствуйте, _NN_, Вы писали:
_NN>>Нужна публикация через `dotnet publish` или в студии `Publish` ( https://docs.microsoft.com/ru-ru/dotnet/core/tutorials/publishing-with-visual-studio?pivots=dotnet-5-0 )
HD>Хорошо, работает... Работает в том смысле, что я получил один exe файл размером в 60 Mb и работающим только на win64 HD>Но это не то, чего я хотел добиться. Хотелось бы получить один ехе, который работает на компе где уже предустановлен .NET5, независимо от платформы (х86,х64) HD>Т.е. аналог консольной программы написанной на .NET FW 4.x
Ну вот содержание такого профиля, всё настраивается в настройках публикации:
Здравствуйте, Vladek, Вы писали:
V>Конкретную платформу (RuntimeIdentifier) выбрать всё же придётся, без неё единого исполняемого файла не получить. Файл получится небольшого размера.
Теперь понятно чего хотите получить.
Итак хорошие новости все JSON файлы, которые вы получили, в принципе не нужны для простого приложения.
Далее, нет штатной возможности создать один файл.
Всегда будет exe + dll.
Сам файл exe это заглушка для запуска на конкретной платформе.
Если у вас уже стоит .NET, то запускать приложение можно простой командой:
dotnet MyApp.dll
Здравствуйте, HotDog, Вы писали:
HD>Хорошо, работает... Работает в том смысле, что я получил один exe файл размером в 60 Mb и работающим только на win64 HD>Но это не то, чего я хотел добиться. Хотелось бы получить один ехе, который работает на компе где уже предустановлен .NET5, независимо от платформы (х86,х64) HD>Т.е. аналог консольной программы написанной на .NET FW 4.x
На .NET FW ты также получаешь x86 или x64 бинарник, и x64 на 32-битной винде не взлетит, а x86 не сможет подгрузить неуправляемый код, собранный под x64
Просто выбери не "автономный" режим, а "зависит от платформы" (SelfContained=false)
Здравствуйте, gandjustas, Вы писали:
HD>>Что то еще не хватает?
Не хватает настроек для создания одного ехе, который работает на x86 и x64 с предустановленным .NET5, без конского размера файла
На FW 4.8 все это компилится в 5Kb.
Здравствуйте, gandjustas, Вы писали:
G>На .NET FW ты также получаешь x86 или x64 бинарник, и x64 на 32-битной винде не взлетит, а x86 не сможет подгрузить неуправляемый код, собранный под x64
Вот тут ты не прав. Для FW 4.x можно указать "Any CPU" и приложение будет работать как в 32 битном, так и 64-x битном режиме.
Здравствуйте, _NN_, Вы писали:
_NN>Далее, нет штатной возможности создать один файл. _NN>Всегда будет exe + dll. _NN>Сам файл exe это заглушка для запуска на конкретной платформе.
Но ведь это так то странно все. В настройках проекта я могу поставить "Platform target: Any CPU".
Если я возьму те самые файлы что я указал в самом первом посте, то они работают и на x86 и на x64 нативно (я имею ввиду 32/64 бита).
Но вот publish "убирает" зависимость от json, мержит dll+exe и ломает независисость от платформы.
Здравствуйте, HotDog, Вы писали:
HD>Здравствуйте, _NN_, Вы писали:
_NN>>Далее, нет штатной возможности создать один файл. _NN>>Всегда будет exe + dll. _NN>>Сам файл exe это заглушка для запуска на конкретной платформе.
HD>Но ведь это так то странно все. В настройках проекта я могу поставить "Platform target: Any CPU". HD>Если я возьму те самые файлы что я указал в самом первом посте, то они работают и на x86 и на x64 нативно (я имею ввиду 32/64 бита). HD>Но вот publish "убирает" зависимость от json, мержит dll+exe и ломает независисость от платформы.
Ссылку смотрели ?
Dll это и есть платформонезависимый код.
Тот файл который был у вас изначально, после компиляции, не публикации.
Это файл можно взять хоть на Линукс и запустить через dotnet My.dll
Здравствуйте, HotDog, Вы писали:
HD>Здравствуйте, gandjustas, Вы писали:
HD>>>Что то еще не хватает?
HD>Не хватает настроек для создания одного ехе, который работает на x86 и x64 с предустановленным .NET5, без конского размера файла
Еще раз:
Работает на x86 и x64 только бинарник x86. Не умеет .NET FW в x86 exe_шнике поднимать x64 рантайм, как и наоборот.
Здравствуйте, _NN_, Вы писали:
_NN>Ссылку смотрели ? _NN>Dll это и есть платформонезависимый код. _NN>Тот файл который был у вас изначально, после компиляции, не публикации. _NN>Это файл можно взять хоть на Линукс и запустить через dotnet My.dll
.runtimeconfig.json всё таки нужен, он не опциональный как говорит документация.
В итоге минимальный набор это:
.exe
.dll
.runtime.json
Здравствуйте, gandjustas, Вы писали:
HD>>Не хватает настроек для создания одного ехе, который работает на x86 и x64 с предустановленным .NET5, без конского размера файла G>Еще раз: G>Работает на x86 и x64 только бинарник x86. Не умеет .NET FW в x86 exe_шнике поднимать x64 рантайм, как и наоборот.
Ещё раз:
NET FW может делать универсальные AnyCPU-екзешники, которые работают как 32-битные в 32-битной среде и как 64-битные в 64-битной среде.
Возможно, тебя путает включенная по умолчанию настройка-галочка "prefer 32-bit", которая заставляет AnyCPU-екзешники запускаться в 64-битной среде в 32-битном режиме. Иногда они так работают быстрее. Но если в какой-нибудь серверной ОС 32-битный режим отсутствует полностью, программа запустится как 64-битная.
Здравствуйте, HotDog, Вы писали:
HD>Здравствуйте, Vladek, Вы писали:
V>>Конкретную платформу (RuntimeIdentifier) выбрать всё же придётся, без неё единого исполняемого файла не получить. Файл получится небольшого размера.
HD>Но на х86 этот файл не запустится. Так?
Если для серверного приложения это еще как-то подходит, то для настольного приложения это выглядит дико, конечно.
в смысле размера и реализации. Ведь тут по сути самораспаковывающийся архив. Даже знаю были проблемы в ранних версиях со стратовым каталогом(определялся как недра temp — куда шла распаковка).
вообщем странное решение. триминг тоже так себе. вероятно максимум это незагруженные библиотеки отделит.
Да и скорость запуска консольного приложения на моей машине. релизная сборка без упаковки (dll) запускается real ~ 100. В то время как rust и dmd(dlang со сборщиком мусора) оба real ~ 1.
Как ни крути dotnet это почти точная, чуть улучшеная в плане работы с памятью java.