Qual è il modo migliore per un'applicazione di winforms .NET di aggiornarsi senza usare ClickOnce?

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

Domanda

Per motivi tecnici, non posso usare ClickOnce per aggiornare automaticamente la mia applicazione .NET e i suoi assembly. Qual è il modo migliore per gestire l'aggiornamento automatico in .NET?

È stato utile?

Soluzione

Penso che il Blocco applicazioni di aggiornamento era qualcosa di un precursore a ClickOnce. Potrebbe valere la pena indagare. Guardare il suo codice sorgente potrebbe essere sufficiente per scatenare alcune idee.

Altri suggerimenti

Abbiamo un prodotto commerciale / open source: wyBuild & amp; wyUpdate . Ha capacità di rattoppare ed è semplicissimo da usare.

Modifica: sto diventando votato verso il basso nei numeri negativi, ma il mio post non era solo palese vendita. Il nostro programma di aggiornamento, wyUpdate, è open source, scritto in C # ed è concesso in licenza con la licenza BSD.

Ho pensato che potesse aiutare chiunque cercasse di creare un programma di aggiornamento da zero utilizzando .NET Framework.

Ma votami se necessario.

Circa 3-4 anni fa ho pubblicato un esempio che si trova all'esterno dell'app, se viene rilevato un aggiornamento, l'app chiama il risponditore e si spegne, quindi gli aggiornamenti vengono eseguiti e l'app si riavvia.

Ho pubblicato l'esempio sul vecchio sito GotDotNet ... dovrò provare a trovarlo.

Ha funzionato perfettamente e ci sono volute circa 1-2 ore per scrivere.

Indigo Rose ha un prodotto chiamato TrueUpdate che lo fa anche per te. Li ho usati in passato sia da app gestite che non gestite. È fondamentalmente un file che metti sul tuo server (http, ftp, qualunque cosa tu voglia). Quindi si chiama un EXE lato client per verificare la presenza di aggiornamenti. Il file degli aggiornamenti viene estratto e presenta una logica per rilevare quale versione è presente sul client (scelta dell'utente, rilevamento DLL, letture chiave di registro, ecc.). Quindi troverà il programma di aggiornamento appropriato per esso e scaricherà il file per l'esecuzione. Funziona bene anche con i proxy.

L'unica cosa che non fanno è in realtà creare le patch per te. Devi farlo manualmente o con un altro prodotto che hanno. È una soluzione commerciale e funziona abbastanza bene se ne hai bisogno.

Come punto di partenza per il tuo rollio, probabilmente vale la pena guardare Alex L'articolo di Feinman su MSDN intitolato " Creazione di applicazioni con aggiornamento automatico con .NET Compact Framework " ;.

Scrivi il tuo.

Ho sentito che sono difficili da scrivere per la prima volta, ma dopo ciò diventa semplice.

Dato che non ne ho ancora scritto uno (sebbene sia nella mia lista), posso darti alcune delle cose a cui ho pensato. Mantenere versioni accurate della DLL, poiché questo è importante per l'autoaggiornamento. E assicurati che il programma di aggiornamento possa aggiornarsi.

Nel tuo file Program.cs fai qualcosa del genere:

    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);
            }
        }
    }

Inoltre, può essere reso ricorsivo per raccogliere la struttura della directory, se necessario. Ciò ti consentirà di aggiornare qualsiasi DLL nel tuo progetto; tutto, infatti, al di fuori del file .exe principale. Quindi da qualche altra parte della tua applicazione puoi occuparti di ottenere i file dal tuo server (o ovunque) che devono essere aggiornati, metterli quindi nella cartella update e riavviare l'applicazione.

Su un progetto molto tempo fa, usando .NET Compact Framework 1.0, ho scritto un'applicazione di aggiornamento automatico. Abbiamo usato la funzionalità di distribuzione CAB di SqlCE per ottenere i file sul dispositivo (si userebbe Sync Framework ora) e avevamo un exe separato che ha fatto il disimballaggio del CAB e l'aggiornamento dei file.

Un aggiornamento dovrebbe essere così: all'utente verrà richiesto di aggiornare, fare clic su un pulsante e uscire dall'interfaccia utente. L'exe di aggiornamento prenderà il controllo, otterrà il file cab dal server, eseguirà il backup delle dll correnti e decomprimerà il file cab con wceload. L'interfaccia utente verrebbe quindi riavviata e, in caso contrario, l'aggiornamento verrà eseguito il rollback. Questo è ancora uno scenario interessante su dispositivi compatti, ma ora ci sono strumenti migliori di solo sqlce.

Vorrei certamente esaminare il blocco dell'applicazione di aggiornamento e il framework di sincronizzazione per implementarlo se clickonce non è un'opzione. Ma suppongo che avrai ancora bisogno di un eseguibile separato perché le dll che vuoi sovrascrivere sono probabilmente file bloccati mentre sono in uso da un exe, come una delle risposte precedenti già dette.

Ho scritto il mio autoupdater, l'autoupdater utilizza un file di configurazione comune nell'applicazione che contiene gli URL per scaricare le ultime versioni da / verificare se deve essere aggiornato.

In questo modo si esegue il programma di aggiornamento, che aggiorna l'app o no, quindi esegue l'applicazione, che come parte del normale funzionamento, verifica la presenza di un programma di aggiornamento aggiornato e le corregge.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top