2011-02-11 16 views
13

Stavo cercando un elenco di azioni e la loro sequenza durante l'esecuzione di una configurazione WiX. In qualche modo il sito ufficiale non sembra fornire alcuna informazione.Sequenza azione WiX

Il problema di base è che voglio pianificare correttamente le mie azioni personalizzate. In genere ho bisogno di registrare una DLL con regsvr32.exe, e questo può essere fatto solo una volta che i file vengono copiati sul disco rigido. Tuttavia l'azione personalizzata

<Custom Action="RegisterShellExt" After="InstallFiles"> 

non riuscita con il messaggio di errore "file non trovato".

Quello che ho fatto è analizzare il log del mio MSI con WiX Edit, e ho scoperto che l'Action InstallFiles esiste più di una volta. E in effetti i file vengono scritti solo la seconda volta che viene visualizzato. Così ho cambiato la mia azione personalizzata per i seguenti:

<Custom Action="RegisterShellExt" Before="InstallFinalize"> 

Ecco la sequenza che ho estratto dai registri del mio MSI:

Action start 15:16:49: INSTALL. 
Action start 15:16:49: PrepareDlg. 
Action start 15:16:49: AppSearch. 
Action start 15:16:49: LaunchConditions. 
Action start 15:16:49: ValidateProductID. 
Action start 15:16:49: DIRCA_NEWRETARGETABLEPROPERTY1.5D429292039C46FCA3253E37B4DA262A. 
Action start 15:16:50: CostInitialize. 
Action start 15:16:50: FileCost. 
Action start 15:16:50: CostFinalize. 
Action start 15:16:50: WelcomeDlg. 
Action 15:16:51: LicenseAgreementDlg. Dialog created 
Action 15:16:53: CustomizeDlg. Dialog created 
Action 15:16:55: VerifyReadyDlg. Dialog created 
Action start 15:16:56: ProgressDlg. 
Action start 15:16:56: ExecuteAction. 
Action start 15:16:58: INSTALL. 
Action start 15:16:58: AppSearch. 
Action start 15:16:58: LaunchConditions. 
Action start 15:16:58: ValidateProductID. 
Action start 15:16:58: CostInitialize. 
Action start 15:16:59: FileCost. 
Action start 15:16:59: CostFinalize. 
Action start 15:16:59: InstallValidate. 
Action start 15:17:00: InstallInitialize. 
Action start 15:17:08: ProcessComponents. 
Action 15:17:09: GenerateScript. Generating script operations for action: 
Action ended 15:17:09: ProcessComponents. Return value 1. 
Action start 15:17:09: UnpublishFeatures. 
Action start 15:17:09: RemoveShortcuts. 
Action start 15:17:09: RemoveFiles. 
Action start 15:17:09: InstallFiles. 
Action start 15:17:10: CreateShortcuts. 
Action start 15:17:10: RegisterUser. 
Action start 15:17:10: RegisterProduct. 
Action start 15:17:10: PublishFeatures. 
Action start 15:17:10: PublishProduct. 
Action start 15:17:10: ConfigureInstaller. 
Action start 15:17:10: InstallFinalize. 
Action 15:17:10: ProcessComponents. Updating component registration 
Action 15:17:12: InstallFiles. Copying new files 
Action 15:17:21: CreateShortcuts. Creating shortcuts 
Action 15:17:21: RegisterProduct. Registering product 
Action 15:17:23: ConfigureInstaller. [[note: CustomAction]] 
Action 15:17:22: PublishFeatures. Publishing Product Features 
Begin CustomAction 'ConfigureInstaller' 
Action 15:17:28: RollbackCleanup. Removing backup files 
Action ended 15:17:28: InstallFinalize. Return value 1. 
Action start 15:17:28: RegisterShellExt. [[note: CustomAction]] 
Action ended 15:17:33: INSTALL. Return value 1. 
Action start 15:17:35: ExitDialog. 

Qualcuno sa un listino ufficiale?

risposta

13

La risposta breve: è necessario rendere l'azione personalizzata differita e pianificare dopo InstallFiles (se si basa sul file installato, cosa che penso che faccia).

La lunga risposta: è necessario familiarizzarsi con il termine di esecuzione in-script. Read more about it on MSDN. Quando vedi InstallFiles per la prima volta nel file di log, è quando vengono eseguite azioni immediate e le azioni posticipate vengono scritte e pianificate nello script di installazione. La seconda volta è quando esegue (e installa i file) effettivamente. Se la tua azione viene rinviata, vedrai lo stesso comportamento nel file di registro.

Questo potrebbe sembrare non molto chiaro, ma non può fino a quando non si legge di più sul modo in cui è progettato per funzionare.

+0

grazie! per il momento resterò fedele alla risposta breve :) in realtà, la risposta è abbastanza chiara per me. per prima cosa preparano i compiti, tuttavia se lo rendi immediato, non aspetterà che inizi il vero lavoro. –

+1

Ma c'è un elenco ufficiale della sequenza di azioni? Altrimenti dobbiamo solo provare ed errori che sembrano ridicoli ?! – markmnl

5

Per la registrazione di DLL, è consigliabile evitare l'auto registrazione.

Usiamo il comando HEAT per generare un frammento WiX che esegue la registrazione per noi.

Usa

heat file myfile.dll -o myfile.wxs 

Il vantaggio di questo è che le voci di registro vengono installati e rimossi in modo corretto e non ci sono problemi con se il file è stato installato o meno al momento della registrazione viene effettuata.

+0

grazie per l'input. Non sapevo che esistesse uno script speciale per registrare le DLL. per il momento manterrò l'azione personalizzata, ma non appena il resto del mio installer funziona correttamente vedrò come far funzionare il comando di riscaldamento. –

+0

Stavo cercando di utilizzare l'utilità di riscaldamento, ma non riesco a superare l'avviso HEAT5150. Suppongo che, come conseguenza di questo avviso, il file wxs risultante non contenga alcun codice utile, solo 'Directory' e il frammento' Component'. ecco il messaggio di avviso completo: 'heat.exe: avviso HEAT5150: Impossibile raccogliere i dati da un file che ci si aspettava fosse una DLL SelfReg: (...) L'eccezione è stata lanciata dall'obiettivo di un'invocazione. –

+1

Alcune cose che ho trovato sulla mailing list WiX: 1) Potrebbe non funzionare con DLL a 64 bit. 2) Prova a far funzionare Heat come Amministratore 3) Prova a eseguire RegSpy come indicato in questa pagina http://www.installsite.org/pages/en/msi/tips.htm, che creerà un file .reg per la conversione del calore in. WXS. 4) Assicurati che non ci siano dipendenze mancanti – AntonyW