C# - COM komponensek elérése a HttpServerUtility osztállyal

forráskód letöltése
A fejlesztők számára bizonyára ismeretes, hogy miként lehet adatok táblázatos és grafikus megjelenítésére igénybe venni olyan alkalmazásokat, mint a Microsoft Excel. Ebben a cikkben annak járunk utána, hogyan létesíthetünk kapcsolatot Web-oldalunkról az Excel alkalmazással.
Ahhoz, hogy az Excel elérhető legyen, itt is szükséges egy referenciát hozzáadni projektünkhöz. Válasszuk tehát a Project - Add reference menüpontot, majd a COM lapon keressük elő a Microsoft Excel 10.0 Object Library-t. A verziószám az éppen telepített Excel verziószámától függően változhat.
Az Excel APS.NET-es alkalmazásból történő eléréséhez módosítsuk az alapértelmezésben a %winntroot%:\WINDOWS\Microsoft.NET\Framework\%version%\CONFIG könyvtárban lévő machine.config állományban a processModel bejegyzésnél a userName attribútumot system értékre, majd indítsuk újra a gépet.
<processModel ... userName=”system”>
  ...
Nagyon sok munkától kíméli meg a fejlesztőket, hogy a Microsoft lehetővé tette, hogy bizonyos kötöttségek mellett, igénybe vegyük az elkészített alkalmazásainak funkcionalitását. Ebbe a kategóriába tartozik a Microsoft Excel alkalmazás is, melyet többféleképpen elérhetünk. A kapcsolat felépítését a .NET Framework futtatórendszer teszi lehetővé számunkra, a következő alapelvekkel:
A .NET Framework különbséget tesz menedzselt és nem menedzselt kód között, attól függően, hogy az adott kód a CLR-futtatórendszer felügyelete alatt működik, elérve a CLR nyújtotta szolgáltatásokat (például szemétgyűjtés, védett erőforrásokhoz való hozzáférés-szabályozás), vagy nem. A COM komponensek, az ActiveX interfészek és a Windows API függvények a nem menedzselt kategóriába tartoznak.
A COM komponensek az interfész alapú kódok kategóriájába tartoznak, azonban anélkül érhetjük el funkcióikat, hogy ezeket az interfészeket implementálnánk alkalmazásunkban, vagyis a COM komponensek típuskönyvtáraiban elhelyezett típusinformációkhoz úgynevezett metaadatokon keresztül férhetünk hozzá. Ezekre a futtatórendszernek van szüksége.
A COM komponensekkel való kapcsolatot a .NET COM Interop szolgáltatása teszi lehetővé, mely implicit módon létrehoz egy osztály interfészt a nyilvános metódusok, property-k, mezők és események eléréséhez. Például az Application osztályhoz egy _Application interfészt.
COM komponensekre való hivatkozáskor a komponenshez létrejön egy assembly, mely bekerül a hívó alkalmazás manifeszt-jébe.
A .NET Framework rendelkezésre bocsát egy osztályt HttpServerUtility néven, mely lehetővé teszi, hogy egy object típussal hivatkozzunk a COM komponens megfelelő osztályaira.

CreateObject
Osztály: HttpServerUtility
public object CreateObject(
string progID
);
Lehetővé teszi, hogy az adott COM komponensből egy szerveroldali példányt hozzunk létre a komponens program-azonosítójának felhasználásával.
Paraméterek
string progID
A program-azonosítót tartalmazó karakterlánc.
Visszatérési érték
Egy objektum, mellyel használhatók az adott komponens-osztály metódusai explicit típuskényszerítés felhasználásával. Amennyiben nem sikerül valamilyen ok miatt létrehozni az objektumot, vagyis példányosítani a komponens-osztályt, egy HttpException kivétel keletkezik.
Vizsgáljuk meg, hogyan történik ez alkalmazásunkban. A feladat az, hogy a karakteres formában megadott matematikai művelet kiszámításához a Microsoft Excel alkalmazását használjuk fel, az Excel alkalmazás COM komponensekben megvalósított lehetőségeivel.
Az Excel alkalmazás osztályaihoz létrehozunk három objektumot:
private object ea;
private object ewb;
private object er;
Az oldal töltődésekor létrehozzuk a komponens-osztályok szerveroldali példányait:
ea = Server.CreateObject("Excel.Application");
ewb = (Excel.Workbook)((Excel.Application)ea).Workbooks.Add(m);
er = (Excel.Range)((Excel.Application)ea).Cells[1, 1];
Az alkalmazásban egy Execute nevű függvény végzi el a műveletet, vagyis végezteti el a műveletet az Excel alkalmazással. A függvény karakterláncot vár paraméterként, mely a műveletet reprezentálja, valamint egy double értéket ad vissza eredményként:
public double Execute(string s)
{
  ((Excel.Range)er).FormulaArray = "="+s;
  double result = Convert.ToDouble(((Excel.Range)er).Value2);
  ((Excel.Workbook)ewb).Close(false, m, m);
  ((Excel.Application)ea).Quit();
  return result;
}
Az ASP.NET lapon egy-egy Label fogja megjeleníteni az eredményeket a következők szerint a megfelelő gomb lenyomására:
...
eLabel1.Text = Execute(tb1.Text).ToString();
...