2011-09-01 57 views
8

那么这个问题似乎很奇怪,但它的简单 - 我的意思是,如果我有一个像例如Mono.Cecil会照顾树枝等位置吗?

br IL_0003 
call ***** 
IL_0003: ret 

的反编译的代码“转到”(brtrue等),我认为*后添加一个命令*电话会将最高点处的广告像它应该或者那个代码一样回退。

是否塞西尔自己做,或者我必须照顾所有这些分支? :/ 它不会是很难解决这些问题,但如果塞西尔犯规的话,我根本不会启动这个项目,我已经没有时间(或知识)的高级魔法IL:P

PS。对不起,如果即时通讯困惑的事情,但我是一个在.NET的东西begginer; /我总是排斥它相同的Java或任何有一个VM TBH。

*(是的,我知道它不会是IL_0003它只是举例)*

回答

13

是的,丝丝将更新你的分支。

你必须要处理的唯一情况是分支是一个短格式分支的情况。如果你注入了太多的指令,它可能会溢出。

有一个非常简单的方法来处理这个问题。注入代码之前,只需调用扩展方法SimplifyMacros从Mono.Cecil.Rocks,像这样:

method.Body.SimplifyMacros(); 

这将会把br.s到BR。

大功告成注入代码时,只需拨打:

method.Body.OptimizeMacros(); 

这是相反的操作,也就是说,它会尝试如果可能的话把BR成br.s。

+0

哇,这样一个快速的答案,从作者:)感谢你最好的人:P – n00b