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

130

Je suis nouveau dans la programmation .NET C #. Je suis quelques livres. On dit qu'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 quand je compile, j'obtiens un fichier exe / dll.

  1. Ce 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 visualiser?
  3. Ils appellent ce fichier exe / dll un assembly. Utilisent-ils ce "mot de fantaisie" juste pour les différencier des fichiers exe / dll qui contiennent du code binaire (code natif)?
starblue
la source

Réponses:

95
  1. Oui, plus exactement dans la .textsection du fichier PE (exécutable portable = * .exe ou * .dll). Plus d'informations peuvent être trouvées ici .
  2. Le meilleur choix est d'utiliser ILSpy (Reflector n'est plus gratuit). C'est un désassembleur gratuit qui peut démonter votre assemblage en MSIL mais aussi en C #, VB (dans une certaine mesure). Le SDK .NET Framework contient ILDasm, qui est le dissasembleur officiel de MSIL.
  3. Fondamentalement oui. Un assembly est un fichier qui contient le code MSIL et les métadonnées correspondantes. Cela n'est pas limité aux fichiers PE en soi, mais toutes les implémentations CLR actuelles les utilisent.

Si je peux recommander un bon livre sur ce sujet aussi, c'est Expert .NET 2.0 IL Assembler de Serge Lidin. C'est lui qui a conçu MSIL.

Johannes Rudolph
la source
Attendre! Il n'est pas situé dans le .textsextion? Sinon, que .textcontient-il? et ce qui se passe avec les #sections que je pensais sont nommées en commençant par .. Alors ça ne devrait pas être.strings
Je suis curieux de savoir pourquoi ILDasm n'est pas recommandé? Est-il uniquement inclus avec (certaines versions de?) Visual Studio?
Sinjai
2
Les deux ont leur place, mais pour la plupart des utilisateurs (> 99,99%), ILSpy est le bon choix. Sa capacité à décompiler le code IL en C # est inestimable pour la navigation rapide et la rétro-ingénierie des assemblages. Si vous faites quelque chose qui émet de l'IL brut (par exemple, vous écrivez un compilateur ou réécrivez un assemblage IL, par exemple avec Mono.Cecil), ILDasm est utile car il peut vous montrer la structure brute de l'IL, les tables de jetons, etc. , la plupart des experts non-IL seront déroutés par ceux-ci, donc ILSpy est probablement tout ce que vous voulez et dont vous avez besoin.
Johannes Rudolph
3
Wow, réponse rapide 7 ans plus tard! Je n'ai pas beaucoup joué avec IL, ni comparé toutes les options (c'est pourquoi je demande en premier lieu), mais LINQPad n'a-t-il pas cette fonction de décompilation?
Sinjai
Je l'ai installé dans VS 2017, rien ne se passe lorsque je clique sur voir le code dans ILSPY.
Anirudha Gupta
46

L'une de mes façons préférées de voir IL pour un extrait de C # est d'utiliser l' outil gratuit LINQPad . Après avoir entré du code et choisi "Instructions C #" en haut (ou "Programme C #", selon ce qui convient), cliquez sur le bouton "IL" sous la zone de saisie du code, et vous verrez 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.

Mark Rushakoff
la source
Un autre bon outil est le complément Snippy pour Reflector: jasonhaley.com/blog/post/2008/11/23/ReflectorSnippy-Addin.aspx
Thomas Levesque
Joli! J'ai voté à la hausse, mais c'est un peu plus compliqué si vous devez inclure des classes personnalisées. Pourtant, j'aime vraiment celui-ci!
Andrew Steitz
28

Si vous le souhaitez en ligne, .NET Fiddle est excellent. Collez simplement votre code et cliquez sur l' View ILoption en haut à droite.

nawfal
la source
2
Semble être cassé maintenant.
Luke Maurer le
@nawfal s'est cassé ici aussi. J'avais l'habitude de l'utiliser.
aloisdg passe à codidact.com
Il existe cependant une autre solution en ligne: sharplab.io . Consultez cette réponse pour plus d'informations: stackoverflow.com/a/51457583/1248177
aloisdg se déplaçant vers codidact.com
Je ne sais pas quel est le problème, cela fonctionne bien pour moi .. @ aloisdgmovingtocodidact.com. Cela dit sharplab.io a l'air élégant, merci de l'avoir souligné :)
nawfal
16

