[DLR]DLRを使ったホスティング2(変数)

前回は、ScriptEngineクラスかScriptクラスを使ったスクリプトの実行方法を説明しました。今回は、変数を外部からどのように引き渡すかを説明します。最初にEngineクラスを使った方法を以下にしめします。

 ScriptEngine eng = ScriptDomainManager.CurrentManager.GetEngine("py");
sc = ScriptDomainManager.CurrentManager.CreateModule("__main__");
eng.SetVariable(sc, "a", 10);
SourceUnit su = eng.CreateScriptSourceFromString("スクリプトコード");
eng.Execute(su, sc);
object ret = eng.GetVariable(sc, "a);

SetVariableメソッドで変数aの値を10設定してから、Executeメソッドでスクリプトを実行してから、GetVariableメソッドで変数の値を取得しています。この時に重要なのが、スクリプトスコープを合わせるということです。前回、説明したようにスクリプトスコープの単位で変数やオブジェクトへの参照が管理されるからです。前回に使用したExecuteProgramメソッドでは、スクリプトスコープを指定していませんでした。これはスクリプトエンジンが、一時的なスクリプトスコープを決めるからです。この時に使用されたスクリプトスコープを取得するには、スクリプトエンジンのGetScope(su)メソッドを使用します。
 次にScriptクラスを使った変数の設定方法を以下に示します。

 Script.SetVariable("a", 10);
Script.Execute("スクリプトコード", "py");
object ret = GetVariable("a");

ScriptEngineクラスを使用するよりも短いコードになっています。この理由は、スクリプトスコープが決め打ちで利用されるためです。このためスクリプトスコープを使った、スコープの分離を行うことができないのがScriptクラスの特徴になります。結果を返すスクリプトを実行する場合は、ExecuteメソッドではなくEvaluateメソッドを使用してください。

 もしスクリプトスコープを使用するのであれば、スクリプトスコープのSetVariableメソッドとLookupVariableメソッドを使った方が良いかも知れません。