820 字
4 分钟
[踩坑记录] C# 源代码被误删, 通过反编译之前编译好的文件来拯救这一切, 三款反编译工具对比

事件:#

首先, 语言是C#, 然后我把代码给删了… 但是在删之前, 我编译过一次, 所以… 我就想着使用反编译工具来搞了.

我知道的反编译工具, dnSply, ILSpy, dotPeek

dnSpy是ILSpy的一个分支(dnSpy is a .NET assembly editor, decompiler, and debugger forked from ILSpy)

dotPeek 是 JetBrains 的反编译工具, 在这之前我还没使用过.

开始吧:#

> 首先, 是 dnSpy 上场:#

乍一看, 没啥问题, 但是, 会有很多毛病哦~ 一一道来吧:

  1. dnSpy 的反编译结果, 似乎不会吧字段和方法放在一起, 我也没找到它反编译的字段定义跑哪去了…
  2. 会有一大堆奇怪代码, 跟我们想要的源代码完全不一致, 即便导出为项目, 也会有无数个错误
  3. 总之, dnSpy是个反编译的好工具, 但还不能够完全获取源代码…

总之先导出一下吧, 选中你的项目, 然后程序左上角, 文件(File) -> 导出为项目(Export to project)

然后就是… 惨不忍睹… 左下角的错误数量 99+ 了已经, 完全没有纠错的必要.

> 然后, 就是 ILSpy 上场了:#

嗯好吧, 我承认 ILSpy 没有 dnSpy 好看, 但这可不是决定实力的第一要素.

  1. 你看到了, 枚举, 字段, 方法, 一切都井然有序
  2. 仔细看看, 中间的那个 switch 语句, 瞧瞧! 这不是 C#8 的新语法嘛! (我当初没有使用这个语法哦)
  3. 完全没有任何奇怪的变量名

那么我们尝试导出项目吧! 在左侧选中项目, 右击, 选择 Save Code 以导出项目

感动世界!!! 没有任何错误! 非常非常非常完美~

> 再试试 dotPeak:#

哦豁, 看样子, 也不错啊.

  1. dotPeek 没有像 ILSpy 那样将 switch 还原为 C#8 的语法, 而是使用的旧的语法
  2. 没有奇怪的变量名, 奇怪的语法
  3. 出现了我没有写过的东西, 标签

导出项目咯, 直接右击项目, 然后 Export to Project

唔, 一开始就与众不同呢… 跟普通的项目完全不一样, 少了一些文件夹…

嘛, 总之先试着打开吧. 果然在VS里面一眼就能看出错误了! 它居然在本地方法的前头中加了static… 好吧好吧, 我知道它们本质上是静态的, 但你这么弄, 我可就不能编译了呀. (假设我很懒, 懒到连这仅有的一个错误也不愿意改)

总结:#

如果说我平常使用, 我肯定会用 dnSpy (颜值高), 毕竟平常还是很少改源代码甚至导出为项目滴, 如果是像这次的特殊情况, 我就会用 ILSpy, 很强大的有木有? 至于 dotPeek, 打入冷宫了, 而且加载速度慢的一批,,, 等它启动完, 黄花菜都凉了.

也算是大成功了, 所以,,, 如果想要通过反编译来挽回删掉的文件, 那么请使用 ILSpy 吧! 经过这一次使用, 我也是爱上 ILSpy了, 毕竟一开始我没报有这么大希望.






如果你觉得有什么改进的, 或者有什么下期文章的建议, 评论区见ovo

[踩坑记录] C# 源代码被误删, 通过反编译之前编译好的文件来拯救这一切, 三款反编译工具对比
https://slimenull.com/posts/20210206012402/
作者
SlimeNull
发布于
2021-02-06
许可协议
CC BY-NC-SA 4.0