Grafikus C# – Windows Forms tanfolyam › 14.5 lecke

Windows Forms · 14.5 lecke · kiadás

Publish és terjesztési lehetőségek

A Build a fejlesztés eszköze: lefordítja a programot a bin mappába, de a kimenet tele van fejlesztői fájlokkal, és nem biztos, hogy minden szükséges benne van. A Publish (közzététel) a kiadás eszköze: összegyűjti pontosan azt, ami a program futtatásához kell, a választott platformra és módban, egy tiszta mappába. Ebben a leckében megtanulod a Build és a Publish különbségét, a közzétételi módokat (keretrendszer-függő, önálló, egyetlen fájl, ReadyToRun, ClickOnce), a közzétételi profilokat, a csomag ellenőrzését (ZIP, ellenőrző összeg, tiszta gépes próba), és azt, hogyan jut el a program a felhasználóhoz: letöltés, pendrive, hálózati megosztás, telepítő. Szó lesz a Windows SmartScreen figyelmeztetéséről és a kódaláírásról is.

  • kb. 100 perc
  • közepes szint
  • kiadás
Diáklány C# programot készít laptopon

A lecke végére

  • elmagyarázod a Build és a Publish különbségét;
  • közzéteszed a programot Visual Studióból és parancssorból (dotnet publish);
  • választasz a módok közt: keretrendszer-függő, önálló, egyetlen fájl, ReadyToRun;
  • ismered a ClickOnce és a ZIP/telepítő terjesztést;
  • ellenőrzöd a csomagot (tiszta mappa, ZIP, SHA-256 összeg, próba tiszta gépen);
  • érted a SmartScreen figyelmeztetést és a kódaláírás szerepét.

Mielőtt elkezded

Ehhez a leckéhez a 14.1–14.4 lecke (konfiguráció, kimenet, futtatókörnyezet, NuGet) szükséges.

14.4 NuGet-függőségek →

Build és Publish

BuildPublish
CélFejlesztés, tesztelés.Kiadás: a felhasználónak szánt csomag.
Kimenetbin\<konfiguráció>\<keretrendszer>\: minden fejlesztői fájl (PDB, köztes DLL).A megadott mappa (például bin\Release\net8.0-windows\win-x64\publish\): a futtatáshoz szükséges fájlok.
PlatformÁltalános (Any CPU).Egy konkrét platformra (runtime identifier: win-x64, win-x86, win-arm64).
FuttatókörnyezetNem része.Beletehető (önálló mód).
Közzététel Visual Studióból és parancssorbólparancsok
Visual Studio:  Jobb klikk a projekten → Publish... → Target: Folder → Location → Publish
(a beállítások a Properties\PublishProfiles\FolderProfile.pubxml fájlba kerülnek: újrafelhasználható)

Parancssor: dotnet publish -c Release -r win-x64 --self-contained false -o publish\fdd
dotnet publish -c Release -r win-x64 --self-contained true -o publish\onallo
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -o publish\egyfajl
dotnet publish -c Release -p:PublishProfile=FolderProfile
Properties\PublishProfiles\FolderProfile.pubxmlXML
<Project>
<PropertyGroup>
<Configuration>Release</Configuration>
<Platform>Any CPU</Platform>
<PublishDir>bin\Release\net8.0-windows\publish\</PublishDir>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<SelfContained>false</SelfContained>
<PublishSingleFile>false</PublishSingleFile>
</PropertyGroup>
</Project>
Runtime identifierA -r win-x64 megmondja, melyik platformra készül a csomag. A közzététel a platformnak megfelelő natív könyvtárakat válogatja be (a win-x86, linux változatokat nem): kisebb és tisztább lesz a kimenet (14.4 lecke).
ProfilA .pubxml profil rögzíti a beállításokat, így ugyanazt a közzétételt gombnyomásra vagy parancssorból ismételheted: ez a reprodukálható kiadás alapja.
Tiszta mappábaA közzétételt mindig üres/új mappába (vagy -o kapcsolóval) végezd, hogy ne maradjon benne régi fájl (14.2 lecke).
Verzió a névbenA kimenetet nevezd el verzióval és platformmal (Diaknyilvantarto-1.2.0-win-x64): később tudni fogod, melyik melyik.

