wix custom-action

Usar una acción personalizada de WiX para establecer el valor de una propiedad



custom-action (3)

Estoy modificando un instalador de WiX existente para gestionar la actualización de una instalación existente de uno de nuestros productos. Hay varios valores cuyos valores predeterminados se especifican en propiedades. Estas propiedades se muestran al usuario para su edición y el instalador existente las escribe en un archivo de configuración personalizado.

Mi código debe ser lo suficientemente inteligente como para detectar si está haciendo una nueva instalación en comparación con la instalación de una versión anterior. Si está haciendo una instalación completamente nueva, necesita establecer las propiedades a los valores predeterminados. Pero si está haciendo una actualización, el código necesita recuperar el valor de esas propiedades del archivo de configuración existente y mostrarlas al usuario.

Por la lectura que he hecho, me parece que necesito usar una acción personalizada tipo 51 para establecer las propiedades. Pero, ¿cómo implemento esta acción personalizada?

Estoy pensando que primero tengo que definir la acción personalizada para ponerla en la tabla de acciones personalizadas, y luego tengo que colocar una etiqueta en algún lugar para llamarla. Y luego necesito definirlo.

¿Cómo puedo hacer esto? ¿Qué sería un código de ejemplo?


Después de investigar un poco más sobre acciones personalizadas, creo que tengo todo esto resuelto. Agregué una etiqueta <Binary> al archivo .wxs para identificar dónde reside la acción personalizada. Luego hice referencia al ID de la etiqueta binaria en CustomAction. Finalmente, agregué una etiqueta personalizada a la sección InstallExecuteSequence que hacía referencia a la etiqueta CustomAction por ID.

La etiqueta personalizada final mencionada anteriormente debe ir a la sección InstallUISequence, no a la sección InstallExecuteSequence, ya que es necesario llamar a la acción personalizada antes de que aparezca el cuadro de diálogo.

En cuanto a la implementación de la acción personalizada en sí, agregué un nuevo proyecto de biblioteca de acción personalizada de C # a la solución. Allí, implementé un método, decorado con el atributo [CustomAction]. Este método usa los valores de las propiedades almacenadas en el objeto Session pasado como un parámetro para el método y determina la ruta del archivo ejecutable de la versión actual. A continuación, realiza el trabajo necesario para ubicar los valores en el archivo de configuración del programa que deben conservarse en todas las versiones y los escribe en otras propiedades para el script de actualización.


Ejemplo:

[CustomAction] public static ActionResult SetProperty(Session session) { try { session.Log("Begin SetProperty action"); session["PROPERTY_NAME"] = "value" } catch (Exception exception) { session.Log("ERROR in custom action SetProperty {0}", exception.ToString()); return ActionResult.Failure; } return ActionResult.Success; }