IronRuby のハマりどころ

Matsue.rb の定例会IronRuby の事を調べる機会があったのでメモ。不具合も含まれてる気がするけど、最近はリリースないから日記までとしよう。

System.Foo の require について

2012/07/07 現在の最新である 1.1.3 だと以下のように require するだけで Form が使えるが、これは全て同じようにできる訳ではないので注意する必要がある。

require 'System.Windows.Forms'

以下については、パスが通ったところに System.Core.rb のような形でファイルがあるので、上記のような形で require できると思われる。

  • System.Core
  • System.Data
  • System.Drawing
  • System.Numerics
  • System.Windows.Forms
  • System.Xml.Linq
  • System.Xml
  • System

それ以外は@IT さんの昔の記事にもあるように、以下のような require を行う必要があるのだろう。

require 'System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

ちなみに System.Core.rb などの内容を見てみると、Version や Culuture を指定する形の require をしてるだけです。IronRuby のドキュメントはあまりない(知らないだけかも)ように見えるので注意。

全て generate するか、まったく対応しないかのどちらかにしてほしかったよコレー。

拡張ライブラリを .rb のファイルとしてリライトした影響について

IronRuby では、CRuby の拡張ライブラリ(C 言語で書いてある部分を差してます)を .rb で置き換えてるように見える。例えば、etc ライブラリ。そのため、CRuby から持ってきたライブラリ中で拡張子を付ける形で require してる箇所があると影響を受ける点に注意。

例えば、1.9.2 までの RubyGems の config_file.rb 中で require 'etc.so' しているため、gem の require で関係のない etc ライブラリの LoadError に遭遇してなんじゃこりゃああ!(松田優作風に)ってなるので注意。

これは CRuby 側が悪いので、 ad-hoc に解決するしかない気がする。require を書き換えると影響が大きいので、影響最小での対応をオススメします。

追記:調べた内容に関する詳細はこちらに詳しく書いていただいています。