Jósolj!

A dotnet publish -c Release -r win-x64 parancs (további kapcsolók nélkül) milyen módot ad: önállót vagy keretrendszer-függőt?

Jóslat ellenőrzése

Az újabb SDK-kban (.NET 6 SDK-tól) az alapértelmezés a keretrendszer-függő (--self-contained false), a régebbiekben a -r megadása önállót jelentett. Mivel ez verziófüggő, mindig add meg kifejezetten a --self-contained true/false kapcsolót.

A közzétételi módok

MódJellemzőMikor?
Keretrendszer-függőKis csomag; a gépen telepített .NET Desktop Runtime kell (14.3 lecke).Ha a futtatókörnyezet biztosan ott van (iskola, vállalati gép).
Önálló (SelfContained)Nagyobb csomag; a futtatókörnyezet benne van; nem kell telepítés.Ismeretlen gép, pendrive, barát otthoni gépe.
Egyetlen fájl (PublishSingleFile)Egy .exe tartalmazza a programot és a könyvtárakat; kényelmes átadni.Egyszerű terjesztés; kis segédprogramok.
ReadyToRun (PublishReadyToRun)Előfordított kód: gyorsabb indulás, nagyobb méret.Ha az indulás lassú (mérd: 13.9 lecke).
TrimmingNem használt kód kivágása.Windows Formsnál nem támogatott megbízhatóan: ne használd.
ClickOnceHálózati/webes telepítés automatikus frissítéssel, felhasználói szintű (rendszergazda nélkül).Belső eszközök; egyszerű, önfrissítő terjesztés.
Konyvtar.App.csprojXML
<PropertyGroup>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<SelfContained>true</SelfContained>
<PublishSingleFile>true</PublishSingleFile>
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract> <!-- a natív DLL-ek is beleférnek az egy fájlba -->
<PublishReadyToRun>true</PublishReadyToRun>
<DebugType>none</DebugType> <!-- nincs .pdb a csomagban -->
</PropertyGroup>
Egyetlen fájl: kompromisszumAz egy fájl kényelmes, de első indításkor a natív könyvtárakat ideiglenes mappába csomagolhatja ki (lassabb indulás), a víruskeresők pedig gyakrabban jeleznek rajta. Mérd meg az indulást, és próbáld ki a célgépen.
ClickOnceA Visual Studio Publish → ClickOnce varázslója telepítőt készít, amely a felhasználó gépére telepíti a programot (Start menü, eltávolítás), és induláskor ellenőrzi az új verziót. Egyszerű, de korlátai vannak (nincs rendszerszintű telepítés, a futtatókörnyezet ellenőrzése külön beállítás).
PDB nélkülA DebugType=none kiveszi a szimbólumfájlt a csomagból. A saját példányt őrizd meg (14.2 lecke), hogy a hibajelentések stack trace-ét értelmezni tudd.
KódméretA PublishReadyToRun növeli a méretet, de a JIT-fordítás egy részét megspórolja. Hosszú, sok számítást végző programnál alig számít; rövid, gyakran induló programnál érdemes.

Jósolj!

Bekapcsolod a PublishTrimmed beállítást egy Windows Forms programnál a kisebb méretért. Mi lehet a következmény?

Jóslat ellenőrzése

A trimmelés a tükrözéssel elért kódot (amelyet a Windows Forms és a Designer sokat használ) kivághatja: a program lefordul, de futáskor hiányzó típus vagy összetevő miatt hibázik, gyakran csak bizonyos funkciónál. A Windows Forms nem támogatja megbízhatóan a trimmelést: maradj a nem trimmelt csomagnál.

A csomag ellenőrzése

