C# から IronRuby スクリプトの呼び出し方法

| コメント(0) | トラックバック(0) このエントリーを含むはてなブックマーク

前回にC#からIronRubyスクリプトの呼び出し方法についていろいろ書いたが、もうちょっと詳しくみてみる。

 

より詳細なホスティングの仕方

以前のコードは次のようになっていたかと思う。

using System;
using Microsoft.Scripting.Hosting;
namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            // IronRubyエンジンオブジェクトの生成
            ScriptRuntime runtime = IronRuby.Ruby.CreateRuntime();
            var engine = runtime.GetEngine("rb");

            // 変数スコープの生成 と 変数への値の設定
            var scope = engine.CreateScope();
            scope.SetVariable("x", 123);

            // グローバル変数への設定
            IronRuby.Ruby.GetExecutionContext(engine).DefineGlobalVariable("xxx", 789);

            //スクリプトの実行
            var source = engine.CreateScriptSourceFromString(@"puts %!x is #{x}. $xxx is #{$xxx}.! ");
            source.Execute(scope);
            
            Console.ReadLine();
        }
    }
}


基本的にこのコードで良かったのだが、もう少しきれいに書けるという事が分かったので記載しておく。

エンジンオブジェクトの生成

エンジンオブジェクトを以下のように生成していた。

    // IronRubyエンジンオブジェクトの生成
    ScriptRuntime runtime = IronRuby.Ruby.CreateRuntime();
    var engine = runtime.GetEngine("rb");
 
 

よくよく見るとこのコードは不思議で、rumtime を生成し、そのあとエンジンを生成している。ここで、runtime は IronRuby.Ruby と名指しで指定してるにもかかわらず、そのあと engine は、文字列を使った取得をしている。

この2つの違和感をとるために以下のような記述が出来るという事がわかった

    // IronRubyエンジンオブジェクトの生成
    var engine = IronRuby.Ruby.CreateEngine();
  

逆に、IronRuby.Ruby という固有修飾を避けたいのであれば以下のように書くこともできる。

    // IronRubyエンジンオブジェクトの生成
    var engine = ScriptRuntime.CreateFromConfiguration().GetEngine("rb");
 
 

この場合、他のスクリプトエンジンも利用できるようになる。

今回は、IronRubyのみなので前者でエンジンを作成することとする。

ScriptSource

ソースから評価するにも2種類あるらしい。基本的に「スコープ」を作成し、そのスコープを用いて評価であるが

    // 変数スコープの生成 と 変数への値の設定
    var scope = engine.CreateScope();
    scope.SetVariable("x", 123);
 
 

この部分は共通。

評価するに当たり

var source = engine.CreateScriptSourceFromString(@"puts %!x is #{x}.! ");
source.Execute(scope);
 
 

一旦スクリプトソースを生成し、それにスコープを渡して実行する方法。

    engine.Execute(@"puts %!x is #{x}.! ",scope);


直接エンジンにソースとスコープを渡し、実行する方法。

この2つがある。前者は、スクリプトソースを生成した時点でrubyソースのコンパイルがされているために、同じrubyソースを実行するのであれば、コンパイルの必要がない。後者の場合には、シンプルに記述できるが、毎回コンパイルが走る。さらに、前者の場合、細かい実行モードやrubyスクリプトのコンパイルエラー検出が出来たりするらしい。

まとめ

このように IronRuby をホスティングするには数種類の方法が存在している。時と場合に分けて利用するのが良いかと考える。

 

トラックバック(0)

トラックバックURL: http://www.m-tea.info/mt-tb.cgi/30

コメントする

あわせて読みたいブログパーツ

このブログ記事について

このページは、k1ha410が2009年12月 3日 18:11に書いたブログ記事です。

ひとつ前のブログ記事は「コンパクトデジカメ購入 OPTIOE70 」です。

次のブログ記事は「記事作成方法を簡単にしてみた」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。