Được rồi, nhờ thông tin của Sascha, có vẻ như câu trả lời là "bạn không thể" sử dụng các chức năng đăng ký WiX tích hợp sẵn.
Bây giờ tôi cũng muốn thử nghiệm này xảy ra cùng với các thử nghiệm điều kiện khởi chạy khác, điều này khiến nó khó hơn một chút. Để làm được việc này tôi đã mất khá nhiều thời gian mặc dù bây giờ khá đơn giản, tôi biết cách làm thế nào, vì vậy hy vọng điều này sẽ giúp ai đó đỡ đau đớn tương tự.
Trước tiên, hãy tạo một thuộc tính bên trong Sản phẩm WiX của bạn:
<Property Id="ODPNETINSTALLED">0</Property>
Tiếp theo, tạo một hành động tùy chỉnh để kiểm tra khóa và đặt ODPNETINSTALLED thành "1" nếu nó tồn tại. Tôi sẽ không đi vào biên dịch và thêm hành động tùy chỉnh vào trình cài đặt ở đây nhưng nó khá đơn giản nếu bạn sử dụng Votive trong Visual Studio. Mã cho hành động tùy chỉnh của tôi là:
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;
}
}
}
Bây giờ bạn cần đăng ký và lập lịch hành động, vì tôi muốn cảnh báo xuất hiện cùng với các điều kiện khởi chạy khác của mình, tôi phải thêm nó vào Giao diện người dùng Cài đặt Phần tử trình tự:
<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>
Cuối cùng, thêm điều kiện khởi chạy để kiểm tra thuộc tính:
<Condition Message="!(loc.OracleOdpCondition)">
Installed OR ODPNETINSTALLED="1"
</Condition>
Lưu ý rằng tôi tin rằng lập lịch trong InstallUISequence có nghĩa là hành động tùy chỉnh sẽ không được kích hoạt trong quá trình cài đặt không phải giao diện người dùng. Tuy nhiên, trình cài đặt của tôi phải có cài đặt giao diện người dùng nên đó không phải là vấn đề đối với tôi.