arckép

Neuwirth István

programtervező informatikus MSc – ELTE

Computational and Software Techniques MSc – Cranfield, UK

Elérhetőség
pitta2@gmail.com
+36 30 329 3039

Valid XHTML 1.0 Transitional

Valid CSS!

Plugin-ek

A plugin-ek segítségével később szabadon bővíthetjük programjainkat azok újraírása nélkül. Ráadásul egy ilyen bővíthető rendszert könnyen megírhatunk, lássuk, hogyan!

A plugin (vagy plug-in, magyarul beépülő modul) egy olyan program, amely egy másik program képességeit terjeszti ki. Általában dll-ekről van szó, amelyeket egy megadott könyvtárba, a szoftver plugin könyvtárába helyezve, kibővítik a program funkcionalitását. Ilyen például egy grafikus szoftver új szűrője, egy szövegszerkesztő különálló helyesírásellenőrzője, stb. Természetesen valamilyen megállapodás szerinti felületen keresztül érhetjük el a beépülő modul szolgáltatásait. Hatalmas előnye az ilyen jellegű bővíthetőségnek, hogy csupán ezt a felületet kell ismerni, a szoftvert magát nem. Így mi magunk is írhatunk ilyen plugin-eket más programokhoz és mi is készíthetünk olyan programot, amely szabadon bővíthető más által, anélkül, hogy fel kellene fednünk a programunk forrását.

Egy ilyen rendszer megvalósítását egy végletekig leegyszerűsített példán keresztül vázolom fel az alábbiakban.

Tegyük fel, hogy van két különálló projektünk. Az egyik lesz a főprogramé, amely az egyes modulok betöltéséért felel, illetve tartalmazza a beépülő modulok ősosztályát (vagy jelen példában egy interfészét), a másik pedig tartalmazza a származtatott vagy az interfészt implementáló osztályt. A példában ezt egy Class nevű osztály teszi meg, a névtér mindkét projekt esetén Plugin. Figyeljük meg, hogy a főprogram forráskódjára nincs szükségünk, a modulokat teljesen különállóan fejleszthetjük és fordíthatjuk. Ahhoz, hogy az ősosztály/interfész leírásához hozzáférjünk, a modul projektnél a References részben adjuk hozzá a fordított főprogramot.

A betöltés a következőképp zajlik: a betöltő rutinban a program egy kiválasztott könyvtár (itt a program indításának helye, de általában egy külön könyvtár) dll kiterjesztésű fájljain végigmegy (természetesen lehetne másmilyen kiterjesztésű is), majd ezeket, mint assembly betölti. Az assembly a lefordított kódot tartalmazó fájl, melyben a tényleges kód mellett úgynevezett metainformációkat is találunk, amely segítségével a kódban lévő osztályokról, azok tagfüggvényeiről, stb. informálódhatunk. Például egy plugin.GetTypes() függvényhívással tájékozódhatunk a dll-ben implementált típusokról, majd a visszakapott Type típusú objektumok megfelelő függvényeivel információkat szerezhetünk a mezőnevekről, metódusokról, paraméterekről, stb. A példánkban a típus alapján az Activator osztály segítségével hozunk létre példányt, amelyet ezután szabadon használhatunk.