web-dev-qa-db-fra.com

Comment voir MSIL/CIL généré par le compilateur C #? Pourquoi s'appelle-t-il assemblage?

Je suis nouveau dans la programmation .NET C #. Je suis quelques livres. On dit cela au lieu de le compiler directement en code binaire (code natif). Le code de haut niveau est converti en langage intermédiaire (appelé MSIL aka CIL). Mais lorsque je compile, je reçois un fichier exe/dll.

  1. Ce fichier MSIL/CIL est-il contenu dans ces fichiers exe/dll?
  2. Je veux voir ce code de langue intermédiaire. Juste pour avoir une idée de son existence. Comment le voir?
  3. Ils appellent ce fichier exe/dll une Assembly. Utilisent-ils ce "mot de fantaisie" juste pour les différencier des fichiers exe/dll contenant du code binaire (code natif)? 
110
walter
  1. Oui, plus précisément dans la section .text du fichier PE (portable exécutable = * .exe ou * .dll). Plus d'informations peuvent être trouvées ici .
  2. Le meilleur choix est d'utiliser ILSpy (le réflecteur n'est plus libre). C'est un désassembleur gratuit qui peut désassembler votre assemblage en MSIL mais également en C #, VB (dans une certaine mesure). Le Kit de développement .NET Framework SDK contient ILDasm, qui est le dissasembleur officiel de MSIL.
  3. Fondamentalement oui. Un assemblage est un fichier contenant le code MSIL et les métadonnées correspondantes. Ceci n'est pas limité aux fichiers PE en tant que tels, mais toutes les implémentations actuelles de CLR les utilisent. 

Si je peux aussi recommander un bon livre à ce sujet, il s'agit de l'assembleur Expert .NET 2.0 IL de Serge Lidin. C'est le gars qui a conçu MSIL.

82
Johannes Rudolph

Une de mes façons préférées de voir IL pour un extrait de C # est d'utiliser free outil LINQPad . Après avoir entré du code et choisi "C # statement" en haut (ou "C # Program", selon ce qui convient), cliquez sur le bouton "IL" sous la zone de saisie du code pour afficher l'IL généré.

Utiliser LINQPad pour cela est beaucoup plus pratique que de charger Visual Studio ou d'exécuter le compilateur à partir de la ligne de commande, puis de charger ILDASM et d'ouvrir le fichier .il avec un éditeur de texte.

46
Mark Rushakoff

Si vous le voulez en ligne, .NET Fiddle est excellent. Il suffit de coller votre code et de cliquer sur l'option View IL en haut à droite.

20
nawfal
  1. Oui c'est en Assemblée.
  2. Vous avez besoin de .NET Reflector ou ILDasm .
  3. Plus de détails sur le contrôle de montage ICI

P.S: Comme vous suivez des livres, je vous recommanderai vivement CLR via C # .

12
Incognito

Je crois qu’ils sont appelés "assemblées" car une assemblée est un ensemble de modules, assemblés par un manifeste.

Assemblage de plusieurs fichiers http://i.msdn.Microsoft.com/dynimg/IC125851.gif

Voir Contenu de l'assemblage pour plus de détails.

11
John Saunders

Une autre option: Utiliser ReSharper

 enter image description here Vue source/IL synchronisée: la ligne d’arrière-plan bleue gauche correspond au bloc IL droit

Dans Visual Studio: 

  • Choisissez ReSharper | Windows | Visionneuse IL
  • ou menu contextuel: Naviguer | Code IL

Prend en charge la vue synchronisée du code source et IL - Lorsque vous cliquez sur une instruction dans la source, le bloc correspondant dans IL est mis en surbrillance (et inversement). Affiche les descriptions pour IL à partir du réseau de développeurs Microsoft et "Jeu d'instructions CIL (Common Intermediate Language)" de la spécification ECMA standard.

voir Visualisation d'un langage intermédiaire (IL) dans l'aide de Resharper. L'image ci-dessus provient de l'aide de Resharper.

L'option gratuite consiste à utiliser Jetbrains dotPeek

