Site:  Cours VB.net  
D 1.1 Comprendre le FrameWork; compilation, code IL, binaire.

 

Comment fonctionne un programme VB.NET ?

Le Framework.NET

Jusqu'à VB6, un programme VB avait besoin d'un RunTime (Fichier Dll: VBRUN300.DLL par exemple pour VB3)

En VB.net, pour qu'un programme fonctionne, il faut installer le Framework.NET:

C'est une plate-forme informatique, une couche entre Windows et l'application VB.

'Framework' veut dire: bibliothèque de classes.

Le Framework.Net est donc la bibliothèque de classes .NET et contient ADO.NET, ASP.NET et Windows Forms.

Cette infrastructure offre un vaste accès à :

  1. l'ensemble du système d'exploitation.
  2. une collection de Classes pour fournir des objets utilisables pour créer des programmes.
  3. des routines d'exécution de programme.

ceci de manière homogène et très fiable.

Système d'exploitation:Windows

Framework:CLR et Classes

Visual Basic

L'exécutable en Visual Basic

  1. utilise les objets (WindowsForms, Contrôles, type de variable,..)du Framework.
  2. appelle les fonctions (exécution, affichage, gestion de la mémoire, lecture dans une base de donnée..)du Framework. 

A la limite on peut considéré le Framework comme une machine virtuelle (comme celle de Java). Il suffirait de porter le FrameWork sous Linux pour que les programmes VB fonctionnent. (Info? Intox?, il existe bien le projet 'Mono' sous Linux, mais il ne contient pas les Windows Forms)

Inconvénients?

La couche supplémentaire ralentit le programme?

A peine dit Microsoft, cela serait insignifiant!  En fait cela ralentit beaucoup. Le Framework, quand il ouvre un formulaire appelle les routines  de Windows, c'est bien une couche supplémentaire.

Et s'il y a une nouvelle version du Framework?

Les versions successives devront être compatible ascendante et descendante!!

En fait, on peut installer le Framework 1 et le Framework 2

Intérêts?

On installe une seule fois le Framework.

Une fois le Framework installé, il suffit pour installer un nouveau programme de n'installer que l'exécutable.

On peut utiliser plusieurs langages.

Nous appelons les fonctions du FrameWork avec Visual Basic mais on peut aussi le faire avec C# et 30 autres langages. La vitesse d'exécution sera la même, les types de variables, les objets seront les mêmes. Plus de problèmes de transfert de paramètres.

Il est même possible de faire cohabiter plusieurs langages dans une même application.

Le code est homogène.

Plus de bidouille, de ficelle de programmation pour contourner les lacunes du langage et l'accès limité au système d'exploitation: Les milliers de Classes du FrameWork donne accès à une multitude de fonctions et aux services du système d'exploitation, cela nativement.

 

Revoyons en détails le contenu du Framework:

Le CLS  (Common Language Spécification) représente la partie visible , interface entre les langages VB, C++, C#, J# et le Framework.

 

Il contient deux composants principaux :

Il permet:

Exécution du code managé.

Gestion de la mémoire (Garbage collector)

Utilisation des objets du FrameWork

Le runtime peut être considéré comme un agent qui manage le code au moment de l'exécution, qui l'exécute, fournit des services essentiels comme la gestion de la mémoire, la gestion des threads, et l'accès distant.

Framework 1, 2, 3.

Un Framework est donc un ensemble de Classes.

Le Framework 1.0 est utilisé par VB 2003, c'est le premier.

Le Framework 2.0 est  utilisé par VB 2005

Il contient des classes supplémentaires.

Le Framework 3.0 peut être utilisé par VB 2005

Le framework 3.0 est composé du framework 2.0 auquel s'ajoute WCF (Windows Communication Foundation), WF (Windows Workflow Foundation), WPF (Windows Presentation Foundation) et infocard pour l'authentification des utilisateurs.
Windows Presentation foundation permet de gérer l' affichage des fenêtres. Celui-ci est basé sur direct x (version 10).

Le Framework 3.5 utilisé par VB2008.

C'est le Framework 3 auquel s'ajoute AJAX, LINQ et REST.

Sous Windows 98, XP, il faut installer le Framework (avant d'utiliser l'environnement VisualBasic ou un exécutable VB)

Sous Windows Vista le Framework 3 fait partie de Vista et est installé nativement.

VB 2003 utilise le Framework 1.0.

VB 2005 utilise le Framework 2.0.

VB 2008 permet de choisir et d'utiliser le Framework 1.0, 2.0, 3.0, 3.5.

 

Voici le Framework 3.5 , pour le voir en détails Microsoft le fournit en PDF.

 

Code managé:

Le code écrit pour le FrameWork est dit managé (ou géré): il bénéficie des avantages du Framework: gestion de la mémoire, optimisation de cette mémoire, règles communes, utilisation de plusieurs langages..

Les anciens composants COM sont utilisables mais non managés.

L'interopérabilité entre les codes managés et non managés permet aux développeurs de continuer à utiliser des composants COM et des DLL nécessaires.

 

Garbage Collector:

