Как передать CustomActionData в CustomAction с помощью WiX?

Как устанавливаются свойства на CustomActionData для получения отложенным пользовательским действием?

3 ответов


отложенные пользовательские действия не могут напрямую обращаться к свойствам установщика (ссылка). На самом деле, только CustomActionData свойства

session.CustomActionData

и другие перечисленные методы и свойства здесь доступны на объекте сеанса.

поэтому для отложенного пользовательского действия для получения свойства, такого как INSTALLLOCATION, вы должны использовать настраиваемое действие типа 51-т. е. настраиваемое действие set-property-для передачи этой информации, и вы потребляйте данные из кода C# CustomAction через session.CustomActionData. (см. ссылка & ссылка)

Ниже приведен пример пользовательского действия типа 51 (CustomAction1), который установит свойство, которое можно получить в CustomAction2.

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

обратите внимание, что Property имя атрибута CustomAction2. Это важно. значение атрибута свойства действия типа 51 должно быть равно / идентично имени настраиваемого действия, которое является потребляя CustomActionData. (см. ссылка)

обратите внимание на имя SomeCustomActionDataKey на пара ключ/значение? В коде C# в пользовательском действии потребления (CustomAction2), вы будете искать это свойство из CustomActionData используя следующее выражение:

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

ключ, который используется для извлечения значения из CustomActionData не значение Property атрибут пользовательского действия типа 51, но ключ из key=value пары Value атрибут. (важный вывод: CustomActionData заполняется путем установки свойства установщика, которое имеет то же имя, что и идентификатор потребляющего пользовательского действия, но CustomActionData ключи не являются свойствами установщика.) (см. ссылка)

в нашем сценарии потребляющее пользовательское действие является отложенным пользовательским действием, определенным примерно так:

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

настройка InstallExecuteSequence

конечно, потребление пользовательских действий (CustomAction2) должен выполняться после настраиваемого действия типа 51 (CustomAction1). Поэтому вам придется планировать их следующим образом:

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

для нас c++ schlubs, вы получаете свойство следующим образом:

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

затем вы разбираете "buf". Спасибо Bondbhai.


Если значение, переданное пользовательскому действию, не является набором ключей/пар...

то есть

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

...затем весь blob можно получить, используя:

string data = session["CustomActionData"];