Rozšiřitelná aplikace – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Rozšiřitelná aplikace – .NET – Fórum – Programujte.comRozšiřitelná aplikace – .NET – Fórum – Programujte.com

 

XP
~ Anonymní uživatel
401 příspěvků
10. 11. 2012   #1
-
0
-

Zdravím,

potřeboval bych udělat aplikaci založenou na pluginech. Hlavní aplikace by sloužila jako hlavně jako správce pluginů a měla by nějakou minimální funkcionalitu. Ideálně kdyby se mohli pluginy mohly za behu pripojit a odpojit (odpojení není zatím nezbytně nutné). V pluginech by byla implementována vlastní funkcionalita s GUI, které by se po načtení pluginu do hlavní aplikace zobrazilo jako třeba ve vlastní záložce.

Program bude psaný v C#. Jakou technologii použít pro napsání takovéto aplikace?

1) Reflexe

- plugin nejde odpojit

- celkem snadné

2) Add-Ins

- Je obtížnější GUI pluginu zobrazit v hlavní aplikaci?

- Lze snadno připojit pluginy s různou verzí

- Pluginy lze odpojit

Zatím se přikláním k Add-Ins, nebo máte jiný nápad? (PS: V C# začínám)

Nahlásit jako SPAM
IP: 90.180.145.–
XP
~ Anonymní uživatel
401 příspěvků
10. 11. 2012   #2
-
0
-

PS: GUI bude pomocí WindowsForms

Nahlásit jako SPAM
IP: 90.180.145.–
ingiraxo+15
Grafoman
10. 11. 2012   #3
-
0
-

zrovna na tohle jsem dělal knihovnu před cca 2 měsíci http://ophite.cz/projects/ophite-loader/ (pokud chceš můžeš použít, je tam i dokumentace)

pokud chceš vlastní, tak na tom neni nic těžkýho, musíš vytvořit "jádo" pluginu, který bude sloužit jako prostředník mezi všemi pluginy (pro vžájemnou komunikaci) a s aplikací

jedinej problem je, že takovej loader pro pluginy je většinou specifickej pro každou aplikaci, takže jeden nemůžeš použít pro všechno... v tom jsem tohle trochu obešel "externím" voláním, takže je to multifunkční

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
XP
~ Anonymní uživatel
401 příspěvků
10. 11. 2012   #4
-
0
-

Nevypadá to špatně. Nemáš náhodou nějaký příklad použití tvé knihovny?

Nahlásit jako SPAM
IP: 90.180.145.–
ingiraxo+15
Grafoman
10. 11. 2012   #5
-
0
-

#4 XP
při použití ke všemu používáš statickou třídu OLoader

takže stručná ukázka: 

// nacte vsechny pluginy z adresare "plugins"
OLoader.LoadPlugins("plugins");

// bude automaticky pridavat nebo odebirat pluginy ve slozke "plugins"
OLoader.AutoDetect(true, "plugins");

// bude chranit adresar s pluginy (vse co neni detekovany jako plugin pro OphiteLoader vymaze)
OLoader.ProtectPluginsDirectory(true, "plugins", true);

// nacteni pluginu rucne
Ophite.Load("plugin.dll");

// odebrani pluginu
Ophite.Unload("plugin.dll"); // nebo pres handle

// pokrocilejsi funkce, pro volání.. uvedu jen pro funkce, existuje i pro vlastnosti a dokonce spojování udalosti
// misto Func potm "Property, Event"
OLoader.Get("nazevPluginu").Func("NazevFunkce", parametry_pokud_nejaky_jsou);

// nebo lze zavolat přímo resource z pluginu
OLoader.Get("nazevPluginu").Res("nazevZdroje");

// 3 zakladni udalosti
OLoader.Loaded // pri nacteni pluginu
OLoader.Unloaded // pri odebrani pluginu
OLoader.ActualResourceChanged // zmena aktualniho zdroje

jinak pokud chces projit vsechno aktivní pluginy, tak 

foreach (OIPlugin plug in OLoader.Plugins)
{
    // + ma dalsi zakladni vlastnosti (autor, verze, info...)
    string name = plug.PluginName;
}

// a v posledni rade takova pomocna funkce, kde bezi smycka (lze nastavit i pocet iteraci),
// kde kazdych 100ms se vykona nejaky cinnost (napr. ruční zjistovani pluginu nebo cokoli jinyho)
// bezi v separatnim vlakne
OLoader.Loop(100, new Action(() => { /* telo */ }));

všechny funkce/tridy maji CZ dokumentaci


Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
XP
~ Anonymní uživatel
401 příspěvků
11. 11. 2012   #6
-
0
-

díky, povedlo si mu už konečně načíst pluginy (v dokumentaci je drobna chybka místo: a) Hlavní jmený prostor pluginu musí být “OphiteLoader“. by mělo být "OphitePlugin"). Trochu tápám, jak udělám, když mám v pluginu User Controls, který potřebuji zobrazit na formuláři hlavní aplikace. Z dokumentace bych řekl, že se k tomu budou využívat funkce ParentForm a ParentControl. Nenašel jsem funkci, jak potom k předanemu formuláři zase přistoupit, abych mohl do něj přiřadit User Controls z pluginu.

