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 文件,任何消费者均可读取。

工具的工作原理

  1. 安装 – 安装 .NET 全局工具:
    dotnet tool install --global Graphify.CSharp --framework net10.0
    
  2. 索引 – 在解决方案、项目或 SDK 风格源文件夹上运行 CLI:
    graphify-csharp \
      --input ./src/MyProduct.sln \
      --root . \
      --configuration Release \
      --output ./graphify-out/csharp.json
    
    该命令会生成一个包含三个顶级数组的 JSON 文档:nodesedgeshyperedges
  3. 消费 – 代理可直接读取 JSON,使用 jq 查询,或将其输入更广泛的 Graphify 工作流以进行路径查找、聚类和解释。
  4. 增量更新 – 添加 --watch 可保持 Roslyn 工作区活跃,并在文件更改时更新 JSON;--rebuild 强制完全刷新。

语义证据 vs. 纯文本搜索

无 Graphify 使用 Graphify C#
文本匹配仅找到名称字符串。 Roslyn 为每个用法解析出确切的声明。
重载和泛型存在歧义。 绑定后的签名和项目/TFM 身份得以保留。
仅在测试中使用的用法需手动检查。 每个调用者都携带项目、命名空间和源位置信息。
类型关系必须从文本中推断。 inheritsimplementsoverrides 作为显式边出现。

示例:方法 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,并在遍历 callsreferences 边时使用 symbol_key 标识符。

如果您不希望使用技能,只需在提示模板中添加以下说明:

对于 C# 结构和用法问题,请在回答前使用 graphify-csharp 刷新 graphify-out/csharp.json。通过 symbol_key 识别声明,并检查传入的 callsreferences 边。将零传入边视为观察到的静态证据,而非运行时不可达的证明。

在此上下文中,代理可以回答如下问题:

  • 哪个构造函数重载被调用?
  • 哪些类实现了给定接口?
  • 哪些成员重写了虚方法?
  • 哪些声明没有观察到传入引用?

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)。"

这些评论凸显了对该方法的热情以及对可扩展性和集成的实际疑问。


快速入门检查清单

  1. 安装适当的运行时 – 为 Roslyn 5.9(C# 14)选择 net10.0,为 .NET 11 SDK(C# 15 预览版)选择 net11.0
  2. 运行索引器 – 将 graphify-csharp 指向您的解决方案;验证生成的 csharp.json 包含 nodesedges
  3. 与您的代理集成 – 添加提供的技能,或在提示中嵌入刷新和查询说明。
  4. 迭代 – 在活跃开发中使用 --watch,或在 CI 管道中安排定期刷新。

许可与贡献

Graphify C# 采用 MIT 许可证发布。仓库包含构建脚本(dotnet restoredotnet builddotnet testdotnet pack)以及 docs/ 文件夹中的详尽文档,涵盖使用、兼容性、增量索引和发布流程。

Sources

相关

  • 项目