方法 : ClickOnce 配置 API を使用してアプリケーションの更新プログラムをプログラムで確認する
ClickOnce には、配置されたアプリケーションを更新する 2 つの方法が用意されています。1 番目の方法では、一定の間隔で自動的に更新プログラムを確認するように ClickOnce 配置を構成できます。2 番目の方法では、ApplicationDeployment クラスを使用して、ユーザー要求などのイベントに基づいて更新プログラムを確認するコードを作成できます。
次の手順では、プログラムによる更新を実行するためのコードを示し、プログラムによる更新プログラムの確認が可能となるように ClickOnce 配置を構成する方法を説明します。
ClickOnce アプリケーションをプログラムによって更新するには、更新プログラムの場所を指定する必要があります。これは、配置プロバイダーと呼ばれる場合があります。このプロパティの設定の詳細については、「ClickOnce の更新方法の選択」を参照してください。
[!メモ]
以下で説明する手法を使用すると、ある場所からアプリケーションを配置し、それを別の場所から更新することもできます。詳細については、「方法 : 配置の更新用に別の場所を指定する」を参照してください。
更新プログラムの確認をプログラムから行うには
任意のコマンド ライン ツールまたはビジュアル ツールを使用して、新しい Windows フォーム アプリケーションを作成します。
更新プログラムを確認する場合にユーザーが選択するボタン、メニュー項目、またはその他のユーザー インターフェイス項目を作成します。更新プログラムを確認してインストールするには、その項目のイベント ハンドラーから次のメソッドを呼び出します。
Private Sub InstallUpdateSyncWithInfo() Dim info As UpdateCheckInfo = Nothing If (ApplicationDeployment.IsNetworkDeployed) Then Dim AD As ApplicationDeployment = ApplicationDeployment.CurrentDeployment Try info = AD.CheckForDetailedUpdate() Catch dde As DeploymentDownloadException MessageBox.Show("The new version of the application cannot be downloaded at this time. " + ControlChars.Lf & ControlChars.Lf & "Please check your network connection, or try again later. Error: " + dde.Message) Return Catch ioe As InvalidOperationException MessageBox.Show("This application cannot be updated. It is likely not a ClickOnce application. Error: " & ioe.Message) Return End Try If (info.UpdateAvailable) Then Dim doUpdate As Boolean = True If (Not info.IsUpdateRequired) Then Dim dr As DialogResult = MessageBox.Show("An update is available. Would you like to update the application now?", "Update Available", MessageBoxButtons.OKCancel) If (Not System.Windows.Forms.DialogResult.OK = dr) Then doUpdate = False End If Else ' Display a message that the app MUST reboot. Display the minimum required version. MessageBox.Show("This application has detected a mandatory update from your current " & _ "version to version " & info.MinimumRequiredVersion.ToString() & _ ". The application will now install the update and restart.", _ "Update Available", MessageBoxButtons.OK, _ MessageBoxIcon.Information) End If If (doUpdate) Then Try AD.Update() MessageBox.Show("The application has been upgraded, and will now restart.") Application.Restart() Catch dde As DeploymentDownloadException MessageBox.Show("Cannot install the latest version of the application. " & ControlChars.Lf & ControlChars.Lf & "Please check your network connection, or try again later.") Return End Try End If End If End If End Sub
private void InstallUpdateSyncWithInfo() { UpdateCheckInfo info = null; if (ApplicationDeployment.IsNetworkDeployed) { ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment; try { info = ad.CheckForDetailedUpdate(); } catch (DeploymentDownloadException dde) { MessageBox.Show("The new version of the application cannot be downloaded at this time. \n\nPlease check your network connection, or try again later. Error: " + dde.Message); return; } catch (InvalidDeploymentException ide) { MessageBox.Show("Cannot check for a new version of the application. The ClickOnce deployment is corrupt. Please redeploy the application and try again. Error: " + ide.Message); return; } catch (InvalidOperationException ioe) { MessageBox.Show("This application cannot be updated. It is likely not a ClickOnce application. Error: " + ioe.Message); return; } if (info.UpdateAvailable) { Boolean doUpdate = true; if (!info.IsUpdateRequired) { DialogResult dr = MessageBox.Show("An update is available. Would you like to update the application now?", "Update Available", MessageBoxButtons.OKCancel); if (!(DialogResult.OK == dr)) { doUpdate = false; } } else { // Display a message that the app MUST reboot. Display the minimum required version. MessageBox.Show("This application has detected a mandatory update from your current " + "version to version " + info.MinimumRequiredVersion.ToString() + ". The application will now install the update and restart.", "Update Available", MessageBoxButtons.OK, MessageBoxIcon.Information); } if (doUpdate) { try { ad.Update(); MessageBox.Show("The application has been upgraded, and will now restart."); Application.Restart(); } catch (DeploymentDownloadException dde) { MessageBox.Show("Cannot install the latest version of the application. \n\nPlease check your network connection, or try again later. Error: " + dde); return; } } } } }
public: void InstallUpdateSync() { if (ApplicationDeployment::IsNetworkDeployed) { bool isUpdateAvailable = false; ApplicationDeployment^ appDeployment = ApplicationDeployment::CurrentDeployment; try { isUpdateAvailable = appDeployment->CheckForUpdate(); } catch (InvalidOperationException^ ex) { MessageBox::Show("The update check failed. Error: {0}", ex->Message); return; } if (isUpdateAvailable) { try { appDeployment->Update(); MessageBox::Show( "The application has been upgraded, and will now " + "restart."); Application::Restart(); } catch (Exception^ ex) { MessageBox::Show("The update failed. Error: {0}", ex->Message); return; } } } }
アプリケーションをコンパイルします。
プログラムで更新プログラムを確認するアプリケーションを Mage.exe を使用して配置する場合
「チュートリアル : ClickOnce アプリケーションを手動で配置する」で説明されている、Mage.exe を使用してアプリケーションを配置するための手順に従います。Mage.exe を呼び出して配置マニフェストを生成する場合は、必ず providerUrl コマンド ライン スイッチを使用し、ClickOnce が更新プログラムを確認する URL を指定します。たとえば、アプリケーションが https://www.microsoft.com/ja/jp/default.aspx から更新される場合は、次のような呼び出しによって配置マニフェストを生成します。
mage -New Deployment -ToFile WindowsFormsApp1.application -Name "My App 1.0" -Version 1.0.0.0 -AppManifest 1.0.0.0\MyApp.manifest -providerUrl http://www.adatum.com/MyApp/MyApp.application
プログラムで更新プログラムを確認するアプリケーションを MageUI.exe を使用して配置する場合
- 「チュートリアル : ClickOnce アプリケーションを手動で配置する」で説明されている、Mage.exe を使用してアプリケーションを配置するための手順に従います。[配置オプション] タブで、[Start Location] フィールドを ClickOnce が更新プログラムを確認するアプリケーション マニフェストに設定します。[更新オプション] タブで、[アプリケーションの更新プログラムを確認する] チェック ボックスをオフにします。
セキュリティ
プログラムによる更新を使用するには、アプリケーションに完全信頼のアクセス許可が必要です。