Как проверить свойство CustomAction (Wix)?
-
06-07-2019 - |
Вопрос
Я пытаюсь создать небольшое диалоговое окно "предварительные требования" в 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] = ''")/>
Это пользовательское действие выполняется последовательно:
<InstallExecuteSequence>
<Custom Action="SetManagedDirectXInstalled" After="AppSearch" />
<RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>
Что я теперь должен быть в состоянии сделать, так это использовать "УСТАНОВЛЕННЫЙ УПРАВЛЯЕМЫЙ DIRECTX", чтобы что-то сделать, например
<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>
Не имеет значения, что я делаю, условие всегда равно false (напримерне установлен), даже когда я знаю, что файлы там есть.Использование команды msiexec с /l* vx нигде не показывает УПРАВЛЯЕМОЕ УСТАНОВЛЕННОЕ свойство DIRECTX.
Когда a <Condition> используется со следующим, он успешно предотвращает установку (хотя я больше не хочу блокировать установки в этом случае, просто советую).
<Condition Message="You must have Microsoft Managed DirectX (MDX) for DirectX 9.0 installed">
MANAGED_DIRECTX AND MANAGED_DIRECTX_DIRECTINPUT
</Condition>
Как я могу отследить / отладить это (или что я сделал не так?)
Редактировать - Теперь я уверен, что мое CustomAction даже не вызывается, установка для него следующего значения также не показывает ожидаемых результатов!
<CustomAction Id='SetManagedDirectXInstalled'
Property='MANAGED_DIRECTX_INSTALLED'
Value='Something hard-coded'/>
или
<CustomAction Id='SetManagedDirectXInstalled'
Error='Some error should show!'/>
Решение
Я думаю, что, возможно, нашел ответ, но я не могу попробовать это, пока не сяду за свой компьютер для разработки.
Похоже, я должен сравнить значения с TRUE / FALSE (или пустой строкой), а не просто ожидать, что они будут работать как логические (Источник)
В этих выражениях вы можете использовать имена свойств (помните, что они чувствительны к регистру).Несуществующее свойство имена будут обрабатываться как пустые строки.Логическое значение свойства отражает, было ли оно установлено — это означает, что вы не можете проверить наличие логического значения простым использованием свойства:
- СОБСТВЕННОСТЬ
Это значение будет равно true, если свойство было установлено и имеет любое значение, даже если это значение равно false.- НЕ СОБСТВЕННОСТЬ
Это значение будет равно true, если свойство вообще не было установлено.- СВОЙСТВО = TRUE
- СВОЙСТВО = FALSE
Это правильный способ проверить значение логического свойства.
Другие советы
Для отладки используйте подробный файл журнала. Он покажет вам состояние ваших свойств по мере их изменения. После этого вы сможете оценить состояние с этими знаниями
Я ответил на этот же вопрос не так давно здесь. Условие, которое использует имя свойства, является тестом на существование. Тест существования для свойства оценивается как true, если свойство вообще имеет какое-либо значение. Если вы хотите проверить значение свойства, вам нужно сделать это явно.