2009-03-16 16 views
5

Ho un file msi che installa un'applicazione. Devo conoscere il nome prodotto di tale applicazione prima dell' l'installazione ha inizio.Ottenere il nome del prodotto dal file msi in C#

ho provato la seguente:

{ 

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

ma ora? Il tipo è null, che mi genera un errore. E dove passo nel nome del file MSI?

Grazie per eventuali suggerimenti & commenti.

+0

alcun codice sorgente completo finale su di esso? – Kiquenet

risposta

1

Da dove viene la roba "Windows.Installer"?

... perché:

  1. Type.GetType prende un nome di tipo .NET, non un COM ProgId.
  2. Windows Installer (almeno su Windows 2003) non ha un ProgId.

In breve: utilizzare P/Invoke (DllImport, ecc.) Per comunicare con l'API MSI.

+0

Ottimo, non so esattamente cosa sia P/Invoke; Non sono riuscito a trovare un codice eseguibile sul web, sembra essere un segreto ben rispettato. Quindi potrebbe essere una soluzione, ma attualmente mi trovo più o meno alla fine con qualche DllImport. Ti prego di considerarmi un principiante in questa faccenda. –

2

Non sarebbe più facile da usare questo codice:

Type type = typeof(Windows.Installer);

Se si preferisce la Type.GetType (String) sovraccarico è necessario includere il nome corretto assemblaggio dopo il percorso completo della classe, ad esempio .:

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

+0

Grazie per la risposta. Non ho preferenze, sto solo su Google e spero di trovare un modo per risolvere il mio problema. Cosa intendi con "assembly for MsiInstaller"? Ho solo il file msi. Ma il metodo "typeof" sembra non funzionare, o (il programma di installazione non esiste). –

+1

Se "Windows.Installer" non è in mscorlib o nell'assembly attualmente in esecuzione, è necessario specificare il nome dell'assembly in Type.GetType (stringa). C'è un errore di battitura in typeof(). Dovrebbe essere typeof (WindowsInstaller) senza il punto. –

6

è necessario utilizzare:

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

Ecco un esempio da alcuni del mio codice - nel mio caso ho la versione di installazione:

 // 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'è soluzione senza usare COM? – Kiquenet

Problemi correlati