C# Plugin rendszer - egyszerűen

C# Plugin rendszer - egyszerűen
2010-03-04T18:41:03+01:00
2010-03-06T11:15:21+01:00
2022-10-27T20:55:35+02:00
  • És az miért baj, hogy még 4 dll-t az exe mellé kell tenni? Az nem baj, hogy a felhasználóknak telepíteniük kell a teljes .NET framework-ot? De egyébként még erre is mondok megoldást, bár teljesen felesleges:
    Microsoft Download Center: Windows, Office, Xbox & More
    Mutasd a teljes hozzászólást!
  • Igen, én is nézegettem a MEF-et, az a baj vele hogy ahhoz hogy a programba beépüljön, még vagy 4 dll file kell mellé. És már így is van elég, mert a program használ két saját készítésű library-t illetve ugye a PluginInterface-t.
    Mutasd a teljes hozzászólást!
  • Microsoft Corporation
    Igaz, .NET 4.0-s, de pont erre jó.
    Mutasd a teljes hozzászólást!
  • Egy nagyon primitív dolgot alkottam korábban. Íme:
    Addin kezelés
    Mutasd a teljes hozzászólást!
  • Köszönöm a gyors választ!
    Esetleg el tudnád küldeni ennek a programnak a forráskódját? Sokat segítene!

    És igen, sok hibája van, például ha valaki csinál egy olyan plugint ami egy végtelen loopba teszi a programot, akkor az az egészet megfagyasztja (ezért is gondoltam pl arra hogy a pluginek funkciói külön threadben indulnak el) és végleg leállíthatja a programot.
    Mutasd a teljes hozzászólást!
  • Üdv!

    Egyszer csináltam hasonlót. A host alkalmazás egy szerkesztőprogram volt, míg a majdani pluginek analizáló funkciók ellátására szolgáltak. Mivel minél kevesebb megkötéssel akartam korlátozni az integrátort, azt vártam el, hogy a pluginban legyen egy Analyze() metódus, aminek két paramétere volt: a szerkesztett objektum és egy window handle, amit szülőablaknak használhat. Ezt tartalmazta tehát az IAnalyze interface.

    Azt vártam el, hogy ha valaki készít egy plugint, másolja a plugins alkönyvtárba. A host alkalmazás indulásakor az ebben a könyvtárban található dll-eket reflektáltam végig: ha a dll-ben volt olyan osztály, ami implementálta az IAnalyze interfacet, akkor azt hozzáadtam egy Plugins (IAnalyze típusú elemeket tartalmazó) listához.

    Az IAnalyze interface implementálásán túl elvártam, hogy a plugin osztály rendelkezzen egy custom MenuItemName típusú attribútummal, amiben az adott plugint indító menüelem nevét kellett megadni. A reflection során ezt is eltároltam, és a host alkalmazás Plugins menüjéhez hozzáadtam. A meghívás úgy történt, hogy egy adott menüelem kattintásakor a Plugins lista megfelelő elemén meghívtam az Analyze metódust az éppen szerkesztett objektummal és a this-szel, mint szülőablak.

    Innentől a plugin azt csinált, amit akart, saját dialógust jeleníthetett meg, stb.

    No, röviden ennyi, amúgy biztosan számos hibája van ennek, pl én egyáltalán nem számoltam rosszindulatú pluginekkel, ilyen irányú védelemmel nem foglalkoztam. Nyilván ha sok plugin van, hülyén néz ki a sok menü, érdemesebb talán kilistázni őket valahol. A pluginek keresési könyvtára lehetne konfigurálható is. Ilyesmik.

    Sok sikert!
    Mutasd a teljes hozzászólást!
  • Üdv!

    Belekezdtem egy program fejlesztésébe C# alapon, viszont a folyamat alatt annyira elaprózódott a szükséges funkciók és "feature"-ök száma hogy úgy döntöttem, hogy ha a felhasználók tényleg akarnak végül valamit bele, megírják maguk, plugin formájában. Ez azért is jó mert jóval hamarabb ki tudom adni az alkalmazást és a felhasználóknak is csak azokat az assembly-ket kell betölteni amikre tényleg szükségük van. De itt elakadtam.

    Azt hittem egy egyszerű sétagalopp lesz a plugin Interface megírása, de mivel eddig ilyennel nem foglalkoztam, ezért egy hét alatt odáig jutottam hogy a pluginek letárolják a saját nevüket, a készítőt, a verziószámot, és egy rövid leírást.

    Viszont én ennél jóval nagyobb funkcionalitást szeretnék neki adni. Többek között szeretnék beletenni egy olyan parancsot, ami a host alkalmazás egy adott menüjébe teszi bele az adott nevű és ikonú új menüelemet (3 lehetséges hely: ToolStrip, MenuStrip, és a ContextMenuStrip), azokhoz egy belső funkciót rendeljen hozzá, illetve akár új Formok megjelenítésére is képes legyen. Nem akarom viszont külön AppDomain-be tenni, mivel ha egy plugin összeomlik akkor valószínűleg a program végkimeneti fájljai is sérülnek, így hát inkább lássa a mezei felhasználó hogy "bossameg megint összeomlott", minthogy több órányi szenvedés eredményeképp kapjon egy érvénytelen filet.

    Valaki esetleg tudna segíteni ennek az interface-nek a létrehozásában? Nem tutorialokat kérek, mert azokat már kerestem (sajnos egy sem felelt meg), hanem egykét olyan segítőkész embert, aki szeretne részt venni egy ingyenes program fejlesztésében!

    Válaszaitokat előre is köszönöm!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd