c# - publicar - forzar actualizacion clickonce
¿Cuál es la mejor forma de que una aplicación.NET winforms se actualice solo sin utilizar ClickOnce? (9)
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?
Creo que el Bloque de la aplicación Updater fue algo así como un precursor de ClickOnce. Puede valer la pena investigar. Ver su código fuente podría ser suficiente para generar algunas ideas.
Escribe lo tuyo.
He oído que son un tanto difíciles de escribir la primera vez, pero después de eso se vuelve simple.
Como todavía no he escrito ninguno (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.
En su archivo Program.cs, haga 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, puede ser recursivo para recoger la estructura del directorio 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.
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 de 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 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.
Ciertamente 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á un archivo ejecutable por separado porque los archivos que desea sobrescribir probablemente estén bloqueados mientras el administrador lo está utilizando, como ya se dijo en una de las respuestas anteriores.
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 las actualizaciones se realizan y la aplicación se reinicia.
Publiqué el ejemplo en el viejo sitio de GotDotNet ... Tendré que intentar encontrarlo.
Funcionó perfecto y tomó alrededor de 1-2 horas para escribir.
Indigo Rose tiene un producto llamado TrueUpdate que también hace esto por ti. 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 ti. Tienes que hacer eso manualmente, o con otro producto que tengan. Es una solución commcerial y funciona bastante bien si lo necesitas.
Como punto de partida para lanzar el suyo, probablemente valga la pena consultar el artículo de Alex Feinman sobre MSDN titulado "Creación de aplicaciones de auto-actualizació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 comercial / de código abierto: wyBuild & wyUpdate . Tiene la capacidad de parcheo y es muy fácil de usar.
Editar: me votaron por 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 votame si es necesario.