net & c#

48
.NET & C# .NET & C# Sandra CHAVES Sandra CHAVES Sylvain CUAZ Sylvain CUAZ DESS GI SRR 2002-2003 DESS GI SRR 2002-2003 IMA - Université Grenoble IMA - Université Grenoble 1 1

Upload: denali

Post on 15-Jan-2016

38 views

Category:

Documents


0 download

DESCRIPTION

.NET & C#. Sandra CHAVES Sylvain CUAZ DESS GI SRR 2002-2003 IMA - Université Grenoble 1. Plan. Origine de .NET .NET Le langage C# Les alternatives Conclusion. Origine de .NET. 1995 : Microsoft se tourne vers le net - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: NET & C#

.NET & C#.NET & C#

Sandra CHAVESSandra CHAVESSylvain CUAZSylvain CUAZ

DESS GI SRR 2002-2003DESS GI SRR 2002-2003

IMA - Université Grenoble 1IMA - Université Grenoble 1

Page 2: NET & C#

.NET & C#.NET & C#

PlanPlan

I.I. Origine de .NETOrigine de .NET

II.II. .NET.NET

III.III. Le langage C#Le langage C#

IV.IV. Les alternativesLes alternatives

V.V. ConclusionConclusion

Page 3: NET & C#

.NET & C#.NET & C#

Origine de .NETOrigine de .NET

1995 : Microsoft se tourne vers le net1995 : Microsoft se tourne vers le net

gros compromis pour vite produire des gros compromis pour vite produire des outils et technologies basés sur l’Internetoutils et technologies basés sur l’Internet

tentative de ramener un peu d’ordre avec tentative de ramener un peu d’ordre avec le concept DNA le concept DNA

Page 4: NET & C#

.NET & C#.NET & C#

DNADNA

3 niveaux3 niveaux Active Server Pages pour la présentation,Active Server Pages pour la présentation, Objets métiers en COM au milieu,Objets métiers en COM au milieu, Une base de donnée pour le bas.Une base de donnée pour le bas.

Concept sain, mais difficile à mettre en oeuvreConcept sain, mais difficile à mettre en oeuvre D’autres plateformes offrait de bien meilleures D’autres plateformes offrait de bien meilleures

solutions (Unix, J2EE)solutions (Unix, J2EE) essentiel pour Microsoft de résoudre les essentiel pour Microsoft de résoudre les

limitations de DNAlimitations de DNA

Page 5: NET & C#

.NET & C#.NET & C#

Le remplaçantLe remplaçant

1998 : début de Next Generation Windows 1998 : début de Next Generation Windows Services (NGWS).Services (NGWS).

Développement confidentielDéveloppement confidentiel NGWS rebaptisé .NET le 22 Juin 2000NGWS rebaptisé .NET le 22 Juin 2000

Page 6: NET & C#

.NET & C#.NET & C#

.NET : une plateforme .NET : une plateforme logiciellelogicielle

DescriptionDescriptionLe frameworkLe framework

Page 7: NET & C#

.NET & C#.NET & C#

DescriptionDescription

Plateforme logicielle : programmes ne Plateforme logicielle : programmes ne cible pas une combinaison matériel/OS cible pas une combinaison matériel/OS mais .NETmais .NET

=> marcheront partout où est => marcheront partout où est implémenté .NETimplémenté .NET

environnement indépendant d'un langageenvironnement indépendant d'un langage But : écrire des programmes qui But : écrire des programmes qui

interopère facilement et de façon sécurisé.interopère facilement et de façon sécurisé.

Page 8: NET & C#

.NET & C#.NET & C#

DescriptionDescription

.NET nom collectif pour des logiciels .NET nom collectif pour des logiciels variés qui sont construit sur la variés qui sont construit sur la plateforme .NETplateforme .NET produits : Visual Studio.NET, produits : Visual Studio.NET,

Windows.NET Server, …Windows.NET Server, … services : Passport, HailStorm, …services : Passport, HailStorm, …

Les composants qui constituent .NET-Les composants qui constituent .NET-la-platforme sont appelés le la-platforme sont appelés le Framework .NET.Framework .NET.

Page 9: NET & C#

.NET & C#.NET & C#

.NET Framework.NET Framework

2 parties principales:2 parties principales: 1. La CLR (Common Language Runtime)1. La CLR (Common Language Runtime) 2. Un ensemble hièrarchique de 2. Un ensemble hièrarchique de

