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に記述されています。