Próbuję przeskanować zestaw pod kątem typów implementujących określony interfejs przy użyciu kodu podobnego do tego:
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;
}
Mój problem polega na tym, że ReflectionTypeLoadException
podczas wywoływania asm.GetTypes()
w niektórych przypadkach otrzymuję a , np. Jeśli zestaw zawiera typy odwołujące się do zestawu, który jest obecnie niedostępny.
W moim przypadku nie interesują mnie typy, które powodują problem. Typy, których szukam, nie wymagają niedostępnych zestawów.
Pytanie brzmi: czy można w jakiś sposób pominąć / zignorować typy, które powodują wyjątek, ale nadal przetwarzać inne typy zawarte w zestawie?
AppDomain.CurrentDomain.GetAssemblies()
tego, że działa na moim komputerze, ale nie na innych komputerach. Dlaczego do cholery niektóre zestawy z mojego pliku wykonywalnego i tak nie mogą być odczytywane / ładowane?Odpowiedzi:
Jednym dość nieprzyjemnym sposobem byłoby:
To zdecydowanie denerwujące, że trzeba to robić. Możesz użyć metody rozszerzenia, aby była ładniejsza w kodzie „klienta”:
Możesz chcieć
return
usunąć instrukcję z bloku catch - ja sam nie bardzo chcę, żeby tam było, ale prawdopodobnie jest to najkrótszy kod ...źródło
From t As Type In e.Types Where (t IsNot Nothing) AndAlso (t.TypeInitializer IsNot Nothing)
Wydaje się, że działa świetnie.Chociaż wydaje się, że nic nie można zrobić bez otrzymania w pewnym momencie wyjątku ReflectionTypeLoadException, powyższe odpowiedzi są ograniczone, ponieważ każda próba wykorzystania typów dostarczonych z wyjątku nadal będzie powodować problem z pierwotnym problemem, który spowodował, że typ nie załadował się.
Aby rozwiązać ten problem, poniższy kod ogranicza typy do tych znajdujących się w zestawie i umożliwia predykatowi dalsze ograniczenie listy typów.
źródło
Czy rozważałeś Assembly.ReflectionOnlyLoad ? Biorąc pod uwagę to, co próbujesz zrobić, może to wystarczyć.
źródło
W moim przypadku ten sam problem był spowodowany obecnością niechcianych zestawów w folderze aplikacji. Spróbuj wyczyścić folder Bin i odbuduj aplikację.
źródło