Ich versuche, eine Assembly nach Typen zu scannen, die eine bestimmte Schnittstelle implementieren, indem ich folgenden Code verwende:
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;
}
Mein Problem ist, dass ich in einigen Fällen ReflectionTypeLoadException
beim Aufruf eine bekomme asm.GetTypes()
, z. B. wenn die Assembly Typen enthält, die auf eine Assembly verweisen, die derzeit nicht verfügbar ist.
In meinem Fall interessieren mich die Typen, die das Problem verursachen, nicht. Die Typen, nach denen ich suche, benötigen keine nicht verfügbaren Assemblys.
Die Frage ist: Ist es möglich, die Typen, die die Ausnahme verursachen, irgendwie zu überspringen / zu ignorieren, aber dennoch die anderen in der Assembly enthaltenen Typen zu verarbeiten?
AppDomain.CurrentDomain.GetAssemblies()
, dies funktioniert auf meiner Maschine, aber nicht auf anderen Maschinen. Warum zum Teufel sollten einige Assemblys aus meiner ausführbaren Datei sowieso nicht lesbar / geladen sein?Antworten:
Ein ziemlich böser Weg wäre:
Es ist definitiv ärgerlich, dies tun zu müssen. Sie können eine Erweiterungsmethode verwenden, um es im "Client" -Code schöner zu machen:
Sie können auch wünschen , die bewegen
return
Anweisung aus dem catch - Block - ich bin schrecklich nicht so scharf auf sie selbst dort zu sein, aber es wahrscheinlich ist der kürzeste Code ...quelle
From t As Type In e.Types Where (t IsNot Nothing) AndAlso (t.TypeInitializer IsNot Nothing)
Es scheint großartig zu funktionieren.Obwohl es den Anschein hat, dass irgendwann nichts mehr getan werden kann, ohne die ReflectionTypeLoadException zu erhalten, sind die obigen Antworten dahingehend begrenzt, dass jeder Versuch, die aus der Ausnahme bereitgestellten Typen zu verwenden, weiterhin Probleme mit dem ursprünglichen Problem verursacht, das dazu geführt hat, dass der Typ nicht geladen werden konnte.
Um dies zu überwinden, beschränkt der folgende Code die Typen auf diejenigen, die sich in der Assembly befinden, und ermöglicht es einem Prädikat, die Liste der Typen weiter einzuschränken.
quelle
Haben Sie über Assembly.ReflectionOnlyLoad nachgedacht ? In Anbetracht dessen, was Sie versuchen, könnte es ausreichen.
quelle
In meinem Fall wurde das gleiche Problem durch das Vorhandensein unerwünschter Assemblys im Anwendungsordner verursacht. Versuchen Sie, den Ordner Bin zu löschen und die Anwendung neu zu erstellen.
quelle