第4回 ClickOnceテクノロジを最大限に生かす開発連載 ClickOnceの真実(2/4 ページ)

» 2006年09月02日 00時00分 公開
[一色政彦デジタルアドバンテージ]

●ダウンロード・グループ単位でオンデマンド配置するコード

 具体的には、ApplicationDeploymentクラス(System.Deployment.Application名前空間)が持つDownloadFileGroupメソッドを、先ほど設定したグループ名である「SampleClassLibraryGroup」という文字列をパラメータに指定して呼び出すだけだ。

 なお、ClickOnceの動作をカスタマイズするプログラミングでは、基本的にこのApplicationDeploymentクラスのメソッドやプロパティを使う仕様となっている。現在実行中のClickOnceアプリのApplicationDeploymentオブジェクトは、ApplicationDeploymentクラスの静的プロパティであるCurrentDeploymentにより取得できる。

 以上のプログラミングを行ったのが、次のコードである(C#の場合。VBのコードは割愛する)。

using System.Deployment.Application;

private void MyDownloadFileGroup(string groupName)
{
  if (ApplicationDeployment.IsNetworkDeployed)
  {
    ApplicationDeployment deploy =
      ApplicationDeployment.CurrentDeployment;

    if (deploy.IsFileGroupDownloaded(groupName) == false)
    {
      deploy.DownloadFileGroup(groupName);
    }
    else
    {
      // このグループはすでにインストールされています。
    }
  }
  else
  {
    // ClickOnceで配置されたアプリケーションではないので
    // ダウンロードせずにコンポーネントを利用できます。
  }
}

オンデマンド配置を行うコード

 上記のコードのMyDownloadFileGroupメソッドは、パラメータにダウンロード・グループ名(groupName変数)を受け取る。

 このメソッドの内部で最初に実行されている「ApplicationDeployment.IsNetworkDeployed」という静的プロパティは、現在実行中のアプリケーションがClickOnceで配布されたものかどうかをTrue/Falseで取得するためのものだ。当然ながら、ClickOnceで配布されたアプリケーション以外でCurrentDeploymentプロパティを呼び出すと例外が発生するため、事前にこのようなチェックが必要になる。

 次にCurrentDeploymentプロパティからApplicationDeploymentオブジェクトを取得し、そのIsFileGroupDownloadedメソッドをパラメータにグループ名を引き渡して呼び出している。このメソッドは、そのグループ名のダウンロード・グループのファイル群がすでにダウンロード済みかどうかをTrue/Falseで返すためのものだ。

 このメソッドで、まだダウンロードが済んでいことが分かればDownloadFileGroupメソッドを呼び出すというロジックになっている。DownloadFileGroupメソッドは、繰り返しになるが、オンデマンドで指定したダウンロード・グループのファイル群をダウンロードするためのものだ。

●ダウンロードの進ちょく状況を表すダイアログの表示

 しかし上記のコードには1つ問題がある。DownloadFileGroupメソッドは同期メソッドであるため、その実行中はアプリケーションのユーザー・インターフェイスが固まったようになってしまうのだ。ダウンロードするファイル・サイズが大きい場合はアプリケーションが反応しない時間が長くなってしまうので特に問題になるだろう。これを防ぐには非同期メソッドのDownloadFileGroupAsyncを呼び出す必要がある(その具体的な活用方法は本稿では割愛する)。

 また、非同期でダウンロードを行う際に、ダウンロードの進ちょく状況をダイアログで表示してあげると、ユーザーに対して親切だろう。このようなダイアログ(以降、ダウンロード・ダイアログ)を表示する機能は、残念ながら.NET Framework 2.0のクラス・ライブラリでは提供されていないため、ClickOnceのオンデマンド配置を実装したい開発者はそれぞれが独自に開発しなければならない。

 本稿では汎用的に使えるダウンロード・ダイアログを開発し、これをクラス・ライブラリの形で提供しているので(前述の「ClickOnce」プロジェクト)、これを各開発者のプロジェクトでも(より洗練させるなど改変して)活用してもよい。

 本稿で提供するダウンロード・ダイアログはClickOnceが提供するダイアログのルック&フィールを踏襲し、ほぼ同じユーザー・インターフェイスにデザインしている(タイトルバーの左にアイコンが表示されるなど若干の違いはある。リソース関連はSystem.Deployment.dllに含まれるものを動的に使用している)。

 次の画面は、ダウンロード・ダイアログの実行例である。

本稿で提供するダウンロード・ダイアログの実行例
タイトルバーの左にアイコンが表示されていることや、右に[最小化]ボタンが表示されていないことなど、若干の違いはあるものの、ClickOnceで提供されているユーザー・インターフェイスとほとんど同じデザインにしている。

 オンデマンド配置を行う際に、ApplicationDeploymentクラスの代わりに、「ClickOnce」プロジェクト(DigitalAdvantage.ClickOnce.dllファイル)に含まれるClickOnceAppDeploymentクラス(DigitaAdvantage.ClickOnce名前空間)のDownloadFileGroupメソッドを使うと、その内部で非同期処理によってダウンロード・グループのファイル群をダウンロードしながら、その進ちょくをこのダウンロード・ダイアログで表示するようにしている。

 ClickOnceAppDeploymentクラスのメソッドやプロパティは、ApplicationDeploymentクラスとほぼ同じであるが、いくつかのメソッドやプロパティを追加/削除している。例えば削除したメソッドには、非同期処理を行うXxxxxAsync系メソッドがある(DownloadFileGroupAsyncメソッドなど)。

 次のコードは、実際にこのClickOnceAppDeploymentクラスのDownloadFileGroupメソッドを呼び出す例だ。

using DigitaAdvantage.ClickOnce;

private bool MyDownloadFileGroup(string groupName)
{
  if (ClickOnceAppDeployment.IsNetworkDeployed)
  {
    ClickOnceAppDeployment deploy =
      ClickOnceAppDeployment.CurrentDeployment;

    if (deploy.IsFileGroupDownloaded(groupName) == false)
    {
      deploy.DownloadFileGroup(groupName);

      switch (deploy.ProcessingMode)
      {
        case ProcessingMode.Canceled:
          MessageBox.Show("処理をキャンセルしました。");
          break;

        case ProcessingMode.Error:
          // エラー・メッセージは
          // DownloadFileGroupメソッド内で表示済み。
          break;

        case ProcessingMode.Completed:
          // グループのダウンロードに成功!
          return true;
      }
    }
    else
    {
      // このグループはすでにインストールされています。
      return true;
    }
  }
  else
  {
    // ClickOnceで配置されたアプリケーションではないので
    // ダウンロードせずにコンポーネントを利用できます。
    return true;
  }
  return false;
}

ダウンロード・ダイアログを表示しながらオンデマンド配置を行うコード
先ほどのApplicationDeploymentクラスを活用したコードとほぼ同じ内容で、ダウンロード・ダイアログの表示が行える。変更もしくは追加した個所は太字にしている。

 このコードを見れば分かるように、先ほどのApplicationDeploymentクラスを活用したコードとほぼ同じ内容である。違うのは、ClickOnceAppDeploymentオブジェクトを利用していることと、オンデマンド配置(やアップデート)を行った後、そのProcessingModeプロパティにより詳細な処理結果をProcessingMode列挙体(DigitaAdvantage.ClickOnce名前空間)の値として取得できることだ。

 このProcessingMode列挙体の値の意味については次の表にまとめた。

意味
NoAction 何も実行していない状態
Processing 現在、処理を実行中
Completed 処理が完了し、成功した
Error エラーが発生し、処理を中止した
Canceled 処理がユーザーによりキャンセルされた
Skipped (処理を実行する前に)ユーザーがアプリケーションのアップデートを(今回は)スキップした
ProcessingMode列挙体の値の意味
このうちSkippedの状態は、アプリケーションをアップデートしてよいかどうかをユーザーに確認するダイアログを表示し、そのダイアログの[スキップ]ボタンが押されたときのものである。この状態ではアプリケーションは実際にはアップデートされていない(詳細後述)。

 以上で、オンデマンドで(ダウンロード・グループで指定した).DLLファイルをダウンロードできるようになった。それでは、ダウンロードしたそれらのファイルに含まれる機能(例えばクラスなど)は、どのようにして使えばよいのだろうか。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。