¿Cuál es la mejor manera para que una aplicación .NET winforms se actualice sin usar ClickOnce?

StackOverflow https://stackoverflow.com/questions/150994

Pregunta

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?

¿Fue útil?

Solución

Creo que el Updater Application Block fue algo así como un precursor Hacer clic una vez. Puede valer la pena investigar. Mirar su código fuente podría ser suficiente para generar algunas ideas.

Otros consejos

Tenemos un producto comercial / de código abierto: wyBuild & amp; wyUpdate . Tiene la capacidad de parchear y es muy fácil de usar.

Editar: Me votan a favor de los números negativos, pero mi publicación no fue solo una venta descarada. Nuestro actualizador, wyUpdate, es de código abierto, está escrito en C # y tiene licencia bajo la licencia BSD.

Pensé que podría ayudar a cualquiera que intente construir un actualizador desde cero usando .NET Framework.

Pero, vótame si es necesario.

Hace unos 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 al actualizador 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.

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 llama 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 está en el cliente (su elección, detección de DLL, lecturas de clave de registro, etc.). Luego encontrará el actualizador adecuado y descargará el archivo para su ejecución. Funciona bien a través de servidores proxy también.

Lo único que no hacen es construir los parches para usted. Tienes que hacerlo manualmente o con otro producto que tengan. Es una solución comercial y funciona bastante bien si la necesita.

Como punto de partida para rodar el suyo, probablemente valga la pena mirar Alex El artículo de Feinman sobre MSDN titulado "Creación de aplicaciones de actualización automática con .NET Compact Framework".

Escribe el tuyo.

He escuchado que son algo difíciles de escribir la primera vez, pero después de eso se vuelve simple.

Como todavía no he escrito uno (aunque está en mi lista), puedo darte 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 a sí mismo.

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 hacerse recursivo recoger la estructura del directorio si es necesario. Esto le permitirá actualizar cualquier archivo .dll en su proyecto; todo, de hecho, fuera del .exe principal. Luego, en otro lugar dentro de su aplicación, puede tratar de obtener los archivos de su servidor (o donde sea) que necesiten actualizarse, colocarlos en la carpeta UpdateFolder 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. Utilizamos la función de implementación CAB de SqlCE para obtener los archivos en el dispositivo (usaría Sync Framework ahora), y teníamos un exe separado que desempacaba el CAB y actualizaba los archivos.

Una actualización sería así: se le solicitaría al usuario que actualice, haga clic en un botón y salga de la aplicación de IU. El actualizador se haría cargo, obtendría el archivo cab del servidor, haría una copia de seguridad de los archivos dlls actuales y descomprimiría el archivo cab con wceload. La interfaz de usuario se reiniciaría y, si fallaba, la actualización se revertiría. Este sigue siendo un escenario interesante en dispositivos compactos, pero ahora hay mejores herramientas que solo 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 aún necesitará un ejecutable separado porque los archivos dlls que desea sobrescribir probablemente estén bloqueados por archivos mientras los usa un exe, como ya dijo una de las respuestas anteriores.

Escribí mi propio autoupdater, el autoupdater usa un archivo de configuración común para la aplicación que contiene direcciones URL para descargar las últimas versiones / verificar si necesita actualizarse.

De esta forma, ejecuta el actualizador, que actualiza la aplicación o no, luego ejecuta la aplicación, que como parte de la operación normal, busca un actualizador actualizado y lo parchea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top