bibliothéques de classesbibliothéques de classes

Page 10: NET & C#

.NET & C#.NET & C#

La CLRLa CLR

Le “moteur d’exécution” de .NETLe “moteur d’exécution” de .NET Les caractéristiques :Les caractéristiques :

Conversion IL -> code natifConversion IL -> code natif Gestion Mémoire (garbage collection)Gestion Mémoire (garbage collection) Vérifie et applique la sécuritéVérifie et applique la sécurité Charge et exécute les programmesCharge et exécute les programmes

Page 11: NET & C#

.NET & C#.NET & C#

Intermediate LanguageIntermediate Language

Indépendant du CPUIndépendant du CPU Indépendant du langageIndépendant du langage

=> chaque langage choisi un sous-ensemble=> chaque langage choisi un sous-ensemble Code accessible depuis d’autres langagesCode accessible depuis d’autres langages

=> respect de la Common Language => respect de la Common Language Specification (CLS)Specification (CLS)

Code source IL

compilation

Exécution parla CLR

Page 12: NET & C#

.NET & C#.NET & C#

Managed CodeManaged Code

code qui cible .NETcode qui cible .NET contient des informations contient des informations

supplémentaires (metadonnées) pour supplémentaires (metadonnées) pour se décrirese décrire

=> CLR peut garantir la sécurité, => CLR peut garantir la sécurité, l’interopérabilité…l’interopérabilité…

Page 13: NET & C#

.NET & C#.NET & C#

Common Type SystemCommon Type System

sert à décrire les types indépendamment sert à décrire les types indépendamment du langage =>du langage => type-fidelity : permet à des types d'un langage type-fidelity : permet à des types d'un langage

d'interagir avec des types d'un autre langage d'interagir avec des types d'un autre langage type-safety : garanti que le code n'accède pas type-safety : garanti que le code n'accède pas

à des zone mémoires interditesà des zone mémoires interdites

Page 14: NET & C#

.NET & C#.NET & C#

Unmanaged CodeUnmanaged Code

.NET peut utiliser du code sans métadonnées :.NET peut utiliser du code sans métadonnées :

1.1. non « géré »non « géré »• peut utiliser la bibliothéque de .NETpeut utiliser la bibliothéque de .NET• peut compiler en ILpeut compiler en IL• ne peut bénéficier du GCne peut bénéficier du GC

2.2. natifnatif• pour de meilleures performancespour de meilleures performances• par exemple WinFormspar exemple WinForms

Page 15: NET & C#

.NET & C#.NET & C#

AssembliesAssemblies

Briques des programmes .NETBriques des programmes .NET unité fonctionnelle atomiqueunité fonctionnelle atomique Collection de code et de métadonnéesCollection de code et de métadonnées Contient un Manifest, qui décritContient un Manifest, qui décrit

son nomson nom sa versionsa version la liste des fichiersla liste des fichiers les dépendancesles dépendances les fonctions fournies…les fonctions fournies…

Page 16: NET & C#

.NET & C#.NET & C#

ModuleModule Code compilé sans ManifestCode compilé sans Manifest Sert à modularisé le développementSert à modularisé le développement

Page 17: NET & C#

.NET & C#.NET & C#

JITJIT

La CLR utilise la compilation Just-In-La CLR utilise la compilation Just-In-TimeTime

Chaque méthode appelée est compilée Chaque méthode appelée est compilée en code natifen code natif

appels suivants n’ont pas à être appels suivants n’ont pas à être recompilésrecompilés

Qq problèmes : exige des resourcesQq problèmes : exige des resources mémoiremémoire processeurprocesseur

Page 18: NET & C#

.NET & C#.NET & C#

JITJIT

2 compileurs JIT:2 compileurs JIT: un normal : optimise pas mal, mais intensif au un normal : optimise pas mal, mais intensif au

niveau de la mémoire et du processeurniveau de la mémoire et du processeur un "EconoJIT” : optimise pas aussi bien, mais un "EconoJIT” : optimise pas aussi bien, mais

requiert moins de ressourcesrequiert moins de ressources Promesse d’un 3eme : un compileurPromesse d’un 3eme : un compileur pre-JIT pre-JIT = un compileur normal != un compileur normal ! Le seul plus : compile à l’installation => pas Le seul plus : compile à l’installation => pas

