В WiX как мне проверить наличие раздела реестра (не значения) для Oracle ODP.Net

StackOverflow https://stackoverflow.com/questions/1327203

  •  19-09-2019
  •  | 
  •  

Вопрос

Более конкретно, я хочу проверить, установлен ли 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top