Remplacer les fichiers .dll pendant l'exécution de l'application?


18

J'ai plusieurs serveurs de jeux qui utilisent un certain fichier .dll pour fonctionner. Parfois, je dois mettre à jour les serveurs de jeux, mais je ne veux pas interrompre les jeux déjà en cours d'exécution.

Existe-t-il un moyen de remplacer le fichier .dll (il est verrouillé par Windows) afin que les prochaines instances des serveurs de jeux qui utilisent ce fichier ouvrent la nouvelle version, et les anciennes continuent d'utiliser l'ancienne version de ce fichier .dll jusqu'à ce qu'elles soient redémarrées ?

Est-il sûr de simplement déverrouiller le fichier à l'aide de l'un de ces outils qui le font et de le remplacer?


Peut-être pas votre jeu. Cependant Chrome ne mise à jour sans interrompre votre processus. Malheureusement, cela est spécifique à l'application. (Allez dans %LocalAppData%\Google\Chrome\Applicationet vous devriez voir des dossiers comme celui 26.0.1410.64qui stocke les DLL de différentes versions)
Alvin Wong

Selon le logiciel en question, il peut être possible d'installer et d'exécuter deux instances distinctes ou plus (à différents emplacements). Inefficace, mais peut-être réalisable.
Harry Johnston

Réponses:


23

En fait, vous pouvez et cela fonctionne généralement sans aucun problème (mais pas toujours)

Ce que vous faites, c'est renommer le fichier sans le déplacer et déplacer le nouveau fichier dessus. Cela gardera les descripteurs du fichier valides et fonctionnels afin que les instances préexistantes puissent toujours accéder correctement au fichier et que les nouvelles instances (ou les nouveaux descripteurs) accèdent au nouveau fichier.

De toute évidence, si un programme rouvre le même fichier dll et s'attend à ce qu'il reste exactement le même (par exemple, s'il y a des ressources à charger à partir de la dll et que les références à ces ressources sont extraites du code en cours d'exécution lorsque la dll est chargée ), cela posera problème, mais ce n'est certainement pas la norme.


11

Non. Même si une DLL peut être entièrement mappée dans la mémoire physique pendant l'exécution de l'application, il n'y a certainement aucune garantie à ce sujet. Des portions de DLL (et même d'exécutables) peuvent être mappées dans la RAM tandis que d'autres bits restent sur le disque et peuvent être lues ultérieurement.

Changer le fichier sur le disque alors que Windows en a des morceaux mappés dans la RAM ne se terminerait pas bien. Windows le verrouille pour une bonne raison.

Edit: Je dois clarifier quelque chose car certaines personnes semblent vouloir blâmer Windows pour ce qui est en fait un problème de conception d' application , pas un problème de conception de système d'exploitation.

Vous pouvez mettre à jour les DLL que les applications utilisent dans Windows sans terminer le processus, mais l'application doit avoir été écrite de manière à pouvoir signaler la décharge de l'assembly, attendre la fin de la mise à jour, puis recharger la DLL. Cela n'a rien à voir avec le système d'exploitation que vous utilisez. C'est un problème de conception d'application.

Modifier: Voir également la réponse de Stéphane pour une solution possible qui pourrait fonctionner, selon la façon dont votre application spécifique répond à son changement de DLL. Je pense qu'il mérite un vote positif.


Existe-t-il un moyen de déplacer ce fichier vers un emplacement temporaire afin qu'il puisse être supprimé plus tard, tout en en plaçant un nouveau à son ancien emplacement (afin que les serveurs qui démarrent après utiliseront la nouvelle DLL)? Ou le descripteur de fichier est-il lié à l'emplacement du fichier?

Cela dépend entièrement de la façon dont l'application est écrite / de la façon dont elle utilise les DLL. Jetez un œil à la réponse de Greg Askew. Si le descripteur de fichier est ouvert, vous ne pouvez pas faire grand-chose. Vous pouvez fermer de force le descripteur de fichier, mais vous planterez presque sûrement au moins votre application, si ce n'est l'ensemble du système d'exploitation.
Ryan Ries

Quelle est donc cette «bonne raison»? Jusqu'à présent, votre réponse ne contient pas de raison impérieuse pour laquelle Microsoft n'offre pas la possibilité de remplacement à chaud.
Konrad Rudolph

2

Non, vous ne devez pas bricoler avec les descripteurs de fichiers existants.

Si vous pouvez prendre le contrôle du chargement de l'assemblage et spécifier qu'il est ouvert avec FileShare.Delete, il devrait être possible de le renommer. Les processus existants continueront de référencer l'assembly renommé.

/programming/7147577/programmatically-rename-open-file-on-windows .


2
D'après mon expérience, dans la plupart des cas (enfin, plus de la moitié du temps, en tout cas), vous pouvez renommer (mais pas supprimer) une DLL sans bricoler l'application.
Harry Johnston

@HarryJohnston: Oui, il semble que je puisse renommer le .dll même s'il est en cours d'utilisation. Je suppose que je vais le faire à partir de maintenant.

1

Non, malheureusement ce n'est pas possible.

Désolé, pour être exact, sauf en cas de liaison tardive, ce qui signifie que l'application utilise cette DLL lorsqu'elle exécute une partie du code dans cette DLL, mais elle n'est toujours pas fiable.


1

Vous pouvez voir comment fonctionne le processus hébergé asp.net et développer quelque chose de similaire.

Il prend toute l'application Web et la déplace vers un emplacement temporaire à partir duquel l'application est réellement chargée. Ensuite, il laisse un processus pour surveiller les modifications dans le dossier d'origine, lorsqu'il est détecté, il crée une nouvelle instance de l'application dans un nouvel emplacement temporaire et commence à rediriger les nouvelles demandes vers cette application. L'ancienne application est ensuite supprimée une fois les demandes en attente terminées.

(Nitpicking, oui, c'est une vue simplifiée des choses, dans la plupart des cas, IIS met les demandes en file d'attente jusqu'à ce que la nouvelle application soit en mesure de prendre le relais)



0

NSIS Installer a une option comme Déplacer vers la température au redémarrage de la machine, le système d'exploitation marque certains fichiers pour les déplacer vers un autre emplacement au prochain démarrage, au prochain démarrage de la machine, ces fichiers marqués se déplacent automatiquement vers le nouvel emplacement que vous avez sélectionné précédemment. Une petite recherche à ce sujet vous fera plaisir à cet égard.


Vous pouvez fournir une réponse complète dans votre réponse au lieu de dire au PO de rechercher une solution. Il ne serait pas ici pour lui demander s'il avait déjà trouvé une solution. Merci.
John aka hot2use
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.