【问题标题】:Static code analysis on Roslyn in-memory codeRoslyn 内存代码的静态代码分析
【发布时间】:2017-08-10 05:46:55
【问题描述】:

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);
                    }
                }
            }
         }
    }
}

【问题讨论】:

  • StyleCop.Analyzers 是一套规则并为您分析项目代码。当您尝试编译源代码时,此规则会分析 C# 代码。如果您查看.csproj 文件并找到类似&lt;Analyzer Include="..\packages\StyleCop.Analyzers.1.0.2\analyzers\dotnet\cs\StyleCop.Analyzers.CodeFixes.dll" /&gt; 的内容,您可以检索此信息。所以 StyleCop.Analyzers 无法分析包含代码的静态或动态(sourceCode1 + sourceCode2)字符串。
  • 感谢@GeorgeAlexandria

标签: c# roslyn roslyn-code-analysis


【解决方案1】:

其实这是完全可能的。

您需要使用 WithAnalyzers method 将分析器引用添加到您的 Roslyn Compilation

要完成这项工作,您需要在项目中添加对StyleCop.Analy‌zers 的普通引用,然后在其中创建各种DiagnosticAnalyzers 的实例。因为他们是internal,所以你需要反射。

【讨论】:

  • 这是非常有用的信息,因为我不知道CompilationWithAnalyzers,所以给出了不正确的建议。谢谢。
  • 太好了,非常感谢@Slaks - 就像 George 我不知道 CompilationWithAnalyzers 但觉得这肯定是可能的。
猜你喜欢
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 2018-04-01
  • 2012-10-04
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多