2012-11-25 42 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() 
...