besoin de distribuer du code spécifique pour besoin de distribuer du code spécifique pour chaque plateformechaque plateforme

Page 19: NET & C#

.NET & C#.NET & C#

AttributesAttributes

Façon flexible et extensible de modifier Façon flexible et extensible de modifier l’environnement à la compilation ou à l’environnement à la compilation ou à l’exécutionl’exécution

Marquer une fonction comme étant Marquer une fonction comme étant obsolète => warning à la compilationobsolète => warning à la compilation

Attacher un auteur à chaque bout de code Attacher un auteur à chaque bout de code => on interroge ces attributs à l’exécution=> on interroge ces attributs à l’exécution

Page 20: NET & C#

.NET & C#.NET & C#

La bibliothéque de ClassesLa bibliothéque de Classes

Namespace : ensemble de classesNamespace : ensemble de classes La racine des namespaces est SystemLa racine des namespaces est System Contient les types basiques comme Byte, Contient les types basiques comme Byte,

Double, Boolean, and String, Object…Double, Boolean, and String, Object… Tous les objets dérivent de System.ObjectTous les objets dérivent de System.Object value types ≠ objetsvalue types ≠ objets Moyens efficace de convertir des value Moyens efficace de convertir des value

types en objetstypes en objets

Page 21: NET & C#

.NET & C#.NET & C#

Côté clientCôté client L’ensemble des classes est assez complet :L’ensemble des classes est assez complet :

CollectionsCollections FileFile ScreenScreen network I/Onetwork I/O ThreadingThreading XMLXML Connection aux bases de données…Connection aux bases de données…

Windows Forms alternative au Windows Forms alternative au développement traditionnel pour Windowsdéveloppement traditionnel pour Windows

Page 22: NET & C#

.NET & C#.NET & C#

Côté serveurCôté serveur

Web Services : Web Services : composant sur un composant sur un serveur web utilisé serveur web utilisé par :par : Une applicationUne application Un autre Web ServiceUn autre Web Service

Page 23: NET & C#

.NET & C#.NET & C#

Web ServicesWeb Services

SOAP (Simple Object Access Protocol)SOAP (Simple Object Access Protocol) RPC qui utilise XML sur HTTPRPC qui utilise XML sur HTTP

WSDL (Web Service Description Language)WSDL (Web Service Description Language) décrit la structure des messagesdécrit la structure des messages

UDDI (Universal Description, Discovery and UDDI (Universal Description, Discovery and Integration)Integration) annuaire global des services webannuaire global des services web

Page 24: NET & C#

.NET & C#.NET & C#

Web ServicesWeb Services

WebServiceASOAP

AppA

Recherche service d’info sur WallStreetWSDL

WSDL

Je fournis des services d’info sur WallStreet

WSDL

AnnuaireUDDI

WSDL

Page 25: NET & C#

.NET & C#.NET & C#

PlanPlan

Présentation générale de C#Présentation générale de C# Syntaxe du langageSyntaxe du langage Les plus de C#Les plus de C#

Page 26: NET & C#

.NET & C#.NET & C#

I. Présentation généraleI. Présentation générale

Nouveau langage de MicrosoftNouveau langage de Microsoft Langage orienté objetLangage orienté objet Ressemble à C++Ressemble à C++ Utilise les classes définies dans .NETUtilise les classes définies dans .NET Pas une partie de .NET, langage comme Pas une partie de .NET, langage comme

un autreun autre Permet d’utiliser les concepts de .NET Permet d’utiliser les concepts de .NET

proprementproprement

Page 27: NET & C#

.NET & C#.NET & C#

II. Syntaxe du langageII. Syntaxe du langage

Définition d’une classeDéfinition d’une classe Définition d’une méthodeDéfinition d’une méthode Principales instructionsPrincipales instructions Types valeur et référenceTypes valeur et référence

Page 28: NET & C#

.NET & C#.NET & C#

Définition d’une classeDéfinition d’une classenamespace namespaceName { namespace namespaceName {

using Namespace(s);using Namespace(s);

[access] [sealed | abstract] [access] [sealed | abstract] class NomClasseclass NomClasse

[: Classe, Interface(s)] [: Classe, Interface(s)] {{

[définition de la classe][définition de la classe]

} }} }

Accessibilité à la classeAccessibilité à la classepublicpublic privateprivate

protectedprotected internalinternal

protected internalprotected internal

Page 29: NET & C#

