You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在Roslyn Analyzer中访问appsettings.json配置文件?

需求实现可行性结论

该需求完全可以实现,你遇到的RegisterAdditionalFileAction无法匹配appsettings*.json文件的问题,属于项目配置或分析器逻辑的常见疏漏,以下是完整排查和实现方案:

匹配失败常见原因
  • 首先确认appsettings*.json的生成操作属性配置错误:默认添加到项目的json文件生成操作是Content,不会被分析器识别为附加文件,需要手动修改文件属性的「生成操作」为「C# 分析器附加文件」,或者在csproj中添加如下配置:
<ItemGroup>
  <AdditionalFiles Include="appsettings.json" />
  <AdditionalFiles Include="appsettings.*.json" />
</ItemGroup>
  • 其次确认分析器逻辑没有做文件名过滤:RegisterAdditionalFileAction本身不会按后缀筛选文件,所有标记为附加文件的内容都会触发回调,你需要在回调逻辑中自行匹配文件名规则,不能依赖注册阶段自动过滤。
完整实现示例
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class AppsettingsRuleAnalyzer : DiagnosticAnalyzer
{
    // 诊断规则定义(根据自己的校验规则修改ID、提示信息等参数)
    public static readonly DiagnosticDescriptor InvalidConfigRule = new DiagnosticDescriptor(
        id: "CFG001",
        title: "appsettings配置不合规",
        messageFormat: "配置项{0}不符合规范:{1}",
        category: "ConfigurationCheck",
        defaultSeverity: DiagnosticSeverity.Warning,
        isEnabledByDefault: true);

    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(InvalidConfigRule);

    public override void Initialize(AnalysisContext context)
    {
        context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
        context.EnableConcurrentExecution();
        // 注册附加文件处理回调
        context.RegisterAdditionalFileAction(AnalyzeConfigFile);
    }

    private void AnalyzeConfigFile(AdditionalFileAnalysisContext context)
    {
        var fileName = Path.GetFileName(context.AdditionalFile.Path);
        // 过滤非appsettings前缀的json文件
        if (!fileName.StartsWith("appsettings", StringComparison.OrdinalIgnoreCase) 
            || !fileName.EndsWith(".json", StringComparison.OrdinalIgnoreCase))
        {
            return;
        }

        // 读取文件内容
        var fileText = context.AdditionalFile.GetText(context.CancellationToken);
        if (fileText == null) return;

        try
        {
            // 此处替换为你自己的json校验逻辑,比如解析后校验特定节点的取值
            var jsonRoot = JsonDocument.Parse(fileText.ToString()).RootElement;
            // 示例:校验是否存在必填的ConnectionStrings节点
            if (!jsonRoot.TryGetProperty("ConnectionStrings", out _))
            {
                var diagnostic = Diagnostic.Create(InvalidConfigRule, Location.None, "ConnectionStrings", "缺少必填的数据库连接配置节点");
                context.ReportDiagnostic(diagnostic);
            }
        }
        catch (JsonException)
        {
            // 可按需上报json格式错误的诊断
        }
    }
}
注意事项
  • 如果你使用SDK风格的项目,可以把附加文件配置写到Directory.Build.props中,统一作用于整个解决方案下的所有项目,不需要每个项目单独配置
  • 解析json时建议增加容错逻辑,避免用户输入的json格式不合法时导致分析器运行异常
  • 上报诊断时可以通过解析json的行号信息,把诊断位置关联到json文件的对应行,方便用户快速定位问题

内容的提问来源于stack exchange,提问作者Steve Wilford

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:54:02