Я думаю, вам нужно уточнить, о чем вы говорите, поскольку то, о чем вы спрашиваете, гораздо проще, чем загружать сборки в первую очередь.
После завершения загрузки сборки у вас будет список типов, которые реализуют ваш интерфейс. Просто итерируйте, создавая кнопки для каждого, и в обработчике события click для кнопки запустите ваш метод showPrefs.
Вот какой-то псевдокод c #:
Button b;
foreach(var i in instancesThatHavePrefsMethods)
{
b = new Button();
b.Click += (o,e) => { i.showPrefs(); };
this.Children.Add(b);
}
Когда у меня есть типы, я могу создать экземпляр каждого из них, держась за них. Затем все, что мне нужно сделать, это создать кнопку для каждого, добавить обработчик события (оболочка, созданная лямбда-выражением в псевдокоде, содержит ссылку на правильный экземпляр; вы можете альтернативно создать свой собственный класс для этого или назначить обработчик события в вашем интерфейсе), а затем добавьте кнопку в форму.
Из вашего пояснения есть несколько разных способов сделать это.
Во-первых, назначьте обработчик событий в вашем интерфейсе следующим образом:
public interface IPluginKLol
{
//snip
///<summary>An event handler, when fired, calls <seealso cref="showPerfs"/></summary>
void ShowPerfsEventHandler(object o, EventArgs e);
//snip again
}
, а затем
Button b;
IEnumerable<IPluginKLol> instancesThatHavePrefsMethods = GetPlugins();
foreach(var i in instancesThatHavePrefsMethods)
{
b = new Button();
b.Click += i.ShowPerfsEventHandler;
this.Children.Add(b);
}
Кроме того, вы можете создать класс для преобразования события в вызов showPerfs (просто создать экземпляр, установить ссылку и назначить обработчик события):
public class ShowPerfsBroker
{
public IPluginKLol Victim {get;set;}
public void ShowPerfsEventHandler(object o, EventArgs e)
{
if(Victim == null) return;
Victim.ShowPerfs();
}
}