Usted puede obtener razonablemente lejos sólo el uso de la matriz de bytes de GetILAsByteArray
método, pero' Necesitaré escribir el análisis de los bytes usted mismo (si no quiere confiar en la biblioteca de terceros).
La estructura de la matriz es que hay uno o dos bytes que identifican la instrucción seguida de operandos para la instrucción (que no es nada, un token de 4 bytes o un número de 8 bytes).
Para obtener los códigos, puede consultar la estructura OpCodes
(MSDN) desde System.Reflection.Emit
. Si enumerar sobre todos los campos, se puede construir fácilmente una tabla de consulta para la lectura de los bytes:
// Iterate over all byte codes to build lookup table
for fld in typeof<OpCodes>.GetFields() do
let code = fld.GetValue(null) :?> OpCode
printfn "%A (%d + %A)" code.Name code.Size code.OperandType
La propiedad code.Value
le da eithre byte
o int16
valor del código. La propiedad code.Size
le dice si este es el código de 1 o 2 bytes y la propiedad OperandType
especifica qué argumentos siguen al código (el número de bytes y el significado es explained on MSDN). No recuerdo cómo exactamente necesita procesar elementos como tokens que se refieren a, por ejemplo, MethodInfo
, pero creo que podrá descifrarlo.
Como @JohnPalmer sugiere en su respuesta, [Mono.Cecil] (http://www.mono-project.com/Cecil) es una buena opción para esto. [Aquí] (http://plaureano.blogspot.com/2011/05/introduction-to-il-rewriting-with-cecil.html) es un buen blog sobre la reescritura de IL que podría ser útil. –