ОК, так что благодаря информации Саша кажется, что ответ «вы не можете», используя встроенные функции реестра WiX.
Теперь я также хотел, чтобы этот тест проводился вместе с другими тестами условий запуска, что делает его немного сложнее. Чтобы заставить это работать, у меня ушло довольно много времени, хотя теперь я знаю, как это довольно просто, поэтому, надеюсь, это спасет кого-то еще от такой же боли.
Сначала создайте свойство внутри вашего продукта WiX:
<Property Id="ODPNETINSTALLED">0</Property>
Затем создайте настраиваемое действие для проверки ключа и установите для ODPNETINSTALLED значение «1», если оно существует. Я не собираюсь вдаваться в компиляцию и добавление настраиваемого действия в установщик, но это довольно просто, если вы используете Votive в Visual Studio. Код для моего пользовательского действия:
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;
}
}
}
Теперь вам нужно зарегистрировать и запланировать действие, потому что я хотел, чтобы предупреждение появлялось вместе с другими моими условиями запуска, мне пришлось добавить его в элемент Install UI Sequence:
<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>
Наконец, добавьте условие запуска, чтобы проверить свойство:
<Condition Message="!(loc.OracleOdpCondition)">
Installed OR ODPNETINSTALLED="1"
</Condition>
Обратите внимание, что я считаю, что планирование в InstallUISequence означает, что настраиваемое действие не будет выполняться во время установки без пользовательского интерфейса. Однако мой установщик должен установить пользовательский интерфейс, поэтому для меня это не проблема.