66 votes

Comment passer CustomActionData à une CustomAction en utilisant WiX?

Comment les propriétés définies sur CustomActionData doivent-elles être récupérées par une action personnalisée différée?

143voto

user497745 Points 950

Reportés actions personnalisées ne pouvez pas accéder directement installateur de propriétés (de référence). En fait, seulement CustomActionData de la propriété

session.CustomActionData

et d'autres méthodes et propriétés énumérées ici sont disponibles sur l'objet de session.

Par conséquent, pour un différé d'action personnalisée pour récupérer une propriété, par exemple l' INSTALLLOCATION, vous devez utiliser un type de 51 action personnalisée - c'est à dire une propriété d'une action personnalisée, afin de leur transmettre cette information et vous pourrez utiliser les données du CustomAction du code C# par session.CustomActionData. (voir référence & de référence)

Ci-dessous est un exemple d'un type 51 action personnalisée (CustomAction1) qui permettra de définir une propriété qui peut être récupéré en CustomAction2.

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

Notez que Property nom de l'attribut CustomAction2. Ce qui est important. La Propriété valeur de l'attribut de la type 51 action doit être égal/identique au nom de l'action personnalisée qui consomme CustomActionData. (voir référence)

Notez le nom de l' SomeCustomActionDataKey dans la Value attribut paire clé/valeur? Dans votre code C# dans la consommation de l'action personnalisée (CustomAction2), vous aurez l'air qui a la propriété d' 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 en Property de l'attribut de type 51 action personnalisée, mais la clé de l' key=value paire dans l' Value d'attribut. (Important à emporter: CustomActionData est remplie par la définition d'un programme d'installation de la propriété qui a le même nom que l'Id de la consommation de l'action personnalisée, mais CustomActionData touches ne sont PAS installer propriétés.) (voir référence)

Dans notre scénario, la consommation de l'action personnalisée est un différé d'action personnalisé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"
/>

La configuration de la InstallExecuteSequence

Bien sûr, la consommation d'action personnalisée (CustomAction2) doit courir après le type 51 action personnalisée (CustomAction1). Ainsi, vous aurez à 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>

10voto

Pierre Points 559

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

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X