IronRubyが4月に1.0になってたのでDLして使ってみようとしてる。
インストールしてみたら、
ir.exeとか、iirb.batとか、igem.batとか分かりやすい名前の実行用ファイルがbinフォルダにインストールされてて期待度が高まった。
ir.exeを普通のruby.exeと同じ感じで使っていく分にはお手軽な感じだ。
しかし、やっぱり、.NetアプリからRubyを呼び出したいので、hosting関係の記述を検索してみた。
あっさりWeb上でいっぱいヒットした。去年の0.9ぐらいからいろいろやってた人は多いみたいだ。期待は更に高まる。そして、実践。
・・・が、ハマりまくり。なんか悲しい。
まず、ドキュメントに書いてある
ScriptRuntime.Create()
が無い!
代わりに、ScriptRuntime.CreateFromConfiguration()を使うのだろうと思ってやってみたが、なんか違う。
名前の通り、設定が済んでいることを前提としているのかもしれない。が、その設定とは何ぞや?
仕方が無いので、
new ScriptRuntime(Microsoft.Scripting.Hosting.RuntimeSetup setup)
で出来ないかやってみたが、これもなんか違う。
前もって、ScriptRuntimeSetupだのLanguageSetupだのを作ってやるということなのだろうか・・・、と思ってやってみても、
invalidなlanguage nameだとかいっぱいケチをつけられる。
例外をひとしきり出しまくったあたりで、どうやらこれは、自分で言語処理系を作成した場合のScriptRuntimeへの登録手続きのためのものらしいと分かる。
ScriptRuntime.Create()のあとでruntime(←取得したインスタンス).GetEngine("Ruby")とかやるって書いてあるのに手前で邪魔されまくりだ。実は.Net 2.0向けの方じゃないとちゃんと動かないのか?そんなことは無いと思いたいが・・・。
埒が明かないので、ドキュメントに書いてある「ScriptRuntime.Create()」のことをスルーして、オブジェクトブラウザで代わりになりそうなものを探してみた。
そして見つけたのが
なんて直球・・・。
これを使うと一応ちゃんと動いてくれるっぽい。さすが1.0。やるじゃん。
だが、動いているっぽいというのは分かるのだが、標準出力が.Netアプリから見えない。これは色々困る。どうも、runtime(←IronRuby.Ruby.CreateRuntime()で取得したインスタンス).SetOutput(IO.Stream stream, IO.TextWriter writer)で設定するらしいのだが・・・、TextWriterの方はともかく、別途Streamを渡すってどういう事だ?しかもこっちの方がメインっぽい。。。StringBuilderで共有できないじゃないか。
ぶつくさ言いながらMemoryStreamを渡して実行してみる。おー、これで行けたのかな・・・?って、putsしてるのにMemoryStreamのLengthが0・・・、ダメじゃん。しかも、呼び出し元のクラスとかを参照させて貰えない!?それじゃー意味無いよー。まぁ、別プロセスみたいなもんだから当たり前って言えばそうなんだけど、何かパイプがあってもいいじゃない。というか、あるべきでしょ、これは!今あることにした!!!探す!
追記
ScriptRuntime.Globals.SetVariable(String name, Object value)
しゃーっっ!!みつけたっ!
追記2
こんどはLibraryPathsでハマってた・・・。明示的に指定してやらないと一切ロードできないのか・・・。
追記3
CreateFromConfigurationのconfigurationってapp.configのことなのか。orz