Обработчики событий поставляются в DLL.
Подключая ту или иную DLL с набором функций пользователь должен таким образом сам определять что будет делать кнопка по нажатию,
прицепив на обработчик события Click функцию из DLL.
Механизм прицепления и необходимо разработать.
Как пример берем кнопку. Кнопку кстати тоже делаем динамически:
- Код: Выделить всё
Assembly a = Assembly.Load("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
AssemblyName an = a.GetName();
Type tButton = Type.GetType("System.Windows.Forms.Button," + an.FullName, true);
//Type tButton = typeof(Type.GetType("System.Windows.Forms.Button"));
Object btnCancel = Activator.CreateInstance(tButton);
btnCancel.GetType().GetProperty("Text").SetValue(btnCancel,Language.Cancel, null);
btnCancel.GetType().GetProperty("Top").SetValue(btnCancel, 400, null);
btnCancel.GetType().GetProperty("Left").SetValue(btnCancel, 400, null);
Функцию Click помещаем в класс Action который помещаем в свою очередь в DLL.
- Код: Выделить всё
namespace Implements
{
public class Actions
{
public void Cancel_Click(object sender, EventArgs e)
{
MessageBox.Show("The method Cancel1 is not implemented.");
}
}
}
Теперь осталось загрузить эту DLL динамически, найти через Reflection функцию Cancel_Click и привязать её к кнопке:
- Код: Выделить всё
Assembly b = Assembly.LoadFile(@"..\..\MMImplements\bin\Debug\MMImplements.dll");
AssemblyName bn = b.GetName();
Type tAction = Type.GetType("Implements.Actions," + bn.FullName, true);
Object oAction = Activator.CreateInstance(tAction);
и вот тут непонятно как дальше
Должно быть где-то так:
- Код: Выделить всё
btnCancel.GetType().GetEvent("Click").AddEventHandler(btnCancel, new EventHandler(oAction.GetType().GetMethod("Cancel_Click").))
Но так не работает, ошибка:"не указано имя функции, хотя оно указано"
Кстати попытка вызвать функцию тоже не проходит
- Код: Выделить всё
MethodInfo mi = oAction.GetType().GetMethod("Cancel_Click");
ParameterInfo[] myParameters = mi.GetParameters();
Ошибка: ParameterInfo не может быть преобразован в EventArgs" хотя EventArgs стоит вторым елементом в массиве.
в Чем причина и как же привязать событие ?
Спасибо