我正在像这样使用Roslyn构建我的C#代码:
var solution = workspace.OpenSolutionAsync(projectPath).Result;
var project = solution.GetProject(solution.ProjectIds[0]);
var compilation = project.GetCompilationAsync().Result;
编译后,我可以通过执行以下操作来访问任何警告或错误:
System.Collections.Immutable.ImmutableArray<Diagnostic> DiagnosticMessages = compilation.GetDiagnostics();
这会给我有关项目的任何错误和警告,但不会给StyleCop提供任何错误和警告。 .csproj使用的是StyleCop。
我如何使用Roslyn进行编译,同时也使用StyleCop,并使其从编译和StyleCop中返回警告和错误?
我已经安装了Roselyn,并且成功完成了解决方案,项目和编译。我可以从Visual Studio编译器中看到错误和警告,但不能从StyleCop中看到警告。
我想查看StyleCop错误编号以及StyleCop警告或错误消息。
我确实在ProjectPath中的解决方案上打开了StyleCop。如果我在该解决方案上使用Visual Studio进行构建,它将正确显示警告。
我希望看到与Visual Studio一起在该解决方案上编译的错误和警告的相同列表。
但是实际结果是来自编译器的错误和警告,但StyleCop没有提供。我正在使用StyleCop 1.1.118。
默认情况下,roslyn仅向您显示编译器诊断信息。您可以使用compilation.WithAnalyzers
名称空间中的Microsoft.CodeAnalysis.Diagnostics
要求分析运行一组分析器。为给定项目获取all诊断的示例如下所示:
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.MSBuild;
public static class RoslynExtensions
{
static async Task<ImmutableArray<Diagnostic>> GetAllDiagnosticsForProjectAsync(this MSBuildWorkspace workspace,
string projectPath,
CancellationToken token = default)
{
var solution = await workspace.OpenSolutionAsync(projectPath, cancellationToken: token);
var project = solution.GetProject(solution.ProjectIds[0]);
var analyzers = project.AnalyzerReferences.SelectMany(ar => ar.GetAnalyzers(project.Language)).ToImmutableArray();
var compilation = await project.GetCompilationAsync(token);
var compilationWithAnalyzers = compilation.WithAnalyzers(analyzers, project.AnalyzerOptions);
var diagnostics = await compilationWithAnalyzers.GetAllDiagnosticsAsync(token);
return diagnostics;
}
}