Как свойства, заданные на CustomActionData, будут получены путем отложенного пользовательского действия?
Как передать CustomActionData в CustomAction с помощью WiX?
Ответ 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"];