Oracle
 sql >> Database >  >> RDS >> Oracle

In WiX come posso verificare l'esistenza di una chiave di registro (non valore) per Oracle ODP.Net

OK, quindi grazie alle informazioni di Sascha sembra che la risposta sia "non puoi" usando le funzioni di registro WiX integrate.

Ora volevo anche che questo test avvenisse insieme agli altri test delle condizioni di lancio, il che lo rende un po' più difficile. Per farlo funzionare mi ci è voluto un bel po' di tempo, anche se ora so come è abbastanza semplice, quindi spero che questo salverà a qualcun altro lo stesso dolore.

Per prima cosa crea una proprietà all'interno del tuo prodotto WiX:

<Property Id="ODPNETINSTALLED">0</Property>

Quindi crea un'azione personalizzata per verificare la chiave e imposta ODPNETINSTALLED su "1" se esiste. Non ho intenzione di compilare e aggiungere l'azione personalizzata al programma di installazione qui, ma è abbastanza semplice se usi Votive in Visual Studio. Il codice per la mia azione personalizzata è:

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;
    }
  }
}

Ora devi registrarti e pianificare l'azione, poiché volevo che l'avviso venisse visualizzato insieme alle altre mie condizioni di avvio, ho dovuto aggiungerlo all'interfaccia Installazione Elemento di sequenza:

<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>

Infine aggiungi una condizione di avvio per verificare la proprietà:

<Condition Message="!(loc.OracleOdpCondition)">
  Installed OR ODPNETINSTALLED="1"
</Condition>

Si noti che credo che la pianificazione in InstallUISequence significhi che l'azione personalizzata non verrà attivata durante le installazioni non dell'interfaccia utente. Tuttavia, il mio programma di installazione deve avere l'installazione dell'interfaccia utente, quindi non è un problema per me.