Jak działa Single Executable

Odpowiedz Nowy wątek
2020-08-04 17:54

Rejestracja: 4 lata temu

Ostatnio: 6 godzin temu

0

Wygenerowałem sobie 1 plikowy program w taki sposób:

dotnet new console

do csproja dodałem

<PublishSingleFile>true</PublishSingleFile>

i zrobiłem publish

dotnet publish -c Release -r linux-x64

I dostałem pojedynczy plik, który po przeniesieniu na (w tym wypadku) Linuxa bez zainstalowanego .NET Cora działał bez żadnego problemu

IK0HnYj.png

wszystko fajnie, ale jak właściwie jest realizowany cały ten mechanizm "pakowania" do 1 pliku wszystkiego? jak to działa? czemu więcej softu z tego nie korzysta, a nadal są instalki (pomijając jakieś dodatkowe wymagania dot. instalacji typu wykonywanie skryptów itd), a później po instalacji pełne foldery dllek?

i w sumie dlaczego został wygenerowany *.pdb jeżeli to był Release?

edytowany 8x, ostatnio: WeiXiao, 2020-08-04 18:03

Pozostało 580 znaków

2020-08-04 18:03
Moderator

Rejestracja: 18 lat temu

Ostatnio: 9 godzin temu

3

Wszystkie niezbędne biblioteki są linkowane statycznie do jednego pliku wykonywalnego. Tam da się jeszcze robić nieco bardziej agresywny trimming, aby zmniejszyć rozmiar pliku wynikowego - patrz np. https://www.hanselman.com/blo[...]ontainedSingleExecutable.aspx

A PDB się przyda, zwłaszcza jak chcesz debugować "po fakcie" jakieś zrzuty pamięci.

Pozostało 580 znaków

2020-08-04 18:08

Rejestracja: 4 lata temu

Ostatnio: 6 godzin temu

0
Ktos napisał(a):

Tam da się jeszcze robić nieco bardziej agresywny trimming, aby zmniejszyć rozmiar pliku wynikowego

Faktycznie z 76MB na 35MB, dzięki.

edytowany 1x, ostatnio: WeiXiao, 2020-08-04 18:08

Pozostało 580 znaków

2020-08-04 20:20

Rejestracja: 1 rok temu

Ostatnio: 1 godzina temu

2

.pdb jest bardzo pomocny w debugowaniu, możesz go zostawić tylko dla siebie i skopiować go do klienta gdy zgłosi błąd którego nie da się odtworzyć lokalnie.
Czemu więcej softu nie korzysta z pakowania wszystkiego do jednego pliku? Ano dlatego że ten plik będzie duży, w przypadku wydania patcha będziesz musiał wysłać prawdopodobnie cały ten plik, zamiast małej dll-ki (w praktyce jeszcze nie widziałem żeby patch nie obejmował i tak kilku dll-ek no ale w teorii i przy dobrej architekturze ma to szansę działać).
A więcej plików nie znaczy że potrzebny jest instalator - nadal można wydać wersję "portable" którą wystarczy rozpakować - większa liczba plików nikomu raczej nie przeszkadza. Instalatory są raczej po to żeby zmienić ustawienia systemowe, albo spytać o jakieś parametry konfiguracyjne.

Poza tym idea dll-ek kiedyś za czasów gdy 1MB miejsca na dysku kosztował kilka lub więcej dolarów była że jedna biblioteka może zostać używana przez wiele programów - szaleństwo czyż nie? Kiedyś programy instalowały dll-ki bezpośrednio do katalogu windows\system i wiele programów mogło z nich korzystać nie dublując plików na dysku. Potem się okazało że przez lenistwo programistów mało która dll-ka jest wstecznie kompatybilna więc potrzebne są ich różne wersje dla różnych programów i praktycznie tylko systemowe i frameworkowe dll-ki są współdzielone. A teraz doczekaliśmy czasów że nawet dll-ki .neta już nie są współdzielone tylko kopiują się do każdego skompilowanego programu dzięki czemu hello world zajmuje więcej miejsca niż cała moja kolekcja gier z początku lat 90-tych.


Pozostało 580 znaków

2020-08-05 11:06

Rejestracja: 1 rok temu

Ostatnio: 10 godzin temu

0

Ja tutaj widzę korzyść taką, że program jest samodzielny i nie wymaga instalacji .net core do działania. To, że jest to pojedynczy plik nie jest żadną korzyścią.

I nie masz racji, nie zrobisz takiej wersji portable, która by działała bez potrzeby instalacji .net core w systemie (jeśli się mylę, niech ktoś sprostuje)

edytowany 1x, ostatnio: Meini, 2020-08-05 11:07

Pozostało 580 znaków

2020-08-05 12:20

Rejestracja: 5 lat temu

Ostatnio: 9 godzin temu

Lokalizacja: Rzeszów

0

https://docs.microsoft.com/en[...]net/core/tools/dotnet-publish

Packages the app into a platform-specific single-file executable. The executable is self-extracting and contains all dependencies (including native) that are required to run the app. When the app is first run, the application is extracted to a directory based on the app name and build identifier. Startup is faster when the application is run again. The application doesn't need to extract itself a second time unless a new version is used. Available since .NET Core 3.0 SDK.

Dopiero od .NET 5 nie ma być konieczności wypakowywania https://github.com/dotnet/des[...]ed/2020/single-file/design.md

Pozostało 580 znaków

2020-08-05 16:55

Rejestracja: 4 lata temu

Ostatnio: 6 godzin temu

1
Meini napisał(a):

I nie masz racji, nie zrobisz takiej wersji portable, która by działała bez potrzeby instalacji .net core w systemie (jeśli się mylę, niech ktoś sprostuje)

jak nie?

Gdy zrobisz to samo co wyżej, ale bez tego dodatku do csproja, to dostaniesz taki portable z frameworkiem (więc bez konieczności instalacji). No różnica taka, że nie będzie jednego pliku, a wiele.

dotnet publish -c Release -r linux-x64

edytowany 3x, ostatnio: WeiXiao, 2020-08-05 16:58
Przydatne. Czy działa też dla aplikacji gui na Windows? - Meini 2020-08-05 18:14
@Meini: o których gui piszesz? frameworkowych czy .net corowych? - WeiXiao 2020-08-06 16:31
Zakładam, że tylko . net corowe mogą tak działać - Meini 2020-08-07 16:40

Pozostało 580 znaków

2020-08-06 08:08

Rejestracja: 7 miesięcy temu

Ostatnio: 6 godzin temu

0

W przypadku .net core to tą opcję single file jest dostępna chyba dopiero od 2.2 więc wcześniej możliwe że nikt tego nie używał bo nie było dostępne ?

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0