wininstall tutorial online msi convertir archivos advanced installer windows-installer msiexec

installer - tutorial - Cómo hacer una MSI que simplemente envuelve un archivo EXE



windows advanced installer (12)

Después de demasiados experimentos, llegué a la conclusión de que Windows Installer es simplemente una mala tecnología. Pero los clientes quieren archivos MSI.

Entonces, ¿cómo puedo crear un archivo MSI que extraiga un archivo EXE en un directorio temporal y lo ejecute con las mismas opciones o similares que se pasaron al archivo EXE?

Las opciones para una MSI se explican en Msiexec (opciones de línea de comando) (la "ejecución" de bajo nivel de una MSI es la opción msiexec package.msi).

EDITAR: la solución WiX de mjmarsh parece que funciona. Simplemente no he tenido la oportunidad de probarlo aún (hora de la verdad). Si funciona, lo aceptaré.

EDITAR: no funciona. Pieza faltante: asistida / desatendida no parece estar disponible.

De todos modos, ¡el único para hacer que esto funcione es que la acción personalizada mate el proceso principal!

EDITAR: Alguien publicó como una respuesta más que envuelve todo el asunto como una acción personalizada posterior a la instalación. Teóricamente es posible, pero dado que se puede requerir un reinicio (gracias a MS para .NET 4 que requiere un reinicio a veces) tenemos que hacer más hackers. Entonces, de la matriz de ventajas:

Transparency: No. One big custom action. Customizability: No. Standardization: No. Management and reporting: No. Appears to work but will not. Security: No benefit. Validation: No. The hackery required to survive reboot makes this sure to not work. Resiliency: Completely defeated. Rollback: No. Rollback didn''t work when we were using MSI anyway. Patching & Updates: No. We have a local solution anyway. Logging: No. Appears to work but will not.

No tiene sentido.


Agregando a weir''s respuesta weir''s Weir, cambie el custom action attribute como se muestra a continuación:

<!--Run Action--> <CustomAction Id="RunWrappedExe" Return="asyncNoWait" FileKey="ApplicationFileId" Execute="deferred" ExeCommand="" HideTarget="no" Impersonate="yes"/>

Configuración Return=asyncNoWai no espera a que el exe regrese. El instalador hace su trabajo y se cierra normalmente. Mientras tanto, el ejecutor continúa su ejecución.

-Madhuresh


Bueno, está la manera libre y la manera $$$. No puedo documentar todo aquí, pero esto debería ayudarte a comenzar.

En una nota lateral, sí, Windows Installer es una tecnología enloquecedora. Hay muchas ocasiones en las que creo que una tarea será sencilla, pero en realidad se vuelve complicada. Definitivamente tienes que sumergirte para entenderlo.

En cualquier caso, aquí va:

Gratis: WiX ( here )

Esta es una herramienta gratuita para generar archivos MSI a partir de un conjunto de archivos de configuración XML. Te dejaré para encontrar tutoriales en línea, pero aquí está el quid:

Puede comprimir su EXE en el instalador usando la siguiente etiqueta en el archivo WXS:

<Binary Id="MYEXE" src="<path to my exe?"/>

Luego puede crear una acción personalizada que inicie su archivo EXE:

<CustomAction Id="EXECA_CALLMYEXE" Return="check" Execute="deferred" BinaryKey="MYEXE" ExeCommand="my command line"/>

Luego inserta su acción personalizada en InstallExecuteSequence en el lugar apropiado (casi siempre ejecuto el mío en algún lugar entre InstallInitialize e InstallFinalize )

<InstallExecuteSequence> <Custom Action="EXECA_CALLMYEXE" After="InstallInitialize"><![CDATA[Not REMOVE]]></Custom>

$$$: Get InstallShield ( HERE )

Primero crea un proyecto "Basic MSI" y asegúrate de decir que no quieres que se genere setup.exe . Usted configura esto en la configuración de Liberación.

Entonces, básicamente haces lo mismo que con WiX, pero tienes una IU para ello.

  • Puede especificar su archivo EXE auxiliar utilizando el Editor directo y poniendo su archivo EXE en la tabla ''Binario''
  • Puede crear una acción personalizada para iniciar ese archivo EXE desde el nodo "Acciones personalizadas" en el árbol de la izquierda
  • Puede insertar la acción personalizada seleccionando "Instalar secuencias" y colocándolo en InstallExecuteSequence algún lugar entre InstallInitialize e InstallFinalize como dije antes.

Lo siento, no podría ser más detallado, pero este debería ser un buen comienzo.


Creo que la forma más fácil de crear un archivo .MSI es usar here .

La lección 1 del tutorial de WiX es todo lo que necesita para crear una instalación simple.


Estaba teniendo el mismo problema (wrap EXE, llame a otros MSI desde el EXE, incluida la configuración .net, etc.), y aquí está mi solución:

Construyo el setup exe usando InstallAware. Tiene su propio envoltorio de MSI que envuelve el EXE generado con MSI.

Funciona bien, el EXE puede llamar a otros MSI sin ningún problema (incluida la configuración de .NET, otras configuraciones de terceros), pero eso se debe a que el lanzamiento de MSI finaliza ("devuelve") los derechos después de que inicia el archivo EXE de instalación, y de esa manera evitan la limitación MSI de las llamadas MSI recursivas.

