Как передать 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"];