Por razones técnicas, no puedo usar ClickOnce para actualizar automáticamente mi aplicación .NET y sus ensamblajes. ¿Cuál es la mejor manera de manejar la actualización automática en .NET?¿Cuál es la mejor forma para que una aplicación .NET winforms se actualice solo sin usar ClickOnce?
¿Cuál es la mejor forma para que una aplicación .NET winforms se actualice solo sin usar ClickOnce?
Respuesta
Creo que el Updater Application Block fue una especie de precursor de ClickOnce. Puede valer la pena investigar. Ver su código fuente podría ser suficiente para generar algunas ideas.
¡Gracias! Esto fue lo que recordé haber leído hace un par de años. – MusiGenesis
Y ahora estoy recordando por qué nunca terminé usándolo. Sheesh. – MusiGenesis
¡lol! Sí, los bloques de aplicaciones son un poco desalentadores. Nunca los he usado tampoco. –
Escribe la tuya.
He oído que son algo difíciles de escribir la primera vez, pero después de eso se vuelve simple.
Como todavía no he escrito una (aunque está en mi lista), puedo darle algunas de las cosas que he pensado. Mantenga versiones dll precisas, ya que esto es importante para la actualización automática. Y asegúrese de que el actualizador pueda actualizarse.
¡Hacer eso es realmente divertido! Lo hice dejando que la aplicación actualice el actualizador. –
Hacer rodar mi propio actualizador llevó varios meses en mi empresa, pero ahora tenemos uno que conocemos por dentro y por fuera, y podemos depurarlo a voluntad. Realmente valió la pena. – Dinah
En el archivo Program.cs hacer algo como esto:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Update();
Application.Run(new Form1());
}
private static void Update()
{
string mainFolder;
string updateFolder;
string backupFolder;
foreach (string file in
System.IO.Directory.GetFiles(updateFolder))
{
string newFile = file.Replace(
updateFolder, mainFolder);
if (System.IO.File.Exists(newFile))
{
System.IO.File.Replace(file, newFile, backupFolder);
}
else
{
System.IO.File.Move(file, newFile);
}
}
}
Además, se puede hacer recursivo para recoger estructura de directorios si es necesario. Esto le permitirá actualizar cualquier .dll en su proyecto; todo, de hecho, fuera del .exe principal. Luego, en otro lugar de la aplicación, puede tratar de obtener los archivos de su servidor (o de cualquier otro lugar) que deban actualizarse, colocarlos en la carpeta de actualizaciones y reiniciar la aplicación.
Gracias. Principalmente estaba dirigiendo la pregunta en auto-actualización (es decir, actualizando el EXE principal desde el EXE principal). – MusiGenesis
No puede actualizar el exe, aunque desde el propio exe, por lo que aún debe tener un proceso externo. –
Claro que puedes. Tiene su exe cambiar el nombre, poner en cola un comando "eliminar después de reiniciar" en la versión anterior y copiar en la nueva versión. La aplicación anterior puede ejecutar la nueva aplicación y salir inmediatamente después, posiblemente pasando algún tipo de/parámetro de actualización, por lo que la nueva aplicación sabe que las estructuras de datos almacenados potencialmente antiguos deben actualizarse. – Sander
Hace aproximadamente 3-4 años publiqué un ejemplo que se encuentra fuera de la aplicación, si se detecta una actualización, la aplicación llama a la actualización y se apaga, luego se realizan las actualizaciones y la aplicación se reinicia.
Publiqué el ejemplo en el antiguo sitio GotDotNet ... Tendré que intentar encontrarlo.
Funcionó perfectamente y tomó alrededor de 1-2 horas para escribir.
¿Cómo se actualiza el actualizador? – MusiGenesis
Tengo un método dentro de la aplicación, que si se encuentra una actualización para el actualizador aplicará esa actualización.Básicamente, cada uno actualiza el otro, suena complejo y difícil de administrar, pero en realidad es muy simple. Creo que como mínimo, todavía tengo el código en casa. –
¿Podría publicarlo? –
Indigo Rose tiene un producto llamado TrueUpdate que también lo hace por usted. Los he usado en el pasado desde aplicaciones administradas y no administradas. Básicamente es un archivo que coloca en su servidor (http, ftp, lo que quiera). Luego llamas a un EXE del lado del cliente para buscar actualizaciones. El archivo de actualizaciones se extrae y tiene lógica para detectar qué versión hay en el cliente (su elección, detección de DLL, lecturas de clave de registro, etc.). Luego encontrará el actualizador apropiado para él y descargará el archivo para su ejecución. Funciona bien a través de proxies también.
Lo único que no hacen es construir los parches para usted. Tienes que hacer eso manualmente, o con otro producto que tengan. Es una solución commcerial y funciona bastante bien si lo necesitas.
Se ve bien, gracias, pero no tiene soporte de Windows Mobile. Esta aplicación es un poco inusual, ya que se ejecuta tanto en Windows Mobile como en PC Windows. – MusiGenesis
En un proyecto hace mucho tiempo, usando .NET Compact Framework 1.0, escribí una aplicación de actualización automática. Usamos la función de implementación CAB de SqlCE para obtener los archivos en el dispositivo (ahora usaría Sync Framework), y teníamos un exe por separado que desempaquetaba el CAB y actualizaba los archivos.
Una actualización sería así: se le solicitará al usuario que actualice, haga clic en un botón y abandone la aplicación de la interfaz de usuario. El actualizador exe tomaría el control, obtendría el archivo cab del servidor, haría una copia de seguridad de los dlls actuales y descomprimiría el archivo cab con wceload. La IU luego se reiniciaría, y si fallara, la actualización se revertiría. Este sigue siendo un escenario interesante en dispositivos compactos, pero ahora hay mejores herramientas que simplemente sqlce.
Sin duda miraría el bloque de aplicación de actualización y el marco de sincronización para implementar esto si clickonce no es una opción.Pero supongo que todavía necesitarás un ejecutable por separado porque los dlls que deseas sobrescribir probablemente estén bloqueados por el archivo mientras lo usa un exe, como ya se dijo en una de las respuestas anteriores.
¿Cómo se consigue que el archivo updater ejecute después de que se cierra la interfaz de usuario? ¿Siempre se está ejecutando y sondeando para ver si se requiere una actualización? Intenté iniciar automáticamente el actualizador en otro proceso, pero aún no puedo sobrescribir el ejecutable EXE original. – MusiGenesis
No recuerdo exactamente, pero podrías hacer esto con un mecanismo manual o un mecanismo parecido a un semaforo. Como última acción, la interfaz de usuario saliente desencadena un evento en todo el sistema. Para cuando el actualizador descargó el CAB, lo desempaquetó e intentó sobrescribir el exe de la interfaz de usuario, hace tiempo que salió. – stombeur
Como punto de partida para rodar el suyo, probablemente valga la pena mirar Alex Feinman's article on MSDN titulado "Creación de aplicaciones de autoactualización con .NET Compact Framework".
Escribí mi propio autoupdater, el autoupdater usa un archivo de configuración común para la aplicación que contiene urls para descargar las últimas versiones de/verificar si necesita actualizarse.
De esta manera ejecuta el actualizador, que actualiza la aplicación o no, luego ejecuta la aplicación, que como parte del funcionamiento normal, busca un actualizador actualizado y lo parche.
Tenemos un producto que es comercial/fuente abierta: wyBuild & wyUpdate. Tiene la capacidad de parcheo y es muy fácil de usar.
Editar: Estoy recibiendo votos en los números negativos, pero mi publicación no fue simplemente venta flagrante. Nuestro actualizador, wyUpdate, es de código abierto, está escrito en C# y está licenciado bajo la licencia BSD.
Pensé que podría ayudar a cualquiera que intente crear un actualizador desde cero utilizando .NET Framework.
Pero, vótame si es necesario.
¿De qué manera esto es de alguna manera útil para una implementación de Compact Framework? – ctacke
Nuestro actualizador de código abierto puede ser muy útil al desarrollar su propio actualizador. Está escrito en C# y está licenciado bajo la licencia BSD. Pero vota por mí si es necesario. –
- 1. Eliminar ClickOnce de una aplicación de WinForms
- 2. ¿Cuál es la mejor forma de almacenar la configuración del usuario para una aplicación .NET?
- 3. ¿La mejor forma de renderizar HTML en la aplicación WinForms?
- 4. Cuál es el mejor mecanismo para almacenar la configuración de autenticación en una aplicación de WinForms
- 5. Plantilla gráficamente una aplicación .NET winforms
- 6. ¿Cuál es la mejor manera para que una aplicación WinForms determine exactamente en qué sistema operativo Windows se está ejecutando?
- 7. ¿Cuál es la mejor forma de generar e imprimir facturas en una aplicación .NET?
- 8. ¿Cuál es la mejor forma de usar NLog con MEF?
- 9. ¿Cuál es la forma más fácil de actualizar una aplicación grande de C# winforms a WPF
- 10. ¿Cómo actualizar automáticamente una aplicación sin ClickOnce?
- 11. ¿Cuál es el entorno corporativo más hostil para implementar una aplicación .NET WinForms?
- 12. Ejecutando una aplicación ClickOnce desde otra aplicación ClickOnce
- 13. ¿Es Application.DoEvents() solo para WinForms?
- 14. ¿Cuál es la mejor forma de usar clases .NET desde Visual Basic 6?
- 15. ¿Cuál es la mejor forma de usar JavaDoc para documentar una enumeración de Java?
- 16. Guardar configuración en una aplicación .NET WinForms
- 17. ¿Cuál es la forma correcta de minimizar la bandeja de una aplicación C# WinForms?
- 18. Selectores de tiempo solo para .NET WinForms?
- 19. clickonce - ¿Cuál es una buena alternativa de código abierto para clickonce? (DDay.Update)?
- 20. ¿Cuál es la forma mejor diseñada que jamás haya visto?
- 21. ¿Cómo puedo hacer que una aplicación Java se actualice automáticamente?
- 22. Empaquetado de una aplicación .NET para que se ejecute en una computadora sin .NET
- 23. Instalar VSTO SIN usar Clickonce
- 24. ¿Cuál es la forma correcta de escribir una aplicación .NET que inicie sesión automáticamente en www.yahoo.com?
- 25. Cuál es la mejor aplicación de .dispose()
- 26. ¿Cuál es la mejor manera de evitar que una aplicación se copie y use sin el permiso del propietario?
- 27. ¿Una mejor forma de forzar que WPF ListBox con datos se actualice?
- 28. ¿Cuál es la mejor API de captura de imágenes .NET que puedo usar?
- 29. ¿Cuál es la mejor implementación para AOP en .Net?
- 30. Cómo hacer que la aplicación de Android se actualice automáticamente
¿Qué "razones técnicas" le impiden utilizar ClickOnce que serán restricciones en la respuesta que busque? – lotsoffreetime
La MEJOR razón técnica es que no hay instalaciones permitidas al GAC. Es una de mis principales quejas sobre ClickOnce – MagicKat
¿Eh? ¿Qué parte de ClickOnce se instala en el GAC? –