Publish W .NET 5, który jest następną wersją .NET CORE, a nie tego .NET, który działa tylko na Windows. W .NET 5 można utworzyć aplikację WPF i Win Forms tylko działają one nadal tylko na systemy Windows.

Jak na razie .NET nie ma dobrej odpowiedzi na tworzenie aplikacji desktopowych wszędzie. Być może za rok MAUI rozwiąże ten problem.

Na razie WPF i Windows Forms nadal żyją, mimo iż kwestionować te framework można było z tych samym powód w 2010 roku. Mając rok 2021, aż strach pomyśleć, że nic nie zmieniło się w tej kwestii od 11 lat.

Aplikację WPF i Windows Form nadal są używane w firmach. Dodatkowo ktoś na webinarze zwrócił mi uwagę, że istnieje gra na Steamie, która została napisana w WPF.

Ja miesiąc temu napisałem prostą aplikację WPF do formatowania kodu, która bardzo skraca mi czas pracy do tworzenia slajdów bądź wpisów na blogu. 

Powstało jednak jedno dobre pytanie. Jak taką aplikację publikować jako przenośny plik ".exe", który zadziała na każdym systemie Windows bezwzględu na to, czy .NET 5 jest zainstalowany, czy nie.

Co więc chcemy :

  • Stworzyć aplikację WPF/Windows Form używając .NET 5
  • Stworzy jeden plik "exe", który łatwo przenieść
  • Bez żadnych dodatkowych instalek
  • Aplikacja ma działać niezależnie od tego, czy mamy .NET 5, czy nie

Publikowanie aplikacji przez Visual Studio : co odradzam

Klikasz na ikonę projektu i wybierasz "Publish..."

Publikowanie aplikacji WPF w Visual Studio

Potem wybierasz opcję "Folder". Chociaż ciekawe, że możesz skorzystać z Dockera

Publikowanie aplikacji WPF w Visual Studio wybieranie opcji Folder

Wybierasz opcję Folder ponieważ nie chcemy tworzyć żadnych instalek. 

Publikowanie aplikacji WPF w Visual Studio wybieranie target

Już prawie wszystko mamy. Klikasz na "Target runtime" i wybierasz potem następujące opcję.

Publikowanie aplikacji WPF w Visual Studio Podsumowanie i to nie koniec

Chcemy mieć plik, który będzie działa bez instalacji .NET 5 więc wybieramy "Self-contained"

Wybranie dodatkowych opcji w WPF i Windows Forms

W "FilePublish options" wybieramy opcję "Produce single file". Możesz też zaznaczyć opcję "Trim unused assembiles" jednakże dla mnie ta opcja sprawia, że aplikacja WPF i Windows Form w ogóle się nie uruchamia.

Tutaj dla mnie jest największy problem tego stylu publikacji.

Chyba nie oto nam chodziło gdzie jest ten pojedyńczy plik

Pomimo zaznaczania tylu opcji w tylu oknach ostatecznie i tak dostałem mnóstwo plików niż jeden plik ".exe".

Skopiowanie tylko pliku ".exe" nie jest rozwiązaniem. Coś w tym trybie publikacji jest skopane.

Problem wynika z tego, że są natywne "dll-ki" WinForm i WPF, które nie lubią być zaszywane do jednego pliku i dlatego domyślnie ta forma publikacji robi taki problem z tego.

Brakuje tutaj opcji : IncludeNativeLibrariesForSelfExtract

Jak publikować aplikację przez CMD

Używając wiersza poleceń bardzo łatwo jest utworzyć projekt, jak i go publikować.

PanNiebieski@CEZMSI  D:\winformtest
dotnet new winforms
The template "Windows Forms App" was created successfully.

Processing post-creation actions...
Running 'dotnet restore' on D:\winformtest\winformtest.csproj...
  Trwa określanie projektów do przywrócenia...
  Przywrócono element D:\winformtest\winformtest.csproj (w 142 ms).
Restore succeeded.


PanNiebieski@CEZMSI D:\winformtest
dotnet publish -r win-x64 /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true
Microsoft (R) Build Engine 16.8.0+126527ff1 dla platformy .NET
Copyright (C) Microsoft Corporation. Wszelkie prawa zastrzeżone.

  Trwa określanie projektów do przywrócenia...
  Przywrócono element D:\winformtest\winformtest.csproj (w 198 ms).
  winformtest -> D:\winformtest\bin\Debug\net5.0-windows\win-x64\winformtest.dll
  winformtest -> D:\winformtest\bin\Debug\net5.0-windows\win-x64\publish\

Teraz rzeczywiście powstał jeden plik ".exe"

Mamy jeden exe

Jak widzisz nie musiałeś też klikać przez 5 okien, aby zrobić ten proces wystarczyło wpisać :

dotnet publish -r win-x64 /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true

To, że natywne biblioteki WPF czy Window Form teraz są zaszyte w jednym pliku są sprawką opcji : IncludeNativeLibrariesForSelfExtract

Dodatkowo jakbyś chciał do pliku ".exe" zaszyć jeszcze inne pliki, które normalnie były także wydzielone to musisz skorzystać z opcji : IncludeAllContentForselfExtract

Co te opcję robią? Po prostu w trakcie uruchamiania twojej aplikacji te natywne dll-ki bądź inne pomocnicze pliki będą wypakowywane do folderu tymczasowego, który będzie dla Ciebie niewidoczny.

Możesz też skorzystać z opcji : /p:PublishTrimmed=true, aby wielkość pliku ".exe" była o jakieś 40 MB mniejsza.

Jednakże w moim przypadku ta opcja sprawia, że aplikacja nie chce się w ogóle instalować.

Chociaż Piotr z Facebook zwrócił uwagę, że pewne opcję można dodać do projektu

kom-01.png

To nadal nie zmienia to faktu, że nie jest to poręczne.

;