スマートクライアント

.NET関連技術(プログラミング以外)

関連Web

概要など

  • ノータッチ・デプロイメントには以下の欠点がある
    • ネットワークに接続されている必要がある。
    • IEを通じて開く必要がある。(スタート メニューに追加されない。)
    • 制約が厳しい。
  • これらを回避する手段として、Updater Application Block for .NETが用意されている。
  • これを使用すると、ファイルの更新があった場合、自動でダウンロードする仕組みをアプリケーションに組み込むことができる。
  • このように作られたアプリケーションは、クライアントにインストールするため、上記のノータッチ デプロイメントの欠点は回避されている。
  • ただし、今度は以下のような問題が発生する。
    • ローカル アプリケーションとして実行されるため、セキュリティ面で不安がある
    • Microsoftの公式サポートではない。
  • これらの欠点を回避するために登場した技術がClickOnceである。
  • ClickOnceは、Visual Studio 2005 / .NET Framework 2.0に搭載の技術でノータッチ デプロイメント、Updater ABの利点、欠点を踏まえて登場した。この技術には、以下の利点がある。
    • オフラインでアプリケーションが使用できる。
    • スタート メニューからアプリケーションの起動ができる。
    • .NET Frameworkなど、必要なコンポーネントを同時にインストールできる。
    • Visual Studio 2005で簡単に配布設定ができる。
    • 更新で不具合が出た場合に、[プログラムの追加と削除]から一つ前のバージョンにロールバックできる。
    • コード アクセス セキュリティが有効である。
    • ファイルの遅延ダウンロードが可能。

動作環境など

ClickOnceアプリの作成方法

  • まず普通にWindowsフォームアプリのプロジェクトを作成する
  • プロジェクトのプロパティから「発行」タブを選び、必要な設定をする
  • 「発行ウィザード」もしくは「今すぐ発行」ボタンをクリック。ただし最初だけ。2回目からはプロジェクトを右クリックして「発行…」を選ばないとエラーになるらしい。理由は不明

用語

  • appref-ms(アプリケーション参照)ファイル
    • インストールしたアプリのショートカットのリンク先のファイル
    • 配置マニフェストの場所の情報などがある
    • ClickOnceローダーに読み込まれる。
  • ClickOnceキャッシュ領域=ClickOnceアプリケーションストア
    • c:\Document and Settings\<user>\Apps\2.0\ ...
    • ネットワークモードの部分信頼のアプリでは250MB、他は制限なし
    • ノータッチ・デプロイメントで使う.NETアセンブリ・ダウンロード・キャッシュとは異なる
  • 完全信頼(Full Trust)/部分信頼(Partial Trust)
    • 部分信頼アプリはAppLaunch.exeから起動される
  • ダウンロード・グループ
    • 初回にダウンロードするファイルやアセンブリを減らす仕組み
  • 配置マニフェスト
    • .applicationファイルのこと。
    • publish.htmlのインストールボタンのリンク先

配布設定時に必要なこと

  • 配置オプション
    • インストールモードの決定
    • 配置場所の選択。「Webからのインストール」とか
  • IDEから各プロパティ設定
  • IDEから「発行」
    • 配布用Webページ作成

インストールモードの種類

  • オンライン/オフラインモード
    • ローカル環境へインストールするモード
    • オフライン実行が許されている
  • オンラインモード
    • ネットワーク環境から起動するモード

配置場所(配置オプション)

  • setupの置き場所のこと
  • 配置場所の種類
    • Web上 (http,https URL)
    • ftpサイト上(ftp)
    • ファイル共有(UNCパス)
    • CD-ROMなどのローカル環境内(ディレクトリ・パス)

「発行場所」について

  • セットアップの置き場所(配置場所)のことなのか?それともアプリがインストールされる場所=実行場所=(配置先の場所)のことなのか?という疑問が湧くが答えは前者のようだ。つまり発行場所=配置場所
  • http経由でインストールする場合
    • 普通に「発行場所」をそのURLにすれば良い。
    • そのサーバがIISでFrontPage extentionを入れてあれば自動的にそこにUPされる。

