type: other

text:
INTINIERINĖS INFORMATIKOS KATEDRA
 1. ĮVADAS. 6
 1.1 Tyrimo objektas. 6
 1.2 Darbo tikslas ir utdaviniai. 6
 1.3 Temos naujumas. 7
 1.4 Temos aktualumas. 7
 1.5 Mokslinio darbo vertė.. 7
 1.6 Darbo aprobacija.. 8
 2. ANALITINĖ DALIS. 8
 2.1 Komponento apibrėtimas. 8
 2.2 Metaduomenų apibrėtimas. 10
 2.3 Komponentiniai modeliai, komponentai, metaduomenys. 10
 2.4 Metaduomenys .NET platformoje.. 12
 2.4.1 Metaduomenys platformoje. 12
 2.4.2 Tipų bibliotekos 12
 2.4.3 Aplinka: Bendros Kalbos Mašina (CLR) (Common Language Runtime (CLR)) 13
 2.4.4 Klasės pakroviklis (Class Loader) 14
 2.4.5 JIT kompiliatoriai ( Just – in – Time (JIT) compilers) 14
 2.4.6 Įrankiai (Tools) 14
 2.5 Komponentai ir rinkiniai. 15
 2.6 .NET komponento metamodelio ypatumai. 15
 2.5.1 Metaduomenų nauda. 17
 2.5.2 Metaduomenys ir save – apibūdinantys komponentai 18
 2.5.3 Metaduomenų struktūra ir panaudojimas. 18
 2.5.4 Metaduomenų Lentelės ir Aibės. 18
 2.5.5 Metaduomenų simboliai 18
 2.5.6 Metaduomenys viduje PE failo. 19
 2.7 .NET komponento, rinkinio manifestas. 19
 2.7.1 IL kodas. 21
 2.8 Bendroji Tipų Sistema (CTS) 21
 2.8.2 Nuorodų tipai 22
 2.9 Metaduomenys, paieškos vykdymo kriterijai. 22
 2.9.1 Tipo nariai – metaduomenys. 23
 2.10 Automatizuota .NET komponentų paieška.. 24
 2.11 .NET Reflection pagrindinės idejos. 26
 2.12 . Pasiūlymas, kai išplėsti .NET komponento metaduomenis. 27
 2.12.1 Atributų panaudojimas .NET platformoje. 27
 3. IŠVADOS. 29
 4. EKSPERIMENTINĖ DALIS. 30
 4.1 Naudota programinė įranga.. 31
 4.1.1 C# programavimo kalba. 32
 4.1.2 C# ir JAVA programavimo kalbų palyginimas. 32
 4.1.2 C# tipai 33
 4.2 Programos kūrimas. 34
 4.3 Metaduomenų tyrinėjimas programoje.. 37
 4.4 Trumpas programinio kodo aiškinimas. 46
 4.5 Programos naudojimo vadovas. 47
 5. IŠVADOS IR PASIŪLYMAI. 49
 6. LITERATŪRA.. 50
 Pav. 1: Programavimo kalbų sąveika, kompiliatoriai, CLR aplinka.. 11
 Pav. 2: CLR aplinka.. 13
 Pav. 3: Programos kodo kompiliavimas. 16
 Pav. 4: .NET komponento struktūra.. 20
 Pav. 5: .NET komponento – rinkinio hierarchija, metaduomenų modeliavimas. 22
 Pav. 6: .NET komponento – rinkinio metaduomenų hierarchija.. 24
 Pav. 7: WinCV – Class Viewer pagrindinis langas. 25
 Pav. 8: WinCV – Class Viewer pagrindinis langas, paieška.. 26
 Pav. 9: Atributų reikšmė .NET komponente.. 28
 Pav. 10: .NET platforma ir Microsoft Visual Studio.NET. 31
 Pav. 11: С# klasių elementai. 34
 Pav. 12 C# kodo kompiliavimas su atributais. 37
 Pav. 13 Programa išveda standartinius ir praplėstus metaduomenis. 38
 Pav. 14 Reflection ir bendroji tipų sistema (CTS) 39
 Pav. 15 MemberInfo detalizacija.. 39
 Pav. 16: Reflection objektų modelis. 44
 Pav. 17: .NET Rinkinio, jo modulio paieška.. 45
 Pav. 18: Modulio ir tipo paieška.. 45
 Pav. 20 Komponentinė diagrama.. 47
 Pav. 21 Programos darbo lango vaizdas. 48
 COM (Component Object Model) – Komponentinis objektų modelis
 EJB (Enterprise JavaBeans) – nuo platformos nepriklausoma komponentų architektūra, skirta objektiškai orientuotų taikomųjų utdavinių kūrimui
 DCOM (Distributed Component Model) – Paskirstytas komponentinis objektų modelis
 IL, MSIL (Intermediate Language, Microsoft Intermediate Language) – tarpinė kalba
 CLR (Common Language Runtime) – Bendros kalbos mašina
 CTS (Common Type System) – Bendroji dinaminė tipų sistema
 1.1 Tyrimo objektas
 Tyrimo objektas - .NET komponentų, jų metaduomenų panaudojimo technologija. Komponentas – tai tiratuojamas, autonomiškai modernizuojamas, tiksliai nusakytą paskirtį ir griettai apibrėttą interfeisą turintis programinis modulis, padarytas taip, kad jį būtų nesunku įtraukti į veikiančią programų sistemą arba tokioje sistemoje pakeisti jį kitu analogiškus paskirtį bei interfeisą turinčiu komponentu [12]. Komponento kontekste metaduomenys yra struktūrizuotas komponento, rinkinio, objekto potymių aprašymas.[10] Bendrąja prasme metaduomenys yra duomenys apie duomenis. Darbe nagrinėjami komponentų metaduomenys ir pasiūlomas būdas kaip juos išplėsti.
 1.2 Darbo tikslas ir utdaviniai
 Darbo tikslas – išnagrinėti .NET komponentines technologijas, .NET komponentų metaduomenų panaudojimą programų sistemose. Keliami utdaviniai:
 ü apibrėtti, kas yra komponentas;
 ü apibrėtti, kas yra komponento metaduomenys;
 ü apibrėtti .NET komponentą, jo metaduomenis;
 ü išskirti .NET komponentų metaduomenų tipus;
 ü apibrėtti komponentų paieškos ypatumus;
 ü pasiūlyti, kaip išplėsti .NET komponento metaduomenis;
 ü eksperimentu patikrinti gautus rezultatus;
 1.3 Temos naujumas
 .NET komponentinė technologija pastaruoju metu yra daugelio rengiamų konferencijų programose, straipsniai komponentinio programavimo tema yra labiausiai cituojamųjų sąrašuose. Pastaruoju metu komponentinė programų intinerija [2] [3] (o ypač atkartojimo (reuse) technologija) pritraukė didelį tyrinėtojų (Nierstrasz ir kt., 1992; Nierstrasz ir kt., 1995; Brown, 1997; Sametinger, 1997; Szyperski, 1997; Kozaczynski ir kt., 1998; Brown ir kt., 1998) susidomėjimą. Akcentuojamos sudėtinės dalys, tiūrime kaip į pakartotinai naudojamus komponentus. Komponentų metaduomenys yra labiausiai diskutuojama ir matiausiai suprantama koncepcija.
 1.4 Temos aktualumas
 Komponentai kuriami taip, kad būtų lengva juos integruoti. Tai yra patogu ir greita. Kiekvieno komponento nekuriame nuo pradtios.Yra įvairių nuomonių apie programinės įrangos atkartojimą (Bassett, 1997; Jacobson ir kt., 1997; Sametinger, 1997). Pagal Bassett’ą, atkartojimą yra “anksčiau sukurto komponento sugebėjimas būti panaudotu vėl, iš dalies arba visiškai, su modifikacijomis arba be jų” [4] (Bassett, 1997). Esminis elementas .NET technologijoje yra metaduomenys, suteikiantys programavimo kalbų jungumą, operavimąsi. Metaduomenys yra raktas į paprastesnį programinį modelį.
 1.5 Mokslinio darbo vertė
 Darbe pasiūlyta .NET komponento metaduomenis išplėsti atributais. Atributai – tai mechanizmas skirtas pridėti, išplėsti metaduomenis, kaip kompilatoriaus instrukcijos ir kiti duomenys apie duomenis, metodai, klasės. Atributai yra pridedami į metaduomenis. Pasiūlytas .NET komponentų metaduomenų išplėtimas gali būti panaudotas .NET komponentų automatizuotai paieškai vykdyti.
 1.6 Darbo aprobacija
 Darbe pasiūlyti sprendimai patikrinti eksperimentinėje dalyje.
 2.1 Komponento apibrėtimas
 Prieš pradedant nagrinėti komponentus, komponentines sistemas (an component-based system) jų metaduomenis (metadata) yra teisingai suprasti ir apibrėtti, kas tai yra. Todėl iš pradtių apibrėšiu pagrindines sąvokas. Komponentinė sistema – tai vienetas, kuriame todis komponentas yra pagrindinis, raktinis. Komponentinės sistemos gali būti sudarytos iš vieno komponento (kaip vartotojo sąsajos atveju), o gali būti daugia-komponentės sistemos. Komponentai yra abstraktesni negu objektų klasės ir gali būti laikomi savarankiškais servisų teikėjais [5].
 Yra daug komponentų apibrėtimų. Štai keli iš jų:
 PhilippeKrutchen, RationalSoftware [6] apibrėtia komponentą , kaip – reikšmingą, nepriklausomą ir keičiamą sistemos dalį, kuris atlieka tam tikrą funkciją apibrėttoje architektūroje. Komponentas prisitaiko ir numato interfeisų fizinę realizaciją.
 Pagal GartnerGroup [6]: Programinis vykdymo komponentas yra dinamiškai surištas paketas iš vienos ar keleto programų kaip vienetas per dokumentuotų interfeisų gali būti atidengtas vykdymo metu.
 Clemens Szyperski [2], [3] apibrėtia programinį komponentą, kaip kompozicijos vienetą su specifikuotais interfeisais ir atviru konteksto priklausomumu”
 GradyBooch, JimRumbaugh, IvarJacobson [7] apibrėtia Programinius komponentus, kurie įgalina praktinį daugkartinį jų panaudojimą. Egzistuoja ir kiti daugkartinio panaudojimo vienetai: išeities kodo bibliotekos, architektūros. Specifiškai, programiniai komponentai yra nepriklausomos produkcijos, išmokimo, išdėstymo vienetai.
 Pagal tiesioginį (on-line) kompiuterijos todyną :
 ü Didesnės sistemos ar struktūros dalis;
 ü Atskirai sukompiluotas programos modulis, kuris dinamiškai (veikiant programai) siejamas su kitais programos komponentais ir gali būti panaudotas keliose programose. Yra susiformavusi atskira komponentų projektavimo kryptis, vadinama komponentiniu programavimu.
 Nors yra daug komponento apibrėtimų, tačiau išnagrinėjus aukščiau pateiktus, matome, kad Komponentas - nepriklausomas ir pakartotinai panaudojamas vienetas, kuri turi tokias pagrindines savybės:
 ü sukurtas tam tikram tikslui;
 ü siulo paslaugas per išreikštinį standartizuotą interfeisą;
 ü gali turėti kelias realizacijas;
 ü gali būti vykdomas skirtingose aplinkose;
 ü turi turėti dokumentaciją, aprašą.
 Objektas ir komponentas kartais vartojami kaip sinonimai, tačiau iš esmės tai yra skirtingos sąvokos. Komponentas yra išbaigta „detalė“, kuri gali būti įdėta į programą. Jis turi aiškiai apibrėttą sąsają su išore. Tuo komponentas iš išorės panašus į objektą. Tačiau jo vidinė struktūra gali būti įvairi. Komponentas datniausiai turi kelias klases ir objektus. Be to, komponente gali būti ne tik klasės. Jame net iš viso gali klasių nebūti. Komponentas gali būti sudarytas iš tradicinių procedūrų, gali turėti globaliųjų, statinių kintamųjų, net gali būti sukurtas naudojantis struktūrinio programavimo ar kitais principais. Panašiai kaip klasės gali būti susietos viena su kita paveldėjimo ryšiais, komponentai siejami importo ryšiais.
 Informacinių sistemų komponentai nevisada tapatinami su objektais. Tai gali būti objektų sudėtingesnė struktūra.
 ü statinės kompozicijos – surenkame ir pradeda veikti;
 ü dinaminės kompozicijos – sistemos vykdymo metu galime įjungti į sistemą.
 2.2 Metaduomenų apibrėtimas
 Metaduomenys yra labiausiai diskutuojama ir matiausiai suprantama koncepcija.
 Metaduomenys pagal kompiuterinį terminų todynėlį yra duomenys apie duomenis. Komponento kontekste metaduomenys yra struktūrizuotas komponento, rinkinio, objekto potymių aprašymas.[10] Bendrąja prasme metaduomenys yra duomenys apie duomenis. Paieškos metaduomenys: tai tokie metaduomenys, kurie reikalingi vartotojui, kad galėtų sutinoti, kas ir kokius duomenis turi, kur juos rasti, kaip įsigyti.
 Metaduomenys [11] apibūdina statinius ir dinaminius komponento aspektus, yra vartotojui prieinami ir gali būti panaudojami skirtingoms utduotims kurti programų intinerijoje.
 Programų kūrėjas, programuotojas rašydamas programinį kodą ir norėdamas panaudoti sukurtą komponentą savo programiniame kode turi tinoti kokias paslaugas atlieka sukurtas komponentas. Reikalinga papildoma informacija apie komponentą, utklausos ieškant specifinės informacijos susijusios su komponentu. Reikalinga įvairi informacija apie komponentą, kad tenkintų programuotoją. Programų kūrėjai norėtų sutinoti ar reikiamas komponentas atitinka saugumo reikalavimus programai, kaip yra išspręsta versijavimo problema, kokie yra naudojami metodai, laukai, operacijos ir kita detali informacija. Skirtinga informacija skirtinguose kontekstuose iškviečia bendrai tokią informaciją.
 Kadangi metaduomenų informacija yra labai svarbi, daugelyje komponentinių modelių yra sudaryta galimybė teikti papildomą informaciją – metaduomenis arba metametodus, grątinančius metaduomenis.
 2.3 Komponentiniai modeliai, komponentai, metaduomenys
 Pangrinėsiu keletą komponentinių modelių [11].
 Sun Microsystems pateikta metodika Enterprise JavaBeans (EJB) orientuota į paskirstytų taikomųjų utdavinių serviso dalies kūrimą. JavaBean komponentas yra suformuotas iš metaduomenų skirtas pritaikyti komponentą programai. BeanInfo objektas inkapsuliuoja papildomas rūšis metaduomenų apie komponentą: komponento pavadinimas, tekstinė informacija apie komponento funkcionalumą, jo savybes ir t.t.
 Microsoft korporacijos siūlomame objekto – komponento modelyje (Component Object Model (COM)) reiškia komponentinis objektinis modelis, tai yra „sudėtinio objekto modelis“. COM klasės yra matiausiai vienos sąsajos realizacija, o klasių poaibiai įvardijami kaip COM objektai. Komponentas apima kelias klases taip sudarydamas vienetą, kurį galima pritaikyti sistemų kūrimo projektuose.
 Interfeisai apibrėtiami tipų bibliotekose [13] – tai metaduomenų blokuose, kuriuose išvardinamos interfeiso savybės ir metodai, metodų parametrai, parametrų tipai ir gratinamos reikšmės.
 .NET platforma palaiko ne tik programavimo kalbų nepriklausomumą, bet taip pat ir kalbų susiejimą, integravimą. Tai reiškia, kad galima paveldėti klases, surasti klaidas, pasinaudoti polimorfizmu tarp skirtingų programavimo kalbų galimybe (pav.1). .NET platforma leidtia tai atlikti, pasinaudojus tokia technine sąlyga kaip Bendrų Tipų Sistema (Common Type System (CTS), kurią turi palaikyti visi .NET komponentai. CTS palaiko ir uttikrina pagrindinius klasių, sąsajų, nuorodų ir reikšmių tipus [1].
 Pav. 1: Programavimo kalbų sąveika, kompiliatoriai, CLR aplinka
 Analogiškai ir Microsoft korporacijos siūlomame paskirstyto objekto – komponento modelyje (Distributed Component Object Model (DCOM)) Iunknown interfeisas DCOM komponento sudaro galimybes įgyti informaciją, t.y. informaciją apie komponento interfeisus. Panašiai ir kituose komponentiniuose modeliuose.
 Metaduomenys paprastai, komponentiniuose modeliuose, pateikia generatyvią, bendrą informaciją apie komponentą: klasės pavadinimas, metodai, parametrai, jų reikšmės.
 2.4 Metaduomenys .NET platformoje
 2.4.1 Metaduomenys platformoje
 Metaduomenys yra mašininė – nuskaitoma informacija apie “duomenis apie duomenis”. Tokia informacija gali apimti detaliai: duomenų šaltinio turinys, dydis, formatas bei kitos charakteristikos. .NET aplinkoje, metaduomenys apima tipų apibrėttis, versijos informaciją, išorinio rinkinio (assembly) sujungimus bei kitą standartinę informaciją.[13]
 Bet kokios dvi sistemos, komponentai ar objektai operuodami vienas su kitu turi tinoti katką vienas apie kitą. COM tai vadinama interfeiso specifikacija, kuris yra įgyvendinamas komponento tiekėju ir naudojamas vartotojų. Interfeiso specifikacija apima metodo prototipus su signatūromis, taipogi tipų apibrėttis visiems parametrams bei gratinamoms reikšmėms.
 Tiktai C/C++ programuotojai turėjo galimybę lengvai modifikuoti arba naudoti tarpinę (Interface Definition Language (IDL)) tipų apibrėttis. Kitų kalbų programuotojai neturėjo tokios galimybės. Taigi, Microsoft korporacija išrado ir pasiūlė kitką nei IDL, kad kiekvienas galėtų naudotis, vadinamomis tipų bibliotekos (type library). COM, tipų bibliotekos suteikia galimybes aplinka arba įrankiais perskaityti, konstruoti, kurti klases (wrapper classes), kurios yra patogiausios (objektų) kūrėjui. Tipų bibliotekos taip pat leidtia vykdymo mašinoms tokioms kaip, COM, MTS, arba COM+ tikrinti, nagrinėti tipus vykdymo metu ir tiekti reikalingą sistemai arba tarpinę paramą programoms naudojančioms jas. Kaip pavyzdtiui, tipų bibliotekos palaiko dinaminį kreipimąsi ir leidtia COM vykdymo mašinai tiekti universalų duomenų tipų rūšiavimą.
 Tipų bibliotekos yra pakankamai turtingos COM, tačiau ribotas standartizavimas. .NET platformoje iškyla naujas mechanizmas tipų informacijai fiksuoti, pertiūrėti, paieškai. Vietoj naudojamo termino „tipų bibliotekos“, tokią tipų informaciją vadiname metaduomenimis .NET aplinkoje.
 2.4.2 Tipų bibliotekos [13]
 Kaip ir tipų bibliotekos, yra C++ antraštiniai failai (header files), metaduomenys yra tipų biblioteka. NET platformoje metaduomenys yra pagrindinis mechanizmas ar dialektas, jog .NET vykdymo mašina, kompiliatoriai, įrankiai gali jais naudotis. Microsoft .NET naudoja metaduomenis apibūdinant, charakterizuojant visus tipus, kurie yra naudojami konkretaus .NET rinkinio. Šiuo atveju, metaduomenys specifikuoja .NET rinkinį: charakteristikos apie rinkinio identiškumą (rinkinio pavadinimas, versija, kultūra ir viešasis raktas), nuorodos į tipus, tipai kurie yra eksportuojami, o tai pat ir apsaugos reikalavimai vykdymo mašinos metu. Metaduomenys pateikia daugiau informacijos nei tipų bibliotekos. Čia taip pat pateikiamos .NET rinkinio ir modulių, klasių, interfeisų, metodų, savybių, laukų, įvykių, globalinių metodų specifikacijos.
 Metaduomenys pateikia pakankamai informacijos programai, įrankiui, vykdymo mašinai surasti viską, kas yra reikalinga komponentų jungimui, integravimui. Dabar pertvelgsiu keletą įrankių, programų, kurios protingai naudoja metaduomenis .NET platformoje. Įrodysiu, jog metaduomenys yra iš tikrųjų kaip ir tipų bibliotekos.
 2.4.3 Aplinka: Bendros Kalbos Mašina (CLR) (Common Language Runtime (CLR))
 Pav. 2: CLR aplinka
 Pateikiu (pav.2) CLR aplinkos schemą. CLR aplinka [1] naudoja metaduomenis verifikavimui, tikrinimui, saugumo vykdymui, rūšiavimui, atminties išdėstymui ir vykdymui. CLR aplinka yra priklausoma nuo metaduomenų teikti šiuos vykdymo mašinos ypatumus. CLR yra netymi .NET infrastruktūra. Skirtingai negu programinės įrangos bibliotekos, CLR yra sukurta ant tuščio pagrindo. CLR atlieka sukurtų .NET platformoje programų kodų vykdymą. CLR yra vykdymo mašina, kuri utkrauna reikalingas klases, atlieka reikiamų metodų kompiliavimą, uttikrina saugumo patikrą ir atlieka kitus vykdymo mašinos funkcionalumus. CLR vykdymas yra .dll arba .exe failai. Kurie susideda iš programinio kodo ir metaduomenų(duomenys apie duomenys). .NET programos vykdymas yra visai kitoks negu įprastinis, kadangi mes šiuo atveju turime ne tik programinį kodą ir duomenis, bet dar ir metaduomenis.
 2.4.4 Klasės pakroviklis (Class Loader) [1],[13]
 CLR aplinkos komponentas klasės pakroviklis naudoja metaduomenis surandant ir utkraunant .NET klases. Tai yra dėl to, jog metaduomenys įrašo detalią informaciją apie specifinę klasę kur ji yra saugoma: ar tame pačiame rinkinyje (assembly), viduje ar ut specifinės vardų, objektų erdvės (namespace), ar priklausomame rinkinyje eantį nutolusiame tinkle.
 2.4.5 JIT kompiliatoriai ( Just – in – Time (JIT) compilers) [1],[13]
 JIT kompiliatoriai naudoja metaduomenis kompiliuojant Microsoft Intermediate Language (IL) kodą. IL yra tarpinė reprezentacija, kalba kuri prasmingai bendrauja programavimo kalbų – integravimo palaikyme, bet tai nėra Visual Basic ar baitinis kodas, kuris privalo būti aiškus. .NET platformoje JIT kompiliuoja IL į mašininį kodą pirmiau nei programa pradedama vykdyti, ir visa šitai daro kartu su metaduomenimis.
 2.4.6 Įrankiai (Tools) [1],[13]
 Įrankiai naudoja metaduomenis integravimo, jungimo palaikymui. Kaip pavyzdtiui, programavimo įrankiai gali naudoti metaduomenis generuojant iškviečiamus aplankus, kurie leidtia .NET ir COM komponentamams susimaišyti. Tokie įrankiai,kaip Debuggers, Profilers ir Objektų ieškovas (browser) gali naudoti metaduomenis pateikiant turtingesnį programavimo palaikymą. Vienas iš pavyzdtių, IntelliSense ypatumai, kuriuos palaiko Microsoft Visual Studio.NET. Kai tik utrašome objekto operaciją ir padedame tašką, įrankis (tool) parodo sąrašą metodų ir savybių iš kurių galima pasirinkti. Tuo būdu, nereikia be reikalingai ieškoti antraštinių failų (header files) ar dokumentacijos aptinkant tikslų, reikalingą metodo ar savybės pavadinimus bei sintaksę.
 Kaip ir CLR aplinka, bet kuri programa, įrankis, ar utilita turinti galimybę skaityti metaduomenis iš .NET rinkinio gali panaudoti jį. Mes turime galimybę pasinaudoti Reflection klasėmis .NET platformoje nagrinėjant, tikrinant .NET PE failą ir tinoti viską apie duomenų tipus, kuriuos naudoja .NET rinkinys. CLR aplinka naudoja tas pačias Reflection klases tikrinti ir pateikti vykdymo mašinos ypatumus: atminties išskyrimą, apsaugos informaciją, tipų patikrinimą, derinimą (debugging), distancinį valdymą (remoting) ir kitką.
 Metaduomenys suteikia programavimo kalbų jungumą, operavimąsi, esminis elemntas .NET platformoje – visos programavimo kalbos privalo naudoti tuos pačius tipus, norint sugeneruoti teisingą, veikiantį .NET PE failą. .NET vykdymo mašina negali teikti tokių ypatumų kaip atminties išskyrimą, apsaugos informaciją, tipų patikrinimą, derinimą (debugging), distancinį valdymą (remoting) be metaduomenų turiningumo. Taigi, metaduomenys yra labai svarbi .NET dalis – tokia svarbi, jog galima sakyti, jog nebūtų .NET be metaduomenų.
 2.5 Komponentai ir rinkiniai
 Dar kai buvo COM era, Microsoft dokumentacija [1] naudojo terminą komponentas (component), kuris reiškė COM klasę ar COM modulį (.dll ar .exe). .NET platformoje, Microsoft adresavo šį sumaišymą pateikiant naują koncepciją, rinkinys (assembly), kuris yra programinis komponentas teikiantis „įjunk ir dirbk“ (plug – and – play), kaip ir techninės įrangos (hardware) komponentas. Teoriškai .NET rinkinys yra matdaug lygus COM moduliui. Praktiškai, rinkinys gali būti sudarytas iš tipų ir fizinių failų ( bitmap failai, .NET PE failai, ir t.t.) kurie yra reikalingi vykdymo mašinai, kad įvyktų sėkmingas programos paleidimas. Taigi, rinkinys yra versijavimo, išdėstymo, apsaugos informacijos, vykdymo (side – by – side execution), daugkartinio panaudojimo vienetas.
 Rinkinys yra loginis .dll arba .exe, o jo manifestas yra rinkinio specifikacija (metaduomenys) : jo versija, kokie kiti rinkiniai naudoja jį ir t.t.
 2.6 .NET komponento metamodelio ypatumai
 Metaduomenys [13],[18] yra dvejetainė informacija apibūdinanti programą, kuri yra saugoma CLR aplinkos vykdomosios programos faile arba atmintyje. Kai programos kodas yra kompiliuojamas į vykdomąjį .EXE failą, metaduomenys yra įterpiami į vieną porcijos failą, programos kodas yra konvertuojamas į IL tarpinę kalbą ir IL kodas yra įterpiamas į kitą porciją failo (pav. 3). Kiekvienas tipas ir jo elementas apibūdinamas, apibretiamas ir nurodomas modulyje per metaduomenis.
 Pav. 3: Programos kodo kompiliavimas
 Kai kodas yra paleidtiamas vykdymui, vykdymo mašina utkrauna metaduomenis į atmintį ir ir remiantis jais, randama informacija apie programos kodo klases, elementus, paveldėjimus, ir t.t.
 Metaduomenys apibūdina kiekvieną tipą ir elementą apibrėttą programos kode neutralia kalba. Metaduomenys saugo informaciją apie:
 .NET rinkinio specifikacija
 ü Unikalumas (pavadinimas, versija, kultūra, viešasis raktas.)
 ü Naudojami tipai
 ü Ryšiai su kitais rinkiniais
 ü Apsaugos leidimai paleidtiant programą
 Tipų aprašas
 ü Pavadinimas, matomumas, pagrindinė klasė, realizuoti interfeisai.
 ü Elementai (metodai, laukai, ypatybės, įvykiai, tarpiniai tipai).
 Atributų sąrašas
 ü Papildomas aprašas elementų, kurie modifikuoja tipus ir narius
 2.5.1 Metaduomenų nauda
 Metaduomenys yra raktas į paprastesnį programinį modelį [1]. Čia jau nebereikalingai header failai, Interfeiso kalba (IDL), išoriniai metodai – nuorodos į komponentą. Metaduomenys suteikia galimybę .NET programavimo kalboms aprašyti juos automatiškai neutralia kalba, to nemato nei vartotojas, nei programuotojas, projektuotojas. Be to, metaduomenys panaudojami ir per atributų panaudojimą. Metaduomenų pagrindiniai privalumai, nauda:
 · Save – apibudinantys failai
 CLR aplinkos moduliai ir rinkiniai yra save – apibūdinantys. Modulio metaduomenys talpina savyje viską kas yra reikalinga, kad modulis galėtų sąveikatuti su kitu moduliumi. Metaduomenys automatiškai aprūpina IDL funkcionavimą komponentiniame objektiniame modelyje, trumpiau (COM), leidtiant pasinaudoti vienu failu ir elementų apibrėtimui, realizavimui, vykdymui. Vykdymo metu moduliai ir rinkiniai nereikalauja utregistravimo su operacine sistema. Taigi, specifikacijos, naudojamos vykdymo mašinos, atspindi programos kodą sukompiliuotame faile, kuris padidina programos tvirtumą, patikimumą.
 · Programavimo kalbos operavimas ir lengvesnis komponentinis programavimas, projektavimas
 Metaduomenys suteikia visą informaciją reikalingą, būtiną apie sukompiliuotą programos kodą, kad galėtum pasinaudoti būtent komponentą , t.y. .exe ar .dll failą parašytą skirtinga programavimo kalba. Yra galimybė kurti kaip atskirą atvejį bet kokios klasės bet kuria “valdoma programavimo kalba” (kalba kuri kreipiasi į CLR aplinką) net nesirūpinant apie tikslią ar aiškią išdėstymo tvarką ar naudotis įprastu programavimo kalbos operuojamu kodu.
 · Atributai
 .NET platformoje yra galimybė išvardyti specialios rūšies metaduomenis, kurie vadinami atributais, sukompiliuotame faile. Atributus galima surasti per .NET platformą ir yra naudojami detaliai kontrolei kaip komponentinė programa veikia vykdymo metu. Taip pat, galima išskirti savo metaduomenis į .NET platformos failus per vartotojo apibrėttus atributus.
 2.5.2 Metaduomenys ir save – apibūdinantys komponentai
 Praeityje, programinis komponentas (.exe ar .dll) parašytas viena programavimo kalba negalėjo būti naudojamas kaip programiniu komponentu parašytu kita programavimo kalba. Komponentinis objektinis modelis (COM) išsprendė šią problemą. .NET platformos komponentai operuojami kompiliatoriais paprasčiau, atspindi papildomą informaciją į visus modulius ir rinkinius. Ši informacija, vadinama metaduomenimis, padeda komponentams vientisai sąveikauti vienas su kitu.
 2.5.3 Metaduomenų struktūra ir panaudojimas
 Pateiksiu aptvalgą pagal [1], kaip metaduomenys yra saugomi, laikomi .NET vykdomąjame (PE) faile, o taip pat pateiksiu kokia yra metaduomenų pagrindinė funkcija valdomame vykdyme.
 Metaduomenys yra saugomi vienoje .NET vykdomojo failo porcijoje, o MSIL kalba yra saugoma kitoje failo porcijoje. Toje dalyje, kur yra metaduomenys, susideda iš lentelės ir aibės duomenų struktūrų. MSIL dalis susideda iš MSIL ir metaduomenų simbolių, kurie yra nuorodos į metaduomenų dalį vykdomojo failo.
 Su metaduomenų simboliais susidurti galima, jei naudosimės tokiais įrankiais, kaip MSIL Disassembler (Ildasm.exe) kad galėtumėm pertiūrėti MSIL kodą arba vykdymo mašinos derinimo programa (Cordbg.exe) įvykdant atminties turinį.
 2.5.4 Metaduomenų Lentelės ir Aibės
 Kiekviena metaduomenų lentelė [1] saugo informaciją apie programos elementus. Kaip pavyzdtiui, viena metaduomenų lentelė aprašo klases, kita – laukus, ir t.t. Jei programos kode naudojame dešimt klasių, tuomet klasių lentelė turės dešimt eilučių, viena eilutė – vienai klasei. Metaduomenų lentelės susieja kitas lenteles ir aibes. Kaip pavyzdtiui, metaduomenų klasių lentelė susieja su lentele, kurioje saugomi metodai.
 Metaduomenys taip pat saugi informaciją keturiose aibių struktūrose: seka (string), gabalas (blob), vartotojo seka (user string) ir GUID. Visos sekos naudojamos pavadinti tipams ir nariams,elementams yra saugomos sekų aibėje. Kaip pavyzdtiui, metodų lentelė nesaugo tiesiogiai konkretaus metodo pavadinimo, bet taškus į metodų pavadinimus, kurie yra saugomi sekų aibėje
 2.5.5 Metaduomenų simboliai
 Kiekviena metaduomenų lentelės eilutė unikaliai identifikuota MSIL dalyje vykdomojo failo pagal metaduomenų simbolį. Metaduomenų simboliai yra koncepciškai panašūs į rodykles (pointers), kurie susieja tam tikrą metaduomenų lentelę.
 Metaduomenų simbolis yra keturių – baitų skaičius. Pirmasis baitas nurodo metaduomenų lentelę į kurią tam tikras simbolis nurodo (metodą, tipą ir t.t.). Likusieji trys baitai tiksliai nusako eilutę metaduomenų lentelėje kuri atitinka programinis elementas [1].
 2.5.6 Metaduomenys viduje PE failo [1]
 Kai programa yra sukompiliuota CLR aplinkos, ji yra konvertuojama į PE failą kuris susideda iš trijų dalių pateikta (1 lentelėje).
 PE dalis
 PE antraštė
 Tai yra indeksas PE failo pagrindinių dalių ir įėjimo taško adresas.
 Vykdymo metu yra naudojama ši informacija, kad nustatyti failą kaip PE failą ir nuspręsti kur vykdymas prasideda kai programa yra utkraunama į kompiuterio atmintį.
 MSIL instrukcijos
 Tarpinės kalbos (IL) instrukcijos, kurios doroja programos kodą. Daugybė IL instrukcijų yra palydimos metaduomenų simbolių.
 Metaduomenų lentelės ir aibės. Vykdymo metu CLR aplinka naudoja tai, kad galėtų įrašyti informaciją apie kiekvieną tipą ir elementą programos kode. Į šią dalį įeina atributai ir apsaugos informacija.
 Lentelė 1: PE failo struktūra
 2.7 .NET komponento, rinkinio manifestas
 Pav. 4: .NET komponento struktūra
 Kaip aptvelgiau auksčiau, tipai privalo parodyti, atidengti savo metaduomenis leidtiant įrankiams (tools) ir programoms prieti prie jų ir patikėti metaduomenims savo paslaugas (services). Metaduomenys nėra tik tipams. Programinės įrangos, komponento instaliavimas, konfigūravimas neapsieina be metaduomenų apie komponentą, vadovaujantį tipams. Dabar pateiksiu medtiagos apie .NET rinkinius (išdėstymo vienetus) ir manifestus (metaduomenys charakterizuojančios rinkinius).
 Rinkinio manifestas [13], [17] (pav. 4) yra metaduomenys kuris apibūdina, specifikuoja viską apie rinkinį: identiškumas, sąrašas failų priklausančių rinkiniui, nuorodos į išorinius rinkinius, eksportuojamus tipus, eksportuojamus resursus ir leidimus prieiti. Trumpiau, tai charakterizuoja visas detales reikalingas komponentų diegimui „plug – and – play“. Nebėra būtinybės saugoti tipų informaciją registruose kaip COM.
 COM kai naudojame konkrečią COM klasę, duodame COM bibliotekai klasės identifikatorių. COM biblioteka ieško registre COM komponento, kuris turi ir tiekia tą klasę, utkrauna komponentą, pasako komponentui duoti jam atskirą jo klasę ir grątinti nuorodą į tą klasės atveją. .NET paltformoje, vietoj to kad ieškoti registre reikalingo komponento, CLR įdėmiai tiūri į rinkinio manifestą, nulemia, kuris išorinis rinkinys yra reikalingas, utkrauna reikalingą rinkinį kuris yra būtinas programai ir sukuria kaip atskirą objekto klasės atvejį.
 2.7.1 IL kodas
 Rinkinys susideda iš IL kodo [13] (pav. 4), pagal kurį CLR aplinka paleidtia jį vykdymui. IL kodas paprastai naudoja ne tik tipus apibrėttus tame pačiame rinkinyje, bet gali ir naudoti ar kreiptis į tipus apibrėttus kituose rinkiniuose. Rinkinys turi būti apibrėttas su kitais rinkiniais, turi būti nuorodos į kitus rinkinius. Yra vienas įspėjimas: kiekvienas rinkinys gali turėti tik vieną įėjimo tašką, kaip DLLMain( ), WinMain( ), ar Main( ). Privaloma laikytis šios taisyklės, todėl kai CLR aplinka utkrauna rinkinį, ji ieško įėjimo taškų, kad galėtų pradėti rinkinio vykdymą.
 2.8 Bendroji Tipų Sistema (CTS)
 Kadangi .NET siekia, jog visos programavimo kalbos būtų lygios, klasė parašyta C# kalba – turi būti ekvivalenti klasei parašytai Visual basic kalba, taipogi interfeisas apibrėttas C++ kalba, turėtų būti taip pat specifikuotas COBOL programavimo kalba. Programavimo kalbos privalo sutikti su šiomis koncepcijomis, tai tada jie gali integruotis tarpusavyje. Kad programavimo kalbos galėtų integruotis, Microsoft korporacija apibrėtė bendrą tipų sistemą visoms .NET programavimo kalboms. Microsoft .NET palaiko gausų rinkinį tipų: reikšmių tipai, nuorodų tipai, klasės, interfeisai, delegatai.
 CLR aplinka palaiko du skirtingus tipus: reikšmių tipai, nuorodų tipai.
 2.8.1 Reikšmių tipai
 Reikšmių tipai [13] (Value types) simbolizuoja reikšmes išskirtas steke. Reikšmės negali būti nulinės (null) ir visada turi turėti katkokių duomenų. Kai reikšmių tipai yra perduoti į funkciją, jie yra perduodami kopijos reikšme, kuri bus įvykdyta vykdymo mašinai metu. Tai reiškia, jog originali reikšmė nepasikeis, nepaisant jog katkas gali nutikti kopijai kviečiant funkciją. Būdingi tipai yra mati ir neutima daug atminties. Reikšmių tipai: primityvai, struktūros, sąrašai.
 C# kalba
 Int i; //bazinis elementas - primityvas
 Struct Point //struktūra
 Enum State //Sąrašas
 Tai pat galima sukurti reikšmę išvestą iš klasės System.Value.Type.
 2.8.2 Nuorodų tipai
 Jei tipas sunaudoja daugybę atminties resursų, tuomet nuorodų tipai teikia daugiau naudos ut reikšmių tipus. Nuorodų tipai [13] (objektai, interfeisai, rodiklėlės) yra taip vadinami, gali turėti reikšmę null. Šie tipai yra perduodami per nuorodas, reikštų tai, jog kai yra perduodamas objektas į funkciją, adresas ar rodiklytė į objektą yra perduodama – ne kopija objekto, kaip reikšmių tipuose. Nauda čia, jog nuorodų tipas gali būti naudojamas kaip išvedamos informacijos parametras, tai pat yra tai, jog nereikia eikvoti papildomų resursų, nes nera daromos kopijos. Jei objektas yra didelis ( reikalaujantis daug atminties), tuomet nuorodų tipai yra geresnis pasirinkimas. .NET platformoje yra nuorodų tipų trūkumas, tai ,jog nuorodų tipas turi būti išskirtas aibėje, t.y. tai reikalauja daugiau procesoriaus ciklų, nes tai turi būti valdoma ir šiukšlių surinkta CLR aplinkos.
 .NET platformoje nuorodų tipai: klasės, interfeisai, masyvai ir delegatai.
 Class Car //klase
 Interface Isteering //interfeisas
 Int[] a=new int[5]; //masyvas
 Delegate void Process( ); //delegatas
 2.9 Metaduomenys, paieškos vykdymo kriterijai
 Pav. 5: .NET komponento – rinkinio hierarchija, metaduomenų modeliavimas
 2.9.1 Tipo nariai – metaduomenys
 CLR vykdymo mašina suteikia galimybę apibrėtti tipo elementus [1], [14]: įvykius, laukus, metodus, savybes (pav. 5). Kiekvienas narys turi signatūrą. 2 lentelėje yra pateiktos elementų charakteristikos:
 Apibrėtia įvykį, kuris gali atsiliepti ir apibrėtia metodus prisijungiant, atsijungiant ar iškviečiant, inicijuojant įvykį. Įvykiai yra datnai naudojami informuoti tipu statusui keičiantis. Įvykiai .NET platformoje pagrindtia delegeto modelį
 Saugomos reikšmės ir specifikuojamos objekto tipo reikšmės. Charakterizuoja ir yra dalis tipo būsenos. Laukai gali būti bet kokio tipo.
 Charakterizuoja operacijas kurios yra tipe. Tai yra funkcija apibrėtta viduje klasės. Metodo signatūra specifikuoja leidtiamus tipus su visais argumentais ir gryttamosiomis reikšmėmis. Tai yra leistinos reikšmių operacijos. Metodai dar kitaip vadinami funkciniais elementais
 Įvardija tipo reikšmę ar būseną ir apibrėtia metodus įgyjant (getting) ir nustatant (setting) savybės reikšmę Savybės gali būti pirminiais tipais, pirminių tipų rinkiniais. Savybės yra datnai naudojamos išlaikyti viešąjį (public) interfeisą nepriklausomo tipo nuo tipo aktualios reprezentacijos. Kitaip sakant, - tai reikšmės kontraktas. Tai yra operacijos, kurios teikia priėjimą prie reikšmės.
 Lentelė 2: Elementų charakteristikos
 Informacija metaduomenų išdėstoma šia hierarchija [14]
 Pav. 6: .NET komponento – rinkinio metaduomenų hierarchija
 Pateikiu .NET komponento, rinkinio metaduomenų išdėstymą [14] (Pav. 6). Rinkinys yra sudarytas iš vieno arba daugiau modulių. Moduliai sudaryti iš tipų ir globalių metodų. Tipai gali būti: klasė, interfeisas arba struktūra. Bet kuris tipas turi arba gali turėti: metodus, jų parametrus, laukus, savybes ir įvykius.
 2.10 Automatizuota .NET komponentų paieška
 Pasinaudokime įrankiu, esančiu Microsoft Visual Studio.NET, WinCV – klasių pertiūros, paieškos sistema [1]. Tai įrankis, kuris gali būti panaudojamas esamų klasių rinkiniuose, prieinamuose visiems vartotojams (shared assemblies), taip pat pagrindinių klasių nagrinėjimui, paieškai vykdyti. Surandama klasė, pateikiama tos klasės metodai, savybės, įvykiai, ir laukai naudojantis C# programavimo kalba.
 WinForms Class Viewer pagrindinis langas
 Paieškos lauke (pav. 7) įrašome ieškomos klasės pavadinimą, kad sutinotume kokiai vardų erdvei (namespace) priklauso klasė,sutinoti jos metodus, laukus, įvykius, konstruktorius bei kokiam .NET rinkiniui ji priklauso.
 Pav. 7: WinCV – Class Viewer pagrindinis langas
 Pav. 8: WinCV – Class Viewer pagrindinis langas, paieška
 Jei paieškos lauke (pav. 8) surinksime klasės pavadinimą, pvz:. „date“, matysime paieškos rezultatus. Daugybę klasių, kurių pavadinimas susideda iš „date“. Iš paeiškos rezultatų matome, jog pasirinkt reikalingą klasę yra sudėtinga, nes reikia pertiūrėti kokia struktūra yra atskirų klasių. Pertiūrėjus visas klases galima nuspręsti: pasirinkti reikiamą, tinkamą. Class Viewer parodo informaciją atspindint (reflecting) tipą naudojantis CLR Reflection (dokumentacija). Tačiau tokia paieška nėra efektyvi, nes reikia tinoti tikslų klasės pavadinimą, klasė gali būti pavadinta skirtingais pavadinimais.
 2.11 .NET Reflection pagrindinės idejos
 .NET Reflection ir jos pagrindinės idėjos [1] susiformavo iš COM tipų bibliotekų modelio. Programos turi galimybę nustatyti, įvertinti tipų informaciją vykdymo mašinos metu ir iškviesti paslaugas, metodus. Pagrindiniai elementai, kurie įgalina tai – metaduomenys ir .NET standartinė dinaminė tipų sistema (CTS)
 Metaduomenys suteikia bendrą tipų informacijos ir kodo išdėstymą. .NET rinkiniai visą struktūrinę informaciją apie programą yra surinkta kartu su vykdymo mašinos aprašymu išreikštu MSIL, tarpine kalba. Struktūrinė informacija specifikuoja bendra forma rinkinius, jų modulius, detaliai kiekvieną duomenų tipą ir klasę. Klasių metodai ir visos kitos esybės yra saugomi su jų signatūromis ir grątinimo reikšmėmis ir jų MSIL kodu. MSIL yra dalis aprašymo bet kokio tai metodo, nes kodas yra vykdomas ir kompiliuojamas pavaizdavimui MSIL į mašininį kodą.
 COM tipų bibliotekų informacija yra apribota tiems tipams kurie įtraukiami į biblioteką buvo aiškiai paklausi, metaduomenys yra prienamI kiekvienam tipui kuriuos naudoja .NET valdomas kodas. Kiekvienas .NET tipas, nuo paprasčiausių skaliarinių tipų kaip paprasčiausių integer iki kompleksinių klasių, gali būti panaudotas utklausoje ieškant reikiamo tipo. Vykdymo mašinos metu duomenų tipai atstovauja specialiai .NET vykdomai klasei System.Type. Ši klasė sudaro sąlygas detalų tyrinėjimą kiekvienu aspektu duomenų tipų. .NET platformos galimybė padaryti tipų informaciją pasiekiamą vykdymo metu per šią klasę, vadinama „refleksija, atspindys“
 2.12 . Pasiūlymas, kai išplėsti .NET komponento metaduomenis
 2.12.1 Atributų panaudojimas .NET platformoje
 .NET programa susideda iš kodo, duomenų ir metaduomenų [18]. Atributai – tai mechanizmas [17] skirtas pridėti, išplėsti metaduomenis, kaip kompilatoriaus instrukcijos ir kiti duomenys apie duomenis, metodai, klasės. Atributai yra pridedami į metaduomenis ir yra matomi per ILDasm.exe ar kitus metaduomenų – skaitymo įrankius.
 Atributas – būtinas, pastovus priklausomumo tenklas.
 Dauguma atributų aprašo tokius programavimo kalbos elementus, kaip klasės, metodai, laukai ir savybės. Tačiau kai kurie atributai tampa globaliais – jie aprašo visą rinkinį į modulį. Globalūs atributai programos tekste atsiranda po direktyvos using.
 Atributai programiniame kode gali būti panaudojami taip [16]:
 ü Aprašomas naujas arba pasinaudojama jau egzistuojančiu atributu .NET platformoje
 ü Inicializuojamas konkretus atributo egzempliorius pasitelkus iškvietimu konstruktoriaus atributo.
 Pav. 9: Atributų reikšmė .NET komponente
 Atributai yra įrašomi i metaduomenis kompiliacijos metu ir tampa prienami tik CLR aplinkos ir bet kuriam įrankiui, naudojantį Reflection mechanizmą.
 Yra keletas struktūrų kaip išspręsti su navigavimu per tipų informaciją yra nei paprasta, nei lengva. Taigi net jei ir keli atributinio programavimo aspektai, kaip dabar .NET paltformoje, yra galimybė COM komponentiniame objektiniame modelyje su tipų bibliotekomis ir bendraisiais atributais, kurie gali būti papildyti į tas bibliotekas. Įvertinant šio tipo informaciją yra sudėtinga programuotojams. Bendrieji tipo bibliotekos atributai yra prienami COM+, MTS, kurie sudaro sąlygas išdėstyti komponentus IDL faile ir importuoti į COM+ šie atributai yra perskaitomi ir komponentai sukonfiguruojami teisingai.
 Aukščiau aprašiau komponentinius modelius, .NET komponentą, jo savybes, jo metaduomenų ypatumus ir kaip galima pasinaudoti jais. Yra daug apibrėtimų, tačiau detaliau juos išnagrinėjus, matome, kad jų autoriai sako tą patį tik kitais todtiais. Svarbu yra komponentų metaduomenys. Duomenys apie duomenis.
 Toliau savo darbe .NET komponentų metaduomenų išplėtimą automatizuotai paieškai kurti aš naudosiu C# programavimo kalbą. Paskutiniais metais ypač daug dėmesio skiriama komponentams parašytiems kokia nors objektine programavimo kalba, datniausiai C++, C# , Java. Pasirinkau būtent C# programavimo kalbą, nes tai universali objektinio projektavimo kalba ir ją galima naudoti kaip bet kurios konkrečios objektinio projektavimo metodikos komponentą.
 4. EKSPERIMENTINĖ DALIS
 Šio baigiamojo darbo utduotis reikalauja sukurti programų sistemą .NET komponentų paieškai vykdyti. Eksperimento esmė – patikrinti darbe pateiktas idėjas. Atsitvelgdamas į ankstesniame skyriuje išnagrinėtų komponentų metamodelio ypatumus, aš savo programai pasirinkau, jog automatizuotai paieškai vykdyti geriausiai būtų metaduomenis išplėsti per atributus, aprašytą poskyryje 2.12. Tam yra kelios prietastys:
 ü automatizuota komponentų paieška nėra efektyvi pagal standartinius metaduomenis ;
 ü atributai išplečia standartinius metaduomenis;
 ü atributai pritaikomi .NET komponento moduliams, klasėms, klasių metodams, savybėms, įvykiams, laukams;
 ü CLR aplinka priklauso nuo atributų – papildoma informacija apie klases, metodus, laukus, savybes, parametrus;
 ü Atributai yra išsaugomi kartu su programos metaduomenimis ir gali būti tiriami per Reflection mechanizmą.
 Mano sukurtos programos galimybės – praplėsti .NET komponento metaduomenis per atributus. Sukuriu .NET komponentą, jo karkasą, kuris išveda į ekraną metainformaciją: rinkinio manifestas, modulio informacija, klasės, jų metodai, laukai, įvykiai, savybės bei papildomą jų informaciją – atributus. Dabar automatizuota paieška gali būti vykdoma paprasčiau – ne tik per programos standartinius metaduomenis, bet ir per atributus.
 4.1 Naudota programinė įranga
 Kuriant šio baigiamojo darbo programų sistemą, buvo naudojama [12] programinė įranga. 'Microsoft Visual Studio .NET ' yra universalus daugiakalbio programavimo įrankis, skirtas greitai kurti ir diegti 'Microsoft Windows®', interneto ir mobiliųjų įrenginių programinę įrangą.
 Utduočiai įvykdyti pasirinkau objektinio programavimo panaudojimo koncepciją . Programa parašyta C# programavimo kalba.
 Microsoft C# [20] yra nauja programavimo kalba, kuri yra sukurta didelės apimties programoms kurti .NET aplinkoje. C# yra išsivysčiusi iš Microsoft C ir Microsoft C++ programavimo kalbų ir yra paprasta, moderni objektiškai orientuota programavimo kalba. C# kodas yra kompiliuojamas kaip valdymo kodas, kuris naudojasi CLR teikiamomis paslaugomis.
 C# yra pristatoma kaip Visual C# Visual Studio.NET sudėtyje. C# pasitymi projektų šablonais, objekto modeliu, savybių puslapiais ir kitomis kūrimo aplinkos savybėmis. Visual C# programavimo biblioteka yra .NET platforma.
 Pav. 10: .NET platforma ir Microsoft Visual Studio.NET
 .NET platforma (Pav. 10) yra viršuje operacinės sistemos, kuri gali būti kelių Windows tipų ir susidėti iš daug komponentų. .NET sukurtos programos iš esmės veikia Windows terpėje.
 Pats svarbiausias šios platformos dalykas yra CLR aplinka. Jei lyginant su programavimu Java kalboje, tai būtu lygiai tas pats kaip Java Virtuali Mašina (Java Virtual Mashcine). Jei tai nebūtų galima palyginti su Java Virtualia Mašina (JVM), reikia suprasti, kad yra .NET platformos širdis ir siela. CLR aplinka aktyvuoja objektus, atlieka jų apsaugos tikrinimus, išdėlioja juos kompiuterio atmintyje, vykdo jų paleidimą ir juos pašalina iš atminties.
 Pateiktoje schemoje CLR aplinka viename iš viršutinių sluoksnių yra aibė bazinių architektūros klasių. Šios klasės palaiko elementarius įvedimo – išvedimo funkcionalumus, apsaugos valdymą, tinklo susiekimą, ryšio valdymą ir kitas funkcijas.
 Virš platformos bazinių klasių yra kita aibė klasių, kuri tęsia duomenų valdymą ir palaikymą bei XML veikimą. Duomenų klasės palaiko pastovų duomenų valdymą, t.y tų duomenų, kurie yra susijusiose duomenų bazėse. Šios klasės susideda iš Struktūrinės Utklausų Kalbos(Structured query Language(SQL)) klasių, kurios pastoviai leidtia valdyti duomenų atsargas per standartinę SQL sąsają. Panašiai kaip ir SQL klasės, aibė klasių, kurios vadinasi ADO.NET leidtia manipuliuoti pastoviais duomenimis. Šalia duomenų klasių, .NET architektūra palaiko nematai klasių, kurios leidtia manipuliuoti XML duomenimis, atlikti XML paiešką ir XML transliacijas.
 4.1.1 C# programavimo kalba
 C# [15] yra paprasta, tačiau galinga programavimo kalba. Kadangi ji yra išsivysčiusi iš C ir C++ programavimo kalbų, todėl ji naudoja nematai C++ bruotų išraiškoms ir operatoriams. Ji taip pat palaiko nesaugų būdą, t.y atminties manipuliavimą pointerių pagalba, kurio nereguliuoja šiukšlių kolektorius
 C#, kaip nauja programavimo kalba buvo kartu pristatyta su .NET platforma. C# buvo stengiamasi padaryti kuo paprastesnę ir gauti paprastumo, išraiškingumo ir pakankamai produktyvaus vykdymo programavimo kalbą. .NET platforma yra CLR aplinkos centre ir aibės bibliotekų, kurie gali būti išnaudojami plataus naudojimo programavimo kalboms, kurios gali būti naudojamos kartu ir kompiliuojamos Tarpinės Kalbos (IL) pagalba. C# programavimo kalba buvo sukurta su daugeliu panašumų į C++ ir Java programavimo kalbą.
 Palyginsiu C# su kitomis gerai tinomomis programavimo kalbomis, t.y C++ ir Java, kad geriau suprasti pagrindinius jos pranašumus ir trūkumus.
 4.1.2 C# ir JAVA programavimo kalbų palyginimas
 C# ir Java [20] yra naujos kartos programavimo kalbos, kurios yra kilusios iš C ir C++. Abi iš jų turi perkeltas savybes, tokias kaip nenaudojamos atminties atlaisvinimu (šiukšlių kolekcija), kuri pašalina temo lygio utduočių palaikymą nuo programuotojų atsakomybės. Daugelyje sričių, jos yra labai panašios. Abidvi tiek C #, tiek ir Java yra kompiliuojamos Tarpine Kalba (IL): C# kompiliuojama Microsoft Tarpine Kalba (IL), o Java – Java baitų kode. Abiem atvejais tarpinė kalba gali būti vykdoma pagal interpretavimą, taip vadinamoje virtualioje mašinoje.
 C# turi paprastą duomenų tipą ir turi daugiau išplėstus reikšmių tipus. Skirtingai nuo Java C# pasitymi tokiais bruotais, kuriuos galime naudoti daugelyje kompiliatorių. Tačiau panašiai kaip Java, C# pasitymi klasėmis, kurios gali būti paveldėtos iš vienintelio paveldėjimo modulio, kuris yra pateikiamas per daugelio paveldimumo sąsają. Aukščiausio lygio klasės metodai C# naudoja ‘delegetus’-tipų apsaugojimo metodo pointerius. Jie yra naudojami įvykių palaikyme. Java didelės apimties masyvai yra sudaromi iš vieno masyvo, t.y didelės apimties masyvas yra naudojamas kaip vienetinių masyvų aibė. C# didelės apimties masyvai yra sudaromi kaip keturkampiai masyvai.
 4.1.2 C# tipai
 C# galima sukurti naujus nuorodų tipus, kad apibrėtti klases. Klasės aprūpina šablonais, kuriais šie tiesioginiai reikalavimai yra generuojami. Ryšys tarp klasės ir su ja susijusio nuorodos tipo yra suprantamas, kad klasė apibrėtia tipą, t.y klasė apibrėtia sudedamuosius tipo elementus.
 Kiekvienas tipas susideda iš elementų, kurie yra vadinami tipų nariais. Yra du pagrindiniai narių tipai, kuriuos gali apibrėtti klasė. Pirmiausiai, klasė gali apibrėtti kitus tipus, t.y abu tiek reikšmes, tiek ir nuorodas. Ši idėja, kad tipai gali susidėti iš kitų tipų, yra tinoma iš objektinio programavimo teorijos. Kai tipai susideda iš kitų nuorodų tipų, tada tai vadiname sudedamaisiais tipais.
 Sekantis svarbus dalykas, kalbant apie tipų narius yra, kad klasė gali aprašyti metodus, funkcijas taikomas reikšmių ir nuorodų tipų skaitymui ir manipuliavimui.
 C# suteikia galimybę kreiptis į metodą ne pagal vardą, o pagal aprašą (parametrus ir grątinamą tipą), sukaupti grupes metodų, ir iškviesti juos vienu metu, su vienodais parametrais.
 Indeksatoriai (Pav. 11) dar kitaip yra vadinami masyvais. Savybės tai reikšmės kontraktas. Tai yra operacijos, kurios teikia priėjimą prie reikšmės.Metodai charakterizuoja operacijas kurios yra tipe.Laukai – saugomos reikšmės ir specifikuojamos objekto tipo reikšmės.Įvykiai – apibrėtia įvykį, kuris gali atsiliepti ir apibrėtia metodus prisijungiant, atsijungiant ar iškviečiant, inicijuojant įvykį. Konstruktoriai – konstruoja klases. O taip pat klasių elementai yra operatoriai, konstantos.
 Pav. 11: С# klasių elementai
 4.2 Programos kūrimas
 .NET Reflection ypatumai: ne tik detali pateikiama elementų informacija, bet ir atributai, kurie įgalino visiškai naują vystymosi paradigmą – atributinį programavimą.
 Atributai yra specialūs .NET platformos klasių elementai, kurie suteikia galimybę padidinti bet kurio struktūrinio elemento .NET klasių ir struktūrų su pagalbine informacija, kuri yra tiesioginė klasės dalis teikianti papildomą informaciją, kuri įvertinama vykdymo mechanizmo ir .NET platformos. Tai yra papildomi metaduomenys. Pavyzdtiui [serializable] atributas, kuris paliepia Serialization platformai, jog ji gali išdėstyti klasės būseną serijomis (serialize). Jei šis atributas nera utdėtas, klasės įgyvendintojas atmeta leidimą ir pateikia sąvajį realizavimą serijų išdėstymo per Iserialization interfeisą ir neleidtia serijinio išdėstymo ir nutolusio rūšiavimo.
 .NET programa susideda iš kodo, duomenų ir metaduomenų.
 Atributai – tai mechanizmas skirtas pridėti, išplėsti metaduomenis, kaip kompilatoriaus instrukcijos ir kiti duomenys apie duomenis, metodai, klasės. Atributai yra pridedami į metaduomenis ir yra matomi per ILDasm ar kitus metaduomenų – skaitymo įrankius.
 Atributais praplečiame metaduomenis, kurie gali būti naudingi paieškos sistemoms ieškoti pagal raktinius todtius.
 Kuriu programą, kurioje išplėsiu metaduomenis ir pademonstruosiu kaip metaduomenis, papildomą jų informaciją – atributus išsitraukti.
 Pritaikome atributus .NET rinkiniui (Lentelė 3), pasinaudoję raktiniu todtiu assembly. Pateikiu detalią informaciją apie mano komponento teikiamas paslaugas, t.y. jo specifikaciją: rinkinio pavadinimas, aprasymas, konfiguracijos aprasas, kompanijos sukūrusios rinkinį pavadinimas, produkto pavadinimas, prekinis tenklas.
 using System.Reflection; //
 using System.Runtime.CompilerServices;//norodoma kompilatoriui, jog atributai bus idedami kaip metaduomenys
 // Informacija apie rinkini
 //pavadinimas
 [assembly: AssemblyTitle('Bakalaurinis darbas. Uzduotis: pasiulyti, kaip isplesti metaduomenis automatizuotai paieskai ju vykdyti')]
 //aprasas
 [assembly: AssemblyDescription('Atributu panaudojimas .NET platformoje')]
 [assembly: AssemblyConfiguration('Programa')]
 //kompanijos pavadinimas
 [assembly: AssemblyCompany('VGTU')]
 //produkto pavadinimas
 [assembly: AssemblyProduct('Paieskos metaduomenys')]
 //teises, priklausancios
 [assembly: AssemblyCopyright('Linas Motiejunas, IN-0 grupes studentas')]
 //prekinis zenklas
 [assembly: AssemblyTrademark('VGTU, Inzinerine Informatika')]
 //versijos numeris
 [assembly: AssemblyVersion('1.0.0.*')]
 Lentelė 3: Reflection objektų modelis
 Pranešimas, kad naudosimės naudojamu atributu, AttributeUsageAttribute , kuris utduoda raktines naujos klasės charakteristikas, specifikaciją. Kaip pavyzdtiui, ar gali ir kaip gali būti atributas panaudotas visoms klasėms, arba kokiam elementui jis taikomas.
 Sekantis fragmentas kodo iliustruoja AttributeUsageAttribute panaudojimą:
 [AttributeUsage(AttributeTargets.Module | // aprašomas atributas moduliui
 AttributeTargets.Constructor| // aprašomas atributas konstruktoriui
 AttributeTargets.Class| // aprašomas atributas klasei
 AttributeTargets.Methods| // aprašomas atributas metodams
 AttributeTargets.Events| // aprašomas atributas įvykiams
 AttributeTargets.Fields| // aprašomas atributas laukams
 AttributeTargets.Properties, // aprašomas atributas savybėms
 Savybė AllowMultipe
 Ši savybė nurodo, ar atributas nudojamas daug kartų vienam elementui. Pagal nutylėjimą yra false, tai reiškia – atributu galima pasinaudoti tik vieną kartą.
 // Pagal nutylejima AllowMultiple = false.
 [Obsolete('Metaduomenu panaudojimas komponentu galimai paieskai vykdyti')]
 Kompiliatorius, kompiliuodamas programą, panaudoja šį atributą ir pateikia kaip klaidą, išvesdamas į ekraną: 'Metaduomenu panaudojimas komponentu galimai paieskai vykdyti'
 Obsolete yra iš System.ObsoleteAttribute
 Pav. 12 C# kodo kompiliavimas su atributais
 C# programos kodas (Pav.12), kurį sudaro klasės, jų elementai bei atributai, kurie modifikuoja, prideda naujos informacijos prie elementų., vadinamos atributais,.Visa tai patalpinama į .NET PE failo metaduomenų bloką. Kompiliuojant programos kodą, yra iškviečiami, inicijuojami įvykiai, siunčiamos klaidos, įspėjimai.
 4.3 Metaduomenų tyrinėjimas programoje
 .NET Reflection yra viena iš fundamentaliausių technologijų .NET platformoje, taip pat yra nesunku ja naudotis. Reflection atidaro duris atributiniam programavimui ir tipų funkcionalumui. Mano sukurta programa išveda į ekraną ne tik standartinius, bet ir praplėstus metaduomenis – atributus (Pav.13).
 Pav. 13 Programa išveda standartinius ir praplėstus metaduomenis
 System.Attribute klasė turi metodus, per kuriuos galima prieiti ir testuoti bendruosius atributus. Kadangi bet kuris vartotojo apibrėttas tipas gali būti panaudotas kaip atributas, jis yra išvestas iš sisteminės klasės Attribute. .NET platformos vardų erdvės pateiktos 1 priede.
 Sukūriau 7 klases, kurios praplečia metaduomenis atributais iš sisteminės klasės System.Attribute
 public class Modulio_atributai : System.Attribute
 public class Klases_atributai : System.Attribute
 public class Savybiu_atributai : System.Attribute
 public class Metodu_atributai : System.Attribute
 public class Ivykiu_atributai : System.Attribute
 public class Lauku_atributai : System.Attribute
 Kurdamas programą, naudojausi sisteminiais komponentais:
 using System; //fundamentalios klases, pagrindines klases kurios apibrezia tipus, ivykius, atributus
 using System.Drawing; //grafikos palaikomumas
 using System.ComponentModel; //klases komponentu kurimui
 using System.Windows.Forms; //klases, kurios kuria Windows formas
 using System.Reflection; //priėjimas prie metaduomenų
 Elementų tyrinėjimas ir paieška
 Pav. 14 Reflection ir bendroji tipų sistema (CTS)
 Bendram priėjimui prie elementų, nepriklausomai nuo jų tikro vaidmens. Pasinaudojame metodu GetMembers( ) ištraukiant visą masyvą MemberInfo struktūrų (Pav. 15) arba pasinaudojant tam tikru elementu pagal jo pavadinimą FindMembers ( ).
 Pav. 15 MemberInfo detalizacija
 Laukų, Savybių, Konstruktorių, Metodų ir Įvykių tyrinėjimas
 Kad gautumėm visą elementų masyvą sugrupuotą pagal tai, kaip ir ką atlieka klasės elementai. Galima iškviesti atitinkamą funkciją:
 ü laukus iškviesime metodu GetFields( )
 FieldInfo[] fields = GetFields(BindingFlags.Public|BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.DeclaredOnly);
 ü savybes metodu GetProperties( )
 PropertyInfo[] props = GetProperties(BindingFlags.Public|BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.DeclaredOnly);
 ü konstruktorius metodu GetConstructors( )
 ConstructorInfo[] cons = GetConstructors(BindingFlags.Public|BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.DeclaredOnly);
 ü metodus metodu GetMethods( )
 MethodInfo[] meth = GetMethods(BindingFlags.Public|BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.DeclaredOnly);
 ü įvykius metodu GetEvents( )
 EventInfo[] eve = GetEvents(BindingFlags.Public|BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.DeclaredOnly);
 System.Type klasė suteikia galimybes pertiūrėti daugiau informacijos naudojantis iš pagrindinės klasės, kitomis klasėmis kaip MemberInfo klasė.
 Pagrindinė klasė visų tipų elementų informacijai pateikti. MemberInfo klasė yra pagrindinė visų Reflection klasių. Jei išskaičiuotumėme visus tipo elementus pasinaudojė System.Type.GetMembers( ) metodu, MemberInfo objektų masyvas būtų sugrątinamas, kuris suteikia pagrindinę informaciją apie kiekvieną priklausantį elementą ir yra galimybė iš tikrųjų panaudoti Reflection pratestuotuojant ar tinomas MemberInfo yra MethodInfo tipas ir daryti patikimą tipo atvaizdavimą, nagrinėti specifinius sugebėjimus.
 MemberInfo klasės: FieldInfo, EventInfo, ConstructorInfo, MethodInfo,PropertyInfo.
 Šios klasės susideda iš elemento informacijos konkrečiam klasės arba struktūros laukui: pavadinimas, duomenų tipas ir atributai, kurie buvo deklaruoti klasės arba struktūros lauke.
 Išplėsti metaduomenys:
 ü Metodai ir jų atributai
 MethodInfo mi = (MethodInfo)Metodu_sarasas.SelectedItem;
 Uzpildyti_atributais(Metodu_atributai, mi.GetCustomAttributes(false));
 ü Laukai ir jų atributai
 FieldInfo mi = (FieldInfo)Lauku_sarasas.SelectedItem;
 Uzpildyti_atributais(Lauku_atributai, mi.GetCustomAttributes(false));
 ü Įvykiai ir jų atributai
 EventInfo ei = (EventInfo)Ivykiu_sarasas.SelectedItem;
 Uzpildyti_atributais(Ivykiu_atributai, ei.GetCustomAttributes(false));
 ü Savybės ir jų atributai
 PropertyInfo pi = (PropertyInfo)Savybiu_sarasas.SelectedItem;
 Uzpildyti_atributais(Savybiu_atributai, pi.GetCustomAttributes(false));
 ü Konstruktoriai ir jų atributai
 ConstructorInfo mi = (ConstructorInfo)Konstruktoriu_sarasas.SelectedItem;
 Uzpildyti_atributais(Konstruktoriu_atributai, mi.GetCustomAttributes(false));
 .NET Rinkinio manifestas.
 Lenetelėje 4 pateikiu sukurto .NET komponento manifestą. Rinkinio manifestas [13], [17] yra metaduomenys kuris apibūdina, specifikuoja viską apie rinkinį: identiškumas, sąrašas failų priklausančių rinkiniui, nuorodos į išorinius rinkinius, eksportuojamus tipus, eksportuojamus resursus ir leidimus prieiti. Trumpiau, tai charakterizuoja visas detales reikalingas komponentų diegimui „plug – and – play“.
 .NET paltformoje, vietoj to kad ieškoti registre reikalingo komponento, CLR įdėmiai tiūri į rinkinio manifestą, nulemia, kuris išorinis rinkinys yra reikalingas, utkrauna reikalingą rinkinį kuris yra būtinas programai ir sukuria kaip atskirą klasės objekto atvejį.
 Name = diplominis
 Version = 1.0.0.25045
 CodeBase = file:///C:/Documents and Settings/Linas/My Documents/Visual Studio Projects/diplominis/bin/Debug/diplominis.exe
 Flags = PublicKey
 FullName = diplominis, Version=1.0.0.25045, Culture=neutral, PublicKeyToken=null
 GAC = no
 Location = c:documents and settingslinasmy documentsvisual studio projectsdiplominisbindebugdiplominis.exe
 // Modules (1)
 diplominis.exe
 ScopeName = diplominis.exe
 FullyQualifiedName = c:documents and settingslinasmy documentsvisual studio projectsdiplominisbindebugdiplominis.exe
 // Resources (1)
 Metaduomenys.Modulio_atributai.resources
 // Referenced Assemblies (4)
 mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
 System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
 // Attributes (8)
 String Product = Paieskos metaduomenys
 Object TypeId = System.Reflection.AssemblyProductAttribute
 String Configuration = Programa
 Object TypeId = System.Reflection.AssemblyConfigurationAttribute
 String Copyright = Linas Motiejunas, IN-0 grupes studentas
 Object TypeId = System.Reflection.AssemblyCopyrightAttribute
 String Company = VGTU
 Object TypeId = System.Reflection.AssemblyCompanyAttribute
 String Description = Atributu panaudojimas .NET platformoje
 Object TypeId = System.Reflection.AssemblyDescriptionAttribute
 String Trademark = VGTU, Inzinerine Informatika
 Object TypeId = System.Reflection.AssemblyTrademarkAttribute
 Boolean IsJITTrackingEnabled = True
 Boolean IsJITOptimizerDisabled = True
 Object TypeId = System.Diagnostics.DebuggableAttribute
 String Title = Bakalaurinis darbas. Uzduotis: pasiulyti, kaip isplesti metaduomenis automatizuotai paieskai ju vykdyti
 Object TypeId = System.Reflection.AssemblyTitleAttribute
 Lentelė 4 .NET Rinkinio manifestas
 Pav. 16: Reflection objektų modelis
 Komponento specifikacijoje, modulyje, tipe ir jo elementuose: konstruktoriuose, metoduose, įvykiuose, savybėse, ir laukuose yra formuojami arba gali būti vartotojo apibrėtti atributai. Jie įeina į kiekvieną iš jų.
 Dabar pagal atributus .NET komponentų paieška yra efektyvi. .NET komponento specifikacija gali būti sudaryta iš atributų. Tai yra informacija apie rinkinį: rinkinio pavadinimas, aprašymas, konfiguracijos apršsas, kompanijos sukurusios rinkinį pavadinimas, produkto pavadinimas, prekinis tenklas. Turėdami tokią informaciją galima ieškoti reikiamo .NET komponento, kuris siūlytų reikalingas paslaugas.(Pav.16) pavaizduotas .NET reflection objektų modelis.
 Pav. 17: .NET Rinkinio, jo modulio paieška
 Paieška suranda .NET komponentą (Pav.17) arba kitaip vadinamą .NET rinkinį, pateikia vartotojui kartu su atributais. Toliau ieškomas .NET komponento modulis bei jo atributai. Komponentą gali sudaryti keli .NET moduliai.
 Pav. 18: Modulio ir tipo paieška
 Per .NET reflection mechanizmą surandamas yra .NET komponento modulis (Pav. 18), jam priklausantys atributai. Ieškomi moduliui priklausantys tipai: interfeisas, struktūra ir klasė bei jų atributai.
 Pav. 19 Reflection ir bendroji tipų sistema (CTS), elementų paieška
 Per Reflection mechanizmą gaunama visa reikalinga metaduomenų informacija: metodai, įvykiai, savybės, laukai, konstruktoriai bei jų atributai (Pav. 19).
 4.4 Trumpas programinio kodo aiškinimas
 Programinis kodas yra dviejuose failuose. Trumpai aptarsime kiekvieną iš jų.
 Aprašomasis failas:
 AssemblyInfo.cs– šiame faile yra .NET komponento specifikacija, atributai.
 Pagrindinis failas:
 Paieskos_metaduomenys.cs– pagrindinis programinio kodo failas, kuriame kuriama Windows forma paviršius, inicializuojami kintamieji, Aprašomos funkcijos valdančios programos langą.
 App.bmp– tekstūra.
 Pav. 20 Komponentinė diagrama
 Komponentinė diagrama identifikuoja diplominis.exe rinkinį kaip priklausomą nuo išeities kodų: Paieskos_metaduomenys.cs ir AssemblyInfo.cs (Pav. 20)
 4.5 Programos naudojimo vadovas
 Programai vykdyti reikia, kad kompiuteryje būtų integruota CLR [12]. Programa vykdoma paleidtiant vykdomąjį failą diplominis.exe.
 Pav. 21 Programos darbo lango vaizdas
 Programa valdoma naudojant kompiuterio pelę ir klaviatūros mygtukus. Pasirinkus meniu komandą „.NET Rinkinys”, pateikiamas .NET rinkinio pavadinimas, jo versija bei papildoma informacija apie patį rinkinį – atributai (Pav. 21).
 Pasirinkus komandą “Modulis” išvedama modulio informacija.
 Komanda “Savybės” nustato kokios komponento savybės, bei jų atributai..
 Komanda “Metodai“ nustato kokie komponento metodai, bei jų atributai.
 Komanda “Klase“ nustato kokios komponento klasės, bei jų atributai.
 Komanda “Įvykiai“ nustato kokios komponento įvykius, bei jų atributai.
 Komanda “Laukai“ nustato kokie komponento laukai, bei jų atributai.
 Komanda “Išeiti iš programos” utbaigia programos darbą ir utdaro programos langą.
 Utbaigti programos vykdymą taip pat galima paspaudus mygtuką Esc.
 Šiame bakalauro baigiamajame darbe buvo pateikta utduotis išnagrinėti .NET komponentų metamodelio ypatumus, komponentų automatizuotos paieškos ypatumus bei pabandyti išplėsti .NET komponento metaduomenis.
 Pagal utduoties sąlygas buvo parinktas geriausiai tinkantis metodas, kaip išplėsti komponentų metaduomenis, t.y. per atributus. Išnagrinėjus programos veikimo principus, buvo padaryta išvada, kad teorijoje aprašomi metamodelio ypatumai, atitinka eksperimentiškai gautus rezultatus. Darbe pateiktas programos naudojimo vadovas ir jo programinis kodas.
 Manau, kad tolimesni darbai ir tyrimai .NET technologijų srityje turėtų būti skirti tobulinti, kurti paieškos sistemą atsitvelgiant į metaduomenis, jų reikšmes bei atributus.
 [1] .NET Framework Developer‘s Guide
 [2] Sametinger, J. Software Engineering with Reusable Components. Springer-Verlag, Berlin/Heidelberg/New York, 1997
 [3] Szyperski, C. Component Software: Beyond Object-Oriented Programming. Addison-Wesley, ACM Press, New York , 1998
 [4] Bassett, P.G. ,Framing Software Reuse: Lessons from the Real World. Prentice Hall, Inc. , 1997
 [5] R. Šeinauskas, Projektavimas su pakartotiniu programinės įrangos naudojimu ( Reuse)
 http://www.elen.ktu.lt/~rsei/KTU/T14L.ppt
 [6] Component - Definition.htm. http://www.google.lt
 [7] Component Definition.htm. http://www.google.lt
 [8] Metadata Definition.htm. http://www.google.lt
 [9] http://www.ktu.lt/lt/mokslas/konf03/konf_02/IT2002/VI_sekcija.pdf
 [10] Terminų ir santrumpų todynėlis, http://mm.mch.mii.lt/zodynelis_m.htm
 [11] Alessandro Orso, Mary Jean Harrold, and David Rosenblum, College of Computing
 Georgia Institute of Technology, Component Metadata for Software Engineering Tasks, www.cc.gatech.edu/aristotle/Publications/Papers/edo00.pdf
 [12] Albertas Čaplinskas, (1998) Programų sistemų intinerijos pagrindai (2), Matematikos ir informatikos institutas, Vilnius.
 [13] T. L. Thai, H. Lam .(2002) .NET Framework Essentials, 2nd Edition. Oreilly_dotnet_framework.pdf. http://www.google.lt
 [14] Reading Metadata Using Reflection,http://www.funducode.com/csharpart/ypk_articles_cs.htm
 [15] A. Hejlsberg, S. Wiltamuh, (1999 -2000) C# LanguageReference, unpublished work, Microsoft Corporation, http://elearning4guruscom.ntitemp.com/only4gurus/techlib/miscellaneous/C-sharpLRef2000.pdf
 [16] Jesse Liberty (2001) Programming C#, sample chapter “ Attributes and Reflection” http://www.ondotnet.com/pub/a/dotnet/excerpt/prog_csharp_ch18/index.html , http://www.google.lt
 [17] Алифанов Андрей, The RSDN Group, (2001), Использование атрибутов в среде .NET,
 http://www.rsdn.ru/article/dotnet/attributes.xml
 [18] Андрей Мартынов, The RSDNGroup, (2003), Метаданные в среде .NET, http://www.rsdn.ru/article/dotnet/refl.xml
 [19] B. Harvey, Sharpen Up on C# , M.S., MCSD http://www.only4gurus.com/techlib/miscellaneous/burt_csharp.pdf
 [20] Oficialus Microsoft internetinis puslapis, Visual Studio .NET Support Center
 http://www.scrigroup.com/limba/lituaniana/259/NET-komponent-metaduomen-panau61725.php