2009-09-09 7 views
2

J'ai un peu de code qui boucle sur les types actuellement chargés dans un AppDomain qui s'exécute dans une application ASP.NET. Voilà comment je reçois les assemblées:Pourquoi certains assemblys .Net ne sont-ils pas disponibles via la méthode GetAssemblies() d'AppDomain?

var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 

Lorsque la première application démarre il n'y a pas de problème et tous les types que j'attends sont présents. Mais lorsque je mets à jour Web.config ou que je mets fin au processus w3p.exe (ou que le processus est recyclé pour une raison quelconque), seuls certains des types que j'attends sont disponibles. Lorsque je parcours un débogueur, je remarque que certains assemblys du chemin de recherche privé (le répertoire bin de mon application) n'ont pas été chargés. Je supposais que tous les assemblages étaient chargés au démarrage de l'application et redémarraient, qu'ils soient immédiatement requis ou non. Mais dans le cas du redémarrage, cela ne semble pas se produire sauf si ces fichiers d'assemblage ont été mis à jour.

Ce dont j'ai besoin, c'est de collecter des informations de type au démarrage pour les utiliser plus tard. Mais puisque pendant un redémarrage, les types ne sont pas disponibles, cela provoque des ravages plus tard quand l'information de type doit être utilisée. Donc, dans cet esprit, comment puis-je résoudre ou contourner cette lacune?

Répondre

2

Dans le cadre du démarrage, pouvez-vous explicitly load les assemblages qui vous intéressent?

Vous devriez savoir à l'avance quels assemblages vous auriez besoin.

Numérisation du système de fichiers pour savoir quels ensembles ont été expédiés avec votre application peut être une idée utile, mais il ne sera pas utile pour les assemblages chargés GAC ...

+0

Je pensais à charger explicitement les assemblages. J'ai seulement besoin des assemblées privées jusqu'ici pour que je puisse juste charger tout du chemin de recherche privé. Je ne suis pas sûr de savoir quelle est la meilleure façon d'y parvenir. Assembly.Load? Assembly.LoadFile? Assembly.LoadFrom? –

+0

Assembly.Load en général est l'approche préférée, car il est le plus proche du mécanisme de chargement normal. Voir http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx pour les avantages et les inconvénients, et http://blogs.msdn.com/suzcook/archive/2003/09/19/ 57248.aspx pour un peu plus d'infos. –

+0

Merci pour les liens, j'ai déjà regardé ceux-ci. Je pense que je devrais utiliser LoadFrom ou LoadFile puisque je n'ai que des chemins de fichiers avec lesquels travailler. Je sais que j'ai utilisé LoadFile avant de rencontrer des problèmes lors de la mise à jour des assemblages lors d'un déploiement en raison du verrouillage des fichiers d'assemblage, vraisemblablement par LoadFile. Je pense que LoadFrom est bon pour moi mais je ne suis pas sûr de comprendre complètement ses implications. –

4

Les assemblys sont chargés à la demande, il se peut donc que vous n'ayez pas encore utilisé de type contenu dans ces assemblys.

+1

C'est vrai, je n'ai pas chargé tous les types au démarrage de l'application. Le problème est que j'ai besoin de l'information sur le type au démarrage de l'application pour que je puisse utiliser cette information plus tard. Si l'information n'est pas disponible au démarrage, l'application peut potentiellement planter plus tard. –

+0

vous pouvez utiliser la méthode statique Assembly.Load() pour vous assurer que tous vos assemblys requis sont chargés lorsque vous en avez besoin. – codymanix

+0

Je ne peux pas utiliser Aseembly.Load() car je n'ai pas les noms d'assembly disponibles. Vous pourriez vouloir vérifier la réponse de Nader pour voir où je suis. –

3

Vous pouvez utiliser

AssemblyName[] assemblies = Assembly.GetCallingAssembly().GetReferencedAssemblies(); 

De cette façon, vous obtenez tous les assemblys référencés à partir de l'assembly à partir duquel vous appelez cette méthode.

+0

Mon assembly appelant ne référence pas nécessairement les types que je suis après. –

+0

Mais peut-être qu'ils sont référencés par un autre assembly référencé par votre assembly. Vous pouvez parcourir l'ensemble des assemblages référencés indirectement pour obtenir tous les assemblages/types souhaités. – codymanix

+0

Ah, je vois. Je pourrais faire ça. Je vais devoir voir comment cela contribue à démarrer le temps. Merci. –

Questions connexes