2012-06-27 15 views

risposta

110

Le azioni personalizzate differite non possono accedere direttamente alle proprietà dell'installatore (reference). Infatti, solo CustomActionData proprietà

session.CustomActionData 

e altri metodi e proprietà elencate here sono disponibili per l'oggetto della sessione.

Pertanto, per un'azione personalizzata differita per recuperare una proprietà come la INSTALLLOCATION, è necessario utilizzare un tipo di azione personalizzata 51 - vale a dire un'azione personalizzata set-proprietà - di trasmettere queste informazioni insieme e ti consumano i dati dal codice C# di CustomAction tramite session.CustomActionData. (Vedi reference & reference)

seguito è un esempio di un'azione personalizzata tipo 51 (CustomAction1) che fisserà una proprietà che può essere recuperato, CustomAction2.

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

noti che Property nome dell'attributo è CustomAction2. Questo è importante. Il valore dell'attributo Property dell'azione di tipo 51 deve essere uguale/identico al nome dell'azione personalizzata che sta consumando CustomActionData. (vedi reference)

Avviso il nome SomeCustomActionDataKey nel Value attribuiscono coppia di chiave/valore? Nel vostro codice C# in azione personalizzata che consumano (CustomAction2), ti aspetto-up che la proprietà da CustomActionData utilizzando la seguente espressione:

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

La chiave che si utilizza per recuperare il valore dal CustomActionData non è il valore nell'attributo Property dell'azione personalizzata di tipo 51, ma la chiave della coppia key=value nell'attributo Value. (Importante asporto:. CustomActionData è popolato impostando una proprietà di installazione che ha lo stesso nome del Id dell'azione personalizzata che consumano, ma CustomActionData chiavi non sono installatore proprietà) (vedi reference)

Nel nostro scenario del consumo azione personalizzata è un'azione personalizzata differita definita un po 'come il qui sotto:

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

Configurazione del InstallExecuteSequence

Naturalmente, il il consumo di azioni personalizzate (CustomAction2) deve essere eseguito dopo l'azione personalizzata di tipo 51 (CustomAction1). Quindi dovrete programmare loro in questo modo:

<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, grazie per aver trovato il tempo per scrivere questo. Questo è stato di grande aiuto per me. Purtroppo posso solo darti +1 ... –

+0

Come ha detto @TimLong, un enorme grazie. Vorrei poterlo fare +1, molte, molte volte. –

+0

Non ho capito fino a quando non l'ho effettivamente eseguito. Poi ho visto la logica. Modo per poco BUONE informazioni leggibili su questo argomento. Grazie! – Wolf5

6

Per noi C++ schlubs, si recupera la proprietà come segue:

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

Poi si analizza 'buf'. Grazie a Bondbhai.

2

Se il valore passato per l'azione personalizzata non è un set di chiavi/pair ...

cioè

<SetParameter Id="CustomAction1" Before="CustomAction1" Value="data" Sequence="execute"/> 
<CustomAction Id="CustomAction1" BinaryKey="BinaryId" DllEntry="MethodName" Execute="deferred"/> 

... allora l'intera blob possono essere recuperati usando:

string data = session["CustomActionData"];