2008-10-13 18 views
42

¿Hay alguna manera (lo hará Hacky) de permitir que un usuario regrese a una versión anterior de una aplicación desplegada en la red ClickOnce?¿Cómo puedo retrotraer una aplicación ClickOnce?

He buscado en los documentos y API y parece que no hay forma. Usted puede seleccionar selectivamente si desea actualizar, pero una vez actualizado, aparentemente, no hay vuelta atrás.

Respuesta

18

ClickOnce utilizará cualquier versión que los envíe. Si les envía una versión anterior, se revertirán a esa versión anterior.

En mayo, mi amigo David escribió un artículo sobre cómo hacerlo por usuario. Literalmente podemos tener a cada usuario en una versión diferente. La aplicación incluso le dice a la base de datos qué versión quiere el usuario, por lo que en teoría podría cambiar su versión y luego simplemente reiniciar la aplicación.

Fine Grained Versioning with ClickOnce

+0

¡Saludos, parece un buen enfoque! –

6

Puede ir a Agregar/Eliminar aplicación y seleccionar su aplicación y elegir obtener la última instalación en su lugar.

+0

Gracias compañero, Voy a tratar de que por la mañana! –

+0

método muy simple para revertir una versión. Gracias Patrick. – TWood

1

Si mira su ubicación de implementación, verá todas las versiones anteriores, en una carpeta separada con el número de versión adjunto, así como el manifiesto de implementación, también con el número de versión adjunto.

Puede cambiar el nombre de cualquiera de ellos para que sea la implementación actual, y la próxima vez que actualice esa aplicación, extraerá la versión a la que ha retrocedido.

+1

hace esto? - Sería muy útil –

+0

No sé si eso funcionaría. El manifiesto de implementación tiene una ruta al manifiesto de la aplicación, pero el manifiesto de la aplicación creo que también tiene una versión. Tampoco puedes actualizarlo sin renunciar. –

2

Puede utilizar MAGEUI a revertir a una versión anterior de manifiesto en el servidor. Check this out.

+0

Puede, siempre que (a) la versión instalada actualmente nunca haya tenido la versión mínima requerida establecida en el manifiesto, y (b) la posibilidad de no poder leer la configuración de la aplicación de la versión anterior. Vea mi comentario en esta respuesta http://stackoverflow.com/a/273719/607117 para más información sobre ese último punto. –

76

Puede volver a una versión anterior en el servidor cambiando el archivo de manifiesto del servidor. Cuando el cliente reinicie la aplicación, verá que tiene una versión diferente a la que el servidor dice que es la versión "actual" y descargará la nueva. Este archivo de manifiesto del servidor generalmente siempre apunta a la versión más reciente, pero no tiene por qué ser así.

Así es cómo cambiarlo (publiqué usando Visual Studio 2008. Otras versiones pueden tener una estructura de carpeta de publicación diferente).

En la misma carpeta que la publicación.htm es un documento XML llamado [appName].application. Este es el archivo de manifiesto del lado del servidor que el cliente usa para comparar su versión actual. El contenido de este documento incluye la versión 'actual' que el cliente debe ejecutar, así como la ubicación en el servidor donde se encuentran los archivos de implementación.

En la misma ubicación que publish.htm también hay una carpeta llamada 'Archivos de aplicación'. Esta carpeta contiene subcarpetas para cada publicación anterior. Dentro de cada una de estas subcarpetas hay otro documento XML con el mismo nombre que mencioné anteriormente llamado [appName].application. Copie este archivo (desde cualquier carpeta que contenga la versión a la que desee volver) y péguelo en la misma carpeta que publish.htm (un par de niveles más arriba). Cuando la aplicación cliente se reinicie, aparecerá como una nueva versión disponible, descárguelo y ejecútelo. El cliente ahora ejecutará una versión anterior.

+0

Gracias Jason, terminé usando tal y enfoque :) –

+2

