Ormai tutte le applicazioni desktop si aggiornano via internet. Dovendo sviluppare delle soluzioni che si evolvono nel tempo e che devono essere costantemente aggiornate o semplicmente per aggiornare un software installato sui client all'interno della propria rete, mi sono trovato davanti a dover realizzare dei sistemi anche "fantasiosi" per eseguire gli aggiornamenti in automatico.
Grazie al framework .NET di Microsoft è stato da poco introdotto un assembly denominato System.Deployment (in system.deployment.dll) che contiene il namespace System.Deployment.Application.
Attraverso questo assembly è possibile verificare se esiste un aggiornamento del nostro programma all'indirizzo specificato. La pubblicazione deve avvenire attraverso ClickOnce.
Il codice riportato qui sotto l'ho preso direttamente da Microsoft e risolve le problematiche più immediate per eseguire l'aggiornamento dei nostri programmi in modo asincrono.
CheckForUpdateAsync riparte immediatamente ed esegue in un thread separato il download e l'installazione dell'applicazione aggiornata. Quando viene completata l'attività o cancellato il download, viene attivato l'evento CheckForUpdateCompleted.
1: Private sizeOfUpdate As Long = 0
2:
3: Dim WithEvents ADUpdateAsync As ApplicationDeployment
4:
5: Private Sub UpdateApplication()
6: If (ApplicationDeployment.IsNetworkDeployed) Then
7: ADUpdateAsync = ApplicationDeployment.CurrentDeployment
8: ADUpdateAsync.CheckForUpdateAsync()
9: End If
10: End Sub
11:
12: Sub ADUpdateAsync_CheckForUpdateProgressChanged(ByVal sender As Object, ByVal e As DeploymentProgressChangedEventArgs) Handles ADUpdateAsync.CheckForUpdateProgressChanged
13: DownloadStatus.Text = [String].Format("{0:D}K di {1:D}K scaricati.", e.BytesCompleted / 1024, e.BytesTotal / 1024)
14: End Sub
15:
16: Sub ADUpdateAsync_CheckForUpdateCompleted(ByVal sender As Object, ByVal e As CheckForUpdateCompletedEventArgs) Handles ADUpdateAsync.CheckForUpdateCompleted
17: If (e.Error IsNot Nothing) Then
18: MessageBox.Show(("ERRORE: Non è stato possibile scarica la nuova versione dell'applicazione. Azioni: " + ControlChars.Lf + e.Error.Message + ControlChars.Lf + "Si prega di contattare l'amministratore per ulteriori verifiche."))
19: Return
20: Else
21: If (e.Cancelled = True) Then
22: MessageBox.Show("L'aggiornamento è stato cancellato.")
23: End If
24: End If
25:
26: ' si chiede all'utente se desidera aggiornare l'applicazione.
27: If (e.UpdateAvailable) Then
28: sizeOfUpdate = e.UpdateSizeBytes
29:
30: If (Not e.IsUpdateRequired) Then
31: Dim dr As DialogResult = MessageBox.Show("È disponibile un nuovo aggiornamento. Si vuole aggiornare l'applicazione ora?", "Aggiornamento disponibile", MessageBoxButtons.OKCancel)
32: If (System.Windows.Forms.DialogResult.OK = dr) Then
33: BeginUpdate()
34: End If
35: Else
36: MessageBox.Show("Un aggiornamento importante dell'applicazione è disponibile per il download. Si proseguirà ora con l'installazione dell'aggiornamento e prima verranno salvati tutti i data e l'applicazione verrà riavviata.")
37: BeginUpdate()
38: End If
39: End If
40: End Sub
41:
42: Private Sub BeginUpdate()
43: ADUpdateAsync = ApplicationDeployment.CurrentDeployment
44: ADUpdateAsync.UpdateAsync()
45: End Sub
46:
47: Sub ADUpdateAsync_UpdateProgressChanged(ByVal sender As Object, ByVal e As DeploymentProgressChangedEventArgs) Handles ADUpdateAsync.UpdateProgressChanged
48: Dim progressText As String = String.Format("{0:D}K di {1:D}K scaricati - {2:D}% completato", e.BytesCompleted / 1024, e.BytesTotal / 1024, e.ProgressPercentage)
49: DownloadStatus.Text = progressText
50: End Sub
51:
52: Sub ADUpdateAsync_UpdateCompleted(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs) Handles ADUpdateAsync.UpdateCompleted
53: If (e.Cancelled) Then
54: MessageBox.Show("L'aggiornamento dell'ultima versione dell'applicazione è stata cancellata.")
55: Exit Sub
56: Else
57: If (e.Error IsNot Nothing) Then
58: MessageBox.Show("ERRORE: Non è stato possibile scarica la nuova versione dell'applicazione. Azioni: " + ControlChars.Lf + e.Error.Message + ControlChars.Lf + "Si prega di contattare l'amministratore per ulteriori verifiche.")
59: Exit Sub
60: End If
61: End If
62:
63: Dim dr As DialogResult = MessageBox.Show("L'applicazione è stata aggiornata. Riavviare? (Se non vuoi riavviare ora, le modifiche della nuova versione non avranno effetto fino al prossimo riavvio dell'applicazione)", "Riavvia applicazione", MessageBoxButtons.OKCancel)
64: If (dr = System.Windows.Forms.DialogResult.OK) Then
65: Application.Restart()
66: End If
67: End Sub
Per ulteriori approfondimenti sull'argomento si consiglia di visitare i seguenti link:
In allegato il codesnippet da importare direttamente in VS2008.