最近由於業務需求,需要對一個老項目進行功能調整。但是項目的源代碼已經找不到了。所以只能嘗試對項目行進反編譯。
一、反編譯工具的選擇
提到.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。
