位于另一个解决方案

时间:2016-09-12 11:52:17

标签: c# roslyn roslyn-code-analysis

我们正在使用Roslyn Compiler为给定的应用程序代码生成依赖关系图。应用程序代码可以跨越多个解决方案,并且可以在解决方案之间引用(例如,一个解决方案中的服务代码,另一个解决方案中的通用业务逻辑等)。

为了生成依赖关系图,我们需要所有自定义类型的完全限定名称确切路径 (我们创建的应用程序代码。)

Roslyn恰好使用 SemanticModel的符号信息来提供此信息。

有效的情景

如果在同一个解决方案(在某个项目下)声明类型,则SemanticModel的符号信息为任何类型提供位置(路径)和 ContainingSymbol 信息它正在被使用

不起作用的情景

如果引用的类型不是当前解决方案的一部分,但是某些其他解决方案的一部分正在现有解决方案中被引用,那么SemanticModel不会给出任何可以给出路径和完全合格名称的符号信息。

注意:

  1. 我们已尝试使用 GetSpeculativeSymbolInfo GetSpeculativeTypeInfo 的变体。但它没有提供任何信息。它只是提到它是MetaData的一部分(好像我们使用的是.NET Class Lib中的Type)。
  2. 以下链接“Get fully-qualified metadata name in Roslyn”给出了指示;但该方法在交叉解决方案引用的上下文中不起作用。
  3. 已审阅以下链接:“Roslyn: get the symbol for a type defined in a third-party library”。但这不是很好(或者可能是我们在一些简单的事情上缺失)。我们试图探索使用 Compilation.GetTypeByMetadataName()的选项。
  4. 期待专家的一些指示。

    编辑:更多详情

    //测试示例代码

    public class TestClass
    {
        Student student = new Student();
        Person person = new Person();
    }
    
    public class Student
    {
        public string Name { get; set; }
    }
    

    备注

    1. TestClass 是项目 Project_1 的一部分,该项目位于 Solution_1
    2. TestClass有两个成员:  学生类是项目 Project_2 的一部分,该项目位于 Solution_1 中,而 Project_1 包含项目参考 Project_2 即可。
      是项目 Project_XYZ 的一部分,该项目位于 Solution_XYZ Project1 来自 Solution_1 从解决方案 Solution_XYZ 中有一个dll引用 Project_XYZ
    3. 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

      希望我能够更好地概述我的问题。 期待进一步的更新。

0 个答案:

没有答案