2009-03-16 36 views
5

Tôi có tệp msi cài đặt ứng dụng. Tôi cần biết tên sản phẩm của ứng dụng đó trước khi quá trình cài đặt bắt đầu.Lấy tên sản phẩm từ tập tin msi trong C#

tôi thử như sau:

{ 

... 
Type type = Type.GetType("Windows.Installer"); 
WindowsInstaller.Installer installer = (WindowsInstaller.Installer) 
Activator.CreateInstance(type); 

installer.OpenDatabase(msiFile, 0); //this is my guess to pass in the msi file name... 
... 
} 

nhưng bây giờ? Loại là null, điều này khiến tôi gặp lỗi. Và nơi nào tôi vượt qua trong tên của tập tin MSI?

Cảm ơn mọi gợi ý & nhận xét.

+0

bất kỳ mã nguồn đầy đủ thức về nó? – Kiquenet

Trả lời

1

Bạn lấy công cụ "Windows.Installer" ở đâu?

... bởi vì:

  1. Type.GetType mất một loại tên NET, không phải là một COM ProgID.
  2. Trình cài đặt Windows (ít nhất là trên Windows 2003) không có ProgId.

Tóm tắt: Sử dụng P/Gọi (DllImport, v.v.) để nói chuyện với API MSI.

+0

Tuyệt vời, tôi không biết chính xác P/Invoke là gì; Tôi không quản lý để tìm một mã có thể chạy được trên web, nó có vẻ là một bí mật được tôn trọng. Vì vậy, nó có thể là một giải pháp nhưng hiện tại tôi nhiều hay ít kết thúc với một số DllImport. Hãy coi tôi như một người mới trong vấn đề này. –

2

Nó sẽ không thể dễ dàng hơn để sử dụng mã này:

Type type = typeof(Windows.Installer);

Nếu bạn thích Type.GetType (String) quá tải bạn phải bao gồm tên lắp ráp chính xác sau đường dẫn đầy đủ đến lớp, Eg .:

Type type = Type.GetType("Windows.Installer, <assembly for MsiInstaller>");

+0

Cảm ơn bạn đã trả lời. Tôi không có sở thích, tôi chỉ googling web và hy vọng sẽ tìm thấy một số cách để giải quyết vấn đề của tôi. Bạn có ý gì với "lắp ráp cho MsiInstaller"? Tôi chỉ có tập tin msi. Nhưng phương pháp "typeof" có vẻ không hoạt động, hoặc là (loại Trình cài đặt không tồn tại). –

+1

Nếu "Windows.Installer" không có trong mscorlib hoặc trong assembly đang thực hiện thì bạn phải xác định tên assembly trong Type.GetType (string). Có lỗi đánh máy trong typeof(). Nó phải là typeof (WindowsInstaller) không có dấu chấm. –

6

Bạn cần phải sử dụng:

 Type installerType = Type.GetTypeFromProgID("WindowsInstaller.Installer"); 

Đây là một mẫu từ một số mã của tôi - trong trường hợp của tôi, tôi có được phiên bản cài đặt:

 // Get the type of the Windows Installer object 
     Type installerType = Type.GetTypeFromProgID("WindowsInstaller.Installer"); 

     // Create the Windows Installer object 
     Installer installer = (Installer)Activator.CreateInstance(installerType); 

     // Open the MSI database in the input file 
     Database database = installer.OpenDatabase(inputFile, MsiOpenDatabaseMode.msiOpenDatabaseModeReadOnly); 

     // Open a view on the Property table for the version property 
     View view = database.OpenView("SELECT * FROM Property WHERE Property = 'ProductVersion'"); 

     // Execute the view query 
     view.Execute(null); 

     // Get the record from the view 
     Record record = view.Fetch(); 

     // Get the version from the data 
     string version = record.get_StringData(2); 
+1

có giải pháp nào không sử dụng COM không? – Kiquenet

Các vấn đề liên quan