1
我正在C#中使用Roslyn構建腳本引擎,並且我想編譯用戶的一段代碼。在腳本UI中,用戶可以添加對我不瞭解的其他C#dll的引用。如何在Roslyn中獲取未解析的符號?
在用戶的代碼中,我想找到解析已知引用的符號以及未解析的符號。
舉例來說,我有一個包含此類別的DLL:
public class A {
public static double Stuff { get; }
}
而且用戶添加此DLL作爲他的劇本的參考。 然後在他的劇本中,用戶寫道:
var x = A.Stuff * MyVariable;
return x;
我想用羅斯林編譯這一點,並告訴我,x
和A.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);
但我不知道如何從語義模型使用的信息。這不是非常有據可查的任何地方......