visual ubicación studio requisitos que publicar previos personalizados net misma los desde descargar aplicación aplicacion agregar clickonce

clickonce - studio - descargar los requisitos previos desde la misma ubicación que mi aplicación



¿Cómo puedo retrotraer una aplicación ClickOnce? (8)

ClickOnce usará 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.

Versiones de grano fino con ClickOnce

¿Hay alguna manera (lo hará Hacky) de permitir que un usuario regrese a una versión anterior de una aplicación implementada en red ClickOnce ?

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


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



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

El siguiente código intentará deshacer la aplicación ClickOnce "coolapp.app". 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 }); } } } }


Si observa 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, obtendrá la versión a la que regresó.


Entiendo que la versión de ClickOnce verifique algorythm de la siguiente manera:

  1. Si la versión instalada en el cliente = versión implementada en el servidor, no haga nada
  2. Si la versión del cliente <versión del servidor - actualización
  3. Si la versión del cliente> versión del servidor:
    1. Si minimumVersion especificado en el cliente> = versión del servidor - muestra el error ya que tenemos
    2. Si se especificó minimumVersion en el cliente <versión del servidor - downgrade
    3. Si minimumVersion no se especifica en el cliente - downgrade

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í.

Aquí le mostramos cómo cambiarlo (lo publiqué con Visual Studio 2008. Es posible que otras versiones tengan una estructura de carpetas de publicación diferente).

En la misma carpeta que el archivo publish.htm, se encuentra 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.


Solo tuve que hacer uno de estos en mi servidor de producción en vivo, y fue bueno 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:

  • Su copia de seguridad será grande si la aplicación es bastante grande, o hay muchas 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 desagradable tendencia a 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 ayudó reciclar mi grupo de aplicaciones en IIS .