.NET

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken
Zie het artikel Het .NET Framework moet niet verward worden met de domeinnaam .net.

.NET (uitspraak: dotNET) is een applicatieframework ten behoeve van de naadloze samenwerking van applicaties en bibliotheken geschreven in verschillende programmeertalen. Het is ontwikkeld door Microsoft. .NET is volledig beschreven in publieke ECMA-standaarden, en is daarmee niet uitsluitend voor Microsoft-toepassingen. De Common Language Infrastructure, de officiële naam voor .NET is beschreven in ECMA-standaard 335, de nieuw ontwikkelde taal C# in ECMA-standaard 334.

Kenmerken[bewerken]

.NET bestaat uit een groot aantal klassen die de ontwikkelaar kan gebruiken bij het maken van programma's, alsmede een virtueel executiesysteem (VES) en enkele compilers die broncode omzetten naar een tussenlaag, de Microsoft Intermediate Language (MSIL). De MSIL-code wordt door de Common Language Runtime (CLR) door middel van just-in-timecompilatie omgezet naar machine-code en uitgevoerd.

De .NET-technologie is duidelijk geïnspireerd door Java. Nadat Microsoft de Java Virtual Machine uitbreidde voor een betere uitwisselbaarheid met het Windows-platform hetgeen in strijd was met de licentievoorwaarden van Sun Microsystems, de eigenaar van Java, die deze uitbreidingen uiteindelijk middels de rechter moest sanctioneren, besloot Microsoft Corporation samen met Hewlett-Packard en Intel Corporation een gezamenlijke standaard te ontwikkelen, wat resulteerde als basis voor .NET-framework. Dit verenigt de voordelen van de Java-principes met een grote uitwisselbaarheid met de al bestaande Windows-programmeeromgevingen, wat het tot een zeer interessant ontwikkelplatform maakt voor veel van de software die, voor .NET bestond, in Visual Basic of C++ werd ontwikkeld.

Net als bij Java worden programma's bij .NET niet gecompileerd tot machinecode maar tot een tussentaal (common intermediate language of CIL). Deze wordt dan vervolgens uitgevoerd door een runtime engine (VES). Vergelijk dit met de Java Virtual Machine. Deze opzet levert een abstractie op van de onderliggende machine (inclusief besturingssysteem en diensten, alsmede datatypes) en maakt dat veel verschillende programmeertalen ontworpen kunnen worden voor eenzelfde, gegarandeerde basis aan faciliteiten.

De Microsoft-implementaties worden alleen ontwikkeld voor Windows, maar er zijn ook opensourceimplementaties van .NET beschikbaar. De belangrijkste daarvan is Mono, dat is opgezet met als specifiek doel om het programmeren in .NET voor Linux te ondersteunen, en daar ook aardig in slaagt. De ontwikkeling loopt echter hier en daar achter op de voortdurende uitbreidingen in Microsoft-implementaties.

Eind 2014 maakte Microsoft bekend de broncode van het .NET Framework gedeeltelijk beschikbaar te stellen als opensourcesoftware.[1] Het gaat hierbij voornamelijk om de runtime en de verwante kerntechnologieën, zoals ASP.NET, de "Roslyn" .NET-compiler, het .NET Micro Framework, .NET Rx en de programmeertalen Visual Basic en C#.[1] Windows Forms blijft bijvoorbeeld closed source.[1]

Microsoft zal zich ook meer richten op platformonafhankelijkheid door de ondersteuning voor het .NET Framework uit te breiden naar Linux en Mac OS X.[2]

Het .NET-framework wordt meegeleverd vanaf Windows XP en Windows 2003 Server, maar is ook beschikbaar voor oudere versies van Windows. Ook zijn er diverse implementaties van de ECMA-standaarden te downloaden, sommige inclusief broncode.

Geschiedenis[bewerken]

Architectuur[bewerken]

Common Language Infrastructure (CLI)[bewerken]

1rightarrow blue.svg Zie Common Language Infrastructure voor het hoofdartikel over dit onderwerp.

Het doel van de Common Language Infrastructure, of CLI, is het verstrekken van een taal-neutraal platform voor applicatie - ontwikkeling en de uitvoering, inclusief functies voor exception handling, garbage collection, veiligheid en interoperabiliteit. Door de implementatie van de belangrijkste aspecten van het .NET Framework binnen de werkingssfeer van de CLR, zal deze functionaliteit niet worden gebonden aan een enkele taal, maar zal beschikbaar zijn over de vele talen ondersteund door het kader. Microsofts implementatie van de CLI is de Common Language Runtime, ook wel CLR genoemd.

Assembly's[bewerken]

