.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.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: .NET 5 минимальное консольное приложение
От: _NN_ www.nemerleweb.com
Дата: 08.11.21 04:51
Оценка: 19 (2)
Здравствуйте, vaa, Вы писали:

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


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


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

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

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

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

vaa>Если для серверного приложения это еще как-то подходит, то для настольного приложения это выглядит дико, конечно.

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

Начиная с .NET 5 управляемые библиотеки загружаются из памяти.
А с .NET 6, ничего не распаковывается, всё из памяти.

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

Тримминг сегодня это не только убрать библиотеки, а ещё и модификация самих библиотек.
https://docs.microsoft.com/en-us/dotnet/core/deploying/trimming/trimming-options
TrimMode = link

Это конечно ещё не сравнимо с тем, как выбрасывает код другие языки, но прогресс есть.
Если в .NET Core 3.1 минимальным размером было 40МБ, то в 5.0 уже 20МБ, а в 6.0 что-то около 13МБ.

Чтобы ускорить запуск следует собирать с Ready2Run: https://docs.microsoft.com/en-us/dotnet/core/deploying/ready-to-run
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: .NET 5 минимальное консольное приложение
От: Silver_S Ниоткуда  
Дата: 14.11.21 14:07
Оценка: 4 (1)
Здравствуйте, vaa, Вы писали:

vaa> Ведь тут по сути самораспаковывающийся архив. Даже знаю были проблемы в ранних версиях со стратовым каталогом(определялся как недра temp — куда шла распаковка).


Когда вышел .NET 5, они писали, что это сделать не просто, но работа в этом направлении продолжится.
В .NET 6, есть какие-то изменения:

#Net6 – Single file apps improved for Windows and Mac !

In .NET 6, single file apps have been enabled for Windows and macOS. In .NET 5, single files apps were limited to Linux. In .NET 6, for all supported operating systems, you can publish a single-file binary that has exactly one file on disk and does not need to extract any of the core runtime assemblies to temporary directories.


Single File Apps In .NET 6

In .NET 6, for the most part, this has been changed to a true single file experience where everything is loaded into memory, rather than extracted into temporary folders.

Отредактировано 14.11.2021 14:11 Silver_S . Предыдущая версия .
Re[4]: .NET 5 минимальное консольное приложение
От: vaa  
Дата: 14.11.21 14:13
Оценка:
Здравствуйте, Silver_S, Вы писали:

S_S>

S_S>In .NET 6, for the most part, this has been changed to a true single file experience where everything is loaded into memory, rather than extracted into temporary folders.

Читал, только тут не понятно, это действительно одна сборка или просто архив со сборками, которые тупо загрузять в память и дальше будет использован стандартный механизм загрузки сборок из массива.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: .NET 5 минимальное консольное приложение
От: Sharov Россия  
Дата: 15.11.21 00:10
Оценка:
Здравствуйте, vaa, Вы писали:

S_S>>

S_S>>In .NET 6, for the most part, this has been changed to a true single file experience where everything is loaded into memory, rather than extracted into temporary folders.

vaa>Читал, только тут не понятно, это действительно одна сборка или просто архив со сборками, которые тупо загрузять в память и дальше будет использован стандартный механизм загрузки сборок из массива.

Есть же вроде опиция Trim, при применении которой особой разницы не будет.
Кодом людям нужно помогать!
Re[6]: .NET 5 минимальное консольное приложение
От: Teolog  
Дата: 16.11.21 09:26
Оценка:
S>Есть же вроде опиция Trim, при применении которой особой разницы не будет.
Только она софт ломает, даже на минимальном уровне обрезки.
Re[7]: .NET 5 минимальное консольное приложение
От: Sharov Россия  
Дата: 16.11.21 09:53
Оценка:
Здравствуйте, Teolog, Вы писали:


S>>Есть же вроде опиция Trim, при применении которой особой разницы не будет.

T>Только она софт ломает, даже на минимальном уровне обрезки.

Вижу проблему с рефлексией. Если она не используется, то что должно сломаться, если речь
идет о выкидывании неиспользуемых ф-ий, т.е. кода?
Кодом людям нужно помогать!
Re[7]: .NET 5 минимальное консольное приложение
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 16.11.21 10:23
Оценка:
Здравствуйте, Teolog, Вы писали:


S>>Есть же вроде опиция Trim, при применении которой особой разницы не будет.

T>Только она софт ломает, даже на минимальном уровне обрезки.
Нужно ссылочки добавлять для рефлексии. Для .Net Native
https://docs.microsoft.com/en-us/windows/uwp/dotnet-native/reflection-and-net-native
https://docs.microsoft.com/en-us/windows/uwp/dotnet-native/runtime-directives-rd-xml-configuration-file-reference
https://stackoverflow.com/questions/57031822/reflection-and-activation-in-net-native
и солнце б утром не вставало, когда бы не было меня
Отредактировано 16.11.2021 10:44 Serginio1 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.