我发现我无法轻易地从另一个脚本库加载:
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,所以应该有一些很好的方法来解析我正在寻找的语法的脚本,对吧?
它甚至可能存在一种处理模块代码库的方法吗?
答案 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()
...