2012-06-27 22 views

Respuesta

110

Las acciones personalizadas diferidas no pueden acceder directamente a las propiedades del instalador (reference). De hecho, sólo CustomActionData propiedad

session.CustomActionData 

y otros métodos y propiedades listadas 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 desde el código C# de CustomAction hasta session.CustomActionData. (Ver reference & reference)

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

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

en cuenta que Property nombre del atributo 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 está consumiendo CustomActionData. (ver reference)

Aviso el nombre SomeCustomActionDataKey en el Value par atributo clave/valor? En su código C# en la acción personalizada que consume (CustomAction2), usted se verá en marcha dicha propiedad de CustomActionData utilizando la siguiente expresión:

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

La clave que se utiliza para recuperar el valor de CustomActionData NO es el valor en el atributo Property de la acción personalizada tipo 51, pero la clave del par key=value en el atributo Value. (llevar Importante:. CustomActionData se rellena mediante el establecimiento de una propiedad instalador que tiene el mismo nombre que el ID de la acción personalizada que consume, pero CustomActionData claves no se instalador propiedades) (ver reference)

En nuestro escenario, el consumo de acción personalizada es una acción personalizada diferida se define algo como el siguiente:

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

Configuración del InstallExecuteSequence

Por supuesto, el consumir acción personalizada (CustomAction2) debe ejecutarse después de la acción personalizada tipo 51 (CustomAction1). Por lo que usted tiene que programar como esto:

<InstallExecuteSequence> 
    <!--Schedule the execution of the custom actions in the install sequence.--> 
    <Custom Action="CustomAction1" Before="CustomAction2" /> 
    <Custom Action="CustomAction2" After="[SomeInstallerAction]" />  
</InstallExecuteSequence> 
+5

Alexey, gracias por tomarse el tiempo para escribir esto. Esto ha sido una gran ayuda para mí. Lamentablemente, solo puedo darte +1 ... –

+0

Como dijo @TimLong, muchas gracias. Ojalá pudiera +1 esto muchas, muchas veces. –

+0

No lo entendí hasta que realmente lo ejecuté. Entonces vi la lógica. Forma de poca información buena legible sobre este tema. ¡Gracias! – Wolf5

6

Para nosotros schlubs C++, se recupera la propiedad como sigue:

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

A continuación, analizar sintácticamente 'buf'. Gracias a Bondbhai.

2

Si el valor pasado a la acción personalizada no es un juego de llaves/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 se pueden recuperar usando:

string data = session["CustomActionData"]; 
Cuestiones relacionadas