В WiX как проверить наличие ключа реестра (не значения) для Oracle ODP.Net - PullRequest
21 голосов
/ 25 августа 2009

Более конкретно, я хочу проверить, установлен ли 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 устанавливается

Ответы [ 2 ]

18 голосов
/ 27 августа 2009

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

6 голосов
/ 25 августа 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>
...