2009-10-17 7 views
6

J'ai besoin d'une méthode qui accepte un Type et retourne les chemins de tous les assemblages utilisés dans le type. Je écrit ceci:Récupère les chemins des assemblages utilisés dans Type

public static IEnumerable<string> GetReferencesAssembliesPaths(this Type type) 
{ 
yield return type.Assembly.Location; 

foreach (AssemblyName assemblyName in type.Assembly.GetReferencedAssemblies()) 
{ 
    yield return Assembly.Load(assemblyName).Location; 
} 
} 

En général, cette méthode de faire le travail, mais ont quelques inconvénients:

  • Je ne l'ai pas trouvé comment obtenir les ensembles référencés/types du type lui-même, de sorte J'ai utilisé type.Assembly.GetReferencedAssemblies() et obtenu les références de l'ensemble, pas seulement celles qui sont liées au type. Type.Assembly.GetReferencedAssemblies() renvoie AssemblyName et ne possède aucune propriété location/path/filepath. Pour obtenir la propriété location, j'ai d'abord utilisé Assembly.Load(), puis utilisé la propriété location. Je ne veux pas que les assemblys de chargement obtiennent leur chemin, car ils ne sont pas nécessairement utilisés, et parce que Assembly.Load() peut échouer avec FileNotFoundException ou BadImageFormatException.

Répondre

9

Je pense que j'ai résolu le problème Assembly.Load() en le remplaçant par Assembly.ReflectionOnlyLoad().

maintenant c'est comment ma méthode ressemble à:

public static IEnumerable<string> GetReferencesAssembliesPaths(this Type type) 
{   
    yield return type.Assembly.Location; 

    foreach (AssemblyName assemblyName in type.Assembly.GetReferencedAssemblies()) 
    { 
     yield return Assembly.ReflectionOnlyLoad(assemblyName.FullName).Location; 
    } 
} 

maintenant le seul problème est la gauche type.Assembly.GetReferencedAssemblies(), comment puis-je obtenir des assemblages référencés à partir du type plutôt que de l'ensemble?

+0

Tous les types appartiennent à des assemblages - vous devriez pouvoir faire type.Assembly.GetReferencedAssemblies(). Oh attends, tu fais déjà ça. Je suppose que c'est résolu depuis longtemps, n'est-ce pas? 2011? –

+0

@DxCK une solution à ce problème? Mon problème: Le projet Ma bibliothèque référence Oracle.DataAccess 4.112.2.0, mais en cours d'exécution, charge à partir de GAC Oracle.DataAccess 4.121.1.0. Assembly.GetReferencedAssemblies() me donne Oracle.DataAccess 4.112.2.0 pas Oracle.DataAccess 4.121.1.0. – Kiquenet

+0

Pour l'utiliser, appelez 'var results = this.GetType(). GetReferencesAssembliesPaths();'. – Contango

2

type.Assembly.GetReferencedAssemblies() retournera tous les ensembles qui sont référencés par l'ensemble dans lequel le type est déclaré. Cela ne signifie pas que les assemblages que vous obtiendrez avec cette fonction ont quelque chose en commun avec le type donné.

+0

Oui, c'est exactement l'un de mes problèmes avec cette méthode. – DxCK

+0

Problème à ce sujet: un projet de bibliothèque références Oracle.DataAccess 4.112.2.0, mais dans le temps d'exécution, charge à partir de GAC Oracle.DataAccess 4.121.1.0. Assembly.GetReferencedAssemblies() me donne Oracle.DataAccess 4.112.2.0 pas Oracle.DataAccess 4.121.1.0. – Kiquenet

Questions connexes