Условие настраиваемого действия WIX с использованием значения свойства не работает - PullRequest
3 голосов
/ 06 марта 2020

Я пытаюсь запустить пользовательское действие в конце программы установки Wix, но только при соблюдении определенных условий. Пользователь запускает установщик, и он выбирает один из двух режимов, которые устанавливают свойство ServiceType. Два значения для этого свойства - «RegisterNew» и «LinkExisting». Из журнала ниже видно, что когда пользователь выбирает «LinkExisting» в пользовательском интерфейсе, он изменяет свойство, но настраиваемое действие все еще выполняется.

MSI (c) (D4:44) [11:20:15:686]: PROPERTY CHANGE: Modifying ServiceType property. Its current value is 'RegisterNew'. Its new value: 'LinkExisting'.

Вот мой код настраиваемого действия:

<InstallExecuteSequence>
  <Custom Action="RegisterServiceNameCustomAction" Before="InstallFinalize">
    <![CDATA[(ServiceType="RegisterNew") AND (NOT Installed)]]>
  </Custom>
</InstallExecuteSequence>

  <Fragment>
    <Binary Id="RegisterServiceCustomActionBinary" SourceFile="$(var.RegisterServiceCustomAction.TargetDir)$(var.RegisterServiceCustomAction.TargetName).CA.dll" />
    <CustomAction Id="RegisterServiceNameCustomAction" BinaryKey="RegisterServiceCustomActionBinary" DllEntry="ShowRegisterService" Execute="deferred" Return="check" />
  </Fragment>

Вот различные условия, которые я пробовал:

(ServiceType="RegisterNew") AND (NOT Installed)

<![CDATA[(ServiceType="RegisterNew") AND (NOT Installed)]]>

ServiceType="RegisterNew" AND NOT Installed

Вот код моего настраиваемого диалога, в котором они выбирают, делая выбор, который изменит «ServiceType»:

    <?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
    <UI Id="SelectServiceDlg">
      <Property Id="ServiceType" Value="RegisterNew" />
      <Dialog Id="SelectServiceDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
        <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[DialogBitmap]" />
        <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
        <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
        <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="40" Transparent="yes" NoPrefix="yes" Text="Determine whether you need to register a new service or link an existing service." />
        <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="Service Type Selection" />
        <Control Id="BothScopes" Type="RadioButtonGroup" X="20" Y="55" Width="330" Height="120" Property="ServiceType">
         <RadioButtonGroup Property="ServiceType">
            <RadioButton Value="RegisterNew" X="0" Y="0" Width="295" Height="16" Text="Register New Service" />
            <RadioButton Value="LinkExisting" X="0" Y="60" Width="295" Height="16" Text="Link Existing Service" />
          </RadioButtonGroup>
        </Control>
        <Control Id="RegisterNewServiceDescription" Type="Text" X="33" Y="70" Width="300" Height="36" NoPrefix="yes" Text="Select this option if you are going to register a new service.">
        </Control>
        <Control Id="LinkExistingDescription" Type="Text" X="33" Y="130" Width="300" Height="36" NoPrefix="yes" Text="Select this option if you are going to link an existing service to this service.">
        </Control>
        <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" />
        <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)" />
        <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
          <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
        </Control>
      </Dialog>
    </UI>
    </Fragment>
</Wix>

Вот изображение пользовательского интерфейса:

enter image description here

Поэтому мой вопрос заключается в том, почему он выполняет настраиваемое действие, даже если мое условие специально проверять это свойство?

1 Ответ

2 голосов
/ 07 марта 2020

После некоторого прочтения документации и просмотра всех «свойств» тега в WIX я решил попробовать установить несколько других значений и посмотреть, что произошло. Я обнаружил, что при определении свойства, если вы помечаете его как защищенное, оно сохраняет свое значение на протяжении всего процесса установки, тогда как если оно не является безопасным, оно, похоже, этого не делает. Итак, теперь мое определение свойства выглядит следующим образом:

<Property Id="SERVICE_TYPE" Secure="yes" Value="RegisterNew" />

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

Вот фрагмент из документации WIX:

Secure - YesNoType - Обозначает, что свойство может быть передано на сторону сервера при выполнении управляемой установки с повышенными правами. привилегии. См. Свойство SecureCustomProperties для получения дополнительной информации.

Документация WIX для элемента свойства

...