oracle wix wix3 odp.net

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



wix3 (2)

Más específicamente, quiero probar si Oracle ODP.Net está instalado en una máquina. Quiero hacer esto probando la clave de registro HKLM / SOFTWARE / ORACLE / ODP.NET.

Los valores reales utilizados por ODP.Net se almacenan en HKLM / SOFTWARE / ORACLE / ODP.NET / 2.111.6.20 sin embargo, supongo que el nombre de esta clave de nivel inferior cambiará a medida que Oracle publique las actualizaciones.

He intentado lo siguiente que falla, posiblemente porque el valor (predeterminado) no existe realmente o posiblemente porque es nulo (no estoy seguro de cómo se representa exactamente en el registro).

<Property Id="ORACLE_ODPNET"> <RegistrySearch Id="ODPNET_RegKey" Type="raw" Root="HKLM" Key="SOFTWARE/ORACLE/ODP.NET" Name="(Default)"/> </Property> <Condition Message="This setup requires ODP.Net to be installed."> Installed OR ORACLE_ODPNET </Condition>

Así que cualquiera de los siguientes sería útil para mí:

  • Una forma de buscar una clave de registro sin valores debajo de ella.
  • Una forma de buscar un valor de registro utilizando una ruta que contiene comodines
  • Una mejor manera de probar la instalación de ODP.Net

Bien, gracias a la información de Sascha parece que la respuesta es "no puedes" usando las funciones de registro de WiX incorporadas.

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

Primero crea una propiedad dentro de tu producto WiX:

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

A continuación, cree una acción personalizada para buscar la clave y establezca ODPNETINSTALLED en "1" si existe. Aquí no voy a compilar y agregar la acción personalizada al instalador, pero es bastante simple si usas Votive en Visual Studio. El código para 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 necesita registrarse y programar la acción, porque quería que apareciera la advertencia junto con mis otras condiciones de lanzamiento, tuve que agregarla al elemento Instalar secuencia de IU :

<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 agregar una condición de lanzamiento para comprobar 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 la interfaz de usuario. Sin embargo, mi instalador debe tener la instalación de la interfaz de usuario para que no sea un problema para mí.


Simplemente omita RegistrySearch / @ Name para obtener el valor "(predeterminado)". Lamentablemente, no hay forma de realizar una búsqueda recursiva, tendrá que elegir una clave de registro "conocida" que sea estable entre versiones y basar su búsqueda a partir de eso.

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