相关疑难解决方法(0)

使用Roslyn查找对方法的所有引用

我正在寻找一组.cs文件来查看哪些调用a的Value属性Nullable<T>(查找所有引用).例如,这将匹配:

class Program
{
    static void Main()
    {
        int? nullable = 123;
        int value = nullable.Value;
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现了Roslyn并查看了一些样本,但其中许多已经过时且API非常庞大.我该怎么做呢?

解析语法树后我陷入困境.这是我到目前为止:

public static void Analyze(string sourceCode)
{
    var tree = CSharpSyntaxTree.ParseText(sourceCode);

    tree./* ??? What goes here? */
}
Run Code Online (Sandbox Code Playgroud)

c# code-analysis findall roslyn

19
推荐指数
1
解决办法
1万
查看次数

使用 Roslyn 查找特定方法的所有方法调用

我正在使用 Roslyn 开发代码分析器,我当前的任务是查找程序集中未使用的所有内部方法。

我从 a 开始MethodDeclarationSyntax并从中得到符号。然后,我使用FindCallersAsyncin 中的方法SymbolFinder,但即使我在程序集中某处调用相关方法,它也会返回一个空集合。请参阅下面的代码。

protected override void Analyze(SyntaxNodeAnalysisContext context)
{
    NodeToAnalyze = context.Node;
    var methodDeclaration = NodeToAnalyze as MethodDeclarationSyntax;

    if (methodDeclaration == null)
        return;

    var methodSymbol = context.SemanticModel.GetDeclaredSymbol(methodDeclaration) as ISymbol;

    if (methodSymbol.DeclaredAccessibility != Accessibility.Internal)
        return;

    var solutionPath = GetSolutionPath();

    var msWorkspace = MSBuildWorkspace.Create();
    var solution = msWorkspace.OpenSolutionAsync(solutionPath).Result;

    var callers = SymbolFinder.FindCallersAsync(symbol, solution).Result;  // Returns empty collection.

    ...
}
Run Code Online (Sandbox Code Playgroud)

我在这里看到了类似的代码,但在该示例中,方法符号是使用GetSymbolInfo以下方法获得的InvocationExpressionSyntax

//Get the syntax node for the first …
Run Code Online (Sandbox Code Playgroud)

c# roslyn roslyn-code-analysis

5
推荐指数
1
解决办法
4630
查看次数

Roslyn 在解决方案中的所有项目中查找对方法的所有引用

我一直在尝试在整个解决方案中找到对方法的所有引用。有人会认为SymbolFinder.FindReferencesAsync将 ISymbol 作为参数来搜索,而解决方案对象会这样做,但它不会......

所有文章和 SO 问题/答案似乎都指向它作为解决方案。它适用于在包含它的程序集中查找对该方法的所有引用,但不适用于任何引用它的项目。我有一个理论,这是因为当您进行引用时,方法的符号在引用程序集中是不同的,并且他们希望您获取该符号,然后将SymbolFinder.FindSourceDeclarationsAsync其解析为您正在寻找的实际符号。

如果是这样的话,我真的不知道如何去做?也许以某种方式获取程序集中所有符号的列表,然后对每个人进行 FindSource 调用并比较它以查看它是否引用您的 MethodSymbol?我当然希望不会!

这是一个简单的例子

public void Find2()
{
    string solutionPath = @"C:\Projects\RoslynTestTargetProject\RoslynTestTargetProject.sln";
    var msWorkspace = MSBuildWorkspace.Create();
    var solution = msWorkspace.OpenSolutionAsync(solutionPath).Result;
    var methodProjectComp = solution.Projects.Single(x => x.Name == "RoslynTestTargetProject").GetCompilationAsync().Result;

    // I have loaded these all kinds of different ways but it never impacts the end result
    var classWithMethodToSearchFor = methodProjectComp.GetTypeByMetadataName("RoslynTestTargetProject.Class1");
    var methodToSearchFor = classWithMethodToSearchFor.GetMembers("GetPerson").First() as IMethodSymbol;

    var references = SymbolFinder.FindReferencesAsync(methodToSearchFor, solution).Result;
    var callers = SymbolFinder.FindCallersAsync(methodToSearchFor, solution).Result;

    int c = references.Select(x …
Run Code Online (Sandbox Code Playgroud)

c# roslyn

5
推荐指数
1
解决办法
1515
查看次数