La destruction effective des objets et variables est effectuée par le 'garbage collector' (ou ramasse-miettes).

Avant .NET quand on détruisait une variable, en lui affectant Nothing, la destruction était immédiate (déterministe); si on oubliait (une application) de détruire une variable de multiple fois il y avait problème!!

Maintenant, quand on détruit une variable, elle reste présente en mémoire; c'est le garbage collector qui, quand il a le temps ou quand il n'y a plus de place, détruit la variable et fait le ménage. On ne sait pas quand il va le faire ( non déterministe).

Compilation:

Le code que vous écrivez en Visual Basic est le code source.

Lors de la génération (compilation) du projet, un code intermédiaire est produit (IL: Intermédiaire Langage), ce code est commun à tous les langages.

Lors de la première exécution d'exécutable (.exe), le code IL est compilé en binaire par le compilateur 'Just in Time' puis exécuté. Les exécutions suivantes seront plus rapides.

En résumé:

Code Source (VB, C#..) =>  Intermediate Language (IL). par le compilateur syntaxique.

IL => Binaire exécutable  par le compilateur 'Just in Time'

 

Comment voir le code source ,le code IL, le code exécutable?

Prenons un exemple: il y a dans une form1 une procédure  Button1_Click:

a-Voici le code source:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

TextBox1.Text = "hello"

End Sub

 

on génère ce code source cela donne un fichier .exe (dans le répertoite /bin)

 

b-Voir le code Intermédiaire (IL):

Avec Ildasm.exe  (désassembleur code IL) qui est dans le SDK:

(C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin)

On peut ouvrir un fichier exe  (menu 'Fichier'):

Outre le MANIFEST qui contient les méta données de l'assembly, il y a le code IL de l'application.

Si on clique sur la ligne _Button1 , on voit le code IL correspondant à la routine: (un menu de ildasm.exe permet de voir le code source en même temps)

 

c- Voir le code binaire ( en assembleur)?

Dans l'IDE (Pas dans la version Express!!), si je stoppe le fonctionnement de la routine (par un point d'arrêt), le menu 'fenêtre', 'Code machine' permet de voir l exécutable mais sous forme d'assembleur.

Le véritable code binaire est composé d'instructions  ayant chacune un code:

Voici du code exécutable représenté en hexadécimal: 55 8b ec

 

Comme c'est totalement illisible, on affiche le code binaire sous une autre forme, en langage d'assemblage ou les instructions sont représentées par des mots mnémoniques: push (pour utiliser la pile), mov (pour déplacer un octet en mémoire..), le code est plus lisible.

 

Voici le code en assembleur de notre routine:

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

00000000 push ebp

00000001 mov ebp,esp

00000003 sub esp,8

00000006 push edi

00000007 push esi

00000008 mov dword ptr [ebp-8],edx

0000000b mov esi,ecx

0000000d nop

TextBox1.Text = "hello"

0000000e mov ecx,esi

00000010 mov eax,dword ptr [ecx]

00000012 call dword ptr [eax+000005B8h]

00000018 mov edi,eax

0000001a mov edx,dword ptr ds:[020B1648h]

00000020 mov ecx,edi

00000022 mov eax,dword ptr [ecx]

00000024 call dword ptr [eax+000000E8h]

0000002a nop

End Sub

0000002b nop

0000002c pop esi

0000002d pop edi

0000002e mov esp,ebp

00000030 pop ebp

00000031 ret 4

On note que pour information et amélioration de la lisibilité, le code source est ajouté.

 

d-Voir le véritable code binaire:

(Pas dans la version Express!!)

Si je fais menu 'Déboguer', 'Fenêtre', 'Mémoire', j'ai un dump de la mémoire en hexadécimal qui montre le véritable code binaire.

 

 

Installation du Framework:

Les applications et contrôles écrits pour le .NET Framework imposent que celui-ci soit installé sur l'ordinateur où ils s'exécutent. Microsoft fournit un programme d'installation redistribuable, Dotnetfx.exe , qui contient les composants Common Language Runtime et .NET Framework nécessaire à l'exécution des applications .NET Framework.

Pour installer le FrameWork, il faut au moins:

Ou le trouver:

Dans le MSDN Download Center sur Internet:

(Bien choisir la version française car on ne peut pas installer plusieurs versions de langue différente)

Pour développer il faut ensuite installer Visual Studio.Net.

L'utilisateur final de l'exécutable installera le FrameWork  (une seule fois pour tous les programmes) et l'exécutable (grâce à l'installateur).

Ou est le Framework?

dans:

c:\Windows\Microsoft.NET\Framework\v1.1 4322\

On voit les DLL qui composent le Framework: System.dll, System.Drawing.dll..

La version 1.1 fait 73 Mo sur le disque

On peut installer à coté la version 1.0; Pourquoi installer les 2 si il y a compatibilité ascendante? c'est une question!!

Nouvelles versions:

VisualStudio 2005 utilise le Framework 2.0, bien sur il y a un SDK 2.0

VisualStudio 2008 utilise le Framework 2.0, 3.0, 3.5.