vbdotnet.it

Tricks & tips, workaround, forum and ideas with .Net

About the author

Enrico Rossini è il gestore di questo blog.
E-mail me Send mail

Recent posts

Recent comments

Contributi

Best 6 ~ 6 users ~ 6 comments

Info legali

Le opinioni espresse in questo blog sono strettamente personali e ogni persona è responsabile dei commenti che inserisce. I marchi citati sono delle rispettive aziende.

© Copyright 2010

Advertising


Creare un LiveUpdate dalle proprie applicazioni

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.

Aggiorna applicazione.vsi (2,09 kb)

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Posted by enrico on Tuesday, August 05, 2008 12:09 AM
Permalink | Comments (1) | Post RSSRSS comment feed

Risolvere un dominio trovando il suo IP

Chissà quante volte ci è capitato di dover trovare l'IP di un indirizzo e non riuscire mai a trovare una funziona che consente di trovarlo. Queste poche righe di codice ci consentono di risolvere un dominio (nell'esempio vbdotnet.it) e restiuirne il primo IP configurato.

   1:  Try
   2:      ' dichiara una nuova collezione
   3:          Dim IpCollection As New Collection
   4:   
   5:          ' ottiene l'indirizzo IP dal dominio inserito
   6:          Dim i As Integer
   7:   
   8:          Dim ipE As Net.IPHostEntry = System.Net.Dns.GetHostEntry("vbdotnet.it")
   9:          Dim IpA() As Net.IPAddress = ipE.AddressList
  10:   
  11:          ' ottiene tutti gli indirizzi IP relativi al dominio
  12:      For i = 0 To IpA.GetUpperBound(0)
  13:                  IpCollection.Add(IpA(i).ToString)
  14:      Next
  15:   
  16:          ' restituisce il primo IP ottenuto
  17:      Dim AddressIP As String
  18:          AddressIP = IpCollection.Item(0)
  19:  Catch ex As Exception
  20:      MsgBox("An error has occured")
  21:  End Try

Come vedi, non sembra difficile :)

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Posted by enrico on Monday, August 04, 2008 11:17 PM
Permalink | Comments (0) | Post RSSRSS comment feed