【问题标题】:How to get unresolved symbols in Roslyn?如何在 Roslyn 中获取未解析的符号?
【发布时间】:2017-03-01 18:58:11
【问题描述】:

我正在使用 Roslyn 用 C# 构建脚本引擎,我想编译一段来自用户的代码。在脚本 UI 中,用户可以添加对其他我不知道的 C# dll 的引用。

在用户的代码中,我想在已知的引用中找到已解析的符号,以及未解析的符号。

例如,我有一个包含此类的 dll:

public class A {
    public static double Stuff { get; }
}

用户添加这个 dll 作为他的脚本的参考。 然后在他的脚本中,用户写道:

var x = A.Stuff * MyVariable;
return x;

我想使用 Roslyn 来编译它,并告诉我 xA.Stuff 是已知符号,而 MyVariable 不是,因此我可以从代码中推断出 MyVariable 是用户输入。

现在我正在这样做:

var syntaxTree = CSharpSyntaxTree.ParseText(usercode,
    new CSharpParseOptions(LanguageVersion.Default, DocumentationMode.None, SourceCodeKind.Script));
var mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var userlib = MetadataReference.CreateFromFile(userlibPath);

var compilation = CSharpCompilation.Create("MyCompilation",
            syntaxTrees: new[] { syntaxTree }, references: new[] { mscorlib, userlib });

var model = compilation.GetSemanticModel(syntaxTree);

但我不知道如何使用语义模型中的信息。这在任何地方都没有很好的记录......

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

    您可以尝试获取变量声明并检查它:

    var decl = model.GetSymbolInfo(identifier)
                    .Symbol
                   ?.DeclaringSyntaxReferences
                    .FirstOrDefault();
    

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 2015-06-02
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多