2010-12-21 22 views
5

tengo algo como esto:la forma de ejecutar acción personalizada antes RemoveExistingProducts con After = "InstallValidate" en WiX

<InstallExecuteSequence> 
    <RemoveExistingProducts After="InstallValidate"/> 
</InstallExecuteSequence> 

Dado que uno de la desinstalación falla i necesidad de ejecutar una acción personalizada para resolver el problema antes de RemoveExistingProducts . Algo en las líneas de:

<CustomAction Id="FixStuff" .. /> 

<InstallExecuteSequence> 
    <Custom Action="FixStuff" Before="RemoveExistingProducts" /> 
    <RemoveExistingProducts After="InstallValidate"/> 
</InstallExecuteSequence> 

Esto, por supuesto, no funciona ya que Acción personalizada no puede ser anterior a InstallInitialize. Realmente me gustaría eliminar los productos existentes entre InstallValidate e InstallInitialize, pero me gustaría ejecutar FixStuff antes de eliminar los productos existentes.

¿Es posible hacerlo?

Respuesta

6

Desafortunadamente no se puede ejecutar una acción personalizada elevada antes de RemoveExistingProducts con su configuración actual.

Algunos enfoques posibles serían:

  1. RemoveExistingProducts mover hacia la derecha antes de InstallFinalize. Esto resuelve el problema de acción personalizada, pero pueden ocurrir otros problemas ya que este enfoque tiene muchas restricciones (los componentes necesitan mantener sus nombres y GUID entre versiones, sus acciones personalizadas deben saber que la actualización se realiza al final de la instalación, etc.).

  2. Crea un ejecutable EXE que corrige el instalador anterior antes de iniciar el nuevo MSI. Este bootrapper puede requerir privilegios de administrador a través de un manifiesto:

http://msdn.microsoft.com/en-us/library/bb756929.aspx

  1. reparación del MSI rota mediante el uso de este método:

    • soluciona el problema en el antiguo MSI
    • crea un bootstrapper BAT o EXE que lo vuelve a almacenar a través de este comando:

    msiexec/fv <path_to_msi>

    • distribuir este MSI como una actualización antes de que su nuevo paquete

Cuando su nuevo paquete se ejecuta RemoveExistingProducts, la antigua caché MSI debe ser fijo y debería desinstalarse correctamente

Cuestiones relacionadas