2009-11-13 14 views
6

Durante la creazione del programma di installazione WiX ho riscontrato un problema durante il tentativo di chiudere un'applicazione prima di installare l'aggiornamento. Di seguito è riportato un esempio di come sto tentando di farlo.Chiusura di un'applicazione tramite WiX

<util:CloseApplication Id="CloseServe" CloseMessage="yes" Target="server.exe" ElevatedCloseMessage="yes" RebootPrompt="no"/> 
<InstallExecuteSequence>  
    <Custom Action="WixCloseApplications" After="RemoveExistingProducts" /> 
    <RemoveExistingProducts After="InstallInitialize"/> 
    <Custom Action='LaunchApplication' After='InstallFinalize'/> 
    <!--<Custom Action='StopServer' Before='RemoveExistingProducts'/>--> 
</InstallExecuteSequence> 

Utilizzando questo esempio l'applicazione fa finire chiusura ma l'installazione viene bloccato in quel punto e poi esegue un ripristino. Questo potrebbe essere dovuto al fatto che l'exe viene rimosso prima di provare a chiuderlo? Ho provato a cambiare la sequenza in modo che RemoveExistingProducts venga eseguita dopo WixCloseApplications ma poi mi restituisce un codice di errore 2613.

+2

Sarebbe bello se si spiegasse quale fosse l'errore alla fine - la risposta accettata suggerisce solo di generare un registro dell'installazione ... –

+0

È stato così lungo che onestamente non ricordo il problema completo. La registrazione mi ha aiutato a rintracciare però. Si trattava di un problema di sequenza in cui non era possibile chiudere il programma in questo modo prima di rimuovere i prodotti esistenti ma non è possibile rimuovere i prodotti esistenti se era in esecuzione. Un bootstrapper mi ha aiutato con questo problema. –

risposta

7

Si può provare a registrare l'installazione e vedere cosa è possibile rintracciare da lì. Provare a eseguire il programma di installazione dalla console di comando in questo modo:

msiexec.exe /i [msi filename] /log [filepath\logfilename.log] 
0

Parto dal presupposto che è necessario chiudere l'applicazione in esecuzione il più presto possibile nel InstallExecuteSequence, e certamente prima InstallInitialize che avvia il Windows Installer transazione che apporta modifiche al sistema.

Inoltre è necessario eseguire la stessa ApplicationClose operazione nel InstallUISequence pure in modo l'applicazione viene chiusa, mentre si scorrere i menu di installazione in modo interattivo. L'intero InstallUISequence viene saltato quando si installa in modo silenzioso, quindi è necessario anche in InstallExecuteSequence.

essere consapevoli che si può accidentalmente innescare rollback in un'azione personalizzata restituendo un codice di codice di uscita/errore che msiexec.exe interpreta come un errore. Se il completamento dell'azione personalizzata non è cruciale, spengo il controllo degli errori per consentire il proseguimento dell'installazione. In questo caso, sarebbe solo necessario un riavvio.

Se ciò che si sta tentando di chiudere o arrestare è un servizio, MSI ha caratteristiche per affrontare questo attraverso gli elementi ServiceControl e ServiceInstall (and others) built-in.