voir aussi: "Exploring Intermediate Language (IL) avec ReSharper et dotPeek", par Maarten Balliauw, 19 janvier 2017 - Blog Jetbrains

8
Michael Brux

Je viens de passer quelques heures à rechercher le meilleur outil qui me permettrait de visualiser le code IL directement dans Visual Studio.

La seule solution que j'ai trouvée jusqu'à présent est Msiler https://visualstudiogallery.msdn.Microsoft.com/60fc53d4-e414-461b-a27c-3d5d2a53f637

ça marche plutôt bien!

Sinon, la deuxième meilleure solution, mais sans intégration Visual Studio, est JetBrains dotPeek, ce qui est assez impressionnant pour être honnête.

7
sebas

À bien des égards, les assemblys .NET sont similaires aux packages de code secondaire Java.

  1. Oui. Ils contiennent également des manifestes et d'autres données, mais le CIL fait partie de l'exe/dll.
  2. Utilisez ILDasm ou Reflector - La plupart des gens diraient Reflector, car il est beaucoup plus puissant. Les deux vont vous montrer ce que CIL a été produit. Wikipedia a une liste de toutes les instructions CIL , pour une meilleure impression (c'est comme une assemblée).
  3. Je suppose que c'est conçu comme une assemblée de code. Un bon moyen de le différencier des natifs.
7
Oded

Je sais que c'est une vieille question et je préférerais l'un des outils ci-dessus. Cependant, à la rigueur, un visualiseur MSIL est présent dans la boîte avec Visual Studio depuis au moins la version 2005.

L'outil s'appelle ildasm.exe et se trouve dans les dossiers suivants après les installations Visual Studio par défaut:

Visual Studio 2005 "C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\ildasm.exe"

Visual Studio 2008 "C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\ildasm.exe"

Visual Studio 2010 "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\ildasm.exe"

Pour plus d'informations, voir: " Comment: afficher le contenu de l'assembly " dans la bibliothèque MSDN.

5
Eric Burcham

 Sharplab sharplab est un outil en ligne idéal pour les cas d'utilisation simples. Tapez votre code à gauche, IL apparaît à droite. 

2
Colin

Si vous souhaitez afficher la langue intermédiaire, essayez de télécharger JustDecompile de Telerik (qui est gratuit actuellement, mais nécessite une inscription).

Faites glisser votre DLL et choisissez IL dans la liste déroulante située en haut!

2
Luke

D'après mon expérience, Andrew Troelsen «Pro C # and .NET Platform» constitue la meilleure source de connaissances en matière de maîtrise de l'information. Depuis la 3ème édition, il a un chapitre vraiment remarquable (environ 50 pages) sur la compréhension de l’IL et même sur l’écriture de votre propre code et l’utilisation de ILAsm. J’ai utilisé ces informations pour déterminer s’il existe un héritage multiple dans le monde .NET. Vous pouvez également essayer d’utiliser certaines fonctionnalités très intéressantes dans IL (par exemple, le filtrage des exceptions qui existent uniquement dans VB mais pas dans C #). 

Je recommande fortement de lire ce chapitre.

Finalement, .NET Reflector est un standard d’entreprise permettant d’enquêter sur le code des assemblys IL et le livre de Richter est sans aucun doute un article "à lire absolument". Mais à partir d'autres livres comme mentionné ci-dessus, vous pourriez révéler des choses vraiment utiles :)

Oui, chaque assemblage du monde .NET contient du code IL (le long du site avec le manifeste) pouvant être visualisé via Reflector ou ILDasm. Encore plus, Reflector pourrait vous montrer du code optimisé en C # et VB. Cela signifie que toute personne peut consulter le code source d'un assemblage, raison pour laquelle des obfuscateurs sont utilisés dans les produits commerciaux.

2
xenn_33

Il y a maintenant une autre option. Vous pouvez le faire dans Code VS avec cette extension construite avec Roslyn. Ceci est actuellement limité à .NET Core .

0
Adam Caviness