Взаимодействие WindowsForm C# и DLL написанной на С#

156
01 апреля 2019, 21:20

Программа на С# загружает динамическую библиотеку написанную на том же С# .Соответственно dll выполняет одну только функцию.Появляется простое диалоговое окно,та же форма ,на которой есть одна кнопка.Как сделать так что при нажатии на кнопку программа получила информацию что произошло событие или какое иное действие.Время нажатие может быть неизвестно.

Answer 1

Это называется события. Делаю две формы, можно их разнести по разным сборкам, можно в одном приложении, логика от этого не изменится, вам только в случае двух сборок надо будет добавить ссылку из основного приложения на dll и в коде класса главной формы прописать using с указанием пространства имен из сборки.

Итак, по шагам:

  1. Создаем вторую форму (у меня это Form2) на которой размещаю TextBox и Button. Внешний вид формы:

Двойной клик на кнопке, чтобы перейти к коду и пишем следующее (обратите внимание на объявление события 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 = "";
    }
}
  1. На главную форму приложения я помещаю ListBox и кнопку, внешний вид будет вот такой:

Двойной клик на кнопке и пишем следующий код:

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);
    }
}
  1. Запускаем, нажимаем на кнопку первой формы, во второй форме вводим текст, нажимаем кнопку на второй форме и видим, что текст появился на первой форме, хотя вторая про нее абсолютно ничего не знает:

Answer 2

В 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.Какие есть мысли по этому поводу?Опыта совсем нет.

READ ALSO
Изменение PolygonCollider2D скриптом

Изменение PolygonCollider2D скриптом

Не могу решить проблемуПри создании игрового объекта из префаба по высчитанным точкам рисуется треугольник (рисуется ровно и правильно)...

192
C# Speech Recognition

C# Speech Recognition

Что не так может быть в коде? Не распознает голос

168
Десериализация JSON C#

Десериализация JSON C#

Есть ответ от сервера вида {"name":"Jonh","lastName":"Smith"},{"name":"Rick","lastName":"Grimes"}И т

173
Очистка старых данных из textBox

Очистка старых данных из textBox

Как реализовать очистку старой информации из "логового" textBox, к примеру с выше 1000 строк или, там, больше 20 000 символов, не теряя свежие данные?

170