首页 > 解决方案 > Roslyn 语义分析:为什么从单元测试调用时会有所不同?

问题描述

考虑下面的代码。

我的解决方案.sln

using System;
using System.Linq;
using Microsoft.Build.Locator;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.MSBuild;

public class MyApp
{
    public static void Main(string[] args)
    {
        MSBuildLocator.RegisterDefaults();

        var workspace = MSBuildWorkspace.Create();
        var solution = workspace
            .OpenSolutionAsync(@"/<PATH>/SolutionToAnalyse.sln")
            .Result;

        var project = solution.Projects.First();
        var compilation = project.GetCompilationAsync().Result;
        var documents = project.Documents.ToList();
        var document = documents.First(d => d.Name.Equals("Foo.cs"));
        var syntaxTree = document.GetSyntaxTreeAsync().Result;
        var root = syntaxTree!.GetRoot();
        var semanticModel = compilation!.GetSemanticModel(syntaxTree);

        // fetch myList.Any()
        var inVocExSyn = root.DescendantNodes().OfType<InvocationExpressionSyntax>().ToList()[0];
        var iSym = semanticModel.GetSymbolInfo(inVocExSyn).Symbol;
        // prints System.Collections.Generic.IEnumerable<int>.Any<int>()
        Console.WriteLine(iSym);
    }
}

SolutionToAnalyse.sln - 包含一个项目和一个文件 Foo.cs:

public class Foo
{
    public void FooMethod()
    {
        List<int> myList = new List<int>();

        if (myList.Any())
        {
            Console.WriteLine("List is not empty");
        }
    }
}

运行程序,例如,通过使用dotnet run,它会打印System.Collections.Generic.IEnumerable<int>.Any<int>(),这是预期的行为。

但是,如果程序是从测试环境中执行的,例如 xUnit:

public class UnitTest
{
    [Fact]
    public void Test1()
    {
        MyApp.Main(new[] {""});
    }
} 

它打印一个空行,因为它iSym是空的。这是为什么?

标签: c#roslynroslyn-code-analysis

解决方案


推荐阅读