Подтвердить что ты не робот

В 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 установка
4b9b3361

Ответ 1

ОК, поэтому благодаря информации Sascha кажется, что ответ "вы не можете" использовать встроенные функции реестра 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;
    }
  }
}

Теперь вам нужно зарегистрировать и запланировать действие, так как я хотел, чтобы предупреждение появлялось вместе с моими другими условиями запуска, я должен был добавить его в элемент UI Sequence:

<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 означает, что пользовательские действия не будут запускаться во время установки, отличной от UI. Однако у моего установщика должен быть установлен пользовательский интерфейс, поэтому для меня это не проблема.

Ответ 2

Просто опустите 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>