在动态编译代码中使用Roslyn禁用API分析器遇类型识别问题求助
解决Roslyn动态编译中使用禁用API分析器的类型找不到问题
问题根源
Microsoft.CodeAnalysis.BannedApiAnalyzers NuGet包的分析器组件并非以常规程序集引用方式提供,而是作为Roslyn分析器扩展存放在包的analyzers目录下,因此直接在代码中无法引用CSharpSymbolIsBannedAnalyzer类型。
解决步骤
1. 确认NuGet包安装
先确保已安装Microsoft.CodeAnalysis.BannedApiAnalyzers包,安装后分析器程序集会存放在项目的NuGet缓存目录或本地packages/Microsoft.CodeAnalysis.BannedApiAnalyzers.x.x.x/analyzers路径下(根据目标框架不同,子目录如netstandard2.0)。
2. 通过反射加载分析器并创建实例
由于无法直接引用类型,需要通过反射加载分析器程序集,再实例化CSharpSymbolIsBannedAnalyzer:
using System.Reflection; using System.Collections.Immutable; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Diagnostics; // 1. 指定分析器程序集路径(需根据实际NuGet版本和框架调整) string analyzerDllPath = @"packages/Microsoft.CodeAnalysis.BannedApiAnalyzers.3.3.4/analyzers/netstandard2.0/Microsoft.CodeAnalysis.BannedApiAnalyzers.dll"; // 2. 加载分析器程序集 Assembly analyzerAssembly = Assembly.LoadFrom(analyzerDllPath); // 3. 反射获取目标类型并创建实例 Type bannedAnalyzerType = analyzerAssembly.GetType("Microsoft.CodeAnalysis.BannedApiAnalyzers.CSharpSymbolIsBannedAnalyzer"); DiagnosticAnalyzer bannedAnalyzer = (DiagnosticAnalyzer)Activator.CreateInstance(bannedAnalyzerType); // 4. 构建编译并绑定分析器 var compilation = CSharpCompilation.Create( "CustomScriptCompilation", syntaxTrees: ImmutableArray.Create(yourSyntaxTree), // 替换为你的语法树实例 references: yourAssemblyReferences, // 替换为你的程序集引用集合 options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); // 配置禁用API规则文本 var bannedRuleText = new BannedSymbolsAdditionalText(@"T:System.Diagnostics.Process;Don't use Process"); var analyzerOptions = new AnalyzerOptions(ImmutableArray.Create<AdditionalText>(bannedRuleText)); // 将分析器附加到编译流程 var compilationWithAnalyzers = compilation.WithAnalyzers( ImmutableArray.Create(bannedAnalyzer), analyzerOptions, CancellationToken.None); // 执行分析并获取诊断结果 var diagnostics = await compilationWithAnalyzers.GetAllDiagnosticsAsync(); foreach (var diag in diagnostics) { Console.WriteLine($"{diag.Id}: {diag.GetMessage()}"); }
3. 关键注意事项
- 路径适配:实际开发中建议动态获取分析器路径,比如通过项目输出目录(可将分析器dll设置为"复制到输出目录")或NuGet包的安装路径API获取。
- 规则格式:禁用规则文本需遵循官方规范,比如
T:类型全名称;禁用原因、M:方法全名称;原因等。 - 部署分发:发布应用时需将分析器dll随程序一起打包,确保运行时能加载到该文件。
内容的提问来源于stack exchange,提问作者Jun
相关产品推荐
相关产品推荐

