Gå til indholdet

Introduktion til .NET

I midten og slutningen af 1990’erne var der flere dominerende programmeringssprog herunder JavaScript, Python, Delphi, C++ og Java. Microsoft gjorde på det tidspunkt mest i C, C++, Visual Basic (VB) og komponenter relateret til Java og JavaScript.

Information til undervisere

Sørg for at kursisten ved

  • hvad .NET er helt overordet
  • er .NET framework er noget andet end .NET
  • de ved hvad NuGet er
  • Brug evt Bogus som er et godt eksempel på en NuGet pakke
  • de kender til kompilering med dotnet og gennem et udviklingsmiljø
  • Brug Hello World

Sproget blev oprindeligt skabt af danske Anders Hejlsberg (født 1960), som i 1996 blev ansat hos Microsoft for i første omgang at hjælpe med udviklingen af Microsofts Java-komponent kaldet J++, men han blev hurtigt den drivende kraft bag et nyt programmeringssprog kaldet C# og en tilhørende runtime, hvor koden kunne afvikles.

Anders Hejlsberg havde erfaringer med programmeringssprog fra sin uddannelse og sin tidligere ansættelse hos Borland, hvor han arbejdede med sprog som Turbo Pascal og Delphi. Han ville udvikle C# som et sprog, der lå mellem det meget produktive og simple Visual Basic, og det komplekse, men hurtige og effektive C++.

Omkring 2002 blev den første version af C# og tilhørende runtime frigivet.

C# er i dag et af verdens mest populære programmeringssprog sammen med sprog som Python, Java, NodeJS, TypeScript og C++.

Info

Microsoft kaldte sproget for C# for at skabe en reference til C/C++ og for at indikere, at C# er skridtet efter C++ (inden for musikken er # symbolet for at hæve en tone med en halvtone).

.NET

C# (og andre sprog som VB.NET og F#) er en integreret del af det såkaldte .NET økosystem. Det er en samling af komponenter, som bruges til både at afvikle og udvikle applikationer. Disse komponenter kaldes tilsammen for en runtime, og de er nødvendige for at kunne afvikle C# applikationer.

Den sidst frigivne version af .NET er 9.0 og sammen med den også C# version 13.0.

Info

Se i øvrigt quozd/awesome-dotnet for links til mange ressourcer.

Forskellige runtimes

Gennem årene har der været flere forskellige runtimes til .NET:

  • .NET Framework: Den oprindelige runtime, der blev udgivet i 2002. Den er primært rettet mod Windows-platformen og har været gennem flere versioner gennem årene.
  • .NET Core: En open-source og platformuafhængig runtime, der blev introduceret i 2016. Den er designet til at være lettere og hurtigere end .NET Framework og kan køre på Windows, macOS og Linux.
  • .NET 5 og fremefter: Den nyeste generation af .NET, som blev lanceret i 2020. Det forener .NET Framework og .NET Core under ét navn og er fortsat open-source og platformuafhængig.

Du behøver som udgangspunkt ikke fokusere på de andre ældre runtimes i standard C# udvikling medmindre du skal vedligeholde ældre applikationer. Hvis du skal lære C# og skabe nye applikationer skal du benytte 9.0. Det vil dels sikre at de applikationer, du skaber, er optimeret mest muligt, samt at du benytter den seneste version af C# (version 13.0).

Info

Bemærk, at .NET frigives med forskellig support! .NET 6.0 er eksempelvis LTS (Long Time Support) medens .NET 7.0 er STS (Standard Time Support). Se mere på her. Som begynder har det ingen betydning men hvis du skal starte udvikling af en stor kodebase kan det have betydning.

.NET release cycle

.NET frigiver nye versioner efter en bestemt cyklus for at sikre, at udviklere har adgang til nye funktioner og forbedringer regelmæssigt. Der er to hovedtyper af .NET-udgivelser: Long-Term Support (LTS) og Short-Term Support (STS). Disse udgivelser adskiller sig med hensyn til deres levetid og supportfrekvens.

  • Long-Term Support (LTS): LTS-versioner er designet til at være mere stabile og modtage længerevarende support, typisk i tre år. Disse versioner er ideelle til virksomheds- og produktionsmiljøer, hvor langsigtede stabilitet og support er afgørende. LTS-udgivelser frigives normalt hvert andet år.

  • Short-Term Support (STS): STS-versioner er designet til at være mere progressive og give udviklere adgang til de nyeste funktioner og forbedringer hurtigere. STS-versioner modtager kun support i en begrænset periode, typisk et år. Disse versioner er ideelle til udviklingsmiljøer og projekter, der kræver adgang til nye funktioner hurtigt. STS-udgivelser frigives normalt årligt mellem LTS-udgivelser.

