2009-03-16 6 views
5

में एमएसआई फ़ाइल से उत्पाद का नाम प्राप्त करें मेरे पास एक एमएसआई फ़ाइल है जो एक एप्लिकेशन इंस्टॉल करती है। मुझे से पहले इंस्टॉलेशन शुरू होने से पहले उस एप्लिकेशन का उत्पाद नाम जानना होगा।सी #

{ 

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

लेकिन अब:

मैं निम्नलिखित की कोशिश की? टाइप शून्य है, जो मुझे एक त्रुटि फेंकता है। और मैं एमएसआई फ़ाइल के नाम पर कहां से गुजरता हूं?

किसी भी संकेत के लिए धन्यवाद & टिप्पणियां।

+0

कोई अंतिम पूर्ण स्रोत इसके बारे में कोड? – Kiquenet

उत्तर

1

आपको "विंडोज़ इंस्टालर" सामान कहां से मिला?

... क्योंकि:

  1. Type.GetType एक .NET प्रकार नाम, न कि COM ProgId लेता है।
  2. विंडोज इंस्टालर (कम से कम विंडोज 2003 पर) में प्रोजेआईड नहीं है।

सारांश में: एमएसआई एपीआई से बात करने के लिए पी/Invoke (DllImport, आदि) का उपयोग करें।

+0

ग्रेट, मुझे नहीं पता कि वास्तव में पी/आमंत्रण क्या है; मैं वेब पर एक रन करने योग्य कोड खोजने का प्रबंधन नहीं करता था, ऐसा लगता है कि यह एक सम्मानित रहस्य है। तो यह एक समाधान हो सकता है लेकिन वर्तमान में मैं कुछ DllImport के साथ कम या ज्यादा अंत हो गया। इस मामले में कृपया मुझे नौसिखिया के रूप में मानें। –

2

नहीं यह इस कोड का उपयोग करने के लिए आसान नहीं होगा: आप Type.GetType (स्ट्रिंग) अधिभार चाहें तो आप वर्ग, जैसे करने के लिए पूरा पथ के बाद सही विधानसभा नाम शामिल होना चाहिए

Type type = typeof(Windows.Installer);

.:

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

+0

आपके उत्तर के लिए धन्यवाद। मेरे पास कोई वरीयता नहीं है, मैं सिर्फ वेब पर जा रहा हूं और मेरी समस्या को हल करने के लिए कुछ रास्ता ढूंढने की उम्मीद करता हूं। "MsiInstaller के लिए असेंबली" के साथ आपका क्या मतलब है? मेरे पास बस एमएसआई फाइल है। लेकिन "टाइपोफ" विधि काम नहीं करती है, या तो (प्रकार इंस्टॉलर मौजूद नहीं है)। –

+1

यदि "Windows.Installer" mscorlib में नहीं है या वर्तमान में असेंबली निष्पादित करने में है तो आपको Type.GetType (स्ट्रिंग) में असेंबली का नाम निर्दिष्ट करना होगा। टाइपोफ़() में एक टाइपो है। यह डॉट के बिना टाइपफ (विंडोज इंस्टालर) होना चाहिए। –

6

आप उपयोग करने की आवश्यकता:

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

यहाँ मेरी कोड में से कुछ से एक नमूना है - मेरे मामले में मैं संस्थापक संस्करण प्राप्त:

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

उपयोग के बिना समाधान है COM? – Kiquenet