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

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

Запись от Storm23 размещена 13.04.2015 в 00:51
Показов 19237 Комментарии 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
Просмотров: 7896

Размер: 24.0 Кб

Полный код и солюшен:
WindowsFormsApplication276.zip
Метки c#, winforms
Размещено в C#, WinForms
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru