C# - Assembly regisztrálása COM objektumként

forráskód letöltése
A Visual Studio.NET segítségével könnyedén leküzdhetjük a technológiák közötti átjárhatóság akadályait. Cikkünkben bemutatjuk, hogyan lehetségesl, hogy a létrehozott osztályainkat COM objektumként regisztrálva elérjük akár egy parancsállományból is. A művelet kapcsán bemutatjuk a .NET Framework egyik parancssori eszközét, mely segítségünkre van ebben.
Amennyiben a CalledClass.dll állományt nem a példaprogram segítségével, hanem parancssorból regisztrálja, akkor a regisztrált DLL-t helyezze el a Windows rendszermappájában (system32 mappa).
A RegAsm.exe alkalmazás
A Visual Studio.NET assembly regisztrációs eszközéről van szó, mely parancssorból indítható, opcióival finomíthatóak a regisztrációs beállítások. A program alkalmas arra, hogy egy assembly-t COM objektumként regisztráljon, melyet felhasználhatunk egy alkalmazásból. Ezt úgy éri el, hogy a meta-adatokat beolvassa az assembly-ből, és elhelyezi a szükséges bejegyzéseket a regisztrációs adatbázisban. Ezek eredményeképpen a COM kliensek úgy használhatják az assembly-ben megadott osztályt, mintha az egy valódi COM osztály lenne. A program a parancssorból a következőképpen indítható:
regasm <assembly fájl neve> [opciók]
A felhasználható opciókat a következő táblázatban foglaljuk össze.
Opció Magyarázat
/codebase A CodeBase bejegyzés elhelyezésre kerül a regisztrációs adatbázisban. Amikor is egy assembly nem a GAC-ba kerül (ahogy normális esetben), hanem egy általunk megadott helyre, akkor a helyet az assembly konfigurációs állomány <codeBase> szegmensében kell megadni. Ekkor az assembly úgynevezett „strong-named” assembly.
/help Információkat kaphatunk a program opcióinak használatáról.
/nologo Indításkor nem jelenik meg a Microsoft kétsoros tájékoztatója.
/regfile [: fájlnév] Generálható egy .reg kiterjesztésű állomány a regisztrációkor, mely tartalmazza a regisztrációs bejegyzéseket. Ha ezt generáljuk, akkor a regisztrációs művelet nem jegyez be semmit a Registry-be. Nem használható együtt a /u vagy /tlb opciókkal.
/silent Nem jeleníti meg a sikeres regisztrációról tájékoztató szöveget.
/tlb [: fájlnév] Generál egy típuskönyvtárat az assembly-hez, melyben megtalálhatóak a definíciói az assembly típusainak.
/u Törli az assembly regisztrációját.
/verbose Ad egy listát is a hivatkozott assembly-kről, amik miatt egy .tlb generálása szükséges.
Felhasználás a gyakorlatban
A mellékelt programban létrehozunk egy osztályt tartalmazó osztálykönyvtárat, melyet COM objektumként regisztrálunk – a kényelmesebb használat érdekében – programból, majd a mellékelt Caller.wsf parancsállományban meghívjuk a definiált metódusát.
A generált assembly neve CalledClass, a benne deklarált osztály neve MyClass. Az osztály egy metódussal rendelkezik, mely összead két bemenő egész paramétert.
public string GetResult(int op1, int op2)
{
  int res = op1 + op2;
  return "Az eredmény: " + res.ToString();
}
A program űrlapján elhelyezett, „Regisztrálás COM objektumként” feliratú gomb segítségével elindíthatjuk a RegAsm.exe alkalmazást, átadva parancssori argumentumként a DLL nevét. Ennek érdekében a CalledClass.dll állományt – mivel a parancssori argumentum hossza sem korlátlan – ideiglenesen a rendszermeghajtó gyökerébe másoljuk, majd onnan töröljük.
A programban a GetRegTool metódussal megkeressük a RegAsm.exe alkalmazást, majd elindítjuk a következő módon:
<rendszermeghajtó>:\\...\regasm.exe <rendszermeghajtó>:\\CalledClass.dll
Ekkor az assembly regisztrálásra kerül, mint COM objektum, és elkészül a bejegyzés a regisztrációs adatbázisban is. Erről a Visual Studio.NET másik, OLE/COM Object Viewer eszközével győződhetünk meg, mely az IDE Tools menüjéből indítható. A bejegyzést a .NET Category csoport tartalmazza.
A regisztráció után használhatjuk a Form két szövegmezőjét az operandusok megadására. A MŰVELET gomb segítségével futtatható a parancsállomány, mely a két argumentumként kapott értéket összeadja a regisztrált objektum példányosítása után, annak metódusával.
A példányosítás a következőképpen történik:
var calledobj = WScript.CreateObject("CalledClass.MyClass");
Majd meghívjuk a GetResult metódusát a két paraméterrel:
calledobj.GetResult(op1,op2);
A művelet sikeres végrehajtása érdekében a regisztrált assembly-t tartalmazó DLL-t el kell helyezni a Windows rendszermappájában, a system32 mappában. A regisztráció alkalmával a példaprogram megteszi ezt.