以编程方式访问 Roslyn 中的代码分析结果
Programmatically access Code analysis results in Roslyn
我正在构建一个工具来分析 C# 片段并提供一些反馈。我用
tree = CSharpSyntaxTree.ParseText(codeSample);
获取语法树,然后
semanticModel = compilation.GetSemanticModel(tree);
获取语义模型。
我可以使用 semanticModel.Compilation.GetDiagnostics();
发现代码中的语法错误,但我知道 Roslyn 也可以执行一些代码质量规则 (here and here) using the Roslyn Analyzers.
我的问题是:如何以编程方式获取代码中的那些代码风格问题,比如我可以获取语法错误?
解法:
首先,您必须加载 CodeAnalysis .dll
,并从中获取分析器:
var assembly = Assembly.LoadFrom(@"Microsoft.CodeAnalysis.NetAnalyzers.dll");
var analyzers = assembly.GetTypes()
.Where(t => t.GetCustomAttribute<DiagnosticAnalyzerAttribute>() is object)
.Select(t => (DiagnosticAnalyzer)Activator.CreateInstance(t))
.ToArray();
然后,在生成 Compilation
时,添加带有 WithAnalyzers(...)
的分析器:
var compilationWithAnalyzers = CSharpCompilation.Create("query")
.AddReferences(
MetadataReference.CreateFromFile(typeof(object).Assembly.Location)
).AddSyntaxTrees(tree).WithAnalyzers(ImmutableArray.Create(analyzers));
之后,您可以通过以下方式获得 CodeAnalysis 结果:
var analyzerDiagnostics = (await compilationWithAnalyzers.GetAllDiagnosticsAsync()).ToList();
我正在构建一个工具来分析 C# 片段并提供一些反馈。我用
tree = CSharpSyntaxTree.ParseText(codeSample);
获取语法树,然后
semanticModel = compilation.GetSemanticModel(tree);
获取语义模型。
我可以使用 semanticModel.Compilation.GetDiagnostics();
发现代码中的语法错误,但我知道 Roslyn 也可以执行一些代码质量规则 (here and here) using the Roslyn Analyzers.
我的问题是:如何以编程方式获取代码中的那些代码风格问题,比如我可以获取语法错误?
解法:
首先,您必须加载 CodeAnalysis .dll
,并从中获取分析器:
var assembly = Assembly.LoadFrom(@"Microsoft.CodeAnalysis.NetAnalyzers.dll");
var analyzers = assembly.GetTypes()
.Where(t => t.GetCustomAttribute<DiagnosticAnalyzerAttribute>() is object)
.Select(t => (DiagnosticAnalyzer)Activator.CreateInstance(t))
.ToArray();
然后,在生成 Compilation
时,添加带有 WithAnalyzers(...)
的分析器:
var compilationWithAnalyzers = CSharpCompilation.Create("query")
.AddReferences(
MetadataReference.CreateFromFile(typeof(object).Assembly.Location)
).AddSyntaxTrees(tree).WithAnalyzers(ImmutableArray.Create(analyzers));
之后,您可以通过以下方式获得 CodeAnalysis 结果:
var analyzerDiagnostics = (await compilationWithAnalyzers.GetAllDiagnosticsAsync()).ToList();