Common Intermediate Language
Dans l'environnement de programmation Microsoft, le Common Intermediate Language (CIL) est le langage de programmation de plus bas niveau qui peut être lu par un humain. Le code de plus haut niveau dans l'environnement .NET Framework est compilé en code CIL qui est assemblé dans un code dit bytecode. CIL est un code assembleur orienté objet et pile. Il est exécuté par une machine virtuelle.
La CLI est initialement connu sous le nom de Microsoft Intermediate Language ou MSIL durant les béta du langage .NET. Après la standarisation du C# et de la CLI, le bytecode est officiellement connu sous le nom de CIL. Ce fait explique pourquoi les utilisateurs précoces de la technologie continue à se référer au terme MSIL.
Compilateur JIT/NGEN
Durant la compilation .NET, le code source est transformé en un code CIL portable indépendant d'une plateforme ou d'un processeur appelé bytecode.
Ce bytecode est compilé par la CLR/DLR en temps réel pour obtenir un code immédiatement excécutable par le processeur. Durant la compilation,le compilateur (JIT) effectue un grand nombre de taches pour éviter des accès illégales à la mémoire.
- optimisation spécifique à la plateforme
- sécurisation des types
- vérification des assembly
Cette compilation peut aussi se faire sans le code CIL en utilisant un générateur natif d'image (NGEN). Cet outil a pour but de supprimer le temps d'attente du à la compilation qui à lieu au niveau de la CLR et DLR .
.NET metadata
.NET enregistre les informations à propos des classes compilées dans un fichier de nom metadata. Ces données agissent comme la bibliothèque Component Object Model qui permettent aux applications compatibles de découvrir les interfaces, les classes, les types , les méthodes présentes dans le code assembleur. Le processus de lecture de ses données est appelé réflection. Ces données peuvent être lu en utilisant l'outil ILDASM fourni avec le SDK .NET Framework.
Toute la CIL est autodescriptive. Ceci est réalisé à l'aide des Métadonnées .NET. La CLR vérifie les métadonnées pour s'assurer que la bonne méthode est appelée. Les métadonnées sont généralement générées par les compilateurs des langages, mais les développeurs peuvent aussi créer leurs propres métadonnées via l'utilisation d'attributs personnalisés. Les métadonnées contiennent aussi des informations à propos des assemblys et sont aussi utilisées pour implémenter la capacité de réflexion du .NET Framework.
.NET assemblies
Le code CIL est hébergé par les assemblage .NET (ou assembly). Les assembly .NET sont enregistrés au format executable portable (PE) courant sur la plate-forme Windows pour tous les fichiers DLL ou EXE. Les assembly sont constituées d'un ou plusieurs fichiers et un d'entre eux doit contenir un document appelé manifest. Le manifest[1] contient les metadata de l'assemblage. Le nom complet d'une assembly, (à ne pas confondre avec le nom du fichier sur le disque) contient son nom simple, son numéro de version, sa culture et sa clé publique. La clé publique est unique et est générée à partir du hachage de l'assembly après sa compilation. Par conséquent, deux assembly avec la même clé publique sont garanties d'être identiques. Une clé privé peut aussi être spécifiée. Elle est uniquement connue du créateur de l'assembly et peut être utilisée pour le nommage fort de l'assembly. Ceci permet de garantir que l'assembly est du même auteur lors de la compilation d'une nouvelle version.
Le code assemblies dans .NET est un code CIL qui a pour fonction de gérer les problèmes de version, de sécurité et d'internationalisation.Il existe sous deux formes: exe ( process assemblies) et DLL ( library assemblies). Lors de la compilation ; le choix du format final du fichier contenant le code source ne dépend pas de l'extension du fichier mais d'information stockée dans un fichier de nom PE ( Portable executable). Ce fait explique que dans un même répertoire un fichier de même nom ayant des extensions différentes ne peuvent par défaut exister. Ce problème a été résolu par l'utilisation d'une clé publique /privé pour signé une dll ou exe et par l'introduction par .NET du GAC.