.NET & C#.NET & C#

Définition d’une méthodeDéfinition d’une méthode

Une méthodeUne méthode[access] [new] [static] [abstract] [sealed] [extern] [access] [new] [static] [abstract] [sealed] [extern] [virtual | override] [TypeRetour | void] NomMethode[virtual | override] [TypeRetour | void] NomMethode([TypeParam param]) [: base ([param])] {([TypeParam param]) [: base ([param])] {

[corps de la méthode][corps de la méthode]}} La méthode MainLa méthode Mainpublic static [public static [int | int | void] Main([String[] args]){void] Main([String[] args]){

[corps de la méthode][corps de la méthode]}}

Page 30: NET & C#

.NET & C#.NET & C#

public class Parent{public class Parent{public void DoStuff(string str) { public void DoStuff(string str) {

Console.WriteLine("In Parent.DoStuff: "); }Console.WriteLine("In Parent.DoStuff: "); }}}  public class Child: Parent {public class Child: Parent {

public void DoStuff(string str) {public void DoStuff(string str) {Console.WriteLine("In Child.DoStuff: "); }Console.WriteLine("In Child.DoStuff: "); }

}}  public class VirtualTest {public class VirtualTest {

public static void Main(string[] args) {public static void Main(string[] args) {Child ch = new Child(); Child ch = new Child(); ch.DoStuff("Test"); ch.DoStuff("Test"); ((Parent) ch).DoStuff("Second Test"); ((Parent) ch).DoStuff("Second Test");

} }} }

Page 31: NET & C#

.NET & C#.NET & C#

Méthode m(), liste arguments A, une Méthode m(), liste arguments A, une instance I dont type à la compilation est instance I dont type à la compilation est C et le type àl’exécution est R (R = C ou C et le type àl’exécution est R (R = C ou sous classe de C)sous classe de C)

lors de l’appel de méthode m() sur Ilors de l’appel de méthode m() sur I1.1. Recherche méthode dans C (peut être Recherche méthode dans C (peut être

héritée)héritée)

2.2. Si la méthode de C non virtuelle, on l’appelleSi la méthode de C non virtuelle, on l’appelle

3.3. Si la méthode de C virtuelle, on recherche Si la méthode de C virtuelle, on recherche méthode de même signature la plus dérivée méthode de même signature la plus dérivée que R peut appelerque R peut appeler

Page 32: NET & C#

.NET & C#.NET & C#

Principales instructionsPrincipales instructions

ifif whilewhile dodo forfor switchswitch ForeachForeach

foreach (typeObj identifiant in collectionObj) foreach (typeObj identifiant in collectionObj) action; action;

Page 33: NET & C#

.NET & C#.NET & C#

Types valeur et référenceTypes valeur et référence

Type référenceType référence créé sur le « tas » (grâce à new)créé sur le « tas » (grâce à new) libéré par le ramasse mietteslibéré par le ramasse miettes

Type valeurType valeur créé sur la pilecréé sur la pile supprimé au retour d’un appel de méthodesupprimé au retour d’un appel de méthode pas sous la responsabilité du ramasse miettespas sous la responsabilité du ramasse miettes Déclaration : mot-clé struct (au lieu de classe)Déclaration : mot-clé struct (au lieu de classe)

Page 34: NET & C#

.NET & C#.NET & C#

III. Les plus de C#III. Les plus de C#

StructuresStructures Le boxing/unboxingLe boxing/unboxing Les propertiesLes properties Les attributsLes attributs Les indexeursLes indexeurs Les déléguésLes délégués Pointeur et code non protégé: unsafe codePointeur et code non protégé: unsafe code Le versionningLe versionning

Page 35: NET & C#

.NET & C#.NET & C#

StructsStructs

Mot-clé structMot-clé struct Objets de type valeurObjets de type valeur Déclaration des mêmes types de membres Déclaration des mêmes types de membres

qu’une classe possiblequ’une classe possible Pas d’héritage possiblePas d’héritage possible Peut implémenter des interfacesPeut implémenter des interfaces La visibilité par défaut = protectedLa visibilité par défaut = protected

Page 36: NET & C#

.NET & C#.NET & C#

Le boxing / unboxingLe boxing / unboxing Conversion type valeur <-> type référenceConversion type valeur <-> type référence Boxing (type valeur -> type référence) :Boxing (type valeur -> type référence) :

