Jon*_*rop 11 .net c# f# metaprogramming
我可以编译指令到字节码,甚至可以轻松地执行它们,但是我发现提取CIL的唯一函数是,GetILAsByteArray并且顾名思义,它只返回字节而不是CIL指令.
那么如何以编程方式在.NET上反汇编CIL?
请注意,我不希望结果以人类可读的形式出现.我想编写元程序来操纵从其他程序生成的CIL.
Mono Cecil库 - http://www.mono-project.com/Cecil应该做你需要的,我知道它至少用于一个.Net profiler
你可以合理地使用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
Run Code Online (Sandbox Code Playgroud)
该code.Value属性为您提供代码的eithre byte或int16值.该code.Size属性告诉您这是1或2字节代码,OperandType属性指定代码后面的参数(字节数和含义在MSDN上解释).我不记得你究竟需要如何处理像引用的标记那样的东西MethodInfo,但我想你能够弄清楚这一点!
| 归档时间: |
|
| 查看次数: |
1228 次 |
| 最近记录: |