检查项目引用的分析器

时间:2018-06-02 07:08:00

标签: 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" -way是正确的,那么有一些关于如何创建与Workspace API一起使用的分析器的良好资源吗?

提前致谢。

1 个答案:

答案 0 :(得分:3)

在分析仪中,注册编译开始操作:

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

private void Initialize(CompilationStartAnalysisContext context)
{
    var compilation = context.Compilation;
}

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

var referencedAssemblyNames = compilation.ReferencedAssemblyNames;

var references = compilation.References;

然后进行分析。要报告诊断,请使用CompilationStartAnalysisContextcontext.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));
        }
    }
}