tag modificar metaetiqueta etiquetas encabezado ejemplos editar como codigos agregar wix windows-installer wix3.5 custom-action

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>