Posts

Posts uit 2011 tonen

TDS Tubular Data Stream

Bij het zoeken naar antwoorden van de vorige post , kwam ik de afkorting TDS tegen. Ik was benieuwd wat dit nou was en ben even gaan googlen. Zo kwam ik er achter dat dit een protocol is en staat voor Tabular Data Stream. Dit protocol wordt gebruikt om SQL statements te versturen naar de SQL Server en om de resultaten van de queries terug te sturen. TDS pakketjes worden gebouwd door de Microsoft OLE DB Provider voor SQL Server, de SQL Server ODBC driver of the DB-Library dll. De pakketjes worden dan verstuurd naar de SQL Server client Net-Library, welke de TDS pakketjen verpakt in netwerk protocol pakketten. Op de server worden de netwerkprotocol pakketten ontvangen door de Server Net-Library die de pakketten vervolgens uitpakt naar TDS pakketten en stuurt deze vervolgens naar de relationele database. Als er resultaten zijn voor de client, wordt dit proces herhaald, maar dan voor de client. RPC & Batch Een TDS kent twee om SQL statements uit te voeren: batch en RPC. Een batc

Entity Framework en database calls

Ik wilde wel eens weten wanneer het Entity Framework de database ingaat voor het voeren van requests. Deze vraag had ik al snel beantwoord toen ik op een site van Microsoft terechtkwam. Hier wordt namelijk het volgende gesteld: Het aanroepen van de volgende methodes zorgt ervoor dat er een database verbinding wordt geopend als SaveChanges of Refresh wordt aangeroepen op de ObjectContext als FirstOrDefault of First wordt aangeroepen op de ObjectContext als Load wordt aangeroepen op de EntityCollection als Load wordt aangeroepen op de EntityReference als een LINQ of ObjectQuery method wordt aangeroepen zoals bijv. Where, OrderBy of Select. Dit is terug te lezen op: http://msdn.microsoft.com/en-us/library/bb738582.aspx . Bij het uitvoeren van requests maakt het EF gebruik van 'normale' SQL statements en van de systeem SP ep_executesql. Van de laatstgenoemde maakt EF gebruik indien parameters gemoeid zijn met de query. Als er geen parameters van toepassing zijn wordt een &

C# delegates Action en MethodInvoker

Beide delegates, Action en MethodInvoker, hebben dezelfde signature: public delegate void MethodInvoker(); public delegate void Action(); Syntactisch zijn ze dus hetzelfde, maar wanneer gebruik je dan welke? Dit antwoord wordt gegeven door de documentatie van Control.Invoke(); De delegate kan een instantie zijn van EventHandler. In dit geval bevat de sender parameter het control en de event parameter bevat EventArgs.Empty. De delegate kan ook instantie zijn van de MethodInvoker, of elke andere delegate die een lege parameter lijst heeft. Een aanroep naar EventHandler of MethodOnvoker delegate is sneller dan een aanroep naar een anderer type delegate Van de dikgedrukte tekst kan geconcludeerd worden dat er binnen de Invoke methode een is/as check plaatsvind en gebruik gemaakt wordt van Invoke, welke aanzienlijk sneller is dan DynamicInvoke.

C# Expression trees

