2012-09-19 9 views

Respuesta

7

Normalmente puede ejecutar Administrative installation para extraer el contenido de una MSI.

msiexec /a foo.msi TARGETDIR=C:\EXTRACTHERE /qn 

Si no quiere salir del proceso puede INTEROP directamente con MSI a través de la MsiInstallProduct function.

szPackagePath [in] Cadena terminada en nulo que especifica la ruta a la ubicación del paquete de Windows Installer. El valor de cadena puede contener una URL, una ruta de red, una ruta de archivo (por ejemplo, file: //packageLocation/package.msi) o una ruta local (por ejemplo, D: \ packageLocation \ package.msi).

szCommandLine [in] Cadena terminada en nulo que especifica la configuración de propiedad de la línea de comando. Esta debería ser una lista del formato Propiedad = Configuración Propiedad = Configuración. Para obtener más información, consulte Acerca de las propiedades.

Para realizar una instalación administrativa, incluya ACTION = ADMIN en szCommandLine. Para obtener más información, vea la propiedad ACTION.

Tenga en cuenta que si bien puede declarar la P/Invoke usted mismo, hay una buena biblioteca de interoperabilidad .NET disponible con Windows Instaler XML llamada Deployment Tools Foundation (DTF). El espacio de nombres Microsoft.Deployment.WindowsInstaller tiene un método de clase llamado Installer que expone un método estático llamado InstallProduct. Esta es una encapsulación directa de MsiInstallProduct.

El uso de las bibliotecas DTF le oculta la fealdad en la API de Win32 e implementa IDisposable correctamente donde sea necesario para garantizar que los identificadores subyacentes no administrados se liberen cuando sea necesario.

Además, DTF tiene el espacio de nombres Microsoft.DeploymentWindowwsInstaller.Package con la clase InstallPackage. Esta clase expone un método llamado ExtractFiles() que extrae los archivos al directorio de trabajo. Un ejemplo de código se ve así:

using Microsoft.Deployment.WindowsInstaller; 
using Microsoft.Deployment.WindowsInstaller.Package; 
namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using(var package = new InstallPackage(@"C:\test.msi", DatabaseOpenMode.ReadOnly)) 
      { 
       package.ExtractFiles(); 
      } 
     } 
    } 
} 
+0

Gracias y disculpas por este retraso. ¿Es curioso si está disponible en una aplicación web ASP.NET? – c00000fd

+0

No veo por qué no. –

+0

Lo siento, si estoy preguntando algo muy simple. Cuando incluyo sus dos líneas de "uso" obtengo esto: "error CS0234: el tipo o nombre del espacio de nombres 'Despliegue' no existe en el espacio de nombres 'Microsoft' (¿falta una referencia de ensamblado?)" – c00000fd

4

Un archivo MSI es COM structured storage. Básicamente es una base de datos. Puede encontrar alguna documentación detallada en MSDN:

  • Here es la API de base de datos
  • Here se puede encontrar algo de información acerca de un formato de archivo binario compuesto
  • Here es el documento acerca de Windows Installer
+0

Gracias. Aunque para mí todo es bastante abrumador ... ¿Algún enlace a un código C# que pueda hacer la extracción? – c00000fd

+1

@ user843732, revisa [este proyecto] (http://code.google.com/p/lessmsi/) – SingerOfTheFall

+2

Solo quiere saber cómo extraer los contenidos. Hay API para eso. Él no necesita entender la estructura de la base de datos a nivel binario. –

Cuestiones relacionadas