В WiX как мне проверить наличие раздела реестра (не значения) для Oracle ODP.Net
Вопрос
Более конкретно, я хочу проверить, установлен ли Oracle ODP.Net на компьютере.Я хочу сделать это, протестировав раздел реестра HKLM\SOFTWARE\ORACLE\ODP.NET.
Фактические значения, используемые ODP.Net хранятся в HKLM \SOFTWARE \ ORACLE \ ODP.NET \ 2.111.6.20, однако я предполагаю, что имя этого ключа более низкого уровня изменится по мере выпуска обновлений Oracle.
Я попробовал следующее, которое завершилось неудачей, возможно, потому, что значение (по умолчанию) на самом деле не существует или, возможно, потому, что оно равно null (я не уверен точно, как оно представлено в реестре).
<Property Id="ORACLE_ODPNET">
<RegistrySearch Id="ODPNET_RegKey" Type="raw" Root="HKLM" Key="SOFTWARE\ORACLE\ODP.NET" Name="(Default)"/>
</Property>
<Condition Message="This setup requires ODP.Net to be installed.">
Installed OR ORACLE_ODPNET
</Condition>
Так что любое из следующих действий было бы для меня полезным:
- Способ поиска раздела реестра , в котором нет значений.
- Способ поиска значения в реестре с использованием пути, содержащего подстановочные знаки
- Лучший способ проверить ODP.Net могут быть установлены
Решение
Итак, благодаря информации Саши, кажется, что ответ "вы не можете" использовать встроенные функции реестра WiX.
Теперь я также хотел, чтобы этот тест выполнялся вместе с другими тестами условий запуска, что немного усложняет его.Чтобы это сработало, мне потребовалось довольно много времени, хотя теперь я знаю, как это сделать, это довольно просто, так что, надеюсь, это избавит кого-то еще от такой же боли.
Сначала создайте свойство внутри вашего продукта WiX:
<Property Id="ODPNETINSTALLED">0</Property>
Затем создайте пользовательское действие для проверки наличия ключа и установите ODPNETINSTALLED равным "1", если он существует.Я не собираюсь здесь вдаваться в компиляцию и добавление пользовательского действия в программу установки, но это довольно просто, если вы используете Votive в Visual Studio.Код для моего пользовательского действия следующий:
using Microsoft.Deployment.WindowsInstaller;
using Microsoft.Win32;
namespace WiXCustomAction
{
public class CustomActions
{
[CustomAction]
public static ActionResult CheckOdpNetInstalled(Session xiSession)
{
xiSession.Log("Begin CheckOdpNetInstalled");
RegistryKey lKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\ORACLE\ODP.Net");
xiSession["ODPNETINSTALLED"] = lKey == null ? "0" : "1";
return ActionResult.Success;
}
}
}
Теперь вам нужно зарегистрироваться и запланировать действие, поскольку я хотел, чтобы предупреждение появлялось вместе с другими моими условиями запуска, мне пришлось добавить его в установкуПользовательский интерфейсЭлемент последовательности:
<Binary Id="WiXCustomAction.dll" SourceFile="$(var.WiXCustomAction.TargetDir)$(var.WiXCustomAction.TargetName).CA.dll" />
<CustomAction Id="CheckOdpNet" BinaryKey="WiXCustomAction.dll" DllEntry="CheckOdpNetInstalled" Execute="immediate" />
<InstallUISequence>
<Custom Action="CheckOdpNet" Before="LaunchConditions">NOT Installed</Custom>
</InstallUISequence>
Наконец, добавьте условие запуска, чтобы проверить свойство:
<Condition Message="!(loc.OracleOdpCondition)">
Installed OR ODPNETINSTALLED="1"
</Condition>
Обратите внимание, что я считаю, что планирование в InstallUISequence означает, что пользовательское действие не будет запущено во время установок, отличных от пользовательского интерфейса.Однако в моем установщике должен быть установлен пользовательский интерфейс, так что для меня это не проблема.
Другие советы
Просто опустите RegistrySearch/@Name, чтобы получить значение "(по умолчанию)".К сожалению, насколько мне известно, нет способа выполнить рекурсивный поиск, вам нужно будет выбрать "известный" раздел реестра, который будет стабильным между выпусками, и основывать свой поиск на нем.
<Property Id="ORACLE_ODPNET">
<RegistrySearch Id="ODPNET_RegKey" Type="raw" Root="HKLM" Key="SOFTWARE\ORACLE\ODP.NET" />
</Property>
<Condition Message="This setup requires ODP.Net to be installed.">
Installed OR ORACLE_ODPNET
</Condition>