3 votes

Les serveurs Windows (2008) mettent-ils en cache les assemblages .net d'une manière ou d'une autre ?

Un de mes collègues de travail a le problème suivant (certains détails pertinents peuvent nécessiter un examen plus approfondi) :

Le serveur est Windows 2008 Server. Un service Windows est en cours d'exécution (exe (.net), qui utilise également un assemblage .NET). Il y a un bogue avec la dll et/ou l'exe. Certains messages de débogage ont été ajoutés et supprimés de la dll. Cette nouvelle version de la dll et son exe recompilé ont été envoyés par ftp sur ce serveur, le service a été arrêté, la dll et l'exe existants ont été renommés et remplacés par les nouveaux, et le service a démarré.

Nous voyons toujours les messages de débogage qui ont été supprimés de la dll. Ils n'existent pas dans le nouveau code.

Le serveur a été redémarré.

L'ancienne dll est-elle mise en cache quelque part ? d'une manière ou d'une autre ? Merci.


UPDATE

Ce qui suit vient d'arriver :

  1. le fichier assembly.old récemment renommé a été physiquement supprimé (c'était la seule et unique copie).
  2. Les anciens messages de débogage sont toujours là !
  3. service désinstallé/réinstallé (mais nous pensons que nous aurions pu nous en sortir avec un redémarrage)
  4. travaux.

Donc, sachant ce qui s'est passé avant (ce qui incluait un redémarrage du système d'exploitation), et ce qui s'est passé maintenant, d'une manière ou d'une autre Windows suit les dll( ?) et quand la copie a été renommée, Windows défie la mise à jour et associe (dans son esprit) que assembly.old sera assembly.dll. Et non le nouveau assembly.dll qui a été mis à sa place ?

Parce que assembly.dll et assembly.old sont dans le même répertoire, après le redémarrage du système d'exploitation, l'ancienne dll est continuellement regardée. assembly.dll et pas assembly.old fonctionnent.

Ce qui me déconcerte, c'est comment on contrôle ça ? Ou bien où se trouve la documentation à ce sujet ?

Autres informations : Version 64 bits du serveur. UNE VM.

3voto

Thecamelcoder Points 11

Cela peut être dû à la façon dont .NET localise les assemblages, documentée ici :

Comment le moteur d'exécution .NET localise les assemblages
http://msdn.microsoft.com/en-us/library/yx7xezcf%28v=VS.100%29.aspx

Notez ce qui suit :

" Le compilateur enregistre les références statiques dans les métadonnées du manifeste de l'assemblage au moment de la construction. Les références dynamiques sont construites à la volée à la suite de l'appel de diverses méthodes, telles que System.Reflection.Assembly.Load."

Si votre référence est statique, vous pouvez examiner les métadonnées de l'assemblage en cours d'exécution pour trouver le manifeste. Le manifeste peut être examiné en utilisant ILDASM ou un autre outil tel que ILSpy. Si elle est dynamique, le processus de localisation est complexe et sophistiqué.

D'après mon expérience, si plusieurs versions du CLR existent (par exemple, à la fois 2.0 et 4.0), le résultat peut être inattendu. Il existe plusieurs facteurs supplémentaires, tels que :

  • configuration de la machine et configuration de l'application ;
  • si l'application est entièrement constituée de code géré, ou si elle comporte du code non géré (COM/Interop) ;
  • si l'assemblage exécutant/appelant et les assemblages appelés sont indépendants de la plate-forme ("n'importe quel cpu"), ou spécifiques à la plate-forme (x86 ou x64).

Il est également possible d'exécuter simultanément le code CLR 2.0 et 4.0 dans un processus (exécution côte à côte).

Je pense que cela devrait être reproductible dans un environnement de développement, et il n'est pas réaliste d'attendre du consommateur qu'il connaisse ou gère tous les scénarios possibles.

Exécution côte à côte en cours de traitement par .NET
http://msdn.microsoft.com/en-us/library/ee518876%28VS.100%29.aspx

Assemblages : localisation, liaison et déploiement
http://www.codeproject.com/KB/install/assemblydeployment.aspx

Lorsque vous exécutez l'Explorateur de processus de Microsoft SysInternals, que vous sélectionnez le processus de service et l'onglet Assemblages .NET, il devrait vous montrer tous les différents assemblages chargés afin que vous puissiez vérifier que le bon fichier est chargé :

enter image description here

1voto

Ryan Ries Points 54671

Vous avez répondu à votre propre question. Vous avez déposé une nouvelle DLL sur votre disque, mais lorsque vous exécutez un code, il semble toujours utiliser l'ancienne DLL. Par conséquent, il doit y avoir une copie de l'ancienne DLL qui traîne encore quelque part dans votre mémoire.

Essayez ceci -- créez un raccourci, et utilisez ceci comme commande à exécuter :

%windir% \system32\rundll32.exe advapi32.dll,ProcessusIdleTasks

Donnez-lui le nom que vous voulez... quelque chose comme "Memory Cache Flusher". Exécutez-le entre les tests de votre programme.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X