2009-07-31 28 views
11

Tenemos un exe mínimo de "actualización" que verifica las URL de una URL remota, las descarga y reemplaza los archivos en el disco antes de iniciar la aplicación real. Sin embargo, si queremos reemplazar el actualizador EXE entonces AFAIK tenemos dos opciones:Mejor método para implementar el software de actualización automática

1) Shadow Copying Assemblies mediante el cual .Net creará una copia sombra del EXE (y los ensamblajes a los que se hace referencia) y cargará esos ensamblajes, de modo que los ensambles de sombras pueden reemplazarse y se usarán cuando la aplicación se lance a continuación.

2) Identifique qué archivos se reemplazan y renómbrelos/muévalos en el disco. Windows parece permitir el cambio de nombre/movimiento de archivos bloqueados, por lo que podemos mover los archivos y copiar en los nuevos conjuntos. De nuevo, en el siguiente lanzamiento de la aplicación lanzaremos los nuevos ensamblajes. Este enfoque se menciona here

¿Este segundo método es un método recomendado? ¿Hay algún inconveniente en este enfoque?

Respuesta

6

¿Qué hay de ClickOnce deployment?

+0

Esta es probablemente la mejor opción, ya que debería ayudar a estandarizar la actualización/degradación del nivel de seguridad que es requerido en Windows Vista y versiones futuras de Windows –

+0

No estamos usando ClickOnce por ahora ya que era más fácil usar el método de copiado de archivo que describí, y también tenemos un proceso de actualización cutomised para una base de datos SQL que se instala junto con la aplicación. Sin embargo, ClickOnce es la solución oficial de Microsoft y en la que analizaremos más con miras a su uso futuro, por lo tanto, estoy eligiendo esta como la respuesta aceptada. Gracias. – redcalx

+1

ClickOnce es una pesadilla porque es inflexible, demasiado complejo, parece no tener una sólida compatibilidad de Microsoft y es muy específico para los escenarios de implementación por usuario. – jpierson

6

Otra opción: cuando la aplicación principal desea actualizarse, genera un nuevo proceso de actualización y luego se cierra. Mientras tanto, el proceso generado espera a que la aplicación principal se cierre (el proceso desaparezca) y luego actualiza todos los archivos necesarios (incluido el .exe). Después de eso, simplemente reinicia la aplicación principal y sale del proceso de actualización.

+0

Suena razonable – jpierson

+0

@jpierson y funciona :). He estado usando este enfoque durante 2 años para mi propia aplicación. –

8

Im utilizando el segundo método sin ningún problema. Solo asegúrese de que el ensamblaje descargado se haya descargado correctamente. ;)

Ejecutar Update.exe y deja que haga esto:
1. Descarga el nuevo update.exe como update.ex_
2. Cambie el nombre update.exe a update.bak (puede cambiarle el nombre, pero no sobrescribir)
3. Cambie el nombre update.ex_ a update.exe
4. reinicio update.exe

estoy haciendo esto con ningún problema en absoluto por lo que su probados y están corriendo en medio ambiente en vivo en aproximadamente 400 clientes mientras hablamos.

+0

¿cómo reiniciaría el programa actualmente en ejecución? ¿hay una manera fácil? – chillitom

+0

@chilitom: process.start (Application.StartupPath & "\ myprogram.exe"): end – Stefan

+0

+1 para comentar en el paso # 2 – jpierson

1

La forma en que lo hacemos con nuestra aplicación interna en:

La aplicación de puntos de acceso directo a la actualización.

  1. Se muestran las notificaciones de tiempo de inactividad/fecha límite.
  2. el actualizador realiza una comprobación de actualización.
  3. Se descargan e instalan las actualizaciones.
  4. Se lanzó la aplicación.
  5. aplicación realiza actualización del actualizador (cheques para Updater.fp7.gz en la carpeta/actualización)

Editar: Vaya - paso en falso 5.

+2

Has leído la pregunta ¿verdad? ¿Cómo se actualiza el actualizador en su escenario? –

3

En un proyecto que trabajé, donde hay 2 ejecutables. Vamos a llamarlos A y B.

La única razón por la que A existía era para iniciar B. Entonces, cuando B (la aplicación 'real') descargó una actualización, pudo reemplazar A si fuera necesario.

Si se reinicia la aplicación (vía A), A comprueba si B descargar algunos archivos y los sustituyó antes de que empezara B.

+0

Recientemente tropecé con el hecho de que un ejecutable en ejecución no se puede sobrescribir, pero se puede renombrar. Lo probé yo mismo en una aplicación de prueba y utilizaré esta técnica para desarrollar mi propio componente de actualización automática de aplicaciones. – jpierson

+1

Eche un vistazo a Shadow Copying (http://msdn.microsoft.com/en-us/library/ms404279.aspx). Lo usamos para permitir a los clientes en un servidor de terminal actualizar el software del cliente, mientras que otros usuarios ejecutan la aplicación en la misma máquina al mismo tiempo. – sloth

0

estoy básicamente de acuerdo con Stefan's Answer a excepción de que no puede trabajar si quieres adecuadamente tratar con UAC en Windows Vista o Windows 7 y su aplicación se instala correctamente en la carpeta Archivos de programa o requiere que se instalen otras dependencias que necesitan permisos elevados.

En este caso, usted está haciendo una instalación/parche basado en msi o está instalando un servicio de Windows que se ejecuta con la seguridad necesaria para sobrescribir los archivos en la carpeta Archivos de programa.

La otra opción si su aplicación es interactiva es hacer lo que Igor Brejc sugiere y engendrar un nuevo proceso que hace la actualización que le da a su aplicación la oportunidad de pedirle que eleve los permisos durante la actualización. Sin embargo, usar el parche o la opción de servicio de Windows como se mencionó anteriormente proporcionaría una mejor experiencia de usuario independientemente del escenario (interactivo/no interactivo).

Cuestiones relacionadas