Форум программистов, компьютерный форум, киберфорум
Storm23
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Простое создание плагинов в WinForms C#

Запись от Storm23 размещена 13.04.2015 в 00:51
Показов 19735 Комментарии 0
Метки c#, winforms

Сделаем простую систему динамических плагинов, без использования сторонних библиотек.

Пусть наши плагины должны иметь возможность добавлять свои контролы на главную форму вызывающего приложения.
Создадим новый проект типа Class Library. В нем объявим два интерфейса:
C#
1
2
3
4
5
6
7
8
9
10
    public interface IHost
    {
        void AddControlToMainForm(Control ctrl);
    }
 
    public interface IPlugin
    {
        string Name { get; }
        void Run(IHost host);
    }
Интерфейс IHost должен быть реализован главной формой приложения. Этот интерфейс содержит один метод AddControlToMainForm, который позволяет плагинам добавлять свои контролы на форму.
Интерфейс IPlugin должен быть реализован классом плагина. Он содержит свойство Name, которое должно возвращать имя плагина и метод Run который запускает плагин на выполнение.
Также, добавим в наш проект класс PluginManager, который будет выполнять динамическую загрузку плагинов:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    public class PluginManager
    {
        public List<IPlugin> Plugins = new List<IPlugin>();
 
        public void ScanPlugins(string directory)
        {
            //перебирвем все файлы dll
            foreach(var file in Directory.EnumerateFiles(directory, "*.dll", SearchOption.AllDirectories))
            try
            {
                //загружаем ассемблю
                var ass = Assembly.LoadFile(file);
                //перебираем все типы из ассембли
                foreach(var type in ass.GetTypes())
                {
                    //проверяем наличие интерфейса IPlugin
                    var i = type.GetInterface("IPlugin");
                    if (i != null)
                        //создаем экземпляр плагина
                        Plugins.Add(ass.CreateInstance(type.FullName) as IPlugin);
                }
            }catch{/*is not .NET assembly*/}
        }
    }
PluginManager ищет плагины в заданной папке и создает список плагинов Plugins.

Далее, добавим еще один проект типа Class Library, в котором реализуем плагин под названием Plugin1:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    public class Plugin1 : IPlugin
    {
        public string Name
        {
            get { return "Plugin 1"; }
        }
 
        public void Run(IHost host)
        {
            var lb = new Label {Text = "This label was created by Plugin1", Top = 100, Left = 10, Width = 200};
            host.AddControlToMainForm(lb);
        }
    }
Плагин реализует интерфейс IPlugin. Метод Run создает лейбу и размещает ее на главной форме вызывающего приложения.

Теперь создадим проект типа Windows Forms Application с главной формой приложения:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    public partial class MainForm : Form, IHost
    {
        private PluginManager pm = new PluginManager();
 
        public MainForm()
        {
            InitializeComponent();
 
            //сканируем плагины в папке Plugins
            pm.ScanPlugins(AppDomain.CurrentDomain.BaseDirectory + "\\Plugins\\");
 
            //создаем меню плагинов
            var menuStrip = new MenuStrip() {Parent = this};
            var mi = (ToolStripMenuItem)menuStrip.Items.Add("Plugins");
 
            //перебираем плагины, создаем пункт меню для каждого
            foreach(var plugin in pm.Plugins)
            {
                var item = mi.DropDownItems.Add(plugin.Name);
                item.Click += delegate { plugin.Run(this); };//при клике на меню, запускаем плагин на выполнение
            }
        }
 
        public void AddControlToMainForm(Control ctrl)
        {
            this.Controls.Add(ctrl);
        }
    }
Главная форма реализует интерфейс IHost. При загрузке, форма создает менеджер плагинов и сканирует папку Plugins. Все обнаруженные плагины, форма отображает в главном меню.
Теперь, если мы скопируем длл нашего плагина в папку Plugins и запустим приложение, главное меню покажет нам один пункт под названием Plugin 1. При клике на меню, плагин запустится и создаст лейбу на главной форме:
Название: 1.png
Просмотров: 8023

Размер: 24.0 Кб

Полный код и солюшен:
WindowsFormsApplication276.zip
Метки c#, winforms
Размещено в C#, WinForms
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru