内容
# ILens
一款允许 AI 代理检查编译后的 .NET 程序集的 MCP 服务器 — 列出类型、反编译方法、运行交叉引用分析 — 而无需在完整的文件转储上消耗令牌。
## 为什么
AI 代理检查编译后的 .NET 程序集的默认后备方法是调用 `ildasm`(IL 转储)或 `ilspycmd`(完整的 C# 反编译)。两者都将整个文件作为文本转储,并且该输出作为输入令牌保留在代理的上下文中 - 快速消耗数千个令牌来检查单个类。
| 任务 | `ilspycmd` 成本 | ILens 工具 | ILens 成本 |
|------|----------------:|------------|-----------:|
| 列出命名空间中的公共类型 | 1,041,476 令牌 | `list_types` | 1,196 令牌 |
| 查看一个中等大小的类的 API 接口 | 1,041,476 令牌 | `summarize_type` | 895 令牌 |
| 查找哪些类型公开给定方法 | 1,041,476 令牌 | `find_methods` | 618 令牌 |
*在 2026-06-23 针对 `ICSharpCode.Decompiler.dll` 9.1.0.7988 进行测量;令牌数字是字符计数除以 4,而不是真正的令牌计数。*
ILens 将程序集检查转换为有界、定向的查找:列出命名空间中的类型、总结一个类型的公共接口、按名称查找方法、反编译单个方法体、运行交叉引用分析(调用者、重写、实现、扩展方法、属性使用)。每个调用返回一个聚焦的响应 — 使其足够便宜,可以作为始终可用的工具注册。
## 范围
ILens 适用于检查 **C# 程序集**,其输出是 C#。基于元数据的工具(`list_types`、`search_types`、`list_members`、`find_methods`、`analyze`)读取语言无关的元数据,并适用于任何 .NET 语言的程序集。反编译工具(`decompile_type`、`decompile_method`、`decompile_property`、`decompile_event`、`summarize_type`)始终发出 C# - 对于从 F#、VB.NET 或 C++/CLI 编译的程序集,它们仍然运行,但没有 C# 等价的构造可能无法忠实地呈现。
## 建立在 ILSpy 之上
没有 [ILSpy](https://github.com/icsharpcode/ILSpy),ILens 就不会存在。反编译器、分析器、类型系统,使 ILens 能够用 C# 术语讨论 .NET 程序集 - 所有这些都不是 ILens 的。这是属于 ILSpy 团队的。ILens 链接的两个库 - `ICSharpCode.Decompiler` 用于反编译器,`ICSharpCode.ILSpyX` 用于分析器基础设施 - 代表了十多年的精心工作;这个项目坦率地说,是在其基础上构建的薄 MCP 适配层。
该工作是 MIT 许可的,这就是 ILens 可以存在的原因。如果 ILens 对您有帮助,请考虑给 [ILSpy](https://github.com/icsharpcode/ILSpy) 一个星级。他们应得的。
明确地说:关于 ILens 的错误报告和功能请求应在 [ILens 问题跟踪器](https://github.com/tadis174/ILens/issues) 上,而不是 ILSpy 的。请不要将下游问题带到上游维护人员那里 - 他们有足够多的事情要做。
## 安装
**系统需求**:Windows 10/11,x64。二进制文件是自包含的 - 不需要单独的 .NET 运行时安装。
```powershell
winget install Tadis.ILens
```
标准的 winget 便携式安装。二进制文件位于 `%LOCALAPPDATA%\Microsoft\WinGet\Packages\` 下,`ilens` 自动添加到您的用户 PATH 中。不需要管理员权限。
参见[用户指南](https://tadis174.github.io/ILens/guide.html),了解其他安装程序、更新和安装故障排除。
## 设置
### 步骤 1:注册服务器
在项目根目录的 `.mcp.json` 中添加一个条目。安装程序将 `ilens` 添加到您的 PATH 中,因此 `command` 字段引用二进制文件名称 - 不需要完整路径:
```json
{
"mcpServers": {
"ilens": {
"command": "ilens",
"args": [
"--allow-root", "C:\\path\\to\\dlls"
]
}
}
}
```
每个 `--allow-root` 标志添加一个目录树,从中可以加载程序集。**如果没有 `--allow-root` 标志,服务器无法加载任何程序集。** 工具调用指定要检查的程序集:
```
list_types(assembly="C:\\path\\to\\dlls\\MyApp.dll", namespaceName="MyApp.Models")
```
`list_allowed_roots` 工具提供了已配置的根目录,以便代理可以发现可访问的内容。
> **请注意 - 首次安装需要完全重启,而不仅仅是新会话。** Windows 在启动时捕获 `PATH`,因此已经运行的 Claude 应用程序在 `ilens` 首次安装到用户 PATH 时(无论是首次安装还是通过 `install.ps1` 运行)都会保留一个过时的环境。Claude Code 仅在会话开始时读取 `.mcp.json`,因此新的服务器不会在任何正在运行的会话中注册。配方:完全关闭 Claude 应用程序 → 安装 ILens → 重新启动 Claude 应用程序 → 在重新启动的应用程序中启动新的 **Claude Code 会话**。恢复的会话在 Claude 应用程序重启后仍然存在,并保留旧环境,因此它们将找不到 `ilens`。后续的 `winget upgrade Tadis.ILens` 运行不会更改 PATH;它们只需要一个新的 Claude Code 会话。
### 步骤 2:告诉 Claude 使用它
如果没有以下内容,Claude 不会实际选择 ILens - 它将继续通过 Bash 调用 `ildasm`,直接读取程序集文件,或搜索源代码。在项目的 `CLAUDE.md` 中添加以下块,并用上述配置的目录替换 `<allow-root>`:
````markdown
## 检查 .NET 程序集
`<allow-root>` 下的程序集可以通过 `ilens` MCP 服务器访问。
优先使用 ILens 工具,而不是通过 Bash 运行 `ildasm` / `ilspycmd`,直接读取程序集文件,或搜索源代码。
- 发现:`search_types`(子字符串匹配),`list_types`(整个命名空间),
`find_methods`(签名搜索)。
- 读取:`summarize_type`(公共接口,无正文),`list_members`
(过滤接口),`decompile_type`(完整 C#),`decompile_method`(单个
方法体),`decompile_property` / `decompile_event`(完整的属性或
事件声明及其访问器正文,按无前缀名称)。
- 交叉引用:`analyze`,其 `kind` 设置为以下之一:`UsedBy`,
`InstantiatedBy`,`ExposedBy`,`ExtensionMethods`,`AppliedTo`,
`OverriddenBy`,`ImplementedBy`,`Uses`,`Implements`,`ReadBy`,
`AssignedBy`。有效的种类取决于符号类别。
- 比较两个版本:`list_changed_types`(两个版本之间的差异),`compare_type`
(按类型划分的成员和正文差异),`compare_method`
(一个方法的正文作为 C# 或 IL)。
````
#### 按行逐步解释
- 第一段是承载偏好 MCP 规则的负载。没有它,模型默认为 `Bash`。
- 发现项目符号将“我不知道完整名称”的任务路由到正确的工具:部分名称进入 `search_types`,已知命名空间进入 `list_types`,方法形状进入 `find_methods`。
- 读取项目符号从最便宜到最昂贵逐步升级:首先是 `summarize_type`,然后是 `list_members`(当只需要部分接口时),然后是 `decompile_method`(用于一个方法体,或 `decompile_property` / `decompile_event` 用于整个属性或事件,而无需了解 IL 访问器前缀),最后是 `decompile_type`(仅当需要完整源代码时)。
- `analyze` 项目符号枚举了 `kind` 枚举,以便模型选择架构接受的值 - 使用不适用于符号类别的值会产生类似 `Analysis kind 'ReadBy' is not valid for Method` 的错误。
- 比较项目符号用于“两个版本之间是否有变化?”的工作:`list_changed_types` 查找差异,`compare_type` 用于一个类型的成员和正文差异,`compare_method` 读取单个差异正文。
## 完整参考
一个自包含的 HTML 用户指南涵盖了本 README 没有的内容:
- **每个工具的参考** - 每个工具、每个参数(带有 `required` / `optional` 标志和类型)、返回形状和完整的错误条件列表
- **替代集成路径** - `claude mcp add` CLI 命令,Claude Desktop 配置
- **安全模型** - 强制执行的内容(`--allow-root` 强制执行,无遍历,无网络,200 MB 限制,只读),和不执行的内容
- **故障排除** - 错误字符串 → 可能的原因映射
在线阅读 **https://tadis174.github.io/ILens/guide.html**,或从发布 ZIP 文件中打开捆绑的 `guide.html`。
## 从源代码构建
如果您愿意自己构建二进制文件:
```bash
dotnet build -c Release
dotnet publish -c Release
```
发布目标生成 `Build/dist/ILens.exe` 以及 `LICENSE`、`README.md`、`guide.html` 和 `third-party-licenses/`。工作树必须在发布之前保持干净,并且 `Build/doc/guide.html` 必须存在(运行项目的 `/doc` 技能以重新生成它)。
## 许可证
ILens 在 [MIT License](LICENSE) 下发布。第三方依赖项在 `third-party-licenses/INDEX.md` 中记录,每个发布版本都附带源许可文本。