【问题标题】:How to generate Semantic Model from code file without project file using Roslyn如何使用 Roslyn 从没有项目文件的代码文件生成语义模型
【发布时间】:2018-03-15 11:51:34
【问题描述】:

我有两个文件如下:

namespace a
{
    Class Audi
    {
            public string Model(string a)
            {           
               Benz obj= new Benz();
               var str=obj.BenzDetails();
               return str;

            }
    }
}
namespace a
{
    Class Benz 
    {
            public string BenzDetails()
            {           
              return "some details";
            }
    }
}

我需要获取在 Audi 类(全局或本地)中创建的所有对象。我还需要获取使用这些声明的对象调用的方法的详细信息。

例如在这2个类中,对于奥迪类需要:

  • 对象已创建:- obj
  • 使用此对象调用的方法:- BenzDetails
  • 创建对象的类名:Benz
  • 该类的命名空间:a

我可以使用以下代码获取类中已声明对象的列表:

 var lstLocalObjects = syntaxTree.GetRoot().DescendantNodes().OfType<LocalDeclarationStatementSyntax>()
                                                .Where(x => x.Declaration.Variables.Any(p => p.Initializer.Value.Kind().ToString().Equals("ObjectCreationExpression", StringComparison.OrdinalIgnoreCase)));

我有语法树,我不知道如何生成语义模型。 是否可以仅使用语法树获得上述详细信息。请帮忙。 谢谢

【问题讨论】:

    标签: c# .net abstract-syntax-tree roslyn


    【解决方案1】:

    您需要通过调用CSharpCompilation.Create() 创建Compilation,传递您的SyntaxTree 和必要的引用(至少mscorlib)。

    然后您可以拨打GetSemanticModel(SyntaxTree)

    【讨论】:

    • @Gerry,看看simple example 创建了一个简单的Compilation。对于您的示例,只需从 Compilation 中添加对 GetSemanticModel(SyntaxTree tree, bool ignoreAccessibility) 的调用
    • 它抛出异常:MetadataReference.CreateFromFile(typeof(object).Assembly.Location) 无法加载文件或程序集'System.Reflection.Metadata
    猜你喜欢
    • 2015-03-06
    • 1970-01-01
    • 2017-04-08
    • 2014-05-17
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多