A blokk · Bevezetés, környezet, Git · 4. tananyag
Egy C#-projekt nem egyetlen fájl, hanem egy kis világ: forráskód, projektfájl, és két mappa, amelyet „valaki” folyton teleír. Ez a fejezet térképet ad: mit írsz te, mit ír a gép, és mi mondja meg a fordítónak, mit csináljon — a végén pedig azt is látod, hogyan lesz mindebből egyetlen futtatható .exe.
.csproj projektfájl kulcsait.bin és az
obj — és miért nem nyúlunk ezen a mappák a tartalmához.Így néz ki egy frissen létrehozott, egyszer már lefordított konzolos projekt:
Mastermind/ ← a projekt mappája ├─ Program.cs ← FORRÁSKÓD — ezt írod te ├─ Mastermind.csproj ← PROJEKTFÁJL — beállítások a fordítónak ├─ bin/ ← KÉSZ PROGRAM — a fordítás végterméke │ └─ Debug/ │ └─ net10.0/ │ ├─ Mastermind.exe ← ezt indítod el │ ├─ Mastermind.dll ← ebben van az IL-kódod (A3!) │ └─ … └─ obj/ ← MŰHELY — a fordító ideiglenes fájljai └─ …
Négyféle szereplő, négyféle szabály:
| Mi | Ki írja? | Szabad szerkeszteni? | Gitre való? |
|---|---|---|---|
*.cs forrásfájlok | te | igen — ez a munkád | igen |
*.csproj projektfájl | a sablon + néha te | óvatosan | igen |
bin/ | a fordító | nem | nem |
obj/ | a fordító | nem | nem |
A bin és az obj tartalmát a
fordító minden fordításkor újraírja. Amit oda mentesz vagy ott
szerkesztesz, az elvész. És mivel újratermelődik, a Gitre sem való — erre (az A7
fejezetben vesszük) a .gitignore fájl lesz a megoldás.
Döntsd el mindegyikről: te írod, beállítás, vagy a fordító terméke?
A .cs kiterjesztésű fájlokban van a C#-kód. Egy projektben
bármennyi forrásfájl lehet — a fordító a projektmappa összes
.cs fájlját lefordítja, külön felsorolás nélkül. Ahogy nő
a program, úgy bontjuk majd több fájlra (a Konzol
segédosztályunk is saját fájlt kap).
Két sor, amivel sok fájl elején találkozol majd:
using System.Text; // névtér „importálása” — kész osztályok elérése namespace Mastermind; // a saját kódod névtere
Console teljes nevén
System.Console. A using
sorral megspórolod, hogy mindig ki kelljen írni a
System. előtagot.System) automatikusan importálódnak —
ezért tudunk Console.WriteLine-t írni
using nélkül is. Ezt a .csproj
egyik kulcsa kapcsolja be (mindjárt látni fogod).A .csproj a projekt személyi igazolványa:
XML-formátumú beállításfájl, amely megmondja a fordítónak, mit és hogyan fordítson.
Egy friss konzolos projekté így néz ki:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net10.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> </Project>
| Kulcs | Lehetséges értékek | Mit csinál? |
|---|---|---|
Sdk (a Project elemen) |
Microsoft.NET.Sdk, …Sdk.Web, … |
megmondja, milyen típusú projektről van szó — a sima Sdk a konzolos/könyvtár projekt |
OutputType |
Exe, Library, WinExe |
Exe = futtatható program készül; Library = csak .dll, más programok használják; WinExe = ablakos program, konzol nélkül (L blokk) |
TargetFramework |
net10.0, net8.0, … |
melyik .NET-verzióra forduljon a kód — nálunk mindig net10.0 |
ImplicitUsings |
enable, disable |
enable: az alap névterek (System, System.IO, …) automatikusan importálódnak — ezért nem kell using System; |
Nullable |
enable, disable |
enable: a fordító figyelmeztet, ha egy érték null lehet, és te nem kezeled — a H blokkban lesz főszereplő |
A .csproj-t ritkán kell kézzel szerkeszteni: a Visual
Studio a legtöbb beállítást felületről intézi, és a NuGet-csomagok is ide jegyződnek
be automatikusan. De amikor egyszer mégis bele kell nézni, jó, ha nem idegen.
obj/ — a műhely. Ide dolgozik a fordító
menet közben: ideiglenes, félkész fájlok, gyorsítótár. Ettől gyorsabb az
újrafordítás: csak az fordul újra, ami változott.bin/ — a végtermék. Ide kerül a kész,
futtatható program és minden, ami a futásához kell. A
bin\Debug\net10.0\ útvonal elárulja: Debug =
fejlesztői változat, net10.0 = a cél-keretrendszer.A Debug mellett létezik Release mód is: optimalizált, gyorsabb, hibakereső-információk nélküli változat — ezt adnád ki a felhasználóknak. A kettő között a Visual Studio eszköztárán egy legördülővel váltasz.
Ha valami nagyon összegabalyodik („márpedig ezt kijavítottam, miért a régit
futtatja?!”), a bin és obj
mappát nyugodtan törölheted: a következő fordítás újraépíti
mindkettőt.
Az A3-ból tudjuk: a C#-program futásához kell a .NET runtime (CLR + BCL). Fejlesztéshez viszont több kell — az SDK (Software Development Kit):
A parancssorból bármikor megnézheted, mi van a gépen:
dotnet --list-sdks ← telepített SDK-k dotnet --list-runtimes ← telepített runtime-ok
A Visual Studio nem projekteket, hanem solutiont (megoldást) nyit meg: ez egy gyűjtő, amelyben egy vagy több projekt él. Nálunk eleinte minden solutionben egyetlen projekt lesz — de a II. félévben jól jön majd: a kalandjáték logikája és a konzolos felülete külön projekt lehet ugyanabban a solutionben, és az L blokkban csak egy harmadik (WPF-es) projektet teszünk melléjük.
Kalandjatek.sln ← a solution (gyűjtő) ├─ Kalandjatek.Logika/ ← Library projekt (a játék szíve) ├─ Kalandjatek.Konzol/ ← Exe projekt (konzolos felület) └─ Kalandjatek.Wpf/ ← WinExe projekt (év végén)
A bin\Debug mappa nem arra való, hogy
továbbadd. A kiadásra a publish (közzététel) szolgál, két üzemmódban:
| Mód | Mit kap a felhasználó? | Előny | Hátrány |
|---|---|---|---|
| Keretfüggő (framework-dependent) | kis méretű program | pár MB | a gépén ott kell lennie a .NET 10 runtime-nak |
| Önálló (self-contained) | program + beépített runtime | bárhol fut, telepítés nélkül | nagyobb méret (70+ MB) |
Önálló, egyetlen fájlba csomagolt program parancssorból:
dotnet publish -c Release -r win-x64 --self-contained -p:PublishSingleFile=true
Ugyanez a Visual Studióban: jobb kattintás a projekten → Publish. A Mastermind projektnél (G blokk) élesben is kipróbáljuk.
Az iskolai gépeken a .NET SDK telepítve van. Ha otthon még nincs, az A5 fejezetben a Visual Studióval együtt felkerül — akkor térj vissza ide.
cmd → Enter.dotnet --list-sdks — látnod kell egy 10.x sort.cd %USERPROFILE%\Desktop dotnet new console -o ElsoProba cd ElsoProba
dir — ott a
Program.cs és az ElsoProba.csproj.
Nyisd meg Jegyzettömbben mindkettőt: notepad Program.cs,
notepad ElsoProba.csproj.dotnet run — a képernyőn megjelenik:
Hello, World!dir — megjelent a
bin és az obj!
Keresd meg a bin\Debug\net10.0\ElsoProba.exe fájlt,
és indítsd el dupla kattintással is.⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
Párosítsd: Program.cs, .csproj,
bin, obj — „ezt írom én”,
„beállítások”, „végtermék”, „műhely”.
Mit jelent a .csproj-ban az
<OutputType>Exe</OutputType> és a
<TargetFramework>net10.0</TargetFramework> sor?
A gyakorlatban létrehozott ElsoProba projekt
Program.cs-ében írd át a kiírt szöveget, futtasd újra
(dotnet run), majd ellenőrizd: változott-e az
ElsoProba.exe módosítási ideje a
bin-ben? Miért?
Egy játékodat el akarod küldeni egy ismerősödnek, akinek a gépén semmilyen .NET nincs. Melyik publish-módot választod és miért? Mi az ára?
Töröld az ElsoProba projekt bin
és obj mappáját, majd futtasd újra a
dotnet run-t. Mi történt? Mérd meg (nagyjából) az első
és a második futtatás idejét — mire következtetsz az obj
mappa szerepéről?
Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.
| Fogalom | Jelentés |
|---|---|
forrásfájl (.cs) | a C#-kódot tartalmazó fájl — ezt írja a programozó |
projektfájl (.csproj) | XML-beállításfájl: megmondja a fordítónak, mit és hogyan fordítson |
bin | a fordítás végterméke: a futtatható program és kísérői |
obj | a fordító ideiglenes munkamappája — gyorsítja az újrafordítást |
| Debug / Release | fejlesztői (hibakereshető) és kiadási (optimalizált) fordítási mód |
| SDK (Software Development Kit) | fejlesztői csomag: fordító, dotnet eszköz, sablonok + runtime |
| runtime | a futtatáshoz szükséges réteg: CLR + BCL (A3) |
solution (.sln) | egy vagy több projektet összefogó gyűjtő — a Visual Studio ezt nyitja meg |
| publish | a program kiadásra kész összecsomagolása (keretfüggő vagy önálló) |
| névtér (namespace) | az osztályok „vezetékneve” (System.Console); a using rövidíti |
.csproj (beállítások),
bin (végtermék),
obj (műhely).bin és obj tartalma
újratermelődik — nem szerkesztjük, nem tesszük Gitre, és baj
esetén nyugodtan törölhető..csproj kulcsai közül a legfontosabbak:
OutputType (mi készül),
TargetFramework (melyik .NET-re),
ImplicitUsings és Nullable..sln) projekteket fog
össze — a Visual Studio mindig ezt nyitja.