Graphify C# 0.1 版本发布 – 为 C# 编码代理提供编译器准确的“查找用法”功能
TL;DR – Graphify C# 的功能及其重要性
Graphify C# 是一个免费的无头 Roslyn/MSBuild 索引器,可为任意 C# 解决方案生成确定性的 JSON 图,其中包含编译器解析的符号、调用、引用、继承和重写信息。通过提供这种语义证据,编码代理(例如 Claude Code、Codex 或自定义 LLM 机器人)能够以编译器精度回答“查找用法”类问题,而非依赖不可靠的文本搜索启发式方法。
编码代理的即时价值
- 精确的重载解析 – 图中存储了绑定后的签名,因此代理可以区分
Foo(int)和Foo(string)。 - 项目感知的关系 – 每条边都记录了源项目和目标框架,支持诸如“仅在测试项目中使用的方法”之类的查询。
- 完整的语言覆盖 – 支持 C# 14(Roslyn 5.9)和 C# 15 预览版(通过 .NET 11 SDK),包括泛型、模式匹配、异步和集合表达式。
- 零运行时依赖 – 无需 IDE,无需编译后的 DLL,也无需外部数据库;输出为单一 JSON 文件,任何消费者均可读取。
工具的工作原理
- 安装 – 安装 .NET 全局工具:
dotnet tool install --global Graphify.CSharp --framework net10.0 - 索引 – 在解决方案、项目或 SDK 风格源文件夹上运行 CLI:
该命令会生成一个包含三个顶级数组的 JSON 文档:graphify-csharp \ --input ./src/MyProduct.sln \ --root . \ --configuration Release \ --output ./graphify-out/csharp.jsonnodes、edges和hyperedges。 - 消费 – 代理可直接读取 JSON,使用
jq查询,或将其输入更广泛的 Graphify 工作流以进行路径查找、聚类和解释。 - 增量更新 – 添加
--watch可保持 Roslyn 工作区活跃,并在文件更改时更新 JSON;--rebuild强制完全刷新。
语义证据 vs. 纯文本搜索
| 无 Graphify | 使用 Graphify C# |
|---|---|
| 文本匹配仅找到名称字符串。 | Roslyn 为每个用法解析出确切的声明。 |
| 重载和泛型存在歧义。 | 绑定后的签名和项目/TFM 身份得以保留。 |
| 仅在测试中使用的用法需手动检查。 | 每个调用者都携带项目、命名空间和源位置信息。 |
| 类型关系必须从文本中推断。 | inherits、implements 和 overrides 作为显式边出现。 |
示例:方法 DeclarationCatalogBuilder.ForTesting 在图中仅从测试项目收到一条传入调用边,为代理提供了可靠的“仅在测试中使用”信号。
与 LLM 代理快速集成
该仓库提供了一个现成的 技能,适用于 Codex 兼容代理和 Claude Code。安装该技能只需一行命令:
mkdir -p .agents/skills/graphify-csharp
curl -fsSL https://raw.githubusercontent.com/zachsaw/graphify-csharp/main/.agents/skills/graphify-csharp/SKILL.md \
-o .agents/skills/graphify-csharp/SKILL.md
该技能指示代理在回答 C# 相关问题前刷新 JSON,并在遍历 calls 和 references 边时使用 symbol_key 标识符。
如果您不希望使用技能,只需在提示模板中添加以下说明:
对于 C# 结构和用法问题,请在回答前使用
graphify-csharp刷新graphify-out/csharp.json。通过symbol_key识别声明,并检查传入的calls和references边。将零传入边视为观察到的静态证据,而非运行时不可达的证明。
在此上下文中,代理可以回答如下问题:
- 哪个构造函数重载被调用?
- 哪些类实现了给定接口?
- 哪些成员重写了虚方法?
- 哪些声明没有观察到传入引用?
Graphify C# 在生态系统中的定位
| 工具 | 主要用途 | 与 Graphify C# 的重叠 |
|---|---|---|
| Rider / ReSharper | 交互式 IDE 导航、重构、检查。 | 提供相同的语义边,但仅限于 IDE 界面内。 |
| NDepend | 架构分析、度量、基线、可视化。 | 提供类似的调用者/依赖数据,但为商业、重型套件。 |
| Graphify C# | 无头、语言级语义索引,供代理使用。 | 以开放的 JSON 格式提供原始、编译器准确的边;无 UI,无许可限制。 |
Graphify C# 故意定位狭窄:它不试图取代 NDepend 的报告或 Rider 的 UI,而是填补自动化代理所需可靠静态证据的空白。
性能与可扩展性考虑
- JSON 大小 – 对于数百万行代码的解决方案,输出可能变得很大。用户已询问 SQLite 存储是否更具可扩展性。目前工具输出 JSON;下游消费者可根据需要将其导入数据库。
- 运行时开销 – Roslyn 仅在索引期间加载。
--watch模式保持工作区活跃,但索引仍是按需操作,而非持续后台服务。 - 静态分析限制 – 图仅反映 Roslyn 能静态看到的内容。反射、DI 容器、原生互操作和动态调用不会作为边表示。因此,零传入边意味着 零观察到的静态引用,而非保证运行时死代码。
Hacker News 社区反馈
bob1029: "我的 VS Copilot 已经编写一次性 Roslyn 脚本;Graphify C# 表明社区仍未能充分利用 Roslyn 为 LLM 代理服务。"
spicyusername: "对即将到来的 C# 15 联合类型感到兴奋;Graphify C# 已支持预览编译器。"
JFuzz: "已将该技能适配用于 Unity 包开发;CLI + JSON 工作流使语义数据在 IDE 外也可访问。"
Merad: "担心在数百万行代码上 JSON 的可扩展性;建议使用 SQLite 后端。" coverband: "询问输出格式是否与更广泛的 Graphify‑Labs 生态系统对齐。"
quietraster: "想知道索引是在保存时还是按需进行;该工具按需索引(或通过
--watch)。"
这些评论凸显了对该方法的热情以及对可扩展性和集成的实际疑问。
快速入门检查清单
- 安装适当的运行时 – 为 Roslyn 5.9(C# 14)选择
net10.0,为 .NET 11 SDK(C# 15 预览版)选择net11.0。 - 运行索引器 – 将
graphify-csharp指向您的解决方案;验证生成的csharp.json包含nodes和edges。 - 与您的代理集成 – 添加提供的技能,或在提示中嵌入刷新和查询说明。
- 迭代 – 在活跃开发中使用
--watch,或在 CI 管道中安排定期刷新。
许可与贡献
Graphify C# 采用 MIT 许可证发布。仓库包含构建脚本(dotnet restore、dotnet build、dotnet test、dotnet pack)以及 docs/ 文件夹中的详尽文档,涵盖使用、兼容性、增量索引和发布流程。
Sources
相关
- 项目