2012-11-25 29 views
5

私は簡単に別の1つのスクリプトライブラリをロードすることはできません考え出し:参照スクリプトライブラリをRoslynスクリプトファイルから読み込む方法は?

module.csx

string SomeFunction() { 
    return "something"; 
} 

script.csx

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

コンパイラがモジュールを認識していないためです。 csxはscript.csx afaiuをコンパイルするときに使用します。私は別のスクリプトを追加して、そこから2つのファイルを読み込むことができます。しかしそれはそれほど美しいものではありません。

代わりに、スクリプトホスト内で特別な構文 "load module"をチェックし、実際のスクリプトの実行前にそれらのモジュールを実行するのが好きです。今

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)を作成し、そのディレクティブを持たない新しいツリーを作成し、新しいツリーを実行しますか?それとも、Scripting Executeの代わりに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() 
... 
関連する問題