如果你做过 .NET 调试、兼容性排查,或者接手过没有源码的第三方库,ILSpy 几乎是绕不开的工具。10.1 版本搭上了 .NET 10 的列车,同时在命令行能力上补了一块重要短板——嵌入式资源的提取与 BAML 反编译。这对自动化分析流水线来说,是个实质性的提升。
基于 .NET 10 运行,预览 .NET 11 异步特性
ILSpy 10.1 自身构建在 .NET 10.0 之上,这意味着它可以直接加载和分析面向 .NET 10 的程序集,不再需要额外兼容层。
更值得关注的是对 .NET 11 新语言特性的提前支持:运行时异步(runtime-async)。.NET 11 的运行时库已经开始用 runtime-async 编译(对应 issue #3731),ILSpy 10.1 能够正确识别和反编译这类生成的代码。如果你在预览 .NET 11 或分析最新运行时库的内部实现,这个支持不可或缺。
命令行新武器:资源提取与 BAML → XAML
这是 10.1 最实用的增强(#3730)。此前,ilspycmd 只能反编译 IL 代码;嵌入式资源——尤其是 WPF 的 BAML(Binary XAML)——只能靠 GUI 手动翻。现在命令行也能干了:
- 列出嵌入式资源:快速扫描一个 DLL 里打包了哪些资源文件。
- 提取嵌入式资源:直接把资源从程序集抽出来,保存为原始文件。
- BAML 反编译为 XAML:WPF 的
.baml资源可以直接还原成可读的 XAML,不用再开 GUI。
这对 CI/CD 场景、批量审计、自动化文档生成都非常关键。
实战:用 ilspycmd 拆解一个 WPF 程序集
下面演示如何用命令行完成从代码反编译到资源提取再到 XAML 还原的全流程。假设你有一个 WPF 应用 TargetApp.dll。
1. 反编译程序集的 IL 代码
# 将 TargetApp.dll 的所有类型反编译为 C# 代码,输出到目录
ilspycmd TargetApp.dll -o ./decompiled_src
输出目录下会按命名空间生成 .cs 文件,可以直接浏览或搜索关键逻辑。
2. 列出所有嵌入式资源
# 列出程序集中所有嵌入式资源的名称
ilspycmd -l TargetApp.dll
你会看到类似这样的输出:
TargetApp.g.resources
TargetApp.Properties.Resources.resources
TargetApp.config
其中 .g.resources 通常包含 WPF 的 BAML 文件。
3. 提取嵌入式资源
# 提取所有嵌入式资源到指定目录
ilspycmd -e TargetApp.dll -o ./extracted_resources
提取后你会得到原始的二进制资源文件,包括 .baml。
4. BAML 直接反编译为 XAML
# 将 BAML 资源直接反编译为 XAML
ilspycmd -b TargetApp.dll -o ./xaml_output
这会把 WPF 窗口、控件的 XAML 还原出来,文件名对应原始的 .xaml 路径。你可以直接查看界面定义、绑定关系、样式结构——接手无源码 WPF 项目时,这一步几乎是必须的。
5. 一行命令组合:批量处理多个 DLL
# 对目录下所有 DLL 执行反编译 + 资源提取
for dll in ./bin/*.dll; do
ilspycmd "$dll" -o "./output/il/$dll"
ilspycmd -b "$dll" -o "./output/xaml/$dll"
done
适合在 CI 中自动生成反编译文档,或做安全审计时批量扫描。
日常使用中的几个注意点
- BAML 反编译不保证 100% 还原:XAML 经过 BAML 编译时会丢失部分注释和格式信息,还原结果可能和原始源码有细微差异,但结构和绑定逻辑是准确的。
- runtime-async 代码的可读性:.NET 11 的 runtime-async 生成的状态机代码和传统
async/await编译结果不同,ILSpy 能反编译但输出可能比手写代码复杂,阅读时需要对照异步状态机模式。 - ilspycmd 参数速查:
-o指定输出目录,-l列资源,-e提取资源,-b反编译 BAML,-t可指定只反编译某个类型。组合使用效率最高。
什么时候该升级
如果你满足以下任一条件,10.1 值得马上装:
- 需要分析面向 .NET 10 的程序集(旧版可能加载失败或输出异常)。
- 在 CI 或脚本中批量处理 WPF 程序集的 XAML 还原——此前只能靠 GUI,现在终于可以自动化。
- 正在预研 .NET 11,需要反编译 runtime-async 代码理解内部机制。
ILSpy 一直免费开源,10.1 的命令行增强让它在自动化场景下从"好用"变成了"不可或缺"。装一个,把以前手动翻资源的流程脚本化,省下的时间比升级动作本身多得多。