分析器,用于检查项目参考

bau*_*arb 1 c# roslyn roslyn-code-analysis

我想创建一个解决方案,用于控制C#项目中的项目引用。理想情况下,此解决方案与IDE无关,因此可以与Visual Studio,Jetbrains Rider甚至VS Code一起使用。这样做的原因是,由于人们创建了几乎任意的项目引用,所以我看到的解决方案被完全弄乱了。在项目发展到一定规模后,要使它们变得直立是非常困难的。

我知道Visual Studio Enterprise提供了开箱即用的功能。不幸的是,在我目前的公司中,我们没有VS Enterprise。因此,我想自己创建一个。

那么什么是最好的方法呢?经过研究后,我认为将.NET编译器平台(“ Roslyn”)与Workspace API结合使用可能是一个好主意?似乎我可以将其部署为NuGet软件包,然后可以在任何IDE或自动生成中使用。但是,也许有一种更简便或更好的方法,在开始研究之前,我想听听您的意见。

另外:如果“ Roslyn”方法正确,那么在如何创建与Workspace API一起使用的分析器方面是否有一些好的资源?

提前致谢。

Kri*_*ten 5

在您的分析器中,注册一个编译开始操作:

public override void Initialize(AnalysisContext context)
{
    context.RegisterCompilationStartAction(Initialize);
}

private void Initialize(CompilationStartAnalysisContext context)
{
    var compilation = context.Compilation;
}
Run Code Online (Sandbox Code Playgroud)

在该编译对象中,您有多种选择:

var referencedAssemblyNames = compilation.ReferencedAssemblyNames;
Run Code Online (Sandbox Code Playgroud)

要么

var references = compilation.References;
Run Code Online (Sandbox Code Playgroud)

然后进行分析。要报告诊断,登记上的操作CompilationStartAnalysisContext使用context.RegisterCompilationEndAction

如果您不需要查看实际项目内容来进行分析,则可以使用RegisterCompilationAction以下方法:

[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class TooManyReferencesAnalyzer : DiagnosticAnalyzer
{
    private static DiagnosticDescriptor TooManyReferences { get; } =
        new DiagnosticDescriptor(
            "DEMO",
            "Don't use too many references",
            "The project '{0}' has {1} references",
            category: "Maintainability",
            defaultSeverity: DiagnosticSeverity.Warning,
            isEnabledByDefault: true);

    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics =>
        ImmutableArray.Create(TooManyReferences);

    public override void Initialize(AnalysisContext context)
    {
        context.RegisterCompilationAction(AnalyzeCompilation);
    }

    private void AnalyzeCompilation(CompilationAnalysisContext context)
    {
        var compilation = context.Compilation;
        int referenceCount = compilation.References.Count();

        if (referenceCount > 5)
        {
            context.ReportDiagnostic(
                Diagnostic.Create(
                    TooManyReferences,
                    null,
                    compilation.AssemblyName,
                    referenceCount));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @baumgarb给出了示例。 (2认同)