1つのページ上に複数の Silverlight アプリケーションがのっかっている場合、それらが相互に通信する方法は Silverlight 2 までは特に用意されていませんでした。
ただ、通信することが不可能ってわけじゃ無いです。
Silverlight アプリは HTML 上のオブジェクトを操作することができます。JavaScript を呼び出すこともできます。基本的に HTML 上の JavaScript でできることは Silverlight でもできるようになっているわけです。
反対に JavaScript から呼び出し可能なようにプロパティ・メソッドを公開することもできます。
これらを利用すればある Silverlight アプリから別の Silverlight アプリを呼び出すことができます。
呼び出してほしい Silverlight アプリがプロパティ・メソッドを公開しておき、呼び出し元の Silverlight アプリがそれを呼び出してやればいいわけです。
まぁ、通信なんていう高度なものじゃなく、呼び出し元アプリは HMTL 上のオブジェクトを呼び出していると思っているだけ、呼ばれている方は HTML 上の JavaScript か何かから呼ばれていると思っているだけ、ということですが。
もちろん、呼び出すときにマネージドな世界から JavaScript オブジェクトな世界へ、そして、JavaScript オブジェクトな世界からマネージドな世界へとマーシャリングされますし、戻ってくるときにもマネージド→JS→マネージドとマーシャリングされます。
なお、String、DateTime、数値型などは標準でマーシャリングがサポートされていますので問題ありませんが、オリジナルのクラスなどはマーシャリング方法が不明となるため実行時に例外が発生します。
自分でマーシャラを定義したりできればいいんですが、そういった機能はないようです。
私はあきらめて System.Runtime.Serialization.Json.DataContractJsonSerializer クラスを使って JSON 文字列をやり取りするようにしました。
と、前置きが長くなりました。
Silverlight 3 の新機能、ローカル・メッセージングは Silverlight アプリどうしの通信を行うためのものです。
Silverlight 3: What's New with Local Messaging
によると、同じページ上にある Silverlight アプリどうしの通信だけでなく、ブラウザの別のタブ上にあるものや別のブラウザで動いているものとの通信もサポートされるようです。ただし、Silverlight アプリが同じドメイン上にあったものどうしでのみ通信できるようです。セキュリティ的に考えると妥当なところですね。
使い方はとってもシンプルです。
上記の記事にあるサンプルコードを見ればすぐわかるでしょう。
ただ、通信できる内容もシンプルでどうやら String だけの様子。(System.Windows.Messaging.LocalMessageReceiver クラスの MessageReceived イベントに渡されるのが string Message くらいしかない)
任意のオブジェクトを渡せると便利なんだけど、やっぱりそれは自分でシリアライズするなりして何とかしろってことなのか。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。