Grafikus C# – Windows Forms tanfolyam › 14.5 lecke Windows Forms · 14.5 lecke · kiadás A Build a fejlesztés eszköze: lefordítja a programot a Publish és terjesztési lehetőségek
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.
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.
Build és Publish
| Build | Publish | |
|---|---|---|
| Cél | Fejlesztés, tesztelés. | Kiadás: a felhasználónak szánt csomag. |
| Kimenet | bin\<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örnyezet | Nem része. | Beletehető (önálló mód). |
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<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>-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)..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.-o kapcsolóval) végezd, hogy ne maradjon benne régi fájl (14.2 lecke).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ód | Jellemző | 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). |
| Trimming | Nem használt kód kivágása. | Windows Formsnál nem támogatott megbízhatóan: ne használd. |
| ClickOnce | Há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. |
<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>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.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
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.zipEllenő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ód | Előny | Há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 mappa | Internet 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. |
| ClickOnce | Automatikus 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. |
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.
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. Telepítsd a Desktop Runtime-ot, vagy készíts önálló csomagot (14.3 lecke).Ok és javítás
2. A csomagban ott van a .pdb és a régi DLL
A kiadott mappa tele van felesleges fájllal. A bin mappát adtad át, vagy nem tiszta mappába közzétettél. Ok és javítás
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. A natív könyvtárakat a kicsomagolás miatt Ok és javítás
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ó. A Ok és javítás
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. 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.Ok és javítás
6. Régi verziót kapnak a felhasználók
A letöltési oldalon a régi csomag maradt. 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.Ok és javítás
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:
- Előkészítés: a projekt Release módban hibátlanul fordul; a regressziós tesztek lefutottak (13.8 lecke); a
DebugType=nonebe van állítva a közzétételhez. - 1. csomag (keretrendszer-függő):
dotnet publish -c Release -r win-x64 --self-contained false -o publish\fdd. - 2. csomag (önálló mappa):
--self-contained true -o publish\onallo. - 3. csomag (önálló, egy fájl):
--self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o publish\egyfajl. - Összehasonlítás: mérd mindegyik mappa méretét, a fájlok számát, és az indulási időt (
StopwatchaMainelejétől az első megjelenésig, vagy kézi mérés, 5 indítás mediánja). - ZIP és hash: csomagold be mindhárom csomagot verziózott névvel, és számold ki a SHA-256 összeget; írd a
KIADAS.mdfájlba. - README: minden csomaghoz: rendszerkövetelmény (futtatókörnyezet kell-e), kicsomagolás, indítás, a SmartScreen figyelmeztetés leírása.
- 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.
- Szkript: írd meg a
kiadas.cmd/kiadas.ps1szkriptet, 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!)
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.
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. Visual Studio: Publish → New profile → Folder; a beállítások a Egy lehetséges megoldás
.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). 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.Egy lehetséges megoldás
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. 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.Egy lehetséges megoldás
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? A Publish: a szükséges fájlokat gyűjti egy tiszta mappába a választott platformra.Megoldás megnyitása
2. Mi a runtime identifier?
Mit jelent a A célplatform: 64 bites Windows.win-x64?Megoldás megnyitása
Közepes szint
3. Mód kiválasztása
Pendrive-ról, ismeretlen gépre adod a programot. Melyik módot választod? Önálló (self-contained), esetleg egyetlen fájl: nem kell telepíteni a futtatókörnyezetet.Megoldás megnyitása
4. SmartScreen
Miért jelenik meg a figyelmeztetés? A program aláíratlan, a kiadó ismeretlen, és kevés letöltés van hozzá: óvatosságból jelzi a Windows.Megoldás megnyitása
Kihívás szint
5. Egy fájl hátránya
Mi a hátránya az egyetlen fájlos kiadásnak? Lassabb első indulás (kicsomagolás), a víruskeresők gyakrabban jeleznek, és a csomag nagyobb.Megoldás megnyitása
6. Hash és aláírás
Miben különbözik a hash és a digitális aláírás? 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).Megoldás megnyitása
Gyors önellenőrzés
Válaszolj fejben, és csak utána nyisd le a választ. Összegyűjti a futtatáshoz szükséges fájlokat egy tiszta mappába, a választott platformra és módban. Keretrendszer-függő (kicsi, runtime kell) és önálló (nagy, nem kell semmi). Trimmelni ( A letöltött fájl sértetlenségének ellenőrzésére. Önfrissítő telepítési technológia, rendszergazda nélkül. Tiszta mappa, Release, tesztek, nincs PDB, tiszta gépes próba, verzió, README, licencek. A kiadott csomagot, a hash-ét és a hozzá tartozó PDB-t a hibajelentések értelmezéséhez.1. Mit csinál a Publish?
2. Mi a két fő mód?
3. Mit nem szabad Forms programnál?
PublishTrimmed).4. Mire jó a SHA-256?
5. Mi a ClickOnce?
6. Mit ellenőrzöl kiadás előtt?
7. Mit őrzöl meg magadnak?
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.