Når man vælger en .NET-version til et projekt, er det vigtigt at overveje supportcyklussen og de specifikke krav i projektet. For langsigtede og stabile miljøer er det bedst at vælge en LTS-version, mens STS-versioner er mere egnede til udviklingsmiljøer og projekter, der ønsker at drage fordel af nye funktioner hurtigere.

Versioner

Her er en tabel, der viser tidligere versioner og årstal for både .NET og C#:

.NET Version Udgivelsesår C# Version Udgivelsesår Support
.NET Framework 1.0 2002 C# 1.0 2002 -
.NET Framework 1.1 2003 C# 1.2 2003 -
.NET Framework 2.0 2005 C# 2.0 2005 -
.NET Framework 3.0 2006 C# 3.0 2007 -
.NET Framework 3.5 2007 C# 3.0 2007 -
.NET Framework 4.0 2010 C# 4.0 2010 -
.NET Framework 4.5 2012 C# 5.0 2012 -
.NET Framework 4.6.2 2015 C# 6.0 2015 Win support
.NET Framework 4.7.2 2018 C# 6.0 2015 Win support
.NET Framework 4.8.1 2022 C# 6.0 2015 Win support
.NET Core 1.0 2016 C# 6.0 2015 -
.NET Core 2.0 2017 C# 7.0 2017 -
.NET Core 2.1 2018 C# 7.1 2017 -
.NET Core 2.2 2018 C# 7.2 2017 -
.NET Core 3.0 2019 C# 7.3 2018 -
.NET Core 3.1 2019 C# 8.0 2019 -
.NET 5 (STS) 2020 C# 9.0 2020 -
.NET 6 (LTS) 2021 C# 10.0 2021 11/2024
.NET 7 (STS) 2022 C# 11.0 2022 05/2024
.NET 8 (LTS) 2023 C# 12.0 2023 11/2026
.NET 9 (STS) 2024 C# 13.0 2024 11/2026

Microsoft har en politik for support af .NET og C# versioner. Det betyder at de ældre versioner ikke længere modtager opdateringer og sikkerhedsrettelser. Det er derfor vigtigt at holde sig opdateret med den seneste version af .NET og C#. Læs mere her:

Win Support

.NET Framework 4.6.2 og fremefter er kun understøttet på Windows-platformen. Se yderligere på denne side men i skrivende stund står der: “Beginning with version 4.5.2 and later, .NET Framework is defined as a component of the Windows operating system (OS). Components receive the same support as their parent products, therefore, .NET Framework 4.5.2 and later follows the lifecycle policy of the underlying Windows OS on which it is installed.”

Andre ressourcer

For mere information om .NET og C#, besøg følgende ressourcer:

Installering af .NET

Du kan finde .NET som en decideret runtime til at afvikle .NET applikationer, samt en .NET SDK (Software Development Kit) som du kan bruge til udvikling. Denne indeholder ligeledes den nødvendige runtime. Ved installation af Visual Studio bliver .NET automatisk installeret - udvikling gennem Visual Studio Code kræver installation af SDK.

Generelt typebibliotek

I .NET vil du kunne finde en masse forskellige komponenter, herunder komponenter til oversættelse, afvikling, fejlfinding og oprydning, men den mest synlige komponent er en meget stor samling af typer med tilhørende generel funktionalitet som du kan benytte som udvikler.

Således vil det eksempelvis være nemt at skrive kode til at arbejde med simple og komplekse variabler, filer, brugerflader, databaser, internettet, xml- eller JSON-filer, tilfældige tal, kryptering og meget andet. Den kode har Microsoft allerede skrevet og stiller til rådighed enten som en del af runtime eller som en pakke (i .NET hedder sådan en pakke en NuGet-pakke), du frit kan hente og benytte. De fleste typer er organiseret i en logisk struktur, og det er relativt simpelt at finde den funktionalitet, man ønsker.