「インストールのURL」について

  • インストール先?
  • 「(発行先と違う場合)」とわざわざ書いてあるということは、通常は発行場所と同じなのか?
    • →webサイトに発行した場合は発行先=インストールのURLとなる、模様
  • 発行先とインストールURLが異なる場合とは、いったんローカルなどに発行しておいて、それをWebサーバに手動で移すような場合、らしい

フォルダ/ファイル構成

  • exe.deploy ファイル…配布アプリケーションの実体
  • publish.html…インストールや実行用のWebページ
  • setup.exe…クライアントに必須コンポーネントをインストールするのに使う模様

マニフェストファイル

  • XML形式
  • IDEによって自動生成される(VS2005)
  • <アセンブリ名>.exe.manifestファイル…アプリケーション・マニフェスト
    • 配布するアプリケーションに関する情報
    • セキュリティ要件
    • 依存関係        
  • <アセンブリ名>.applicationファイル…配置マニフェスト=デプロイメント・マニフェスト
    • 配布、更新に関する情報。
    • バージョンによって管理
    • インストールや配布の起動時に使う
    • publish.htmlのインストールボタンのリンク先
    • IDEによって自動的に作成される
  • <アセンブリ名>_<バージョン>.application
    • 配置マニフェストのバックアップファイル
  • Mage.exe/MageUI.exeで生成可能

Webサーバ

  • ClickOnceの関連するファイル以下のファイルのMIMEの設定を行う必要がある。
  • このMIMEを判断してブラウザはClickOnceローダーを起動するため
    拡張子 	MIMEタイプ
    .application 	application/x-ms-application
    .manifest 	application/x-ms-manifest
    .deploy 	application/octet-stream
  • 配置マニフェスト(.application)のMIMEタイプは application/x-ms-application
  • このMIMEタイプをただしく処理できるブラウザはIEのみ(Firefox2.0のアドオンで対応も可能)。よってClickOnceにはIE必須

exeの実行される場所

  • プログラムで実際に取得してみた結果
    C:\Documents and Settings\<user name>\Local Settings\Apps\2.0\JB4DK3EL.XL5\C6P2GBBC.D1Y
  • の下に「manifests」というフォルダがあり、その隣に
    samp..tion_182d1562fda93bc7_0001.0000_9e7d711b7c5fa3f4
    のようなフォルダがあった
  • まとめると
    C:\Documents and Settings\<user name>\ 
    Local Settings\Apps\2.0\JB4DK3EL.XL5\C6P2GBBC.D1Y\
    samp..tion_182d1562fda93bc7_0001.0000_9e7d711b7c5fa3f4\SampleApplication.exe
    (本来は改行しない)
  • ユーザ領域の中だがフォルダ名などは不定と考えた方が良さそう

クライアントに.NET Framework 2.0が入っていない場合

  • インターネットにつながる環境の場合は自動的にインストールされる
  • ちゃんと日本語ランゲージパックも入る
  • インターネットなしの環境の場合、ローカルに.NET Frameworkのセットアップを用意する必要がある
    • どういうファイルを用意する必要があるのか?未調査
    • 設定の仕方については「必須コンポーネントの組み込み方」を参照

アップデート処理

  • アップデート機能をAPIから呼び出しも可能(ClickOnce Deployment API:Update,UpdateAsync etc...)
  • 更新チェックタイミングの種類
    • 起動時
    • 毎回実行中
    • n日後の実行中
  • 変更のあったファイルだけがダウンロードされる
  • オンデマンドでの部分的なアップデートの方法はヘルプの「デザイナを使用し、ClickOnce 配置 API で必要に応じてアセンブリをダウンロードする 」を参照

ロールバック機能