une instance de type objet allouée et la valeur copiée une instance de type objet allouée et la valeur copiée dans cet objetdans cet objet

Unboxing (type référence -> type valeur) :Unboxing (type référence -> type valeur) :

. Vérifie que le type de la valeur de l’instance et le type . Vérifie que le type de la valeur de l’instance et le type du type valeur voulu correspondentdu type valeur voulu correspondent

. sort la valeur de l’instance. sort la valeur de l’instance ex : object box = 123;ex : object box = 123;

int i = (int)box;int i = (int)box;

Page 37: NET & C#

.NET & C#.NET & C#

Les propertiesLes properties extension des champs (objet.prop)extension des champs (objet.prop) Ne définit pas d’emplacement mémoireNe définit pas d’emplacement mémoire Définit des accesseurs décrivant instructions à exécuterDéfinit des accesseurs décrivant instructions à exécuter propriétés en lecture, écriture ou lecture/écriture propriétés en lecture, écriture ou lecture/écriture public class User {public class User {

private string name; private string name;

public string Name{public string Name{

set { name = value; } // ecritureset { name = value; } // ecriture

}}

}}

Page 38: NET & C#

.NET & C#.NET & C#

Les attributsLes attributs un moyen d'insérer des annotations (i.e méta-un moyen d'insérer des annotations (i.e méta-

données)données) Ex:Ex:

[Serializable]: Similaire à l'implémentation de [Serializable]: Similaire à l'implémentation de l'interface java.io.Serializable de Java.l'interface java.io.Serializable de Java.

Peut créer ses propres attributs en sous-classant Peut créer ses propres attributs en sous-classant System.AttributeSystem.Attribute

Page 39: NET & C#

.NET & C#.NET & C#

[AttributeUsage(AttributeTargets.All)][AttributeUsage(AttributeTargets.All)]public class HelpAttribute: Attribute { public class HelpAttribute: Attribute {

private string url; private string url; public HelpAttribute(string url) { this.url = url; } } public HelpAttribute(string url) { this.url = url; } }

[Help("http://www.mycompany.com/.../Class1.htm")] [Help("http://www.mycompany.com/.../Class1.htm")] public class Class1 { public class Class1 { public void F() {} } public void F() {} }

class Test { class Test { static void Main() { static void Main() { Type type = typeof(Class1);Type type = typeof(Class1);

object[] arr =object[] arr = type.GetCustomAttributes(typeof(HelpAttribute), false); type.GetCustomAttributes(typeof(HelpAttribute), false);

HelpAttribute ha = (HelpAttribute) arr[0]; HelpAttribute ha = (HelpAttribute) arr[0]; Console.WriteLine("Url = {0}", ha.Url); Console.WriteLine("Url = {0}", ha.Url); } }} }

Page 40: NET & C#

.NET & C#.NET & C#

Les indexersLes indexers Permet à un objet d’être indexéPermet à un objet d’être indexé Exemple : peut accèder aux éléments d’une Exemple : peut accèder aux éléments d’une

pile sans dépiler les élémentspile sans dépiler les éléments déclaration similaire à la déclaration d’une déclaration similaire à la déclaration d’une

propertyproperty différences :différences :

. nom de la propriété est « this » . nom de la propriété est « this »

. Paramêtre représentant l’indexe. Paramêtre représentant l’indexe ex : public object this[int index] { ex : public object this[int index] {

get { … }get { … }set { … } }set { … } }

Page 41: NET & C#

.NET & C#.NET & C#

Les déléguésLes délégués proche des pointeurs de fonction en C ou C++proche des pointeurs de fonction en C ou C++ Encapsule 1 methode ou plus : «callable entity» Encapsule 1 methode ou plus : «callable entity» Pour methode d’instance, callable entity = 1 instance et la Pour methode d’instance, callable entity = 1 instance et la

méthode à appliquer sur l’instance méthode à appliquer sur l’instance Pour methode statique, callable entity = la methodePour methode statique, callable entity = la methode L’appel à la méthode = appel au délégué auquel on fournit L’appel à la méthode = appel au délégué auquel on fournit

les bons paramêtresles bons paramêtres Déclaration, instanciation, appel:Déclaration, instanciation, appel:

delegate [type | void] delegateName ([type param]*);delegate [type | void] delegateName ([type param]*); delegateName d = new delegateName (nomFonction);delegateName d = new delegateName (nomFonction); D(param);D(param);

