尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

没有源码的 .NET 老项目,我用 ILSpyCmd 把 DLL 变回了代码

没有源码的 .NET 老项目,我用 ILSpyCmd 把 DLL 变回了代码 没有源码的 .NET 老项目我用 ILSpyCmd 把 DLL 变回了代码【免费下载链接】ILSpy.NET Decompiler with support for PDB generation, ReadyToRun, Metadata (more) - cross-platform!项目地址: https://gitcode.com/gh_mirrors/il/ILSpy接手一个只有发布产物、没有源码仓库的 .NET 项目几乎是每个开发者迟早会撞上的事。ILSpyCmd 正是为这种时刻准备的命令行反编译工具它能把 DLL 或 EXE 程序集还原成可读的 C# 源码甚至生成可直接编译的完整项目而且是跨平台运行的。这篇文章不讲抽象的功能清单我想带你走一遍真实的源码丢失现场从装工具到把它接进自动化流水线一步步把 ILSpyCmd 用熟。一次真实的源码丢失现场先还原一下那个熟悉的场景。你接手了一套遗留系统交接文档只有一句话代码在 SVN 上但服务器重装过历史版本丢了。你手里只有发布目录里那一堆 DLL 和 EXE——也就是 .NET 编译后的程序集文件。程序集内部装的并不是人能直接阅读的代码而是一种叫 IL中间语言的字节码是给 CLR 运行时执行的。这时候你有两条路打开图形界面的反编译器或者用命令行工具。可如果你要反编译的是服务器上几十个程序集或者你压根没有图形界面比如在 CI 机器、Docker 容器里图形工具就派不上用场了。ILSpyCmd 就是开源反编译器 ILSpy 项目提供的命令行版本Windows、macOS、Linux 都能跑一条命令就能把程序集翻译回接近原始形态的 C# 代码。它解决的核心问题很简单没有源码也要能读、能改、能维护。装好工具先让第一个 DLL 开口说话安装过程干净利落前提是你机器上有 .NET SDK。执行这条命令即可dotnet tool install --global ilspycmd这是 .NET 的全局工具机制装完之后在任意目录都能直接使用ilspycmd命令不需要额外配置环境变量。装好之后最朴素的用法是让结果直接打印到控制台ilspycmd OrderService.dll反编译出来的代码会哗啦啦地刷满终端。对一个小程序集来说这种方式足够直观但如果内容太长或者你想把结果保存下来就加上输出目录参数ilspycmd -o ~/decompiled OrderService.dll-o指定输出目录默认会生成一个包含全部代码的.cs文件。我的建议是第一次接触某个程序集时先用-o落盘再打开文件慢慢看比盯着终端舒服得多。程序集太大学会按需取用大型程序集动辄上千个类型一股脑全量反编译既慢又难读。ILSpyCmd 提供了精准的点菜能力。只想看某个类型用-t指定它的全限定名ilspycmd -t Acme.OrderService.OrderValidator OrderService.dll只想看某个方法用-m指定它的 XML 文档 ID就是 Visual Studio 里右键转到定义用的那种标识或者直接给元数据令牌ilspycmd -m M:Acme.OrderService.OrderValidator.Validate(System.String) OrderService.dll如果你怀疑某个方法的性能问题出在编译层面还可以直接看 IL 层面的原始逻辑ilspycmd -il OrderService.dll-il输出的是 IL 指令而非 C#虽然读起来门槛高一些但在排查编译器优化、理解真实执行路径时它比 C# 视图更接近真相。别忘了程序集里还藏着资源文件。用--list-resources列出所有内嵌资源再用--resource按名字提取ilspycmd --list-resources OrderService.dll ilspycmd --resource OrderService.g.resources/mainwindow.baml -o ~/decompiled OrderService.dll值得注意的细节是WPF 程序集里的 BAML编译后的 XAML 二进制格式在提取时会自动被还原成可读的 XAML 文件这对分析界面逻辑特别有用。从看得懂到用得上重建可编译项目如果只是读代码上面的用法已经足够。但更进一步的诉求是让这个程序集重新成为一个能编译、能运行的项目。这就要用到-p参数ilspycmd -p -o ~/decompiled OrderService.dll-p代表 project 模式会生成项目文件.csproj和一个类型一个源文件的目录结构目标就是让你能直接dotnet build。注意-p必须和-o搭配使用。再加上--nested-directories代码会按命名空间分目录存放几十个文件也不会乱ilspycmd --nested-directories -p -o ~/decompiled OrderService.dll如果目标程序集是 WPF 应用建议补上--decompile-baml让-p模式顺手把 BAML 资源一并转成 XAML 页面文件还原度会高一个档次。而如果编译时报找不到依赖多半是引用缺失用-r指向依赖程序集所在的目录即可ilspycmd -p -o ~/decompiled -r ~/deps OrderService.dll这里我必须泼一盆冷水反编译出来的代码能编译不等于和原始源码逐字相同。变量名、注释、被重构过的结构都会丢失反编译是重建语义不是还原备份。把期望定在可读、可维护、能编译上你会用得心平气和。反编译不止为了看顺手生成 PDB 调试文件很多人以为反编译只是为了阅读其实它还有另一个实用场景调试没有源码的第三方库。当第三方库抛异常时报错堆栈往往只有 IL 偏移量根本定位不到是哪一行逻辑出了问题。ILSpyCmd 的--generate-pdb参数就是为此准备的ilspycmd --generate-pdb ThirdParty.dllPDB 是调试符号文件作用是把二进制指令地址映射回源代码行号。生成 PDB 之后你可以在调试器里对第三方库的代码单步执行、查看局部变量排查问题的效率完全不一样。这个过程在 CI 环境里也能自动完成后面会讲到。把反编译交给流水线让它每天自动跑单次反编译解决的是燃眉之急而真正让 ILSpyCmd 价值翻倍的是把它接进自动化流程。批量处理很简单一次命令传多个程序集即可ilspycmd a.dll b.dll c.exe -o ~/decompiled在脚本或 CI 里高频调用时记得加上--disable-updatecheck避免每次启动都联网检查工具更新既省时间又减少不确定性ilspycmd --disable-updatecheck OrderService.dll我见过最有意思的自动化用法是让反编译工具兼职文档生成器。--generate-diagrammer可以从程序集生成一个交互式 HTML 架构图基于 Mermaid 图表类的关系、依赖一眼看清默认输出在程序集旁边的diagrammer目录ilspycmd OrderService.dll --generate-diagrammer大型程序集全部画出来会又慢又乱所以它还提供了正则过滤参数用白名单--generate-diagrammer-include和黑名单--generate-diagrammer-exclude圈定范围ilspycmd OrderService.dll --generate-diagrammer \ --generate-diagrammer-include Acme\.. \ --generate-diagrammer-exclude Acme\.Internal\..把它挂到发布流水线后面文档就能跟着代码自动更新。在项目文件里加一个 Target 就能实现Target NameGenerateHtmlDiagrammer AfterTargetsPublish Exec Commandilspycmd $(TargetPath) --generate-diagrammer --outputdir $(PublishDir)diagrammer / /Target这样每次发布架构文档都会自动重新生成文档和代码永远同步再也不用手动维护架构图了。现在就动手工具讲得再多不如亲手跑一次。我的建议很具体从你手边随便挑一个 DLL先执行ilspycmd --help把全部选项过一遍然后用-p -o生成一个可编译项目最后试着dotnet build一把。当屏幕上出现编译成功、而你明明只给了它一个 DLL 时那种感觉还挺奇妙的——你刚刚亲手让一套失忆的代码重新开口说话了。剩下的就交给你的好奇心去探索吧。【免费下载链接】ILSpy.NET Decompiler with support for PDB generation, ReadyToRun, Metadata (more) - cross-platform!项目地址: https://gitcode.com/gh_mirrors/il/ILSpy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表