FirefoxでもClickOnce
製品のデモとして、近々ClickOnceによるデモを公開するということで、ClickOnceをテストする機会がありました。初めて気がついたのですが、ClickOnceってIE以外のブラウザから実行できないんですね。WebサーバがIIS以外でもOKということがすごく記憶に残っていたので、てっきりできるのだと思っていました。
FirefoxでClickOnceが実行できない理由は何なのでしょうか。調べてみたところ、以下の2つの問題があるようです。
まず、1つ目の問題ですが、これはVisual Studioのメニューから発行を行ったときに自動で作成されるインストール用のページpublish.htmを使う場合の問題です。このhtmlのなかのjavascriptで、ユーザーエージェントを見て.NET Framework 2.0がインストールされているかを判別しているようです。
function HasRuntimeVersion(v) { var va = GetVersion(v); var i; var a = navigator.userAgent.match(/\.NET CLR [0-9.]+/g); if (a != null) for (i = 0; i < a.length; ++i) if (CompareVersions(va, GetVersion(a[i])) <= 0) return true; return false; }
普通にFirefoxでpublish.htmを表示させると
のように表示され、Frameworkが入ってないと判断されてしまいます。
試しにユーザーエージェントスイッチャーをつかって、ユーザーエージェントを「Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 2.0.50727)」のように偽装してみたところ、
Frameworkが入っていると認識されました。
もちろんこれはjavascriptを書き換えることでも対応できるでしょう。これで1番目の問題は解決です。
この状態でインストールボタンを押すと、.Applicationファイルを実行できるのですが、実行すると下記のようなダイアログが表示されエラーになってしまいます。
これは、どうやらFirefoxのテンポラリの関係で.manifestファイルがうまくダウンロードできていないようです。
フルパスにすればダウンロードすることは可能になるが、そうするとセキュリティゾーンが異なってしまうというようなことが書かれていました。
でも、世の中には便利なものを提供してくれる人が必ずいるようです。こちらのKazzzさんの日記に、これを解決するプラグインが既にあることが書かれていました。
実際のプラグインをインストールできるところはここですね。
このプラグインをインストールしたところ、このような「Run Click Once Application」という3番目の選択肢が表示され、無事FriefoxでClickOnceを実現することが出来ました。