Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie teste ich in WiX, ob ein Registrierungsschlüssel (nicht Wert) für Oracle ODP.Net vorhanden ist?

OK, dank Saschas Informationen scheint die Antwort zu lauten:"Sie können nicht" die integrierten WiX-Registrierungsfunktionen verwenden.

Jetzt wollte ich auch, dass dieser Test zusammen mit den anderen Startbedingungstests durchgeführt wird, was es etwas schwieriger macht. Es hat eine ganze Weile gedauert, bis ich das zum Laufen gebracht habe, obwohl es ziemlich einfach ist, jetzt weiß ich, wie es geht, also erspart es hoffentlich jemand anderem den gleichen Schmerz.

Erstellen Sie zuerst eine Eigenschaft in Ihrem WiX-Produkt:

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

Erstellen Sie als Nächstes eine benutzerdefinierte Aktion, um nach dem Schlüssel zu suchen, und setzen Sie ODPNETINSTALLED auf „1“, falls vorhanden. Ich werde hier nicht auf das Kompilieren und Hinzufügen der benutzerdefinierten Aktion zum Installationsprogramm eingehen, aber es ist ziemlich einfach, wenn Sie Votive in Visual Studio verwenden. Der Code für meine benutzerdefinierte Aktion lautet:

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

Jetzt müssen Sie die Aktion registrieren und planen, da ich wollte, dass die Warnung zusammen mit meinen anderen Startbedingungen angezeigt wird, musste ich sie der InstallUI hinzufügen Sequenzelement:

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

Fügen Sie schließlich eine Startbedingung hinzu, um die Eigenschaft zu überprüfen:

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

Beachten Sie, dass ich glaube, dass die Planung in InstallUISequence bedeutet, dass die benutzerdefinierte Aktion nicht während Nicht-UI-Installationen ausgelöst wird. Mein Installer muss jedoch über eine UI-Installation verfügen, sodass dies für mich kein Problem darstellt.