Pour aller plus loin
Le dessin avec GDI+
Lors du développement d’application, la couche d’abstraction de Windows permet de ne pas avoir à écrire du code pour un composant particulier. Par exemple, pour les cartes graphiques, il en existe de très nombreuses, toutes différentes. C’est pourquoi la couche GDI (Graphics Device Interface) est mise à disposition des développeurs. Ils communiquent avec cette API et elle fera ensuite le lien avec Windows, puis les informations passeront par le driver de la carte graphique et enfin l’écran. Dans le Framework .NET, cette API est connue sous le nom de GDI+, elle est répartie sur six espaces de noms :
-
System.Drawing : cet espace de noms contient la plupart des classes, structures et autres définitions de base pour la programmation graphique.
-
System.Drawing.Design : cet espace de noms contient les classes utiles pour le développement de l’interface graphique au moment de la conception dans Visual Studio.
-
System.Drawing.Drawing2D : cet espace de noms fournit la plupart des classes pour le dessin en deux dimensions avec notamment le dessin vectoriel, les transformations géométriques et les effets visuels tels que l’anti-aliasing.
-
System.Drawing.Imaging : cet espace de noms fournit les classes permettant de gérer la manipulation des images.
-
System.Drawing.Printing : cet espace de noms fournit des classes permettant de simplifier l’impression de contenu texte et image.
-
System.Drawing.Text : cet espace de noms contient les classes qui simplifient la manipulation des polices de caractères.
1. La classe Graphics
La classe Graphics est celle principalement utilisée dans l’affichage. Un objet Graphics représente une surface de dessin pour un élément. Cela peut être un formulaire, un bouton ou un label. Cette classe réalise l’opération d’affichage des éléments visuels.
Un objet Graphics ne peut pas être instancié directement avec son constructeur. Il doit être créé directement à partir de l’élément visuel. Les classes dérivant de la classe Control exposent la méthode CreateGraphics qui renvoie une référence à l’objet Graphics associé :
Forms.Main main = new Forms.Main(); ...
Le remoting
Le remoting permet d’utiliser l’accès distant dans vos applications afin qu’elles communiquent entre elles. Cela peut être des applications situées sur la même machine, ou sur des machines différentes qui appartiennent soit au même réseau, soit à des réseaux différents.
1. Le principe
Le principe du remoting est de faire transiter des objets au travers du réseau. Ce principe repose sur l’empaquetage des objets (marshalling et unmarshalling). Le marshalling est le principe de transformation d’un objet pour qu’il puisse transiter au travers d’applications. Le unmarshalling est le processus inverse. Le Framework .NET fournit trois protocoles de formatage dans l’espace de noms System.Runtime.Remoting.Channels :
-
TCP (System.Runtime.Remoting.Channels.Tcp) avec un empaquetage binaire.
-
HTTP (System.Runtime.Remoting.Channels.Http) avec un empaquetage SOAP.
-
IPC (System.Runtime.Remoting.Channels.Ipc), ce protocole de communication est plus rapide que les protocoles TCP et HTTP mais il ne peut être utilisé que pour des communications entre applications sur une même machine.
Le schéma suivant illustre la manière dont les applications distantes communiquent :
Le proxy est une couche intermédiaire créée et gérée par le Framework .NET. Il se charge de router les demandes du client vers le serveur et inversement pour récupérer les réponses. Les communications ne se font donc pas directement avec le serveur ou le client mais avec le proxy.
2. L’implémentation
Nous allons construire une application de chat simpliste dont le fonctionnement client/serveur se prête tout à fait au principe du remoting. La première chose lors de la création d’une application client/serveur est de fournir une interface permettant d’exposer les membres à la fois au client et au serveur. Ensuite, il y a la création du serveur et du client en deux applications distinctes.
a. La couche commune
Pour que le client puisse communiquer avec le serveur, il doit connaître les méthodes disponibles. Les classes communes devront donc être distribuées sur l’application cliente et l’application serveur.
Pour simplifier la distribution de la couche commune, nous allons créer...
Reflection
Les exemples de cette section sont disponibles dans les sources sous le projet Reflection.
Le Framework .NET expose dans l’espace de noms System.Reflection les classes permettant d’accéder aux métadonnées d’un assemblage, d’en énumérer les types et leurs membres. Cet espace de noms comprend de nombreuses classes avec, parmi les plus communes, les classes Assembly, Module, MethodInfo, FieldInfo, PropertyInfo ou EventInfo.
1. La classe System.Type
La classe Type de l’espace de noms System est au cœur du processus de réflexion. Cette classe modélise les types et permet d’en connaître les détails comme leurs noms, leur espace de noms contenant ou si ce sont des types valeur ou référence.
Vous pouvez obtenir un objet Type à partir d’une instance d’objet, en appelant la méthode GetType héritée de la classe Object :
int i = 1;
Type typeInt = i.GetType();
Console.WriteLine(typeInt.FullName);
Console.WriteLine(typeInt.Namespace);
Console.WriteLine(typeInt.Name);
La sortie de l’exemple précédent est la suivante :
System.Int32
System
Int32
Le mot-clé typeof permet également de récupérer un objet Type lié au type passé en paramètre du mot-clé :
Type typeString = typeof(string);
Console.WriteLine(typeString.FullName);
Console.WriteLine(typeString.Namespace);
Console.WriteLine(typeString.Name);
La sortie de l’exemple précédent est la suivante :
System.String
System
String
La classe Type contient énormément de propriétés pour décrire un type. Examinez la fenêtre Variables locales pour les découvrir :
2. Charger un assemblage dynamiquement
La classe abstraite Assembly permet de charger un assemblage à partir d’un fichier compilé...