事件:
首先, 语言是C#, 然后我把代码给删了… 但是在删之前, 我编译过一次, 所以… 我就想着使用反编译工具来搞了.
我知道的反编译工具, dnSply, ILSpy, dotPeek
dnSpy是ILSpy的一个分支(dnSpy is a .NET assembly editor, decompiler, and debugger forked from ILSpy)
dotPeek 是 JetBrains 的反编译工具, 在这之前我还没使用过.
开始吧:
> 首先, 是 dnSpy 上场:
乍一看, 没啥问题, 但是, 会有很多毛病哦~ 一一道来吧:
- dnSpy 的反编译结果, 似乎不会吧字段和方法放在一起, 我也没找到它反编译的字段定义跑哪去了…
- 会有一大堆奇怪代码, 跟我们想要的源代码完全不一致, 即便导出为项目, 也会有无数个错误
- 总之, dnSpy是个反编译的好工具, 但还不能够完全获取源代码…
总之先导出一下吧, 选中你的项目, 然后程序左上角, 文件(File) -> 导出为项目(Export to project)
然后就是… 惨不忍睹… 左下角的错误数量 99+ 了已经, 完全没有纠错的必要.
> 然后, 就是 ILSpy 上场了:
嗯好吧, 我承认 ILSpy 没有 dnSpy 好看, 但这可不是决定实力的第一要素.
- 你看到了, 枚举, 字段, 方法, 一切都井然有序
- 仔细看看, 中间的那个 switch 语句, 瞧瞧! 这不是 C#8 的新语法嘛! (我当初没有使用这个语法哦)
- 完全没有任何奇怪的变量名
那么我们尝试导出项目吧! 在左侧选中项目, 右击, 选择 Save Code 以导出项目
感动世界!!! 没有任何错误! 非常非常非常完美~
> 再试试 dotPeak:
哦豁, 看样子, 也不错啊.
- dotPeek 没有像 ILSpy 那样将 switch 还原为 C#8 的语法, 而是使用的旧的语法
- 没有奇怪的变量名, 奇怪的语法
- 出现了我没有写过的东西, 标签
导出项目咯, 直接右击项目, 然后 Export to Project
唔, 一开始就与众不同呢… 跟普通的项目完全不一样, 少了一些文件夹…
嘛, 总之先试着打开吧. 果然在VS里面一眼就能看出错误了! 它居然在本地方法的前头中加了static… 好吧好吧, 我知道它们本质上是静态的, 但你这么弄, 我可就不能编译了呀. (假设我很懒, 懒到连这仅有的一个错误也不愿意改)
总结:
如果说我平常使用, 我肯定会用 dnSpy (颜值高), 毕竟平常还是很少改源代码甚至导出为项目滴, 如果是像这次的特殊情况, 我就会用 ILSpy, 很强大的有木有? 至于 dotPeek, 打入冷宫了, 而且加载速度慢的一批,,, 等它启动完, 黄花菜都凉了.
也算是大成功了, 所以,,, 如果想要通过反编译来挽回删掉的文件, 那么请使用 ILSpy 吧! 经过这一次使用, 我也是爱上 ILSpy了, 毕竟一开始我没报有这么大希望.
如果你觉得有什么改进的, 或者有什么下期文章的建议, 评论区见ovo