2009-03-16 22 views
5

Tengo un archivo msi que instala una aplicación. Necesito saber el nombre del producto de esa aplicación antes de se inicia la instalación.Obtener el nombre del producto del archivo msi en C#

He intentado lo siguiente:

{ 

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

pero ahora? Tipo es nulo, lo que me arroja un error. ¿Y dónde paso el nombre del archivo MSI?

Gracias por cualquier sugerencia & comentarios.

+0

cualquier código fuente completo definitiva al respecto? – Kiquenet

Respuesta

1

¿De dónde sacaste el material "Windows.Installer"?

... porque:

  1. Type.GetType toma un nombre de tipo .NET, no un ProgId COM.
  2. Windows Installer (al menos en Windows 2003) no tiene un ProgId.

En resumen: use P/Invoke (DllImport, etc.) para hablar con la API de MSI.

+0

Genial, no sé exactamente qué es P/Invoke; No logré encontrar un código que se pueda ejecutar en la web, parece ser un secreto muy respetado. Entonces podría ser una solución, pero actualmente termino más o menos con DllImport. Por favor, míreme como un novato en este asunto. –

2

¿No sería más fácil de utilizar este código:

Type type = typeof(Windows.Installer);

Si prefiere el Type.GetType (cadena) de sobrecarga debe incluir el nombre correcto montaje después de ruta completa a la clase, por ejemplo .:

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

+0

Gracias por su respuesta. No tengo preferencias, solo busco en la red y espero encontrar alguna forma de resolver mi problema. ¿Qué quiere decir con "assembly for MsiInstaller"? Solo tengo el archivo msi. Pero el método "typeof" parece no funcionar, tampoco (type Installer no existe). –

+1

Si el "Windows.Installer" no está en mscorlib o en el ensamblado que se está ejecutando actualmente, debe especificar el nombre del ensamblado en Type.GetType (cadena). Hay un error tipográfico en typeof(). Debe ser typeof (WindowsInstaller) sin el punto. –

6

Es necesario utilizar:

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

Aquí es una muestra de algunos de mi código - en mi caso tengo la versión del instalador:

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

¿hay solución sin uso COM? – Kiquenet

Cuestiones relacionadas