Posts

Posts uit februari, 2011 tonen

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