¿Cómo puedo ver MSIL / CIL generado por el compilador de C #? ¿Por qué se llama asamblea?

130

Soy nuevo en la programación .NET C #. Estoy siguiendo algunos libros. Se dice que en lugar de compilarlo directamente en código binario (código nativo). El código de alto nivel se convierte en lenguaje intermedio (llamado MSIL, también conocido como CIL). Pero cuando compilo, obtengo un archivo exe / Dll.

  1. ¿Este MSIL / CIL está contenido en estos archivos exe / dll?
  2. Quiero ver ese código de idioma intermedio. Solo para sentir su existencia. ¿Cómo verlo?
  3. Están llamando a este archivo exe / dll un assembly. ¿Están usando esta "palabra elegante" solo para diferenciarlos de los archivos exe / dll que contienen código binario (código nativo)?
starblue
fuente

Respuestas:

95
  1. Sí, más exactamente en la .textsección del archivo PE (ejecutable portable = * .exe o * .dll). Más información se puede encontrar aquí .
  2. La mejor opción es usar ILSpy (Reflector ya no es gratuito). Es un desensamblador gratuito que puede desmontar su ensamblaje en MSIL pero también C #, VB (hasta cierto punto). .NET Framework SDK contiene ILDasm, que es el desensamblador oficial de MSIL.
  3. Básicamente sí. Un ensamblado es un archivo que contiene código MSIL y los metadatos correspondientes. Esto no está restringido a los archivos PE per se, pero todas las implementaciones actuales de CLR los usan.

Si puedo recomendar un buen libro sobre ese tema también, es Expert .NET 2.0 IL Assembler de Serge Lidin. Es el tipo que diseñó MSIL.

Johannes Rudolph
fuente
¡Espere! ¿No se encuentra en .textsexción? Si no, ¿qué .textcontiene? y qué pasa con las #secciones que pensé que se nombran comenzando con .. Así que no debería ser.strings
Tengo curiosidad, ¿por qué no se recomienda ILDasm ? ¿Se incluye solo con (algunas versiones de) Visual Studio?
Sinjai
2
Ambos tienen su lugar, pero para la mayoría de los usuarios (> 99.99%), ILSpy es la opción correcta. Su capacidad para descompilar el código IL de nuevo en C # es invaluable para navegar rápidamente y realizar ingeniería inversa en ensamblajes. Si está haciendo algo que emite IL sin procesar (por ejemplo, está escribiendo un compilador o reescribiendo IL de ensamblaje, por ejemplo, con Mono.Cecil), entonces ILDasm es útil porque puede mostrarle la estructura sin procesar de IL, tablas de tokens, etc. , la mayoría de los expertos que no son de IL se confundirán con ellos, por lo que ILSpy es probablemente todo lo que desea y necesita.
Johannes Rudolph
3
¡Guau, respuesta rápida 7 años después! No me he metido mucho con IL, o he comparado todas las opciones (por eso pregunto en primer lugar), pero ¿LINQPad no tiene esta función de descompilación?
Sinjai
Lo instalé en VS 2017, no sucede nada cuando hago clic en ver el código en ILSPY.
Anirudha Gupta
46

Una de mis formas favoritas de ver IL para un fragmento de C # es usar la herramienta gratuita LINQPad . Después de ingresar un código y elegir "declaraciones C #" en la parte superior (o "Programa C #", según corresponda), haga clic en el botón "IL" debajo del área de entrada del código y verá el IL generado.

Usar LINQPad para esto es mucho más conveniente que cargar Visual Studio o ejecutar el compilador desde la línea de comandos, luego cargar ILDASM y abrir el archivo .il con un editor de texto.

Mark Rushakoff
fuente
Otra buena herramienta es el complemento Snippy para Reflector: jasonhaley.com/blog/post/2008/11/23/ReflectorSnippy-Addin.aspx
Thomas Levesque
¡Buena esa! He votado a favor pero es un poco más complicado si tienes que incluir clases personalizadas. Aún así, ¡realmente me gusta este!
Andrew Steitz
28

Si lo quieres en línea, .NET Fiddle es excelente. Simplemente pegue su código y haga clic View ILen la opción en la esquina superior derecha.

nawfal
fuente
2
Parece estar roto ahora.
Luke Maurer
@nawfal también rompió aquí. Yo solía usarlo.
aloisdg se muda a codidact.com
Sin embargo, hay otra solución en línea: sharplab.io . Consulte esta respuesta para obtener más información: stackoverflow.com/a/51457583/1248177
aloisdg se muda a codidact.com el
No estoy seguro de cuál es el problema, funciona bien para mí .. @ aloisdgmovingtocodidact.com. Dicho eso, sharplab.io parece elegante, gracias por señalar :)
nawfal
16

Otra opción: usar ReSharper

