アプリケーションのインストール
ブラウザー外実行のアプリケーションをプログラムコードからインストールするためのAPIも用意されています。
プログラムコードからアプリケーションのインストールやアップデートをするためにはApplicationクラスのInstallメソッドやCheckAndDownloadUpdateAsyncメソッドを利用します(ただし、アンインストール用のAPIは現在提供されていません)。
リスト5はインストールボタンが押された時に、現在のSilverlightアプリケーションをブラウザー外実行で動作するようにインストールするイベントハンドラーです。
まずは、インストールボタンがクリックされたときにInstall_Clickイベントハンドラーが呼び出されるようにXAML側を修正しましょう。
<Button Content="アプリケーションのインストール" Click="Install_Click" />
ローカルコンピューターにインストールするためには、ApplicationクラスのInstallメソッドを利用します。ただし、既にインストールされている環境に再度インストールを行うとInvalidOperationExceptionの例外が発生するため、InstallStateプロパティーを調査して現在のインストール状況を確認する必要があります。
private void Install_Click(object sender, RoutedEventArgs e) { if (Application.Current.InstallState == InstallState.NotInstalled) Application.Current.Install(); else MessageBox.Show("既にインストールされています。"); }
さっそく実行してアプリケーションインストールボタンをクリックすると、コンテキストメニューからアプリケーションのインストールを選択したときと同じように図4のダイアログが表示されたことを確認できると思います。
アプリケーションの更新
続いてアプリケーションの更新プログラムを見ていきましょう。
インストールと同様にアプリケーションの更新ボタンが押された時にUpdate_Clickイベントハンドラーが呼び出されるようにXAMLを修正します。
<Button Content="アプリケーションの更新" Click="Update_Click" />
リスト6はアプリケーションの更新を行うコードです。
インストールされたアプリケーションの更新状態をチェックし、アプリケーションを最新にするためには、ApplicationクラスのCheckAndDownloadUpdateAsyncメソッドを利用します。このメソッドは名前の通りアプリケーションの最新状態のチェックと更新を非同期で実行します。更新はアプリケーションの次回起動時に有効になります。
更新自体は非同期で行われるため、CheckAndDownloadUpdateAsyncメソッドを実行する前に更新が終了した時に発生するCheckAndDownloadUpdateCompletedイベントのイベントハンドラーを登録しておく必要があります。
public MainPage() { InitializeComponent(); // 更新終了時のイベントハンドラーを登録 Application.Current.CheckAndDownloadUpdateCompleted += Current_CheckAndDownloadUpdateCompleted; } private void Update_Click(object sender, RoutedEventArgs e) { Application.Current.CheckAndDownloadUpdateAsync(); } private void Current_CheckAndDownloadUpdateCompleted (object sender, CheckAndDownloadUpdateCompletedEventArgs e) { if (e.UpdateAvailable) { MessageBox.Show("正常に更新されました。再起動後に有効になります。"); } else { if (e.Error == null) MessageBox.Show("現在のバージョンが最新です。"); else MessageBox.Show(string.Format("更新に失敗しました。{0}", e.Error.ToString())); } }
アプリケーションの更新が終了すると(たとえ更新時にエラーが発生したとしても)アプリケーションの開始時に登録したCurrent_CheckAndDownloadUpdateCompletedイベントハンドラーが呼び出されます。
このイベントハンドラーでは、アプリケーションの更新が正常に成功したかをCheckAndDownloadUpdateCompletedEventArgsクラスのUpdateAvailableプロパティを確認することでチェックすることができます。
ここで注意したいのは、現在のアプリケーションが最新である場合はアプリケーションの更新自体は行われないため、UpdateAvailableプロパティはfalseをかえすということです。
更新時にエラーが発生したかどうかを調べるためには、UpdateAvaliableプロパティのほかにErrorプロパティーも同様に調査する必要があります。
インストール状況の表示
アプリケーションのインストール状況を調べるためには、ApplicationクラスのInstallStateプロパティを調査します。
リスト7では、アプリケーションの開始時にInstallStateChangeイベントハンドラーを登録することで、アプリケーションのインストール状況が変更した際にテキストブロック状況を表示させるようにしています。
public MainPage() { InitializeComponent(); // インストール状態の表示 インストール状況の表示(); Application.Current.InstallStateChanged += Current_InstallStateChanged; // 更新終了時のイベントハンドラーを登録 Application.Current.CheckAndDownloadUpdateCompleted += Current_CheckAndDownloadUpdateCompleted; } private void Current_InstallStateChanged(object sender, EventArgs e) { インストール状況の表示(); } private void インストール状況の表示() { switch (Application.Current.InstallState) { case InstallState.Installed: 実行モード.Text = "インストール終了"; break; case InstallState.Installing: 実行モード.Text = "インストール中"; break; case InstallState.InstallFailed: 実行モード.Text = "インストール失敗"; break; case InstallState.NotInstalled: 実行モード.Text = "未インストール"; break; default: 実行モード.Text = "それ以外"; break; } }
では、プログラムを実行して動作を確認してみましょう(図11)。
アプリケーションインストールをクリックすると、実行モードが未インストール→インストール中→インストール完了と変化し、インストールされたブラウザー外実行のアプリケーションが起動されるのを確認することができると思います。
アプリケーションがインストールされた状態でプログラムを更新し(例えばリスト8のようなコードを追加して)アプリケーションの更新ボタンをクリックすると、アプリケーションの更新が行われることを確認できると思います。
public MainPage() { InitializeComponent(); // インストール状態の表示 インストール状況の表示(); Application.Current.InstallStateChanged += Current_InstallStateChanged; // 更新終了時のイベントハンドラーを登録 Application.Current.CheckAndDownloadUpdateCompleted += Current_CheckAndDownloadUpdateCompleted; Version.Text = "2.0"; }
アプリケーションの更新をチェックする際にSilverlightアプリケーションはホストされていたWebアプリケーションと通信を行うため、Webサーバー(デバック時はVisual Studioの開発Webサーバー)が起動していないとSystem.Exceptionの例外が発生し更新を行うことができません。