Page 42: NET & C#

.NET & C#.NET & C#

Unsafe codeUnsafe code

déclare des pointeurs (noté type*)déclare des pointeurs (noté type*) void* = pointeur vers un type inconnuvoid* = pointeur vers un type inconnu Du code « unsafe » doit être marqué avec le Du code « unsafe » doit être marqué avec le

mot-clé « unsafe »mot-clé « unsafe » Pointeurs ne sont pas gérés par le GCPointeurs ne sont pas gérés par le GC un pointeur peut être nullun pointeur peut être null opérateursopérateurs

& adresse d’une variable& adresse d’une variable * déréférencement* déréférencement [] indexe un pointeur[] indexe un pointeur ==, !=, <, >, <= et => pour comparer des pointeurs==, !=, <, >, <= et => pour comparer des pointeurs

Page 43: NET & C#

.NET & C#.NET & C#

Le versionningLe versionning

possibilité d'exécuter plusieurs versions différentes d'une possibilité d'exécuter plusieurs versions différentes d'une même classemême classe

les programmes C# référencent statiquement des les programmes C# référencent statiquement des bibliothèques de classes à l'aide de leur nom mais aussi bibliothèques de classes à l'aide de leur nom mais aussi de leur versionde leur version

Une nouvelle version est Une nouvelle version est source compatible : si du code qui en dépend doit être recompilé source compatible : si du code qui en dépend doit être recompilé

pour marcherpour marcher binary compatible : si du code qui en dépend marche sans rien binary compatible : si du code qui en dépend marche sans rien

avoir à faireavoir à faire

Page 44: NET & C#

.NET & C#.NET & C#

Les alternativesLes alternatives

J2EE (JOnAS, JBoss)J2EE (JOnAS, JBoss) Mono (Ximian)Mono (Ximian)

Compilateur C#Compilateur C# CLRCLR BibliothéquesBibliothéques Très actifTrès actif

DotGnu (FSF)DotGnu (FSF) Remplaçant complet de .NETRemplaçant complet de .NET Fonctionalités de HailStormFonctionalités de HailStorm Pas très actifPas très actif

Page 45: NET & C#

.NET & C#.NET & C#

Microsoft .NET vs. J2EEMicrosoft .NET vs. J2EE

Offrent les mêmes fonctionnalitésOffrent les mêmes fonctionnalités Seule ≠ de .NET : indépendant du langageSeule ≠ de .NET : indépendant du langage

+ : paradis pour dévelopeur + : paradis pour dévelopeur - : enfer pour chef de projet- : enfer pour chef de projet

La barrière Java est vite franchieLa barrière Java est vite franchie

Page 46: NET & C#

.NET & C#.NET & C#

ConclusionConclusion

Microsoft se vante de la portabilité et de Microsoft se vante de la portabilité et de l’ouverture mais :l’ouverture mais :

Si app accède à des services natifs « pour Si app accède à des services natifs « pour la performance » alors réduit à une app la performance » alors réduit à une app WindowsWindows Exemple : WinFormsExemple : WinForms

Peut faires des extensions propriètairesPeut faires des extensions propriètaires cf J++, HTML, WMP plug-in, …cf J++, HTML, WMP plug-in, …

Page 47: NET & C#

.NET & C#.NET & C#

RéférencesRéférences

http://http://arstechnicaarstechnica.com/.com/paediapaedia/n/net/net-1.html/n/net/net-1.html http://www.http://www.osnewsosnews.com/topic..com/topic.phpphp?icon=36?icon=36 http://www-http://www-adeleadele..imagimag..frfr/~/~donsezdonsez//courscours// http://http://microsoftmicrosoft.com/net.com/net http://www.http://www.linuxdeviceslinuxdevices.com/files/.com/files/miscmisc//prasadprasad

-28oct01.html-28oct01.html

Page 48: NET & C#

.NET & C#.NET & C#

RéférencesRéférences

http://www.http://www.dotnetgurudotnetguru.org/article..org/article.phpphp??sidsid=18=18 http://tutorials.beginners.co.http://tutorials.beginners.co.ukuk

/index/category/87/index/category/87 http://www.http://www.jaggersoftjaggersoft.com/.com/csharpcsharp_standard/_standard/

http://www.go-mono.com/http://www.go-mono.com/ http://http://dotgnudotgnu.org/.org/