発行ウィザード

  • VS2005のClickOnce発行支援機能
  • プロジェクトのプロパティの「発行」タブ

発行がエラーになるケース

  • 現象 :
    • プロジェクト プロパティ デザイナで [発行] タブの [今すぐ発行] ボタンまたは [発行ウィザード] ボタンを使用して発行操作を呼び出すと、失敗します。
  • 詳細 :
    • [今すぐ発行] ボタンまたは [発行ウィザード] ボタンを使用して発行を呼び出すと、発行操作が失敗します。発生するエラーは、さまざまであり、たとえば、
      "ファイル 'C:\..\setup.exe' を 'http://../setup.exe' にコピーできませんでした。
      'setup.exe' を Web に追加できません。ファイル 'setup.exe' を追加できません。
      "指定されたファイルが見つかりません" 
      または
      "次のエラーにより、発行できませんでした: パス 'C:\..\publish\..' の一部が
      見つかりませんでした。"
      と表示されます。
  • 回避策 :
    • 1. 発行対象のプロジェクトをいったん閉じ、再度開きます。
    • 2. ソリューション エクスプローラでプロジェクトを右クリックし、[プロパティ] をクリックします。
    • 3. プロジェクト デザイナの [発行] タブに移動します。プロパティを適切な値に設定します。
    • 4. ソリューション エクスプローラでプロジェクトを右クリックし、[発行] をクリックします。
  • メモ :
    • 通常は、[今すぐ発行] ボタンや [発行ウィザード] ボタンは使用しないでください。
    • ソリューション エクスプローラのコンテキスト メニューに表示される [発行] を使用するか、最上位の [ビルド] メニュー項目を使用してください。

