如何为代码分析器正确定义属性并将其暴露给引用项目
解决方案
标准实现方案
官方首推无依赖的.editorconfig配置方案,兼容性最强,完全不会产生框架适配问题:
- 逻辑原理:所有Roslyn代码分析器原生支持从项目的
.editorconfig文件读取自定义配置,不需要让使用项目引用任何额外程序集 - 实现步骤:
- 在分析器代码中定义配置键并读取值,示例代码:
// 自定义配置键 internal const string ConfigKeySkipEmptyCheck = "skip_empty_check"; // 分析逻辑中读取配置 var skipCheck = context.Options.GetOption<bool>(ConfigKeySkipEmptyCheck, context.Tree, cancellationToken);- 使用方直接在项目
.editorconfig中添加对应配置即可控制分析器行为,示例:
dotnet_diagnostic.你的诊断ID.skip_empty_check = true - 优势:无任何程序集依赖、版本冲突风险,支持所有.NET Framework/.NET Core/.NET 5+项目,不会产生任何编译警告。
若必须使用特性标记控制的处理方案
如果你的场景需要在业务代码中加特性标记(比如指定某方法跳过分析),可以用以下方案解决当前问题:
- 重构
Analyzer.interface项目的目标框架
将该项目设置为多目标框架,在项目文件中配置:
也可直接定向到<TargetFrameworks>netstandard2.0;net40;net472</TargetFrameworks>netstandard1.0,可兼容所有.NET Framework 4.5+及.NET Core全版本,彻底解决框架适配问题 - 调整打包规则
将Analyzer.interface设置为分析器NuGet包的依赖项,标记为开发依赖(DevelopmentDependency),使用方安装分析器时会自动适配对应框架版本的依赖,不会出现升级后找不到包的问题 - 极致兼容方案
可以将特性类的源码直接作为contentFiles打包到分析器的NuGet包中,用户安装时会自动将特性代码添加到项目内,完全不需要额外引用程序集,彻底避免版本、框架冲突。
当前问题根因
- 编译警告:你当前的分析器面向.NET Standard 2.0,引用了仅面向.NET Framework 4.0的
Analyzer.interface项目,NuGet会用兼容模式 fallback 到.NET Framework 4.6.1,因此抛出警告 - 升级后找不到包:你打包的
Analyzer.interface仅包含.NET Framework 4.0的目标版本,升级到4.7.1后NuGet默认开启了更严格的框架适配检查,找不到对应版本的适配包因此报错
内容的提问来源于stack exchange,提问作者Aze
相关产品推荐
相关产品推荐

