web-dev-qa-db-fra.com

Comment passer CustomActionData à une CustomAction en utilisant WiX?

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?

54
Ayo I

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>
127
Ayo I

Pour nous schlubs C++, vous récupérez la propriété comme suit:

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

Ensuite, vous analysez "buf". Merci à Bondbhai .

8
Pierre

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"];
4
Dave Andersen