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

В частности, я хочу проверить, установлен ли Oracle ODP.Net на машине. Я хочу сделать это, протестировав раздел реестра HKLM \ SOFTWARE \ ORACLE \ ODP.NET.

Фактические значения, используемые ODP.Net, хранятся в HKLM \ SOFTWARE \ ORACLE \ ODP.NET \ 2.111.6.20, однако я предполагаю, что имя этого ключа более низкого уровня будет изменяться по мере выпуска обновлений Oracle.

Я пробовал следующее, что не помогло, возможно, потому, что значение (по умолчанию) на самом деле не существует, или, возможно, потому, что оно равно нулю (я не уверен, как именно оно представлено в реестре).

<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

person Dan    schedule 25.08.2009    source источник
comment
Спасибо, парни! Я использовал настраиваемое действие, как описано здесь: [stackoverflow.com/a/1340107 sizes[1] [1 ]: stackoverflow.com/a/1340107   -  person Viktor    schedule 25.07.2014
comment
Кстати, чтобы получить значение по умолчанию, вы должны опустить атрибут Name.   -  person Sanja Melnichuk    schedule 11.09.2014


Ответы (2)


Итак, благодаря информации Саши кажется, что ответ - «вы не можете» использовать встроенные функции реестра 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;
    }
  }
}

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

person Dan    schedule 27.08.2009

Просто опустите 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>
person saschabeaumont    schedule 25.08.2009
comment
Да да. Никакого рекурсивного поиска с RegistrySearch. - person Rob Mensching; 26.08.2009
comment
Спасибо, но у меня это не работает, я упустил что-то очевидное? Если я посмотрю в Regedit, значение (по умолчанию) будет нормальным (значение не установлено), будет ли это удовлетворять условию WiX? Кстати, я использую WiX v3, если это важно. - person Dan; 26.08.2009
comment
Хорошо, похоже, что невозможно искать только ключ, вы должны искать значение, и значение (по умолчанию) недостаточно хорошее, если кто-то явно не установил его (хотя никогда не видел, чтобы кто-то делал это). Похоже, мне нужно найти другой способ тестирования ODP.Net, спасибо. - person Dan; 27.08.2009
comment
Извините, но это не работает. Должно быть значение, и даже это значение не должно быть пустым. Я использую WiX 3.7, июль 2013 г. - person Jan Zeman; 02.07.2013