Roslyn analyzer/codefix开发:如何向消费项目添加所需基类与依赖
Roslyn Analyzer 带CodeFix的两个问题解决方案
1. 编译期注入所需基类的实现方案
- 优先采用*增量源生成器(Incremental Source Generator)*实现无感知的编译期基类注入:
- 在你的Analyzer项目中新增实现
IIncrementalGenerator接口的生成器,将基类代码硬编码为字符串输出,生成时标注[GeneratedCode]特性,设置类型可见性为internal避免命名冲突,如需跨程序集使用可配合InternalsVisibleTo特性 - 打包时将源生成器和Analyzer一同打入Nuget包的
analyzers/dotnet/cs目录,消费项目安装包后会自动在编译阶段生成基类代码,不会在用户项目中留下物理文件,完全符合编译期可用的要求
- 在你的Analyzer项目中新增实现
- 如果基类逻辑固定不需要动态生成,也可以直接把基类
.cs文件放入Nuget包的contentFiles/cs/any目录,设置文件的BuildAction为C# compiler,Nuget会自动将其作为编译时源文件引入消费项目,实现效果和源生成器一致。
2. 依赖检测与缺失处理方案
分析阶段检测依赖
你完全可以在分析阶段判断消费项目是否已安装所需第三方依赖:
- 调用
Compilation.GetTypeByMetadataName("第三方包的完整类型限定名"),如果返回null即可判定依赖缺失或者版本不兼容 - 也可遍历
Compilation.References集合,匹配第三方依赖的程序集名、公钥Token和版本号,实现更精准的版本校验
避免CodeFix生成代码编译失败的处理
两种可选方案:
- 方案1:将第三方依赖直接声明为你的Analyzer Nuget包的依赖项,用户安装你的Analyzer包时Nuget会自动拉取对应版本的依赖,无需额外开发逻辑
- 方案2:在CodeFix逻辑中加入依赖检测分支,检测到依赖缺失时,通过
Microsoft.CodeAnalysis.WorkspacesAPI 自动向用户项目的.csproj文件添加对应版本的PackageReference节点,也可弹出提示让用户选择是否自动安装依赖
注意:修改项目文件的API仅支持SDK风格的.NET项目,非SDK风格的.NET Framework项目需要额外做兼容处理。
内容的提问来源于stack exchange,提问作者ʃʈɑɲ
相关产品推荐
相关产品推荐