PowerShell: csomagolás és ellenőrző összegparancsok
Compress-Archive -Path publish\fdd\* -DestinationPath Diaknyilvantarto-1.2.0-win-x64-fdd.zip
Get-FileHash Diaknyilvantarto-1.2.0-win-x64-fdd.zip -Algorithm SHA256

Algorithm Hash Path
--------- ---- ----
SHA256 3F2A...C91B (hosszú hexadecimális érték) ...\Diaknyilvantarto-1.2.0-win-x64-fdd.zip

Ellenőrzőlista a kiadás előtt

  • Tiszta mappa: a közzététel új mappába készült, nincs régi fájl benne.
  • Release: a konfiguráció Release; a figyelmeztetések kezelve (14.1 lecke).
  • Tesztek: a regressziós készlet a Release kimeneten is lefutott (13.8 lecke).
  • Nincs PDB, nincs fejlesztői fájl a csomagban (kivéve, ha szándékos).
  • Tiszta gépes próba: másik gépen vagy virtuális gépen, fejlesztői környezet nélkül elindult.
  • Verzió: a csomag neve és a program Névjegy ablaka ugyanazt a verziót mutatja (14.8 lecke).
  • README: rendszerkövetelmény, telepítés/kicsomagolás, ismert hibák.
  • Licencek: a harmadik fél licencfájl mellékelve (14.4 lecke).

Miért ellenőrző összeg?

A SHA-256 hash a fájl „ujjlenyomata”: ha a letöltött fájl akár egy bitet is eltér (hibás letöltés, módosítás), a hash más lesz. A kiadás mellé írd ki a hash-t; a felhasználó a Get-FileHash paranccsal ellenőrizheti, hogy ugyanazt kapta-e. Ez nem helyettesíti a digitális aláírást (nem bizonyítja a kiadó személyét), de a sérülést és a cseréjét jelzi.

Jósolj!

Két felhasználó letölti ugyanazt a ZIP-et. Az egyiknek a hash-e egyezik a közzétettel, a másiké nem. Mit jelent ez?

Jóslat ellenőrzése

A másik felhasználó fájlja nem azonos a közzétettel: hibás (félbeszakadt) letöltés, vagy módosított/kicserélt fájl. Töltse le újra egy megbízható forrásból, és ellenőrizze újra; egyezés nélkül ne futtassa.

Hogyan jut el a program a felhasználóhoz?

MódElőnyHátrány
ZIP letöltésre (weboldal, GitHub Releases)Egyszerű; verziók archívuma; hash mellé írható.A felhasználó maga csomagolja ki és indítja; nincs frissítés.
Pendrive, megosztott mappaInternet nélkül is; iskolai környezetben praktikus.Kézi másolás; elavult példányok.
Telepítő (MSI, MSIX, Inno Setup)Start menü, eltávolítás, futtatókörnyezet-ellenőrzés (14.6 lecke).Készítése és karbantartása több munka.
ClickOnceAutomatikus frissítés, rendszergazda nélküli telepítés.Korlátozott testreszabás.
Microsoft Store (MSIX)Megbízható forrás, frissítés a Store-ból.Fiók, jóváhagyási folyamat, szabályok.
SmartScreen figyelmeztetésHa a felhasználó egy aláíratlan, újonnan letöltött programot indít, a Windows SmartScreen („A Windows megvédte a számítógépét”) figyelmeztetést mutat: ez nem a program hibája, hanem az ismeretlen kiadó és a kevés letöltés miatti óvatosság. A felhasználó a További információ → Futtatás mindenképpen gombokkal indíthatja; ezt a README-ben és a letöltési oldalon jelezd előre.
Kódaláírás (code signing)A digitális aláírás igazolja a kiadó személyét és azt, hogy a fájl nem módosult. Érvényes tanúsítványt kereskedelmi szolgáltató ad (költséges); az aláírt, sok felhasználó által használt programok bizalmat építenek a SmartScreen szemében. Iskolai és hobbiprojektnél általában nincs aláírás: ezért jobb a hash és a világos tájékoztatás.
Víruskereső téves jelzéseAz önálló, egyetlen fájlos, aláíratlan programokat a víruskeresők néha gyanúsnak jelölik (false positive). Teszteld a célgépeken, és szükség esetén a víruskereső gyártójának jelentési oldalán kérd a felülvizsgálatot.
Verziók és archívumŐrizd meg a kiadott verziók csomagját és hash-ét (és a hozzájuk tartozó PDB-t): ha egy felhasználó hibát jelez, ugyanazzal a kóddal tudod reprodukálni.

