MIX08 のIronRuby Hol を使用するときの注意点

dynamicsilverlightというサイトで、ソースコードとハンズオンラボの内容があるとご連絡しました。ここで公開されているFlickrを使ったラボを実行するには、必ず提供されているフォルダで「scrtipt\server.bat」を実行するようにしてください。というのは、Holとして公開されているDLRなどのバージョンが、「2.0.5.100」となっているからです。Silverlight 2.0 Beta1 SDKに含まれているDLRのバージョンは「2.0.5.0」なのです。このため2.0.5.100のDLRでは、2.0.5.0のManaged JScriptをロードすることができません。IronPython、JScript、IronRubyの3言語を試される場合は、Silverlight 2.0 Beta1 SDKに含まれるアセンブリを使用してください。IronRubyとIronPythonのみの場合であれば、2.0.5.100でも問題はありません。

詳細に調べたわけではありませんが、MIX08のハンズオンで試した結果、Flickrを使うサンプルでは、HTMLのボタンのイベントハンドラをRubyで定義しています。このイベントハンドラの登録が、Silverlight 2.0 Beta1 SDKのアセンブリでは失敗することを確認しています。これらの問題を修正したのが、2.0.5.100のようです。

またFlickrを使ったサンプルなどは、Silverlightにおけるクロスドメインの問題が発生します。これを避けるにはポリシーファイルを作成するか、Chiron.exeユーティリティを使用します。 相手側のサービスの設定によってはクロスドメインの問題が発生します。flickrの場合は、https://api.flickr.com/crossdomain.xmlというポリシーが設定されていますので正常に動作します。このハンズオンでは「script\server.bat」というバッチファイルが用意されており、「chiron.exe /b /r:libs」というコマンドを動かすようになっています。これはChironユーティリティが持つ、テスト用のhttpdを起動してからブラウザを起動するオプションです。このモードで起動すると、オンザフライでXAPパッケージ(アプリケーションマニフェストも)を生成します。このXAPパッケージは、インメモリで作成され、httpレスポンスとしてブラウザに返すようになっています。このときに注意しないといけないのが、物理的なファイルとしてXAPパッケージが存在する場合です。Chironが用意しているhttpdは、物理ファイルが存在すると、その物理ファイルを返すようになっているからです。また、Chironは「localhost:2060」を起動します。このプロセスを終了するには、ブラウザで「localhost:2060/bye!」と入力するか、コンソールでCTRL+Cを入力します。

SilverlightのドキュメントでLoadRootVisualメソッドの記述が以下のようになっていますが

 self.scene = Application.Current.LoadRootVisual("app.xaml")

正しくは、以下のようになります。

 self.scene = Application.Current.LoadRootVisual(Canvas(), "app.xaml")

ドキュメントのLoadRootVisualメソッドの説明は正しくなっていますが、上記の例が間違っていますので、ご注意ください。もちろん使用される言語によって、Canvasクラスへの参照を追加していただく必要はあります(Pythonはimportなど、JScriptではImport、RubyではIncludeなど)。

追記:っき さんからの質問から
Flickrサンプルのクロスドメイン問題は、私の記述が間違っていましたので訂正します。Silverlightのクロスドメインへのアクセスに関する設定は、サービスを提供する側での設定となります。つまり、Client - Serverとなっていた場合にServer側で設定する必要があります。この設定には、crossdomain.xmlというファイルかclientaccesspolicy.xmlというファイルをルート直下に配置します。そしてflickrの場合は、「allow-access-from domain="*"」という設定がなされています。

追記:LoadRootVisualですが、https://silverlight.net/Quickstarts/ProgramDlr.aspxでは正しくなっているのを確認しています。このクイックスタートでは、UserControlのインスタンスを渡すようになっています。