2012-11-25 80 views
5

我想通了,我无法从另一轻松地将一个脚本库:如何从Roslyn脚本文件加载引用的脚本库?

module.csx

string SomeFunction() { 
    return "something"; 
} 

script.csx

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

这是因为编译器不知道模块。 csx在编译script.csx afaiu时。我可以添加另一个脚本来加载这两个文件,这将起作用。但那不是那么漂亮。

取而代之,我喜欢在我的脚本中为我的脚本检查特殊语法“加载模块”,并在实际脚本执行之前执行这些模块。

script.csx

// load "module.csx" 
SomeFunction() 

现在,有一些基本的字符串处理,我可以找出哪些模块加载(线包含//负荷......)和(这里要点https://gist.github.com/4147064)加载该文件:

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

但是 - 因为我们谈论的罗斯林,应该有解析为我找语法脚本一些不错的办法,对不对?

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

+0

整个事情的第一个版本:https://github.com/joeriks/RoslynWebScript – joeriks

回答

6

目前在Roslyn中没有办法引用另一个脚本文件。我们正在考虑将#load作为交互式窗口的主机命令作为语言的一部分(如#r),但目前尚未实施。

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

+0

谢谢,所以我会分析我的o的语法树wn指令(例如#load),然后创建一个没有该指令的新树,并执行新树?或者我应该更好地使用Compilation.Create ...而不是脚本执行? – joeriks

+0

重写树并调用Execute听起来像是一个合理的计划。 –

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() 
...