2010-03-04 6 views
2

J'essaie de déterminer chaque référence dans une DLL avec System.Reflection. Cependant, GetReferencedAssemblies ne liste que celles des "Références" (visibles dans l'explorateur de solution).Utilisation de System.Reflection pour déterminer toutes les références

Je voudrais déterminer les références à partir du code lui-même, comme une instruction imports. Même des choses comme si/alors des déclarations, essayer/attraper, absolument tout.

Est-ce possible en utilisant System.Reflection? Si c'est le cas, comment?

Je préférerais certainement le faire sans p/invoke.

Merci pour l'aide!

Ceci est dans vb.net.

+0

Que voulez-vous dire? 'GetReferencedAssemblies' devrait renvoyer chaque assembly utilisé par la DLL. – SLaks

+0

Si le code utilise quelque chose de System.IO, je veux être capable de dire qu'il a utilisé quelque chose FROM System.IO, sans qu'ils l'aient ajouté comme référence. System.IO ne s'affiche pas avec 'GetReferencedAssemblies' s'il n'est pas ajouté en tant que référence, même si le code lui-même l'utilise. – Cyclone

+0

Vous souhaitez recurriver l'arborescence des assemblages référencés, filtrés par rapport à ceux qui sont accessibles depuis l'assemblage d'origine? Que faire si le quelque chose appelle 'Type.GetType()'? – SLaks

Répondre

2

EDIT

Comme décrit par votre commentaire plus tard, vous voulez que les ensembles que votre code utilise directement.

GetReferencedAssembliesle fera.


Comme décrit par vos commentaires, vous essayez de résoudre le problème de l'arrêt.

Vous ne pouvez pas le faire de manière fiable sans réellement exécuter l'assembly 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 du polymorphisme, il peut être très difficile d'éliminer ces faux positifs. Si n'importe quel code dans un chemin de code accessible utilise la réflexion, il est impossible par définition.

+0

Cela ressemble à un tracas. On pourrait penser qu'ils auraient inclus quelque chose comme une méthode 'GetAllAssemblies' ou quelque chose comme ça. Avec votre idée de récursivité, le problème est que cela n'obtiendrait que les références pour les assemblages référencés. Je veux seulement traiter des assemblées référencées directement dans la DLL elle-même, si cela a du sens. Ce concept est plutôt déroutant certainement ... – Cyclone

+0

Que voulez-vous dire? – SLaks

+0

Je veux dire, je ne me soucie pas des assemblages qui sont référencés dans les assemblages référencés. Je souhaite seulement dériver des assemblées de la DLL elle-même. – Cyclone

3

On dirait que vous avez besoin de NDepend.

(Si vous écrivez un outil pour analyser une application qui est une grande tâche)

+0

Des produits gratuits comme ça? – Cyclone

+0

il y a une raison int n'est pas libre! Je ne suis pas au courant de tout ... –

1

Vous confondez les noms d'espace de noms avec les noms d'assembly. System.IO est un espace de noms. Il apparaît réellement dans plus d'un assemblage. La classe System.IO.File réside dans mscorlib.dll, System.IO.FileSystemWatcher dans system.dll, System.IO.Pipes.PipeStream dans system.core.dll

GetReferencedAssemblies est précis. Jouez avec Red Gate's Reflector avant d'écrire ce code.

+0

+1 pour comprendre de quoi il parle. – SLaks

Questions connexes