¿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?
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>
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.
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"];
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