Roslyn内存中代码的静态代码分析

时间:2017-08-09 18:23:52

标签: c# roslyn roslyn-code-analysis

Roslyn文档提供了以下示例,作为编译某些代码并显示任何编译错误的方法。

我想知道是否有人知道在下面的示例中对变量sourceCode中包含的代码执行某些静态代码分析的方法。我已将StyleCop.Analyzers添加到我的测试项目中,但在此阶段我无法看到如何使用它来执行样式分析(例如可读性)。

使用StyleCop.Analyzers进行此操作是否可行,还是有替代方法?任何建议都感激不尽。

感谢。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace SemanticsCS
{
    class Program
    {
        static void Main(string[] args)
        {
            var sourceCode = @"using System;
                using System.Collections.Generic;
                using System.Text;

                namespace HelloWorld
                {
                    class Program
                    {
                        static void Main(string[] args)
                        {
                            Console.WriteLine(""Hello, World!"");
                        }
                    }
                }";
            SyntaxTree tree = CSharpSyntaxTree.ParseText(sourceCode);

            var root = (CompilationUnitSyntax)tree.GetRoot();
            var compilation = CSharpCompilation.Create("HelloWorld")
                                               .AddReferences(
                                                    MetadataReference.CreateFromFile(
                                                        typeof(object).Assembly.Location))
                                               .AddSyntaxTrees(tree);

            using (var ms = new MemoryStream())
            {
                EmitResult result = compilation.Emit(ms);
                if (!result.Success)
                {
                    IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic =>
                        diagnostic.IsWarningAsError ||
                        diagnostic.Severity == DiagnosticSeverity.Error);

                    foreach (Diagnostic diagnostic in failures)
                    {
                        Console.WriteLine(diagnostic.ToString());
                        Console.Error.WriteLine("{0}({1})", diagnostic.GetMessage(), diagnostic.Id);
                    }
                }
            }
         }
    }
}

1 个答案:

答案 0 :(得分:2)

实际上,这绝对是可能的。

您需要使用WithAnalyzers method向您的Roslyn Compilation添加分析器参考。

要使其工作,您需要向项目添加StyleCop.Analy‌zers的常规引用,然后在其中创建各种DiagnosticAnalyzer的实例。由于它们是internal,因此您需要反思。