Comment prévenir ReflectionTypeLoadException lors de l'appel de l'Assemblée.GetTypes()

Je suis en train de scanner un assemblage de types de mise en oeuvre de l'interface à l'aide de code similaire à ceci:

public List<Type> FindTypesImplementing<T>(string assemblyPath)
{
    var matchingTypes = new List<Type>();
    var asm = Assembly.LoadFrom(assemblyPath);
    foreach (var t in asm.GetTypes())
    {
        if (typeof(T).IsAssignableFrom(t))
            matchingTypes.Add(t);
    }
    return matchingTypes;
}

Mon problème est que je reçois un ReflectionTypeLoadException lors de l'appel de asm.GetTypes() dans certains cas, par exemple, si l'assemblée contient des types de la référence à une assemblée qui n'est pas disponible actuellement.

Dans mon cas, je ne suis pas intéressé par les types qui sont à l'origine du problème. Les types que je recherche, n'ont pas besoin de la non-disponible assemblées.

La question est: est-il possible de faire en quelque sorte sauter/ignorer les types qui cause de l'exception, mais encore à traiter les autres types de contenus dans l'assemblée?

  • Il peut être beaucoup plus d'une réécriture de ce que vous cherchez, mais MEF vous donne des fonctionnalités similaires. Il suffit de marquer chacune de vos classes avec un [Exporter] balise qui spécifie l'interface elle met en œuvre. Ensuite, vous pouvez importer uniquement les interfaces qui vous intéresse en ce moment.
  • Merci pour votre commentaire. Je pensais à l'aide de la MEF, mais je voulais voir si il y a une solution moins chère.
  • Donner le plugin classe factory, un nom bien connu de sorte que vous pouvez simplement utiliser l'Activateur.CreateInstance() est une solution simple. Néanmoins, si vous obtenez cette exception à présent, en raison d'une résolution de l'assemblée problème, alors vous aurez probablement obtenir plus tard.
  • Je ne suis pas sûr que je comprends parfaitement. L'assemblée, je suis la numérisation peut contenir n'importe quel nombre de types de mise en œuvre de l'interface donnée, donc il n'y a pas un type bien connu. (et aussi: je suis la numérisation de plus d'une assemblée, et non pas un seul)
  • J'ai presque le même code, et le même problème. Et l'assemblée j'explore est donnée par AppDomain.CurrentDomain.GetAssemblies(), cela fonctionne sur ma machine mais pas sur d'autres machines. Pourquoi diable aurait quelques assemblées de mon exécutable de ne pas être lisibles/chargé de toute façon ??
InformationsquelleAutor M4N | 2011-10-25