De CIL-code zit in de .NET-assembly's. Zoals beschreven in de specificatie, zijn assembly's opgeslagen in het Portable Executable (PE) formaat, gemeenschappelijk op het Windows-platform voor alle DLL- en EXE-bestanden. De assembly bestaat uit een of meer bestanden, waarvan er een het manifest moet bevatten, dat de metadata voor de assembly heeft. De volledige naam van een assembly (niet te verwarren met de bestandsnaam op de harde schijf) bevat de eenvoudige naam, versie, cultuur en publiekesleuteltoken. De publiekesleuteltoken is een unieke hash, gegenereerd wanneer de assembly is samengesteld, dus twee assembly's met dezelfde publieke sleutel zijn gegarandeerd identiek in het oogpunt van het framework. Een privésleutel kan ook worden gespecificeerd alleen bekend bij de maker van de assembly en kan worden gebruikt voor een sterke naamgeving en om te garanderen dat de assembly is van dezelfde auteur als er een nieuwe versie van de assembly is samengesteld (verplicht om een assembly te kunnen toevoegen aan de Global Assembly Cache).

Security[bewerken]

.NET heeft zijn eigen veiligheidsmechanisme met twee algemene kenmerken: Code Access Security (CAS), en validatie/verificatie. Code Access Security is gebaseerd op bewijsmateriaal dat is geassocieerd met een specifieke assembly. De bron van de assembly is een typisch punt van bewijs (of het is geïnstalleerd op de lokale computer of is gedownload van het intranet of internet). Code Access Security gebruikt het bewijs om bepaalde machtigingen te verlenen aan de code. Andere code kan eisen dat aanroepende code een specifieke toestemming krijgt. De vraag zorgt ervoor dat de CLR een call stack walk uit zal voeren: elke assembly van elke methode in de call stack is gecontroleerd op de vereiste toestemming, als de assembly geen toestemming heeft dan wordt er een beveiliginguitzondering uitgevoerd.

Wanneer een assembly wordt geladen voert de CLR diverse tests uit. Twee van die tests zijn validatie en verificatie. Tijdens de validatie controleert de CLR dat de assembly geldige metadata en CIL-code bevat, en of de interne tabellen correct zijn. Verificatie is niet zo nauwkeurig. Het verificatiemechanisme controleert of de code iets doet dat 'onveilig' is. Het gebruikte algoritme is vrij conservatief, vandaar dat soms code die "veilig" is niet erdoor komt. Onveilige code wordt alleen uitgevoerd als de assembly het 'verificatie overslaan'-privilege heeft, dat in het algemeen betrekking heeft op code die is geïnstalleerd op de lokale machine.

.NET Framework maakt gebruik van AppDomains als een mechanisme voor het isoleren van code die wordt gedraaid in een proces. AppDomains kunnen geïnitialiseerd worden en vervolgens kan er programmeercode in en uit gestuurd worden. Deze AppDomains kunnen onafhankelijk van elkaar werken. Dit draagt bij aan het verhogen van de fouttolerantie van de applicatie, zodat fouten of crashes in een AppDomain geen invloed hebben op de rest van de applicatie.

AppDomains kunnen ook afzonderlijk geconfigureerd worden met verschillende beveiligingsniveaus. Dit kan de veiligheid van de applicatie verhogen door potentiële onveilige code te isoleren. Het kleine nadeel is dat de ontwikkelaar de applicatie zelf in subdomeinen moet splitsen, aangezien dit niet door de CLR wordt gedaan.

Klassebibliotheken[bewerken]

Het .NET Framework bevat een set van standaard klassebibliotheken. Een klassebibliotheek is georganiseerd in een hiërarchie van de namespace. De meeste ingebouwde API's maken deel uit van de Microsoft-namespace of de System-namespace. Deze klassebibliotheken implementeren een groot aantal gemeenschappelijke functies, zoals een bestand lezen en schrijven, grafische rendering, interactie met de database en manipulatie van XML-documenten. De .NET-klassebibliotheken zijn beschikbaar voor alle door de CLI gebruikte talen. De .NET Framework-klassebibliotheek is in tweeën opgedeeld: de Base Class Library en de Framework Class Library.

De Base Class Library (BCL) bevat een kleine deelverzameling van de hele klassebibliotheek en is de kern van de klassen die dienen als de basis-API van de Common Language Runtime. De klassen in mscorlib.dll en enkele van de klassen in System.dll en System.Core.dll worden beschouwd als een deel van de BCL. De BCL-klassen zijn beschikbaar in zowel het .NET Framework als zijn alternatieve implementaties inclusief .NET Compact Framework, Microsoft Silverlight en Mono.

