2010-09-08 10 views
9

He pasado horas en un problema de depuración solo para que un tipo más experimentado mire la IL (algo así como 00400089 mov dword ptr [ebp-8], edx) y señale el problema. Honestamente, esto me parece hebreo, no tengo idea de qué diablos está diciendo.¿Cómo convertirse en MSIL pro?

¿Dónde puedo obtener más información acerca de esto e impresionar a todos los que me rodean? Mi objetivo es leer cosas como las siguientes y hacer un comentario como: Sí, estás teniendo una condición de carrera.

.maxstack 2 
.entrypoint 
.locals init (valuetype [MathLib]HangamaHouse.MathClass mclass) 

ldloca mclass 
ldc.i4 5 
+5

Haha, "¿Dónde puedo obtener más información sobre estas cosas e impresionar a todos los que me rodean". Esas son dos * preguntas completamente * diferentes, mi amigo;) A menos que salgas exclusivamente con nerds (como yo), supongo ... –

Respuesta

4

Para ser bueno en IL, comience con este fantástico artículo: Introduction to IL Assembly Language. Aunque dice "introducción", es todo lo que necesita para comenzar a sentirse cómodo.

La otra parte de lo que necesita es práctica y mucha. Use .NET Reflector y comience a ver el código desmontado en IL. (Sugerencia: cuando vaya a descargarlo, no tiene que proporcionar un correo electrónico real.) Además, juegue con el complemento Reflexil en Reflector. Aquí hay un buen punto de partida para eso: Assembly Manipulation and C#/VB.NET Code Injection.

No es necesario, pero una ventaja: Reflexil es de código abierto. Puede obtener la fuente here.

7

Eso no es MSIL, es assembly langauge 80x86.

+3

No es de extrañar que no supiera lo que está pasando. – RonT

+5

Después de haber trabajado en ensamblaje durante varios años, hace muchos años, más recientemente en una rutina criptográfica AES, puedo decirle que no debe intentar diluir sus esfuerzos aprendiendo C# intentando esforzarse en ensamblador. Si su código original estaba en C#, debería haber sido capaz de detectar una condición de carrera en el código original. – Bill

3

Puedo darle una respuesta que se ejecuta en ambos sentidos.

Por un lado, no hay nada como las buenas habilidades de lenguaje ensamblador para enseñarle cómo funciona realmente una computadora. MSIL es, hasta cierto punto, un lenguaje de ensamblaje. En el lado negativo, hay muy pocas oportunidades para hacer este tipo de desarrollo.

Por otro lado, recurrir a mirar el MSIL para solucionar un problema no es necesariamente la manera más directa o educativa de comprender un problema. En cinco años de programación de .NET, nunca sentí la necesidad de ir allí. Solo una vez un compañero de trabajo (que había trabajado en Microsoft en pruebas de compilación) se fue con un problema que yo estaba tratando de resolver, y al final, su respuesta fue engañosa, porque el problema real se basaba en el diseño y las limitaciones de CLR. . Un mejor conocimiento del CLR y C# habría llevado a una mejor comprensión y una solución real.

(En caso de que se lo pregunte, el problema era que quería usar "como" para el casting seguro con un genérico. "Como" no funcionó, pero "es". Mi compañero de trabajo notó que "es" y "como" usan el mismo MSIL. El problema real es que "como" solo funciona para las clases de conversión, y sin la restricción adecuada en la declaración genérica, C# no sabe si su tipo genérico será una clase. De hecho, los tipos que usaba con genéricos eran tipos de valor; "como" no podía funcionar para nada.)

En lugar de ir por las habilidades de MSIL, recomiendo el libro de Jeffrey Richter CLR via C#. Incluso después de años de excavar difícil en C#, este libro todavía está lleno de revelaciones. Aprendo algo de cada página.

+0

La razón por la que 'as' no funciona con los tipos de valores es porque los tipos de valores no pueden ser' nulos', pero 'como' quiere devolver' null' si la variable no es del tipo proporcionado. Si sabe que su parámetro de tipo genérico 'T' es un tipo de valor (es decir, ha especificado la restricción' struct'), puede usar 'como T?' En lugar de 'como T' y funcionará incluso si la instancia es en realidad de tipo 'T' y no' T? '. Sin embargo, este es un problema puramente de lenguaje C# y tiene poco que ver con IL o el CLR ... – Timwi

+0

@Timwi, exactamente correcto; "como" no puede devolver un valor nulo en un tipo de valor, y esto tiene ** absolutamente nada que ver con IL. Ese es el punto; aprender IL no te ayuda a resolver casos como este. Ya sea que se trate de un problema puramente lingüístico o que implique la implementación CLR de genéricos, no podría decirlo, pero notaré que el manejo de VB.NET de la transmisión (a través de DirectCast o TryCast) tiene el mismo problema. –

3

No se puede decir que soy un IL “pro”, pero me las arreglé para enseñar a mí mismo más o menos todo de IL haciendo lo siguiente:

  • Escribir un tiempo muy corto (línea de dos o tres) Programa C# que le interesa saber cómo escribir en IL.

  • Compile el programa.

  • Abra el EXE compilado en .NET Reflector.

  • mirar el código IL para el método en el reflector.

  • Pase el mouse sobre un código de operación IL (por ejemplo, "ldloc"). Hay una información sobre herramientas que describe cada instrucción IL.