Bạn có thể nhận được một cách hợp lý đến nay chỉ sử dụng các mảng byte từ GetILAsByteArray
phương pháp, nhưng bạn' sẽ cần phải tự phân tích cú pháp các byte (nếu bạn không muốn dựa vào thư viện của bên thứ 3).
Cấu trúc của mảng là có một hoặc hai byte xác định lệnh theo sau là toán hạng cho lệnh (không có gì, một số mã thông báo 4 byte hoặc số 8 byte).
Để nhận mã, bạn có thể xem cấu trúc OpCodes
(MSDN) từ System.Reflection.Emit
. Nếu bạn liệt kê trên tất cả các lĩnh vực, bạn có thể khá dễ dàng xây dựng một bảng tra cứu để đọc các 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
Thuộc tính code.Value
mang đến cho bạn eithre byte
hoặc int16
giá trị của mã. Thuộc tính code.Size
cho bạn biết đây là 1 hoặc 2 mã byte và thuộc tính OperandType
chỉ định đối số nào tuân theo mã (số byte và ý nghĩa là explained on MSDN). Tôi không nhớ chính xác bạn cần xử lý những thứ như mã thông báo như thế nào tức là MethodInfo
, nhưng tôi đoán bạn sẽ có thể hiểu được điều đó!
Nguồn
2012-02-12 23:43:03
Khi @JohnPalmer đề xuất câu trả lời của anh ấy, [Mono.Cecil] (http://www.mono-project.com/Cecil) là một lựa chọn tốt cho việc này. [Ở đây] (http://plaureano.blogspot.com/2011/05/introduction-to-il-rewriting-with-cecil.html) là một blog tốt thảo luận về IL viết lại có thể hữu ích. –