mcpField
D
dotnet-inspect-decompiler

dotnet-inspect-decompiler

github.com/richlander开发159417 次安装今天更新
代码仓库

关于 dotnet-inspect-decompiler

介绍如何用 dotnet-inspect 检查 .NET 程序集,包括反编译 C#、注释源码、IL 和 API 搜索,帮助开发者查看实现细节并了解结果的保真度与来源。

主要功能

  1. 01查看反编译 C#、注释源码和 IL
  2. 02按 C# 语法类型搜索方法体
  3. 03通过 IL 偏移定位成员
  4. 04检查保真度原因与诊断信息
  5. 05控制源码选择和网络访问
  6. 06调整输出名称与代码风格

适用场景

  1. 01调查缺少源码的程序集
  2. 02查找包含特定 C# 结构的方法
  3. 03将 IL 指令追溯到成员上下文
  4. 04比较反编译结果与 PDB 映射源码

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/richlander/dotnet-inspect --skill dotnet-inspect-decompiler

安装后在 Claude Code 中输入/dotnet-inspect-decompiler确认已加载。

详细介绍

dotnet-inspect:反编译器和 IL

使用此技能,从已有程序集了解代码的实际运行方式。 反编译器会在本地针对已获取的程序集运行,而 IL 和 带注释的视图可以揭示 PDB 映射源代码中没有的信息。获取包和 PDB 可能需要网络;添加 --offline 可禁止网络访问。 对于 PDB 映射源代码,请使用 sourcelink 技能,并在解读获取的内容前遵循其校验和与 来源边界。

dnx dotnet-inspect -y -- <command>

反编译源代码和 IL

选定的 Type 或精确 Member 支持显式的优先采用作者源代码的 -S Source。 它会优先采用经过验证的作者源代码,并在该源代码不可用时使用共享回退策略,同时保留提供方和回退上下文。仅需要 Portable-PDB 选定的提供方时,使用 PDB Source;仅需要本地重建的 C# 时,使用 Decompiled Source。

默认情况下,选定的重载会呈现其有界的 Signature 概览;使用 -S Signature 可显式请求该概览。如果问题关注实现证据,请显式选择 Decompiled Source。使用 -S "Decompiled Source,Annotated Source,IL" --offline 获取完整的零网络 证据集:

  • Decompiled Source — 提升后的、降低后的 C#(尽力保持可读);没有 PDB 名称的局部变量默认使用保留字节信息、根据类型和角色推导的名称。
  • Annotated Source — 带有隐藏信息注释并穿插 IL 的 C#。
  • IL — 原始 IL,保真度最高的视图。

当精确的操作码、偏移量、分支、令牌或调用很重要时,使用 Annotated Source 或 IL。 默认情况下,选定的单个 Type 或 Member 源代码载荷会写入原生源代码;当文档框架有用时,添加 --markdown。 -S @Source 的范围更广;当 SourceLink 可用时,可能会获取网络上的 PDB Source 内容;获取过程会遵循主机允许的重定向,且仅当响应正文与 PDB 校验和匹配时才返回该正文,不会将最终 目标视为源代码来源。 --project 会读取现有的还原资产;如果依赖项发生变化,请先还原/生成。

dnx dotnet-inspect -y -- type JsonSerializer --package System.Text.Json -S Source
dnx dotnet-inspect -y -- member JsonSerializer --package System.Text.Json \
  Serialize:1 -S Source
dnx dotnet-inspect -y -- member JsonSerializer --platform System.Text.Json \
  Serialize:1 -S "Decompiled Source,Annotated Source,IL" --offline
dnx dotnet-inspect -y -- member JsonSerializer --platform System.Text.Json Serialize:1 -S "Annotated Source"
dnx dotnet-inspect -y -- type JsonSerializer --platform System.Text.Json -S "Decompiled Source"
dnx dotnet-inspect -y -- member Command --project ./src/App Add:1 -S "Decompiled Source,Annotated Source,IL"

搜索已渲染的方法体形状

当问题是“哪些公共 API 方法包含这种 C# 语法?”时,请使用库的 Body Shapes 部分。查询是精确且限定程序集范围的:Kind 接受 ObjectCreationExpression、TryStatement 或 ElementAccessExpression 之类的稳定 ID,而不是 IR 类名或文本模式。请查找 ID,而不要猜测:

dnx dotnet-inspect -y -- explain vocabularies/csharp.body-kinds .hal --json
dnx dotnet-inspect -y -- library MyLib.dll \
  --where "Kind=ObjectCreationExpression" --jsonl
dnx dotnet-inspect -y -- library System.Text.Json \
  --where "Kind=TryStatement" --columns "Member;Token;Match" -n 10
dnx dotnet-inspect -y -- library MyLib.dll \
  --where "Kind=InvocationExpression" \
  --where "Finding=analysis.call-site" \
  --where "Shape=sync-call-in-async" --jsonl
dnx dotnet-inspect -y -- type JsonDocument \
  --platform System.Text.Json \
  --where "Kind=ObjectCreationExpression" --jsonl
dnx dotnet-inspect -y -- member JsonDocument RootElement:1 \
  --platform System.Text.Json \
  --where "Kind=ObjectCreationExpression" --jsonl

