web-dev-qa-db-fra.com

Remplacer les fichiers .dll pendant que l'application est en cours d'exécution?

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

Existe-t-il un moyen de remplacer le fichier .dll (il est verrouillé par Windows) afin que les prochaines instances des serveurs de jeu 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?

19
user54048

En fait, vous pouvez et cela généralement fonctionne 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.

24
Stephane

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

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

Edit: J'ai besoin de clarifier quelque chose car certaines personnes semblent vouloir blâmer Windows pour ce qui est en fait un problème de conception application, pas un problème de conception du 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.

Edit: Voir également la réponse de Stéphane pour une solution possible qui pourrait fonctionner, en fonction de la façon dont votre application spécifique répond à sa DLL modification. I pense qu'il mérite un vote positif.

12
Ryan Ries

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

Si vous pouvez prendre le contrôle du chargement de l'assembly 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é.

https://stackoverflow.com/questions/7147577/programmatically-rename-open-file-on-windows .

2
Greg Askew

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
Danila Ladner

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 fait tourner 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)

1
Thomas James

Il y a une dizaine d'années, j'étais un utilisateur heureux de http://www.eggcentric.com/ISAPILoader.htm qui était en ligne IIS échange de DLL ISAPI. Mr Egg soutient toujours sa solution FOSS.

0
jkellydresser

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.

0
Shashank Kandhawe