modificar - ¿Cómo pasar CustomActionData a CustomAction usando WiX?
metaetiqueta wix (3)
Para nosotros C ++ schlubs, recuperamos la Propiedad de la siguiente manera:
MsiGetProperty(hInstall, "CustomActionData", buf, &buflen);
Luego analizas ''buf''. Gracias a Bondbhai .
¿Cómo se recuperan las propiedades establecidas en CustomActionData mediante una acción personalizada diferida?
Si el valor pasado a la acción personalizada no es una clave / par establecido ...
es decir
<SetParameter Id="CustomAction1" Before="CustomAction1" Value="data" Sequence="execute"/>
<CustomAction Id="CustomAction1" BinaryKey="BinaryId" DllEntry="MethodName" Execute="deferred"/>
... entonces todo el blob se puede recuperar usando:
string data = session["CustomActionData"];
Las acciones personalizadas diferidas no pueden acceder directamente a las propiedades del instalador ( reference ). De hecho, solo la propiedad CustomActionData
session.CustomActionData
y otros métodos y propiedades enumerados here están disponibles en el objeto de sesión.
Por lo tanto, para una acción personalizada diferida para recuperar una propiedad como INSTALLLOCATION
, debe usar una acción personalizada tipo 51, es decir, una acción personalizada de conjunto de propiedades, para pasar esa información y consumirá los datos del C # de CustomAction. código a través de session.CustomActionData
. (ver reference y here )
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 el nombre del atributo de Property
es CustomAction2
. Esto es importante. El valor del atributo de propiedad de la acción tipo 51 debe ser igual / idéntico al nombre de la acción personalizada que consume CustomActionData
. (ver reference )
Observe el nombre SomeCustomActionDataKey
en el par de clave / valor del atributo Value
? En su código C # en la acción personalizada que consume ( CustomAction2
), buscará esa propiedad desde CustomActionData
usando la siguiente expresión:
string somedata = session.CustomActionData["SomeCustomActionDataKey"];
La clave que utiliza para recuperar el valor de CustomActionData
NO es el valor en el atributo de Property
de la acción personalizada tipo 51, sino la clave del par key=value
en el atributo de Value
. ( Importante: CustomActionData
se completa configurando una propiedad de instalador que tiene el mismo nombre que el Id de la acción personalizada consumidora, pero CustomActionData
claves CustomActionData
NO son propiedades del instalador ) . (Ver reference )
En nuestro escenario, la acción personalizada consumidora es una acción personalizada diferida definida de forma similar a 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 que consume ( CustomAction2
) debe ejecutarse después de la acción personalizada de tipo 51 ( CustomAction1
). Entonces deberás 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>