Question

Après trop de nombreuses expériences, je suis venu à la conclusion que Windows Installer est tout simplement une mauvaise technologie. Mais les clients veulent des fichiers MSI.

Alors, comment puis-je créer un fichier MSI qui extrait un fichier EXE dans un répertoire temporaire et il fonctionne avec des options identiques ou similaires ont été transmis au fichier EXE?

Options pour un MSI sont expliqués dans Msiexec (options de ligne de commande ) ( "run" bas niveau d'un MSI est l'option msiexec package.msi).

EDIT: La solution de WiX mjmarsh ressemble à cela fonctionne. Je ne ai pas eu la chance d'essayer encore (temps de crise). Si cela fonctionne, je serai l'accepter.

EDIT: il ne fonctionne pas. pièce manquante:. assisté / sans surveillance ne semble pas être disponible

Quoi qu'il en soit, le seul à faire ce travail tout pour être l'action personnalisée pour tuer son processus parent!

EDIT: Donc, quelqu'un a posté une autre réponse envelopper la chose comme une action personnalisée post-installation. Théoriquement possible, mais étant donné qu'un redémarrage peut être nécessaire (merci MS pour .NET 4 nécessitant un redémarrage parfois) nous devons faire plus carriole. Donc, à partir de la matrice des avantages:

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.

Aucun point.

Était-ce utile?

La solution 4

