2011-02-11 14 views
13

Estaba buscando la lista de acciones y su secuencia al ejecutar una configuración de WiX. De alguna manera, el sitio web oficial no parece proporcionar ninguna información.Secuencia de acciones de WiX

El problema básico es que quiero programar mis acciones personalizadas correctamente. Normalmente necesito registrar una DLL con regsvr32.exe, y esto solo se puede hacer una vez que los archivos se copian en el disco duro. Sin embargo, la acción personalizada

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

falló con el mensaje de error "archivo no encontrado".

Lo que he hecho entonces es analizar el registro de mi MSI con WiX Edit, y he encontrado que la Acción InstallFiles existe más de una vez. Y efectivamente, los archivos se escriben solo la segunda vez que aparece. Así que he cambiado de acción personalizada a lo siguiente:

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

Aquí es la secuencia que he extraído de los registros de mi 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. 

¿Alguien sabe cotización oficial?

Respuesta

13

La respuesta corta: debe hacer que su acción personalizada sea aplazada y programar después de InstallFiles (si se basa en el archivo instalado, que creo que sí).

La respuesta larga: debe familiarizarse con el término de ejecución in-script. Read more about it on MSDN. Cuando ve los InstallFiles por primera vez en el archivo de registro, es cuando se ejecutan las acciones inmediatas y las acciones diferidas se escriben y se programan en el script de instalación. La segunda vez es cuando realmente se ejecuta (e instala archivos). Si difiere su acción, verá el mismo comportamiento en el archivo de registro.

Esto puede sonar no muy claro, pero no puede hasta que lea más sobre la forma en que está diseñado para funcionar.

+0

gracias! por el momento me atendré a la respuesta corta :) en realidad, la respuesta es bastante clara para mí. primero preparan las tareas, sin embargo, si lo hacen de inmediato, no esperarán hasta que comience el trabajo real. –

+1

¿Pero hay una lista oficial de la secuencia de acciones? De lo contrario, solo tenemos que probar y error, lo cual parece ridículo. – markmnl

5

Para registrar DLL, es mejor evitar el autoregistro.

Utilizamos el comando HEAT para generar un fragmento de WiX que hace el registro por nosotros.

Uso

heat file myfile.dll -o myfile.wxs 

La ventaja de esto es que las entradas del registro se instalan y se eliminan correctamente y no hay problemas con si el archivo ha sido instalado o no en el momento de hacer la inscripción.

+0

gracias por la entrada. No sabía que hay un script especial para registrar dlls. por el momento, mantendré la acción personalizada, pero tan pronto como el resto de mi instalador funcione bien, veré cómo funciona el comando de calefacción. –

+0

Estaba tratando de usar la utilidad de calor, pero no puedo pasar esa advertencia de HEAT5150. Supongo que como consecuencia de esta advertencia, el archivo wxs resultante no contiene ningún código útil, solo el 'Directorio' y el fragmento' Componente'. aquí está el mensaje de advertencia completo: 'heat.exe: advertencia HEAT5150: No se pudieron recopilar datos de un archivo que se esperaba que fuera una DLL SelfReg: (...) Excepción ha sido lanzada por el objetivo de una invocación. –

+1

Algunas cosas que encontré en la lista de correo de WiX: 1) Puede que no funcione con DLL de 64 bits. 2) Intente ejecutar Heat como Administrador 3) Intente ejecutar RegSpy como se menciona en esta página http://www.installsite.org/pages/en/msi/tips.htm, que creará un archivo .reg para que se convierta el calor. wxs. 4) Asegúrese de que no faltan dependencias – AntonyW

Cuestiones relacionadas