2017-03-01 57 views
1

我正在C#中使用Roslyn構建腳本引擎,並且我想編譯用戶的一段代碼。在腳本UI中,用戶可以添加對我不瞭解的其他C#dll的引用。如何在Roslyn中獲取未解析的符號?

在用戶的代碼中,我想找到解析已知引用的符號以及未解析的符號。

舉例來說,我有一個包含此類別的DLL:

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

而且用戶添加此DLL作爲他的劇本的參考。 然後在他的劇本中,用戶寫道:

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

我想用羅斯林編譯這一點,並告訴我,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); 

但我不知道如何從語義模型使用的信息。這不是非常有據可查的任何地方......

回答

1

你可以嘗試得到變量聲明,並檢查它:

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