Faktisk er viden om disse medfølgende typer en stor del af at blive en dygtig C#-udvikler. Dels skal du lære, hvilke typer der er tilgængelige, dels hvordan du benytter dem bedst. Der er ingen grund til, at du opfinder den dybe tallerken igen, når nu Microsoft har skrevet og testet en masse kode for dig.

NuGet

Selv om det generelle typebibliotek i .NET er kæmpestort og består af tusinder af forskellige typer, som kan hjælpe dig med at udvikle applikationer, findes der yderligere tusinder af generiske komponenter som du (typisk gratis) kan benytte dig af. De kan findes i en service kaldet NuGet drevet af Microsoft, og i skrivende stund er der over 280.000 forskellige pakker med kode relateret til næsten alle former for problemstillinger.

Hvis du udvikler en applikation, og lige står og mangler en metode der kan hjælpe dig med et eller andet konkret, bør du lige kigge i NuGet og se, om du ikke kan finde det, du mangler.

Brug af pakker hentet fra NuGet er en integreret del af alle store C# applikationer, og de fleste pakker er i øvrigt typisk et open source-projekt fra GitHub.

Info

Se iøvrigt Awesome Nuget Packages på GitHub for en liste over gode NuGet pakker.

Kompilering af kode .NET

Som du sikkert ved forstår en CPU udelukkende komplicerede binære instruktioner (maskinkode), og det ville tage alt for lang tid at skrive programmer og fejlfinde i et sprog som er så tæt på processoren. Lidt bedre bliver det i sprog som maskinsprog, som benytter en oversætter (kaldet en Assembler) til at konvertere en mere menneskelig forståelig syntaks til maskinkode. Men maskinsprog kræver stadig en stor viden om hvordan en CPU fungerer og kommer til at tage alt for lang tid at skrive selv små applikationer.

Heldigvis er der siden 1950’erne opfundet højniveau sprog som er langt nemmere at arbejde med, og som ved hjælp af en kompiler oversætter til maskinsprog eller direkte til maskinkode. Det er blandt andet sprog som COBOL, PL/1, Python, Basic, C, C++, Java og C#.

Traditionelle sprog som eksempelvis C++ oversætter typisk kildekode (source code) til assembler eller direkte til bi­nære instruktioner:

Fra C++ til binær eksekverbar kode

Det kræver typisk en kompiler til hver platform/CPU, applikationen skal afvikles på, men til gengæld kan applikationen afvikles uden yderligere installation fra brugerens side.

I C# oversættes kildekode derimod til en såkaldt mellemkode kaldet IL kode (Intermediate Language), som så ved afvikling oversættes til binær eksekverbar kode af den på brugerens maskine installerede runtime.

Denne oversættelse kaldes blandt andet for JIT (Just-In-Time) transpilering:

Fra C# til mellemkode til binær eksekverbar kode

Således er en runtime nødvendig for at afvikle en .NET applikation, og den skal enten installeres eller være en del af den eksekverbare fil, inden applikationer kan afvikles. Fordelen ved det er, at C# transpileren oversætter til en fælles sprogstandard, og at den efterfølgende oversættelse fra selve runtime kan optimere oversættelsen til at tage hensyn til forskellige platforme og ressourcer.

Eksempel på IL kode som er langt mere kompleks end C#

Tip

Læs eventuelt om dekompilering og obfuskering på et senere tidspunkt.

Når du læser om .NET vil du måske falde over begrebet ”virtuel maskine”. Det skal du forstå således, at Microsoft har skabt en specifikation til, hvordan en generel computer og tilhørende operativsystem fungerer, og IL-koden er skrevet til denne virtuelle enhed. Opgaven for runtime er så at oversætte IL-koden til kode, der kan afvikles på den pågældende platform.

Info

Som begynder i C# programmering er det ikke så vigtigt at du kender så meget til oversættelse af kode eller den underliggende platform og runtime. Men du bør kende begreberne .NET, runtime og mellemkode (IL-kode). Når du er blevet mere erfaren, eller skal distribuere applikationer professionelt, bør du læse mere om dette.

