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.

Était-ce utile?

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.

scroll top