sql >> Base de Datos >  >> RDS >> Oracle

En WiX, ¿cómo pruebo la existencia de una clave de registro (no un valor) para Oracle ODP.Net?

De acuerdo, gracias a la información de Sascha, parece que la respuesta es "no se puede" usando las funciones de registro integradas de WiX.

Ahora también quería que esta prueba se realizara junto con las otras pruebas de condiciones de lanzamiento, lo que lo hace un poco más difícil. Hacer que esto funcione me tomó bastante tiempo, aunque es bastante simple ahora que sé cómo hacerlo, así que espero que esto le ahorre a alguien más el mismo dolor.

Primero cree una propiedad dentro de su producto WiX:

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

A continuación, cree una acción personalizada para verificar la clave y establezca ODPNETINSTALLED en "1" si existe. No voy a compilar y agregar la acción personalizada al instalador aquí, pero es bastante simple si usa Votive en Visual Studio. El código de mi acción personalizada es:

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

Ahora debe registrarse y programar la acción, porque quería que apareciera la advertencia junto con mis otras condiciones de lanzamiento, tuve que agregarla a la UI de instalación. Elemento de secuencia:

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

Finalmente agregue una condición de lanzamiento para verificar la propiedad:

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

Tenga en cuenta que creo que la programación en InstallUISequence significa que la acción personalizada no se activará durante las instalaciones que no sean de UI. Sin embargo, mi instalador debe tener una instalación de interfaz de usuario para que no sea un problema para mí.