Assembly regisztrálása a Globális Assembly Cache-ben
A .NET CLR által használt Globális Assembly Cache , vagy egyszerűen csak GAC igen hasznos újítása a rendszernek, hiszen elérhető, hogy az egyes assembly-kben tárolt kód felhasználása ne korlátozódjon egy alkalmazásra, helyette tudjuk annak képességeit több alkalmazásban, kompromisszumok nélkül felhasználni.
A dinamikus könyvtárak megosztása nem új keletű elmélet, azonban kiteljesítése a .NET rendszerben látszik megvalósulni. Lényege, hogy egy közös tárolóban találhatóak az assembly-k, melyek a CLR szemszögéből globális névterek, így az adott alkalmazásban nem generálódik helyi másolat a futtatható állomány mellett.
Annak érdekében, hogy assembly-nkben található kódunkat elhelyezhessük a GAC-ban - megoldva a globális elérést - el kell látnunk az assembly-t egy úgynevezett STRONG NAME-el, mely eljárásnak köszönhetően biztosítható, hogy az adott assembly neve biztosan egyedi legyen a tárolóban.
Az eljárás azt jelenti, hogy az assembly-t tartalmazó DLL-t ellátjuk egy aláírással. Ennek érdekében a .NET Framework Sn.exe eszközével elkészítünk egy kulcspárt tartalmazó állományt. A program eléréséhez nyissuk meg a Visual Studio.NET parancssorát a projektet tartalmazó könyvtárral a prompt-ban, majd adjuk meg a következő sort:
sn –k <kulcsállomány neve>.snk
Az állományt adjuk hozzá az assembly projektjéhez, majd az AssemblyInfo.cs állományban adjuk meg az elérési útvonalát az AssemblyKeyFile attribútumban:
[assembly: AssemblyKeyFile("keypair.snk")]
A projektet lefordítva az aláírás bekerül a DLL kódjába, vagyis elláttuk az assemblyt egy „erős névvel”. Ezt ellenőrizhetjük is, ha a parancssorban begépeljük a következő sort:
sn –c <assembly neve>.dll
Az eredmény egy üzenet, mely tájékoztat arról, hogy az assembly megfelelő formátumú, készen áll a regisztrációra.
A regisztrációhoz használhatnánk a .NET Framework GACUTIL.EXE parancssori eszközét, ám ennél egy kényelmesebb módszert választunk. Nyissuk meg a Microsoft Management Console programot (Start menü – Futtatás – mmc begépelés), ahol a FILE menüben válasszuk ki a Beépülő modul hozzáadása/eltávolítása pontot.
A megjelenő panelen válasszuk a Hozzáadás gombot, mely egy újabb ablakban megjeleníti a lehetséges hozzáadható modulok listáját.
A lista első eleme a .NET Framework Configuration, melyre most szükségünk van. Ezt a Hozzáadás gomb segítségével adhatjuk a konzolhoz, majd a Bezárás gombra kattintva zárhatjuk be az ablakot.
A hozzáadott modul alpontja a My Computer nevet viseli, ahol az első almenüre kattintva (Assembly Cache) érhetjük el, hogy megjelenjen a regisztrált assembly-k listája. A gyorsmenüben kiválasztva az Add pontot tehetjük meg, hogy a létrehozott AssemblyLibrary nevű assemblyt elhelyezzük a GAC-ban. A felbukkanó OpenDialog ablakban meg kell keresnünk a merevlemezen a generált DLL-t. A listában megjelenik az assembly, készen a felhasználására.
Assembly felhasználása alkalmazásban
A mellékelt példában referenciaként már a GAC-ban regisztrált változatot kell megadnunk. Ehhez a projekt gyorsmenüjéből válasszuk az Add reference menüpontot, majd a .NET fülön található Browse (nem pedig a Projects fül alatti gombbal) gombbal keressük meg a projekt generálta assembly állományát, majd nyomjuk meg az OK gombot.
A referenciák listájában megjelenik az AssemblyLibrary hivatkozás, azonban már nem kerül helyi másolat a Windows-os alkalmazás futtatható állománya mellé.
Az assembly tulajdonságlapján látható, hogy a Copy Local property értéke FALSE. Ez azt jelenti, hogy a program a GAC-ban keresi a hivatkozott osztály kódját. Ezzel elérhető, hogy az alkalmazások anélkül érjék el az assembly kódot, hogy rendelkeznének egy példánnyal az azt tartalmazó DLL-ből.
Az így fejlesztett programokat speciálisan konfigurált telepítő alkalmazás segítségével kell hordozhatóvá tenni, a GAC-ban található hivatkozásokat annak speciális mappájában kell elhelyezni, hogy a telepítő a célgépen oda regisztrálja.
A Form betöltődésekor meghívjuk az assembly MyClass osztály statikus függvényét, mely egy karakterláncot ad vissza.
textBox1.Text = AssemblyLibrary.MyClass.SystemDirectory();
Amennyiben az assembly-t már eltávolítottuk a GAC-ból, de a program ismeri a lokális másolat helyét, és a DLL onnan is hiányzik, akkor a program indulásakor a hiba nem az assembly kódjának elérésekor keletkezik, hanem már a MAIN függvényben, az Application.Run metódus meghívásakor.
A tárolóban elhelyezett assembly a gyorsmenü Törlés gombjával távolítható el a listából.