FirefoxでもClickOnce

製品のデモとして、近々ClickOnceによるデモを公開するということで、ClickOnceをテストする機会がありました。初めて気がついたのですが、ClickOnceってIE以外のブラウザから実行できないんですね。WebサーバがIIS以外でもOKということがすごく記憶に残っていたので、てっきりできるのだと思っていました。

FirefoxClickOnceが実行できない理由は何なのでしょうか。調べてみたところ、以下の2つの問題があるようです。

  • ユーザーエージェントにCLR 2.0という表記が含まれていない
  • .manifestファイルがFirefoxのテンポラリに存在するので取得できない

まず、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さんの日記に、これを解決するプラグインが既にあることが書かれていました。

FireFoxブラウザでClickOnceアプリケーションを実行する - Kazzzの日記

実際のプラグインをインストールできるところはここですね。

https://addons.mozilla.org/addon.php?id=1608

このプラグインをインストールしたところ、このような「Run Click Once Application」という3番目の選択肢が表示され、無事FriefoxでClickOnceを実現することが出来ました。