PERO: algunos clientes (empresas) que usan herramientas de implementación de MSI, requieren que el MSI (msiexec) regrese (finalice) solo después de que finaliza el proceso de configuración, y ese es un problema con la solución anterior.

Entonces, para resolver esto:

Hay otro MSI Wrapper (exemsi.com) que genera MSI que solo regresa después de que finaliza la instalación de EXE, pero para usarlo debe usar otra opción única de InstallAware:

InstallAware tiene la opción de generar la configuración de EXE utilizando su propio motor nativo, y no basado en el motor de Windows Installer, para evitar la limitación recursiva de MSI. Combina esos dos, y tienes la solución perfecta.

Espero que esto ayude a alguien, aunque pasaron muchos años desde que esta pregunta se publicó por primera vez.


Joshua, entiendo tu frustración muy bien. MSI es peculiar por decir lo menos, una forma completamente nueva de pensar en la implementación. Aún así, se aplica correctamente. MSI ofrece la mejor implementación posible, especialmente para clientes corporativos.

¿Qué operaciones realiza su instalador EXE? ¿Es en gran medida una copia de archivo, algún registro COM y algunas escrituras de registro, o ejecuta lógica de instalación compleja, configuración de bases de datos, etc.? La razón por la que pregunto es porque probablemente sea muy rápido crear un WIX MSI que funcione bien para que pueda abandonar el enfoque EXE.

De hecho, es posible ejecutar un EXE desde dentro de un MSI, pero requiere una secuencia adecuada, y se garantiza que le causará más blues que un simple MSI. Si la aplicación es pequeña y no hace nada loco durante la instalación, con gusto le proporcionaré una conversión WIX básica.


Nah hombre, solo usa el asistente de Inno Setup. Hace un EXE de instalación pero no un MSI. Son como 5 minutos y tendrás un instalador de Windows.

Simplemente download , instálelo, apúntelo a su EXE y siga las instrucciones en pantalla.


Si no desea administrar MSI, sino solo ejecutar EXE, intente Exe to MSI Converter Free . Usted acaba de poner en el camino al EXE y obtener un MSI.


Sin solución. Fuimos NSIS ya que la instalación corporativa de MSI se va a romper de todos modos debido al problema de anidamiento de MSI (simplemente intente instalar EXE envolviendo MSI desde dentro de MSI algún día).


También hay una versión gratuita de MSI Wrapper . También es compatible con la desinstalación y las actualizaciones. Además, solo crea una entrada en los programas Agregar o Quitar.


Truco simple:

Imagen del proyecto

using System; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.InteropServices; namespace Setup { internal class Program { [DllImport("kernel32.dll")] private static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll")] private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); private static void Main(string[] args) { ShowWindow(GetConsoleWindow(), 0); Stream st = Assembly.GetExecutingAssembly().GetManifestResourceStream("Setup.MSI.Temp.msi"); string path = Path.Combine(System.IO.Path.GetTempPath(), "Temp.msi"); using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write)) { st.CopyTo(fileStream); } Process p = new Process(); p.StartInfo.FileName = path; p.Start(); p.WaitForExit(); File.Delete(path); } } }


Wix puede hacerlo. Aquí está mi código de muestra para wix 3.5:

<?xml version=''1.0''?> <Wix xmlns=''http://schemas.microsoft.com/wix/2006/wi''> <Product Id=''*'' UpgradeCode="11111111-2222-3333-4444-555555555555" Name=''My Setup'' Language=''1033'' Version=''1.0.0.0'' Manufacturer=''Your company''> <Package Description=''pak'' InstallerVersion=''200'' Compressed=''yes'' /> <Media Id=''1'' Cabinet=''setup.cab'' EmbedCab=''yes'' /> <Directory Id=''TARGETDIR'' Name=''SourceDir''> <Directory Id="TempFolder"> <Directory Id="INSTALLLOCATION" Name="~_tmpdir"> <Component Id=''MyComponent'' DiskId=''1'' Guid=''''> <File Id="File0" Name="setup.exe" Source="setup.exe" /> <File Id="File1" Name="file1.txt" Source="file1.txt" /> </Component> </Directory> </Directory> </Directory> <Feature Id=''InstallFeature'' Title=''Install Feature'' Level=''1''> <ComponentRef Id=''MyComponent'' /> </Feature> <!-- Run Action --> <CustomAction Id="RunWrapExe" Return="ignore" Execute="deferred" FileKey="File0" ExeCommand="setup.exe param here" HideTarget="no" Impersonate="no" /> <InstallExecuteSequence> <Custom Action="RunWrapExe" After="InstallFiles">NOT REMOVE~="ALL"</Custom> </InstallExecuteSequence> </Product> </Wix>


prueba esto:

En el paquete MSI, hay una llamada de comportamiento "Iniciar una aplicación después de la instalación", lo que significa que su archivo exe se ejecutará después de la instalación de MSI (el MSI está cerrado).

Intenta ejecutar allí tu exe, de modo que cuando tu exe invoque otros paquetes MSI, no entre en conflicto con el primero.