Grafikus C# – Windows Forms tanfolyam › 14.3 lecke

Windows Forms · 14.3 lecke · build

A .NET és a .NET Framework futtatókörnyezet

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.

  • kb. 90 perc
  • közepes szint
  • futtatókörnyezet
Diáklány C# programot készít laptopon

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.

14.2 EXE, DLL, kimeneti mappák →

Futtatókörnyezet, SDK, cél-keretrendszer

FogalomMi 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.
Konyvtar.App.csprojXML
<!-- 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>
Terminál: mi van telepítve ezen a gépen?parancsok
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]
MonikerA 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.
Windows Desktop RuntimeA Windows Forms (és a WPF) nem az alap .NET Runtime része: külön csomag a Windows Desktop Runtime (Microsoft.WindowsDesktop.App). Ezt a felhasználó gépén is telepíteni kell, ha a program keretrendszer-függő.
Egymás mellett élésA modern .NET verziói egymás mellett telepíthetők (6, 8, 9...): minden program a saját cél-keretrendszerének megfelelőt használja (kisebb frissítésekhez átgördülhet, rollForward).
TámogatásMinden .NET verziónak van támogatási ideje (LTS: hosszabb, STS: rövidebb). Kiadás előtt nézd meg a hivatalos támogatási oldalt (dotnet.microsoft.com → támogatási szabályzat), és olyan verziót válassz, amely még kap biztonsági frissítést.

.NET Framework és modern .NET

.NET Framework (4.8)Modern .NET (6, 8, 9 ...)
PlatformCsak Windows.Windows, Linux, macOS (a Windows Forms csak Windowson).
TelepítésA 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ésKarbantartott, de már nem kap új szolgáltatásokat.Aktív fejlesztés, új nyelvi és teljesítménybeli újdonságok.
TeljesítményJó.Általában gyorsabb és kevesebb memóriát használ.
Windows FormsTeljes 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.
Új projekthez: modern .NETA tanfolyam programjai modern .NET-re épülnek. Az újabb nyelvi elemek (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.
Mikor a Framework?Ha a program régi környezetben fut (iskolai gépek, ahol nem telepíthetsz), a 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.
ÁttérésMeglévő .NET Framework programot át lehet vinni modern .NET-re (.NET Upgrade Assistant eszköz). A Windows Forms kód nagy része változatlan marad, a konfiguráció (app.config), néhány régi API és a harmadik féltől származó könyvtárak okozhatnak munkát.
KódmegosztásHa a Core könyvtárat mindkettő használja, 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?

Ablak indításkor (a szöveg a Windows és a .NET verziótól függ)hibaüzenet
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=win10

1. 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.

A program ellenőrzi magát?Az exe maga nem tud mit csinálni, ha a futtatókörnyezet hiányzik (még el sem indult a kódod): ezért kell a telepítési folyamatnak (vagy a dokumentációnak) előre kezelnie. Írd le a követelményeket az „Első lépések”/README fájlban: „Windows 10/11, .NET 8 Desktop Runtime”.
Platform: x86 vagy x64A futtatókörnyezetnek a program platformjához kell illeszkednie (14.1 lecke): egy 64 bites programhoz x64 runtime kell; Any CPU esetén a gép architektúrájának megfelelő.
rollForwardA .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.
FrissítésA futtatókörnyezet biztonsági frissítései a Windows Update-en át érkezhetnek; önálló programnál ez rád marad.

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éretKicsi (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ésA 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).
Közzététel parancssorból (részletek: 14.5 lecke)parancsok
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)
Döntés a közönség alapjánIskolai laborban, ahol a .NET 8 Desktop Runtime telepítve van: keretrendszer-függő, kis csomag. Barátnak, pendrive-ról, ismeretlen gépre: önálló. A döntés a felhasználó helyzetén múlik, nem a te kényelmeden.
Egyetlen fájlA 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.
Vágás (trimming)A trimming (a nem használt kód kivágása) a méretet csökkenti, de a Windows Formsnál (tükrözés, a Designer által használt kód) nem támogatott megbízhatóan: ne kapcsold be Windows Forms programnál.
ReadyToRunA 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.

📷 Képernyőkép helye

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.

Ok és javítás

Hiányzik a futtatókörnyezet. Telepítsd a megfelelő verziójú Desktop Runtime-ot, vagy tedd a programot önállóvá.

2. Telepítve van a .NET, mégis ugyanez

A dotnet --list-runtimes mutatja a Microsoft.NETCore.App-ot.

Ok és javítás

A Windows Forms a 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).

Ok és javítás

Egyeztesd a platformot: telepítsd a megfelelő architektúrájú runtime-ot, vagy fordíts Any CPU-ra (14.1 lecke).

4. Régi Windows 7 gép

A modern .NET programot Windows 7-en nem lehet futtatni.

Ok és javítás

A modern .NET csak a támogatott Windows verziókat célozza (a Windows 10 és újabb). Régi gépre 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.

Ok és javítás

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).

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.

Ok és javítás

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 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:

  1. Projekt: Windows Forms (RuntimeTerkep), net8.0-windows (vagy a te verziód); lstAdatok, btnMasol, lblUzenet.
  2. 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.
  3. Vizsgálat a saját gépeden: futtasd a dotnet --list-sdks és dotnet --list-runtimes parancsot, és vesd össze a program kimenetével.
  4. Ö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.
  5. Hiányzó runtime szimulálása: a keretrendszer-függő csomag .runtimeconfig.json fá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.
  6. 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?
  7. 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).
  8. 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!)
Form1.cs (using System.Runtime.InteropServices; using System.Reflection;)C#
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ő.

📷 Képernyőkép helye

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.

Egy lehetséges megoldás

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.”

2. Többszörös cél

Állítsd be a Core könyvtárat net48 és net8.0 célra is.

Egy lehetséges megoldás

A Core .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?

Egy lehetséges megoldás

A .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?

Megoldás megnyitása

A futtatókörnyezet (runtime); az SDK a fejlesztőnek kell.

2. Framework vagy .NET?

Melyik része a Windows 10/11-nek?

Megoldás megnyitása

A .NET Framework 4.8; a modern .NET külön telepítendő.

Közepes szint

3. Desktop Runtime

Miért kell a Windows Formshoz a Desktop Runtime?

Megoldás megnyitása

A Windows Forms a 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?

Megoldás megnyitása

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.

Kihívás szint

5. rollForward

Mit szabályoz a rollForward?

Megoldás megnyitása

Hogy a program elfogad-e újabb (patch, minor, major) futtatókörnyezeti verziót a kért helyett.

6. Biztonság

Önálló programnál ki felel a futtatókörnyezet biztonsági frissítéséért?

Megoldás megnyitása

A program kiadója: új közzététellel és frissítéssel kell eljuttatnia a javított futtatókörnyezetet.

Gyors önellenőrzés

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

1. Mi a futtatókörnyezet?

Az a rész, amely a lefordított programot futtatja a gépen.

2. Mi a TargetFramework?

A projektben beállított cél (például net8.0-windows).

3. Mit ad a dotnet --list-runtimes?

A gépen telepített futtatókörnyezeteket.

4. Mi a keretrendszer-függő program előnye?

Kis méret; hátránya, hogy a futtatókörnyezetet telepíteni kell.

5. Mi az önálló program előnye?

Nem kell semmit telepíteni; hátránya a nagy méret.

6. Mit írsz a követelményekbe?

A Windows verziót, platformot és a futtatókörnyezetet.

7. Kell-e trimmelni WinFormst?

Nem: a trimming nem támogatott megbízhatóan Windows Forms programnál.

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.