DLR ベータ1を使ったホスティング

昨日に続いて、IronPython 2.0ベータ1を使ったホスティング(埋め込み)方法を説明します。以下にコードを示します。

 // ScriptDomainManagerやScriptEnvironmentから変更
ScriptRuntime runtime = 
        ScriptRuntime.Create(new ScriptRuntimeSetup(true));
ScriptScope scope = runtime.CreateScope();
ScriptEngine engine = runtime.GetEngineByFileExtension("py");
//SourceUnitから変更に
ScriptSource ss = engine.CreateScriptSourceFromString(
             "import datetime",SourceCodeKind.SingleStatement);
object ret = ss.Execute(scope); 

昨日のサンプルでもありましたが、基本的にScriptRuntimeを使用するようになっています。ScriptRuntimeのCreateメソッドにScriptRuntimeSetupクラスのインスタンスを指定していますが、これは指定してなくても問題はありません。指定している理由は、後でご説明します。
 そしてGetEngineByFileExtensionメソッドでIronPythonのScriptEngineを取得しています。次に、CreateScriptSourceFromStringメソッドが返すのがSourceUnitからScriptSourceに変更になっています。最後に実行するExecuteメソッドが、ScriptEngineから削除されているため、ScriptSourceのExecuteメソッドを使用しています。もしくはCompilerメソッドでComileCodeを取得してExecuteメソッドで実行することもできます。

 次にご説明するのは独自の言語を作成した場合の、拡張子の登録方法です。

 ScriptRuntimeSetup env = new ScriptRuntimeSetup(true);
List<LanguageProviderSetup> langs = 
                    new List<LanguageProviderSetup>();
langs.Add(new LanguageProviderSetup("LanguageContext",
                    "アセンブリ", "拡張子"));
env.LanguageProviders = ArrayUtil.AppendRage(
                    env.LanguageProviders, langs);
ScriptRuntime runtime = ScriptRuntime.Create(env);
ScriptEngine engine = runtime.GetEngineByFileExtension("拡張子");

このようにします。つまり、ScriptRuntimeSetupクラスのLanguageProvidersプロパティへ独自言語の情報を定義したLanguageProviderSetupのインスタンスを追加するのです。この時に使用しているArrayUtilクラスは、Microsoft.Scripting.Utilネームスペースで定義されています。

最後にSilverlight2.0で独自のスクリプト言語を追加するには、languages.configというXMLファイルを定義することのようです。このファイルの構造は、以下のようになっています。

 <Languages>
  <Language languageContext="" 
         assembly="" extensions="" />
</Languages>

この構造のサンプルは、chiron.exe.configに記述されています。