¿Cómo pasar CustomActionData a una CustomAction usando WiX?


¿Cómo se establecen las propiedades en CustomActionData que se recuperarán mediante una acción personalizada diferida?

Author: Peter Mortensen, 2012-06-27

3 answers

Las acciones personalizadas diferidas no pueden acceder directamente a las propiedades del instalador ( referencia). De hecho, solo CustomActionData propiedad

session.CustomActionData

Y otros métodos y propiedades listados aquí están disponibles en el objeto session.

Por lo tanto, para que una acción personalizada diferida recupere una propiedad como la INSTALLLOCATION, debe usar una acción personalizada de tipo 51, es decir, una acción personalizada de propiedad de conjunto, para pasar esa información y consumirá los datos de la Código C# de CustomAction a través de session.CustomActionData. (ver referencia & referencia)

A continuación se muestra un ejemplo de una acción personalizada de tipo 51 (CustomAction1) que establecerá una propiedad que se puede recuperar en CustomAction2.

<CustomAction Id="CustomAction1"
              Property="CustomAction2"
              Value="SomeCustomActionDataKey=[INSTALLLOCATION]"
/>

Observe que Property el nombre del atributo es CustomAction2. Esto es importante. El valor del atributo Property de la acción type 51 debe ser igual/idéntico al nombre de la acción personalizada que está consumiendo CustomActionData. (véase referencia )

Observe la nombre SomeCustomActionDataKey en el par clave/valor del atributo Value? En su código C# en la acción personalizada consumidora (CustomAction2), buscará esa propiedad desde CustomActionData usando la siguiente expresión:

string somedata = session.CustomActionData["SomeCustomActionDataKey"];

La clave que se usa para recuperar el valor de CustomActionData NO es el valor en el atributo Property de la acción personalizada de tipo 51, sino la clave del par key=value en el atributo Value. (Importante: CustomActionData se rellena estableciendo una propiedad del instalador que tiene el mismo nombre que el Id de la acción personalizada consumidora, pero las claves CustomActionData NO son propiedades del instalador.) (véase referencia )

En nuestro escenario, la acción personalizada consumidora es una acción personalizada diferida definida de alguna manera como la siguiente:

<Binary Id="SomeIdForYourBinary" SourceFile="SomePathToYourDll" />
<CustomAction Id="CustomAction2"
              BinaryKey="SomeIdForYourBinary"
              DllEntry="YourCustomActionMethodName"
              Execute="deferred"
              Return="check"
              HideTarget="no"
/>

Configuración de InstallExecuteSequence

Por supuesto, la acción personalizada consumidora (CustomAction2) debe ejecutarse después de la acción personalizada de tipo 51 (CustomAction1). Así que tendrás que programarlos así:

<InstallExecuteSequence>
  <!--Schedule the execution of the custom actions in the install sequence.-->
  <Custom Action="CustomAction1" Before="CustomAction2" />
  <Custom Action="CustomAction2" After="[SomeInstallerAction]" />      
</InstallExecuteSequence>
 114
Author: Ayo I,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:28

Para nosotros C++ schlubs, recuperas la Propiedad de la siguiente manera:

MsiGetProperty(hInstall, "CustomActionData", buf, &buflen);

Luego analizas 'buf'. Gracias a Bondbhai.

 6
Author: Pierre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-29 15:19:41

Si el valor pasado a la acción personalizada no es un conjunto de clave/par...

Es decir,

<SetParameter Id="CustomAction1" Before="CustomAction1" Value="data" Sequence="execute"/>
<CustomAction Id="CustomAction1" BinaryKey="BinaryId" DllEntry="MethodName" Execute="deferred"/>

...entonces todo el blob puede ser recuperado usando:

string data = session["CustomActionData"];
 2
Author: Dave Andersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-18 06:30:15