CATEGORII DOCUMENTE |
Bulgara | Ceha slovaca | Croata | Engleza | Estona | Finlandeza | Franceza |
Germana | Italiana | Letona | Lituaniana | Maghiara | Olandeza | Poloneza |
Sarba | Slovena | Spaniola | Suedeza | Turca | Ucraineana |
DOCUMENTE SIMILARE |
|
VILNIAUS GEDIMINO TECHNIKOS UNIVERSITETAS
FUNDAMENTINIŲ MOKSLŲ FAKULTETAS
INTINIERINĖS INFORMATIKOS KATEDRA
Linas Motiejūnas
. NET komponentų metaduomenų panaudojimas jų automatizuotai paieškai vykdyti
TURINYS
ĮVADAS
Tyrimo objektas
Darbo tikslas ir utdaviniai
Temos naujumas
Temos aktualumas
Mokslinio darbo vertė
Darbo aprobacija
ANALITINĖ DALIS
Komponento apibrėtimas
Metaduomenų apibrėtimas
Komponentiniai modeliai, komponentai, metaduomenys
Metaduomenys . NET platformoje
Metaduomenys platformoje
Tipų bibliotekos
Aplinka: Bendros Kalbos Mašina (CLR) (Common Language Runtime (CLR))
Klasės pakroviklis (Class Loader)
JIT kompiliatoriai ( Just in Time (JIT) compilers)
Įrankiai (Tools)
Komponentai ir rinkiniai
. NET komponento metamodelio ypatumai
Metaduomenų nauda
Metaduomenys ir save apibūdinantys komponentai
Metaduomenų struktūra ir panaudojimas
Metaduomenų Lentelės ir Aibės
Metaduomenų simboliai
Metaduomenys viduje PE failo
. NET komponento, rinkinio manifestas
IL kodas
Bendroji Tipų Sistema (CTS)
Nuorod tipai
Metaduomenys, paieškos vykdymo kriterijai
Tipo nariai metaduomenys
Automatizuota . NET komponentų paieška
. NET Reflection pagrindinės idejos
. Pasiūlymas, kai išplėsti . NET komponento metaduomenis
Atributų panaudojimas . NET platformoje
IŠVADOS
EKSPERIMENTINĖ DALIS
Naudota programinė įranga
C# programavimo kalba
C# ir JAVA programavimo kalbų palyginimas
C# tipai
Programos kūrimas
Metaduomenų tyrinėjimas programoje
Trumpas programinio kodo aiškinimas
Programos naudojimo vadovas
IŠVADOS IR PASIŪLYMAI
LITERATŪRA
PAVEIKSLŲ SĄRAŠAS
Pav. 1: Programavimo kalbų sąveika, kompiliatoriai, CLR aplinka
Pav. Programos kodo kompiliavimas
Pav. 4: . NET komponento struktūra
Pav. . NET komponento rinkinio hierarchija, metaduomenų modeliavimas
Pav. . NET komponento rinkinio metaduomenų hierarchija
Pav. WinCV Class Viewer pagrindinis langas
Pav. WinCV Class Viewer pagrindinis langas, paieška
Pav. Atributų reikšmė . NET komponente
Pav. 10: . NET platforma ir Microsoft Visual Studio. NET
Pav. 11: С# klasių elementai
Pav. 12 C# kodo kompiliavimas su atributais
Pav. 13 Programa išveda standartinius ir praplėstus metaduomenis
Pav. 14 Reflection ir bendroji tipų sistema (CTS)
Pav. 15 MemberInfo detalizacija
Pav. 16: Reflection objektų modelis
Pav. 17: . NET Rinkinio, jo modulio paieška
Pav. 18: Modulio ir tipo paieška
Pav. 20 Komponentinė diagrama
Pav. 21 Programos darbo lango vaizdas
SANTRUMPOS
COM (Component Object Model) Komponentinis objektų modelis
EJB (Enterprise JavaBeans) nuo platformos nepriklausoma komponentų architektūra, skirta objektiškai orientuotų taikomųjų utdavinių kūrimui
DCOM (Distributed Component Model) Paskirstytas komponentinis objektų modelis
IL, MSIL (Intermediate Language, Microsoft Intermediate Language) tarpinė kalba
CLR (Common Language Runtime) Bendros kalbos mašina
CTS (Common Type System) Bendroji dinaminė tipų sistema
Tyrimo objektas - . NET komponentų, jų metaduomenų panaudojimo technologija. Komponentas tai tiratuojamas, autonomiškai modernizuojamas, tiksliai nusakytą paskirtį ir griettai apibrėttą interfeisą turintis programinis modulis, padarytas taip, kad jį būtų nesunku įtraukti į veikiančią programų sistemą arba tokioje sistemoje pakeisti jį kitu analogiškus paskirtį bei interfeisą turinčiu komponentu [12]. Komponento kontekste metaduomenys yra struktūrizuotas komponento, rinkinio, objekto potymių aprašymas. [10] Bendrąja prasme metaduomenys yra duomenys apie duomenis Darbe nagrinėjami komponentų metaduomenys ir pasiūlomas būdas kaip juos išplėsti.
Darbo tikslas išnagrinėti . NET komponentines technologijas, . NET komponentų metaduomenų panaudojimą programų sistemose. Keliami utdaviniai:
apibrėtti, kas yra komponentas;
apibrėtti, kas yra komponento metaduomenys;
apibrėtti . NET komponentą, jo metaduomenis;
išskirti . NET komponentų metaduomenų tipus;
apibrėtti komponentų paieškos ypatumus;
pasiūlyti, kaip išplėsti . NET komponento metaduomenis;
eksperimentu patikrinti gautus rezultatus;
. NET komponentinė technologija pastaruoju metu yra daugelio rengiamų konferencijų programose, straipsniai komponentinio programavimo tema yra labiausiai cituojamųjų sąrašuose. Pastaruoju metu komponentinė programų intinerija [2] [3] (o ypač atkartojimo (reuse) technologija) pritraukė didelį tyrinėtojų (Nierstrasz ir kt. , 1992; Nierstrasz ir kt. , 1995; Brown, 1997; Sametinger, 1997; Szyperski, 1997; Kozaczynski ir kt. , 1998; Brown ir kt. , 1998) susidomėjimą. Akcentuojamos sudėtinės dalys, tiūrime kaip į pakartotinai naudojamus komponentus. Komponentų metaduomenys yra labiausiai diskutuojama ir matiausiai suprantama koncepcija.
Komponentai kuriami taip, kad būtų lengva juos integruoti. Tai yra patogu ir greita. Kiekvieno komponento nekuriame nuo pradtios. Yra įvairių nuomonių apie programinės įrangos atkartojimą (Bassett, 1997; Jacobson ir kt. , 1997; Sametinger, 1997). Pagal Bassettą, atkartojimą yra anksčiau sukurto komponento sugebėjimas būti panaudotu vėl, iš dalies arba visiškai, su modifikacijomis arba be jų [4] (Bassett, 1997). Esminis elementas . NET technologijoje yra metaduomenys, suteikiantys programavimo kalbų jungumą, operavimąsi. Metaduomenys yra raktas į paprastesnį programinį modelį.
Darbe pasiūlyta . NET komponento metaduomenis išplėsti atributais. Atributai tai mechanizmas skirtas pridėti, išplėsti metaduomenis, kaip kompilatoriaus instrukcijos ir kiti duomenys apie duomenis, metodai, klasės. Atributai yra pridedami į metaduomenis. Pasiūlytas . NET komponentų metaduomenų išplėtimas gali būti panaudotas . NET komponentų automatizuotai paieškai vykdyti.
Darbe pasiūlyti sprendimai patikrinti eksperimentinėje dalyje.
Prieš pradedant nagrinėti komponentus, komponentines sistemas (an component-based system) jų metaduomenis (metadata) yra teisingai suprasti ir apibrėtti, kas tai yra. Todėl iš pradtių apibrėšiu pagrindines sąvokas. Komponentinė sistema tai vienetas, kuriame todis komponentas yra pagrindinis, raktinis. Komponentinės sistemos gali būti sudarytos iš vieno komponento (kaip vartotojo sąsajos atveju), o gali būti daugia-komponentės sistemos. Komponentai yra abstraktesni negu objektų klasės ir gali būti laikomi savarankiškais servisų teikėjais [5].
Yra daug komponentų apibrėtimų. Štai keli iš jų:
PhilippeKrutchen, RationalSoftware [6] apibrėtia komponentą , kaip reikšming , nepriklausomą ir keičiamą sistemos dalį, kuris atlieka tam tikrą funkciją apibrėttoje architektūroje. Komponentas prisitaiko ir numato interfeisų fizinę realizaciją.
Pagal GartnerGroup [6]: Programinis vykdymo komponentas yra dinamiškai surištas paketas iš vienos ar keleto programų kaip vienetas per dokumentuotų interfeisų gali būti atidengtas vykdymo metu.
Clemens Szyperski [2], [3] apibrėtia programin komponentą, kaip kompozicijos vienetą su specifikuotais interfeisais ir atviru konteksto priklausomumu
GradyBooch, JimRumbaugh, IvarJacobson [7] apibrėtia Programinius komponentus, kurie įgalina praktinį daugkartinį jų panaudojimą. Egzistuoja ir kiti daugkartinio panaudojimo vienetai: išeities kodo bibliotekos, architektūros. Specifiškai, programiniai komponentai yra nepriklausomos produkcijos, išmokimo, išdėstymo vienetai.
Pagal tiesioginį (on-line) kompiuterijos todyną :
Komponentas:
Didesnės sistemos ar struktūros dalis;
Atskirai sukompiluotas programos modulis, kuris dinamiškai (veikiant programai) siejamas su kitais programos komponentais ir gali būti panaudotas keliose programose. Yra susiformavusi atskira komponentų projektavimo kryptis, vadinama komponentiniu programavimu.
Nors yra daug komponento apibrėtimų, tačiau išnagrinėjus aukščiau pateiktus, matome, kad Komponentas - nepriklausomas ir pakartotinai panaudojamas vienetas, kuri turi tokias pagrindines savybės:
sukurtas tam tikram tikslui;
siulo paslaugas per išreikštinį standartizuotą interfeisą;
gali turėti kelias realizacijas;
gali būti vykdomas skirtingose aplinkose;
turi turėti dokumentaciją, aprašą.
Objektas ir komponentas kartais vartojami kaip sinonimai, tačiau iš esmės tai yra skirtingos sąvokos. Komponentas yra išbaigta detalė, kuri gali būti įdėta į programą. Jis turi aiškiai apibrėttą sąsają su išore. Tuo komponentas iš išorės panašus į objektą. Tačiau jo vidinė struktūra gali būti įvairi. Komponentas datniausiai turi kelias klases ir objektus. Be to, komponente gali būti ne tik klasės. Jame net iš viso gali klasių nebūti. Komponentas gali būti sudarytas iš tradicinių procedūrų, gali turėti globaliųjų, statinių kintamųjų, net gali būti sukurtas naudojantis struktūrinio programavimo ar kitais principais. Panašiai kaip klasės gali būti susietos viena su kita paveldėjimo ryšiais, komponentai siejami importo ryšiais.
Informacinių sistemų komponentai nevisada tapatinami su objektais. Tai gali būti objektų sudėtingesnė struktūra.
Būna:
statinės kompozicijos surenkame ir pradeda veikti;
dinaminės kompozicijos sistemos vykdymo metu galime įjungti į sistemą.
Metaduomenys yra labiausiai diskutuojama ir matiausiai suprantama koncepcija.
Metaduomenys pagal kompiuterinį terminų todynėlį yra duomenys apie duomenis. Komponento kontekste metaduomenys yra struktūrizuotas komponento, rinkinio, objekto potymių aprašymas. [10] Bendrąja prasme metaduomenys yra duomenys apie duomenis. Paieškos metaduomenys: tai tokie metaduomenys, kurie reikalingi vartotojui, kad galėtų sutinoti, kas ir kokius duomenis turi, kur juos rasti, kaip įsigyti.
Metaduomenys [11] apibūdina statinius ir dinaminius komponento aspektus, yra vartotojui prieinami ir gali būti panaudojami skirtingoms utduotims kurti programų intinerijoje.
Programų kūrėjas, programuotojas rašydamas programinį kodą ir norėdamas panaudoti sukurtą komponentą savo programiniame kode turi tinoti kokias paslaugas atlieka sukurtas komponentas. Reikalinga papildoma informacija apie komponentą, utklausos ieškant specifinės informacijos susijusios su komponentu. Reikalinga įvairi informacija apie komponentą, kad tenkintų programuotoją. Programų kūrėjai norėtų sutinoti ar reikiamas komponentas atitinka saugumo reikalavimus programai, kaip yra išspręsta versijavimo problema, kokie yra naudojami metodai, laukai, operacijos ir kita detali informacija. Skirtinga informacija skirtinguose kontekstuose iškviečia bendrai tokią informaciją.
Kadangi metaduomenų informacija yra labai svarbi, daugelyje komponentinių modelių yra sudaryta galimybė teikti papildomą informaciją metaduomenis arba metametodus, grątinančius metaduomenis.
Pangrinėsiu keletą komponentinių modelių [11].
Sun Microsystems pateikta metodika Enterprise JavaBeans (EJB) orientuota į paskirstytų taikomųjų utdavinių serviso dalies kūrimą. JavaBean komponentas yra suformuotas iš metaduomenų skirtas pritaikyti komponentą programai. BeanInfo objektas inkapsuliuoja papildomas rūšis metaduomenų apie komponentą: komponento pavadinimas, tekstinė informacija apie komponento funkcionalumą, jo savybes ir t. t.
Microsoft korporacijos siūlomame objekto komponento modelyje (Component Object Model (COM)) reiškia komponentinis objektinis modelis, tai yra sudėtinio objekto modelis. COM klasės yra matiausiai vienos sąsajos realizacija, o klasių poaibiai įvardijami kaip COM objektai. Komponentas apima kelias klases taip sudarydamas vienetą, kurį galima pritaikyti sistemų kūrimo projektuose.
Interfeisai apibrėtiami tipų bibliotekose [13] tai metaduomenų blokuose, kuriuose išvardinamos interfeiso savybės ir metodai, metodų parametrai, parametrų tipai ir gratinamos reikšmės.
. NET platforma palaiko ne tik programavimo kalbų nepriklausomumą, bet taip pat ir kalbų susiejimą, integravimą. Tai reiškia, kad galima paveldėti klases, surasti klaidas, pasinaudoti polimorfizmu tarp skirtingų programavimo kalbų galimybe (pav. 1). . NET platforma leidtia tai atlikti, pasinaudojus tokia technine sąlyga kaip Bendrų Tipų Sistema (Common Type System (CTS), kurią turi palaikyti visi . NET komponentai. CTS palaiko ir uttikrina pagrindinius klasių, sąsajų, nuorodų ir reikšmių tipus [1].
Analogiškai ir Microsoft korporacijos siūlomame paskirstyto objekto komponento modelyje (Distributed Component Object Model (DCOM)) Iunknown interfeisas DCOM komponento sudaro galimybes įgyti informaciją, t. y. informaciją apie komponento interfeisus. Panašiai ir kituose komponentiniuose modeliuose.
Metaduomenys paprastai, komponentiniuose modeliuose, pateikia generatyvią, bendrą informaciją apie komponentą: klasės pavadinimas, metodai, parametrai, jų reikšmės.
Metaduomenys yra mašininė nuskaitoma informacija apie duomenis apie duomenis. Tokia informacija gali apimti detaliai: duomenų šaltinio turinys, dydis, formatas bei kitos charakteristikos. . NET aplinkoje, metaduomenys apima tipų apibrėttis, versijos informaciją, išorinio rinkinio (assembly) sujungimus bei kitą standartinę informaciją. [13]
Bet kokios dvi sistemos, komponentai ar objektai operuodami vienas su kitu turi tinoti katką vienas apie kitą. COM tai vadinama interfeiso specifikacija, kuris yra įgyvendinamas komponento tiekėju ir naudojamas vartotojų. Interfeiso specifikacija apima metodo prototipus su signatūromis, taipogi tipų apibrėttis visiems parametrams bei gratinamoms reikšmėms.
Tiktai C/C programuotojai turėjo galimybę lengvai modifikuoti arba naudoti tarpinę (Interface Definition Language (IDL)) tipų apibrėttis. Kitų kalbų programuotojai neturėjo tokios galimybės. Taigi, Microsoft korporacija išrado ir pasiūlė kitką nei IDL, kad kiekvienas galėtų naudotis, vadinamomis tipų bibliotekos (type library). COM, tipų bibliotekos suteikia galimybes aplinka arba įrankiais perskaityti, konstruoti, kurti klases (wrapper classes), kurios yra patogiausios (objektų) kūrėjui. Tipų bibliotekos taip pat leidtia vykdymo mašinoms tokioms kaip, COM, MTS, arba COM+ tikrinti, nagrinėti tipus vykdymo metu ir tiekti reikalingą sistemai arba tarpinę paramą programoms naudojančioms jas. Kaip pavyzdtiui, tipų bibliotekos palaiko dinaminį kreipimąsi ir leidtia COM vykdymo mašinai tiekti universalų duomenų tipų rūšiavimą.
Tipų bibliotekos yra pakankamai turtingos COM, tačiau ribotas standartizavimas. . NET platformoje iškyla naujas mechanizmas tipų informacijai fiksuoti, pertiūrėti, paieškai. Vietoj naudojamo termino tipų bibliotekos, tokią tipų informaciją vadiname metaduomenimis . NET aplinkoje.
Kaip ir tipų bibliotekos, yra C++ antraštiniai failai (header files), metaduomenys yra tipų biblioteka. NET platformoje metaduomenys yra pagrindinis mechanizmas ar dialektas, jog . NET vykdymo mašina, kompiliatoriai, įrankiai gali jais naudotis. Microsoft . NET naudoja metaduomenis apibūdinant, charakterizuojant visus tipus, kurie yra naudojami konkretaus . NET rinkinio. Šiuo atveju, metaduomenys specifikuoja . NET rinkinį: charakteristikos apie rinkinio identiškumą (rinkinio pavadinimas, versija, kultūra ir viešasis raktas), nuorodos į tipus, tipai kurie yra eksportuojami, o tai pat ir apsaugos reikalavimai vykdymo mašinos metu. Metaduomenys pateikia daugiau informacijos nei tipų bibliotekos. Čia taip pat pateikiamos . NET rinkinio ir modulių, klasių, interfeisų, metodų, savybių, laukų, įvykių, globalinių metodų specifikacijos.
Metaduomenys pateikia pakankamai informacijos programai, įrankiui, vykdymo mašinai surasti viską, kas yra reikalinga komponentų jungimui, integravimui. Dabar pertvelgsiu keletą įrankių, programų, kurios protingai naudoja metaduomenis . NET platformoje. Įrodysiu, jog metaduomenys yra iš tikr jų kaip ir tipų bibliotekos.
Pateikiu (pav. 2) CLR aplinkos schemą. CLR aplinka [1] naudoja metaduomenis verifikavimui, tikrinimui, saugumo vykdymui, rūšiavimui, atminties išdėstymui ir vykdymui. CLR aplinka yra priklausoma nuo metaduomenų teikti šiuos vykdymo mašinos ypatumus. CLR yra netymi . NET infrastruktūra. Skirtingai negu programinės įrangos bibliotekos, CLR yra sukurta ant tuščio pagrindo. CLR atlieka sukurtų . NET platformoje programų kodų vykdymą. CLR yra vykdymo mašina, kuri utkrauna reikalingas klases, atlieka reikiamų metodų kompiliavimą, uttikrina saugumo patikrą ir atlieka kitus vykdymo mašinos funkcionalumus. CLR vykdymas yra . dll arba . exe failai. Kurie susideda iš programinio kodo ir metaduomenų(duomenys apie duomenys). . NET programos vykdymas yra visai kitoks negu įprastinis, kadangi mes šiuo atveju turime ne tik programinį kodą ir duomenis, bet dar ir metaduomenis.
CLR aplinkos komponentas klasės pakroviklis naudoja metaduomenis surandant ir utkraunant . NET klases. Tai yra dėl to, jog metaduomenys įrašo detalią informaciją apie specifinę klasę kur ji yra saugoma: ar tame pačiame rinkinyje (assembly), viduje ar ut specifinės vardų, objektų erdvės (namespace), ar priklausomame rinkinyje eantį nutolusiame tinkle.
JIT kompiliatoriai naudoja metaduomenis kompiliuojant Microsoft Intermediate Language (IL) kodą. IL yra tarpinė reprezentacija, kalba kuri prasmingai bendrauja programavimo kalbų integravimo palaikyme, bet tai nėra Visual Basic ar baitinis kodas, kuris privalo būti aiškus. . NET platformoje JIT kompiliuoja IL į mašininį kodą pirmiau nei programa pradedama vykdyti, ir visa šitai daro kartu su metaduomenimis.
Įrankiai naudoja metaduomenis integravimo, jungimo palaikymui. Kaip pavyzdtiui, programavimo įrankiai gali naudoti metaduomenis generuojant iškviečiamus aplankus, kurie leidtia . NET ir COM komponentamams susimaišyti. Tokie įrankiai,kaip Debuggers, Profilers ir Objektų ieškovas (browser) gali naudoti metaduomenis pateikiant turtingesnį programavimo palaikymą. Vienas iš pavyzdtių, IntelliSense ypatumai, kuriuos palaiko Microsoft Visual Studio. NET. Kai tik utrašome objekto operaciją ir padedame tašką, įrankis (tool) parodo sąrašą metodų ir savybių iš kurių galima pasirinkti. Tuo būdu, nereikia be reikalingai ieškoti antraštinių failų (header files) ar dokumentacijos aptinkant tikslų, reikalingą metodo ar savybės pavadinimus bei sintaksę.
Kaip ir CLR aplinka, bet kuri programa, įrankis, ar utilita turinti galimybę skaityti metaduomenis iš . NET rinkinio gali panaudoti jį. Mes turime galimybę pasinaudoti Reflection klasėmis . NET platformoje nagrinėjant, tikrinant . NET PE failą ir tinoti viską apie duomenų tipus, kuriuos naudoja . NET rinkinys. CLR aplinka naudoja tas pačias Reflection klases tikrinti ir pateikti vykdymo mašinos ypatumus: atminties išskyrimą, apsaugos informaciją, tipų patikrinimą, derinimą (debugging), distancinį valdymą (remoting) ir kitką.
Metaduomenys suteikia programavimo kalbų jungumą, operavimąsi, esminis elemntas . NET platformoje visos programavimo kalbos privalo naudoti tuos pačius tipus, norint sugeneruoti teisingą, veikiantį . NET PE failą. . NET vykdymo mašina negali teikti tokių ypatumų kaip atminties išskyrimą, apsaugos informaciją, tipų patikrinimą, derinimą (debugging), distancinį valdymą (remoting) be metaduomenų turiningumo. Taigi, metaduomenys yra labai svarbi . NET dalis tokia svarbi, jog galima sakyti, jog nebūtų . NET be metaduomenų.
Dar kai buvo COM era, Microsoft dokumentacija [1] naudojo terminą komponentas (component), kuris reiškė COM klasę ar COM modulį (. dll ar . exe). . NET platformoje, Microsoft adresavo šį sumaišymą pateikiant naują koncepciją, rinkinys (assembly), kuris yra programinis komponentas teikiantis įjunk ir dirbk (plug and play), kaip ir techninės įrangos (hardware) komponentas. Teoriškai . NET rinkinys yra matdaug lygus COM moduliui. Praktiškai, rinkinys gali būti sudarytas iš tipų ir fizinių failų ( bitmap failai, . NET PE failai, ir t. t. ) kurie yra reikalingi vykdymo mašinai, kad įvyktų sėkmingas programos paleidimas. Taigi, rinkinys yra versijavimo, išdė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 jį ir t. t.
Metaduomenys [13],[18] yra dvejetainė informacija apibūdinanti programą, kuri yra saugoma CLR aplinkos vykdomosios programos faile arba atmintyje. Kai programos kodas yra kompiliuojamas į vykdomąjį . EXE failą, metaduomenys yra įterpiami į vieną porcijos failą, programos kodas yra konvertuojamas į IL tarpinę kalbą ir IL kodas yra įterpiamas į kitą porciją failo (pav. 3). Kiekvienas tipas ir jo elementas apibūdinamas, apibretiamas ir nurodomas modulyje per metaduomenis.
Kai kodas yra paleidtiamas vykdymui, vykdymo mašina utkrauna metaduomenis į atmintį ir ir remiantis jais, randama informacija apie programos kodo klases, elementus, paveldėjimus, ir t. t.
Metaduomenys apibūdina kiekvieną tipą ir elementą apibrėttą programos kode neutralia kalba. Metaduomenys saugo informaciją apie:
. NET rinkinio specifikacija
Unikalumas (pavadinimas, versija, kultūra, viešasis raktas. )
Naudojami tipai
Ryšiai su kitais rinkiniais
Apsaugos leidimai paleidtiant programą
Tipų aprašas
Pavadinimas, matomumas, pagrindinė klasė, realizuoti interfeisai.
Elementai (metodai, laukai, ypatybės, įvykiai, tarpiniai tipai).
Atributų sąrašas
Papildomas aprašas elementų, kurie modifikuoja tipus ir narius
Metaduomenys yra raktas į paprastesnį programinį modelį [1]. Čia jau nebereikalingai header failai, Interfeiso kalba (IDL), išoriniai metodai nuorodos į komponentą. Metaduomenys suteikia galimybę . NET programavimo kalboms aprašyti juos automatiškai neutralia kalba, to nemato nei vartotojas, nei programuotojas, projektuotojas. Be to, metaduomenys panaudojami ir per atributų panaudojimą. Metaduomenų pagrindiniai privalumai, nauda:
Save apibudinantys failai
CLR aplinkos moduliai ir rinkiniai yra save apibūdinantys. Modulio metaduomenys talpina savyje viską kas yra reikalinga, kad modulis galėtų sąveikatuti su kitu moduliumi. Metaduomenys automatiškai aprūpina IDL funkcionavimą komponentiniame objektiniame modelyje, trumpiau (COM), leidtiant pasinaudoti vienu failu ir elementų apibrėtimui, realizavimui, vykdymui. Vykdymo metu moduliai ir rinkiniai nereikalauja utregistravimo su operacine sistema. Taigi, specifikacijos, naudojamos vykdymo mašinos, atspindi programos kodą sukompiliuotame faile, kuris padidina programos tvirtumą, patikimumą.
Programavimo kalbos operavimas ir lengvesnis komponentinis programavimas, projektavimas
Metaduomenys suteikia visą informaciją reikalingą, būtiną apie sukompiliuotą programos kodą, kad galėtum pasinaudoti būtent komponentą , t. y. . exe ar . dll failą parašytą skirtinga programavimo kalba. Yra galimybė kurti kaip atskirą atvejį bet kokios klasės bet kuria valdoma programavimo kalba (kalba kuri kreipiasi į CLR aplinką) net nesirūpinant apie tikslią ar aiškią išdėstymo tvarką ar naudotis įprastu programavimo kalbos operuojamu kodu.
Atributai
. NET platformoje yra galimybė išvardyti specialios rūšies metaduomenis, kurie vadinami atributais, sukompiliuotame faile. Atributus galima surasti per . NET platformą ir yra naudojami detaliai kontrolei kaip komponentinė programa veikia vykdymo metu. Taip pat, galima išskirti savo metaduomenis į . NET platformos failus per vartotojo apibrėttus atributus.
Praeityje, programinis komponentas (. exe ar . dll) parašytas viena programavimo kalba negalėjo būti naudojamas kaip programiniu komponentu parašytu kita programavimo kalba. Komponentinis objektinis modelis (COM) išsprendė šią problemą. . NET platformos komponentai operuojami kompiliatoriais paprasčiau, atspindi papildomą informaciją į visus modulius ir rinkinius. Ši informacija, vadinama metaduomenimis, padeda komponentams vientisai sąveikauti vienas su kitu.
Pateiksiu aptvalgą pagal [1], kaip metaduomenys yra saugomi, laikomi . NET vykdomąjame (PE) faile, o taip pat pateiksiu kokia yra metaduomenų pagrindinė 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 iš lentelės ir aibės duomenų struktūrų. MSIL dalis susideda iš MSIL ir metaduomenų simbolių, kurie yra nuorodos į metaduomenų dalį vykdomojo failo.
Su metaduomenų simboliais susidurti galima, jei naudosimės tokiais įrankiais, kaip MSIL Disassembler (Ildasm. exe) kad galėtumėm pertiūrėti MSIL kodą arba vykdymo mašinos derinimo programa (Cordbg. exe) įvykdant atminties turinį.
Kiekviena metaduomenų lentelė [1] saugo informaciją apie programos elementus. Kaip pavyzdtiui, viena metaduomenų lentelė aprašo klases, kita laukus, ir t. t. Jei programos kode naudojame dešimt klasių, tuomet klasių lentelė turės dešimt eilučių, viena eilutė vienai klasei. Metaduomenų lentelės susieja kitas lenteles ir aibes. Kaip pavyzdtiui, metaduomenų klasių lentelė susieja su lentele, kurioje saugomi metodai.
Metaduomenys taip pat saugi informaciją keturiose aibių struktūrose: seka (string), gabalas (blob), vartotojo seka (user string) ir GUID. Visos sekos naudojamos pavadinti tipams ir nariams,elementams yra saugomos sekų aibėje. Kaip pavyzdtiui, metodų lentelė nesaugo tiesiogiai konkretaus metodo pavadinimo, bet taškus į metodų pavadinimus, kurie yra saugomi sekų aibėje
Kiekviena metaduomenų lentelės eilutė unikaliai identifikuota MSIL dalyje vykdomojo failo pagal metaduomenų simbolį. Metaduomenų simboliai yra koncepciškai panašūs į rodykles (pointers), kurie susieja tam tikrą metaduomenų lentelę.
Metaduomenų simbolis yra keturių baitų skaičius. Pirmasis baitas nurodo metaduomenų lentelę į kurią tam tikras simbolis nurodo (metodą, tipą ir t. t. ). Likusieji trys baitai tiksliai nusako eilutę metaduomenų lentelėje kuri atitinka programinis elementas [
Kai programa yra sukompiliuota CLR aplinkos, ji yra konvertuojama į PE failą kuris susideda iš trijų dalių pateikta (1 lentelėje)
PE dalis |
Turinys |
PE antraštė |
Tai yra indeksas PE failo pagrindinių dalių ir įėjimo taško adresas. Vykdymo metu yra naudojama ši informacija, kad nustatyti failą kaip PE failą ir nuspręsti kur vykdymas prasideda kai programa yra utkraunama į kompiuterio atmintį. |
MSIL instrukcijos |
Tarpinės kalbos
(IL) instrukcijos, kurios doroja programos kodą. |
Metaduomenys |
Metaduomenų lentelės ir aibės. Vykdymo metu CLR aplinka naudoja tai, kad galėtų įrašyti informaciją apie kiekvieną tipą ir elementą programos kode. Į šią dalį įeina atributai ir apsaugos informacija. |
Lentelė 1: PE failo struktūra
Kaip aptvelgiau auksčiau, tipai privalo parodyti, atidengti savo metaduomenis leidtiant įrankiams (tools) ir programoms prieti prie jų ir patikėti metaduomenims savo paslaugas (services). Metaduomenys nėra tik tipams. Programinės įrangos, komponento instaliavimas, konfigūravimas neapsieina be metaduomenų apie komponentą, vadovaujantį tipams. Dabar pateiksiu medtiagos apie . NET rinkinius (išdėstymo vienetus) ir manifestus (metaduomenys charakterizuojančios rinkinius).
Rinkinio manifestas [13], [17] (pav. 4) yra metaduomenys kuris apibūdina, specifikuoja viską apie rinkinį: identiškumas, sąrašas failų priklausančių rinkiniui, nuorodos į išorinius rinkinius, eksportuojamus tipus, eksportuojamus resursus ir leidimus prieiti. Trumpiau, tai charakterizuoja visas detales reikalingas komponentų diegimui plug and play. Nebėra būtinybės saugoti tipų informaciją registruose kaip COM.
COM kai naudojame konkrečią COM klasę, duodame COM bibliotekai klasės identifikatorių. COM biblioteka ieško registre COM komponento, kuris turi ir tiekia tą klasę, utkrauna komponentą, pasako komponentui duoti jam atskirą jo klasę ir grątinti nuorodą į tą klasės atveją. . NET paltformoje, vietoj to kad ieškoti registre reikalingo komponento, CLR įdėmiai tiūri į rinkinio manifestą, nulemia, kuris išorinis rinkinys yra reikalingas, utkrauna reikalingą rinkinį kuris yra būtinas programai ir sukuria kaip atskirą objekto klasės atvejį.
Rinkinys susideda iš IL kodo [13] (pav. 4), pagal
kurį CLR aplinka paleidtia jį vykdymui. IL kodas paprastai naudoja ne tik tipus
apibrėttus tame pačiame rinkinyje, bet gali ir naudoti ar kreiptis į tipus
apibrėttus kituose rinkiniuose. Rinkinys turi būti apibrėttas su kitais
rinkiniais, turi būti nuorodos į kitus rinkinius. Yra vienas įspėjimas:
kiekvienas rinkinys gali turėti tik vieną įėjimo tašką, kaip DLLMain( ),
WinMain( ), ar
Kadangi . NET siekia, jog visos programavimo kalbos būtų lygios, klasė parašyta C# kalba turi būti ekvivalenti klasei parašytai Visual basic kalba, taipogi interfeisas apibrėttas C++ kalba, turėtų būti taip pat specifikuotas COBOL programavimo kalba. Programavimo kalbos privalo sutikti su šiomis koncepcijomis, tai tada jie gali integruotis tarpusavyje. Kad programavimo kalbos galėtų integruotis, Microsoft korporacija apibrėtė bendrą tipų sistemą visoms . NET programavimo kalboms. Microsoft . NET palaiko gausų rinkinį tipų: reikšmių tipai, nuorodų tipai, klasės, interfeisai, delegatai.
CLR aplinka palaiko du skirtingus tipus: reikšmių tipai, nuorodų tipai.
Reikšmių tipai
Reikšmių tipai [13] (Value types) simbolizuoja reikšmes išskirtas steke. Reikšmės negali būti nulinės (null) ir visada turi turėti katkokių duomenų. Kai reikšmių tipai yra perduoti į funkciją, jie yra perduodami kopijos reikšme, kuri bus įvykdyta vykdymo mašinai metu. Tai reiškia, jog originali reikšmė nepasikeis, nepaisant jog katkas gali nutikti kopijai kviečiant funkciją. Būdingi tipai yra mati ir neutima daug atminties. Reikšmių tipai: primityvai, struktūros, sąrašai.
C# kalba
Int i; //bazinis elementas - primityvas
Struct Point //struktūra
Tai pat galima sukurti reikšmę išvestą iš klasės System. Value. Type.
Jei tipas sunaudoja daugybę atminties resursų, tuomet nuorodų tipai teikia daugiau naudos ut reikšmių tipus. Nuorodų tipai [13] (objektai, interfeisai, rodiklėlės) yra taip vadinami, gali turėti reikšmę null. Šie tipai yra perduodami per nuorodas, reikštų tai, jog kai yra perduodamas objektas į funkciją, adresas ar rodiklytė į objektą yra perduodama ne kopija objekto, kaip reikšmių tipuose. Nauda čia, jog nuorodų tipas gali būti naudojamas kaip išvedamos informacijos parametras, tai pat yra tai, jog nereikia eikvoti papildomų resursų, nes nera daromos kopijos. Jei objektas yra didelis ( reikalaujantis daug atminties), tuomet nuorodų tipai yra geresnis pasirinkimas. . NET platformoje yra nuorodų tipų trūkumas, tai ,jog nuorodų tipas turi būti išskirtas aibėje, t. y. tai reikalauja daugiau procesoriaus ciklų, nes tai turi būti valdoma ir šiukšlių surinkta CLR aplinkos.
. NET platformoje nuorodų tipai: klasės, interfeisai, masyvai ir delegatai.
Class Car //klase
Interface Isteering //interfeisas
Int[] a new int[5]; //masyvas
Delegate void Process( ); //delegatas
CLR vykdymo mašina suteikia galimybę apibrėtti tipo elementus [1], [14]: įvykius, laukus, metodus, savybes (pav. 5). Kiekvienas narys turi signatūrą. 2 lentelėje yra pateiktos elementų charakteristikos:
Elementas |
Charakteristika |
Įvykis |
Apibrėtia įvykį, kuris gali atsiliepti ir apibrėtia metodus prisijungiant, atsijungiant ar iškviečiant, inicijuojant įvykį. Įvykiai yra datnai naudojami informuoti tipu statusui keičiantis. Įvykiai . NET platformoje pagrindtia delegeto modelį |
Laukas |
Saugomos reikšmės ir specifikuojamos objekto tipo reikšmės. Charakterizuoja ir yra dalis tipo būsenos. Laukai gali būti bet kokio tipo. |
Metodas |
Charakterizuoja operacijas kurios yra tipe. Tai yra funkcija apibrėtta viduje klasės. Metodo signatūra specifikuoja leidtiamus tipus su visais argumentais ir gryttamosiomis reikšmėmis. Tai yra leistinos reikšmių operacijos. Metodai dar kitaip vadinami funkciniais elementais |
Savybė |
Įvardija tipo reikšmę ar būseną ir apibrėtia metodus įgyjant (getting) ir nustatant (setting) savybės reikšmę Savybės gali būti pirminiais tipais, pirminių tipų rinkiniais. Savybės yra datnai naudojamos išlaikyti viešąjį (public) interfeisą nepriklausomo tipo nuo tipo aktualios reprezentacijos. Kitaip sakant, - tai reikšmės kontraktas. Tai yra operacijos, kurios teikia priėjimą prie reikšmės. |
Lentelė 2: Elementų charakteristikos
Informacija metaduomenų išdėstoma šia hierarchija
Pasinaudokime įrankiu, esančiu Microsoft Visual Studio. NET, WinCV klasių pertiūros, paieškos sistema [1]. Tai įrankis, kuris gali būti panaudojamas esamų klasių rinkiniuose, prieinamuose visiems vartotojams (shared assemblies), taip pat pagrindinių klasių nagrinėjimui, paieškai vykdyti. Surandama klasė, pateikiama tos klasės metodai, savybės, įvykiai, ir laukai naudojantis C# programavimo kalba.
WinForms Class Viewer pagrindinis langas
Paieškos lauke (pav. 7) įrašome ieškomos klasės pavadinimą, kad sutinotume kokiai vardų erdvei (namespace) priklauso klasė,sutinoti jos metodus, laukus, įvykius, konstruktorius bei kokiam . NET rinkiniui ji priklauso.
Jei paieškos lauke (pav. 8) surinksime klasės pavadinimą, pvz:. date, matysime paieškos rezultatus. Daugybę klasių, kurių pavadinimas susideda iš date. Iš paeiškos rezultatų matome, jog pasirinkt reikalingą klasę yra sudėtinga, nes reikia pertiūrėti kokia struktūra yra atskirų klasių. Pertiūrėjus visas klases galima nuspręsti: pasirinkti reikiamą, tinkamą. Class Viewer parodo informaciją atspindint (reflecting) tipą naudojantis CLR Reflection (dokumentacija). Tačiau tokia paieška nėra efektyvi, nes reikia tinoti tikslų klasės pavadinimą, klasė gali būti pavadinta skirtingais pavadinimais.
. NET Reflection ir jos pagrindinės idėjos [1] susiformavo iš COM tipų bibliotekų modelio. Programos turi galimybę nustatyti, įvertinti tipų informaciją vykdymo mašinos metu ir iškviesti paslaugas, metodus. Pagrindiniai elementai, kurie įgalina tai metaduomenys ir . NET standartinė dinaminė tipų sistema (CTS)
Metaduomenys suteikia bendrą tipų informacijos ir kodo išdėstymą. . NET rinkiniai visą struktūrinę informaciją apie programą yra surinkta kartu su vykdymo mašinos aprašymu išreikštu MSIL, tarpine kalba. Struktūrinė informacija specifikuoja bendra forma rinkinius, jų modulius, detaliai kiekvieną duomenų tipą ir klasę. Klasių metodai ir visos kitos esybės yra saugomi su jų signatūromis ir grątinimo reikšmėmis ir jų MSIL kodu. MSIL yra dalis aprašymo bet kokio tai metodo, nes kodas yra vykdomas ir kompiliuojamas pavaizdavimui MSIL į mašininį kodą.
COM tipų bibliotekų informacija yra apribota tiems tipams kurie įtraukiami į biblioteką buvo aiškiai paklausi, metaduomenys yra prienamI kiekvienam tipui kuriuos naudoja . NET valdomas kodas. Kiekvienas . NET tipas, nuo paprasčiausių skaliarinių tipų kaip paprasčiausių integer iki kompleksinių klasių, gali būti panaudotas utklausoje ieškant reikiamo tipo. Vykdymo mašinos metu duomenų tipai atstovauja specialiai . NET vykdomai klasei System. Type. Ši klasė sudaro sąlygas detalų tyrinėjimą kiekvienu aspektu duomenų tipų. . NET platformos galimybė padaryti tipų informaciją pasiekiamą vykdymo metu per šią klasę, vadinama refleksija, atspindys
. NET programa susideda iš kodo, duomenų ir metaduomenų [18]. Atributai tai mechanizmas [17] skirtas pridėti, išplėsti metaduomenis, kaip kompilatoriaus instrukcijos ir kiti duomenys apie duomenis, metodai, klasės. Atributai yra pridedami į metaduomenis ir yra matomi per ILDasm. exe ar kitus metaduomenų skaitymo įrankius.
Atributas būtinas, pastovus priklausomumo tenklas.
Dauguma atributų
aprašo tokius programavimo kalbos elementus, kaip klasės, metodai, laukai ir
savybės. Tačiau kai kurie atributai
Atributai programiniame kode gali būti panaudojami taip [16]:
Aprašomas naujas arba pasinaudojama jau egzistuojančiu atributu . NET platformoje
Inicializuojamas konkretus atributo egzempliorius pasitelkus iškvietimu konstruktoriaus atributo.
Atributai yra įrašomi
i metaduomenis kompiliacijos metu ir
Yra keletas struktūrų kaip išspręsti su navigavimu per tipų informaciją yra nei paprasta, nei lengva. Taigi net jei ir keli atributinio programavimo aspektai, kaip dabar . NET paltformoje, yra galimybė COM komponentiniame objektiniame modelyje su tipų bibliotekomis ir bendraisiais atributais, kurie gali būti papildyti į tas bibliotekas. Įvertinant šio tipo informaciją yra sudėtinga programuotojams. Bendrieji tipo bibliotekos atributai yra prienami COM+, MTS, kurie sudaro sąlygas išdėstyti komponentus IDL faile ir importuoti į COM+ šie atributai yra perskaitomi ir komponentai sukonfiguruojami teisingai.
Aukščiau aprašiau komponentinius modelius, . NET komponentą, jo savybes, jo metaduomenų ypatumus ir kaip galima pasinaudoti jais. Yra daug apibrėtimų, tačiau detaliau juos išnagrinėjus, matome, kad jų autoriai sako tą patį tik kitais todtiais. Svarbu yra komponentų metaduomenys. Duomenys apie duomenis.
Toliau savo darbe . NET komponentų metaduomenų išplėtimą automatizuotai paieškai kurti aš naudosiu C# programavimo kalbą. Paskutiniais metais ypač daug dėmesio skiriama komponentams parašytiems kokia nors objektine programavimo kalba, datniausiai C++, C# , Java. Pasirinkau būtent C# programavimo kalbą, nes tai universali objektinio projektavimo kalba ir ją galima naudoti kaip bet kurios konkrečios objektinio projektavimo metodikos komponentą.
Šio baigiamojo darbo utduotis reikalauja sukurti programų sistemą . NET komponentų paieškai vykdyti. Eksperimento esmė patikrinti darbe pateiktas idėjas. Atsitvelgdamas į ankstesniame skyriuje išnagrinėtų komponentų metamodelio ypatumus, aš savo programai pasirinkau, jog automatizuotai paieškai vykdyti geriausiai būtų metaduomenis išplėsti per atributus, aprašytą poskyryje 2. 12. Tam yra kelios prietastys:
automatizuota komponentų paieška nėra efektyvi pagal standartinius metaduomenis
atributai išplečia standartinius metaduomenis;
atributai pritaikomi . NET komponento moduliams, klasėms, klasių metodams, savybėms, įvykiams, laukams;
CLR aplinka priklauso nuo atributų papildoma informacija apie klases, metodus, laukus, savybes, parametrus;
Atributai yra išsaugomi kartu su programos metaduomenimis ir gali būti tiriami per Reflection mechanizmą.
Mano sukurtos programos galimybės praplėsti . NET komponento metaduomenis per atributus. Sukuriu . NET komponentą, jo karkasą, kuris išveda į ekraną metainformaciją: rinkinio manifestas, modulio informacija, klasės, jų metodai, laukai, įvykiai, savybės bei papildomą jų informaciją atributus. Dabar automatizuota paieška gali būti vykdoma paprasčiau ne tik per programos standartinius metaduomenis, bet ir per atributus.
Kuriant šio baigiamojo darbo programų sistemą, buvo naudojama [12] programinė įranga. 'Microsoft Visual Studio . NET ' yra universalus daugiakalbio programavimo įrankis, skirtas greitai kurti ir diegti 'Microsoft Windows®', interneto ir mobiliųjų įrenginių programinę įrangą.
Utduočiai įvykdyti pasirinkau objektinio programavimo panaudojimo koncepciją . Programa parašyta C# programavimo kalba.
Microsoft C# [20] yra nauja programavimo kalba, kuri yra sukurta didelės apimties programoms kurti . NET aplinkoje. C# yra išsivysčiusi iš Microsoft C ir Microsoft C++ programavimo kalbų ir yra paprasta, moderni objektiš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 sudėtyje. C# pasitymi projektų šablonais, objekto modeliu, savybių puslapiais ir kitomis kūrimo aplinkos savybėmis. Visual C programavimo biblioteka yra . NET platforma.
. NET platforma (Pav. 10) yra viršuje operacinės sistemos, kuri gali būti kelių Windows tipų ir susidėti iš daug komponentų. . NET sukurtos programos iš esmės veikia Windows terpėje.
Pats svarbiausias šios platformos dalykas yra CLR aplinka. Jei lyginant su programavimu Java kalboje, tai būtu lygiai tas pats kaip Java Virtuali Mašina (Java Virtual Mashcine). Jei tai nebūtų galima palyginti su Java Virtualia Mašina (JVM), reikia suprasti, kad yra . NET platformos širdis ir siela. CLR aplinka aktyvuoja objektus, atlieka jų apsaugos tikrinimus, išdėlioja juos kompiuterio atmintyje, vykdo jų paleidimą ir juos pašalina iš atminties.
Pateiktoje schemoje CLR aplinka viename iš viršutinių sluoksnių yra aibė bazinių architektūros klasių. Šios klasės palaiko elementarius įvedimo išvedimo funkcionalumus, apsaugos valdymą, tinklo susiekimą, ryšio valdymą ir kitas funkcijas.
Virš platformos bazinių klasių yra kita aibė klasių, kuri tęsia duomenų valdymą ir palaikymą bei XML veikimą. Duomenų klasės palaiko pastovų duomenų valdymą, t. y tų duomenų, kurie yra susijusiose duomenų bazėse. Šios klasės susideda iš Struktūrinės Utklausų Kalbos(Structured query Language(SQL)) klasių, kurios pastoviai leidtia valdyti duomenų atsargas per standartinę SQL sąsają. Panašiai kaip ir SQL klasės, aibė klasių, kurios vadinasi ADO. NET leidtia manipuliuoti pastoviais duomenimis. Šalia duomenų klasių, . NET architektūra palaiko nematai klasių, kurios leidtia manipuliuoti XML duomenimis, atlikti XML paiešką ir XML transliacijas.
C# [15] yra paprasta, tačiau galinga programavimo kalba. Kadangi ji yra išsivysčiusi iš C ir C++ programavimo kalbų, todėl ji naudoja nematai C++ bruotų išraiškoms ir operatoriams. Ji taip pat palaiko nesaugų būdą, t. y atminties manipuliavimą pointerių pagalba, kurio nereguliuoja šiukšlių kolektorius
C#, kaip nauja programavimo kalba buvo kartu pristatyta su . NET platforma. C# buvo stengiamasi padaryti kuo paprastesnę ir gauti paprastumo, išraiškingumo ir pakankamai produktyvaus vykdymo programavimo kalbą. . NET platforma yra CLR aplinkos centre ir aibės bibliotekų, kurie gali būti išnaudojami plataus naudojimo programavimo kalboms, kurios gali būti naudojamos kartu ir kompiliuojamos Tarpinės Kalbos (IL) pagalba. C# programavimo kalba buvo sukurta su daugeliu panašumų į C++ ir Java programavimo kalbą.
Palyginsiu C# su kitomis gerai tinomomis programavimo kalbomis, t. y C++ ir Java, kad geriau suprasti pagrindinius jos pranašumus ir trūkumus.
C# ir Java [20] yra naujos kartos programavimo kalbos, kurios yra kilusios iš C ir C++. Abi iš jų turi perkeltas savybes, tokias kaip nenaudojamos atminties atlaisvinimu (šiukšlių kolekcija), kuri pašalina temo lygio utduočių palaikymą nuo programuotojų atsakomybės. Daugelyje sričių, jos yra labai panašios. Abidvi tiek C #, tiek ir Java yra kompiliuojamos Tarpine Kalba (IL): C# kompiliuojama Microsoft Tarpine Kalba (IL), o Java Java baitų kode. Abiem atvejais tarpinė kalba gali būti vykdoma pagal interpretavimą, taip vadinamoje virtualioje mašinoje.
C# turi paprastą duomenų tipą ir turi daugiau išplėstus reikšmių tipus. Skirtingai nuo Java C# pasitymi tokiais bruotais, kuriuos galime naudoti daugelyje kompiliatorių. Tačiau panašiai kaip Java, C# pasitymi klasėmis, kurios gali būti paveldėtos iš vienintelio paveldėjimo modulio, kuris yra pateikiamas per daugelio paveldimumo sąsają. Aukščiausio lygio klasės metodai C# naudoja delegetus-tipų apsaugojimo metodo pointerius. Jie yra naudojami įvykių palaikyme. Java didelės apimties masyvai yra sudaromi iš vieno masyvo, t. y didelės apimties masyvas yra naudojamas kaip vienetinių masyvų aibė. C# didelės apimties masyvai yra sudaromi kaip keturkampiai masyvai.
C# galima sukurti naujus nuorodų tipus, kad apibrėtti klases. Klasės aprūpina šablonais, kuriais šie tiesioginiai reikalavimai yra generuojami. Ryšys tarp klasės ir su ja susijusio nuorodos tipo yra suprantamas, kad klasė apibrėtia tipą, t. y klasė apibrėtia sudedamuosius tipo elementus.
Kiekvienas tipas susideda iš elementų, kurie yra vadinami tipų nariais. Yra du pagrindiniai narių tipai, kuriuos gali apibrėtti klasė. Pirmiausiai, klasė gali apibrėtti kitus tipus, t. y abu tiek reikšmes, tiek ir nuorodas. Ši idėja, kad tipai gali susidėti iš kitų tipų, yra tinoma iš objektinio programavimo teorijos. Kai tipai susideda iš kitų nuorodų tipų, tada tai vadiname sudedamaisiais tipais.
Sekantis svarbus dalykas, kalbant apie tipų narius yra, kad klasė gali aprašyti metodus, funkcijas taikomas reikšmių ir nuorodų tipų skaitymui ir manipuliavimui.
C# suteikia galimybę kreiptis į metodą ne pagal vardą, o pagal aprašą (parametrus ir grątinamą tipą), sukaupti grupes metodų, ir iškviesti juos vienu metu, su vienodais parametrais.
Indeksatoriai (Pav. 11) dar kitaip yra vadinami masyvais. Savybės tai reikšmės kontraktas. Tai yra operacijos, kurios teikia priėjimą prie reikšmės. Metodai charakterizuoja operacijas kurios yra tipe. Laukai saugomos reikšmės ir specifikuojamos objekto tipo reikšmės. Įvykiai apibrėtia įvykį, kuris gali atsiliepti ir apibrėtia metodus prisijungiant, atsijungiant ar iškviečiant, inicijuojant įvykį. Konstruktoriai konstruoja klases. O taip pat klasių elementai yra operatoriai, konstantos.
. NET Reflection ypatumai: ne tik detali pateikiama elementų informacija, bet ir atributai, kurie įgalino visiškai naują vystymosi paradigmą atributinį programavimą.
Atributai yra specialūs . NET platformos klasių elementai, kurie suteikia galimybę padidinti bet kurio struktūrinio elemento . NET klasių ir struktūrų su pagalbine informacija, kuri yra tiesioginė klasės dalis teikianti papildomą informaciją, kuri įvertinama vykdymo mechanizmo ir . NET platformos. Tai yra papildomi metaduomenys. Pavyzdtiui [serializable] atributas, kuris paliepia Serialization platformai, jog ji gali išdėstyti klasės būseną serijomis (serialize). Jei šis atributas nera utdėtas, klasės įgyvendintojas atmeta leidimą ir pateikia sąvajį realizavimą serijų išdėstymo per Iserialization interfeisą ir neleidtia serijinio išdėstymo ir nutolusio rūšiavimo.
. NET programa susideda iš kodo, duomenų ir metaduomenų.
Atributai tai mechanizmas skirtas pridėti, išplėsti metaduomenis, kaip kompilatoriaus instrukcijos ir kiti duomenys apie duomenis, metodai, klasės. Atributai yra pridedami į metaduomenis ir yra matomi per ILDasm ar kitus metaduomenų skaitymo įrankius.
Kuriu programą, kurioje išplėsiu metaduomenis ir pademonstruosiu kaip metaduomenis, papildomą jų informaciją atributus išsitraukti.
Pritaikome atributus . NET rinkiniui (Lentelė 3), pasinaudoję raktiniu todtiu assembly. Pateikiu detalią informaciją apie mano komponento teikiamas paslaugas, t. y. jo specifikaciją: rinkinio pavadinimas, aprasymas, konfiguracijos aprasas, kompanijos sukūrusios rinkinį 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')]
//konfiguracija
[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')]
//kultura
[assembly: AssemblyCulture('')]
//versijos numeris
[assembly: AssemblyVersion('1. 0. 0. *')]
Lentelė 3: Reflection objektų modelis
AttributeUsageAttribute
Pranešimas, kad naudosimės naudojamu atributu, AttributeUsageAttribute , kuris utduoda raktines naujos klasės charakteristikas, specifikaciją. Kaip pavyzdtiui, ar gali ir kaip gali būti atributas panaudotas visoms klasėms, arba kokiam elementui jis taikomas.
Sekantis fragmentas kodo iliustruoja AttributeUsageAttribute panaudojimą:
[AttributeUsage(AttributeTargets. Module | // aprašomas atributas moduliui AttributeTargets. Constructor| // aprašomas atributas konstruktoriuiAttributeTargets. Class| // aprašomas atributas klasei AttributeTargets. Methods| // aprašomas atributas metodams AttributeTargets. Events| // aprašomas atributas įvykiams AttributeTargets. Fields| // aprašomas atributas laukams AttributeTargets. Properties, // aprašomas atributas savybėms |
[Obsolete('Metaduomenu panaudojimas komponentu galimai paieskai vykdyti')]
Kompiliatorius, kompiliuodamas programą, panaudoja šį atributą ir pateikia kaip klaidą, išvesdamas į ekraną: 'Metaduomenu panaudojimas komponentu galimai paieskai vykdyti'
Obsolete yra iš System. ObsoleteAttribute
C# programos kodas (Pav. 12), kurį sudaro klasės, jų elementai bei atributai, kurie modifikuoja, prideda naujos informacijos prie elementų. , vadinamos atributais,. Visa tai patalpinama į . NET PE failo metaduomenų bloką. Kompiliuojant programos kodą, yra iškviečiami, inicijuojami įvykiai, siunčiamos klaidos, įspėjimai.
. NET Reflection yra viena iš fundamentaliausių technologijų . NET platformoje, taip pat yra nesunku ja naudotis. Reflection atidaro duris atributiniam programavimui ir tipų funkcionalumui. Mano sukurta programa išveda į ekraną ne tik standartinius, bet ir praplėstus metaduomenis atributus (Pav. 13).
System. Attribute klasė turi metodus, per kuriuos galima prieiti ir testuoti bendruosius atributus. Kadangi bet kuris vartotojo apibrėttas tipas gali būti panaudotas kaip atributas, jis yra išvestas iš sisteminės klasės Attribute. . NET platformos vardų erdvės pateiktos 1 priede.
Sukūriau 7 klases, kurios praplečia metaduomenis atributais iš sisteminės klasė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 Modulio_atributai : System. Attribute
public class Ivykiu_atributai : System. Attribute
public class Lauku_atributai : System. Attribute
Kurdamas programą, 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; //priėjimas prie metaduomenų
Elementų tyrinėjimas ir paieška
Bendram priėjimui prie elementų, nepriklausomai nuo jų tikro vaidmens. Pasinaudojame metodu GetMembers( ) ištraukiant visą masyvą MemberInfo struktūrų (Pav. 15) arba pasinaudojant tam tikru elementu pagal jo pavadinimą FindMembers ( ).
Laukų, Savybių, Konstruktorių, Metodų ir Įvykių tyrinėjimas
Kad gautumėm visą elementų masyvą sugrupuotą pagal tai, kaip ir ką atlieka klasės elementai. Galima iškviesti atitinkamą funkciją:
laukus iškviesime metodu GetFields( )
FieldInfo[] fields = GetFields(BindingFlags. Public|BindingFlags. Instance|BindingFlags. NonPublic|BindingFlags. DeclaredOnly);
savybes metodu GetProperties( )
PropertyInfo[] props = GetProperties(BindingFlags. Public|BindingFlags. Instance|BindingFlags. NonPublic|BindingFlags. DeclaredOnly);
konstruktorius metodu GetConstructors( )
ConstructorInfo[] cons = GetConstructors(BindingFlags. Public|BindingFlags. Instance|BindingFlags. NonPublic|BindingFlags. DeclaredOnly);
metodus metodu GetMethods( )
MethodInfo[] meth = GetMethods(BindingFlags. Public|BindingFlags. Instance|BindingFlags. NonPublic|BindingFlags. DeclaredOnly);
įvykius metodu GetEvents( )
EventInfo[] eve = GetEvents(BindingFlags. Public|BindingFlags. Instance|BindingFlags. NonPublic|BindingFlags. DeclaredOnly);
Detalesnė informacija
System. Type klasė suteikia galimybes pertiūrėti daugiau informacijos naudojantis iš pagrindinės klasės, kitomis klasėmis kaip MemberInfo klasė.
MemberInfo
Pagrindinė klasė visų tipų elementų informacijai pateikti. MemberInfo klasė yra pagrindinė visų Reflection klasių. Jei išskaičiuotumėme visus tipo elementus pasinaudojė System. Type. GetMembers( ) metodu, MemberInfo objektų masyvas būtų sugrątinamas, kuris suteikia pagrindinę informaciją apie kiekvieną priklausantį elementą ir yra galimybė iš tikrųjų panaudoti Reflection pratestuotuojant ar tinomas MemberInfo yra MethodInfo tipas ir daryti patikimą tipo atvaizdavimą, nagrinėti specifinius sugebėjimus.
MemberInfo klasės: FieldInfo, EventInfo, ConstructorInfo, MethodInfo,PropertyInfo.
Šios klasės susideda iš elemento informacijos konkrečiam klasės arba struktūros laukui: pavadinimas, duomenų tipas ir atributai, kurie buvo deklaruoti klasės arba struktūros lauke.
Išplėsti metaduomenys:
Metodai ir jų atributai
MethodInfo mi = (MethodInfo)Metodu_sarasas. SelectedItem;
Uzpildyti_atributais(Metodu_atributai, mi. GetCustomAttributes(false));
Laukai ir jų atributai
FieldInfo mi = (FieldInfo)Lauku_sarasas. SelectedItem;
Uzpildyti_atributais(Lauku_atributai, mi. GetCustomAttributes(false));
Įvykiai ir jų atributai
EventInfo ei = (EventInfo)Ivykiu_sarasas. SelectedItem;
Uzpildyti_atributais(Ivykiu_atributai, ei. GetCustomAttributes(false));
Savybės ir jų atributai
PropertyInfo pi = (PropertyInfo)Savybiu_sarasas. SelectedItem;
Uzpildyti_atributais(Savybiu_atributai, pi. GetCustomAttributes(false));
Konstruktoriai ir jų atributai
ConstructorInfo mi = (ConstructorInfo)Konstruktoriu_sarasas. SelectedItem;
Uzpildyti_atributais(Konstruktoriu_atributai, mi. GetCustomAttributes(false));
. NET Rinkinio manifestas.
Lenetelėje 4 pateikiu sukurto . NET komponento manifestą. Rinkinio manifestas [13], [17] yra metaduomenys kuris apibūdina, specifikuoja viską apie rinkinį: identiškumas, sąrašas failų priklausančių rinkiniui, nuorodos į išorinius rinkinius, eksportuojamus tipus, eksportuojamus resursus ir leidimus prieiti. Trumpiau, tai charakterizuoja visas detales reikalingas komponentų diegimui plug and play.
. NET paltformoje, vietoj to kad ieškoti registre reikalingo komponento, CLR įdėmiai tiūri į rinkinio manifestą, nulemia, kuris išorinis rinkinys yra reikalingas, utkrauna reikalingą rinkinį kuris yra būtinas programai ir sukuria kaip atskirą klasės objekto atvejį.
Name = diplominis
Culture =
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. Windows. Forms, Version=1. 0. 3300. 0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System, Version=1. 0. 3300. 0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System. Drawing, Version=1. 0. 3300. 0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// Attributes (8)
AssemblyProductAttribute
String Product = Paieskos metaduomenys
Object TypeId = System. Reflection. AssemblyProductAttribute
AssemblyConfigurationAttribute
String Configuration = Programa
Object TypeId = System. Reflection. AssemblyConfigurationAttribute
AssemblyCopyrightAttribute
String Copyright = Linas Motiejunas, IN-0 grupes studentas
Object TypeId = System. Reflection. AssemblyCopyrightAttribute
AssemblyCompanyAttribute
String Company = VGTU
Object TypeId = System. Reflection. AssemblyCompanyAttribute
AssemblyDescriptionAttribute
String Description = Atributu panaudojimas . NET platformoje
Object TypeId = System. Reflection. AssemblyDescriptionAttribute
AssemblyTrademarkAttribute
String Trademark = VGTU, Inzinerine Informatika
Object TypeId = System. Reflection. AssemblyTrademarkAttribute
DebuggableAttribute
Boolean IsJITTrackingEnabled = True
Boolean IsJITOptimizerDisabled = True
Object TypeId = System. Diagnostics. DebuggableAttribute
AssemblyTitleAttribute
String Title = Bakalaurinis darbas. Uzduotis: pasiulyti, kaip isplesti metaduomenis automatizuotai paieskai ju vykdyti
Object TypeId = System. Reflection. AssemblyTitleAttribute
Lentelė 4 . NET Rinkinio manifestas
Komponento specifikacijoje, modulyje, tipe ir jo elementuose: konstruktoriuose, metoduose, įvykiuose, savybėse, ir laukuose yra formuojami arba gali būti vartotojo apibrėtti atributai. Jie įeina į kiekvieną iš jų.
Dabar pagal atributus . NET komponentų paieška yra efektyvi. . NET komponento specifikacija gali būti sudaryta iš atributų. Tai yra informacija apie rinkinį: rinkinio pavadinimas, aprašymas, konfiguracijos apršsas, kompanijos sukurusios rinkinį pavadinimas, produkto pavadinimas, prekinis tenklas. Turėdami tokią informaciją galima ieškoti reikiamo . NET komponento, kuris siūlytų reikalingas paslaugas. (Pav. 16) pavaizduotas . NET reflection objektų modelis.
Paieška suranda . NET komponentą (Pav. 17) arba kitaip vadinamą . NET rinkinį, pateikia vartotojui kartu su atributais. Toliau ieškomas . NET komponento modulis bei jo atributai. Komponentą gali sudaryti keli . NET moduliai.
Per . NET reflection mechanizmą surandamas yra . NET komponento modulis (Pav. 18), jam priklausantys atributai. Ieškomi moduliui priklausantys tipai: interfeisas, struktūra ir klasė bei jų atributai.
Pav. 19 Reflection ir bendroji tipų sistema (CTS), elementų paieška
Per Reflection mechanizmą gaunama visa reikalinga metaduomenų informacija: metodai, įvykiai, savybės, laukai, konstruktoriai bei jų atributai (Pav. 19).
Programinis kodas yra dviejuose failuose. Trumpai aptarsime kiekvieną iš jų.
Aprašomasis failas:
AssemblyInfo. cs šiame faile yra . NET komponento specifikacija, atributai.
Pagrindinis failas:
Paieskos_metaduomenys. cs pagrindinis programinio kodo failas, kuriame kuriama Windows forma paviršius, inicializuojami kintamieji, Aprašomos funkcijos valdančios programos langą.
App. bmp tekstūra.
Komponentinė diagrama identifikuoja diplominis. exe rinkinį kaip priklausomą nuo išeities kodų: Paieskos_metaduomenys. cs ir AssemblyInfo. cs (Pav. 20)
Programai vykdyti reikia, kad kompiuteryje būtų integruota CLR [12]. Programa vykdoma paleidtiant vykdomąjį failą diplominis. exe.
Programa valdoma naudojant kompiuterio pelę ir klaviatūros mygtukus. Pasirinkus meniu komandą . NET Rinkinys, pateikiamas . NET rinkinio pavadinimas, jo versija bei papildoma informacija apie patį rinkinį atributai (Pav. 21).
Pasirinkus komandą Modulis išvedama modulio informacija.
Komanda Savybės nustato kokios komponento savybės, bei jų atributai. .
Komanda Metodai nustato kokie komponento metodai, bei jų atributai.
Komanda Klase nustato kokios komponento klasės, bei jų atributai.
Komanda Įvykiai nustato kokios komponento įvykius, bei jų atributai.
Komanda Laukai nustato kokie komponento laukai, bei jų atributai.
Komanda Išeiti iš programos utbaigia programos darbą ir utdaro programos langą.
Utbaigti programos vykdymą taip pat galima paspaudus mygtuką Esc.
Šiame bakalauro baigiamajame darbe buvo pateikta utduotis išnagrinėti . NET komponentų metamodelio ypatumus, komponentų automatizuotos paieškos ypatumus bei pabandyti išplėsti . NET komponento metaduomenis.
Pagal utduoties sąlygas buvo parinktas geriausiai tinkantis metodas, kaip išplėsti komponentų metaduomenis, t. y. per atributus. Išnagrinėjus programos veikimo principus, buvo padaryta išvada, kad teorijoje aprašomi metamodelio ypatumai, atitinka eksperimentiškai gautus rezultatus. Darbe pateiktas programos naudojimo vadovas ir jo programinis kodas.
Manau, kad tolimesni darbai ir tyrimai . NET technologijų srityje turėtų būti skirti tobulinti, kurti paieškos sistemą atsitvelgiant į metaduomenis, jų reikšmes bei atributus.
. NET Framework Developers Guide
[2] Sametinger, J. Software Engineering with
Reusable Components.
[3] Szyperski,
C. Component Software: Beyond Object-Oriented Programming.
Addison-Wesley, ACM Press,
[4] Bassett, P. G. ,Framing Software Reuse: Lessons from the Real World. Prentice Hall, Inc. , 1997
] R. Šeinauskas, Projektavimas su pakartotiniu programinės įrangos naudojimu ( Reuse)
Component - Definition. htm. https://www. google. lt
Component Definition. htm. https://www. google. lt
Metadata Definition. htm. https://www. google. lt
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
T. L. Thai, H. Lam . (2002) . NET Framework Essentials, 2nd Edition. Oreilly_dotnet_framework. pdf. https://www. google. lt
1 PRIEDAS
2 PRIEDAS
Programos kodas
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 3194
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved
Distribuie URL
Adauga cod HTML in site