最近由于业务需求,需要对一个老项目进行功能调整。但是项目的源代码已经找不到了。所以只能尝试对项目行进反编译。
一、反编译工具的选择
提到.NET的反编译,第一个想到的就是大名鼎鼎的Reflector。使用之后发现效果并不好,对不认识的类就各种乱码且还不支持多项目导出(可能是我不会用吧),再加上他还是需要付费的,暂时就只能战略性的放弃掉了。查找度娘,ILSpy和dnSpy这两款免费的软件进入了我的视线。先试用ILSpy,直接提示我要安装Framework 4.6.2,可是我就一个2.0的项目用这么高版本的反编译,我怕效果不好,就选择了暂时性的放弃。最后使用了dnSpy,反编译出来的效果比Reflector好。
二、艰辛的编译过程
不管使用哪一款反编译工具,反编译出来的代码想要完全没有错误是不太可能,这里就以dnSpy生成出来的代码为例,来说明一下常见问题及解决方案:
1、缺失引用,最典型的就是缺少了System和System.Xml的引用,需要手动添加
2、foreach循环内会再申明一个重名变量,手动删除即可
3、base.AutoScaleMode=AutoScaleMode.Font报错,给AutoScaleMode加上全命名空间System.Windows.Forms.AutoScaleMode.Font
4、变量“manager”未声明或从未赋值。ComponentResourceManager类实例化的变量名只能是resources
三、修复资源文件
其实在这一步之前,项目可以编译成功且不影响到正常使用,只是在开发的时候看不到任何资源数据。
反编译过来的文件里面有很多.resource的文件,那些就是编译过后的资源文件,这些文件可以正常编译不影响正常使用,但是这些文件在开发时是没有用的,所以在VS里面看来就是一片白的,我们需要把.resource文件转换成我们熟悉的.resx文件。
可以用VS自带的工具resgen.exe转(我没用,具体方法可以在网上查);还可以使用ConvertResource批量转换,不过这个工具转出来的文件要把里面metadata改成data才行;转出来.resx之后,把.resource文件删掉,将.resx包含进项目就好了。
四、后记
1、反编译出来的代码和本身的源代码在结构上可能存在差异,尤其是WebServices。
2、现在的反编译工具还做不到一点错都没有,看着那几百上千个错误,很容易让人放弃,一定要摆平心态来处理错误。
3、dnSpy是一个很强大的反编译工具,可以直接断点调试和修改并再编译。如果不放心反编译出来的代码,完全是可以在原程序上修改再编译。
4、dnSpy可以放在服务器端,能在紧急的时候绕过源代码修复BUG。