用途:扫描 C# 代码库中对难以测试的静态 API 的调用,生成按频率排序的报告,显示哪些静态调用最常见、哪些文件受影响最大,以及 .NET 生态中可用于替换的抽象。适用于添加单元测试前审计可测试性、了解遗留代码中静态耦合的范围、确定优先包装哪些静态调用、制定渐进式可测试性改进的迁移计划。
主要能力:按类别搜索静态依赖模式,包括时间(DateTime.Now/UtcNow/Today、DateTimeOffset、Task.Delay、CancellationTokenSource)、文件系统(File.、Directory.、Path.)、环境(Environment.)、网络(new HttpClient、GetAsync/PostAsync/SendAsync)、控制台(Console.)、进程(Process.)。聚合统计每个类别的调用点总数、前 10 个高频模式、受影响最多的文件,并列出推荐替换抽象:时间用 TimeProvider(.NET 8+)、文件系统用 System.IO.Abstractions、HTTP 用 IHttpClientFactory、环境用自定义 IEnvironmentProvider、控制台用 IConsole 或 ILogger、进程用自定义 IProcessRunner。
使用方式:输入目标路径(文件、目录、.csproj 或 .sln),可选排除模式(如 /obj/)和类别过滤。扫描时递归处理 .cs 文件,始终排除 obj/、bin/ 及用户指定排除项。输出结构化报告,含范围、扫描文件数、总调用点、类别汇总表、Top 10 模式表、受影响文件表和迁移优先级。
限制:不生成包装器(应交给 generate-testability-wrappers),不做机械迁移(交给 migrate-static-to-wrapper)。若静态调用已在接口或 TimeProvider 之后,或代码非 C#/.NET,则不适用。仅扫描生产代码,排除测试项目。.NET 8 以下版本建议 NodaTime.IClock 或自定义 ISystemClock。需注意避免扫描 obj/ 和生成代码,避免把已包装调用计为静态,检查 .csproj 的 TargetFramework。