セキュリティ

  • ClickOnceアプリケーションは初回起動時にインストールを行うかの問い合わせ画面が表示される。(バージョンアップ時も)
  • これを回避するには以下の3パターンの方法がある。
  1. ベリサインなどの発行している証明書を使用して署名を行い。(署名の設定はプロジェクトのプラパティ画面にある)クライアントの「信頼された発行元」に証明書を登録する。 (ベリサインなど公的証明機関ではあらかじめクライアントの「信頼されたルート証明機関」には登録済み。
  2. Windows Certificate Serverまたはmakecert.exeを使って証明書を作成して、署名を行い。クライントの「信頼されたルート証明機関」と「信頼された発行元」に証明書を登録する。
  3. CAS(サンドボックスを実現する機能)の範囲を超えないようにセキュリティの設定を行い。(プロジェクトのプロパティのセキュリティで設定)プログラムの実装もそれに従った実装とする。ゾーン(インターネットorイントラネットorカスタム)

マニフェストと証明書

  • マニフェストは作成する際に証明書(pfxファイル)を要求する。
  • この証明書で署名をマニフェストに行う必要がある。(VisualStudioでは発行を行うとソリーションのディレクトリに*.pfxファイルが作成され、これを使用して署名が行われる)証明書については後述する手動によるマニフェストの作成方法の説明時にその作り方を説明している。
  • 2つのマニフェストにはそれぞれバージョンが記載されている。
  • (ちなみにこの2つのバージョンはモジュールのバージョンとの関連性はない。但しVisualStudioでは何も設定を行わないとモジュールのバージョンにこの2つのマニフェストのバージョンをあわせているようだ)

ローカルファイルに書き込みできる?

  • 出来る。(セキュリティポリシーに違反しなければ)
  • ただしインストール先のフォルダ名は.NETによって決められるので決め打ちは出来ない。
  • よってexeのある場所にログを出力するなどという仕様はさけた方が良い
  • FileIOPermissionを使って云々という話もあり
  • 「分離ストレージ」なるものも使える。部分信頼でも使えるユーザ固有情報の保存機能

ClickOnceデータディレクトリ

  • ClickOnce アプリケーションに含まれていて、"データ" ファイルとしてマークされている各ファイルは、アプリケーションのインストール時にClickOnceデータディレクトリにコピーされる。ヘルプの「ClickOnce アプリケーションにおけるローカル データおよびリモート データへのアクセス 」を参照
  • もしかして上の方で書いた「ClickOnceキャッシュ領域」と同じものかも?
  • データディレクトリのパス取得方法
    AppDomain ad = AppDomain.CurrentDomain;
    String path = ad.GetData("DataDirectory") as string;
    もしくは
    ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
    String path = ad.DataDirectory;
  • アプリケーションのバージョン毎に別のディレクトリになる
  • アプリをアンインストールするとこのディレクトリのデータも削除されるので、ユーザが作成したデータをここへ格納してはいけない

ローカルにあるEXEを起動できる?

  • 初回起動時に出るセキュリティ認証をOKした後は普通にできる模様

サーバ上にあるデータの参照

  • 自分自身がアクティベートされたサーバを知りたい場合は以下のように取得する
    ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
    String hostname = ad.ActivationUri.DnsSafeHost;
  • 基本的には、インストール元のWebサーバにだけアクセス可
  • 制限がある場合はWebPermissionを要求
  • System.Net.Client, HttpWebRequest など使う
  • データがXMLならXmlDocument.Load
  • XML Webサービス経由でのデータ取得も可
  • System.DataによるSQL Server接続も可。ただし部分信頼では既定で禁止。その場合SqlClientPermissionなどを要求する必要あり。当然ポートが開いている必要あり。この方法はあまりおすすめではない

起動時にパラメータを渡したい

  • ヘルプの「ClickOnce アプリケーションでクエリ文字列‏を取得する 」を参照
  • マニフェストを取得するURLで以下のようなクエリ文字列を設定可能
    http://servername/WindowsApp1.application?username=joeuser&hoge=hage
  • プロジェクトのプロパティの「配置」タブにある「発行オプション」で「URLパラメータをアプリケーションに渡すことを許可する」をチェック
  • QueryパラメータをDictionaryに入れて返すサンプル(ヘルプに載ってるサンプルだと微妙にうまくいかない)
     private Dictionary<string, string> GetQueryStringParameters()
     {
         Dictionary<string, string> nameValueTable = new Dictionary<string, string>();
    
         if (ApplicationDeployment.IsNetworkDeployed)
         {
           string url = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0];
           string queryString = (new Uri(url)).Query;
           if( queryString.Length  > 0) 
           {
             if (queryString[0] == '?') //Query文字列の先頭の?がついてきてしまう模様
             {
               queryString = queryString.Substring(1);
             }
             string[] nameValuePairs = queryString.Split('&');
             foreach (string pair in nameValuePairs)
             {
               string[] vars = pair.Split('=');
               if (!nameValueTable.ContainsKey(vars[0]))
               {
                 nameValueTable.Add(vars[0], vars[1]);
               }
             }
           }
         }
    
         return (nameValueTable);
    }
  • あんまりたくさんパラメータを渡すと限界にひっかかるので注意

デバッグするには

  • 基本的にはWindowsフォームアプリとして動かしてテストで良いが、ClickOnce特有の動作のデバッグはそれではできないので、プロセス名でアタッチするかDebugger.Break()で止めてアタッチする
  • 参考:ClickOnceアプリケーションをデバッグするには
  • ブレークしたいところに↓を書いておくのが楽
    #if DEBUG
    	Debugger.Break();
    #endif

必須コンポーネントの組み込み方

  • プロジェクトのプロパティから「発行」タブを開く
  • 「必須コンポーネント」ボタンをクリック
  • DAOや.NET Framework、ランタイムライブラリ、Windowsインストーラ、SQL Server 2005 Express Edition、Visual J#再頒布パッケージ、WSE3.0などが選択肢に出てくるのでチェックする
  • ここでコンポーネントのセットアップをどこから落とすか選択できる。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-04-12 (日) 07:33:03 (4413d)