Además, podría manipular el archivo publish.htm para reflejar el número de versión correspondiente (dentro del bloque AppInfo) – jan

+0

Gran respuesta. Gracias. –

0

Tuve que hacer uno de estos en mi servidor de producción en vivo, y fue agradable tener todas estas notas. Mi solución fue un poco diferente, y quería agregar esto como una solución también. Antes de hacer una implementación de producción siempre hago una copia de seguridad de toda la carpeta que contiene de antemano.Pude copiar toda la estructura de carpetas a su estado original y todo funcionó bien.

Notas de precaución con este método:

  • La copia de seguridad será grande si la aplicación es bastante grande, o hay una gran cantidad de versiones ya publicadas en la carpeta de archivos de la aplicación. Asegúrate de tener suficiente espacio (para mí el almacenamiento no es un problema).
  • Los permisos tienen una tendencia desagradable de morderte de esta manera. Asegúrese de que su ubicación de implementación esté alojada para acceso externo y que verifique todos los permisos antes y después de la restauración.
  • Me fue útil reciclar mi grupo de aplicaciones en IIS.
0

Esto se puede hacer por reflexión si conoce el editor URI y el nombre, el token de clave pública de idioma de versión y la arquitectura del procesador tanto del despliegue como de la aplicación.

El siguiente código intentará deshacer la aplicación "coolapp.app" ClickOnce. Si no puede revertir, intentará desinstalarlo.

using System; 
using System.Deployment.Application; 
using System.Reflection; 

namespace ClickOnceAppRollback 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     static void Main() 
     { 
      string appId = string.Format("{0}#{1}, Version={2}, Culture={3}, PublicKeyToken={4}, processorArchitecture={5}/{6}, Version={7}, Culture={8}, PublicKeyToken={9}, processorArchitecture={10}, type={11}", 
       /*The URI location of the app*/@"http://www.microsoft.com/coolapp.exe.application", 
       /*The application's assemblyIdentity name*/"coolapp.app", 
       /*The application's assemblyIdentity version*/"10.8.62.17109", 
       /*The application's assemblyIdentity language*/"neutral", 
       /*The application's assemblyIdentity public Key Token*/"0000000000000000", 
       /*The application's assemblyIdentity processor architecture*/"msil", 
       /*The deployment's dependentAssembly name*/"coolapp.exe", 
       /*The deployment's dependentAssembly version*/"10.8.62.17109", 
       /*The deployment's dependentAssembly language*/"neutral", 
       /*The deployment's dependentAssembly public Key Token*/"0000000000000000", 
       /*The deployment's dependentAssembly processor architecture*/"msil", 
       /*The deployment's dependentAssembly type*/"win32"); 

      var ctor = typeof(ApplicationDeployment).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(string) }, null); 
      var appDeployment = ctor.Invoke(new object[] { appId }); 

      var subState = appDeployment.GetType().GetField("_subState", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(appDeployment); 
      var subStore = appDeployment.GetType().GetField("_subStore", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(appDeployment); 
      try 
      { 
       subStore.GetType().GetMethod("RollbackSubscription").Invoke(subStore, new object[] { subState }); 
      } 
      catch 
      { 
       subStore.GetType().GetMethod("UninstallSubscription").Invoke(subStore, new object[] { subState }); 
      } 
     } 
    } 
} 
1

entiendo ClickOnce comprobación de versión algoritmo de la siguiente manera:

  1. Si la versión instalada en el cliente = versión implementada con el servidor - no hacer nada
  2. Si la versión cliente de la versión < servidor - actualización
  3. Si versión del cliente> versión del servidor:
    1. Si se especificó minimumVersion en el cliente> = versión del servidor - muestra el error cuando
    2. tener
    3. Si minimumVersion especifica en la versión cliente servidor < - rebaja
    4. Si minimumVersion no se especifica en el cliente - rebaja
Cuestiones relacionadas