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>