En utilisant System.Reflection pour déterminer toutes les références
-
24-09-2019 - |
Question
Je suis en train de déterminer chaque référence unique dans une dll avec System.Reflection
. Cependant, GetReferencedAssemblies
ne répertorie que ceux dans les « Références » (visibles dans l'explorateur de solution).
Je voudrais déterminer les références à partir dans le code lui-même, comme une déclaration imports
. Même les choses comme si / then, try / catch, absolument tout .
Est-ce possible de le faire en utilisant System.Reflection
? Si oui, comment?
Je préfèrerais certainement faire sans p / Invoke.
Merci pour l'aide!
Ceci est en vb.net.
La solution
EDIT
Comme décrit par votre commentaire plus tard, vous voulez que les ensembles que votre code utilise directement.
GetReferencedAssemblies
faire.
Comme décrit par vos commentaires, vous essayez de résoudre le problème de l'arrêt.
Vous ne pouvez pas faire cela de manière fiable sans exécuter réellement l'assemblage d'origine (et en utilisant l'API de profilage pour voir quel type il utilise).
Vous pouvez appeler récursive GetReferencedAssemblies
sur chaque référence et obtenir toute l'arborescence des dépendances indirectes.
EDIT :
Par exemple:
static IEnumerable<Assembly> (Assembly a) {
return a.GetReferencedAssemblies()
.Concat(a.GetReferencedAssemblies()
.SelectMany<Assembly, Assembly>(GetAllReferences)
);
Cependant, vous pouvez obtenir des faux positifs si l'une des références utilise un ensemble dans un chemin de code qui n'est pas accessible par l'assemblage d'origine. En raison des interfaces et polymorphisme, il peut être très difficile à éliminer ces faux positifs. Si l'un de code dans tout chemin de code accessible utilise la réflexion, il est impossible par définition.
Autres conseils
On dirait que vous avez besoin NDepend .
(Si vous écrivez un outil pour analyser une application qui est une grande tâche)
Vous confondez espaces de noms avec des noms d'assemblage. System.IO est un espace de noms. Il apparaît en fait dans plus d'un ensemble. La classe vit System.IO.File dans mscorlib.dll, System.IO.FileSystemWatcher à system.dll, System.IO.Pipes.PipeStream dans System.Core.dll
GetReferencedAssemblies est exacte.
Jouez avec réflecteur avant d'écrire ce code Red Gate.