我找不到使用罗斯林为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
如果有人知道如何使用此命名空间来构造控制流程图,或者有示例要使用,请使用。谢谢
我设法从方法节点创建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] 删除。
我来说两句