2012-01-20 25 views
19

Los lanzadores son más comunes en los juegos. Piensa en League of Legends, Starcraft II o casi cualquier MMO. Antes de comenzar el juego, tienes una pequeña aplicación de lanzamiento que se ocupa de las actualizaciones y parches.¿Cómo se actualiza una aplicación de inicio?

Quiero moverme en esta dirección con una aplicación particular que no sea un juego que estoy desarrollando. El concepto de iniciador tiene mucho sentido: busca actualizaciones, reemplaza los binarios/bibliotecas apropiados, tal vez ejecuta una verificación de integridad y lanza la aplicación. Sin embargo, ¿cómo se actualizan los lanzadores? Esto tiende a ser un evento raro, pero ¿cómo se hace? ¿El iniciador, literalmente, solo escribe sobre el mismo binario del que se está ejecutando actualmente? ¿O hay algún tipo de paso de intercambio después de la descarga? Necesito poder enviar actualizaciones (raras) al iniciador (especialmente si descubro algún error en mi iniciador).

Mi proyecto particular estará en C#, pero estoy interesado en soluciones conceptualmente similares de C++ y/o Java, así como referencia futura.

+1

Una vez que un programa se carga en la memoria, realmente no debería importar si lo que sucede con el archivo de imagen binaria de donde vino, por lo que se le debe permitir sobrescribirlo. Entonces todo lo que necesitas hacer es relanzar el programa, quizás con algo como 'exec'. –

+0

@KerrekSB Suena bastante simple. Todavía estoy un poco confuso en ese paso final. Entonces, ejecute el programa en un proceso separado y luego simplemente salga? – TheBuzzSaw

+5

@KerrekSB, Windows bloquea el archivo ejecutable mientras se está ejecutando. Parcialmente porque algunas secciones pueden no cargarse inmediatamente. –

Respuesta

5

nunca he probado, pero esto es lo que yo supongo (suponiendo que no se puede sobrescribir un archivo que está siendo ejecutado. Si es posible, todo esto es más simple)

Updater A checks if its the newest version 
If launcher isnt the newest version 
    Download the differences (to save bandwidth) to file B 
    Apply the delta to own code into file C 
    Launch file C. 
    Close 
If file C exists (update happened recently) 
    Try to delete C (update was previous launch, delete temporary file) 
    If delete fails (We are C, means A is out of date) 
     Copy C over A (update launcher) 
     Note that you can keep going, don't have to restart even though we are C. 
If game isnt newest version 
    Download the differences (to save bandwidth) to file B 
    Apply the delta to game into file D 
    delete game 
    Rename D -> game 
Run game 

André Caron me ha demostrado que el truco de intercambio se hace mejor con transactional file IO.

+0

Esto definitivamente me da algunas ideas. Estoy reflexionando en mi cabeza en este momento. – TheBuzzSaw

+0

Si la conexión se interrumpe? –

+1

@GaryVass: Pensé que los archivos temporales se ocuparon de eso. ¿Ves un defecto en mi diseño en alguna parte? Todas las descargas están en un archivo separado 'B' hasta que estén completas, y luego se aplican a otro archivo' C'/'D' hasta que se completen antes de la ejecución. –

2

Si se encuentra en el mundo de .NET, existe una estrategia de implementación llamada 'Hacer clic una vez'. Esto se creó para resolver el problema que ha descrito ...

ClickOnce es una tecnología de implementación que le permite crear aplicaciones auto-actualizadas basadas en Windows que se pueden instalar y ejecutar con una mínima interacción del usuario. implementación de ClickOnce supera tres cuestiones principales inherentes a la implementación:

Fuente: Click Once

Antes de embarcarse en esta estrategia, sugiero investigando sus pros y contras, porque hay más ávidos fanáticos y detractores.

En pocas palabras, carga nuevas versiones a un sitio web (que la aplicación está configurada para conocer). En el momento del inicio, la aplicación verifica el sitio y si hay una actualización le ofrece al usuario un cuadro de diálogo. Cuando el usuario elige aplicar la actualización, la aplicación se detiene y simultáneamente se activa un componente de "hacer clic una vez" para aplicar los cambios. El componente reinicia el ejecutable y todo esto aparece como una operación sin interrupciones para el usuario final ...

+2

Gracias por compartir esto. Buscaré en ClickOnce, pero todavía estoy interesado en ver soluciones directas basadas en código. Me gustaría entender el proceso conceptualmente si alguna vez tuviera que codificarlo yo mismo. – TheBuzzSaw

+1

Creo que OP estaba buscando técnicas utilizadas para implementar sistemas como ese. Esto no explica cómo se logra la actualización del iniciador. De todos modos, todavía tiene que actualizar el iniciador "Hacer clic una vez". Si se actualiza automáticamente, ¿entonces podrías explicar cómo se logra esto? –

+0

@ AndréCaron, el enlace ofrece una explicación muy clara de cómo se actualiza el iniciador. Sugiero leerlo y luego regresar con cualquier pregunta que tengas –

1

Básicamente, el iniciador comprueba si hay una versión más nueva de sí mismo y, si es así, inicia una tarea para obtener la nueva versión y luego la ejecuta y luego se cierra.

Dado que la aplicación de actualización es pequeña y se carga rápidamente, puede hacer que detecte, descargue, mantenga un diálogo para decir que hay una nueva versión y apenas parpadea cuando se cierra la versión anterior y la nueva.

Cuestiones relacionadas