[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メソッドを使った方が良いかも知れません。

Comments (3)

  1. 前回はIronPython 2.0 A8に含まれるDLRを使って、独自言語をホスティングするコンソールのみを作成しました。これから独自言語を定義していくのですが、その前にA6以前とA7以降のホスティングの変更点を説明します。

  2. 前回はIronPython 2.0 A8に含まれるDLRを使って、独自言語をホスティングするコンソールのみを作成しました。これから独自言語を定義していくのですが、その前にA6以前とA7以降のホスティングの変更点を説明します

Skip to main content