come ripristinare l'arresto di alimentazione mentre si aggiorna automaticamente la mia applicazione

2

Ho un'applicazione desktop Windows compilata in C # che si aggiorna automaticamente quando è disponibile un aggiornamento. Utilizza un pacchetto di installazione MSI per questo.

A volte durante l'aggiornamento dell'app, può verificarsi un arresto del PC a causa di un'interruzione dell'alimentazione e quando il sistema si riavvia la mia applicazione viene danneggiata. L'unica opzione rimasta è quella di ripararlo manualmente. C'è qualcosa che si può fare per ripristinarlo automaticamente?

Il processo di aggiornamento è avviato da un altro exe incluso nel pacchetto e che ha i diritti amministrativi richiesti, usando un codice come questo:

Process process = new Process();
process.StartInfo.FileName = "msiexec.exe";
process.StartInfo.Arguments = string.Format(" /qb /i \"{0}\" 
                    ALLUSERS=1 REINSTALLMODE=aums", sMSIPath);
process.Start();
process.WaitForExit();
    
posta tabby 23.03.2018 - 07:46
fonte

2 risposte

4

Non puoi. Il modo in cui tali cose vengono gestite all'avvio del programma è questo:

  1. Se non esiste aggiornamento.file
    • Esegui il backup dei file importanti nella sottocartella temporanea
    • Crea file di aggiornamento
    • Continua normalmente con l'aggiornamento
    • Elimina sottocartella temporanea
    • Elimina aggiornamento.file
    • Avvia normalmente il programma aggiornato
  2. Se esiste aggiornamento.file
    • Ripristina l'applicazione dalla sottocartella temporanea
    • Invia rapporto errori
    • Avvia normalmente il programma (o se sei davvero in grassetto, prova ad aggiornare di nuovo)

Il punto è che durante l'aggiornamento, se non dovesse finire correttamente, devi ripristinare il programma a ciò che era prima dell'aggiornamento. Comprensibilmente, non puoi aspettarti che il tuo programma lo faccia, poiché viene aggiornato. Devi usare un secondo programma che fa esattamente questo (e lo fa bene).

Modifica: dopo l'aggiornamento sembrerebbe suggerire che il problema sta nel fatto che si sta utilizzando la stessa applicazione per eseguire l'aggiornamento. L'eseguibile stesso deve essere aggiornato e non è possibile garantire il ripristino della versione precedente se il file stesso è in uso. È necessario creare un programma dedicato all'aggiornamento del programma e solo quello. Idealmente, il programma sarebbe flessibile e semplice nella progettazione, quindi non è necessario aggiornare l'aggiornamento.

    
risposta data 23.03.2018 - 08:24
fonte
2

Il database del programma di installazione di Windows contiene in realtà una serie di funzioni transazionali integrate che possono rendere questo molto carino gestito automaticamente.

Tuttavia, ciò che vorrete fare è eseguire msiexec.exe non come processo secondario e quindi uscire dal vostro processo mentre è in esecuzione. Lascia che l'installatore abbia un ultimo passaggio per "lanciare l'app", quindi al termine riaprirà la nuova applicazione e sarà quindi abbastanza semplice.

Se la tua app viene aggiornata e aperta e si verifica un riavvio, i rollback delle transazioni potrebbero avere un problema minore con i file in uno stato divertente perché erano in uso quando MSI ha tentato di eseguire l'aggiornamento. Se il tuo MSI è ben costruito, mentre viene installato, un riavvio (anche non eseguito) comporterà un rollback completo o una continuazione della transazione che inizia quando il riavvio è completato.

Sospetto che tu non abbia la tua configurazione msi per eseguire correttamente gli aggiornamenti dei file nella modalità posticipata

Per wikipedia (enfasi mia)

[...] Deferred mode. In this phase, the script built in immediate mode is executed in the context of the privileged Windows Installer service. The script must be executed by a privileged account because of the heterogeneity of the scenarios in which a setup operation is initiated. For example, elevated privileges are necessary to serve on-demand installation requests from non-privileged users. (To run with elevated privileges, however, the package must be deployed by a local administrator or advertised by a system administrator using Group Policy.)

Rollback

All installation operations are transactional.[7] In other words, for each operation that Windows Installer performs, it generates an equivalent undo operation that would revert the change made to the system. In case any script action fails during deferred execution, or the operation is cancelled by the user, all the actions performed until that point are rolled back, restoring the system to its original state. Standard Windows Installer actions automatically write information into a rollback script; package authors who create custom actions that change the target system should also create corresponding rollback actions (as well as uninstall actions and uninstallation-rollback actions). As a design feature, if applied correctly this mechanism will also roll back a failed uninstall of an application to a good working state. [...]

    
risposta data 23.03.2018 - 18:15
fonte

Leggi altre domande sui tag