Digamos, si tengo un archivo de instalación MSI, ¿puedo extraer su contenido de un programa C# o C++ sin instalarlo?¿Puedo extraer el contenido del paquete MSI desde el programa C++ o C#?
Respuesta
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();
}
}
}
}
Un archivo MSI es COM structured storage. Básicamente es una base de datos. Puede encontrar alguna documentación detallada en MSDN:
Gracias. Aunque para mí todo es bastante abrumador ... ¿Algún enlace a un código C# que pueda hacer la extracción? – c00000fd
@ user843732, revisa [este proyecto] (http://code.google.com/p/lessmsi/) – SingerOfTheFall
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. –
- 1. ¿Cómo extraer ProductCode del paquete msi?
- 2. MSI no se ejecuta desde C#
- 3. Desinstalación del paquete WIX MSI
- 4. Llamar LLVM Jit desde el programa c
- 5. Produzca video desde el programa OpenGL C
- 6. Ejecutando el paquete SSIS desde C#
- 7. Invocando el depurador desde un programa C
- 8. Obtener el nombre del producto del archivo msi en C#
- 9. ¿Cómo controlo el contenido del portapapeles en C#?
- 10. ¿Cómo puedo imprimir el contenido de la pila en el programa C?
- 11. Odd 'Nombre del programa' al instalar el instalador msi firmado
- 12. Instalación silenciosa de un paquete MSI
- 13. Llamar C++ (C) desde el lenguaje D
- 14. cómo extraer el contenido del texto con formato PDF
- 15. ¿Nodejs se comunica con el programa C++?
- 16. VBScript no se ejecutará correctamente desde el archivo MSI
- 17. cambiando el directorio desde dentro de un programa c en windows usando el comando del sistema
- 18. Llamar línea de comando desde el programa C
- 19. Error 0x80070643: Error al instalar el paquete MSI
- 20. Ejecutar MSI x86 o x64 desde MSBuild bootstrapper
- 21. extraer el archivo de especificación del paquete rpm
- 22. Cómo ejecutar un script bash desde el programa C++
- 23. Ejecute el programa C# .NET desde la red compartida
- 24. doble liberación o corrupción de error en el programa c
- 25. ¿Cómo puedo llamar a notepad.exe desde un programa C?
- 26. ¿Cómo ejecutar un programa Java desde C#?
- 27. versión de tira desde el nombre del paquete usando Bash
- 28. ¿Enviar el paquete SYN en C#?
- 29. Recursos para aprender el diseño del programa C
- 30. ¿Cómo puedo terminar ncurses sin finalizar el programa C++?
Gracias y disculpas por este retraso. ¿Es curioso si está disponible en una aplicación web ASP.NET? – c00000fd
No veo por qué no. –
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