В WiX, как я тестирую на существование ключа реестра (не оценивают) для Oracle ODP.Net

При выполнении нескольких замен на больших строках затем, могло бы быть лучше использовать StringBuilder. Замена (), поскольку обычная производительность выходит со строками, появится.

21
задан Dan 25 August 2009 в 10:24
поделиться

2 ответа

Еще одно повышение производительности можно получить, отключив оформление этикеток. ( Windows -> Настройки; Общие -> Внешний вид -> Украшение этикеток ) и отключив неиспользуемые возможности при запуске ( Windows -> Настройки; Общие -> Запуск и выключение ).

Вы также можете получить дополнительную производительность, выбрав другую стратегию сбора мусора в зависимости от вашей JVM.

Если вам надоело с циклами перезапуска вы можете использовать JavaRebel из ZeroTurnaround. Это сократит время, затрачиваемое на перезапуск сервера / клиента.

На то, чтобы заставить это работать, у меня ушло довольно много времени, хотя теперь я знаю, как это довольно просто, так что, надеюсь, это избавит кого-то от такой же боли.

Сначала создайте свойство внутри вашего продукта 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 element:

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

18
ответ дан 29 November 2019 в 21:44
поделиться

Просто опустите 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>
6
ответ дан 29 November 2019 в 21:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: