我们正在使用Roslyn Compiler为给定的应用程序代码生成依赖关系图。应用程序代码可以跨越多个解决方案,并且可以在解决方案之间引用(例如,一个解决方案中的服务代码,另一个解决方案中的通用业务逻辑等)。
为了生成依赖关系图,我们需要所有自定义类型的完全限定名称和确切路径 (我们创建的应用程序代码。)
Roslyn恰好使用 SemanticModel的符号信息来提供此信息。
有效的情景:
如果在同一个解决方案(在某个项目下)声明类型,则SemanticModel的符号信息为任何类型提供位置(路径)和 ContainingSymbol 信息它正在被使用。
不起作用的情景:
如果引用的类型不是当前解决方案的一部分,但是某些其他解决方案的一部分正在现有解决方案中被引用,那么SemanticModel不会给出任何可以给出路径和完全合格名称的符号信息。
注意:
期待专家的一些指示。
编辑:更多详情
//测试示例代码
public class TestClass
{
Student student = new Student();
Person person = new Person();
}
public class Student
{
public string Name { get; set; }
}
备注:
Project_XYZ 的.dll将在 Solution_1 的位置“.. \ Projects \ SourceCode \ AllBinaries”和“ Project_1 ”中创建从此位置引用 Project_XYZ 的.dll“.. \ Projects \ SourceCode \ AllBinaries”
获取类型符号信息的代码:
private void GetSymbolDetails(TypeSyntax typeSyntax)
{
ISymbol symbol = semanticModel.GetSymbolInfo(typeSyntax).Symbol;
//HERE semanticModel = document.GetSemanticModelAsync().Result;
}
有效的情景:
当使用输入参数作为“IdentifierNameSyntax IdentifierName Student”调用上述代码时,“symbol”给出“Student”所需的所有符号详细信息(包括完全限定名称和确切路径)。
不起作用的情景:
当使用输入参数作为“IdentifierNameSyntax IdentifierName Person”调用上述代码时,“symbol”值为 null 。
希望我能够更好地概述我的问题。 期待进一步的更新。