Pregunta

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 a un directorio temporal y lo ejecute con opciones iguales o similares a las que se pasaron al archivo EXE?

Las opciones para un MSI se explican en Msiexec (opciones de línea de comandos) (La "ejecución" de bajo nivel de un 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 todavía (hora decisiva).Si funciona, lo aceptaré.

EDITAR:No funciona.Pieza perdida:atendido/desatendido no parece estar disponible.

De todos modos, ¡lo único que haría que esto funcionara sería que la acción personalizada elimine su proceso principal!

EDITAR:Entonces, alguien publicó una respuesta adicional que envuelve todo como una acción personalizada posterior a la instalación.Teóricamente es posible, pero dado que es posible que sea necesario reiniciar (gracias a MS por .NET 4 que a veces requiere un reinicio), tenemos que realizar más piratería.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.

¿Fue útil?

Solución 4

No hay solución. Fuimos NSIS como MSI corporativa instalación va a ser roto todos modos debido a la MSI problema de anidación (justo intente instalar EXE envolver MSI MSI desde el interior de un día).

Otros consejos

Bueno, existe la forma gratuita y la forma $$$.No puedo documentar todo aquí, pero esto debería ayudarte a comenzar.

Por cierto, sí, Windows Installer es una tecnología exasperante.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, ahí va:

Gratis:WiX (aquí)

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

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

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

Luego puedes crear una acción personalizada que inicie tu archivo EXE:

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

Luego insertas tu acción personalizada en el InstallExecuteSequence en el lugar apropiado (casi siempre coloco el mío en algún lugar entre InstallInitialize y InstallFinalize)

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

$$$:Obtenga InstallShield (AQUÍ)

Primero cree un proyecto "MSI básico" y asegúrese de decir que desea no se genera setup.exe.Esto lo configuras en la configuración de lanzamiento.

Luego, básicamente haces lo mismo que con WiX, pero tienes una interfaz de usuario para ello.

  • Puede especificar su archivo EXE auxiliar utilizando el Editor directo y colocando 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ándola en el InstallExecuteSequence en algún lugar entre InstallInitialize y 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 WiX .

Lección 1 desde el tutorial WiX es todo lo que necesita para crear una instalación sencilla.

Joshua, entiendo su frustración muy bien. MSI es peculiar por decir lo menos - una nueva forma de pensar en la implementación. Aún así, la correcta aplicación de MSI ofrece la mejor implementación posible, especialmente para los clientes corporativos.

¿Qué operaciones no realizar su instalación EXE? Es que gran parte de copia de archivos, algunos de registro COM y algún registro escribe, o se ejecuta la lógica compleja instalación, la creación de bases de datos, etc ...? La razón que pido es porque probablemente sería muy rápido para crear un buen funcionamiento WIX MSI para usted para que pueda abandonar el enfoque EXE.

De hecho, es posible ejecutar un archivo EXE desde el interior de un MSI, pero requiere una secuencia adecuada, y está garantizado para hacer que el blues más que un simple MSI. Si la aplicación es pequeña, y no hacer nada loco durante la instalación, yo sería feliz para ofrecerle una conversión básica WIX.

También hay un versión libre de la MSI Envoltura . También es compatible con desinstale y actualizaciones. Además, sólo crea una entrada en los programas de Agregar o quitar.

Adición a weir's respuesta, cambiar el custom action attribute, como 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 volver. El instalador hace su trabajo y cierra normalmente. Mientras tanto, el <=> continua su ejecución.

-Madhuresh

Si no desea administrar MSI, pero sólo ejecutar EXE, intente Exe a MSI convertidor . Usted acaba de poner en el camino hacia el EXE y obtener un MSI.

intente lo siguiente:

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

Trate de ejecutar su exe allí, así que cuando su exe invocar otros paquetes MSI, no entrará en conflicto con la primera.

Wix puede hacerlo. Aquí está mi código de ejemplo 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>

Yo estaba teniendo el mismo problema (EXE envoltura, llamar a otra MSI de la EXE incluyendo la configuración de .NET, etc.), y aquí está mi solución:

construyo el exe de instalación utilizando InstallAware. Tiene su propia envoltura de MSI que envuelve el EXE generado con MSI.

Funciona bien, el EXE puede llamar a otros MSI sin ningún problema (incluida la instalación de .NET, otras configuraciones de 3 ª parte), pero eso se debe a que los extremos de lanzamiento de MSI ( "retornos") los derechos después de que se inicia el archivo EXE de instalación, y de esa manera evitan la limitación de MSI MSI llama recursiva.

PERO -. Algunos clientes (empresas) que utiliza herramientas de implementación de MSI, requiere el MSI (msiexec) para volver (fin) sólo después de que termine el proceso de instalación, y que es un problema con la solución anterior

Por lo tanto - para resolver esto:

Hay otro MSI Paquete de oferta (exemsi.com) que genera MSI que devuelve sólo después de que termine la instalación EXE, pero para el uso que debe utilizar otra opción única de InstallAware:

InstallAware tiene la opción de generar la configuración EXE con su propio motor nativo, y no se basa en el motor de Windows Installer, para evitar MSI limitación recursiva. Combinar los dos, y usted tiene la solución perfecta.

Espero que esto ayude a alguien, aunque pasaron muchos años desde que esta pregunta fue publicada por primera vez.

truco simple:

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);
        }
    }
}

Hice una herramienta .NET simple y libre de crear MSI desde exe o carpeta (se trata de utilizar wixsharp y Wix) http://legacy.averbouch.biz/free-msi-wrapper

pantalla

nah hombre, sólo tiene que utilizar asistente de Inno Setup. Esto hace que un archivo EXE de instalación pero no un MSI. Es como 5 minutos y usted tendrá un instalador de ventanas.

descargar , instalarlo, apunte con él a su EXE, y seguir el indicaciones en pantalla

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top