如何从Roslyn脚本文件加载引用的脚本库?

时间:2012-11-25 23:48:15

标签: c# roslyn

我发现我无法轻易地从另一个脚本库加载:

module.csx

string SomeFunction() {
   return "something";
}

script.csx

ExecuteFile("module.csx");
SomeFunction() <-- causes compile error "SomeFunction" does not exist

这是因为编译器在编译script.csx afaiu时不知道module.csx。我可以添加另一个脚本来加载那个文件中的两个文件,这样就行了。然而那不是那么漂亮。

相反,我喜欢在脚本中检查脚本中的特殊语法“load module”,并在实际脚本执行之前执行这些模块。

script.csx

// load "module.csx"
SomeFunction()

现在,通过一些基本的字符串处理,我可以确定要加载哪些模块(包含// load的行...)并加载这些文件(请点击此处https://gist.github.com/4147064):

foreach(var module in scriptModules) {
   session.ExecuteFile(module);
}
return session.Execute(script)

但是 - 因为我们正在谈论Roslyn,所以应该有一些很好的方法来解析我正在寻找的语法的脚本,对吧?

它甚至可能存在一种处理模块代码库的方法吗?

3 个答案:

答案 0 :(得分:6)

目前在Roslyn中无法引用其他脚本文件。我们正在考虑将#load从作为交互式窗口的主机命令移动到该语言的一部分(如#r),但目前尚未实现。

至于如何处理字符串,你可以正常解析它,然后查找未知类型的预处理器指令并深入研究这种结构。

答案 1 :(得分:5)

https://github.com/dotnet/roslyn/commit/f1702c起添加了对脚本文件中#load的支持。

此功能将在Visual Studio 2015 Update 1中提供。

答案 2 :(得分:1)

包括脚本:

#load "common.csx"
...

运行脚本时配置源解析程序

Script<object> script = CSharpScript.Create(code, ...);
var options = ScriptOptions.Default.WithSourceResolver(new SourceFileResolver(new string[] { }, baseDirectory));
var func = script.WithOptions(options).CreateDelegate()
...