Mimic projects
SEO
Značky: Všechny, C#, Tutorial, App, Game, Test, Hack, C++/cli, C++, Java, Xna, C++/qt, Lib

[ 27.4.2013 ]PluginLoader (správa vlastních pluginů)

Informace:
- Umožňuje snadné vytváření, načítání a používání vlastních pluginů v aplikaci
- Možnost volání funkcí, vlastností, událostí, zdrojů z pluginu
- Má široké použití (lokalizace, čistě pro zdroje (obrázky, zvuky..), vlastní formuláře, úprava UI atd.

Použité prog. jazyky: C# (.net 4.5)

Stažení verze: 1.1 + doc

Značky: c#, lib

Vlastnosti

- velice snadná práce s pluginy
- umí načítat nebo odebírat pluginy za chodu aplikace
- systém příkazů (je možnost ovládat plugin pomocí vlastním příkazů)
- podpora formulářů a kontrolních prvků (GUI)
- podpora jednoho i více zdrojů (resources), kde je možné načítat cokoli (texty, obrázky, hudbu...)
- identifikace pluginu pomocí unikátního GUID, takže název pluginu není důležitý
- možnost načtení jednoho pluginu nebo rovnou celého adresáře s pluginy

Jak si vytvořit vlastní plugin

- pro vytvoření vlastního pluginu je důležité postupovat těmito kroky

1) Aplikace která bude používat pluginy a i samotné pluginy musí obsahovat referenci na PluginLoader
2) Plugin musí být umístěn ve jmeném prostoru mimic.Plugin
3) Hlavní třída v pluginu se musí jmenovat Plugin a musí dědit od PluginBase
4) Přepsat implementaci na vlastnost Guid (vytvořit vlastní guid pro plugin)

[kód] Minimální nastavení

using mimic.PluginLoader;

namespace mimic.Plugin
{
    public class Plugin : PluginBase
    {
        public override string Guid
        {
            get { return "VlastniGuid"; }
        }
    }
}

[kód] Běžné nastavení

using mimic.PluginLoader;
using System;

namespace mimic.Plugin
{
    public class Plugin : PluginBase
    {
        public override string Guid
        {
            get { return "VlastniGuid"; }
        }

        public override string Author
        {
            get { return "mimic"; }
        }

        public override string Description
        {
            get { return "Základní informace"; }
        }

        public override Version Version
        {
            get { return new Version(1, 1, 0); }
        }
    }
}

[kód] Ukázka zachycení příkazů v pluginu

using mimic.PluginLoader;
using System.Windows.Forms;

namespace mimic.Plugin
{
    public class Plugin : PluginBase
    {
        private Form form;

        public override string Guid
        {
            get { return "Commands"; }
        }

        // ve formuláři se musí předat instance
        public override void ParentForm(Form form)
        {
            this.form = form;
        }

        protected override void CommandReceiver(string command)
        {
            switch (command)
            {
                // ukončí furmulář
                case "close":
                    if (form != null)
                        form.Close();
                    break;

                // odebere tento plugin
                case "unload":
                    PluginLoader.PluginLoader.Unload(Guid);
                    break;
            }
        }
    }
}

[kód] Kreslení na formulář přes plugin

using mimic.PluginLoader;
using System;
using System.Drawing;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace mimic.Plugin
{
    public class Plugin : PluginBase
    {
        private Random r = new Random();
        private Form form;

        public override string Guid
        {
            get { return "WindowColorChaos"; }
        }

        public Plugin()
        {
            // při odebrání pluginu je nutné odebrat i události na formulář a
            // nastavít původní barvu formuláře
            OnDeactivated += () =>
            {
                if (form != null)
                {
                    form.Paint -= Paint;
                    form.BackColor = Color.FromKnownColor(KnownColor.Control);
                    form.Invalidate();
                }
            };
        }

        // ve formuláři se musí předat instance
        public override void ParentForm(Form form)
        {
            if (form != null)
            {
                this.form = form;
                // přidá se funkce do události pro vykreslení na formulář
                this.form.Paint += Paint;
                // automaticky bude překreslovat formulář každých 500ms
                PeriodicRepaint(500);
            }
        }

        // je voláno událostí pro vykreslení na formulář
        private void Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            // vygeneruje náhodnou barvu na pozadí formuláře
            g.Clear(Color.FromArgb(r.Next(0, 255), r.Next(0, 255), r.Next(0, 255)));
        }

        private async void PeriodicRepaint(int delay)
        {
            // dokud formulář bude existovat a plugin bude načten
            while (!form.IsDisposed && IsActivated)
            {
                form.Invalidate();
                await Task.Delay(delay);
            }
        }
    }
}

[kód] Pár ukázek použití knihovny PluginLoader

// bude automaticky každou 1s kontrolovat adresář "libs" jestli se nějaký
// plugin přidal nebo odebral
PluginLoader.AutoDetect(true, "libs");

// načte jeden plugin
PluginLoader.Load("C:\\Plugin.dll");

// načte všechny pluginy v adresáři "libs"
PluginLoader.LoadPlugins("libs");

// odebere načtený plugin podle jeho GUID
PluginLoader.Unload("GuidPluginu");

// odebere všechny načtené pluginy
PluginLoader.UnloadPlugins();

// odešle všem pluginům příkaz "close" (co se má stát je na každém pluginu)
PluginLoader.SendCommand("close");

// získá plugin podle jeho GUID
IPlugin myPlugin = PluginLoader.Get("GuidPluginu");
// zavolá funkci "Vypis" s parametrem "Ahoj světe", která je umístěná v pluginu
myPlugin.Func("Vypis", "Ahoj světe");
// nastaví vlastnost "Cislo" na hodnotu 100 (vlastnost je typu INT), která je opět
// umístěná v pluginu
myPlugin.Property("Cislo", 100);
// získá hodnotu z vlastnosti "Cislo"
int cislo = myPlugin.Property<int>("Cislo");
// získá hodnotu z "TEXT" ze zdroje v Properties
string text1 = myPlugin.Res().GetString("TEXT");
// získá hodnotu z "TEXT" z vlastního zdroje
string text2 = myPlugin.Res("MyResource").GetString("TEXT");
// předá formulář do pluginu
myPlugin.ParentForm(this);
// odešle příkaz pouze tomuto pluginu
myPlugin.SendCommand("show");