Вы можете добиться значительных успехов, просто используя байтовый массив из метода GetILAsByteArray
, но вам нужно будет самостоятельно выполнить разбор байтов (если вы не хотите полагаться на стороннюю библиотеку).
Структура массива такова, что существует один или два байта, идентифицирующие инструкцию, сопровождаемую операндами для инструкции (которая является либо ничем, некоторым 4-байтовым токеном или 8-байтовым числом).коды, вы можете посмотреть на OpCodes
структуру ( MSDN ) из System.Reflection.Emit
.Если вы перечислите все поля, вы можете легко построить таблицу поиска для чтения байтов:
// 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
Свойство code.Value
дает вам значение кода byte
или int16
,Свойство code.Size
указывает, является ли это 1 или 2-байтовым кодом, а свойство OperandType
указывает, какие аргументы следуют за кодом (количество байтов и значение объяснено в MSDN ).Я не помню, как именно вам нужно обрабатывать такие вещи, как токены, которые относятся к MethodInfo
, но я думаю, вы сможете это понять!