Программа на С# загружает динамическую библиотеку написанную на том же С# .Соответственно dll выполняет одну только функцию.Появляется простое диалоговое окно,та же форма ,на которой есть одна кнопка.Как сделать так что при нажатии на кнопку программа получила информацию что произошло событие или какое иное действие.Время нажатие может быть неизвестно.
Это называется события. Делаю две формы, можно их разнести по разным сборкам, можно в одном приложении, логика от этого не изменится, вам только в случае двух сборок надо будет добавить ссылку из основного приложения на dll и в коде класса главной формы прописать using с указанием пространства имен из сборки.
Итак, по шагам:
Двойной клик на кнопке, чтобы перейти к коду и пишем следующее (обратите внимание на объявление события event):
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public event Action<String> OnSendText;
private void button1_Click(object sender, EventArgs e)
{
OnSendText?.Invoke(textBox1.Text);
textBox1.Text = "";
}
}
Двойной клик на кнопке и пишем следующий код:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 form = new Form2();
form.OnSendText += Form_OnSendText;
form.Show();
}
private void Form_OnSendText(string obj)
{
listBox1.Items.Add(obj);
}
}
В Dll создаю класс MyForm
public class MyForm
{
public event Action<String> OnSend;
public void Launch()
{
ClassLibrary1.FormTest frm = new ClassLibrary1.FormTest();
frm.OnSendText += Form_OnSendText;
frm.Show();
}
private void Form_OnSendText(string obj)
{
OnSend?.Invoke(obj);
}
}
Форма FormTest имеет кнопку и текстовое поле .При загрузке dll вызываем метод Launch где делаем описанные действия по коду. Основное приложение имеет форму ,кнопку и лист бокс.
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
ListBox list;
Button button;
public Form1()
{
InitializeComponent();
list = new ListBox();
list.Location = new Point(5, 10);
list.Size = new Size(275, 225);
list.Name = "list";
this.Controls.Add(list);
button = new Button();
button.Location = new Point(207, 237);
button.Name = "button";
button.Size = new Size(75, 23);
button.Text = "Нажать";
button.Click += new EventHandler(this.button_Click);
this.Controls.Add(button);
}
private void button_Click(object sender, EventArgs e)
{
Assembly a = Assembly.Load("ClassLibrary1");//dll расположенная в папке с приложением
object obj = a.CreateInstance("MyForm");
Type t = a.GetType("MyForm");
MethodInfo mi = t.GetMethod("Launch");
mi.Invoke(obj, null);
EventInfo mi1 = t.GetEvent("OnSend");
}
private void OnSendText(string obj)
{
list.Items.Add(obj);
}
}
}
Ни как не могу понять ,как же мне подписаться на событие в dll.Какие есть мысли по этому поводу?Опыта совсем нет.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Не могу решить проблемуПри создании игрового объекта из префаба по высчитанным точкам рисуется треугольник (рисуется ровно и правильно)...
Есть ответ от сервера вида {"name":"Jonh","lastName":"Smith"},{"name":"Rick","lastName":"Grimes"}И т
Как реализовать очистку старой информации из "логового" textBox, к примеру с выше 1000 строк или, там, больше 20 000 символов, не теряя свежие данные?