J'essaie de scanner un assembly pour les types implémentant une interface spécifique en utilisant un code similaire à celui-ci:
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 j'obtiens un ReflectionTypeLoadException
lors de l'appel asm.GetTypes()
dans certains cas, par exemple si l'assembly contient des types référençant un assembly qui n'est actuellement pas disponible.
Dans mon cas, je ne suis pas intéressé par les types qui causent le problème. Les types que je recherche n'ont pas besoin des assemblys non disponibles.
La question est la suivante: est-il possible d'ignorer / ignorer d'une manière ou d'une autre les types qui provoquent l'exception tout en traitant les autres types contenus dans l'assembly?
AppDomain.CurrentDomain.GetAssemblies()
, cela fonctionne sur ma machine mais pas sur d'autres machines. Pourquoi diable certains assemblys de mon exécutable ne seraient-ils pas lisibles / chargés de toute façon ??Réponses:
Une manière assez désagréable serait:
C'est vraiment ennuyeux d'avoir à faire ça. Vous pouvez utiliser une méthode d'extension pour le rendre plus agréable dans le code "client":
Vous pouvez bien souhaitez déplacer la
return
déclaration sur le bloc catch - Je ne suis pas terriblement vif à ce sujet d' être moi - même, mais il probablement est le plus court code ...la source
From t As Type In e.Types Where (t IsNot Nothing) AndAlso (t.TypeInitializer IsNot Nothing)
cela semble fonctionner très bien.Bien qu'il semble que rien ne puisse être fait sans recevoir l'exception ReflectionTypeLoadException à un moment donné, les réponses ci-dessus sont limitées en ce que toute tentative d'utiliser les types fournis par l'exception posera toujours un problème avec le problème d'origine qui a entraîné l'échec du chargement du type.
Pour surmonter cela, le code suivant limite les types à ceux situés dans l'assembly et permet à un prédicat de restreindre davantage la liste des types.
la source
Avez-vous envisagé Assembly.ReflectionOnlyLoad ? Compte tenu de ce que vous essayez de faire, cela pourrait suffire.
la source
Dans mon cas, le même problème a été causé par la présence d'assemblys indésirables dans le dossier de l'application. Essayez d'effacer le dossier Bin et de reconstruire l'application.
la source