2009-08-25 15 views
21

Cụ thể hơn, tôi muốn kiểm tra xem Oracle ODP.Net đã được cài đặt trên máy hay chưa. Tôi muốn thực hiện việc này bằng cách kiểm tra khóa đăng ký HKLM \ SOFTWARE \ ORACLE \ ODP.NET.Trong WiX làm cách nào để kiểm tra sự tồn tại của khóa đăng ký (không phải giá trị) đối với Oracle ODP.Net

Giá trị thực tế được ODP.Net sử dụng được lưu trữ trong HKLM \ SOFTWARE \ ORACLE \ ODP.NET \ 2.111.6.20 tuy nhiên tôi giả định rằng tên khóa thấp hơn này sẽ thay đổi khi bản cập nhật được phát hành bởi Oracle.

Tôi đã thử những điều sau không thành công, có thể vì giá trị (Mặc định) không thực sự tồn tại hoặc có thể vì nó là rỗng (tôi không chắc chính xác cách nó được thể hiện trong sổ đăng ký).

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

Vì vậy, bất kỳ những điều sau đây sẽ rất hữu ích với tôi:

  • Một cách để tìm kiếm một registry key không có giá trị dưới nó.
  • Một cách để tìm kiếm một giá trị registry sử dụng một con đường có chứa ký tự đại diện
  • Cách tốt hơn để kiểm tra ODP.Net đang được cài đặt
+0

Xin cảm ơn các bạn! tôi đã sử dụng hành động tùy chỉnh như đã được mô tả ở đây: [http://stackoverflow.com/a/1340107][1] [1]: http://stackoverflow.com/a/1340107 – Viktor

+0

Bằng cách lấy giá trị Mặc định, bạn nên bỏ qua thuộc tính Tên. –

Trả lời

17

OK, do đó, nhờ thông tin của Sascha, có vẻ như câu trả lời là "bạn không thể" bằng chức năng đăng ký WiX tích hợp.

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 khiến nó khó hơn một chút. Bắt làm việc này đã đưa tôi khá lâu mặc dù nó khá đơn giản bây giờ tôi biết làm thế nào, vì vậy hy vọng điều này sẽ tiết kiệm cho người khác cùng một nỗi đau.

Đầu tiên tạo ra một tài sản 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 sự chính và thiết lập ODPNETINSTALLED để "1" nếu nó tồn tại. Tôi sẽ không đi vào biên dịch và thêm các hành động tùy chỉnh để 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 phải đăng ký và sắp xếp các hành động, bởi vì tôi muốn cảnh báo xuất hiện cùng với điều kiện khởi động khác của tôi, tôi đã phải thêm nó vào Install UI Chuỗi yếu 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 một điều kiện ra mắt để kiểm tra tài sản:

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

Lưu ý rằng tôi tin rằng scheduli ng trong InstallUISequence nghĩa là hành động tùy chỉnh sẽ không được kích hoạt trong khi cài đặt không phải UI. 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 nó không phải là vấn đề đối với tôi.

6

Đơn giản chỉ cần bỏ qua RegistrySearch/@ Tên để có được "(Mặc định)" giá trị. Thật không may là không có cách nào mà tôi biết làm một tìm kiếm đệ quy, bạn sẽ cần phải chọn một khóa registry "được biết đến" sẽ ổn định giữa các phiên bản và tìm kiếm cơ sở của bạn từ đó.

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

Vâng, vâng. Không tìm kiếm đệ quy với RegistrySearch. –

+1

Cảm ơn, nhưng yhis dường như không làm việc cho tôi, tôi thiếu một cái gì đó hiển nhiên? Nếu tôi nhìn vào Regedit giá trị "(Mặc định)" là bình thường "(Giá trị không được thiết lập)" của nó sẽ đáp ứng điều kiện WiX? BTW Tôi đang sử dụng WiX v3 nếu điều đó quan trọng. – Dan

+0

Tôi nghĩ bạn cần tìm khóa đăng ký khác trong trường hợp đó ... – saschabeaumont