.net - language - que es microsoft net framework
Cómo aprender IL en el CLR (4)
Hay algunos libros que cubren IL:
- Dentro de Microsoft .NET IL Assembler
- Expert .NET 2.0 IL Assembler
- Compilación para .NET Common Language Runtime (CLR)
- Siéntase libre de editar esta respuesta y agregar algunos libros.
También algunos libros sobre ingeniería inversa tienen secciones sobre IL.
Ver también:
Dado que estos códigos IL son lo que veo más, me gusta aprender a interpretarlos correctamente.
No pude encontrar una documentación como C # Compiler o ninguna otra, así que creo que puedo encargarme del resto después de aprender esto:
A continuación hay algunos ejemplos de códigos IL que contienen lo que necesito saber:
Muestra 1:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 15 (0xf)
.maxstack 1
.locals init ([0] class EnumReflection.DerivedClass derivedClass)
IL_0000: nop
IL_0001: newobj instance void EnumReflection.DerivedClass::.ctor()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: callvirt instance void EnumReflection.DerivedClass::WriteOutput()
IL_000d: nop
IL_000e: ret
} // end of method Program::Main
Muestra 2:
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 38 (0x26)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldstr "Hello"
IL_0006: stfld string EnumReflection.DerivedClass::hello
IL_000b: ldarg.0
IL_000c: ldstr "World"
IL_0011: stfld string EnumReflection.DerivedClass::world
IL_0016: ldarg.0
IL_0017: ldc.i4.s 123
IL_0019: stfld int32 EnumReflection.DerivedClass::age
IL_001e: ldarg.0
IL_001f: call instance void EnumReflection.BaseClass::.ctor()
IL_0024: nop
IL_0025: ret
} // end of method DerivedClass::.ctor
Sé lo que hacen estos códigos desde que los produje :-) sin embargo, me gustaría aprender más sobre el código IL correspondiente.
Estas muestras contienen códigos IL y , ¿ podría explicar el comando con signos de interrogación? ¿Y también qué significan esos mandatos? Para que podamos memorizarlos fácilmente.
- nop (para depuración - sin operación)
- newobj (parece que está creando un nuevo objeto en el montón)
- stloc.0?
- ldloc.0?
- ret?
- ldarg.0?
- ldstr?
- stfld?
- ldc.i4.s?
- .ctor - constructor
Comprender IL es importante ya que expone cómo un compilador en particular produce códigos y actúa en casos específicos.
Sin embargo, no pude encontrar una buena documentación que contenga ejemplos también sobre IL. CLR con C # 3.0 es un buen libro, sin embargo, eventualmente no es un libro de IL por lo que no explica todo acerca de IL.
EDITAR:
He encontrado las especificaciones y me dicen esto: Gracias a @usr.
- nop (para depuración - sin operación)
- newobj - crea un nuevo objeto
- stloc.0 - valor pop de pila a variable local
- ldloc.0? - cargar la variable local en la pila
- ret - retorno del método
- ldarg.0 - Carga el argumento 0 en la pila.
- ldstr - carga una cadena literal
- stfld - almacenar en un campo de un objeto
- ldc.i4.s: presione num en la pila como int32, forma corta.
- .ctor - constructor
Si desea una breve sinopsis de cada código de operación, podría hacerlo peor que inspeccionar el System.Reflection.Emit
nombres System.Reflection.Emit
.
Por ejemplo, hay una clase de OpCodes
que tiene un campo estático para cada opcode. Cada uno de estos se describe con más detalle, en términos de su comportamiento de pila. Por ejemplo, Ldarg_0
:
La instrucción ldarg.0 empuja el argumento indexado en 0 en la pila de evaluación. La instrucción ldarg.0 se puede usar para cargar un tipo de valor o un valor primitivo en la pila al copiarlo de un argumento entrante.
Microsoft estandarizó el CLR y publicó esos estándares . La partición III contiene una gran cantidad de información sobre IL / CIL y es adecuada para el aprendizaje. Es un excelente documento.
También puedes aprender IL por ejemplo. Compile algunos métodos simples en C # y observe el IL en el reflector (tiene un modo IL).
- nop - no-op
- newobj - crea un objeto y llama a su constructor.
- stloc.0: saca un valor de la pila y lo almacena en la primera variable local
- ldloc.0 - Empuja la primera variable local en la pila
- ret - retorno
- ldarg.0 - Empuja el primer argumento (
this
en los métodos de instancia) en la pila - ldstr - Empuja una cuerda en la pila
- stfld - establece el campo, usando datos en la pila.
- ldc.i4.s - Presiona el número especificado como un int.
- .ctor - constructor
Le recomiendo que encuentre una buena fuente de documentación sobre estos códigos de operación (Wikipedia puede ser la mejor, sin embargo :(). La documentación de System.Reflection.Emit tiene documentación bastante detallada para los códigos de operación.
Y, sobre todo, construya pequeños programas y examine la salida de IL. Esa es la mejor manera de aprender.