Het Framework Class Library (FCL) is een superset van de BCL-klassen en verwijst naar de hele klassebibliotheek die bij het .NET Framework zit. Het bevat een uitgebreide set van library's, met daarbij inbegrepen de Windows Forms, ADO.NET, ASP.NET, Language Integrated Query, Windows Presentation Foundation en Windows Communication Foundation. De FCL is veel groter in omvang dan de standaard library's voor talen als C++, en vergelijkbaar in omvang met de standaard library's van Java.

Geheugenbeheer[bewerken]

De .NET Framework Common Language Runtime bevrijdt de ontwikkelaar van het geheugenbeheer (toewijzen en vrijmaken als je klaar bent); in plaats daarvan doet de CLR het geheugenbeheer zelf. Het geheugen dat toegewezen wordt aan instanties van .NET-objecten komt aaneengesloten uit de managed heap, een pool van geheugen die wordt beheerd door de CLR. Zolang er een verwijzing naar een object bestaat, die ofwel een directe verwijzing naar een object is of via een graaf van objecten, wordt het object gezien als in gebruik door de CLR. Als er geen verwijzing naar een object is, en het kan niet worden bereikt of gebruikt, wordt het vuilnis. Maar het is nog steeds aan het geheugen toegewezen. .NET Framework bevat een garbage collector die periodiek wordt uitgevoerd, op een aparte thread van de draad van de applicatie. Deze geeft een opsomming van alle onbruikbare objecten en hergebruikt het geheugen dat aan hen toegewezen was.

De .NET Garbage Collector (GC) is een non-deterministische, compacte, markeer-en-veeg-garbage collector. De GC draait alleen wanneer een bepaalde hoeveelheid geheugen gebruikt is of er is genoeg vraag naar geheugen is op het systeem. Aangezien er geen garantie is wanneer de voorwaarden voor het hergebruiken van geheugen bereikt wordt, loopt de GC niet-deterministisch. Elke .NET-applicatie heeft een set van wortels, welke verwijzingen zijn naar voorwerpen op de managed heap (beheerde objecten). Deze bevatten verwijzingen naar statische objecten en objecten gedefinieerd als lokale variabelen of methodeparameters in de huidige scope, evenals objecten gerefereerd door CPU-registers. Als de GC wordt uitgevoerd, pauzeert deze de applicatie, en voor elk object in de root waarnaar wordt verwezen, somt het recursief alle objecten te bereiken vanuit de root en markeert deze objecten als bereikbaar. Het gebruikt .NET-metadata en reflection om de objecten binnen een object te ontdekken en er dan recursief erdoorheen te lopen.

Vervolgens somt het alle objecten op de heap (die aanvankelijk aangesloten werd toegewezen) met behulp van reflection. Alle objecten gemarkeerd als niet bereikbaar zijn garbage. Dit is de markeerfase. Sinds het geheugen gebruikt door vuilnis van geen enkel belang is, wordt het gezien als vrije ruimte. Echter laat dit stukken vrije ruimte tussen objecten staan die aanvankelijk aaneengesloten waren. De objecten worden vervolgens compacter gemaakt door het gebruik van memcpy, om de objecten zo over te kopiëren naar de vrije ruimte en de objecten weer aaneengesloten te maken. Elke verwijzing naar een object dat verplaatst is wordt geüpdatet om de nieuwe locatie te reflecteren bij de Garbage Collector. De applicatie wordt hervat als de garbage collection afgelopen is.

De Garbage Collector die door het .NET Framework gebruikt wordt is eigenlijk te zien als een of meerdere generaties. Objecten worden aan generaties toegevoegd: nieuwe objecten worden aan Generatie 0 toegekend, de objecten die een garbage collection overleven zijn Generatie 1 en de Generatie 1-objecten die nog een Garbage Collection overleven zijn de Generatie 2-objecten. Het .NET Framework gebruikt objecten tot generatie 2. Hogere generatie-objecten worden minder vaak als vuilnis gezien dan lagere generatie-objecten. Dit draagt bij aan de efficiëntie van de garbage collection, omdat oudere objecten de mogelijkheid hebben een hogere leeftijd te bereiken dan nieuwe objecten. Dus bij het verwijderen van oudere (en dus meer kans creëren op het overleven van een collective) objecten uit de scope van een collection, is het aantal objecten dat gecontroleerd en compacter gemaakt moet worden een stuk kleiner.

Programmeertalen voor het .NET-platform[bewerken]


Alternatieven[bewerken]

Er wordt gewerkt aan twee alternatieve open source-implementaties van .NET, die kunnen geïnstalleerd worden op andere platformen, zoals Linux- en FreeBSD:

Zie ook[bewerken]

Externe links[bewerken]

Bronnen
  1. a b c (en) Microsoft to open source more of .NET, and bring it to Linux, Mac OS X | ZDNet
  2. (en) Microsoft To Open-Source .NET, Bring It Officially To Linux