5

あるスクリプトライブラリを別のスクリプトライブラリから簡単にロードできないことがわかりました。

module.csx

string SomeFunction() {
   return "something";
}

script.csx

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

これは、コンパイラがscript.csxafaiuをコンパイルするときにmodule.csxを認識していないためです。別のスクリプトを追加して、その1つから2つのファイルをロードすると、それが機能します。しかし、それはそれほどきれいではありません。

代わりに、scripthostにスクリプト内の特別な構文「loadmodule」をチェックさせ、実際のスクリプトを実行する前にそれらのモジュールを実行するのが好きです。

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について話しているので、私が探している構文のスクリプトを解析するための優れた方法があるはずですよね?

そして、それはコードのモジュールライブラリを処理する方法さえ存在するかもしれませんか?

4

3 に答える 3

6

現在、Roslynには、別のスクリプトファイルを参照する方法がありません。#loadインタラクティブウィンドウのホストコマンドから言語の一部(など)への移行を検討しています#rが、現在は実装されていません。

文字列の処理方法については、通常どおりに解析してから、不明なタイプのプリプロセッサディレクティブを探し、その方法で構造を詳しく調べることができます。

于 2012-11-28T15:51:55.440 に答える
6

https://github.com/dotnet/roslyn/commit/f1702c#loadで、スクリプトファイルのサポートが追加されました。

この機能は、Visual Studio 2015Update1で使用できるようになります。

于 2015-11-19T20:01:23.687 に答える
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()
...
于 2017-11-21T19:44:40.670 に答える