2011-09-01 10 views
8

Bueno esta pregunta puede parecer extraño, pero su simple - mi punto es que si tengo un "goto" (brtrue etc) en el código descompilada como ejemplo¿Mono.Cecil se encarga de las sucursales, etc. ubicación?

br IL_0003 
call ***** 
IL_0003: ret 

y agrego un comando después de que * * llame al br en el punto superior para ret como debería hacerlo o para ese código.

¿Cecil lo hace solo o tengo que encargarme de todas esas ramas? :/ no sería muy difícil repararlos, pero si Cecil no lo hace, simplemente no comenzaré este proyecto, no hay tiempo (o conocimiento) para la magia IL avanzada: P

PS. lo siento si estoy confundiendo cosas, pero soy un principiante en cosas de .NET;/siempre fui rechazado por lo mismo que Java o cualquier cosa que tenga una VM TBH.

* (sí sé que no será IL_0003 es sólo por ejemplo) *

Respuesta

13

Sí, Cecil se actualizará la rama para usted.

El único caso que tiene que encargarse es el caso en que la rama es una rama de forma corta. Si se inyectan demasiadas instrucciones, podría desbordarse.

Hay una manera muy simple de manejar esto. Antes de inyectar código, simplemente llamar a los métodos de extensión SimplifyMacros de los Mono.Cecil.Rocks, así:

method.Body.SimplifyMacros(); 

Esto a su vez los s ancho en ancho.

Y cuando haya terminado la inserción de código, simplemente llame a:

method.Body.OptimizeMacros(); 

Cuál es la operación inversa, es decir, que tratará de convertir en sa sa si es posible.

+0

Guau, respuesta tan rápida y del autor :) Gracias hombre u el mejor: P – n00b

Cuestiones relacionadas