Я думаю, вам нужно уточнить, о чем вы говорите, поскольку то, о чем вы просите, намного проще, чем загрузка сборок в первую очередь.
После завершения загрузки сборки у вас будет список типов, реализующих ваш интерфейс. Просто выполните итерацию, создав кнопки для каждой из них, и в обработчике события нажатия кнопки запустите метод showPrefs.
Вот некоторый псевдокод С#:
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();
}
}
12.01.2009