2008-10-22 8 views
11

Je voudrais mettre à jour une DLL pour un processus de serveur sans arrêter le service. Comment je fais ça? Un peu comme asp.net récupère automatiquement les nouvelles DLL placées dans le dossier bin.Mettre à jour une DLL sans arrêter le service

+0

Dans quel environnement/langue votre service est-il écrit? Il y a une énorme différence entre Win32 et .NET quand il s'agit d'une solution à ce problème ... – mdb

+0

c'est une application .net. – Matt

+0

Notez que même si asp.net semble continuer à fonctionner, l'activité de l'utilisateur peut toujours être interrompue et entraîner une perte de travail lorsque de nouvelles DLL sont placées dans le dossier bin. – StingyJack

Répondre

21

Asp.Net utilise une technique appelée shadow copy

Si vous copiez un dll mis à jour dans le sous-répertoire bin d'une application, le runtime ASP.NET reconnaît qu'il existe un nouveau code à exécuter. Étant donné que ASP.NET ne peut pas échanger la DLL dans l'AppDomain existant, il démarre un nouveau AppDomain. L'ancien domaine d'application est "drain arrêté", c'est-à-dire que les requêtes existantes sont autorisées à terminer l'exécution, et une fois qu'elles sont toutes terminées, AppDomain peut se décharger. Le nouveau AppDomain commence avec le nouveau code et commence à prendre toutes les nouvelles demandes.

En règle générale, quand une DLL charge dans un processus, le processus verrouille la DLL et vous ne pouvez pas écraser le fichier sur le disque. Toutefois, AppDomains dispose d'une fonctionnalité connue sous le nom de Cliché instantané qui permet aux assemblages de rester déverrouillés et remplaçables sur le disque.

Le moteur d'exécution initialise ASP.NET avec Shadow Copy activé pour le répertoire bin. L'AppDomain copiera toute DLL dont il a besoin depuis le répertoire bin vers un emplacement temporaire avant de verrouiller et de charger la DLL dans la mémoire. Shadow Copy nous permet d'écraser toute DLL dans le répertoire bin lors d'une mise à jour sans mettre l'application web hors ligne.

+0

Jetez un oeil à l'épisode # 5 de Hibernating Rhinos: http://ayende.com/hibernating-rhinos.aspx – asgerhallas

+0

Les podcasts des rhinocéros hibernants ont été déplacés.Voir ce post de Ayende décrivant leur nouvel emplacement à partir de mai 2011: http://ayende.com/blog/4838/hibernating-rhinos-webcasts –

2

En plus de la réponse de Gulzar:

Si votre service est tout simplement directement référence à vous de la DLL aurez besoin de redessiner le service un peu à utiliser AppDomains et les capacités de ShadowCopy pour profiter de cette fonctionnalité.

Nous faisons quelque chose comme ceci où le service est juste un processus shell/hôte. Toutes les fonctionnalités sont chargées dans des domaines d'application distincts en tant que de besoin.

http://blogs.msdn.com/junfeng/archive/2004/02/09/69919.aspx

-2

Lorsqu'un processus a chargé une dll, il est impossible de le changer. IIS ne conserve pas de DLL chargée en mémoire lorsqu'il n'est pas utilisé (affected by the Cache property) et je suppose que c'est le cas avec ASP.NET. Si vous suivez la même stratégie, vous pouvez également mettre vos dll à jour. Cependant, si vos DLL sont utilisées, vous devriez avoir un moyen de dire à votre processus serveur de décharger toutes vos DLL. Pour cela, le processus serveur doit charger toutes les DLL en utilisant les appels LoadLibrary de sorte qu'il puisse les décharger lorsqu'il reçoit une communication lui demandant de le faire.

La communication avec le processus serveur peut être effectuée en créant un événement nommé disponible dans le monde entier auquel le nouveau programme peut accéder et qui sert à indiquer au processus en cours qu'une mise à jour est sur le point de se produire. (Vous pourriez également penser à d'autres variations de faire ceci).

Questions connexes