MS certificering: 70-483, deel 7

Ingediend door Dirk Hornstra op 23-mar-2018 19:33

Vanavond (23 maart 2018) gaan we door met module 6. Titel daarvan is Splitting Assemblies and WinMD - Diagnostics and Instrumentation. Dat klinkt als Trace en Loggen. Door dus met de C# Jump Start Video.

We beginnen eerst met wat een assembly is. Het is een container voor een set van bronnen en types. Assemblies kunnen door andere assemblies gerefereerd worden. Sommige assemblies zijn specifiek voor bepaalde technologieën. In Visual Studio staat een assembly gelijk aan een project. Het is een DLL, het kan een EXE zijn. Het kan ook een WinMD zijn, dat is een Windows 8 component. 

Een assembly wordt vergeleken met een namespace. Een assembly is een groep of fysieke container van code. Namespace is een groepering of logische container van code. Een assembly kan één of meer namespaces bevatten, security permissies toegewezen worden, digitaal gesigneerd worden en definieert een scope. Een namespace kan meerdere bestanden bevatten, kan over meerdere assemblies heen liggen en definieert ook een scope. 

System, van het .NET framework is een namespace. Je hebt de System.IO voor het werken met bestanden, streams. Met het geven van een namespace geef je aan dat iets bij elkaar hoort. Waarom zou je dit over meerdere bestanden verdelen? Je hebt bijvoorbeeld een web-component voor de services, maar een WPF-cliënt, een Windows Phone cliënt. Ze hebben dezelfde namspace, maar we verdelen ze over verschillende assembly's omdat ze niet echt bij elkaar horen. Het houdt je code overzichtelijk, maar wel logisch de boel bij elkaar.Als je unit-tests gebruikt, wil je bijvoorbeeld de DLL waar je unit-tests in zitten die niet meeleveren bij je product. 

Als die assembly's die je deelt, hoe weet je dat je die kunt vertrouwen? Je kunt een assembly aangeven dat die "strong-named" is. Hierdoor wordt er een signature / private key in de DLL gecompiled. Als je een DLL in de GAC wilt installeren is dit een verplichting! Het installeren in de GAC doe je met  GPO (Group Policy gebruiken), IT administration-taak. 

Hoe je assembly's te delen?
Class Libraries zijn de Visual Studio projecttype dat een assembly maakt wat gedeeld kan worden.
Portable Class Libraries zijn het VS project dat een assembly maakt dat over meerdere platformen gedeeld kan worden. N.B. Het gebruikt alleen de lowest-common-denominator.
Windows Component Libraries (WinMD / Windows Metadata) zijn het VS projecttype dat een assembly maakt voor Windows Store Apps die via meerdere programmeertalen gedeeld kan worden. N.B. Javascript kan niet gebruikt worden om WinMDs te maken!

PCL: pattern interface design. Omdat bij elke keuze de mogelijkheden kunnen verminderen, moet je daarom heen werken. Windows C++, C#, Visual Basic, brengt het naar een Windows 8 level. We gaan een voorbeeld bekijken. In Visual Studio, Visual C#, Windows Store, Blank App (XAML). We pakken de MainPage.xaml en plaatsen er componenten op. Het is dezelfde codebase als Blend. Het verwerken van het optellen gaan we gedeeld doen. We voegen een nieuw project toe, Windows Store , Windows Runtime Component. Heeft een class Class 1. We kunnen hier (helaas) geen Generics gebruiken.
In je Blank App voeg je het WRC project toe als referentie.

 

// WRC
public static double SumThemUp(double v1, double v2)
{
  return v1 + v2;
}


private void Button_Click_1(object sender, RoutedEventArgs e)
{
  var v1 = double.Parse(v1.Text);
  var v2 = double.Parse(v2.Text)
  t3.Text = WindowsRuntimeComponent1.Class1.SumThemUp(v1, v2).ToString();
}

Hierna wordt een project toegevoegd, Windows Store, Javascript.
Jerry maakt in default.html een aantal inputs, ook met id t1, t2 en t3. Voegt hier een stukje javascript toe.  
<script>function doWork(){ WindowsRunTimeComponent1.Class1.sumThemUp();}</script>
En voegt hierbij het project toe, waarbij hij het ook in javascript kan gebruiken.
Hier komt dus naar voren dat de WindowsRuntimeComponent niet mét javascript kan maken.
Dat was een WinMD, Windows Runtime Component. Specifieke Windows 8 development.

Instrumentation is code die performance informatie rapporteert. Telemetry aggregeert instrumentation om te anlyseren. Diagnostics of Analysis is het gebruik van telemetrie om oorzaken, fouten of identity trends op te sporen.

We gaan door naar Performance Counters. Het is het samplen van een enkele operatie. Je laat een teller op- of aftellen. Trending kun je bepalen door tooling. Je moet wel de juiste permissies hebben. Counters zijn meestal gecategoriseerd. 


var perfCounter = new PerformanceCounter
{
  CategoryName = category,
  CounterName = counter,
  MachineName = machine,
  ReadOnly = false
};
perfCounter.IncrementBy(10);

Andere technieken voor diagnose;
Tracing: informatieve berichten tijdens uitvoering. Strategische locatie, fail/assert, voeg tekst aan de output toe, geeft een fout aan. write/writelf - voegt tekst aan de output toe. writeline/WriteLinelf - voegt tekst met een newline toe aan de output
Volume control (Trace Listeners en Trace Switch)
Event Logs, ontvang en hou belangrijke events tijdens uitvoering bij. Windows, Custom.

We krijgen een voorbeeld van een programma met wat for-loopjes. Via de taskmanager zien we dat de CPU flink omhoog gaat. We gaan in Visual Studio via het menu "Analyze" naar "Launch Performance Wizard". We kiezen voor Instrumentation. Selecteer het project, Next, Finish. Na het uitvoeren van het programma zien we de duur (13 seconden) en hoe de CPU belast wordt. Via de hot path krijg je de langste / zwaarste runs te zien. Het is een goede manier om je programma te testen. Neem geen dingen aan, de compiler optimaliseert al heel veel. Met de profiler kun je de echte vertragers aanpakken. Je zou hier ook je eigen counters toe kunnen voegen. Je doet dit in de release-build, op de echte omgeving. En voeg niet teveel instrumentation toe, want dat kan zelf de boel ook weer vertragen.