Есть некая программа для которой пользователи пишут расширения (библиотеки) и в каждой библиотеки стартовым методом является функция "Start()" с одинаковыми параметрами. Так вот вопрос, как можно подгрузить библиотеки из массива и вызвать их стартовый метод, если это возможно?
Ответ
Конечно возможно!
// Получаем все dll
FileInfo[] files = new DirectoryInfo("Директория с нашими плагинами").GetFiles("*.dll");
foreach (FileInfo fi in files)
{
// Получаем assemly из файла
var assembly = Assembly.LoadFile(fi.FullName);
// Ищем нужный тип
foreach (Type type in assembly.GetTypes())
{
...
// Нашли => Создаем экземпляр. Вместо многоточия идут параметры конструктора
return Activator.CreateInstance(type, ...);
}
}
Обычно, когда подобное реализуют, то описывают интерфейс, а в библиотеках описывают классы, которые его реализуют. В Вашем случае он будет выглядеть например так:
public interace IMyInterface
{
void Start(...);
}
И тогда можно перебрать в библиотеке классы, реализующие его:
// Ищем нужный тип
foreach (Type type in assembly.GetTypes())
{
// Проверяем является реализует ли тип type наш интерфейс
if (!typeof (IMyInterface).IsAssignableFrom(type))
continue;
...
// Нашли => Создаем экземпляр. Вместо многоточия идут параметры конструктора
return Activator.CreateInstance(type, ...);
}
Комментариев нет:
Отправить комментарий