2010-10-07 25 views
1

J'ai créé un projet d'installation WiX basé sur l'article WiX 3 Tutorial: Understanding main WXS and WXI file principalement parce qu'il donne au WiX le besoin d'effectuer une fermeture d'application.WiX CloseApplication pour exe et dll

Cependant, je suis intrigué par le résultat. Voici la situation:

Nous avons un exécutable qui utilise une DLL et crée une configuration qui installe l'exécutable et la DLL. Nous exécutons la configuration.

CASE 1: Ensuite, nous changeons l'exécutable et PAS la DLL et créons à nouveau l'installation. Ensuite, nous commençons l'application installée et nous assurons que la DLL est chargée. Si nous exécutons maintenant la deuxième configuration, une boîte de dialogue s'affiche demandant à l'utilisateur d'arrêter l'exécutable comme prévu.

CASE 2: Mais si nous ne modifions pas l'application, mais uniquement la DLL, puis que nous exécutons la configuration pendant que l'application est en cours d'exécution et que la DLL est chargée, aucune boîte de dialogue ne s'affiche. À la fin de l'installation, une boîte de dialogue apparaît demandant si nous voulons redémarrer l'ordinateur.

Est-ce que ce comportement est attendu et comment puis-je forcer la boîte de dialogue d'arrêt d'application de CASE 1 également lorsque seule une DLL est modifiée comme dans CASE 2? Je ne veux pas que l'utilisateur doive redémarrer l'ordinateur car l'application s'exécute sur un serveur qui ne peut pas être redémarré.

Répondre

0

Tout cela est déterminé par Windows Installer au cours du processus d'établissement des coûts. L'installateur décide quels fichiers doivent être installés/mis à jour et calcule la quantité d'espace disque nécessaire et s'il y a des verrous de fichiers. S'il existe des verrous de fichiers, il tente de résoudre le verrou à un processus avec un handle de fenêtre. S'il peut le faire, vous obtiendrez le dialogue. Si ce n'est pas le cas, vous ne le ferez pas. Cela ne signifie pas qu'un redémarrage ne sera pas nécessaire, il ne peut simplement pas vous donner des informations utiles sur la façon de l'éviter.

Quelques points supplémentaires:

Assurez-vous que vous versionner vos EXE et DLL. Si l'ancienne DLL est 1.0.0.0 et que la nouvelle DLL est 1.0.0.0 costing dira "Nothing to do here".

Comment le fichier EXE utilise la DLL lors de l'exécution? Il pourrait simplement ne pas avoir de verrou pendant toute la durée du processus.

Comprendre que le comportement de redémarrage de MSI peut être modifiée par l'utilisation de propriétés telles que REBOOT = ReallySuppress

Voici quelques bons articles à lire:

InstallValidate FileInUseDialog System Reboots

0

Je n'ai pas J'ai vérifié le code mais je pense que ce qui se passe est que l'action CloseApplication n'est pas en cours d'exécution car elle voit que l'exe n'a pas changé. Autant que je sache, vous ne pouvez pas cibler une DLL avec CloseApplication. Si vous lancez votre installation avec la journalisation, vous devriez être en mesure de voir si l'action est déclenchée. Je suppose que vous avez la programmation RemoveExistingProducts tard dans l'installation, si vous deviez le déplacer après InstallValidate, il supprimerait l'exe à chaque fois et donc déclencherait l'action.