Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

session.CustomActionData

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

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

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

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

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

Обратите внимание на имя SomeCustomActionDataKey в парах ключ/значение атрибута Value? В коде С# в пользовательском действии пользователя (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>

Ответ 2

Для нас в С++ schlubs вы возвращаете Свойство следующим образом:

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

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

Ответ 3

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

т.е.

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

... тогда весь BLOB-объект можно получить с помощью:

string data = session["CustomActionData"];