如果没有 -S 选择,Kind=... 会自动选择仅显式的部分。结果包含可往返使用的限定成员选择器、MethodDef 标记、方法已渲染 C# 方法体中从 1 开始计数的起止范围,以及精确的选中文本。这些不是 IL 偏移量,也不是原始源文件坐标。低于 Full 保真度的方法体会被跳过并报告;添加 --verbose 可查看每个成员的详细信息。在库范围内,重复使用 Performance Triage 字段指定 --where,即可在反编译前对这些谓词进行 AND 组合。查询会通过匹配机会对应的类型化源所有者进行映射,并且只搜索这些 MethodDef 方法体;如需规范的证据回执,请单独选择一个 Performance 部分。Performance 的 --top 和 --order-by 不能组合使用;请使用 --rows 限制 Body Shapes 输出。如果不缩小范围,搜索会对每个 API 表面候选方法体运行反编译器,因此大型库上的开销可能较高。

如需统计概览,请使用相同的 Kind 谓词选择 -S "Body Shape Summary"。相同行的渲染 Kind/Match 值会先分组,再应用行数限制;--columns "Match;Count" 可生成紧凑表格。现有的 Body Shapes 部分仍用于查看可定位的匹配项。列投影不会对行分组,而 --count 会在摘要视图中统计分组数量,或在详细视图应用行窗口后统计匹配项数量。两种视图均支持库、类型和成员范围。

类型范围要求指定一个精确类型,并且只反编译其 MethodDef 和访问器方法体。成员范围要求指定一个精确的成员名称或选择器,并且只反编译该成员的 MethodDef 方法体。无歧义的方法和仅有单个访问器的成员会自动选中;重载名称需要使用 Name:N 或 Name~digest。包含多个方法体访问器的属性或事件需要使用访问器选择器;当所有者有重载时,请使用 Name~digest:1/Name~digest:2。使用 --all 可包含非公开类型成员,或选择非公开成员。

可读性与风格

--readable-names 会将 V_0 等编译器风格的局部变量名称替换为方法体中稳定且易读的替代名称。此选项独立于 C# 风格选项。通过从工作目录向上遍历发现的、由工具管理的 .dotnet-inspectconfig 会选择已配置的拼写形式;--taste 会在单次调用中请求 Oracle 推荐的风格集合。Applied Taste 会报告实际更改渲染方法体的选项。

默认使用显式局部变量类型。将任意独立的 var 类别设为启用:csharp_style_var_for_built_in_types = true、csharp_style_var_when_type_is_apparent = true 或 csharp_style_var_elsewhere = true。这些不会改变字节的选项不属于 --taste。默认情况下,对象创建使用目标类型推断;设置 csharp_style_implicit_object_creation_when_type_is_apparent = false 可保留显式构造类型。var 声明仍会保留 new T(...),因为 var x = new() 没有目标类型。默认情况下,编译器生成形式的 long 常量使用大写 L;设置 dotnet_inspect_style_prefer_long_literal_suffix = false 可保留显式的 (long)N 强制转换。

dnx dotnet-inspect -y -- member MyType Method:1 --library MyLib.dll \
  -S "Decompiled Source,Applied Taste" --taste --readable-names
聚焦注解

默认情况下,每个隐藏事实都会呈现为末尾的 // 注释。细节较长的事实可能会把该注释推到页面最右侧之外。--focus 会将匹配的事实提升为语句下方的 ^^^^ 下划线,并将内容换行成易读的文本块:

dnx dotnet-inspect -y -- member Cache --project ./src/App Pump:1 -S "Annotated Source" --focus allocation

值可以匹配注解类别、精确 ID,或以段边界为准的点分 ID 前缀(alloc 会匹配 alloc.box,但不会匹配 allocator.x)。它只会提升,不会过滤——不匹配的事实仍保留在末尾,因此 --focus 可以缩小关注范围,但不会隐藏任何内容。如果没有匹配项,系统会说明这一点,并列出该成员实际具有的类别。

保真度模型

反编译器会如实呈现降级情况:对于无法忠实地用 C# 表示的 IL,会将其显示为注释,并降低结果的保真度等级(Full -> Partial -> StructuredOnly -> IlOnly -> Failed),而不是输出看似合理、实则错误的源代码。每次降级都会附带稳定的 DEC#### 诊断信息。Decompiled Source 是降级后的 C#,原始/带注释的 IL 保真度最高。

如果反编译输出看起来有误,请同时收集 Decompiled Source、Annotated Source、PDB Source、Source Diff(通过 sourcelink 技能)和 IL;维护者会使用 DecompilerHarness 诊断管线状态。

选择 Fidelity Causes,即可查看该保真度等级对应的、按类型统计的 DEC#### 原因。它可以区分完整的方法(完整,无原因)、没有方法体的方法(缺失),以及检查失败的情况。

dnx dotnet-inspect -y -- member MyType MyMethod:1 --library MyLib.dll -S "Fidelity Causes"

按 IL 偏移定位代码

dnx dotnet-inspect -y -- library coordinate 0x06000001+0x5 --library Foo.dll

使用 library coordinate 0x06000001+0x5 --library Foo.dll(MethodDef 令牌加 IL 偏移),组合其默认的源代码位置、成员、指令、异常、调用点和返回地址部分。分配、安全性和成本为可选项;使用 -S "Context: Allocation,Context: Safety,Context: Cost" 请求这些内容。对于稀疏文件,可使用 library coordinate --file coordinates.txt --library Foo.dll,最多包含 1,024 条有效记录;空行和注释行不计入,格式错误的行仍会按其在源文件中的顺序显示。有关调用边(方法调用了什么、谁调用了它),请参阅 relationships 技能。

评论

支持 Markdown