Une autre option: utiliser ReSharper

entrez la description de l'image ici Vue synchronisée Source / IL: 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 de l'IL - lorsque vous cliquez sur une instruction dans la source, le bloc correspondant dans l'IL est mis en surbrillance (et vice versa). Affiche des descriptions pour IL de Microsoft Developer Network et «jeu d'instructions Common Intermediate Language (CIL)» de la spécification standard ECMA.

voir Affichage du 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 - Jetbrains Blog

Michael Brux
la source
Par erreur, a voté contre votre réponse. Modifiez-le pour que je puisse voter pour
Rudresha Parameshappa
IL Viewer dans ReSharper est génial. Si vous passez la souris sur la syntaxe IL, elle affiche des info-bulles plutôt descriptives qui expliquent ce que fait chaque mot-clé. Idéal pour les nouveaux arrivants dans IL!
InvalidBrainException le
12
  1. Oui c'est en montage.
  2. Vous avez besoin de .NET Reflector ou ILDasm .
  3. Plus de détails sur le contrôle de montage ICI .

PS Comme vous suivez certains livres, je vous recommande fortement CLR via C # .

Incognito
la source
11

Je crois qu'ils sont appelés «assemblages» car un assemblage est un ensemble de modules, assemblés par un manifeste.

assemblage multi-fichiers
(source: microsoft.com )

Voir le contenu de l'assemblage pour plus de détails.

John Saunders
la source
9

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

Colin
la source
Le meilleur outil de tous les temps +1
Emad
7

À bien des égards, les assemblys .NET sont similaires aux packages de bytecode 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 vous montreront ce que CIL a été produit. Wikipedia a une liste de toutes les instructions CIL , pour une meilleure sensation (c'est comme un assemblage).
  3. Je suppose que c'est un assemblage de code. Un bon moyen de le différencier du natif.
Oded
la source
7

Je viens de passer quelques heures à rechercher le meilleur outil qui pourrait me permettre d'afficher 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 de studio visuel, est JetBrains dotPeek, ce qui est assez génial pour être honnête.

sebas
la source
5

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

L'outil est nommé ildasm.exeet se trouve dans les dossiers suivants après les installations par défaut de Visual Studio:

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, consultez: « Comment: afficher le contenu de l'assembly» dans la bibliothèque MSDN.

bopapa_1979
la source
2

D'après mon expérience, la meilleure source de connaissances liées à l'IL est Andrew Troelsen «Pro C # and .NET Platform». À partir de la 3e édition, il a un chapitre vraiment, vraiment exceptionnel (environ 50 pages) sur la façon de comprendre IL et même d'écrire votre propre code et d'utiliser ILAsm. J'ai utilisé ces informations pour déterminer si l'héritage multiple existe dans le monde .NET. Vous pouvez également essayer d'utiliser des fonctionnalités très intéressantes en IL (par exemple le filtrage des exceptions qui n'existe qu'en VB mais pas en C #).

Je recommande vivement de lire ce chapitre.

Finalement, .NET Reflector est une norme d'entreprise pour enquêter sur le code IL des assemblys et le livre de Richter est définitivement "à lire". Mais à partir d'autres livres comme mentionnés ci-dessus, vous pourriez révéler des choses vraiment utiles :)

Oui, chaque assembly dans le monde .NET contient du code IL (avec le site avec le manifeste) qui peut être affiché via Reflector ou ILDasm. Encore plus, Reflector pourrait vous montrer du code optimisé C # et VB. Cela signifie que n'importe qui peut voir le code source d'un assemblage et c'est pourquoi, dans les produits commerciaux, des obfuscators sont utilisés.

xenn_33
la source
2

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

Faites glisser votre DLL et choisissez ILdans la liste déroulante en haut!

Luke
la source