Bevezetés
A .NET architektúra elemei¶

A .NET-re nyelvek és implementációk nagy családjaként érdemes tekinteni. A .NET Standard egy API gyűjtemény, ami az alapját adja a .NET implementációknak. Négy fontosabb implementációról beszélhetünk, a .NET Core-ról (már csak .NET), .NET Frameworkről (deprecated), a Mono-ról és az UWP-ről.
A Mono kis futásidejű alkalmazások fejlesztésére szolgál, segítségével Xamarin alkalmazások készíthetők pl. Androidra, iOS-re és Mac-re.
Az UWP (Universal Windows Platform) különböző platformokat támogató alkalmazások fejlesztését teszi lehetővé, pl. személyi számítógép, tablet, telefon, XBox. A platformok közös jellemzője, hogy Windows operációs rendszert futtatnak.
.NET Core és .NET Framework¶
A Framework egy 2002 óta létező .NET implementáció, amit a mai napig rengetegen használnak. Ez egy platformfüggő megvalósítás, elsősorban Windows asztali alkalmazások fejlesztésére optimalizálva Windows Forms és WPF segítségével, de webes alkalmazások is készíthetők a segítségével.
A Core egy már platformfüggetlen open source megvalósítás, Windowson, Linuxon és macOS-en is fut. Támogatja az UWP-t, WinForms-t és a WPF-et is, emellett az ASP.NET Core segítségével webes alkalmazások készíthetők. A Microsoft az utóbbi időben a nyílt forráskódú fejlesztés irányába fordult, ennek hatásaként a .NET Core megtalálható GitHubon.
Jelenleg a .NET 7.0 stabil verziónál tart a technológia.
Hello World¶
Hozzunk létre egy .NET Core konzolos alkalmazást, amely komplex módon írja ki a Hello World szöveget.
Ez egy sablon alkalmazás, melyet elkészít a fejlesztőkörnyezet, segítségével áttekinthető a .NET-es projektek felépítése.
Alkalmazás konzolból¶
Először nézzük meg hogyan hozhatjuk létre az alkalmazást konzolból (A parancsok Windows CMD-ből vannak tesztelve, de Unix alapú rendszeren is működnie KELL).
- Hozz létre egy Hello nevű mappát és lépj bele.
1 2 3 | |
- Készítsd el a projektet a következő parancs segítségével.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
A Hello mappában most két fájl látható: Program.cs és Hello.csproj.
- Fordítsd le a projektet futtatható állapotba.
Ahhoz, hogy egy .NET-es projekt fusson, le kell fordulnia (pont úgy, mint a C, C++, Java nyelveknek, amikkel már találkoztatok).
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Az első két sort ignorálni lehet jelen pillanatban.
Ezután a fordítóprogram (és környezete) meghatározza milyen projekteket kell visszaállítani (később), majd látható egy útvonal a Hello -> után.
Ebből megsejthető, hogy Debug build készült és a végtermék egy dll fájl.
Debug buildek során a fordítóprogram nem optimalizálja a forráskódot, így az alkalmas marad hibakeresési feladatok megoldására.
A log utolsó pár sora tájékoztat, hogy sikeres volt a fordítás (hisz nem is rontottunk el semmit még).
- Futtatás
1 2 | |
A parancs kiadása után a Hello World! szövegnek kell megjelennie és egy soremelésnek.
Amennyiben a build parancsot kihagyjuk, úgy a run elvégzi azt.
Kipróbálható úgy, hogy a bin mappát kézzel kitöröljük és újrafuttatjuk a dotnet run parancsot.
Ugyanez Visual Studioval¶
Indítsunk egy Visual Studio-t és nézzük meg ugyanezeket a lépéseket itt.
- Válasszuk ki a kezdőoldalon Create a new project menüpontot
1.2. Ha nem látunk ilyen lehetőséget, válasszuk ki a File > New > Project menüpontot
- A project template oldalon válasszuk ki a
Console App (.NET Core)lehetőséget és kattintsunk aNextgombra
- A következő oldalon nevezzük el a projektünket és kattintsunk a
Creategombra.
Alapbeállításként a C:\Users\<user>\source\repos mappába helyezi el a létrehozott projekteket.
Itt lehetőség van még átállítani.
Két név beállítására is lehetőség van, az első a projekt, a második pedig a Solution. Egy Solution alá több projekt is tartozhat.
A projekt felépítése¶
Solution¶
A Visual Studioban vizsgálva a projektet látható hogy a Hello2 projekt egy ugyanilyen nevű Solutionben szerepel. A solution úgy képzelhető el, mint egy konténer, mely több projektet tartalmazhat, illetve az egyes projektekhez közvetlenül nem tartozó (+ több projekt által is felhasznált) fájlokat tartalmazza.
Egy solution fájl kiterjesztése .sln.
Ezt betöltve a solutionban lévő minden projekt betöltődik a fejlesztői környezetbe.
A Solution Explorer alapértelmezetten az egyik oldalon meg van nyitva, viszont ha véletlen bezárjátok: (fent) View -> Solution Explorer és újra megnyílik.
Project¶
Esetünkben van egy Hello2.csproj kiterjesztésű projekt fáj, ami a projekt szükséges függőségeit tartalmazza. A .csproj fájlt a VS arra használja hogy az oldalsó Solution Explolerben megjelenítse a projekteket. A projekt fájl tartalmát VS-ben a projekt Unload-olása után tudjuk megtekinteni, bármilyen más szövegszerkesztővel enélkül is megtekinthető.
A Hello2.csproj tartalma:
1 2 3 4 5 6 | |
Program.cs¶
A Program.cs megnyitása után látható, hogy gyakorlatilag kész van a Hello World alkalmazás.
Ez egy alapértelmezett sablon, ami létrejön egy teljesen üres .NET Core alkalmazás létrehozásánál.
Maga a Program.cs tartalmazza az alkalmazás belépési pontját, ami a már ismerős Main metódus.
Jelenleg kiírja a Hello World! szöveget és egy soremelést a (System.)Console.WriteLine segítségével.
Hierarchia szempontjából fontos, hogy az osztályok névterekbe vannak sorolva.
Java alkalmazásoknál már megszokott, hogy az osztályok package-ekbe vannak rendezve, C# esetén ugyanerre a namespace-k vannak használva (mint C++ esetén).
Névterek a namespace kulcsszó segítségével definiálhatók.
Amennyiben egy létező névteret szeretnénk valahol használni, azt a using kulcsszó segítségével tehetjük meg.
Ez megfelel a Java import kulcsszó működésének, azzal a különbséggel, hogy amíg Java-ban létrejön a fájlrendszerben a névtérhierarchia, addig C#-ban nem.
Futtatás, fordítás¶
A projektet fordítani a Build menüpont alatt, vagy a Solution Explorerben a projektre jobb gombbal kattintva a szintén Build menüpont segítségével tehetjük meg.
Futtatni az F5 gombbal vagy a menüsorban található zöld nyíllal tudunk.
Egy cmd.exe ablak jelenik meg, ahol az első sorban látható a Hello World! szöveg, majd némi információ a környezetről.
Ha ez az ablak csak egy pillanatig él és be is zárul, akkor ez a Console.ReadKey(); sor beszúrásával kiküszöbölhető.
Egészítsük ki a kódot:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
A Console névtérben található minden, ami a konzolra íráshoz és onnan olvasáshoz szükséges.
A ReadLine metódus addig olvassa a felhasználó által beírt szöveget a konzolról, míg újsort (entert) nem kap.
Ezután a WriteLine függvény kiírja a paraméterben kapott szöveget és egy soremelést.
NuGet csomagkezelő rendszer¶
A NuGet a .NET csomagkezelő rendszere. Lehetővé teszi újrafelhasználható kódok csomagokba szervezését és megosztását. Az alkalmazás írója egy galériában tud keresni és válogatni az elérhető (és kompatibilis) csomagok közül.
A vállalatok nem mindig szeretnék megosztani a drága pénzért megírt csomagjaikat, melyeket csak cégen belül szeretnének felhasználni, ezért a publikusan elérhető nuget.org mellett privát szervereket is lehet használni.
Amennyiben egy csomag telepítve lett a projektben, annak publikus API-ja elérhető a kódból.
A telepítés során egy konfigurációs fájlba kerülnek az adatok, magukat az DLL-eket nem tartalmazza a projekt (így a kód-menedzsment könnyebb).
Fordítás során a Visual Studio automatikusan (dotnet restore) letölti a hiányzó csomagokat (egyszer), melyek utána belefordulnak az alkalmazásba.
A csomagok írásakor lehetőség van további NuGet csomagok felhasználására, viszont a végfelhasználó elől ezen függőségek rejtve vannak. A csomag telepítésekor a csomagkezelő rendszer a függőségeket is telepíti és a projekt életciklusa során menedzseli azt.
A projekt, Visual Studio és NuGet verziótól függően két helyen található a konfigurációs fájl: packages.config vagy a projekt fájl <PackageReference> szekciójában.
Az első megoldás mára már csak a kompatibilitás megtartásáért felel.
Csomagok telepítése és használata¶
A Solution Explorer-ben a projekt nevére jobb klikk és Manage NuGet packages....
Az Installed fül alatt találhatók a már feltelepített csomagok és a Browse fül alatt lehet keresni és telepíteni.
A telepítés után a Project/Dependencies/NuGet alatt megjelenik az újonnan feltelepített csomag.
Telepítsük fel a Serilog.Sinks.Console nevű csomagot a GUI-n keresztül.
A Tools/NuGet Package Manager/Package Manager Console segítségével elérhető a konzolos változata is a csomagkezelőnek, amely segítségével a következőképp lehet csomagokat telepíteni: Install-Package Serilog.Sinks.Console.
Több projekt esetén oda kell figyelni, hogy a Solution Explorer-ben melyik projekt van kiválasztva alapértelmezettként, mert oda fogja telepíteni a kért csomagot (vagy specifikálni kell a projektet Install-Package Serilog.Sinks.Console -ProjectName NuGet_test).
Miután a csomagok feltelepültek, a következő programmal ki is próbálható a funkcionalitása:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
Futtatás után az alábbi kimenetet kellene látni:
1 2 | |
A logoló csomag formázza a kiírt szöveget. Először egy időpont látható, majd a logolás szintje és végül a kért információ.
A projektet leíró fájlt megtekintve látható, hogy bővült a csomag telepítése után.
1 2 3 | |
Törölni egy a projekthez telepített csomagot az Installed fül alatt lehet, vagy az Uninstall-Package paranccsal.
Hibakeresés¶
A szekció célja, hogy a hallgatók találkozzanak a fejlesztőkörnyezet által visszaadott hibaüzenetekkel és fel tudják kutatni a keletkezett hiba forrását.
Hozzunk létre egy új projektet a meglévő Solutionbe (solution jobb klikk -> new project, majd adjunk hozzá egy osztályt DummyClass néven.
A projekt nevén jobb klikk és Add -> Class.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Ezután a Program osztályban lévő Main függvényt egészítsük ki.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Ez a kezdetleges program több hibát tartalmazhat, keressük meg ezeket debuggerrel.
Az eszköz csak akkor használható, ha a fordítási mód Debug, mert Release módban az ehhez szükséges szimbólumok nem kerülnek bele a binárisba.
Alapértelmezetten nem ez a projekt indul el, hanem a Hello2.
Ennek megváltoztatására jobb klikk a Hello22 projektre (vagy ahogy el lett nevezve) a Solution Explorerben -> Set as Startup Project.
Ilyen állapotban a fejlesztői környezet Autos ablakában megtekinthetők a blokkban látható változók, illetve a Call Stack is, azaz, hogy a program milyen úton jutott el a hibás állapotba.
Feladat: Javítsátok ki a hibákat, hogy szöveg vagy 42 során is jól működjön a program.
Invalid input esetén írja ki, hogy Rossz input, csak egész számot vár a program. 42 esetén
írja ki, hogy Nem támogatott mágikus szám. Tipp: try-catch, int.TryParse.
Breakpoint-ok¶
A szövegszerkesztő bal szélén van egy szürke csík (sötét téma esetén), a sorszámoktól balra. Itt minden futtatható sorra tehetünk úgynevezett breakpointot, azaz ha a program futása eléri a piros pontot, akkor megáll és láthatók lesznek a változók, a programozó kitalálhatja hogy hol lehet hiba (Sőt át is tudja írni a változók értékét.).
Jelen állapotban lehetőség van léptetni soronként a programot a menüsorban található eskzözök segítségével.
Balról indulva:
- program futásának megállítása
- program újraindítása
- következő utasítás mutatása
- Step-In: A következő utasításra ugrás. Ha ez függvényhívás, akkor a függvényhívás törzsébe lép.
- Step-Over: A következő utasításra ugrás. Ha ez függvényhívás, akkor a törzsét lefuttatja és a jelenlegi kontextus következő utasításával folytatódik.
- Step-Out: A következő utasításra ugrás. A jelenlegi függvényből kilépve (a függvény maradék törzsét lefuttatja és a függvényhívás helyét kapjuk meg).
Hasznos kulcsszavak és jelölések hibakeresés közben:
- breakpoint: Megállítja a program futását azon a programsoron, ahová tettük. Ezután léptethető a program.
- conditional breakpoint: Mint az előző, de valamilyen feltételnek teljesülnie kell (pl.
userInput == 42). - exception: Az Exception osztály egy leszármazott típusú objektuma. Ismerősnek kell lennie Programozás I-II, illetve Alkalmazásfejlesztés I kurzusokból.
- call stack: Amikor megáll a program futása, egy ablakban látható a hívási lánc, ahogyan a program futása eljutott a megállás pontig.
- locals: Szintén a program álló helyzetben való analízisére használható, a megállási pontról elérhető objektumok állapotai láthatók itt.
További olvasnivaló¶
- .NET architectural components
- Introduction to .NET
- Difference Between .NET and .NET Core
- Tutorial: Create a .NET console application using Visual Studio Code
- .NET CLI overview
- Tutorial: Create a simple C# console app in Visual Studio (part 1 of 2)
- What are solutions and projects in Visual Studio?
- NuGet Gallery
- An introduction to NuGet
- Quickstart: Install and use a package in Visual Studio (Windows only)
- First look at the Visual Studio Debugger
- Navigate through code with the Visual Studio debugger
- Tutorial: Learn to debug C# code using Visual Studio