ILDASM仅支持.NET Framework程序集,查看.NET Core/5+需用dnSpy;dnSpy可直接拖入DLL/EXE,切换至IL视图查看真实指令,且支持调试与依赖解析。

怎么快速打开一个程序集看它的 IL 代码
直接双击 ildasm.exe 启动后用“文件 → 打开”选 DLL 或 EXE 即可;但更常用的是命令行方式,尤其处理带依赖或强命名的程序集时:
ildasm MyLib.dll /output=MyLib.il这样会导出人类可读的 IL 文本(含元数据注释)。注意:.NET Core/.NET 5+ 的程序集默认是跨平台的
.dll,但 ildasm 只支持传统 .NET Framework 编译的程序集(即目标为 net4xx),对 net6.0 及以后的程序集会报错 Unable to load assembly。
dnSpy 替代 ILDASM 的实际操作要点
dnSpy 是开源、跨框架、带调试能力的替代方案,适合分析 .NET Core / .NET 5+ 程序集:
- 下载最新版 dnSpy(推荐 GitHub releases 页面的
dnSpy-net-core.zip) -
解压后直接运行
dnSpy.exe,无需安装 - 拖入任意
.dll或.exe(包括自包含发布后的主程序),它能自动识别目标运行时 - 左侧树形结构里点开某个方法,右侧默认显示反编译的 C# 代码;点击顶部“切换到 IL”按钮,立刻显示对应 IL 指令
DebugType=portable 且 PDB 可用),IL 视图才反映真实编译输出。ILDASM 报错 “Failed to load assembly” 怎么办
常见原因和应对方式:
- 试图加载 .NET Core 程序集:改用 dnSpy,或用
dotnet ilc(.NET 7+ AOT 工具链)配合ildasm查看生成的原生 IL(极少见) - 程序集被混淆(如 Dotfuscator):
ildasm仍可打开,但方法体可能只剩ret或异常指令;此时需先尝试反混淆(如 de4dot),再用 dnSpy 查看 - 缺少依赖(如引用了未复制的
System.Runtime.dll):ildasm不解析依赖,所以不影响查看本体 IL;但若想执行反编译 C#,dnSpy 会提示缺失引用,此时需把整个运行时目录(如dotnet/shared/Microsoft.NETCore.App/6.0.0)加进 dnSpy 的“模块引用路径”设置中
看 IL 时哪些指令最容易误读
IL 不是汇编,语义依赖上下文,几个高频误解点:
-
ldarg.0不一定代表this:实例方法才是,静态方法里它是第一个参数;查方法签名最准 -
callvscallvirt:后者才做 null 检查和虚方法分发,即使对 sealed 类的 public 方法,C# 编译器也倾向用callvirt - 局部变量索引从 0 开始,但
ldloc.0不一定对应源码第一个声明的变量——编译器可能重排、复用或优化掉局部变量 - 异步方法(
async)的 IL 极其冗长,主体逻辑被拆进状态机类的MoveNext,别在原始方法体里找 await 对应的 IL
using 是否总调用 Dispose),盯住 try/finally 块和其中的 call 指令比猜更可靠。










