Как обновить xml со свойствами, добавленными пользовательским действием

#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-библиотеку — он не может вызвать ваше приложение — установка технически не завершена.