Jósolj!

A barátod letölti az aláíratlan programodat, és a Windows figyelmeztetést jelez, mielőtt futna. Jelent-e ez biztosan vírust?

Jóslat ellenőrzése

Nem: a figyelmeztetés az ismeretlen kiadót jelzi, nem azt, hogy a program kártékony. De a felhasználónak sosem szabad vakon bíznia: ezért érdemes a hash-t és a forrást megadni. Te pedig sose kérj felhasználót arra, hogy kapcsolja ki a védelmet.

📷 Képernyőkép helye

Mit tegyél ide: a Visual Studio Publish ablaka és a SmartScreen figyelmeztetés (További információ, Futtatás mindenképpen).Javasolt fájlnév: winforms-14-5-publish.webp · Alt szöveg: A közzététel és a SmartScreen figyelmeztetés

Hibakeresés: te vagy a hibadetektív

Mi a baj, és hogyan javítod?

Gondold végig az okot, és csak utána nyisd le a megoldást.

1. A közzétett program nem indul másik gépen

Keretrendszer-függő csomagot adtál, a gépen nincs .NET.

Ok és javítás

Telepítsd a Desktop Runtime-ot, vagy készíts önálló csomagot (14.3 lecke).

2. A csomagban ott van a .pdb és a régi DLL

A kiadott mappa tele van felesleges fájllal.

Ok és javítás

A bin mappát adtad át, vagy nem tiszta mappába közzétettél. dotnet publish -o új mappába, DebugType=none.

3. Az egyetlen fájl nem indul, vagy lassú

Az egy exe első indításkor hibát ad, vagy sokat vár.

Ok és javítás

A natív könyvtárakat a kicsomagolás miatt IncludeNativeLibrariesForSelfExtract kell; vagy a víruskereső vizsgálja. Próbáld a mappás önálló változatot, és mérd az indulást.

4. Trimmelés után hiányzik valami

A közzétett Forms program egy funkciónál hibázik, Debug-ban jó.

Ok és javítás

A PublishTrimmed nem támogatott Windows Formsnál. Kapcsold ki, és közzétedd újra.

5. Az ellenőrző összeg nem egyezik

A felhasználó hash-e eltér a közzétett értéktől.

Ok és javítás

Hibás letöltés vagy más fájl (esetleg te cseréltél újra ZIP-et a hash közzététele után). Mindig a végleges ZIP hash-ét tedd közzé, és új ZIP esetén új hash-t.

6. Régi verziót kapnak a felhasználók

A letöltési oldalon a régi csomag maradt.

Ok és javítás

Nincs verziózás a névben és kiadási lista. Nevezd el a csomagot verzióval, tüntesd fel a „legújabb” hivatkozást, és az archívumot külön tartsd.

Mini projekt: három csomag készítése és összehasonlítása

