[DLR]DLRを使ったホスティング(A7)

昨日のエントリでDLRを使ったホスティングを簡単に説明しましたが、少し情報が古かったです。具体的には、IronPython 2.0A6までの話で、A7から変更になっています。
A7からLangagueProviderクラスが廃止になり、ScriptEngineクラスのメソッドが変更になっています。このためScriptDomainManagerからスクリプトエンジンのインスタンスを取得します。

 using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
ScriptEngine eng = ScriptDomainManager.CurrentManager.GetEngine("py");

これでIronPythonのスクリプトエンジンのインスタンスが取得できます。次に行うのは、SourceUnit(スクリプトソースを抽象化したもの)を作成します。

 SourceUnit su = eng.CreateScriptSourceFromString("スクリプトコード");

SourceUnitが作成できれば、コンパイルして(Compileメソッド)から実行しても良いですし、直接実行(Execute)しても構いません。具体的には、以下のようにします。

 object ret = eng.ExecuteProgram(su);

これでスクリプトの実行結果を取得することができます。Executeメソッドは、第一引数にIScriptScopeを必要とします(A6では、ScriptModuleというクラスを指定していました)。スクリプトスコープとは、スクリプトを実行するスコープのことでPythonであればインタラクティブシェルを起動した状態が、__main__モジュールに属していますし、この__main__モジュールに相当する考えのものです。よってスクリプトスコープの中で、変数や関数などのオブジェクトへの参照が管理されることになります。このスクリプトスコープを作成するには、以下のようにします。

 sc = ScriptDomainManager.CurrentManager.CreateModule("__main__");

より簡単にスクリプトを実行するには、Microsoft.Scripting.Scriptクラスを使用します。ScriptクラスにExecute(スクリプト,言語識別子)やEvaluateメソッドなどが用意されています(このメソッドはA6にもありますので、A7ではこちらへ集約されたようです)。