IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Windows Discussion :

MSI multi instance


Sujet :

Développement Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 70
    Points : 50
    Points
    50
    Par défaut MSI multi instance
    Bonjour,

    Mon entreprise a besoin de multi-instance pour un logiciel, et elle ne veut pas que j'utilise installShield. Du coup j'ai crée un MSI avec Visual Studio. Afin de faire du multi-instance, j'ai créé une petite application qui change le ProductPackage et le ProductCode afin de pouvoir lancer l'installation plusieurs fois.
    Lorsque j'installe une instance, je créé une clé de registre dans Software où je renseigne le Path et le ProductCode, ce qui me permet de gérer la désinstallation de mes instances. Mais le problème est là, et il est vraiment étrange.

    Lorsque j'installe une instance donc, j'écris les valeurs dans le registre via une custom action, et lorsque je désinstalle une instance, je les supprime dans la custom action Unistall()... seulement cela ne fonctionne que si j'ai une seule instance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public override void Uninstall(System.Collections.IDictionary savedState)
    {
    	MessageBox.Show(System.Reflection.Assembly.GetExecutingAssembly().Location);
     
    	CleanRegistry();   //Fonctionne tres bien
     
    	base.Uninstall(savedState);
    }
    Le problème est que si j'ai plusieurs instances installées, cette fonction n'est pas appelée. Elle n'est appelée que si je désinstalle la dernière instance. Pourtant les ProductCode et ProductPackage sont différents, et même en mettant un GUID différent en ProductName, j'ai toujours le même problème.

    En espérant avoir été assez clair,
    Merci de prendre le temps de me répondre si vous avez des idées

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 438
    Points
    4 438
    Par défaut plusieurs instances =une seule
    bonjour
    En fait tu as une seule instance d'application installe et les "autres instances" sont considerees comme des assemblys secondaires.
    Pour avoir des installations imbriquees de "plusieurs packages diferents" il vaut mieux utiliser ManifesteGenerator .
    1/prepare un msi setup different pour chaque "version"(en fait chez toi c'est le meme mais une instance differente par le productPackage et ProductCode d'apres ce que j'ai compris) de ton package.
    2/Avec ManifesteGenerator met tes differents "setups" sauf un dans ton repertoire "sdk" pre-requis.

    3/Dans le dernier (moins un) mets dans tes pre-requis les autres instances(ManifesteGenerator les feras apparaitre dans pre-requis).

    ManfesteGenerateur est le seul outils de Microsoft que j'ai vu qui permet de faire des installations imbriques de plusieurs projets MSI proprement et simplement.
    lien ManfesteGenerateur :
    http://code.msdn.microsoft.com/bmg
    Les classes Install ne le font pas parce que c'est du multi-process qui necessite de lancer plusieurs msiexec.exe en cascade .
    bon code....

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    Bonjour,

    Je te remercie pour ta réponse, mais ce n'est pas tout à fait la logique que nous employons. J'ai créé un exécutable qui vérifie dans le registre le nombre d'instances installées, et qui lance le MSI avec des paramètres en fonction. Le client ne doit avoir qu'un seul fichier d'installation, on ne sait pas combien d'instances il va installer. Cela dit, je vais essayer de regarder du côté des assembly...

    Merci à toi et bonne journée

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    J'ai trouvé la solution : les ComponentIDs de la table Component du MSI. Cela sépare complètement les instances et permet à ma fonction Uninstall d'être appelée à chaque fois

    Merci tout de même d'avoir pris le temps de m'aider.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonsoir,

    Je suis moi même intéressé par cette problématique.
    Le problème c'est que je débute avec les MSI.
    Serait'il possible que vous me détailler un peu plus comment vous avez fait pas à pas ?
    Merci d'avance

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    Bonjour,

    Lorsque l'on veut faire une installation multi-instance avec le setup de Visual Studio, il faut changer le ProductCode et le PackageCode. Afin de trouver ces valeurs, il faut comprendre que le .msi est composé de tables. Par exemple la table Property contient la valeur ProductCode.
    Pour visualiser les tables, on peut utiliser le logiciel Orca. Après je ne peux pas tout détailler ici, mais même si le multi-instance est tres peu expliquée, les concepts élémentaires du msi sont facilement accessibles via Google.
    L'information intéressante est qu'il existe des scripts vbs qui aident beaucoup afin de changer les productCode et packageCode : WiRunSQL.vbs et WiSumInf.vbs

    Le problème est qu'une fois qu'on a changé le productCode et le packageCode, Windows autorise bien l'installation de plusieurs instances, mais il existe toujours un lien entre ces mêmes instances. Pour couper le lien, il faut que les valeurs contenues dans la table Component, à savoir les ComponentId soient différents entre toutes les instances. En gros, pour pouvoir faire du vrai multi-instance et forcer Windows à considérer les installations comme indépendantes, il faut à chaque fois que l'on installe, changer le ProductCode, le PackageCode et les ComponentId.

    En espérant avoir été assez clair, il ne faut pas hésiter à me poser des questions, mais les informations contenues dans ce postes sont suffisantes je pense afin de pouvoir trouver la solution

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Jonas Multi Instance
    Par CKER dans le forum JOnAS
    Réponses: 4
    Dernier message: 05/12/2006, 10h58
  2. [eCommerce] Caddie multi instance
    Par lolodev dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 18/11/2006, 22h23
  3. [TOMCAT]Multi-instances
    Par Nikko95 dans le forum Apache
    Réponses: 5
    Dernier message: 10/08/2005, 15h16
  4. Multi-instance
    Par blackstreet dans le forum Informix
    Réponses: 3
    Dernier message: 06/06/2005, 10h41
  5. FireBird - Multi instances
    Par Thomad dans le forum Débuter
    Réponses: 9
    Dernier message: 07/05/2004, 12h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo