È possibile ottenere ragionevolmente lontano usando solo l'array di byte da GetILAsByteArray
metodo, ma si' Dovrai scrivere da solo l'analisi dei byte (se non vuoi fare affidamento sulla libreria di terze parti).
La struttura della matrice è che ci sono uno o due byte che identificano l'istruzione seguita da operandi per l'istruzione (che è o nulla, qualche token a 4 byte o un numero di 8 byte).
Per ottenere i codici, è possibile esaminare la struttura OpCodes
(MSDN) da System.Reflection.Emit
. Se si enumerano su tutti i campi, si può facilmente costruire una tabella di ricerca per la lettura dei byte:
// 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 proprietà code.Value
dà eithre byte
o int16
valore del codice. La proprietà code.Size
indica se si tratta di codice a 1 o 2 byte e la proprietà OperandType
specifica quali argomenti seguono il codice (il numero di byte e il significato è explained on MSDN). Non ricordo esattamente come è necessario elaborare cose come i token che fanno riferimento a MethodInfo
, ma immagino che riuscirai a capirlo!
fonte
2012-02-12 23:43:03
Come suggerisce @JohnPalmer nella sua risposta, [Mono.Cecil] (http://www.mono-project.com/Cecil) è una buona opzione per questo. [Qui] (http://plaureano.blogspot.com/2011/05/introduction-to-il-rewriting-with-cecil.html) è un buon blog che discute della riscrittura di IL che potrebbe essere utile. –