2009-04-02 10 views
6

Sto utilizzando Windows Installer XML 3.0 (WIX3) per installare alcuni software.Richiedi all'utente di chiudere l'applicazione durante la disinstallazione (in WiX)

Tutto funziona bene, però, sto avendo un momento davvero difficile per gestire il seguente caso d'uso: il software installato è ancora in esecuzione , quando l'utente tenta di disinstallazione esso. Il comportamento predefinito sembra rimuovere tutti i file ma consente l'esecuzione dell'applicazione (che è difficile da vedere nel mio caso, perché è presente nella barra delle applicazioni).

ho aggiunto il seguente codice nel mio file installer.wxs:

<InstallExecuteSequence> 
    <Custom Action="WixCloseApplications" Before="RemoveFiles" /> 
</InstallExecuteSequence> 

<util:CloseApplication Id="CloseFoobar" 
         CloseMessage="no" 
         Description="FooBar is still running!" 
         ElevatedCloseMessage="no" 
         RebootPrompt="no" 
         Target="foobar.exe" /> 

Ma questo non funziona - peggio ancora, mostra una finestra di dialogo che chiede un riavvio durante l'installazione !

Quale sarebbe il modo corretto per farlo?

risposta

7

Per quanto mi ricordo che dovrebbe essere sufficiente per aggiungere i seguenti riferimenti per l'interfaccia utente:

<DialogRef Id="FilesInUse" /> 
<DialogRef Id="MsiRMFilesInUse" /> 

La roba CloseApplication è solo per le applicazioni di chiusura durante l'installazione, ma è buggy (almeno quando ho provato alcuni mesi fa, forse è stato riparato ora?)

Sfortunatamente, questo è ancora un esempio per la documentazione molto scarsa di WiX, nemmeno gli scenari di installazione/disinstallazione standard come questo sono documentati.

+0

Grazie per la risposta! L'ho provato in questo modo, ma non ha funzionato per me. Secondo MSDN, entrambe le finestre di dialogo vengono visualizzate solo durante l'installazione e non vengono valutate durante la disinstallazione! – beef2k

+0

Sì, CloseApps probabilmente ha bisogno di un po 'di rinforzo per gestire tutti questi casi. Non gestisce ancora tutti gli scenari. –

+1

@RobMensching È CloseApplication migliore ora? – tofutim

1

C'è stata una domanda simile sulla mailing list di wix-user un paio di giorni fa. La risposta fornita era:

Questo è il modo in cui Windows funziona pre-Vista e Restart Manager. Lì deve essere una finestra di livello superiore disponibile. Un'app nel vassoio non conta .

Ci sono alcuni thread sull'argomento nello wix-users archive pure.

0

È possibile controllare i registri di disinstallazione (here is how to enable them), per quanto si ricordi, Windows Installer inserirà i file in uno stato di eliminazione in sospeso e richiederà il riavvio alla fine.
Inoltre puoi scrivere una semplice azione personalizzata che ucciderà il tuo processo.

0

per un esempio come utilizzare closeapplication, segui questo link: wix github project, unit tests

per mostrare una finestra pronta è possibile utilizzare: <util:CloseApplication Id="CloseIE" Target="iexplore.exe" PromptToContinue="yes" Description="Test" />

0

risposta di Shay è corretta. Le versioni recenti di Windows Installer si comportano in questo modo. Windows Installer risolve molti problemi per evitare di riavviarsi al momento della disinstallazione re-mappando le Dll in uso ecc. In generale, un'app in esecuzione può continuare a essere eseguita dopo la disinstallazione e si verificherà una ripulitura quando l'app si spegne, il resto dopo il prossimo riavvio. Il punto è che se Windows Installer è in grado di spostare i binari in uso in un'altra posizione, mantenere le app in esecuzione e sostituire quelle in uso (ma il backup della memoria è stato rimappato) e tutto ciò che è necessario è eliminare un po 'di spazzatura non essenziale al successivo riavvio, allora perché forzare un riavvio?Non è necessario mostrare una finestra di dialogo dei file in uso, in modo che la situazione non si presenti.

Questo può causare problemi se l'applicazione tenta di accedere a un file che è stato disinstallato, ma presumo che il rischio è visto come basso. Se l'app ha bisogno di sapere che è in corso una disinstallazione, allora l'integrazione con Restart Manager dovrebbe funzionare - Windows dirà che è in corso una disinstallazione. Altrimenti, Shay ha ragione. Scrivi un'azione di disinstallazione personalizzata, se necessario, per dire all'app di chiuderla.

0

Ho anche affrontato questo problema. La modifica dell'attributo Before a "InstallValidate" ha funzionato per me.

<Custom Before="InstallValidate" Action="WixCloseApplications"/>