.NET 5 минимальное консольное приложение
От: HotDog Швейцария www.denebspace.com
Дата: 27.10.21 11:07
Оценка:
Решил я тут попробовать этот ваш новый модный .NET5
Создал пустое приложение "Hello world" и откомпилил в release.
И что я вижу... Что бы запустился ехе нужно что бы рядом лежала dll и пара конфигов.
Т.е. что бы вывести "Hello World!" нужны
ConsoleApp1.exe
ConsoleApp1.dll
ConsoleApp1.runtimeconfig.json
ConsoleApp1.deps.json

Плюс еще создается какой то Ref директорий
Seriously?

Можно ли как то собрать просто один exe? В настройках проекта ничего не нашел.
Re: .NET 5 минимальное консольное приложение
От: _NN_ www.nemerleweb.com
Дата: 27.10.21 11:12
Оценка: +2
Здравствуйте, 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? В настройках проекта ничего не нашел.


Конечно можно: https://docs.microsoft.com/ru-ru/dotnet/core/deploying/single-file

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <PublishSingleFile>true</PublishSingleFile>
    <SelfContained>true</SelfContained>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <PublishReadyToRun>true</PublishReadyToRun>
    <IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
  </PropertyGroup>

</Project>


Или задать эти свойства во время публикации: dotnet publish --self-contained /p:SelfContained=true ..
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: .NET 5 минимальное консольное приложение
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 27.10.21 11:13
Оценка: +1 -1
Здравствуйте, HotDog, Вы писали:

HD>Можно ли как то собрать просто один exe?

https://docs.microsoft.com/en-us/dotnet/core/deploying/single-file

HD>В настройках проекта ничего не нашел.

Плохо искал
Re: .NET 5 минимальное консольное приложение
От: HotDog Швейцария www.denebspace.com
Дата: 27.10.21 11:26
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Конечно можно: https://docs.microsoft.com/ru-ru/dotnet/core/deploying/single-file


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

_NN>  <PropertyGroup>
_NN>    <OutputType>Exe</OutputType>
_NN>    <TargetFramework>net5.0</TargetFramework>
_NN>    <PublishSingleFile>true</PublishSingleFile>
_NN>    <SelfContained>true</SelfContained>
_NN>    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
_NN>    <PublishReadyToRun>true</PublishReadyToRun>
_NN>    <IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
_NN>  </PropertyGroup>

_NN></Project>

_NN>


_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'.

Что то еще не хватает?
Отредактировано 27.10.2021 11:27 HotDog . Предыдущая версия .
Re[2]: .NET 5 минимальное консольное приложение
От: _NN_ www.nemerleweb.com
Дата: 27.10.21 11:29
Оценка:
Здравствуйте, 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>

HD>Что то еще не хватает?