Készíts egy meglévő programodból (például a 13.10 diáknyilvántartóból) három kiadási csomagot, hasonlítsd össze őket, és automatizáld a folyamatot egy szkripttel:

  1. Előkészítés: a projekt Release módban hibátlanul fordul; a regressziós tesztek lefutottak (13.8 lecke); a DebugType=none be van állítva a közzétételhez.
  2. 1. csomag (keretrendszer-függő): dotnet publish -c Release -r win-x64 --self-contained false -o publish\fdd.
  3. 2. csomag (önálló mappa): --self-contained true -o publish\onallo.
  4. 3. csomag (önálló, egy fájl): --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o publish\egyfajl.
  5. Összehasonlítás: mérd mindegyik mappa méretét, a fájlok számát, és az indulási időt (Stopwatch a Main elejétől az első megjelenésig, vagy kézi mérés, 5 indítás mediánja).
  6. ZIP és hash: csomagold be mindhárom csomagot verziózott névvel, és számold ki a SHA-256 összeget; írd a KIADAS.md fájlba.
  7. README: minden csomaghoz: rendszerkövetelmény (futtatókörnyezet kell-e), kicsomagolás, indítás, a SmartScreen figyelmeztetés leírása.
  8. Tiszta gépes próba: másik gépen vagy virtuális gépen próbáld ki mindhárom csomagot, .NET nélkül és .NET-tel; jegyezd fel, melyik fut.
  9. Szkript: írd meg a kiadas.cmd/kiadas.ps1 szkriptet, amely egy paranccsal elkészíti mindhárom csomagot, a ZIP-eket és a hash-eket.
Megoldás megnyitása (próbáld ki előbb önállóan!)
kiadas.ps1 (PowerShell; a projekt mappájából futtatva)PowerShell
param([string]$Verzio = "1.0.0", [string]$Nev = "Diaknyilvantarto")

$ErrorActionPreference = "Stop"

Remove-Item -Recurse -Force publish -ErrorAction SilentlyContinue # tiszta kiindulás
New-Item -ItemType Directory -Path publish, kiadas | Out-Null

$modok = @(
@{ Nev = "fdd"; Args = @("--self-contained", "false") },
@{ Nev = "onallo"; Args = @("--self-contained", "true") },
@{ Nev = "egyfajl"; Args = @("--self-contained", "true", "-p:PublishSingleFile=true", "-p:IncludeNativeLibrariesForSelfExtract=true") }
)

foreach ($m in $modok)
{
$mappa = "publish\$($m.Nev)"
$zip = "kiadas\$Nev-$Verzio-win-x64-$($m.Nev).zip"

dotnet publish -c Release -r win-x64 @($m.Args) -p:DebugType=none -p:Version=$Verzio -o $mappa

if ($LASTEXITCODE -ne 0) { throw "A közzététel nem sikerült: $($m.Nev)" }

Compress-Archive -Path "$mappa\*" -DestinationPath $zip -Force

$meret = [math]::Round((Get-ChildItem $mappa -Recurse | Measure-Object Length -Sum).Sum / 1MB, 1)
$hash = (Get-FileHash $zip -Algorithm SHA256).Hash

Add-Content kiadas\KIADAS.md "$($m.Nev) | $meret MB | $hash | $zip"
}

Write-Host "Kész. Lásd: kiadas\KIADAS.md"

Várható megfigyelések: az fdd csomag a legkisebb, az önálló mappa a legnagyobb (a futtatókörnyezet benne van), az egy fájl kényelmes, de az indulása lassabb lehet. A pontos méretek és idők a te programodtól és gépedtől függenek: a saját méréseidet írd a táblázatba. Ha a szkriptet nem engedi futtatni a PowerShell, a Set-ExecutionPolicy -Scope Process Bypass parancs az aktuális ablakra engedélyezi.

📷 Képernyőkép helye

Mit tegyél ide: a kiadás mappa három ZIP-pel és a KIADAS.md táblázata méretekkel és hash-ekkel.Javasolt fájlnév: winforms-14-5-kesz.webp · Alt szöveg: A három kiadási csomag összehasonlítása

Három önálló gyakorlófeladat

Egyszerre csak egyet csinálj: tervezd meg, írd meg, futtasd, ellenőrizd, és csak utána nyisd ki a megoldást.

1. Közzétételi profil

Készíts két profilt (Keretrendszer-függő és Önálló), és futtasd őket parancssorból.

Egy lehetséges megoldás

Visual Studio: Publish → New profile → Folder; a beállítások a .pubxml fájlba kerülnek. Parancssor: dotnet publish -p:PublishProfile=FDD. A profilok a verziókezelésbe is kerülhetnek (a közös beállításokhoz).

2. README a felhasználónak

