2010-09-07 13 views
0

J'ai un programme d'installation MSI qui installe le produit et ce produit contient plusieurs DLL d'API largement utilisées. Ces dll peuvent être chargés dans des processus que je ne peux pas contrôler pendant la mise à niveau (par exemple, je ne peux pas demander à l'utilisateur de fermer explorer.exe ou svchost). Ainsi, lors de la mise à niveau MSI, ces DLL sont verrouillées et ne peuvent pas être mises à niveau sans redémarrage. Je dois le rendre évolutif sans redémarrer. Ces DLL d'API sont très stables et il est acceptable de laisser les anciennes copies fonctionner dans les anciens processus lorsque les nouvelles versions de ces DLL seront chargées dans les nouveaux processus en cours d'exécution. Ainsi, quand nous n'avons pas utilisé MSI, nous avons simplement utilisé le fichier trick - renommer standard, le marquer pour le supprimer au redémarrage, écrire un nouveau fichier.Comment indiquer à MSI de mettre à niveau les DLL verrouillées et d'éviter les redémarrages

Quelle est la meilleure façon de le faire dans MSI? Dois-je créer une action personnalisée qui fera l'affaire standard? Ou peut-être MSI a une meilleure façon de le faire?

Merci!

Répondre

1

Les processus sont "verrouillés" car ils sont en cours d'utilisation et vous ne pouvez pas modifier un fichier exécutable pendant son exécution; il n'y a pas de "déverrouillage" mais pour arrêter d'utiliser le fichier. Donc soit vous tuez les processus maintenant, soit vous utilisez la clé PendingFileRename pour changer le fichier après un redémarrage ...

Vous pourriez peut-être essayer de tuer les poignées/threads que explorer.exe et al doivent contenir sur vos DLL (en utilisant une action personnalisée), ce qui pourrait fonctionner pendant une minute ... mais cela garantirait que (a) vos DLL nouvellement mises à jour ne fonctionneront pas après un redémarrage, et (b) vous avez probablement rendu l'ordinateur de l'utilisateur instable et Explorer pourrait tomber en panne à tout moment. D'une manière ou d'une autre, les utilisateurs finaux ne seraient pas satisfaits de votre logiciel ... pire que ce qu'ils seraient contrariés d'avoir à redémarrer.

+1

Ce n'est pas tout à fait vrai. Comme je l'ai dit dans le premier post, je peux laisser mon vieux dll chargé dans les vieux processus. Et seuls les nouveaux utiliseront une nouvelle DLL. – Oleg

+0

Vous voulez dire que les nouvelles DLL utilisent un nouveau nom et de nouveaux hooks? Hmm ... – ewall