Udostępnij za pośrednictwem


[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

  • Anonymous
    January 10, 2008
    PingBack from http://geeklectures.info/2008/01/11/dlrdlr%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e3%83%9b%e3%82%b9%e3%83%86%e3%82%a3%e3%83%b3%e3%82%b02%e5%a4%89%e6%95%b0-2/

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

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