gpt4 book ai didi

c# - Roslyn/Find References - 无法正确加载工作区

转载 作者:太空狗 更新时间:2023-10-29 20:04:40 27 4
gpt4 key购买 nike

我正在尝试编写一些代码来查找任何给定方法的所有方法调用,因为我正在寻找创建一个开源 UML 序列图工具。但是,我遇到了问题,无法通过前几行代码:/

API 似乎发生了翻天覆地的变化,我似乎无法通过查看代码推断出正确的用法。

当我这样做时:

    var workspace = new CustomWorkspace();
string solutionPath = @"C:\Workspace\RoslynTest\RoslynTest.sln";
var solution = workspace.CurrentSolution;

我发现 workspace.CurrentSolution 有 0 个项目。我认为这将等同于之前的 Workspace.LoadSolution( string solutionFile ) ,后者应该包含解决方案中的任何项目,但我没有发现这条路径有任何成功。

我很困惑0.o

如果有人可以就如何使用 FindReferences API 来识别特定方法的所有调用提供一些额外的指导,将不胜感激!

或者,采用静态分析方法会更好吗?我想支持 lambda、迭代器方法和异步等东西。

============================================= =====================

编辑-

这是一个基于已接受答案的完整示例:

using System.Linq;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.MSBuild;
using Microsoft.CodeAnalysis.FindSymbols;
using System.Diagnostics;

namespace RoslynTest
{
class Program
{
static void Main(string[] args)
{
string solutionPath = @"C:\Workspace\RoslynTest\RoslynTest.sln";
var workspace = MSBuildWorkspace.Create();
var solution = workspace.OpenSolutionAsync(solutionPath).Result;
var project = solution.Projects.Where(p => p.Name == "RoslynTest").First();
var compilation = project.GetCompilationAsync().Result;
var programClass = compilation.GetTypeByMetadataName("RoslynTest.Program");

var barMethod = programClass.GetMembers("Bar").First();
var fooMethod = programClass.GetMembers("Foo").First();

var barResult = SymbolFinder.FindReferencesAsync(barMethod, solution).Result.ToList();
var fooResult = SymbolFinder.FindReferencesAsync(fooMethod, solution).Result.ToList();

Debug.Assert(barResult.First().Locations.Count() == 1);
Debug.Assert(fooResult.First().Locations.Count() == 0);
}

public bool Foo()
{
return "Bar" == Bar();
}

public string Bar()
{
return "Bar";
}
}
}

最佳答案

CustomWorkspace

A workspace that allows manual addition of projects and documents.

由于您正在尝试加载解决方案,因此您应该使用 MSBuildWorkspace , 这是

A workspace that can be populated by opening MSBuild solution and project files.

您可以创建一个新的 MSBuildWorkspace 并调用 OpenSolutionAsync使用您的 solutionPath。对于引用查找部分,请查看 SymbolFinder .

关于c# - Roslyn/Find References - 无法正确加载工作区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23160685/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com