Expression trees worden gebruikt in combinatie met LINQ. Een expression tree is een abstracte representatie van een lambda expressie. Een expression tree kan niet direct worden uitgevoerd. Met de compile() methode wordt in het geheugen de representatie gemaakt in de vorm van een object. Vervolgens kan via code de expressie worden benaderd. Zo gebuikt LINQ2SQL expression trees om de lambda code om te zetten naar een SQL querie. Dit is mogelijk omdat alle onderdelen (de nodes van de tree) van de lambda uitgelezen kunnen worden. Stel je deze lambda voor: x => x.Name == "Martijn" Deze expressie bevat een Body en de body bestaat uit de volgende onderdelen: Left property: Deze bevat de linkerkant van de expressie (x.Name) Right property: Deze bevat de rechterkant van de expressie ("Martijn") NodeType property: bevat de operatie die toegepast is op de twee expressies (==) Normaal gesproken (zeker bij uitgebreide lambda's) worden deze properties achterhaald d

[Design patterns] Factory vs Builder pattern

Het verschil tussen de factory design pattern en de builder design pattern aan de hand van een voorbeeld. Denk even aan een restaurant. Het maken van de maaltijd van de dag is een factory pattern. Je zegt namelijk tegen de keuken 'geef mij de maaltijd van vandaag' en de keuken/factory bepaalt welk object er gegenereerd moet worden, gebaseerd op de verborgen criteria. De builder pattern komt naar voren bij bijvoorbeeld het bestellen van een pizza. In dit geval verteld de ober de kok 'Ik heb een pizza nodig met kaas, uien en ham'. Dus, de builder stelt de attributen beschikbaar die het gegenereerde object kan hebben maar verbergt hoe ze gezet moeten worden.

Managed vs Unmanaged code

"Unmanaged code" is een nieuwe naam voor een oud concept. Unmanaged code staat voor native machine code. Software kan geschreven zijn in hogere programmeertalen zoals Pascal, C of C++. Deze talen worden vertaald naar machine code (=unmanaged code) door de compiler. De gegenereerde code wordt direct op de host van de processor uitgevoerd. Dit houdt in dat de processor direct de code uitvoert die is gegenereerd door de compiler. Deze aanpak resulteert in een snelle uitvoer van de code, maar het analyseren en opvangen van fouten gaat makkelijker in managed code. Managed code is een nieuwe naam, maar het concept is al oud. "Managed code" staat tegenwoordig voor het systeem dat gebruik maakt van het Microsoft .NET Framework, maar .NET is gewoon een voorbeeld van een managed code systeem. Het .NET systeem accepteert broncode van ondersteunende talen zoals C, C++, C#, Pascal en nog meer. Deze code wordt vertaald in code die ontworpen is voor een virtuele machine. De echte

[C#] Application.Run()

Application.Run(new Form1()) doet drie dingen Maak form1 zichtbaar Voorzie form1 met een close event handler, zodat wanneer form1 sluit, Application.Exit() wordt aangeroepen. Start een message loop De belangrijkste reden om Application.Run() te gebruiken is zodat er dan een message loop wordt gestart ( Message loop ).

Message loop of message pump

De message loop of message pump is een klein stukje code dat in elk Windows programma bestaat dat een GUI heeft. De console applicatie heeft dus geen message pool.Een GUI applicatie werkt met berichten (messages). Wanneer bijvoorbeeld de muis wordt bewogen, verstuurd Windows een WM_MOUSEMOVE bericht naar het onderliggen window. De Win32Message API ontvangt berichten van Windows. Elk programma spendeert 99,99% van zijn tijd daar, te wachten totdat Windows zegt dat er iets interessants is gebeurd. Windows verstuurt de berichten naar de 'message queue' (berichten wachtrij) van de thread waar de window toe behoort. Er moet dus iets zijn dat deze berichten doorstuurt naar de juist window. Dit werk wordt gedaan door de message loop of message pump. Elke Windows GUI framework heeft een message loop. De eenvoudigste message loop ziet er als volgt uit (in C++, gebruik interop om te schrijven in .NET) MSG msg; while(GetMessage(&msg, hwnd, 0, 0)) { TranslateMessage(&msg);

Hoofdstuk 16 - Les 1

Met 2 properties kan de culture gezet worden: Thread.CurrentThread.CurrentCulture - Bepaalt de resultaten van cultuur afhankelijke functies zoals tijd/datum notatie, getallen en valuta opmaak. CurrentCulture moet gezet worden in taal-regionale: ex-MX, fr-FR. Enkel een neutrale taal opgeven kan niet. Thread.CurrentThread.CurrentUICulture - Bepaalt welke resources er geladen moeten worden door de resource manager. Hier kan zowel een neutrale taal worden opgegeven als specifieke culturen. Deze properties dienen te worden gezet door een instantie van CultureInfo: Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES"); Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-ES"); MessageBox.Show(Thread.CurrentThread.CurrentCulture>ToString()); double d = 1234567.89; MessageBox.Show(d.ToString("C")); MessageBox.Show(DateTime.Now.ToString()); // Output: es-ES 1.234.567, 89 € 17/08/2010 11:07:46 Met de System.Globalization.CultureInfo.GetCultures m

Hoofdstuk 15 - Les 2

Met de SmtpClient class kan mail worden verstuurd d.m.v. de Send methode. Als de methode SmtpClient.SendASync wordt gebruikt, worden er geen exceptions gegooid. In plaats daarvan wordt de het SendCompleted event aangeroepen en als dan de ASyncCompletedEventArgs niet null is, is er een fout opgetreden. Met de Credentials property kan bij de ISP bekend gemaakt worden wie de afzender is. SmtpClient client = new SmtpClient("smtp.domain.com"); client.Credentials = new NetworkCredential("user", "password"); Met de EnableSsl property kan aangegeven worden of er een SSL verbinding moet worden gebruikt. Mails kunnen asynchroon verstuurd worden: SmtpClient client = new SmtpClient("smtp.domain.com"); client.SendCompleted += new SendCompletedEventHandler(client_SendCompleted); MailMessage mm = new MailMessage("foo@bar.com", "bar@foo.com", "Hello", "World"); client.SendAsync(mm, null); client.SendAsyncCancel(); private

Hoofdstuk 15 - Les 1

Met de MailMessage class kan een e-mail bericht worden opgesteld: MailMessage m = new MailMessage("me@foo.com", "to@bar.com", "Subject", "Content"); Zowel de ontvanger als verzender kan opgegeven worden door een string of een MailAddress object. Met MailMessage.Attachments.Add kan er een bijlage worden meegestuurd met de e-mail. MailMessage m = new MailMessage(); m.Attachments.Add(new Attachment(@"C:\windows\win.ini")); Met de MediaTypeNames enumeratie kan het MIME type bepaald worden. In de meeste gevallen zal dit MediaTypeNames.Application.Octet zijn. Als een bijlage wordt toegevoegd d.m.v. een stream, dan moet er een bestandsnaam worden opgegeven. Om een mail te versturen met HTML content moet de body HTML tags bevatten en moet de IsBodyHtml property op true worden gezet. Om gebruik te maken van afbeeldingen dient gebruik gemaakt te worden van de AlternateView en de LinkedResource class. // Maak html content string htmlBody = "&

Hoofdstuk 14 - Les 1

Met de Assembly.ReflectionOnlyLoad en Assembly.ReflectionOnlyLoadFrom methodes kunnen enkel assemblies gelezen worden, maar niet worden uitgevoerd. Nadat het Type is achterhaald van een object, kunnen de properties en methoden worden uitgelezen. Roep GetMethod() aan om een MethodInfo object te maken. Met de Invoke methode van MethodInfo kan de method worden uitgevoerd. // Haal het type op van de StringBuilder class Type t = typeof(StrinBuilder); // Maak een instructor object ConstructorInfo ci = t.GetConstructor(new Type[] {typeof(string)}); // Maak een instantie van het type object obj = ci.Invoke(new object[] {"Hallo, "}); // Maak een methodinfo object en geef op dat we de Append methode willen MethodInfo mi = t.GetMethod("Append", new type[] {typeof(string)}); // Roep methode Append aan object result = mi.Invoke(obj, new object[]{"world!"}); // Schrijf de instantie naar het scherm Console.WriteLine(result); Door MethodInfo.GetMethodBase aan te roepen kr

Hoofdstuk 13 - Les 2

De System.Runtime.InteropServices namespace biedt verschillende attributen aan die gebruikt kunnen worden om het standaard gedrag aan te passen als een .NET type wordt geëxporteerd voor COM applicaties. class SecretClass { public SecretClass() {} [ComVisible(false)] public int Method1(string param) { return 0; } public bool Method2() { return true; } [ComVisible(false)] public int Property1 { get {return _myProperty; } } } Method1 en Property1 zijn nu niet zichtbaar voor COM. De Type Library Exporter (tlexp.exe) maakt een COM type library voor een assembly: tlbexp MyAssembly.dll. Dit commando genereert een nieuw type library met de tlb extensie. gebruik de /out parameter om een andere bestandsnaam op te geven. Om COM clients .NET classes te laten maken zonder expliciet in te laden, moet de assembly of type geregistreerd worden. Dat kan in Visual Studio of door de Assembly Registration Tool (Regasm.exe). Op de manier dat .NET exceptions gooit als er

Hoofdstuk 13 - Les 1

Component Object Model (COM) is een unmanaged object georiënteerd model en bevatten classes, methods en types. Type libraries kunnen een standalone .tlb bestand zijn die een type definiëren of ze kunnen in een dll, exe, ocx of olb bestand zitten. De Type Library Importer (tlbimp.exe) maakt een interop assembly die vervolgens geimporteerd kan orden in Visual studio zodat er gebruik gemaakt van kan worden. Er zijn twee manieren om unmanaged DLLs te gebruiken binnen VS. Voeg een reference toe aan het project Maak gebruik van de System.Runtime.InteropServices namespace en gebruik het import attribuut Het .NET Frameork gebruikt marshaling om data te versturen tussen het .NET Framework en COM. Marshalingis het process die ervoor zorgt dat alle parameters correct worden doorgegeven. De types in .NET kunnen anders gedefinieerd zijn in een COM. Voorbeeld een string in .NET is in een COM object een BStr. Vaak zijn de standaard marshaling instellingen voldoende, maar de instellingen kunnen ook ha

Hoofdstuk 12 - Les 3

Symmetrische sleutel encryptie, betekend geheimee sleutel encryptie. Deze methode gebruikt een geheime sleutel om zowel de data te encrypten als te decrypten. De ge-encrypte tekst wordt cipher text genoemd. Een nadeel van deze methode is dat beide partijen de gehieme sleutel moeten weten. De meeste cryptie functionaliteit zit in de System.Security.Cryptography namespace. RijndaelManaged - Omdat deze en AesManaged fully managed impementaties zijn, kunnen zij in partially trusted omgevingen gebruikt worden AesManaged - Ook bekend als Advanced Encryption Standard. In essentie de Rijndael algoritme met een vaste block grootte en iteratie teller. Werkt hetzelfde als de rijndael class, maar met gelimiteerde blocks tot 128 bits DES - Data Encryption Standard. Maakt gebruik van korte sleutels. Dat maakt het kwetsbaar en daarom zou het vermeden moeten worden TripleDES - In essentie brengt het de DES algoritme drie keeer toe RC2 - Een encryptie standaard die ontworpen is om DES te vervangen met

Hoofdstuk 12 - Les 2

Access Control Lists (ACL) wordt door het OS gebruikt om de toegang te beperken van bestanden, mappen printers, services en registerwaarden. Discretionary Access Control List (DACL) is een autorisatie restrictie mechanisme die de gebruikers en groepen identificeert die toegang hebben tot een object. Als een gebruiker toegang wilt tot een object en niet voorkomt in een DACL wordt de toegang ontzegt. Een entry (die toegang verschaft tot een object) in een DACL wordt een Access Control Entry (ACE) genoemd. Als een DACL direct wordt toegewezen aan een object heet dit explicit permission geven. Windows maakt gebruik van overerving als het gaat om rechten geven. Als een map of bestand wordt aangemaakt erft deze de rechten van zijn parent. Een gebruiker kan meerdere ACEs hebben. Dit komt doordat gebruikers in meerdere groepen kunnen zitten en groepen kunnen weer in groepen zitten. Windows telt alle rechten van een gebruiker bij elkaar op geeft de gebruiker dan de hoogste rechten, tenzij er er

Hoofdstuk 12 - Les 1

Authentication = identiteit van de gebruiker vaststellen Authorization = De rechten van een gebruiker verifiëren voor toegang tot een resource. System.Principal.WindowsIdentity representeert een Windows gebruiker. Authenticeert niet, dat heeft Windows al gedaan. Deze class houd de gebruikersnaam, authenticatie type en account token bij. Als een instantie wordt gemaakt wordt van de WindowsIdentity class kan gebruik worden gemaakt van drie static methoden: GetAnonymous – Returnt een WindowsIdentity object die een anonieme ongeauthentiseerde gebruiker representeert. GetCurrent – Returnt een WindowsIdentity object die de huidige ingelogde Windows gebruiker representeert. Impersonate – Returnt een WindowsImpersonationContext die een gespecificeerde gebruiker representeert. WindowsIdentity currentIdentity = WindowsIdentity.GetCurrent(); De System.Security.Principal.WindowsPrincipal class biedt toegang tot een gebruikers zijn groep lidmaatschap. Een object van deze class moet aangemaakt worde

Hoofdstuk 11 - Les 3

CAS kan op twee manieren worden gebruikt. Declaratief, waarbij de compiler de security checks uitvoert voordat de code uitgevoerd wordt of imperatief, waarbij de code zelf de security checks uitvoert en bepaalt at er gebeurt als de check faalt. Er zijn vier opties voor imperatief en declaratief permissions voor een method: Assert – Instrueert runtime om aanvragers met onvoldoende rechten te negeren. Assemblies moeten de Assert Any Permission That Has Been Granted security permission setting hebben. Demand – Instrueert runtime om een exception te gooien als de aanvrager niet de juiste permissions hebben. Deny – Runtime vermindert de method’s toegang door de gespecificeerde permission te verwijderen. PermitOnly – Intrueert runtime om de method’s toegang te verminderen door alle permissions te verwijderen behalve de gespecificeerde permission. Er zijn twee declaratieve aanvragen die niet van toepassing zijn voor op imperatief: LinkDemand – Veroorzaakt runtime een exception als de directe

Hoofdstuk 11 - Les 2

Declarative CAS zorgt ervoor dat de assembly alle benodigde permissions heeft; niet te veel en niet te weinig. Bijkomend voordeel is dat administrators direct weten welke rechten zij moeten toekennen aan de assembly. Drie redenen om CAS declaraties te gebruiken: Om ervoor te zorgen dat runtime de applicatie nooit uitvoert zonder toegang te verkrijgen tot de benodigde bronnen. Om een kleine zandbak te maken van de applicatie om ervoor te zorgen dat een aanvaller de applicatie niet kan manipuleren om toegang te verkrijgen tot onbedoelde bronnen. Om te verifiëren dat applicaties worden uitgevoerd met gelimiteerde CAS permissions en daarom in partially trusted zones worden uitgevoerd. CAS kan van een hoop bronnen de toegang regelen (van bestanden en mappen tot printers en netwerktoegang). Voor elk type bron dat kan worden beschermd, heeft het .NET Framework een class beschikbaar. Elke class heeft unieke members om de permissions te bepalen. Omdat de permission attribuut classes erven van d

Hoofdstuk 11 - Les 1

CAS (code Access Security) is een beveiligingssysteem die het toestaat administrators en ontwikkelaars controle te nemen over applicatie authorisatie op dezelfde wijze hoe zij altijd gebruikers hebben geauthoriseerd. Met CAS kan je toestaan dat 1 application leest en schrijft naar het register terwijl je lezen en schrijven naar het register van aan andere applicatie verbied. Dezelfde bronnen kunnen worden geauthoriseerd die normaal gesproken ook kunnen worden geauthoriseerd met het systeems role-base security (RBS). Er zijn systeem bronnen die kunnen worden beveiligd die geen RBS hebben. Bijvoorbeeld web verzoeken versturen of DNS verzoeken. Met CAS kunnen dit soort dingen worden geauthoriseerd. CAS kan enkel toegepast worden bij applicaties die in het .NET Framework draaien. Applicaties die zonder CAS draaien zijn gelimiteerd tot de RBS restricties. Als via CAS restricties zijn gekoppeld aan een applicatie dan wordt deze applicatie als partially trusted beschouwd. Sommige assemblies z

Hoofdstuk 10 - Les 3

Gebruik de statische methode Process.GetProcesses om alle huidige processen van het systeem op te halen. Om een specifiek process op te halen gebruik je het PID (Process ID): Process.GetProcessById. Om een process op te halen op basis van naam gebruik je: Process.GetProcessByName. Om het huidige process op te halen: Process.GetCurrent. Als een process is geladen kan met Process.Modules alle modulen worden geladen, indien je voldoende rechten heb, anders wordt er een Win32Exception gegooid. Als een Process object wordt aangemaakt, worden meteen alle properties geladen en gecached. Om de actuele waarden van de properties op te vragen moet eerst de Refresh methode aangeroepen worden. Gebruik de statische methode Process.Start om een process te starten en geef hierbij mee de naam van de exe die gestart moet worden. Parameters kunnen als tweede parameter worde meegegeven. Windows geeft veel informatie weer over de computer via WMI. Gebruik WMI om de setup van de applicatie te bepalen of wan

Hoofdstuk 10 - Les 2

In de System.Diagnostics namespace kunnen performance counters worden aangemaakt en kunnen performance counters worden bijgewerkt binnen de applicatie. Vervolgens kunnen de developer en systeembeheerder deze performance counters bekijken via de perormance monitor. Om een performance counter te maken moet een instantie worden gemaakt van de PerformanceCounter class door een performance, een teller en eventueel de instantie mee te geven. Gebruik performanceCounter.NextValue om de counter te resetten. Roep dezelfde methode nog een keer aan om de performance data op te halen. PerformanceCounter pc = new PerformanceCounter("Processor", "% Processor Time", "_Total"); // Reset de teller pc.NextValue(); // Wacht eens seconde Thread.Sleep(1000); // Haal het processor gebruik op van de afgelopen seconde Console.WriteLine(pc.NextValue()); Custom performance counters kunnen niet worden toegevoegd aan een bestaande categorie. Om een custom performance counter aan te ma

Hoofdstuk 10 - Les 1

Systeembeheerders gebruiken het Windows event log om te monitoren of alle software naar behoren functioneert. Er zijn drie event logs: System – Bevat alle non-security gerelateerde operating system events Security – Bevat wie is in- en uitgelogd. Applicaties kunnen hier niet in schrijven Application – Oorspronkelijk bedoeld om gebeurtenissen van applicaties in op te slaan als deze geen specifieke event log hebben. Events hebben altijd een source, welke de applicatie identificeert die het event heeft veroorzaakt. Voordat events kunnen worden gelogd moet eerst de applicatie geregistreerd worden als een event. Dit kan op twee manieren. Manueel door in het register een key aan te maken In de code Voorbeeld in code (moet wel uitgevoerd worden door administrator): If(!EventLog.SourceExists(“ My application”)) EventLog.CreateEventSource(“My application” , “My application Log”); Events loggen gebeurt door EventLog.Source property te zetten en de method EventLog.WriteEntry aan te roepen met d

Hoofdstuk 9 - Les 3

Soms is het nodig meer controle te hebben over de installatie van een applicatie. In deze omstandigheden kan er een instantie gemaakt worden van de Installer class in de System.Configuration.Install namespace. Installer heeft 4 methodes die kunnen worden overschreven: Install: Verantwoordelijk voor het verfieren van de benodigdheden (voldoende rechten), kopieeren van de bestanden en configureren van andere benodigdheden van de applicatie Commit: Is aangeroepen nadat Install succesvol is afgerond. In deze fase moet de installatie worden afgerond. Rollback: Wordt enkel aangeroepen als de Install fase mislukt. In deze fase dienen alle bestanden te worden verwijderd en alle instellingen ongedaan worden gemaakt. Uninstall: Kan enkel worden aangeroepen als Install succesvol is afgerond. In deze fase moeten alle sporen van de applicatie verwijderd worden. In code kan met de Installer.Install methode de installatie worden uitgevoerd. Alle van de bovengenoemde methode hebben 1 parameter, een in

Hoofdstuk 9 - Les 2

.NET Framework instellingen kunnen worden aangepast in de .config bestanden. In de <assemblyBinding> element in de <runtime> sectie van het machine.config bestand kan opgegeven worden waar de runtime assemblies kan vinden. Via de DEVPATH environment variabele kunnen ook gedeelde assemblies geconfigureerd worden. De runtime zoekt dan alle paden af die in de DEVPATH zijn gedefinieerd. DEVPATH kan als volgt ingesteld worden: Rechtermuisknop op Deze computer, eigenschappen Advanced System Settings Advanced tab, System properties, Environment variables klik New naam: DEVPATH value: het pad naar de gedeelde assemblies Nadat de environment variabele is gezet, zet de developmentMode op true in machine.config. Ook kan gebruik gemaakt worden van de Microsoft .NET Framework 2.0 Configuration Tool (Mscorcfg.msc) vanuit de Administrative Tools in het start menu of via het pad waar het framework geinstalleerd staat. Deze tool is enkel beschikbaar als de SDK is geinstalleerd van het 2.0 F

Hoofdstuk 9 - Les 1

Applicaties halen hun instellingen uit twee bestanden: de centrale machine.config, welke toegankelijk is voor alle .NET applicaties en de applicatie-specifieke .config bestand in de assembly map. De machine.config geldt voor alle soorten applicaties: WPF, console en web applicaties. Sommige instellingen van de machine.config kunnen worden overschreven in de lokale config file. De System.Configuration namespace bevat classes voor het lezen en schrijven van configuratie instellingen. Standaard maakt .NET gebruik van de oude namespace. Om de nieuwe namespace te gebruiken moet eerst een reference worden toegevoegd. Om in code applicatie instellingen te definieren moet er een instantie van ConfigurationManager.OpenExeConfiguration worden gemaakt. Met Configuration.Add kan d.m.v. een name/value pair een setting worden aangemaakt. Met Configuration.Save worden de waarden opgeslagen: Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); config.AppSettin

Hoofdstuk 8 - Les 3

Met services kunnen assemblies uitgevoerd worden op de achtergrond, zonder de interactie van de gebruiker. Services zijn handig op het moment dat bepaalde zaken gemonitord moeten worden. Om eenservice tijdens ontwikkeling te testen kan neit gebruik gemaakt worden van de F5 toets, de service moet eerst geinstalleerd worden en dan een kan er een debugger aan gehangen worden. De Main methode moet de Run methode aanroepen. Deze methode laad een service in het Service Control Manager. Een service kent geen dialog boxes omdat een service geen interactie kent met de gebruiker. Daarom heeft hij ook geen GUI. Eventuele loge moeten in het Windows event log worden weggeschreven. Services worden in hun eigen beveiligingscontext uitgevoerd en worden gestart voordat de user inlogt. Hoe meer permissies de service heeft, des te meer schade kan er aangericht worden door een hacker. Let daarom op onder welk account (met alleen de noodzakelijke rechten) een service wordt uitgevoerd. De ServiceBase.Servic

Hoofdstuk 8 - Les 2

Door restricties toe te kennen aan een application domain, verkleint dat de kans dat de assembly kwaadaardige acties uitvoert. Defense-in-depth is het beveiligings principe van het aanbieden van meerdere vormen van protectie zodat je nog steeds bevieligd bent tijdens een kwaadwillige actie. Dit is vooral belangrijk bij externe code. Voor de assemblies die binnen een application domain worden opgestart is er volledige controle over de host evidence. Evidence is de informatie die de runtime verzameld over een assembly om te bepalen tot welke code groups de assembly behoort. De code groups bepalen op hun beurt de privileges van de assembly . Standaard vormen van evidence zijn de map of web site waaruit de assembly wordt uitgevoerd. Om evidance aan een assembly mee te geven moet eerst een System.Security.Policy.Evidence object worden aangemaakt en worden meegegeven aan de ExecuteAssembly methode. Wanneer een evidence wordt aangemaakt moeten er twee parameters, beide object arrays, worden m

Hoofdstuk 8 - Les 1

Afbeelding
Een application domain is een container die het mogelijk maakt om meerdere assemblies uit te voeren binnen een proces. Daarbij voorkomt een application domain dat de assemblies geen geheugen gebruikt dat bij andere assemblies hoort. Daarnaast biedt het volledige isolatie. Dit betekent dat niet afgehandelde exceptions geen invloed hebben op andere application domains. Nog een voordeel van een application domain is dat elk application domain een ander security access level kan hebben. Als een assembly is geladen in de standaard application domain, dan kan de assembly niet uit het geheugen worden gehaald als het proces nog aan het uitvoeren is. Binnen het .NET framework kan met de System.AppDomain class een application domain aangemaakt worden. AppDomain d = AppDomain.CreateDomain("NewDomain"); Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName); Console.WriteLine("Child domain: " + d.FriendlyName); Een assembly starten binnen een applic

Hoofdstuk 7 - Les 2

ThreadPool.QueueUserItem is voldoende wanneer een thread wordt gestart en zolang laat lopen totdat de gespecificeerde methode klaar is met uitvoeren. Indien meer controle nodig is, zoals het stoppen van een thread, kan er een Thread object gemaakt worden om vervolgens de Start methode aan te roepen. De thread kan dan geannuleerd worden door de methode Abort aan te roepen. static void Main(string args[]) { // Maak een thread object en geef een DoWork methode mee gebruik makend van een ThreadStart delegate Thread DoWorkThread = new Thread(new ThreadStart(DoWork)); // Start de thread DoWorkThread.Start(); // Wacht een seconde Thread.Sleep(1000); // Annuleer de thread DoWorkThread.Abort(); Console.WriteLine("Main applicatie wordt gesloten"); Thread.Sleep(6000); } public static void DoWork() { Console.WriteLine("DoWork wordt gestart"); try { Thread.Sleep(1000); } catch(ThreadAbortException ex) { Console.WriteLine("DoWork is ge