Нужна публикация через `dotnet publish` или в студии `Publish` ( https://docs.microsoft.com/ru-ru/dotnet/core/tutorials/publishing-with-visual-studio?pivots=dotnet-5-0 )
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: .NET 5 минимальное консольное приложение
От: HotDog Швейцария www.denebspace.com
Дата: 27.10.21 11:49
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Нужна публикация через `dotnet publish` или в студии `Publish` ( https://docs.microsoft.com/ru-ru/dotnet/core/tutorials/publishing-with-visual-studio?pivots=dotnet-5-0 )


Хорошо, работает... Работает в том смысле, что я получил один exe файл размером в 60 Mb и работающим только на win64
Но это не то, чего я хотел добиться. Хотелось бы получить один ехе, который работает на компе где уже предустановлен .NET5, независимо от платформы (х86,х64)
Т.е. аналог консольной программы написанной на .NET FW 4.x
Отредактировано 27.10.2021 11:49 HotDog . Предыдущая версия .
Re[2]: .NET 5 минимальное консольное приложение
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 27.10.21 12:20
Оценка:
Здравствуйте, HotDog, Вы писали:


HD>Что то еще не хватает?



Re[4]: .NET 5 минимальное консольное приложение
От: Vladek Россия Github
Дата: 27.10.21 13:17
Оценка: 6 (1)
Здравствуйте, 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

Ну вот содержание такого профиля, всё настраивается в настройках публикации:
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121. 
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration>Release</Configuration>
    <Platform>Any CPU</Platform>
    <PublishDir>bin\Release\net5.0\publish\</PublishDir>
    <PublishProtocol>FileSystem</PublishProtocol>
    <TargetFramework>net5.0</TargetFramework>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <SelfContained>false</SelfContained>
    <PublishSingleFile>True</PublishSingleFile>
    <PublishReadyToRun>False</PublishReadyToRun>
  </PropertyGroup>
</Project>


Конкретную платформу (RuntimeIdentifier) выбрать всё же придётся, без неё единого исполняемого файла не получить. Файл получится небольшого размера.
Отредактировано 27.10.2021 13:20 Vladek . Предыдущая версия .
Re[5]: .NET 5 минимальное консольное приложение
От: HotDog Швейцария www.denebspace.com
Дата: 27.10.21 13:46
Оценка:
Здравствуйте, Vladek, Вы писали:

V>Конкретную платформу (RuntimeIdentifier) выбрать всё же придётся, без неё единого исполняемого файла не получить. Файл получится небольшого размера.


Но на х86 этот файл не запустится. Так?
Re[4]: .NET 5 минимальное консольное приложение
От: _NN_ www.nemerleweb.com
Дата: 27.10.21 13:47
Оценка: 6 (1) +1
Здравствуйте, HotDog, Вы писали:

Теперь понятно чего хотите получить.
Итак хорошие новости все JSON файлы, которые вы получили, в принципе не нужны для простого приложения.
Далее, нет штатной возможности создать один файл.
Всегда будет exe + dll.

https://docs.microsoft.com/ru-ru/dotnet/core/deploying/#publish-framework-dependent

Сам файл exe это заглушка для запуска на конкретной платформе.
Если у вас уже стоит .NET, то запускать приложение можно простой командой:
dotnet MyApp.dll
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: .NET 5 минимальное консольное приложение
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 27.10.21 13:47
Оценка:
Здравствуйте, 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)
Re[3]: .NET 5 минимальное консольное приложение
От: HotDog Швейцария www.denebspace.com
Дата: 27.10.21 13:51
Оценка:
Здравствуйте, gandjustas, Вы писали:

HD>>Что то еще не хватает?


Не хватает настроек для создания одного ехе, который работает на x86 и x64 с предустановленным .NET5, без конского размера файла
На FW 4.8 все это компилится в 5Kb.
Re[5]: .NET 5 минимальное консольное приложение
От: HotDog Швейцария www.denebspace.com
Дата: 27.10.21 13:57
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>На .NET FW ты также получаешь x86 или x64 бинарник, и x64 на 32-битной винде не взлетит, а x86 не сможет подгрузить неуправляемый код, собранный под x64


Вот тут ты не прав. Для FW 4.x можно указать "Any CPU" и приложение будет работать как в 32 битном, так и 64-x битном режиме.
Re[5]: .NET 5 минимальное консольное приложение
От: HotDog Швейцария www.denebspace.com
Дата: 27.10.21 14:04
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Далее, нет штатной возможности создать один файл.

_NN>Всегда будет exe + dll.
_NN>Сам файл exe это заглушка для запуска на конкретной платформе.

Но ведь это так то странно все. В настройках проекта я могу поставить "Platform target: Any CPU".
Если я возьму те самые файлы что я указал в самом первом посте, то они работают и на x86 и на x64 нативно (я имею ввиду 32/64 бита).
Но вот publish "убирает" зависимость от json, мержит dll+exe и ломает независисость от платформы.
Re[6]: .NET 5 минимальное консольное приложение
От: _NN_ www.nemerleweb.com
Дата: 27.10.21 14:08
Оценка:
Здравствуйте, 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
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: .NET 5 минимальное консольное приложение
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 27.10.21 14:39
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Здравствуйте, gandjustas, Вы писали:


HD>>>Что то еще не хватает?


HD>Не хватает настроек для создания одного ехе, который работает на x86 и x64 с предустановленным .NET5, без конского размера файла

Еще раз:
Работает на x86 и x64 только бинарник x86. Не умеет .NET FW в x86 exe_шнике поднимать x64 рантайм, как и наоборот.


HD>На FW 4.8 все это компилится в 5Kb.

HD>Image: 27-10-_2021_15-28-41.png
SelfContained=false PublishSingleFile=true

RuntimeIdentifier=win-x86 ибо заработает на всех системах

Бинарник 103КБ получается
Re[7]: .NET 5 минимальное консольное приложение
От: _NN_ www.nemerleweb.com
Дата: 27.10.21 15:41
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Ссылку смотрели ?

_NN>Dll это и есть платформонезависимый код.
_NN>Тот файл который был у вас изначально, после компиляции, не публикации.
_NN>Это файл можно взять хоть на Линукс и запустить через dotnet My.dll

.runtimeconfig.json всё таки нужен, он не опциональный как говорит документация.

В итоге минимальный набор это:
.exe
.dll
.runtime.json
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: .NET 5 минимальное консольное приложение
От: alexzzzz  
Дата: 28.10.21 13:07
Оценка:
Здравствуйте, 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-битная.
Re[6]: .NET 5 минимальное консольное приложение
От: Vladek Россия Github
Дата: 29.10.21 23:46
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Здравствуйте, Vladek, Вы писали:


V>>Конкретную платформу (RuntimeIdentifier) выбрать всё же придётся, без неё единого исполняемого файла не получить. Файл получится небольшого размера.


HD>Но на х86 этот файл не запустится. Так?


Не проверял, но думаю — не запустится.
Re[2]: .NET 5 минимальное консольное приложение
От: vaa  
Дата: 08.11.21 02:12
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, HotDog, Вы писали:


HD>>Можно ли как то собрать просто один exe?

G>https://docs.microsoft.com/en-us/dotnet/core/deploying/single-file

HD>>В настройках проекта ничего не нашел.

G>Плохо искал

Если для серверного приложения это еще как-то подходит, то для настольного приложения это выглядит дико, конечно.
в смысле размера и реализации. Ведь тут по сути самораспаковывающийся архив. Даже знаю были проблемы в ранних версиях со стратовым каталогом(определялся как недра temp — куда шла распаковка).
вообщем странное решение. триминг тоже так себе. вероятно максимум это незагруженные библиотеки отделит.
Да и скорость запуска консольного приложения на моей машине. релизная сборка без упаковки (dll) запускается real ~ 100. В то время как rust и dmd(dlang со сборщиком мусора) оба real ~ 1.
Как ни крути dotnet это почти точная, чуть улучшеная в плане работы с памятью java.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.