Comment les propriétés sont-elles définies sur CustomActionData pour être récupérées par une action personnalisée différée?
Les actions personnalisées différées ne peuvent pas accéder directement aux propriétés du programme d'installation ( référence ). En fait, seule la propriété CustomActionData
session.CustomActionData
et d'autres méthodes et propriétés répertoriées ici sont disponibles sur l'objet session.
Par conséquent, pour qu'une action personnalisée différée récupère une propriété telle que INSTALLLOCATION
, vous devez utiliser une action personnalisée de type 51 - c'est-à-dire une action personnalisée set-property - pour transmettre ces informations et vous consommerez le les données du code C # de CustomAction via session.CustomActionData
. (voir référence & référence )
Voici un exemple d'action personnalisée de type 51 (CustomAction1
) qui définira une propriété qui peut être récupérée dans CustomAction2
.
<CustomAction Id="CustomAction1"
Property="CustomAction2"
Value="SomeCustomActionDataKey=[INSTALLLOCATION]"
/>
Notez que Property
nom d'attribut est CustomAction2
. C'est important. La valeur de l'attribut Property de l'action de type 51 doit être égale/identique au nom de l'action personnalisée qui consomme CustomActionData
. ( voir référence )
Remarquez le nom SomeCustomActionDataKey
dans la paire clé/valeur d'attribut Value
? Dans votre code C # dans l'action personnalisée consommatrice (CustomAction2
), vous rechercherez cette propriété dans CustomActionData
en utilisant l'expression suivante:
string somedata = session.CustomActionData["SomeCustomActionDataKey"];
La clé que vous utilisez pour récupérer la valeur de CustomActionData
n'est PAS la valeur dans l'attribut Property
de l'action personnalisée de type 51, mais la clé de key=value
paire dans l'attribut Value
. ( Points importants à retenir: CustomActionData
est renseigné en définissant une propriété d'installation qui porte le même nom que l'ID de l'action personnalisée consommatrice, mais les touches CustomActionData
ne sont PAS des propriétés d'installation.) (voir référence )
Dans notre scénario, l'action personnalisée consommatrice est une action personnalisée différée définie un peu comme ci-dessous:
<Binary Id="SomeIdForYourBinary" SourceFile="SomePathToYourDll" />
<CustomAction Id="CustomAction2"
BinaryKey="SomeIdForYourBinary"
DllEntry="YourCustomActionMethodName"
Execute="deferred"
Return="check"
HideTarget="no"
/>
Configuration de InstallExecuteSequence
Bien sûr, l'action personnalisée consommatrice (CustomAction2
) doit s'exécuter après l'action personnalisée de type 51 (CustomAction1
). Vous devrez donc les planifier comme ceci:
<InstallExecuteSequence>
<!--Schedule the execution of the custom actions in the install sequence.-->
<Custom Action="CustomAction1" Before="CustomAction2" />
<Custom Action="CustomAction2" After="[SomeInstallerAction]" />
</InstallExecuteSequence>
Pour nous schlubs C++, vous récupérez la propriété comme suit:
MsiGetProperty(hInstall, "CustomActionData", buf, &buflen);
Ensuite, vous analysez "buf". Merci à Bondbhai .
Si la valeur transmise à l'action personnalisée n'est pas un ensemble clé/paire ...
c'est à dire.
<SetProperty Id="CustomAction1" Before="CustomAction1" Value="data" Sequence="execute"/>
<CustomAction Id="CustomAction1" BinaryKey="BinaryId" DllEntry="MethodName" Execute="deferred"/>
... alors le blob entier peut être récupéré en utilisant:
string data = session["CustomActionData"];