sql >> Databasteknik >  >> RDS >> Oracle

Hur testar jag i WiX om det finns en registernyckel (inte värde) för Oracle ODP.Net

OK, så tack vare Saschas information verkar det som att svaret är "du kan inte" med hjälp av de inbyggda WiX-registerfunktionerna.

Nu ville jag också att det här testet skulle ske tillsammans med de andra lanseringskonditionstesten vilket gör det lite svårare. Att få det här att fungera har tagit mig ganska länge även om det är ganska enkelt nu jag vet hur, så förhoppningsvis kommer detta att spara någon annan samma smärta.

Skapa först en egenskap i din WiX-produkt:

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

Skapa sedan en anpassad åtgärd för att leta efter nyckeln och ställ in ODPNETINSTALLED till "1" om den finns. Jag tänker inte gå in på att kompilera och lägga till den anpassade åtgärden till installationsprogrammet här men det är ganska enkelt om du använder Votive i Visual Studio. Koden för min anpassade åtgärd är:

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

Nu måste du registrera dig och schemalägga åtgärden, eftersom jag ville att varningen skulle visas tillsammans med mina andra startvillkor, jag var tvungen att lägga till den i InstallUI Sekvenselement:

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

Lägg slutligen till ett startvillkor för att kontrollera egenskapen:

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

Observera att jag tror att schemaläggning i InstallUISequence innebär att den anpassade åtgärden inte aktiveras under icke-UI-installationer. Men mitt installationsprogram måste ha UI-installation så det är inget problem för mig.



  1. Asynkrona uppgifter med Django och selleri

  2. MySQL Innodb Crash

  3. Finns det någon skillnad mellan SQL Server Express (2012) och LocalDB?

  4. Ändra ett Enum-fält med Alembic