Hlavní aplikace:

namespace TestPlugin
{
    public partial class Form1 : Form
    {
        public OIPlugin pluginA;
        public Form1()
        {
            InitializeComponent();
            OLoader.ErrorReporting += (ErrorReporting_Handler);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (OLoader.Load("PluginA.dll"))
                label1.Text = "Ano";
            else
                label1.Text = "Ne";
        }


        private void button2_Click(object sender, EventArgs e)
        {
            pluginA = OLoader.Get("PluginA");
            label3.Text = pluginA.PluginName;
            pluginA.ParentForm(this);
        }

        private void ErrorReporting_Handler(OExceptionType type, Exception ex)
        {
            label2.Text = type.ToString() + "; " + ex.Message;
        }
    }
}

Plugin:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OphiteLoader;

namespace OphitePlugin
{
    public class Plugin : OPluginBase
    {
        private string myName;
        private string myAuthor;
        private string myDescription;
        private string myVersion;
        Control myControl;

        public Plugin()
        {
            this.myName = "PluginA";
            this.myAuthor = "Aaaa Bbbbb";
            this.myDescription = "Toto je plugin A";
            this.myVersion = "1.0.0.0";
            myControl = new Control();
            ???.Controls.Add(this.myControl); // Jak přistoupit k formuláři hlavní aplikace???
        }

        public override string PluginName
        {
            get { return this.myName; }
        }

        public override string Author
        {
            get { return this.myAuthor; }
        }

        public override string Description
        {
            get { return this.myDescription; } 
        }

        public override string Version
        {
            get { return this.myVersion; }
        }
    }
}
Nahlásit jako SPAM
IP: 90.180.145.–
ingiraxo+15
Grafoman
11. 11. 2012   #7
-
0
-

#6 XP
ano, ParentForm předává pluginu celé okno.. při připojení pluginu mu musíš přiřadit form, který chceš předat (což máš).. potom v pluginu mu akorát provedeš nějakou činost..

jen možná doplnim.. že je lepší předat form hned po připojení pluginu a né dodatečně přes tlačítko

vše je řešeno přepisováním funkcí v pluginu, takže 

public override void ParentForm(Form form)
{
    // ...
}

na UserControl jsem to netestoval, ale mělo by to fungovat, na tohle je podle mě lepší udělat vlastní knihovnu, kde budou tyhle UserControls pro app

jinak ten zápis nazvu a pod. info o pluginu děláš zbytečně do proměnných, můžeš to zapsat jednoduše jako 

public override string PluginName { get { return "NazevPLuginu"; } }
public override string Author { get { return "Franta"; } }

jinak můžeš i spojovat události z formu do pluginu.. ukázka kresleni na form

namespace OphitePlugin
{
    public class Plugin : OPluginBase
    {
        // nutno prepsat kvuli zruseni udalosti po deaktivaci pluginu
        public override void Deactivate()
        {
            base.Deactivate(); // volani puvodniho kodu !ponechat!
            parent.Paint -= Paint;
        }

        public override string PluginName { get { return "Nazev"; } }

        private Form parent = null;

        public override void ParentForm(Form form)
        {
            parent = form;
            parent.Paint += new PaintEventHandler(Paint);
        }

        private void Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;

            // kresleni...
        }
    }
}

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
XP
~ Anonymní uživatel
401 příspěvků
11. 11. 2012   #8
-
0
-

diky, uz to funguje

Nahlásit jako SPAM
IP: 109.80.156.–
XP
~ Anonymní uživatel
401 příspěvků
12. 11. 2012   #9
-
0
-

Zdravim,

kdyz se pokusim zavolat nejakou funckci z pluginu, pak se vyvola vyjimka:

FuncCaller(...) is missing!

//Hlavni aplikave:
public OIPlugin pluginA;
pluginA = OLoader.Get("PluginA");
label3.Text = (string)pluginA.Func("MyFunction");

//Plugin
public string MyFunction()
{
	return "Moje funkce";
}

Co delam spatne? diky

Nahlásit jako SPAM
IP: 147.229.64.–
ingiraxo+15
Grafoman
12. 11. 2012   #10
-
0
-

#9 XP
musíš doimplementovat FuncCaller do pluginu.. tohle se neobešlo bez zásahu, protože on rozlišuje instance kde se funkce nachází, takže...

// jen prepises funkci
public override object Func(string name, params object[] args)
{
    // instance třídy, kde se funkce nachází, typ pluginu (vzdy stejny) a
    // nazev a parametry jen predas
    return FuncCaller(this, typeof(Plugin), name, args);
}

tušim, že pro vlastnost a událost je to podobný

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 17 hostů

Podobná vlákna

Aplikace z c++ — založil ovens

Aplikace ve VS — založil kuba

Aplikace — založil hanis

Aplikace — založil ETNyx

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý