「Silverlight 3 betaだとブラウザで表示しているSilverlightのコンテンツをローカル(OutOfBrowser)でも使えるよ」の仕組みを適当に調べてみた。
もろもろの環境作って、以下のSilverlightのサイトにある「#11: Out-of-browser Experiences」ソースをダウンロードし、 サンプルを ビルドして試した。
Videos : The Official Microsoft Silverlight Site
http://silverlight.net/learn/videocat.aspx?cat=12#sl3
実行してみると、「MyTasks」というSilverlightコンテンツがlocalhostで立ち上がって、Silverlight上で右クリックしたらこんな感じ。「Install MyTasks onto this computer…」を選んでみた。

次に、ダイアログがでてきて、「OK」するとローカルにアプリとして展開、自動でローカルアプリになったSilverlightのコンテンツが普通のEXEウィンドウで立ち上がった。
んで、ウィンドウのタイトルバーに「MyTasks」ってあって、右クリックしてみると、今度は「Remove this application…」のメニューになってる。
ブラウザのSilverlightもまだ生きてて、こっちも「Remove this application…」になってた。かしこい。
どこにローカルに関連するファイルとかあるんかなーと見てみたら
Windows XPで「C:\Documents and Settings\[ユーザー]\Local Settings\Application Data\Microsoft」に「Silverlight」てのができてて、そん中に「Offline」ってフォルダがあった。(たぶんVistaだとRomingの中とか)
そのなかの「localhost.0」ってのが今回できたローカル用ファイルみたい。(localhost実行だからこんな名前なのかな?)

Windows XP
C:\Documents and Settings\[ユーザー]\Local Settings\Application Data\Microsoft\Silverlight\Offline\localhost.0
.xapとかある。なんかhtmlもあるんです。
htmlのobject タグのsourceが「value=”offline://localhost.0″」となってて、さっきの「localhost.0」を指してるっぽい。
<html xmlns="http://www.w3.org/1999/xhtml" >
<!-- saved from url=(0014)about:internet -->
<head>
<style type='text/css'>
html, body { height: 100%; overflow: auto; }
body { padding: 0; margin: 0; }
#silverlightControlHost { height: 100%; }
</style>
</head>
<body scroll=no>
<div id="silverlightControlHost">
<object data="data:application/x-silverlight," type="application/x-silverlight" width="100%" height="100%">
<param name="source" value="offline://localhost.0"/>
<param name="background" value="white" />
<a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">
<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"/>
</a>
</object>
<iframe style='visibility:hidden;height:0;width:0;border:0px'></iframe>
</div>
</body>
</html>
で次。
デスクトップのショートカットのプロパティを見たら
「”C:\Program Files\Microsoft Silverlight\3.0.40307.0\sllauncher.exe” localhost.0」だってさ。「sllauncher.exe」ってので動かしてるっぽい。
ここでもさっきの「localhost.0」がでてきた。
ふーん、だいたい分かったから、いたずらする。
そのSilverlightの内容が表示されてるローカルのEXEウィンドウにURLショートカットをD&Dします。
ローカル?でSilverlightを動かす「sllauncher.exe」ってやつは、ウィンドウ全体にIEコンポーネント(WebBrowserコンポーネント的なやつ?)を敷いてるのただのEXEってことですか?
結局IEだったとしたら、そりゃIEにFlash Playerが入っていれば、SWFがあるサイトだって動くよね。GoogleのURLショートカットからGmailへのログインだってOKだったよ。普通にWebのネットワークと繋がって、UIが全然ないIEってことだからそうなるよね。
んー、Out of Browserと、確かにWeb上のブラウザ外ではあると思います。
しかしながら、IEのセキュリティ設定をそのまま持ってるってことなの?
でも、なんつーかウェブ上でしてることと同じことではないの?。まだbetaだからってこと?。もっと劇的なローカルだからできることとか用意されてんのか?
Web上からだってローカルのストレージ(IsolatedStorage)は使えるんだし、よくわかんね。
Webから右クリックで・・・というのは良いアイディアだと思うのだけど、なんか拍子抜け。
なんというか、もっと直接.xapファイルをローカルEXEとして起動するみたいな仕組みに成ってるのかと思ってたけど、本当にこの適当に確認した仕組みのとおりだったら見せかけだけのギミックみたいでなんかつまんない。
あーでも、Macではどうやるんだろう?とかあるけど、このへんでおしまい。
ちなみにローカルデータの使用はC#のソースで以下になってた。
if (NetworkInterface.GetIsNetworkAvailable())
{
// save online using web service
}
{
// use IsolatedStorage because we're offline
}
ってネットワーク上かどうかのフラグ判定して、Webかローカルのストレージ(IsolatedStorage)のどっちを使うか振り分ける感じだね。
なんだか、いろいろまだ不明点は残るけど、いちばんの収穫はif文でelseって省略できるのかな?って発見したこと。
知らなかったな、そんな書き方しないけど一度試してみよ。

