2010-09-28 5 views
0

Je suis à la recherche de 33 .dll pour trouver des références pour une méthode, Il faut plus de 10 minutes pour traverser toutes les DLL et trouver des références. Y a-t-il un moyen d'accélérer les choses?méthodes de recherche plus rapides

chacun de ces dll a environ 450 classes, et chacune de cette classe a environ 200 méthodes chaque

pas que je suis:

assemblyName = System.IO.Path.GetFullPath(file) 
assembly = System.Reflection.Assembly.LoadFile(assemblyName) 

Dim types = assembly.GetTypes() 
For Each Type In types 
    methods = Type.GetMethods() 
    For Each method In methods 
    'save method info, class type 
    Next 
Next 
+2

La réflexion est notoirement lente. Vous devrez peut-être revoir votre solution pour ne pas avoir à utiliser la réflexion. Quelle est votre exigence de haut niveau? Il y a probablement un meilleur moyen de l'atteindre. – Polyfun

+1

Oui, sérieusement, qu'est-ce que vous * essayez * de faire? – AakashM

+0

Merci pour vos réponses ... Ce que j'essaie de faire est comme - une recherche récursive toutes les références de Visual studio. Donc, c'est comme si je commençais par trouver des références à une méthode et ensuite je trouvais des références à toutes les méthodes qui appellent cette méthode et ainsi de suite jusqu'à ce que j'arrive à un point où je n'ai plus aucune méthode appelant ces méthodes. J'atteins la couche d'interface utilisateur, aspx.vb) Des suggestions sur les autres approches qui pourraient me permettre d'atteindre cet objectif? – Anshul

Répondre

1

Vous pouvez passer par vos 33 bibliothèques et stocker le résultat de ce que vous cherchez dans une base de données. Et puis au lieu de demander à vos bibliothèques, demandez à votre base de données, ce sera plus rapide et vous donnera directement la bonne porte pour frapper ... (Je veux dire que vous pouvez alors pointer directement vers la bonne bibliothèque et la bonne classe pour obtenir plus d'informations ou instancié un objet, ...)

Mon commentaire n'est pas clair alors je mets à jour ma réponse.

Avant de lancer une nouvelle version, vous remplissez la base de données avec les nouvelles valeurs de votre projet avec une clé correspondant bien sûr à votre version. Ainsi, lors du lancement de la nouvelle application, vous n'aurez pas à attendre 10 minutes avant d'obtenir vos informations, car vous aurez déjà utilisé 10 minutes auparavant, cachées, pour remplir la base de données. Si votre application redémarre mais ne modifie pas vos bibliothèques, les informations seront toujours présentes, car la version sera la même.

Je vous souhaite bonne chance quand même pour votre projet ...

+0

Merci pour la réponse, mais, Ces bibliothèques ne cessent de changer et d'être mis à jour de temps en temps afin de stocker les données une fois récupérées dans la base de données est un peu irréalisable. Je le stocke dans un tableau de type struct pour le moment où l'application est en cours d'exécution mais si l'application est redémarrée, nous devrons effectuer une nouvelle recherche dans les bibliothèques. La navigation à travers toutes les méthodes est nécessaire. – Anshul

+0

Essayer d'obtenir une certaine persistance sur la reconstruction de l'application pourrait être en effet un peu difficile. Voir ma réponse mise à jour .. – Arthis

1

Je sais que beaucoup d'outils de fantaisie, y compris PostSharp et NDepend (ce qui est un excellent outil) utiliser Cecil. C'est censé être meilleur que la réflexion .NET pour certaines choses. Essayez-le!

Questions connexes