#wix #windows-installer #custom-action
#wix #windows-установщик #пользовательское действие
Вопрос:
Я создаю MSI, который, в свою очередь, создает службу Windows.
У меня есть пользовательское действие, которое использует архивы, встроенные в MSI, и взрывает его. После чего он создает пару свойств, которые необходимо обновить в app.config msi. Я использую <util:xmlFile>
элемент wix для обновления файла конфигурации. Но тогда он не содержит значений, обновленных в свойствах.
Сведения о пользовательском действии: После: InstallFiles
Выполнить: « SecondSequence
» // Выполнить немедленную ошибку «файл не найден» в пользовательском действии.
Как мне это сделать?
Комментарии:
1. Можете ли вы поделиться содержимым файла util:xmlFile? Вы должны правильно ссылаться на свойства — иногда это может быть чертовски сложно.
Ответ №1:
util:xmlFile, как и большинство материалов Wix, требует осторожности при использовании свойств. Ссылка на файл выглядит следующим образом: File='[#RHSEXECONFIGFILE]’ Ссылка на значение выглядит следующим образом: Value='[RHS_URL]’ где моим свойством является имя RHS_URL . И ваша информация XPATH должна быть правильной.
Посмотрите на простой пример ниже (украденный из рабочей установки).
<Directory Id='ProgramFiles64Folder'>
<Directory Id='ROBINHOODCLIENTSERVICE' Name='ROBIN HOOD Client Service'>
<Directory Id='INSTALLBINDIR' Name='bin'>
<Component Id='MainExecutable' Guid='56F635F6-E52D-4756-A1F2-4A4190B04582' Win64="yes">
<File Id='RHSEXE' Name='RHSClientService.exe' Source='binReleaseRHSClientService.exe' DiskId='1' Vital='yes' KeyPath='yes' Compressed='yes'></File>
<ServiceInstall Id='RHSEXESERVICE' Name='[ProductName]' DisplayName='[ProductName]' Description='RHS Client Service File Processor' Start='auto' Type='ownProcess' ErrorControl='normal' Vital='yes'/>
<ServiceControl Id='RHSEXESERVICECONTROL' Name='[ProductName]' Start='install' Stop='both' Remove='uninstall'/>
</Component>
<Component Id='RHSEXECONFIG' Guid='C26DA00E-BD27-4E99-AB8B-E1586BF90C10' Win64="yes">
<File Id='RHSEXECONFIGFILE' Name='RHSClientService.exe.config' DiskId='1' Source='binReleaseRHSClientService.exe.config' Vital='yes' Compressed='yes'/>
<util:XmlFile Id='XmlSettings1' File='[#RHSEXECONFIGFILE]'
Action='setValue' Name='value' Value='[RHS_URL]' ElementPath="//configuration/appSettings/add[[]@key='RHS.host'[]]" Permanent="yes" SelectionLanguage="XPath" Sequence='1' />
<util:XmlFile Id='XmlSettings2' File='[#RHSEXECONFIGFILE]'
Action='setValue' Name='value' Value='RHS/services/RHSReport' ElementPath="//configuration/appSettings/add[[]@key='RHS.uri'[]]" Permanent="yes" SelectionLanguage="XPath" Sequence='2' />
<util:XmlFile Id='XmlSettings3' File='[#RHSEXECONFIGFILE]'
Action='setValue' Name='value' Value='[RHS_USERNAME]' ElementPath="//configuration/appSettings/add[[]@key='RHS.username'[]]" Permanent="yes" SelectionLanguage="XPath" Sequence='3' />
</Component>
</Directory>
</Directory>
</Directory>
Комментарии:
1. Пример значения [RHS_URL] обновляется во время выполнения другим пользовательским действием, которое фактически имеет дело с обработкой файлов, которые входят в комплект установщика, поэтому мне придется подождать загрузки компонентов, прежде чем вызывать это пользовательское действие. Как мне это сделать?
2. Очевидно, что в этом примере экран конфигурации собирает свойства перед установкой. Для настройки после установки вы должны использовать DLL (написанную на C или C ), которая может изменять любые файлы или записи реестра для вас. DLL будет вызываться с помощью пользовательского действия и может делать все, что может делать C Windows dll, и вы можете создавать ее с любыми статическими или динамическими библиотеками, которые вам нужны. Установщик Windows может вызывать только связанную DLL-библиотеку — он не может вызвать ваше приложение — установка технически не завершена.