一、最近因为要在一个地方上一个老项目,但是因为需要有差别而且项目代码年代久远,已经无法通过修改代码来完成新版本的部署。后来查阅资料,发现可以通过修改中间语言来完成dll代码的更新。
二、相关资源准备:
1、反编译工具:
ildasm.exe
磁盘路径:C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\ildasm.exe
用途:将dll文件反编译为IL文件
2、IL编译工具:
ilasm.exe(framework2.0)
磁盘路径:C:\Windows\Microsoft.NET\Framework\v2.0.50727\ilasm.exe
用途:将IL文件编译为dll文件
3、老版本的dll
4、本地代码
三、开始动手
1)使用ildasm.exe打开老版本的dll,并生成il文件。如下图:
点击“确定”保存为IL文件,然后使用记事本(notepad,ue等)打开IL文件,找到你想修改代码的那一部分
如下所示为我想要修改的SelectCallIn类中的Page_Load方法中的一部分代码。
//类SelectCallIn的IL代码 .class public auto ansi beforefieldinit iFlyTek.FSP10.Flow.SelectCallIn extends iFlyTek.FSP10.Flow.FSPBase { .method family hidebysig instance void Page_Load(object sender, class [mscorlib]System.EventArgs e) cil managed { //这里是Page_Load方法的详细代码,省略 } // end of method SelectCallIn::Page_Load }
使用Reflector.exe打开老版本的dll,将SelectCallIn类中的所有代码复制到本地代码中对应的类文件中,然后你想修改啥就修改啥,这个类中需要依赖的部分都可以虚构出来,只要改完了能够编译通过就行。
编译通过后,再次使用ildasm.exe打开新的dll文件,并生成IL文件
打开新生成的IL文件,复制SelectCallIn中Page_Load整个方法体的内容,将老版本IL文件中相应的部分替换掉,保存
然后使用 ilasm.exe 工具生成dll文件:
看到打屏 Successfully后,flow_online.dll就生成成功了。
再使用Reflector.exe打开flow_onlie.dll 就看到了我刚修改的那一部分,表明修改成功了!