Как проверить свойство CustomAction (Wix)?

Я пытаюсь составить небольшой диалог «предварительных требований» в Wix, чтобы дать пользователям уверенность в том, что у них есть все необходимое для запуска моего программного обеспечения:

Например, мне нужен управляемый DirectX, поэтому я ищу некоторые DLL:

<Property Id="MANAGED_DIRECTX">
  <DirectorySearch Path="$(env.SystemRoot)\Microsoft.NET\DirectX for Managed Code\1.0.2902.0" Depth="0" Id="MDXDir">
    <FileSearch Name="Microsoft.DirectX.dll"/>
  </DirectorySearch>
</Property>

<Property Id="MANAGED_DIRECTX_DIRECTINPUT">
  <DirectorySearch Path="$(env.SystemRoot)\Microsoft.NET\DirectX for Managed Code\1.0.2902.0" Depth="0" Id="MDXInputDir">
    <FileSearch Name="Microsoft.DirectX.DirectInput.dll"/>
  </DirectorySearch>
</Property>

У меня также есть CustomAction для объединения моей логики условий:

<CustomAction Id="SetManagedDirectXInstalled"
              Property="MANAGED_DIRECTX_INSTALLED"
              Value="NOT([MANAGED_DIRECTX] = '') AND NOT ([MANAGED_DIRECTX_DIRECTINPUT] = ''")/>

Это CustomAction последовательно:

<InstallExecuteSequence>
  <Custom Action="SetManagedDirectXInstalled" After="AppSearch" />
  <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

Теперь я должен иметь возможность использовать «MANAGED DIRECTX INSTALLED», чтобы что-то сделать, например.

    <Control Id="NoManagedDirectX" Type="Text" X="20" Y="50" Width="300" Height="60" Transparent="yes" NoPrefix="yes" Hidden="yes">
      <Text>Microsoft Managed DirectX (MDX) for DirectX 9.0 is NOT installed</Text>
      <Condition Action="show">NOT MANAGED_DIRECTX_INSTALLED</Condition>
    </Control>
    <Control Id="ManagedDirectX" Type="Text" X="20" Y="50" Width="300" Height="60" Transparent="yes" NoPrefix="yes" Hidden="yes">
      <Text>Microsoft Managed DirectX (MDX) for DirectX 9.0 is correctly installed</Text>
      <Condition Action="show">MANAGED_DIRECTX_INSTALLED</Condition>
    </Control>

Что бы я ни делал, условие всегда ложно (например, не установлено), даже если я знаю, что файлы есть. Использование команды msiexec с параметром /l*vx нигде не показывает свойство MANAGED DIRECTX INSTALLED.

Когда ‹Условие› используется со следующим, оно успешно предотвращает установку (хотя я больше не хочу блокировать установку в этом случае, просто советую).

<Condition Message="You must have Microsoft Managed DirectX (MDX) for DirectX 9.0 installed">
  MANAGED_DIRECTX AND MANAGED_DIRECTX_DIRECTINPUT
</Condition>

Как я могу отследить/отладить это (или что я сделал не так?)


EDIT. Теперь я уверен, что мой CustomAction даже не вызывается, установка следующего значения также не показывает ожидаемых результатов!

<CustomAction Id='SetManagedDirectXInstalled'
              Property='MANAGED_DIRECTX_INSTALLED'
              Value='Something hard-coded'/>

or

<CustomAction Id='SetManagedDirectXInstalled'
              Error='Some error should show!'/>

person Ray Hayes    schedule 18.06.2009    source источник


Ответы (2)


Я думаю, что, возможно, нашел ответ, но я не могу попробовать его, пока не буду рядом со своим ПК для разработки.

Похоже, мне нужно сравнить значения с TRUE/FALSE (или пустой строкой), а не просто ожидать, что они будут работать как логические (Источник)

В этих выражениях вы можете использовать имена свойств (помните, что они чувствительны к регистру). Несуществующие имена свойств будут рассматриваться как пустые строки. Логическое значение свойства отражает, было ли оно установлено — это означает, что вы не можете проверить наличие логического значения, просто используя свойство:

  • PROPERTY
    Это будет оценено как истинное, если свойство было установлено и имеет любое значение, даже если это значение ложно.
  • NOT PROPERTY
    Это будет оценено как true, если свойство вообще не было задано.
  • СВОЙСТВО = ИСТИНА
  • PROPERTY = FALSE
    Это правильный способ проверки значения логического свойства.
person Ray Hayes    schedule 18.06.2009

  1. Для отладки используйте подробный файл журнала. Он покажет вам состояние ваших свойств по мере их изменения. Затем вы должны быть в состоянии оценить состояние с этим знанием

  2. Я ответил на этот же вопрос не так давно здесь. Условие, в котором используется имя свойства, является проверкой существования. Проверка существования для Свойства оценивается как истина, если Свойство вообще имеет какое-либо значение. Если вы хотите проверить значение свойства, вам нужно сделать это явно.

person Rob Mensching    schedule 18.06.2009
comment
Я использую аргумент командной строки /l*vx, но свойство набора CustomAction не отображается! - person Ray Hayes; 19.06.2009
comment
Я попытался добавить следующее, но оно по-прежнему всегда пустое (хотя два бита внутри — нет! Значение = НЕ ([MANAGED_DIRECTX] =) И НЕ ([MANAGED_DIRECTX_DIRECTINPUT] =) - person Ray Hayes; 19.06.2009
comment
Даже CustomAction, устанавливающий для свойства значение [MANAGED_DIRECTX] (не пустое), и никакая попытка логической логики не приводит к пустому свойству! Правильно ли принято соглашение о квадратных скобках? - person Ray Hayes; 19.06.2009
comment
Я совсем не уверен, что CustomAction когда-либо вызывается, в журнале об этом ничего не упоминается, и я не вижу побочных эффектов вызова, даже если просто поставлю Value=Hello ! - person Ray Hayes; 19.06.2009
comment
Вы запланировали CustomAction в соответствующей последовательности? - person Rob Mensching; 19.06.2009
comment
См. InstallExecuteSequence в исходном вопросе ... то есть, я думаю, как вы планируете CA, не так ли? - person Ray Hayes; 20.06.2009
comment
Да, но попадет ли он в ваш MSI? На данный момент, я должен признать, я очень смущен тем, что вы пытаетесь сделать здесь. При внимательном рассмотрении кажется, что вы пытаетесь получить свойство, содержащее символы, обычно используемые в условиях, которые будут оцениваться как условия. Я не думаю, что установщик Windows работает таким образом. Но я не могу объяснить, почему ваш пример CustomAction/@Error тоже не работает. В приведенном выше тексте недостаточно информации, чтобы точно сказать, в чем сейчас проблема... Я просто предполагаю. - person Rob Mensching; 23.06.2009