■ClickOnceアプリケーションをプログラムから更新する!

前回のClickOnceアプリの更新では、ClickOnceの自動更新機能を使用して更新を行いました。実は ClickOnceには自動更新以外にアプリケーションを更新する方法が有るのです。それは「System.Deployment」に あるクラスを使用して、独自の更新機能を実装する方法です。今回の実験では、自分自身を更新する機能を 持つ簡単なアプリケーションを作成し、「System.Deployment」のクラスを紹介します。
これが今回作成するアプリケーションです。現在動作しているアプリケーションのバージョンと、更新可能なバージョンを 表示します。また、画面右下の「更新」ボタンをクリックすると自分自身を更新します。

以下がバージョン情報を取得するまでのソースです。

1:       //現在のApplicationDeploymentクラスのインスタンスを取得する
2:       ApplicationDeployment deployment = ApplicationDeployment.CurrentDeployment;
3:
4:       //ClickOnceアプリの更新情報を持つクラスを取得する
5:       UpdateCheckInfo info = deployment.GetUpdateCheckInfo();
6:
7:       Version version = deployment.RunningVersion;
8:       l_current_value.Text = version.Major.ToString() + "."+ version.Minor.ToString() + "."
10:				+ version.Build.ToString() + "." + version.Revision.ToString();
11:      version = info.AvailableVersion;
12:      l_available_value.Text = version.Major.ToString() + "." + version.Minor.ToString() + "."
13:				 + version.Build.ToString() + "." + version.Revision.ToString();
14:
15:      //アプリケーションが更新可能な場合
16:      if (info.UpdateAvailable)
17:              b_update.Enabled = true;
18:      else
19:              b_update.Enabled = false;

2行目に出現するクラス「ApplicationDeployment」がアプリケーションのマニュアル更新を行う際に最も 中心的な役割を果たすクラスです。このクラスにはアプリケーションを更新する「Update()」メソッドや 更新可能なバージョンの存在を確認する「CheckForUpdate()」メソッドが存在します。 2行目ではstaticメソッドのCurrentDeployment()を使用して現在のApplicationDeployment オブジェクトを取得します。
5行目では取得可能なバージョンのアプリケーション情報を持つUpdateCheckInfoクラスのインスタンスを 取得しています。このクラスから取得するアプリケーションのバージョンやサイズ等を得ることができます。 (厳密にはサーバーに置かれているデプロイメントマニフェストの情報を取得していると思います。)

7行目から12行目では、Versionクラスのインスタンスから現在のアプリケーションのバージョンと 取得可能なアプリケーションのバージョンを取得しています。 16行目では、現在のアプリケーションと事なるバージョンを持つアプリケーションがサーバーに 配置されているかをチェックしています。

次に示すソースが「更新」ボタンが押された時の処理です。


1:         private void b_update_Click(object sender, EventArgs e)
2:         {
3:             try
4:             {
5:                 ApplicationDeployment deployment = ApplicationDeployment.CurrentDeployment;
6:                 if (deployment.CheckForUpdate())
7:                 {
8:                     deployment.Update();
9:                     Application.Restart();
10:                }
11:
12:            }
13:            catch (Exception ex) { }
14:        }

5,6行目の処理は先ほどと同じです。ここでのポイントは8行目です。8行目のUpdateメソッドの呼び出しにより 新しいバージョンのソフトウェアのダウンロードとインストールを行っています。Updateメソッドは 時間がかかる可能性が有りますので、非同期で呼び出す事が可能なUpdateAsyncを使用する事が 推奨されます。

さて、今回の実験では、ClickOnceアプリのプログラムを使用した更新を行いました。この機能を使って 何ができるかと考えてみると、例えば、更新処理を行った後、各ユーザの更新状況を管理するDBにユーザが 更新した事を記録するなどが出来るかな(だから何?)って思ってます。ClickOnceアプリを 使用してアプリケーションを配布した場合、何らかの方法でユーザが現在使用しているアプリケーションの バージョンを管理した方が良い気がしているので。。

いかがだったでしょうか?皆さんも是非トライしてみて下さい。 ご質問等が有りましたら、どしどし下さい。

HOMEへ