C# - COM+ szolgáltatások menedzsmentje programból

forráskód letöltése
A Windows rendszerben futó COM+ szolgáltatásokat nem csak elérni tudjuk, hanem egy rendelkezésre álló COM komponensen keresztül bizonyos adminisztrációs tevékenységeket is elvégezhetünk. A komponens osztályai lehetővé teszik, hogy információkat tudjunk meg a COM+ komponensekről, valamint hogy szükség esetén töröljük a regisztrációjukat. Cikkünkben ezt a komponenst mutatjuk be.
A mellékelt példa használata előtt a COMService projektben fordításkor generálódott DLL-t regisztrálnia kell a Windows rendszer komponens szolgáltatásai közé. Ennek érdekében a Visual Studio.NET parancssorába gépelje be a következőket: regsvcs <elérési út>\\COMService.dll.
COM+ szolgáltatás létrehozása
A mellékelt példában egy COM+ komponenst és az azt elérni képes kliens-alkalmazást készítettük el. A COM+ komponens segítségével demonstráljuk, hogy miként lehet törölni a regisztrált szolgáltatásokat a rendszerből.
A szolgáltatásunk neve TextComponent lesz, ez a név jelenik meg a Felügyeleti eszközök Komponensszolgáltatásokat rendszerező alkalmazásának megfelelő menüpontjában.
A COM+ szolgáltatás osztálya a ServicedComponent osztályból származik, specifikáltuk az alkalmazás nevét a névtér deklarációja előtt, valamint létrehoztunk egy nyilvános metódust, melyet majd a kliensből meghívunk.
A projektekben a System.EnterpriseServices.dll könyvtárat meg kell adni referenciaként. Miután lefordítottuk a COMService projektet, a generálódott DLL-t az útmutatóban megadott módon regisztrálni kell.
A komponens nyilvános metódusa egy karakterláncot vár, melyet kiegészítve ad vissza a hívóalkalmazásnak.
A szolgáltatás úgynevezett „Strong named” assembly, melynek titkos kulcsát a projekt mappájában helyeztük el, és a rá történő hivatkozást az AssemblyInfo.cs állományban. Ezzel a módszerrel aláírtuk a DLL-t, mely feltétele a regisztrációnak.
Kliens létrehozása
A kliens-alkalmazásban nemcsak meghívjuk a COM+ komponens metódusát, hanem lehetőséget biztosítunk a komponens törlésére, valamint a regisztrált komponensek kigyűjtésére is.
A metódus meghívásához egyszerűen meg kell adnunk a szolgáltatás assembly-jét referenciaként a kliensben, majd példányosítanunk az osztályt.
COMService.COMClass cc = new COMService.COMClass();
Ezt követően csak meghívjuk a metódust. Hiba következik be a műveletben, ha a komponens nincs regisztrálva.
textBox2.Text = cc.GetText(textBox1.Text);
A további műveletekhez referenciaként a kliensben meg kell adni a COM+ 1.0 Admin Type Library COM komponenst, melyet a COM palettáról kell kiválasztani.
A referenciaként megadott típuskönyvtárra a COMAdmin névvel hivatkozhatunk. Az alkalmazás TabControl kontroljának második füle alatt egy listában találjuk meg a regisztrált komponensek neveit.
Ennek érdekében példányosítottuk a COMAdmin névtér COMAdminCatalogClass osztályát, mely tartalmazza többek közt a komponensek objektumait.
catalog = new COMAdmin.COMAdminCatalogClass();
A katalógusban nemcsak regisztrált komponenseket találhatunk, hanem egyéb objektumokat is, így ha csak a komponensekre van szükségünk, akkor azok objektumait a GetCollection metódusával kérdezhetjük le, paraméterként az „Applications” karakterláncot megadva. Az eredmény egy COMAdminCatalogCollection típusú kollekció lesz.
applications = (COMAdmin.COMAdminCatalogCollection)catalog.GetCollection("Applications");
A tárolt objektumok mindegyike egy COMAdminCatalogObject objektum, melyek Name property-je tartalmazza a listában megjelenő nevet. Ott találjuk a saját komponensünket is.
applications.Populate(); 
foreach(COMAdmin.COMAdminCatalogObject app in applications)
{
  listBox1.Items.Add(app.Name);
}
Amennyiben a listából kijelölünk egy objektumot, akkor a felbukkanó ablakban megnézhetjük az objektum azonosítóját, mely a Rendszerleíró adatbázisban bejegyzésre került.
Ekkor a megfelelő sorszámú objektumot lekérdezzük a kollekcióból.
application = (COMAdmin.COMAdminCatalogObject)applications.get_Item(listBox1.SelectedIndex);
Majd a Key property-t kiolvasva megismerhetjük az azonosítót.
MessageBox.Show("Objektum tulajdonságai:" + '\u000D' + "Azonosító: " + application.Key.ToString());
A kollekcióból törölhetjük is a saját komponensünket. Elővigyázatosságból csak a saját komponensünket, hiszen a többire más alkalmazásban van szükség.
Ekkor végiglapozzuk a komponensek kollekcióját, majd kiválasztjuk a TextComponent nevet viselőt. A sorszámot átadjuk paraméterként a kollekció Remove metódusának, mely törli a komponens regisztrációját.
for(int i=0;i<applications.Count;i++)
{
  application = (COMAdmin.COMAdminCatalogObject)applications.get_Item(i);
  if (application.Name.ToString() == "TextComponent")
  {
    applications.Remove(listBox1.SelectedIndex);
  }
}
A változásokat végül érvényesítjük a SaveChanges paramétert nem váró metódussal.
applications.SaveChanges();
A törlés után már hibaüzenetet kapunk a komponens metódusának meghívásakor.