Írj rövid, érthető README-t a csomaghoz (nem fejlesztőknek).

Egy lehetséges megoldás

Tartalma: mi a program; rendszerkövetelmény (Windows verzió, 64 bit, futtatókörnyezet); kicsomagolás és indítás lépésekkel; a SmartScreen figyelmeztetés magyarázata; hová kerülnek az adatok; kapcsolat a hibabejelentéshez.

3. Hash-ellenőrzés

Ellenőrizd a saját ZIP-ed hash-ét, majd módosíts a ZIP-en (például átnevezés a kicsomagolás után, újracsomagolás), és nézd az új hash-t.

Egy lehetséges megoldás

Az újracsomagolt ZIP hash-e más lesz (még azonos tartalomnál is, az időbélyegek és a tömörítés miatt). Ezért a közzétett ZIP-et ne csomagold újra a hash kiszámítása után.

Gyakorlótár: 6 további feladat

Három szinten gyakorolhatsz: alap, közepes és kihívás. Csak a próbálkozás után nyisd le a megoldást.

Alap szint

1. Build vagy Publish?

Melyiket használod kiadáshoz?

Megoldás megnyitása

A Publish: a szükséges fájlokat gyűjti egy tiszta mappába a választott platformra.

2. Mi a runtime identifier?

Mit jelent a win-x64?

Megoldás megnyitása

A célplatform: 64 bites Windows.

Közepes szint

3. Mód kiválasztása

Pendrive-ról, ismeretlen gépre adod a programot. Melyik módot választod?

Megoldás megnyitása

Önálló (self-contained), esetleg egyetlen fájl: nem kell telepíteni a futtatókörnyezetet.

4. SmartScreen

Miért jelenik meg a figyelmeztetés?

Megoldás megnyitása

A program aláíratlan, a kiadó ismeretlen, és kevés letöltés van hozzá: óvatosságból jelzi a Windows.

Kihívás szint

5. Egy fájl hátránya

Mi a hátránya az egyetlen fájlos kiadásnak?

Megoldás megnyitása

Lassabb első indulás (kicsomagolás), a víruskeresők gyakrabban jeleznek, és a csomag nagyobb.

6. Hash és aláírás

Miben különbözik a hash és a digitális aláírás?

Megoldás megnyitása

A hash a fájl sértetlenségét igazolja; az aláírás a kiadó kilétét is (tanúsítvány alapján).

Gyors önellenőrzés

Válaszolj fejben, és csak utána nyisd le a választ.

1. Mit csinál a Publish?

Összegyűjti a futtatáshoz szükséges fájlokat egy tiszta mappába, a választott platformra és módban.

2. Mi a két fő mód?

Keretrendszer-függő (kicsi, runtime kell) és önálló (nagy, nem kell semmi).

3. Mit nem szabad Forms programnál?

Trimmelni (PublishTrimmed).

4. Mire jó a SHA-256?

A letöltött fájl sértetlenségének ellenőrzésére.

5. Mi a ClickOnce?

Önfrissítő telepítési technológia, rendszergazda nélkül.

6. Mit ellenőrzöl kiadás előtt?

Tiszta mappa, Release, tesztek, nincs PDB, tiszta gépes próba, verzió, README, licencek.

7. Mit őrzöl meg magadnak?

A kiadott csomagot, a hash-ét és a hozzá tartozó PDB-t a hibajelentések értelmezéséhez.

Mit tudsz már?

  • Érted a Build és a Publish különbségét, és közzéteszed a programot profilokkal és parancssorból.
  • Választasz a közzétételi módok közt (keretrendszer-függő, önálló, egy fájl, ReadyToRun).
  • Ellenőrzöd a csomagot (tiszta mappa, ZIP, hash, tiszta gépes próba).
  • Érted a terjesztési lehetőségeket, a SmartScreen figyelmeztetést és a kódaláírás szerepét.

Következő lecke: Telepítési csomagok és frissítés

Telepítő készítése, a futtatókörnyezet ellenőrzése, eltávolítás és a program frissítése.