我如何在Roslyn中使用StyleCop

问题描述 投票:0回答:1

我正在像这样使用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 stylecop
1个回答
0
投票

默认情况下,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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.