2013-05-16 3 views
2

J'ai deux MSI; framework.msi et product.msi. Le framework.msi installe des DLL dans le GAC dont dépend le product.msi pour l'installation et la désinstallation.La mise à niveau de gravure Wix doit désinstaller les deux MSI avant la mise à niveau

J'ai créé un BA qui enchaîne les deux MSI ensemble.

<Bundle ...> 
    <Chain> 
    <PackageGroupRef Id='framework'/> 
    <PackageGroupRef Id='product'/> 
    </Chain> 
</Bundle> 
<Fragment> 
    <PackageGroup Id="framework"> 
    <MsiPackage Name="Product Framework" 
       ForcePerMachine="yes" 
       SourceFile="framework.msi" 
       Vital="yes" 
       Cache="no" 
       Permanent="no" 
       Compressed="yes" 
       Visible="yes"/> 
    </PackageGroup> 
    <PackageGroup Id="product"> 
    <MsiPackage Name="Product" 
       ForcePerMachine="yes" 
       SourceFile="product.msi" 
       Vital="yes" 
       Cache="no" 
       Permanent="no" 
       Compressed="yes" 
       Visible="yes"/> 
    </PackageGroup> 
</Fragment> 

Pour les nouvelles installations, mon framework.msi et product.msi installer correctement. Quand je vais mettre à niveau vers une nouvelle version, il met à jour le framework.msi avec succès. Ensuite, il désinstalle le product.msi mais échoue (pour cette erreur: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IO.FileNotFoundException: Could not load file or assembly 'CheckInstaller, Version=1.0.0.0' or one of its dependencies. The system cannot find the file specified.) car la désinstallation CustomAction fait référence à une version d'un assembly (CheckInstaller) qui n'est plus dans le GAC (car elle a été mise à niveau dans le cadre de la mise à niveau framework.msi) .

Sans avoir à écrire un BA personnalisé, je veux être en mesure de faire quelque chose comme ceci:

// pseudo code 
if(product.Exists() && framework.Exists()) 
{ 
    product.Uninstall(); // product is dependent on the framework 
    framework.Uninstall(); 
} 
framework.Install(); 
product.Install(); 

Je sais que cela serait possible que si nous devions combiner de deux MSI dans un grand produit, mais depuis nous dispersons le framework.msi à d'autres équipes et pour diverses autres raisons, ils doivent être conservés séparément.

Est ce que je veux faire même possible avec le bootstrappeur WiX?

Répondre

3

Ce n'est pas possible avec Burn aujourd'hui. La chaîne est fixe. Lors de l'installation, il est exécuté en avant, lors de la désinstallation, il est exécuté en arrière. Je peux penser à deux options disponibles aujourd'hui:

  1. Ne pas avoir mise à niveau de la MSI entre eux et laissez l'ancien MSIs être supprimé lorsque le nouveau Bundle désinstalle l'ancien Bundle. Évitez de créer des dépendances de temps d'installation entre les packages. C'est généralement une bonne chose à faire de toute façon.

Une demande de fonctionnalité pourrait être d'avoir le nouveau Bundle ont la possibilité de supprimer l'ancien Bundle avant installer au lieu de après comme aujourd'hui, mais non pris en charge à ce moment .

Questions connexes