ingrese la descripción de la imagen aquí Vista sincronizada de origen / IL: la línea de fondo azul izquierda corresponde con el bloque IL derecho

En Visual Studio:

  • Elija ReSharper | Ventanas | IL Viewer
  • o Menú contextual: Navegar | Código IL

Admite la vista sincronizada del código fuente y la IL: cuando hace clic en una instrucción en la fuente, se resalta el bloque correspondiente en IL (y viceversa). Muestra descripciones para IL de Microsoft Developer Network y "Conjunto de instrucciones de lenguaje intermedio común (CIL)" de la especificación estándar de ECMA.

vea Ver lenguaje intermedio (IL) en la Ayuda de Resharper. La imagen de arriba es de la Ayuda de Resharper.

La opción gratuita es usar Jetbrains dotPeek

ver también: "Explorando el lenguaje intermedio (IL) con ReSharper y dotPeek", por Maarten Balliauw, 19 de enero de 2017 - Jetbrains Blog

Michael Brux
fuente
Votó por error su respuesta.
Edítelo
IL Viewer en ReSharper es genial. Si pasa el mouse sobre la sintaxis IL, muestra información sobre herramientas bastante descriptiva que explica qué está haciendo cada palabra clave. ¡Excelente para las personas que son nuevas en IL!
InvalidBrainException hace
11

Creo que se llaman "ensamblajes" porque un ensamblaje es un conjunto de módulos, ensamblados por un manifiesto.

ensamblaje de archivos múltiples
(fuente: microsoft.com )

Vea el contenido del ensamblaje para más detalles.

John Saunders
fuente
9

Sharplab Sharplab es una herramienta en línea, ideal para casos de uso simples. Escriba su código a la izquierda, IL aparece a la derecha.

Colin
fuente
La mejor herramienta jamás +1
Emad
7

En muchos aspectos, los ensamblados .NET son similares a los paquetes de bytecode de Java.

  1. Si. También contienen manifiestos y otros datos, pero el CIL es parte del exe / dll.
  2. Use ILDasm o Reflector : la mayoría de la gente diría Reflector, ya que es mucho más poderoso. Ambos le mostrarán qué CIL se produjo. Wikipedia tiene una lista de todas las instrucciones CIL , para una mejor sensación (es como un ensamblaje).
  3. Supongo que se entiende como un conjunto de código. Una buena manera de diferenciarlo del nativo.
Oded
fuente
7

Acabo de pasar un par de horas buscando la mejor herramienta que me permita ver el código IL directamente dentro de Visual Studio.

La única solución que encontré hasta ahora es Msiler https://visualstudiogallery.msdn.microsoft.com/60fc53d4-e414-461b-a27c-3d5d2a53f637

funciona bastante bien!

De lo contrario, la segunda mejor solución, pero sin la integración de Visual Studio, es JetBrains dotPeek, que es bastante sorprendente para ser sincero.

sebas
fuente
5

Sé que esta es una vieja pregunta, y preferiría cualquiera de las herramientas anteriores. Sin embargo, en un apuro, ha habido un visor MSIL en el cuadro con Visual Studio desde al menos la Versión 2005.

La herramienta se llama ildasm.exe y se encuentra en las siguientes carpetas después de las instalaciones predeterminadas 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"

Para obtener más información, consulte: " Cómo: Ver el contenido del ensamblaje " en la Biblioteca MSDN.

bopapa_1979
fuente
2

Desde mi experiencia, la mejor fuente de conocimiento relacionado con IL es Andrew Troelsen "Pro C # and .NET Platform". A partir de la 3ª edición, tiene un capítulo realmente excepcional (aproximadamente 50 páginas) sobre cómo entender IL e incluso escribir su propio código y usar ILAsm. He empleado esa información para investigar si existe una herencia múltiple en el mundo .NET. También podría intentar emplear algunas características muy interesantes en IL (por ejemplo, el filtrado de excepciones que solo existe en VB pero no en C #).

Recomiendo leer ese capítulo.

Finalmente, .NET Reflector es un estándar empresarial para investigar el código IL de ensamblajes y el libro de Richter es definitivamente "debe leer" cosas. Pero de otros libros como los mencionados anteriormente, podrías revelar cosas realmente útiles :)

Sí, cada ensamblaje en el mundo .NET contiene un código IL (junto con el manifiesto) que se puede ver a través de Reflector o ILDasm. Aún más, Reflector podría mostrarle código optimizado C # y VB. Esto significa que cualquier persona podría ver el código fuente de un ensamblaje y es por eso que en los productos comerciales se utilizan ofuscadores.

xenn_33
fuente
2

Si desea ver el idioma intermedio, intente descargar JustDecompile de Telerik (que actualmente es gratuito, aunque requiere registrarse).

Arrastra tu DLL y elige ILdel cuadro desplegable en la parte superior.

Luke
fuente