none
Administrar actualizaciones de aplicaciones ClickOnce desde la aplicación RRS feed

  • Pregunta

  • Hola amigos del Foro:

    Estoy programando en VB 2012, una aplicación que la publico como clikonce.

    La publicación no tiene inconvenientes, pero ahora deseo incorporar un control de fechas para que pasada una determinada fecha, la publicación no se actualice más en el equipo.

    A través de este link Administrar actualizaciones de aplicaciones ClickOnce, he podido ver que se podría armar una estructura de código que permite controlar si se hace la actualización o no.

    No he podido acceder al espacio de nombre System.Deployment.Application como lo pide allí, y no obtengo ayuda de como lograrlo. Por ende, todo el código que me indican, no me sirve. ¿Alguno ha probado esta modalidad de actualización?

    Agrego el código que me indican y por favor, acepto sugerencias:

    Private sizeOfUpdate As Long = 0
    
        Dim WithEvents ADUpdateAsync As ApplicationDeployment
    
        Private Sub UpdateApplication()
            If (ApplicationDeployment.IsNetworkDeployed) Then
                ADUpdateAsync = ApplicationDeployment.CurrentDeployment
    
                ADUpdateAsync.CheckForUpdateAsync()
            End If
        End Sub
    
        Private Sub ADUpdateAsync_CheckForUpdateProgressChanged(ByVal sender As Object, ByVal e As DeploymentProgressChangedEventArgs) Handles ADUpdateAsync.CheckForUpdateProgressChanged
            DownloadStatus.Text = [String].Format("{0:D}K of {1:D}K downloaded.", e.BytesCompleted / 1024, e.BytesTotal / 1024)
        End Sub
    
    
        Private Sub ADUpdateAsync_CheckForUpdateCompleted(ByVal sender As Object, ByVal e As CheckForUpdateCompletedEventArgs) Handles ADUpdateAsync.CheckForUpdateCompleted
            If (e.Error IsNot Nothing) Then
                MessageBox.Show(("ERROR: Could not retrieve new version of the application. Reason: " + ControlChars.Lf + e.Error.Message + ControlChars.Lf + "Please report this error to the system administrator."))
                Return
            Else
                If (e.Cancelled = True) Then
                    MessageBox.Show("The update was cancelled.")
                End If
            End If
    
            ' Ask the user if they would like to update the application now.
            If (e.UpdateAvailable) Then
                sizeOfUpdate = e.UpdateSizeBytes
    
                If (Not e.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 (System.Windows.Forms.DialogResult.OK = dr) Then
                        BeginUpdate()
                    End If
                Else
                    MessageBox.Show("A mandatory update is available for your application. We will install the update now, after which we will save all of your in-progress data and restart your application.")
                    BeginUpdate()
                End If
            End If
        End Sub
    
        Private Sub BeginUpdate()
            ADUpdateAsync = ApplicationDeployment.CurrentDeployment
            ADUpdateAsync.UpdateAsync()
        End Sub
    
    
        Private Sub ADUpdateAsync_UpdateProgressChanged(ByVal sender As Object, ByVal e As DeploymentProgressChangedEventArgs) Handles ADUpdateAsync.UpdateProgressChanged
            Dim progressText As String = String.Format("{0:D}K out of {1:D}K downloaded - {2:D}% complete", e.BytesCompleted / 1024, e.BytesTotal / 1024, e.ProgressPercentage)
            DownloadStatus.Text = progressText
        End Sub
    
    
        Private Sub ADUpdateAsync_UpdateCompleted(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs) Handles ADUpdateAsync.UpdateCompleted
            If (e.Cancelled) Then
                MessageBox.Show("The update of the application's latest version was cancelled.")
                Exit Sub
            Else
                If (e.Error IsNot Nothing) Then
                    MessageBox.Show("ERROR: Could not install the latest version of the application. Reason: " + ControlChars.Lf + e.Error.Message + ControlChars.Lf + "Please report this error to the system administrator.")
                    Exit Sub
                End If
            End If
    
            Dim dr As DialogResult = MessageBox.Show("The application has been updated. Restart? (If you do not restart now, the new version will not take effect until after you quit and launch the application again.)", "Restart Application", MessageBoxButtons.OKCancel)
            If (dr = System.Windows.Forms.DialogResult.OK) Then
                Application.Restart()
            End If
        End Sub

    Estas notas figuran como previo:

    NotaNota

    System.Deployment.Application and System.ComponentModel namespaces." id="mt60" xml:space="preserve">La realización de actualizaciones asincrónicas requiere que la aplicación importe los espacios de nombres System.Deployment.Application ySystem.ComponentModel.

    Ejemplos

    En el ejemplo de código siguiente se determina si hay una nueva actualización disponible durante la carga de la aplicación; si se trata de una actualización necesaria, el ejemplo de código la instala asincrónicamente. TextBox named downloadStatus." id="mt62" xml:space="preserve">Este código se debe añadir en un formulario o control con un objeto TextBox denominado downloadStatus.

    He intentado hacer andar este código, pero no consigo siquiera instalar los espacios de nombres. Si alguien posee la solución, desde ya agradecido.

    Juan Carlos


    Juan Carlos

    lunes, 17 de noviembre de 2014 2:18

Respuestas

Todas las respuestas

  • hola

    pero agregarte la referencia a la dl System.Deployment.dll

    conoces como agregar una referencia en el proyecto, no ?

    ApplicationDeployment Class

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 17 de noviembre de 2014 10:48
  • Gracias Leandro:

    Pude ubicar la dll, y al incorporarla, se subsanaron los errores, salvo que ahora, en la línea donde se reinicia la aplicación, el comando Application.Restart ya no se encuentra definido como System.Windows.Forms.Application sino que cambia en este formulario a ser System.deployment.Application. ¿Porqué?

    Con este cambio, la línea Application.Restart ya no queda definida y no puedo reiniciar la aplicación


    Juan Carlos


    lunes, 17 de noviembre de 2014 11:44
  • hola

    puede que ese namespace defina una clase con el mismo nombre, en ese caso deberias definir el namespace completo

    System.Windows.Forms.Application.Restart()

    saludos

    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    lunes, 17 de noviembre de 2014 12:35
  • Ok Leandro. Muchas gracias

    Juan Carlos

    lunes, 17 de noviembre de 2014 12:37
  • Ok Leandro. Muchas gracias

    Juan Carlos

    Como verás Leandro, eres esclavo de tus conocimientos...

    He armado los procedimientos pero como cuando estoy en el fuente no se detecta como versión click Once, me veo en la obligación de cargarlo en la WEB y luego descargarlo.

    Cuando detecta que es un Click Once, le hago estos pasos:

    Public Sub UpdateApplication()
            Try
                If (ApplicationDeployment.IsNetworkDeployed) Then
                    MsgBox("Acabo de entrar en la actualización")
                    Dim AD As ApplicationDeployment = ApplicationDeployment.CurrentDeployment
                    Puntero = 1
                    Dim updateInterval As TimeSpan = DateTime.Now - AD.TimeOfLastUpdateCheck
                    Puntero = 2
                    'If AD.UpdatedVersion < AD.CurrentVersion Then
                    'If (updateInterval.Days > 1) Then
                    FG_Bienvenida.downloadStatus.Visible = True
                    Puntero = 3
                    MsgBox("Habilito caja de texto")
                    ADUpdateAsync = ApplicationDeployment.CurrentDeployment
                    MsgBox("Devuelvo el valor actual de deployment")
                    Puntero = 4
                    ADUpdateAsync.CheckForUpdateAsync()
                    Puntero = 5
                    MsgBox("Termino la rutina UpdateApplication")
                    'End If
                End If
            Catch ex As Exception
                MsgBox("Error puntero " & Puntero.ToString & "  en UpdateApplication" & vbCrLf & ex.Message)
            End Try
        End Sub
    

    Como verán, he puesto varios mensajes y nº de puntero para seguir dónde me da el error y veo que pasa después de asignar puntero=5. 

    Cuando la aplicación pasa por la línea en negrita me muestra:

    Luego de unos segundos de aparecer este mensaje.... la noche:

    No conozco el funcionamiento del comando ADUpdateAsync.CheckForUpdateAsync(), pero me parece que es el causante de todos los males. ¿Alguna sugerencia?

    Desde ya muchas gracias.



    Juan Carlos

    martes, 18 de noviembre de 2014 3:58
  • Estimados amigos, encontré una alternativa que funciona más allá que hubiera deseado tener el control de la descarga, pero la opción UdateAsync me hizo renegar y ahora opté por esta solución:

    Public Sub InstallUpdateSyncWithInfo() Dim info As UpdateCheckInfo = Nothing

    '===== AQUÍ COLOCO UN CONTROL DE FECHA QUE ME PERMITA ACTUALIZAR HASTA DICHA FECHA, SINO, QUE DESISTA If My.Settings.Fecha_Actualizacion < DateTime.Now.Date Then Exit Sub If (ApplicationDeployment.IsNetworkDeployed) Then Dim AD As ApplicationDeployment = ApplicationDeployment.CurrentDeployment Try info = AD.CheckForDetailedUpdate() Catch dde As DeploymentDownloadException MessageBox.Show("La nueva versión de la aplicación no se puede descargar en este momento. " + ControlChars.Lf & ControlChars.Lf & "Por favor, compruebe la conexión de red, o vuelva a intentarlo más tarde. Error: " + dde.Message) Return Catch ioe As InvalidOperationException 'Aquí pasa el error cuando no se encuentra una actualización por lo que salto esta opción Return End Try If (info.UpdateAvailable) Then Dim doUpdate As Boolean = True If (Not info.IsUpdateRequired) Then Dim dr As DialogResult = MessageBox.Show("Hay disponible una actualización (" & info.AvailableVersion.ToString & "). ¿Quieres actualizar la aplicación ahora?", "Actualización disponble", MessageBoxButtons.OKCancel) If (Not System.Windows.Forms.DialogResult.OK = dr) Then doUpdate = False End If Else MessageBox.Show("Esta aplicación ha detectado una actualización obligatoria de su actual " & _ "versión a la versión " & info.MinimumRequiredVersion.ToString() & _ ". La aplicación ahora instalará la actualización y reiniciará.", _ "Actualización disponible", MessageBoxButtons.OK, _ MessageBoxIcon.Information) End If If (doUpdate) Then Try AD.Update() MessageBox.Show("La aplicación ya se ha actualizado, en el próximo ingreso, podrá usar los cambios.") Catch dde As DeploymentDownloadException MessageBox.Show("No se puede instalar la última versión de la aplicación. " & ControlChars.Lf & ControlChars.Lf & "Por favor, compruebe la conexión de red, o vuelva a intentarlo más tarde.") Return End Try End If End If End If End Sub

    Este procedimiento permite que se actualice una versión, preguntando previamente. NO ASUSTARSE: Si hay una nueva versión y desistimos de actualizarla, en la próxima corrida de la aplicación preguntará como si buscara automáticamente, pero es porque hemos denegado dicha actualización.

    Espero les sirva.


    Juan Carlos

    martes, 18 de noviembre de 2014 17:21