2009-11-19 5 views
2

J'essaie de déployer de nouvelles copies de ma DLL vers le GAC sur les serveurs distants, mais je dois identifier si les processus en cours d'exécution ont une copie chargée de la DLL. Je remplace - je voudrais les redémarrer, ou au moins dire à l'utilisateur. Par exemple, Biztalk semble charger les DLL dont il a besoin la première fois qu'il est utilisé, puis les remplacer conserve l'ancienne copie en mémoire jusqu'à ce que les instances hôtes soient redémarrées - ce que je pourrais facilement faire dans le cadre de mon déploiement .Voir si une application a une DLL du GAC chargée

Existe-t-il un moyen de dire à l'aide de .NET quels processus ont chargé une DLL particulière à partir du GAC?

MISE À JOUR:

une enquête plus poussée montre que les deux Process Explorer a cette fonctionnalité, et un autre outil de Sysinternals, ListDLL, fait exactement ce que je veux être en mesure de le faire. Je voudrais savoir comment ils le font, puisque j'aimerais reproduire cette fonctionnalité dans mon application sans avoir à inclure ListDLL à l'écran (si cela est même autorisé dans la licence).

Répondre

0

Vous devez le faire par programme ou manuellement?

Vous pouvez utiliser la fonction de recherche de poignée/DLL de Process Explorer pour rechercher manuellement les modules utilisés.

link text

Mise à jour:

Non, je ne sais pas comment cela fonctionne, autre que l'utilisation extensive des choses à partir des coins poussiéreux de la Win32 API et NT.

Il existe des alternatives open source, vous pouvez jeter un oeil à:

Un autre utilitaire, PSList listera les processus sur une télécommande machine, et cette page dit qu'il le fait en utilisant les compteurs de performance de Windows, la même chose qui conduit le pan de contrôle el/admin outils/performance MMC. Je sais que vous pouvez accéder à ces compteurs à partir de .NET, mais je ne sais pas si vous pouvez obtenir les modules chargés ou d'autres détails sur les processus.

Les documents MSDN indiquent que Process.GetProcesses utilise des compteurs de performance, donc c'est probablement le chemin à parcourir, vous avez juste besoin de comprendre comment le faire fonctionner. Quel que soit le problème que vous rencontrez, cela se produira également si vous faites la même chose manuellement. Vous n'avez pas besoin de faire cela à partir d'une machine Win95/98/ME, n'est-ce pas?

Vous devrez peut-être faire quelque chose comme WNetAddConnection pour vous authentifier sur l'ordinateur distant avant de l'interroger. Je ne suis pas sûr de ce que l'équivalent .net est, cependant. Je pense que vous écrivez une application qui s'exécute localement sur votre serveur et vous renvoie les résultats sur une socket ou quelque chose.

+0

J'aimerais le faire par programmation - puisque Process Explorer le fait, cela signifie que cela peut être fait, ce qui est encourageant. Des idées comment ils font? – SqlRyan

+0

@rwmnau Réponse mise à jour. –

2

Would quelque chose comme ce travail:

Process[] proc = Process.GetProcesses("<optional machine name>"); 
ProcessModuleCollection mods = proc[0].Modules; 

La collection de mods contiendra tous les modules chargés pour le processus en cours. Vous pouvez facilement itérer sur la collection proc, puis sur mod collection et voir si des modules d'intérêt sont chargés, si c'est le cas, vous pouvez alors tuer le processus.

+0

Il semble que je reçois une "NotSupportedException" sur la deuxième ligne - "La fonction n'est pas supportée pour les machines distantes", même si cela fonctionne comme un champion localement. Des idées sur une autre méthode qui fonctionnerait sur une machine distante? – SqlRyan

Questions connexes