Мой код сканирует различные каталоги на наличие плагинов DLL. Они узнаваемы, потому что имеют экспортированный тип, реализующий IBehaviourPlugin
.
. После нескольких публикаций в Интернете я попытался загрузить сборки с помощью следующего кода (зацикливание файлов для удобства чтения):
// Plugin interface
Type behaviourPlugin = typeof(OrganShared.IBehaviourPlugin);
// Load assembly from file
Assembly a = Assembly.ReflectionOnlyLoadFrom(f);
Type[] exports = a.GetExportedTypes();
int validTypes = (from Type t in exports
where behaviourPlugin.IsAssignableFrom(t)
&& behaviourPlugin.FullName != t.FullName
select t).Count();
if (validTypes > 0) { files.Add(new FileInfo(f)); }
Это не позволяет идентифицировать любые сборки, которые соответствуют критериям. Однако , если я заменю Assembly a = Assembly.ReflectionOnlyLoadFrom(f);
на Assembly a = Assembly.LoadFrom(f);
, типы будут сравниваться идеально, и все мои подключаемые библиотеки DLL будут правильно идентифицированы.
Может кто-нибудь объяснить мне причину такого различного поведения? Это не первая моя прогулка с отражением, но она немного за мной.
Кстати, поведение такое же, если я использую альтернативный метод проверки: t.GetInterfaces().Contains(IBehaviourPlugin)
Наконец, яВ настоящее время я не создаю новый домен приложений для отражения - я подозреваю, что могу / должен / буду нуждаться в этом, но я хотел изолировать это поведение, прежде чем потенциально добавить дополнительные сложности.