Grafikus C# – Windows Forms tanfolyam › 14.3 lecke Windows Forms · 14.3 lecke · build A programod a fejlesztő gépen fut, a felhasználó gépén viszont indításkor ez az ablak jelenik meg: „You must install .NET to run this application.” A lefordított program ugyanis nem tartalmaz mindent: szüksége van egy futtatókörnyezetre (runtime), amely a köztes nyelvű kódot gépi kóddá alakítja és futtatja. Ebben a leckében megtanulod, mi a különbség a futtatókörnyezet és az SDK között, mi a .NET Framework (a régi, csak Windowsos) és a modern .NET (az újabb, több platformos) különbsége, hogyan választasz cél-keretrendszert, mi a Windows Desktop Runtime, mit tehetsz, ha a felhasználó gépén hiányzik a futtatókörnyezet, és mikor érdemes a programot önállóvá tenni.A .NET és a .NET Framework futtatókörnyezet

A lecke végére
- megkülönbözteted a futtatókörnyezetet (runtime) és az SDK-t;
- ismered a .NET Framework és a modern .NET különbségét;
- kiválasztod és beállítod a cél-keretrendszert (
TargetFramework); - tudod, hogy a Windows Forms programhoz a Windows Desktop Runtime kell;
- kezeled a „hiányzó futtatókörnyezet” esetet;
- érted a keretrendszer-függő és az önálló (self-contained) program közti választást.
Mielőtt elkezded
Ehhez a leckéhez a 14.1–14.2 lecke szükséges.
Futtatókörnyezet, SDK, cél-keretrendszer
| Fogalom | Mi ez? | Kinek kell? |
|---|---|---|
| SDK (Software Development Kit) | A fejlesztői eszközök: fordító, dotnet parancs, sablonok. Tartalmazza a futtatókörnyezetet is. | A fejlesztőnek (a Visual Studio telepíti). |
| Futtatókörnyezet (runtime) | Az a rész, amely a lefordított programot futtatja (JIT-fordító, szemétgyűjtő, alapkönyvtárak). | A felhasználónak (a programot futtató gépen). |
| Cél-keretrendszer (TargetFramework) | A projektben beállított érték (net8.0-windows, net48): melyik futtatókörnyezetre és API-készletre fordítsa a programot. | A projekt; a futtatáskor ennek megfelelő runtime kell. |
<!-- modern .NET Windows Forms program -->
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
<!-- .NET Framework 4.8 (régi, csak Windows) -->
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
</PropertyGroup>dotnet --list-sdks (a telepített SDK-k)
dotnet --list-runtimes (a telepített futtatókörnyezetek)
dotnet --info (részletes összefoglaló)
Példa kimenet (--list-runtimes):
Microsoft.NETCore.App 8.0.x [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 8.0.x [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]net8.0-windows a modern .NET 8, Windows-specifikus API-kkal (például Windows Forms). A net48 a .NET Framework 4.8. A -windows végződés nélkül a Windows Forms nem érhető el.Microsoft.WindowsDesktop.App). Ezt a felhasználó gépén is telepíteni kell, ha a program keretrendszer-függő.rollForward)..NET Framework és modern .NET
| .NET Framework (4.8) | Modern .NET (6, 8, 9 ...) | |
|---|---|---|
| Platform | Csak Windows. | Windows, Linux, macOS (a Windows Forms csak Windowson). |
| Telepítés | A Windows 10 és 11 része (a 4.8 verzió): általában nem kell telepíteni. | Külön telepítendő (vagy a programmal együtt szállítható). |
| Fejlődés | Karbantartott, de már nem kap új szolgáltatásokat. | Aktív fejlesztés, új nyelvi és teljesítménybeli újdonságok. |
| Teljesítmény | Jó. | Általában gyorsabb és kevesebb memóriát használ. |
| Windows Forms | Teljes körű, évtizedes ökoszisztéma. | Teljes körű, jobb nagy-DPI támogatás, újabb vezérlők. |
| Mikor? | Meglévő régi program karbantartása; olyan gép, ahová nem lehet telepíteni. | Új projekt: ez az ajánlott. |
record, ?.) és a kisebb hibák száma mellett a jövő is itt van; a .NET Framework már nem kap új szolgáltatást.net48 előnye, hogy a Windows már tartalmazza. Cserébe az újabb nyelvi és könyvtári újdonságok egy része nem érhető el.app.config), néhány régi API és a harmadik féltől származó könyvtárak okozhatnak munkát.netstandard2.0 vagy net8.0+net48 többszörös cél (multi-targeting) alkalmas: <TargetFrameworks>net48;net8.0</TargetFrameworks>.Jósolj!
A programod net8.0-windows cél-keretrendszerű, és egy olyan Windows 11 gépre másolod, amelyen soha nem telepítettek .NET 8-at. Elindul-e?
Jóslat ellenőrzése
Nem (ha keretrendszer-függő módon adtad át): a Windows 11 tartalmazza a .NET Framework 4.8-at, de a .NET 8 Desktop Runtime-ot nem. Indításkor a „You must install .NET to run this application” ablak jelenik meg a letöltési hivatkozással. Megoldás: a futtatókörnyezet telepítése, vagy önálló (self-contained) közzététel.
Mit tegyél, ha hiányzik a futtatókörnyezet?
You must install .NET Desktop Runtime to run this application.
App: C:\...\Diaknyilvantarto.exe
Architecture: x64
App host version: 8.0.x
.NET location: Not found
Learn about runtime installation:
https://aka.ms/dotnet/app-launch-failed
Download the .NET Desktop Runtime:
https://aka.ms/dotnet-core-applaunch?missing_runtime=true&arch=x64&rid=win-x64&os=win101. Futtatókörnyezet telepítése
A felhasználó letölti és telepíti a .NET Desktop Runtimeot (x64 vagy x86, a program platformjának megfelelően) a hivatalos dotnet.microsoft.com/download oldalról. Egyszeri teendő: utána a cél-keretrendszerű programok mind futnak.
2. Önálló (self-contained) program
A közzétételkor a futtatókörnyezet belekerül a program mappájába: a felhasználónak nem kell semmit telepítenie. Cserébe a csomag nagyobb (több tíz MB), és a futtatókörnyezet biztonsági frissítését te kell, hogy kiadd (14.5 lecke).
3. .NET Framework célzás
Ha a gépen biztosan van .NET Framework 4.8 (Windows 10/11), a net48 program semmit sem igényel. Régebbi Windowson a 4.8 telepítése kell.
4. Telepítő
Telepítőcsomag (MSI, MSIX, Inno Setup, 14.6 lecke), amely a futtatókörnyezetet is ellenőrzi, és szükség esetén letölti/telepíti.
.runtimeconfig.json rollForward beállítása szabályozza, hogy a program elfogad-e újabb futtatókörnyezetet (alapból a patch/minor frissítéseket igen: 8.0.1 helyett 8.0.5). Új főverziót (9.0) nem, hacsak nem engeded meg.Jósolj!
A programod net8.0-windows célú, a felhasználó gépén .NET 9 Desktop Runtime van, .NET 8 nincs. Elindul-e a program?
Jóslat ellenőrzése
Alapbeállítással nem: a program a 8-as főverziót kéri, és a futtatókörnyezet nem „gördül át” újabb főverzióra. Megoldás: a .NET 8 telepítése, vagy a rollForward beállítás (Major vagy LatestMajor), amely engedi az újabb főverziót, vagy a program újrafordítása a 9-es cél-keretrendszerre.
Keretrendszer-függő és önálló program
| Keretrendszer-függő (framework-dependent) | Önálló (self-contained) | |
|---|---|---|
| Méret | Kicsi (néhány MB). | Nagy (a futtatókörnyezet benne van: tíz–száz MB). |
| A felhasználónak kell? | Igen: .NET Desktop Runtime. | Nem: minden benne van. |
| Frissítés | A futtatókörnyezetet a gép frissíti. | Te adsz ki új csomagot a futtatókörnyezet frissítésekor. |
| Mikor? | Közös gépek, iskolai környezet, ahol a runtime már ott van; kis csomag. | Ha nem biztos a runtime; telepítés nélküli használat (pendrive). |
dotnet publish -c Release -r win-x64 --self-contained false (keretrendszer-függő)
dotnet publish -c Release -r win-x64 --self-contained true (önálló)
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true (egyetlen fájl)PublishSingleFile egy exe-be csomagolja a programot és a könyvtárakat: kényelmes átadás. Indulása kissé lassabb lehet, és a natív könyvtárak miatt további fájlok maradhatnak.PublishReadyToRun előre lefordított kódot tesz a csomagba: gyorsabb indulás, nagyobb méret. Érdemes kipróbálni, ha az indulás lassú (13.9 lecke: mérj előtte–utána).Jósolj!
Egy önálló programot kiadsz. Két hónap múlva biztonsági frissítés jelenik meg a .NET futtatókörnyezethez. Kinek a dolga a javított futtatókörnyezetet eljuttatni a felhasználókhoz?
Jóslat ellenőrzése
A tiéd: az önálló programban a futtatókörnyezet a programod része, a Windows Update nem frissíti. Újra kell közzétenned (új verzió), és a felhasználóknak frissítést kell adnod (14.6 lecke). Keretrendszer-függő programnál a gép futtatókörnyezetét a gazdagép frissíti.
Mit tegyél ide: a dotnet --list-runtimes kimenete és a „You must install .NET” hibaablak.Javasolt fájlnév: winforms-14-3-runtime.webp · Alt szöveg: A telepített futtatókörnyezetek és a hiányzó runtime hibaüzenete
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. „You must install .NET Desktop Runtime”
A másik gépen a program nem indul, ez az ablak jön. Hiányzik a futtatókörnyezet. Telepítsd a megfelelő verziójú Desktop Runtime-ot, vagy tedd a programot önállóvá.Ok és javítás
2. Telepítve van a .NET, mégis ugyanez
A A Windows Forms a dotnet --list-runtimes mutatja a Microsoft.NETCore.App-ot.Ok és javítás
Microsoft.WindowsDesktop.App runtime-ot igényli, nem csak a NETCore.App-ot. Telepítsd a Desktop Runtimeot (nem az ASP.NET vagy a sima Runtime csomagot).
3. Platformeltérés
A program x64-re van fordítva, a gépen csak x86 runtime van (vagy fordítva). Egyeztesd a platformot: telepítsd a megfelelő architektúrájú runtime-ot, vagy fordíts Any CPU-ra (14.1 lecke).Ok és javítás
4. Régi Windows 7 gép
A modern .NET programot Windows 7-en nem lehet futtatni. A modern .NET csak a támogatott Windows verziókat célozza (a Windows 10 és újabb). Régi gépre Ok és javítás
net48-at (és a 4.8 telepítését), ha lehet, frissítés.
5. Az önálló program óriási
150 MB-os csomagot kaptál egy kis programhoz. A futtatókörnyezet benne van. Keretrendszer-függő közzététellel kicsi lesz, vagy fogadd el a méretet (a trimmelés WinFormsnál nem támogatott).Ok és javítás
6. A frissítés után nem indul
A felhasználó gépén .NET 9-re frissültek, a .NET 8-as program nem indul. A runtime-ok egymás mellett élnek, de a .NET 8 eltávolítása esetén a program 8-as futtatókörnyezetet nem talál. Telepítsd újra, vagy állíts be Ok és javítás
rollForward-ot, vagy fordíts újra a 9-re.
Mini projekt: futtatókörnyezet-térkép és döntési tábla
Készíts programot, amely megmondja, milyen környezetben fut, majd írj döntési táblát három terjesztési helyzethez:
- Projekt: Windows Forms (
RuntimeTerkep),net8.0-windows(vagy a te verziód);lstAdatok,btnMasol,lblUzenet. - Kód: másold be a lenti kódot, amely kiírja a futtatókörnyezet adatait, az operációs rendszert, az architektúrát, a cél-keretrendszert és az alkalmazás mappáját.
- Vizsgálat a saját gépeden: futtasd a
dotnet --list-sdksésdotnet --list-runtimesparancsot, és vesd össze a program kimenetével. - Önálló közzététel: készíts egy önálló (
--self-contained true) és egy keretrendszer-függő (--self-contained false) csomagot (a 14.5 lecke előzetese), és hasonlítsd össze a mappák méretét. - Hiányzó runtime szimulálása: a keretrendszer-függő csomag
.runtimeconfig.jsonfájljában változtasd a verziót egy nem létezőre (például"version": "99.0.0"), és indítsd el: jegyezd fel a hibaüzenetet; állítsd vissza. - Tiszta gép: ha lehetséges, indítsd mindkét csomagot egy .NET nélküli gépen (vagy virtuális gépen): melyik fut?
- Döntési tábla: három helyzetre (iskolai labor telepített .NET-tel; barát otthoni gépe; pendrive, ismeretlen gép) válaszd ki a közzétételi módot, és indokold (méret, telepítés, frissítés).
- Követelmény-szöveg: írj egy Rendszerkövetelmények bekezdést (Windows verzió, platform, futtatókörnyezet) a program README fájljába.
Megoldás megnyitása (próbáld ki előbb önállóan!)
private void Form1_Load(object sender, EventArgs e)
{
lstAdatok.Items.Add("Futtatókörnyezet: " + RuntimeInformation.FrameworkDescription);
lstAdatok.Items.Add("Environment.Version: " + Environment.Version);
lstAdatok.Items.Add("Operációs rendszer: " + RuntimeInformation.OSDescription);
lstAdatok.Items.Add("Folyamat architektúra: " + RuntimeInformation.ProcessArchitecture);
lstAdatok.Items.Add("64 bites folyamat: " + Environment.Is64BitProcess);
lstAdatok.Items.Add("Cél-keretrendszer: " + AppContext.TargetFrameworkName);
lstAdatok.Items.Add("Program mappa: " + AppContext.BaseDirectory);
lstAdatok.Items.Add("Assembly verzió: " + Assembly.GetExecutingAssembly().GetName().Version);
lstAdatok.Items.Add("Kultúra: " + System.Globalization.CultureInfo.CurrentCulture.Name);
}
private void btnMasol_Click(object sender, EventArgs e)
{
string szoveg = string.Join(Environment.NewLine, lstAdatok.Items.Cast<object>());
try { Clipboard.SetText(szoveg); lblUzenet.Text = "Vágólapra másolva (hibabejelentéshez)."; }
catch (System.Runtime.InteropServices.ExternalException ex) { lblUzenet.Text = "A vágólap nem elérhető: " + ex.Message; } // a vágólapot másik program használhatja
}Minta döntési tábla: iskolai labor (a .NET 8 Desktop Runtime telepítve): keretrendszer-függő (kis csomag, a labor frissíti a runtime-ot). Barát otthoni gépe: önálló vagy a runtime telepítési útmutatóval (a barát nem biztos, hogy telepítheti). Pendrive, ismeretlen gép: önálló, egyetlen fájl. A számokat (csomagméret) a saját méréseid szerint töltsd ki; a hibaüzenetek szövege verziófüggő.
Mit tegyél ide: a futtatókörnyezet-térkép és a kitöltött döntési tábla.Javasolt fájlnév: winforms-14-3-kesz.webp · Alt szöveg: A futtatókörnyezet-térkép
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. Rendszerkövetelmények
Írj README-bekezdést egy programodhoz: milyen Windows, platform és futtatókörnyezet kell. Például: „Windows 10 vagy újabb, 64 bites. Szükséges: .NET 8 Desktop Runtime (x64), letölthető a dotnet.microsoft.com/download oldalról. Az önálló csomagban a futtatókörnyezet benne van.”Egy lehetséges megoldás
2. Többszörös cél
Állítsd be a Core könyvtárat A Core net48 és net8.0 célra is.Egy lehetséges megoldás
.csproj-ban <TargetFrameworks>net48;net8.0</TargetFrameworks> (többes szám). A fordítás mindkét célra elkészíti a DLL-t; az újabb nyelvi elemekhez LangVersion kell, és egyes API-k csak #if NET8_0_OR_GREATER alatt érhetők el.
3. Verzióváltás
Állítsd át egy kis projekt cél-keretrendszerét a következő modern verzióra, és fordítsd újra. Mi változik? A Egy lehetséges megoldás
.csproj-ban a TargetFramework értéke; az új SDK szükséges. Nézd az Error List figyelmeztetéseit (elavult API-k), futtasd a teszteket (13.8 lecke), és a .runtimeconfig.json már az új runtime-ot kéri.
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. SDK vagy runtime?
Melyik kell a felhasználónak? A futtatókörnyezet (runtime); az SDK a fejlesztőnek kell.Megoldás megnyitása
2. Framework vagy .NET?
Melyik része a Windows 10/11-nek? A .NET Framework 4.8; a modern .NET külön telepítendő.Megoldás megnyitása
Közepes szint
3. Desktop Runtime
Miért kell a Windows Formshoz a Desktop Runtime? A Windows Forms a Megoldás megnyitása
Microsoft.WindowsDesktop.App csomag része, amely külön van az alap Microsoft.NETCore.App-tól.
4. Mikor önálló?
Mikor érdemes önálló programot adni? Ha nem biztos, hogy a gépen van futtatókörnyezet, vagy nem akarsz telepítést kérni (pendrive, ismeretlen gép); cserébe nagyobb a csomag.Megoldás megnyitása
Kihívás szint
5. rollForward
Mit szabályoz a Hogy a program elfogad-e újabb (patch, minor, major) futtatókörnyezeti verziót a kért helyett.rollForward?Megoldás megnyitása
6. Biztonság
Önálló programnál ki felel a futtatókörnyezet biztonsági frissítéséért? A program kiadója: új közzététellel és frissítéssel kell eljuttatnia a javított futtatókörnyezetet.Megoldás megnyitása
Gyors önellenőrzés
Válaszolj fejben, és csak utána nyisd le a választ. Az a rész, amely a lefordított programot futtatja a gépen. A projektben beállított cél (például A gépen telepített futtatókörnyezeteket. Kis méret; hátránya, hogy a futtatókörnyezetet telepíteni kell. Nem kell semmit telepíteni; hátránya a nagy méret. A Windows verziót, platformot és a futtatókörnyezetet. Nem: a trimming nem támogatott megbízhatóan Windows Forms programnál.1. Mi a futtatókörnyezet?
2. Mi a TargetFramework?
net8.0-windows).3. Mit ad a dotnet --list-runtimes?
4. Mi a keretrendszer-függő program előnye?
5. Mi az önálló program előnye?
6. Mit írsz a követelményekbe?
7. Kell-e trimmelni WinFormst?
Mit tudsz már?
- Megkülönbözteted a futtatókörnyezetet és az SDK-t, a .NET Frameworköt és a modern .NET-et.
- Beállítod a cél-keretrendszert, és tudod, hogy a Windows Formshoz Desktop Runtime kell.
- Kezeled a hiányzó futtatókörnyezetet.
- Eldöntöd, mikor jó a keretrendszer-függő, mikor az önálló program.
Következő lecke: NuGet-függőségek
Külső könyvtárak használata: a csomagok kezelése, verziók és a kimenetbe kerülő DLL-ek.



