【发布时间】: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 来编译它,并告诉我 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);
但我不知道如何使用语义模型中的信息。这在任何地方都没有很好的记录......
【问题讨论】: