Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

No WiX como faço para testar a existência de uma chave de registro (não valor) para Oracle ODP.Net


OK, então, graças às informações de Sascha, parece que a resposta é "você não pode" usando as funções de registro WiX integradas.

Agora eu também queria que este teste acontecesse junto com os outros testes de condição de lançamento, o que o torna um pouco mais difícil. Fazer isso funcionar me levou um bom tempo, embora seja bastante simples agora que eu sei, então espero que isso poupe a outra pessoa a mesma dor.

Primeiro crie uma propriedade dentro do seu produto WiX:
<Property Id="ODPNETINSTALLED">0</Property>

Em seguida, crie uma ação personalizada para verificar a chave e defina ODPNETINSTALLED como "1", se existir. Não vou compilar e adicionar a ação personalizada ao instalador aqui, mas é bastante simples se você usar o Votive no Visual Studio. O código da minha ação personalizada é:
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;
    }
  }
}

Agora você precisa se registrar e agendar a ação, porque eu queria que o aviso aparecesse junto com minhas outras condições de lançamento, tive que adicioná-lo à instalaçãoIU Elemento de sequência:
<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>

Por fim, adicione uma condição de inicialização para verificar a propriedade:
<Condition Message="!(loc.OracleOdpCondition)">
  Installed OR ODPNETINSTALLED="1"
</Condition>

Observe que acredito que o agendamento em InstallUISequence significa que a ação personalizada não será acionada durante instalações sem interface do usuário. No entanto, meu instalador deve ter a instalação da interface do usuário, portanto, não é um problema para mim.