Я пытаюсь сканировать сборку на предмет типов, реализующих определенный интерфейс, используя код, подобный этому:
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;
}
Моя проблема в том, что в некоторых случаях я получаю сообщение ReflectionTypeLoadException
при вызове asm.GetTypes()
, например, если сборка содержит типы, ссылающиеся на сборку, которая в настоящее время недоступна.
В моем случае меня не интересуют типы, вызывающие проблему. Типы, которые я ищу, не нуждаются в недоступных сборках.
Возникает вопрос: можно ли как-то пропустить / игнорировать типы, вызывающие исключение, но при этом обрабатывать другие типы, содержащиеся в сборке?
AppDomain.CurrentDomain.GetAssemblies()
, она работает на моей машине, но не работает на других машинах. Какого черта некоторые сборки из моего исполняемого файла все равно не читаются / не загружаются ??Ответы:
Один довольно неприятный способ:
Хотя это определенно раздражает. Вы можете использовать метод расширения, чтобы сделать его лучше в "клиентском" коде:
Возможно, вы захотите переместить
return
оператор из блока catch - мне не очень нравится, чтобы он был там, но это, вероятно , самый короткий код ...источник
From t As Type In e.Types Where (t IsNot Nothing) AndAlso (t.TypeInitializer IsNot Nothing)
похоже, он отлично работает.Хотя кажется, что ничего нельзя сделать без получения исключения ReflectionTypeLoadException в какой-то момент, приведенные выше ответы ограничены тем, что любая попытка использовать типы, предоставленные из исключения, по-прежнему вызовет проблему с исходной проблемой, которая привела к сбою загрузки типа.
Чтобы преодолеть это, следующий код ограничивает типы теми, которые находятся в сборке, и позволяет предикату дополнительно ограничивать список типов.
источник
Вы рассматривали Assembly.ReflectionOnlyLoad ? Учитывая то, что вы пытаетесь сделать, этого может быть достаточно.
источник
В моем случае такая же проблема была вызвана наличием нежелательных сборок в папке приложения. Попробуйте очистить папку Bin и пересобрать приложение.
источник