使用.Net编译器Roslyn为C#代码创建控制流程图

哈姆扎

我找不到使用罗斯林为c#代码构造控制流程图的方法。

我知道Roslyn编译器中有一个名为“ Microsoft.CodeAnalysis.FlowAnalysis”的名称空间,其中包含一些类来创建控制流程图,但我不知道如何使用它。

https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.codeanalysis.flowanalysis?view=roslyn-dotnet

有一个名为ControlFlowGraph.cs的类,但问题是我无法从此类创建对象或子类。https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.codeanalysis.flowanalysis.controlflowgraph?view=roslyn-dotnet

如果有人知道如何使用此命名空间来构造控制流程图,或者有示例要使用,请使用。谢谢

卡雷尔(KarelFrajták)

我设法从方法节点创建CFG:

CSharpParseOptions options = CSharpParseOptions.Default
    .WithFeatures(new[] { new KeyValuePair<string, string>("flow-analysis", "")     
});

MSBuildWorkspace workspace = MSBuildWorkspace.Create();
Solution solution = workspace.OpenSolutionAsync(solutionUrl).Result; // path to your SLN file

ProjectDependencyGraph projectGraph = solution.GetProjectDependencyGraph();
Dictionary<string, Stream> assemblies = new Dictionary<string, Stream>();

var projects = projectGraph.GetTopologicallySortedProjects().ToDictionary(
    p => p,
    p => solution.GetProject(p).Name);

var bllProjectId = projects.First(p => p.Value == "<your project name>").Key; // choose project for analysis
var projectId = bllProjectId;
solution = solution.WithProjectParseOptions(projectId, options);

Compilation compilation = solution.GetProject(projectId).GetCompilationAsync().Result;
if (compilation != null && !string.IsNullOrEmpty(compilation.AssemblyName))
{
    var syntaxTree = compilation.SyntaxTrees.First();

    // get syntax nodes for methods
    var methodNodes = from methodDeclaration in syntaxTree.GetRoot().DescendantNodes()
            .Where(x => x is MethodDeclarationSyntax)
        select methodDeclaration;

    foreach (MethodDeclarationSyntax node in methodNodes)
    {
        var model = compilation.GetSemanticModel(node.SyntaxTree);
        node.Identifier.ToString().Dump();
        if (node.SyntaxTree.Options.Features.Any())
        {
            var graph = ControlFlowGraph.Create(node, model); // CFG is here
        }
        else
        {
            // "No features".Dump();
        }
    }
}

下一步将是CFG的分析...

卡雷尔

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否可以使用.NET Core Roslyn编译器编译单个C#代码文件?

使用Graphviz创建简单的流程图

如何从此代码绘制控制流程图?

活动图与控制流程图

如何在Visual Studio 2015中使用roslyn C#编译器?

如何使用jack编译器为Android编译代码?

使用Python在LibreOffice中创建流程图

为 C++03 编译器编写部分 unique_ptr,该编译器使用较新的编译器在公共代码库上运行

从抽象语法树获取控制流程图

在CC编译器中为C ++使用argv []

您可以从常规 .net 应用程序中使用 Roslyn 编译器吗?

在Windows上使用Cygwin64编译器和调试器为C设置VS代码

使用typeof(Expression <Func <,>>)的C#编译器错误

使用Roslyn和.NET Core生成C#代码

在Visual Studio 2013中使用Roslyn编译器

升级现有项目以使用Roslyn编译器

如何使用networkx中的pos参数创建流程图样式的图?(Python 3)

有什么方法可以使用PHP / MySQL动态创建流程图或UML?

kendo ui:使用图表小部件创建流程图?

如何在 Rshiny 应用程序中显示使用 R Diagram 库创建的流程图?

如何使用 Visual Studio 编译器在 Windows 上编译 cython 编译的 c 代码

C函数调用C ++成员函数-使用C编译器编译C代码

使用GCC编译器为代码的特定部分保留寄存器

为什么使用 Sonar Scanner 会阻止 C# 编译器创建 Razor Views 程序集?

使用LINQ方法Any()时,为什么C#编译器会创建私有DisplayClass,如何避免呢?

C编译器编译的C源代码中可以使用static_cast吗?

我如何让编译器向我警告标为pub的未使用代码?

LLVM中基于机器码的控制流程图

从Radare2获取完整的二进制控制流程图