Afvikling af .NET applikationer

For at kunne afvikle .NET applikationer skal der altså enten installeres en runtime, eller også skal den kompilerede eksekverbare fil indeholde en runtime. Fordelen ved en at skabe en fil som indeholder alt det som skal bruges til afvikling (kaldes på engelsk en “self contained application”) er, at brugerne ikke behøver have noget installeret. Ulempen er at den eksekverbare fil hurtigt kan fylde over 10-20 Mb.

Den sidste nye version af .NET runtime kan altid hentes fra Microsoft og kan findes til Windows, Linux og Mac. På siden skal du tage stilling til, om du ønsker at hente en ren runtime (til afvikling) eller et SDK (Software Development Kit) til afvikling og udvikling.

Type af applikationer

Hvis først du kender til et .NET sprog (C#, F#, VB.NET), har du mulighed for at skabe mange forskellige typer af applikationer.

Console

Dette materiale tager udgangspunkt i en konsolapplikation for at kunne holde fokus på teorien og syntaksen. Det er den mest simple type af applikation, men bliver faktisk benyttet en del til værktøjer og administrative applikationer. Og som en af de få applikationstyper (bortset fra webapplikationer) kan den afvikles på alle supporterede platforme.

Konsol applikation

Windows Form

Hvis du ønsker at skabe en desktop applikation har du forskellige muligheder. Du kan vælge at udvikle en traditionel Windows Forms-applikation, som er bundet til interne komponenter i Windows. Denne typer applikation har levet i mange år, og er opgraderet til forskellige runtimes.

Windows Forms applikation

Med Windows Forms kan du meget hurtigt skabe en brugerflade med alle mulige former for kontroller, og så binde det hele sammen med C# kode.

WPF

Du kan også vælge en WPF (Windows Presentation Foundation) applikation som er noget nyere end Windows Forms, og ikke helt så bundet til interne komponenter i Windows. Der er nogen flere muligheder i en WPF applikationWPF-applikation, men den er fortsat bundet til Windows-platformen.

WPF applikation

MAUI

Hvis du ønsker at udvikle applikationer der kan afvikles på både Windows, Android og iOS kan du benytte .NET MAUI (.NET Multi-platform App UI). Det er en ny mulighed for at dele kodebasen mellem forskellige typer af platforme. MAUI applikationer kan udvikles på flere måde, og især kombinationen med Microsoft Blazor (se senere) giver en masse muligheder for at genbruge kode og brugerflade.

MAUI applikation

WEB

Hvis du ønsker at skabe web-applikationer har Microsoft tre forskellige projekttyper, du kan vælge imellem.

Det mest solide og komplette framework hedder ASP.NET MVC (står for Model View Controller), og det benyttes til de traditionelle serverbaserede web-applikationer. Alternativet er det mindre, men også meget nemmere, framework kaldet ASP.NET Web Pages. Hvis du blot skal skabe et par websider, er det uden tvivl nemmere at komme i gang med.

Som noget nyt kan du også vælge at skabe SPA-applikationer (Single Page Applications) med et framework kaldet Blazor. Det benytter blandt andet helt nye standardiserede måder at afvikle IL kode (og dermed C#) direkte i browseren, og giver muligheden for at benytte de samme komponenter på serveren.

Service

Hvis du ønsker at skabe en servicebaseret applikation, som kan være kernen i samling af forskellige applikationer, bør du se nærmere på gRPC. Det er oprindeligt Google’s framework til RPC (Remote Procedure Call), og er nu tæt på industristandard for den type af applikationer på mange platforme og i mange programmeringssprog.

EF

Sluttelig kan du næsten ikke skabe en applikation uden at involvere en database. Der findes masser af muligheder for at tale med alle mulige former for databaser i .NET, men de fleste vælger at benytte et ORM- produkt (Object-Relational Mapping). Det giver mulighed for at abstrahere meget at databasekoden væk, og i stedet fokusere på forretningslogik.

Microsofts eget ORM-produkt hedder Entity Framework (EF), og kan spare en frygtelig masse tid ved udvikling af en applikation. EF er en integreret del .NET og udviklingsmiljøerne.