Pas de solution. Nous sommes allés NSIS comme MSI entreprise d'installation va être brisé de toute façon en raison de problème d'imbrication MSI (juste essayer installer EXE emballage MSI à l'intérieur un jour MSI).

Autres conseils

Eh bien, il y a la voie libre et la façon $$$. Je ne peux pas documenter tout ici, mais cela ne devrait commencer.

Sur une note de côté, oui, Windows Installer est une technologie affolant. Il y a beaucoup de fois où je pense qu'une tâche sera simple, mais il devient en réalité compliquée. Vous avez certainement de vous immerger à comprendre.

Dans tous les cas, va ici:

Gratuit: WiX ( ici )

Ceci est un outil gratuit pour générer des fichiers MSI à partir d'un ensemble de fichiers de configuration XML. Je vous laisse trouver des tutoriels en ligne, mais voici le point crucial:

Vous pouvez compresser votre EXE dans le programme d'installation en utilisant la balise suivante dans le fichier WXS:

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

Ensuite, vous pouvez créer une action personnalisée qui lance votre fichier EXE:

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

Ensuite, vous insérez votre action personnalisée dans le InstallExecuteSequence à l'endroit approprié (je presque toujours la mienne courir quelque part entre et InstallInitialize InstallFinalize)

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

$$$: Get InstallShield ( ICI )

Tout d'abord créer un "Basic MSI" projet et assurez-vous que vous dites que vous voulez pas setup.exe généré . Vous définissez cela dans les paramètres de sortie.

Ensuite, vous faites essentiellement la même chose que Wix, mais vous avez une interface utilisateur pour cela.

  • Vous pouvez spécifier votre fichier EXE d'aide en utilisant l'éditeur de Direct et de mettre votre fichier EXE dans le tableau de la « binaire »
  • Vous pouvez créer une action personnalisée pour lancer ce fichier EXE à partir du nœud « Actions personnalisées » dans l'arborescence à gauche
  • Vous pouvez insérer l'action personnalisée en sélectionnant « Installer Sequences » et de le mettre dans le quelque part entre <=> et <=> comme je le disais <=> avant.

Désolé, je ne pouvais pas être plus détaillée, mais cela devrait être un bon point de départ.

Je pense que la meilleure façon de créer un fichier .msi est d'utiliser WiX .

Leçon 1 du tutoriel Wix est tout ce que vous devez créer un installation simple.

Joshua, je comprends votre frustration très bien. MSI est décalé pour le moins - une toute nouvelle façon de penser le déploiement. Pourtant, appliqué correctement MSI offre le meilleur déploiement possible, en particulier pour les clients de l'entreprise.

Quelles opérations ne fonctionne votre installateur EXE? Est-ce fichier en grande partie une copie, une inscription COM et certains registre écrit, ou faut-il exécuter la logique d'installation complexe, la mise en place des bases de données, etc ...? La raison pour laquelle je demande est parce que ce serait probablement très rapide de créer un WIX qui fonctionne bien MSI pour vous afin que vous puissiez abandonner l'approche EXE.

Il est en effet possible d'exécuter un fichier EXE à l'intérieur d'un MSI, mais il nécessite une bonne séquence, et il est garanti pour vous causer plus de blues qu'un simple MSI. Si l'application est petit, et ne pas faire quelque chose de fou lors de l'installation, je serais heureux de vous fournir une conversion de WIX de base.

Il y a aussi un version gratuite du Wrapper MSI . Il prend également en charge les mises à niveau et désinstaller. Il crée également une seule entrée dans la liste Ajouter ou supprimer des programmes.

Ajout de réponse weir's, changer comme ci-dessous la custom action attribute:

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

Réglage n'attend pas Return=asyncNoWai pour le retourner exe. Le programme d'installation ne fait son travail et se ferme normalement. Pendant ce temps, le son exécution CONTINU <=>.

-Madhuresh

Si vous ne souhaitez pas gérer MSI, mais seulement exécuter EXE, essayez Exe MSI Converter gratuit. Vous venez de mettre dans le chemin vers le fichier EXE et obtenir une MSI.

essayez ceci:

Dans le paquet MSI, il y a un appel de comportement « Lancer une application après l'installation », cela signifie que votre fichier exe sera exécuté après l'installation MSI (MSI est fermé).

Essayez d'exécuter votre exe là-bas, donc quand votre exe appeler d'autres paquets MSI, il ne sera pas en conflit avec la première.

Wix peut le faire. Voici mon exemple de code pour 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>

Je faisais le même problème (wrap EXE, appeler d'autres MSI de l'EXE, y compris l'installation de .net, etc.), et voici ma solution:

Je construis l'exe de configuration à l'aide InstallAware. Il a son propre Wrapper MSI qui enveloppe le fichier EXE généré avec MSI.

Il fonctionne bien, l'EXE peut appeler d'autres MSIs sans aucun problème (y compris la configuration de .net, d'autres configurations 3ème partie), mais parce que le lancement des fins MSI ( « revenus ») des droits après son lancement le fichier EXE de configuration, et de cette façon, ils évitent la limitation MSI des appels MSI récursive.

-. Certains clients (entreprises) qui utilise des outils de déploiement MSI, nécessite la MSI (de msiexec) pour revenir (fin) seulement après le processus d'installation se termine, et qui est un problème avec la solution ci-dessus

- pour résoudre ceci:

Il y a un autre Wrapper MSI (exemsi.com) qui génère MSI qui retourne seulement après la fin du programme d'installation EXE, mais pour l'utilisation que vous devez utiliser une autre option unique de InstallAware:

InstallAware a la possibilité de générer le programme d'installation EXE en utilisant leur propre moteur natif, et non basé sur le moteur Windows Installer, pour éviter la limitation récursive MSI. Combiner les deux, et vous avez la solution parfaite.

Espérons que cela aidera quelqu'un, bien que de nombreuses années se sont écoulées depuis cette question a été affichée.

truc simple:

l'image du projet

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

J'ai fait un outil .NET simple et gratuit pour créer MSI à partir exe ou un dossier (il utilise wixsharp et Wix) http://legacy.averbouch.biz/free-msi-wrapper

capture d'écran

Nah man, il suffit d'utiliser l'assistant de configuration Inno. Il fait un EXE d'installation, mais pas un MSI. Il est comme 5 minutes et vous aurez un installateur de fenêtres.

Il suffit télécharger , l'installer, pointez sur votre EXE, et suivez les invites à l'écran

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top