Skip to main content

Full text of "Programming for .NET Framework Book - Volume 2"

See other formats


CBeT/WH HaKOB n KO/ieKrm 



MPw\?/mwp& 



_TL 




& 



.net 

Framework 




mm 



CAift ytelerik 



ETxurapcxa acoiwaiiMsi 
Ha pa3pa6oTHMUHTe Ha ccxpTyep 




HRPC 



«^ XHfluHOHflnHflflHflflemnfl 
» « no PA3PA60THH hh coauyep 



KpaTKO cbfl-bp>t<aHiie 



Tom 2 

KpaTKO cbfltpwaHMe 2 

C"bfl-bp>KaHMe 13 

ripeflrOBOp KbM BTOpMfl TOM 33 

T/iaBa 15. ll3rpa>KflaHe Ha rpacptmeH noTpe6nTe/iCKn MHTepcpeftc c 
Windows Forms 55 

T/iaBa 16. M3rpa>KflaHe Ha ye6 npusioweHMfi c ASP.NET 173 

T/iaBa 17. Mhoi-ohmujkobo nporpaMMpaHe m CMHxpoHM3ai4mi 283 

T/iaBa 18. Mpe>KOBO m MHTepHeT nporpaMMpaHe 349 

T/iaBa 19. OTpaweHue Ha TwnoBeTe (Reflection) 431 

T/iaBa 20. Cepna/iM3ai4mi Ha qaHHH 459 

T/iaBa 21. Ye6 yc/iyrn c ASP.NET 501 

T/iaBa 22. OTfla/ieneHM H3BHKBaHHn c .NET Remoting 587 

T/iaBa 23. B3anMOfleMCTBne c HeynpaBsinBaH koa 631 

T/iaBa 24. YnpaB/ieHi/ie Ha naMeTTa m pecypcirre 675 

T/iaBa 25. AceM6/iMTa m pa3npocTpaHeHne 747 

T/iaBa 26. CnrypHOCT b .NET Framework 815 

T/iaBa 27. Mono - CBo6oflHa i/iMnsieMeHTaMi/in Ha .NET Framework. .863 

T/iaBa 28. IIomoimhh MHCTpyMeHTM 3a .NET pa3pa6oTHHMM 909 

T/iaBa 29. npaKTimecKM npoeKT 971 

3aK/itOHeHne ki»m BTopmi tom 1031 



riporpaMMpaHe 3a 
.NET Framework 



CeeT/iMH HaKOB 

M KO/ieKTMB 



A/ieKcaHfltp PyceB 
A/ieKcaHfltp 

Xafl>KMKP"bCTeB 

Ahtoh AHflpeeB 
BpaHMMnp AHre/iOB 
Bacmi BaKa/iOB 
Bmktop Xhbkob 
Ta/iMH M/ineB 
Teoprn neHHeB 
flenH BapneB 

flMMMTtp BOHeB 
flMMMTtp KaHeB 



MBaM/lO flMMOB 
MBaM/10 XpMCTOB 

MBaH MuTeB 
/la3ap KnpneB 
MaHO/i flOHeB 
MapTMH Ky/iOB 
Muxan/i Ctomhob 
MoHMKa A/ieKCueBa 
HnKO/iaM HeflajiKOB 
naHaiiOT flo6pnKOB 
npec/iaB HaKOB 
Pafloc/iaB MBaHOB 



Poc/iaH BopucoB 

CBeT/lMH HaKOB 

Crec^aH flo6peB 
CrecJjaH 3axapneB 
CTecfiaH Knpji30B 
Ctohh flaMOB 
Toflop Ko/ieB 
Xpmcto fleiueB 

XpMCTO PaflKOB 

UBeTe/iMH AHflpeeB 
flBop TaiueB 



Ei>/irapcKa acouuauMsi Ha 
pa3pa6oTHiiuiiTe Ha cocpTyep 

Cocpusi, 2004-2006 



llporpaMMpaHe 3a .NET Framework 
(tom 2) 



© 5"b/irapcKa acounauna Ha pa3pa6oTHnunTe Ha 
cocjrryep (BAPC), 2006 r. 

HacTOJimaTa KHura ce pa3npocrpaH5iBa cbo6oaho npn c/ieflHMTe ycjiOBun: 
HkiTaTe/iMTe MinaT npaBo: 

- fla M3no/i3BaT KHuraTa m yHe6HMTe MaTepna/in kt>m Hen v\nv\ Hacru ot tax 
3a BCflKaKBM ue/in, BK/iKiHMTe/iHO fl,a vv\ aa npoMeHAT cnopefl cbomtc 
HyxflM m fla rn M3no/i3BaT npn M3B"bpiuBaHe Ha KOMepcua/iHa aefiHOCT; 

- fla M3no/i3BaT cope KOfla ot npuMepnTe v\ fleMOHcrpaunnTe, BK/iKDneHM KtM 
KHuraTa v\ yHe6HMTe MaTepna/in v\i\v\ TexHM MOAMcJjMKaunn, 3a BCAKaKBn 
HyjKflM, BK/lK)HMTe/lHO M B KOMepcua/iHM cocfrryepHki npoayKTki; 

- fla pa3npocTpaH5iBaT 6e3n/iaTHO HenpoMeHeHM Konun Ha KHuraTa v\ yne6- 
HMTe MaTepna/in b e/ieicrpoHeH v\s\v\ xapTneH bv\/\; 

- p,a pa3npocrpaHJiBaT 6e3n/iaTH0 opurnHa/iHM v\nv\ npoMeHeHM nacTM ot 
yne6HMTe MaTepna/in, ho caMO npn m3pmhhoto cnoMeHaBaHe Ha M3TOHHMKa 
m aBTopnTe Ha cbOTBeTHkm tckct, nporpaMeH kop, v\s\v\ flpyr MaTepna/i. 

HuTaTe/iMTe HfiMaT npaBo: 

- fla pa3npocTpaHABaT cpemy 3armamaHe KHuraTa, yne6HMTe MaTepna/in 

M/1M HaCTM OT TAX (BK/lKDHMTe/lHO MOflMCjjMUMpaHM BepCMkl), KaTO M3K/lK)He- 

Hue npaBM caMO nporpaMHiiflT koa; 

- fla npeMaxBaT Hacroammi nvu\eH3 ot KHuraTa mjim yne6HMTe MaTepna/in. 



Bcmhkm 3ana3eHM MapKM, M3no/i3BaHM b Ta3M KHura, ca co6ctb6hoct Ha TexHMTe 
npnTe>KaTe/iM. 



Oc|DMi4Ma/ieH ye6 caMT: 
www.devbq.org/dotnetbook/ 

ISBN: 954-775-672-9 
ISBN: 978-954-775-672-4 



UdC^HRI 



PC 

% % ^ no PR3PRBQ TKH HR CO Q TMEP 



^ 



HAMMOHA/1HA AKAflEMIIfl flO PA3PAEOTKA HA COOTYEP 



/leKTopiiTe 

» CBernnH HanoB e 

aBTop Ha fleceTKM TexHMMecKM 
ny6^MKauMM m hako/iko khmtm, 
CBtp3aHM c pa3pa6oTKaTa Ha 
cocfrryep, 3apaflM KoeTO e Tbp- 

CeH ZieKTOp M KOHCy/lTaHT. 

Tom e pa3pa60TMMK c flt/iroro- 
fluiueH onuT, pa6oTM/i no pa3- 
HOo6pa3HM npoeKTM, pea/11/131/1- 
paHM c pa3/l|/|MHI/l TexHO/iornn 
(.NET, Java, Oracle, PKI m ap.) 
m npenoflaBaTe^ no cbBpeMeH- 
hm cocfuyepHM TexHO^oruM b CY 

"CB. K/lMMeHT OxpMflCKM". 

npe3 2004 r. e HOCMTe/i Ha 
HarpaflaTa "fliKOH ATaHacoB 
Ha npe3kifleHTa Ha Bt/irapua 
Teopru ritpBaHOB. 

CBeT/iMH HaKOB ptKOBOflu o6y- 
MeHneTO no Java TexHO/iornn b 
AKaaeMMflTa. 

» MapTMH KynoB e 

cocfrryepeH MHweHep m KOHcy/i- 
TaHT c flt/iroroflniueH onuT b 
M3rpa>KflaHeT0 Ha peiueHnsi c 
n/iaT(t>opMi/iTe Ha Microsoft. 

MapTMH e onuTeH kiHCTpyicrop m 
cepTMCpMunpaH ot MaMKpoco0T 
pa3pa6oTMMK no nporpaMi/ue 
MCSD, MCSD.NET, MCPD m 
MVP m MexflyHapofleH /leicrop b 
CBeTOBHaTa opraHki3aui/isi Ha 
.NET noTpe6nTe^CKMTe rpynn 
INETA. 

MapTMH KynoB ptKOBOflu o6y- 
HeHkieTO no .NET TexHO/iorm/i b 
AKafleMkisua. 



AKafleMMma 

» HauMOHa/iHa aKafleMnn no pa3pa- 
6oTKa Ha cocpTyep (HAPC) e ueHTbp 
3a npo0ecnoHa/iHO o6yMeHne Ha co0- 
TyepHM cneuna/iMCTM. 

» HAPC npoBe>Kfla BE3n/lATHO Kyp- 
coBe no pa3pa6oTKa Ha co0Tyep 1/1 CbB- 
peMeHHM co0TyepHM TexHO/iori/ii/i b Co- 
0i/m m flpyrn rpaflOBe. 

» npefl/iaraHM cneuna/iHOCTn: 

â–  B-bBeflemie b nporpaMMpaHeTO 
(c e3Mi4MTe C# m Java) 

â–  Core .NET Developer 

â–  Core Java Developer 

» KanecTBeHO o6yneHMe c mhoto 
npaKTMnecKM npoeKTM v\ MHflMBMfly- 
a/iHO BHMMaHne 3a BceKi/i. 

» l~a pa htm pa Ha pa6oTa! TpyaoB ao- 
roBop npi/i nocTtnBaHe b AKafleMi/mTa. 

» EE3n/1ATHO! 

YMMTe 6e3njiaTHO b^b BtBefli/iTe/iHi/iTe 
KypcoBe m no CTi/meHfli/ii/i ot pa6oTOfla- 
Te/iMTe b c/ieflBam,MTe Hi/ma. 



http://academy.devbg.org 



ytelerik 

deliver more than expected 

CeeTOBeH /in fl ep b paapa6oTKaTa 
Ha Ul KOMnoHeHTH aa -NET 



3a KownaHUHTa 

TenepHKe 6b/irapcKa KOMnannn r ftOKasa/ia cee 
pa3pa6oTKaTa he* KownoHeHTii 3a 
norpeSnTencKM HHTeptfreiic 3a .MET 
ninaT<|>opMaTa h npnno>KeHMa 3a Microsoft 
SharePoint. MMeTO hta TenepwK e chhohhm Ha 
HHOBaTHBHQCT, arpecHBeH npoflyKTOB FlJiaH M 
or/iMMHa rexHHsecKa noMp-bWKa, 



napTHbopn 

TenepMKe aKTki&en hash na nporpaMHTeaa 
napTHbopcTBO Ha MawKpoco^T: Microsoft 
Gold Certified Partner v\ Microsoft Visual 
Studio Partner, KaKTO tmneH Ha Component 

Vendor Consortium. 





npOflyKTH 

npoflyKToeme jihnhm eKmonsaT naKeTw 
KOMnomeHTHW 3a ASP. WET it Windows Forms, 
nnaT^opMa 3a pa3pa6oiKa na AJAX 
npnno>«eMHfl r KaKTO w yefi CMS 




www.telerik.com 



HH^OpMaLjHfl i^ CB060flHM 

pa^OTHM no3HUHH li ct^jkobc: 
www.telerik.com 



6 A mimtxr of 
Component Vendor Consortium 



Microsoft 

GOLD CERTIFIED 



Bt/irapcKa a co una una 
Ha paspaSoTMMUMTe na co<t>Tyep 



www.devbg.org 



Et/irapcKa acounaunsq Ha pa3pa6oT4MUMTe Ha coc|DTyep 
(5APC) e HecronaHCKa opraHM3aunfl, koato noflnoMara npo- 
cJDecnoHa^HOTO pa3BMTne Ha 6"b^rapcKMTe coc|DTyepHM cneun- 
a/iwcn/i npe3 o6pa30BaTe^HM v\ Apyrn MHnunaTHBn. 

5APC pa6oTM 3a HacbpnaBaHe o6MAHaTa Ha onuT Me>Kfly pa3- 
pa6oT4MUMTe m 3a ycbBtpujeHCTBaHe Ha TexHkue 3HaHmi v\ 
yMeHMfl b 06/iacTra Ha npoeKTupaHeTO v\ pa3pa6oTKaTa Ha 
coc|DTyep. 

AcounaunflTa opraHM3npa cneukia/iki3kipaHki KOHCJDepeHUMM, 
ceMMHapn m KypcoBe 3a o6yneHwe no pa3pa6oTKa Ha coc|DTy- 
ep m coc|DTyepHM TexHO/iorww. 

5APC opraHM3npa cb3flaBaHeT0 Ha Haui/iOHa/iHa aKafleMna no 
pa3pa6oTKa Ha coc|3Tyep - yne6eH ueHTbp 3a npoifceci/iOHa/i- 
Ha noAroTOBKa Ha coc|DTyepHM cneui/ia/ikicâ„¢. 



Ot3mb ot Teoflop MmieB 



CBv\p,ejenv\ CMe KaK n/iaTifcopMaTa Microsoft .NET ce Ha/iara Bee noBene b 
CBeTa Ha coc|DTyepHMTe TexHO/iorww. Ta3M TeHAeHuna ce Ha6/iK>AaBa v\ b 
5"b/irapnfl, KtfleTO nporpecuBHO HapacTBa 6po*iT Ha npoeKTkue, pea/iM3kipaHn 
Ha 6a3aTa Ha .NET. C yBe/iwuaBaHe Ha .NET pa3pa6oT4MUMTe pacTe v\ Hy>KAaTa 
ot KanecrBeHa TexHwuecKa zikiTepaTypa v\ yne6HM MaTepwa/iM, komto p,a 6"bAaT 
M3no/i3BaHM npn o6yneHkieTO Ha .NET cneuwa/ii/icâ„¢. 

'TlporpaMMpaHe 3a .NET Framework" e ntpBaTa <a\acto 6-b/irapcKa KHura 3a 
Microsoft .NET TexHO/iorwwTe. Ta npeAcraBfl Ha nMTaTe/i*i b noc/ieAOBaTe/ieH, 
CTpyKTypupaH, AOcrbneH v\ pa36npaeM bma ocHOBHMTe KOHuenunn 3a pa3pa- 
6oTKa Ha npw/io>KeHkifl c .NET Framework v\ e3MKa C#. KHuraTa o6xBaiua b 
p,ejav\nv\ BCM4KM ochobhm .NET TexHO/iorww KaTO Ha6/isira Btpxy HaM-Ba>KHMTe 
ot tax - ADO.NET, ASP.NET, Windows Forms v\ XML ye6 yc/iyrw. 

no Ka^ecTBO Ha M3/io>KeHkifl MaTepwa/i KHuraTa ce OT/iwuaBa c bmcoko npoc|De- 
cwoHa/iHO hmbo m npeB"b3xo>KAa noBeneTO npeBOAHM M3AaHna no TeMaTa. Ta e 
ot/imuho CTpyKTypupaHa, a ctm^bt Ha M3/io>KeHMeTO e zieceH 3a B"b3npneMaHe. 
MHCJDopMauMflTa e noAHeceHa c mhoto npuMepn, a TOBa e Haw-Ba>KHOTO 3a 
eAMH coc|DTyepeH pa3pa6oTHMK. 

KHuraTa e HanncaHa ot ujmpok eKnn A0Ka3aHM cneuna^ncTM, pa6oTeiun b 
napTHbopcKMTe c|dmpmm Ha Mai/iKpococ|DT - xopa c onuT b pa3pa6oTKaTa Ha 
.NET npM/io>KeHMfl. Ochobhmat aBTop v\ ptKOBOAMTe/i Ha npoeKTa, CsejiwAU 
HaKOB, e M3T"bKHaT .NET cneuwa/iMCT, zieKTop b MHO>KecTBO ceMMHapn v\ koh- 
cJDepeHunn, TbpceH KOHcy/iTaHT m npenoAaBaTe^. HeroBM ca 3ac/iyrwTe 3a 
KypcoBeTe no nporpaMnpaHe 3a n/iaTifcopMa .NET bbb OaKy/iTeTa no MaTeMa- 

TMKa M MHCJDOpMaTMKa Ha COCJDMMCKM yHMBepCMTeT. HeTOBM Ca l/l OCHOBHMTe 

3ac/iyrw 3a ue/in*i npoeicr no M3roTBAHe Ha i/i3nepnaTe/iH0 yne6H0 cwvbpwa- 
Hue m KHura no nporpaMnpaHe 3a .NET Framework. 

CBeT/iMH HaKOB e HOCMTe/i Ha Haw-ro/iflMOTO OT/iwnne b o6/iacn"a Ha MHCJDopMa- 
UMOHHMTe TexHO^ornn - HarpaAaTa "/1>koh ATaHacoB" Ha ripe3MAeHTa Teoprn 

ritpBaHOB 3a npMHOC KbM pa3BMTMeT0 Ha MHCJDOpMaUMOHHMTe TeXHO^OTHM 
MHCJDOpMaUMOHHOTO 06lUeCTB0. TOM e aBTOp Ha AeCeTKM CTaTMM M KHMTM 3a 

nporpaMnpaHe, a HacToaiuoTO v\3p,auv\e e nopeAHaTa My Ao6pa M3flBa. 

HacToaiuaTa KHura e ot/imuho yne6H0 noco6ne KaKTO 3a HankiHaemw, TaKa v\ 
3a HanpeAHa^n nkiTaTe/iw, komto MMaT we/iaHwe v\ aM6nunn p,a CTaHaT npoc|De- 
cuoHa^HM .NET pa3pa6oT4Mun. 

TeoAop Mw/ieB, 
ynpaB^ABaiu AnpeKTop Ha "MawKpococ|DT F/b/irapkifl" 



Ot3mb ot EoKMflap CeHflOB 



KHuraTa e opwrkma/iHO 6"b/irapcK0 TBopeHne, c hmluo HeoTCTbnBamo no Kane- 
ctbo m o6eM Ha CBeTOBHMTe 6ecrce/i"bpn c KOMmorbpHa TeMaTMKa. MaTepwa/itT 
e noAHeceH AOCTbnHO v\ e 6oraTO M/uocTpwpaH c npuMepn, KoeTO a npaBM He 
caMO ot/imuho BtBeAeHwe b n^aTCJDopMaTa .NET 3a Ha^MHaeiunfl, ho m OT/iwueH 
cnpaBO^HMK 3a npocJDeci/iOHa/ikicra-nporpaMMCT Ha C#. HMTaTe/isiT MO>xe p,a ce 
3ano3Hae b p,ejav\nv\ He caMO c o6iunTe npuHunnn, ho m c peAHua tbhkoctm Ha 
nporpaMnpaHeTO 3a .NET. LLInpoKO 3acrbneHM ca peAnua "yHMBepca/iHki" TeMM 
KaTO o6eKTHO-opneHTnpaHO nporpaMnpaHe, pery^apHM M3pa3M, XML, pe/iauw- 
ohhm 6a3M ashhh, nporpaMwpaHe b MHTepHeT, MHoro3aAanHOCT, curypHOCT v\ 
AP- 

KHuraTa ce OT/ii/maBa etc CTerHaT v\ aceH ctm/i Ha M3/io>KeHMeTO, KaTO e 
nocTurHaTO 3asv\p,uo neAarori/mecKO MawcTopcTBO. ToBa He 6nBa p,a hm M3He- 
HaABa - aBTopnTe ca BOAeiun cneuwa/ikicrki c 6oraT onuT He caMO ioto npoc|De- 
cuoHa^HM coc|DTyepHM pa3pa6oT4Mun, ho m KaTO npenoAaBaTe^n bbb OaKy/i- 
TeTa no MaTeMaTMKa v\ MHCJDopMaTMKa (OMM) Ha CY "Cb. K/iMMeHT Oxpmackm". 
CaMaTa KHura b 3HanwTe/iHa CTeneH ce ocHOBaBa Ha pa6oTHM neK\\v\v\, v\3uon- 
3BaHM m npoBepeHM b nopeAnua ot KypcoBe no nporpaMnpaHe 3a .NET 
Framework bbb OMM. Cai/iTbT Ha KHuraTa CbAtpwa HaA 2000 6e3n/iaTHM 
c/iawAa, c/ieABamw ctpmktho cbAtpwaHMeTO v\, a KHuraTa e Hant/iHO 6e3n/iaT- 
Ha b e/ieicrpoHHHfl cm BapnaHT, KoeTO MaKCkiMa/iHO ynecHABa M3no/i3BaHeTO v\ 
b cbOTBeTeH Kypc no nporpaMnpaHe. 

He Ha nocneAHO macto, 3ac/iy>KaBa p,a ce OT6e/ie>KM ckicreMaTMUHMflT onuT 3a 
npeBOA Ha bcmukm TepMMHM Ha 6"b/irapcKM e3MK, cbo6pa3eH c Bene Ha/io>KM- 
ziaTa ce 6"b/irapci<a TepMMHO/iorkifl, ho m c opwrkiHa/iHM v\p,ev\ npn HOBMTe 

nOHflTMfl. 

Pa6oTaTa, koato aBTopnTe ca CBtpuju^n, e HancTMHa nyaecHa, a KHuraTa e 
3aA"b^>KMTe^Ha nacr ot 6n6/inoTeKaTa Ha BceKM c MHTepec kbm e3MKa C# v\ 
M3o6iuo KtM BOAeiuaTa n/iaTifcopMa Ha MawKpocoifcT .NET. 



A014. A-p 5o>KMAap CeHAOB 
OaKy/iTeT no MaTeMaTMKa v\ MHCJDopMaTMKa, 

COCJDMMCKM YHMBepCMTeT "Cb. K/lMMeHT OxpMACKM" 



Ot3mb ot Ctoah MopflaHOB 



"nporpaMnpaHe 3a .NET Framework" e yHmo/iHO p-bKOBOACTBO 3a n/iaTfJiopMa- 
Ta .NET. BtnpeKM, ne He e yne6HkiK no nporpaMnpaHe, KHuraTa e m3k/iiohm- 
Te/mo noAxoA^ma KaKTO 3a Hankmaemkifl nporpaMMCT, c6/i"bCKBau4 ce 3a nptB 
nvr c .NET, TaKa v\ 3a onuTHna pa3pa6oTHkiK Ha .NET npn^OKeHMfl, ue/iyim fla 
cncTeMaTM3npa m non"b/iHM 3HaHMATa cm. BcaKa TeMa b "nporpaMnpaHe 3a 
.NET Framework" 3anonBa c ocHOBMTe Ha pa3r/ie>KAaHMTe b Hea TexHO/iorww, 
ho KtM Kpaa Ha TeMaTa nwTaTe/iflT e Bene 3ano3HaT c AeTaw/ikiTe v\ TbHKOC- 
TMTe, Heo6xoAMMM 3a ycneujHOTO mm npw/iaraHe b npaicrmoTa. 

06xBaiuaMKM Haw-Ba>KHMTe acneicrw Ha .NET Framework, KHuraTa 3anonBa ot 
ocHOBMTe Ha e3MKa C# v\ .NET n/iaTfJiopMaTa v\ nocTeneHHO AOCTura p,o 
c/iokhm KOHuenunn KaTO ye6 ycnyrw, curypHOCT, cepwa/iM3aui/ifl, pa6oTa c 
OTAa/ieneHM o6eKTi/i, MaHwny/iwpaHe Ha 6a3M ashhm npe3 ADO.NET, noTpe6n- 
Te/iCKki MHTepc|DeMC c Windows Forms, ASP.NET ye6 npn^OKeHna v\ t.h. 
MHCJDopMauMflTa e noAHeceHa M3K/iK)nkiTe/iH0 AOcrbnHO v\ noAKpeneHa c mhoto- 
6pomhm npuMepn v\ eiJuocTpaueiii. Bc*iKa TeMa BK/iiouBa v\ ynpa>KHeHna 3a 
caMOcroflTe/iHa pa6oTa - HeoTMeHMM e/ieMeHT 3a 3aTB"bpA^BaHe Ha npnAo6n- 

TMTe OT Hefl 3HaHMfl. 

ABTopcKMAT KO/ieKTkiB BK/iiouBa yTBtpAeHM cneuna/iwcâ„¢ OT coc|DTyepHMTe 
cpeAM. B-bnpeKM, <Ae aBTopnTe ca HaA 30, 'TlporpaMnpaHe 3a .NET Framework" 
He e npocTO c6ophmk ot CTaTnn; HanpoTMB - BceKM ot tax e AonpwHecb/i c 
onuTa m TpyAa cm, 3a p,a MO>xe KHuraTa p,a 6"bAe TOBa, KoeTO e - Ao6pe 
CTpyKTypupaHO v\ ki3nepnaTe/iHO pbkoboactbo. 

yne6HMK 3a CTyAeHTa v\s\v\ cnpaBOUHMK 3a cneuwa/iwcTa - 'TlporpaMMpaHe 3a 
.NET Framework" e 3aA"b/i>Ki/iTe/iHa 3a 6ki6/ikiOTei<aTa Ha BceKM komto MMa 
Aocer c .NET. 



Ctoah MopAaHOB, 

Software Design Engineer, 

Microsoft Corpartion (Redmond) 



* Minem/ieTO e /imhho Ha aBTopa My m He oeBtpsBa Microsoft Corporation no HMKaKbB HaMHH 



UdC^HRI 



PC 

% % ^ no PR3PRBQ TKH HR CO Q TMEP 



^ 



HAMMOHA/1HA AKAflEMIIfl flO PA3PAEOTKA HA COOTYEP 



/leKTopiiTe 

» CBernnH HanoB e 

aBTop Ha fleceTKM TexHMMecKM 
ny6^MKauMM m hako/iko khmtm, 
CBtp3aHM c pa3pa6oTKaTa Ha 
cocfrryep, 3apaflM KoeTO e Tbp- 

CeH ZieKTOp M KOHCy/lTaHT. 

Tom e pa3pa60TMMK c flt/iroro- 
fluiueH onuT, pa6oTM/i no pa3- 
HOo6pa3HM npoeKTM, pea/11/131/1- 
paHM c pa3/l|/|MHI/l TexHO/iornn 
(.NET, Java, Oracle, PKI m ap.) 
m npenoflaBaTe^ no cbBpeMeH- 
hm cocfuyepHM TexHO^oruM b CY 

"CB. K/lMMeHT OxpMflCKM". 

npe3 2004 r. e HOCMTe/i Ha 
HarpaflaTa "fliKOH ATaHacoB 
Ha npe3kifleHTa Ha Bt/irapua 
Teopru ritpBaHOB. 

CBeT/iMH HaKOB ptKOBOflu o6y- 
MeHneTO no Java TexHO/iornn b 
AKaaeMMflTa. 

» MapTMH KynoB e 

cocfrryepeH MHweHep m KOHcy/i- 
TaHT c flt/iroroflniueH onuT b 
M3rpa>KflaHeT0 Ha peiueHnsi c 
n/iaT(t>opMi/iTe Ha Microsoft. 

MapTMH e onuTeH kiHCTpyicrop m 
cepTMCpMunpaH ot MaMKpoco0T 
pa3pa6oTMMK no nporpaMi/ue 
MCSD, MCSD.NET, MCPD m 
MVP m MexflyHapofleH /leicrop b 
CBeTOBHaTa opraHki3aui/isi Ha 
.NET noTpe6nTe^CKMTe rpynn 
INETA. 

MapTMH KynoB ptKOBOflu o6y- 
HeHkieTO no .NET TexHO/iorm/i b 
AKafleMkisua. 



AKafleMMma 

» HauMOHa/iHa aKafleMnn no pa3pa- 
6oTKa Ha cocpTyep (HAPC) e ueHTbp 
3a npo0ecnoHa/iHO o6yMeHne Ha co0- 
TyepHM cneuna/iMCTM. 

» HAPC npoBe>Kfla BE3n/lATHO Kyp- 
coBe no pa3pa6oTKa Ha co0Tyep 1/1 CbB- 
peMeHHM co0TyepHM TexHO/iori/ii/i b Co- 
0i/m m flpyrn rpaflOBe. 

» npefl/iaraHM cneuna/iHOCTn: 

â–  B-bBeflemie b nporpaMMpaHeTO 
(c e3Mi4MTe C# m Java) 

â–  Core .NET Developer 

â–  Core Java Developer 

» KanecTBeHO o6yneHMe c mhoto 
npaKTMnecKM npoeKTM v\ MHflMBMfly- 
a/iHO BHMMaHne 3a BceKi/i. 

» l~a pa htm pa Ha pa6oTa! TpyaoB ao- 
roBop npi/i nocTtnBaHe b AKafleMi/iflTa. 

» EE3n/1ATHO! 

YMMTe 6e3njiaTHO b^b BtBefli/iTe/iHi/iTe 
KypcoBe m no CTi/meHfli/ii/i ot pa6oTOfla- 
Te/iMTe b c/ieflBam,MTe Hi/ma. 



http://academy.devbg.org 



Cbfl-bp>t<aHMe 



Tom 2 

KpaTKO cbfltpwaHMe 2 

C"bfl-bp>KaHMe 13 

ripeflroBop kt»m BTopmi TOM 33 

3a koto e npeAHa3HaneHa Ta3M KHura? 33 

Heo6xoflMMM Hana/iHH no3HaHkm 33 

KaKBO o6xBaiua btopmat tom Ha Ta3M KHura? 34 

(DoKycvr e Btpxy .NET Framework 1.1 34 

KaK e npeAcraBeHa MHCpopMauwflTa? 34 

rior/ieA KtM ctAtpxaHMeTO Ha BTopua tom 35 

T/iaBa 15. rpacJDMHeH noTpe6nTe/iCKM MHTepdpefic c Windows Forms 35 

T/iaBa 16. M3rpa>KflaHe Ha ye6 npmio>i<eHmi c ASP.NET 35 

T/iaBa 17. MHoroHMiuKOBO nporpaMnpaHe v\ CMHxpoHM3aumi 36 

T/iaBa 18. MpewoBO v\ HHTepHeT nporpaMnpaHe 36 

T/iaBa 19. OTpaweHwe Ha TunoBeTe (Reflection) 37 

T/iaBa 20. Cepna/iM3aumi Ha flaHHM 37 

T/iaBa 21. Ye6 yc/iyrn cASP.NET 37 

T/iaBa 22. OTfla/ieneHO M3BMKBaHe Ha MeTOflM (Remoting) 38 

Vnasa 23. B3anMOfleMCTBne c HeynpaB/iflBaH koa 38 

T/iaBa 24. YnpaB/ieHne Ha naMeTTa v\ pecypciue 38 

T/iaBa 25. AceM6/iMTa v\ pa3npocTpaHeHne (deployment) 39 

T/iaBa 26. CurypHOCT b .NET Framework 39 

T/iaBa 27. Mono - CBo6oflHa MMrmeMeHTaumi Ha .NET 39 

T/iaBa 28. noMOiuHM MHcrpyMeHTM 3a .NET pa3pa6oTHMUM 39 

T/iaBa 29. npaKTunecKM npoeKT 40 

ABTOpCKMflT KO/ieKTM B 40 

A/ieKcaHfl-bp PyceB 40 

A/ieKcaHfltp Xafl>KMKp"bCTeB 41 

Ahtoh AHflpeeB 41 

EpaHMMnp AHre/iOB 41 

Bacn/i EaKa/iOB 41 

Bmktop Xmbkob 42 

flejiH BapneB 42 

flMMMTbp BoHeB 42 

flMMMTbp KaHeB 42 

Ta/iMH M/ineB 43 

Teoprn rieHneB 43 

MBaH MuTeB 43 

MBaM/lO flMMOB 44 

MBaki/io XpMCTOB 44 

/la3ap KnpneB 44 

MaHO/i flOHeB 44 

MapTMH Ky/iOB 45 



14 nporpaMnpaHe 3a .NET Framework (tom 2) 

Mkixami Ctomhob 45 

MoHMKa A/ieKCueBa 45 

HnKO/iaki HeflJuiKOB 45 

naHaMOT flo6pnKOB 46 

npec/iaB HaKOB 46 

Pafloc/iaB MBaHOB 47 

Poc/iaH BopucoB 47 

CBeT/iMH HaKOB 47 

Cred)aH flo6peB 48 

Cred)aH Knpn30B 48 

CrecJDaH 3axapneB 48 

Ctohh flaMOB 49 

Toflop Ko/ieB 49 

XpucTO fleiueB 49 

XpucTO Pa/iKOB 49 

UBeTe/iMH AHflpeeB 50 

flBop TaiueB 50 

5/ia rofla phoctm 50 

CBeT/iMH HaKOB 50 

ABTOpCKMJlT KO/ieKTMB 51 

B"b/irapcKa acounaunn Ha pa3pa6oTHMUMTe Ha cocjrryep 51 

Microsoft Research 51 

SciForge.org 51 

Cocjdmmckm yHMBepcuTeT "Cb. K/lMMeHT OxpMflCKkl" 52 

telerik 52 

Ca MTbT Ha kh m raTa 52 

/lnu,eH3 52 

06lMM flec|DMHMUMM 52 

npaBa m orpaHMHeHMJi Ha noTpe6nTe/iMTe 53 

npaBa m orpaHMHeHun Ha aBTopiue 53 

npaBa m orpaHMHeHun Ha BAPC 54 

npaBa m orpaHMHeHna Ha Microsoft Research 54 

T/iaBa 15. M3rpa>KflaHe Ha rpacpuneH noTpe6nTe/iCKM MHTepdpeftc c 
Windows Forms 55 

Abtopm 55 

Heo6xoflMMM 3HaHMfl 55 

C"b Kb p>Ka Hue 55 

B Ta3M TeMa 56 

KaKBO e Windows Forms? 57 

Windows Forms e 6a3i/ipaHa Ha RAD KOHuenumrra 57 

Windows Forms v\ flpyrnTe 6n6/inoTeKM 3a M3rpa>KflaHe Ha GUI 58 

KoHTpo/iMTe b Windows Forms 58 

Windows Forms v\ pa6oTa c flaHHM 59 

Brpa^eHa noflflp"b>KKa Ha Unicode 59 

HacnefljiBaHe Ha cJjopmm v\ kohtpojim 59 

ActiveX KOHTpo/in 59 

nenaTaHe Ha npuHTep 60 

Windows Forms kohtpo/im b Internet Explorer 60 

CmiHa noflflp"b>KKa Ha rpacfiMKa (GDI+) 60 

HaiueTO ntpBO Windows Forms npmioxeHkie 60 

5n6^MOTeKMTe Ha .NET3a M3rpa>KflaHe Ha GUI 62 

npocrpaHCTBOTO System .Windows. Forms 62 



nporpaMnpaHe 3a .NET Framework (tom 2) 15 

npocrpaHCTBOTO System . Drawing 63 

riporpaMHM KOMnoHeHTM 63 

KoMnoHeHTeH MOAe/i 63 

KoMnoHeHTHkiflT MOfle/i Ha .NET Framework 63 

KOMnOHeHTM M KOHTeMHepM 63 

npen3no/i3BaeMOCT Ha KOMnoHeHTMTe 63 

ripocTpaHCTBOTO System. ComponentModel 64 

Windows Forms v\ KOMnoHeHTHMflT MOfle/i Ha .NET 64 

KOHTpO/lM M KOHTeMHep-KOHTpOJIM 64 

riporpaMeH Moae/i Ha Windows Forms 64 

QopMki 64 

KoHTpo/in 65 

C"b6nTnn 65 

Xn3HeH unKbJi Ha Windows Forms npmioxeHmua 65 

Mofle/i Ha npenepTaBaHe Ha KOHTpo/iMTe 67 

YnpaB/ieHne Ha 4>OKyca v\ HaBuraunn 69 

Ochobhm K/iacoBe b Windows Forms 69 

l/lepapxkifl Ha K/iacoBeTe 70 

K/iacbT Control 71 

CBOMCTBa Ha K/iaca Control 71 

MeTOflu Ha K/iaca Control 73 

C"b6nTnn Ha K/iaca Control 73 

K/iacbT ScrollableControl 74 

K/iacbT ContainerControl 75 

OopMM, npo3opu,n m Ana/i03M 75 

K/iacbT System. Windows. Forms. Form 75 

no-Ba>KHM CBOMCTBa Ha K/iaca Form 75 

no-Ba>KHM MeTOflu Ha K/iaca Form 77 

no-Ba>KHM c"b6nTmi Ha K/iaca Form 78 

Ochobhm kohtpo/im b Windows Forms 78 

TextBox 78 

Label 79 

Button 79 

nocraBflHe Ha kohtpo/im bbb cpopMaTa 79 

YnpaB/ieHMe Ha Cb6MTM*iTa 79 

npocT Ka/iKy/iaTop - npMMep 80 

Windows Forms peAaKToptT Ha VS.NET 83 

Cb3flaBaHe Ha cpopMa 83 

flo6aBAHe Ha Kompojia 84 

flo6aBAHe Ha HerpacJDMHHM KOMnoHeHTM 84 

HacrpoMKa Ha CBOMCTBa 84 

flo6aBAHe Ha o6pa6oTHMU,M Ha Cb6MTMfl 85 

Cb3flaBaHe Ha Ka/iKy/iaTop c Windows Forms peaaicropa Ha VS.NET - npMMep ...86 

flMa^oroBM KyTMM 88 

CTaHflapTHM flMa/ioroBM KyTMM 88 

M3BMKBaHe Ha flMa/lOTOBM KyTMM 89 

Dialog Result m npeflaBaHe Ha flaHHM Meway p,v\ai\03v\ - npMMep 89 

flpyrM Windows Forms kohtpo/im 92 

CheckBox 92 

RadioButton 92 

Panel 92 



16 nporpaMnpaHe 3a .NET Framework (tom 2) 

TabControl v\ TabPage 93 

ListBox 93 

CheckedListBox 93 

ComboBox 94 

TreeView 94 

RichTextBox 94 

LinkLabel 95 

PictureBox 95 

Pa6oTa c hjikom Windows Forms kohtpo/im - npuMep 95 

MeHiOTa 99 

Main Menu 99 

ContextMenu 99 

Menultem 99 

/leHTM C MHCTpyMeHTM 100 

ToolBar 100 

ToolBarButton 100 

ImageList 100 

CTaTyc zieHTM 101 

StatusBar 101 

StatusBarPanel 101 

flwa/ior 3a M36op Ha cpai/i/i 101 

OpenFileDialog 101 

SaveFileDialog 102 

Pa6oTa c (Jjaw/iOB flua/ior - npuMep 102 

MDI npki/io>KeHki5q 103 

MDI KOHTeMHepn (MDI parents) 104 

MDI c|jopMM (MDI children) 104 

Cb3AaBaHe Ha MHoroAOKyMeHTOB TeKCTOB peAaKTop - npuMep 104 

Ba^MAaunfl HaflaHHM 115 

Ba/iMflaumi Ha flaHHM - npuMep 116 

CB"bp3BaHe Ha ashhm 121 

M3TOHHMUM Ha flaHHM 122 

Kohtpo/im, noflfl'bp>KamM CB"bp3BaHe Ha aaHHi/i 122 

BuflOBe CB"bp3BaHe 122 

ripocTO CB-bp3BaHe 123 

C/105KHO CB"bp3BaHe 131 

KoHTpo/iaTa DataGrid 133 

Pa6oTa c DataGrid KompojiaTa - npuMep 133 

TableStyles v\ flecpuHkipaHe Ha CTmiOBe - npuMep 135 

Master-Details HaBkirau,i/m 137 

Master-Details HaBuraumi - npuMep 138 

npo6/ieMM npn Master-Details HaBuraumiTa 141 

Pe/iau,MM "mhoto K"bM mhoto" 141 

HacneAflBaHe Ha cdopmm 142 

HacneflHBaHe Ha cJjopmm - npuMep 142 

riaKerbT System. Drawing v\ GDI+ 146 

K/iacbT Graphics 147 

Pa6oTa etc System. Drawing - npuMep 147 

AHMMauna etc System. Drawing - npuMep 148 

rie^aTaHe Ha npuHTep 150 

noTpe6nTe^CKM kohtpo/i m 151 

C"b3flaBaHe Ha HOBa KOHTpo/ia, kohto He Hac/ieAJiBa cbmecTByBama 151 



nporpaMnpaHe 3a .NET Framework (tom 2) 17 

Cb3flaBaHe Ha HOBa KOHTpo/ia KaTO KOM6nHauna ot flpyrn kohtpo/im 151 

C"b3flaBaHe Ha HOBa KOHTpo/ia, kohto HacneflHBa cbmecrByBama KOHTpo/ia 152 

C"b3flaBaHe Ha KOHTpo/ia - npMMep 152 

Xoctmht Ha kohtpo^m b Internet Explorer 157 

Xoctmht Ha KOHTpo/in b Internet Explorer - npMMep 157 

Hmujkm m Windows Forms 160 

M3no/i3BaHe Ha hmujkm b Windows Forms npM/io>KeHMfl - npuMep 161 

B/ia^eHe (Drag and Drop) 165 

B/ianeHe m nycKaHe b Windows Forms - npMMep 165 

KoHCpMrypau,MOHeH cpai/M Ha npM/io>KeHMeTO 167 

M3B/iMHaHe Ha HacTpoMKM ot KOHOJMrypauMOHeH cpafi/i - npMMep 167 

Ynpa>KHeHMfl 169 

M3no/i3BaHa ziMTepaTypa 172 

T/iaBa 16. ll3rpa>Kflai-ie Ha ye6 npmiOKeHMfl c ASP.NET 173 

Abtopm 173 

Heo6xoflMMM 3HaHMfl 173 

CbAtpwaHMe 173 

B Ta3M TeMa 174 

BtBeAeHMe 175 

M3n-b/iHeHMe Ha ASP.NETye6 npM/ioweHMe 175 

riper/iefl Ha TexHOJiomjrra ASP.NET 175 

Pa3/iMKM Me>Kfly ASP m ASP.NET 176 

OyH/iaMeHTM Ha ASP. N ET 176 

KaK pa60TMASP.NET? 177 

Pa3fle/i5iHe Ha BM3ya/iM3auMJi ot 6M3Hec ziorMKa 178 

KoMnoHeHTM Ha ASP.NET 179 

npMMep 3a ye6 npmioxeHMe 180 

ASP.NET Web Application npoeKTM bib VS.NET 181 

Mo/ieji Ha M3n-b/iHeHMe Ha ASP.NET 182 

Ye6 cpopMM 183 

KaKBO e ye6 0>opMa (Web Form)? 183 

Cb3AaBaHe Ha ye6 a>opMa 183 

flMpeKTMBM 184 

flMpeKTMBaTa <@Page ...> 185 

ATpM6yTM Ha flMpeKTMBaTa <@Page ...> 185 

TarbT <form> 186 

BrpafleHM o6eicm b ASP.NET 186 

Ye6 KOHTpo/i m 186 

ASP. N ET CbpB-bpHM KOHTpO/lM 187 

HTML CbpB-bpHM KOHTpo/iM (HTML server controls) 188 

Ye6 CbpB-bpHM KOHTpo/iM (Web server controls) 190 

Kon KOHTpo/iM fla no/i3BaMe? 191 

KaTeropMM ye6 CbpBtpHM kohtpojim 192 

Code-behind 195 

flo6aBAHe Ha koa b ye6 cfopMa 195 

Inline code 195 

Code-behind K/iacoBe 196 

KaK pa6oTM code-behind? 196 

JIT KOMnM/iau,MJi 196 

C"b6MTMfl 197 

flpHXBamaHe Ha c"b6MTMn 197 



18 nporpaMnpaHe 3a .NET Framework (tom 2) 

Cbomctboto AutoEventWireup 197 

Xn3HeH umkb^ Ha ASP.NET CTpaHkiunTe 198 

Cbomctboto IsPostBack 198 

Cbomctboto AutoPostBack 199 

HTML escaping npo6/ieMM 200 

HTML escaping npo6/ieMM - npMMep 200 

CB-bp3BaHe c/iaHHM (Data binding) 202 

KaK pa6oTM MeTOAvr DataBind(...)? 202 

CB"bp3BaHe Ha kohtpo/im c aaHHM - npMMep 203 

Pa6oTa c 6a3M ot ashhm ot ASP.NET 209 

063op Ha ADO.NET 209 

Bn3ya/iM3MpaHe Ha flaHHM 210 

CB-bp3BaHe Ha aaHHM (data binding) 210 

Kohtpo/im 3a noKa3BaHe Ha flaHHM 212 

CnMCbHHM KOHTpO/lM 213 

MTepMpa IMM KOHTpO/lM 219 

YnpaB/ieHMe Ha cbCTOHHMeTO 228 

Bmckbmtkm (Cookies) 228 

Ckpmtm no/ieTa 230 

napaMeTpM3MpaHM a^pecM (Query Strings) 231 

TexHO/iornflTa ViewState 232 

CtCTOflHMe Ha npM/io>KeHMeTO 234 

CtCTOflHMe Ha cecMMTe 237 

Ba^MAau,Mfl Ha ashhm 239 

RequiredFieldValidator - npoBepKa 3a Ha/iMHMe Ha aaHHM 240 

CompareValidator - npoBepKa Ha bxoahmtc flaHHM 241 

RangeValidator - npoBepKa nonaaaHe b MHTepBa/i 242 

RegularExpressionValidator - cpaBHHBaHe c pery/iapeH M3pa3 243 

CustomValidator - npoM3BO/iHa npoBepKa 243 

ValidationSummary - cnMCbK Ha rpeujKMTe 246 

MepapxMJi Ha K/iacoBeTe Ba/iMflaTopM 247 

06mn CBOMCTBa 3a Ba/iMflaTopnTe 247 

Kora m Ktfle ce M3B"bpiuBa Ba/iMflau,MJiTa? 248 

3amo BMHarM Ha CbpBipa? 248 

Oco6eHOCTM npM Ba/iMflaunflTa npn K/iMeHTa 249 

noTpe6MTe/iCKM KOHTpO/l M 250 

riOTpe6MTe/iCKM kohtpo/im m ye6 4>opMM 250 

npeflMMCTBa npM M3no/i3BaHeTO Ha noTpe6MTe/iCKM kohtpo/im 250 

Cnofle/iflHe Ha noTpe6MTe/iCKM kohtpo/im 250 

M3no/i3BaHe Ha noTpe6MTe/iCKM kohtpo/im 251 

C"b3flaBaHe Ha noTpe6MTe/iCKa KOHTpo/ia - npMMep 251 

ripoc/ieflflBaHe m Ae6"brBaHe Ha ye6 npM/ic»KHMfl 254 

MHdJopMauMn no BpeMe Ha M3n"b/iHeHMe 254 

npocjieflJiBaHe 254 

OTfla/ieneHO Ae6"brBaHe 257 

0nTMMM3au,Mfl, KOHCpMrypau,Mfl m pa3rp"biuaHe Ha ASP.NET npM/ic»KeHMfl.. 258 

OnTMMM3MpaHe npe3 KeiuMpaHe 258 

KoHC|3MrypMpaHe Ha ASP.NET npM/io>KeHMe 262 

Pa3rp"bmaHe Ha npM/ioweHMeTO 266 

CMrypHOCT b ASP.NET 268 

ABTeHTMKaUMJl M 0T0pM3aU,MJl 268 

BMflOBe a BTeHTMKauMfl b AS P. N ET 269 



nporpaMnpaHe 3a .NET Framework (tom 2) 19 

CurypHOCT Ha hmbo CbpBtp (IIS Security) 276 

Ynpa>KHei-ii/m 279 

M3no^3BaHa ziMTepaTypa 281 

T/iaBa 17. Mhotohmlukobo nporpaMMpaHe m CMHxpoHM3ai4Ma 283 

Abtopm 283 

Heo6xoflMMM 3HaHMfl 283 

Cb Atpxa Hue 283 

B Ta3M TeMa 284 

MHoro3aAa4 hoct 285 

npo6/ieM-bT 285 

no/i3MTe ot MHoro3aflaHHOCTra 285 

3amo e Hy>KHa MHoro3a,a.aHHOCT - npuMep 285 

PeiueHneTO - npou,ecM v\ hmujkm 287 

ripouecu m hmujkm 287 

KaKBO npefl/iaraT HMUJKMTe? 288 

Kora ca yflo6HM HMUJKMTe? 288 

MHoro3a/iaHHOCT - BMflOBe 288 

MMn/ieMeHTauMM Ha MHoro3aflaHHOcr 289 

flOMeMHM Ha npM/io>KeHMeTO (Application Domains) 290 

Hmujkm 291 

KaK pa6oT5iT HMUJKMTe? 291 

K/iacbT Thread 293 

ripMopnTeT 298 

CbCTOflHMJl 299 

XMBOT Ha HMUJKMTe 300 

npeKpaTJiBaHe Ha HMUJKa 300 

Thread Local Storage (/lOKa/iHM 3a HMUJKaTa flaHHM) 305 

Thread-Relative Static Fields (ct3tmhhm no/ieTa, CBtpsaHM c HMUJKaTa) 306 

Hey/io6cTBa npM pa6oTaTa c hmujkm 308 

npo6/ieMM npM pa6oTa c o6uj,m flaHHM 308 

CMHXpOHM3aU,Mfl 310 

HaM-flo6poTO peiueHMe 3a o6m,MTe flaHHM 310 

CMHxpoHM3MpaHM "nacaxM" KOfl (synchronized code regions) 311 

CMHxpoHM3MpaHM KOHTeKCTM (Synchronized Contexts) 315 

MethodlmplAttribute 317 

HeynpaB/iJiBaHa CMHxpoHM3au,MJi - K/iacvr WaitHandle 317 

K/iacbT M utex 318 

K/iacoBeTe AutoResetEvent m ManualResetEvent 320 

K/iacbT Interlocked 323 

K/iaCMHeCKM CMHXpOHM3aU,MOHHM 3aflaHM 325 

riy/i ot hmujkm (ThreadPool) 329 

n peflMMCTBa 330 

HeflOCTaT"bu,M 330 

K/iacbT ThreadPool 330 

MeTOflvr ThreadPool. RegisterWaitForSingleObject() 331 

MHTepcbeMCbT ISynchronizelnvoke 333 

l/l3no/i3BaHe Ha ISynchronizelnvoke 333 

Windows Forms m ISynchronizelnvoke 335 

TaMMepM 335 

System .Timers.Timer 336 

System. Threading. Timer 338 



20 nporpaMnpaHe 3a .NET Framework (tom 2) 

System. Windows. Forms.Timer 340 

KaK fla M36epeM TafiMep? 341 

Volatile no/ieTa 34 1 

ACMHXpOHHM M3BMKBaHMfl 342 

KaKBO e acuHxpoHHO M3BMKBaHe? 342 

Ktfle ce no/i3Ba acuHxpoHHO M3BMKBaHe? 342 

Acmhxpohho M3BMKBaHe npe3 ae/ieraT 342 

Mofle/i 3a acuHxpoHHO nporpaMMpaHe 343 

CwmaTypa Ha MeTOflMTe 3a acuHxpoHHM M3BHKBaHMn 343 

MHTepcJjekic-bT IAsyncResult 344 

npoBepKa 3a npuK/iiOHBaHe Ha acuHxpoHHOTO M3BMKBaHe 344 

y n pa>KHeH ma 348 

M3no/i3BaHa ziMTepaTypa 348 

T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMfipaHe 349 

Abtopm 349 

Heo6xoAMMM 3HaHMfl 349 

Cb Atp>Ka Hue 349 

B Ta3M TeMa 349 

OSI MOfle/i 350 

Okl3MHeCKO HMBO 351 

CB"bp3BaiM0 HMBO (KaHa/lHO HMBO) 351 

MpexoBO hmbo 351 

TpaHcnopTHO hmbo 351 

CeCMMHO HMBO 351 

npeflCTaBMTe/iHO hmbo 351 

npM/10>KHO HMBO 351 

Ochobm Ha Mpe>KOBOTO nporpaMMpaHe 352 

IP aflpec 352 

Domain Name Service (DNS) 352 

nopT 352 

Ochobhm Mpe>KOBM yc/iyrM 353 

Mpe>KOB MHTepcpekic 353 

Loopback MHTepcpeMC 353 

npoTOKO/rbT TCP 354 

n poTOKO/rbT U DP 354 

KaK flBe OTfla/ieneHM MaiuMHM cm "roBopaT"? 354 

K/iacoBe 3a MpewoBO nporpaMMpaHe b .NET 355 

npocrpaHCTBOTO System . Net. Sockets 355 

npocrpaHCTBOTO System .Net 356 

npeAcraBHHe Ha IP aApecM b .NET Framework 357 

K/iacbT IPAddress 357 

K/iacbT IPEndPoint 359 

KoMyHMKau,M5q no TCP coKeT c TcpClient 359 

Cb3flaBaHe m CB"bp3BaHe Ha TcpClient 360 

Cb3flaBaHe Ha npocT TCP nopT CKeHep - npMMep 362 

npeflaBaHe Ha flaHHM no TCP coKeT npe3 TcpClient m NetworkStream 363 

KoMyHMKauMfl c TcpClient - npMMep 366 

HacrpoMKM Ha TCP Bp-b3KaTa npe3 CBOMCTBaTa Ha TcpClient 370 

M3rpa>KAaHe Ha TCP ctpBtp c TcpListener 371 

Cb3flaBaHe Ha TcpListener 371 

flpMeMaHe Ha TCP Bp"b3KM 371 



nporpaMnpaHe 3a .NET Framework (tom 2) 21 

npocr TCP ctpB-bp - npuMep 373 

06c/iy>KBaHe Ha mhoto K/iweHTM eAHOBpeMeHHO 375 

EflHOBpeMem-io o6c/iy>KBaHe Ha K/ineHTM c TcpListener - npuMep 376 

KoMyHMKaunfl no UDP c UdpClient 382 

KoHcrpyKTopn Ha UdpClient 383 

3aflaBaHe Ha OTfla/ieneH cbpBip no noflpa36npaHe 383 

M3npamaHe Ha UDP naKeâ„¢ - MeTOfl Send(...) 384 

no/iynaBaHe Ha UDP naKeâ„¢ - MeTOfl Receive(...) 385 

KoMyHMKaunn c UdpClient - npuMep 385 

CoKeTM Ha no-HMCKO hmbo - K/iacvr Socket 387 

Cb3flaBaHe Ha Socket o6eKTM v\ Tun Ha coKeTa 387 

Ochobhm onepau.nn c K/iaca Socket 388 

CoKeTM c Bp-b3Ka no TCP 389 

CBOMCTBa Ha coKeTMTe m 3aflaBaHe Ha onunn 396 

CoKeT no npoTOKO/i UDP 397 

HflKO/IKO flyMM 3a aCMHXpOHHMTe COKeTM 403 

Cbomctboto Blocking 403 

ACMHXpOHHM MeTOflM 403 

MeTOflMTe Poll(...) v\ Select(...) 404 

Multicasting b .NET Framework 406 

Broadcasting coKeâ„¢ 406 

Multicasting coKeâ„¢ 406 

M3no^3BaHe Ha DNS ycnyrw 4pe3 K/iaca Dns 408 

ACMHXpOHHM DNS 3a51BKM 409 

Pa6oTa c ye6 pecypcn - K/iacbT WebClient 409 

M3B/iMHaHe Ha flaHHM no HTTP 410 

M3npamaHe Ha flaHHM no HTTP 413 

ABTeHTMKaumi c Credentials 414 

flpyrn no/ie3HM CBOMCTBa Ha WebClient 415 

HTTP 3aflBKki c K/iacoBeTe HttpWebRequest v\ HttpWebResponse 416 

Cb3flaBaHe Ha HHTP 3a$iBKa 416 

M3npamaHe Ha flaHHM K"bM HTTP CbpBtp 416 

no/iynaBaHe Ha HTTP OTroBop 417 

M3B/iMHaHe Ha Cookies 418 

flpyrn BMflOBe WebRequest v\ WebResponse 419 

Pa6oTa c HTTP 3anBKM - npuMep 419 

Pa6oTa c e/ieicrpoHHa noma 420 

npoTOKO/iM 3a M3Ter/i5iHe Ha e/ieicrpoHHaTa noma 421 

M3Ter/iflHe Ha e/ieicrpoHHaTa noma c .NET Framework 421 

M3npamaHe Ha e/ieicrpoHHa noma 421 

M3npamaHe Ha e/ieicrpoHa noma c .NET Framework 422 

y n pa>KHeH ma 428 

M3no/i3BaHa zikuepaTypa 429 

T/iaBa 19. OTpa>KeHne Ha TfinoBeTe (Reflection) 431 

Abtop 43 1 

Heo6xoAMMM 3HaHMfl 431 

Cbfl"b p>Ka Hue 431 

B Ta3M TeMa 43 1 

KaKBO e Global Assembly Cache? 432 

MHCTa/inpaHe Ha aceM6/iMTa b GAC 432 

noflflp"b>KKa Ha MHoro Bepcun 433 



22 nporpaMnpaHe 3a .NET Framework (tom 2) 

nper/iefl Ha GAC npe3 Windows Explorer 433 

nper/iefl Ha GAC npe3 Administrative Tools 435 

OrpaweH ne Ha tm noBeTe 437 

KaKBO e Reflection? 437 

3apexflaHe Ha aceM6/iwra 437 

M3B/iMHaHe MHcJjopMaumi 3a aceM6/in 438 

npeMaxBaHe Ha aceM6/iMTa ot naMeTTa 440 

l/l3VHaBaHe Ha TunoBeTe b aceM6/in 440 

Reflection K/iacoBe 3a BMflOBeTe H/ieHOBe 445 

M3B/iMHaHe Ha MeTOflki v\ napaMeTpnTe mm 446 

Reflection Emit 453 

Ynpa>KHeHMfl 457 

M3no/i3BaHa /li/ueparypa 458 

T/iaBa 20. Cepna/iM3aL(iin Ha a^hhm 459 

Abtop 459 

Heo6xoAMMM 3HaHMfl 459 

C"bfl"bp>KaHMe 459 

B Ta3M TeMa 459 

Cepwa/iM3au,Mfl 460 

KaKBO e cepna/iM3aumi (serialization)? 460 

KaKBO e flecepna/iM3aumi (deserialization)? 460 

Kora ce M3no/i3Ba cepna/in3aumi? 460 

3a mo fla M3no/i3BaMe cepna/iM3aunfl? 461 

KparbK npuMep 3a cepna/iM3aumi? 462 

OopMaTepn ( Formatters) 462 

ripouecbT Ha cepna/iM3npaHe 463 

KparbK npuMep 3a cepna/iM3aumi 464 

KparbK npuMep 3a flecepna/iM3aumi 465 

EkiHapHa cepna/iM3aumi - npuMep 466 

Cepna/iM3aumi no Mpexara - npuMep 469 

fl"b/i6oKO KonnpaHe Ha o6eKTM - npuMep 475 

IDeserializationCallback 478 

ISerializable v\ KOHTpo/inpaHe Ha cepna/iM3aumiTa 481 

3a ecJjeKTMBHOCTTa Ha cepna/in3aumiTa 487 

XML cepkia/iki3au,M5q 488 

KaKBO e XML cepna/iM3aunfl? 488 

XML cepna/iM3aumi - npuMep 488 

ripocTa XML cepna/iM3aumi - npi/iMep 489 

KoHTpo/inpaHe Ha M3X0flHiifl XML 491 

KoHTpo/i Ha XML cepna/iM3aunflTa - npi/iMep 492 

B"bHiueH KOHTpo/i Ha XML cepna/iM3aumiTa 496 

B"bHiueH KOHTpo/i Ha cepna/iM3aumiTa - npuMep 497 

npn^OKeHkie: FormatterServices 498 

MeTOflM 3a cepna/iM3aumi 499 

MeTOflM 3a flecepna.nl/i3aukm 499 

Ynpa>KHeHM5q 499 

l/l3no/i3BaHa /li/ueparypa 500 

T/iaBa 21. Ye6 yc/iyrn c ASP.NET 501 

ABTopw 501 

Heo6xOAMMM 3HaHMfl 501 



nporpaMnpaHe 3a .NET Framework (tom 2) 23 

Cbfl"bp>Ka Hue 501 

B Ta3M TeMa 502 

B"b3HMKBaHeTO Ha ye6 yc/iyrwTe 503 

Pa3npefle/ieHM npi/moweHmi 503 

Mofle/in 3a pa3npefle/ieHM npmio>KeHmi 503 

Hy>KflaTa ot ye6 yc/iyrn 504 

Ye6 yc/iyrw 506 

KaKBO e yc/iyra? 506 

KaKBO e ye6 yc/iyra? 506 

ripuHunn Ha fleMCTBue Ha ye6 yc/iyrnTe 507 

1/lHCppacrpyKTypa Ha ye6 ycnyri/iTe 508 

flupeKTopnn 3a ye6 yc/iyrn 509 

OTKpuBaHe Ha ye6 yc/iyrn 511 

WSDL onucaHkin Ha yc/iyrn 512 

SOAP - cJDopMaT Ha 3ajiBKkiTe 515 

npoTOKO/ieH CTeK Ha ye6 yc/iyrnTe 520 

CueHapnn 3a i/i3no/i3BaHe Ha ye6 ycnyrwTe 521 

flocraBJiHe Ha flaHHM 521 

Yc/iyrn K"bM K/ineHTCKM npmioweHmi 522 

MHTerpauMJi Ha npmioxeHmi 522 

B po/urra Ha aflarrrepi/i 522 

Bp"b3Ka Me>Kfly OTflejiHMTe KOMnoHeHTM Ha Enterprise npn/iOKeHmi 523 

Enterprise npi/i/io>KeHkifl 523 

Kom npmioweHkm ca Enterprise? 523 

.NET Enterprise npmioweHkm 524 

Ye6 ycnyrwTe b ASP.NET 526 

npocTpaHCTBa ot MMeHa 526 

ApxnTeKTypa Ha ASP.NET ye6 yc/iyrnTe 527 

Cb3flaBaHe Ha ye6 yc/iyrn 528 

Ye6 yc/iyriue v\ ye6 npmioweHkiflTa 529 

riy6/iMKyBaHe Ha ye6 yc/iyrn 529 

M3no/i3BaHe Ha ye6 yc/iyrn 536 

Ye6 yc/iyrnTe v\ VS.NET - Cb3flaBaHe v\ KOHcyMnpaHe 540 

ATpn6yTM 3a ye6 yc/iyrnTe 542 

npexB-bpjiflHe Ha TunoBe (marshalling) 544 

fle6"brBaHe Ha ye6 yc/iyrn 553 

Mofle/i"bT Ha M3n"b/iHeHne Ha ye6 yc/iyriue b ASP.NET 553 

Acmhxpohho M3BMKBaHe Ha ye6 yc/iyrn 555 

Ye6 yc/iyrn v\ pa6oTa c flaHHM 558 

noflflp"b>KKa Ha ceckiki 562 

CurypHOCT Ha ye6 yc/iyrnTe 566 

l/l3K/iK)HeHmiTa b ye6 yc/iyrnTe 572 

y n pa>KHeH v\s\ 584 

M3no/i3BaHa /li/iTepaTypa 586 

T/iaBa 22. OTfla/ieneHM M3BHKBaHMSi c .NET Remoting 587 

Abtop 587 

Heo6xoflMMM 3HaHMfl 587 

Cbfl"bp>Ka Hue 587 

B Ta3M TeMa 587 

Pa3npefle/ieHi/i npi/i/io>KeHkifl 588 

KaKBO e .NET Remoting? 588 



24 nporpaMnpaHe 3a .NET Framework (tom 2) 

Kora ce M3no/i3Ba Remoting? 588 

Microsoft Indigo (WCF) 589 

Remoting kiHcbpacrpyKTypaTa 589 

KaK pa6oTM Remoting MHcJjpacTpyKTypaTa? 590 

Remoting KaHa/in 590 

OopMaTepn (formatters) 592 

AKTkiBaumi Ha o6eKTM 593 

Pemcrpaumi Ha OTfla/ieneH o6eKT 594 

Cb3flaBaHe Ha nHCTaHunn Ha OTfla/ieneH o6eKT 596 

Mapuja/iM3auna (Marshaling) 598 

Xmbot Ha o6eKTMTe (Lifetime) 600 

Remoting KOHCJDnrypaunoHHM dJaw/iOBe 606 

Remoting cueHapnn 617 

Hucra MpewoBa KOMyHMKaumi 619 

XM L ye6 yc/iyrn 619 

.NET Remoting 619 

Remoting cbpBtp v\ K/iweHT - npuMep 620 

Cb3flaBaHe Ha o6mnTe TunoBe 620 

C"b3flaBaHe Ha cbpBtp 622 

C"b3flaBaHe Ha K/ineHT 624 

C"bpB"bp"bT V\ KJWeHTbT B fleMCTBMe 625 

npo6/ieM"bT c o6iunTe TunoBe 628 

Cnofle/ieHO aceM6/in c TunoBe 628 

Cnofle/ieHO aceM6/in c MHTepc|DeMCM 628 

Soapsuds.exe 629 

Xoctmht Ha Remoting TkinoBe b IIS 629 

Ynpa>KHeHMfl 629 

M3no/i3BaHa /li/uepaTypa 630 

T/iaBa 23. B3anMOflePicTBMe c HeynpaB/ifiBaH koa 631 

Abtop 63 1 

Heo6xoflMMM 3HaHMfl 631 

C"b Kb pxa Hue 631 

B Ta3M TeMa 63 1 

KaKBO pa36npaMe nofl B3anMOfleMCTBne c HeynpaB/iflBaH koa? 633 

06iua cpeAa v\nv\ BwpTya/iHa Mawi/ma 633 

Cpefla 3a KompojikipaHO M3n-b/iHeHne .NET CLR (o6ma cpe/ia) 634 

BnpTya/iHa MaujMHa JVM 634 

ri/iaTcbopMeHO M3BMKBaHe (P/Invoke) 636 

ATpn6yT DMImport 636 

KaK pa6oTM P/Invoke? 640 

KoMaHflaTa DUMPBIN 640 

3apexflaHe Ha ci/icreMHa MKOHa - npuMep 641 

npeo6pa3yBaHe Ha flaHHM (marshalling) 643 

npeo6pa3yBaHe Ha CTpyKTypn 644 

Pa3no/iaraHe Ha noneiaia ot crpyKTypaTa 644 

npeo6pa3yBaHe Ha K/iacoBe 646 

npeo6pa3yBaHe Ha HM30Be 646 

ATpn6yT MarshalAs 648 

MMn/ieMeHTupaHe Ha cJDyHKunn 3a o6paTHO M3BMKBaHe (callback) 649 

npeo6pa3yBaHe Ha flaHHM - npuMep 650 

B3anMOAeMCTBne c COM (COM interop) 655 



nporpaMnpaHe 3a .NET Framework (tom 2) 25 

KaKBO e COM? 655 

Bn/iOBe COM o6eKTM v\ perncrpaumi 655 

CTpyKTypa Ha COM o6eKTMTe 656 

M3BMKBaHe Ha COM o6eKT ot ynpaB/inBaH koa 657 

Pa3KpnBaHe Ha .NET KOMnoHem" KaTO COM o6eicr 662 

B3anMOAeMCTBne etc C++ 4pe3 IJW 667 

IJW M3BMKBaHe ot C++ - npwMep 667 

npenop-bKM 3a M3no/i3BaHe Ha .NET TunoBe ot COM 668 

Immutable /in ca HancrnHa CMMBO/iHMTe HM30Be? 669 

l/l3noji3BaHe Ha 6ponHH 3a npon3BOAMTe/iHOCT v\ CLRSpy - npuMep 670 

Ynpa>KHeHi/m 673 

M3no^3BaHa zikiTepaTypa 673 

T/iaBa 24. YnpaBsieHiie Ha naMeTTa v\ pecypcirre 675 

Abtopm 675 

Heo6xoAMMM 3HaHMfl 675 

C"bA"b p>Ka Hue 675 

B Ta3M TeMa 676 

YnpaB/ieHwe Ha naMeTTa npn pa3/ii/mHMTe e3nu,n v\ n/iaTCpopMM 677 

P"b4HO ynpaB/ieHi/ie Ha naMeTTa v\ pecypcMTe 677 

npeflMMCTBa m HeflocTarbun Ha p^hhoto ynpaB/ieHne Ha naMeira v\ pecypcMTe. 679 

YnpaB/ieHkie Ha naMeTTa b .NET Framework 681 

npeflMMCTBa m HeflocTarbun Ha aBTOMaTMHHOTO ynpaB/ieHne Ha naMeira 682 

KaK ce 3afle/ui naMeT b .NET? 685 

KaK pa6oTM garbage collector? 687 

noKO/ieHMJi naMeT 691 

B/iok naMeT 3a ro/ieMM o6eKTki 695 

YBe/iMHaBaHe pa3Mepa Ha xnwna 696 

OkiHa/iki3au,kiflTa Ha o6eKTM b .NET 696 

KaKBO e cbMHa/iM3a una? 697 

flecTpyKTopnTe b C# 697 

OnHa/iM3aunfl - npuMep 699 

3afl Ky/iMCMTe 699 

OnawKaTa Freachable 701 

HaKpaTKO 3a c})kiHa/iM3au.mrra 701 

TbMHaTa CTpaHa Ha cJ3HHa.nM3au.mrra 702 

KaKBO p,a npaBMM Bee naK? 703 

C"b>KMBJiBaHe Ha o6eKTH 703 

Pt4HO ynpaB/ieHi/ie Ha pecypcMTe c IDisposable 705 

1/lHTepcbekicbT IDisposable 706 

OnepaTopvr using 706 

IDisposable v\ Finalize 707 

npuMepHa MMn/ieMeHTau,M5i Ha 6a30B K/iac, o6BMBam HeynpaB/inBaH pecypc.... 709 

Close() m eKcn/inuMTHa kiMn.neMeHTau.mi Ha IDisposable 715 

Kora fla M3BMKBaMe IDisposable. Dispose()? 716 

B3anMOAeMCTBne etc ci/icreMaTa 3a noni/iCTBaHe Ha naMeTTa 716 

noHMCTBaHe Ha naMeira 716 

noTMCKaHe Ha cj3MHa/iM3aumiTa 720 

M3HaKBaHe pp npuK/iKDHBaHe Ha 4iMHa.nii3au.miTa 720 

PerncTpupaHe Ha o6eKTa 3a cJDMHa.nki3au.mi 720 

Onpeae/iJiHe noKO/ieHneTO Ha o6eKT 721 

Pinning 721 



26 nporpaMnpaHe 3a .NET Framework (tom 2) 

VTVb/DKaBaHe >KMBOTa Ha npoMeH/iMBMTe npn Interop 722 

Cna6w pecpepeHunn 725 

EcpeKTMBHO M3no/i3BaHe Ha naMeTTa 726 

TexHMKaTa "ny/ikmr Ha pecypcn" 738 

npuMepHa MMn/ieMeHTaunji Ha ny/i ot pecypcn 739 

Ynpa>KHeHMfl 745 

M3no/i3BaHa /11/uepaTypa 746 

T/iaBa 25. AceM6/iMTa v\ pa3npocTpaHeHne 747 

Abtop 747 

Heo6xoflMMM 3HaHMfl 747 

Ct Atpxa Hue 747 

B Ta3M TeMa 748 

AceM6^MTaTa b .NET Framework 749 

AceM6/iMTaTa CbfltpwaT IL yloj\ 3a M3n"b/iHeHne 749 

AceM6/iMTaTa 4>opMnpaT rpaHnua 3a curypHOCTTa (security boundary) 749 

AceM6/iMTaTa 4>opMnpaT rpaHnua 3a TunoBeTe (type boundary) 750 

AceM6/iMTaTa cJDopMnpaT rpaHnua Ha BMflMMOCTTa (reference scope boundary).. 750 

AceM6/iMTaTa cJDopMnpaT rpaHnua Ha BepcunTe (version boundary) 750 

AceM6/iMTaTa ca eflUHnua 3a cnofle/uiHe 750 

AceM6/iMTaTa ca eflUHnun 3a pa3npocrpaHeHne (deployment units) 751 

MeTaAaHHM v\ MaHncpecT Ha aceM6/iw 751 

MaHndjecT Ha aceM6/in 751 

C"bfl"bp>KaHMe Ha MaHndsecra 752 

ATpn6yTM 3a pa6oTa c MaHwcfiecT 753 

C"b3flaBaHe Ha MHoroMOfly/iHO aceM6/in 755 

Pa3r/ie>KflaHe Ha MaHwcpecra Ha aceM6/in c ildasm 757 

Cmjiho MMeHyBaHe Ha aceM6/in 759 

KoHcbnrypau,MOHHM rJ>ai/i/iOBe b .NET Framework 761 

KaK CLR Ha mm pa aceM6/ikiTaTa? 763 

ripuMep 1: TbpceHe Ha aceM6/in (probing) 764 

ripuMep 2: TbpceHe Ha aceM6/in c Tara <codebase> 764 

Cb3flaBaHe Ha Publisher Policy File 765 

Global Assembly Cache 766 

DLL a/rbT (DLL Hell) 766 

Side-by-side execution 767 

ripeflMMCTBa m HeflOCTarbun Ha GAC 767 

Pa6oTa c GAC - npuMep 768 

Pa3npocTpaHeHne v\ MHcra/iwpaHe Ha nporpaMHM naKeTM 769 

Oaw/iOBe m nanKM 770 

AceM6/iMTa 772 

1/lHCTa/iau.kiOHHH KOMnoHeHTM 774 

COM 6a3npaHM o6eKTM 775 

CtpBtpHM KOMnoHeHTM (Serviced Components) 776 

HacrpoMKM Ha Internet Information Server (IIS) 777 

npoMJiHa Ha perncTpnTe Ha Windows 781 

Cnofle/ieHM MHCTa/iaunoHHn KOMnoHeHTM (Merge Modules) 781 

CAB cfcai/moBe 782 

/10Ka/iM3npaHe 782 

Debug Symbols 783 

MHcra/iauMOHHH crpaTerm/i 785 

No-Touch Deployment (.NET Zero Deployment) 785 



nporpaMnpaHe 3a .NET Framework (tom 2) 27 

Windows Installer 788 

Ko/ieKUMfl ot cJDaki/iOBe cne/i KOMnmiaumi 796 

Ct3AaBaHe Ha MSI kiHcra/iau,kiOHeH naKeT 798 

Cb3flaBaHe Ha MHCTa/iaunoHeH naKeT Ha Windows 6a3npaHO npmio>KeHMe 799 

Cb3flaBaHe Ha MHCTa/iaunoHeH naKeT Ha ye6 yc/iyra 809 

flon"b/iHMTe/iHM HacrpoMKM Ha MHCTa/iaunoHHUTe npoeKTM B"bB VS.NET 2003 .... 811 

MHCTa/inpaHe/flenHCTa/inpaHe Ha MSI naKeTMTe 811 

Ynpa>KHeHMfl 813 

M3no^3BaHa zii/iTepaTypa 814 

T/iaBa 26. CiirypHOCT b .NET Framework 815 

ABTopi/i 815 

Heo6xoAMMM 3HaHMfl 815 

Cbfl"b p>Ka Hue 815 

B Ta3M TeMa 816 

CurypHOCTTa b .NET Framework 817 

Be3onacHOcr Ha TunoBeTe 817 

n po6jieMvr "Buffer overrun" 817 

3a muTa Ha na MeTTa 818 

npwxBamaHe Ha apMTMeTMHHn rpewKM 819 

Application Domains 820 

OCHOBHM KpunTOrpaCJJCKM nOHflTMfl 821 

Cn/iHO-MMeHyBaHM aceM6/iMTa 824 

TexHO/iomflTa Isolated Storage 826 

CurypHOCT Ha KOAa (Code Access Security) 827 

rio/iMTMKMTe 3a cwrypHOcr b .NET Framework 827 

ripaBa (Permissions) 829 

"Stack Walk" v\ kohtpo/i Haa npaBaTa 830 

fleK/iapaTMBHO v\ nporpaMHO MCKaHe Ha npaBa 831 

CurypHOCT 6a3npaHa Ha po/in (Role-Based Security) 833 

ABTeHTMKaumi v\ OTopn3au,mi 833 

K/iacoBeTe Identity v\ Principal 833 

Pa6oTa c Windowsldentity v\ WindowsPrincipal 834 

l/lH(t>opMau.mi 3a TeKymmi noTpe6nTe/i - npuMep 834 

Pa6oTa c Genericldentity v\ GenericPrincipal 835 

OTopn3aunn no Principal o6eKT 835 

C)Topi/i3au.mi c noTpe6nTe/in v\ po/in - npuMep 837 

KpunTorpadpufl b .NET Framework 840 

M3B/iMHaHe Ha xeiu ctomhoct 840 

CuMeTpuHHM KpunTupamn cxeMM 842 

AcuMeTpuHHM KpunTupaiMM cxeMM 845 

Pa6oTa c uncppoBM noflnncn 848 

XML noflnncn 850 

Ynpa>KHeHMfl 860 

M3no/i3BaHa zii/iTepaTypa 862 

T/iaBa 27. Mono - CBo6oflHa MMrmeMeHTauimj Ha .NET Framework. .863 

Abtopm 863 

Heo6xoAMMM 3HaHMfl 863 

C"bfl"bp>Ka Hue 863 

B Ta3M TeMa 864 

flpoeKTbT Mono 865 



28 nporpaMnpaHe 3a .NET Framework (tom 2) 

3HaHeHne Ha npoeKTa 865 

CraTyc Ha npoeKTa 865 

noflfl"bp>KaHM onepaunoHHM cucTeMM v\ apxnTeKTypn 865 

MHcra/ikipaHe v\ KOHCpurypupaHe Ha Mono 866 

MHCTa/inpaHe Ha Mono Bipxy Linux p,v\crpv\6yu,v\v\ 866 

MHCTa/inpaHe Ha Mono nofl Windows 869 

MHCTa/inpaHe Ha Mono noa Mac OS X 869 

MHCTa/inpaHe Ha Mono noa FreeBSD 869 

CpeAM 3a pa3pa6oTKa 870 

MonoDevelop 870 

Eclipse 871 

Emacs v\ Vim 872 

X-Develop 872 

KDevelop 872 

KaKBO BK^K)4Ba Mono? 872 

BnpTya/iHa MaujMHa 872 

KoMnnnaTop 3a C# - mcs 874 

Mono gmcs 874 

Visual Basic .NET KOMnmiaTop - mbas 875 

Mono aceM6/iep v\ flM3aceM6/iep - ilasm v\ monodis 875 

Mono fle6-brep-bT - mdb 875 

flOKyMeHTaumiTa Monodoc 876 

Mono K/iacoBeTe 877 

riO/ie3HM MHCTpyMeHTM 878 

'Hello Mono' c Mono 878 

Cope KOAvr 879 

KoMnmwpaHe 879 

CrapTwpaHe 879 

flM3aceM6/inpaHe 879 

fle6-brBaHe c mdb - Hello Mono pea no pea 880 

ADO.NET m Mono 881 

Npgsql - Data Provider 3a PostgreSQL 881 

MySQL Data Provider 883 

OracleClient - The Oracle Data Provider 884 

SqICIient - Data Provider 3a Microsoft SQL Server 884 

Ye6 TexHO/iorwkiTe b Mono 886 

ASP.NET no/i Mono 886 

Ye6 yc/iyrn 890 

rpacpM4HM MHTepcbeMCM b Mono 894 

Windows Forms 894 

Gtk# 895 

Glade* 896 

Gnome* 902 

QT# 902 

Cocoa # 3a Mac OS 903 

KaKfla nkiujeM npeHOCMM koa? 903 

nporpaMnpaHe Ha nrpn v\ Tao Framework 904 

Tao Framework 904 

SDL.NET 905 

AXIOM 905 

Java, Python, PHP v\ Mono 906 

Java 3a .NETCLR 906 



nporpaMnpaHe 3a .NET Framework (tom 2) 29 

Python m PHP nop, Mono 907 

Ynpa>KHei-ii/m 907 

no/ie3Hki Mono pecypcn 907 

M3no/i3BaHa /lMTepaTypa 907 

T/iaBa 28. noMOU|HM MHCTpyMeHTM 3a .NET pa3pa6oTHML|M 909 

Abtopm 909 

Heo6xoAMMM 3HaHMfl 909 

C"bA"bp>KaHMe 909 

B Ta3M TeMa 909 

noMOiuHM MHCTpyMeHTM 3a pa3pa6oTKa 910 

.NET Reflector 910 

OyHKUMM 910 

Pa3UJMpneMOCT 912 

FxCop 913 

n pa BM/ia b FxCop 914 

FxCop - rpacJDMHHO npM/ioweHMe 914 

FxCopCmd - npmiowemie 3a KOMaHflHMJi pea 916 

rio/i3M ot ynoTpe6aTa Ha FxCop 916 

l/l3noji3BaHa /lMTepaTypa 917 

CodeSmith 917 

TeHepMpaHe Ha koa 917 

B-bBefleHne b iua6/iOHMTe Ha CodeSmith 919 

CodeSmith npM/io>KeHMJi 922 

M3no/i3BaHa /lMTepaTypa 924 

NUnit 924 

KaKBO e aBTOMaTM3MpaH unit TecT? 924 

riMcaHe Ha TecTOBe c Nunit 925 

M3n"b/iHeHMe Ha TecTOBeTe 928 

XapaKTepucTMKM Ha flo6pnTe TecroBe 930 

KaKBO p,a TecTBaMe KaTO nporpaMMCTM? 930 

Y/iecHJiBaHe Ha TecTBaHeTO 931 

Mock o6eKTM (Mock objects) 933 

Pa6oTa c NMock 933 

Pa3UJMpeHMn Ha NUnit 935 

M3no/i3BaHa /lMTepaTypa 938 

Log4net 939 

3a TexHMKaTa "ziorMHr" 939 

npeflM3BMKaTe/iCTBaTa npe/i log4net 939 

KoMnoHeHTM Ha log4net 940 

flpyrM xapaKTepMCTMKM Ha log4net 944 

log4net - npMMep 945 

M3no/i3BaHa /lMTepaTypa 949 

NH ibernate 949 

B3aMMOfleMCTBMe Mewfly o6eKTM m pe/iau,MOHHM CYBfl 949 

ADO.NET m cm/iho Tkinn3MpaHM DataSets 950 

06eKTHO-pe/iau,MOHeH npexoa 951 

fleMOHCTpauMOHeH npMMep c NHibernate 952 

riOMomHM MHCTpyMeHTM 3a NHibernate 958 

flpyrM B"b3MOXHOCTM 958 

M3no/i3BaHa /lMTepaTypa 958 

NAnt 958 



30 nporpaMnpaHe 3a .NET Framework (tom 2) 

3amo hm e HyweH NAnt? 959 

Ochobhm ct>yHKUkiki 959 

Ochobhm noHJiTmi 960 

l/l3rrb/iHei-me Ha NAnt CKpmrroBe 961 

KoHC|3Mrypaumi Ha CKpunTOBeTe 962 

OpraHM3aumi Ha c/io>khm CKpwriTOBe 963 

MHTerpauMfl c Microsoft Visual Studio.NET 964 

MHTerpauMfl c NUnit 965 

l/l3noji3BaHa /n-rrepaTypa 966 

flpyrn noMOiuHM cpeflCTBa 966 

NDoc 966 

GhostDoc 966 

Snippet Compiler 967 

ASP.NET Web Matrix 967 

Tree Surgeon 967 

NDepend 967 

CruiseControl.NET 967 

nopTa/iM 3a MHCTpyMeHTM 968 

Ynpa>KHeHMfl 968 

T/iaBa 29. ripaKTMHecKM npoeKT 971 

Abtopm 971 

Heo6xoflMMM 3HaHMfl 971 

Ct Atp>Ka Hue 971 

B Ta3M TeMa 972 

CucTeMa 3a 3ano3HaHCTBa b 1/lHTepHeT - bm3ma 973 

KaKBO e cpyHKu,MOHa^Ha cneu,ncpMKau,Mfl? 973 

OyHKunoHa^HM Bt3M0>KH0CTM Ha ckicreMaTa 3a 3ano3HaHCTBa 974 

<DyHKU.kiOHa.nHM B"b3M0>KH0câ„¢ Ha ASP.NET ye6 npM/io>KeHMeTO 974 

OyHKUMOHa/iHM B"b3M0>KH0CTM Ha Windows Forms K/ineHTCKOTO npmiO)KeHMe.... 977 
HecpyHKunoHa/iHM M3MCKBaHMn K"bM cucTeMaTa 3a 3ano3HaHCTBa no MHTepHeT.. 977 

ApxnTeKTypa Ha ci/icreMaTa 978 

MMn/ieMeHTau,Mfl Ha cwcreMaTa 979 

C/iom 3a flaHHM 979 

En3Hec c/iom - ASP.NET ye6 yc/iyraTa 984 

l/lMn/ieMeHTaunji Ha ASP.NET ye6 yc/iyraTa 986 

K/ineHTCKM cjiom - Windows Forms GUI npmiOKeHne 993 

1/lMrmeMeHTau.mi Ha Windows Forms K/ineHTa 994 

K/ineHTCKM cjiom - ASP.NET ye6 npn/ioxeHneTO 1004 

1/lMrmeMeHTau.mi Ha ASP.NET ye6 npmioweHkieTO 1007 

MHcra/iwpaHe v\ BHeAP^BaHe Ha cwcreMaTa 1024 

CklCTeMHM M3MCKBaHmi 1025 

Ot Ktfle p,a M3Ter/iMM ci/icreMaTa v\ cope KO^a v\l 1025 

B"b3CTaH0BJiBaHe Ha 6a3aTa flaHHM b SQL Server 1025 

MHCTa/inpaHe m BHeapaBaHe Ha ASP.NETye6 yc/iyraTa 1027 

MHCTa/inpaHe Ha Windows Forms K/ineHTa 1029 

MHCTa/inpaHe Ha ASP.NET ye6 npn/iOKeHneTO 1029 

l/l3no/i3BaHa n i/uepaTypa 1029 

3aK/iiOHeHiie ki>m BTopmi tom 1031 



Eth 



HPC 



% % L nO PH3PHEQ TUB HB CO (Ty£P 



fr^ 



HAMMOHA/1HA AKAflEMIIfl no PA3PAEOTKA HA COOTYEP 



JleKTopiiTe 

» CBeTflHH HaKOB e 

aBTop Ha fleceTKM TexHi/mecKi/i 

ny6/lMKai4MM M HflKO/lKO KHMTM, 

CBtp3aHM c pa3pa6oTKaTa Ha 
cocfrryep, 3apaflM KoeTO e Tbp- 

CeH rieKTOp l/l KOHCy/lTaHT. 

Tom e pa3pa60TMMK c flt/iroro- 
fluiueH onMT, pa6oTnri no pa3- 
HOo6pa3HM npoeKTM, pea/in3M- 

paHM C pa3/lMMHM TeXHO/10n/|l/l 

(.NET, Java, Oracle, PKI m pp.) 
m npenoflaBaTeri no cbBpeMeH- 
hm cocf)TyepHM TexHO^oruM b CY 

"CB. KjlMMeHT OxpMflCKM". 

npe3 2004 r. e HOCMTe/i Ha 
HarpaaaTa "fliKOH ATaHacoB" 
Ha npe3MfleHTa Ha Et/irapi/ia 
Teopru ritpBaHOB. 

CBeT/iMH HaKOB ptKOBOflu o6y- 
MeHneTO no Java TexHO/iornn b 
AKaaeMMflTa. 

» MaprHH KynoB e 

cocfrryepeH MHweHep n kohcv/i- 
TaHT c flt/iroroflniueH onuT b 
M3rpa>KflaHeTO Ha peweHi/isi c 
n/ia-rrJpopMi/iTe Ha Microsoft. 

MapTMH e onuTeH MHCrpyKTop m 
cepTM0MunpaH ot MaMKpoco0T 
pa3pa6oTMMK no nporpaMi/ue 
MCSD, MCSD.NET, MCPD m 
MVP m MexflyHapofleH /leicrop b 
CBeTOBHaTa opraHki3aui/i5i Ha 
.NET noTpe6nTe^CKMTe rpynw 
IN ETA. 

MapTMH KynoB ptKOBOflki o6y- 
HeHkieTO no .NET TexHO/iorm/i b 
AKafleMMsua. 



AKafleMMATa 

» Hai4MOHa/iHa aKaAeMim no pa3pa- 
6oTKa Ha cocpTyep (HAPC) e ueHTbp 
3a npo0ecnoHa/iHO o6yHeHi/ie Ha co0- 
TyepHM cneui/ia/ii/icn/i. 

» HAPC npoBewfla BE3n/lATHO Kyp- 
coBe no pa3pa6oTKa Ha co0Tyep 1/1 CbB- 
peMeHHM co0TyepHM TexHO/iornn b Co- 
0i/ia 1/1 flpyrn rpaflOBe. 

» npefl/iaraHM cneu,i/ia/iHOCTi/i: 

â–  BiaBeAeHMe b nporparmpaHeTO 
(c e3Mu,MTe C# m Java) 

â–  Core .NET Developer 

â–  Core Java Developer 

» KanecTBeHO o6yneHiie c mhoto 

npaKTMHecKM npoeKTM 1/1 i/mfli/iBi/ifly- 
a/iHO BHMMaHne 3a BceKi/i. 

» TapaHTMpaHa pa6oTa! TpyaoB ao- 
roBop npi/i nocTbnBaHe b AKafleMi/iflTa. 

» EE3n/1ATHO! 

Ym/iTe 6e3njiaTHO BtB BtBefli/iTe/iHi/iTe 
KypcoBe m no cn/ineHfli/ii/i ot pa6oTOfla- 
Te/iMTe b c/ieflBam,MTe Hi/ma. 



http://academy.devbg.org 



Bt/irapcKa a co una una 
Ha paspaSoTMMUMTe na co<t>Tyep 



www.devbg.org 



Et/irapcKa acounaunsq Ha pa3pa6oT4MUMTe Ha coc|DTyep 
(5APC) e HecronaHCKa opraHM3aunfl, koato noflnoMara npo- 
cJDecnoHa^HOTO pa3BMTne Ha 6"b^rapcKMTe coc|DTyepHM cneun- 
a/iwcn/i npe3 o6pa30BaTe^HM v\ Apyrn MHnunaTHBn. 

5APC pa6oTM 3a HacbpnaBaHe o6MAHaTa Ha onuT Me>Kfly pa3- 
pa6oT4MUMTe m 3a ycbBtpujeHCTBaHe Ha TexHkue 3HaHmi v\ 
yMeHMfl b 06/iacTra Ha npoeKTupaHeTO v\ pa3pa6oTKaTa Ha 
coc|DTyep. 

AcounaunflTa opraHM3npa cneukia/iki3kipaHki KOHCJDepeHUMM, 
ceMMHapn m KypcoBe 3a o6yneHwe no pa3pa6oTKa Ha coc|DTy- 
ep m coc|DTyepHM TexHO/iorww. 

5APC opraHM3npa cb3flaBaHeT0 Ha Haui/iOHa/iHa aKafleMna no 
pa3pa6oTKa Ha coc|3Tyep - yne6eH ueHTbp 3a npoifceci/iOHa/i- 
Ha noAroTOBKa Ha coc|DTyepHM cneui/ia/ikicâ„¢. 



ripeflroBop K"bM 

BTOpilfl TOM 



Ako no npuHunn He neTeTe yBOflMTe Ha KHurnTe, nponycHeTe v\ to3m. B Hero 
me Haynkue Hai/i-Bene iokbo bm npeflCTOM b c/ieABamnTe r/iaBM v\ KaK ce 
CTurHa ao HanncBaHeTO Ha HacToaiuaTa KHMra. 

ToBa e btopm tom Ha ntpBaTa hmcto 6"b/irapcKa KHMra 3a nporpaMnpaHe c 
.NET Framework v\ C#, ho BtnpeKM, <Ae cJDOKycupa Btpxy .NET Framework 1.1, 
Tfl e eflHO ot Haki-no^e3HMTe neTMBa b Ta3M 06/iacr. HanncaHa ot cneuna- 
/imctm c onuT KaKTO b npaKTMnecKaTa pa6oTa c .NET, TaKa v\ b o6yneHMeTO no 
nporpaMnpaHe, KHMraTa me bm p,ap,e He caMO ocHOBMTe Ha .NET nporpaMM- 
paHeTO, ho m me bm 3ano3Hae c hakom no-cno>KHM KOHuenunn v\ me bm 
npeAaAe ot oni/ua Ha aBTopnTe. 

3a Koro e npeflHa3Ha«HeHa Ta3M KHiira? 

BTopuflT tom Ha KHuraTa e npeAHa3HaneH 3a bcmukm, komto ca npone/iM 
ntpBMfl tom m tom mm AonaAa. Tfl e 3a bcmukm, komto MCKaT p,a npoAt/iwaT 
o6oraTABaHeTO Ha 3HaHMATa m yMeHM^Ta cm 3a pa3pa6oTKa Ha coc|DTyep 3a 
.NET n/iaTC)DopMaTa. 

BTOpMflT TOM e npOCTO npOA"b^>KeHMe Ha ntpBMfl M BK/lK)HBa HflKO/IKO MHOTO 

Ba>KHM TexHO/iorMM ot .NET Framework, a MMeHHO Windows Forms, ASP.NET 
ye6 npM/io>KeHMfl m ye6 yc/iym. 

Ta3M KHMra me bm p,ap,e mhoto noBene ot Hana/iHM 3HaHMfl. Ta me bm npeAaAe 
onMT, HaTpynaH b npoAt/iweHMe toamhm, m me bm 3ano3Hae c yTBtpAeHMTe 
npaKTMKM npM M3no/i3BaHeTO Ha .NET TexHO/iorMMTe. 

KHMraTa e no/ie3Ha He caMO 3a .NET nporpaMMCTM, ho m 3a bcmukm, komto 
MMaT we/iaHMe p,a ce 3aHMMaBaT cepM03HO c pa3pa6oTKa Ha coc|DTyep. B Hea ce 
o6p"bma BHMMaHMe He caMO Ha cneuMCJDMUHMTe .NET TexHO/iorMM, ho m Ha 
hakom c|DyHAaMeHTa^HM KOHuenuMM, komto BceKM nporpaMMCT Tpa6Ba Ao6pe 
Aa 3Hae m pa36Mpa. 

Heo6xoflMMM Hana/iHH no3HaHnq 

Ta3M KHMra He e noAxoA^iua 3a xopa, komto HMKora He ca nporpaMMpa/iM b 
>KMBOTa cm. Ako CTe a6co/iKrmo HanMHaem, cnpeTe Aa ^eTeTe m npocTO 3anon- 
HeTe c Apyra KHMra! 

Tom 2 Ha KHMraTa He e noAxoA^iu 3a xopa, komto He ca ne/iM (m/im noHe 
nper/ieAa/iM Ha6"bp3o) ntpBMfl tom. Btopmat tom e ecTecTBeHO npoAt/iweHMe 



34 nporpaMnpaHe 3a .NET Framework (tom 2) 

Ha ntpBMfl tom m e cm/iho CB"bp3aH c MaTepwa/ia, M3/io>KeH b Hero. M flBeTe 
4acTM Ha KHuraTa ca cbo6oaho flocTtnHM ot 1/lHTepHeT (ot aflpec http://www. 
devbq.org/dotnetbook/ '), TaKa ne HHMaTe onpaBAaHne p,a 3anonBaTe HanpaBO 
ot BTopaTa. He bm ro npenoptuBaMe! 

KaKBO o6xBauJia btopmjit tom Ha Ta3M KHiira? 

riporpaMnpaHeTO 3a .NET Framework M3MCKBa no3HaHMfl Ha HeroBMTe 6a30BM 
KOHuenunn (MOAe/i Ha M3n"b/iHeHMe Ha KOAa, o6iua cwcreMa OTTunoBe, ynpaB- 
/leHwe Ha naMeira, MacuBM, KO/ieKui/iw, cmmbo/ihm HM30Be v\ Ap.), KaKTO v\ 
no3HaBaHe Ha necro M3no/i3BaHkiTe TexHO/iorww - ADO.NET (3a AOCTbn ao 
6a3M otashhh), Windows Forms (3a npi/i/io>KeHi/m c rpacpwueH noTpe6MTe/iCKM 
MHTepcpewc), ASP.NET (3a ye6 npi/i/io>KeHi/m v\ ye6 yc/iyrw) v\ AP- 

ritpBUflT tom Ha KHuraTa o6xBaiua ocHOBHMTe KOHU.enu.wn b .NET nporpaMM- 
paHeTO (ot e3MKa C# ao ADO.NET), a BTopi/mT - no-cno>KHMTe TexHO/iorww 
KaTO Windows Forms, ASP.NET, ye6 ycnyri/i, hmujkm, Mpe>KOBO nporpaMnpaHe, 
curypHOCT v\ AP- 

BtB BTopufl tom ce o6p"h>ma BHMMaHne Ha c"b3AaBaHeT0 Ha rpacpwueH noT- 
pe6nTe^CKM MHTepcpewc c Windows Forms v\ ye6-6a3npaHM npw/io>KeHi/m c 
ASP.NET. IHe 6"bAaT pa3r/ieAaHki v\ hakom no-cno>KHki KOHuenunn KaTO OTpa- 
>KeHne Ha TunoBeTe, cepkia/iki3au.wfl, mhotohmiukobo nporpaMnpaHe, ye6 
ycnyri/i, OTAa/ieneHO M3BMKBaHe Ha mctoam (remoting), B3anM0AeMCTBne c 
HeynpaB/iflBaH koa, aceM6/ii/iTa, ynpaB/ieHkie Ha CkirypHOcrra, no-Ba>KHM 
MHCTpyMeHTM 3a pa3pa6oTKa v\ AP- U-le 6"bAe pa3r/ieAaHa v\ CBo6oAHaTa 
MMn^eMeHTaunfl Ha .NET Framework 3a Linux v\ Apyrn onepaunoHHM CMCTeMM 
Mono. HaKpaa me 6"bAe onucaHa pa3pa6oTKaTa Ha eAHH ua/iocreH npaKTM- 
4ecKM npoeKT, komto o6xBaiua bcm^km no-Ba>KHi/i TexHO/iorkiw v\ AeMOHcrpwpa 
Ao6pnTe npaKTMKM npn M3rpa>KAaHeT0 Ha .NET npw/io>KeHi/m. 

OoKycbT e BT*pxy .NET Framework 1.1 

Bcm4km TeMM ca 6a3npaHM Ha .NET Framework 1.1, Visual Studio .NET 2003 v\ 
MS SQL Server 2000. 3a cbwa/ieHi/ie no BpeMe Ha M3roTBAHeTO Ha TeKCTa Ha 
KHuraTa (npe3 2004-2005 r.) Bepcua 2.0 Ha .NET n/iaTCpopMaTa eABa npoxo>K- 
Aaiue m TOBa Ha/io>Kki p,a He 6"bAaT BK/iK>neHi/i HOBOCTMTe ot Hero. 

HaAflBaMe ce b cneABamoTO M3AaHne Ha KHuraTa aBTopcKM^T KO/ieKTkiB p,a 
HaMepn BpeMe v\ cv\nv\ p,a o6hobm cbAtpwaHkieTO c HOBOCTMTe ot .NET 2.0 v\ p,a 
OTnpaBM noMefl KbM .NET 3.0. 

KaK e npeflCTaBeHa MH4>opMaiJiii$iTa? 

BtnpeKM ro^eMMfl 6pow aBTopn, ctaBTopn v\ peAaKTopn, ctm^bt Ha TeKCTa b 
KHuraTa e M3K/iK>nkiTe/iHO AOCTbneH. CbAtpwaHi/ieTO e npeACTaBeHO b Ao6pe 
CTpyKTypupaH bma, pa3Ae/ieHO c MHOxecTBO 3ar/iaBi/m v\ noA3ar/iaBi/m, KoeTO 
no3BO^ABa ziecHOTO My B"b3npneMaHe, KaKTO v\ 6"bp30TO TbpceHe Ha MHCpop- 
Maunfl b TeKCTa. 



nporpaMnpaHe 3a .NET Framework (tom 2) 35 

HacToaiuaTa KHura e HanncaHa ot nporpaMMCTM 3a nporpaMMCTM. ABTopnTe ca 
fleMCTBaiun cocpTyepHM pa3pa6oT4nun, xopa c pea/ieH onuT KaKTO b pa3pa- 
6oTBaHeTO Ha cocpTyep, TaKa v\ b o6yneHMeTO no nporpaMi/ipaine. E/iaroAape- 
Hue Ha TOBa KanecmoTO Ha M3/io>KeHMeTO e Ha mhoto bmcoko hmbo. 

Bcmukm aBTopn sicho cb3HaBaT, ne npuMepHMAT cope KOfl e eflHO ot Haw- 
Ba>KHMTe Heiua b eflHa KHura 3a nporpaMnpaHe. MMeHHO nopaflu Ta3M npn^n- 
Ha TeKCTtT e cbnpoBOfleH c mhoto, mhoto npuMepn, M/uocrpauMM v\ KapTMHKM. 

B"bo6iue hakom neTe nv\ TeKcra, KoraTO MMa flo6"bp v\ aceH npuMep? noBeneTO 
nporpaMMCTM ntpBO vi\ep,aT p,anw npMMeptT me mm CBtpujM pa6oTa, m caMO 
aKO Heiuo He e acho, ce 3anMTaT b TeKCTa (TOBa BCtiuHOCT He e HMKaK Ao6pa 
npaKTMKa, ho TaKaBa e pea/iHOOTa). Eto 3aiuo mhototo m flo6pe nofl6paHM 
npMMepM ca eAMH ot HaM-Ba>KHMTe npMHUMnM, 3anernanv\ b Ta3M KHMra. 

nor/iefl kt>m cbAi>p>KaHMeTO Ha BTopiin tom 

KHMraTa ce cbctom ot 29 r/iaBM, komto nopaAM ro/ieMMa o6eM ca pa3p,enenv\ b 
ABa TOMa. Tom 1 cbAtpwa ntpBMTe 14 MaBM, a tom 2 - ocraHa/iMTe 15. ToBa 
Ba>KM caMO 3a xapTMeHOTO M3AaHMe Ha KHMraTa. B e/ieKTpoHHMfl BapMaHT ta ce 
pa3npocTpaHABa KaTO eAHO uh/io. 

HeKa HanpaBMM KpaTbK nper/ieA Ha BCHKa eAHa ot r/iaBMTe m p,a ce 3ano3HaeM 
c HeMHOTO c"bA"bp>KaHMe, 3a p,a pa36epeM iokbo hm onaKBa no-HaTaT"bK. T/ia- 
BMTe ot BTopMfl tom MO>KeTe p,a HaMepMTe b HacTOfliuoTO M3AaHMe, a ocraHa- 

/lMTe - B ntpBM TOM. 

T/iaBa 15. rpa4>MHeH noTpe6nTe/iCKM MHTep4>eftc c 
Windows Forms 

B rnaea 15 ce pa3r/ie>KAaT cpeACTBaTa Ha Windows Forms 3a cb3AaBaHe Ha 
npo3ope4HO-6a3MpaH rpacpM^eH noTpe6MTe/iCKM MHTepcpekic (GUI) 3a .NET 
npM^oxeHMflTa. npeAcraBAT ce nporpaMHMAT MOAe/i Ha Windows Forms, Hero- 
BMTe 6a30BM kohtpo/im, cpeACTBaTa 3a c"b3AaBaHe Ha npo3opuM, p,v\ai\03v\, 

MeHKDTa, ZieHTM C MHCTpyMeHTM M CTaTyC ZieHTM, KaKTO M HflKOM nO-C/10>KHM 

KOHuenuMM KaTo: MDI npM^oxeHMfl, data-binding, Hac/ieAflBaHe Ha cpopMM, 
xoctmht Ha kohtpo^m b Internet Explorer, pa6oTa c hmujkm bbb Windows 
Forms m AP- 

Abtopm Ha r/iaBaTa ca PaAOcnaB MBaHOB (no-ro/iyiMaTa nacr) m Cb6t/imh 
HaKOB. TeKCTtT e 6a3MpaH Ha zieKUM^Ta Ha CBeT/iMH HaKOB no cbujaTa TeMa. 
PeAaKTopM ca Cbbt/imh HaKOB m ri/iaMeH Ta6aKOB. 

T/iaBa 16. l/l3rpa>KflaHe Ha ye6 npn.no>KeHMfl c 
ASP.NET 

B r/iaBa 16 ce pa3r/ie>KAa pa3pa6oTKaTa Ha ye6 npM/io>KeHMfl c ASP.NET. 
ripeACTaBAT ce nporpaMHMHT MOAe/i Ha ASP.NET, ye6 cpopMMTe, koa^t 3aA tax, 
>KM3HeHMAT uMKb/i Ha ye6 npM^O>KeHMflTa, pa3^M4HMTe TMnOBe KOHTpO/lM M 

TexHMTe c"b6MTMfl. rioKa3Ba ce KaK ce Ae6"brBaT m npocneAflBaT ye6 npM/io- 



36 nporpaMnpaHe 3a .NET Framework (tom 2) 

>KeHMfl. OjRenn ce BHMMaHne Ha Banv\p,au,v\f\ja Ha ashhm, BtBefleHM ot noTpe- 
6v\Tenn. Pa3Me>Kfla ce KOHuenunaTa 3a ynpaB/ieHMe Ha cbcroyiHi/ieTO Ha o6eK- 
TMTe - View State v\ Session State. fleMOHCTpupa ce KaK MoraT p,a ce BM3ya- 
^M3npaT m peAaKTupaT ashhm, cbxpaHHBaHM b 6a3a ot ashhm. flucKyTupaT ce 
pa3rp"biuaHeTO v\ KOHCpurypupaHeTO Ha ASP.NET ye6 npn^OKeHMATa b Internet 
Information Server (IIS) v\ CMrypHOcrra npn ye6 npn^OKeHMATa. 

Abtopm Ha r/iaBaTa ca MMxaM/i Ctomhob, Poc/iaH BopucoB, CrecpaH flo6peB, 
fleyiH BapneB, MBaH MMTeB v\ Xpmcto fleiueB. TeKcrvr e 6a3npaH Ha zieKuwflTa 
Ha MMxaM/i Ctomhob no cbiuaTa TeMa. PeflaKTopn ca V\sau MMTeB v\ Unaweu 
Ta6aKOB. 

Ta3M r/iaBa 6eiue Haki-o6eMHaTa, Haw-TpyflHaTa v\ HaM-6aBHO HanncaHaTa. 
riopaAM hakom npo6/ieMHM CMTyaunn b aBTopcKMfl KO^eKTMB ce Ha/10>KM Ha 
hhkojiko nvrii fla ce CMeHsiT aBTopnTe v\ TOBa pea/iHO 3a6aBM ue/iMfl btopm 
tom. 3a paflOCT bcmuko npMK/uouM ycneiuHO. 

T/iaBa 17. MHoroHMiiJKOBO nporpaMMpaHe m 

CMHXpOHM3aLlMfl 

B r/iaBa 17 ce pa3r/ie>KAa MHorosaAanHOora b cbBpeMeHHMTe onepaunoHHM 
cucTeMM m cpeflCTBaTa 3a napa/ie/iHO ki3n"b/iHeHkie Ha nporpaMeH koa, komto 
.NET Framework npeflocraBfl. 06p"biua ce BHMMaHne Ha HMUJKMTe (threads), 
TexHMTe cbcroflHMfl m ynpaB/ieHMeTO Ha TexHua >KM3HeH uMKb/i - CTapTupaHe, 
npucnuBaHe, cb6y>KflaHe, npeKpaT^BaHe v\ AP- 

Pa3Me>KAaT cpeAcmaTa 3a cnHxpoHM3aunfl Ha hmujkm npn Aocrbn ao o6lum 
AaHHM, KaKTO m HanMHMTe 3a M34aKBaHe Ha 3aeT pecypc v\ HOTucpuKauna npn 
ocBo6o>KAaBaHe Ha pecypc. 06p"biua ce BHMMaHne KaKTO Ha cnHxpoHM3aunoH- 
HMTe o6eKTM b .NET Framework, TaKa v\ Ha HeynpaB/isiBaHMTe cnHxpoHM3aun- 
ohhi/i o6eKTM ot onepau.MOHHaTa CMcreMa. 

M3flCHflBa ce KOHuenunaTa 3a pa6oTa c BrpaAeHMfl b .NET Framework ny/i ot 
hmujkm (thread pool), HanMHMTe 3a acMHxpoHHO M3n"bJiHeHMe Ha 3aAanM, cpeA- 
CTBaTa 3a kohtpoji HaA taxhoto noBeAeHMe m npenoptuBaHMTe npaKTMKM 3a 
pa6oTa c tax. 

Abtop Ha rjiaBaTa e A/ieKcaHAtp PyceB. TeKCTbT e 6a3MpaH b ro/iHMaTa cm 
nacr Ha jieKUMATa Ha MMxaMJi Ctomhob m aBTopcKMTe 6ejie>KKM b Hea. peAaK- 
topm ca MBaH MMTeB, TeoprM MMTeB, TeoprM MMTeB, 9\h\a TeoprMeB m Mmh^o 
Ko/ieB. 

T/iaBa 18. Mpe>KOBO m 1/lHTepHeT nporpaMMpaHe 

B rjiaBa 18 ce pa3rjie>KAaT hakom ochobhm cpeAcma, npeAJiaraHM ot .NET 
Framework 3a MpewoBO nporpaMMpaHe. TjiaBaTa 3anonBa etc cbBceM KpaTKO 
BtBeAeHMe b npMHUMnMTe Ha pa6oTa Ha CbBpeMeHHMTe KOMniOTbpHM Mpe>KM m 
Ha 1/lHTepHeT m npoAt/waBa c npoTOKOJiMTe, npe3 komto ce ocbiuecTBABa Mpe- 
>KOBaTa KOMyHMKauMfl. 06eKT Ha AncKycMfl ca KaKTO KJiacoBeTe 3a pa6oTa c 
TCP m UDP coKeTM, TaKa m hakom KJiacoBe, npeA/iaraiuM no-cneuMCpM4HM B"b3- 
mo>khoctm, KaTO npeAcraBAHe Ha IP aApecM, M3n"bJiHABaHe Ha DNS 3a^BKM m 



nporpaMnpaHe 3a .NET Framework (tom 2) 37 

flp. B Kpaa Ha r/iaBaTa me ce npeflcraBsiT cpeflCTBaTa 3a M3B/ikmaHe Ha ye6- 
pecypcn ot MHTepHeT v\ Ha K/iacoBeTe 3a pa6oTa c e-mail b .NET Framework. 

Abtopm Ha r/iaBaTa ca MBai/i/io Xpmctob v\ Teoprn rieHneB. TeKCTvr ujmpoko 
M3no^3Ba zieKUkiflTa Ha MBai/i/io Xpmctob no cbujaTa TeMa. PeflaKTopn ca 
BeHunc^aB rionoB, CTecpaH HaHKOB, /l"bne3ap TeoprneB v\ Teoflop CToeB. 

T/iaBa 19. OTpawemie Ha TwnoBeTe (Reflection) 

B r/iaBa 19 ce npeflcraBsi noHsrn/ieTO Global Assembly Cache (GAC) v\ OTpa- 
>KeHne Ha Ti/moBeTe (reflection). Pa3r/ie>KAaT ce HanwHkiTe 3a 3ape>KflaHe Ha 
aceM6/iw. fleMOHCTpupa ce KaK MO>xe fla ce i/i3B/iene MHCpopMauna 3a TunoBeTe 
b flafleHO aceM6/iw v\ 3a n/ieHOBeTe Ha flafleH Tun. Pa3r/ie>KflaT ce HanwHki 3a 
AMHaMkinHO M3BMKBaHe Ha 4/ieHOBe ot flafleH Tun. 06flCHHBa ce KaK Mowe fla 
ce C"b3flafle eflHO aceM6/ii/i, fla ce flecpMHupaT TunoBe b Hero v\ aceM6/ikiTO fla 
ce 3ankiuje bbb cpaw/i no BpeMe Ha i/i3n"b/iHeHkie Ha nporpaMaTa. 

Abtop Ha r/iaBaTa e fluMMTbp KaHeB. TeKCTbT e 6a3npaH Ha /leKuwsiTa Ha 
MBaw^o Xpmctob no cbujaTa TeMa. PeflaKTop e CBeT/iMH HaKOB. 

T/iaBa 20. Cepnann3aMnq Ha aaHHM 

B MaBa 20 ce pa3r/ie>Kfla cepna^M3aunflTa Ha flaHHM b .NET Framework. 
06acHflBa ce KaKBO e cepwa/iki3aui/ifl, 3a KaKBO ce M3no/i3Ba v\ KaK ce kohtpo- 
ziwpa npouectT Ha cepkia/iM3aukm. Pa3r/ie>KflaT ce BMflOBeTe cpopMaTepn 
(formatters). 06acHflBa ce KaKBO e XML cepna^M3aunfl, KaK pa6oTM th m KaK 
MO>Ke fla ce KOHTpo/iwpa i/i3xoflHi/mT XML npn HeMHOTO i/i3no/i3BaHe. 

Abtop Ha r/iaBaTa e PaflocnaB MBaHOB. TeKCTbT e 6a3npaH Ha neK\\v\s\Ta Ha 
Mi/ixai/i/i Ctomhob no ctiuaTa TeMa. PeflaKTop e CBeT/ii/m HaKOB. 

T/iaBa 21. Ye6 yc/iyrw c ASP.NET 

B r/iaBa 21 ce pa3r/ie>KflaT ye6 ycnyrwTe, taxhoto M3rpa>KflaHe v\ KOHcyMauna 
npe3 ASP.NET v\ .NET Framework. 06eKT Ha flucKycua ca ocHOBHMTe TexHO/io- 
vvha, CB"bp3aHM c ye6 ycnyrwTe, v\ npwuwHaTa Te fla ce npeBtpHaT b craHflapT 
3a MHTerpaunfl v\ Me>Kflyn/iaTCpopMeHa KOMyHMKauna. npeflcraBflT ce pa3;ikmHki 
cueHapnn 3a M3no/i3BaHeTO mm. Pa3r/ie>Kfla ce nporpaMHu^T MOfle/i 3a ye6 
ycnyrw b ASP.NET m cpeflCTBaTa 3a taxhoto M3rpa>KflaHe, ki3n"b/iHeHkie v\ pa3- 
rptiuaHe (deployment). HaKpaa ce flucKyTupaT hakom necro cpeiuaHM 
npo6/ieMM m yTBtpfleHM npaKTMKM npn pa3pa6oTKaTa Ha ye6 ycnyri/i npe3 .NET 
Framework. 

Abtopi/i Ha r/iaBaTa ca CTecpaH flo6peB v\ fl,ef\n BapneB. B TeKcra ca M3no/i- 
3BaHM MaTepna^n ot neKuv\nja Ha CBeT/ikiH HaKOB no cbiuaTa TeMa. TexHM- 
4ecKM peflaKTop e MapTMH Ky/iOB. 



38 nporpaMnpaHe 3a .NET Framework (tom 2) 

T/iaBa 22. OTfla/ieneHO M3BMKBaHe Ha MeTOflM 
(Remoting) 

B MaBa 22 ce pa3r/ie>Kfla MHCppacrpyKTypaTa 3a OTAa/ieneHM M3BMKBaHMfl, 
koato .NET Framework npeAOcraBa Ha pa3pa6oT4MUMTe. 06acHflBaT ce ocho- 
BMTe Ha Remoting TexHO/iornaTa v\ BceKM eAHH ot HeMHMTe KOMnoHeHTu: 
KaHa^n, cpopMaTepn, OTAa/ieneHki o6eKTM v\ aKTMBauna. flucKyTupaT ce pa3/iw- 
KMTe Me>KAy pa3/iwnHHTe TunoBe OTfla/ieneHki o6eKTM. 06acHflBaT ce TexHMAT 
>KM3HeH umcb/i m BMAOBeTe Mapuja/ii/i3aui/ifl. CrbriKa no crbnKa ce Aocmra p,o 
cb3flaBaHeTO Ha npuMepeH Remoting cbpBtp v\ K/iweHT. HaKpaa ce npeflcraBa 
eAMH rtBKaB m npaicmneH HanwH 3a KOHCpurypupaHe Ha u*i/iaTa Remoting 
MHCppacTpyKTypa npe3 KOHCpurypaunoHHM cpaw/iOBe. 

Abtop Ha r/iaBaTa e Bmktop Xmbkob. B TeKCTa ca i/i3no/i3BaHi/i MaTepna/in ot 
^eKUMATa Ha CBeT/iMH HaKOB. PeflaKTopn ca MBaH MuTeB v\ CsejiwAu HaKOB. 

T/iaBa 23. B3anMOfleMCTBne c HeynpaB/isiBaH koa 

T/iaBa 23 pa3r/ie>KAa KaK MO>xeM p,a pa3UJnpnM Bt3MO>KHOCTMTe Ha .NET 
Framework npe3 ynoTpe6a Ha npeflocTaBeHMTe ot Windows npi/i/io>KHi/i npor- 
paMHM MHTepcpewcM (API). flucKyTupaT ce cpeflCTBaTa 3a M3BMKBaHe Ha cpyHK- 
UMOHa^HOCT ot AHHaMM^HM Win32 6n6^MOTeKM m Ha npo6/ieMMTe c npeo6pa3y- 
BaHeTO (Mapuja^M3aunflTa) Me>KAy Win32 v\ .NET TunoBeTe. 

06p"bma ce BHMMaHne Ha Bp"b3KaTa Me>KAy .NET Framework v\ COM (KOMno- 
HeHTHMAT MOAe/i Ha Windows). Pa3r/ie>KflaT ce KaKTO M3BMKBaHeTO Ha COM 
o6eKTM ot .NET koa, TaKa v\ pa3KpnBaHeTO Ha .NET KOMnoHeHT KaTO COM 
o6eKT. fleMOHCTpupa ce v\ TexHO/iornaTa IJW 3a M3no/i3BaHe Ha HeynpaB/isiBaH 
KOfl ot nporpaMM, HanncaHM Ha Managed C+ + . 

Abtop Ha r/iaBaTa e MapTMH Ky/iOB. TeKCTbT e 6a3npaH Ha HeroBaTa j\eK\\v\n 
no ctiuaTa TeMa. TexHi/mecKki peflaKTop e ra/ikm M/iweB. 

T/iaBa 24. YnpaB/ieHMe Ha naMeTTa m pecypcMTe 

B r^aBa 24 ce pa3r^e>Kfla nucaHeTO Ha npaBki/ieH v\ ecpeKTMBeH koa no otho- 
weHkie M3no^3BaHeTO Ha naMeTTa v\ pecypcMTe b .NET Framework. B Hana/iOTO 
ce npaBM cpaBHeHne Ha npeAHMCTBaTa v\ HeAOcraTbui/iTe Ha ptuHOTO v\ aBTO- 
MaTM^HOTO ynpaB/ieHkie Ha naMeT i/i pecypcu. Cnep, TOBa ce pa3r/ie>KAa no- 
o6ctomho aBTOMaTM^HOTO mm ynpaB/ieHkie c cpOKyc Haw-Bene Btpxy cwcreMaTa 
3a no4MCTBaHe Ha naMeTTa b .NET (t. Hap. garbage collector). 06p-biua ce 
BHMMaHne Ha B3anMOAeMCTBneTO c Hea v\ npaKTMKMTe, c komto MO>xeM p,a v\ 

nOMOTHeM AS pa60TM B"b3MO>KHO Haw-ecpeKTMBHO. 

Abtopm Ha r/iaBaTa ca Ctoah flaMOB v\ flMMMTtp BoHeB. TexHkinecKki peAaKTop 
e CsejiwAu HaKOB. 



nporpaMnpaHe 3a .NET Framework (tom 2) 39 

T/iaBa 25. AceM6/iMTa vx pa3npocTpaHeHne 
(deployment) 

B r/iaBa 25 ce pa3r/ie>KAa Hafi-Ma/iKaTa cbcraBHa nacr Ha .NET npn^OKeHMATa 
- aceM6/iw, pa3/iMHHMTe TexHMKM 3a pa3npocTpaHeHne Ha rcrroBi/m cocpTyepeH 
npoAyKT Ha K/iweHTCKkiTe pa6oTHM CTaHunn v\ hhkom M36paHM TexHMKM 3a 
c"b3flaBaHe Ha MHcra/iau.MOHHM naKeTM v\ KanaHMTe, 3a komto Tpa6Ba fla ce 
BHMMaBa npn cb3AaBaHe Ha MHCTa/iau.MOHHM naKeTM. 

Abtop Ha Ta3M MaBa e ra/iMH 1/1/iMeB. B TeKCTa e i/i3no/i3BaHa nacrMUHO 
^eKUMATa Ha MMxaM/i Ctomhob. PeAaKTop e flBop Ruee. 

T/iaBa 26. CnrypHOCT b .NET Framework 

B r/iaBa 26 ce pa3r/ie>Kfla KaK .NET Framework noflnoMara curypHOCTTa Ha 
ct3AaBaHMTe npn^OKeHMa. ToBa BK/iiouBa KaKTO 6e3onacHOCT Ha TunoBeTe i/i 
3aiunTa Ha naMeTTa, TaKa v\ cpeflCTBaTa 3a 3aiunTa ot ki3n"b/iHeHkie Ha He>xe- 
/iaH koa, aBTeHTMKaunfl m OTopn3aunfl, e^eKTpoHeH noflnnc v\ KpunTorpacpna. 
Pa3Me>KAaT ce TexHO/iorMMTe Ha .NET Framework KaTO Code Access Security, 
Role-Based Security, CM/iHO-MMeHyBaHM aceM6/ii/iTa, uncppoBO noflnncBaHe Ha 
XMLflOKyMeHTM (XMLDSIG) v\ Apyrn. 

Abtopm Ha r/iaBaTa ca Toflop Ko/ieB v\ Bacw/i EaKa/iOB. B TeKCTa e ujmpoko 
M3no^3BaHa zieKUMsiTa Ha CBeT/iMH HaKOB no ctiuaTa TeMa. TexHMnecKM 
peAaKTop e CraHMC/iaB 3/iaTMHOB. 

T/iaBa 27. Mono - CBo6oflHa MMnsieMeHTauiiifi Ha .NET 

B r/iaBa 27 ce pa3r/ie>KAa eAHa ot a/iTepHaTMBMTe Ha Microsoft .NET 
Framework - npoeKTbT c OTBopeH koa Mono. 06acHflBaT ce HaKpaTKO HanM- 
HMTe 3a kiHcra/ikipaHe v\ pa6oTa c Mono, i/i3no/i3BaHeTO Ha BrpafleHMTe TexHO- 
/lori/m ASP.NET v\ ADO.NET, KaKTO v\ Cb3AaBaHeT0 Ha rpacpMUHM npn^OKeHna. 
flaBaT ce v\ hhko/iko cbBeTM v\ npenoptKM 3a nucaHeTO Ha npeHOCMM koa. 

Abtopm Ha r/iaBaTa ca UBeTe/ikm AHApeeB v\ Ahtoh AHApeeB. TeKCTbT e 6a3M- 
paH Ha zieKUkiflTa Ha Ahtoh AHApeeB no cbiuaTa TeMa. TexHMnecKM peAaKTop e 
CBeT/ikiH HaKOB. KaTO peAaKTopn yuacmaT oiue Coha Bn6n^MK0Ba, MapTMH 
KnpnuoB, HkiKO^aki MkiTeB v\ A/ieKcaHAtp Hmko/iob. 

T/iaBa 28. IIomollihii MHCTpyMeHTM 3a .NET 
pa3pa6oTHiii4ii 

B MaBa 28 ce pa3r/ie>KAaT peAnua MHCTpyMeHTM, M3no/i3BaHM npn pa3pa6oT- 
KaTa Ha .NET npn^OKeHna. C TaxHa noMOiu MO>xe 3HanMTe/iH0 p,a ce y/iecHM 
M3n"b/iHeHweT0 Ha hhkom necro cpeiuaHM nporpaMMCTKn 3aAanM. M36poeHMTe 
MHCTpyMeHTM noMaraT 3a noBMiuaBaHe KanecrBOTO Ha KOAa, 3a yBe/iMnaBaHe 
npoAyKTMBHOCTTa Ha pa3pa6oTKa m 3a M36arBaHe Ha hakom TpaAMUMOHHM 
TpyAHOCTM npM noAAP"b>KKaTa. Pa3r/ie>KAaT ce b Rejawnw MHCTpyMeHTMTe .NET 
Reflector, FxCop, CodeSmith, NUnit (3aeAH0 c Aon-b/iHeHM5rra kbm Hero 
NMock, NUnitAsp m NUnitForms), log4net, NHibernate m NAnt. 



40 nporpaMnpaHe 3a .NET Framework (tom 2) 

Abtopm Ha MaBaTa ca MBaH MuTeB v\ Xpmcto fleiueB. TeKCTbT e no TexHM 
aBTopcKM MaTepna^n. PeflaKTopn ca Teoflopa riy/ieBa v\ Eopwc/iaB HaHOBCKM. 

r/iaea 29. npaKTimecKM npoeKT 

B r/iaBa 29 ce flucKyTupa KaK MoraT fla ce npw/io>KaT Ha npaKTMKa TexHO- 
j\ovv\v\je, pa3MeflaHM b npeflxoflHMTe TeMM. nocraBeHa e 3a,qana fla ce pa3- 
pa6oTM eflMH cepno3eH npaKTwuecKki npoeKT - cwcreMa 3a 3ano3HaHCTBa b 
1/lHTepHeT c B"b3MO>KHOCT 3a ye6 m GUI flocrbn. 

ripn pea^M3aunflTa Ha ci/icreMaTa ce npeMi/maBa npe3 BCkmKMTe cpa3M ot pa3- 
pa6oTKaTa Ha cocpTyepHM npoeKTu: aHa/iki3kipaHe v\ flecpMHupaHe Ha M3MCKBa- 
HMATa, M3roTBAHe Ha cucTeMHa apxnTeKTypa, npoeKTupaHe Ha 6a3a ot flaHHM, 
MMn/ieMeHTauwfl, TecTBaHe v\ BHeflpaBaHe Ha cwcreMaTa. 

ripi/i M3roTBAHe Ha apxnTeKTypaTa npM/io>KeHMeTO ce pa3fle/i*i Ha Tpn c/ioa - 
6a3a ot flaHHM (koato ce pea/ii/i3kipa c MS SQL Server 2000), 6n3Hec c/iom 
(komto ce pea/iki3kipa KaTO ASP.NET ye6 ycnyra) v\ K/iweHTCKki cnov\ (komto ce 
pea/iM3wpa ot flBe npi/i/io>KeHi/m - ASP.NET ye6 K/iweHT v\ Windows Forms GUI 

K/lkieHT). 

P"bKOBOflMTe/i Ha npoeKTa e MBaw^o Xpmctob. Abtopm Ha npoeKTa ca: MBaki/io 
Xpmctob (oTroBopeH 3a Windows Forms K/iweHTa), Toflop Ko/ieB v\ V\Bav\no 
/Immob (OTroBopHM 3a ye6 ycnyraTa v\ 6a3aTa flaHHM) v\ BpaHMMnp AHre/iOB 
(OTroBopeH 3a ASP.NET ye6 K/iweHTa). MHCTa/iaToptT Ha npoeKTa e cb3flafleH 
ot ra/ikm M^neB. TexHkmecKki peflaKTopn Ha KOfla ca MapTMH Ky/iOB, CsejiwAu 
HaKOB, CrecpaH flo6peB v\ ,ZJ,e5iH Bap^eB. 

Abtopm Ha TeKCTa ca MBaw^o Xpmctob, Toflop Ko/ieB, 1/lBaw/io Ammob m 
BpaHMMnp AHre/iOB. TexHi/mecKi/i peflaKTop e MBaH MuTeB. PeflaKTop Ha 
TeKCTa e Bepa Mo/i/iOBa. 

ABTOpCKMflT KO/ieKTMB 

ABTopcKMAT KO^eKTMB ce cbCTOM ot Hafl 30 flyujn - aBTopn, cbaBTopw, peflaK- 
Topn m flpyrn. IHe npeflcraBMM BceKM ot tax c no hako/iko i/i3peneHi/ifl (nofl- 
pefl6aTa e no a36yneH pefl). 

AsieKcaHA'bp Pycee 

A^eKcaHfltp PyceB e nporpaMMCT bbb cpupMa Johnson Controls ( www.jci.com '), 
KbfleTO ce 3aHMMaBa c pa3pa6oTKa Ha cocpTyep 3a zieKki aBTOMo6n/in. 3aB"bp- 
\nv\n e TexHM^ecKM yHMBepcuTeT - Cocpua, cneuwa/iHOCT KOMniOTbpHki cucTeMM 
m TexHO^ornn. A^eKcaHfltp ce e 3aHkiMaBa/i v\ c pa3pa6oTKa Ha cocpTyep 3a 
Mo6ki/iHki Te/iecpOHM. ripocpecMOHa/iHMTe My MHTepecu bkiwoubst Java TexHO/10- 
rnnTe m .NET n/iaTCpopMaTa. Mo>KeTe fla ce CB"bp>KeTe c A/ieKcaHfltp no e-mail: 
arussev@qmail.com . 



nporpaMnpaHe 3a .NET Framework (tom 2) 41 

A/ieKCaHA'bp Xafl>KMKpiDCTeB 

A/ieKcaHfltp Xafl>KMKp"bCTeB e cocpTyepeH apxwTeicr etc cepno3eH onuT b 
o6/iacn"a Ha npoeKTupaHeTO v\ pa3pa6oTKaTa Ha ye6 6a3npaHM cucTeMM v\ e- 
commerce npn^o>KeHM5i. Tom e cbTpyflHMK v\ KOHcy/iTaHT Ha PC Magazine 
Bt^rapufl ( www.saqabq.net/PCMaqazine/ ') v\ noneTeH n/ieH Ha 5"b/irapci<aTa 
acounaukifl Ha cocpTyepHMTe pa3pa6oT4nun ( www.devbq.org '). A/ieKcaHfltp 
MMa flt/irorofli/iweH onuT KaTO ptKOBOflkiTe/i Ha cocpTyepHM npoeicrw bbb 
cpupMM, 6a3npaHM b Et/irapi/ifl v\ CkW\. ripocpeci/iOHa/iHi/iTe My MHTepecu ca 
CB"bp3aHki c npoeKTupaHeTO v\ M3rpa>KflaHeT0 Ha .NET npi/i/ioxeHi/m, pa3pa6oT- 
BaHeTO Ha eKcnepTHM cucTeMM v\ cocpTyep 3a ynpaB/ieHkie v\ aBT0MaTM3aunfl Ha 
6n3Hec npouecn. 

Ahtoh AHflpeeB 

Ahtoh AHflpeeB pa6oTM KaTO ASP.NET ye6 pa3pa6oT4MK bbb cpwpMa Elements 
of Art ( www.eoa.bg '). Tom ce MHTepecyBa ce ot bcmuko, CB"bp3aH0 c KOMmoT- 
puTe m Haw-Be^e c .NET v\ Linux. KaTO yueHkiK ce e 3aHkiMaBa/i c a/iropi/iTMM v\ 
e yuacrBa/i b o/iMMnwaflw no MHCpopMaTMKa. 3aB"bpujki/i e MaTeMaTkmecKa tmm- 

Ha3Mfl M e3MK0Ba rMMHa3Mfl C aHMMMCKM e3MK, a B MOMeHTa e CTyfleHT B 

cneuna/iHOCT MHCpopMaTMKa bbb OaKy/iTeTa no MaTeMaTMKa v\ MHCpopMaTMKa 
(OMM) Ha CocpMMCKM yHMBepcuTeT "Cb. K^MMeHT Oxpmackm". Pa6oTki/i e v\ 
KaTO cucTeMeH aAMMHMCTpaTop BtB OMM m cera npofl"b/i>KaBa fla noflnoMara 
npoeKTMTe Ha cpaKy/ueTa, pa3pa6oTBawKi/i hobm caMTOBe. HeroBMAT ziwueH 
caMT e AOCTbneH ot aApec: http://debian.fmi.uni-sofia.bg/~toncho/portfolio/ . 
Mo>KeTe fla ce CBtpweTe c Ahtoh no e-mail: anton.andreev@fmi.uni-sofia.bg . 

BpaHMMMp AHre/iOB 

EpaHMMnp AHre/iOB e cocpTyepeH pa3pa6oTni/iK bbb cpupMa Gugga 
( www.gugga.net ) v\ CTyfleHT bbb OaKy/iTeTa no MaTeMaTMKa v\ MHCpopMaTHKa 
Ha CocpMMCKM yHMBepcuTeT "Cb. K/ii/iMeHT OxpuflCKn", cneu.ua/iHOCT KOMnio- 
TtpHM HayKM. HeroBMTe npocpecwoHa/iHi/i MHTepecu ca b o6/iacrTa Ha o6eKTHO- 
opueHTupaHMfl aHa/iki3, MOfle/iwpaHe v\ nporpaMnpaHe, ye6 TexHO/iorwMTe v\ b 
4acTH0CT M3rpa>KflaHeT0 Ha RIA (Rich Internet Applications) v\ pa3pa6oTKaTa 
Ha cocpTyep 3a mo6i/i/ihm ycrpowcTBa. EpaHMMnp e nene/iw/i rpaMOTM v\ otiwa- 
4MA ot pa3^M4HM c"bCTe3aHMfl, KaKTO m ntpBO MflCTO Ha HauwoHa/iHaTa o/imm- 
nuafla no MHCpopMaunoHHn TexHO/iorm/i, Ha koato e 61/1/1 v\ xypn rofli/ma no- 

K"bCHO. 

Bacn/i EaKa/iOB 

Bacw/i EaKa^OB e CTyfleHT, noc/iefleH Kypc, b AMepuKaHCKua yHMBepcuTeT b 
Et/irapwfl, cneu.ua/iHOCT MHCpopMaTMKa. Tom e npeflceflaTe/i Ha cryfleHTCKMH 
K/iy6 no MHCpopMaunoHHM TexHO^ornn m e cryqeHT-KOHcy/iTaHT Ha Microsoft 
E"b/irapi/m 3a yHMBepcuTeTa. B paMKMTe Ha K/iy6a ce 3aHMMaBa c ynpaB/ieHwe 
Ha npoeKTM v\ KOHcy/iTaunn no M3n"b/iHeHneT0 mm. KaTO CTyfleHT-KOHcy^TaHT 
Ha Microsoft E"b/irapwfl Bacn^ noflnoMara ycki/ikisiTa Ha Microsoft fla noflfl"bp>Ka 
THCHa Bpt3Ka etc CTyfleHTMTe v\ fla rn MHCpopMupa v\ o6y4aBa no Haw-HOBUTe v\ 



42 nporpaMnpaHe 3a .NET Framework (tom 2) 

npoflyKTM m TexHO^ornn. BacM/i pa6oTM v\ KaTO CbTpyqHMK Ha PC Magazine 
5"b/irapki*i ot hako/iko roflMHM v\ MMa peflnua CTaTMM v\ KOMeHTapn b M3fla- 
HkieTO. B yHMBepcuTeTa tom npefl/iara v\ M3roTBH n/iaH 3a Kypc no npaKTM- 
necKO M3y4aBaHe Ha po6oTMKa, KaTO pa3UJnpeHne Ha o6yneHMeTO no M3KycT- 
BeH MHTe^eKT, komto e oflo6peH m BHeflpeH. Tom pa6oTM v\ c hako/iko I/IT 
cpupMM, KtAeTO M3rpa>Kfla peiueHMfl, 6a3npaHM Ha .NET n/iaTCpopMaTa. ripnTe- 
xaBa nporJ>eci/iOHa/iHa cepTucpuKauna ot Microsoft. MoxeTe fla ce CBtpxeTe c 
BacM/i no e-mail: dotnetbook@vassil.info . 

BMKTOp >KHBKOB 

Bmktop Xmbkob e cocpTyepeH MHxeHep b 1/lHTepKOHcy/iT Et/irapMH 
( www.icb.bg '). B MOMeHTa e CTyfleHT b Cocpmmckm YHMBepcuTeT "Cb. K/immcht 
OxpnACKn", cneuna^HOCT MHCpopMaTMKa. npocpecMOHa/iHMTe My MHTepecu ca 
ochobho b o6/iacTra Ha peiueHMflTa, 6a3npaHM Ha cocpTyep ot Microsoft. 
BkiKTop MMa cepno3eH onuT b pa6oTaTa c .NET Framework, Visual Studio .NET 
m Microsoft SQL Server. Tom yuacrBa b npoeKTM 3a pa3/iMHHM MHCpopMaunoHHH 
CMCTeMM, r/iaBHO 3a HopBerna. H/ieHyBa b BAPC ot 2005 roflMHa. 3a Bp"b3Ka c 
BkiKTop MO>KeTe fla M3no/i3BaTe HeroBna e-mail: viktor.zh ivkov@qmail.com . 

fle^H Bapnee 

fleyiH BapneB e CTapiun ye6 pa3pa6oTHMK bbb cpupMa Vizibility 
( www.vizibility.net '). HeroBMTe OTroBopHOCTM BK/iK>nBaT npoeKTupaHeTO v\ 
pa3pa6oTKaTa Ha ye6 6a3npaHM npn^OKeHna, i/i3no/i3Bamki nocneflHMTe Tex- 
HO/iornn Ha Microsoft, npoynBaHe Ha HOBonoflBflBaiun ce TexHO/iornn v\ n/ia- 
HupaHe Ha taxhoto BHeflpyiBaHe b npon3BOflCTBOTO, KaKTO v\ o6yneHMe Ha 
hobm KO/ierM. HeroBMTe npocpecMOHa/iHM MHTepecu ca CB"bp3aHM tacho c 
TexHO^ornnTe Ha Microsoft - .NET n/iaTCpopMaTa, SQL Server, IIS, BizTalk v\ 
AP- fleflH e CTyfleHT no MHCpopMaTMKa bbb OaKy/iTeTa no MaTeMaTMKa v\ 

MHCpOpMaTMKa Ha COCpMMCKM yHMBepCMTeT "CB. K/lMMeHT OxpMflCKM". 

flMMMTbp EOHeB 

fluMMTbp BoHeB e cocpTyepeH pa3pa6oTnm< bbb cpupMa Formula Telecom 
Solutions ( www.fts-soft.com ). Tom OTroBapa 3a pa3pa6oTBaHeTO Ha ye6 6a3M- 

paHM npM^O>KeHMfl 3a KOpnOpaTMBHH K/lMeHTM, KaKTO M 3a HflKOM MOfly/lM M 

MHCTpyMeHTM, CB"bp3aHM c BtTpeujHMfl npou.ec Ha pa3pa6oTKa bbb cpupMaTa. 
ripocpecMOHa^HMTe My MHTepecu ca HaconeHki npeflMMHO kbm .NET n/iaTCpop- 
MaTa, MeTOflo^ornflTa extreme programming v\ cocpTyepHna flM3aMH. flMMMTtp 
e 3aB"bpujn^ BBBY 'T. BeHKOBCKn", cneu.Ma/iHOcr KOMniOTbpHa TexHMKa. Tom 
MMa 6oraT onMT b pa3pa6oTBaHeTO Ha cocpTyepHM peiueHMfl, npeflMMHO c Tex- 
HO^orMMTe Ha Microsoft m Borland. 

flMMMTbp KaHee 

flMMMTbp KaHeB e pa3pa6oT4MK Ha cocpTyep bbb cpMpMa MeflcocpT 
( www.medsoft.biz ). Tom e 3aB"bpujM/i OaKy/iTeTa no MaTeMaTMKa m MHCpopMa- 

TMKa Ha COCpMMCKM yHMBepCMTeT "CB. K/lMMeHT OxpMflCKM", cneuMa/iHOcr 



nporpaMnpaHe 3a .NET Framework (tom 2) 43 

MHCpopMaTMKa. npocpecMOHa^HMTe My MHTepecu ca ochobho b 06/iaoTa Ha 
peiueHMflTa, 6a3npaHM Ha cocpTyep ot Microsoft. flMMMTtp MMa cepno3eH onuT 
b pa6oTaTa c Visual Studio .NET, Microsoft SQL Server v\ VV\C CMcreMM. Pa6o- 
tm/1 e b npoeKTM 3a M3rpa>KflaHe Ha ro/ieMM MHCpopMaunoHHn CMcreMM, CBtp- 
3aHM c TMC peiueHMfl, v\ eKcnepTHM cucTeMM 3a m6amu.mhckm /ia6opaTopMM. 

ra/iMH M/iMee 

ra/iMH M/iMeB e ptKOBOfli/ue/i Ha npoeKTM v\ cocpTyepeH apxkueKT b 6"b/i- 
rapcKMfl ocpnc Ha Technology Services Consulting Group ( www.wordassist. 
com ). Ta^MH e yuacrBa/i b npoeKTupaHeTO v\ pa3pa6oTBaHeTO Ha ro/ieMM 
MHCpopMaunoHHM cucTeMM, MHTepHeT caMTOBe c ynpaB/ieHkie Ha cwvbpwa- 
HueTO, Aont/iHeHkifl v\ MHTerpauna Ha MS Office etc CMcreMM 3a ynpaB/ieHMe 
Ha AOKyMeHTM. Tom npnTe>KaBa CTeneH 6ai<a/iaB"bp no MeHMA>KM"bHT v\ MHCpop- 
MaunoHHM TexHO/iornn, a cbiuo m cepTMCpMKaunfl MCSD 3a Visual Studio 6.0 v\ 
Visual Studio .NET. Tom MMa cepno3eH onuT c pa6oTaTa c Visual Studio .NET, 
MS SQL Server, MS IIS v\ MS Exchange. /Im^hmat My caMT e AOCTbneH ot 
aApec www.qalcho.com , a e-mail aApecbT My e Iliev@qalcho.com . 

Teoprn neHnee 

Teoprn rieHneB e cocpTyepeH pa3pa6oTHMK bbb cpupMa Symex Bt/irapua 
( www.symex.bg ), KtAeTO OTroBapa 3a pa3pa6oTKa Ha cpMHaHCOBO opueHTM- 
paHM rpacpM4HM Java npn^OKeHna v\ Ha MHTepHeT cpuHaHCOBM nopTa/iM c Java 
m PHP. YuacTBa/i e b M3rpa>KAaHeT0 Ha npoAyKTM 3a c/ieAeHe v\ o6pa6oTKa Ha 
6opcoBM MHAeKCM m KOTupoBKM 3a E"b/irapci<aTa cpOHAOBa 6opca. Teoprn e 
cryqeHT no MHCpopMaTMKa bbb OaKy/iTeTa no MaTeMaTMKa v\ MHCpopMaTMKa Ha 
CocpMMCKM yHMBepcuTeT "Cb. K^MMeHT OxpnACKn". ripocpeci/iOHa/iHMTe m aKa- 
AeMM^HMTe My MHTepecu ca HaconeHM kbm Java v\ .NET TexHO/iorMMTe, 6momh- 
cpopMaTMKaTa, TeopeTMUHaTa MHCpopMaTMKa, M3KycTBeHM5i MHTe/ieKT v\ 6a3MTe 
ot 3HaHi/i*i. npe3 2004 v\ 2005 r. e acMcreHT b Kypca no "MHCpopMaunoHHM 
TexHO/iornn" 3a cryaeHTM c HapyiueHO 3peHne v\ b npaKTMnecKMH Kypc no 
"CTpyKTypn ot ashhh m nporpaMnpaHe" b Cocpmmckm yHMBepcuTeT. Mo>KeTe p,a 
ce CB-bp>KeTe c Teoprn no e-mail: pench wot@yahoo.com . 

MBaH MiiTeB 

MBaH MuTeB e cocpTyepeH pa3pa6oT4MK bbb cpupMa EON Technologies 
( www.eontechnoloqies.bg ). Tom e 3aB"bpujki/i OaKy/iTeTa no MaTeMaTMKa v\ 
MHCpopMaTMKa Ha Coc|dmmckm yHMBepcMTeT "Cb. K/iMMeHT Oxpmackm", cneu.Ma/i- 
hoct MHCpopMaTMKa. MBaH e yuacTBa/i b npoeKTMpaHeTO m pea/iM3au.MflTa Ha 
MHO>KecTBO MHCpopMauMOHHM CMCTeMM, ochobho TMC peweHMfl. ripocpecMOHa/i- 
HMAT My onMT e b pa3pa6oTKM npeAMMHO c npoAyKTM m TexHO/iorMM Ha 
Microsoft. OcHOBHMTe MHTepecM Ha MBaH ca b c"b3AaBaHeTO Ha KanecmeHM m 
ecpeKTMBHM cocpTyepHM peiueHMfl npe3 M3no/i3BaHeTO Ha noAxoA^iuM npaK- 
tmkm, TexHO^orMM m MHCTpyMeHTM. TexHMnecKM ye6/ior, KOMTO TOM noAAtpwa 
ot Hana/iOTO Ha 2004 roAMHa, e c aKueHT Btpxy .NET nporpaMMpaHeTO m e 
AOCTbneH Ha aApec http://immitev.bloqspot.com . Mo>KeTe p.a ce CB-bp>KeTe c 
MBaH no e-mail: immitev@qmail.com . 



44 nporpaMnpaHe 3a .NET Framework (tom 2) 

llBtaMSIO flMMOB 

MBaw/io /Immob e cocpTyepeH pa3pa6oTnm< bbb cpupMa Gugga 
( www.quqqa.com ). HeroBMTe MHTepecu ca b o6/iacrTa Ha o6eKTHO-opneHTM- 
paHOTO MOfle^npaHe, nporpaMnpaHe v\ aHa/iki3, 6a3MTe ot ashhh, ye6 npw/io- 
>KeHMATa m npn^o>KeHMfl, 6a3npaHM Ha Microsoft .NET Framework. B MOMeHTa 
1/lBaM/io e CTyAeHT bbb OaKy/ueTa no MaTeMaTMKa v\ MHCpopMaTMKa Ha Cocpi/m- 
ckm yHMBepcuTeT "Cb. K^MMeHT OxpuflCKn", cneu.ua/iHOCT KoMniOTbpHki HayKM. 
Tom e cepTucpnunpaH ot Microsoft pa3pa6oTni/iK v\ e nene/ii/i/i peflnua rpaMOTM 
m 0T^M4Mfl ot cbcre3aHi/m no nporpaMwpaHe. ripe3 2004 r. e no6eAHTe/i b 
HaunoHa^HaTa o/ikiMnwaAa no MHCpopMaunoHHn TexHO/iorm/i v\ e yuacrBa/i b 
>KypnTO Ha cbiuaTa o/ikiMnwaAa roflMHa no-KtCHO. 

MBaMJIO XpiiCTOB 

MBaw/io Xpmctob e npenoAaBaTe/i b Coc|dmmckm yHMBepcuTeT "Cb. K/ikiMeHT 
OxpuflCKn", K-bfleTO BOflM KypcoBe no 'TlporpaMkipaHe 3a .NET Framework", 
"KanecmeH nporpaMeH koa", "Yboa b nporpaMnpaHeTo", "06eKTHO-opneHTM- 
paHO nporpaMnpaHe" v\ "CrpyKTypki ot flaHHM b nporpaMnpaHeTo". HeroBMTe 
npocpecnoHa^HM MHTepecu ca b o6/iacn"a Ha .NET TexHO/iorwkiTe v\ MHTepHeT 
TexHO/iornnTe. KaTO yueHMK MBaw^o e yuacmkiK b peAnu.a Hau.MOHa/iHM cbcre- 
3aHMfl m KOHKypcn no nporpaMnpaHe v\ e HOCkiTe/i Ha npecTMXHn HarpaAH h 
OT/iwukifl. Tom yuacma b eKnn, pea/iki3kipa/i o6pa30BaTe/ieH npoeKT Ha 
Microsoft Research b o6/iacn"a Ha .NET Framework. JliiHHmrr caMT Ha V\Bav\no 
e AOCTbneH ot aflpec: www.ivaylo-hristov.net . 

/1a3ap KnpneB 

/la3ap KwpneB e 3aB"bpujki/i OaKy/iTeTa no MaTeMaTMKa v\ MHCpopMaTMKa Ha 

COCpMMCKM yHMBepCMTeT "CB. K/lMMeHT Oxpmackm" M B MOMeHTa e AUn/lOMaHT B 

cneuna^M3aunfl "MHCpopMaunoHHM cucTeMn". Tom pa6oTM b MHCTMTyTa 3a 
napa/ie/iHa o6pa6oTKa Ha MHCpopMaunaTa kbm BAH no cbBMecreH npoeKT 
Me>KAy OaKy/iTeTa no MaTeMaTMKa v\ MHCpopMaTMKa v\ BAH 3a M3rpa>KAaHe Ha 
grid ci/icreMa. HeroBMTe MHTepecu BK/iK>nBaT .NET n/iaTCpopMaTa, grid cwcre- 
MMTe m 6a3MTe otashhu. 

MaHO/i flOHeB 

MaHO/i flOHeB e cocpTyepeH pa3pa6oTnm< bbb cpupMa telerik ( www.telerik. 
com ). Tom e nacr ot eKuna, komto pa3pa6oTBa ye6-6a3npaHaTa cwcreMa 3a 
ynpaB/ieHwe Ha cbAtpwaHkie Sitefinity ( www.sitefinity.com ). MaHO/i e CTyAeHT 
BtB OaKy/iTeTa no MaTeMaTMKa v\ MHCpopMaTHKa Ha Cocpmmckm yHMBepcuTeT 
"Cb. K^MMeHT Oxpmackm", cneu.ua/iHOCT MHCpopMaTMKa. HeroBMTe npocpecno- 
Ha/iHM MHTepecu o6xBaiuaT Haw-Bene .NET TexHO/iornnTe (b 4acTHOCTASP.NET 
ye6 npn^o>KeHMfl, XML v\ ye6 yc/iyrw). Mo>KeTe p,a ce CBtpweTe c MaHO/i no e- 
mail: manol.donev@qmail.com . 



flporpaMnpaHe 3a .NET Framework (tom 2) 45 



MapTiiH Ky/iOB 



MapTMH Ky/iOB e cepTucpnunpaH MHcrpyKTop v\ pa3pa6oTHMK no nporpaMMTe 
Microsoft Certified Trainer (MCT) v\ MCSD.NET. npe3 2006 r. e HarpaAeH ot 
MaMKpococpT c HarpaAaTa Most Valuable Professional (MVP). Tom e flupeKTop 
HanpaB/ieHkie .NET kbm Hau.MOHa/iHa aKafleMna no pa3pa6oTKa Ha cocpTyep, 
KtAeTO e OTroBopeH 3a pa3pa6oTKa Ha KypcoBe, o6yneHMe v\ npoynBaHe Ha 
Haw-HOBUTe TexHO^ornn Ha MaMKpococpT KaTO Visual Studio Team System, 
Indigo, WSE, ASP.NET, Analysis Services 2005, VSTO, Atlas v\ flp. MapTMH e 
noneTeH n/ieH Ha Et/irapcKaTa acou.wau.km Ha pa3pa6oT4nunTe Ha cocpTyep 
(5APC), n/ieH Ha SofiaDev .NET noTpe6kiTe/iCKaTa rpyna, zieKTop npw Me>Kfly- 
HapoflHaTa .NET acou.Mau.Mfl - INETA v\ zieKTop Ha peflnua ceMMHapn Ha 
MaMKpococpT. Tom e perMOHa/ieH npe3MAeHT Ha Me>KAyHapoAHaTa acou.Mau.MH 
Ha cocpTyepHMTe apxMTeKTM (IASA) 3a Et/irapMH. HeroBM^T ziMneH AHeBHMK 
(6/ior) MO>Ke p.a HaMepMTe Ha aApec http://www.codeattest.com/bloqs/martin . 

Mnxan/i Ctomhob 

MMxaM/i Ctomhob e cocpTyepeH pa3pa6oT4MK bbb cpMpMa MPS ( www.mps.bg ), 
koato e noAM3n"b^HMTe^ Ha Siemens A.G. Tom ce 3aHMMaBa npocpecMOHa/iHO c 
nporpaMMpaHe 3a n/iaTCpopMMTe Java m .NET Framework ot hako/iko toamhm. 
YuacrBa KaTO zieKTop b npenoAaBaTe/iCKMH eKMn Ha KypcoBeTe "nporpaMMpa- 
He 3a .NET Framework" m "Ka^ecTBeH nporpaMeH koa". Tom e cryqeHT-KOH- 
cy/iTaHT Ha MaMKpococpT 5"b/irapM*i 3a Coc|dmmckm yHMBepcMTeT npe3 nocnep,- 
HMTe 2 toamhm m noAnoMara pa3npocTpaHeHMeTO Ha HaM-HOBMTe npoAyKTM m 
TexHO^orMM Ha Microsoft b yHMBepcMTeTa. MMxaM/i e 6m/i zieKTop Ha Me>K- 
AyHapoAHM KOHCpepeHUMM 3a VV\C CMCTeMM. MHTepecMTe My o6xBaiuaT pa3pa- 
6oTKa Ha ye6 npM^oxeHMfl, npM^oxeHMfl c 6a3M ot ashhm, M3rpa>KAaHe Ha 

CbpBtpHM CMCTeMM M yuaCTMe B aKaAeMM4HM AeMHOCTM. 

MoHMKa AsieKcueea 

MoHMKa A^eKCMeBa e cocpTyepeH pa3pa6oTHMK bbb cpMpMa Co/iBep / MMAaKC 
( www.midax.com ). B MOMeHTa cneABa cneu.Ma/iHOcr MHCpopMaTMKa bbb OaKyn- 
TeTa no MaTeMaTMKa m MHCpopMaTMKa Ha Coc|dmmckm yHMBepcMTeT "Cb. K/iMMeHT 
Oxpmackm". MoHMKa MMa npocpecMOHa^eH onMT b pa3pa6oTKaTa 3a .NET 
Framework c e3MKa C# m e cepTMCpMUMpaH ot Microsoft pa3pa6oT4MK 3a .NET 
n/iaTCpopMaTa. HeMHMTe MHTepecM ca b 06/iacTTa Ha TexHO/iorMMTe 3a M3rpa>K- 
AaHeTO Ha rpacpMneH noTpe6MTe/iCKM MHTepcpeMC m pa3pa6oTKaTa Ha npM/io- 
>KeHMfl 3a mo6m/ihm ycrpoi/icTBa. ripe3 2004 roAMHa MoHMKa e acMcreHT no 
"CTpyKTypM OTflaHHM" b Coc|dmmckm yHMBepcMTeT. 

HliKOJiaM Heflfl/IKOB 

HMKO/iaki HeA^^KOB e npe3MAeHT Ha Acou.Mau.MATa 3a MHCpopMauMOHHa CMryp- 
hoct ( www.iseca.org ) koato e cb3AaAeHa c ue/i npM/iaraHe Ha HaM-Ao6pMTe 
npaKTMKM 3a ocMryp^BaHe Ha MHCpopMauMOHHaTa CMrypHOCT Ha Hau.MOHa/iHO 
hmbo m npM M3B"bpujBaHeTO Ha e^eKTpoHeH 6M3Hec. HMKO^aM e npocpecMOHa- 
nen pa3pa6oT4MK Ha cocpTyep, KOHcy/iTaHT m npenoAaBaTe/i c At/iroroAMweH 



46 nporpaMkipaHe 3a .NET Framework (tom 2) 

onuT. Tom e aBTop Ha CTaTnn v\ zieKTop Ha MHO>KecTBO KOHCpepeHunn v\ ceMM- 
Hapn b o6/iacn"a Ha cocpTyepHMTe TexHO/iorkiw v\ MHCpopMaunoHHa curypHOCT. 
ripenoAaBaTe^CKMflT My onuT ce npocTupa ot aci/icreHT no "CrpyKTypw ot 
AaHHM b nporpaMnpaHeTo", "06eKTHO-opneHTnpaHO nporpaMnpaHe etc C+ + " 
m "Visual C+ + " flo zieKTop b KypcoBeTe "Mpe>KOBa curypHOCT", "CurypeH 
nporpaMeH koa", "MHTepHeT nporpaMnpaHe c Java", "KoHcrpywpaHe Ha 
Ka^ecTBeH nporpaMeH koa", 'TlporpaMnpaHe 3a n/iaTCpopMa .NET" v\ "Pa3- 
pa6oTKa Ha npn^OKeHna c Java". MHTepecnTe Ha HkiKO/iaki ca KOHueHTpupaHM 
Btpxy TexHu^ecKaTa v\ 6n3Hec CTpaHaTa Ha MHCpopMaunoHHaTa curypHOCT, 
Java m .NET TexHO/iorm/iTe v\ MOAe/ii/ipaHeTO v\ ynpaB/ieHkieTO Ha 6n3Hec npo- 
uecu b ro/ieMi/i opraHM3aunn. HMKO/iaw MMa 6aKa/iaB"bpcKa CTeneH ot OaKy/i- 
TeTa no MaTeMaTMKa v\ MHCpopMaTMKa Ha Coc|dmmckm yHMBepcuTeT "Cb. K/iMMeHT 
OxpnACKn". KaTO yueHMK e At/iroroAHweH cbCTe3aTe/i no nporpaMnpaHe, c 
peAnua npn30BM OT/ikmwfl. ripe3 2004 r. e HarpaAeH ot ripe3i/iAeHTa Ha 
Et/irapwfl Teoprn ritpBaHOB 3a npuHOca My kbm pa3BMTneTO Ha MHCpopMaun- 
OHHMTe TexHO^ornn m MHCpopMaunoHHOTO o6mecrBO. Tom e noneTeH n/ieH Ha 
5APC. /1m4hmat My cawT e AOCTtneH ot aApec: www.nedyalkov.com . 

naiiaiiOT flo6pnKOB 

naHawoT flo6pnKOB e cocpTyepeH apxnTeKT b SAP A.G., Java Server 
Technology ( www.sap.com '), TepMaHMfl v\ e OTroBopeH 3a KOopAHHaunaTa Ha 
cocpTyepHMTe pa3pa6oTKM b SAP Labs Et/irapkia. Tom e 3aB"bpujki/i OaKy/iTeTa 
no MaTeMaTMKa v\ MHCpopMaTMKa Ha Cocpi/mcKM yHMBepcuTeT "Cb. K/iMMeHT 
OxpnACKn", cneu.ua/iHOCT MHCpopMaTMKa. riaHawoT e At>/iroroAHLueH yuacmwK 
(KaTO c"bcre3aTe/i v\ ptKOBOAHTe/i) b yueHkmecKw v\ CTyqeHTCKi/i cbcre3aHkifl no 
nporpaMnpaHe v\ e HOCkiTe/i Ha mhoto npecTMXHn HarpaAM b CTpaHaTa v\ 
4y>K6nHa. Tom e aBTop Ha KHurnTe 'TlporpaMkipaHe = ++A/iropkiTMw;" ( www. 
alqoplus.org ) v\ "Java Programming with SAP Web Application Server", iokto 
m Ha AeceTKM HaynHO-TexHwuecKki ny6/ii/iKau.m/i. ripe3 nepnoAa 2001-2003 
boam KypcoBeTe 'TlpoeKTupaHe v\ aHa/iki3 Ha KOMniOTbpHki a/iropwTMki" v\ 
'TlparMaTHKa Ha o6eKTHOTO nporpaMnpaHe" b Cocpmmckm yHMBepcuTeT. Mowe- 
Te p.a ce CBtpxeTe c riaHawoT no e-mail: dobrikov@q ma il.com . 

npec/iaB HaKOB 

npec/iaB HaKOB e acnupaHT no M3KycTBeH MHTe/ieKT b Ka/ikicpopHMMCKwa 
yHMBepcuTeT b EtpK/in ( www.berkeley.edu ), CALU,. HeroBMAT npocpecwoHa/ieH 
onuT BK/iiouBa ujecrroAMWHa pa6oTa KaTO cocpTyepeH pa3pa6oTHMK bbb cpup- 
MMTe Komcocpt ( www.comsoft.bg ') v\ Pn/ia Co/iiowbHC ( www.rila.bg ). MHTepe- 
cuTe My ca b 06/iaoTa Ha KOMniOTbpHaTa ^MHTBucTHKa v\ 6nonHCpopMaTMKaTa. 
npec/iaB no/iynaBa MarncTtpcKaTa cm CTeneH no MHCpopMaTHKa ot Coc|dmmckm 
yHMBepcuTeT "Cb. K/iMMeHT Oxpmackm". Tom e HOCkiTe/i e Ha 6poH30B MeAa^ ot 
Ea/iKaHkiaAa no MHCpopMaTHKa, 3aeMa^ npn30BM MecTa b AeceTKM HaunoHa^HM 
cbCTe3aHi/m no nporpaMnpaHe KaTO y^eHMK v\ CTyAeHT. CtCTe3aTe/i e, a no- 
KtCHO m TpeHbop Ha OT6opa Ha CocpuMCKua yHMBepcuTeT, y^aCTHMK B CBeTOB- 
hoto Me>KAyyHMBepcnTeTCKO ctCTe3aHne no nporpaMnpaHe (ACM International 
Collegiate Programming Contest). Tom e acucTeHT b MHOxecTBO KypcoBe bbb 



nporpaMnpaHe 3a .NET Framework (tom 2) 47 

OaKy/ueTa no MaTeMaTMKa v\ MHCpopMaTMKa Ha Coc|dmmckm yHMBepcuTeT, 
/ieKTop-ocHOBaTe/i Ha KypcoBeTe 'TlpoeKTupaHe v\ aHa/iM3 Ha KOMniOTbpHM 
a^ropnTMn" m "MoAe/iwpaHe Ha ashhm m npoeKTupaHe Ha 6a3M ot AaHHn". 
ripec/iaB e aBTop Ha KHurnTe "Ochobm Ha KOMniOTbpHMTe a/iropMTMM" v\ "npor- 
paMMpaHe = ++A/iropMTMM;" ( www.alqoplus.org '). Tom MMa AeceTKM HaynHM v\ 
HaynHonony/iapHM ny6/iMKau.MM b npecTMXHM Me>KflyHapoAHM v\ Hau.MOHa/iHM 
M3AaHMfl. Tom e ntpBMflT HOCkiTe/i Ha HarpaAaTa '7J,>koh ATaHacoB" 3a npuHOC 

K"bM pa3BMTkieT0 Ha MHCpOpMaUMOHHMTe TeXHO/lOTMM M MHCpOpMaU.MOHHOTO 

o6iuecTBO, yupeAeHa ot npe3MAeHTa Ha Bt^rapua Teoprn ritpBaHOB. 

PaflOC/iaB Ilea hob 

PaAOC/iaB MBaHOB e cocpTyepeH pa3pa6oTHMK bbb cpupMa MeACOcpT ( www, 
medsoft.biz ') v\ cryaeHT b cneu.Ma/iHOcr MHCpopMaTMKa bbb OaKy/ueTa no MaTe- 
MaTMKa M MHCpOpMaTMKa Ha COCpMMCKM yHMBepcuTeT "Cb. K/lklMeHT OxpnACKn". 

ripocpecMOHa^HMTe My MHTepecu ca b 06/iacrra Ha MHCpopMaunoHHaTa curyp- 
hoct m npoAyKTMTe m TexHO/ioruMTe Ha Microsoft. 

Poc/iaH EopncoB 

PocnaH BopucoB e cocpTyepeH MH>KeHep bbb cpupMa CupMa Tpyn 
( www.sirma.bg ), 3BeH0 Ha CupMa 5n3Hec KoHcy/iTMHr. npocpecMOHa/iHMTe My 
MHTepecu ca CB"bp3aHM ochobho c M3rpa>KAaHe Ha npn^OKeHna, 6a3npaHM Ha 
TexHO^ornn Ha Microsoft. Cneu.na/iki3kipa/i e b 06/iacTTa Ha 6m/imht CMCTeMM, 

KaTO M OCHOBHM M CaTe/lMTHM 6aHK0BM CMCTeMM. MMa cepM03eH OnMT c 

n/iaTCpopMaTa .NET Framework m ctpBtpMTe 3a 6a3M ot ashhm Microsoft SQL 
Server m Oracle. YuacrBa b pa3/iM4HM npoeKTM, CB"bp3aHM c 6"b/irapcKM m 
4y>KAM 6aHKM. B MOMeHTa Poc/iaH e cryaeHT b Hob 6"b/irapcKM yHMBepcMTeT, 
cneuMa/iHOCT MHCpopMaTMKa. MoxeTe p,a ce CBtpxeTe c Hero Ha e-mail: 
rosborisov@gmail.com . 

CeeT/iMH HaKOB 

CBeT/iMH HaKOB e AnpeKTop Ha HanpaB/ieHMe "o6yneHMe" Ha HauMOHa/iHaTa 
aKaAeMMfl no pa3pa6oTKa Ha cocpTyep ( http://academy.devbg.org '), KtAeTO 
o6ynaBa cocpTyepHM cneuMa/iMCTM 3a npaKTMnecKa pa6oTa b MT MHAycTpM^Ta c 
Java m .NET n/iaTCpopMMTe. Tom e xoHopyBaH npenoAaBaTe/i no cbBpeMeHHM 

COCpTyepHM TeXHO/lOTMM B COCpMMCKM yHMBepCMTeT "CB. K/lMMeHT Oxpmackm", 

KtAeTO boam KypcoBe no 'TlpoeKTMpaHe m ananv\3 Ha KOMniOTbpHM a/iro- 
Pmtmm", "MHTepHeT nporpaMMpaHe c Java", "MpexoBa CMrypHOCT", "riporpaMM- 
paHe 3a .NET Framework", "Ka^ecTBeH nporpaMeH koa" m "Pa3pa6oTKa Ha ye6 
npM/io>KeHMfl c Java". CBeT/iMH MMa cepM03eH npocpecMOHa/ieH onMT KaTO 
cocpTyepeH pa3pa6oTHMK m KOHcy/iTaHT. HeroBMTe MHTepecM o6xBaiuaT Java 
TexHO/iorMMTe, .NET n/iaTCpopMaTa m MHCpopMauMOHHaTa CMrypHOCT. Tom e 
3aB"bpujM/i 6aKa/iaB"bpcKaTa m MamcrbpcKaTa cm CTeneH bbb OaKy/iTeTa no 
MaTeMaTMKa m MHCpopMaTMKa Ha Coc|dmmckm yHMBepcMTeT "Cb. K/iMMeHT 
Oxpmackm". KaTO yueHMK m CTyAeHT Cbct/imh e no6ep,v\jen b AeceTKM 
HauMOHa/iHM c"bCTe3aHMfl no nporpaMMpaHe m e HOCMTe/i Ha 4 MeAa/ia ot 
Me>KAyHapoAHM o/iMMnMaAM no MHCpopMaTMKa. Tom MMa AeceTKM HaynHM m 



48 nporpaMnpaHe 3a .NET Framework (tom 2) 

TexHi/mecKi/i ny6/im<auMki, CB"bp3aHM c pa3pa6crn<aTa Ha cocpTyep, b 6"b/irapcKki 
m 4y>KflecTpaHHM cnncaHMfl v\ e aBTop Ha KHurnTe "1/lHTepHeT nporpaMnpaHe c 
Java", "Java 3a uncppoBO noAnncBaHe Ha AOKyMeHTM b ye6" v\ ptKOBOAHTe/i Ha 
ABaTa TOMa Ha HacToaiuaTa KHura. ripe3 2003 r. tom e HOCMTe/i Ha HarpaAaTa 
"/1>koh ATaHacoB" Ha cpOHAauna EBpuKa. npe3 2004 r. no/iy^aBa HarpaAa 
"/1>koh ATaHacoB" ot npe3MAeHTa Ha Et/irapi/isi Teoprn ritpBaHOB 3a npuHOca 

My K"bM pa3BMTkieTO Ha MHCpOpMaUMOHHMTe TeXHO^OTMH M MHCpOpMaUMOHHOTO 

o6iuecTBO. CsejiwAu e eAMH ot yupeAHTe/ii/iTe Ha E"b/irapci<aTa acounauna Ha 
pa3pa6oT4MUMTe Ha cocpTyep ( www.devbq.org ) v\ noHacroflmeM HenH npeA- 
ceAaTe/i. 

CTe4>aH flo6peB 

OrecpaH flo6peB e CTapiun ye6 pa3pa6oTnm< bbb cpupMa Vizibility 
( www.vizibility.net '). Tom OTroBapa 3a ro/iflMa nacr ot .NET npoAyKTMTe, pa3- 
pa6oTBaHM b cocpTyepHaTa KOMnaHna, b TOBa hmc/io ye6 6a3npaHa ci/icreMa 3a 
M3rpa>KAaHe Ha AHHaMkinHki caMTOBe v\ ynpaB/ieHwe Ha thxhoto ctAtp^aHne, 
ye6 cucTeMa 3a ynpaB/ieHkie Ha KOHTaKTM v\ AP- HeroBa OTroBopHOCT e v\ 
BHeAP^BaHeTO Ha yTBtpAeHMTe npaKTMKM v\ MeTOAO/iori/m 3a pa3pa6oTKa Ha 
cocpTyep b npon3BOACTBeHMfl npouec. npocpecwoHa/iHkiTe My MHTepecu ca 
Haco^eHM kbm ye6 TexHO/iorwwTe, b nacmocr ASP.NET, XML ye6 ycnyri/iTe v\ 
Ufl/iocmaTa pa3pa6oTKa Ha npw/io>KeHkifl, 6a3npaHM Ha .NET Framework. 
CTecpaH cneABa MHCpopMaTMKa bbb OaKy/iTeTa no MaTeMaTMKa v\ MHCpopMaTMKa 

Ha COCpMMCKM yHMBepCMTeT "CB. K/lMMeHT OxpnACKki". 

CTecpaH KMpfl30B 

CTecpaH Knpfl30B e cocpTyepeH pa3pa6oTni/iK bbb cpupMa Bepeo TexHO/i"bA>Kkic 
( www.vereo.bg '). Tom ce 3aHMMaBa npocpecwoHa/iHO c pa3pa6oTKa Ha .NET 
peiueHMfl 3a 6n3Heca v\ A"bp>KaBHaTa aAMMHucTpauna. OnuTbT My BK/iK>nBa 
M3rpa>KAaHe Ha ye6 v\ Hacro/iHM npn^OKeHna c TexHO/iorm/i Ha Microsoft, a 
cbmo n Java v\ Oracle. 3aB"bpujM/i e OaKy/iTeTa no MaTeMaTMKa v\ MHCpopMa- 
TMKa Ha CocpMMCKM yHMBepcuTeT "Cb. K/ikiMeHT OxpnACKn", cneuwa/iHOcr 
MHCpopMaTMKa. HeroBMTe npocpecwoHa/iHi/i MHTepecu BK/iionBaT apxnTeKTypa, 
AM3aMH m MeTOAO/iornn 3a pa3pa6oTKa Ha ro/ieMM KopnopaTMBHM npn^OKeHna. 
3a KOHTaKTM etc CTecpaH MO>KeTe p,a ki3no/i3BaTe HeroBna e-mail: 
Stefan .kiryazov@g ma il.com . 

CTecpaH 3axapneB 

CTecpaH 3axapneB pa6oTM KaTO cocpTyepeH pa3pa6oTnm< b 1/lHTepKOHcy/iT 
5"b/irapnfl ( www.icb.bg ), KtAeTO e OTroBopeH 3a cb3AaBaHeTO Ha MHCTpyMeHTu 
3a aBTOMaTM3npaHe Ha npoueca Ha pa3pa6oTKa. Tom i/ma At/iroroAHweH onuT 
b cb3AaBaHeTO Ha ERP cucTeMM, komto HaTpynBa npn pa6oTaTa cm b pa3/iwnHn 
cpupMM b Bt^rapufl. OcHOBHMTe My MHTepecu ca CB"bp3aHM etc cucTeMMTe 3a 
ynpaB/ieHwe Ha 6a3M ot ashhh, n/iaTCpopMaTa .NET, ORM MHCTpyMeHTMTe, 
J2ME, KaKTO m Borland Delphi, ripn 3aB-bpwBaHeTO cm Ha cpeAHOTO o6pa30Ba- 
Hue b "TexHO/iori/mHO yni/i/ii/ime - E/ieicrpoHHw cucTeMn", ne^e^n OT/iwukiTe/iHa 
HarpaAa 3a ua^octhm nocTuxeHMa. ripe3 2005 r. 3aB"bpujBa "TexHu^ecKM 



nporpaMnpaHe 3a .NET Framework (tom 2) 49 

yHMBepcuTeT - Cocpua", KtfleTO ce flMn/iOMMpa KaTO 6ai<a/iaB"bp bbb cpaKy/iTe- 
Ta no "KoMnK)T"bpHM CMcreMM v\ ynpaB/ieHMe". Tom n/ieHyBa b BAPC m b 
CocpukicKaTa .NET noTpe6kiTe/iCKa rpyna Mo>KeTe fla ce CBtpxeTe etc CrecpaH 
no e-mail: stephan.zahariev@qmail.com . 

Ctohh flaMOB 

Ctoah flaMOB e cocpTyepeH KOHcy/iTaHT, nn4, noeT v\ peBO/iK>u.MOHep. MoxeTe 
fla ce CB-bp>xeTe c Hero no e-mail: stoyan.damov@qmail.com v\nv\ ot HeroBna 
/lutein caMT: http://spaces.msn.com/members/stoyan/ . 

Toflop Ko/ieB 

Toflop Ko/ieB e cocpTyepeH pa3pa6oTHMK b Gugga ( www.quqqa.com ) v\ cry- 
fleHT BtB OaKy/iTeTa no MaTeMaTMKa v\ MHCpopMaTMKa Ha Cocpmmckm yHMBep- 
cMTeT "Cb. K^MMeHT Oxpmackm", cneuna^HOCT MHCpopMaTMKa. HeroBMTe npo- 
cpecnoHa^HM MHTepecu ca b o6/iacn"a Ha o6eKTHO-opneHTnpaHMfl aHa/iM3, 
MOfle^npaHe v\ nporpaMnpaHe, ye6 TexHO/iorm/iTe, 6a3MTe flaHHM v\ RIA (Rich 
Internet Applications). Toaop e flt/iroroflMweH yuacmMK b cbcre3aHMfl no 
MHCpopMaTMKa m MHCpopMaunoHHM TexHO/iorMM, nene/iM/i peflnua rpaMOTM M 
ot/imuma, KaKTO m cpe6"bpeH wepjan Ha Me>KflyHapoflHa o/iMMnMafla no MHCpop- 
MaunoHHM TexHO^ornn. Tom e HOCMTe/i Ha ntpBO Macro ot HauwoHa/iHaTa 
o^MMnnaAa no MHCpopMaunoHHM TexHO/iorMM v\ e yuacrBa/i b xypnTO Ha 
ctiuaTa o^MMnnafla roflMHa no-K"bCHO. Toflop MMa MHO>KecTBO pa3pa6oTKM b 
ccpepaTa Ha ye6 TexHO/iorwwTe v\ e yuacrBa/i b M3c/ieflOBaTe/iCKM eKnn b 
Maca4y3eTCKMAT TexHO/iorMneH MHCTMTyT (MIT). Tom e cepTucpnunpaH 
Microsoft cneu.ua/ikiCT. 

XpncTO fleuiee 

XpucTO fleiueB e pa3pa6oTHMK Ha ASP.NET KOMnoHeHTM bbb cpupMa telerik 
( www.telerik.com ). Tom e 3aB"bpujw/i AMepuKaHCKua yHMBepcMTeT b Et/irapMfl, 
cneuna/iHOCT MHCpopMaTMKa. OcHOBHMTe My MHTepecu ca b o6/iacn"a Ha noflo- 
6paBaHeT0 Ha npoueca Ha pa3pa6oTKa Ha cocpTyep. Tom e 3ana/ieH npMBtp- 
>KeHMK Ha Agile MeTOflo/iorMMTe, ochobho Ha Extreme Programming (XP). ripo- 
cpecMOHa^HMAT My onMT e npeAMMHO b pa3pa6oTKaTa Ha peiueHMa c KpaTbK 
Umkb/i 3a o6paTHa Bp"b3Ka, bmcoko noKpMTMe ot TecTOBe m nonTM nt/iHa 
aBT0MaTM3auMfl Ha bcmukm HMBa ot pa6oTHMfl npou.ec. 

XpncTO PaflKOB 

Xpmcto PaflKOB e ynpaBMTe/i Ha cpMpMa 3a cocpTyepHM KOHcy/iTaHTCKM yc/iym 
Calisto ID ( www.calistoid.com ). Tom e 6ai<a/iaB"bp ot aHr/iMMCKaTa cneu.Ma/i- 
hoct "Manufacturing Engineering" b TexHM^ecKM YHMBepcMTeT - CocpMsq m 
MarMCTtp no MHCpopMauMOHHM m KOMyHMKauMOHHM TexHO^orMM BtB OaKy/iTeTa 
no MaTeMaTMKa m MHCpopMaTMKa Ha Coc|dmmckm yHMBepcMTeT "Cb. K/immcht 
OxpMflCKM". npMTe>KaBa cepTMCpMKauMOHHa CTeneH ot Microsoft - MCSD.NET. 

XpMCTO MMa fl"b^rOrOflMLUeH OnMT C pa3/lMHHM CbpBtpM 3a 6a3M OT flaHHM M 

cepM03eH onMT c pa3/iMHHM TexHO^orMM Ha Microsoft, Borland, Sun m Oracle. 



50 nporpaMnpaHe 3a .NET Framework (tom 2) 

yuacrHi/iK m ptKOBOflMTe^ e b npoeKTM 3a M3rpa>KflaHe Ha hako/iko ro/ieMi/i 
MHCpopMaunoHHM cucTeMM, AHHaMM^HM 1/lHTepHeT nopTa/iw m AP- rioA HerOBO 
ptKOBOflCTBO e cb3AaAeH HaM-ycnewHMfl CK/iaAOBO-cneTOBOAeH cocpTyep 3a 
cpapMaueBTM^HM npeAnpi/mTi/m b CTpaHaTa. KaTO yueHkiK Xpmcto MMa MHOwec- 
tbo y^acTMfl m HarpaAM ot o/ikiMnwaAH no MaTeMaTMKa b CTpaHaTa v\ ny>K6kiHa. 

L(BeTe/iiiH AHflpeee 

UBeTe^MH AHApeeB e cocpTyepeH MHweHep bbb cpupMa Dreamix Ltd. 
( www.dreamix.eu '). Tom e n/ieH Ha 5"b/irapci<aTa acou.nau.kifl Ha pa3pa6oTnw- 
UMTe Ha cocpTyep v\ e MHcrpyKTop KbM HauwoHa/iHaTa aKaAeMi/m no pa3pa6oT- 
Ka Ha cocpTyep. U,BeTe/iMH yuacrBa KaTO zieKTop b peAnu.a KypcoBe v\ ceMM- 
Hapn. M3flBABa ce v\ KaTO KOHcy/iTaHT no ki3no/i3BaHe Ha MOAepHM ye6 TexHO- 
/iorm/i. HacT ot MHTepecnTe My ca CBtp3aHM c n/iaTCpopMaTa FreeBSD, b nacr- 
hoct M3no/i3BaHeTO m 3a pa3pa6oTKa Ha cocpTyep. H/ieH e Ha rpynaTa Ha 6"b/i- 
rapcKMTe noTpe6wTe/in Ha FreeBSD ( free bsd-bq. org ). U,BeTe/ii/iH e 3aB"bpujki/i 
6aKa^aB"bpcKa CTeneH no MHCpopMaTMKa bbb OaKy/iTeTa no MaTeMaTMKa v\ 
MHCpopMaTMKa Ha CocpMMCKM yHMBepcuTeT "Cb. K^MMeHT OxpnACKn", a cera e 
CTyAeHT no CTonaHCKO YnpaB/ieHkie b Cbiuna yHMBepcuTeT. JlwuHkiflT My ye6 
caMT e AOCTtneH ot aApec: www.flowerlin.net . 

fleop TauieB 

£bop TaiueB e cocpTyepeH pa3pa6oTHMK bbb cpupMa ComMetric ( www. 
commetric.com ). Tom e 3aB"bpujn/i OaKy/iTeTa no MaTeMaTMKa v\ MHCpopMaTMKa 
Ha CocpMMCKM yHMBepcuTeT "Cb. K/ikiMeHT Oxpmackm", cneu.ua/iHOCT MHCpopMa- 
TMKa. YuacrBa/i e b pa3pa6oTKaTa Ha ro/ieMi/i KopnopaTMBHM catiTOBe, KOMyHM- 
KaunoHHM cucTeMM m peweHi/ifl 3a o6pa6oTKa Ha craTkicmnecKM ashhh m 
nporH03npaHe c mctoam Ha M3KycTBeH MHTe/ieKT, M3no/i3BaMKM TexHO/iornnTe 
m n/iaTCpopMMTe Ha Microsoft. MHTepecnTe My ca HaconeHki KbM .NET n/iaTCpop- 
MaTa, Java v\ M3KycTBeHMfl kiHTe/ieKT. npocpecwoHa/iHWflT My onuT e CB"bp3aH 
npeAMMHO c .NET Framework, Visual Studio .NET, Microsoft SQL Server v\ 
Microsoft Internet Information Server. 

B/iaroflapHOCTM 

HacToaiuaTa KHura CTaHa pea/iHOcr 6/iaroAapeHkie Ha mhoto xopa v\ hako/iko 
opraHM3aunM, komto noMorHaxa v\ AonpuHecoxa 3a npoeKTa. HeKa M3Ka>KeM 
CBOATa 6/iaroAapHOcr v\ yBaweHkie KbM tax. 

CBeT/IMH HaKOB 

Ha ntpBO Macro Tpa6Ba p,a 6/iaroAapwM Ha r/iaBHMJi opra- 

HM3aT0p M ptKOBOAMTe^ Ha npoeKTa, CBeT/lMH HaKOB, komto 

ycna Aa MOTMBupa HaA 30 Aywn Aa yuacrBaT b HankmaHkieTO 
m ycna Aa rn pbkoboam ycneujHO npe3 BCkmKMTe Meceun Ha 
pa6oTaTa no npoeKTa. Tom ycna Aa pea/iw3wpa CBO^Ta v\p,es\ 
3a cb3AaBaHe Ha hmcto 6"b/irapcKa KHura 3a nporpaMnpaHe 
c .NET Framework Haw-Bene 6/iaroAapeHwe Ha bcm^km ao6- 




nporpaMnpaHe 3a .NET Framework (tom 2) 51 

poBO/iHM y^acTHMun, komto .qapwxa CBOfl Tpyfl 3a npoeKTa v\ OT,qe/ii/ixa ot 
Ma/iKOTO cm CBo6oflHO BpeMe 3a fla cno,qe/iflT CBOMTe 3HaHna v\ onuT 
6e3Bt3Me3AHO, 3a Kay3aTa. 

ABTOpCKMSIT KO/ieKTMB 

ABTOpCKMflT KO/ieKTMB e HaMCTMHa MaBHMflT BMHOBHMK 3a CbLfleCTByBaHeTO Ha 

Ta3M KHura. TeKcr c TaKtB o6eM v\ TaKOBa KanecrBO He Moxe fla 6"bAe HanncaH 
ot eflMH v\nv\ flBaMa aBTopa 3a no-Ma/iKO ot hako/iko roflMHM, a ,qo ToraBa 
MHCpopMaunflTa MO>Ke Bene fla ocrapsi/ia. 

MfleaTa 3a ynacrwe Ha TO/iKOBa mhoto aBTopn ce OKa3a ycneujHa, MaKap v\ 
KOopflMHaunflTa Me>Kfly tax fla He 6ewe ziecHa. BtnpeKM, ne OT,qe/iHi/iTe MaBH 
ot KHuraTa ca nucaHM ot pa3/ikinHi/i aBTopn, Te c/ieflBaT ep,v\ueu ctm/i m bmcoko 
Ka^ecTBO. Bcm4km MaBH ca flo6pe crpyKTypwpaHM, c mhoto 3arflaBHfl v\ nofl3a- 
MaBMJi, c mhoto i/i noflxoflfliflM npHMepw, c flo6"bp crmi Ha M3Ka3 v\ eflHaKBO 
cpopMaTi/ipaHe. 

Ei>/irapcKa aco\\v\a\\v\s\ Ha pa3pa6oTHnuiMTe Ha 
cocjDTyep 

ripoeKT"bT no/iynw cw/iHa noflKpena ot Bt/irapcKaTa acounaunfl Ha pa3pa6oT- 
4nunTe Ha cocpTyep (BAPC), Tbv\ KaTO e b ci/mxpoH c HewHi/iTe \\ei\v\ v\ v\p,ev\. 

BAPC ocpi/iui/ia/iHO fltpxM npaBaTa 3a M3flaBaHe v\ pa3npocrpaHeHwe Ha khm- 
raTa b xapTkieH bma, ho HHMa npaBO fla pea/iki3kipa nena/i6a ot Ta3M flewHOcr. 
AcouwauMflTa npe3 CBOkiTe KOHTaKTM ycna fla HaMepw cpkmaHCkipaHe 3a OTne- 
^aTBaHeTO Ha KHwraTa, KaKTO v\ xoctmht 3a HefiHMfl ye6 cawT v\ cpopyM. 

Microsoft Research 

B paHHMTe cm cpa3M, KoraTO 6axa M3roTBeHM i\eK\xv\v\je 3a Kypca 'Tlporpa- 
MkipaHe 3a .NET Framework", npoeKTbT no/iyni/i noflKpena v\ nacri/mHO cpkmaH- 
ckipaHe ot Microsoft Research. Ako He 6eiue Ta3M noflKpena, BepoaTHO H^Ma- 
uje fla ce crwrHe ao cb3flaBaHeTO Ha /leKuwwTe v\ ao HanwcBaHeTO Ha KHkiraTa. 

SciForge.org 

riopTa^"bT 3a opraHM3npaHe Ha pa6oTaTa b eKwn SciForqe.org flafle cboa npw- 
hoc ki>m npoeKTa, KaTO npeflocraBki cpefla 3a cbBMecma pa6oTa, BK/iK>nBama 
CMCTeMa 3a kohtpo/i Hafl BepcMMTe, cpopyM, noiueHCKM cnwcbK (mailing list) v\ 
HHKOki flpyrw cpeflCTBa 3a ynecHeHwe Ha pa6oTaTa. 

B^aroflapHOCTMTe ca OTnpaBeHM r/iaBHO kbm cb3flaTe/ifl Ha nopTa/ia v\ HeroB 
r/iaBeH aflMMHMCTpaTop Ka/ikm HaKOB ( www.kalinnakov.com ), komto yKa3Baiue 
peflOBHO cbflewcTBkie b cnynai/i Ha TexHi/mecKi/i npo6/ieMi/i. 



52 nporpaMnpaHe 3a .NET Framework (tom 2) 

COCJDMMCKM yHMBepCMTeT "CB. KSIMMeHT OxpiiACKIi" 

OaKy/iTeTbT no MaTeMaTMKa v\ MHCpopMaTMKa (OMM) Ha Coc|dmmckm yHMBep- 
CMTeT "Cb. K^MMeHT OxpnACKn" noAnoMorina npoeKTa r/iaBHO b Hana/iHaTa My 
cpa3a, KaTO noflKpenw npe,q/io>KeHi/ieTO Ha npenoflaBaTe/iCKi/iyi eKnn ot Kypca 
"nporpaMnpaHe 3a n/iaTCpopMa .NET" 3a y^acTue b KOHKypca Ha Microsoft 
Research. rio-KbCHO cpaKy/iTeTbT npofl"b/i>Ki/i fla noAKperm MHnunaTHBUTe Ha 

aBTOpCKMfl KO/ieKTMB Ha KHMTaTa KaTO MM n03BO/lkl fla npoBe>KflaT M36opHM 

KypcoBe no nporpaMnpaHe 3a .NET Framework 1.1 v\ 2.0 3a cryqeHTi/iTe ot 

COCpMMCKM yHMBepCMTeT. 

telerik 

CocpTyepHaTa KOMnaHna telerik ( www.telerik.com ') noflKpenn npoeKTa npe3 
ocurypaBaHe Ha cpMHaHCupaHe 3a OTnenaTBaHe Ha KHuraTa Ha xapTna. M3Ka3- 
BaMe 6^aroflapHOCTM ot MMeTO Ha ue/ikia aBTopcKM KO/ieKTMB. 

CaMTbT Ha KHiiraTa 

Ocpnu.ua/iHMflT ye6 caMT Ha KHuraTa 'TlporpaMMpaHe 3a .NET Framework" e 
AOCTbneH ot aApec: http://www.devbq.org/dotnetbook/ . Ot Hero MO>KeTe fla 
M3TeMMTe ua/iaTa KHura b e/ieKTpoHeH bma, neKixwwje, Ha komto th e 6a3M- 
paHa, KaKTO v\ cope KOfla Ha npaKTi/mecKwyi npoeKT ot r/iaBa 29, 3a komto MMa 
cneui/ia/iHO M3roTBeHa i/iHcra/ikipama nporpaMa. 

KtM KHuraTa e cb3fla,qeH v\ flucKycuoHeH cpopyM, komto ce HaMupa Ha a,qpec: 
http://www.devbq.org/forum/index.php7showforum = 30 . B Hero MOxeTe fla 
flMCKyTupaTe BCflKaKBM TexHkmecKi/i v\ flpyrn npo6/ieMki, CB"bp3aHM c KHuraTa, 
fla OTnpaBATe MHeHna v\ KOMeHTapn v\ fla 3aflaBaTe Btnpocn kbm aBTopnTe. 

Jill Me H3 

KHuraTa v\ yne6HMTe MaTepi/ia/iki kbm Hen ce pa3npocrpaHflBaT cbo6oaho no 
c^eflHMfl /iwu.eH3: 

06LL1M fleC^MHMLlMM 

1. HacTOfliflMflT /ikiu.eH3 flecpMHupa yc/iOBi/mTa 3a M3no/i3BaHe v\ pa3npocr- 
paHeHne Ha KOMn/ieKT yne6Hi/i MaTepwa/iw v\ KHura no 'TlporpaMMpaHe 3a 
.NET Framework", pa3pa6oTeHM ot eKnn nofl ptKOBOflCTBOTO Ha CsejiwAU 
HaKOB ( www.nakov.com ) c noflKpenaTa Ha Bt/irapcKa a co una una Ha 
pa3pa6oT4MUMTe Ha cocpTyep ( www.devbg.org ) v\ Microsoft Research 
( research.microsoft.com ). 

2. yne6HMTe MaTepwa/ii/i ce cbcroyiT ot: 

- npe3eHTau.nn; 

- npMMepeH cope koa; 

- fleMOHCTpauMOHHM nporpaMw; 



nporpaMnpaHe 3a .NET Framework (tom 2) 53 

- 3aflanw 3a ynpa>KHeHMfl; 

- KHura (y4e6HMK) no nporpaMi/ipaine 3a .NET Framework c e3MKa C#. 

3. y<-ie6HMTe MaTepi/ia/iw ca flocrbnHki 3a cbo6oaho i/i3Ter/i*iHe npi/i ycno- 
BMATa Ha HacTOfliunfl /ii/meH3 ot ocpkiui/ia/iHi/ifl cai/iT Ha npoeicra: 

http://www.devbq.org/dotnetbook/ 

4. Abtopm Ha yne6HMTe MaTepwa/iw ca nwuaja, B3e/ii/i yuacrwe b taxhoto 
M3pa6oTBaHe. BceKM aBTop npwTeaoBa npaBa caMO Hafl npoflyKTMTe Ha 
CBOfl TpyA- 

5. noTpe6i/iTe/i Ha yne6HMTe MaTepwa/iki e BceKM, komto no HflKaicbB HanwH 
M3no/i3Ba Te3M MaTepna^n v\nv\ nacri/i ot tax. 

npaBa m orpaHMHeHMA Ha noTpe6nTe/inTe 

1. noTpe6nTe^MTe mmst npaBo: 

- fla M3no^3BaT yne6HMTe MaTepwa/in v\nv\ nacm ot tax 3a BCflKaKBM 
ue/iw, BK/iK>ni/iTe/iHO fla rn fla npoMeHAT cnopefl CBOMTe Hy>KflM v\ fla vv\ 
M3no^3BaT npn M3B"bpujBaHe Ha KOMepcwa/iHa flewHOcr; 

- fla ki3no/i3BaT cope KOfla ot npuMepnTe v\ fleMOHCTpaunnTe, BK/iK>neHi/i 
KtM yne6HMTe MaTepwa/iw v\nv\ TexHM MOflncpuKaunn, 3a BCflKaKBM 
Hy>KflM, BK/uoni/iTe/iHO m b KOMepci/ia/iHki cocpTyepHM npoflyKTu; 

- fla pa3npocrpaHflBaT 6e3n/iaTHO HenpoMeHeHM Konna Ha yne6HMTe 
MaTepna^n b e/ieicrpoHeH v\nv\ xapTneH bma; 

- fla pa3npocrpaHflBaT 6e3n/iaTHO opwrwHa/iHH v\nv\ npoMeHeHM nacm 
ot y4e6HMTe MaTepwa/iki, ho caMO npn M3pn4H0T0 cnoMeHaBaHe Ha 

M3T04HMKa M aBTOpMTe Ha C"bOTBeTHMfl TeKCT, npOTpaMeH KOfl \AI\V\ 

flpyr MaTepwa/i. 

2. noTpe6nTe^MTe HsiMaT npaBo: 

- fla pa3npocrpaHflBaT cpeiuy 3an/iamaHe yne6HMTe MaTepwa/iw v\nv\ 

4aCTM OT TAX (BK/lK>HklTe/lHO MOflMCpMUMpaHM BepCMM), KaTO kl3K/lK)- 

neHwe npaBM caMO nporpaMHi/mT koa; 

- fla npeMaxBaT HacTOfliunfl i\v\u,eu3 ot yne6HMTe MaTepwa/iw. 

npaBa m orpaHMHeHMq Ha aBTopwTe 

1. BceKM aBTop npwTeaoBa Heki3K/iK>nkiTe/iHki npaBa Btpxy npoflyKTMTe Ha 
CBOfl Tpyfl, c komto B3MMa yuacme b M3pa6oTKaTa Ha yne6HkiTe MaTe- 
pwa/iM. 

2. ABTopnTe MMaT npaBo fla M3no/i3BaT nacmTe, M3pa6oTeHM ot tax, 3a 
BCAKaKBM ue/iw, BK/iK>ni/iTe/iHO fla vv\ M3MeHAT v\ pa3npocrpaHflBaT cpeiuy 
3an/iamaHe. 



54 nporpaMnpaHe 3a .NET Framework (tom 2) 

3. ripaBaTa Btpxy yne6HMTe MaTepwa/iki, M3pa6oTeHM b cbaBTopcrBO, ca 
npkiTeaoHkie Ha bcm^km CbaBTopn 3aeflHO. 

4. ABTopnTe HAMaT npaBO fla pa3npocrpaHflBaT cpeiuy 3an/iaiuaHe yne6Hki 
MaTepwa/iw v\nv\ nacm ot tax, M3pa6oTeHM b CbaBTopcrBO, 6e3 M3pn4- 
hoto cbr/iacwe Ha bcm^km cbaBTopn. 

npaBa m orpaHMHeHMq Ha EAPC 

Pbkoboactboto Ha 5"b/irapci<a acounauna Ha pa3pa6oTnwui/iTe Ha corjrryep 
(5APC) MMa npaBO fla pa3npocrpaH*iBa yne6HkiTe MaTepwa/iki v\nv\ nacm ot tax 
(BK/uonwTe/iHO MOAncpnunpaHn) 6e3n/iaTHO v\nv\ cpeiuy 3an/iaiuaHe, ho 6e3 fla 
pea/ii/i3kipa nena/i6a ot npofla>K6M. 

npaBa m orpaHMneHMq Ha Microsoft Research 

Microsoft Research MMa npaBO fla pa3npocrpaHflBa yne6Hi/iTe MaTepwa/ii/i v\i\v\ 
4acTM ot tax no BCHKaicbB Ha^MH - 6e3n/iaTHO v\i\v\ cpeiuy 3an/iaiuaHe, ho 6e3 
fla pea/iM3wpa nena/i6a ot npofla>K6n. 



CbQIIWAH HaKOB, 

01.11.2006 r. 



T/iaea 15. M3rpa>KflaHe Ha 

rpacjDMHeH noTpe6iiTe/iCKii 

MHTepcjDeMC c Windows Forms 



ABTOpii 

CBeT^MH HaKOB 

PaAOcnaB MBaHOB 

He06X0flMMM 3HaHM51 

- Ba30BM no3HaHMfl 3a .NET Framework 

- 5a30BM no3HaHMfl 3a e3MKa C# 

- Ba30BM no3HaHMfl 3a Ae/ieraTMTe v\ Cb6nTMflTa b .NET Framework 

- Hana/ii-m yMeHMfl 3a pa6oTa c Visual Studio .NET v\ Windows Forms 
peAaKTopa My 

ClafllapMOHMe 

- KaKBO e Windows Forms? 

- riporpaMHM KOMnoHeHTM. KoMnoHeHTeH MOAe/i Ha .NET 

- riporpaMeH MOAe/i Ha Windows Forms. MoAe/i Ha npe^epTaBaHe Ha 

KOHTpO/lMTe 

- Ochobhm K/iacoBe. l/lepapxufl Ha K/iacoBeTe 

- K/iacbT control, flpyrw 6a30BM kohtpo/im 

- OopMM, npo3opun M AHa^03M - K/iaCbT Form 

- OCHOBHM KOHTpo/lM - TextBox, Label, Button 

- riocraBflHe Ha kohtpo/ii/i bbb c|DopMaTa 

- YnpaB/ieHkie Ha Cb6nTMflTa 

- Windows Forms peAaKToptT Ha VS.NET 

- CraHAapTHM Ana/ioroBM KyTMM 

- M3BMKBaHe Ha Ana/ioroBki KyTMM 

- flpyrn Windows Forms kohtpo/im. MeHKrra. /leHTM c MHCTpyMeHTM. 
CTaTyc /ieHTM 

- flwa/ior 3a M36op Ha (fcaw/i 



56 nporpaMnpaHe 3a .NET Framework (tom 2) 

- MDI npn/ic»Kei-ikifl 

- Ba/iMAaui/m Ha ashhm 

- CB"bp3BaHe Ha ashhm (Data Binding). HaBurauna c currencyManager 

- KOHTpo/iaTa DataGrid 

- Master-Details HaBurauna 

- Hac/ieAflBaHe Ha cpopMM 

- naKeT"bT System. Drawing M GDI+ 

- rienaTaHe Ha npuHTep 

- noTpe6nTe^CKM kohtpo/im 

- Xoctmht Ha kohtpo/im b Internet Explorer 

- Hmujkm m Windows Forms 

- B/ia^eHe (Drag and Drop) 

- KoHCpurypaunoHeH cpai/i/i Ha npw/io>KeHi/ieTO 

B Ta3M TeMa ... 

B HacToamaTa TeMa me pa3r/ieAaMe cpeACTBaTa Ha Windows Forms 3a cb3Aa- 
BaHe Ha npo3openHO-6a3MpaH rpacpMneH noTpe6kiTe/iCKki MHTepcpewc (GUI) 3a 
.NET npw/io>KeHkiflTa. IHe ce 3ano3HaeM c nporpaMHua MOAe/i Ha Windows 
Forms, HeroBi/ue 6a30BM kohtpo/im, cpeACTBaTa 3a cb3AaBaHe Ha npo3opun, 
Ana^03M, MeHKDTa, zieHTi/i c MHCTpyMeHTM m CTaTyc zieHTi/i, KaKTO m c hakom no- 
c/io>khm KOHuenunn: MDI npn^OKeHna, data-binding, Hac/ieAflBaHe Ha cpopMM, 
xoctmht Ha kohtpo/im b Internet Explorer, pa6oTa c hmujkm b Windows Forms 
M AP- 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 57 



KaKBO e Windows Forms? 

Windows Forms e craHAapTHaTa 6n6/ii/iOTeKa Ha .NET Framework 3a M3rpa>K- 
flaHe Ha npo3openHO-6a3i/ipaH rpacpwueH noTpe6kiTe/iCKi/i MHTepcpewc (GUI) 3a 
HacTO/iHki (desktop) npM/io>KeHMfl. Windows Forms AedpuHupa Ha6op ot 
K/iacoBe m TunoBe, no3BO/iflBami/i M3rpa>KflaHe Ha npo3opun v\ Ana/i03ki c 
rpacpkinHi/i kohtpo/im b tax, npe3 komto ce M3B"bpujBa MHTepaKTMBHO B3anMO- 
AewcTBue c noTpe6nTe/ifl. 

ripn HacTO^HMTe npi/i/io>KeHkifl rpacpwuHkiflT noTpe6kiTe/iCKki MHTepcpewc no3BO- 
/i*iBa noTpe6nTe^flT AnpeKTHO p,a B3anMOAekicTBa c nporpaMaTa npe3 MMUJKaTa 
m K/iaBkiaTypaTa, a nporpaMaTa npuxBaiua HeroBMTe AeMCTBua v\ vv\ o6pa6oTBa 
no noAXOAflLU HanwH. 

Windows Forms e 6a3npaHa Ha RAD KOHLienLiMflTa 

B .NET Framework v\ oco6eHO b Windows Forms ce noAA^pwa KOHuenunaTa 3a 
Rapid Application Development (RAD). 

KaKBO e RAD? 

RAD e noAxoA 3a pa3pa6oTKa, npn komto npM/io>KeHMflTa ce cb3AaBaT BM3y- 
a/iHO npe3 CMo6flBaHe Ha totobm KOMnoHeHTM nocpeACTBOM noMOiuHnun v\ 
MHCTpyMeHTM 3a aBTOMaTMUHO reHepupaHe Ha ro/uiMa nacr ot KOAa. B pe3y/i- 
TaT npi/i/io>KeHi/mTa ce pa3pa6oTBaT mhoto 6tp30, c Ma/iKO ptuHO nucaHe Ha 
koa m c HaMa^eHM ycv\nv\s\ ot crpaHa Ha nporpaMkicra. 

ripi/i KOMnoHeHTHO-opneHTupaHaTa pa3pa6oTKa BceKM KOMnoHeHT peiuaBa 
HflKaKBa onpeAe/ieHa 3aAana, koato e nacr ot npoeKTa. KoMnoHeHTMTe ce 
nocraBHT b npw/io>KeHi/ieTO, cnep, KoeTO ce MHTerpupaT eAHH c Apyr npe3 
HacTpowKa Ha TexHMTe CBOMCTBa m cb6MTMfl. CBOMCTBaTa Ha BceKM KOMnoHeHT 
onpeAe^AT pa3/ikmHi/i HeroBM xapaKTepucTMKn, a cb6MTMflTa c/iy>KaT 3a ynpaB- 
zieHkie Ha AeMCTBu^Ta, komto ca npeAM3BMKaHM ot Hero. 

Windows Forms no3BOsi$iBa 6i>p3a BM3ya/iHa pa3pa6oTKa 

Windows Forms e Twni/mHa KOMnoHeHTHO-opneHTupaHa 61/16/11/iOTeKa 3a cb3Aa- 
BaHe Ha GUI, koato npeAOcraBfl b"B3mo>khoct c Ma/iKO nucaHe Ha nporpaMeH 
koa Aa ce cb3AaBa rbBKaB rpacpi/meH noTpe6kiTe/iCKM MHTepcpetic. 

Windows Forms no3BO/iflBa cb3AaBaHeTO Ha dpopMMTe v\ APyrnTe e/ieMeHTM ot 
rpadpi/mHi/m MHTepcpewc Ha npn/iOKeHM^Ta Aa ce M3BtpujBa BM3ya/iHO v\ MHTyn- 
tmbho npe3 noAxoA^iun peAaKTopw, KaTO HanpuMep Windows Forms Designer 
BtB Visual Studio .NET. rio-HaTaTbK b HacToaiuaTa TeMa me pa3r/ieAaMe no- 

nOAP06HO KOHKpeTHMTe B"b3MO>KHOCTM, komto VS.NET npeAOcraBfl 3a C"b3Aa- 

BaHe Ha Windows Forms npn^OKeHna. 



58 nporpaMnpaHe 3a .NET Framework (tom 2) 

Windows Forms n Apynue 6n6/inoTeKM 3a 
M3rpa>KflaHe Ha GUI 

Windows Forms npw/ikma Ha mhoto flpyrn 6ki6/ikiOTeKki 3a M3rpa>KflaHe Ha 
rpacpi/meH noTpe6nTe/iCKw MHTepcpewc (GUI), ho m cepno3HO ce pa3/ikmaBa ot 
noBeneTO ot tax. 

Windows Forms v\ VCL 

Ha MflewHO hmbo Windows Forms mhoto npw/ikma Ha 6n6/ikiOTeKaTa Visual 
Component Library (VCL) ot Delphi. npn/in4aT cm b ro/iflMa CTeneH Aopn 
caMMTe KOHTpo/ii/i, TexHMTe MMeHa, CBOMCTBa m cb6kiTkifl. ToBa BepoflTHO ce 
A"b^>KM flo ro/iflMa CTeneH Ha yuacri/ieTO Ha r/iaBHMJi apxnTeKT Ha Delphi 
AHAepc Xew^c6tpr b pa3pa6oTKaTa Ha Windows Forms v\ .NET Framework. 

Windows Forms m Visual Basic 6 

no Hani/ma Ha pa3pa6oTKa Windows Forms npw/ikma mhoto m Ha Visual Basic 
6, komto no3BO/i*iBa BM3ya^HO M3rpa>KflaHe Ha MHTepcpewca, npe3 B/ianeHe Ha 
KOMnoHeHTM m HacTpowKa Ha CBOMCTBa m ct6nTMfl, cbmo KaKTO b Delphi. 

Windows Forms m MFC 

no CBOATa molu Windows Forms He OTCTbnBa Ha no-crapi/iTe cpeflCTBa 3a 
M3rpa>KflaHe Ha GUI, HanpuMep MFC (Microsoft Foundation Classes) 6ki6/ii/iOTe- 
KaTa, koato ce ki3no/i3Bauje bbb Visual C++ npeAM Microsoft p,a B3eMaT 
CTpaTern^ecKOTO peiueHne pa3pa6oTKaTa Ha GUI 3a Windows pja npeMMHaBa 
nocTeneHHO kbm .NET Framework v\ Windows Forms. 

3a pa3/im<a ot MFC, npn Windows Forms, i/iHTepcpewcbT ce M3rpa>Kfla hako/iko 
ntTM no-6"bp30, no-/iecHO v\ nonâ„¢ 6e3 p,a ce ni/iuje nporpaMeH koa. 

Windows Forms m Java AWT/Swing 

AWT m Swing ca 6ki6/ikiOTeKki 3a M3rpa>KflaHe Ha npo3openHO-6a3kipaH GUI, 
komto ce M3no^3BaT npn Java n/iaTCpopMaTa. nporpaMHMAT MOfle/i Ha Windows 
Forms MMa CbiuecTBeHM pa3/iHKM ot nporpaMHua MOAe/i Ha AWT v\ Swing v\ 
npn4MHMTe 3a TOBa npon3xo>KflaT Haw-Bene ot cpaicra, ne AWT v\ Swing ca 
npeHOCMMM 6n6^noTeKM, npeflHa3Ha4eHM fla pa6oT*iT Ha mhoto onepaunoHHM 
cm ere mm, AOKaTO Windows Forms e 6a3npaHa Ha Win32 API. 

KoHTpo/iMTe b Windows Forms 

Windows Forms cwvbpwa 6oraT Ha6op ot craHflapTHki kohtpo/ii/i: cpopMM, 
Ana/1031/1, 6yTOHM, kohtpo^m 3a M36op, TeKCTOBM no/ieTa, MeHKDTa, /ieHTI/1 c 
MHCTpyMeHTM, CTaTyc zieHTM m mhoto Apyrn. B flont^HeHne kbm craHAapTHMTe 
kohtpo^m Windows Forms no3BO/iflBa Ha pa3pa6oT4MUMTe no zieceH HanwH p,a 
cb3AaBaT Aont^HMTe/iHO co6cTBeHM kohtpo/ii/i, komto fla ki3no/i3BaT KaTO 
4acTM b npw/io>KeHi/iflTa cm. 

B MHTepHeT MoraT p,a ce HaMepaT 6e3n/iaTHO v\i\v\ cpeiuy /ikiu.eH3Ha TaKca 
ro/iflM 6poki 6n6^MOTeKM ot kohtpo/im, komto peiuaBaT necro cpeiuaHM npo6- 



T/iaBa 15. M3rpa>KAaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 59 

zieMi/i m cnecTABaT BpeMe Ha pa3pa6oTnm<a npn pea/iM3auMflTa Ha necro cpe- 
maHM 3afla4M. CbmecrByBaT flopn ue/iw codrryepHM KOMnaHMM, komto npocpe- 

CMOHa/lHO Ce 3aHMMaBaT C npOM3BOflCTBOTO Ha KOMnOHeHTM M KOHTpO/lM (KaTO 

Infragistics, ComponentOne v\ 6-b/irapcKaTa telerik). 

Windows Forms m pa6oTa c flaHHM 

Windows Forms npeflocraBfl mhoto kohtpo/im 3a BM3ya/iM3auM*i v\ peflaKTMpa- 
He Ha flaHHM - TeKCTOBM, cnwcbUHM m Ta6^M4HM. 3a cnecTABaHe Ha BpeMe Ha 
pa3pa6oT4MKa e BtBefleHa KOHuenuMATa "cB"bp3BaHe Ha flaHHM" (data 
binding), kohto no3BO/isiBa aBTOMaTMnHO CB"bp3BaHe Ha flaHHMTe c KOHTpo/iMTe 
3a THXHaTa BM3ya/iM3auMfl. IHe o6"bpHeM cneuwa/iHO BHMMaHne Ha KOHuenun- 
yua "data binding" no-KbCHO b HacToaiuaTa TeMa. 

BrpafleHa noflflpi>>KKa Ha Unicode 

B Windows Forms noflflp"b>KKaTa Ha Unicode e BrpafleHa. Bcmukm kohtpo/im ca 
cbo6pa3eHki c Unicode CTaHflapTa v\ no3BO/iflBaT M3no/i3BaHe Ha mhoto e3nun 
m a36yKM (^aTMHuua, Knpn^nua, rptuKM, apa6cKM v\ flp.) 6e3 flont/iHMTe/iHM 
HacTpoMKM Ha Windows v\nv\ Ha npn^OKeHneTO. 

Hac/ieflfiBaHe Ha 4>opMn m kohtpo/im 

Windows Forms e npoeKTupaHa TaKa, ne fla no3BO/iHBa ziecHO Hac/ieflflBaHe v\ 
pa3LunpflBaHe Ha dpopMM v\ kohtpo/im. ToBa flaBa b"B3mo>khoct 3a npeM3no/i3- 
BaHe Ha o6iunTe nacm Ha noTpe6MTe/iCKMfl MHTepcpewc. rio-HaTarbK b HacToa- 
maTa TeMa me fleMOHcrpi/ipaMe KaK touho ce pea/iki3wpa TOBa. 

ActiveX KOHTpO/IH 

ripeflu noyiBaTa Ha .NET Framework Windows npn^OKeHMATa ca 6m/im 6a3M- 
paHM Ha nporpaMHMfl MOfle/i "Win32". B Win32 cpefla ce M3no/i3BaT t. Hap. 
ActiveX kohtpo/im, komto ce pea/iki3wpaT npe3 KOMnoHeHTHna MO,qe/i Ha 
Windows (COM - Component Object Model). 

ActiveX KOHTpo/ii/iTe npeflcraB/iflBaT rpacpMUHM KOMnOHeHTM. Te MMaT cbom- 

CTBa, Hpe3 KOMTO MM Ce 3aflaBaT pa3/lMHHM XapaKTepMCTMKM, M Ct6MTMfl, 

ynpaB^flBaiflM noBefleHMeTO mm. 

ActiveX KOHTpo^MTe mhoto npM/iMnaT Ha Windows Forms KOHTpo/iMTe ot .NET 
Framework, ho 3a pa3/iMKa ot tax ce pea/iM3MpaT c HeynpaB/iHBaH koa m 
npeflM M3no/i3BaHe Tpa6Ba fla ce perMCTpMpaT npe3 ,qo6aBflHe b perMCTpMTe Ha 
Windows (Windows Registry). 

riopaflM flt^rMfl nepMOfl Ha pa3BMTMe Ha Win32 n/iaTCpopMaTa, MMa m3k/ikdhm- 
Te/iHO mhoto ActiveX kohtpo/im, komto ca cb3flafleHM c TeneHMe Ha roflMHMTe 

OT pa3/lMHHM COCpTyepHM npOM3BOflMTe^M. 

B .NET Framework no zieceH HanMH, 6e3 fla ce nMiue ptuHO nporpaMeH koa, 
MoraT fla ce M3no/i3BaT Bene pa3pa6oTeHM ActiveX kohtpo/im. HanpMMep 
MO>KeM fla BrpaflMM ye6 6pay3tpa Internet Explorer m/im neTeua Ha PDF 



60 nporpaMnpaHe 3a .NET Framework (tom 2) 

AOKyMeHTM Adobe Acrobat Reader ioto nacr ot Haiue npw/io>KeHi/ie. KaK touho 
ce M3no^3BaT ActiveX kohtpo/im b Windows Forms me pa3r/ieflaMe b TeMaTa 
" B3anMOfleMCTBne c HeynpaB/iaBaH koa " . 

nenaTaHe Ha npuHTep 

B Windows Forms ca npeflocTaBeHM yqo6Hi/i cpeflCTBa 3a nenaTaine Ha flOKy- 
MeHTM Ha npuHTep. Te npeAOcraBHT flocTtn ao bcmukm craHAapTHki Ana/i03ki 
3a nenaT, npe3 komto noTpe6kiTe/ikiTe M36npaT nenaTamo ycrpoMCTBO v\ 
HacTpoMBaT HeroBMTe xapaKTepucTMKn. CaMOTO nenaTaHe ce M3B"bpujBa etc 
CTaHflapTHMTe cpeACTBa Ha .NET Framework 3a nepTaHe Btpxy noBtpxHOcm. 

Windows Forms kohtpo/im b Internet Explorer 

ripn npoeKTupaHeTO Ha .NET Framework e 3a/io>KeHO Windows Forms kohtpo- 
ziMTe p,a MoraT p,a ce i/i3n"b/iHHBaT b cpeAaTa Ha Internet Explorer v\i\v\ Apyrn 
ye6 6pay3"bpn, 6e3 p,a ce 3acTpaiuaBa ckirypHOcrra Ha noTpe6kiTe/i*i. 

Ta3M TexHO/iorwa e eAHa flo6pa cbBpeMeHHa a/uepHaTMBa Ha Java an/ieTMTe v\ 
no3BO^ABa pa3LunpflBaHe Ha cpyHKui/iOHa/iHOcrra Ha ye6 npw/io>KeHkiflTa c 
rbBKaB MHTepaKTMBeH noTpe6nTe^CKM nHTepcpekic. Ha npaKTMKa ce p,aBa Bt3- 
mo>khoct .NET npn^o>KeHMfl p,a ce M3n"b/iH*iBaT b 6pay3"bpa Ha K/iweHTa ioto ce 
BrpaflflT b HaM-o6nKHOBeHa ye6 crpaHkiua (noflo6HO Ha Flash TexHO/iorkisiTa). 

CmiHa noflflpi>>KKa Ha rpacjDMKa (GDI+) 

Ei/i6/ii/iOTei<aTa Windows Forms ujmpoko ki3no/i3Ba cpeACTBaTa Ha Windows 
n/ianpopMaTa 3a ^epTaHe v\ pa6oTa c rpacpn^HM o6eKTM (GDI+). Windows 
Forms no3BO/iHBa Te3M cpeACTBa p,a ce M3no/i3BaT 3a c"b3AaBaHe Ha co6cTBeHM 
M3o6pa>KeHMfl Btpxy pa3/innHM noBtpxHOCTM - b npo3opeu, Btpxy npuHTep, 
n/iOTep m Ap. flaBa ce Aocrbn ao bcmukm no-Ba>KHM npMMMTMBM 3a nepTaHe - 
TeKCT, rpacpM4HM M3o6pa>KeHMfl, reoMeTpwuHM cpurypn (toukm, /imhmi/i, npaBO- 
"brb/iHkiui/i, env\ucv\) v\ t. h. 

H awe to ni>pBO Windows Forms npu/ioweHue 

3a p,a n^KDCTpupaMe KaK ce ki3no/i3Ba Ha npaKTMKa Windows Forms, p,a 
pa3MeAaMe c/ieAHOTO npocTO npki/io>KeHMe: 



using System; 

using System. Windows . Forms; 

public class SampleForm : System. Windows . Forms . Form 

{ 

static void Main ( ) 

{ 

SampleForm sampleForm = new SampleForm () ; 
sampleForm. Text = "Sample Form" ; 
Button button = new Button ( ) ; 
button. Text = "Close"; 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 61 



button . Click += 

new EventHandler ( sampleForm. button_Click) ; 
sampleForm. Controls .Add (button) ; 
sampleForm. ShowDialog ( ) ; 
sampleForm. Dispose ( ) ; 



private void button_Click (ob j ect sender, EventArgs e) 



{ 



Close 



} 



B Hero ce cb3,qaBa npo3opeu, komto cbfltpwa 6yTOH c TeKCT "Close", ripn 
HaTMCKaHe Ha 6yTOHa npo3opeu"bT ce 3aTBapa (TOBa ce pea/iki3wpa npe3 npn- 
xBaiuaHe v\ o6pa6oTKa Ha cb6nTneTO "HaTMCKaHe Ha 6yTOHa"). 

KaKfla KOMrmsmpaMe m crapnipaMe npHMepa? 

3a fla KOMnn^npaMe ropHOTO npi/i/io>KeHkie, MO>xeM ,qa no/i3BaMe koh30/ihi/15i 
KOMnw/iaTop Ha .NET Framework 3a e3MKa C#: 



esc SampleForm.es 



Mo>KeM fla KOMnw/ikipaMe npuMepa v\ ot VS.NET, ho 3a ue/ua Tpa6Ba fla 
cb3flafleM hob Windows Application npoeKT v\ fla KonnpaMe KOfla b Hero. 

ripn M3n"b^HeHne Ha npw/io>KeHi/ieTO ce no/iynaBa cnep,uv\s\ pe3y/iTaT: 



u 



Sample Form 



Close 



A 



KaK pa6oTii npnMep"t>T? 

HaiueTO ntpBO Windows Forms npi/i/io>KeHi/ie e flocTa npocTO. To e M3rpafleH0 
no c/ieflHMfl Ha^MH: 

- flecpMHkipaH e K/iac SampleForm, KOMTO Hac/ieflflBa K/iaca System. 

windows . Forms . Form. To3M K/iac npeflcraB/iflBa r/iaBHaTa dpopMa Ha 
npn^OKeHneTO. 

- B r/iaBHMJi MeTOfl Main() ntpBO ce 3aflaBa 3ar/iaBkie 3a dpopMaTa. C/iefl 
TOBa ce cb3flaBa 6yT0H, komto ce flo6aBfl b cnncbKa c KOHTpo/ikue Ha 
dpopMaTa m ce npuxBaiua ct6nTneT0 "mpaKBaHe Btpxy 6yT0Ha". HaKpaa 



62 nporpaMkipaHe 3a .NET Framework (tom 2) 

cpopMaTa ce noKa3Ba b MORanen pe>KMM (MOAa/ieH pe>KMM 03HanaBa, ne 
ApyrnTe cpopMM Ha npki/ic»Kei-ikieTO He ca aKTMBHM, aoioto He ce 3aTBopn 
TeKymaTa) v\ cnep, 3aTBapsiHeTO v\ ce yHMiuo>KaBa. 

- ripn HaTMCKaHe Ha 6yTOHa ce M3BMKBa c"b6nTne, KoeTO 3aTBapa 
cpopMaTa, m npn^OKeHneTO 3aB"bpujBa. 

ripuMeptT e flocra npocT v\ noKa3Ba ocHOBHkue MOMeHTM npn M3rpa>KAaHeTO 
Ha noTpe6kiTe/iCKM MHTepcpeMC c Windows Forms - cb3AaBaHe Ha cpopMM, 
nocTaBAHe Ha kohtpo/im bbb cpopMMTe, HacTpoMKa Ha CBOMCTBaTa Ha kohtpo- 
i\v\je, npuxBaiuaHe v\ o6pa6oTBaHe Ha cb6i/iTi/m. 

Bn6/inoTeKMTe Ha .NET 3a M3rpa>KflaHe Ha GUI 

CpeACTBaTa Ha .NET Framework 3a i/i3rpa>KAaHe Ha rpacpi/meH noTpe6kiTe/iCKM 
MHTepcpewc ca AecpuHnpaHM b npocrpaHCTBaTa ot MMeHa system. Drawing v\ 

System. Windows. Forms, KOMTO Ca pea/1 M3kl pa Hkl C"bOTBeTHO b aceM6/ikiTaTa 
System.Drawing.dll M System.Windows.Forms.dll. Te3M npoCTpaHCTBa 3a- 

eAHO c npocrpaHCTBaTa, cbAtpxaiun ce b tax, ca M3o6pa3eHM Ha cpurypaTa: 




System. Drawing 










Drawing2D 




Printing 
















Imaging 




Text 















npocTpaHCTBOTO System. Windows. Forms 

K/iacoBeTe v\ TunoBeTe ot npocrpaHCTBOTO system. windows. Forms ocurypfl- 
BaT cpeACTBa 3a pa6oTa c npo3opun, Ana/1031/1, kohtpo/im 3a B"bBe>KAaHe Ha 
TeKCT, kohtpo^m 3a i/i36op, MeHKrra, zieHTi/i c MHCTpyMeHTM, Ta6^Mun, A^pBeTa 
M AP- 

npocTpaHCTBOTO System. Windows. Forms. Design 

npocrpaHCTBOTO System. Windows. Forms. Design CbA"bp>Ka K/iacOBe, KOMTO 

noAA"bp>KaT KOHCpurypupaHeTO Ha KOMnoHeHTMTe v\ AecpMHupaT noBeAeHneTO 
Ha Windows Forms KOHTpo/ikiTe no BpeMe Ha AH3ai/iH. 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 63 

npocrpaHCTBOTO System. Drawing 

K/iacoBeTe v\ TunoBeTe ot npocTpaHCTBOTO system. Drawing m HeroBMTe nofl- 
npocTpaHCTBa ocurypaBaT Aocrtn ao GDI+ cpyHKunnTe Ha Windows: pa6oTa c 

nOBtpXHOCTM, T04KM, /11/IHMkl, HeTKM, MO/IMBM, reOMeTpM4HM CpMrypM, KapTMH" 
KM, TeKCT M UjpMCpTOBe M AP- 

npOrpaMHM KOMnOHeHTM 

B cocpTyepHOTO MHxeHepcTBO KOMnoHeHTi/ue ca npew3no/i3BaeMki (reusable) 
nporpaMHM eAMHuun (K/iacoBe), komto peiuaBaT cneui/icpkinHa 3aAana. BceKM 
KOMnoHeHT MMa flCHO AecpMHupaH MHTepcpewc, komto onucBa HeroBMTe cbom- 
CTBa, MeTOAM m c"b6nTMfl. KoMnoHeHTMTe ce M3no/i3BaT KaTO 4acTM ot Apyrn 
KOMnOHeHTM v\nv\ nporpaMM - Te ca rpaAMBHMTe e/ieMeHTM Ha codrryepa. 

KoMnoHeHTeH MOfle/i 

B cocpTyepHOTO MH>KeHepcTBO KOMnoHeHTHMAT MOAe/i AecpMHupa craHAapTMTe 
3a pa3pa6oTKa v\ ki3no/i3BaHe Ha nporpaMHMTe KOMnOHeHTM v\ TexHua >KM3HeH 
UWKb/i. Te3M CTaHAapTM onucBaT npe3 MHTepcpekicM MOAe/ia Ha noBeAeHne i/i 
B3anMOAeMCTBne Ha bcm^km KOMnOHeHTM b AaAeHa cpeAa. 

KoMnoHeHTHMAT MOfle/i Ha .NET Framework 

KoMnoHeHTHMAT MOAe/i Ha .NET Framework AecpMHupa nporpaMHua MOAe/i 
(cucTeMa ot npaBki/ia) 3a cb3AaBaHe v\ ki3no/i3BaHe Ha .NET KOMnOHeHTM. To3m 
nporpaMeH MOAe/i ce pea/iw3wpa npe3 onpeAe/ieHM K/iacoBe v\ MHTepcpeMCn, 
komto noAA"bp>KaT onucaHneTO Ha KOMnoHeHTMTe. 

B .NET Framework KOMnoHeHTHMAT MOAe/i no3BO/iflBa AecpMHupaHe Ha noBe- 
AeHneTO Ha KOMnoHeHTMTe no BpeMe Ha AH3ai/iH (design-time behavior) v\ no 
BpeMe Ha pa6oTa (runtime behavior). 

KOMnOHeHTM M KOHTeMHepM 

B .NET Framework ca AecpuHnpaHM ABa BMAa npen3no/i3BaeMki o6eKTn: kom- 
noHeHTM m KOHTewHepn. KoMnoHeHTMTe ca cpyHKui/iOHa/iHw eAMHuun, komto 
peiuaBaT H^KaKBa 3aAana, a KOHTewHepnTe ca o6eKTM, komto cbAtpwaT cnn- 

CbK OT KOMnOHeHTM. 

npeM3no/i3BaeMOCT Ha KoMnoHeHTMTe 

B^aroAapeHne Ha Me>KAye3MKOBaTa cbBMecrwMOCT, koato CLR ocurypaBa, 
.NET KoMnoHeHTMTe MoraT AnpeKTHO p,a ce npew3no/i3BaT bbb bcmukm .NET 
e3Mun 3a nporpaMnpaHe. B"b3MO>KHO e .NET KOMnOHeHTM p,a 6"bAaT M3no/i3BaHki 
m ot Win32 npn^o>KeHMfl, ho 3a ue/iTa Tpa6Ba p,a ce ny6/ikiKyBaT bbb bma Ha 
COM o6eKTM. 



64 nporpaMnpaHe 3a .NET Framework (tom 2) 

npocrpaHCTBOTO System. ComponentModel 

KoMnoHeHTM ce ki3no/i3BaT He caMO b Windows Forms, a HaBCflKtAe b .NET 
Framework, no Ta3M npwuwHa ocHOBHaTa cpyHKuwoHa/iHOcr Ha KOMnoHeHTHna 

MOAe/1 Ha .NET ce HaMkipa B npoCTpaHCTBOTO System. ComponentModel. B Hero 
ca flecpMHMpaHM OCHOBHI/ITe MHTepcpeMCM IComponent V\ IContainer M TeXHMTe 
MMn^eMeHTaUMM Component M Container. 

Windows Forms m KOMnoHeHTHMjrr MOfle/i Ha .NET 

B apxnTeKTypaTa Ha Windows Forms 3a/iaraT KOHuenunnTe Ha KOMnoHeHTHna 
MOAe/i Ha .NET Framework. KoMnoHeHTHMHT MOAe/i Ha .NET AecpMHupa KOMno- 
HeHTM m KOHTeMHepn. no noflo6eH Ha^MH Windows Forms flecpMHupa kohtpo/ii/i 

M KOHTeMHep-KOHTpO/lH. 

KOHTpOJIM II KOHTeMHep-KOHTpOJIM 

KoHTpo^MTe b Windows Forms ca bcmukm KOMnoHeHTM, komto ca bmammm 3a 
noTpe6nTe^fl (MMaT rpacpi/mHO M3o6pa>KeHMe). Te 6nBaT ABa BMAa: KOHTewHep 

KOHTpO^M (CpOpMM, AHa/103M, naHe/lkl M T.H.) M KOHTpO/lM (6yTOHM, TeKCTOBM 

no/ieTa, eTMKeTM, cnwcbUHki kohtpo/im m t.h.). KoHTewHepnTe ca npeflHa3- 
HaneHM p,a cbAtpwaT b ce6e cm Apyrn kohtpo/im (BK/uonwTe/iHO v\ Apyrn koh- 
TeMHep kohtpo^m), AOKaTO KOHTpo/ikiTe ca npeAHa3Ha4eHM p,a ce cbAtpwaT b 

KOHTeMHep KOHTpO^MTe. 

B Windows Forms BC^Ka KOHTpo/ia MO>Ke p,a ce ki3no/i3Ba KaTO KOHTeMHep- 

KOHTpO/ia, HO 3a HflKOM KOHTpO/lkl TOBa e 6e3CMMC/ieHO. HflMa CMMCb/1 m He e 

npaBki/iHO b 6yTOH p,a ce nocraBsiT Apyrn 6yTOHM v\nv\ TeKCTOBM no/ieTa. 

nporpaMeH MOfle/i Ha Windows Forms 

riporpaMHkiflT MOAe/i Ha Windows Forms AecpMHupa K/iacoBeTe 3a pa6oTa c 

CpOpMM, AHa.fl03M M KOHTpO/lM, C"b6MTMflTa Ha KOHTpO^MTe, >KM3HeHMfl UMKb/1 Ha 

npn^o>KeHMflTa, MOAe/ia Ha npenepTaBaHe Ha KOHTpo/iMTe, MOAe/ia Ha no/iyna- 
BaHe m o6pa6oTKa Ha cb6kiTmrra v\ MOAe/ia Ha ynpaB/ieHwe Ha cpOKyca. HeKa 
pa3r/ieAaMe bcmukm Te3M e/ieMeHTki ot nporpaMHua MOAe/i. 

OopMM 

Windows Forms npeA/iara craHAapTHki K/iacoBe 3a pa6oTa c cpopMM (TOBa ca 
npo3opunTe m Ana/1031/iTe b GUI npn^OKeHMATa). OopMMTe MoraT p,a 6"bAaT 
MOAa^HM m HeMOAa^HM (no eAHa v\i\v\ no mhoto aKTMBHM eAHOBpeMeHHo). 
OopMMTe ca KOHTewHep-KOHTpo^n m MoraT p,a cbAtpwaT Apyrn kohtpo/im, 
HanpuMep eTMKeTM, TeKCTOBM no/ieTa, 6yTOHM v\ t.h. Ba30B K/iac 3a bci/iukm 

CpOpMM e K/iaCbT System. Windows. Forms. Form. 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 65 

KOHTpOJIM 

KoHTpo^MTe b Windows Forms ca TeKCTOBMTe no/ieTa, eTMKeTMTe, 6yTOHMTe, 
cnncbunTe, A^pBeTaTa, Ta6/iMu,MTe, MeHKrraTa, zieHTUTe c MHCTpyMeHTM, CTaTyc 
^eHTMTe m mhoto flpyrn. Windows Forms fledpuHupa 6a30BM K/iacoBe 3a koh- 
Tpo/iMTe m K^acoBe-Hac^eflHuun 3a BC^Ka KOHTpo/ia. 5a30B K/iac 3a bcmukm 

KOHTpo/lM e K/iaCbT System. Windows. Forms. Control. ripMMep 3a KOHTpo/ia e 
HanpMMep 6yTOH"bT (K/iaCbT System. Windows. Forms. Button). 

Ct>6mtmh 

Bcmukm kohtpo^m ot Windows Forms AecpMHupaT Ch6v\Twn, komto nporpaMMC- 
T"bT Moxe p,a npuxBaiua. HanpuMep KOHTpo/iaTa Button AedpuHupa ct6nTneTO 
click, KoeTO ce aKTMBupa npn HaTMCKaHe Ha 6yTOHa. C"b6nTMflTa b Windows 
Forms ynpaB/iflBaT B3anMOfleMCTBneTO Me>KAy nporpaMaTa v\ KOHTpo/iMTe v\ 
Me>KAy caMMTe kohtpo/im. 

>Kn3HeH mmki>/i Ha Windows Forms npmiOMceHiiflTa 

Xn3HeHMflT u,MKb/i Ha GUI npw/io>KeHkiflTa e 6a3npaH Ha cbo6meHMfl. rpacpMn- 
HaTa cpeAa Ha onepaunoHHaTa CMcreMa npuxBaiua bcmukm noTpe6MTe/iCKM 
AeMCTBMfl (Hanp. ABuxeHneTO Ha MMUJKaTa, HaTMCKaHeTO Ha K/iaBMWM ot 
K/iaBkiaTypaTa v\ t.h.) m vv\ HaTpynBa b cneu,Ma/iHa onaujKa. Cnep, TOBa bcako 
c"bo6iueHne ce npeAaBa kbm npn^OKeHneTO, 3a KoeTO ce OTHaca v\ no-TOHHO 
KtM HMiuKaTa (thread) ot npi/i/io>KeHi/ieTO, 3a koato ce OTHaca. 

HMUJKM M MHOr03aAaHHOCT 

B MHoro3aAa4HMTe onepaunoHHM CMcreMM (KaKBMTO ca HanpuMep Windows v\ 
Linux) e B"b3MO>KHO eAHO npn/ioxeHne p,a M3n"b/iH*iBa hako/iko 3aAanM napa- 
/ie/iHO, KaTO M3no/i3Ba hako/iko hmujkm (threads) b paMKMTe Ha npoueca, b 
komto pa6oTM nporpaMaTa. 

3a ue/iMTe Ha HacToaiuaTa TeMa MO>KeM p,a cm mmc/imm, ne HMiuKMTe ca Heiuo 
KaTO OTAe^HM 3aAa4M b nporpaMaTa, komto ce M3n"b/iH*iBaT eAHOBpeMeHHO 
(napa/ie/iHo) b AaAeH momcht. no-HaTaTbK, b TeMaTa " MHoroHMUJKOBO nporpa- 
MMpaHe m CMHxpoHM3auMa ", me o6"bpHeM cneuMa^HO BHMMaHMe Ha MHoro3a- 

Aa^HOCTTa, M3n0^3BaHeTO M CMHXpOHM3aU,MflTa Ha HMUJKM. 

OnaujKaTa ot cb6MTnn 

BcflKa HMUJKa ot bchko npMJioxeHMe cm MMa cboa co6cTBeHa onaujKa, b kohto 
nocTtnBaT cbo6iueHMflTa 3a bcmukm cb6MTMfl, MABaiuM ot noTpe6MTejia mjim ot 

APyTM M3T04HMUM. BCflKO Cb06lUeHMe HOCM MHCpOpMaUMfl 3a Cb6MTMeTO, KOeTO 

e HacTtnMJio - nacbT Ha HacrbnBaHe, MAeHTMCpMKaTop Ha npo3opeu, 3a komto 
ce OTHacyi cb6MTMeTO, TMn Ha cb6MTMeTO, napaMeTpM Ha cb6MTMeTO (Hanp. 
HOMep Ha HaTMCHaTMfl KJiaBMiu npM cb6MTMe ot KJiaBMaTypaTa mjim no3Mu,Ma Ha 
Kypcopa npM ct6MTMe ot MMUJKaTa) m t.h. B Windows Forms cbo6uj,eHMflTa ca 

MHCTaHUMM Ha CTpyKTypaTa System. Windows. Forms. Message. 



66 nporpaMnpaHe 3a .NET Framework (tom 2) 

T/iaBHaTa HMUJKa Ha bcako Windows Forms npn^OKeHne M3B"bpujBa eflHa 
eflMHCTBeHa 3a,qana: b 6e3KpaeH ui/iKb/i o6pa6oTBa onaujKaTa ot c"bo6iueHMfl 
3a npi/i/io>Kei-ii/ieTO v\ npeAaBa nocTbnw/iMTe cbo6meHMfl Ha KOHTpo/iaTa, 3a 
koato ca npeAHa3Hanei-m. 

B Windows Forms npn^OKeHMATa BMHarn MMaT touho ep.ua HMUJKa, koato 
o6pa6oTBa bcm^km cbo6meHi/ifl, MflBaiun ot rpacpwuHMTe kohtpo/im, m TOBa e 
r/iaBHaTa HMUJKa Ha npw/io>KeHi/ieTO. rpacpwuHWflT noTpe6kiTe/iCKki MHTepcpewc 
Ha ua/iOTO npn^oxeHne ce ynpaB/iABa ot Ta3M HMUJKa. ripn HacTbnBaHe Ha 

C"b6MTMe, CB"bp3aHO C HflKOfl OT CpOpMMTe Ha npM^O>KeHMeTO V\I\V\ KOHTpO^MTe B 

Hea, b onaujKaTa Ha r/iaBHaTa HMUJKa nocrbnBa cbOTBeTHO c"bo6iueHne v\ to ce 
o6pa6oTBa, KoraTO My p,ov\p,e peflvr. 

CaMO r/iaBHaTa HMiuxa Tpn6Ba Aa B3anM0AeMCTBa c onauiKaTa ot 

Cb6MTMn 

Mhoto e Ba>KHO, KoraTO pa3pa6oTBaMe Windows Forms npi/i/io>KeHi/m, fla ce 
c"bo6pa3ABaMe etc c/ieflHOTO npaBM/io: 




rpacjjMHHMflT noTpe6MTe/iCKM MHTepcpePic Ha npmio>KeHi/ieTO 
Tpn6Ba fla ce ynpaB/inBa caMO m eflMHCTBeHO ot HeroBaTa 
r/iaBHa Htnntca. 



Ako He cna3BaMe TOBa npaBki/io, me ce c6/i"bCKaMe c mhoto crpaHHki v\ 
HenpuflTHM npo6/ieMM. HanpuMep, aKO crapTwpaMe eflHOBpeMeHHO hhko/iko 
hmujkm m ot BCflKa ot Tax ot BpeMe Ha BpeMe npoMeHAMe cbfltp>KaHMeTO Ha 
onpefle/ieHO TeKCTOBO no/ie, e B"b3MO>KHO b .qafleHki MOMeHTM npi/i/io>KeHkieTO 
fla "3aBMCBa". 

Bcnxa KOHTpo/ia o6pa6oTBa co6cTBeHMTe cm cb6nTMH 

KoraTO r/iaBHaTa HMUJKa Ha Windows Forms npn/ioxeHne no/iynw cto6iueHne, 
CB"bp3aHO c HAKOfl ot HeroBMTe cpopMM, Tfl npenpama cbo6meHi/ieTO ao o6pa- 
6oT4MKa Ha c"bo6iueHMfl Ha cbOTBeTHaTa cpopMa. T031/1 o6pa6oTHMK ot cboh 
CTpaHa npoBep^Ba fla/iw cbo6meHi/ieTO e 3a caMaTa cpopMa v\nv\ 3a hakoh 
HeMHa KOHTpo/ia. Ako cbo6meHi/ieTO e 3a cpopMaTa, to ce o6pa6oTBa flupeKTHO 
ot CbOTBeTHkia o6pa6oT4MK Ha Cb6MTMfl. Ako Cbo6meHkieTO e 3a hakoa ot 
KOHTpo/ikiTe BtB cpopMaTa, to ce npeflaBa Ha Hea. KoHTpo/iaTa, kohto no/iyni/i 
c"bo6iueHneTO, MO>Ke fla e o6nKHOBeHa KOHTpo/ia v\nv\ KOHTei/iHep-KOHTpo/ia. 
KoraTO o6nKHOBeHa KOHTpo/ia no/iynw c"bo6iueHne, ta ro o6pa6oTBa flupeKT- 
ho. KoraTO KOHTekmep-KOHTpo/ia no/iyni/i c"bo6iueHne, ta npoBep^Ba fla/iki to e 
3a Hea ki/iki e 3a HflKoa ot B/io>KeHi/iTe kohtpo/im. ripouecbT npoflt/iwaBa, 
flOKaTO c"bo6iueHneTO flocTurHe ao KOHTpo/iaTa, 3a koato e npeflHa3HaneHO. 

no onucaHaTa cxeMa bcako cbo6meHi/ie npeMMHaBa ot r/iaBHaTa HMUJKa Ha 
npn^OKeHneTO npe3 cpopMaTa, 3a kohto ce OTHaca, v\ eBeHTya/iHO npe3 oiue 
eflHa ki/iki hako/iko flpyrn kohtpo/ii/i, flOKaTO cm HaMepn o6pa6oTni/iKa. 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 67 

06pa6oTKa Ha c"b6nTne - npMMep 

HeKa MMaMe HAKaKBO npi/i/io>KeHi/ie, KoeTO ce cbcroi/i ot eflHa dpopMa, b koato 
MMa eAMH 6yTOH. J\a npeAno/io>Ki/iM, ne HaTMCHeM /ieBi/m 6yTOH Ha MMUJKaTa, 
flOKaTO KypcoptT e Btpxy 6yTOHa bbb dpopMaTa. KaKBO ce cnyuBa? 

T^aBHaTa HMUJKa Ha npM/io>KeHMeTO no/iynaBa cbo6meHkie "HaTMCHaT /iab 
6yTOH Ha MMiuKa", b KoeTO ca 3anncaHM KOopAMHaTMTe, b komto e 6m/i 
KypcoptT Ha MMiuKaTa b MOMeHTa Ha HaTMCKaHeTO. OnepaunoHHaTa ci/icreMa 
noAaBa Te3M KOopAHHaâ„¢ OTHOCMTe/iHO cnpaMO ropHi/m nne trb/i Ha dpopMaTa. 

flOKaTO o6pa6oTBa cbo6meHi/ieTO, r/iaBHaTa HMUJKa Ha npki/io>KeHMeTO OTKpuBa 
dpopMaTa, 3a koato ce OTHaca ct6nTneTO (TOBa e Haw-ropHaTa ot bcmukm 
dpopMM, b komto nonaAa KypcoptT Ha MMiuKaTa) v\ ro npeAaBa Ha HeMHua 
o6pa6oT4MK Ha Cb6v\Twn. 

OopMaTa no/iynaBa cbo6meHi/ieTO v\ BM>KAa, ne to ce OTHaca 3a HsiKaKBa 
no3Munfl, b koato ce HaMupa HAKaKBa Hei/ma KOHTpo/ia (b c/iynaa TOBa e 
6yTOH"bT). OopMaTa npeueHABa, ne cbo6meHi/ieTO He e 3a Hea, a e 3a 6yTOHa, 
m My ro npeAaBa. 

ByTOHtT no/iynaBa c"b6nTneTO v\ BM>KAa, ne to e npeAHa3HaneHO touho 3a 
Hero. C"b6nTneTO 6nBa norb/iHaTO (KOHcyMnpaHO) ot o6pa6oTni/iKa Ha cb6iiTkm 
Ha 6yTOHa v\ cbOTBeTHO 6yTOH"bT npeMMHaBa b cbcroflHkie "HaTMCHaT". CaMn^T 
6yTOH Ma/iKO cnep, TOBa M3npaiua c"b6nTne 3a npenepTaBaHe ao caMna ce6e cm 
(Ha npenepTaBaHeTO me o6"bpHeM BHMMaHne cnep, Ma/iKo). KoraTO TOBa 
cb6kiTkie AOCTurHe no ctiunfl ntT ao 6yTOHa, tom ce npenepTaBa b HaTMCHaTO 

CbCTOflHMe. 

npeKpamBaHe Ha Windows Forms npmicoKeHMe 

ripn 3aTBapaHe Ha r/iaBHaTa dpopMa Ha Windows Forms npi/i/io>KeHi/ie, KbM Hea 
ce M3npaiua cbo6meHi/ie 3a 3aTBap*iHe. OopMaTa ce 3aTBapa b MOMeHTa, b 
komto no/iynw Cbo6meHi/ieTO v\ ro o6pa6oTM. B pe3y/iTaT Ha 3aTBapaHeTO Ha 
dpopMaTa ce npeKpaTABa umcbjivr, b komto r/iaBHaTa HMUJKa Ha npn^OKeHneTO 
o6pa6oTBa npucTuraiunTe 3a Hea c"bo6iueHMfl v\ npw/ioweHi/ieTO npwK/iiouBa 
M3n"b^HeHneTO cm. 

Mofle/i Ha npenepTaeaHe Ha KOHTpo/iMTe 

B Windows Forms KOHTpo/ikiTe necro ce npenepTaBaT, HanpuMep npn npe- 
MecTBaHe Ha npo3opeu, npn CM^Ha Ha aKTMBHua npo3opeu v\nv\ npn npoM^Ha 
Ha pa3Mepa, no3nunflTa v\nv\ cbcroflHkieTO Ha HflKoa KOHTpo/ia. ripn bcako ot 
M36poeHMTe AeMCTBMfl eAHa v\nv\ hhko/iko kohtpo/ii/i, komto nonaAaT b o6cera 
Ha AaAeH 3acerHaT pernoH, ce o6flBABaT 3a HeBa/ikiAHki v\ ce aKTMBupa npoue- 
cvr Ha npe^epTaBaHe. 

npoueci>T Ha npenepTaBaHe 

ripouecbT Ha npe^epTaBaHe Ha KOHTpo/ia, koato e 3acerHaTa ot npoMAHa b 
Hea caMaTa, ot npoM^Ha Ha KOHTefiHep-KOHTpo/iaTa, b koato ce HaMupa, m/im 
ot npoMAHa b Apyrn ctceAHM kohtpo^m, ce M3B"bpujBa Ha ABa eTana: 



68 nporpaMnpaHe 3a .NET Framework (tom 2) 

1. 3a KOHTpo/iaTa ce M3BMKBa MeTOflvr invalidate () , komto o6flB*iBa 3a 
HeBa^MAHa AafleinaTa KOHTpo/ia v\nv\ ojp,eneu HenH yuacrbK v\ M3npaiua 
3aaBKa 3a npenepTaBaine. invalidate () pea/iHO MapKupa pernoHMTe ot 
KOHTpo^aTa, komto no HflKaKBa npn^MHa MMaT Hy>Kfla ot npenepTaBaine v\ 
cnefl TOBa v\ M3npaiua cbo6meHMe "npe^epTaki" (wm_paint), KoeTO ce 
ki3n"b/iHflBa no-K"bCHO. 

2. B HAKaicbB MOMeHT uMKb/ivr 3a o6pa6oTKa Ha c"bo6iueHMfl Ha TeKymaTa 
HMiuKa no/iynaBa c"bo6iueHneTO "npenepTafi" v\ b pe3y/iTaT M3n"b/iHflBa 
MeTOAa Paint o Ha cbOTBeTHaTa KOHTpo/ia. To3m MeTOA M3BtpujBa 
caMcrro rpacpM^HO o6HOBHBaHe Ha bcmukm HeBa/iMflHM yuacrbUM ot 
KOHTpo^aTa v\nv\ b nacmocr a npenepTaBa usi/iaTa. 

flpyr MHTepeceH MeTOfl, CB"bp3aH c npenepTaBaHeTO Ha KOHTpo/iMTe, e 

Update () MeTOfl"bT. TOM MO>Ke fla Ce M3nO/13Ba C/iefl Invalidate o 3a 

He3a6aBHO npenepTaBaHe Ha flafleHa KOHTpo/ia npe3 HacM/icrBeHO M3BMKBaHe 
Ha Paint o, 6e3 fla ce M3naKBa Paint o fla 6tfle M3BMKaH ot uMKb/ia 3a 
o6pa6oTKa Ha cbo6meHMfl 3a TeKymaTa Hi/iwKa. 

Ci>o6meHMeTO "npenepTaii" 

C-bo6iueHneTO "npe^epTaki" (wm_paint) e cneuMa/iHO cbo6meHMe. To ce o6pa- 
6oTBa nocneflHO, eflBa c/iefl KaTO bcmukm ocraHa/iM c"bo6iueHMfl ot onaujKaTa 
Ha r/iaBHaTa HMiuKa Bene ca o6pa6oTeHM v\ b Hea ocTaHaT caMO cbo6meHMfl 
"npenepTaw". ToBa ocurypaBa HaMa/iflBaHe Ha npeTpenBaHMATa Ha kohtpo/im- 
Te, KoraTO Te ce npoMeHAT mhoto nvrii 3a KpaTKO BpeMe. 

HanpuMep, aKO npn o6pa6oTKaTa Ha flafleHO c"b6nTne Ha flafleHa KOHTpo/ia 
6"bfle M3npaTeHO 5 irbTki c"bo6iueHne "npenepTai/i", KOHTpo/iaTa me M3n"b/iHi/i 
caMO eflHO npe^epTaBaHe v\ to eflBa cnep, KaTO cpopMaTa e o6pa6oTM/ia bcmukm 
ocraHa/iM cbo6meHkifl n e craHa/io acho kom kohtpo/im b MOMeHTa ca 
HeBa/ii/iflHM m Tpa6Ba fla ce npenepTaaT. 

Pea/iHOTO rpacpM^HO M3o6pa3flBaHe Ha 3a*iBeHi/iTe 3a npenepTaBaHe kohtpo/im 
ce M3B"bpujBa, KoraTO Te o6pa6oTBaT c"bo6iueHneTO "npenepTaw", KoeTO Moxe 
fla e mhoto cnep, KaTO npenepTaBaHeTO e 3a*iBeHO. 

KoraTO ce npenepTaBaT hako/iko kohtpo/im noc/ie,qoBaTe/iHO, Te BMHarn ce 
npenepTaBaT b pefla, b komto KOHTpo/iMTe ca nocraBeHM b KOHTeMHep- 
KOHTpo/iaTa (t. Hap. Z-order). ritpBM ce npenepTaBaT Haw-paHO nocraBeHMTe 
kohtpo/im, a nocneflHki - Haw-KtCHO nocraBeHMTe. 

Pea/i M3a una Ha npenepTaBaHeTO 

BcflKa Windows Forms KOHTpo/ia MO>Ke fla flecpMHupa nporpaMeH koa, komto 
pea^M3npa M3nepTaBaHeTO Ha HewHOTO ctfltpxaHne (MeTOfl Paint o). 

Windows Forms KOHTpo/iMTe MoraT fla ce nocraBflT eflHa Btpxy flpyra etc 
3acT"bnBaHe. rioHewe npn npenepTaBaHe KOHTpo/iMTe ce M3o6pa3flBaT eflHa 
cnep, flpyra no pefla Ha nocraBAHeTO mm, aKO MMa 3acTbnBaHMfl, nocneflHO 
nocraBeHaTa KOHTpo/ia 3aKpnBa (nacrMUHO v\nv\ Hant/iHo) bcmukm kohtpo/im, c 
komto ce 3acrbnBa. 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 69 

rio-HaTarbK b HacToaiuaTa TeMa me flafleM npuMepeH koa, komto pea/iki3wpa 
npenepTaBaHeTO Ha KOHTpo/ia npe3 ki3no/i3BaHe Ha rpacpi/mHWTe npMMMTMBM ot 
GDI+. 

ynpaB/iemie Ha 4>OKyca m HaBMraLiMfl 

B eflHa dpopMa b flafleH MOMeHT MO>Ke HflKoa ot KOHTpo/ikiTe fla e aKTMBHa, T.e. 
Aa Atp>KM cpOKyca. KoHTpo/iaTa, koato e Ha cpOKyc, o6mkhob6ho noKa3Ba TOBa 
no HAKaicbB Hani/m - 6yTOH"bT npoMeHfl rpacpwuHkisi cm bma, t6kctoboto no/ie 
noKa3Ba Muraiu Kypcop v\ t.h. 

ripn HacTbnBaHe Ha c"b6nTne ot K/iaBkiaTypaTa, to ce no/iynaBa ntpBO ot 
KOHTpo^aTa, koato e Ha cpOKyc. HanpuMep, aKO eflHO TeKCTOBO no/ie e Ha 
dpoKyc i/i noTpe6MTe/isiT HaTi/iCHe K/iaBmu, komto cbOTBeTcma Ha HflKoa 6yKBa, 
TeKCTOBOTO no/ie o6mkhob6ho npneMa 6yKBaTa v\ a M3nncBa Ha no3nunflTa Ha 
Kypcopa. Ako t6kctoboto no/ie He o6pa6oTM HaTMCHaTna K/iaBkiw (HanpuMep, 
aKO TOBa e K/iaBi/iw 3a HaBurauna [Tab]), tom ce o6pa6oTBa ot KOHTekmep- 
KOHTpo^aTa. 

Windows Forms ocurypaBa HaBwraui/m Me>KAy KOHTpo/ii/iTe npe3 K/iaBmuMTe 
[Tab] i/i [shift+Tab], komto npeMecTBaT cpOKyca kbm cneABamaTa v\i\v\ npefl- 
xoflHaTa KOHTpo/ia. Koa e c/ieABamaTa v\ koa e npeAHWHaTa KOHTpo/ia ce 
onpefle/ia ot t. Hap. "Tab Order", komto 3aBncn ot peAa Ha nocraBAHe Ha 

KOHTpO/lMTe B"bB CpOpMaTa I/I OT HflKOI/l CBOMCTBa Ha KOHTpO/lMTe. 

OopMMTe cbu\o MoraT Aa ca Ha cpOKyc (Aa ca aKTMBHn) i/i/ii/i p,a He ca. OoKycbT 
Me>KAy dpopMMTe MO>Ke Aa ce npoMeHa ot noTpe6kiTe/ifl caMO npn HeMOAa/iHki 
dpopMM. MoAa/iHi/iTe dpopMM He no3BO/iflBaT Apyra cpopMa Aa npneMa cpOKyca, 
AOKaTO He 6"bAaT 3aTBopeHi/i. 

TeKyiuaTa cpOKyci/ipaHa KOHTpo/ia i/i cpopMa MoraT Aa ce npoMeHsiT, KaKTO b 
pe3y/iTaT ot noTpe6kiTe/iCKM AeMCTBua ot K/iaBwaTypaTa v\ MMUJKaTa, TaKa v\ 
nporpaMHO - npe3 M3npaiuaHe Ha noAxoAaiun cbo6meHkifl h/im M3BMKBaHe Ha 
noAxoA^iUM MeTOAM. MMa kohtpo/ii/i, komto He MoraT Aa npneMaT cpOKyca, v\ 
KOHTpo/ii/i, komto MoraT Aa ro npneMaT, ho ce npecKanaT npi/i HaTMCKaHe Ha 

[Tab] I/I [Shift+Tab]. 

Ochobhm K/iacoBe b Windows Forms 

Ew6/ikiOTeKaTa Windows Forms AedpuHupa cbBKynHOcr ot 6a30BM K/iacoBe 3a 

KOHTpO^MTe, KOHTeMHep-KOHTpO/ll/ITe, KaKTO I/I MHO>KeCTBO rpaCpM4HM KOHTpO/ll/l 
M HerpaCpM4HM KOMnOHeHTH. 

OcHOBHMTe 6a30BM K/iacoBe, M3no/i3BaHM b Windows Forms, ca: 

- Sys tern. ComponentModel. Component - npeACTaB/lflBa .NET KOMnOHeHT. 

M3no^3Ba ce 3a pea/ii/i3aui/i*iTa Ha Herpacpi/mHi/i KOMnoHeHTM. HanpuMep 

KOMnOHeHTaTa System. Windows. Forms. Timer e Hac/ieAHklK Ha K/iaca 
Component. 



70 nporpaMnpaHe 3a .NET Framework (tom 2) 

- System. Windows. Forms. Control - npeflCTaB/lflBa rpacpMUHa KOHTpo/ia. 
TpacpM^HM kohtpo/im ca KOMnoHeHTMTe, komto MMaT rpacpMneH o6pa3. 
Bcmukm Windows Forms kohtpo/im ca HacneAHwun Ha K/iaca control, 

BK/lKDHI/ITe/lHO M KOHTeMHep-KOHTpO/lMTe. 

- System. Windows. Forms. ScrollableControl - npeACTaB/lflBa KOHTpo/ia, 

koato noAAtpwa CKpo/ikipaine Ha cbAtpxaHneTO cm. Moxe p,a cbAtpxa b 
ce6e cm APyrM kohtpo/im. 

- Sys tern. Windows. Forms. ContainerControl - npeACTaB/lflBa KOHTpo/ia, 

koato cbA"bp>Ka b ce6e cm APyrM kohtpo/im m ocMryp^Ba ynpaB/ieHMe Ha 
cpOKyca. He bcmukm KOHTeMHep-KOHTpo^M Hac/ieAflBaT to3m K/iac. HanpM- 

Mep naHe/l"bT (System. Windows. Forms. Panel) MO>Ke Rd CbA"bp>Ka B Ce6e 

cm APyrM kohtpo/im, ho e Hac/ieAHMK Ha K/iaca ScrollableControl, a He 

H3 ContainerControl. 

ftepapxMfi Ha K/iacoBeTe 

Ha K/iac-AMarpaMaTa no-AO/iy e noKa3aHa nacr ot K/iacoBaTa MepapxMfl Ha 
6M6^MOTeKaTa Windows Forms: 




|TextBoxBase| 



ScrollableControl | 



RichTextBoxj |TextBox| | Panel | | ContainerControl | 





| Form UserControl | 



3a6e^A3Ba ce, ne He bcmukm K/iacoBe ot Windows Forms ca kohtpo/im. Hakom 

ca 06MKH0BeHM .NET KOMnOHeHTM, HanpMMep Menu, Timer M ImageList. V\3- 

r/ie>KAa Ma/iKO CTpaHHO 3aiuo MeHKrro He e KOHTpo/ia, ho TOBa e TaKa, 3aiuoTO 
KOMnoHeHTaTa Menu pea/iHO H^Ma rpacpMneH o6pa3 m npeAcraB/iABa cnMCbK ot 
Menuitem e/ieMeHTM. Menuitem K/iacbT Bene MMa rpacpMneH o6pa3 m c/ieAOBa- 
Te/iHO e KOHTpo/ia. 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 71 
TnnM4HMTe KOHTpo/lkl (Label, TextBox, Button, ToolBar, StatusBar M flp.) ca 

Hac/ieflHkiu,ki Ha K/iaca control. 06luoto 3a bcmuki/i tax e, ne MMaT rpadpwueH 
o6pa3 m ce ynpaB/iflBaT npe3 cbo6meHkifl. 

KoHTpo^MTe, komto MoraT fla ce CKpo/iwpaT (HanpuMep nanenv\je) ca Hacnep,- 

HMU,M Ha ScrollableControl. KOHTpo/lklTe, KOMTO CbA"bp>KaT APyrM KOHTpo/lkl 

m ce rpn>KaT 3a ynpaB/ieHwe Ha dpoKyca (HanpuMep dpopMMTe v\ Ana/i03MTe), 

Hac^eflflBaT ContainerControl. 

K/iaci>T Control 

K/iaCbT System. Windows. Forms. Control 3aeMa MHOTO U,eHTpa/lHa po/lfl B 

6n6^MOTeKaTa Windows Forms. Tom e 6a30B K/iac, ocHOBa 3a bcm^km rpadpwu- 
hm KOHTpo/iw, m onpeAe/ia eAHHHa paMKa 3a KOHTpo/ii/ue - nporpaMeH MOAe/i, 
no komto Aa ce pa3pa6oTBaT v\ M3n"b/iHflBaT. B Hero ca AedpuHnpaHn o6iunTe 

3a BCM4KM KOHTpO^M CBOMCTBa M Cb6MTMfl. 

CBOMCTBa Ha K/iaca Control 

HeKa cera pa3r/ieAaMe no-Ba>KHi/iTe CBOMCTBa Ha K/iaca control: 

- Anchor, Dock - 3aAaBaT no KaKtB Hani/m KOHTpo^aTa ce "3aKOTBfl" 3a 
KOHTeMHepa cm. Te3M CBOMCTBa ca mhoto no/ie3Hi/i, aKO MCKaMe Aa ynpa- 
B^ABaMe pa3MepnTe v\ no3nu,MflTa Ha KOHTpo/iaTa npn npoMAHa Ha pa3- 
MepnTe Ha KOHTeMHepa, b komto e nocTaBeHa. HanpuMep npe3 cbomct- 
boto Anchor MOxeM Aa 3aKOTBMM AaAeHa KOHTpo/ia Ha onpeAe/ieHO 
pa3CTOflHne ot AO^HMfl AeceH trb/i Ha dpopMaTa, b koato ctom, m npn 
npeopa3MepaBaHe TOBa pa3croflHi/ie me ce 3ana3Ba v\ KOHTpo/iaTa me ce 
Abm>km 3aeAHO c ABuxeHneTO Ha ao/ihha AeceH "brb/i Ha KOHTewHepa, b 
komto e nocTaBeHa. 

- Bounds - 3aAaBa pa3Mepa (ujupnHa v\ Bkiconi/iHa) v\ no3i/iu.i/mTa Ha ropHi/m 
/lsiB trb/i Ha KOHTpo^aTa b paMKMTe Ha HeMHua KOHTeMHep. Ako kohtpo- 
ziaTa e dpopMa, no3nu,MflTa ce 3aAaBa cnpyiMO ropHna /iab "brb/i Ha eKpa- 
Ha. Ako KOHTpo/iaTa e e/ieMeHT ot dpopMa (HanpuMep 6yTOH), no3nu,MflTa 
ce OT4MTa cnpyiMO ropHna /iab trb/i Ha dpopMaTa {v\nv\ KOHTeMHep- 
KOHTpo^aTa), b koato e ocTaBeHa. Pa3Mep"bT BK/iiouBa ua/ioto rpadpn4HO 
npocTpaHCTBO Ha KOHTpo/iaTa. HanpuMep, aKO KOHTpo/iaTa e dpopMa, ce 
BK/iiouBa m HeMHaTa paMKa. 

- Backcoior - 3aAaBa u,BeTa Ha dpoHa. UBeTOBeTe ca MHCTaHunn Ha crpyK- 

TypaTa System. Drawing. Color, KOflTO AedpMHkipa MHO>KeCTBO CTaHAapT- 

hm u,BeTOBe m no3BO^ABa noTpe6nTe^CKM AedpuHnpaHM u,BeTOBe, 
cbCTOfliuM ce ot 4 Ha 6pow 8-6mtobm KOMnoHeHTa (apKOCT, nepBeHO, 

3e/ieHO M CMHbO). 

- contextMenu - 3aAaBa KOHTeKCTHO MeHK) (popup menu) 3a KOHTpo/iaTa. 
KoHTeKCTHOTO MeHK) o6nKHOBeHO ce noflBABa npn HaTMCKaHe Ha AecHi/m 
6yTOH Ha MMiuKaTa Btpxy KOHTpo/iaTa. 



72 nporpaMnpaHe 3a .NET Framework (tom 2) 

- controls - cbfl"bp>Ka KO/ieKuwfl ot B^o>KeHMTe b KOHTpo/iaTa flpyrn 
kohtpo^m (aKO MMa TaKMBa). HanpuMep cpopMMTe (iiHcraHUkiii Ha K/iaca 
Form) ctAtpxaT b KO/ieKunflTa cm controls KOHTpo/ikiTe, komto ca 
pa3no/ic»KeHi/i b tax. no npuHunn bcmuki/i Windows Forms kohtpo/ii/i 
MMaT KO/ieKuwfl controls m MoraT fla cbxpaHABaT b Hea flpyrw kohtpo/im, 
ho 3a hjikom ot Tax He e KopeKTHO TOBa fla ce npaBM. HanpuMep He e 
KopeKTHO b 6yTOH fla nocTaBAMe flpyr 6yTOH v\nv\ TeKCTOBO no/ie. Ako ro 
HanpaBMM, ce noHBHBaT HenpnaTHM aHOMa/iwi/i. 

- canFocus - Bptifla fla/iki KOHTpo/iaTa Mowe fla no/iynaBa cpOKyca. rionTi/i 
BCM4KM BMflOBe kohtpo/im MoraT fla 6"bflaT cpOKycupaHM, crura fla He ca 

3a6paHeHM (Enabled=false). 

- Enabled - no3BO/iflBa 3a6paHABaHe Ha KOHTpo/iaTa. KoraTO eflHa koh- 
Tpo/ia 6"bfle 3a6paHeHa (Enabied=faise), Tfl ocraBa BMflMMa, ho CTaBa 
HeaKTMBHa. 06mkhob6ho 3a6paHeHMTe kohtpo/im ce M3o6pa3flBaT c M3- 
6/ieflHH/i UBAT, 3a fla ce pa3/iwnaBaT ot ocraHa/ii/iTe. 3a6paHeHMTe koh- 
Tpo/in He MoraT fla no/iynaBaT cpOKyca. B nacmocr 3a6paHeH 6yTOH He 
MO>Ke fla 6"bfle HaTMCHaT, b 3a6paHeHO TeKCTOBO no/ie He MO>Ke fla ce 
ni/iuje m t.h. Ako 3a6paHMM KOHTeMHep-KOHTpo/ia, kohto cbfltpxa b ce6e 
cm flpyrn kohtpo^m, BCM4KM Te3M KOHTpo/in CTaBaT 3a6paHeHM . 

- Font - 3aflaBa wpwcpTa, c komto ce M3nncBa TeKCTbT b KOHTpo/iaTa (aKO 
KOHTpo/iaTa no HAKaKbB HanwH BH3ya/iM3npa TeKcr). ripn TeKCTOBM 
no/ieTa TOBa e wpi/icpTbT Ha TeKCTa b no/ieTO. ripn 6yTOH TOBa e wpi/icpTbT 
Ha TeKCTa b 6yTOHa. ripn eTMKeT TOBa e wpwcpTbT Ha TeKCTa Ha eTMKeTa. 
Ako ce 3aflafle cbomctboto Font 3a cpopMaTa, bci/iukm kohtpo/ii/i, komto 
He flecpMHupaT M3pn4HO Font, ro Hac^eflflBaT ot cpopMaTa. LUpwcpTbT, c 
komto e M3o6pa3eHO 3aMaBneTO Ha cpopMMTe, He Mowe fla ce npoMeHa 
ot Windows Forms. Tom ce HacrpokiBa ot rpacpn^HaTa cpefla Ha onepa- 
UMOHHaTa cucTeMa (ot kohtpo/ihma naHe/i npn Windows). 

LLIpucpTOBeTe MMaT cneflHMTe xapaKTepucTMKn: HanMeHOBaHne Ha ujpucpT 

(HanpMMep Arial) kl/lkl CpaMkl/lklfl LljpklCpTOBe (HanpMMep Monospace, 
SansSerif V\J\V\ Serif), CTkl/1 (HanpMMep Bold, Italic, ...), pa3Mep 

(HanpuMep 12 pt v\nv\ 10 px) v\ KOflOBa Ta6/ikiua (Cyrillic, Western, 
Greek, ...). KoflOBaTa Ta6/inua e Heo6xoflMMa paflKO - caMO 3a crapi/iTe 
ujpucpTOBe, komto He noflfl"bp>KaT Unicode. 

- Forecoior - 3aflaBa uBeTa Ha KOHTpo/iaTa. 

- Location - cbfl"bp>Ka no3MunflTa Ha KOHTpo/ia b HekiHMfl KOHTewHep 
(KOopflMHaTMTe Ha ropHMfl v\ nt\B "brb/i). 3a cpopMM TOBa e no3nunflTa Ha 
eKpaHa, a 3a flpyrn kohtpo/im TOBa e no3nunflTa bbb cpopMaTa v\nv\ 
KOHTewHep-KOHTpo/iaTa. 

- Parent - 3aflaBa KOHTeMHep-KOHTpo^aTa, b koato ce Ha mm pa TeKymaTa 
KOHTpo/ia. Moxe v\ fla HAMa TaKaBa (ctomhoct null). OopMMTe Haw- 

HeCTO MMaT CTOMHOCT null 3a CBOMCTBOTO Parent. 

- size - cbfl"bp>Ka pa3MepnTe Ha KOHTpo/iaTa (ujupnHa v\ Bkiconkma). 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 73 

- Tablndex - Onpefle/lfl pefla npn HaBkiraUMfl C [Tab] V\ [Shift+Tab] . 

- Tabstop - 3aflaBa fla/iw KOHTpo/iaTa Tpa6Ba fla ce dpoKycupa npn HaBM- 

raUMfl C [Tab] M [Shift+Tab]. AKO Ce 3aAaAe TabStop=false, OpOKyCbT 

He cnupa b KOHTpo/iaTa npn npeMi/maBaHe kbm cneflBamaTa KOHTpo/ia 
(KOHTpo^aTa ce npecKana). 

- Text - 3aflaBa TeKCT, CB"bp3aH c KOHTpo/iaTa. ripn eTMKeT TOBa e TeK- 
CTtT, M3o6pa3eH b eTMKeTa. ripn 6yTOH TOBa e TeKCTbT, M3o6pa3eH b 
6yTOHa. ripn TeKCTOBO no/ie TOBa e TeKCTbT, BtBefleH b no/ieTO. ripn 
dpopMa TOBa e 3ar/iaBi/ieTO Ha dpopMaTa. TeKCTbT e b Unicode v\ TOBa 
no3BO^ABa fla ce M3no/i3BaT cbo6oaho 6yKBM v\ 3Hau,n Ha ziaTkiHkiua, 
Knpn^nua, rp"bu,KM, apa6cKM v\ flpyrw a36yKM, crura M36paHMflT ujpucpT 
fla cbfl"bp>Ka ctOTBeTHMTe 3Hau,n. 

- visible - 3aflaBa BMflMMOCT Ha KOHTpo/iaTa. Ako 3a flafleHa KOHTpo/ia ce 
3aflafle visibie=faise, Tfl ce CKpuBa (M34e3Ba, Bee eflHO He cbiue- 
CTByBa). CKpnTa KOHTpo/ia MO>xe fla ce noKa>Ke othobo, ioto m ce 

3aflafle Visible=true. 

MeTOflM Ha K/iaca Control 

riy6^M4HMTe MeTOflM Ha K/iaca control ce Hac/ieflflBaT v\ ca flocTbnHM bbb 
bcm4km Windows Forms kohtpo/im. rio-Ba>KHMTe ot tax ca: 

- Focus o - dpoKycupa KOHTpo/iaTa (aKO e B"b3MO>KHo). 

- Hideo, show() - CKpnBa/noKa3Ba KOHTpo/iaTa (edpeKTbT e KaTO fla 

3aflafleM Visible=false / Visible=true). 

Cb6uTMfi Ha K/iaca Control 

3HaeM ko/iko ca BaxHM cb6nTHflTa 3a Windows Forms KOHTpo/iMTe. 5/iaro- 
flapeHne Ha tax nporpaMkicrbT MO>Ke fla nuiue koa, komto ce 3aflewcTBa npn 
pa3^M4HM npoMeHM b cbCTOAHneTO Ha KOHTpo/ikiTe. IHe pa3MeflaMe no-Ba>K- 
HMTe c"b6nTMfl Ha K/iaca control: 

- click - HacrbnBa npn mpaKBaHe c MMUJKaTa Btpxy KOHTpo/iaTa. ripn 
6yTOH TOBa c"b6nTne ce M3BMKBa npn HaTMCKaHe Ha 6yTOHa. ripn dpopMa 
click ce M3BMKBa npn mpaKBaHe c zieBkm 6yTOH Ha MMUJKaTa Btpxy 
dpopMaTa, aKO b cbOTBeTHaTa no3nunfl HflMa flpyra KOHTpo/ia. C"b6nTneTO 
He noflaBa flont/iHMTe/iHa MHCpopMauna b apryMeHTMTe cm. 

- Enter, Leave - HacrbnBaT ctOTBeTHO npw aKTMBupaHe m fleaKTMBupaHe 
Ha flafleHa KOHTpo/ia, T.e. KoraTO KOHTpo/iaTa no/iynw v\ 3ary6n dpoKyca. 

ripkl OpOpMM Te3M Cb6MTMfl He Ce M3BMKBaT. 

- KeyDown, KeyUp - HacTbnBaT npw HaTMCKaHe m OTnycKaHe Ha npon3- 

BO/ieH K/iaBMUJ (BK/lKDHMTe/lHO CneUkia/lHMTe K/iaBMLUkl KaTO [Fl], [Alt], 

[Caps Lock], [start] m flp.). Cb6kiTkieTO noflaBa b apryMeHTMTe cm 

1/IHCraHUklfl Ha K/iaca KeyEventArgs, KOflTO Cbfl"bp>Ka MHOpOpMaUMfl 3a 



74 nporpaMnpaHe 3a .NET Framework (tom 2) 

HaTMCHaTMfl K/iaBMLU - MMe Ha K/iaBMLUa (MHCTaHUMfl Ha M36poeHMfl Tun 
System. Windows. Forms. Keys) M MHCpopMaUMfl 3a CbCTOflHkieTO Ha K/ia- 
BMUJMTe [Shift], [Alt] M [Ctrl]. 

- Keypress - HacTbnBa npn HaTMCKaHe Ha Hecneuwa/ieH K/iaBMw v\nv\ 
KOM6nHaunfl ot K/iaBi/iuji/i. ToBa c"b6nTne ce aKTMBupa caMO aKO HaTMCHa- 
TaTa K/iaBMLUHa KOM6nHaunfl ce MHTepnpeTupa KaTO cmmbo/i. HanpuMep 
HaTMCKaHeTO Ha K/iaBMwa [Alt] He boam ao no/iynaBaHe Ha cmmbo/i m 
He 3afleMCTBa TOBa cb6nTne, flOKaTO HaTMCKaHeTO Ha K/iaBMwa [v] 
reHepupa HflKaicbB cmmbo/i b 3aBMCMMOCT ot TeKyiuna e3MK. Cb6i/iTi/ieTO 
noflaBa b apryMeHTMTe cm MHCTaHuna Ha KeyPressEventArgs K/iaca, 
koato cbfl"bp>Ka CMMBO/ia, reHepupaH b pe3y/iTaT ot HaTMCKaHeTO Ha 
K/iaBMwa. 

- MouseDown, MouseMove, MouseUp, MouseWheel - HaCTbriBaT npn Cb6MTM51 

ot MMiuKaTa, M3B"bpiueHM Btpxy KOHTpo^aTa - HaTMCKaHe Ha 6yTOH, 
ABuxeHne Ha noi<a3a/ieua Ha MMiuKaTa v\nv\ npeMecTBaHe Ha KO/ie/iOTO. 
C"b6nTMflTa noAaBaT b apryMeHTMTe cm MHCTaHuna Ha MouseEventArgs 
K/iaca, koato cbfl"bp>Ka MHCpopMauna 3a cbCTOAHneTO Ha 6yTOHMTe v\ 
KO/ie/iOTO Ha MMiuKaTa v\ 3a KOopAMHaTUTe Ha noi<a3a/ieua {v\3nv\cj\euv\ 
cnpyiMO ropHMfl nt\B "brb/i Ha KOHTpo/iaTa). 

- MouseEnter, MouseLeave, MouseHover - HaCTbnBaT npn HaB/lM3aHe, 

M3^M3aHe m npeMecTBaHe Ha no3kmi/mTa Ha noi<a3a/ieua Ha MMiuKaTa b 
paMKMTe Ha KOHTpo/iaTa. 

- Move - HacTbrma npn npeMecTBaHe Ha KOHTpo/iaTa. npeMecmaHeTO 
MO>Ke fla ce npeflM3BMKa ot noTpe6MTe/ifl (HanpuMep npeMecTBaHe Ha 
cpopMa) v\nv\ nporpaMHO (npe3 npoMAHa Ha cbomctboto Location). 

- Paint - HacTbnBa npn npenepTaBaHe Ha KOHTpo/iaTa (npn o6pa6oTKaTa 
Ha cbo6iueHneTO wm_paint). B TOBa cb6nTne KOHTpo/iaTa Tpa6Ba fla 
M3B"bpujn npenepTaBaHeTO Ha rpacpMUHMH cm o6pa3. Cb6kiTi/ieTO no/iyna- 
Ba b apryMeHTMTe cm MHcraHUMH Ha PaintEventArgs, koato cbfl"bp>Ka 
Graphics o6eKTa, Btpxy komto Tpa6Ba fla ce M3B"bpujM nepTaHeTO. 

- Resize - HacTbnBa npM npoMAHa Ha pa3Mepa Ha KOHTpo/iaTa. Mo>xe fla 
ce npeflM3BMKa KaKTO ot noTpe6MTe/ia (npM npeopa3MepaBaHe Ha 
cpopMa), TaKa m nporpaMHO (npM npoMAHa Ha cbomctboto size). 

- TextChanged - HacTbnBa npM npOMflHa Ha CBOMCTBOTO Text Ha 

KOHTpo/iaTa. 

- validating - M3no/i3Ba ce 3a Ba/iMflauMfl Ha flaHHMTe, BtBefleHM b 
KOHTpo^aTa. Ba^MflauMATa Ha flaHHM me 6"bfle flMCKyTMpaHa no-K"bCHO b 
HacroflLuaTa TeMa. 

K/iaci>T ScrollableControl 

K/iaCbT ScrollableControl e Hac/ieflHMK Ha K/iaca Control M fl06aBfl K"bM 

Hero cpyHKUMOHa/iHOcr 3a CKpo/iMpaHe. Eto no-Ba>KHMTe My CBOMCTBa: 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 75 

- Autoscroii - 3aflaBa p,dtj\v\ npn Hy>Kfla KOHTpo/iaTa me no/iyuM aBTOMa- 

TMUHO CKpO^kipaiUM ZieHTM. 

- HScroii, vscroii - 3aflaBaT p,anv\ KOHTpo/iaTa fla MMa xopM30HTa/iHa v\ 
BepTi/iKa/ma CKpo/iMpama zieHTa. 

K/iaci>T ContainerControl 

K/iacbT ContainerControl ocurypflBa dpyHKu,MOHa^HOCT 3a ynpaB/ieHi/ie Ha 
dpoKyca. Cbomctboto My Activecontroi c"bA"bp>Ka BtB BceKM ep,v\u momsht 
KOHTpo^aTa, koato e Ha cpOKyc. 

OopMM, np030pMM M flHa/103M 

OopMMTe m flna^03MTe b Windows Forms ca npo3opu,n, komto cbfltpwaT 
KOHTpo/iw. Te MoraT fla 6"bflaT pa3/iMHHM BMflOBe: fla MMaT v\nv\ H^MaT paMKa, 
fla ca MOfla^HM v\i\v\ He, fla ca pa3Ter/iMBM v\nv\ He, fla ca Hafl bcmukm flpyrn 
npo3opu,n v\nv\ He v\ t.h. 

K/iaci>T System.Windows. Forms. Form 

K/iaCbT System. Windows. Forms. Form e 6a30B K/iac 3a BCMUKM CpopMM B 

Windows Forms GUI npn^OKeHMATa. Tom npeflcraB/iflBa rpacpMUHa cpopMa - 
npo3opeu v\nv\ flMa/ioroBa KyTkia, koato Cbfl"bp>Ka b ce6e cm kohtpo/im m 
ynpaB/iHBa HaBuraunflTa Me>Kfly tax. 

rioBeneTO npo3opun MMaT paMKa v\ cneuMa/iHM 6yTOHM 3a 3aTBapaHe, 
npeMecTBaHe v\ flpyrn craHflapTHM onepaunn. Bbhwhhht bma Ha npo3opunTe v\ 
CTaHflapTHMTe kohtpo/im no TaxHaTa paMKa 3aBMCAT ot Hacrpoi/iKMTe Ha 
rpadpn4HaTa cpefla Ha onepaunoHHaTa CMcreMa. riporpaMMCTbT MMa caMO 
nacmneH kohtpo/i Hafl BBHLUHkifl BMfl Ha npo3opuMTe. 

K/iaCbT Form e Hac/ieflHMK Ha K/iacOBeTe Control, ScrollableControl M 
ContainerControl M Hac/ieflflBa OT TAX Ufl/iaTa MM CpyHKUklOHa.fi HOCT, BCM4- 
KMTe MM CBOMCTBa, Cb6MTMfl M MeTOflM. 

no-Ba>KHM CBOMCTBa Ha K/iaca Form 

Bcm4km npo3opuM m flMa/io3M b Windows Forms HacneflflBaT K/iaca Form m 
npMflo6MBaT ot Hero cneflHMTe CBOMCTBa: 

- FormBorderstyle - yKa3Ba TMna Ha paMKaTa Ha cpopMaTa. no-necro 
M3no^3BaHMTe TMnoBe paMKa ca cneflHMTe: 

o sizable - CTaHflapTHa pa3UJMpfleMa paMKa. noTpe6MTe/iHT MO>Ke fla 
npoMeHfl pa3MepMTe Ha TaKMBa paMKM. 

o FixedDialog - AMa/ioroBa paMKa c cpMKCMpaHM pa3MepM. TaKMBa 
paMKM He MoraT fla ce npeopa3Mep*iBaT ot noTpe6MTe/iMTe. 



76 nporpaMnpaHe 3a .NET Framework (tom 2) 

o None - /lwnca Ha paMKa. Ua/ioto npocTpaHCTBO Ha cpopMaTa ce 
M3no^3Ba 3a HeMHcrro cbfl"bp>KaHMe. 

o FixedTooiwindow - KyTMfl c MHCTpyMeHTM c cpMKCupaH pa3Mep. 
PaMKaTa He MO>Ke fla ce npeopa3Mep*iBa ot noTpe6kiTe/ikiTe v\ e Ma/iKO 
no-TACHa ot CTaHAapTHaTa. npo3opun c TaKMBa paMKM He ce BM>KflaT b 
zieHTaTa Ha 3aAannTe (taskbar) Ha Windows Explorer v\ npn 
HaTMCKaHe Ha [Ait+Tab] . 

- controls - CbAtpwa cnncbK c KOHTpo/ikiTe, pa3no/io>KeHM bbb cpopMaTa. 
Ot pefla Ha KOHTpo/ikiTe b to3m cnwcbK 3aBncn pefltT, b komto Te ce 
4epTaaT Ha eKpaHa (Z-order) v\ pefltT, b komto ce npeMkmaBa ot eflHa 
KOHTpo/ia KtM Apyra npn HaBurauna (tab order). PeAtT Ha npeMecTBaHe 
Ha cpOKyca MO>Ke p,a ce HacrpowBa v\ Aont/iHkiTe/iHO ot CBOMCTBaTa 

TabStop M Tablndex. 

- Text - 3ar/iaBkie Ha npo3opeua. l/l3no/i3Ba ce Unicode, T.e. MO>KeM p,a 
M3no/i3BaMe, Kkipw/iwua, /laTMHwua, rptuKM v\ Apyrn a36yKM ot Unicode 
CTaHAapTa. 

- size - pa3Mepn Ha npo3opeua (ujupnHa v\ Bkiconkma). BK/iK>nBa ua/ioto 
npocTpaHCTBO, 3aeMaHO ot cpopMaTa (paMKaTa + BvrpewHOCTTa). 

- ciientsize - pa3Mepn Ha BtTpeujHOCTTa Ha cpopMaTa (6e3 paMKaTa m). 

- AcceptButton - 6yTOH no noApa36wpaHe. T03M 6yTOH ce HaTMCKa aBTO- 
MaTkmHO, KoraTO noTpe6i/iTe/iflT HaTMCHe K/iaBmua [Enter], He3aBMCMMO 
ot TOBa b KOfl KOHTpo/ia ot cpopMaTa e cpOKycbT b T03M MOMeHT. U,e/iTa e 
Aa ce ynecHki noTpe6wTe/ifl npn nont/iBaHeTO Ha cpopMM c MHCpopMauna. 

- Activecontroi - CbAtpwa KOHTpo/iaTa, KOATO A"bp>KM cpOKyca. ripn 
npoMAHa Ha TOBa cbomctbo ce npoMeHfl TeKymaTa cpOKycupaHa kohtpo- 
/ia. 

- controiBox - 3aAaBa p,anv\ cpopMaTa Tpa6Ba Aa CbAtpwa craHAapTHMTe 

KOHTpO/lkl 3a 3aTBapflHe, MMHHMM3aUHfl M T. H. 

- icon - 3aAaBa MKOHa Ha npo3opeua. 

- KeyPreview - aKO ce 3aAaAe true, no3BO/i*iBa cpopMaTa Aa o6pa6oTBa 
cb6kiTi/mTa ot K/iaBkiaTypaTa, npeAH Aa rn npeAaAe Ha cpOKycupaHaTa 
KOHTpo/ia. Ako CTOMHOCTTa e false, bcako cb6kiTi/ie ot K^aBnaTypaTa ce 
o6pa6oTBa caMO ot KOHTpo/iaTa, koato e Ha cpOKyc. 

- MinimumSize, MaximumSize - 3aAaBa OrpaHklneHklfl 3a pa3Mepa Ha 
cpopMaTa - MaKCkiMa/iHa v\ MMHMMa/iHa ujupnHa v\ Bwconkma. ripn onuT 3a 
npeopa3MepaBaHe He ce no3BO/i*iBa noTpe6nTe/iflT Aa 3aAaBa pa3Mep, 
komto He e b Te3M rpaHnun. 

- Modal - Bptiua Aa/in cpopMaTa e MOAa/iHa. KoraTO eAHa cpopMa e MOAa/i- 
Ha, AOKaTO Tfl e aKTMBHa, noTpe6kiTe/iflT He MO>Ke Aa pa6oTM c Apyrn 
cpopMM ot cbmoTO npw/io>KeHi/ie. BceKM onuT 3a npeMMHaBaHe b Apyra 
cpopMa He ycnflBa, AOKaTO noTpe6i/iTe/iHT He 3aTBopn MOAa/iHaTa cpopMa. 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 77 

Ako flafleHO npn^OKeHne noKa>Ke eflHOBpeMeHHO hako/iko dpopMi/i, koi/ito 
He ca MOfla/iHi/i, noTpe6kiTe/isiT me MO>Ke fla npeMMHaBa cbo6oaho Me>Kfly 
tax, 6e3 fla ri/i 3aTBapa. Cbomctboto Modal e caMO 3a neTeHe. Mofla/i- 
HOCTra Moxe fla ce 3aAaBa ntpBOHana/iHO, ho He MO>Ke fla ce npoMeHfl, 
cnep, KaTO dpopMaTa e Bene noi<a3aHa. 

- opacity - 3aflaBa npo3pa4HOCT Ha dpopMaTa (m/icno ot 0.00 ,qo 1.00). 
B"b3MO>KHO e fla He ce noflfl"bp>Ka v\nv\ fla pa6oTM mhoto 6aBHO npn hakoi/i 
no-CTapn BMfleoaflanTepn. 

- Mdichiidren - b MDI pe>KMM ki3B/ikma / 3aflaBa nofl^MHeHMTe dpopMM Ha 
TeKyiuaTa dpopMa. MDI (Multiple-Document Interface) e pe>KMM, npn 
komto flafleHa dpopMa Ha npi/i/io>KeHi/ieTO (o6mkhob6ho r/iaBHaTa dpopMa) 
MO>Ke fla cbfl"bp>Ka b ce6e cm flpyrn dpopMM, komto ca pa3no/io>KeHi/i b 

HeMHOTO pa60THO npOCTpaHCTBO (KaTO 06klKHOBeHM KOHTpO/lkl). 

- MdiParent - b MDI pe>KMM ki3B/iwna / 3aflaBa dpopMaTa, koato e co6ct- 
BeHMK Ha TeKyiuaTa dpopMa. Ba>KM caMO 3a noflnwHeHM (child) dpopMM. 

- TopMost - 3aflaBa p,anv\ dpopMaTa ctom Hafl bci/iuki/i flpyrn npo3opun 
(always on top). B TaKbB pe>KMM, flopn aKO dpopMaTa He e aKTi/iBHa, ta 
ocTaBa BMflMMa i/i ctom Hafl BCM4KM ocraHa/iM dpopMM. 

- windowstate - w3B/inna cbCTOHHkieTO Ha dpopMaTa. OopMaTa bbb BceKM 

eflMH MOMeHT e B HflKOe OT CbCTOflHMflTa Ha M36pOeHMfl Tkin 
FormWindowState - HOpMa/lHO, MMHMMM3MpaHO kl/lkl MaKCMMM3MpaHO. riO 

noflpa36npaHe dpopMi/iTe ca b HopMa/iHO cbcroyiHkie - MMaT HopMa/iHWfl 
cm pa3Mep. B Ma Ken Mi/131/1 pa ho cbcroaHi/ie dpopMMTe BpeMeHHO npoMeHAT 
pa3Mepa cm m 3aeMaT ue^na eKpaH 6e3 zieHTaTa 3a 3aflanw (task bar) Ha 
Windows Explorer. B MMHMMM3npaHO cbCTOAHne dpopMMTe ca ckpmtm m ce 
BM>KflaT caMO b zieHTaTa 3a 3a,aani/i (task bar). 

no-Ba>KHM Me to am Ha K/iaca Form 

npo3opuMTe m flna^03MTe b Windows Forms HacneflflBaT ot K/iaca Form 
cneflHMTe 6a30BM MeTOflu: 

- show() - noKa3Ba dpopMaTa v\ a npaBM aKTMBHa (dpoKycupa a). OopMaTa 
ce noKa3Ba b HeMOfla/ieH pe>KMM. M3BMKBaHeTO Ha T03i/i MeTOfl e eKBi/iBa- 
zieHTHO Ha npucBOABaHeTO visibie=true. M3n"b^HeHneTO Ha T03i/i MeTOfl 
npwK/iiouBa BeflHara. 

- showDiaiogO - noKa3Ba dpopMaTa b MOfla^eH pe>KMM v\ c/iefl KaTO th 
6"bfle 3aTBopeHa, Bptiua KaTO pe3y/iTaT ctomhoct ot Ti/in DiaiogResuit. 
Ta3M ctomhoct cwvbpwa MHdpopMaunfl 3a npn4MHaTa 3a 3aTBapaHe Ha 
dpopMaTa. M3n"b^HeHneTO Ha MeTOfla showDiaiogO npi/iK/iiouBa eflBa 
c/iefl 3aTBapaHe Ha dpopMaTa, T.e. MeTOfltT e 6/iOKnpaiu. rio-HaTaTbK b 
HacTOfliuaTa TeMa me o6"bpHeM cneu.ua/iHO BHMMaHne Ha M3BMKBaHeTO Ha 

MOfla/lHM dpopMM M nO/iynaBaHeTO Ha CTOMHOCTI/ITe OT KOHTpO/lklTe B TAX. 



78 nporpaMnpaHe 3a .NET Framework (tom 2) 

- close () - 3aTBapa cpopMaTa. KoraTO eflHa cpopMa 6"bfle 3aTBopeHa, ta 
M34e3Ba m ce ocBo6o>KflaBaT w3no/i3BaHkiTe ot Hea pecypcu. Cnep, KaTO 
eflHa cpopMa 6tfle 3aTBopeHa, ta He MO>Ke fla 6tfle noBene noKa3BaHa. 
3a BpeMeHHO CKpuBaHe Ha cpopMa Tpa6Ba fla ce ki3no/i3Ba MeTOflvr 

Hide ( ) , a He Close ( ) . 

- LayoutMdi ( ... ) - b MDI pe>KMM to3m MeTOfl npeHapexfla fltiuepHMTe 
(child) cpopMM, cbfl"bp>KaiuM ce b TeKymaTa cpopMa. HanwHtT Ha npeHa- 
pe>KflaHe ce 3aflaBa ot nporpaMkicra. noflfltpaoT ce hako/iko BMfla 
npeHape>KflaHe - KacKaflHO, xopw30HTa/iHO, BepTkiKa/iHO v\ flp. 

no-Ba>KHM ctd6mtmh Ha K/iaca Form 

BckinKi/i npo3opun m fli/ia/i03ki b Windows Forms noflfl"bp>i<aT CbBKynHOCT ot 
CTaHflapTHM ct6nTMfl, komto HacneflHBaT ot K/iaca Form: 

- Activated / Deactivate - M3BMKBaT ce npn aKTMBkipaHe / fleaKTM- 

BnpaHe Ha cpopMaTa (KoraTO cpopMaTa no/iyni/i / 3ary6n cpOKyca). 

- closing - M3BMKBa ce npw onuT 3a 3aTBapsiHe Ha cpopMaTa (HanpuMep, 
KoraTO noTpe6nTe^flT HaTMCHe craHflapTHi/m 6yTOH 3a 3aTBapsiHe). Pea- 
^M3aunflTa MO>Ke fla npeflM3BMKBa OTKa3BaHe Ha 3aTBapaHeTO. C"b6nTM- 
eTO noflaBa b apryMeHTMTe cm MHCTaHuna Ha K/iaca canceiEventArgs, 
koato MMa 6y/ieBO cbomctbo cancel, npe3 KoeTO Moxe fla ce OTKawe 
3aTBapaHeTO. 

- Load - M3BMKBa ce eflHOKpaTHO npeflu ntpBOTO noi<a3BaHe Ha cpopMaTa. 
Moxe ce no/i3Ba 3a kiHnuna/iki3MpaHe Ha cbcroflHweTO Ha KOHTpo/iMTe. 

Ochobhm KOHTpo/iii b Windows Forms 

fla pa3MeflaMe Haw-^ecTO ki3no/i3BaHkiTe kohtpo/ii/i b Windows Forms: 

TextBox, Label M Button. 

TextBox 

Dj;;*l;;;ie;*l;;;j;in 
Otexffioxl S 

TextBox KOHTpo/iaTa e no/ie 3a BtBe>KflaHe Ha TeKCT. Moxe fla 6"bfle eflHO- 
peflOBO m/im MHoropeflOBO. rio-Ba>KHMTe CBOMCTBa Ha TextBox ca: 

- Multiline - 3aflaBa fla/ii/i KOHTpo/iaTa npeflcraB/uiBa caMO eflMH pefl 
v\nv\ flonycKa B"bBe>KflaHeTO Ha hako/iko pefla TeKCT. 

- Text - cbfltpxa BtBefleHMfl b KOHTpo/iaTa TeKCT. KoraTO cbomctboto 
Multiline e true, 3a flocTtn flo BtBefleHMfl TeKCT Moxe fla ce ki3no/i3Ba 

M CBOMCTBOTO Lines. 

- Lines - MaCMB OT CMMBO/1HM HM30Be, CbfltpwaLfl BtBefleHMfl TeKCT. 

BceKM e/ieMeHT ot MacuBa cbfltpxa eflMH ot peflOBeTe Ha TeKCTa. 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 79 

Label 

P ""= """! :o ! q 
P. Your name: Q 

P::::::::::E:::E:0::::::::::;::::::fl 

KoHTpo/iaTa Label ce M3no/i3Ba 3a M3o6pa3flBaHe Ha TeKcr bbb cpopMaTa. 
Cbomctboto m Text cbfl"bp>Ka TeKCTa, komto ce M3o6pa3flBa. 

Button 

P;:;*:*;:;*n*;:;*:*;:jP 

p: OK § 



itrrrrrrrrPTrrrrrrr* 



KoHTpo/iaTa Button npeAcraB/iflBa 6yTOH, komto Mowe p,a 6"bAe HaTMCKaH. rio- 
Ba>KHM HeMHM CBOMCTBa m c"b6nTMfl ca : 

- click - aKTMBupa ce npn HaTMCKaHe Ha 6yTOHa. 

- Text - 3aAaBa TeKCTa, i/i3o6pa3HBaH Btpxy 6yTOHa. 

nocTasjiHe Ha kohtpo/im bt»b 4>opMaTa 

nocTaBflHeTO Ha kohtpo/im bbb cpopMa CTaBa npe3 Ao6aB*iHeTO mm kbm 
KO^eKunflTa ot kohtpo/im Ha cpopMaTa. ToBa MO>Ke p,a ce M3B"bpujn npe3 

MeTOAa Controls. Add (...) : 



Form form = new Form(); 
Button button = new Button i 
button. Text = "Close"; 
form. Controls .Add (button) ; 



PeAtT Ha KOHTpo/ikiTe (t. Hap. Z-order, komto cnoMeHaxMe no-paHO b Ta3M 
TeMa) ce onpeAe/ia ot peAa Ha nocraBHHeTO mm - nocneAHaTa KOHTpo/ia e 
HaM-OTrope. KoraTO M3no/i3BaMe Windows Forms AH3aMHep"bT Ha Visual Studio 
.NET, tom ce rpM>KM 3a npaBM/iHOTO nocraBAHe Ha KOHTpo/iMTe. 

YnpaB/ieHiie Ha cb6MTMJiTa 

ripMXBaiuaHeTO Ha ct6MTMe CTaBa npe3 Ao6aBHHeTO Ha o6pa6oTHMK 3a Hero. 
3a ue/iTa cb3AaBaMe MeTOA, komto me o6pa6oTBa cb6MTMeTO, m cnep, TOBa ce 
a6oHMpaMe 3a Hero. Eto npMMep: 



Form form = new Form(); 

Button button = new Button ( ) ; 

button . Click += new EventHandler ( this . button Click) 



private void button_Click ( obj ect sender, EventArgs e) 

{ 

// Handle the "click" event 



80 flporpaMkipaHe 3a .NET Framework (tom 2) 



} 



Windows Forms AH3akmep"bT Ha Visual Studio .NET y/iecHHBa npuxBaiuaHeTO 
Ha c"b6nTMfl, KaTO reHepupa aBTOMaTMUHO o6pa6oT4MUMTe npn M36op Ha 
cb6kiTkie ot CTpaHnuaTa "Events" Ha npo3opeu.a "Properties". 

B Windows Forms MMa hako/iko Tuna Cb6v\Twn: 

- EventHandler - M3B"bpilJBa npOCTa HOTMCpMKaUMfl, 6e3 fla noflaBa 
flOn"b/lHI/ITe/lHM ASHHH 3a B"b3HklKHa/10T0 Cb6MTMe. 

- KeyEventHandler - Cb6klTklfl OT K/iaBkiaTypaTa. riOflaBa ce MHCpopMaUMfl 
KOM e HaTMCHaTMflT K^aBMUJ, KaKTO M MHCpOpMaUMfl 3a CbCTOflHkieTO Ha 
K^aBMUJMTe [Ctrl], [Shift] M [Alt]. 

- MouseEventHandler - C"b6klTMfl OT MMUJKaTa. riOflaBa Ce MHCpOpMaUMfl 3a 

no3MunflTa Ha MMUJKaTa v\ cbcroflHkieTO Ha HeMHMTe 6vtohi/i. 

- CancelEventHandler - Cb6MTMfl, KOMTO MOraT fla OTKa>KaT 3an04HaTOTO 

flewcTBue. ripuMepHO, aKO npuxBaiuaMe c"b6nTneTO closing Ha flafleHa 
CpopMa, KOeTO e OT Tkin CancelEventHandler, M nOTpe6klTe/lflT ce onuTa 
fla 3aTBopn cpopMaTa, MOxeM fla OTKaxeM 3aTBap*iHeTO, aKO flaHHMTe He 
ca 3ana3eHM. 

npocT Ka/iKy/iaTop - npuMep 

HacTOfliflMflT npuMep w/uocrpkipa ki3no/i3BaHeTO Ha Windows Forms 3a Cb3fla- 
BaHeTO Ha npocTO npw/io>KeHi/ie - Ka/iKy/iaTop 3a cb6npaHe Ha ue/iw nwc/ia: 



using System; 

using System. Drawing; 

using System. Windows . Forms; 

public class CalculatorForm : Form 

{ 

private TextBox TextBoxNumberl; 
private TextBox TextBoxNumber2 ; 
private TextBox TextBoxSum; 
private Button ButtonCalc; 
private Label LabelPlus; 
private Label LabelEquals; 

public CalculatorForm ( ) 

{ 

TextBoxNumberl = new TextBox ( ) ; 
TextBoxNumberl . Bounds = new Rectangle 
new Point (16, 16), new Size(72, 20) 
TextBoxNumberl .MaxLength = 10; 

LabelPlus = new Label () ; 
LabelPlus .AutoSize = true; 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 81 



} 



LabelPlus . Location = new Point (94, 19); 
LabelPlus.Text = "+"; 

TextBoxNumber2 = new TextBox ( ) ; 
TextBoxNumber2 . Bounds = new Rectangle ( 

new Point (112, 16), new Size (72, 20)); 
TextBoxNumber2 .MaxLength = 10; 

LabelEquals = new Label () ; 

LabelEquals . AutoSize = true; 

LabelEquals . Location = new Point (191, 18); 

LabelEquals .Text = "="; 

TextBoxSum = new TextBox ( ) ; 
TextBoxSum. Bounds = new Rectangle ( 

new Point(208, 16), new Size(72, 20)); 
TextBoxSum. Readonly = true; 

ButtonCalc = new Button ( ) ; 
ButtonCalc . Bounds = new Rectangle ( 

new Point (16, 48), new Size (264, 23)); 
ButtonCalc. Text = "Calculate sum"; 
ButtonCalc . Click += new EventHandler ( 

this . ButtonCalc_Click) ; 

this . AcceptButton = ButtonCalc; 

this.ClientSize = new Size (298, 87); 

this . Controls .Add (TextBoxNumberl ) ; 

this . Controls .Add (LabelPlus ) ; 

this . Controls .Add (TextBoxNumber2 ) ; 

this . Controls .Add (LabelEquals ) ; 

this . Controls .Add (TextBoxSum) ; 

this . Controls .Add (ButtonCalc) ; 

this . FormBorderStyle = FormBorderStyle . FixedDialog; 

this .MaximizeBox = false; 

this .MinimizeBox = false; 

this. Text = "Calculator"; 



private void ButtonCalc_Click (ob j ect aSender, EventArgs aArgs) 

{ 

try 

{ 

int valuel = Int32 . Parse (TextBoxNumberl . Text ) ; 
int value2 = Int32 . Parse (TextBoxNumber2 . Text ) ; 
int sum = valuel + value2; 
TextBoxSum. Text = sum. ToString ( ) ; 

} 

catch ( FormatException) 

{ 



82 flporpaMkipaHe 3a .NET Framework (tom 2) 





TextBoxSum.T 
} 


ext = "Invalid! 


ii . 












TextBoxNumberl 


SelectAll ( ) ; 














TextBoxNumber2 


SelectAll ( ) ; 












} 


TextBoxNumberl 


Focus ( ) ; 












St 

{ 


atic void Main ( 


) 












Calculator Form 


CalcForm = new 


Cal 


cul 


at 


or 


Form ( ) ; 


} 
} 


Application . Run (CalcForm) ; 













KaKAa KOMnn/iupaMe m CTapnipaMe npwMepa? 

3a fla KOMnn^npaMe npuMepa, MO>KeM p,a no/i3BaMe koh30/ihmh KOMnw/iaTop Ha 
.NET Framework 3a e3MKa C#: 



esc CalculatorForm.es 



MoxeM fla M3B"bpujMM KOMnn^aunflTa i/i ot VS.NET, ho 3a ue/ua Tpa6Ba fla 
cb3flafleM hob Windows Application npoeKT v\ fla KonnpaMe KOfla b Hero. 

Eto KaK M3Me>Kfla npuMepHOTO npn^OKeHne b flewcTBue: 



Calculator 








*l 
















1 


* 


1" 


â– |25 




















Calculate sunn 




I 















KaK pa6oTM npnMepi>T? 

B npuMepa CMe flecpi/iHi/ipa/iki K/iaca caicuiatorForm, komto HacneflHBa K/iaca 

System. Windows. Forms. Form. T03M K/iac npeflCTaB/lflBa r/iaBHaTa cpopMa Ha 

HaweTO npn^OKeHne. 

B K/iaca flecpMHupaMe Heo6xoflMMMTe hm kohtpo/im - Tpn TextBox kohtpo/ii/i 
(flBe 3a B"bBe>KflaHe Ha nwcna v\ eflHa 3a M3Be>KflaHe Ha cyMaTa mm), flBe Label 
kohtpo^m m eflMH 6yT0H, npw HaTMCKaHeTO Ha komto me ce ki3Hkic/iflBa pe3yn- 
TaTtT ot c"b6npaHeT0 Ha ni/icnaTa. 

B KOHcrpyKTopa Ha cpopMaTa MHMuna^M3MpaMe KOHTpo/iwTe v\ vv\ ,qo6aBflMe b 
Hea. 3a ue/ua mm 3aflaBaMe pa3Mepn, Mecrono/io>i<eHkie v\ hakom flpyrn 
CBOMCTBa. 3a TeKCTOBMTe no/ieTa, b komto noTpe6kiTe/iflT me B"bBe>Kfla nwc/ia- 
Ta, komto me cb6i/ipaMe, 3aflaBaMe MaKCkiMa/iHaTa mm fl"b/i>KkiHa b 6pow cmmbo- 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 83 

nv\. 3a Label KOHTpo^MTe 3aflaBaMe TeKcra, komto me Bki3ya/iki3kipaT. 3a 
6yTOHa 3aflaBaMe 3ar/iaBkie. HaKpaa 3aAaBaMe Hankma, no komto me M3r/ie>K- 
Aa HaiuaTa dpopMa. 

B MeTOfla caicButton_ciick(...) o6pa6oTBaMe c"b6nTneTO click Ha 6yTOHa 3a 
M34nc^flBaHe Ha cyMaTa. B Hero napcBaMe cbAtpaoHkieTO Ha ABeTe TeKCTOBM 
no/ieTa, cyMnpaMe nwc/iOBMTe ctomhoctm, no/iyneHki ot tax, m 3anncBaMe 
cyMaTa b TpeTOTO TeKCTOBO no/ie. ripn rpeujKa 3aAaBaMe uesai\v\p,eu pe3y/iTaT. 

Windows Forms peflaKTopi»T Ha VS.NET 

Cb3AaBaHeTO Ha dpopMM, Ao6aBAHeTO Ha kohtpo/im, HacTpoMKaTa Ha pa3Me- 
puTe m MecTono^o>KeHMeTO Ha KOHTpo/iwTe v\ Apyrn TaKMBa onepaunn, MOxeM 
Aa M3B"bpujBaMe, nuiueMKn AnpeKTHO KOAa 3a HaweTO npw/io>KeHi/ie, KaKTO b 
npeAxoAHMfl npuMep. Pa3pa6oTKaTa Ha npw/io>KeHi/ifl v\ cb3AaBaHeTO Ha noTpe- 
6nTe^CKM MHTepcpewc no to3m HanwH, o6ane, e TpyaoeMtK v\ BpeMeoTHeMaiu 
npouec. 

Windows Forms peAaKToptT Ha VS.NET hm AaBa bbsmokhoct Aa npaBMM 
BCM4KM Te3M Hema BM3ya^HO, ycKopyiBaMKM npoueca Ha pa3pa6oTKa. Tom 
y^ecHABa 3HanwTe/iHO M3BtpujBaHeTO Ha cnep,uv\je onepaunn: 

- cb3AaBaHe Ha dpopMM 

- Ao6aBAHe Ha kohtpo/ii/i bbb dpopMMTe 

- Ao6aBHHe Ha Herpaopi/mHw KOMnoHeHTM bbb cpopMMTe 

- HaCTpOMKa Ha CBOMCTBaTa Ha CpOpMM, KOMnOHeHTkl M KOHTpO/ll/l 

- Ao6aBAHe Ha cb6kiTi/m 3a dpopMi/i, KOMnOHeHTM v\ kohtpo/im 



Cb3flaBaiie Ha cjDopMa 

C"b3AaBaHeTO Ha cpopMa bbb VS.NET CTaBa, KaTO ot MeHKrro File M36epeM Add 

New Item. B nOflBkl/lklfl Ce AHaJlOTOB np030peu M36npaMe Windows Form, B 

no/ieTO 3a MMe BtBe>KAaMe MMeTO Ha cpopMaTa v\ HaTMCKaMe 6yTOHa open. 
HaiuaTa HOBa dpopMa ce OTBapa b peAaKTopa Ha VS.NET: 

File | Edit View Project Build DebL 



New 
Open 
Close 



Add New Item.. 



Ctrl+Shift+A 



I 



Windows 
Form 



:.;v. 



User Control Data Form 
Wizard 



Component 
Class 

Data Set 



WindowsApplication5 - Microsoft Visual C# .NET [design] - Foi 


File Edit View Project Build Debug Data Format Tools 


!|'6>H;Hfl Jii «'"■! ^ | ►de 


! a ie 4 si ii * sfli | s o ?::d [6 1 â– *â–  Sf ffi s 1 1 


Toolbox f x 




My User Controls 




Data 


raa^B . -jsi^j 


Components 




Windows Forms 






| ^ Pointer 
A Label 
A LinkLabel 
ibj Button 
labf TextBox 



























84 nporpaMnpaHe 3a .NET Framework (tom 2) 

flo6aBflHe Ha KOHTpo/ia 

flo6aBAHeTO Ha KOHTpo/ia CTaBa, KaTO otbopmm cpopMaTa, mpaKHeM Btpxy 
KOHTpo^aTa b Toolbox, cnefl TOBa mpaKHeM Btpxy cpopMaTa TaM, KbfleTO 
MCKaMe fla e ropHMAT /ihb trb/i Ha KOHTpo/iaTa, v\ v\3jevi\v\M MMUJKaTa ,qo TaM, 
KtfleTO MCKaMe fla e ao/ihmat m fleceH trb/i. KoHTpo/iaTa ce flo6aB*i bbb 
cpopMaTa c onpeAe/ieHOTO Mecrono/io>KeHi/ie v\ pa3Mepn: 



T Windows Applications - Microsoft Visual C# .NET [design] - Foi 



File Edit View Project Build Debug Data Format Tools 
I m * 1M - c£ y S | * « I <n - n - p - IBt I ► Det 

i ft 1 1= * =i I ip * si I s e ?::a es | «- w k s I § 



Toolbox ? x 


Start Page Forml.cs [Design]* | 


My User Controls 
Data 


D O 

a: : 


1 


Components 




Windows Forms 




^ Pointer 
A Label 
A LinkLabel 

abj Button 
IS TextBox 


3 


u u 


a 



£* Windows Applications - Microsoft Visual C# .NET [design] - Foi 


File Edit View Project Build Debug Data Format Tools 

ii3-tsi-ts ; He*itefe|'"'""P-iBt| â–ºde 


I ft | m e ■=■ | bqt * sSi | g ft =D E3 | »• Si K £ | 1 


Toolbox ? X | 

My User Controls 

Data 

Components 


Start Page Forml.cs [Design]* | 






Windows Forms 






| ^ Pointer 
A Label 

A LinkLabel 

M Button 
IS TextBox 


:::::: ei ••• a ••• p ::::: : 

â–¡ buttonl p 


u n u 















Bcm4km kohtpo^m MMaT noflpa36kipam ce pa3Mep. Ako >Ke/iaeM fla flo6aBMM 
KOHTpo/ia c noflpa36npa[flMfl ce pa3Mep, motom npocTO fla a M3Ter/iMM ot 
Toolbox m fla a nycHeM bbb cpopMaTa (drag and drop). 

flo6aBflHe Ha Herpaa>MHHM KOMnoHeHTM 

3a fla flo6aBMM HerpacpwuHa KOMnoHeHTa, OTBap^Me cpopMaTa, mpaKBaMe 
Btpxy KOMnoHeHTaTa b Toolbox m a M3TeMAMe Btpxy cpopMaTa. Tbki KaTO 
HerpacpM4HMTe KOMnoHeHTM HAMaT noTpe6i/iTe/iCKki MHTepcpewc, Te He ce 
noKa3BaT Btpxy cpopMaTa, a ce M3o6pa3flBaT b cneuwa/iHa o6/iacr nofl Hea: 



WindowsApplicationS - Microsoft Visual C# .NET [design] - For 



File Edit View Project Build Debug Data Tools ReSharp 
!SI-l!|-CSHfl|Xfl»©|T™*#l-l^| ► Det 

j ft | is s si | if * yi | s ft SMS | «■■ 5: & S | g 



My User Controls 



Start Page Forml.cs [Design]* 

u u 

HUH ^Jfli<l 



Components 



VScrollBar 



| © Timer 
♦|» Splitter 
l~I DomainUpDown 
El NumertUpDown 



I: 



Windows Applications - Microsoft Visual C# .NET [design] - Fo 


File Edit View Project Build Debug Data Format Tools 


m ' M - & y m %\ â–º Debug - r# e 


I ft | r= * =i | if * sSi | S 8 si ES | »= ffi K K | £ 


1 Toolbox * x | 
My User Controls 
Data 
Components 


Start Page Forml.cs [Design]* | 




liDBS^H jflxi 






Windows Forms 






| ^ Pointer 

A Label 

A LinkLabel 

M Button 

IS TextBox 

Clipboard Ring | â–¼ | 

General 




























©tinerl 


% Server E... 2? Toolbox | 





HaCTpOMKa Ha CBOMCTBa 

HacTpoMKaTa Ha CBOMCTBa ce M3B"bpLiJBa b npo3opeua Properties Ha 
peflaKTopa. Ako npo3opei_rbT He e bmamm, MO>xeM fla ro noKa>KeM, KaTO 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 85 



M36epeM View | Properties Window OT MeHKDTO, HaTMCHeM [F4] V\J\V\ 

M36epeM Properties ot KOHTeKCTHOTO MeHK), noflBflBamo ce npn lupaKBaHe c 
flecHMfl 6yTOH Ha MMUJKaTa Btpxy KOHTpo/iaTa. Ot naflaiuna cnwcbK, HaMnpaiu 
ce Haw-OTrope b npo3opeu,a, M36npaMe o6eKTa, hmmto CBOMCTBa me 
HacTpoMBaMe. C/iefl TOBa M36npaMe cbomctboto, KoeTO me npoMeHAMe, v\ My 
3aflaBaMe ctomhoct. B 3aBMCMMOCT ot cbomctboto me 3aflafleM TeKCT, ni/ic/iOBa 
ctomhoct ki/iki me M36epeM CTOMHOCTra ot cnwcbK. Eto KaK M3Me>KAa 
np030peu,"bT Properties Ha VS.NET: 



I Properties 


* x 




but ton 1 System, Windows, Forms ,jj 


la 




m 


f\m 


DialogResult None 






|FlatStyIe 


Standard â–¼ 




S Font 


Flat 
Popup 




ForeColor 


Image 


Standard 


ImageAlign 


System 


imageindex j (none.) 


ImageList (none) 


S Location 56; 32 






Locked False 






MnrlifiaiT Driusta 




T 


1 



Properties © Dynamic Help 



Ao6aBfiHe Ha o6pa6oTHHMM Ha ci>6mtmji 

flo6aBAHeTO Ha o6pa6oT4nun Ha cb6wTi/ifl ctmo CTaBa ot npo3opeua 
Properties Ha VS.NET: 



I Properties 



? x | 



jbuttonl System, Windows, Fornns,_J 




ContextMei 

CursorChangecr 

DockChanged 

DragDrop 

DragEnter 

DragLeave 

DragOver 

EnabledChangei 

Enter 

FontChanged 

ForeColorChang 



J 



[jr Properties | 3 Dynamic Help | 



private void buttonl_Click (object sender, System. EventArgs e) 
{ 



86 nporpaMkipaHe 3a .NET Framework (tom 2) 

3a ue/ua ot naflaiuna cnncbK, HaMnpaiu ce Haw-OTrope b npo3opeua, 
M36npaMe o6eKTa, umi/ito CBOMCTBa me HacTpoMBaMe, v\ HaTMCKaMe 6yTOHa 
Events, HaMnpaiu ce noA naflaiuna cni/icbK. noHBABaT ce cb6kiTHflTa Ha 
o6eKTa. Ot naAaiuna cnnctK cpeiuy c"b6nTneTO, 3a KoeTO MCKaMe p,a Ao6aBMM 
o6pa6oT4MK, M36npaMe MeTOfla, komto me o6pa6oTBa c"b6nTneTO. Ako me 
AecpMHupaMe hob MeTOA 3a o6pa6oTKa Ha cb6kiTi/ieTO, M3nncBaMe HeroBOTO 
MMe b no/ieTO. flpyra b"B3mo>khoct e p,a mpaKHeM 2 ntTi/i c MMUJKaTa v\ VS.NET 
me M36epe MMe no noflpa36npaHe (MMeTO Ha KOHTpo/iaTa + "_" + MMeTO Ha 
c"b6nTneTO, npuMepHO okButton_ciick). ripn c"b3flaBaHe Ha o6pa6oT4MK 3a 
c"b6nTne Windows Forms peAaKTopvr Ao6aB*i v\nv\ HaMupa MeTOAa v\ OTBapa 
peAaKTopa 3a koa, no3nunoHnpaH touho Btpxy Hero. 

Ci>3flaBaHe Ha Ka/iKy/iaTop c Windows Forms 
peaaKTopa Ha VS.NET - npuMep 

C HacTOfliuMfl npuMep me M/uocTpwpaMe w3no/i3BaHeTO Ha Windows Forms 
peAaKTopa Ha VS.NET 3a cb3AaBaHeTO Ha npocTO npi/i/io>KeHi/ie - Ka/iKy/iaTop, 
komto Cb6npa ue/iw nwcna. OyHKUkiOHa/iHOora Ha Ka/iKy/iaTopa me e cbmaTa 
KaTO Ha Ka/iKynaTopa ot npeAHWHWfl npuMep, ho to3m ntT me ki3no/i3BaMe 
Windows Forms peAaicropa, komto me reHepupa no-ro/isiMaTa nacr ot KOAa Ha 
npn^OKeHneTO. 

Eto CTtnKMTe 3a cb3AaBaHeTO Ha Haujua Ka/iKy/iaTop: 

1. CTapTupaMe VS.NET v\ cb3AaBaMe hob Windows Forms npoeicr. 

2. 3aAaBaMe Ha r/iaBHaTa cpopMa MMe calculator v\ 3ar/iaBne "simple 

Calculator". ripOMeHHMe M MMeTO Ha CpaM/ia OT Forml.cs Ha 
Calculator . cs . 

3. B3eMaMe ot Toolbox Ha VS.NET Tpn TextBox, ABe Label v\ ep.ua Button 
kohtpo^m m vv\ nocraBAMe b r/iaBHaTa cpopMa. 3aAaBaMe noAxoA^mn 
MMeHa Ha nocraBeHMTe KOMnoHeHTM. ripenoptukiTe/iHO e MMeTO Ha eAHa 
KOHTpo/ia p,a ctAtpxa HewHOTO npeAHa3HaneHkie v\ Tun {v\nv\ npecpMKC, 
yKa3Bam Tuna). B Haujua cnynaw noAxoA^mn MMeHa ca: 

TextBoxNumberl , TextBoxNumber2 , TextBoxSum, LabelPlus, 
LabelEquals H ButtonCalcSum. 

4. 3aAaBaMe npa3eH hm3 b cbomctboto Text Ha TeKCTOBMTe no/ieTa. 3a 

no/ieTO TextBoxSum 3aAaBaMe Readonly Rd e true. Ha CBOMCTBOTO Text 
Ha ButtonCalcSum 3aAaBa Me CTOMHOCT "Calculate sum". Ha CBOMCTBaTa 
Text Ha LabelPlus M LabelEquals 3aAaBaMe CbOTBeTHO CTOMHOCTM "+" 

m "=". Eto KaK M3r/ie>KAa cpopMaTa Ha Haujua Ka/iKy/iaTop b to3m 
MOMeHT: 



T/iaBa 15. M3rpa>KAaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 87 



Calculator.es [Design] | Calculator.es | 



D 



Simpe Calculator 



E 



Calculate sum 



5. OcTaBa fla flecpi/mi/ipaMe c"b6nTneT0 3a HaTMCKaHe Ha 6yT0Ha. C abomho 
LUpaKBaHe Btpxy 6yT0Ha VS.NET hm flaBa b"B3mo>khoct fla HanmueM KOfla 
3a o6pa6oTKa Ha c"b6nTneT0 My click: 



private void ButtonCalcSum_Click (ob j ect sender, 
System. EventArgs e) 

{ 

try 

{ 

int valuel = Int32 . Parse (TextBoxNumberl . Text ) ; 
int value2 = Int32 . Parse (TextBoxNumber2 . Text ) ; 
int sum = valuel + value2; 
TextBoxSum. Text = sum. ToString ( ) ; 

} 

catch ( FormatException) 



{ 



TextBoxSum. Text = "Invalid!"; 



TextBoxNumberl . SelectAll 
TextBoxNumber2 . SelectAll 

TextBoxNumberl . Focus ( ) ; 



ripn HaTMCKaHe Ha 6yT0Ha napcBaMe cbfltpwaHi/ieTO Ha flBeTe TeKCTOBM 
no/ieTa, cyMnpaMe nwc/iOBkiTe ctomhoctm, no/iyneHi/i ot tax, m 3anncBaMe 
cyMaTa b TpeTOTO TeKCTOBO no/ie. ripn rpewKa 3aAaBaMe HeBa/iwfleH 
pe3y/iTaT. 

ripn^OKeHneTO Bene e totobo m MO>KeM fla ro crapTkipaMe v\ TecTBaMe. 
Eto KaK M3Me>Kfla HaujuaT Ka/iKy/iaTop: 



r Simpe Calculator 



A 



w 



w 



Calculate sunn 



88 nporpaMnpaHe 3a .NET Framework (tom 2) 

flua/ioroBii KyTMM 

ripn pa3pa6oTKaTa Ha Windows Forms npM/io>KeHMfl necro ntTn ce Ha/iara fla 
M3Be>KflaMe flMa/ioroBM KyTMM c HAKaKBn cbo6meHMfl v\nv\ c HflKaKbB Btnpoc. 
HeKa pa3r/ieflaMe craHflapTHMTe cpeACTBa 3a TaKi/ma cuTyaunn. 



CTaHflapTHM flMa/IOrOBM KyTMM 

K/iacbT MessageBox hm no3BO^ABa fla M3Be>KflaMe CTaHflapTHM flMa/ioroBM 
KyTMM, CbfltpxaiflM TeKCT, 6yTOHM m mkohm: 

- c"bo6iueHMfl KtM noTpe6MTe^a 

- BtnpOCMTe^HM flMa/103M 

rioKa3BaHeTO Ha flMa/ioroBa KyTMfl ce M3B"bpujBa npe3 M3BMKBaHe Ha craTMn- 
HMfl MeTOfl Show(...) Ha K/iaca MessageBox. C/ieflHMflT KOfl, HanpMMep, me 
noKawe flMa/ioroBa KyTMfl etc 3ar/iaBMe "npenynpesKfleHJie" m TeKCT "Hsma 

BptSKa c MHTepHeT 11 : 



MessageBox . Show ( "Hfliia Bp^Ka c MHTepHeT.", "IlpeflynpeaefleHMe" ] 



Eto KaK M3Me>Kfla flMa/ioroBaTa KyTMa: 



npeflynpejKfleHkie 



*] 



HflMa Ep"b3Ka c MHTepHeT, 



OK 



HeKa pa3r/ieflaMe oiue eflMH npMMep 3a craHflapTHa flMa/ioroBa KyTMfl c Ma/iKO 
noBene cpyHKUMOHa/iHOcr: 



bool confirmed = 

MessageBox . Show ( "HawcTMHa jim me M3TpneTe TOBa?", 
"B'bnpoc" , MessageBoxButtons . YesNo, 
MessageBoxIcon . Question) == DialogResult . Yes; 



To3M KOfl me noKawe flMa/ioroBa KyTMfl etc 3amaBwe "Binpoc" m TeKCT 

"HawcTMHa jim me MSTpiieTe TOBa?". ripeflM TeKCTa Lfle MMa MKOHa c 

BtnpocMTe^eH 3HaK b Hea, a nofl Hero - 6yTOHM Yes m no. Ako noTpe6MTe/i*iT 
HaTMCHe Yes, npoMeH^MBaTa confirmed me MMa ctomhoct true, b npoTMBeH 
cnynai/i me MMa ctomhoct false. Eto KaK M3r/ie>Kfla flMa/ioroBaTa KyTMfl ot 
npMMepa: 



T/iaBa 15. M3rpa>KAaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 89 



Etanpoc 



V I 

â– V 



HaMCTMHa riM me HSTpneTe TOEa? 



Yes 



No 



rioBene MHCpopMaunfl 3a K/iaca MessageBox MO>Ke p,a ce HaMepn b MSDN. 

M3BiiKBaHe Ha ananorosn kytmm 

OcBeH CTaHflapTHMTe Ana/ioroBM kytmm MO>KeM fla M3no/i3BaMe m noTpe6M- 
Te^CKM AecpMHMpaHM Ana/ioroBM kytmm. Te npeAcraB/iflBaT o6mkhob6hm dpopMM 

M Ce M3BMKBaT MOAa/lHO nO C^eAHMfl Ha^MH: 



DialogResult result = dialog . ShowDialog 



MeTOAtT ShowDialog o noKa3Ba cpopMaTa KaTO MOAa/iHa Ana/ioroBa kytma. 

TMntT DialogResult CbA"bp>Ka pe3y/lTaTa (OK, Yes, No, Cancel M AP-) OT 

M3BMKBaHeTO Ha Ana/iora. 3aAaBaHeTO Ha DialogResult MO>Ke p,a CTaBa aBTO- 
MaTM^HO, npe3 cbomctboto DialogResult Ha 6yTOHMTe, v\nv\ p"bHHO - npeAM 
3aTBapaHeTO Ha Ana/iora npe3 cbomctboto My DialogResult. 




Ako M3BMKBaTe dpopMa MOfla/iHO, csiefl TOBa saflfe/iwirresiHO 
Tpn6Ba fla ft M3BMKBaTe Dispose () MeTOfla, 3a fla ocBo6oflMTe 
pecypctrre, komto th e M3no/i3Ba/ia. B npoTfiBeH cnynaii Te me 
ce ocBo6oflnT eflBa KoraTO ce axTUBupa Garbage Collector v\ 
me ce M3no/i3BaT HeHywHO flia/iro. 



DialogResult m npenaBaHe Ha aaHHM Mewfly flnano3M 
- npMMep 

C HacTOfliuMfl npMMep me M/uocrpMpaMe M3no/i3BaHeTO Ha Ana/i03M b Windows 
Forms, me noKaweM KaK p,v\ai\03v\je MoraT p,a ce M3BMKBaT eAMH Apyr m KaK 
MoraT Aa cm npeAaBaT AaHHM. 

B npMMepa me cb3AaAeM eAMH Ana/ior, cbAtpwam TeKCTOBO none 3a B"bBe>K- 
AaHe Ha MMe m ABa 6yTOHa - ok m cancel. To3m Ana/ior me ce noKa3Ba npM 
HaTMCKaHe Ha 6yTOH ot r/iaBHaTa cpopMa. Ako noTpe6MTe.rmT BtBeAe MMe m 
HaTMCHe ok, me ce noKa3Ba Ana/ior, cbAtpwam BtBeAeHOTO MMe, a aKO 
noTpe6MTe^AT 3aTBopM Ana/iora, HaTMCKaMKM cancel, me ce no^BM Ana/ior, 
yKa3Bam, ^e e HaTMCHaT cancel. 



Eto m CTtnKMTe 3a M3rpa>KAaHe Ha HaujMfl npMMep: 



90 flporpaMnpaHe 3a .NET Framework (tom 2) 



CrapTkipaMe VS.NET v\ Cb3flaBaMe hob Windows Forms npoeKT. B 
peflaKTopa ce noaBflBa r/iaBHaTa cpopMa Ha npw/io>KeHkieTO. Ha Hea me 
ce cnpeM cnep, Ma/iKO. 

Cb3flaBaMe HOBa CpopMa (File | Add New Item ... | Windows Form). 

CMeHAMe MMeTO v\ Ha DiaiogForm, a MMeTO Ha HeMHua cpaw/i - Ha 

DialogForm.es. 3aflaBaMe Ha CBOMCTBaTa M MinimizeBox M 
MaximizeBox CTOMHOCTM false, a Ha CBOMCTBOTO FormBorderStyle 

ctomhoct FixedDiaiog. Ta3M cpopMa me cny>Ki/i 3a B"bBe>KflaHe Ha MMeTO 
Ha noTpe6nTe^fl. 

B3eMaMe ot Toolbox Ha VS.NET eflHa Label, eflHa TextBox v\ p,se Button 
kohtpo^m m vv\ noApe>KAaMe Btpxy cpopMaTa. 3aAaBaMe mm noflxoflfliun 
MMeHa. B Haiunfl cnynaw noflxoA^iun ca MMeHaTa: LabeiYourName, 

TextBoxName, ButtonOK M ButtonCancel. 

3aAaBaMe CBOMCTBOTO Text Ha LabeiYourName Rd e "Enter your 
name:", Ha ButtonOk fla e "OK", Ha ButtonCancel fla e "Cancel", a Ha 
TextBoxName - npa3eH HM3. 

3aAaBaMe Ha cbomctboto DiaiogResuit Ha 6yT0Ha ButtonOk ctomhoct 
ok. no T03M HanwH npw HaTMCKaHeTO My cpopMaTa me ce 3aTBopn v\ me 
6"bfle BtpHaT pe3y/iTaT DiaiogResuit. ok. AHa/iorwuHO Ha cbomctboto 

DiaiogResuit Ha 6yT0Ha ButtonCancel 3aflaBaMe CTOMHOCT Cancel. ETO 

KaK M3Me>KAa Hawi/iflT Ana/ior: 




6. OcTaBa p,a Ao6aBMM Ha Ta3M cpopMa eAHO cbomctbo userName, KoeTO p,a 
M3B/iMna c"bA"bp>KaHMeTO Ha TeKCTOBOTO no/ie 3a B"bBe>KAaHe 
noTpe6nTe^CKO MMe: 



Ha 



public string UserName 
{ 



get 
{ 



return TextBoxName . Text ; 



} 



} 



7. nocraBflMe Btpxy r/iaBHaTa cpopMa 6yT0H c MMe ButtonCaiiDialog v\ 

3aAaBaMe Ha CBOMCTBOTO My Text CTOMHOCT "Call Dialog". Hpe3 T03M 

6yT0H me M3BMKBaMe Ana/iora, komto cb3AaA0XMe no-paHO. 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 91 
8. flo6aBAMe o6pa6o"mm< Ha Cb6kiTi/ieTO click Ha 6yTOHa: 



private void ButtonCallDialog_Click (ob j ect sender, 
System. EventArgs e) 

{ 

DialogForm dialog = new DialogForm () ; 

if (dialog . ShowDialog ( ) == DialogResult . OK) 

{ 

string userName = dialog . UserName; 
MessageBox . Show ( "You entered: " + userName); 

} 
else 

{ 

MessageBox . Show ( "You canceled the dialog."); 

} 



dialog . Dispose ( ) ; 



} 



B Hero irbpBO cb3AaBaMe kiHcraHUkifl Ha DialogForm. C/ieA TOBa M3BMKBaMe 
MOfla^HO dpopMaTa DialogForm m npoBepyiBaMe fla/iw e 6w/ia 3aTBopeHa c 
6yTOHa ok npe3 BtpHaTna DialogResult. Ako e TaKa, M3B^M4aMe ot 

DialogForm CBOMCTBOTO UserName, C KOeTO B3MMaMe B"bBefleHOTO B Hefl MMe 

m ro noKa3BaMe b Ana/ioroBa kytma. Ako He e 6m/i HaTMCHaT 6yTOH"bT ok, 
TOBa 03HanaBa, ne e 6m/i HaTMCHaT 6yTOH"bT cancel. B T03M cnynai/i 
noKa3BaMe Ai/ia/ioroBa KyTna, yi<a3Bama, ne e HaTMCHaT 6yTOH cancel. 

9. 3aflaBaMe Ha r/iaBHaTa cpopMa MMe MainForm v\ 3ar/iaBHe "Main Form". 

npOMeHflMe M MMeTO Ha Cpaki/ia OTForml.cs HaMainForm.es. 

10. HaweTO npM/io>KeHMe e totobo m MO>KeM p,a ro crapTwpaMe v\ TecTBaMe: 



Main Form 



^Jnjj<J 



Dialog Form 



Enter your name: ICeeTnHH HaKOE 




92 nporpaMnpaHe 3a .NET Framework (tom 2) 

flpyru Windows Forms kohtpo/im 

Bene pa3MeAaxMe Haw-ocHOBHUTe kohtpo/im b Windows Forms - TeKCTOBMTe 
no/ieTa v\ 6yTOHMTe. HeKa cera pa3r/ieAaMe v\ hakom flpyrn kohtpo/ii/i, komto 
cbiuo ce M3no^3BaT necro npn M3rpa>KflaHeTO Ha noTpe6nTe/iCKM MHTepcpewc. 

CheckBox 

â–¡i^:;:;:!:;:!:;0;:;:;:;:;:!:;:;:;a 

PJ checkBoxl 
i3:::j::::::::3:OS:S:::S:*S 

CheckBox e KyTklfl 3a M36op B CTkl/1 "Aa/He". CBOMCTBOTO M Checked 3aAaBa 

Aa/iw e M36paHa. 



RadioButton 

D( radioButtonl 
i3:::j:::::::::*:;:n:j:::::*:*:::::fi 

RadioButton e KOHTpo/ia 3a a/iTepHaTMBeH M36op. Ta ce M3no/i3Ba b rpynn. 
Bcm4km RadioButton KOHTpo/ii/i b p,ap,eH KOHTefiHep (HanpwMep cpopMa) o6pa- 
3yBaT eAHa rpyna v\ b Hea caMO ep,v\u RadioButton e M36paH b p,ap,eu momsht. 

3a Aa cb3AaAeM hako/iko rpynn b eAHa cpopMa, Tpa6Ba p,a nocTaBMM BC^Ka 
rpyna b cbom co6cTBeH KOHTetiHep, KaTO HanpuMep GroupBox, Panel v\nv\ 
TabPage. Cbomctboto checked 3aAaBa p,anw KOHTpo/iaTa e M36paHa. ripn npo- 

MflHa Ha Checked CBOMCTBOTO ce aKTMBkipa Cb6klTkieTO CheckedChanged. 

pH*!*;*i*;*;o;*hi*;*i*;*iq 
— groupBoxl 



n 



C radioButtonl 
C radioButl:on2 
C radioButl:on3 



fri*i*i*i*i*iOi*i*i;i*i*i*d 



Panel 

p, — — o — '• — ° 



C radioButtonl 
H C radioButton2 
C radioButton3 



D 



S£Oi; 



D 



Panel npeAcraB/iflBa KOHTetiHep, komto cbAtpwa rpyna Apyrn kohtpojw. 
C/iy>KM 3a rpynnpaHe Ha kohtpojw. KoraTO npeMecTMM AaAeH nanen Ha Apyra 
no3Munfl, BCM4KM kohtpo/im, komto ca b Hero, cbmo ce npeMecTBaT. Ako 

CTOMHOCTTa Ha CBOMCTBOTO Enabled Ha Panel KOHTpO/iaTa MMa CTOMHOCT 

false, to BCM4KM kohtpojw, cwvb pwa la w ce b Hesi, iue 6tAaT AeaKTMBMpaHM. 



T/iaBa 15. M3rpa>KAaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 93 

TabControl m TabPage 



Qmmm 


o 


= P 


I! General Formatting | 
$ i I - Allow blank lines 


Colors | 




1 r 


Use tab character 


â–  |Uj 


lljr 


Use smart tab 




di'i'i'i'i'i'i 


!:!:!0:!:!:i 


: tl 



KOHTpO/lklTe TabControl M TabPage OCkirypflBaT nO/13BaHeTO Ha Ta60Be CbC 
CTpaHMUM. TabControl Cbfl"bp>Ka MHO>KeCTBO TabPage KOHTpO/lkl, KOMTO Ce 

Ao6aBflT b Hero npe3 cbomctboto controls. 



ListBox 



n_ 



n 



â–¡ 



First Item 
Second Item 
Third Item 
Fourth Item 
Fifth Item 
Sixth Item 



â–¡ 



l&lO&l&l 



â–¡ 



ListBox KOHTpo/iaTa ce M3no/i3Ba 3a i/i3o6pa3HBaHe Ha cnucbK etc ci/imbo/ihm 
HM30Be, komto noTpe6wTe/iflT MO>Ke fla M36npa npe3 mpaKBaHe c MMUJKaTa 
Btpxy tax. no-Ba>KHMTe CBOMCTBa Ha Ta3M KOHTpo/ia ca: 

- items - KO/ieKuwfl, KOATO 3aflaBa cnncbKa ot e/ieMeHTki, cbfltpaomw ce 
b KOHTpo^aTa. 

- seiectionMode - pa3pewaBa/3a6paHflBa M36npaHeTO Ha hako/iko e/ie- 
MeHTa eAHOBpeMeHHO. 

Selectedlndex, Selectedltem, Selectedlndices, Selectedl terns - 

BptiuaT M36paHMfl e/ieMeHT (m/im M36paHMTe e/ieMeHTw). 



CheckedListBox 



â–¡ 



D Iteml 
â–¡ Item 2 
QDltem3 | 

D Item 4 

fcTH*i*!*!*iO!*!H*!*!*J€ii 

CheckedListBox M3o6pa3flBa cnncbK ot B"b3MO>KHOCTM 3a M36op "fla/He". no- 
Ba>KHM CBOMCTBa ca : 



94 flporpaMkipaHe 3a .NET Framework (tom 2) 



items - 3aflaBa B"b3MO>KHOCTMTe, ot komto noTpe6kiTe/iflT me M36npa. 

Checkedl terns - Bptma M36paHMTe e/ieMeHTkl. 



ComboBox 



Iteml 



Item 3 
Itenn4 



ComboBox npeAcraB/iflBa kytma 3a peAai<ui/m Ha TeKCT c b"B3mo>khoct 3a drop- 
down a/uepHaTMBeH M36op. 

- Text - cbAtpwa BtBeAeHMfl TeKCT. 

- Items - 3aAaBa B"b3MO>KHMTe CTOMHOCTM, OT KOMTO noTpe6kiTe/iflT MO>Ke 

Aa M36npa. 

- DropDownstyle - 3aAaBa crmia Ha KOHTpo^aTa - Aa/iki caMO ce M36npa 
ctomhoct ot cnwcbKa v\nv\ Moxe Aa ce BtBe>KAa ptuHO v\ Apyra ctomhoct. 

TreeView 

liiiiiiiOMiiiiiig 



n 



â–¡ 



B NodeO 
El Nodel 
L Node11 
B Node3 

'â– â– â– â– â–  Node4 
-Node8 

& !*i*!H*!*i*!OH*i*!*!*!*i*il 

TreeView KOHTpO/iaTa M306pa3flBa A"bpBOBMAHM ASHHU. OCHOBHM HeMHM 

CBOMCTBa ca: 

- Nodes - CbA"bp>Ka A^pBOTO (cnMCbK OT TreeNode e/ieMeHTM). 

- SelectedNode - CbAtpwa TeKyLUO M36paHMfl B"b3e/1 B A^pBOTO. 

RichTextBox 



Just testing 

RTF^ 

It's a small test 

Keep on typing. Keep on 
typing. Keep on typing. 
Keep on typing. Keep on 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 95 

RichTextBox e KyTMfl 3a pep,aKu,wn na TeKcr c cpopMaTupaHe (Rich Text 
Format). MeTOflMTe LoadFiie(...) v\ saveFiie(...) no3BO^ABaT 3ape>KflaHe v\ 
3anncBaHe Ha TeKcra ot KOHTpo/iaTa b Rich Text Format (RTF) cpai/i/i v\nv\ b 

TeKCTOB Cpaki/1. CBOMCTBaTa SelectionStart M SelectionEnd C/iy>KaT 3a 

M3B/innaHe m 3aAaBaHe Ha o6/iacn"a ot TeKcra, koato e MapKupaHa. Hpe3 

CBOMCTBaTa SelectionFont, SelectionColor M SelectionAlignment MOraT 

fla ce 3aflaBaT ujpucpT, ubat m noflpaBHflBaHe Ha TeKyiuna MapKupaH TeKCT. 

LinkLabel 

p:::::;:::::;:::::n:!:;S!:;:::i:!:::;g 

6 www.devbg.org Q 
n n n 

LinkLabel KOHTpo/iaTa e noflo6Ha Ha Label KOHTpo/iaTa, ho M3r/ie>Kfla KaTO 
npenpaTKa (hyperlink). Cbomctboto Text 3aAaBa t6kctoboto cbfltpwaHwe Ha 
KOHTpo/iaTa. ripn lupaKBaHe c MMUJKaTa Btpxy npenpaTKaTa ce aKTMBupa 
C"b6klTMeT0 LinkClicked. 

PictureBox 



pictureBox ce M3no/i3Ba 3a M3o6pa3flBaHe Ha KapTMHKM. KapTMHKaTa, koato 

LUe Ce M306pa3flBa, Ce 3aAaBa npe3 CBOMCTBOTO Image. CBOMCTBOTO SizeMode 

3aflaBa p,anv\ KapTMHKaTa fla ce pa3Lunpki/HaMa/in v\nv\ ueHTpupa npn M3o6pa- 
3flBaHeT0 b KOHTpo^aTa. 

KapTMHKMTe, M3no^3BaHM b KOHTpo^aTa PictureBox, ce 3ana3BaT KaTO pecyp- 
cm. Te ce 3anncBaT b XML cpopMaT b . resx cpaw/ia Ha cbOTBeTHaTa cpopMa v\ 
npn KOMnn^aunfl ce 3ana3BaT KaTO pecypcn b aceM6/ikiT0 Ha npi/i/io>KeHkieTO. 

Pa6oTa c hakom Windows Forms kohtpo/im - npiiMep 

B HacTOfliflMfl npuMep me fleMOHcrpwpaMe M3no/i3BaHeTO Ha hakom ot Windows 

Forms KOHTpo/lklTe, KOMTO pa3r/ieflaXMe: TabControl, TabPage, Panel, 
RadioButton, GroupBox, CheckedListBox. 3a ue/lTa Lfle Cb3flafleM Ma/1K0 

npi/i/io>KeHkie, KoeTO Cb6wpa MHCpopMauna ot noTpe6kiTe/i*i v\ cnep, TOBa a 
noKa3Ba b flkia/ioroB npo3opeu. 

Eto CTbnKMTe 3a M3rpa>KflaHe Ha HaiueTO npn^OKeHne: 

1. CTapTupaMe VS.NET v\ cb3flaBaMe hob Windows Forms npoeicr. 

2. 3aflaBaMe Ha r/iaBHaTa cpopMa MMe MainForm v\ 3ar/iaBHe "Main Form". 

ripOMeHflMe M MMeTO Ha Cpai/i/ia OTForml.cs HaMainForm.es. 



96 flporpaMkipaHe 3a .NET Framework (tom 2) 



B3eMaMe ot TooIBox Ha VS.NET eflMH Tabcontrol, nocraBAMe ro b 
ropHaTa nacr Ha r/iaBHaTa cpopMa v\ My 3a,qaBaMe MMe Tabcontrol. nofl 
Hero nocTaBAMe eflMH Panel v\ My 3a,qaBaMe MMe PaneiButtons. Ha 
CBOMCTBaTa Dock Ha nocTaBeHMTe kohtpo/im 3a,qaBaMe cbOTBeTHO 
ctomhoctm Fill (3a Ta6 KOHTpo/iaTa) m Bottom (3a naHe/ia). no to3m 
Ha^MH, npn opa3MepaBaHe (Resize) Ha cpopMaTa, naHe/itT me cm ocraBa 
OT,qo/iy, KaTO ce pa3LUMpflBa/HaMa/iflBa caMO crpaHMUHO, a nocraBeHMflT 
Tabcontrol me 3aeMa ua/iOTO ocraHa/io npocTpaHCTBO. Eto KaK 
M3Me>Kfla cpopMaTa b to3m MOMeHT: 




4. B Tabcontrol KOHTpo/iaTa flo6aBflMe 3 CTpaHMUM (TabPage KOHTpo/lkl)- 
ntpBaTa 3a M36npaHe Ha cnwcbK c npoflyKTM, BTopaTa 3a B"bBe>KflaHe Ha 
aApec m TpeTaTa 3a M36op Ha HanMH Ha AOcraBKa 3a noptuKaTa. 

riOflXOflfllUM MMeHa 3a Te3M KOHTpO/lM ca CbOTBeTHO TabPageltems, 
TabPageAddress M TabPageShipping. flo6aBflHeTO Ha TabPage CTaBa, 

KaTO lupaKHeM c flecHna 6yTOH Ha MMUJKaTa Btpxy Tabcontrol kohtpo- 
/iaTa m ot noflBki/iOTO ce weu\o M36epeM Add Tab. 

5. B CTpaHnuaTa 3a M36op Ha npoflyKTM flo6aBAMe eflHa checkedListBox 

KOHTpO/ia C MMe CheckedListBoxItems M fl 3aKOTBflMe 3a neTkipwTe 

CTpaHM Ha TabPage KOHTpo/iaTa npe3 cbomctboto Anchor ot npo3opeua 
Properties Ha peAaKTopa. no T03M HanwH KOHTpo^aTa me ce npeopa3- 
MepyiBa 3aeflHO c cpopMaTa. 3a,qaBaMe cnwcbK ot npoflyKTM npe3 cbom- 

CTBOTO Items M fl06aBflMe Hafl KOHTpo/iaTa eflMH Label C TeKCT "Select 
items to order:" M MMe Label Select I tern. 

6. B CTpaHnuaTa 3a B"bBe>KflaHe Ha a,qpec ,qo6aBflMe eflHa TextBox 

KOHTpO/ia C MMe TextBoxAddress, 3aKOTBflMe fl K"bM 4eTMpMTe CTpaHM Ha 

CTpaHMuaTa npe3 cbomctboto Anchor, 3aflaBaMe Ha cbomctboto 

Multiline CTOMHOCT true, a Ha CBOMCTBOTO Text 3aflaBaMe npa3eH HM3. 
flo6aBflMe Hafl KOHTpo/iaTa eflMH Label C TeKCT "Enter your shipping 
address:" M MMe LabelEnterAddress. 

7. B CTpaHMuaTa 3a M36op Ha HanMHa Ha flocraBKa ,qo6aBflMe eflHa 

GroupBox KOHTpo/ia C MMe GroupBoxShippingMethod M TeKCT Select 
shipping method. B Hefl fl06aBflMe TpM RadioButton KOHTpo/lM C MMeHa 



T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 97 



RadioButtonMail, RadioButtonDHL M RadioButtonFedEx M TeKCT 
CbOTBeTHO "Mail", "DHL" M "FedEx". Ta3M KOM6MHaU,Mfl OT KOHTpO/lM HM 

ocurypyiBa a/iTepHaTMBeH M36op Ha eflMH ot B"b3MO>KHMTe AOCTaBuwuw. 
Haw-OTAO/iy b Ta3M crpaHwua Ao6aB*iMe v\ ep.ua checkBox KOHTpo/ia c 

MMe CheckBoxTrackShipping M TeKCT "Track shipping". ETO KaK 

M3Me>KAaT HaujMTe Ta6oBe b to3m momsht: 

Herns | Address | Shipping | Items Address | Shipping! Ilems I Address Shipping | 




Enteryour shipping address: 



"Select shipping method- 

: <r Mail ..:::::::::: 
: r dhl 



r FedEx 



I Track shipping 



8. B naHe/ia 3a 6yTOHMTe Ao6aBAMe ABa 6yTOHa c MMeHa ButtonOK v\ 

ButtonCancel M TeKCT CbOTBeTHO "OK" M "Cancel". Hpe3 AByKpaTHO 

LUpaKBaHe Btpxy 6yTOHa ButtonCancel Ao6aBAMe o6pa6oTHMK 3a cb- 
6nTneTO My click, b komto Ao6aBAMe koa 3a 3aTBapaHe Ha cpopMaTa: 



p 


rivate 


void 


Button 


Cancel 


CI 


ick (ob j 


ect 


sender, 


{ 
} 


System. EventArgs 


e) 










Close 


(); 















9. OcTaHa caMO p,a AedpuHnpaMe o6pa6oTHMK Ha c"b6nTneT0 click Ha 
6yT0Ha ButtonOK: 



private void ButtonOK_Click (ob j ect sender, System. EventArgs e) 

{ 

StringBuilder order = new StringBuilder ( "Ordered items :\n"); 
foreach (object item in CheckedListBoxItems . Checkedltems ) 



{ 



} 



order .Append (item. ToString i 
order .Append ( "\n" ) ; 



order .Append ( "Shipping address : \n" ) ; 
order .Append (TextBoxAddress . Text) ; 

order .Append ( "\nShipping method: " ) ; 
if (RadioButtonMail . Checked) 

{ 

order .Append ( "Mail" ) ; 

} 

if (RadioButtonDHL. Checked) 

{ 



98 flporpaMkipaHe 3a .NET Framework (tom 2) 



order .Append ( "DHL") ; 

} 

if (RadioButtonFedEx . Checked) 

{ 



order .Append ( "FedEx" ) ; 



) 



order .Append ( "\nTrack shipping: " ) ; 
if (CheckBoxTrackShipping . Checked) 

{ 

order .Append ( "Yes" ) ; 

} 
else 

{ 

order .Append ( "No" ) ; 

} 

MessageBox . Show (order . ToString ( ) , "Inf o" ) ; 

Close ( ) ; 



} 



ripn HaTMCKaHe Ha 6yTOHa M3B/ikmaMe CTOMHOCTMTe, BtBefleHM bbb bcmukm 

KOHTpO^M, OT BCM4KM CTpaHMUM, V\ VV\ 3anMCBaMe B CMMBO/ieH HM3. C/iefl 

TOBa rn M3Be>KflaMe Ha eKpaHa b craHflapTHa flkia/ioroBa kytma. 3a fla 
HanpaBMM TOBa, ntpBO c"b3AaBaMe ep,v\u stringBuiider o6eKT, b komto me 
vv\ Ao6aBAMe. C/iefl TOBa flo6aB*iMe CTOMHOCTMTe Ha bci/iukm M36paHM e/ie- 

MeHTM OT CheckedListBoxItems KOHTpo/iaTa, lOTO C/iefl BCeKM OT TAX 

Ao6aBflMe hob pefl. flo6aBAMe aflpeca 3a flocraBKa, nocne npoBep^BaMe 
kom RadioButton e M36paH m Ao6aBAMe cbOTBeTHkia MeTOA 3a AOCTaBKa 
KtM stringBuiider o6eKTa. HaKpaa npoBepaBaMe cbcrosiHi/ieTO Ha 
checkBox KOHTpo^aTa ot CTpaHnuaTa 3a HanwH Ha flocraBKa v\ M3Be>KflaMe 
M3B/ieneHaTa ot KOHTpo/ikiTe MHCpopMaunfl b CTaHflapTHa flkia/ioroBa kytma. 

10. HaweTO npw/io>KeHkie e totobo m MO>xeM fla ro crapTi/ipaMe v\ TecTBaMe: 

Jnj_x|| 



ESMain Form 



terns | Address | Shipping | 
Select items to order: 




Item 1 

â–¡ Item 2 
Item 3 
Item 4 
D ItemB 


â–¡ Item 7 



ms^^^m xj 


Ordered items: 


Item 1 


Item 3 


Item 4 


Item 6 


Shipping address: 


17 Tintiava Str. 


Veliko Tamoâ„¢ 


Bulgaria 


Shipping method: FedEx 


Track shipping: Yes 




i Ok ;| 







T/iaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcpeMC c Windows Forms 99 

MeHiOTa 

MeHKuaTa ca Ba>KHO cpeACTBO, npe3 KoeTO noTpe6wTe/iflT no yqo6eH Hani/m 
yKa3Ba 3anonBaHeTO Ha flafleHa onepauna. Te ca Ha npaKTMKa craHflapT npn 
npw/io>i<eHi/iflTa c rpacpwueH noTpe6kiTe/iCKM MHTepcpekic. B Windows Forms 3a 

pa60Ta C MeHKDTa Ce M3nO/13BaT K/iaCOBeTe MainMenu, ContextMenu M 
Menu I tern. 

MainMenu 

File Edit Help 



Type Here 



MainMenu KOMnoHeHTaTa npeAcraB/iHBa craHAapTHO naAaiuo MeHK). Th cbAtp- 
xa b ce6e cm cnwcbK ot Menuitem e^eMeHTM, komto npeAcraBsrr OTAe/iHMTe 

B"b3MO>KHOCTI/l 3a M36op (KOMaHAM) OT MeHKDTO. 

ContextMenu 

ContextMenu KOMnoHeHTaTa npeAcraB/iflBa KOHTeKcmo MeHK) (popup MeHK)), 
KoeTO ce noflBABa, KoraTO noTpe6nTe/iflT mpaKHe c AecHna 6yTOH Ha MMUJKaTa 
Btpxy KOHTpo/ia ki/iki Hf\Kbp,e bbb dpopMaTa. Ta CbAtpwa cnncbK ot Menuitem 
e^eMeHTM, npeACTaB/iflBamw OTAe/iHi/iTe KOMaHAM ot MeHKDTO. 

Menuitem 

Menuitem e/ieMeHTMTe npeACTaB^ABaT OTAe/iHi/iTe b"B3mo>khoctm 3a M36op, 

nOKa3BaHM B MainMenu kl/lkl ContextMenu. BceKM Menuitem e/ieMeHT MO>Ke Rd 

6"bAe KOMaHAa b npM/io>KeHMeTO v\j\v\ poAHTe/iCKO MeHK) 3a Apyrn e/ieMeHTM, 
(MeHKDTaTa MoraT p,a ce B/iaraT). rio-Ba>KHM ch6v\Tv\n v\ CBOMCTBa Ha K/iaca 

Menuitem ca : 

- Text - 3aAaBa 3ar/iaBkieTO Ha e/ieMeHTa, HanpuMep "&New", "&open..." 
v\nv\ "-". CuMBO^tT "&" 3aAaBa ropeiu K/iaBkiw 3a 6"bp30 M36npaHe Ha 
cbOTBeTHMfl e/ieMeHT. nocraBfl ce npeAM AaAeHa 6yKBa ot TeKcra Ha 
enewema. E/ieMeHT ot MeHKrro c TeKCT "-" 3aAaBa pa3Ae/ii/iTe/i. 

- shortcut - KpaTbK K/iaBkiuj, acounnpaH c to3m e/ieMeHT. HanpuMep 
Moxe p,a ce yKaxe, ne [ctri+s] cbOTBeTcma Ha eneMenja ot MeHKrro 
File | Open. B TaKbB cnynaki yKa3aHaTa K/iaBmuHa KOM6nHaunfl, 
He3aBMCMMO Kora e HaTMCHaTa, aKTMBupa to3m e/ieMeHT ot MeHKDTO, 
crura TOBa p,a ce e cnyni/i/io npn aKTMBHa dpopMa. 

- click - cb6kiTkie, KoeTO ce aKTMBupa npn M36npaHe Ha eneMenja ot 

MeHKDTO. 



100 nporpaMnpaHe 3a .NET Framework (tom 2) 

JleHTIi C MHCTpyMeHTIi 

/leHTMTe c MHCTpyMeHTM ca necro i/i3no/i3BaHM npn npM/io>KeHMflTa c rpacpMneH 
MHTepcpewc. HeKa pa3r/ie,qaMe craHflapTHMTe cpeflcma Ha Windows Forms 3a 
pa6oTaTa c tax. 

ToolBar 



Dli^lMl #1 gl_gil jfeLft 



ToolBar KOHTpo/iaTa npeflcraB/iflBa nenra c MHCTpyMeHTM (c 6yTOHn). rio- 
Ba>KHM HeMHM CBOMCTBa m ct6nTMfl ca : 

- Buttons - Cbfl"bp>Ka CnMCbK OT 6yTOHMTe (ToolBarButton e/ieMeHTMTe), 

acounkipaHM c KOHTpo/iaTa. 

- imageList - 3aAaBa KapTMHKMTe 3a 6yTOHMTe ot zieHTaTa. 

- Buttonciick - Cb6kiTkie, aKTMBupaiuo ce npn HaTMCKaHe Ha 6yTOH ot 
ZieHTaTa. KaTO napaMerbp TO npneMa ToolBarButtonClickEventArgs c 
MHCpopMaunfl kom 6yTOH e 6m/i HaTMCHaT. 

He e flCHO no KaKBa npn^MHa, ho npoeKTaHTMTe Ha 6ki6/ii/iOTei<aTa Windows 
Forms ca HanpaBM/iM pa6oTaTa c zieHTM c MHCTpyMeHTM flocra Heyqo6Ha. 
BMecTO BceKM 6yTOH ot zieHTaTa fla cm MMa co6cTBeHO c"b6nTne click, MMa 
eflHO o6iuo ct6nTne 3a u*i/iaTa zieHTa c MHCTpyMeHTM, KoeTO ce aKTMBupa npn 
HaTMCKaHe Ha hakom ot 6yTOHMTe. flpyrnaT npo6/ieM e, ne BMecTO BceKM 
6yTOH fla cm MMa cbomctbo Picture, KapTMHKMTe Tpa6Ba fla ce cnaraT b 
imageList KOMnoHeHTa m fla ce no/i3BaT no MHfleKC. 

ToolBarButton 

ToolBarButton KOMnoHeHTaTa npeflcraB/iflBa 6yTOH ot zieHTaTa c MHCTpyMeH- 
TM. 3a BceKM 6yTOH ot zieHTaTa MO>Ke fla ce 3aflaBa KapTMHKa, koato fla ce 
M3o6pa3ABa Btpxy Hero, TeKCTbT 3a 6yTOHa, KaKTO m hakom flpyrM CBOMCTBa 
KaTO TooiTipText, komto fla ce noKa3Ba npM 3afl"bp>KaHe Ha noKa3a/ieua Ha 
MMUJKaTa Btpxy 6yTOHa. 

3aflaBaHeTO Ha M3o6pa>KeHMe Ha ToolBarButton craBa, KaTO acouMMpaMe 

ImageList C ZieHTaTa C MHCTpyMeHTM, B KOflTO Ce HaMMpa 6yTOH"bT, m cnefl 

TOBa 3aflafleM Ha cbomctboto imageindex Ha 6yTOHa ctomhoct c MHfleKca Ha 
M3o6pa>KeHMeTO. 

ImageList 

imageList KOMnoHeHTaTa cbfl"bp>Ka cnMCbK c KapTMHKM. Tsi necro ce M3no/i3Ba 

OT flpyrM KOMnOHeHTM KaTO ListView, TreeView M/1M ToolBar. 



TjiaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM MHTepdpeiic c Windows Forms 101 

CraTyc jieHTM 

CTaTyc ^eHTMTe ca oiue eflHa ot Tunn^HMTe kohtpo/im b npn/iOKeHMATa c 
rpacpwueH MHTepcpekic. Te ce ki3no/i3BaT 3a Bki3ya/iki3aukifl Ha MHCpopMauna, 
CB"bp3aHa etc cbCTOAHneTO Ha npM/io>KeHMeTO. HanpuMep b TeKCTOBMTe peAaK- 
Topn mhoto necro b CTaTyc zieHTaTa ce noKa3Ba HOMeptT Ha TeKyiuna pep, v\ Ha 

KO/lOHa. 

StatusBar 



<^> File loaded. |l_n3 Col 7 



StatusBar KOHTpo/iaTa npeAcraB/iflBa nenra 3a cbcroflHkieTO. Ta o6mkhob6ho 

Ce CbCTOM OT StatusBarPanel 06eKTM, nOKa3BaiUM TeKCT V\I\V\ MKOHM. Tfl MO>Ke 

Aa cbfl"bp>Ka m noTpe6nTe^CKM flecpuHnpaHM naHe/in, noKa3Baiun MHCpopMauna 
3a cbcroflHkieTO Ha npi/i/io>KeHkieTO. no-Ba>KHM CBOMCTBa Ha KOHTpo/iaTa ca: 

- Panels - cbfl"bp>Ka ceKUMMTe, Ha komto e pa3fle/ieHa zieHTaTa. Ha 
cpurypaTa no-rope CTaTyc zieHTaTa e pa3Ae/ieHa Ha 2 ceKunn. CTaTyc 
zieHTaTa MO>xe v\ p,a HsiMa ojp,enuv\ ceKunn, a/iae eAHO \\nno. 

- showPaneis - BK/iK)4Ba/n3K^K)4Ba noKa3BaHeTO Ha naHe/ikiTe. Ako ceK- 
UMMTe ca M3K/iioneHM, CTaTyc zieHTaTa e eAHO \\su\o. 

StatusBarPanel 

StatusBarPanel KOMnoHeHTaTa npeAcraB/iflBa ceKunfl b zieHTaTa 3a cbCToa- 
HkieTO. Tfl MO>Ke Aa cbAtpwa TeKCT v\/v\nv\ MKOHa. Hpe3 cbomctboto Text ce 
3aAaBa TeKCTbT, komto ce noi<a3Ba b naHe/ia, a npe3 cbomctboto icon ce 
3aAaBa MKOHa. 

flua/ior 3a M36op Ha cpaft/i 

ripn rpacpM4HMTe npi/i/io>KeHi/ifl necro ce Ha/iara Aa ce M36npa dpaM/i ot 
ziOKa/iHaTa dpai/i/iOBa cwcreMa, HanpuMep, KoraTO Tpa6Ba Aa 6tAe 3apeAeH v\nv\ 
3anncaH AOKyMeHT bbb dpaw/i. 3a Ta3M ue/i Windows Forms npeAOcraBH 
CTaHAapTHM Ana^03M, komto MoraT Aa ce Hacrpoi/iBaT no rbBKaB HanwH. 

OpenFileDialog 

openFiieDialog npeAcraB/iflBa Ana/ior 3a M36op Ha cpaw/i (npn OTBap^He). 
To3M K/iac hm no3BO/i*iBa Aa npoBepuM p,anv\ cpaw/i cbiuecTByBa v\ Aa ro 
otbopmm. rio-Ba>KHM CBOMCTBa Ha Ana/iora ca: 

- Title - 3aAaBa 3amaBwe Ha Ana/iora. 

- initiaiDirectory - 3aAaBa Hana/iHaTa AnpeKTopua, ot koato 3ano4Ba 
M36op"bT Ha cpaw/i. Ako He 6"bAe 3aAaAeHa M3pn4HO, ce ki3no/i3Ba 
noc^eAHaTa AnpeKTopi/m, ot koato noTpe6MTe/i*iT e ki36wpa/i cpaw/i no 
BpeMe Ha pa6oTa c TeKymoTO npi/i/ioweHwe. 



102 nporpaMnpaHe 3a .NET Framework (tom 2) 

- Filter - 3aflaBa B"b3MO>KHMTe cpaw^OBM pa3LunpeHMfl, M3Me>Kfly KOMTO 

noTpe6nTe^flT MO>Ke fla M36npa (HanpuMep *.txt, * . doc, ...). 

- Filterlndex - 3aAaBa aKTklBHkm Cpkl/lTbp. 

- Multiseiect - yi<a3Ba p,anw b Ana/iora MoraT p,a 6tAaT M36npaHM mhoto 
cpaw/iOBe eAHOBpeMeHHO m/im caMO ep,v\H. 

- FileName, FileNames - CbA"bp>Ka M36paHMTe CpaM/lOBe. 

SaveFileDialog 

saveFiieDialog npeAcraB/uiBa Ana/ior 3a M36op Ha cpai/i/i (npn 3anncBaHe). 
To3M K/iac hm no3BO^ABa Aa npe3anniueM cbiuecTByBaiu v\nv\ p,a cb3AaAeM hob 
cpaw/i. Pa6oTaTa c Hero e aHa/iorwuHa Ha pa6oTaTa c OpenFiieDiaiog. 

Pa6oTa c 4>aiiJiOB Auasior - npuMep 

HacTOfliuMflT npuMep ki/uocrpkipa pa6oTaTa c cpaM^OBna Ana/ior Ha Windows 
Forms (KOMnoHeHTaTa OpenFiieDiaiog). 3a ue/ua me cb3AaAeM npw/iOKeHwe, 
KoeTO no3BO^ABa Ha noTpe6kiTe/ifl Aa M36epe TeKCTOB cpaw/i c noMOLirra Ha 
OpenFiieDiaiog, neTe cbAt p>Ka h m eTO My m ro noKa3Ba b TeKCTOBa KOHTpo/ia. 

Eto CTbnKMTe 3a M3rpa>KAaHe Ha HaweTO npi/i/ioxeHwe: 

1. CTapTupaMe VS.NET v\ cb3AaBaMe hob Windows Forms npoeicr. 

2. 3aAaBaMe Ha r/iaBHaTa cpopMa MMe MainForm v\ 3ar/iaBwe 

"FileOpenDialog - Demo". ripOMeHflMe MMeTO Ha Cpaw/ia OT Forml . cs 
H3 MainForm. cs. 

3. B3eMaMe ot TooIBox Ha VS.NET eAHH TextBox, nocraBHMe ro b ropHaTa 
nacr Ha MaBHaTa cpopMa v\ My 3aAaBaMe MMe textBox. 3aAaBaMe Ha 

CBOMCTBOTO My Multiline CTOMHOCT true M Ha CBOMCTBOTO My 

ScrollBars CTOMHOCT Vertical. TaKa CM OCMrypflBaMe MHOTOpeAOBO 

TeKCTOBO no/ie c b"B3mo>khoct 3a CKpo/iwpaHe. rioA Hero nocraBAMe eAHH 

Panel M My 3aAaBaMe MMe PanelBottom. Ha CBOMCTBaTa Dock Ha 

nocTaBeHMTe kohtpo/ii/i 3aAaBaMe cbOTBeTHO ctomhoctm Fill v\ Bottom, 
no to3m Ha^MH, npw opa3MepaBaHe (Resize) Ha cpopMaTa, naHe/ivr me 
cm ocTaBa OTAO/iy, KaTO ce pa3LuwpflBa/HaMa/iflBa caMO crpaHi/mHO, a 
nocraBeHi/mT TextBox me 3aeMa ua/ioto ocraHa/io npocTpaHCTBO. Eto 
KaK M3Me>KAa cpopMaTa b to3m MOMeHT: 




HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM MHTepcJDeMC c Windows Forms 103 



4. riOCTaBflMe B"bB CpopMaTa eAHH OpenFileDialog C MMe openFileDialog. 
3aflaBaMe Ha CBOMCTBOTO Filter CTOMHOCT "Text files 
(*. txt) I *. txt|Log files (* . log) | * . log". T03M Cpkl/lTbp yKa3Ba 

TtpceHe caMO Ha TeKCTOBM (.txt) v\ log (.log) cpaw/iOBe. Ha cbomctboto 

Title 3aAaBaMe CTOMHOCT "Choose text file". 

5. B naHe/ia Ao6aBHMe eAHH 6yTOH c MMe ButtonLoadFile v\ TeKCT "Load 
file". Hpe3 AByKpaTHO mpaKBaHe Btpxy 6yTOHa Ao6aB*iMe o6pa6o"mm< 
3a C"b6kiTneTO My click: 



private void ButtonLoadFile_Click (ob j ect sender, 

System. EventArgs e) 
{ 



if (openFileDialog . ShowDialog i 
{ 



DialogResult . OK) 



string fileName = openFileDialog . FileName; 

using (StreamReader reader = File . OpenText ( fileName) ) 

{ 

string fileContents = reader . ReadToEnd () ; 
textBox.Text = fileContents; 



ripn HaTMCKaHe Ha 6yTOHa noKa3BaMe Ana/ior 3a M36op Ha cpaw/i v\ aKO 
noTpe6MTe/i*iT M36epe cpaw/i v\ HaTMCHe 6yTOHa [ok], OTBapaMe cpaw/ia, 
neTeM cbA"bp>KaHkieTO My v\ ro noKa3BaMe b t6kctoboto no/ie. 

6. HaiueTO npi/i.no>KeHMe e totobo m MO>KeM p,a ro crapTwpaMe v\ TecTBaMe: 



Jn|x| 



T ime ,File,Line J ag,Message 
10/11/2004 

; ": ; : ! ...;.â– :â– â–  W- â–  â–  ' : : ' :- . -\'- : â– .â– ' .â– ...â– â– .â– â– â– .â– '.â– â– â– â– ..â– â– â–  ."' ' 

\&BmnjiEC. Ul sta rig . idows WT 
1D/I1/2DM 

"" : :.■■■' : ■■:!.!■.■ '■; ■■■.;■., i ■..'■■.■, .<*.•..■■■:■: : " ■'■ ■ 

,,SETUP: Cc i fety size 

10/11/2004 

' " : !.â– â– â– â– â– â–  : â– â– :i.i. â– â– â–  â– â– .::â–  â– ..<. â– .'â– â– .â– â– â–  â– â– .!.â– .-.. 'â– â– .â– .: . : ."â– r'; : ' 1 
„SETUP: Calculated time lor Win9x migration = 120 
seconds 
10/11/2004 

" " : 8.;?S. ' 'â– â– :o.-:;' ;, \: :e.c-\:\:cei . ~:\;VJi;ses.ii,::V;> ;^='.u ; : '"â– ' 
49.B E G I N_SECT 1 N Initialization 
10/11/2004 

. '..'â–  : â–  ' ; ' â– .â– .â– â– .â– "'.'â– â– â– . C :â– â– 'â– â– .. f:lf â– â–  .,V ,1', , â– â–  . 

■:;Sj J ;--.;: ! N ;■ ■ ''" S::,-j ■ ■- '•■:■"- -rv ' 



Look jn: 


P^» system32 


J <h S tf n- 






H^^H 


CDCatRoot2 


(Simsmq fj^wins 


W-^* 


£|Com 


(fijmui l£|Kircorn 




C^conflg 


(rTiriDD ^h3bBB 




Qdhcp 


iSlNtrnsData © h323log.txt 


^^^B 


H DirectX 


iQoobe 


_/J 


£) drivers 


, ras 




£l export 


iQjReinstallBackups 




Oias 


&l Restore 


^^^5^1 


t^icsxml 


Gi Setup 




Si ime 


(f^ShellExt 


hBhiIsi 


j^inetsrv 


IQ SoftwareD istr ibution 




f^jLogflles 


ff3 spool 




C3 Macro rned 


(SlURTTernp 




O Microsoft 


SlUStTlt 




£3MsDtE 


I3iwbern 


J 


File name: 
Files of ivpe: 




| aula tut _*J Open 1 


| Text files [Mxt] ~^\ Cancel | 



MDI npmiOHceHkm 

MDI (Multiple Document Interface) npw/ioweHkiflTa noAAtpwaT pa6oTa c 
hako/iko AOKyMeHTa eAHOBpeMeHHO, KaTO BceKM AOKyMeHT ce noKa3Ba b cbom 
co6cTBeH npo3opeu, pa3no/io>KeH bbb BtTpewHOCTTa Ha r/iaBHkifl npo3opeu. 



104 nporpaMnpaHe 3a .NET Framework (tom 2) 

MDI KOHTeMHepn (MDI parents) 

MDI KOHTewHepnTe ca cpopMM, komto cbfltpwaT flpyrn cpopMM. 3a fla yKa>KeM, 
ne eAHa cpopMa e MDI KOHTefiHep, 3aAaBaMe Ha HeMHOTO cbomctbo 

IsMdiContainer CTOMHOCT true. Te3M CpopMM o6MKHOBeHO MMaT MeHK) Window 

3a CMflHa Ha aKTMBHaTa cpopMa (Ha cbomctboto My MdiList e 3afla,qeHa 

CTOMHOCT true). 

MDI 4>opMM (MDI children) 

MDI cpopMMTe ce cbfltpaoT b KOHTeMHep-cpopMaTa. 3a fla yKaweM, ne eflHa 
cpopMa e MDI cpopMa, 3aflaBaMe Ha cbomctbo MdiParent=<KOHTeiiHep>, Kbfle- 
to KOHTefiHep e MDI KOHTekmep. 

Ci>3AaBaHe Ha MHoroflOKyMeHTOB tckctob 
peflaKTop - npiiMep 

C HacTOfliflMfl npuMep me fleMOHcrpwpaMe M3rpa>KflaHe Ha MHoroflOKyMeHTOB 
TeKCTOB peflaKTop etc cpeflCTBaTa Ha Windows Forms v\ Visual Studio .NET. 
PeflaKToptT Tpa6Ba fla MO>Ke fla cb3flaBa, peflaKTupa, 3ape>Kfla v\ 3anncBa 
TeKCTOBM flOKyMeHTM (cpaw/iOBe) m fla no3BO^ABa pa6oTa eflHOBpeMeHHO c 
mhoto flOKyMeHTM b OTfle/iHki MDI npo3opun. 

Hpe3 npuMepHMfl TeKCTOB peflaKTop me fleMOHcrpwpaMe ynoTpe6aTa Ha hakom 
ot Windows Forms KOHTpo/ikiTe, komto pa3r/ie,aaxMe: MeHKrra (MainMenu, 

Menultem), ZieHTM C MHCTpyMeHTM (ToolBar, ImageList, ToolBarButton) M 
CTaTyC ZieHTkl (statusBar, StatusBarPanel). U\e nOKa>KeM KaK ce Cb3flaBaT 

npn^o>KeHMfl, pa6oTeifln b MDI pe>KMM. IHe fleMOHcrpwpaMe pa6oTaTa c 
flkia/iora 3a M36op Ha cpaw/i. 

Eto CTbnKMTe 3a M3rpa>KflaHeTO Ha Haujua TeKCTOB peflaKTop: 

1. CrapTkipaMe VS.NET v\ Cb3,qaBaMe hob Windows Forms npoeKT. 

2. B3klMaMe OT TooIBox Ha VS.NET eflHO MainMenu, eflMH ToolBar, eflMH 
ImageList, eflklH StatusBar M eflklH OpenFileDialog V\ VV\ nOCTaBflMe B 

r/iaBHaTa cpopMa. 3aflaBaMe noflxoflaiun MMeHa Ha nocraBeHWTe KOMno- 
HeHTM. ripenoptni/iTe/iHO e MMeTO Ha eflHa KOHTpo/ia fla cbfltpwa 
HeMHOTO npeflHa3Ha4eHne v\ Tun {v\nv\ npecpMKC, yKa3Baiu Tuna). B 

HailJMfl C/iynai/i nOflXOflflLflM MMeHa ca: MenuMainForm, ToolBarMainForm, 
ImageListToolBar, StatusBarMainForm M OpenFileDialog. 

3. 3aflaBaMe 3a Cpkl/lTbp Ha OpenFileDialog KOHTpO/iaTa CTOMHOCTTa "Text 

files (*.txt) |*.txt". To3M cpw/iTbp yKa3Ba TtpceHe caMO Ha TeKCTOBM 
cpai/i/iOBe (.txt). 

4. flecpMHupaMe File v\ window MeHKDTa b r/iaBHOTO MeHK) (3acera me vv\ 
ocTaBMM npa3HM, 6e3 enewemw b tax). 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM MHTepdpefic c Windows Forms 105 



5. 3aflaBaMe Ha rviaBHaTa cpopMa MMe MainForm v\ 3ar/iaBMe "Text Editor 

Demo". npOMeHflMe M MMeTO Ha CpaM/ia OT Forml . cs Ha MainForm. cs. Ha 

KapTMHKaTa no-flo/iy e noKa3aHO KaK M3r/ie>Kfla pa3pa6oTBaHOTO npM/io- 

>KeHMe B T03M MOMeHT. 

6. ripeAM R3 AedDMHupaMe 6yTOHMTe b zieHTaTa c MHCTpyMeHTM, Tpa6Ba p,a 
3apeAMM noflxoflfliun mkohkm 3a tax b imageList KOHTpo/iaTa. Tpa6BaT 
hm MKOHKa 3a hob cpai/i/i, 3a OTBapaHe Ha cpaM/i v\ 3a 3annc Ha cpaM/i. 
Mo>KeM fla M3no^3BaMe craHflapTHMTe mkohkm, MflBaiuM c VS.NET. Te ce 

HaMMpaT B AHpeKTOpMfl: C:\Program Files\Microsof t Visual Studio 
.NET 2003\Common7\Graphics\bitmaps\OffCtlBr\Small\Color (npM 

CTaHflapTHa MHcra/iauMsi Ha Visual Studio .NET). 



£• Demo-7-MdiTextEditor - Microsoft Visual C# .NET [design] - MainForm .cs [Design] 4 



jnjxj 



File Edit View Project Build Debug 
j IP - tla • G» | 4 | ► Debug 

i ft 1 1= a =i I m * sOi I s o ?::d 



Data Format Tools ReSharper Window Help 
»■ ffl score t 

" «j- «t as a 1 1 si « « I @ m I % % 



& 






* 



MainForm. cs [Design]* | MainForm. cs* | 



< > x 



EHText Editor Demo 



Jfll^J 



File Window 






StatusBarMainForm 



A\ 






IS OpenFileDialog iS 1 ImageList ToolBar H MenuMainForm 



I Solution Explorer - Demo-7-MdiText:., 

in lh m silo 



f x| 



@ Solution 'test' (1 project) 
B- flB Demo-7-MdiTextEditor 

B- Gal References 
HHl App.ico 
|Q AssemblyInfo.es 
L3 MainForm.cs 



I Properties 



? x | 



MainForm System , Windows , Forms _J 
lei 



11 



-/ 



SizeGripStyle Auto 

SnapToGrid True 

StartPosition WindowsDefaultLc 

Tag 

Text Text Editor Dem_i 

TopMost False 



iff Properties | O Dynamic Help 



II Task List 



Ready 



7. Ot peflaKTopa 3a CBOMCTBaTa Ha KOMnoHeHTMTe M36MpaMe cbomctboto 
images Ha imageList KOHTpo/iaTa. rioflBflBa ce Image Collection Editor, 

OT KOMTO MO>KeM Rd A06aBMM MKOHKM B CIIMCbKa. flo6aBflMe nOflXOflflLUM 

mkohkm 3a hob cpai/i/i, 3a OTBapyiHe Ha cpaki/1 m 3a 3anMC Ha cpaM/i: 



106 flporpaMnpaHe 3a .NET Framework (tom 2) 



Image Collection Editor 



Members: 




System. Drawing. Bitmap Properties: 


B Misc 

HorizontalResi 96 


S 


PhysicalDirner {Width =16, Heigh 


PixelFormat 


Format32bppArgb 


RawFormat 


MemoryBmp 


Size 16; 16 


VerticalResolt 96 





Cancel 



Help 



A 



8. 3a fla flecpm-mpaMe 6yTOHMTe b zieHTaTa c MHCTpyMeHTM, ntpBO 

CB"bp3BaMe ImageList CBOMCTBOTO Ha ToolBar KOHTpo/iaTa C ImageList 

KOMncmeHTaTa, kohto 3apeflMXMe c mkohkm b npeAHaTa crbriKa. Cnep, 
TOBa M3no/i3BaMe cbomctboto Buttons Ha nocTaBeHaTa bbb dpopMaTa 
ToolBar KOHTpo/ia, 3a p,a AecpMHwpaMe 6yTOHMTe. 3a peAaKu,i/m Ha TOBa 
cbomctbo ce ki3no/i3Ba ToolBarButton Collection Editor, komto ce 
noflBABa npn onuT 3a peflaKTupaHe Ha cbomctboto Buttons: 



ToolBarButton Collection Editor 


Members: 




ToolBarButtonNew Properties: 


fj ToolBarButtonNew 


B Configurations 1 




111 ToolBarButtonOpen 
m ToolBarButtonSave 

Add Remove 


E (DynamicProperties 


B Data 


Tag 


B Design 


(Name) 


ToolBarButtonNew 


Modifiers 


Private 


B Misc 




DropDownMenu (none) 


Enabled 


True 

O o J 

no 

S3 1 


Imagelndex 

PartialPush 

Pushed 










H 2 

] (none) 










OK Cancf 




31 Help 











HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM MHTepdjefic c Windows Forms 107 



flo6aBAMe Tpn 6yT0Ha (3a hob cpaki/i, 3a OTBapaHe Ha cpai/i/i v\ 3a 3annc Ha 
cpaM/i) m 3aflaBaMe 3a BceKM ot tax noflxoflaiuo MMe v\ imageindex, komto 
ro CBtp3Ba c HeroBaTa mkohio ot imageList KOHTpo/iaTa. B to3m momcht b 
zieHTaTa c MHCTpyMeHTM ce nosiBflBaT TpnTe 6yTOHa c mkohkm Btpxy tax: 



â–¡ gS> 



CTaTyc zieHTaTa me pa3Ae/iMM Ha f\se 4acTM. B /l^BaTa 4acT me 
noKa3BaMe MHCpopMauna 3a M3B"bpiueHMTe ot npM/io>KeHMeTO p,ev\CYBv\s\ , a 
b AflCHaTa - HOMepa Ha peAa b TeKyiuna cpai/i/i. 3a ue/iTa 3aAaBaMe Ha 
CTaTyc zieHTaTa showPaneis=true m Ao6aBAMe b Hea ABa naHe/ia (npe3 

CBOMCTBOTO Panels). 3aAaBaMe MM MMeHaTa StatusBarPanellnfo M 
StatusBarPanelLine M MM HaCTpOMBaMe pa3MepMTe: 



StatusBarPanel Collection Editor 




InfoStatusBarPanel Properties: 
B Appearance 



Alignment 


Left 


AutoSize 


None 


BorderStyle 


Sunken 


Icon 


1 1 (none) 


Style 


Text 


Text 




ToolTipText 




Width 


300 



B Behavior 

Min Width 
B Configurations 

IB (DynannicPropertif 
B Design 

(Name) 
Modifiers 




InfoStatusBarPan" 

Private 



Cancel 



Help 



A 



CTaTyc zieHTaTa Ao6MBa cnep,Hv\n bma: 



E 



10. 3a Aa HanpaBMM r/iaBHaTa cpopMa MDI cpopMa, m 3aAaBaMe 

IsMdiContainer=true. 

11. Ct3AaBaMe e/ieMeHTMTe Ha r/iaBHOTO MeHK) File: New, open, save m 
Exit. 3a Aa cb3AaAeM pa3Ae/iMTe/i npeAM e/ieMeHTa Exit, 3aAaBaMe Ha 

CbOTBeTHaTa Menultem KOHTpo/ia Text="-". 3a Window MeHKDTO 

3aAaBaMe MdiList=true, 3a Aa noKa3Ba crmcbK ot MDI npo3opuMTe b 
MaBHaTa cpopMa. 3a e/ieMeHTMTe Ha MeHKrro M36MpaMe noAxoA^iuM 

MMeHa (HanpMMep MenuItemFileNew, MenuItemFileOpen, ...). 3aAaBa- 
Me m noAxoAflLUM 6"bp3M K^aBMLUM (shortcuts) 3a necro M3n0^3BaHMTe 
KOMaHAM 4pe3 CBOMCTBOTO Shortcut Ha Menultem KOHTpo/iaTa - 



108 



flporpaMnpaHe 3a .NET Framework (tom 2) 



[Ctrl+N] 3a File | New, [Ctrl+O] 3a File | Open, [Ctrl+S] 3a File | 
Save M [Alt-F4] 3a File | Exit. ETO KaK H3Me)Kfla r/iaBHOTO MeHK) B 
T03M MOMeHT: 



iText Editor Demo 



File Window 
New 



Type Here 



Type Here 



- 



Save 



Exit 



Type Here 



Ua/iaTa cpopMa Ha npw/io>KeHkieTO flo6nBa cneAHMfl bma: 



U 



Text Editor Demo 



^jnjxj 



File Window 



D & 



/a 



12. Bene MMaMe r/iaBHaTa cpopMa. OcTaBa p,a Ao6aBMM cpopMaTa 3a peflaK- 
TupaHe Ha cpaw/iOBeTe v\ p,a pea/in3wpaMe /iorm<aTa Ha npn^OKeHneTO. 
3ano4BaMe ot flecpMHupaHe Ha c"b6nTMflTa 3a e/ieMeHTkue ot MeHKrro. C 
Abomho lupaKBaHe Btpxy e/ieMeHT ot MeHKrro VS.NET hm AaBa B"b3- 
mo>khoct p,a HanmueM KOAa 3a o6pa6oTKa Ha ct6nTneTO My click: 



private void MenuItemFileNew_Click (ob j ect sender, 

System. EventArgs e) 
{ 



CreateNewFile ( ) ; 



} 



private void MenuItemFileOpen_Click (ob j ect sender, 
System. EventArgs e) 

{ 

OpenExistingFile ( ) ; 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM wm-epcpeiic c Windows Forms 109 



private void MenuItemFileSave_Click (ob j ect sender, 
System. EventArgs e) 

{ 

SaveCurrentFile ( ) ; 

} 

private void MenuItemFileExit_Click (ob j ect sender, 
System. EventArgs e) 

{ 

Close ( ) ; 

} 



MeTOAMTe CreateNewFile () , OpenExistingFile ( ) M SaveCurrentFile ( ) 

me pa3r/ieAaMe cnep, Ma/iKO. 

13. flecpMHupaMe v\ o6pa6oTni/iK Ha ct6nTneTO HaTMCKaHe Ha 6yTOH ot 
zieHTaTa c MHCTpyMeHTu: 



private void ToolBarMainForm_ButtonClick (ob j ect sender, 
System. Windows . Forms . ToolBarButtonClickEventArgs e) 

{ 

if (e. Button == ToolBarButtonNew) 

CreateNewFile ( ) ; 
else if (e. Button == ToolBarButtonOpen) 

OpenExistingFile ( ) ; 
else if (e. Button == ToolBarButtonSave) 

SaveCurrentFile ( ) ; 
} 



rioHewe KOHTpo/iaTa TooiBar He npeAOcraBH oip,ei\Hv\ Ch6mv\n 3a BceKM ot 
6yTOHMTe cm, Tpa6Ba Aa ce npuxBaHe cb6nTneTO v\ Buttonciick v\ p,a ce 
npoBepaBa 3a kom ot 6yTOHMTe ce OTHaca to (npe3 cbomctboto Button Ha 

ToolBarButtonClickEventArgs napaMeTbpa). 

14. OcTaBa Aa AecpHHi/ipaMe cpopMaTa 3a peAaKuna Ha AOKyMeHT v\ p,a 
pea^M3npaMe /iorm<aTa 3a cb3AaBaHe, peAaKTupaHe, 3ape>KAaHe v\ 3a- 
nucBaHe Ha AOKyMeHTM. C"b3AaBaMe HOBa cpopMa (File | Add New item 

... | Windows Form). CMeHflMe M MMeTO Ha EditorForm, a MMeTO Ha 

HeMHMfl cpaM/i - Ha EditorForm.es. Ta3M cpopMa me cny>Kki 3a peAaK- 
\\v\s\ Ha AOKyMeHTMTe. Ta me ce i/i3no/i3Ba KaTO noA^MHeHa MDI cpopMa. 

15. flo6aBAMe RichTextBox KOHTpo/ia b HOBaTa cpopMa. Ta me c/iy>KM 3a 
peAaKunfl Ha TeKCTa Ha AOKyMeHTMTe. l/l3no/i3BaMe RichTextBox BMec- 
to TextBox, 3amoTO RichTextBox no3BO/iflBa pa6oTa c no-ro/ieMi/i 



110 



flporpaMnpaHe 3a .NET Framework (tom 2) 



AOKyMeHTM m ocurypyiBa no-ro/iflMa rbBKaBOCT. 3aflaBaMe Dock=Fiii 3a 

RichTextBox KOHTpO/iaTa M M CMeHflMe MMeTO Ha EditorRichTextBox. 

Eto KaK i/i3r/ie>Kfla cpopMaTa cnep, bcmukm Te3M p,ewcrBv\n: 




16. flecpMHupaMe b HOBaTa cpopMa no/ie mFiieName, KoeTO me cbxpai-mBa 
MMeTO Ha TeKyiunfl OTBopeH cpaw/i v\nv\ null, aKO TeKymwflT cpaw/i HHMa 
MMe (HanpuMep aKO e hob cpaw/i): 



private string mFiieName = null; 



17. nocraBHMe b HOBaTa cpopMa eAMH saveFiieDiaiog. IHe ro no/i3BaMe 
npn 3annc Ha cpaw/ia, komto e 3apeAeH b RichTextBox KOHTpo/iaTa. 
3aAaBaMe My cpw/irbp "Text files (*.txt) |*.txt". 

18. flecpMHupaMe hhko/iko MeTOAa, komto pea/iM3npaT /iorm<aTa no OTBapa- 
He Ha hob AOKyMeHT, 3ape>KAaHe Ha cpaw/i v\ 3anncBaHe Ha cpaw/i, 
KaKTO m noMOiueH MeTOA 3a o6HOB*iBaHe Ha CTaTyc zieHTaTa: 



public void CreateNewFile 
{ 



SetStatusBarlnfo ( "Created new file."); 

mFiieName = null; 

this. Text = "Untitled"; 



public void LoadFile ( string aFileName) 



{ 



mFiieName = aFileName; 

this. Text = Path. GetFileName (aFileName) ; 

using (StreamReader reader = File . OpenText (aFileName) 

{ 

string fileContents = reader . ReadToEnd () ; 
RichTextBoxEditor . Text = fileContents; 



public void Save i 
{ 



if (mFiieName == null) 



fjiaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM MHTepd)eiic c Windows Forms 111 



{ 

if (SaveFileDialog. ShowDialog ( ) != DialogResult . OK) 

{ 

return; 

} 

mFileName = SaveFileDialog . FileName; 
this. Text = Path. GetFileName (mFileName) ; 
} 

using (StreamWriter writer = new StreamWriter (mFileName) 

{ 

writer .Write (RichTextBoxEditor . Text) ; 

} 

SetStatusBarlnfo ("Saved file: " + mFileName); 



} 



public void SetStatusBarlnf o ( string aText) 

{ 

MainForm mainForm = (MainForm) this .MdiParent; 

mainForm. Setlnf oStatusBar (aText) ; 
} 



Cb3flaBaHeT0 Ha hob flOKyMeHT 3aflaBa 3ar/iaBkie "untitled" Ha cpopMaTa v\ 
ycTaHOBABa b null MMeTO Ha cpaw/ia, CB"bp3aH c Hea. 3ape>KflaHeTO Ha 
cpaw/i CTaBa c TeKCTOB noTOK. ripn 3ape>KAaHe cpopMaTa 3anoMH*i nt/iHOTO 
MMe Ha cpai/i/ia, a 3a 3ar/iaBkie Ha cpopMaTa ce 3aflaBa MMeTO Ha cpaw/ia 6e3 
nvrji. ripn 3annc, aKO flOKyMeHTbT He e CB"bp3aH c cpaw/i, ce M3no/i3Ba 
cpaw/iOBi/mT Ana/ior 3a M36op Ha MMe Ha cpaw/i, b komto fla ce 3anniue. Ako 
flOKyMeHTtT e CB"bp3aH c cpaw/i, tom npocTO ce 3anncBa. 3anncbT CTaBa c 

TeKCTOB nOTOK. 

19. flecpMHupaMe hako/iko o6pa6oTni/iKa Ha C"b6MTMfl v\ hhko/iko noMOiuHM 
MeTOfla c ue/i Bki3ya/iki3auki$i Ha HOMepa Ha pefla b TeKyiuna cpai/i/i: 



private void EditorForm_Activated (ob j ect sender, 
System. EventArgs e) 

{ 

ShowLineNumber ( ) ; 

} 

private void RichTextBoxEditor_SelectionChanged (ob j ect sender, 
System. EventArgs e) 

{ 

ShowLineNumber ( ) ; 

} 

public void SetStatusBarLine ( string aText) 

{ 

MainForm mainForm = (MainForm) this .MdiParent; 



112 flporpaMnpaHe 3a .NET Framework (tom 2) 



mainForm. SetLineStatusBar (aText) ; 
} 

public void ShowLineNumber ( ) 

{ 

int currentPos = EditorRichTextBox . SelectionStart; 

int line = RichTextBoxEditor . GetLineFromCharlndex (currentPos ) 

SetStatusBarLine ( "Line: " + line); 
} 



ripn aKTMBupaHe Ha cpopMaTa v\ npn npoMHHa Ha no3nunflTa Ha Kypcopa 
npn^OKeHneTO i/i3ni/ic/iflBa HOMepa Ha TeKyiuna pep, b TeKyiuna AOKyMeHT v\ 
ro noKa3Ba b flecHna naHe/i Ha zieHTaTa 3a cbcrosiHkieTO. flocrbirbT ao 
zieHTaTa Ha cbcroflHkieTO CTaBa npe3 poAHTe/iCKaTa MDI cpopMa (TOBa e 
MaBHaTa cpopMa Ha npi/i/ioxeHkieTo). 

20. flecpMHupaMe v\ o6pa6o"mi/iK Ha ct6nTneTO "3aTBap*iHe Ha cpopMaTa", b 
komto M3Be>KAaMe MHCpopMaunfl b CTaTyc zieHTaTa KaKBO ce e cnyni/i/io: 



private void EditorForm_Closed (ob j ect sender, 
System. EventArgs e) 

{ 

if (mFileName != null) 

{ 

SetStatusBarlnfo ("Closed file: " + mFileName) 

} 
else 

{ 

SetStatusBarlnfo ( "Closed file . " ) ; 

} 

SetStatusBarLine ( " " ) ; 

} 



C TOBa cpopMaTa 3a peAaKTupaHe Ha cpaw/iOBe e roTOBa. OcraBa caMO p,a 
AOBtpujMM r/iaBHaTa cpopMa v\ npw/io>KeHkieTO me e totobo. 

21. B MaBHaTa cpopMa nponycHaxMe p,a AecpMHupaMe MeTOAHTe 3a OTBa- 
pyiHe Ha hob cpaki/i, 3a 3ape>KAaHe Ha cbiuecTByBaiu cpaw/i v\ 3a 3aTBa- 
pyiHe Ha cpaw/i. Eto KaK MO>KeM p,a vv\ pea/iki3wpaMe: 



private void CreateNewFile ( ) 

{ 

EditorForm editorForm = new EditorForml 

editorForm.MdiParent = this; 

editorForm. CreateNewFile ( ) ; 

editorForm. Show ( ) ; 
} 

private void OpenExistingFile ( ) 
{ 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM kiHTepcpetfc c Windows Forms 113 



if (OpenFileDialog. ShowDialog ( ) != DialogResult . OK) 

{ 

return; 

} 

string fileName = OpenFileDialog . FileName; 

EditorForm editorForm = new EditorForm () ; 
try 

{ 

editorForm. LoadFile ( fileName) ; 

editorForm. MdiParent = this; 

editorForm. Show ( ) ; 

SetlnfoStatusBar ( "Loaded file: " + fileName); 

} 

catch ( IOException) 

{ 

editorForm. Dispose ( ) ; 

MessageBox. Show ( "Can not load file: " + fileName, "Error"); 
} 



} 



private void SaveCurrentFile ( ) 

{ 

EditorForm activeEditorForm = 

(EditorForm) this . ActiveMdiChild; 
if (activeEditorForm != null) 

{ 

activeEditorForm. Save ( ) ; 

} 
} 



ripn cb3AaBaHe v\ 3ape>KflaHe Ha cpaw/i ce cb3AaBa MHcraHui/m Ha cpopMaTa 
3a peflaKunfl Ha flOKyMeHTM EditorForm m b Hea ctOTBeTHO ce cb3flaBa hob 
AOKyMeHT v\nv\ ce 3ape>Kfla M36paHMfl npe3 OpenFileDialog cpaw/i, c/iefl 
KoeTO Ta3M cpopMa ce noi<a3Ba KaTO MDI nofl^MHeHa b r/iaBHaTa. 

ripn 3anncBaHe Ha TeKyiuna AOKyMeHT ntpBO ce i/i3B/ii/ma TeKymaTa 
aKTMBHa cpopMa (aKO i/ma TaKaBa) v\ cnep, TOBa v\ ce M3BMKBa MeTOAvr 
saved 3a 3anncBaHe Ha OTBopeHna b Hea AOKyMeHT. 

22. OcTaHa caMO Aa AecpMHupaMe oiue hhko/iko o6pa6oTHMKa Ha cb6v\Tv\n 
3a r/iaBHaTa cpopMa v\ hako/iko noMOiuHM MeTOAa, komto M3no/i3BaMe: 



private void MainForm_Load (ob j ect sender, System. EventArgs e) 

{ 

SetlnfoStatusBar ( "Application started. " ) ; 

} 

public void Setlnf oStatusBar ( string aText) 



114 flporpaMnpaHe 3a .NET Framework (tom 2) 



StatusBarPanellnf o . Text = aText; 

public void SetLineStatusBar ( string aText) 
StatusBarPanelLine . Text = aText; 

static void Main ( ) 

Application . Run (new MainForm ( ) ) ; 



23. npn^OKeHneTO Bene e totobo m MO>KeM p,a ro crapTwpaMe v\ TecTBaMe. 
Eto KaK M3Me>Kfla HaujuaT TeKCTOB peflaKTop b flewcTBue: 



O 



Text Editor Demo 



^jnjxj 



File Window 



d ^ y 



Untitled 



'aaal23.txt 



lEditorForm.txt 






namespace D ermo_7_M diT extE ditor 



III < summary > 

IN Summary description for EditorFornn. 

tU < /"summary:;- 

public class EditorFornn : Systern.Windows. Forms. Form 

{ 

IH < summary > 

11! Required designer variable. 

/// <7sumrnary> 

private System. ConnponentModel. Container components = null; 

private System. Windows. Forms. SaveFileDialog saveFileDialog; 

private System. Windows. Forms. FlichTextB ox richTextBox; 

private string mFileName = nullj 




Saved file: C:\EditorForm.txt 



Line: 25 



A 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM MHTepcJDeMC c Windows Forms 115 

Ba/iMAauMfl Ha flaHHM 

Ba^MAaunflTa Ha ashhh e Heo6xoAHMa, KoraTO b flafleHa KOHTpo/ia Tpa6Ba p,a 
ce flonycKa B"bBe>KflaHe caMO Ha KopeKTHM flaHHM, HanpuMep unno hmc/io, 
Ba^MAHa AaTa v\ AP- B Windows Forms MMa craHAapTHi/i cpeACTBa 3a Ba/ii/iAa- 

- validating - c"b6nTne 3a Ba^MAaunfl Ha AaHHMTe b K/iaca control. Ha 
ct6nTneTO ce noAaBa napaMeTbp ot Tun CanceiEventArgs. Ako Ha 
cbomctboto cancel Ha to3m o6eKT ce 3aAaAe CTOMHOCT true, TO Ha 
noTpe6nTe^fl He ce pa3peiuaBa p,a HanycHe KOHTpo/iaTa. 

- ErrorProvider - OT6e/lfl3Ba rpacpklUHO KOHTpo/lkl C HeBa/lklAHkl ashhu. 

J\o KOHTpo^aTa c HeBa^MAHM ashhu ce noflBABa MKOHa, a KoraTO noi<a3a- 
neixbj Ha MMiuKaTa 3acTaHe HaA MKOHaTa, ce noflBABa TeKCT c onucaHne 
Ha rpeujKaTa. 

HeKa pa3r/ieAaMe cneABami/m cppameHT koa, w/uocTpi/ipam Ba/ikiAauwflTa Ha 
AaHHn: 



private TextBox TextBoxl; 

private ErrorProvider errorProvider; 



private void TextBoxl_Validating (ob j ect sender, 
System. ComponentModel . CanceiEventArgs e) 



{ 



try 

{ 

Int32 . Parse (TextBoxl . Text) ; 
errorProvider . SetError (TextBoxl, "") ; 

} 

catch ( FormatException) 

{ 

errorProvider . SetError ( 

TextBoxl, "Integer number expected! ") ; 

e. Cancel = true; 
} 



} 



MMaMe eAHa TextBox KOHTpo/ia, 4mmto AaHHM me Ba/ikiAnpaMe, m eAMH 
ErrorProvider o6eKT, komto me M3no/i3BaMe, 3a Aa OT6e/i*i3BaMe, ne kohtpo- 
naja cbAtpxa HeBa/ii/iAHM AaHHM. 

B o6pa6oT4MKa Ha cb6i/iTkieTO validating Ha KOHTpo^aTa ce onuTBaMe Aa 
KOHBepTupaMe TeKCTa, cbAtpwam ce b Hea, b uh/io nwcno. Ako KOHBepTM- 
paHeTO nponaAHe, TOBa 03HanaBa, ne noTpe6kiTe/iflT He e BtBe/i KopeKTHM 

AaHHM. B T03M C/iynai/i nOAaBaMe Ha MeTOAa SetError (...) , Ha ErrorProvider 

o6eKTa, HaiuaTa KOHTpo/ia v\ CMMBO/ieH hm3 c onucaHne Ha rpeujKaTa. ToBa 
onucaHne me ce noaBu npn 3aA"bp>KaHe Ha MMiuKaTa HaA MKOHaTa 3a rpewKa. 

OCBeH TOBa 3aAaBaMe Ha CBOMCTBOTO Cancel Ha nOAaAeHklfl CanceiEventArgs 



116 nporpaMnpaHe 3a .NET Framework (tom 2) 

o6eKT ctomhoct true. ToBa HflMa fla no3BO/iw Ha noTpe6kiTe/i*i fla HanycHe 
KOHTpo^aTa. Ako KOHBepTupaHeTO ycnee, to noTpe6kiTe/iflT e BtBe/i KopeKTHM 

AaHHM. B T03M C/iynaM OTHOBO M3BMKBaMe MeTOAa SetError(...) , HO T03M nvr 

My noAaBaMe ioto btopm napaMerbp npa3eH hm3, KoeTO npeAH3BHKBa CKpn- 
BaHe Ha MKOHaTa, aKO ta e 6i/i/ia noi<a3aHa. 

Ba/iMflaMMq Ha AaHHM - npuMep 

HacTOfliuMflT npuMep e Ma/iKO no-cnoxeH v\ i/i/uocrpi/ipa no-nt/iHO cpeACTBaTa 
3a Ba/iMAauwfl Ha ashhh b Windows Forms - c"b6nTneTO validating v\ kohtpo- 
ziaTa ErrorProvider. U\e cb3AaAeM npocTO npi/i/io>KeHi/ie, cbCTOfliuo ce ot ABe 
cpopMM - MaBHa cpopMa m cpopMa 3a B"bBe>KAaHe Ha ETH v\ roAHHa Ha pa>KAa- 
He. T^aBHaTa cpopMa me M3BMKBa cpopMaTa 3a B"bBe>KAaHe Ha ETH v\ roAHHa Ha 
pa>KAaHe v\ npn ycneujHO BptiuaHe ot Hea me Bki3ya/iki3kipa BtBeAeHMTe 
AaHHM. BtB cpopMaTa 3a B"bBe>KAaHe Ha ETH v\ roAMHa Ha pa>KAaHe me curHa- 
^M3npaMe Ha noTpe6wTe/ifl, KoraTO tom BtBeAe HeKopeKTHM ashhh. 

Eto CTbnKkiTe 3a M3rpa>KAaHe Ha HaiueTO npM/io>KeHMe: 

1. CTapTupaMe VS.NET v\ cb3AaBaMe hob Windows Forms npoeKT. 

2. 3aAaBaMe Ha r/iaBHaTa cpopMa MMe MainForm v\ 3ar/iaBi/ie "Main Form". 

npOMeHflMe M MMeTO Ha CpaM/ia OT Forml.cs Ha MainForm. cs. Cb3Aa- 

BaMe m cpopMaTa 3a B"bBe>KAaHe Ha ETH v\ roAHHa Ha pa>KAaHe (File | 

Add New Item ... | Windows Form). CMeHflMe MMeTO M Ha 
ValidationDemoForm, a TOBa Ha Cpaki/ia M Ha ValidationDemoForm.es. 
3aAaBaMe Ha CBOMCTBaTa MinimizeBox V\ MaximizeBox CTOMHOCTM false, 
a Ha CBOMCTBOTO FormBorderStyle CTOMHOCT FixedDialog. 

3. B H0B0Cb3AaAeHaTa cpopMa nocraBAMe ABe TeKCTOBM no/ieTa c MMeHa 

TextBoxEGN M TextBoxYear 3a B"bBe>KAaHe Ha ETH M rOAHHa Ha 

pa>KAaHe. HaA bcako ot tax nocraBHMe no eAMH Label c TeKCT, yKa3Baiu 
npeAHa3Ha4eHneT0 Ha KOHTpo/iaTa. nocraBAMe v\ p,sa 6yT0Ha c MMeHa 
ButtonOK m Buttoncancel 3a noTB"bp>KAaBaHe m 0TKa3BaHe Ha cpopMaTa. 

Ha CBOMCTBOTO DialogResult Ha ButtonCancel 3aAaBaMe CTOMHOCT 
Cancel. 

4. riOCTaBflMe B"bB CpopMaTa eAHH KOMnOHeHT ErrorProvider C MMe 
errorProvider, KOMTO U\e M3nO/13BaMe 3a OT6e/lfl3BaHe Ha KOHTpO/lMTe c 

HeBa/iMAHM ashhu. Eto KaK M3r/ie>KAa Ha cpopMaTa b to3m MOMeHT: 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcJDeMC c Windows Forms 117 



% Demo-8-Validation - Microsoft Visual C# .NET [design] - ValidationDemoForm.es [Design] 



File Edit View Project Build Debug Data Format Tools Window Help 
(£]-1fcl-l*Hfl|jfcifee|' f >-^-#'^| ► ^bug - | r# 

S 1 1& 4 °l I 5TJf * sBi I S O si ES I «- Sf K ffi I S £ %i « I © m I % 



injxj 



# 



ValidationDemoForm.es [Design] 



<l > x 



Validation Demo 



EI~H: 



ToflMHa Ha paxnaHs: 









OK 


; Cancel 







'.!#!.'.'.'5!;'.'.'.!#'.' 



O errorProvider 



Solution Explorer - D emo-8-Valida tion ? x 



ffl a S] Si 11 



Ep ■■ £o] References 
HH] App.ico 
3 AssernblyInfo.es 
Fil MainForrn.es 
"HI Validation DernoForm , cs 



^Solution ... ^f Class Vie,,. | [?) Index 



Properties 



I? X 



ValidationDernoForm System. Windows ^1 
fll 



H 







Text Validation Demo 

TopMost False 

TransparencyKey Q 



3 



jf? Properties Dynamic Help 



H Output 



=3 



Ready 



A 



5. flo6aBflMe 06pa60THklK Ha C"b6MTMeT0 Validating Ha TextBoxEGN KOH- 

Tpo/iaTa: 



private void TextBoxEGN_Validating (ob j ect sender, 
System. ComponentModel . CancelEventArgs e) 

{ 

ValidateEGN( ) ; 



private bool ValidateEGN ( ) 

{ 

if (IsEgnValid(TextBoxEGN.Text) ) 

{ 

errorProvider . SetError (TextBoxEGN, "") ; 
return true; 

} 
else 

{ 

errorProvider . SetError (TextBoxEGN, "HeBajiMflHO ETH!"); 

return false; 
} 



private bool IsEgnValid ( string aText) 

{ 

if (aText. Length != 10) 



118 flporpaMnpaHe 3a .NET Framework (tom 2) 



{ 

return false; 

} 

for (int i=0; i<aText . Length; i++) 

{ 

if (! Char. IsDigit (aText [i] ) ) 

{ 

return false; 

} 
} 

return true; 



} 



B o6pa6oT4MKa Ha cb6wTi/ieTO M3BMKBaMe cpyHKui/mTa vaiidateEGN ( ) . B 
Hea, npe3 cpyHKUkiyua isEgnVaiid(...) , npoBepaBaMe p,anw BtBeAeHOTO ETH 

e Ba/lMflHO. AKO e Ba/lklAHO, nOCpeACTBOM ErrorProvider o6eKTa, M3TPM- 

BaMe MapKepa 3a rpewKa ro no/ieTO 3a B"bBe>KflaHe Ha ETH v\ BptiuaMe 
ctomhoct true, b npoTMBeH c/iynai/i 3aflaBaMe MapKep 3a rpeujKa Ha no/ieTO 
M BptmaMe CTOMHOCT false. B"bB CpyHKUI/mTa IsEgnValid(...) npoBepaBaMe 
Aa/iw b no/ieTO 3a ETH ca BtBeAeHM AeceT cuMBO/ia v\ p,ai\v\ BceKM ot tax e 
uncppa. Ako e TaKa BptiuaMe ctomhoct true, b npoTMBeH cnynai/i BptiuaMe 

CTOMHOCT false. 

6. flo6aBflMe 06pa60THklK Ha Cb6klTneTO Validating Ha TextBoxYear 
KOHTpo/iaTa: 



private void TextBoxYear_Validating (ob j ect sender, 
System. ComponentModel . CancelEventArgs e) 

{ 

ValidateYear ( ) ; 

} 

private bool ValidateYear ( ) 

{ 

if (IsYearValid (TextBoxYear .Text) ) 

{ 

errorProvider . SetError (TextBoxYear, "") ; 
return true; 

} 
else 

{ 

errorProvider . SetError (TextBoxYear, "HeBajiMflHa roflMHa ! " ; 

return false; 
} 
} 

private bool IsYearValid ( string aText) 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM MHTepdjeiic c Windows Forms 119 



{ 



string year = TextBoxYear . Text; 
if (year. Length != 4) 

{ 

return false; 

} 

for (int i=0; i<aText . Length; i++) 

{ 

if (! Char. IsDigit (aText [i] ) ) 

{ 

return false; 

} 
} 

return true; 



} 



B o6pa6oT4MKa Ha c"b6nTneTO M3BMKBaMe cpyHKunaTa vaiidateYear o . B 
Hea, npe3 cpyHKunaTa isYearVaiid(...) , npoBepyiBaMe p,ai\v\ BtBeAeHaTa 
roAMHa e Ba/ikiAHa. Ako e Ba/iMAHa, nocpeACTBOM errorProvider o6eKTa, 
M3TpnBaMe MapKepa 3a rpeujKa p,o no/ieTO 3a B"bBe>KAaHe Ha roAHHa v\ 
BptiuaMe ctomhoct true, b npoTMBeH cnynai/i 3aAaBaMe MapKep 3a rpeiuKa 

Ha nO/ieTO V\ BptiuaMe CTOMHOCT false. B"bB CpyHKUMflTa IsYearValid(...) 

npoBep^BaMe p,anw b no/ieTO 3a roAHHa ca BtBeAeHM neTkipw cwMBO/ia v\ 
Aa/iw BceKM ot tax e uwcppa. Ako e TaKa, BptiuaMe ctomhoct true, b 
npoTMBeH cnynai/i BptiuaMe ctomhoct false. 

7. flo6aBAMe o6pa6o"mm< Ha Cb6kiTkieTO click Ha 6yTOHa ButtonOK: 



private void ButtonOK_Click (ob j ect sender, System. EventArgs e) 

{ 

if (ValidateForm( ) ) 

{ 

DialogResult = DialogResult . OK; 

} 
else 

{ 

MessageBox . Show ( 

"Mojifl BtBefleTe BajiMflHM ctohhocth bib bcm^km nojieTa!", 
'TpeuiKa", MessageBoxButtons . OK, MessageBoxIcon . Error ) ; 
} 
} 

private bool ValidateForm ( ) 

{ 

if (! VaiidateYear () ) 

{ 

return false; 



120 flporpaMnpaHe 3a .NET Framework (tom 2) 



} 

if ( ! ValidateEGN( ) ) 

{ 

return false; 

} 

string egn = TextBoxEGN. Text; 

string year = TextBoxYear . Text; 

if (egn . Substring ( 0, 2 ) == year . Substring (2 , 2 ) ) 

{ 

errorProvider . SetError (ButtonOK, "") ; 
return true; 

} 
else 

{ 

errorProvider .SetError (ButtonOK, 

'ToflMHaia Ha paxnaHe Ha cbOTBeTCTBa Ha ETH-to!") 

return false; 
} 



} 



ripn HaTMCKaHe Ha 6yTOHa npoBepaBaMe npe3 cpyHKunaTa vaiidateFormO 
Aa/iw AaHHMTe, BtBeAeHM BtB cpopMaTa ca Ba/iwAHM. Ako ca Ba/iMAHM, 
3aAaBaMe Ha cbomctboto DiaiogResuit Ha cpopMaTa ctomhoct 
DiaiogResuit.oK, c KoeTO BptiuaMe ynpaB/ieHi/ieTO Ha M3BMKBaiuaTa 
cpopMa. Ako uaHHkiTe ca HeBa/ikiAHki, noi<a3BaMe Ana/ioroBa kytma c 
noAxoA^iuo cbo6meHwe. 

B MeTOAa VaiidateFormO npoBepsiBaMe Aa/iw BtBeAeHMTe roAMHa v\ ETH 

ca Ba/IMAHM 4pe3 CpyHKUklklTe ValidateYear ( ) M ValidateEGN ( ) . AKO 

npoBepiOTa Ha HAKoe ot Te3M yc/iOBkia nponaAHe, BptiuaMe ctomhoct 
false. C/ieA TOBa npoBepsiBaMe p,anv\ ntpBMTe p,se uncppn Ha ETH-to 
ctBnaAaT c nocneAHkiTe p,ee uncppn Ha roAHHaTa Ha pa>KAaHe. Ako 
cbBnaAaT, nocpeACTBOM ErrorProvider o6eKTa, M3TpnBaMe MapKepa 3a 
rpeujKa ao 6yTOHa v\ BptiuaMe ctomhoct true. Ako uncppnTe ce 
pa3/iwnaBaT, 3aAaBaMe MapKep 3a rpeujKa Ha 6yTOHa v\ BptiuaMe ctomhoct 

false. 

8. flo6aBAMe CBOMCTBa, npe3 komto ua n3B/innaMe BtBeAeHMTe BtB cpop- 
MaTa EfH m roAMHa Ha pa>KAaHe: 



public string EGN 

{ 

get 

{ 

return TextBoxEGN. Text; 

} 
} 



fjiaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM MHTepd)eiic c Windows Forms 121 



public string Year 

{ 

get 

{ 



return TextBoxYear . Text; 



} 



} 



9. flo6aBAMe b r/iaBHaTa cpopMa 6yTOH c MMe Buttonshow v\ TeKCT show 
Form. B o6pa6oT4MKa Ha c"b6nTneTO click Ha to3m 6yTOH me M3BMKBaMe 
cpopMaTa 3a B"bBe>KflaHe Ha ETH v\ roflMHa Ha pa>KflaHe b MOfla/ieH pe>KMM 
m npn ycneujHO BptiuaHe ot Hea me Bki3ya/iki3kipaMe BtBeAeHMTe ashhh: 



private void ButtonShow_Click ( obj ect sender, System. EventArgs e) 

{ 

ValidationDemoForm validationDemoForm = new 

ValidationDemoForm ( ) ; 
if (validationDemoForm. ShowDialog ( ) == DialogResult . OK) 



{ 



} 



string s = String . Format ( "ETH : { } \nroflMHa : {1}", 

validationDemoForm. EGN, validationDemoForm. Year ) ; 
MessageBox . Show ( s, "Pe3yjiTaT") ; 



validationDemoForm. Dispose ( ) ; 



10. npn^OKeHneTO Bene e totobo m MO>xeM p,a ro CTapTupaMe v\ TecTBaMe: 



iB^Main Form 


-ln|x| 








Show Form 1 







Validation Demo 



Em: 
1 81 07221 2081 



*l 



foflHHa Ha paag jHeBajiHflHoErH 




CBi>p3BaHe Ha a^hhm 



CB"bp3BaHeTO Ha ashhh (data binding) ocurypaBa aBTOMaTMUHO npexBtp/iAHe 
Ha flaHHM Me>Kfly kohtpo/im m m3T04hmum Ha flaHHM. MoxeM HanpuMep p,a 
CBtpxeM MacuB, cbAtpwam MMeHa Ha rpaAOBe, c comboBox KOHTpo/ia v\ v\we- 
HaTa ot MacuBa me ce noKa3BaT b Hea. 



122 nporpaMnpaHe 3a .NET Framework (tom 2) 

ripn flo6aBAHeTO Ha CB"bp3BaHe yKa3BaMe cbomctboto Ha KOHTpo/iaTa, KoeTO 
me CB"bp3BaMe c flaHHMTe, i/i3TOHHMKa Ha flaHHMTe v\ ntT ao cnwcbK v\nv\ cbom- 
ctbo Ha M3T04HMKa, KtM KoeTO me ce CBtpxeM. To3M ntT MO>Ke p,a e MMe Ha 
cbomctbo, kiepapxufl ot MMeHa, pa3p,enenv\ c toukm, v\i\v\ npa3eH hm3. Ako 
nvryiT e npa3eH hm3, me ce M3BMKa MeTOfltT TostringO Ha o6eKTa, 

M3nO/13BaH KaTO M3T04HMK Ha ASHHU. 



& 



CBi>p3BaHeTO Ha naHHH e eflHonocoHHO - ot KomposiaTa kt»m 

M3TOHHMKa Ha flaHHM! 



ripoMAHa Ha p,ap,eHO CBtp3aHO cbomctbo ot AaAeHa KOHTpo/ia npoMeHfl AaHHM- 
Te b M3T04HMKa, KtM komto to e CBtp3aHO. 06paTHOTO He e BflpHO. ripi/i npo- 

MflHa Ha M3T04HMKa Ha ASHHH CB"bp3aHMTe K"bM HerO KOHTpO/ll/l He CM npoMeHAT 
CBOMCTBaTa. 

Ako CMe npoMeHki/iw AaHHMTe b i/i3TOHHi/iKa Ha ashhh m MCKaMe p,a OTpa3MM 
npoMeHMTe b CBtp3aHMTe c Hero kohtpo/im, Tpa6Ba ntpBO p,a npeMaxHeM 
(M3TpneM) CB"bp3BaHeTO m cnep, TOBa Aa ro Ao6aBMM othobo. 

M3TOHHMLIM Ha flaHHM 

KaTO M3T04HMK Ha ASHHH MO>KeM Rd M3nO/13BaMe BCeKM K/iaC kl/lkl KOMIIOHeHT, 

komto MMn^eMeHTupa MHTepcpewca iList. TaKMBa ca MacuBMTe v\ KO/ieKuwwTe. 

3a M3T04HMUM Ha ASHHH MO>KeM Rd M3nO/13BaMe M K/iaCOBe V\I\V\ KOMnOHeHTM, 

komto MMn^eMeHTupaT MHTepcpewca iBindingList. To3M MHTepcpewc noAA^p- 
xa HOTMCpMKaunfl 3a npoMAHa Ha AaHHkiTe. IBindingList kiHTepcpewcbT ce 
MMn^eMeHTupa ot K/iaca Dataview (b>k. TeMaTa 3a ADO.NET ). 

KoHTpo/m, noflfli>p>Kaii4ii CBi>p3BaHe Ha flaHHM 

Bcm4km Windows Forms kohtpo/im noAA^pwaT CB"bp3BaHe Ha ashhh (data 
binding). MoxeM Aa CBtpxeM KoeTO w Aa e cbomctbo Ha KOHTpo/ia kbm 

M3T04HMK Ha AaHHM. 

BnflOBe CBi>p3BaHe 

B Windows Forms MMaMe ABa Tuna CB"bp3BaHe Ha AaHHn: 

- ripocTO CB"bp3BaHe (simple binding) - CBtp3BaHe Ha KOHTpo/ia c eAMHM- 
neH o6eKT v\nv\ ep,v\uv\^eu (TeKym) e/ieMeHT ot cnwcbK. TaKOBa CB"bp3Ba- 

He l/l3nO/13BaMe 06klKH0BeH0 C KOHTpO/lM KaTO TextBox V\ CheckBox, kom- 
to noKa3BaT eAHHMUHa ctomhoct. 

- C/io>kho CB"bp3BaHe (complex binding) - CB"bp3BaHe Ha cnwcbUHa koh- 
Tpo/ia etc cni/icbK. TaKOBa CB"bp3BaHe w3no/i3BaMe c kohtpo/im KaTO 
ListBox, comboBox m DataGrid. ripi/i Hero ce nOAA"bp>Ka TeKyiUO M36paH 
(aKTMBeH) e/ieMeHT ot cnwcbKa. 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM MHTepdjetfc c Windows Forms 123 

npocro CBl>p3BaHe 

Hpe3 c^eflBaiunTe cppameHTM koa me M/uocrpMpaMe KaK ce ocbmecTBABa 

npOCTO CB"bp3BaHe Ha AaHHM B 3aBMCMMOCT OT M3T04HMKa Ha ashhu. 

CBi>p3BaHe Ha KOHTpo/ia kt^m o6eKT 

HeKa HMaMe K/iaC Customer, KOMTO MMa CBOMCTBO Name M TextBox KOHTpo/ia c 
MMe TextBoxName. CB"bp3BaHeTO Ha CBOMCTBOTO Text Ha TextBox KOHTpO/iaTa 
KbM CBOMCTBOTO Name Ha 06eKT OT TMn Customer Ce M3B"bpilJBa no C/ieAHMfl 

Ha^MH: 



class Customer 

{ 

private string mName; 
public string Name 

{ 

get { return mName; } 

set { mName = value; } 
} 
} 

Customer cust = new Customer ( ) ; 
cust.Name = "Bail MBaH"; 

TextBoxName . DataBindings .Add (new Binding ( "Text" , cust, "Name") 



l/l3no/i3BaxMe KO/ieKUkiyua DataBindings Ha K/iaca control. B Hea MO>KeM fla 
Ao6aBflMe Binding o6eKTM, komto yKa3BaT Koe cbomctbo Ha TeKyiuaTa koh- 
Tpo/ia c Koe cbomctbo Ha AaAeHa Apyra KOHTpo/ia p,a 6"bAe CBtp3aHO. B Haujua 
cnynai/i npn npoMHHa Ha TextBoxName . Text me ce npOMeHfl M CBOMCTBOTO 
Name Ha CB"bp3aHMfl 06eKT cust. 

CBi>p3BaHe Ha KOHTpo/ia kt>m cnnctK 

HeKa HMaMe MacMB towns, cbAtpwam MMeHa Ha rpaAOBe, v\ TextBox KOHTpo/ia 

C MMe TextBoxTowns. CB"bp3BaHeTO Ha CBOMCTBOTO Text Ha TextBox KOHTpO- 

ziaTa KtM MacMBa c MMeHa Ha rpaAOBe ce M3BtpujBa no cnep,Hwn HanMH: 



string [] towns = ("Co$hs", "IIjtobhmb", "BapHa"}; 
TextBoxTowns . DataBindings .Add (new Binding ( "Text" , towns, 



OcraBM/iM CMe ntTfl ao cbomctboto Ha M3T04HMKa, KtM KoeTO me ce CBtpxeM, 
Aa e npa3eH hm3, 3aiuoTO b cnynayi MCKaMe p,a CB"bp>KeM cbomctboto Text 
AMpeKTHO c e^eMeHTMTe Ha MacMBa, komto M3no/i3BaMe KaTO m3T04hmk Ha 
AaHHM, a He c taxho cbomctbo. npM TOBa CBtp3BaHe TeKCTOBaTa KOHTpo/ia me 
ce CB"bp>Ke ntpBOHana/iHO c ntpBMfl e/ieMeHT ot MacMBa (cmmbo/ihma hm3 
"CocpMfl"), ho c/ieA TOBa nporpaMHO MO>Ke Aa ce yKa>Ke npoMAHa Ha TeKymnfl 
e/ieMeHT m CBtp3BaHeTO Aa ce npoMeHM KbM hakom Apyr ot e/ieMeHTMTe Ha 



124 nporpaMnpaHe 3a .NET Framework (tom 2) 

MacuBa. Ha HanwHkiTe 3a npoMyma Ha TeKyiuna e/ieMeHT Ha CB"bp3BaHeTO me 
ce cnpeM cnefl Ma/iKO. 

CB~bp3BaHe Ha KOHTpo/ia KIM Ta6/iMLia 

HeKa MMaMe DataSet 06eKT ds C Ta6/ll/iua Towns C KO/lOHkl id l/l name M 
TextBox KOHTpo/ia C MMe TextBoxTowns. CB"bp3BaHeTO Ha CBOMCTBOTO Text Ha 

TextBox KOHTpo^aTa ki>m KO/iOHaTa name ot Ta6/ikiuaTa MO>Ke fla ce M3B"bpujn 
no cneflHkifl Hankm: 



// Create a DataTable with columns id and name 
DataTable towns = new DataTable ( "Towns" ) ; 
towns . Columns .Add (new DataColumn ( "id" , typeof (int) )) ; 
towns . Columns .Add (new DataColumn ( "name" , typeof ( string) 

// Add three rows to the table 
DataRow row; 

row = towns . NewRow () ; 
row ["id"] = 1; 
row ["name"] = "Co^ma"; 
towns . Rows .Add ( row) ; 

row = towns . NewRow () ; 
row ["id"] = 2; 
row ["name"] = "IIjtobhpib" ; 
towns . Rows .Add ( row) ; 

row = towns . NewRow () ; 
row ["id"] = 3; 
row ["name"] = "BapHa"; 
towns . Rows .Add ( row) ; 

// Create a DataSet and add the table to the DataSet 
DataSet ds = new DataSet ( ) ; 
ds . Tables .Add (towns ) ; 

TextBoxTowns . DataBindings .Add ( 

new Binding ( "Text" , ds, "Towns . name" )) ; 



3a fla yKaxeM, ne MCKaMe fla CBtpxeM cbomctboto Text Ha TextBox kohtpo- 
/iaTa c KO/iOHaTa name Ha Ta6/inuaTa Towns ot M3T04HMKa Ha ashhh ds, 3aAa- 
BaMe "Towns. name" 3a n"bT flo cbomctboto Ha M3T04HMKa. TeKCTOBOTO no/ie me 
6"bfle CB"bp3aHO ntpBOHana/iHO c ntpBua pefl Ha Ta6/ikiuaTa, v\ no-TOHHO c 
no/ieTO name ot to3m pefl, ho no-K"bCHO TeKyiflMflT pefl MO>xe fla 6tfle npoMe- 
HeH nporpaMHO. 

npocTO CBi>p3BaHe c VS.NET 

CB"bp3BaHeTO MO>Ke fla CTaBa v\ no BpeMe Ha flM3aMH b peflaKTopa Ha VS.NET, 
aKO 3a M3T04HMK Ha flaHHM M3no/i3BaMe DataSet. 3a ue/iTa ot npo3opeua 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM wHTepdjefic c Windows Forms 125 



Properties Ha peflaKTOpa M36kipaMe Databindings | Advanced. riOflBflBa ce 
np030peu,"bT Advanced Data Binding. B Hero BM>KflaMe Cni/ICbK OT CBOMCTBaTa 

Ha KOHTpo^aTa. HaMnpaMe cbomctboto, 3a KoeTO MCKaMe fla flo6aBMM CB"bp3- 
BaHe, m ot naflaiunfl cnwcbK b a^cho ot Hero M36npaMe M3T04HMKa Ha ashhu. 



GS^^^^^^^^ 


textBoxl System. Windows. Forms. ~wj 


ii MM # l 


\ 


B (DataBindings) 
Tag 


V 

(None) 


Text 


(None) _ 


Efl (DynamicPropert 


(Name) 


textBoxl 


AcceptsReturn 


False 


AcceptsTab 


False 


AccessibleDescrif 


AccessibleNarne 


AccessibleRole 


Default 


AllowDrop 


False 


flnrhnr 


Tnn I eft- 




Hf Properties | 6 


Dynamic Help | 



Advanced Data Binding - textBoxl 



Advanced binding allows you to bind properties of a control to items within lists. 
At run time, a bound property will change in response to a change in position 
within a list. 



Location 

MaxLength 

Multiline 

PasswordChar 

Readonly 

RightToLeft 

ScrollBars 

Size 

Tablndex 

TabStop 

Tag 

TextAlign 

Visible 

Wordwrap 



(None) 
(None) 
(None) 
(None) 
(None) 
(None) 
(None) 
(None) 
(None) 
(None) 
(None) 
I dataSetPubs - authors. au_fname 



F Show All 



[H dataSetPubs 

fi-H authors 
HI aujd 
H aujname 
LJ flWiifii 
ftl Dhone 



4 



^ 



A 



CBi>p3BaHe Ha KOHTpo/ia kt»m o6eKT - npMMep 

C HacTOfliunfl npuMep me i/i/uocrpkipaMe npocTOTO CB"bp3BaHe (simple binding) 
b Windows Forms. 3a ue/ua me cb3flafleM npocTO npi/i/io>KeHi/ie, b KoeTO me 

CBtp>KeM CBOMCTBO Ha KOHTpO/ia CbC CBOMCTBO Ha RdReH 06eKT. 

Eto CTbnKMTe 3a M3rpa>KflaHe Ha HaiueTO npi/i/ioxeHwe: 

1. CrapTkipaMe VS.NET v\ Cb3AaBaMe hob Windows Forms npoeicr. 

2. 3aflaBaMe Ha r/iaBHaTa cpopMa MMe MainForm v\ 3ar/iaBi/ie "Binding 

Control To Object". ripOMeHflMe M MMeTO Ha CpaM/ia OT Forml.cs Ha 
MainForm. cs. 

3. flecpMHupaMe K/iac customer, c hmmto o6eKT me CB"bp>KeM no-K"bCHO 
KOHTpo^aTa. K/iacvr MMa cbomctbo Name, Aasamo AOCTbn p,o i/meTO Ha 
K/iweHTa: 



class Customer 

{ 

private string mName; 
public string Name 

{ 

get { return mName; 
set { mName = value; 



126 flporpaMnpaHe 3a .NET Framework (tom 2) 



} 



4. flo6aBAMe b K/iaca MainForm eAHa n/ieH-npoMeH/ikiBa mCustomer. C Hea 
me CBtpxeM TeKCTOBO no/ie bbb cpopMaTa. 



private Customer mCustomer; 



B MaBHaTa cpopMa nocraBflMe eAHa TextBox KOHTpo/ia c MMe 

TextBoxCustomerName, KOflTO me CB"bp>KeM C Customer 06eKTa M Tpn 
6yTOHa C MMeHa ButtonShowCustomer, ButtonChangeCustomer M 

ButtonRebind. Te3M 6yTOHM me c/iy>KaT ctOTBeTHO 3a noKa3BaHe Ha 
MMeTO Ha K^neHTa, 3a npoMAHa Ha MMeTO v\ 3a M3B"bpujBaHe Ha CB"bp3Ba- 
He (data binding) Ha TeKCTOBOTO no/ie c customer o6eKTa. 

B K/iaca MainForm A06aBflMe CpyHKUklfl RebindFormControlsO , KOflTO 
CB"bp3Ba CBOMCTBOTO Text Ha TeKCTOBaTa KOHTpO/ia CbC CBOMCTBOTO Name 

Ha customer o6eKTa. 3a ue/ua ntpBO CB"bp3BaHeTO ce M3TpnBa (b 
cnynai/i, ne e 61/1/10 Bene cb3AaAeHo) v\ cnep, TOBa ce Ao6aB*i othobo: 



private void RebindFormControls ( ) 

{ 

TextBoxCustomerName . DataBindings . Clear ( 
TextBoxCustomerName . DataBindings .Add ( 
new Binding ( "Text" , mCustomer, "Name' 

} 



7. flo6aBAMe koa, komto npn 3ape>KAaHe Ha cpopMaTa (npn cb6i/iTi/ie Load 
Ha cpopMaTa) p,a i/iHnui/ia/ii/i3npa customer o6eKTa v\ pja ro CB"bp>Ke c 
TeKCTOBaTa KOHTpo/ia: 



private void MainForm Load (object sender, 

{ 

mCustomer = new Customer ( ) ; 


System. EventArgs 


e) 






mCustomer . Name = "Bail MBaH"; 






RebindFormControls ( ) ; 
} 







8. flo6aBAMe o6pa6oTni/iK Ha cb6nTneTO click Ha ButtonShowCustomer 
6yTOHa. B Hero M3B/ikmaMe CTOMHOCTTa Ha no/ieTO Name Ha customer 
o6eKTa m a noKa3BaMe b Ana/ioroBa KyTna: 



private void ButtonShowCustomer_Click (ob j ect sender, 
System. EventArgs e) 

{ 

string customerName = mCustomer . Name ; : 

MessageBox . Show (customerName) ; 
} 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM ^mepdpePic c Windows Forms 127 



9. flo6aBflMe 06pa60THklK Ha Cb6klTkieTO Click Ha ButtonChangeCustomer 
6yTOHa. B Hero npoMeHAMe croi/iHOCTTa Ha no/ieTO Name Ha customer 
o6eKTa: 



private void ButtonChangeCustomer_Click (ob j ect sender, 

System. EventArgs e) 
{ 



mCustomer . Name 



'fl^flo Mpa3' 



} 



10. flo6aBAMe o6pa6oTni/iK Ha c"b6nTneTO click Ha 6yTOHa ButtonRebind. 

B Hero M3BMKBaMe dDyHKUklflTa RebindFormControlsO , KOflTO M3Btp- 

ujBa noBTopHO CB"bp3BaHe Ha TeKCTOBaTa KOHTpo/ia c MMeTO Ha K/iweHTa 
ot customer o6eKTa, npi/i KoeTO TOBa MMe ce noflBABa b KOHTpo/iaTa: 



p 


rivate void ButtonReb 


ind 


CI 


ick ( ob j 


ect 


sender, 


{ 
} 


System. EventArgs e) 












RebindFormControls ( ) 


; 











11. ripn/iOKeHneTO Bene e totobo m MOxeM fla ro crapTwpaMe v\ TecmaMe. 

Ako BtBeAeM ctomhoct b no/ieTO m HaTMCHeM ntpBMfl 6yTOH, b Ana/ioroBaTa 
KyTMfl me ce noKawe BtBefleHaTa ctomhoct. ToBa noKa3Ba, ne CTOMHOCTra ce e 
npexBtp/iw/ia b customer o6eKTa: 



Binding Control To Object 




Ako HaTMCHeM BTopua 6yTOH, CTOMHOCTra b customer o6eKTa me ce npoMeHM. 
ToBa MOxeM fla npoBepuM KaTO HaTMCHeM ntpBua 6yTOH v\ M3BefleM ctomhoct- 
Ta b flwa/ioroBa KyTna. BtnpeKM ne CTOMHOcrra b customer o6eKTa e 
npoMeHeHa, t6kctoboto no/ie He ce npoMeHfl. ToBa e TaKa, 3aiuoTO CB"bp3Ba- 
HeTO b Windows Forms e eflHonoconHO - ot KOHTpo/iaTa kbm CB"bp3BaHMfl 
o6eKT, ho He v\ o6paTHO. 



128 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Ako cera HaTMCHeM TpeTna 6yTOH, t6kctoboto no/ie me ce npoMeHM. ToBa e 
TaKa, 3aiuoTO M3B"bpujBaMe noBTopHO CB"bp3BaHe v\ MMeTO Ha K/iMeHTa ot 
customer o6eKTa ce npexBtp/ia b t6kctoboto no/ie. 

Binding Context 

OopMaTa na3M MHCpOpMau.Mfl 3a CB"bp3aHMTe KOHTpO/lM B CBOfl BindingContext 
06eKT. BceKM 06eKT, Hac/iefleH OT K/iaca Control, MMa eflMH BindingContext, 

komto ynpaB/i^Ba BindingContextBase o6eKTMTe 3a KOHTpo^MTe, komto ce 
cbAtpxaT b Hero v\ 3a caMna o6eKT. Hpe3 Hero motom fla M3B/ieneM 

BindingContextBase 06eKT 3a M3T04HMK Ha flaHHM, CB"bp3aH C HflKOfl KOHTpO- 

/ia. 

noHe>Ke BindingContextBase e a6cTpaKTeH K/iac, TuntT Ha BtpHaTaTa 

CTOMHOCT, B 3aBMCMMOCT OT M3TOHHMKa Ha flaHHM, e V\J\V\ CurrencyManager V\J\V\ 
PropertyManager, KOMTO ca Hac/ieflHMU.M Ha K/iaca BindingContextBase. AKO 
ki3TOHHMK"bT Ha flaHHM e o6eKT, komto Bptma caMO eAHa CTOMHOCT (He e cnM- 
CbK OT 06eKTM), TOraBa TMn"bT me 6"bfle PropertyManager. AKO M3T04HMK"bT Ha 
flaHHM MMn/ieMeHTMpa HflKOM OT MHTepCpeMCMTe IList, IListSource M/1M 
IBindingList, Ifle 6"bfle BtpHaT CurrencyManager. 

Ha c^eflBaiuaTa cpMrypa ca noKa3aHM cxeMaTMUHO OTHOweHMflTa Me>Kfly 
Binding Context, Currency Manager m Property Manager: 



Form 



Binding 
Context 




Currency 
Manager 



Currency 
Manager 



Currency 
Manager 



Property 
Manager 



Array 



Collection 



DataTable 



Object 



HaBuraLiMH c CurrencyManager 

K/iaCbT CurrencyManager na3M TeKyiflaTa n03MUMfl B CnMCbKa-M3T04HMK Ha 
flaHHM. Tfl Ce Cbfl"bp>Ka B CBOMCTBOTO Position. CBOMCTBOTO Count ctfltpxa 

pa3Mepa Ha cnMCbKa. M3no/i3Bai/iKM Te3M CBOMcma, MOxeM fla M3BtpujBaMe 

HaBMraUMfl no M3TOHHMKa Ha flaHHM. 3a U.e/lTa M3B/lMHaMe CurrencyManager 
06eKTa, CB"bp3aH C M3TOHHMKa Ha flaHHM M npOMeHflMe CTOMHOCTTa Ha CBOM- 
CTBOTO Position. 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM wHTepdjefic c Windows Forms 129 

M3B/lkmaHeTO Ha CurrencyManager 06eKTa ce M3B"bpilJBa V\J\V\ npe3 CBOMCTBOTO 
DataBindings Ha CB"bp3aHaTa KOHTpo/ia, V\J\V\ npe3 BindingContext CBOMCTBO- 

to Ha cpopMaTa: 



CurrencyManager cm = (CurrencyManager) 

textBoxl . DataBindings [ "Text" ] . BindingManagerBase; 

// Moace vl TaKa: 

CurrencyManager cm = (CurrencyManager) 

f orml . BindingContext [dataTableCustomers] ; 



HaBuraunflTa no cnwcbKa ce M3B"bpujBa npe3 npoMAHa Ha Position: 



cm. Position++; 



CBi>p3BaHe Ha KOHTpo/ia kt»m crmcbK m HaBiirauMn - npHMep 

C HacTOfliunfl npuMep me ki/uocrpwpaMe npocro CB"bp3BaHe (simple binding) Ha 

KOHTpo/ia K"bM CnMCbK M HaBMraUMfl no CnMCbKa npe3 CurrencyManager. 

Eto CTbnKMTe 3a M3rpa>KflaHe Ha npw/io>KeHkieTo: 

1. CrapTwpaMe VS.NET v\ cb3AaBaMe hob Windows Forms npoeKT. 

2. 3aAaBaMe Ha r/iaBHaTa cpopMa MMe MainForm v\ 3ar/iaBMe "Binding 

Control To List". ripOMeHHMe M MMeTO Ha CpaM/ia OT Forml.cs Ha 
MainForm. cs. 

3. nocraBHMe Btpxy r/iaBHaTa cpopMa eAHa TextBox KOHTpo/ia c MMe 

TextBoxTowns, KOflTO LUe CB"bp>KeM C MaCMB OT CMMBO/1HM HM30Be - MMeHa 

Ha rpaflOBe, v\ flBa 6yTOHa c MMeHa ButtonPrev v\ ButtonNext. Te3M 
6yTOHM me cny>KaT ctOTBeTHO 3a HaBurauna Hanpefl v\ Ha3aA no cnncbKa 
c rpaAOBeTe. Ha cbomctboto Text Ha ABaTa 6yTOHa 3aAaBaMe cbOTBeTHO 

CTOMHOCTM "« Prev" M "Next »". 

4. flo6aBAMe koa, komto npn 3ape>KAaHe Ha cpopMaTa (npn c"b6nTne Load 
Ha cpopMaTa) CB"bp3Ba TeKCTOBOTO no/ie c MacuB, cbAtpaom MMeHa Ha 
rpaAOBe: 



private void MainForm_Load (ob j ect sender, System. EventArgs e) 

{ 

string [] towns = {"Co$hs", "IIjtobhpib", "BapHa", 

"Pyce", "Byprac"}; 
TextBoxTowns . DataBindings .Add ( 

new Binding ( "Text", towns, "")); 
} 



5. flo6aBAMe o6pa6oT4MK Ha Cb6i/iTkieTO click Ha 6yTOHa ButtonPrev. B 
Hero l/l3B/lkmaMe OT CurrencyManager 06eKTa Ha TeKCTOBaTa KOHTpo/ia 



130 



flporpaMnpaHe 3a .NET Framework (tom 2) 



TeKymaTa no3nunfl b cnwcbKa c rpaflOBeTe v\ a HaMa/isiBaMe, KaTO, aKO 
CMe flocTurHa^n Hana/iOTO, no3nunoHnpaMe b Kpaa: 



private void ButtonPrev_Click (ob j ect sender, System. EventArgs e) 

{ 

CurrencyManager cm = (CurrencyManager ) 

TextBoxTowns . DataBindings [ "Text" ] . BindingManagerBase; 
if (cm. Position > 0) 



{ 



cm. Position- 



} 
else 

{ 

cm. Position = cm. Count-1; 

} 



} 



6. flo6aBAMe o6pa6oTHkiK Ha C"b6nTneTO click Ha 6yTOHa ButtonNext. B 
Hero M3B/lkmaMe OT CurrencyManager Ha TeKCTOBaTa KOHTpo/ia TeKy- 

maTa no3Munfl b cnwcbKa c rpaflOBeTe v\ n yBe/iwuaBaMe, ioto, aKO CMe 
AOCTurHa^n Kpaa, no3MunoHnpaMe b Hana/iOTo: 



private void ButtonNext_Click (ob j ect sender, System. EventArgs e) 

{ 

CurrencyManager cm = (CurrencyManager) 

TextBoxTowns . DataBindings [ "Text" ] . BindingManagerBase; 
if (cm. Position < cm. Count-1) 



{ 



cm. Position++; 



} 
else 

{ 

cm. Position = 0; 

} 



} 



7. npi/i/iOKeHweTO e totobo m MOxeM fla ro crapTwpaMe v\ TecTBaMe. 



I Binding Control To List 




ripn HaTMCKaHe Ha 6yTOHMTe b t6kctoboto no/ie me ce CMeHHT MMeHaTa Ha 
rpaflOBeTe. Ako npoMeHMM MMeTO Ha hakom rpafl, npoMAHaTa ce OTpa3*iBa b 
MacuBa c MMeHaTa. 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM MHTepcJDeMC c Windows Forms 131 
C/10>KHO CBl>p3BaHe 

ripM C/10>KHOTO CB"bp3BaHe HMaMe CB"bp3BaHe Ha KOHTpO/ia K"bM Cni/ICbK, KaTO 

KOHTpo^aTa ce CB"bp3Ba c noBene ot ep,v\H e/ieMeHT ot cneicbxa. C/io>khoto 
CB"bp3BaHe ce M3no/i3Ba npn cnwcbUHM kohtpo/im - ListBox, ComboBox v\ flp. 

3a p,a CBtpxeM cnwcbUHa KOHTpo/ia etc cnwcbK, Tpa6Ba p,a 3aAaAeM ctom- 

HOCTM Ha C^eflHMTe CBOMCTBa: 

- DataSource - M3T04HMKa Ha ASHHH, C KOMTO me CB"bp>KeM KOHTpo/iaTa. 

- Display-Member - ITbT RO MO/ieTO, KOeTO fla ce Bkl3ya/lkl3Hpa. 

- valueMember - ntT flo no/ieTO, ot KoeTO ce no/iynaBa pe3y/iTaTvr. 
CTOMHOCTTa no nOflpa36kipaHe B DisplayMember M ValueMember e npa3eH HM3. 

Eto KaK 3aflaBaMe ctomhoct Ha Te3M CBOMCTBa: 



DataSet dataSetCountries = . . . ; 
comboBoxl . DataSource = dataSetCountries; 
comboBoxl . DisplayMember = "Countries . CountryCode" ; 
comboBoxl .ValueMember = "Countries . Name" ; 



Cno>KHO CB~bp3BaHe Ha KOHTposia kim cnncbK - npHMep 

C HacTOfliunfl npi/iMep me w/uocrpkipaMe c/io>khoto CB"bp3BaHe (complex data 
binding) b Windows Forms. 3a ue/ua me cb3p,ap,eM npocTO npn/ioxeHne, b 
KoeTO me CB"bp>KeM cnwcbUHa KOHTpo/ia etc cnncbK. 

Eto CTbnKMTe 3a M3rpa>KflaHe Ha HaiueTO npi/i/io>KeHMe: 

1. CTapTupaMe VS.NET v\ cb3AaBaMe hob Windows Forms npoeicr. 

2. 3aAaBaMe Ha r/iaBHaTa cpopMa MMe MainForm v\ 3ar^aBne "complex 

Binding". ripOMeHHMe MMeTO Ha Cpaki/ia OT Forml.cs Ha MainForm.cs. 

3. riocTaBAMe bbb cpopMaTa eAMH 6yT0H c i/me Buttonshow v\ ep.ua 

ComboBox KOHTpO/ia C MMe ComboBoxTowns . Ha CBOMCTBOTO Text Ha 

6yT0Ha 3aflaBaMe ctomhoct show. ComboBox KOHTpo/iaTa me CB"bp>KeM c 
MacuB ot ci/imbo/ihm HM30Be - MMeHa Ha rpaflOBe, a npe3 6yT0Ha me 
noKa3BaMe croi/iHOCTTa, M36paHa b Hea. 

4. flo6aBAMe koa, komto npn 3ape>KflaHe Ha cpopMaTa (npn c"b6nTne Load) 
CB"bp3Ba comboBox KOHTpo/iaTa c MacuB, ctAtpxam MMeHa Ha rpaAOBe: 



private void MainForm_Load (ob j ect sender, System. EventArgs e) 

{ 

string [] towns = ("Co$hs", "IIjtobhmb", "BapHa", 
"Pyce", "Byprac"}; 

ComboBoxTowns . DataSource = towns; 

ComboBoxTowns . DisplayMember = ""; 
} 



132 



flporpaMnpaHe 3a .NET Framework (tom 2) 



5. flo6aBAMe o6pa6oTnm< Ha Cb6i/iTi/ieTO click Ha 6yTOHa Buttonshow. B 
Hero noKa3BaMe b Akia/ioroBa kytma CTOMHOCTra, M36paHa b comboBox 
KOHTpo^aTa: 



private void ButtonShow_Click (ob j ect sender, System. EventArgs e) 

{ 

MessageBox . Show (ComboBoxTowns . SelectedValue . ToString ( ) ) ; 



6. npi/i/ic»KeHi/ieTO hm e totobo m mokcm p,a ro crapTkipaMe v\ TecTBaMe. 



IBlJComplex Binding | 










BapHa ^_ 




CoopHfl 

fljIQEJlMB 

Pyce 
Eyprac 





C/io>kho CBi>p3BaHe c VS.NET 

C/io>khoto CB"bp3BaHe MO>Ke fla CTaBa v\ no BpeMe Ha AH3ai/iH b peflaKTopa Ha 
VS.NET, aKO 3a M3T04HMK Ha ashhh ki3no/i3BaMe DataSet. 3a ue/ua b npo30- 
peua Properties Ha peAaKTopa lupaKBaMe Btpxy naAaiuna cnwcbK ot a^cho 
Ha cbomctboto DataSource m M36npaMe ot Hero M3T04HMK Ha ashhu. Cnep, 
TOBa M36npaMe ot naAaiunTe cnncbun b a^cho ot CBOMCTBaTa DispiayMember 
m vaiueMember no/ieTO, KoeTO me ce Bki3ya/iki3wpa, m no/ieTO, ot KoeTO me ce 
no/iynaBa pe3y/iTaTbT: 



QcomboEo: 



^ 



lSS^H KX1 


comboBox 1 System. Windows, Forrr^J 


M ti IDS ? 1 


M 





(DynamicProper 


d 


Data 


Ei 


(DataBindings) 


DataSource 


(none) 


DispiayMember 


(None) 


Items 


(Collection) 


Tag 


VaiueMember 


B 


Design 






(Name) 


comboBox 1. 


Locked 


False 


Modifiers 


Private 


EL 


Fnn le 


±1 


Hf Properties |~C 


Dynamic Help | 



| Properties 



(DynamicPropert 
B Data 

H (DataBindings) 



comboBoxl System , Windows, Forrrj*] 

m\ li ifjn # | m 



^ X | [properties 



~~ ^ x~| [Properties 



DispjdataSetPubs 
Iterr|dataSetPubs 
Tag 

Valu dataSetPubs 
El Des dataSetPubs 
dataSetPubs 



| (none) 



titleauthor 



..Ik.,'. 5 ' â– '-, 
j ibs 
.sales 
Lock dataSetPubs. pubjnfo 
discounts 



(Nar 



Mod 



i?Pr 



dataSetPubs. t 
dataSetPubs. t 
dataSetPubs 



comboBoxl System. Windows. ForrrjJ 

B i; |[S] # | h 



B (DynamicPropert 

B Data 

B (DataBindings) 

DataSource dataSetPubs .tit 

9 (None 
Items 
Tag 

B Design 

(Name) 
Locked 
Modifiers 

B Prims 



m titlejd .1 

m B 

LH type 

LH pubjd 

[I] price 

|T| advance .d 



Private 



comboBoxl System. Windows. ForrrjJ 

â– i @ # | a 



El (DynamicPropert 

B Data 

El (DataBindings) 

DataSource dataSetPubs .tit 

DispiayMember title 

Items (Collection) 

Tag 




HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcfeiic c Windows Forms 133 

Kom-po/iaTa DataGrid 

DataGrid KOHTpo/iaTa BM3ya^M3npa Ta6/ii/mHi/i ashhu. Ta ocurypaBa HaBura- 
\\v\s\ no peflOBe v\ ko/iohm m no3BO/isiBa peflaKTupaHe Ha flaHHMTe. KaTO i/i3toh- 

HMK Ha flaHHM Haki-neCTO Ce l/l3nO/13BaT ADO.NET DataSet V\ DataTable. Hpe3 
CBOMCTBOTO DataSource Ce 3aAaBa M3T04HMKtT Ha flaHHM, a Hpe3 CBOMCTBOTO 
DataMember - ITbTflT flO flaHHMTe B paMKMTe Ha M3T04HMKa. riO-Ba>KHM 

CBOMCTBa Ha KOHTpo/iaTa ca: 

- Readonly - pa3peiuaBa / 3a6paHABa peflaKuwyrra Ha ashhu. 

- CaptionVisible - nOKa3Ba / CKpMBa 3ar/iaBMeT0. 

- ColumnHeadersVisible - nOKa3Ba / CKpMBa 3ar^aBMJlTa Ha K0/10HklTe. 

- RowHeadersVisible - nOKa3Ba / CKpMBa KO/lOHaTa B /lflBO OT peflOBeTe. 

- Tabiestyies - 3aflaBa CTM^OBe 3a Ta6/ii/iuaTa. 

o MappingName - 3aflaBa Ta6/ikiuaTa, 3a koato ce OTHacfl flecpMHupa- 

HMJ1T CTM/1. 

o Gridcoivunnstyies - 3aflaBa cpopMaTupaHe Ha OTfle^HMTe ko/iohm - 
3ar/iaBwe, ujupnHa v\ flp. 

ripOTMBHO Ha O^aKBaHMflTa KOHTpO^aTa DataGrid HflMa C"b6klTMe "CMflHa Ha 

TeKymnfl M36paH pep,". Ako bm ce Ha/iara fla M3B"bpujBaTe HAKaKBO flewcTBkie 
npn CMAHa Ha TeKymi/m M36paH pefl (HanpuMep fla 3anmueTe npoMeHMTe no 
TeKymnfl pefl b 6a3aTa flaHHM), MO>KeTe fla npuxBaHeTe c"b6nTneT0 
currentceiichanged, KoeTO ce aKTMBupa npw npoMHHa Ha TeKymaTa K/ieTKa. 
Ako 3anoMHMTe b n/ieH-npoMeH/ikiBa b K/iaca Ha dpopMaTa koa e 6ki/ia 
npeflnujHaTa TeKyma K/ieTKa, me MO>KeTe fla npoBepnTe p,anv\ TeKyiunflT pefl e 
6m/i npoMeHeH. TeKymaTa K/ieTKa e flocrbnHa ot cbomctboto currentceii. 

npenop"bHMTe/ieH HanwH 3a ki3no/i3BaHe Ha DataGrid KOHTpo/iaTa e b pe>KMM 
Readoniy=true. B T03M cnynai/i He ce pa3peiuaBaT flupeKTHM npoMeHM, a TOBa 
cnecTABa mhoto npo6/ieMi/i. Ako e Heo6xoflMMO peflaKTupaHe Ha peflOBe iajua 
Ao6aBflHe Ha hobm, TOBa Moxe fla ce HanpaBM c OTfle/ieH fli/ia/ioroB npo3opeu, 
komto M3^M3a npw HaTMCKaHe Ha 6yT0H "Edit" v\nv\ "Add" npn M36paH pefl ot 
Ta6/ii/iuaTa. 

Pa6oTa c DataGrid KOHTpo/iaTa - npiiMep 

C HacTOfliflMfl npuMep me ki/uocrpkipaMe pa6oTaTa c DataGrid KOHTpo/iaTa b 
Windows Forms m c/io>khoto CB-bp3BaHe (complex data binding) Ha Ta6/ikiua ot 

DataSet C DataGrid. 

Eto CTbnKMTe 3a M3rpa>KflaHe Ha HaiueTO npn^OKeHne: 

1. CrapTkipaMe VS.NET v\ Cb3flaBaMe hob Windows Forms npoeKT. 

2. 3aflaBaMe Ha r/iaBHaTa cpopMa MMe MainForm v\ 3ar/iaBkie "DataGrid 

Demo". ripOMeHflMe M MMeTO Ha Cpai/i/ia OTForml.cs HaMainForm.es. 



134 nporpaMnpaHe 3a .NET Framework (tom 2) 

3. nocraBflMe bbb cpopMaTa eflHa DataGrid KOHTpo/ia. 3a MMe Ha kohtpo- 

nara 3aflaBaMe DataGridTowns. 

4. flo6aBAMe koa, komto npn 3ape>KAaHe Ha cpopMaTa (npn ct6nTne Load) 

C"b3flaBa DataSet, Cbfl"bp>Kam Ta6/lkiua Towns C flBe KO^OHM - id M MMe 

Ha rpafl. C^efl ioto tom e c"b3flafleH, CB"bp3BaMe DataGrid KOHTpo/iaTa c 

Ta6^MUaTa Towns OT T03M DataSet: 



private void MainForm_Load (ob j ect sender, System. EventArgs e) 

{ 

// Create table "Towns" 

DataTable towns = new DataTable ( "Towns" ) ; 

towns . Columns .Add (new DataColumn ( "id" , typeof (int ) ) ) ; 

towns . Columns .Add (new DataColumn ( "name" , typeof ( string) )) ; 

// Add some rows in the table 
DataRow row = towns . NewRow () ; 
row ["id"] = 1; 
row ["name"] = "Co$Mfl"; 
towns . Rows .Add ( row) ; 

row = towns . NewRow () ; 
row ["id"] = 2; 
row ["name"] = "IlJioBflMB"; 
towns . Rows .Add ( row) ; 

row = towns . NewRow () ; 
row ["id"] = 3; 
row ["name"] = "BapHa"; 
towns . Rows .Add ( row) ; 

row = towns . NewRow () ; 
row ["id"] = 4; 
row ["name"] = "Pyce"; 
towns . Rows .Add ( row) ; 

// Add table "Towns" to the DataSet 
DataSet ds = new DataSet ( ) ; 
ds . Tables .Add (towns ) ; 

// Bind the DataGrid to the DataSet 
DataGridTowns . DataSource = ds; 
DataGridTowns .DataMember = "Towns"; 



5. npn/io>KeHi/ieTO e totobo m MCoxeM fla ro crapTkipaMe v\ TecTBaMe. 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcJDeMC c Windows Forms 135 



DataGrid Demo 



^Jnj2^ 







id 


name 




t 


D 


CocfH3 




2 


ri/loeaHB 




3 


Bapna 




4 


Pyce 


* 











Ako npoMeHMM AaHHkue, BM3ya^M3npaHM b DataGrid KOHTpo/iaTa, Te me ce 

npOMeHflT M B Ta6^MU,aTa Towns OT DataSet 06eKTa. 



TableStyles n aecpMHMpaHe Ha cm/iose - npiiMep 

HacTOfliunflT npuMep w/irocrpkipa pa6oTaTa c DataGrid KOHTpo/iaTa b Windows 
Forms v\ Bt3MO>KHOCTMTe 3a AecpMHupaHe Ha CTM/iOBe 3a BM3ya/iM3aui/mTa Ha 
AaHHMTe npe3 KO/ieKUkisua TableStyles. IHe cb3AafleM npocro npn^OKeHne, 
noflo6HO Ha TOBa ot npeflxoflHua npi/mep, ho npe3 KO/ieKui/iyua TableStyles 
me onpefle^MM hcaKfla 6"bflaT Bki3ya/iki3kipaHki KO/iOHkue Ha Ta6/ikiuaTa. 

Eto m CTbnKMTe 3a M3rpa>KflaHe Ha HaweTO npw/io>KeHMe: 

1. Hana/iHi/ue crbnKM 3a M3rpa>KflaHe Ha npi/i/io>KeHi/ieTO ca ctiunTe KaTO 
CTbnKM ot 1 flo 4 b npeAMUJHMfl npuMep. l/l3n"b/iHflBaMe vv\ v\ npeMM- 
HaBaMe kbm AedpuHnpaHeTO Ha crw/iOBeTe 3a Bki3ya/ii/i3auwfl Ha AaHHMTe. 



DataGridTableStyle Collection Editor 



Members: 



dataGridTableStyleTowns Properties: 



dataGridTowns System. Windows. F_J 



fi 



V 



ParentRowsForet H WindowTextJj 
SelectionBackCol H ActiveCaptior 
BelectionForeColi \^\ ActiveCaptior 

B Configurations 

H (DynarnicPropert 

B Data 

B (DataBindings) 
DataMernber 
DataSource (none) 
[B3^ffl3 I (Collection) ^J 
I§S J 



\ 



Auto Format 







Add 



SelectionBackColor 
SelectionForeColor 

B Configurations 

H (DynarnicProperties) 

B Design 
(Name) 
Modifiers 

B Display 

ColumnHeadersVisible 
RowHeadersVisible 

B Layout 

PreferredColurnnWidth 

PreferredRowHeight 

RowHeaderWidth 

B Misc 

GridColumnStyles 
MappingName 



â–  ActiveCaption 
, ^| ActiveCaptionText 




(Collection) 
Towns 



\ 



11- 



EJ 1 Properties | O Dynamic Help | 



Help 



2. IHpaKBaMe c flecHna 6yTOH Ha MMiuKaTa Btpxy nocTaBeHna b r/iaBHaTa 

CpopMa DataGrid M M36kipaMe Properties. B np030peua Properties Ha 

peAaKTopa M36npaMe cbomctboto TableStyles m LupaKBaMe Btpxy 



136 



flporpaMnpaHe 3a .NET Framework (tom 2) 



6yTOHa c MHoroTOnweTO, HaMnpaiu ce b no/ieTO b a^cho ot Hero. OTBapa 
ce npo3opeu, komto hm no3BO/iflBa fla flo6aBAMe crmiOBe 3a Ta6/ikiuaTa. 
IHpaKBaMe Btpxy 6yTOHa Add, 3a p,a Ao6aBi/iM hob ctm/i. B AflCHaTa 
no/iOBMHa Ha npo3opeua MO>xeM p,a npoMeHHMe CBOMCTBaTa Ha 
Ao6aBeHM5i crmi. HaMnpaMe cbomctboto Name v\ My 3aAaBaMe ctomhoct 

DataGridTableStyleTowns . 

Ha CBOMCTBOTO MappingName 3aAaBaMe CTOMHOCT Towns. C TOBa yKa3Ba- 

Me, ne T03i/i cti/i/i ce OTHacfl 3a Ta6/ikiuaTa Towns. 3aAaBaMe Ha cbom- 

CTBOTO AlternatingBackColor (yKa3BaiUO UBflT, B KOMTO U\e Ce OUBe- 

TABaT neTHi/ue peAOBe) ctomhoct info. OcTaHa p,a 3aAaAeM cm/iOBe 3a 

OTAe^HMTe KO/IOHM. 

IHpaKBaMe Btpxy 6yTOHa c MHoroTOnweTO, HaMnpaiu ce b no/ieTO b 

A^CHO OT CBOMCTBOTO GridColumnStyles. OTBapfl Ce np030peu, KOMTO 

hm no3BO/i*iBa Aa Ao6aBAMe cm/iOBe 3a OTAe/iHkue ko/iohm. IHpaKBaMe 

Btpxy 6yTOHa Add, 3a AS A06aBklM HOB DataGridTextBoxColumn B KO- 
neKUWHTa. 3aAaBaMe CTOMHOCT DataGridTextBoxColumnName Ha CBOM- 
CTBOTO Name. 



n™™ i i ^^^ 


Members: 


dataGridTextBoxColurnnNarne Properties: 




UlQ 1 t 


B 

m 

B 
B 

B 
B 


Configurations 






(DynamicPropert 


es) 


Design 




(Name) 


dataGridTextBoxColumnName 


Modifiers 


Private 


Display 




Alignment 


Center 


HeaderText 


MMe Ha rpaA 




H (HflMa flam-in) 


Layout 




Width 


200 


Misc 




Format 




MappingName 


name 


Readonly 


False 


Add 


Remove 




















OK 


Cancel Help 














//, 



5. 3aAaBaMe Ha CBOMCTBOTO MappingName CTOMHOCT name. TaKa yKa3BaMe, 

ne to3m ctm/i ce OTHacfl 3a no/ieTO name. 3aAaBaMe Ha CBoi/icTBaTa 

Alignment, HeaderText M NullText CbOTBeTHO CTOMHOCTM Center, "MMe 

Ha rpafl" n " (HflMa flaHHM)". TaKa 3ar/iaBweTO Ha KO/iOHaTa me e 'We 
Ha rpafl", TeKCTbT me e ueHTpupaH, a KoraTO H^Ma ctomhoct b no/ieTO, 
b Ta6^nuaTa me ce Bki3ya/iki3kipa "(Hsma flaHHM)". HaKpaa yKa3BaMe 
ujupnHa Ha KO/iOHaTa, KaTO Ha cbomctboto width 3aAaAeM ctomhoct 200. 

6. HaTMCKaMe 6yTOHa [ok], 3a Aa 3ana3MM npoMeHMTe b KO/ieKuwyrra etc 
crmiOBeTe 3a KO/iOHkiTe. Cnep, TOBa HaTMCKaMe 6yTOHa [ok] m b Apyrna 
npo3opeu, 3a Aa 3ana3MM npoMeHMTe b crw/iOBeTe 3a Ta6/inunTe. 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepdjeMC c Windows Forms 137 



7. npn^OKeHneTO e totobo m MO>KeM p,a ro crapTkipaMe v\ TecTBaMe. 



iDataGrid Demo 




Mi-ie Harpaa 



rinoEaHB 
BapHa 
Pyce 



3a6e^A3BaMe, <Ae MaKap b Ta6/ikiuaTa Towns fla MMa flBe ko/iohm, b Haujua 
DataGrid ce BM3ya^M3npa caMO eAHaTa. ToBa e TaKa, 3aiuoTO ce BM3y- 
a^M3npaT caMO no/ieTaTa, 3a komto ca flo6aBeHM cm/iOBe b KO/ieKu,i/mTa 
Gridcoiiomnstyies. ToBa 03HanaBa, ne aKO He MCKaMe .qafleHO no/ie fla 6"bfle 
BM3ya^M3npaHO, npocTO He yi<a3BaMe cti/i/i 3a Hero. 

IHe OT6e/ie>KkiM, ne KoraTO ,qo6aBflMe crmi b KO/ieKUkiyrra Gridcolumnstyles, 
OCBeH DataGridTextBoxColumn, MO>KeM fla fl06aBflMe M DataGridBoolColumn. 

ToBa CTaBa, KaTO mpaKHeM Btpxy crpe/iKaTa, HaMnpaiua ce b fl^CHaTa nacr Ha 

6yTOHa Add, M OT naflaiflklfl Cni/ICbK M36epeM DataGridBoolColumn. Hpe3 
DataGridBoolColumn Onpefle/lflMe KO/lOHa, KOflTO B"bB BCflKa K/ieTKa Cbfl"bp>Ka 

no/ie c OTMeTKa, npeflCTaBaiuo 6y/ieBa ctomhoct. 

Master-Details HaBurauuii 

HaBuraunflTa "r/iaBeH/noflni/meH" (master-details) OTpa3flBa B3anMOOTHOiue- 
HMfi ot Tun eflHO K"bM mhoto (HanpwMep eflMH pernoH MMa mhoto 06/iacTM). B 
ADO.NET DataSet o6eKTMTe noflfl"bp>KaT pe/iaui/m ot Tun "r/iaBeH/noflUkmeH". 

3a ue/lTa Ce l/l3nO/13BaT DataRelation 06eKTMTe B DataSet. 

B Windows Forms ce noflfl"bp>Ka HaBurauna "r/iaBeH/noflnwHeH". 3a fla 
M/iKDcrpkipaMe pa6oTaTa c Hea, HeKa pa3r/ieflaMe eflMH npuMep: MMaMe 
DataSet, cbfl"bp>Kam flBe Ta6/inun - eflHaTa cbfltpwa MMeHa Ha fltpxaBM, a 
ApyraTa - MMeHa Ha rpaflOBe. Te ca CBtp3aHM noMe>Kfly cm TaKa, ne Ha BCHKa 
A"bp>KaBa ot iTbpBaTa Ta6/ikiua cbOTBeTcmaT onpe,qe/ieHki rpaflOBe ot BTopaTa 
Ta6/ikiua: 













Countries 


Towns 




Id 

Name 

Countryjd 


9 


Id 
Name 


-i 















ToraBa MO>KeM fla M3no/i3BaMe flBe DataGrid kohtpo/im - ntpBaTa, BH3ya/iw- 
3npaiua fltpxaBMTe, a BTopaTa, BH3ya/iM3npama rpaflOBeTe, cbOTBeTCTBamw 



138 nporpaMnpaHe 3a .NET Framework (tom 2) 

Ha TeKymo M36paHaTa A"bp>xaBa ot ntpBaTa KOHTpo/ia. 3a ue/ua KOHTpo/iMTe 
ce CB"bp3BaT c eAMH m cbiu Dataset. Ha r/iaBHaTa KOHTpo/ia ce 3aflaBa 3a 
M3T04HMK Ha flaHHM r/iaBHaTa Ta6/iwua. Ha noA^i/meHaTa KOHTpo/ia ce 3aAaBa 
3a M3T04HMK Ha ashhh pe/iauwHTa Ha Ta6/ikiuaTa: 



// Bind the master grid to the master table 
DataGridCountries . DataSource = datasetCountriesAndTowns; 
DataGridCountries . DataMember = "Countries"; 

// Bind the detail grid to the relationship 
DataGridTowns . DataSource = datasetCountriesAndTowns; 
DataGridTowns . DataMember = "Countries . CountriesTowns" ; 



Master-Details HaeuraLjMfl - npuMep 

HacTOfliunflT npuMep w/uocTpwpa B"b3MO>KHOCTi/iTe 3a pea/iM3auwfl Ha Master- 
Details HaBuraunfl, 6a3npaHa Ha Dataset KOMnoHeHTaTa ot ADO.NET m 
c/io>khoto CB"bp3BaHe Ha cnwcbUHki kohtpo^m b Windows Forms. B npuMepa 
me M3no^3BaMe 6a3aTa ashhh Northwind - eAHa ot craHAapTHMTe AeMOH- 
CTpaunoHHM 6a3M b MS SQL Server. 

IHe cb3AaAeM npi/i/io>KeHkie, KoeTO MMa b r/iaBHaTa cm cpopMa ABe kohtpo/im - 
ListBox, komto noKa3Ba pernoHM (ot Ta6/ikiuaTa Region ot 6a3aTa ashhh), m 
DataGrid, komto noKa3Ba o6/iacrkiTe 3a BceKM pernoH (ot Ta6/ikiuaTa 

Territories OT 6a3aTa AaHHM). 

Eto m CTtnKMTe 3a M3rpa>KAaHe Ha HaiueTO npi/i/io>KeHkie: 

1. CTapTupaMe VS.NET v\ cb3AaBaMe hob Windows Forms npoeicr. 

2. 3aAaBaMe Ha r/iaBHaTa cpopMa MMe MainForm v\ 3ar/iaBMe "Master- 
Detail Demo". ripoMeHflMe m MMeTO Ha cpaw/ia ot Formi.cs Ha 

MainForm . cs . 

3. B npo3opeua Server Explorer ot VS.NET HaMnpaMe AeMOHcrpaui/iOHHaTa 
6a3a ashhh Northwind Ha MS SQL Server. IHpaKBaMe Btpxy Ta6/ikiuaTa 
Region m cnep, TOBa, HaTMCKaMKM K^aBMiu Ctrl, lupaKBaMe Btpxy 
Ta6^nuaTa Territories. Cnep, KaTO CMe MapKkipa/iw eAHOBpeMeHHO v\ 
ABeTe Ta6/iwui/i, vv\ ki3B/iwnaMe Btpxy cpopMaTa. Ako npo3opeu"bT Server 
Explorer He e OTBopeH, MO>KeM p,a ro otbopmm, KaTO M36epeM view | 

Server Explorer. 

4. Windows Forms peAaicroptT aBTOMaTMUHO cb3AaBa 3a Hac eAMH 

SqlConnection M ABa SqlDataAdapter KOMnOHeHTa. ripOMeHflMe 
TeXHMTe MMeHa CbOTBeTHO Ha sqlConneciton, sqlDataAdapterRegion M 
sqlDataAdapterTerritories : 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM wHTepdjefic c Windows Forms 139 
5. Ot MeHKDTO Data M36kipaMe Generate Dataset... B nOflBkl/ll/lfl ce np030- 

peu, yKa3BaMe, ne MCKaMe fla cb3flafleM hob Dataset v\ 3aflaBaMe 3a MMe 

DataSetNorthwind. llOCTaBflMe OTMeTKM M npefl flBeTe Ta6^MU,M M 

HaTMCKaMe 6yTOHa [ok], 3a p,a cb3p,ap,eM hobma Dataset. ripoMeHHMe 

MMeTO Ha nOflBM/lMfl ce B peAaKTOpa DataSet Ha dataSetNorthwind. 



Generate Dataset 




6. IHpaKBaMe C fleCHklfl 6yTOH Btpxy dataSetNorthwind B peflaKTOpa M OT 

noflBM^OTO ce koht6kctho MeHK> M36npaMe view schema... OTBapa ce 

CpaM/l"bT DataSetNorthwind. xsd - BM>KflaMe XSD CxeMaTa Ha DataSet-a, 
reHepupaH Ha 6a3aTa Ha Ta6/lklUMTe Region V\ Territories. 




mrerritories (Territories) 




?E TerritorylD string 
E TerritoryDesc string 
E RegionID int 





7. Ot Toolbox i/i3B/innaMe eAHH Relation o6eKT m ro nycKaMe Btpxy Ta6- 
/lwuaTa Territories. B noflBM^Mfl ce npo3opeu ce yBep^BaMe, ne 3a 

Parent element e M36paHa Ta6/ll/luaTa Region, a 3a Child element - 

Ta6/ikiuaTa Territories, m HaTMCKaMe 6yT0Ha ok. TaKa flecpMHupaxMe 
pe/iauwfl Tun Master-Details Me>Kfly Ta6/ikiukiTe Region v\ Territories. 



140 



flporpaMnpaHe 3a .NET Framework (tom 2) 



(Region) 




o 



-< 



mrerritories (Territories) 




?E TerritorylD string 


E TerritoryDesc string 


E RegionID int 





8. flo6aBAMe bbb cpopMaTa eflMH ListBox c MMe ListBoxRegions. Ha 

CBOMCTBOTO DataSource 3aflaBaMe CTOMHOCT dataSetNorthwind, a Ha 
CBOMCTBaTa Display-Member M ValueMember - CbOTBeTHO CTOMHOCTM 
Region . RegionDescription M Region . RegionID . 

9. flo6aBflMe B"bB CpopMaTa efll/IH DataGrid C MMe DataGridTerritories. 
3aAaBaMe Ha CBOMCTBaTa DataSource V\ DataMember CbOTBeTHO CTOM- 
HOCTM dataSetNorthwind M Region. RegionTerritories. 

10. flecpMHkipaMe CTkl/1 C MMe dataGridTableStyleTerritories 3a Ta6/1M- 
UaTa Territories. B KO/ieKUklflTa My GridColumnStyles fl06aBHMe 
CTkl/lOBe 3a nO/ieTaTa TerritorylD M TerritoryDescription, KaTO 

yKa3BaMe, ne Te3M ko/iohm Tpa6Ba fla ca etc 3ar/iaBMfl - CbOTBeTHO koa 

M ofijiacT. 

11. flo6aBAMe KOfl, komto npn 3ape>KflaHe Ha cpopMaTa (npn c"b6nTne Load) 

3ape>Kfla DataSet 06eKTa OT 6a3aTa flaHHkl npe3 DataAdapter KOMnO- 
HeHTMTe 3a flBeTe Ta6/1MUM (Region V\ Territories): 



private void MainForm_Load (ob j ect sender, System. EventArgs e) 

{ 

sqlDataAdapterRegion . Fill (dataSetNorthwind) ; 
sqlDataAdapterTerritories . Fill (dataSetNorthwind) ; 



12. npn^OKeHneTO e totobo m MO>KeM fla ro crapTkipaMe v\ TecTBaMe: 



Master-Detail Demo 



PerwoH: 



*] 



OSnacT: 



Eastern 



Western 
Northern 
Southern 




KOfl 



otinacT 



015S1 Westboro 

01730 Bedford 

01833 Georgetow 

02116 Boston 

02139 Cambridge 

?1R4 Rraintree 



TjiaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM MHTepabeiic c Windows Forms 141 

npo6/ieMM npii Master-Details HaBMraMMflTa 

noKa3aHMflT HankiH 3a peanv\3auwn Ha master-details HaBurauna e necen 3a 
M3no^3BaHe, ho MMa ep,v\n cepno3eH npo6/ieM: BMHarn 3ape>KAa b naMerra 
BCM4KM 3anncn ot flBeTe ja6nv\u,v\. Ako Ta6/ikiu,kiTe ca o6eMHM, T03M noflxofl me 
pa6oTM mhoto 6aBHO v\nv\ B"bo6iue H^Ma fla pa6oTM. ripkinkmaTa e, ne 
3ape>KAaHeTO Ha hd/iam o6eM 3anncn (Aa KaxeM hhko/iko xm/iaah) b Dataset 
M3MCKBa mhoto naMeT v\ CTaBa 6aBHO. 

Ako flaHHMTe ca mhoto, MO>KeM p,a iioaxoahm no c/ieAHna Hankm: 3ape>KAaMe 
BCM4KM ashhh ot r/iaBHaTa (master) Ta6/iwua v\ vv\ Bki3ya/iki3kipaMe c DataGrid 
m/im ListBox. Cnep, TOBa npuxBaiuaMe c"b6nTneTO "cMAHa Ha TeKyiunyi peA" h 
npn HeroBOTO HacrbnBaHe 3ape>KAaMe b noA^i/meHaTa (details) Ta6/ikiua p,e- 
jav\i\uv\je 3anncn 3a M36paHi/m 3annc ot r/iaBHaTa Ta6/iwua. 3ape>KAaHeTO 
MO>xe Aa ce M3B"bpujn c napaMeTpwuHa SQL 3asiBKa, M3n"b/iHeHa npe3 

SqlDataReader MJ1M SqlDataAdapter. 

Pe/iaMMM "MHoro kt>m MHoro" 

DataSet M DataGrid He nOAA"bp>KaT pe/iaUMM TMn "MHOTO K"bM MHOTO". TaK"bB 

Tun pe/iaukiw MoraT Aa 6"bAaT CBeAeHM ao Master-Details npe3 Ao6aBAHe Ha 
v\3vnep, b 6a3aTa AaHHM. HeKa npuMepHO MMaMe 6a3a AaHHM, cbAtpwama 

Ta6^MUM Courses M Students M Ta6/lkiua StudentsCourses, OCbmeCTBflBama 

Bp"b3Ka Me>KAy tax. 



Courses 



Â¥ 



Courseld 

CourseNanne 

CourseDescription 



?0_ 



StudentsCourses 



Studentld 
Courseld 



-C= 



Students 



Â¥ 



Studentld 
StudentName 



3a Aa CBeAeM ia3v\ pe/iau^a KtM Master-Details, MOxeM Aa cb3AaAeM v\3vj\ep, b 
6a3aTa AaHHn: 



CREATE VIEW View_StudentsCourses AS 

SELECT Studentld, StudentName, Courseld, CourseName 
FROM Students, Courses, StudentsCourses 
WHERE Students . Studentsld = StudentsCourses . Studentld 
AND Courses . Courseld = StudentsCourses . Courseld 



CneA KaTO CMe Cb3p,ai\v\ v\3rnep,a, MOxeM Aa CBeAeM pe/iaui/mTa ao penau,v\n 
Master-Details Me>KAy Ta6/ikiuaTa courses v\ HOBOCb3AaAeHMfl v\3vnep,\ 















tiSCourses 


l(Courses) 


-< 


HviEW_StudentsCourses|(VIEW_StudentsCourses| 








^E Courseld 


int 




^E studentld int 


E CourseNanne 


string 


E StudentName string 


E CourseDescri 


string 


?E Courseld int 




E CourseNanne string 











142 flporpaMnpaHe 3a .NET Framework (tom 2) 



AHa/iorkmHO Ha npeflxoflHMfl npuMep MO>KeM fla pa6oTMM c Ta6/ikiu.kiTe, komto 
ca Bene bbb B3anMOOTHOiueHMe "r/iaBeH/noflnkmeH": 



IB! Many-to-many relationships 


|n|x| 




| Kypcoee 






Courseld 


CourseName | CourseDescription 






El 


1 


.NET .NET Framework 




â–º sB 


Java |java Foundarnentals 




m 


3 


Algorithms Basic algorithms 




- 












1 CTyneHm 






Studentld 


StudentName | Courseld | CourseName 


â–º 


1 


MeaH 


2 


Java 




2 


rieTbp 


2 


Java 




1 


Cn.nBna 


2 


Java 


1* 











Hac/ieflflBaHe Ha cpopMM 

HacneflHBaHeTO Ha dpopMM no3BO/iHBa noBTopHO M3no/i3BaHe Ha nacm ot 
noTpe6i/iTe/iCKi/m MHTepcpekic. Hpe3 Hero e B"b3MO>KHO fla npoMeHMM HaBeflHtw 
o6iunTe 4acTM Ha mhoto dpopMM. 3a ue/ua flecpMHupaMe eflHa 6a30Ba dpopMa, 
koato ctfltpxa o6iuaTa 3a bcmukm Hac/ieflHwu.n cpyHKui/iOHa/iHOcr. 

5a30BaTa dpopMa e HaM-o6nKHOBeHa dpopMa. EflMHCTBeHaTa oco6eHOCT e, ne 

KOHTpO^MTe, KOMTO MOraT fla Ce npOMeHflT OT HaC^eAHMUMTe, Ce 06flBflBaT 

KaTO protected. BwpTya/iHki MeTOflu MoraT fla pea/iki3wpaT cneuwcpwuHaTa 3a 
Hac/ieflHkiukiTe cpyHKuwoHa/iHOcr, flocTbnHa ot 6a30BaTa dpopMa. 

ripn Hac^eflflBaHe Ha dpopMa ce HacneflyiBa K/iacbT Ha 6a30BaTa dpopMa. ripn 
TOBa ce yKa3Ba MMeTO Ha npocTpaHCTBOTO, b KoeTO e flecpMHupaHa 6a30BaTa 
dpopMa, cneflBaHO ot touio, v\ MMeTO Ha 6a30BaTa dpopMa. Bbb Visual Studio 
.NET dpopMMTe Hac/ieflHi/m.w MoraT fla ce cb3flaBaT, KaTO ot MeHKrro ce M36epe 

File | Add New Item... | Inherited Form. 

ripn Hac^eflflBaHeTO Ha dpopMM MO>xeM fla nocraBMM 6a30BaTa dpopMa v\ 
cpopMMTe-Hac^eflHuun b pa3^M4HM aceM6/iMTa m c/iefl TOBa fla npoMeH^Me 
BCM4KM cpopMM-Hac^eflHMun npe3 npoMHHaTa Ha eflMHMneH DLL dpaw/i. 

EflHa oco6eHOCT Ha VS.NET e, ne no BpeMe Ha flM3aMH npoMeHMTe, HanpaBeHM 
Btpxy 6a30BaTa dpopMa, He ce OTpa3*iBaT Btpxy dpopMMTe Hac/ieflHwu.n, npeflu 
fla 6"bfle npeKOMnn^npaHO npw/io>KeHkieTO. 



Hac/ieflfiBaHe Ha cJdopmm - npuMep 

HacTOfliflMflT npuMep M/uocrpi/ipa B"b3MO>KHOCTi/iTe 3a Hac^eflflBaHe Ha dpopMM b 
Windows Forms, npn KoeTO ce Hac/ieflflBaT bcmuki/i kohtpo/im b tax, KaKTO v\ 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM kim-epdjetfc c Windows Forms 143 



MeTOflMTe m CBOMCTBaTa Ha K/iaca, b komto ca flecpuHnpaHM. B npuMepa me 
C"b3flafleM neTkipw cpopMn: 

- MainForm - r/iaBHaTa cpopMa Ha npi/i/io>KeHkieTO, koato me cny>Ki/i 3a 
noi<a3BaHe Ha APyrnTe cpopMM npn HaTMCKaHe Ha ctOTBeTHMfl 6yTOH. 

- BaseForm - 6a30Ba cpopMa, ot KOATO Apyrw cpopMM Hac^eflflBaT 
noTpe6kiTe/iCKM MHTepcpewc v\ 6a30Ba cpyHKuwoHa/iHOcr. 

- AddressForm - cpopMa 3a non"b/iBaHe Ha aflpec, Hac^eflHMK Ha 

BaseForm. 

- itemsDetaiisForm - cpopMa 3a non"b/iBaHe Ha onucaHne Ha npoflyKT, 

Hac/ieflHklK Ha BaseForm. 

CxeMaTM^HO HacneflflBaHeTO Me>Kfly cpopMkue e noKa3aHO Ha cpurypaTa no- 
AO/iy: 



Address Form 



&~ 



OK 




4 y. 

â–  Mpec: 




â–  Tpaa: 


1 J 


• JUtpxaea: 


A A 





Reset \:: m Cancel 



!!!!!! iliin"!!!:: 



Item Details Form 



@~ 



OK 



*j 



jiji. . . 


16 M 

• Mi-ie Ha nponyKT: ■ — 




1 




• LjeHa: 




1 


Q 


KaTeropwa: 




1 J 




I - HanwMHOCT 



o~ 



Reset r ; *â–  Cancel 



~m~: 



144 nporpaMnpaHe 3a .NET Framework (tom 2) 

Eto m CTtnKMTe 3a M3rpa>KflaHe Ha HaiueTO npn^OKeHne: 

1. CTapTupaMe VS.NET v\ cb3AaBaMe hob Windows Forms npoeicr. 

2. 3aAaBaMe Ha r/iaBHaTa cpopMa MMe MainForm v\ 3ar/iaBMe "Main Form". 

ripOMeHHMe M MMeTO Ha CpaM/ia OTForml.cs HaMainForm.es. 

3. flo6aBAMe HOBa cpopMa c MMe BaseForm. ToBa me 6"bAe HaiuaTa 6a30Ba 
cpopMa. Ot Hea me HacneAMM ocraHa/iMTe cpopMM. B Hea nocraBAMe eAMH 

Panel C MMe PanelMain M Tpn 6yT0Ha ButtonOK, ButtonCancel M 

ButtonReset. flecpMHupaMe naHe/ia KaTO protected, 3a Aa MO>Ke p,a ce 

npOMeHfl OT HaC^eAHMUMTe. EyTOHMTe ButtonOK M ButtonCancel MMaT 

o6n4aMHOTO npeAHa3Ha4eHne, KoeTO e 3aAaAeH0 etc CBOMCTBaTa 

AcceptButton M CancelButton Ha CpopMaTa. 

4. flo6aBAMe o6pa6oTHMK Ha C"b6nTneT0 click Ha 6yT0Ha ButtonReset. B 
Hero me M3BMKBaMe BMpTya/lHMfl MeTOA ResetFormFields ( ) , KOMTO 

Tpa6Ba Aa ce MMn/ieMeHTMpa b HacneAHMUMTe v\ Tpa6Ba Aa M3TpnBa 
BCM4KM no/ieTa: 



private void ButtonReset_Click (ob j ect sender, System. EventArgs e) 

{ 

ResetFormFields ( ) ; 

} 



5. flo6aBflMe M BMpTya/lHMfl MeTOA ResetFormFields () 



protected virtual void ResetFormFields ( ) 

{ 

// Descendand form should implement reset functionality here 

} 



6. KoMnw/ikipaMe npw/io>KeHkieTO, 3a Aa ce cb3AaAe aceM6/ikiT0, b KoeTO me 
ce cbA"bp>Ka CpopMaTa, ot koato me HacneAflBaMe. 3a ue/iTa M36npaMe 

Build I Build Solution. 

7. flo6aBAMe ntpBaTa cpopMa-HacneAHMK. 3a ue/iTa M36npaMe File | Add 

New Item.. | Inherited Form. B"bBe>KAaMe 3a MMe Ha CpopMaTa 
AddressForm M HaTMCKaMe 6yT0Ha open. Ot nOHBM/lMfl ce CnMCbK M36m- 

paMe BaseForm 3a KOMnoHeHT, ot komto me Hac^eA^BaMe. OTBapa ce 
cpopMaTa-Hac^eAHMK, koato M3r/ie>KAa touho KaTO 6a30BaTa cpopMa. 

8. ripoMeHHMe 3ar/iaBMeT0 v\ Ha Address Form. flo6aBAMe BtB CpopMaTa 

eAMH TextBox C MMe TextBoxAddress M ABe ComboBox KOHTpO/lM C 
MMeHa ComboBoxTown M ComboBoxCountry. 3aAaBaMe Ha CBOMCTBOTO 
Multiline Ha TextBoxAddress CTOMHOCT true. 3a DropDownStyle Ha 
ComboBox KOHTpo/lMTe 3aAaBaMe DropDownList. B KO/ieKUMflTa Items Ha 

comboBoxTowns B"bBe>KAaMe HAKO/iKO MMeHa Ha 6"b/irapcKM rpaAOBe, a b 

Ta3M Ha ComboBoxTowns B"bBe>KAaMe "ErbJirapW. 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM MHTepcpefic c Windows Forms 145 

9. ripeflecpMHupaMe MeTOfla ResetFormFieids ( ) TaKa, ne fla M34MCTBa 
no/ieTaTa Ha cpopMaTa: 



protected override void ResetFormFieids ( ) 

{ 

this . TextBoxAddress . Clear ( ) ; 

this . ComboBoxTown . Selectedlndex = -1; 

this . ComboBoxCountry . Selectedlndex = -1; 
} 



10. flo6aBAMe BTopaTa cpopMa-HacneflHMK. 3aAaBaMe itemDetaiisForm 3a 

MMe Ha CpopMaTa. llpOMeHflMe 3ar/iaBMeTO M Ha Item Details Form. 
flo6aBflMe B"bB CpopMaTa flBe TextBox KOHTpO/lM C MMeHa TextBoxName 
M TextBoxPrice, eflMH ComboBox C MMe ComboBoxCategory M eflMH 
CheckBox C MMe ChackBoxAvai lability. 3a DropDownStyle Ha 
ComboBoxCategory 3aflaBaMe DropDownList, a B KO/ieKUMflTa Items 

BtBe>KflaMe hako/iko KaTeropMM - "ajikoxoji", "BesajiKoxojiHM 

HanMTKM", "Koji6acn", "Ctokm 3a 6nTa". 3aflaBaMe Ha CBOMCTBOTO Text 
Ha ChackBoxAvai lability CTOMHOCT "HaramHoor" . 

11. npeflecpMHMpaMe M B Ta3M CpopMa MeTOfla ResetFormFieids ( ) TaKa, ne 

fla M34MCTBa no/ieTaTa: 



protected override void ResetFormFieids ( ) 

{ 

this . TextBoxName . Clear ( ) ; 

this . TextBoxPrice . Clear ( ) ; 

this . ComboBoxCategory . Selectedlndex = -1; 

this . CheckBoxAvailability. Checked = false; 
} 



12. riOCTaBflMe nOflXOflflLflM eTMKeTM Ha KOHTpO/lMTe B"bB cpopMMTe - 
HanpMMep npM TextBoxName nOCTaBflMe eTMKeT, HMeTO CBOMCTBO Text 
MMa CTOMHOCT "MMe Ha npoflyKT:". 

13. B r/iaBHaTa cpopMa flo6aBHMe flBa 6yTOHa c MMeHa ButtonAddressForm 

M ButtonltemDetailsForm. B 06pa60T4MUMTe Ha Cb6MTMflTa Click Ha 

Te3M 6yTOHM me noi<a3BaMe cpopMMTe HacneflHMUM: 



private void ButtonAddressForm_Click ( ob j ect sender, 
System. EventArgs e) 

{ 

AddressForm addressForm = new AddressForm () ; 

addressForm. ShowDialog ( ) ; 

addressForm. Dispose ( ) ; 
} 

private void ButtonItemDetailsForm_Click (ob j ect sender, 
System. EventArgs e) 



146 flporpaMnpaHe 3a .NET Framework (tom 2) 



ItemDetailsForm itemDetailsForm 
itemDetailsForm. ShowDialog ( ) ; 
itemDetailsForm. Dispose ( ) ; 



new ItemDetailsFormf 



14. npi/i/io>Kei-ii/ieTO e totobo m MO>KeM fla ro crapTkipaMe m TecTBaMe: 

Address Form: 

V — ' 

Item D -fa' ;. Form 

Mmb Ha npoAyKT: 




UeHa: 



KaTeropn3: 



~3 



r HariHMHOCT 



OK Reset | Cancel | OK Reset | Cancel | 

naKeTi>T System. Drawing u GDI+ 

riaKeTtT system. Drawing ocurypflBa flOCTbn flo GDI+ cpyHKUMMTe Ha 
Windows: 

- noBtpxHOCTM 3a nepTaine 

- pa6oTa c rpacpmo v\ rpacpwuHi/i TpaHCCpopMaunn 

- M34epTaBaHe Ha reoMeTpwuHki cpurypn 

- pa6oTa c M3o6pa>KeHMfl 

- pa6oTa c TeKcr v\ ujpucpTOBe 

- nenaTaHe Ha npuHTep 

Tom ce cbcrow ot hako/iko npocTpaHCTBa: 

- System. Drawing - npeflOCTaBfl OCHOBHM K/iaCOBe KaTO nOBtpXHOCTM, 
MO/1MBM, 4eTKM, K/iaCOBe 3a M306pa3flBaHe Ha TeKCT. 

- System. Drawing. Imaging - npeflOCTaBfl K/iaCOBe 3a pa60Ta C M306pa- 
>KeHMfl, KapTMHKM m mkohm, K/iacoBe 3a 3anwcBaHe B pa3/lklHHkl CpaM^OBM 
cpopMaTM m 3a npeopa3MepflBaHe Ha M3o6pa>KeHi/m. 

- System. Drawing. Drawing2D - npeflOCTaBfl K/iaCOBe 3a rpacpM4HM TpaHO 
cpopMaunn - 6/ieHAH, MaTpnun M AP- 

- System. Drawing. Text - npeAOCTaBfl K/iaCOBe 3a AOCTbn AO UjpMCpTOBeTe 

Ha rpacpM^HaTa cpeAa. 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM kim-epdjetfc c Windows Forms 147 

- system. Drawing. Printing - npeflOcraBfl K/iacoBe 3a nenaTaHe Ha 
npuHTep m cucTeMHM flwa/ioroBki kytmm 3a nenaTaHe. 

K/iacbT Graphics 

K/iaCbT System. Drawing. Graphics npeflOCTaBfl a6CTpaKTHa nOBtpXHOCT 3a 

nepTaHe. TaKaBa noBtpxHOcr MO>Ke fla 6"bfle KaKTO nacr ot KOHTpo/ia Ha 
eKpaHa, TaKa v\ nacr ot CTpaHnua Ha npuHTep v\nv\ flpyro ycTpowcTBO. 

HaM-necro nepTaHeTO ce M3B"bpujBa b o6pa6oTnm<a Ha c"b6nTneTO Paint. B 
Hero npn Heo6xoflMMOCT ce npei/i3nepTaBa rpacpwuHMH o6/imk Ha KOHTpo/iaTa. 

riapaMerbptT PaintEventArgs, KOMTO ce nOflaBa, Cbfl"bp>Ka Graphics 06eKTa. 
Graphics 06eKT MO>Ke fla ce Cb3flaBa npe3 Control . CreateGraphics ( ) . TOM 

3afl"b/i>KkiTe/iHO Tpa6Ba fla ce ocBo6o>KflaBa npe3 finally 6/iok v\j\v\ c kohc- 
TpyKunflTa using, 3aiflOTO e ueHeH pecypc. 

Pa6oTa ci>c System. Drawing - npuMep 

Hpe3 HacTOfliflMfl npi/mep me w/uocrpi/ipaMe pa6oTaTa c GDI+ npe3 naKeTa 
system. Drawing - nepTaHe Ha reoMeTpn^HM cpurypn c neTKki v\ mo/imbh m 
M3o6pa3ABaHe Ha TeKcr etc 3aflafleH ujpucpT. 

Eto m CTtnKMTe 3a M3rpa>KflaHe Ha HaweTO npuMepHO npi/i/io>KeHkie: 

1. CrapTkipaMe VS.NET v\ Cb3flaBaMe hob Windows Forms npoeicr. 

2. 3aflaBaMe Ha r/iaBHaTa cpopMa MMe MainForm v\ noflxoflaiuo 3ar/iaBHe, 

HanpMMep "System. Drawing Demo". ripOMeHflMe M MMeTO Ha CpaM/ia OT 
Forml . cs H3 MainForm. cs. 

3. flo6aBAMe o6pa6oT4MK Ha c"b6nTneTO Paint, KtfleTO i/i3nepTaBaMe rpa- 
cpwuHO M3o6pa>KeHMe: 



private void MainForm_Paint (ob j ect sender, 
System. Windows . Forms . PaintEventArgs e) 

{ 

Graphics g = e. Graphics; 

g . SmoothingMode = SmoothingMode .AntiAlias; 

Brush brush = new SolidBrush (Color . Blue) ; 
g. FillEllipse (brush, 50, 40, 350, 250); 
brush . Dispose ( ) ; 

Pen pen = new Pen (Color . Red, 2 ) ; 
g.DrawRectangle (pen, 40, 50, 200, 40); 
pen . Dispose ( ) ; 

brush = new SolidBrush (Color . Yellow) ; 
Font font = new Font ( "Arial" , 14, FontStyle . Bold) ; 
g. Drawstring (" .NET Framework", font, brush, 60, 60) 
brush . Dispose ( ) ; 



148 



flporpaMnpaHe 3a .NET Framework (tom 2) 



font . Dispose 



} 



B MeTOfla B3eMaMe Graphics o6eKTa Ha cpopMaTa, cb3,qaBaMe noflxoflaiun 
neTKM, mo^mbm m wpwcpTOBe. C Tax i/i3nepTaBaMe 3ant^HeHa e/iwnca v\ npaBO- 
"brt^HMK m b Hero M3nncBaMe TeKCT. Bci/iukm GDI+ pecypcn (neTKM, mo^mbm m 
ujpucpTOBe) 3afl"b^>KMTe^HO ce ocBo6o>KflaBaT cnep, i/i3no/i3BaHe. 

4. npn^OKeHneTO e totobo m MO>KeM fla ro crapTkipaMe v\ TecTBaMe: 



I System .Drawing Demo 




AHMMaMMH ci>c System. Drawing - npuMep 

HacTOfliunflT npuMep M/uocTpwpa KaK etc cpeACTBaTa Ha GDI+ npe3 naKeTa 
system. Drawing MO>Ke fla ce pea/iM3kipa n/iaBHa aHMMaunfl Ha HflKaicbB 
reoMeTpn^eH o6eKT. 

Eto m CTtnKMTe 3a M3rpa>KflaHe Ha HaiueTO npuMepHO npw/io>KeHkie: 

1. CrapTwpaMe VS.NET v\ cb3flaBaMe hob Windows Forms npoeicr. 

2. 3aflaBaMe Ha r/iaBHaTa cpopMa MMe MainForm v\ 3ar/iaBMe "system. 

Drawing Demo". ripOMeHHMe M MMeTO Ha Cpaki/ia OT Forml.cs Ha 
MainForm. cs. 

3. flo6aBAMe npoMeH/iMBi/i v\ KOHcraHTki 3a no3kmi/mTa Ha aHMMnpaHUfl 
o6eKT (e/iwnca), crbniOTa Ha npeMecTBaHe v\ pa3MepnTe Ha e/iwncaTa: 



private 


int mPosX = 


0; 




private 


int mPosY = 


0; 




private 


int StepX = 


1; 




private 


int StepY = 


1; 




public 


:onst int ELLIPSE SIZE X = 


= 7 0; 


public 


const int ELLIPSE SIZE Y = 


= 4 0; 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM wHTepdjefic c Windows Forms 149 

4. nocraBflMe b r/iaBHaTa cpopMa eflHa Timer KOMnoHeHTa c MMe 

TimerAnimaiton M eflklH PictureBox C MMe Pi ctureBoxAnimatoin . 

5. flo6aBflMe 06pa60THMK Ha Cb6l/ITI/ieTO Paint Ha PictureBox KOHTpo/iaTa. 

B Hero M34epTaBaMe flBM>KeiuMfl ce o6eKT Ha no3nunflTa, b koato ce 
HaMupa b MOMeHTa: 



private void PictureBoxAnimation_Paint (ob j ect sender, 
System. Windows . Forms . PaintEventArgs e) 

{ 

Graphics g = e. Graphics; 

g . SmoothingMode = SmoothingMode .AntiAlias; 

Brush brush = new SolidBrush (Color . Blue) , • 
g . FillEllipse (brush, mPosX, mPosY, 
ELLIPSE_SIZE_X, ELLIPSE_SIZE_Y ) ; 
brush . Dispose ( ) ; 

brush = new SolidBrush (Color . Yellow) ; 
Font font = new Font ( "Arial" , 14, FontStyle . Bold) ; 
g. Drawstring (" .NET", font, brush, mPosX+10, mPosY+10) 
brush . Dispose ( ) ; 
font . Dispose ( ) ; 
} 



6. 3aAaBaMe Ha CBOMCTBaTa Enabled V\ Interval Ha Timer KOMnOHeHTaTa 

cbOTBeTHO ctomhoctm true m io. TaKa Tfl me reHepupa ct6nTne Ha 

BCeKM 10 MM^MCeKyHflM. 

7. flo6aBAMe o6pa6oT4MK Ha c"b6nTneTO Elapsed Ha Timer KOMnOHeHTaTa. 
B Hero npoMeHAMe KOopflMHaTMTe Ha flBM>KeiuMfl ce o6eKT v\ npe^epTaBa- 
Me PictureBox KOHTpo/iaTa : 



private void TimerAnimation_Elapsed (ob j ect sender, 
System. Timers . ElapsedEventArgs e) 

{ 

mPosX += StepX; 

if ( (mPosX >= PictureBoxAnimation. Width - ELLIPSE_SIZE_X - 3) 
| | (mPosX <= 0) ) 

{ 

StepX = -StepX; 

} 

mPosY += StepY; 

if ( (mPosY >= PictureBoxAnimation. Height - ELLIPSE_SIZE_Y - 3) 
| | (mPosY <= 0) ) 

{ 

StepY = -StepY; 

} 



150 flporpaMnpaHe 3a .NET Framework (tom 2) 



PictureBoxAnimation . Refresh i 



} 



8. npn^OKeHneTO e totobo m MO>KeM fla ro crapTkipaMe v\ TecTBaMe: 



i_ 



System .Drawing Demo 











^NET 











B npuMepa CMe ki3no/i3Ba/iki PictureBox KOHTpo/ia, 3aiuoTO ta He nepTae 
hmluo b cbosi Paint MeTOfl, komto ce M3BMKBa npeAH BCAKO npenepTaBaHe. 
Ako 6*ixMe M3no/i3Ba/in Panel m/im Apyra KOHTpo/ia, meiue pja ce no/iynw 
TpenKaHe. 

3a npocpecwoHa/iHa aHMMaui/m ce ki3no/i3Ba DirectX TexHO/iorwflTa, koato 
M3no^3Ba pecypcuTe Ha rpacpwuHaTa KapTa mhoto no-ecpeKTMBHO v\ HaTOBapBa 
ueHTpa^HMfl npouecop mhoto no-Ma/iKO. KaTO \\s\no 3a no-cno>KHki npw/io- 
xeHMfl (HanpuMep nrpn) M3no/i3BaHHflT b T03M npuMep noAXOA e rpeiueH! 



nenaTaHe Ha npuHTep 



Hecro ce Ha/iara cb3AaAeHkiTe ot Hac npn^OKeHMa p,a OTnenaTBaT HflKaKBa 

MHCpopMaUMfl Ha npMHTep. npocrpaHCTBOTO System. Drawind. Printing HI/I 

npeAOcraBfl K/iacoBe, npe3 komto MO>KeM p,a pea/iki3kipaMe TaKaBa cpyHKuno- 

Ha/IHOCT. 

ripn ne^aTaHeTO Ha npuHTep ce M3no/i3BaT Tpn k/hohobm K/iaca: 

- PrintDialog - CTaHAapTeH Ana/ior 3a nenaTaHe Ha npuHTep. rio3BO/iflBa 
Ha noTpe6kiTe/i*i p,a M36epe npuHTep v\ p,a yKa>Ke kom nacm ot AOKyMeH- 
Ta p,a ce crmenaTaT. 

- Printcontroiier - ynpaB/iflBa npoueca Ha nenaTaHe v\ aKTMBupa Cb6w- 

Tklfl, CB"bp3aHM C Hero. PrintController npeAOCTaBfl Graphics l"IOB"bpx- 

HOCTTa, Btpxy koato nenaTaMe. 

- PrintDociiment - onucBa xapaKTepucTMKMTe Ha OTnenaTBaHMfl AOKy- 

MeHT. C"bA"bp>Ka PrinterSettings, BtpHaTM OT PrintDialog. 

06nKHOBeHO, KoraTO MCKaMe p,a OTnenaTaMe Heiuo Ha npuHTep, cb3AaBaMe 
MHCTaHunfl Ha K/iaca PrintDocument, 3aAaBaMe ctomhoctm Ha CBOMCTBaTa, 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM wm-epdjeiic c Windows Forms 151 

onucBaiun KaKBO me nenaTaMe, v\ M3BMKBaMe MeTOfla Print o, 3a p,a OTnena- 
TaMe flOKyMeHTa. 

nOTpe6MTe/1CKM KOHTpO/IM 

noTpe6i/iTe/iCKi/iTe kohtpo/ii/i (custom controls) no3BO/iflBaT pa3LunpflBaHe Ha 
CTaHAapTHMfl Ha6op ot kohtpo/ii/i npe3 KOM6nHnpaHe Ha cbiuecTByBaiun 
KOHTpo/iw, pa3LunpflBaHe Ha cbiuecTByBaiun v\nv\ cb3flaBaHe Ha cbBceM hobm 
TaKMBa. 

noTpe6i/iTe/iCKi/iTe kohtpo^m \m\v\ pa3LunpflBaT cbiuecTByBaiun kohtpo/im, v\i\v\ 
K/iaca control m/im K/iaca usercontroi. Te MoraT p,a ynpaB/iflBaT noBeAe- 
HueTO cm no BpeMe Ha ki3n"b/iHeHkie, KaKTO v\ p,a B3anMOAekicTBaT c AH3ai/iHepa 
Ha VS.NET no BpeMe Ha AH3awH. 

Cb3flaBaHe Ha HOBa KOHTpo/ia, kohto He Hac/iensiBa 
cbiLiecTByBaiua 

Ct3AaBaHeTO Ha HOBa KOHTpo/ia, koato He HacneAflBa hi/ikoh cbiuecTByBaiua 
Bene KOHTpo/ia, CTaBa no cneRHwn Hankm: 

1. Ot VS.NET M36npaMe File | Add New Item ... | UI | Custom 
Control. 

2. npunoKpuBaMe BwpTya/iHMfl MeTOA Paint(...), 3a p,a nepTaeM rpacpwnHMH 
o6pa3 Ha KOHTpo^aTa. 

3. flecpMHupaMe Heo6xoAHMMTe CBOMCTBa v\ MeTOAH. 

4. 06flBABaMe CBOMCTBaTa, AOcrbnHM ot AH3ai/iHepa Ha cpeAaTa 3a 
pa3pa6oTKa (VS.NET) npe3 c/ieAHkiTe aTpn6yTn: 

- category - yKa3Ba KaTeropuflTa, b kohto me ce noKa3Ba cbomctboto. 

- Description - 3aAaBa onucaHne Ha cbomctboto. 

Ci>3flaBaHe Ha HOBa KOHTpo/ia KaTO KOM6nHai4nq ot 

flpym KOHTpO/IH 

C"b3AaBaHeTO Ha KOHTpo/ia KaTO KOM6nHaunfl ot Apyrn kohtpo/ii/i craBa no 
c^eAHMfl Ha^MH: 

1. Ot VS.NET M36npaMe File | Add New Item ... | UI | User Control. 

2. M3no/i3BaMe AH3afiHepa Ha VS.NET, 3a p,a Ao6aBMM kohtpo/im v\ p,a 
OCpOpMMM >Ke^aHMfl bma Ha KOHTpo^aTa. 

3. 06flBHBaMe CBOMCTBaTa, p,ocrbuuv\ 3a AH3ai/iHepa Ha cpeAaTa 3a pa3pa- 

60TKa npe3 aTpn6yTMTe Category M Description. 



152 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Cb3flaBaHe Ha HOBa KOHTpo/ia, kohto Hac/ieanea 
cbiitecTByBauia KOHTpo/ia 

Cb3flaBaHeTO Ha HOBa KOHTpo/ia, koato Hac/ieflflBa cbiuecTByBaiua KOHTpo/ia, 
CTaBa no cneflHi/m Ha^MH: 

1. Ot VS.NET M36kipaMe File | Add New Item ... | UI | Inherited User 
Control. 

2. M36npaMe KOHTpo/iaTa, ot koato me HacneflsiBaMe. 

3. flecpMHupaMe flont/iHi/ue/iHi/i MeTOflu v\ CBOMCTBa v\ vv\ o6flB*iBaMe 3a 

AM3aMHepa Ha VS.NET npe3 aTpw6yTklTe Category V\ Description. 

4. npunoKpuBaMe onxxxo MeTOflkue npn Heo6xoflMMOCT, 3a fla npoMeHMM 
noBefleHneTO Ha opwrwHa/iHaTa KOHTpo/ia. 



Ci>3flaBaHe Ha KOHTpo/ia - npuMep 

B HacTOfliunfl npuMep me w/irOcrpkipaMe KaK etc cpeflCTBaTa Ha Windows 
Forms v\ GDI+ MO>xeM fla cb3flaBaMe noTpe6i/iTe/iCKki Windows Forms kohtpo- 
nv\. W\e cb3flafleM KOHTpo/iaTa ciockcontroi, kohto npeflcraB/iflBa Kptrb/i 4a- 
cobhmk cbc crpe/iKki, Ha komto MO>Ke fla ce 3aflaBa ko/iko naca fla noKa3Ba. 

Eto CTbnKMTe 3a cb3flaBaHe Ha KOHTpo/iaTa v\ Ha npn^oxeHne, KoeTO n 
M3no/i3Ba: 

1. CTapTupaMe VS.NET v\ cb3flaBaMe hob Windows Forms npoeicr. 



Add New Item - Demo-18-CustomControl-Clock 



Categories: 



Templates: 



I B-Q Local Project Items 
LQ ui 
:--Q Code 
i-O Data 
i--Q Web 
;--Cl Utility 
: - Q Resources 



Windows User Control Data Form 
Form Wizard 



Custom 
Control 



Inherited 
User Control 



Inherited Web Custom 
Form Control 



A class for creating a user-drawn Windows Form control 
Name: | ClockControllcs 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM kim-epdjetfc c Windows Forms 153 

2. 3aflaBaMe Ha r/iaBHaTa cpopMa MMe MainForm v\ 3ar/iaBkie "clock 

Control Demo". llpOMeHflMe M MMeTO Ha CpaM/ia OT Forml . cs Ha 
MainForm. cs. 

3. Cb3flaBaMe HawaTa noTpe6i/iTe/ici<a KOHTpo/ia. 3a ue/ua M36npaMe File 

I Add New Item ... | UI | Custom Control. 3aflaBaMe ClockControl 

3a MMe Ha KOHTpo/iaTa. 

4. flecpMHupaMe flBe no/ieTa mHour v\ mMinute v\ CBoi/icTBa 3a flocrbn ao 
tax. Te me cbfltpaoT naca v\ MMHyTMTe Ha Haujua nacoBHMK: 



private int mHour; 
private int mMinute; 

[Category ( "Behavior" ) , Description ( "Specif ies the hour.")] 
public int Hour 

{ 

get 

{ 

return mHour; 

} 

set 

{ 

mHour = value; 
this . Invalidate ( ) ; 
} 
} 

[Category ( "Behavior" ) , Description ( "Specif ies the minutes.") 
public int Minute 

{ 

get 

{ 

return mMinute; 

} 

set 

{ 

mMinute = value; 
this . Invalidate ( ) ; 
} 
} 



npn/lOKI/1/lkl CMe K"bM CBOMCTBaTa aTpi/l6yTM Category M Description, 3a 
Aa yKaxeM Ha Visual Studio .NET p,a vv\ ny6/im<yBa b Properties 
npo3opeua no BpeMe Ha p,v\3av\n. ripn npoMflHa Ha CBOMCTBaTa ce 
M3BMKBa MeTOAtT invalidate () , 3a Aa ce npenepTae KOHTpo/iaTa v\ p,a 
ce npeMecTAT crpe/iKMTe Ha nacoBHMKa. 



154 nporpaMnpaHe 3a .NET Framework (tom 2) 

5. flo6aBAMe eflHa KOHcraHTa 3a pa3Mep no noflpa36npaHe v\ Ao6aB*iMe b 
KOHCTpyKTopa KOfl 3a MHMuna^M3MpaHe Ha KOHTpo^aTa. IHe m-muwa/iki- 
3npaMe KOHTpo^aTa c TeKyiuna nac: 



private const int DEFAULT_SIZE = 100; 

public ClockControl ( ) 

{ 

// This call is required by the Windows . Forms Form Designer. 
InitializeComponent ( ) ; 

this. Size = new Size (DEFAULT_SIZE, DEFAULT_SIZE ) ; 
mHour = DateTime . Now. Hour; 
mMinute = DateTime . Now. Minute; 
} 



6. npunoKpuBaMe BkipTya/n-mfl MeTOfl onPaint(...) v\ b Hero nepTaeM nacoB- 
HMKa Btpxy Graphics noBtpxHOCTTa Ha KOHTpo^aTa. 3a npecMATaHe Ha 
KOopAMHaTMTe Ha CTpe^KMTe M3no^3BaMe M3ni/ic/ieHi/m c noMOiuTa Ha 

TpnrOHOMeTpM4HM CpyHKUMM CMHyC M KOCMHyC: 



protected override void OnPaint ( PaintEventArgs pe) 

{ 

Graphics g = pe. Graphics; 

// Draw the circle 

Pen pen = new Pen (Color . Blue, 1); 

g . DrawEllipse (pen, 0, 0, this . Width- 1, this . Height-1 ) 

pen . Dispose ( ) ; 

// Draw the minute finger 
double minuteFingerAngle = 

(mMinute % 60) * (2*Math . PI/60 ) ; 
int minuteFingerLen = this. Width * 45 / 100; 
int xl = this. Width / 2; 
int yl = this. Height / 2; 
int x2 = (int) (xl + 

minuteFingerLen*Math . Sin (minuteFingerAngle) ) ; 
int y2 = (int) (yl - 

minuteFingerLen*Math . Cos (minuteFingerAngle) ) ; 
pen = new Pen (Color . Red, 2); 
g . DrawLine (pen, xl, yl, x2, y2 ) ; 
pen . Dispose ( ) ; 

// Draw the hour finger 

double hourFingerAngle = 

(mHour % 12) * (2*Math . PI/12 ) + 
(mMinute % 60) * (2*Math . PI/ ( 60*12 )) ; 

int hourFingerLen = this. Width * 25 / 100; 

xl = this. Width / 2; 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM kiHTepa>eiic c Windows Forms 155 



yl = this. Height / 2 ; 




x2 = (int) (xl + hourFingerLen*Math 


Sin (hourFingerAngle) ) ; 


y2 = (int) (yl - hourFingerLen*Math 


Cos (hourFingerAngle) ) ; 


pen = new Pen (Color . Yellow, 3 ) ; 




g . DrawLine (pen, xl, yl, x2, y2 ) ; 




pen . Dispose ( ) ; 




// Calling the base class OnPaint 




base . OnPaint (pe) ; 
} 





7. npunoKpuBaMe MeTOfla onsize (...), b komto npupaBH^BaMe BkiconwHaTa 
m LunpuHaTa Ha KOHTpo/iaTa v\ n npenepTaBaMe. TaKa KOHTpo/iaTa BMHarn 
me 6"bAe c KBaApaTHa cpopMa: 



protected override void OnResize (System. EventArgs e) 
{ 



this. Height = this. Width; 
this . Invalidate ( ) ; 



} 



8. HawaTa noTpe6kiTe/ici<a KOHTpo/ia e roTOBa. Mo>KeM p,a npeKOMnw/ii/ipa- 
Me npi/i/ic»KeHi/ieTO v\ p,a a flo6aBMM b Toolbox. 3a p,a n Ao6aBMM b 
Toolbox, lupaKBaMe b Hero c fleceH 6yTOH Ha MMUJKaTa v\ ouaM M36npa- 

Me Add/Remove Items... B nOflBM/lMfl Ce np030peu HaTMCKaMe 6yTOHa 

Browse... m M36npaMe ki3n"b/iHkiMkm cpai/i/i Ha HaiueTO npi/i/io>KeHkie. rioc- 
TaBAMe OTMeTKa npeA ciockcontroi b cnwcbKa v\ HaTMCKaMe 6yTOHa ok. 
KoHTpo/iaTa ce flo6aBfl b Toolbox. 



Properties 



clock Demo 18 CustomControl Clock.Cloi 



H 



A, 



m 



-/ 



Text 



B | Behavior | 

AllowDrop 

ContextMenu 

Enabled 
p-Hour 

ImeMode 
" Minute 

Tablndex 

Tab5top 

Visible 



False 

(none) 

True 

14 

NoControl 

52 



True 

True 



9. B r/iaBHaTa cpopMa Ha npi/i/io>KeHi/ieTO nocraBflMe eflHa ciockcontroi 
KOHTpo/ia c MMe clock i/i eflMH nanen c kohtpo/im 3a npoMAHa Ha 

TeKyiUMfl HaC V\ MMHyTM - P,Be NumericUpDown KOHTpO/lM c MMeHa 
NumericUpDownHour M NumericUpDwonMinute M eflMH 6yTOH C MMe 

ButtonSetTime 3a OTpa3flBaHe Ha npoMeHi/ue. CBOMCTBaTa Ha 



156 flporpaMnpaHe 3a .NET Framework (tom 2) 



ciockcontroi MoraT fla 6"bflaT npoMeHAHM ot npo3opeua Properties (b>k. 
cpurypaTa no-rope). 

10. flo6aBAMe koa, komto npn 3ape>KflaHe Ha cpopMaTa (npn c"b6nTne Load 
Ha cpopMaTa) 3a,qaBa CTOMHOCTMTe Ha NumericUpDown KOHTpo/iwTe 3a 
nac m MMHyTa, cbOTBeTCTBaiun Ha Te3M ot ciockcontroi o6eKTa: 



private void MainForm_Load (ob j ect sender, System. EventArgs e) 
{ 



NumericUpDownHour .Value = clock. Hour; 
NumericUpDownMinute .Value = clock .Minute; 



} 



11. flo6aBAMe o6pa6oT4MK Ha c"b6nTneTO click Ha ButtonSetTime. B Hero 
npoMeHAMe CTOMHOCTMTe Ha CBOMCTBaTa Ha ciockcontroi o6eKTa: 



private void ButtonSetTime_Click (ob j ect sender, 
System. EventArgs e) 

{ 

clock. Hour = (int) NumericUpDownHour .Value; 
clock. Minute = (int) NumericUpDownMinute .Value; 



12. flo6aBAMe o6pa6oT4MK Ha c"b6nTneTO sizechanged Ha cpopMaTa. B Hero 
Ao6aBflMe KOfl, komto He no3BO/i*iBa Ha nacoBHmo fla 6"bfle Btpxy 
nanena: 



private void MainForm SizeChanged (ob j ect sender, 




System. EventArgs e) 

{ 

ClientSize = new Size( 






ClientSize .Width, ClientSize .Width + PanelDown 
} 


Height) ; 



13. ripn/iOKeHneTO e totobo m motom fla ro crapTwpaMe v\ TecTBaMe. 



i Clock Control Demo 




W^W^ 



Set time 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM MHTepdjefic c Windows Forms 157 

Xoctmht Ha kohtpo/im b Internet Explorer 

Internet Explorer Mowe p,a M3n"b/iH*iBa Windows Froms kohtpo/im, BrpafleHM b 
ta/ioto Ha HTML CTpaHnun. TexHO/iorwyiTa e noflo6Ha Ha Java an/ieTi/ue v\ 
Macromedia Flash - Brpa>KAa ce M3n"b/iHMM koa, komto ce M3n"b/iHHBa b 
K^neHTCKMfl ye6 6pay3"bp. Ot JavaScript MoraT p,a ce AOCTbnBaT CBOMCTBaTa Ha 
Windows Forms KOHTpo/iMTe. Heo6xoAMMM ca Internet Explorer 5.5, v\nv\ no- 
HOBa Bepci/m, v\ MHcra/iMpaH .NET Framework. 

HacTpoMKMTe 3a curypHOCT He no3BO/iflBaT Aocrbn ao cpai/i/iOBaTa CMcreMa v\ 
Apyrn onacHM AeMCTBua. CurypHOCTTa Moxe p,a ce 3aAaBa v\ ptuHO. Ako MMa 
Hy>KAa ot 3ana3BaHe Ha HAKaKBM ashhh Ha MaiunHaTa Ha noTpe6kiTe/i*i, MO>Ke 
Aa ce i/i3no/i3Ba Isolated Storage . 

Xoctmht Ha kohtpo/im b Internet Explorer - npMMep 

HacTOfliuMflT npuMep M/uocrpMpa KaK MO>xeM Aa pea/iM3MpaMe xoctmht Ha 
Windows Forms kohtpo/im b Internet Explorer 4pe3 Brpa>KAaHeTO mm b HTML 
CTpaHMua m KaK MOweM Aa AOCTbnBaMe CBOMCTBaTa mm ot JavaScript. 

fla pa3r/ieAaMe npMMepHa HTML CTpaHMua, b kohto e BrpaAeHa Windows 
Forms KOHTpo/iaTa "nacoBHMK" ot npeAxoAHMa npMMep: 



index . html 



<html> 
<script> 

function ChangeText ( ) { 

clockControl . Hour = hour. value; 

clockControl .Minute = minute . value; 
} 

</script> 

<body> 

<p>Clock Control in IE</p> 

<object id="clockControl" 

classid="http : Demo-18-CustomControl- 
Clock . exe#Demo_18_CustomControl_Clock . ClockControl" 

width="200" height="200"> 

<param name="Hour" value="14"> 

<param name= "Minute" value="35"> 
</ob j ect> 

<br> 
<br> 



158 flporpaMnpaHe 3a .NET Framework (tom 2) 



Hour : <input 


type="t 


ext" id= 


"hour"Xbr> 




Minute 


<input type= 


"text" i 


d="minute"xbr> 


<input 


type= 


= "button 


" value= 


"Update the 


clock" 


onclick=' 


Chang 


eText ( ) 


â– > 






</body> 












</html> 













KaK pa6oTM npnMepi>T? 

HeKa pa3r/ieAaMe no-noflpo6HO OTAe/iHMTe nacm Ha HTML CTpaHnuaTa. Hpe3 
HTML Tara <object> BMtKBaMe b crpaHi/iuaTa HaiuaTa KOHTpo/ia. ToBa e 
4acoBHMK"bT, komto cb3flafloxMe b npeAHWHWfl npuMep. ATpn6yT"bT id, KOMTO 

MMa CTOMHOCT clockContol, yKa3Ba MfleHTMCpMKaTOp, 4pe3 KOMTO LUe MO>KeM 

Aa AOCTtnBaMe o6eKTa b HTML crpaHkiuaTa, a aTpn6yTMTe width v\ height 
yKa3BaT c KaKBa ujupnHa v\ BkiconwHa Aa ce M3o6pa3M tom. ATpw6yTbT classid 
onpeAe/ia K/iaca Ha BMtKBaHMa o6eKT. B c/iynaa TOBa e HaiuaTa ciockcontroi 
KOHTpo/ia. 3a6e/ie>KeTe, ne yKa3BaMe aceM6/ikiTO, npocrpaHCTBOTO v\ MMeTO Ha 
K/iaca b CTOMHOcrra Ha to3m aTpn6yT. B c/iynaa CMe nocraBki/iki aceM6/iMTO 

Demo-18-CustomControl-Clock.exe B AHpeKTOpMflTa, B KOflTO ce HaMMpa M 

HTML CTpaHnuaTa. Hpe3 TaroBeTe <param> 3aAaBaMe ctomhoctm 3a CBOMCTBa- 
Ta Ha M3o6pa3ABaHaTa KOHTpo/ia. 

rioA KOHTpo^aTa CMe nocraBi/i/iki ABe TeKCTOBM no/ieTa v\ ep,v\u 6yTOH. TeKcro- 
BMTe no/ieTa cnywaT 3a B"bBe>KAaHe Ha nac v\ MMHyTn, komto p,a noKa3Ba na- 
coBHMK"bT. ByTOHtT cnyww 3a npoMAHa Ha crpe/iKkiTe Ha nacoBHkiKa. ripi/i Ha- 
TMCKaHeTO My ce M3BHKBa JavaScript cpyHKui/mTa changeText ( ) , AecpMHupaHa 
b Hana/iOTO Ha crpaHkiuaTa, koato npoMeHfl CBOMCTBaTa Ha KOHTpo/iaTa. 
flocTbn"bT ao TeKCTOBMTe no/ieTa v\ p,o KOHTpo/iaTa ce M3B"bpujBa nocpeACTBOM 
TexHMTe MAeHTMCpMKaTopn, 3aAaAeHM npe3 aTpn6yTa id. 

npnMep"bT B AeMCTBMe 

3a Aa bmamm pe3y/iTaTa ot HaiuaTa pa6oTa, Tpa6Ba Aa M3no/i3BaMe Internet 
Explorer 5.5 v\nv\ no-HOB. He e i/i3BecreH Apyr ye6 6pay3"bp, komto noAA"bp>Ka 
Windows Forms kohtpo/im. 

Ako otbopmm AnpeKTHO index.html b Internet Explorer, KOHTpo/iaTa 
ciockcontroi HflMa Aa ce 3apeAM 3apaAn no/iMTMKaTa 3a curypHOCT, koato He 
no3BO/iflBa /iOKa/iHO pa3no/io>KeHi/i HTML AOKyMeHTM Aa ki3n"b/iH*iBaT Windows 
Forms kohtpo/im. Heo6xoAHMO e CTpaHnuaTa Aa 6"bAe ny6/ikiKyBaHa Ha HAKa- 
kbb ye6 ctpBtp, HanpuMep IIS. 

HeKa cpaw/iOBeTe hm ce HaMnpaT b nanKaTa Demo-19-custom-controis-in- 
ie. riy6^MKyBaHeTO Ha nanKaTa b Internet Information Services (IIS) ce 
M3B"bpiuBa no cneAHkifl HanwH: 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM wHTepdjefic c Windows Forms 159 
1. Ot CBOMCTBaTa Ha nanKaTa Demo-19-Custom-Controls-in-IE, flOCTbnHkl 

ot flua^oroBaTa kytma Ha Windows Explorer, M36npaMe Ta6a "web 

Sharing". B Hero M36npaMe "Share this folder". 



Demo- 19-Custom-Controls-in-IE Properties 



General | Sharing | Security Web Sharing | Customize | 

Internet Information Services 
Share on: (Default Web Site _J 



* 



Do not share this folder 
r f~ Share this folder — 
Aliases 



Add. 



- 



Edit Properties... 



Remove 






OK 



] 



Cancel 



Apply 



2. ny6/im<yBaMe nanKaTa Internet Information Services, KaTO no3BO/ii/iM 
neTeHe Ha cpai/i/iOBeTe v\ j\v\cyv\hv Ha flupeKTopnnTe. 



Directory: 
Alias: 



CAMS Content and CurriculurrAPPTVLecture-14-Wind 



p emo-1 9-Custom-Controls-in-l E 



â– Access permissions - 
W Read 
r Write 



V Script source access 
5 ['iiedoiybn: ng 



■Application permissions — 
C None 
(• Scripts 
C~ Execute [includes scripts) 



OK 



] 



Cancel 



Cera MOxeM p,a otbopmm c Internet Explorer URL aflpeca Ha npuMepa ot 
ny6/im<yBaHaTa b IIS AHpeicropi/m: 



http: //local host/Demo- 19-Custom-Controls-in -IE/index, htm I 



160 nporpaMnpaHe 3a .NET Framework (tom 2) 

me no/iynkiM cneRHwn pe3y/iTaT: 



3 http://localhost/Demo-19-Custom-Contt j ols-in-IE/indeH.html - Microsoft In 



â–  mi x 



File Edit View Favorites Tools Help 



,^J Back - ) " *5 ^] ^ Search %^ Fa â„¢ rite5 ^ Media ^ 



Address | e] http://localhost/Demo-19-Custom-Controls-in-IE/index,html 



3IH' 



Links 



Clock Control in IE 




Houq 
Minuted 



_ 



Update the clock 



Ako BtBeAeM nac v\ MMHyTa v\ HaTMCHeM 6yTOHa, crpe/iKMTe me npoMeHAT 
MecTono/ic»KeHi/ieTO cm. 

Hmlukm m Windows Forms 

npoA"b/i>KMTe/iHMTe onepaunki b Windows Forms npi/i/io>KeHi/mTa Tpa6Ba p,a ce 
M3n"b/iHflBaT b OTAe^Ha HMUJKa. B npoTMBeH c/iy^aw ce no/iynaBa "3acnnBaHe" 
Ha noTpe6kiTe/iCKkifl MHTepcpekic. KaK MO>KeM p,a M3no/i3BaMe hmlukm, me 
pa3MeAaMe i"ioapo6ho b TeMaTa " Mhotohmlukobo nporpaMMpaHe m cmhxpohm- 
3auMa ", ho 3acera MOxeM p,a cuMTaMe, ne HMiuKMTe no3BO/i*iBaT napa/ie/iHO 
M3n"b^HeHMe Ha nporpaMeH koa b HaujMTe npM/io>KeHMfl. 

fla B3eMeM 3a npMMep onepauMHTa "M3Ter/iflHe Ha cpaM/i ot MHTepHeT". Tn 
MO>Ke Aa OTHeMe ot hako/iko ceKyHAM ao hako/iko naca m e HeAonycTMMO 
npM^o>KeHMeTO Aa 6/iOKMpa, aoioto M3Ter/iHHeTO Ha cJaaM/ia He npMK/iionM. B 
TaKtB c/iynaM Tpa6Ba Aa M3n"b/iHMM 3aAanaTa b Apyra hmluio (thread) m ot 
BpeMe Ha BpeMe Aa noKa3BaMe Ha noTpe6MTe/i*i MHAMKauMa 3a HanpeAt>Ka, 
HanpMMep npe3 KOHTpo/iaTa ProgressBar. MMa o6ane eAMH npo6/ieM, CB"bp3aH 
c AOCTbna ao noTpe6MTe/iCKM*i MHTepcpeMC npM pa6oTa c hmlukm. 

06HOBHBaHeTO Ha noTpe6MTe/iCKM*i MHTepcpeMC Ha AaAeHa KOHTpo/ia Tpa6Ba 
Aa CTaBa caMO ot HMLUKaTa, b koato pa6oTM KOHTpo/iaTa. Ot Apyra HMLUKa 
6e3onacHO MoraT Aa ce M3BMKBaT caMO MeTOAMTe invoke o, Begininvoke ( ) , 

Endlnvoke ( ) M CreateGraphics ( ) . 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM MHTepdjeiic c Windows Forms 161 



& 



HuKora He o6HOB$iBaMTe Windows Forms kohtpo/im ot 
HMixiKa, kohto He rv\ npirrewaBa! 



3a M3n"b^HeHne Ha MeTOflu ot HMUJKaTa, koato npi/ueaoBa aaaeHa KOHTpo/ia, 
M3no^3BaMe MeToaa invoke (...) Ha K/iaca control. Eto npuMep: 



delegate void StringParamDelegate ( string aValue); 

class Forml : System. Windows . Forms . Form 

{ 

private void UpdateUI ( string aValue) 

{ 

// Update UI here ... 

// This code is called from the Forml ' s thread 
} 

void AsynchronousOperation ( ) 

{ 

// This runs in separate thread. Invoke UI update 
this . Invoke (new StringParamDelegate (UpdateUI ) , 
new ob j ect [ ] { "H^KaK'BB napaMeTtp" ) ) ; 
} 
} 



no T03i/i HanwH HMiuKaTa, koato M3B"bpujBa BpeMeoTHeMaiuaTa pa6oTa, pa6oTM 
napa/ie/iHO Ha HMiuKaTa, kohto ynpaB/iflBa noTpe6i/iTe/iCKMfl MHTepcpeMC, ho 
tom ce o6HOBABa caMO ot HeroBaTa HMUJKa-co6cTBeHMK. Ako o6HOB*iBaMe 
noTpe6nTe^CKMfl MHTepcpewc ot HMiuKaTa, koato M3B"bpujBa BpeMeoTHeMaiuaTa 
onepaunfl, a He ot r/iaBHaTa hmluio Ha npn/io>i<eHMeTO, ce no/iynaBaT mhoto 
CTpaHHM ecpeKTM - ot "3aBMCBaHe" Ha npn^OKeHneTO ao HeonaKBaHM 
M3K^K)4eHMfl m cucTeMHM rpewKM. He ro npaBeTe! 

ll3nosi3BaHe Ha hmlukm b Windows Forms 
npiiJio>KeHiin - npuMep 

C HacTOfliunfl npuMep me M/uocrpMpaMe M3no/i3BaHeTO Ha hmlukm (threads) b 
Windows Forms npM/io>KeHMfl 3a M3n"b/iHeHMe Ha BpeMeoTHeMaiuM 3aAanM. IHe 
noKaxeM npaBM/iHMfl HanMH, no komto eAHa HMiuKa, koato ce M3n"b/iHHBa 
napa/ie/iHO c r/iaBHaTa HMiuKa Ha Windows Forms npM/io>KeHMeTO, MO>Ke aa 
o6HOBABa HeroBMfl noTpe6MTe/iCKM MHTepcpeMC. 

ripM^o>KeHMeTO, KoeTO me cb3flafleM, me TbpcM npocTM nMC/ia (KoeTO e BpeMe- 
OTHeMaiua onepauMa) m me vv\ noKa3Ba Ha noTpe6MTe/ifl. TtpceHeTO me ce 
M3B"bpujBa b OTae/iHa, napa/ie/iHO M3n"b/iHflBama ce hmluio, 3a p,a He 
"3acnMBa" noTpe6MTe/iCKM*iT MHTepcpeMC. 

Eto CTbnKMTe 3a M3rpa>KflaHe Ha HaiueTO npM/io>KeHMe: 

1. CrapTMpaMe VS.NET m cb3AaBaMe hob Windows Forms npoeicr. 



162 nporpaMnpaHe 3a .NET Framework (tom 2) 

2. 3aflaBaMe Ha r/iaBHaTa cpopMa MMe MainForm v\ 3ar/iaBkie "Asynchronos 

UI Update Demo". llpOMeHflMe M MMeTO Ha Cpai/i/ia OT Forml.cs Ha 
MainForm . cs . 

3. flo6aBAMe bbb cpopMaTa flBa 6yTOHa c MMeHa Buttonstart v\ Buttonstop 

M eflMH TextBox C HMe TextBoxLastPrimeNumber. Ha CBOMCTBaTa Text 

Ha 6yTOHMTe 3aAaBaMe cbOTBeTHO ctomhoctm start v\ stop. 3aAaBaMe 

CTOMHOCT false Ha CBOMCTBOTO Enabled Ha 6yTOHa ButtonStop. 

4. flo6aBAMe npoMeH/ii/iBa 3a HMUJKaTa, koato rbpcn npocTM nwc/ia: 



private Thread mPrimeNumbersFinderThread = null; 



5. fleK/iapwpaMe Renerar, komto me M3no/i3BaMe npn M3BMKBaHeTO Ha 
MeTOAa invoke (...), KoraTO o6HOBABaMe noTpe6kiTe/iCKkifl MHTepcpekic: 



delegate void LongParameterDelegate (long aValue); 



6. flecpMHkipaMe K/iac PrimeNumberFinder, npe3 KOMTO me TbpCklM npoCTM 
4nc/ia b MHTepBa/ia [0; 1 000 000 000]: 



class PrimeNumbersFinder 

{ 

private MainForm mMainForm; 

public PrimeNumbersFinder (MainForm aMainForm) 

{ 

mMainForm = aMainForm; 

} 

public void FindPrimeNumbers ( ) 

{ 

for (long number=0; number<1000000000; number++) 

{ 

if ( IsPrime (number ) ) 

{ 

mMainForm. Invoke ( 

new LongParameterDelegate (mMainForm. ShowPrimeNumber) , 

new ob j ect []{ number } 

); 

} 
} 
} 

private bool IsPrime (long aNumber) 

{ 

// Primarity testing. Very ineffective. 
// Don't do it in a real case! ! ! 
for (long i=2; i<aNumber; i++) 
{ 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM MHTepcpetfc c Windows Forms 163 





// 


Just waste 


some 


CPU 


time 




in 


t sum = 


0; 










for (int 


w=0; 


w<100000; 


W++) 




{ 


sum += 


w; 










} 














if 


(aNumb 


er % 


i == 


0) 






{ 
















return 


false; 








} 












} 














re 


turn true 










} 














} 















rioHewe TbpceHeTO Ha npocTM ni/icna me ce M3BtpujBa b OTfle/iHa HMUJKa, b 
K/iaca CMe flecpMHupa^n npoMeH/ikiBa mMainForm, npe3 koato me ce o6p"biuaMe 
KtM r/iaBHaTa cpopMa, 3a fla o6HOB*iBaMe noTpe6kiTe/iCKi/ifl MHTepcpewc. Ta3M 
npoMeH^MBa ce i/iHi/iu,i/ia/ii/i3kipa b KOHCTpyKTopa Ha K/iaca. 

MeTOfltT isPrime(...) npoBepyiBa p,anv\ noflafleHOTO KaTO napaMerbp nwcno e 
npocro. Ta3M npoBepKa HaponHO ce npaBM no M3K/iK>ni/iTe/iHO BpeMeoTHeMaiu, 
HeecpeKTMBeH v\ HaTOBapBaiu npouecopa Hani/m, 3a fla ce CMMy/iwpa 3a6aBHHe. 

MeTOfltT FindPrimeNumbers ( ) npOBepflBa nOC/ieflOBaTe/lHO fla/lkl e npoCTO 
bcako ot 4kic/iaTa b MHTepBa^a ot flo 1000000000. Ako hmcjioto e npocro, 
npe3 MaBHaTa HMUJKa Ha npn^OKeHneTO ce M3BMKBa MeTOfltT 
showPrimeNiunber ( ... ) , KaTO My ce noflaBa KaTO napaMeTbp HaMepeHOTO npoc- 
to nwcno. To3M MeTOfl noKa3Ba hmc/ioto b noTpe6wTe/iCKi/m MHTepcpewc. 
M3BMKBaHeTO ce M3B"bpujBa npe3 MeTOfla invoke (...) Ha cpopMaTa, komto MMa 
rpn>KaTa fla ki3n"b/iHi/i noflafleHna My .qe/ieraT npe3 HMUJKaTa, b koato pa6oTM 
cpopMaTa. 

HnujKaTa, koato Tbpcn npocTM nwc/ia, H^Ma npaBO fla npoMeHfl flupeKTHO 
noTpe6nTe^CKMfl MHTepcpewc Ha npM/io>KeHMeTO, 3aiuoTO tom pa6oTM b flpyra 
HMiuKa. Ako flBe hmujkm pa6oTAT c noTpe6kiTe/iCKMfl MHTepcpekic eflHOBpeMeH- 
ho, MoraT fla B"b3HMKHaT HenpeflBMflMMM npo6/ieMki - 6/iOKkipaHe Ha npw/io>Ke- 

HkieTO, CTpaHHM M3K/lK>HeHkm M/1M CTpaHHM BM3ya/lHkl eCpeKTM. 

7. flecpMHupaMe b r/iaBHaTa cpopMa MeTOfla showPrimeNuniber(...) , komto 
noKa3Ba noflafleHOTO My KaTO napaMeTbp nwcno b t6kctoboto no/ie 

TextBoxLas tPrimeNumber : 



internal void ShowPrimeNumber (long aNumber) 

{ 

TextBoxLastPrimeNumber . Text = aNumber . ToString () ; 

} 



164 



flporpaMnpaHe 3a .NET Framework (tom 2) 



8. flo6aBAMe o6pa6oTni/iK Ha C"b6nTneTO click Ha 6yTOHa Buttonstart. B 
Hero fleaKTMBupaMe start 6yTOHa, aKTMBupaMe 6yTOHa stop v\ crap - â„¢- 
paMe OTfle^Ha HMUJKa, b koato 3anonBaMe fla TbpcuM npocTM nwc/ia: 



private void ButtonStart_Click (ob j ect sender, System. EventArgs e) 

{ 

ButtonStart . Enabled = false; 

ButtonStop . Enabled = true; 

PrimeNumbersFinder finder = new PrimeNumbersFinder (this ) ; 

mPrimeNumbersFinderThread = 

new Thread (new ThreadStart ( finder . FindPrimeNumbers )) ; 

mPrimeNumbersFinderThread. Start ( ) ; 
} 



9. flo6aBAMe o6pa6oTni/iK Ha Cb6i/iTkieT0 click Ha 6yT0Ha ButtonStop. B 
Hero aKTMBupaMe start 6yT0Ha, AeaKTMBupaMe 6yT0Ha stop v\ npeKpa- 
TABaMe M3n"b^HeHneT0 Ha crapTi/ipaHaTa HMUJKa: 



private void ButtonStop_Click (ob j ect sender, System. EventArgs e) 

{ 

ButtonStart . Enabled = true; 

ButtonStop . Enabled = false; 

mPrimeNumbersFinderThread. Abort ( ) ; 
} 



10. flo6aBAMe o6pa6o"mi/iK Ha cb6kiTi/ieTO closing Ha r/iaBHaTa cpopMa. B 
Hero npeKpaTABaMe M3n"b/iHeHi/ieTO Ha HMUJKaTa, rbpceiua npocTM nwcna 
(b cnynaw ne e 6w/ia crapTkipaHa): 



private void MainForm_Closing ( ob j ect sender, 
System. ComponentModel . CancelEventArgs e) 

{ 

if (mPrimeNumbersFinderThread != null) 



{ 



mPrimeNumbersFinderThread. Abort 



11. flpn/ioxeHneTO e totobo m motom p,a ro crapTwpaMe v\ TecTBaMe. 



Asynchronous UI Upda 




HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM wHTepdjefic c Windows Forms 165 

BtnpeKM ne ce M3B"bpujBa Te>KKO ki3HkicneHkie v\ npouecopvr e HaTOBapeH Ha 
100%, noTpe6i/iTe/iCKkiflT MHTepcpewc He "3aMp"b3Ba". Ako Bee naK b flafleH 
MOMeHT ce no/iynw 3aMp"b3BaHe 3a KpaTKO BpeMe, Haw-BepoHTHO npwuwHaTa 3a 
TOBa e BK^K)4BaHeTO Ha cwcreMaTa 3a nonwcrBaHe Ha naMeTTa (Garbage 
Collector). 

B/ianeHe (Drag and Drop) 

Pea/iM3aun5Tra Ha "B/ia^eHe v\ nycKaHe" (drag and drop) b Windows Forms 
npn^OKeHne ce M3B"bpujBa npe3 o6pa6oTBaHeTO Ha nopeflwua ot cb6kiTi/m. 

B c"b6nTneTO MouseDown Ha KOHTpo/iaTa, ot koato 3ano4Ba B/ianeHeTO, Tpa6Ba 
fla M3BMKaMe MeTOfla DoDragDrop(...) , 3a fla KonnpaMe flaHHkiTe, komto me 

B/iaHMM. 

3a fla flafleM bbsmokhoct Ha KOHTpo/ia fla no/iynaBa ashhh npn B/ianeHe, 
Tpa6Ba fla 3aflafleM ctomhoct true Ha cbomctboto m AiiowDrop v\ Tpa6Ba fla 

npMXBaHeM Cb6wTMflTa DragEnter M DragDrop. ripn 06pa60TKa Ha DragEnter 

Tpa6Ba fla npoBepaBaMe cpopMaTa Ha MflBaiunTe flaHHM v\ fla no3BO/i*iBaMe v\nv\ 
3a6paHABaMe no/iynaBaHeTO mm. Ta3M npoBepKa MOweM fla M3BtpujMM npe3 

MeTOfla DragEventArgs . Data . GetDataPresent (...) . B Cb6klTMeTO DragDrop 

Tpa6Ba fla o6pa6oTBaMe no/iyneHMTe flaHHM. Mo>KeM fla rn w3B/innaMe 

nOCpeflCTBOM MeTOfla DragEventArgs. Data. Ge tData (...) . 

B/ianeHe vx nycKaHe b Windows Forms - npiiMep 

HacTOfliflMfl npuMep w/uocrpkipa KaK etc cpeflCTBaTa Ha Windows Forms MoraT 
fla 6"bflaT pea^M3npaHM npw/iOKeHkisi, komto M3no/i3BaT Drag-and-Drop TexHO- 
/lori/iflTa (B/ianeHe v\ nycKaHe Ha o6eKTM ot eflHa KOHTpo/ia kbm flpyra). 

ripn^oKeHneTO, KoeTO me c"b3flafleM, me cbfltpwa flBe kohtpo/im - eflHaTa me 
ce M3no/i3Ba KaTO m3T04hmk npn B/ianeHeTO, a flpyraTa KaTO no/iynaTe/i. 

Eto m CTbnKMTe 3a M3rpa>KflaHe Ha HaiueTO npi/i/io>KeHkie: 

1. CTapTupaMe VS.NET v\ cb3flaBaMe hob Windows Forms npoeicr. 

2. 3aflaBaMe Ha r/iaBHaTa cpopMa MMe MainForm v\ 3ar/iaBMe "Drag and 
Drop Demo". ripoMeHAMe m MMeTO Ha cpaw/ia c HeMHua cope koa ot 

Forml.cs HaMainForm.es. 

3. flo6aBAMe bbb cpopMaTa flBe ListBox kohtpo/im c MMeHa ListBoxSource 
m ListBoxTarget. Te me 6"bflaT ctOTBeTHO M3T04HMK m no/iynaTe/i npn 
B/ianeHeTO. 

4. 3aflaBaMe 3a cbomctboto items Ha ListBoxSource cnncbK ot MMeHa Ha 
rpaflOBe - co$hh, njioBflWB, BapHa, ... 

5. flo6aBflMe 06pa60THMK Ha Cb6klTkieT0 MouseDown Ha ListBoxSource. B 

Hero HaMnpaMe M36paHMfl e/ieMeHT ot cnncbKa v\ M3BMKBaMe MeTOfla 
DoDragDrop(...) , c KoeTO aKTMBupaMe B/ianeHeTO. Ha MeTOfla noflaBaMe 
KaTO ntpBM napaMeTtp flaHHMTe, a KaTO btopm - ctomhoct ot M36poeHMfl 



166 nporpaMnpaHe 3a .NET Framework (tom 2) 

Tun DragDropEffects, yi<a3Bama KaicbB p,a e pe3y/iTarbT ot B/ianeineTO 
- b Haujufl cnynaw e KonnpaHe: 



private void ListBoxSource_MouseDown (ob j ect sender, 
System. Windows . Forms .MouseEventArgs e) 

{ 

Point mouseLocation = new Point (e.X, e.Y); 
int selectedlndex = 

ListBoxSource . IndexFromPoint (mouseLocation) ; 
if (selectedlndex != -1) 

{ 

string data = (string) ListBoxSource . Items [ selectedlndex] ; 

ListBoxSource . DoDragDrop (data, DragDropEffects . Copy) ; 
} 



6. 3aflaBaMe Ha CBOMCTBOTO AllowDrop Ha ListBoxTarget CTOMHOCT true. 

7. flo6aBflMe 06pa60THklK Ha Cb6klTkieTO DragEnter Ha ListBoxTarget. B 

Hero npoBepaBaMe fla/iw B/ianeHWAT o6eKT e Unicode ci/iMBO/ieH hm3 m 
cbOTBeTHO no3BO/iflBaMe v\nv\ 3a6paHABaMe nycKaHeTO My: 



private void ListBoxTarget_DragEnter (ob j ect sender, 
System. Windows . Forms . DragEventArgs e) 

{ 

if (e . Data . GetDataPresent (Data Formats . UnicodeText ) 

{ 

e. Effect = DragDropEf f ects . Copy; 

} 
} 



8. flo6aBflMe 06pa60THklK Ha Cb6klTkieTO DragDrop Ha ListBoxTarget. B 
Hero i/i3B/innaMe HM3a v\ ro o6pa6oTBaMe: 



private void ListBoxTarget_DragDrop (ob j ect sender, 
System. Windows . Forms . DragEventArgs e) 

{ 

string data = 

( string) e . Data . GetData (Data Formats . UnicodeText) ; 

ListBoxTarget . Items .Add (data) ; 
} 



9. npi/i/io>KeHi/ieTO e totobo m MO>xeM ,qa ro crapTkipaMe v\ TecTBaMe, KaTO 
3aB/ieneM hako/iko rpafla ot cnnc"bKa-M3T04HHK b cnwcbKa-no/iynaTe/i. 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM MHTepdjeiic c Windows Forms 167 




KoHcjDMrypaMMOHeH 4>aM/i Ha npu/ioweHMeTO 

.NET Framework npM/ioxeHMHTa MoraT fla M3no/i3BaT KOHCpurypaunoHeH 
cpai/i/i, 3a fla neTaT Hacrpoi/iKMTe cm. Tom npeflcraB/iABa o6mkhob6h XML cpaM/i: 



App . conf ig 



'utf- 



?> 



<?xml version="l . 0" encoding= 

<conf iguration> 

<appSettings> 

<add key="username" value="BaM MBaH" /> 
<add key="language" value="US-EN" /> 
</appSettings> 
</conf iguration> 



B Tara <appsettings> MoraT fla ce Ao6aB*iT KOHCpMrypau,MOHHM napaMeTpM Ha 
npM/io>KeHMeTO, komto npeflcraB/iHBaT abomkm ot k/ikdh m ctomhoct. HacrpoM- 
KMTe ot KOHCpMrypau,MOHHMfl cpai/i/i MoraT fla 6"bflaT M3B/iMnaHM no BpeMe Ha 
M3n"b/iHeHMe no cneflHMfl HanMH: 



string username = System. Conf iguration . 

Conf igurationSettings . AppSettings [ "username" '_ 
/ / username = "Bail MBaH" 



Ot VS.NET MO>xeM fla flo6aBMM KOHCpMrypauMOHeH cpai/i/i KaTO M36epeM File | 
Add New Item... | Application configuration file | App. conf ig. ripM 
KOMnM^aUMfl App.config ce KOnMpa nOfl MMe <WMe_Ha_npoeKTa . exe . conf ig>. 



M3BJ1liHaHe Ha HaCTpOMKM OT KOHCjDMrypaMMOHeH CjDaM/1 

- npMMep 

HaCTOfllflMflT npMMep M/lKDCTpMpa KaK MO>KeM fla M3B/lMHaMe HaCTpOMKM OT 

KOHCpMrypauMOHHMfl cpai/i/i Ha npM/io>KeHMeTO. IHe cb3flafleM npM/io>KeHMe, 

KOeTO M3B/lMHa CTOMHOCT OT CBOfl KOHCpMrypauMOHeH CpaM/1 M a noKa3Ba. 



168 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Eto m CTtnKMTe Ha M3rpa>KflaHe Ha HaiueTO npw/io>KeHkie: 

1. CTapTupaMe VS.NET v\ cb3AaBaMe hob Windows Forms npoeicr. 

2. 3aAaBaMe Ha r/iaBHaTa cpopMa MMe MainForm v\ 3amaBHe "config File 

Demo". npOMeHflMe M MMeTO Ha CpaM/ia OT Forml . cs HaMainForm.es. 

3. flo6aBflMe B"bB CpOpMaTa ep,V\U TextBox C MMe TextBoxUserName v\ ep,v\u 
6yT0H C MMe ButtonReadUserName. 3aflaBaMe Ha CBOMCTBOTO Text Ha 
6yT0Ha CTOMHOCT "Read user name from config file". 

4. flo6aBAMe KOHCpurypaunoHeH cpaw/i Ha npi/i/io>KeHi/ieTO, ioto M36npaMe 

File | Add New Item... | Application configuration file | 

App. config. B Hero Ao6aBAMe hob KOHCpurypaunoHeH napaMerbp c 

K/1KDH username M CTOMHOCT "Saw MBaH" : 



App . config 



<?xml version="l. 0" encoding="utf-8 " ?> 
<conf iguration> 

<appSettings> 

<add key="username" value="BaM MBaH" /> 

</appSettings> 
</conf iguration> 



5. flo6aBflMe 06pa60THklK Ha Cb6wTkieT0 Click Ha ButtonReadUserName. B 
Hero M3B/imHaMe CTOMHOCTTa Ha napaMerbpa username v\ n noi<a3BaMe b 
TeKCTOBOTO no/ie: 



private void ButtonReadUserName_Click (ob j ect sender, 
System. EventArgs e) 

{ 

TextBoxUserName . Text = System. Configuration . 

Conf igurationSettings . AppSettings [ "username" ] ; 
} 



6. npn/io>KeHi/ieTO e totobo m M0>KeM fla ro crapTkipaMe v\ TecTBaMe: 



r Config File Demo 



r User name: |Ea^i Me 
Reed usei 



Reed user nanre from conlig file 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM m-rrepcfeiic c Windows Forms 169 

Ynpa>KHeHii5i 

1. KaKBO npeACTaB^ABa 6n6^MOTeKaTa Windows Forms? KaKBa cpyHKUMOHa/i- 
hoct npeflocraBfl? Kora ce M3no/i3Ba? 

2. KaKBO e KOMnoHeHT? KaKBO npeAcraB/iflBa KOMnoHeHTHMAT MOAe/i .NET 
Framework? KaKBO e xapaKTepHO 3a Hero? 

3. OnwujeTe nporpaMHua MOAe/i Ha Windows Forms. KaKBa cpyHKUMOHa/iHOcr 
pea^M3npa tom? 

4. Kom ca Haw-Ba>KHMTe K/iacoBe ot Windows Forms? Kom ca Haw-Ba>KHMTe mm 

MeTOAM M CBOMCTBa? 

5. KaKBO e xapaKTepHO 3a bcmukm Windows Forms kohtpo/im? Kom ca o6iuMTe 

MM MeTOAM M CBOMCTBa? 

6. KaKBO e xapaKTepHO 3a cpopMMTe b Windows Forms? KaKBM CBOMCTBa m 

C"b6MTMfl MMaT Te? 

7. KaK ce nocraBHT kohtpo/im b AaAeHa cpopMa? KaK ce npMXBaiuaT cb6v\Tv\a, 
nopoAeHM ot AaAeHa KOHTpo/ia? 

8. Pea^M3MpaMTe Windows Forms npM/ioweHMe, KoeTO npeAcraB/iHBa 
onpocTeH BapMaHT Ha craHAapTHMfl Ka/iKy/iaTop b Windows. Ka/iKy/iaTopvr 
Tpa6Ba as noAA"bp>Ka ocHOBHMTe apMTMeTM^HM onepauMM c ue/iM m pea/iHM 

HMC/ia. 

9. Ctc cpeACTBaTa Ha Windows Forms pea/iM3MpaMTe MrpaTa "XBaHM 6flraiuMa 
6yTOH". MrpaTa npeAcraB/isiBa eAHa cpopMa, b koato MMa eAMH 6yTOH etc 
3ar/iaBHe "HaTMCHM Me". npM npM6/iM>KaBaHe Ha Kypcopa Ha MMiuKaTa b 
6/im30ct ao 6yTOHa tom Tpa6Ba Aa "6ara ot Hero" (Aa ce npeMecTBa Ha 
Apyro MflCTO BtB dpopMaTa, B"b3MO>KHO no-Aa/iene ot Kypcopa Ha MMiu- 
KaTa). 

lO.Cbc cpeACTBaTa Ha Windows Forms pea/iM3MpaMTe npocTa MHCpopMauMOH- 
Ha CMCTeMa 3a ynpaB/ieHMe Ha K/iMeHTMTe Ha AaAeHa cpMpMa. CMcreMaTa 
Tpa6Ba Aa BM3ya^M3Mpa cnMCtK ot k/imchtm (ListBox) m Aa no3BO/iHBa 
Ao6aBAHe, peAaKTMpaHe m M3TpMBaHe Ha K/iMeHTM. BceKM k/imcht e m/im 
KDpMAM^ecKO v\nv\ cpM3M4ecKO nv\u,e. KDpMAM^ecKMTe nv\u,a ce OnMCBaT c 
HaMMeHOBaHMe, bma (ET, Afl, OOfl, CApy>KeHMe, ...), EyncraT, AaHtneH 
HOMep, aApec, Te/iecpOH, email, ye6 caMT m MO/1 (komto e cpM3M4ecKO 
ziMue). OM3M4ecKMTe nv\u,a ce onMCBaT c MMe, npe3MMe, cpaMM/iMfl, no/i, 
ETH, AaHHM 3a ziMUHa KapTa, aApec, Te/iecpOH m email. ripM/io>KeHMeTO 
Tpa6Ba Aa ce cbctom ot 3 dpopMM - r^aBHa cpopMa, cbAtpwama K/iMeHTMTe, 
cpopMa 3a B"bBe>KAaHe/peAaKUMfl Ha topMAMnecKO nv\u,e m cpopMa 3a 
B"bBe>KAaHe/peAaKUMfl Ha cpM3MnecKO nwu,e. M3no/i3BaMTe noAxoA^iuM 
Windows Forms kohtpo/im bbb cpopMMTe. flaHHMTe Tpa6Ba Aa ce neTaT m 
3anMCBaT b XML cpaM/i. 

ll.Ctc cpeACTBaTa Ha Windows Forms pea/iM3MpaMTe cneuMa/iM3MpaH peAaK- 
Top 3a 6m6/imot6km c TeKCTOBM AOKyMeHTM. EAHa 6M6^MOTeKa npeACTaB- 
nnBa cbBKynHOcr ot TeKCTOBM AOKyMeHTM, opraHM3MpaHM a^pbobmaho B 



170 nporpaMnpaHe 3a .NET Framework (tom 2) 

nanKki. B eflHa nani<a MO>Ke fla MMa flOKyMeHTki v\ flpyrw nanKM (no,qo6HO 
Ha cpaw/iOBaTa cwcreMa Ha Windows). BceKM flOKyMeHT npeflcraB/iflBa 
HAKaKtB TeKCT c cpopMaTwpaHe. PeAaKToptT Tpa6Ba fla MO>Ke fla cb3flaBa 
6n6^MOTeKM, fla neTe/3anwcBa 6w6/iMOTeKki ot/b XML cpai/i/i. KoraTO e otbo- 
peHa flafleHa 6n6/ikiOTeKa, peflaKToptT Tpa6Ba fla no3BO/iflBa peflaKTupaHe 
Ha flOKyMeHTMTe b Hea (npoMHHa Ha TeKcra v\ cpopMaTupaHeTO Ha OTfle/iHM 
cpparMeHTM ot Hero), KaKTO v\ ct3flaBaHe/n3TpnBaHe/npenMeHyBaHe Ha 
nanKM v\ flOKyMeHTM. 3a fltpBOTO c nanKMTe Tpa6Ba fla ce w3no/i3Ba 

KOHTpO/iaTa TreeView, a 3a aKTMBHMfl flOKyMeHT - RichEdit. PeflaKToptT 

Tpa6Ba fla pa3no/iara c naflaiuo MeHK), 2 koht6kcthm MeHKrra (3a fltpBOTO 
c nanKkiTe v\ 3a no/ieTO 3a peflaKTupaHe Ha flOKyMeHT), 3 /ieHTM c 
MHCTpyMeHTM (3a OTBapflHe/3anncBaHe Ha 6ki6/ii/iOTei<a, 3a pa6oTa c 
fltpBOTO c nanKMTe v\ 3a cpopMaTupaHe Ha aKTMBHua b MOMeHTa flOKyMeHT), 
CTaTyc zieHTa v\ noflxoflaiun KpaTKM K/iaBi/iwki 3a no-Ba>KHMTe KOMaHflM. 
Pea^M3npaMTe v\ TbpceHe v\ 3aMeHAHe Ha TeKCT b flOKyMeHTMTe. 

12. HanniueTe Windows Forms npi/i/io>KeHi/ie, b KoeTO ce B"bBe>Kfla MHCpopMa- 
Ui/m 3a cpM3M4ecKO nv\\\e (MMe, npe3MMe, cpaMM/ii/m, ETH, aflpec, Te/iecpOH, 
email, /lkmeH cawT) v\ BtBefleHOTO ce 3anncBa b XML cpai/i/i. Pea/iM3npai/iTe 
Ba^Mflaunfl Ha bcako eflHO ot no/ieTaTa v\ Ha ua/iaTa cpopMa, KaTO i/i3no/i- 
3BaTe noflxoflfliflu pery^apHM M3pa3M. 

13.C"bc cpeflCTBaTa Ha Windows Forms v\ npocTOTO CB"bp3BaHe Ha flaHHM 
(simple data binding) pea/ii/i3kipaMTe npw/io>KeHi/ie 3a ynpaB/ieHkie Ha 
npocTa cucTeMa c i/mcpopMaukm 3a rpaflOBe v\ fltpwaBM. BcyiKa fltpxaBa ce 
onucBa c MMe, e3MK, Hace/ieHi/ie, HauwoHa/ieH cp/iar v\ cnwcbK ot rpaflOBe. 
BceKM rpafl ce onucBa c MMe, Hace/ieHwe v\ fltpxaBa. Tpa6Ba fla ce 
pea/iM3kipa HaBurauna no rpaflOBeTe v\ fltpxaBMTe v\ peflaKuna Ha MHCpop- 
MaunflTa 3a tax, KaTO He ce i/i3no/i3BaT cnwcbUHki kohtpo/ii/i, a caMO 
TeKCTOBM no/ieTa v\ npocTO CBtp3BaHe. fla ce pea/iw3wpa neTeHe v\ 3annc- 
BaHe Ha flaHHMTe b XML cpaw/i. 

14.C"bc cpeflCTBaTa Ha Windows Forms v\ c/io>khoto CB"bp3BaHe Ha flaHHM 
(complex data binding) pea/iM3npaMTe cwcreMa, noflo6Ha Ha ci/icreMaTa 3a 
ynpaB/ieHwe Ha MHCpopMauna 3a rpaflOBe v\ fltpwaBi/i. flo6aBeTe kbm 
cucTeMaTa cnwcbK ot kohtmh6htm 3a BC^Ka fltpwaBa. 3a BM3ya/iM3aui/mTa 
m HaBuraunflTa M3no/i3BakiTe Ta6/ikiui/i (DataGrid) v\ cni/icbUHM kohtpo/ii/i. 
Pea^M3npaMTe npeflxoflHOTO npw/io>KeHi/ie, KaTO cbxpaHsiBaTe flaHHMTe He 
b XML cpaw/i, a b pe/iaui/iOHHa 6a3a ot flaHHM (Hanp. MS SQL Server). 
M3no/i3BaMTe pa3KaneHi/m MOfle/i 3a flocTbn ao flaHHMTe (disconnected 
model), KaTO pea/iM3kipaTe b"B3mo>khoct 3a pa3peiuaBaHe Ha KOHCp/ikiKTMTe, 
komto B"b3HMKBaT npw pa6oTa c mhoto noTpe6nTe^n eflHOBpeMeHHO. 

15.C"b3flaMTe Windows Forms npi/i/io>KeHi/ie, c KoeTO MoraT fla ce B"bBe>KflaT 
flaHHM 3a cpM3M4ecKM m KipuflM^ecKM j\v\\\a. On3M4ecKMTe /lwua ce onucBaT 
c MMe, ETH, aflpec, Te^ecpOH, email v\ ye6 caMT. lOpufln^ecKUTe j\vu\a ce 
onucBaT c HanMeHOBaHne, bma (ET, Afl, OOfl, cflpy>KeHne, ...), By^CTaT, 
flaHt^eH HOMep, aflpec, Te^ecpOH, email, ye6 caMT v\ MO/1 (MMe v\ ETH Ha 
cpM3M4ecKO nwu,e). M3no/i3BaMTe Hac/iefl^BaHe Ha cpopMM, KaTO OTfle/iMTe b 
6a30Ba cpopMa o6iunTe e/ieMeHTki Ha noTpe6nTe^CKMfl MHTepcpeMC v\ 



HnaBa 15. M3rpa>KflaHe Ha noTpe6nTe/iCKM wHTepdjefic c Windows Forms 171 

o6iunTe no/ieTa ot cpopMMTe 3a B"bBe>KflaHe Ha cpki3i/mecKki v\ topkiflkmecKw 
/ikiu,a. 

16. Pea^M3npaMTe Windows Forms npn^OKeHne, KoeTO no eweflHeBHMTe 
AaHHM ot flafleHO TexHkmecKO M3MepBaHe 3a flafleH nepwofl (TeKCTOB cpaw/i 
c \\ei\v\ no/io>KkiTe/iHM nwcna) BM3ya/iM3i/ipa rpacpwuHO pe3y/iTaTkiTe ioto 
peAnua ot npaBOtrb^HM CTb/i6oBe. ripn o6eMHM ashhh ocurypeTe B"b3MO>K- 
hoct 3a CKpo/iwpaHe Ha rpacpMKaTa. 

17.Cbc cpeflCTBaTa Ha Windows Forms pea/iki3kipaMTe nrpaTa "mopckm ujax" 
(b KBaApaTHa fltCKa c pa3Mepn 3 Ha 3 ce nocraBsiT ny/iOBe "X" v\ "0"). 
MrpauBT Tpa6Ba fla Moxe fla nrpae cpeiuy KOMniOTbpa b 2 pe>KMMa: 
"KOMnK)T"bp"bT nrpae onTWMa/iHo" v\ "KOMnK>Tbp"bT nrpae xaoTMUHO (cnynaw- 
ho)". OcurypeTe noflxoflama BM3ya/in3aunfl v\ MHTepaKTMBHOCT Ha nrpaTa. 

18. Pea^M3npaMTe Windows Forms MDI npw/io>KeHi/ie, KoeTO MO>Ke fla OTBapa 
cpai/i/iOBe c rpacpi/mHw M3o6pa>KeHi/m (gif, jpg, png) v\ MO>xe fla vv\ npeopa3- 
MepyiBa i/i fla vv\ 3anncBa b flpyr cpai/i/i. 

19. Pea^M3npaMTe Windows Forms npn^oxeHne, KoeTO noKa3Ba flafleH 
TeKCTOB cpaw/i, KaTO BM3ya^M3npa BceKM HeroB pefl etc cneuwa/ieH ecpeKT: 
BCAKa 6yKBa ntpBOHana/iHO ce noyiBflBa Ha cnynaMHO macto bbb cpopMaTa 
m 3ano4Ba fla ce npnflBM>KBa aHMMnpaHO kbm mhctoto cm. 3a 2 ceKyHflu 
BCAKa 6yKBa Tpa6Ba fla cm e Ha mactoto. C/ie,q M3naKBaHe ot 1 ceKyHfla ce 
npeMMHaBa kbm c/ieflBamwyi pefl ot BxoflHMfl cpai/i/i. 

20.C"bc cpeflCTBaTa Ha Windows Forms pea/iki3kipaMTe npocT TeKCTOB peflaK- 
Top, komto MO>Ke fla OTBapa cpaw^OBe c B/ianeHe ot Windows Explorer. 

21. HacnefleTe KOHTpo/iaTa TextBox v\ c"b3flaMTe noTpe6i/iTe/iCKa KOHTpo/ia 
NiunberTextBox, KOATO no3BO/iHBa BtBexflaHe caMO Ha ni/ic/ia. 

22.HanpaBeTe Windows Forms noTpe6kiTe/iCKa KOHTpo/ia HourMinuteBox, 
koato ce cbCTOM ot 2 NumericUpDown no/ieTa m no3BO/isiBa B"bBe>KflaHe Ha 
nac m Mi/myTa b MHTepBa/ia [0:00 - 23:59]. 

23. Pea/i M3M pa MTe Windows Forms noTpe6kiTe/iCKa KOHTpo/ia "3ap4e", koato 
npeflCTaB^ABa KBaflpaT, b komto MoraT fla ce i/i3o6pa3HBaT rpacpwuHO 
ctomhoctm ot 1 flo 6 (iokto ca npw CTaHflapTHMTe 3apneTa npn hakom 
nrpn). KoHTpo/iaTa Tpa6Ba fla pea/iki3kipa co6cTBeHO M3nepTaBaHe v\ 
cbomctbo "value" 3a 3aflaBaHe Ha TeKymaTa ctomhoct. 

24. C noMOiflTa Ha KOHTpo/iaTa "3ap4e" pea^M3npaMTe vwpara "cbcre3aHMe": 
flBaMa nrpa^n nrpa^T noc/ieflOBaTe/iHO. ripn BceKM xoa wrpanvr, komto e 
Ha xofl, xBtp/ifl 2 3apneTa (reHepupaT ce c/iynai/iHi/i ctomhoctm) m MecTM 
TO/iKOBa CTtnKM, ko/ikoto e cyMaTa ot xBtp/ieHMTe 3apoBe. riene/ii/i 
ntpBMflT, komto npeMi/me cyMaTa 50. Pea/iki3wpakiTe noflxoflaiua BH3ya/iw- 
3aunfl Ha no3MunflTa Ha flBaMaTa kirpanw Ha xBtp/ieHMTe 3apoBe. 

25. Pea^M3npaMTe nrpaTa "c-bCTe3aHne" KaTO Windows Forms KOHTpo^a v\ n 
xocmeTe b Internet Explorer, i/i3no/i3BaMKM noflxoflaiua ye6 CTpaHM^Ka. 
XBtp^AHeTO Ha 3apoBeTe M3BMKBaMTe c JavaScript npn HaTMCKaHe Ha 
6yTOH ot ye6 CTpaHnuaTa. 



172 nporpaMnpaHe 3a .NET Framework (tom 2) 

26.Cbc cpeflCTBaTa Ha Windows Forms pea/iw3wpaMTe npn^OKeHne, KoeTO 
Tbpcw TeKCT BtB BCM4KM cpai/i/iOBe b AafleHa flupeKTopufl. rioHewe Tbpce- 
HeTO e 6aBHa onepauna, pea/ii/i3i/ipai/iTe a b OTfle/iHa Hi/iuiKa. ripn HaMnpa- 
He Ha TeKCTa Ao6aBflMTe cpaw/ia v\ OTMecTBaHeTO, Ha KoeTO e HaMepeH, b 
ListBox KOHTpo/ia npe3 r/iaBHaTa HMUJKa Ha npw/io>KeHkieTO, ioto i/i3no/i- 
3BaTe invoke o MeTOAa Ha cpopMaTa. Pea^M3npaMTe bbsmokhoct 3a npe- 
KpaTABaHe Ha TbpceHeTO. Pea^M3npaMTe noflxoA^iua Bi/i3ya/in3au.nyi npn 
LUpaKBaHe Btpxy HAKoe ot HaMepeHMTe cbBnafleHna b pe3y/iTaTa. 

27. Pea^M3npaMTe Windows Forms npi/i/io>KeHi/ie, KoeTO cbAtpwa eAHa TeKCTO- 
Ba KOHTpo/ia, CTOMHOCTTa Ha koato ce 3ape>Kfla ot KOHCpurypaunoHHUfl 
XML cpai/i/i Ha npw/io>KeHkieTO. ripn M3xofl ot npw/io>KeHi/ieTO CTOMHOCTra Ha 
Ta3M KOHTpo/ia Tpa6Ba p,a ce 3ana3Ba o6paTHO b KOHCpurypaunoHHua 
cpai/i/i. 3a neTeHe ot KOHCpurypaunoHHua cpai/i/i M3no/i3Bai/iTe system. 

Configuration. Conf igurationSettings . AppSettings, a 33 nucaHe B 
Hero M3no^3BaMTe DOM napcepa Ha .NET Framework. 

M3no/i3BaHa /liuepaTypa 

1. CBeT^MH HaKOB, rpacpwueH noTpe6i/iTe/iCKi/i MHTepcpewc c Windows Forms - 
http://www.nakov.com/dotnet/lectures/l_ecture-14-Windows-Forms- 
vl.O.ppt 

2. MSDN Library - http://msdn.microsoft.com 

3. Microsoft Windows Forms QuickStarts Tutorial - 
http://www.csharpfriends.com/quickstart/winforms/doc/default.aspx 

4. Marj Rempel, Kenneth S. Lind, Marjorie Rempel, MCAD/MCSD Visual C# 
.NET Certification All-in-One Exam Guide, McGraw-Hill, 2002, ISBN 
0072224436 

5. MSDN Library, Event Handling in Windows Forms - http://msdn. 
microsoft.com/library/en-us/vbcon/html/vbconeventhandlinq.asp 

6. Threading in Windows Forms - 
http://www.yoda.arachsys.com/csharp/threads/winforms.shtml 

7. J. Fosler, Windows Forms Painting: Best Practices - 
http://www.martnet.com/~ifosler/articles/WindowsFormsPaintinq.htm 



T/iaea 16. M3rpa>KflaHe Ha 
ye6 npM/io>KeHMyi c ASP.NET 



ABTOpii 

Mwxan/i Ctomhob 
Poc/iaH BopucoB 
CTec|DaH flo6peB 
fleflH Bap^eB 
MBaH MuTeB 
Xpmcto fleiueB 

Heo6xoflMMM 3HaHMn 

- 5a30BM no3HaHkifl 3a e3MKa C# 

- Ba30BM no3HaHMfl 3a apxnTeKTypaTa Ha .NET Framework 

- 5a30BM no3HaHMfl no 1/lHTepHeT TexHO/iorww 

- HTTP (Hyper Text Transfer Protocol) 

- HTML (Hyper Text Markup Language) 

- no3HaHMfl 3a apxnTeKTypaTa Ha ye6 6a3npaHMTe npn^OKeHna 

ClafllapMOHMe 

- BtBeAeHne 

- Ye6 c|DopMM 

- Kohtpo^m 

- M3n"b/iHkiM koa Ha ye6 c|dopmm v\ kohtpo/im (code-behind) 

- C"b6MTMfl 

- npoc^eAflBaHe v\ Ae6"brBaHe 

- Ba/iMAau.Mfl Ha ashhh 

- Pa6oTa c 6a3M ot ashhm 

- YnpaB/ieHkie Ha cbCTOAHneTO 

- 0nTMMM3aunfl, KOHCJDMrypauMfl m pa3rp"biuaHe 

- CurypHOCT 



174 nporpaMnpaHe 3a .NET Framework (tom 2) 

B Ta3M TeMa ... 

B HacroflLuaTa TeMa me pa3r/ieAaMe pa3pa6oTKaTa Ha ye6 npn^OKeHMa c 
ASP.NET. B Hana/iOTO me 3ano3HaeM nwjajenn c ye6 cpopMMTe v\ TexHMTe 
ochobhm AnpeKTMBM, aTpn6yTw m TaroBe. IHe pa3MeAaMe BMAOBeTe ye6 
kohtpo^m, komto ce w3no/i3BaT npw M3rpa>KAaHe Ha ye6 npw/io>KeHi/m, v\ no- 
Ba>KHMTe ot tax. l_Ue pa3r/ieAaMe KOHuenunaTa 3a OTp,ens\ue Ha KOAa ot 
noTpe6nTe^CKMfl MHTepcpewc (code-behind), me o6achmm nporpaMHi/m MOAe/i 
Ha ASP.NET v\ pa6oTaTa etc ch6v\Tv\n. Cnep, TOBa me AeMOHCTpupaMe KaK p,a 
pa6oTMM c ashhh, i/i3B/ieneHi/i ot pe^aunoHHa 6a3a ot ashhu. IHe o6"bpHeM 
cneuwa/iHO BHMMaHne Ha npuHunnnTe Ha CBtp3BaHe Ha kohtpo/im c ashhh 
(data binding) v\ me o6achmm KaK p,a CBtp3BaMe cnwcbUHM v\ MTepupamn 
kohtpo^m. IHe pa3r/ieAaMe KaK MO>KeM p,a ynpaB/iflBaMe BvrpeujHOTO cbcrofl- 
Hue Ha ye6 npw/io>KeHkieTo: pa6oTa etc cecnn v\ cookies, Aocrtn ao KOHTeKCTa 
Ha npw/io>KeHi/ieTO v\ TexHO/iori/mTa ViewState. IHe noKaxeM KaK Aa Ba/iMAnpa- 
Me ashhh, BtBeAeHM ot noTpe6kiTe/ifl, npe3 pa3/ikmHMTe Ba/ikiAaTopw. IHe 
o6achmm KOHuenunflTa 3a noTpe6i/iTe/iCKHTe kohtpo/im KaTO MeTOA 3a npen3- 
no/i3BaHe Ha nacm ot npi/i/ioweHi/ieTO. IHe ce HaynwM KaK Aa npocneAflBaMe v\ 
Ae6"brBaMe ye6 npw/io>KeHkifl. IHe noKa>KeM KaK ce onTMMH3npaT, KOHCpury- 
pupaT m pa3rp"bmaT ASP.NET ye6 npw/io>KeHi/ifl (KeiunpaHe, HacrpoMKM v\ 
deployment). IHe o6"bpHeM cneuwa/iHO BHMMaHne v\ Ha curypHOCTTa npn ye6 
npn^o>KeHMflTa. 



T/iaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



175 



B-bBefleHkie 

ASP.NET e 6ki6/iwoTeKa 3a pa3pa6oTKa Ha ye6 npM/io>KeHMfl v\ ye6 ycnyrw, 
craHflapTHa nacr ot .NET Framework. Ta flaBa nporpaMeH MOAe/i v\ CbBKyn- 
hoct ot TexHO^ornn, npe3 komto MO>KeM p,a M3rpa>KAaMe c^o>khm ye6 npw/io- 

>KeHMfl. 

l/l3ni3jiHeHMe Ha ASP.NET ye6 npu/iomeHMe 

Ye6 npn^o>KeHMflTa M3no/i3BaT MOAe/ia 3aaBKa-OTroBop (request-response), 
KaKTO e noi<a3aHO Ha cpurypaTa: 




Web Client 



Internet 



web Server 



1. noTpe6i/iTe/i*iT B"bBe>KAa b 6pay3tpa aApec Ha CTpaHnua (URL). 
5pay3"bp"bT M3npaiua HTTP 3a*iBKa (request) KbM ye6 CbpBtpa. 

2. CtpBtptT no/iynaBa 3aaBKaTa v\ n o6pa6oTBa. B cnynaa c ASP.NET, IIS 
HaMupa npou.ec, komto MO>xe p,a o6pa6oTM AaAeHaTa 3a*iBKa. 

3. Pe3y^TaT"bT ot Bene o6pa6oTeHaTa 3aaBKa ce M3npaiua o6paTHO KbM 
noTpe6nTe^fl/K^neHTa noA cpopMaTa Ha HTTP OTroBop (response). 

4. 5pay3"bp"bT noKa3Ba no/iyneHkifl OTroBop KaTO ye6 CTpaHnua. 



nper/iefl Ha TexHO/iorwflTa ASP.NET 

ASP.NET e nporpaMHa n/iaTCpopMa 3a pa3pa6oTKa Ha ye6 npM/io>KeHMfl, npeAO- 
CTaBeHa ot .NET Framework. Ta npeA.nara cbBKynHOCT ot K/iacoBe, komto 
pa6oTHT ctBMecTHO, 3a Aa o6c/iy>KBaT HTTP 3aaBKM. Cbmo KaTO K/iacwnecKMTe 
ASP (Active Server Pages), ASP.NET ce i/i3n-b/iH5iBa Ha ye6 ctpBtp v\ npeAO- 
CTaBfl B"b3MO>KHOCT 3a pa3pa6oTKa Ha MHTepaKTMBHM, AHHaMM^HM, nepcoHa/iw- 
3npaHM ye6 caMTOBe, KaKTO v\ Ha ye6 6a3npaHM npw/io>KeHkifl. ASP.NET e Cbu\o 
n n/iaTCpopMa 3a pa3pa6oTKa v\ ki3no/i3BaHe Ha ye6 ycnyrw. 

ASP.NET v\ .NET Framewrok 

Ha cpurypaTa ca noKa3aHM ocHOBHMTe KOMnoHeHTM Ha .NET Framework, nacr 
ot komto e 61/16/11/iOTeKaTa ASP.NET. 



176 flporpaMnpaHe 3a .NET Framework (tom 2) 



Visual Basic 



C++ 



C# 



Perl 



Python 



Web Services 



User Interface 



A5P.NET 



1 



ADO.NET and XML 



.NET Framework Class Library 



C 



Common Language Runtime 



Message 
Queuing 



COM+ 

(Transactions, Partitions, 

Object Pooling) 





Win32 



Pa3/iMKii Me>Kfly ASP m ASP.NET 

Pa3^MKMTe Me>Kfly ASP v\ ASP.NET ca 3Ha4HTe/iHM. ASP.NET npefl/iara hobo 
hmbo Ha a6cTpaKunfl 3a pa3pa6oTKa Ha ye6 npi/i/io>KeHi/ifl. K/iionoBa xapaKTe- 
pucTMKa Ha ASP.NET e B"b3M0>KH0CTTa 3a pa3,qe/iyiHe Ha KOfla onucBaiu 
AM3aMHa ot KOfla, pea/ii/i3kipam /iorm<aTa Ha npi/i/io>KeHi/mTa. ASP.NET npn/io- 
xeHMflTa MoraT fla 6"bflaT pa3pa6oTBaHM c noMOLirra Ha bci/iukm e3nun 3a 
nporpaMnpaHe, komto ce KOMnw/iwpaT flo MSIL koa (C#, VB.NET, J#, Managed 
C++ m mhoto flpyrn). 



OyHaaMeHTM Ha ASP.NET 

Ochobhmat KOMnoHeHT Ha ASP.NET e ye6 cpopMaTa - a6cTpaKunsq Ha HTML 
CTpaHnuaTa, kohto MHTepHeT noTpe6MTe/ii/iTe BM>KflaT b 6pay3"bpa cm. 3aMM- 
cb/itT Ha cb3AaTe/ii/iTe Ha ASP.NET e pa6oTaTa c ye6 cpopMMTe fla 6tfle MHTyn- 
TMBHa m MaKCMMa^HO y/iecHeHa, KaKTO e npn Windows Forms cpopMMTe. 
ASP.NET npefl/iara eflHO bmcoko hmbo Ha a6cTpaKUMfl, npeflOCTaBAMKM hm 
6oraT M36op ot ye6 kohtpo/im, noflo6HM Ha Te3M b Windows Forms, v\ HaMa- 
nnBa Hy>KflaTa nporpaMkicra fla pa6oTM c hmct HTML koa. 



T/iaBa 16. H3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



177 



3 register 



«5 £& 

^Back - 
Address hi 



Resisti 

Email: 



ConfmuPa 



Sutirriil 



-gQeone 



File Edit 
Address ^]i 



3 register Microsoft Internet Explorer 



Sub sen 



Email Adcirr 



Submit 



5j Luin 



File E*t Vtaw FavnrltK Tool! Help 9f 

QfBa*. » ..J Search S V Farorte ^ Media 
idr.-*« Sjhttpv/localhostjBenefitsWe/register.asptf V | fl Gn IH« * 



Update Registration 

First Nome : 



Lh:i Hitie: 



Addtiti: 



Cityar.dStaU: 



Sip Code: 



Subrr.it 



£]Done 



^j Lcial intranet 



Bcako ASP.NET npn^OKeHne ce M3rpa>Kfla ot eflHa v\nv\ noBene ye6 cpopMM, 
komto MoraT p,a B3an.MOAewcTBaT noMe>KAy cm, cb3AaBafiKn. MHTepaKTMBHa 
cucTeMa. 



KaK pa6oTM ASP.NET? 



TpaAMUMOHHMTe ye6 CTpaHnun MoraT p,a i/i3n"b/ii-mBaT koa Ha K/iweHTa, c komto 
n.3B"bpwBaT cpaBHMTe^HO npocTM onepaunn. 




ASP.NET ye6 cpopMMTe MoraT p,a i/i3n"b/iHHBaT v\ koa ot CTpaHa Ha CbpBtpa 
(server-side code). C Hero Te reHepupaT HTML koa, komto p.a ce BtpHe KaTO 
OTroBop Ha 3aaBKaTa. 3a ue/iTa MoraT p,a ce M3B"bpujBaT o6pa6oTKM, 
M3MCKBaiun AOCTtn ao 6a3M ot ashhm n. ao pecypcwTe Ha caMi/ia ctpBtp, 
reHepupaiun AOirb/iHkiTe/iHki ye6 cpopMn. v\ Apyrn. 



178 



flporpaMnpaHe 3a .NET Framework (tom 2) 





BcflKa ye6 cpopMa b Kpai/iHa CMeTKa ce TpaHCCpopMupa b HTML koa, npwroAeH 
3a Tuna Ha K/ii/ieHTCKkifl 6pay3"bp. ToBa no3BO/i*iBa y/iecHeHa pa3pa6oTKa Ha 
ye6 cpopMM. Te pa6oTHT npaKTi/mecKki Btpxy bchko ycrpowcTBO, KoeTO pa3no- 
/iara c MHTepHeT CB"bp3aHOCT v\ ye6 6pay3"bp. 



£ 





[9 



Pa3fle/ifiHe Ha BH3yann3auiMq ot 6n3Hec sioruKa 

Eahh ot ocHOBHMTe npo6/ieMM Ha K/iacwuecKkiTe ASP 6eiue CMecBaHeTO Ha 
HTML c 6n3Hec ziorkiKa. ToBa npaBeiue crpaHkiuaTa TpyAHa 3a pa36npaHe, 
noAAP"b>KKa m Ae6"brBaHe. Oaw/iOBeTe CTaBaxa ro/ieMki v\ c/io>khm m ce 
3a6aBfliue npoueca Ha pa3pa6oTKa Ha npM/io>KeHMeTO. EAHa ot ocHOBHMTe 
apxnTeKTypHM ue/iw Ha ASP.NET e cnpaBAHeTO c T03M npo6/ieM. Tbfi KaTO 
pea^M3aunflTa Ha noTpe6i/iTe/iCKkifl MHTepcpewc v\ Ha 6n3Hec ziorwKa ca ao 
ro/iflMa creneH, ABe He3aBMCMMM 3aAann, ASP.NET npeAOcraBa MOAe/i 3a 
pa3pa6oTKa, npn komto Te ca cpki3i/mecKki pa3Ae/ieHki b ojp,enuv\ cpaw^OBe. 

riporpaMnpaHeTO 3a K/iweHTCKWfl MHTepcpewc (UI) ce pa3Ae/ia Ha ABe nacm: 

- 3a BM3ya/iM3aunfl ce i/i3no/i3Ba HTML-noAo6eH koa, 3anncaH bbb cpaw/i c 
pa3LunpeHMe .aspx. 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 179 

- Bn3Hec /lormoTa ce flecpMHupa b OTRenen cpaw/i (c pa3UJnpeHne .cs 3a 
C# v\nv\ .vb 3a Visual Basic .NET), cbfl"bp>Kaiu KOHKpeTHaTa MMn/ieMeH- 
Taukifl Ha onpefle^eH nporpaMeH e3MK. 

OaM/i"bT, cbfl"bp>Kaiu 6n3Hec ziorwKaTa, ce Hapwua "M3n"b/iHkiM koa Ha ye6 
cpopMaTa" (Code-behind). 

3afl BCflKa ye6 cpopMa ctom 6oraTMflT o6eKTeH MOAe/i Ha .NET Framework v\ ta 
ce KOMrm/inpa p,o K/iac b aceM6/ii/iTO Ha npoeKTa hm. 

K/iacbT, reHepupaH ot .aspx cpaw/i, ce HenpsiK Hac/ieAHi/iK Ha Page K/iaca. 
CbmecTByBa Me>KAHHeH K/iac b wepapxnaTa, komto e 3a M3n"b/iHMMi/m koa 
(code-behind class). B Hero MO>xeM ziecHO p,a Ao6aBAMe MeTOAH, o6pa6oTKa Ha 

C"b6MTMfl M AP- 




System. Web . UI . Page) 



t 



^JebForml . aspx . cs) 

t 



^WebForml . aspx^ 



Hpe3 "i/i3n"b/iHMMMfl koa" npeACTaBAHeTO e pa3Ae/ieHO ot /iori/iKaTa. ToBa 
y/iecHABa 3Hani/iTe/iHO noAAPt>>KKaTa Ha .aspx CTpaHnunTe. 

KoMnoHeHTM Ha ASP.NET 

Eto kom ca ocHOBHMTe KOMnoHeHTM, ot komto ce M3rpa>KAaT ye6 
npn^o>KeHMflTa, 6a3npaHM Ha ASP.NET: 

01 web Forms - onucBaT MHTepcpewca 3a ASP.NET npn^OKeHne. 

m code-behind KJiacoBe - acounnpaT ce c ye6 CpopMM M KOHTpo/lkl M Cb- 
AtpxaT server-side koa. 

[§l web.config - cpai/i/i, C"bA"bp>Kaiu KOHCpurypaunflTa Ha ASP.NET npw/io- 
>KeHneTO. 

IS Machine . config - Cpafi/l C r/106a/lHM HaCTpOMKM 3a ye6 ctpBtpa. 

@L Global. asax - cpaw/i, c"bA"bp>Kaiu koa 3a npuxBaiuaHe Ha ch6v\Tv\n Ha 
hi/ibo npi/i/io>KeHi/ie (application level events). 

CbLUeCTByBaT H APyrM KOMnOHeHTM KaTO Http Modules, Http Handlers M 

Apyrn, ho Ha tax HflMa as ce cnnpaMe. 



180 



flporpaMnpaHe 3a .NET Framework (tom 2) 



npiiMep 3a ye6 npiiJioweHiie 



IHe cb3flafleM npuMepHO ye6 npw/io>KeHkie npe3 Visual Studio.NET, 3a fla 
pa3MeAaMe CTpyKTypaTa Ha AnpeKTopnnTe v\ cpaw/iOBeTe My. OTBap^Me Visual 
Studio.NET v\ Cb3flaBaMe hob ye6 npoeicr c MMe Demo-l- 
ExampleOf WebApplication : 



New Project 



Project Types: 



Templates : 



C~\ Business Intelligence Projects 

C~\ Visual Basic Projects 

Q Visual CS Projects 

â–  C~\ Visual J* Projects 

a-Q Visual C++ Projects 

j- CJ Setup and Deployment Projects 

S-Q Other Projects 

C~\ Visual Studio Solutions 



Dundas 
Diagrammi.. 



Dundas 
Diagrammi.. 



Smart Device 
Application 



IP ip 

ASP. NET Web ASP. NET Web 
Application Service 



ASP.NET 
Mobile W... 



:i 



A project for creating an application with a Web user interface 
Name: | Df 

Location: 



^smpieOftVeb Application 
| http://localhost/Demo-l-ExampleOft' ,, /ebApplication| _r] Browse.. 

Project will be created at http://localhost/Demo-l-ExampleOft' i /ebApplication, 



] 



J. 



Help 



Ot/iabo e KyTMflTa c MHcrpyMeHTi/i 
flo6aBMM TeKCTOBO no/ie v\ 6yT0H, 
cpopMaTa. 



(toolbox), KtAeTO ca KOHTpo/ii/ue. HeKa 
KaTO npwB/ianMM flBeTe kohtpo/im Btpxy 



Demo-l-ExampleOfWebApolication - Microsoft Visual C# .NET [desiqnl - WebForml.aspx* HIbB 


File Edit View Project Build Debug Data Format Table Frames lools Window Help 


| C - ~M ' & U & X % fe ^ * ^ rat | â–º Debug - r# new stude - >> 


1 Toolbox f x | 
Data 

Web Forms 
| ^ Pointer 

A Label 

labi TextBox 

Jt] Button 

M LinkButton 

_^J ImageButton 

A HyperLink 

Hfl DropDownList 

El ListBox 

53 DataGrid 

(P DataList 

M Repeater 

W CheckBox 

aZ CheckBoxList 
Components | â–¼ | 
HTML 

Clipboard Ring 
General 


WebForml.aspx* | < > x 


Solution Explorer - Demo-l-Example... ^ x 


islS jg 


> ±1 


\ 


Si Solution 'Derno-1-ExampleOfWebApr. 
B Demo-1-ExampleOfWebApplic 

ffl- S3 References 

B Assemblylnfb.es 

: £E Global. asax 

© Web.conflg 

H] WebForml.aspx 

.i i A 




:::::::::::: D a ' ' n â– â–  -a :::::::::::::::::::: : 


' ' â–¡ Button â–¡ â–  â–  


w , , „ , , L 






















SJ Solution Explorer | â„¢ Class View | 










Properties Q X 






Buttonl System. Web. Ul.WebContrjj 

m\ U \\m\ | H 
















CssClass £_ 
B Font _ 
ForeColor 
Text Button T 




















Text 

The text to be shown on the button. 










::::::::::::::::::::::::::::::::::::::â–  


% Server E... 3? Toolbox \ 


| a Design | S HTML | 


]ff Properties | O Dynamic Help | 


| Ready 



T/iaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



181 



Mo>KeM fla pa3r/ieflaMe KOfla Ha CTpaHnuaTa (code-behind K/iaca) KaTO Btpxy 
cpopMaTa HaTMCHeM [F7]. 



Demo-1-ExampleOfWebApphcation - Microsoft Visual C# .NET [design] - WebForml.aspx.es* 



_Jfl|x| 



File Edit View Project Build Debug Tools Window Help 
\W'1M'&M® X % fe >o • O" JB H| ► Debug 



» [$ new stude 



WebForml.aspx* WebForml.aspx.es* | 

|*£Derno_l_ExannpleOfWebApplication,Wi_^] |<j>#TextBoxl 



a m\m % J O, 



using System. ComponentModel; 

using System. Data; 

using System. Drawing; 

using System. Web; 

using System. Web . SessionState; 

using System. Web . UI; 

using System. Web . UI . Web Controls; 

using System. Web . UI . HtmlControls; 



namespace Demo 1 ExampleOf UebApplication 



/// <summary> 

/// Summary description for WebForml. 

/// </ summary > 

public class WebForml : System. Web . UI . Page 

{ 

protected System. Web . UI . WebControls . Text Box Te 
protected System. Web . UI . WebControls . Button But 



private void Page Load(object sender. System. EventAi i 

= f ±T 




Solution Explorer - Demo- 1 -Example, , , ^ x 



w Solution 'Derrio-l-ExarnpleOfWeb.^ 
B Demo- 1-ExampleOfWeb Apt 

H" ^ References 
B AssernblyInfo.es 
Si Global. asax 
[lj| Web.config 



Solution Explorer | 2J Class View | 



~3 



Properties | Dynamic Help | 



3^ A 



Ready 



Coll 



MoxeM fla KOMnn^npaMe v\ crapTkipaMe npki/ic»KeHi/ieTO c [Ctrl+F5]. 



3 Web Form T - Microsoft Internet Explorer 



File Edit View Favorites Tools Help jjp 

Qeack - • S [1 fj] Psear* ^Favorites &% 
Address \^\ http://localhost/Demo-l^xarnpleOfWebAppfcation/WebFoiTnl,aspx v| Si Go Links " 



Button 



S^Done 



*J Local intranet 



ASP.NET Web Application npoeKTii bi>b VS.NET 

ripn Cb3flaBaHe Ha npoeKT 3a .NET ye6 npn^OKeHne (ASP.NET Web 
Application) bbb Visual Studio .NET, ce cb3flaBaT flBe flupeKTopnn. 



182 nporpaMnpaHe 3a .NET Framework (tom 2) 

B eflHaTa (no noflpa36npaHe TOBa e \My Documents \ visual studio 
Projects) ce HaMupa solution cpaw/ia (.sin). Tom onucBa npoeKTMTe, yuacr- 
Baiun b npn^OKeHneTO. 06mkhob6ho b noflflnpeKTopnn ce cbxpaH^BaT ocra- 
Ha/iMTe npoeKTM ot solution cpaw/ia. 

BTopaTa AnpeKTopua e c MAeHTMUHO MMe v\ ce c"b3AaBa b ye6-AOCTbnHa nanKa, 
KaTO Haw-necTO TOBa e naniOTa c:\inetpub\wwwroot. Ta cbAtpwa cpaw/iOBe- 
Te, komto ca Hy>KHM Ha ye6 npn^OKeHneTo: . aspx CTpaHnunTe, TexHMTe code- 
behind Cpai/i/lOBe M CpaM/lOBeTe Web.config V\ Global, asax. KoraTO ce KOMnn- 

ziwpa npoeKTa, ce cb3AaBa cbOTBeTHO aceM6/iw b AnpeKTopnaTa bin. 

3a6e/ie>KKa: flupeKTopuflTa c:\inetpub\wwwroot e KopeHHaTa (root) BnpTy- 
a/iHa AnpeKTopua no noApa36npaHe Ha ye6 cbpBtpa Internet Information 
Server (IIS), c komto no noApa36npaHe pa6oTM Visual Studio.NET 3a pa3rp-b- 
maHe Ha npw/io>KeHkiflTa cm. 

BnpTya^Ha AnpeKTopua e TaKaBa, koato ce BM>KAa npe3 npoTOKO/ia HTTP, 
HanpuMep: 

Ako OTBapyiMe ctpBtpa ziOKa/iHO, motom p,a ro M3BMKaMe c aApeca 

http : //localhost/ . 

KaTO HanpaBMM AHpeKTOpwflTa c:\inetpub\wwwroot\Lecture-15-ASP.NET- 
and-Web-Applications\Demo-l-ExampleOfWebApplication, Tfl me ce BM>KAa 
npe3 npoTOKO/ia HTTP KaTO BkipTya/iHaTa AnpeKTopua: 

http: //localhost/Lecture-15-ASP.NET-and-Web-Applications/Demo-l- 
ExampleOfWebApplication/ . 

Mofle/i Ha M3niD/iHeHMe Ha ASP.NET 

MoAe/i-bT Ha M3nt^HeHne (execution model) Ha ASP.NET e cj\ep.Hv\9\T. 

1. K/iweHTCKkiflT 6pay3tp M3npaiua HTTP GET3aaBKa Ha CbpBtpa. 

2. CbpB"bp"bT HaMupa 3a koa crpaHkiua e 3asiBKaTa v\ 3anonBa p,a a H3n"b/i- 
HflBa. 

3. ASP.NET napceptT MHTepnpeTupa HeMHMfl cope koa. 

4. Ako koa^t He e 6w/i KOMnw/ikipaH b aceM6/ii/i, ASP.NET M3BMKBa KOMnn- 
ziaTopa. 

5. CpeAaTa 3a M3n"b/iHeHne (CLR) 3ape>KAa b naMerra v\ M3n"b/iH*iBa 
Microsoft Intermediate Language (MSIL) KOAa. 

6. CTpaHnuaTa ce i/i3n"b/iHHBa v\ reHepupa HTML koa. CtpBtptT Bptiua T03M 
pe3y/iTaT Ha K/iweHTa KaTO HTTP OTroBop. 



T/iaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



183 





Internet Explorer 


% 


â–  


Parser 




Compiler 


i 












r^ 




JuV 






































- 


















Cli 


*nt 


- 


â–  


Memory 


Server 


Assembly Cache 


â–  



Ye6 4>opMii 

ASP.NET ye6 npn^OKeHMATa npeflcraB/iflBaT Haki-o6iuo CbBKynHOCT ot ye6 
cpopMki. HeKa pa3r/ieAaMe KaK motom p,a cb3AaBaMe v\ n3no/i3BaMe ye6 
cpopMM. 

KaKBO e ye6 4>opMa (Web Form)? 

Ye6 cpopMaTa e nporpa mm pyemia ye6 crpaHi/iua. Ta cnywki ioto noTpe6nTe/iCKM 
MHTepcpewc b ASP.NET ye6 npki/io>KeHki5Tra. Ye6 cpopMMTe Cbfl-bpwaT HTML koa 
m kohtpo^m. Te ce i/i3n"b/iHflBaT Ha ye6 cbpBtpa. Haw-necTO TOBa e Microsoft 
Internet Information Server (IIS). Ye6 cpopMMTe BptiuaT KaTO pe3y/iTaT noT- 
pe6nTe^CKM MHTepcpewc, nofl cpopMaTa Ha HTML koa, komto ce M3npaiua Ha 
K/iweHTCKkia 6pay3"bp. 



Ci>3AaBaHe Ha ye6 4>opMa 

OyHKunnTe Ha ye6 cpopMaTa ce flecpMHupaT, KaTO ce i/i3no/i3BaT Tpn HMBa Ha 
aTpn6yTM. 

ATpn6yTMTe Ha @Page flupeKTMBaTa AecpMHupaT r/io6a/iHa cpyHKuwoHa/iHOcr. 
ATpn6yTMTe Ha body Tara flecpMHupaT KaK me ce noKa>Ke eflHa crpaHwua. At- 
pn6yTMTe Ha form Tara AecpMHupaT KaK me ce o6pa6oTHT rpynnTe kohtpo/im. 



<%@ Page 


Language="c#" 










Codebe 


hind="WebForml 


aspx 


cs" 






Inheri 


ts="WebApplicationl 


WebFo 


rml" 


o / 


<html> 













184 flporpaMnpaHe 3a .NET Framework (tom 2) 



<headXtitle>WebForml</title></head> 
<body MS_POSITIONING="GridLayout"> 
<form id="Forml" method="post"> 
<asp: Button . . . ></aspButton> 
</f orm> 
</body> 
</html> 



3a6e/ie>KKa: @Page flupeKTMBaTa e cneuwa/iHa KOHCTpyKuna, ki3no/i3BaHa b 
ASP.NET ye6 cpopMMTe. BtnpeKM Hen b HTML MMa <body> n <form> TaroBe, 
CtlUMTe (KOraTO ca 3anncaHH TaKa <body runat=" server" ...> M <form 
runat=" server" . . . >) wrpaflT no-cneuwa/iHa po/ia b ASP.NET. Te3n 
oco6eHOCTM ca o6flCHeHM b p,ejav\i\v\ no-HaTarbK. 

rioflfltpxaT ce ABa BMAa pa3no/iaraHe Ha HTML e/ieMeHTMTe Ha crpaHwuaTa. 

FlowLayout: HTML o6eKTMTe ce Har/iac*iT no ujnpnHaTa Ha npo3opeua 
Ha 6pay3"bpa. 

GridLayout: HTML o6eKTMTe ca c a6co^K)THM KOopAHHaâ„¢ Ha HTML 
CTpaHkiuaTa. ToBa e CTOMHOcrra no noApa36npaHe. 

flMpeKTMBM 

flnpeKTMBMTe npeAOcraBsiT bbsmokhoct 3a KOHTpo/iwpaHe Ha KOMni/i/iauwyiTa n 
M3n"b^HeHneTO Ha ye6 cpopMaTa. MMeTO Ha BC^Ka AnpeKTMBa 3anonBa c "@" n e 
3arpaAeHO c <% n %> TaroBe. flnpeKTMBMTe MoraT p,a 6"bAaT nocraBeHki 
HaBCflKtAe b .aspx cpaw/ia Ha cpopMaTa, ho o6mkhob6ho ce nocraBflT b 
Hana/iOTO My. HacrpoMKMTe n onunnTe kbm BCflKa AnpeKTMBa ce 3aAaBaT KaTO 
aTpn6yTM. 

Ba>KHM AnpeKTMBn: 

- @Page - r/iaBHa AnpeKTMBa 3a cpopMaTa (no-K"bCHO pa3r/ieAaHa); 

- eimport - B"bBe>KAa AaAeHO npocTpaHCTBO ot MMeHa bbb cpopMaTa; 

- @ implements - yi<a3Ba, ne cpopMaTa {v\nv\ KOHTpo/iaTa) MMn/ieMeHTwpa 
p,ap,eu MHTepcpewc; 

- econtroi - aHa/ior Ha @Page AnpeKTMBaTa (ki3no/i3Ba ce caMO 3a 
noTpe6nTe^CKM kohtpo/im); 

- eoutputcache - KOHTpo/inpa cnoco6HOCTTa 3a KeiunpaHe Ha cpopMMTe; 

- @Register - peri/icrpkipa KOHTpo/ia 3a ynoTpe6a b ye6 cpopMa; 

- @Reference - AeK/iapaTkiBHO yKa3Ba, ne cope cpai/i/ivr Ha Apyra noTpe- 
6nTe^CKa KOHTpo/ia v\nv\ cpopMa Tpa6Ba p,a 6"bAe AHHaMMUHO KOMni/i/iwpaH 
n CBtp3aH c cpopMaTa, b kohto e AeK/iapnpaHa AnpeKTMBaTa. 

Eto eAMH npnMep 3a ki3no/i3BaHe Ha @Page AnpeKTMBaTa: 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 185 



<%@ Page Language="c#" Codebehind="WebForml . aspx . cs" 
Inherit s="WebApplicationl . WebForml"%> 



AiipeKTMBaTa <@Page ...> 

flecpMHupa cneu,ncpM4HM 3a cpopMaTa (.aspx cpaw/i) aTpn6yTM, i/i3no/i3BaHn ot 
napcepa v\ KOMnw/iaTopa Ha ASP.NET. 

Ba>KHM aTpn6yTn: 

- AutoEventwireup - peiuaBa aBTOMaTM^HOTO a6oHnpaHe 3a cb6nTHflTa 
Ha CTpaHnuaTa v\ KOHTpo/iMTe. 

- culture - onpefle^a Ky/uypaTa (perwoHa/iHHTe HacTpoMKn), koato fla ce 
M3no/i3Ba npn o6pa6oTKa Ha flaHHkue. 

- uicuiture - onpe,qe/ifl Ky/uypaTa 3a BMAMMMTe ot noTpe6kiTe/i*i 

TeKCTOBM C"b06lUeHMfl. 

- Debug - onpefle/isi fla^n Ta3M crpaHkiua e KOMnw/ikipaHa c fle6"br 
cmmbo^m (debug symbols). 

- Enabiesessionstate - onpe,qe/ifl fla/ii/i me ce noflfl"bp>Ka cecuflTa. 

- Enabieviewstate - onpefle/ia fla/ii/i me ce M3no^3Ba "view state". 

- ErrorPage - onpefle/ia crpaHkiua, kbm KOATO me ce npeHaco^Ba b 
c/iynaw Ha Heo6pa6oTeHO i/i3K/iioneHMe. 

ATpn6yTM Ha fliipeKTMBaTa <@Page ...> 

Hpe3 M3no^3BaHeTO Ha @Page aTpn6yTM ce flecpMHupaT r/io6a/iHi/i CBoi/icTBa Ha 
ye6 cpopMaTa. TarbT <@ Page> flecpwHkipa cneuncpn^HM 3a CTpaHnuaTa aTpn- 
6yTM. Te ce M3no/i3BaT ot napcepa 3a CTpaHnun Ha ASP.NET v\ KOMnw/iaTopa. 
B flafleH .aspx cpaki/i MO>Ke fla 6"bfle bk/ik>hm caMO eflMH <@ Page>Tar. 

ATpn6yTtT Language flecpMHupa nporpaMHkm e3MK Ha CKpunTa b ye6 crpaHM- 
uaTa. HaM-necro M3no/i3BaHki ca: Visual Basic.NET v\ C#, KaTO ce noflfl"bp>KaT v\ 
Visual J#, JScript.NET v\ t.h. 

ATpn6yT"bT codeBehind C04M KtM code-behind CTpaHnuaTa (cpaw/ia), komto 
cbfl"bp>Ka /iorm<aTa Ha ye6 cpopMaTa. ripn cb3flaBaHa Ha ye6 cpopMa bbb Visual 
Studio.NET (HanpuMep webFormi.aspx), ce cb3flaBa aBTOMaTi/mHO v\ code- 
behind K/iac B"bB Cpai/i/1 C MMe: WebForml . aspx . vb V\I\V\ WebForml.aspx.es. 

ATpn6yTtT smartNavigation b ASP.NET MHCTpyKTkipa 6pay3"bpa fla onpecHABa 
caMO Te3M ceKUMM ot cpopMaTa, komto ca ce npoMeHM/iw. TexHO/iori/isiTa Smart 
Navigation npeMaxBa npeMnrBaHeTO Ha eKpaHa npn onpecHABaHe. Scroll 
no3MunflTa ce 3ana3Ba v\ "last page" b MCTopnaTa ocTaBa ctiuaTa. Smart 
Navigation e flocrbneH caMO 3a no/i3BaTe/ii/i Ha Microsoft Internet Explorer 5 
v\nv\ no-HOB. 



186 



flporpaMnpaHe 3a .NET Framework (tom 2) 



TarbT <form> 

Tarvr <form> flecpMHupa KaK me 6"bflaT o6pa6oTeHM KOHTpo/ikiTe. Tom e 
pa3/ii/meH ot eAHOMMeHHMfl Tar b e3MKa HTML - TyK flecpkiHwpa KOHTeMHep Ha 
KOHTpo/iw 3a ua/iaTa ye6 crpaHi/iua. Ha eflHa ye6 cpopMa MO>xe fla MMa mhoto 
<form> HTML e/ieMeHTki, ho caMO eflMH ot tax MO>xe fla e cbpBtpHa KOHTpo/ia 
b . aspx CTpaHnuaTa. 



HTML CTpaHMLia 


ASP.NET CTpaHMLia (caMO eflHa cpopMa) 


<f orm>...</f orm> 
<f orm>...</f orm> 
<f orm>...</f orm> 


<f orm runat= "server ">...</ form> 
<f orm>...</f orm> 
<f orm>...</f orm> 



BrpafleHM o6eKTM b ASP.NET 

BcflKa CTpaHnua b ASP.NET npw/io>KeHkieTO e HacneflHkiK Ha K/iaca Page, kom- 
to npefl/iara MHO>KecTBO no/ie3Hi/i CBOMCTBa. Cera me M36ponM no-Ba>KHi/iTe, a 
no-KtCHO me pa3r/ieflaMe b Rejawnw Hankma Ha ynoTpe6a Ha noBeneTO ot 
tax: 

- Application (K/iac HttpApplication) - npw/10>KeHI/ie; 

- Session (K/iac HttpSession) - ceCklfl; 

- Request (K/iac HttpRequest) - 3aflBKa; 

- Response (K/iac HttpResponse) - OTrOBOp; 

- Server (K/iac HttpServerUtility) - CbpB"bp; 

- Context (K/iac HttpContex) - KOHTeKCT; 

- Cache (K/iac System. Web. Caching. Cache) - KeilJ. 

Ako MCKaMe fla npenpaTMM i/i3n"b/iHeHweTO kbm flpyra crpaHkma, MOxeM fla 

M3nO/13BaMe flBa MeTOfla: npe3 CBOMCTBaTa Response V\ Server. 

- Response. Redirect ("Login. aspx") - npeHaC0HBaHe OT CTpaHa Ha 

K^neHTa (client redirection). npoMeHsi aflpeca Ha ye6 6pay3tpa. 

- Server. Forward ("WebForml. aspx") - npeHacoHBaHe OT CTpaHa Ha 

cbpB-bpa (server redirection). 3ana3Ba aflpeca Ha ye6 6pay3-bpa. Ha 
npaKTMKa Web 6pay3"bp"bT He pa36npa 3a npeHaconBaHeTO. 



Ye6 KOHTpO/lM 

Ye6 KOHTpo^MTe npeflcraB/iflBaT KOMnoHeHTi/i, ot komto ce M3rpa>KflaT ASP.NET 
ye6 cpopMMTe. Te ce M3n"b/iHABaT Ha ctpBtpa no BpeMe Ha 3ape>KflaHe Ha ye6 
cpopMaTa m ce "peHflnpaT" (TpaHCCpopMnpaT) ao HTML kohtpo/im, komto cnefl 
TOBa ce Bi/i3ya/ii/i3i/ipaT ot K/iweHTCKkifl ye6 6pay3"bp. 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 187 

ASP.NET CbpBl>pHI1 KOHTpO/IM 

ASP.NET ctpB-bpHaTa KOHTpo/ia (ASP.NET server control) e KOMnoHeHT, komto 
ce M3n"b/iHflBa Ha ctpBtpa v\ o6BMBa noTpe6i/iTe/iCKM MHTepcpeMC v\ Apyra 
cpyHKUMOHa/iHOCT. CtpBtpHMTe kohtpo^m ce M3n0^3BaT B ASP.NET CTpaHMUM- 
Te m code-behind K/iacoBeTe. Cpefl tax MMa kohtpo/im 3a 6yTOHM, TeKCTOBM 
no/ieTa (text boxes), naAaiun (drop-down) cnnctun v\ Apyrn. 

Bcm4km server kohtpo/im MMaT aTpn6yTMTe id v\ text, iokto m 
runat=" server" aTpn6yTa. rioc/ieAHkiflT aTpn6yT 03HanaBa, ne ziornKaTa 
(KOAa) Ha KOHTpo/iaTa ce M3n"b/iHABa Ha ctpBtpa, a He npn K/iweHTa, iokto e 
c HTML e^eMeHTMTe. 

CtpBtpHMTe KOHTpO/IM HM ASBaT B"b3MO>KHOCT 3a 06pa60TKa Ha C"b6klTMfl B KOA, 

M3n"b^HABaH Ha cbpBtpa. 06pa6oTHkiK Ha c"b6nTne e npoueAypa, koato ce 
M3n"b/iH*iBa b pe3y/iTaT noTpe6nTe/iCKO AewcTBue (mpaKaHe Ha 6yTOH, cnwcbK 
m ap)- KoAtT, komto ce i/i3n"b/iH*iBa, ce cnara b TaKa HapeneHkiTe c"b6MTMMHM 
(event) npoueAypn. Bue KaTO nporpaMMCT Ha ye6 cpopMM peiuaBaTe KaK p,a 
o6pa6oTBaTe cb6i/iTi/i*iTa Ha cbOTBeTHaTa KOHTpo/ia. 

O6114 MOAe/i Ha ASP.NET cbpBi>pHiiTe kohtpo/im 

B ASP.NET CtpBtpHMTe KOHTpo/ikiTe ca 6a3npaHM Ha o6iu MOAe/i v\ KaTO pe3y/i- 
TaT cnoAe^AT ro/iflM 6pow aTpn6yTM. 

HanpuMep, KoraTO Tpa6Ba p,a ce CMeHM uBeTbT Ha cpOHa Ha KOHTpo/ia, BMHarn 
ce M3no/i3Ba eAHO v\ Cbu\o cbomctboto Backcolor. C/ieAHMHT HTML koa, komto 
onucBa server KOHTpo/ia, noKa3Ba hakom Tunn^HM aTpn6yTn: 



<asp:Button id="Button2" runat="server" BackColor="red" 
Width="238px" Height="25px" Text="Web control"x/asp : Button> 



CneuncpnneH 3a pa3/iMHHMTe 6pay3i>pM HTML koa 

KoraTO eAHa crpaHkiua ce noAroTBa 3a K/iweHTa (rendering), cbpBtpHaTa koh- 
Tpo/ia AOCTaBfl HTML koa, cbo6pa3eH c BMAa Ha 6pay3tpa, noAa/i 3a*iBKaTa. 

HanpuMep, aKO 6pay3"bptT noAAtpwa b"B3mo>khoct 3a neTeHe Ha CKpunT 
(client-side scripting), KaKbBTO e Internet Explorer version 4.0 v\nv\ no-HOBa, 
KOHTpo/ikiTe cb3AaBaT TaKbB K^neHTCKM CKpunT (client-side script), 3a p,a cm 
MMn/ieMeHTwpaT nacr ot cpyHKUkiOHa/iHOcrra AnpeKTHO Ha K/iweHTCKi/m 6pay- 
3"bp. Ako He noAA"bp>Ka K/iweHTCKi/i CKpunT, KOHTpo/ii/iTe cb3AaBaT koa, W3n"b/i- 
HABaH Ha cbpBtpa (server-side koa), komto MMn/ieMeHTupa cbiuaTa cpyHKu.no- 
Ha/iHOCT, ho 3a Aa ce no/iyni/i cbmaTa cpyHKuwoHa/iHOcr ce npaBAT noBene 
3aflBKM ao cbpBtpa. 

C^eAHMAT koa e OTpa3"bK ot ASP.NET ye6 cpopMa, koato me cb3AaAe TeKCTOBO 
no/ie c TeKCT "Enter your Username": 



<asp:TextBox id="Textbox2 " runat="server" Width="238px' 
Height="25px">Enter your Username</asp : TextBox> 



188 nporpaMnpaHe 3a .NET Framework (tom 2) 

KoraTO Ta3M crpaHi/iua ce flocrbriBa ot noTpe6kiTe/i c Internet Explorer 6, cpe- 
AaTa 3a ynpaB/ieHkie (CLR) C"b3AaBa cneRHwn HTML koa: 



<input name="TextBoxl" type="text" value="Enter your Username' 
id="TextBoxl" style="height : 25px; width : 238px" /> 



Server KOHTpo/ii/iTe MoraT p,a reHepupaT pa3/ikmeH HTML koa 3a OTAe/iHMTe 
6pay3"bpn. npuMepHO kohtpo/ibt Panel, boam ao reHepupaHe Ha <div> b 
Internet Explorer 6, a Ha APyrnTe 6pay3"bpn <tabie>. 3a pa3pa6oT4MUMTe 
TOBa CTaBa npo3panHO v\ hm no3BO/iflBa p,a ce KOHueHTpupaMe Btpxy ziorwKaTa 
Ha npn^OKeHneTO. 

HTML cbpBi>pHii kohtpo/im (HTML server controls) 

HTML CbpBtpHMTe kohtpo/im HanoAo6flBaT TpaAnunoHHMTe HTML e/ieMeHTi/i. 

HTML e^eMeHTMTe ce TpeTupaT ot ye6 cpopMaTa KaTO o6mkhob6h TeKCT v\ 
TexHMTe aTpn6yTM He ca p,ocrbuuv\ 3a ctpBtpa. C KOHBepTupaHeTO Ha HTML 
e^eMeHTM kbm HTML server kohtpo/im e B"b3MO>xeH Aocrtna ao TexHMTe 
aTpn6yTM ot server-side koa. ToBa KOHBepTupaHe no3BO/i*iBa KOHTpo/ii/iTe p,a 
MHnunnpaT c"b6nTMfl, komto ce o6pa6oTBaT Ha ctpBtpa. 

HTML server KOHTpo/ikiTe MMMTMpaT HTML e/ieMeHTMTe ci/iHTaKTi/mHO, c pa3/iw- 
KaTa, ne BK/iK>nBaT aTpn6yTa runat=" server". 3a tax MMa M3MCKBaHe p,a ca 

B/10>KeHkl B KOHTeMHep <form "runat=" server" >. . .</form>. HaMkipaT ce B 
npocrpaHCTBOTO OT MMeHa System. Web.UI.HtmlControls. 

HTML CbpBi>pHM kohtpo/im - npMMep 

IHe HanpaBMM ye6 npw/io>KeHkie, b KoeTO me MMa npocTa HTML crpaHwua. 
C/ieA TOBa CTtnKa no crbnKa ot Hea me Cb3AaAeM ye6 cpopMa c HTML koh- 
tpo/im b Hea. 3a 6a3a me ki3no/i3BaMe HTML TaroBeTe ot ntpBOHana/iHaTa 
CTpaHnua. HeKa MMaMe cnep,Hwn koa b HTML crpaHkiuaTa: 



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > 
<html> 
<head> 

<title>Test HTML page</title> 
</head> 
<body> 

<form method="post"> 
Username: <br /> 

<input type="text" name="username" /><br /> 
Password: <br /> 

<input type="text" name="password" /><br /> 
<input type="submit" name="submit" value="submit" /> 
</f orm> 
</body> 
</html> 



ToBa e o6nKHOBeHa HTML cpopMa 3a noTpe6kiTe/iCKO MMe v\ napo/ia. 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 189 

ritpBOTO M3MCKBaHe, 3a fla HanpaBMM Ta3M HTML CTpaHnua ye6 cpopMa, e fla 
flo6aBMM runat=" server" b HTML TaroBeTe 3a B"bBe>KflaHe Ha ashhh (<input 
tvpe="text" ...>), KaKTO m Ha o6rpa>KflaiuaTa rn HTML cpopMa (<form ...>). 

ToBa e flocrarbUHO, 3a fla KOMnw/ikipaMe CTpaHnuaTa KaTO ASP.NET cpopMa. 

Ako MCKaMe fla flo6aBAMe koa flupeKTHO b crpaHkiuaTa, a He b code-behind 
K/iac Tpa6Ba fla flo6aBMM flupeKTMBaTa <%@Page ... %> ioto mmhmmym 
yKaxeM nporpaMHMfl e3MK, komto me ki3no/i3BaMe (C#, Visual Basic.NET, 
Jscript.NET ...). 

Ako MCKaMe fla flocrbriBaMe KOHTpo/iMTe (<input type="text" 
runat=" server" ...>) ot code-behind K/iaca, Tpa6Ba fla mm flo6aBMM v\ MMe, c 

KOeTO fla 6"bflaT flOCTbnBaHkl id="UsernameTextbox". llpOMeH/lklBa C"bC CblflO- 

to MMe Tpa6Ba fla 6"bfle Ha/iwuHa v\ b code-behind CTpaHnuaTa. 

C/iefl BCM4KM Te3M npoMeHM eTO KaK H3Me>Kfla HaiuaTa HOBa ASP.NET crpa- 
Hnua: 



<%@ Page language="C#" AutoEventWireup="f alse" %> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > 

<html> 
<head> 

<title>Test ASP.NET Page</title> 
</head> 
<body> 

<form id="LoginForm" method="post" runat="server"> 
Username: <br/> 

<input type="text" id="TextboxUsername" runat="server" 
name="Username"/xbr /> 
Password: <br /> 

<input type="text" id="TextboxPassword" runat="server" 
name="Password"/xbr /> 

<input type="submit" id="submit" value="submit" 
runat=" server" name=" submit "/> 
</f orm> 
</body> 
</html> 



KoraTO KOMnw/ikipaMe v\ crapTkipaMe HOBaTa hm ye6 cpopMa, tx H3Me>Kfla v\ 
pa6oTM TaKa, KaKTO onaKBaMe: 



190 



flporpaMnpaHe 3a .NET Framework (tom 2) 



lm.)J.LI.ll!IJ.HIJ.I.IJJ.Mim!B,l«IJ'lJIJH.UJl.l,W:H.IJ.l.l.l.U.I 

File Edit View Project Build Debug Table Tools Window Help 
lip' , fil-I*Hfl|jtftl6|«-r"'P'l^l ► Debug 

L,LJJJ.i;j|.M.I^W,IBB«HimBq 



rtt processModel 



Jn|_><l 



File Edit View Favorites Tools Help 



If 



43 Back -©-HE fi)| /Search & Favorites e | 0- 8, lW] - D fi 



Address |^] http://localhost/Demo-t-HtmlControls/HtmlPage.h 



IB' 



Use 



# 32? ^> 



^ 



t> X I 5olu 

LI 




Password: 



bHBMJJMH—g 



rosoft Internet Explon 



^â–¡1*1 



File Edit View Favorites lools Help 



Q Back * O ' \E\ \£\ »'\ , : Search ' Favorites ^ | £3- & ^ - □ 



^] http://localhost/Derrio-4-HtrnlControls/AspPage.aspx 



T3B' 



Usa 



Password: 



KofltT Ha HTML crpaHkiuaTa He ce e npoMeHki/i, aoioto eTO KaKBO no/iynaBaMe 
KaTO otbopmm cope KOfla Ha ye6 cpopMaTa b 6pay3"bpa (View -> Source b 
Internet Explorer): 

File Edit Format View Help 



^J 



I 

<!DOCTYPE HTML PUBLIC 

<htm~l> 



-//W3C//DTD html 4.0 Transit! ona~l//EN" > 



<head> 

<title>Test asp.net Page</title> 
</head> 
<body> 
<form name="LoginForm" method="post " action="AspPage. aspx" id="LoginForm"> 

<input type="hidden" name=" viewstate" 

value="dDwtMTM2Mzc0NiEjNzs7Pvswwe4PK05AQ+911UxlmgxNah2Q" /> 

username: <br/> 

<input name="Username" id="Username" type="text" /xbr /> 

Password: <br/> 

<input name="Password" id="Password" type="text" /xbr /> 

<input name="submit " id="submit" type= 'submit " value="submit " 
/> 

</f orm> 
</body> 
</html> 
__â– â–  

KoAtT Ha ye6 cpopMaTa e 6/ii/i3"bK ro to3m Ha HTML CTpaHnuaTa, KoraTO 
cpopMaTa e KOMnw/ikipaHa. 



Ye6 cbpB-bpHM kohtpo/im (Web server controls) 

Web server KOHTpo/ikiTe ca ctpBtpHM kohtpo/im, cb3AaAeHki cneu.ua/iHO 3a 
ASP.NET. Te BK/iK>HBaT He caMO form-type kohtpo/ii/i KaTO 6yTOHM v\ TeKCTOBM 
KyTMM, ho ctiuo kohtpo^m etc cneu.ua/iHO npeAHa3HaneHkie KaTO Ka/ieHAap 
KOHTpo/iaTa (bm>k cpurypaTa no-AO/iy). Web server KOHTpo/iMTe ca no- 
a6cTpaKTHM ot HTML server KOHTpo/iMTe. TexHu^T o6eKTeH MOAe/i He e 3aA"b/i- 
>KMTe/iHO Aa HanoAo6flBa CMHTaKCuca Ha HTML. 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



191 



1^ Mag 2005 ^| 


noHeflejiHHK 


BTOpHHK 


cpjifla 


HeTBtpTbK 


neTBK 


ct6<yra 


Heflena 


25 


26 


27 


28 


29 


30 


1 


2 


3 


4 


5 


6 


7 


8 


9 


10 


11 


12 


13 


14 


15 


16 


17 


18 


19 


20 


21 


22 


23 


24 


25 


26 


27 


2S 


29 


30 


31 


1 


2 


3 


4 


5 



XapaKTepMCTMKM Ha ye6 cbpBi>pHMTe kohtpo/im 

Web server KOHTpo/iwTe ce 6a3npaT Ha o6iu MO,qe/i v\ bcmukm cno,qe/iflT o6lum 
xapaKTepucTMKn: Tara <asp:ControiType. . .> i/i aTpw6yTa id. Web server 
KOHTpo/ikiTe HflMa fla cpyHKUMOHnpaT 6e3 aTpn6yTa runat=" server". 
Web server KOHTpo/ikiTe ce HaMnpaT b npocTpaHCTBOTO ot MMeHa system. web. 
ui.webcontrois m MoraT fla ce M3no^3BaT BtB BCAKa ye6 cpopMa. 



<asp: Button id="MyBtn" runat="server"> 
<asp : Calendar id="MyCal" runat="server"> 
<asp:TextBox id="MyTxt" runat="server"> 



Kom kohtpo/im fla no/i3BaMe? 

KoraTO ce cb3AaBaT ASP.NET CTpaHnun, MMa Bt3MO>KHOCT fla ce w3no/i3BaT 
HTML server kohtpo/im v\nv\ Web server kohtpo/im. MoraT fla ce CMecBaT 
6e3npenflTCTBeHO. HanpuMep - 3a 6"bp30 npenpaBAHe Ha HTML crpaHkiua b 
ASP.NET CTpaHnua. 

M3no^3BaHeTO Ha Web server KOHTpo/ikiTe e npenoptuwTe/iHO npefl HTML 
server KOHTpo/ikiTe, TbM KaTO Te MMaT noBene bbsmokhoctm v\ no-6oraT 
o6eKTeH MO,qe/i. 

M3no/i3BaiiTe HTML CbpBi>pHM kohtpo/im, aKo: 

- npeAno4MTaTe HTML-no,qo6eH o6eKTeH MOfle/i. HTML server KOHTpo/ikiTe 
MMaT nonTki Cbmi/m CMHTaKCuc KaTO HTML e/ieMeHTMTe. HTML server 
KOHTpo^MTe MMaT server-side cpyHKuwoHa/iHOcr cbiuo KaTO Web server 

KOHTpO/ll/ITe. 

- Pa6oTMTe etc cbiuecTByBaiun HTML CTpaHnun v\ MCKaTe 6"bp30 fla mm 
flo6aBMTe cpyHKUkiOHa/iHOCTra Ha ye6 cpopMMTe. 3apaflM TOBa, ne HTML 
server KOHTpo/ikiTe cbOTBeTCTBaT touho Ha HTML e/ieMeHTMTe, He e 
Hy>KHO fla noflMeHATe kohtpo/im m fla pucKyBaTe fla ce noaBflT rpeujKM 
npn cpopMaTupaHeTO Ha crpaHwuaTa 3apaflM noflMsiHaTa. 

- KoHTpo/iMTe Tpa6Ba fla M3n"b/iHABaT eflHOBpeMeHHO client-side v\ server- 
side CKpunT. Mo>KeTe fla nuiueTe client-side CKpunT v\ fla noconBaTe 

KOHTpo/lMTe C HTML MMeTO MM (<tag name="html_name">), 3aiflOTO npn 



192 nporpaMnpaHe 3a .NET Framework (tom 2) 

K/ikieHTa Te ca HTML e/ieMeHTki. B cbiuoTO BpeMe MO>KeTe fla nuiueTe 
server-side koa, 3aiuoTO Te ca server kohtpo/ii/i. 

- CKopocTra Ha Bp"b3KaTa (bandwidth) e orpaHkmeHa v\ Tpa6Ba fla 
o6pa6oTBaTe ro/iflMa nacr ot flaHHMTe npn K/iweHTa, 3a fla HaMa/iMTe 
HaTOBapeHOCTra. 

M3no/i3BaMTe Web server kohtpo/im, sko: 

- npeflno4MTaTe KOMnoHeHTHna MO,qe/i Ha .NET. IHe MMaTe B"b3MO>KHOCTTa 
fla ki3no/i3BaTe o6eKTHO-opneHTnpaHO nporpaMnpaHe, me MO>KeTe fla 
MfleHTMCpnunpaTe KOHTpo/iwTe no TexHMfl id aTpn6yT v\ ziecHO fla pa3fle- 
nnje ziorwKaTa ot noTpe6kiTe/iCKkifl MHTepcpewc. C Web server kohtpo/im- 
Te me MO>KeTe fla cb3flaBaTe npi/i/io>KeHi/ifl c B/io>KeHi/i kohtpo/ii/i m fla 
ynpaB^ABaTe ct6nTMflTa (events) Ha hmbo KOHTeMHep Ha kohtpo/im 
(container level events). 

- Cb3flaBaTe ye6 CTpaHnun, komto me 6"bflaT pa3r/ie>KflaHki Ha pa3/ikmHki 
6pay3"bpn. KoHTpo/ii/iTe MMa cnoco6HOCTTa fla reHepupaT HTML, komto e 
cbo6pa3eH c Bt3MO>KHOCTMTe Ha K/ikieHTCKMH 6pay3tp m ce B"b3no/i3Ba ot 
bcm4km HeroBM npeflkiMCTBa. TaKa MO>KeTe fla nuiueTe 3a noc/ieflHMTe 
BepcuM Ha 6pay3"bpnTe, 6e3 fla ce npnTecH^BaTe, ne no-crapi/iTe Bepcun 
HflMa fla MoraT fla pa6oT*n~ c nt/iHaTa cpyHKuwoHa/iHOcr Ha crpaHwuaTa 

BM. 

- MMaTe Hy>Kfla ot cneuwcpwuHa cpyHKuwoHa/iHOcr KaTO HanpuMep Ka/ieH- 
flap v\nv\ 6aHepn, koato e MMn/ieMeHTkipaHa caMO b Web server kohtpo- 
nv\. B MHTepHeT MMa orpoMHO pa3HOo6pa3ne ot Web server kohtpo/im, 
komto peiuaBaT cneuwcpi/meH npo6/ieM. 

- CKopocTTa Ha Bp"b3KaTa (bandwidth) bm He e TBtpfle orpaHi/meHa v\ 
yBe/iwueH 6pow BptiuaHna ao ctpBtpa (umk/im ot 3a*iBKa-OTroBop) ot 
K/ii/ieHTa HflMa fla cb3fla,qaT npo6/ieMki etc CKopocTTa. 

KaTeropnn ye6 cbpBi>pHM kohtpo/im 

Web ctpBtp KOHTpo/iMTe ce .qe/iflT Ha: 

- BtTpeujHMTe kohtpo/im (Intrinsic controls) cbOTBeTcmaT Ha npocTM 
HTML e^eMeHTM KaTO 6yTOHM v\nv\ cnncbun. l/l3no/i3BaT ce no Cbiuna 
Ha^MH KaTO HTML server KOHTpo/iMTe. 

- KoHTpo^MTe 3a Ba^Mflaunfl (Validation controls) BK/iK>nBaT ziorwKa, 
koato no3BO/iflBa Ba^Mflaunfl Ha noTpe6nTe/iCKM BtBefleHM flaHHM no 
yHMCpnunpaH Ha^MH. KoHTpo/iaTa 3a Ba/ikiflaui/m Tpa6Ba fla ce npuKpenn 
ki>m KOHTpo/ia, npneMaiua noTpe6i/iTe/iCKki bxoa m fla ce onuiuaT npaBM- 
ziaTa 3a Ba/iki,qeH bxoa. 

- 06oraTeHMTe kohtpo/ii/i (Rich controls) BK/iK>HBaT no-c/io>KHi/i cpyHKUnn. 
ripuMep e AdRotator KOHTpo/iaTa, koato ce w3no/i3Ba 3a noKa3BaHe Ha 
noc/ieflOBaTe/iHOcr ot KapTMHKM (M3no/i3Ba ce 3a 6aHepn) v\nv\ calendar 
KOHTpo^aTa, koato npeflCTaB^ABa Ka/ieHflap. 



T/iaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



193 



- List-bound KOHTpo/ii/iTe MoraT flkmaMMUHO fla noKa3BaT flaHHM Ha 
ASP.NET ye6 crpaHkiua. flaBaT B"b3MO>KHOCTTa 3a noKa3BaHe, cpopMaTM- 
paHe Ha M3xofla, copTupaHe v\ npoMHHa. 

- Internet Explorer ye6 KOHTpo/ikue ca rpyna c/io>KHki kohtpo/ii/i, 
HanpMMep MultiPage, TabStrip, Toolbar, and TreeView KOHTpo/lMTe, 

komto MoraT fla 6"bflaT CBa/ieHM ot 1/lHTepHeT v\ fla ce MHTerpupaT bbb 
Visual Studio .NET 3a M3no/i3BaHe bbb bcako ASP.NET ye6 npw/io>KeHkie. 
Te3M kohtpo^m MoraT fla 6"bflaT M3o6pa3eHM KaTO craHflapTeH HTML, ho 
MoraT fla ce B"b3no/i3BaT v\ ot flont/iHi/iTe/iHMTe B"b3MO>KHOCTi/i Ha Internet 
Explorer 5.5 v\i\v\ c/ieflBaiun Bepcun, npn KoeTO MMaT no-6oraTa cpyHK- 

UklOHa/lHOCT. 
BljTpeiUHM KOHTPO/1M V\ CbOTBeTCTBMe c HTML 

BtTpeiiJHMTe (intrinsic) Web server kohtpo/ii/i OTroBapaT Ha npocTM HTML 
e^eMeHTM. Hakom ot necro i/i3no/i3BaHi/iTe BtTpeujHM Web server kohtpo/im ca 
noKa3aHM BTa6/ikiu.aTa: 



B-bTpeixiHM ye6 kohtpo/im 


HTML TaroBe 


<asp : button> 


<input type=" submit" > 


<asp : checkbox> 


<input type=" checkbox" > 


<asp : hyperlink> 


<a href=" . . . "X/a> 


<asp : image> 


<img src=" . . . "> 


<asp : imagebutton> 


<input type=" image "> 


<asp : linkButton> 




<asp: label> 


<span> </span> 


<asp : listbox> 


<select size="5"X/select> 


<asp: panel > 


<div> </div> 


<asp : radiobutton> 


<input type=" radio" > 


<asp: table> 


<table> </table> 


<asp : textbox> 


<input type="text"> 



KOHTPO/IM 3a Ba/lMAaLJMfl 

KoHTpo^MTe 3a Ba^Mflaunfl ca ckpmtm kohtpo/ii/i, komto npoBep^BaT flaHHMTe, 
BtBefleHM ot noTpe6nTe^fl, cpeiuy npeflecpuHnpaHM npaBM/ia. IHe M36ponM 

Ha6"bp30 HflKOM OT HeCTO M3n0^3BaHMTe KOHTpO/lM 3a Ba/lMflaU.klfl 

- RequiredFieldValidator - M3MCKBa BXOfl"bT fla e CTOMHOCT, pa3/lMHHa 

ot npa3HaTa (T.e. fla ce BtBefleHM HflKaKBM flaHHn). 

- CompareValidator - npOBepflBa fla/lkl CTOMHOCTTa Ha KOHTpo/iaTa e 

paBHa, no-ro/iHMa v\nv\ no-Ma/iKa OTflpyra. 



194 nporpaMnpaHe 3a .NET Framework (tom 2) 

- RangeValidator - M3MCKBa BXOfl"bT fla e B HflKaKBM rpaHMUM (o6xBaT). 

- RegularExpressionValidator - M3MCKBa BXOA"bT Rd OTRDBapfl Ha 

npeAecpMHupaH pery/iapeH M3pa3 (HanpuMep noiueHCKM koa, Te/iecpOHeH 
HOMep ...). 

- customvaiidator - no3BO/i*iBa 3aAaBaHeTO Ha npoki3BO/iHO yc/iOBMe, 
KoeTO MO>Ke Aa ce AecpMHupa v\ v\3nbi\uv\ v\ Ha K/iweHTa v\ Ha cbpBtpa 
(HanpuMep yc/iOBMe 3a npocTO hmc/io). 

- ValidationSummary - Cb6MpaTe/lHa KOHTpo/ia, KOflTO MO>Ke Aa M3Be>KAa 

c"bo6iueHMflTa 3a rpewKa Ha bcmukm kohtpo/im 3a Ba/iMAau.M*i. 

06oraTeHHTe kohtpo/im (Rich controls) 

06oraTeHMTe kohtpo/im (Rich controls) ca cneui/icpi/mHi/i kohtpo/im, komto 
peiuaBaT cno>KHa, ho necro cpeiuaHa 3aAana. TexHM npeAcraBMTe/iM ca: 

- AdRotator - noi<a3Ba noc/ieAOBaTe/iHOcr (npeAecpMHupaHa v\nv\ c/iynai/i- 
ho reHepupaHa) ot M3o6pa>KeHMfl. HaM-necro ce M3no/i3Ba 3a 6aHepn. 

- calendar - noi<a3Ba rpacpMUHO npeACTaBAHe Ha MHTepaKTMBeH Ka/ieH- 
Aap. 

CnMCbHHM kohtpo/im (List-bound controls) 

List-bound KOHTpo/iMTe MoraT Aa noKa3BaT AaHHM ot m3tohhmk (Hatf-necm 
6a3M OTAaHHn). HsiKOki ot Haw-^ecTO M3no/i3BaHMTe ca onucaHM no-AO/iy: 

- checkBoxList - noKa3Ba AaHHMTe KaTO KO/iOHa ot check boxes. 

- DropDownList - noKa3Ba AaHHM KaTO naAaiu cnnctK. 

- Listbox - noKa3Ba cnncbK ot e/ieMeHTM b KyTMMKa. 

- RadioButtonList - noKa3Ba AaHHMTe KaTO KO/iOHa ot 6yTOHM 3a 
a^TepHaTMBeH M36op (radio buttons). 

- Repeater - nOKa3Ba MHCpOpMaUMfl (OT DataSet V\I\V\ MaCMB), KaTO 

noBTapa noTpe6nTe^CKM AecpMHupaH wa6/iOH. LUa6/iOH"bT onucBa KaK ce 
npeAcraBfl BceKM eAMH e/ieMeHT. B to3m wa6/iOH Haw-^ecTO MMa Apyrn 

KOHTpO/lM. 

- DataList - nOA06Ha Ha KOHTpO/iaTa Repeater, ho c noBene cpopMaTM- 
paiun m layout onunn, BK/iK>nMTe/iHO v\ B"b3MO>KHOCTTa AaHHMTe Aa ce 
noKa3BaT b Ta6/iMu.a. DataList KOHTpo/iaTa cbu\o no3BO/iflBa Aa ce 
onpeAe/iw v\ noBeAeHne npn peAaKTupaHe Ha AaHHMTe. 

- DataGrid - noKa3Ba AaHHMTe b Ta6/iMneH bma. flocTaBa MexaHM3MM 3a 
peAaKTMpaHe, copTMpaHe m CTpaHMpaHe. 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 195 



Code-behind 



OTAe^AHeTO Ha nporpaMHi/m (C#) koa, CB"bp3aH c npe3eHTau,MOHHaTa ziorwKa 
Ha npn^OKeHneTO, ot noTpe6i/iTe/iCKkifl My MHTepcpewc 3HanwTe/iHO y/iecHABa 
noAAP"b>KKaTa Ha ye6 npi/i/io>KeHi/mTa. 

B ASP.NET KOAtT Ha aspx CTpaHMUMTe o6mkhob6ho ce OTRenn ot nporpaMHMfl 
(C#) koa, komto vv\ ynpaB/iflBa. To3M nporpaMeH koa ce rpn>KM 3a noAroTOB- 
KaTa Ha CTpaHnuaTa 3a Bi/i3ya/iM3au.i/ifl v\ 3a B3anMOAeMCTBneTO c noTpe6kiTe/ifl 
m e M3BecTeH oiue KaTO "npe3eHTau.woHHa /lorwKa". B Hero ce o6pa6oTBaT 
ct6nTMflTa, npeAM3BMKaHM ot KOHTpo^MTe b ye6 cpopMaTa. 

3a OTAe^flHeTO Ha npe3eHTau.i/iOHHaTa ziorwKa ot noTpe6i/iTe/iCKkisi MHTepcpewc 
o6nKHOBeHO c BCAKa aspx CTpaHnua e CBtp3aH eAMH C# K/iac - cpaw/i c pa3- 
ujupeHne aspx.cs. To3M cpaw/i e M3BecreH KaTO "code behind" v\ ce noAAtpwa 

aBTOMaTM4HO ot VS.NET. 

Ao6aBsme Ha koa b ye6 4>opMa 

flo6aBAHeTO Ha koa b ASP.NET ye6 cpopMa bm AaBa b"B3mo>khoct p,a npeAOC- 
TaBMTe cpyHKunoHa^HOCTTa, ot koato noTpe6kiTe/i*iT ce Hy>KAae. Be3 koa 
BaiueTO ye6 npi/i/io>KeHi/ie Mowe p,a M3r/ie>KAa Ao6pe, ho HAMa p,a npaBM hmluo. 

flo6aBAHeTO Ha koa b ye6 cpopMa CTaBa no eAMH ot Tpn Hankma: 

- Mixed code - koa^t e b cbiuna cpai/i/i, b komto e v\ ye6 cbAtpwaHkieTO. 
To3M MeTOA He ce npenoptuBa, 3aiuoTO boah ao c/io>KeH v\ TpyAeH 3a 
noAA"bp>KaHe koa. M3no/i3Ba/i ce e npn ASP npi/i/io>KeHi/mTa. TaKbB MeTOA 
BMA^xMe b hakom ot npi/iMepwTe ot noc^eAHaTa AeMOHCTpauna. 

- Inline code - koa^t e OTAe/ieH b OTAe/iHa SCRIPT ceKu.i/m b ctiunfl 
cpai/i/i. 

- Code-behind - koabt e b code-behind crpaHkiua - OTAe/ieH cpaw/i ot 
T03M Ha HTML c-bAtp^aHneTO. KoraTO i/i3no/i3BaTe Visual Studio.NET, 
TOBa e MeTOAtT no noApa36npaHe. 

Inline code 

KoraTO ce i/i3no/i3Ba inline koa, HTML koa^t m inline koa^t ca b ojp,enuv\ 
ceKunn Ha eAMH v\ cbu\ .aspx cpaw/i. ToBa pa3Ae/ieHkie e 3a acHOTa, KoraTO ce 
neTe CTpaHnuaTa. flBeTe ceKu.nn MoraT p,a ce HaMwpaT HaBCHKbAe no 
CTpaHkiuaTa. 



<html> 




<asp: Button id="btn" runat="server"/> 




</html> 




<script Language="c#" runat="server"> 




private void btn Click (obj ect sender, System. EventArgs 


e) 



196 flporpaMnpaHe 3a .NET Framework (tom 2) 



{ 

} 
</script> 



Code-behind K/iacoee 

Code-behind K/iacoBeTe npeflcraB/iflBaT OTfle/iHM KOMnw/ikipaHki K/iacoBe, 
komto ctAtpxaT nporpaMHaTa /iori/iKa Ha crpaHi/iuaTa. BcyiKa ye6 CTpaHnua b 
eflHO ye6 npw/io>KeHi/ie MMa co6cTBeHa code-behind CTpaHnua. no noflpa36n- 
paHe code-behind crpaHi/iuaTa MMa ctiuoTO MMe KaTO ye6 crpaHkiuaTa, c koato 
e acounnpaHa. Pa3UJnpeHneTO Ha cpaw/ia e .aspx.vb v\nv\ .aspx.cs b 3aBncn- 
moct ot TOBa KaKtB e3MK e 61/1/1 M3no^3BaH. KoraTO ye6 npi/i/io>KeHi/ieTO ce 
ki3n"b/iH*iBa flBaTa cpai/i/ia cpopMnpaT ua/iaTa CTpaHnua. 

KaK pa6oTM code-behind? 

3a fla acoukiupa eAHa . aspx crpaHwua c HewHaTa code-behind crpaHi/iua, 
Visual Studio .NET flo6aB*i Tpn aTpn6yTa kbm @Page flupeKTMBaTa: 

- inherits - no3BO/iHBa Ha .aspx CTpaHnuaTa fla Hac/ieflHBa code-behind 
K/iaca. 

- codebehind - M3no/i3Ba ce BBTpewHO ot Visual Studio .NET, 3a fla 
acounupa cpaw/iOBeTe. 

- src - cbfl"bp>Ka MMeTO Ha code-behind crpaHi/iuaTa. M3no/i3Ba ce, aKO 
ye6 npn^OKeHneTO He e npeKOMnw/iwpaHO. 



<%@ Page Language="c#" 

Inherit s="MyPro j ect . WebForml" 
Codebehind="WebForml . aspx . cs" 
Src="WebForml . aspx . cs" %> 



JIT KOMnusiaiJiiifl 

Code-behind CTpaHnuaTa MO>Ke v\nv\ fla 6"bfle npeKOMnw/ii/ipaHa ot Visual 
Studio .NET, KoraTO ce KOMnw/ikipa ye6 npn^OKeHne, v\nv\ fla 6"bfle just-in- 
time (JIT) KOMnw/ikipaHa npn ntpBaTa 3aaBKa. 

Ako src aTpn6yTtT ziwncBa ot <@Page . . . > flupeKTMBaTa b .aspx cpaw/ia, npi/i 
build Ha npn^OKeHneTO crpaHkiuaTa ce KOMnn/inpa. no noflpa36npaHe Visual 
Studio .NET He flo6aBfl aTpn6yTa src, T.e. bcmuki/i code-behind CTpaHnun ca 
KOMnw/ikipaHM, KoraTO ce crapTkipa npn^OKeHneTO. npeKOMnw/iwpaHeTO cnec- 
TflBa 3a6aBAHeTO npn ntpBa 3a*iBKa 3a cbOTBeTHaTa crpaHi/iua. flpyro npe- 
flMMCTBO e, ne HflMa Hy>Kfla cope koabt Ha code-behind CTpaHnunTe fla ce pa3- 
npocTpaHABa ao ye6 ctpBtpa. 

KoraTO ce ki3no/i3Ba JIT KOMnn.nau.kifl, code-behind crpaHkiuaTa ce KOMnn/inpa 
npn ntpBa 3aaBKa. CbOTBeTHO ntpBaTa 3aaBKa e no-6aBHa. 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 197 



Cb6l1TI1$l 



KoraTO noTpe6wTe/i B3anMOAeMCTBa c ye6 cpopMa (mpaKa, M36npa, BtBewfla 
flaHHn), ce reHepupa c"b6nTne (event). flewcTBueTO, KoeTO Tpa6Ba fla ce 
M3B"bpujBa b cnroBop, ce pea/ii/i3i/ipa b ct6nTMMHa (event) npoueflypa. 

npiiXBauiaHe Ha cb6nTiisi 

HeKa c"b3flafleM KOHTpo/ia, 3a fla reHepupaMe c"b6nTne b ye6 cpopMaTa. Visual 
Studio .NET fleK/iapwpa npoMeH/ii/iBa b code-behind crpaHkiuaTa c MMe KaTO id 
aTpn6yTa Ha KOHTpo/iaTa. 

CneflHi/mT HTML koa flecpMHupa ye6 cpopMa v\ 6yTOH c id="Buttonl" : 



<form id="Form2" method="post" runat="server"> 
<asp: Button id="Buttonl" runat="server"/> 
</f orm> 



B code-behind CTpaHnuaTa ce .qeK/iapi/ipa npoMeH/ikiBa etc cbiuoTO MMe: 



protected System. Web . UI .WebControls . Button Buttonl; 



KoraTO mpaKHeM c MmuKaTa flBa ntTki Btpxy T03M 6yTOH, VS.NET npuxBaiua 
c"b6nTneTO "HaTMCKaHe Ha 6yTOHa" v\ reHepupa MeTOfl, komto ce M3BMKBa npn 
HeroBOTO HacTtnBaHe. Eto KaK H3Me>Kfla reHepupaHM^T MeTOfl: 



private void Cmdl_Click (ob j ect sender, System. EventArgs e) 

{ 

// Event handling goes here . . . 

} 



CaMOTO a6oHnpaHe 3a c"b6nTneTO Ha 6yTOHa craBa no HanwHa, no komto CTaBa 
b Windows Forms. VS.NET flo6aBfl c/ieflHkifl koa b MHnu.ua/iM3au.kiOHHaTa nacr 
Ha CTpaHnuaTa: 



this. Buttonl. Click += 

new System. EventHandler (this . Buttonl_Click) ; 



Cbomctboto AutoEventWireup 

Cbomctboto AutoEventWireup yKa3Ba fla/iw cb6kiTkmTa aBTOMaTi/mHO fla ce 
Bpt3BaT KtM CTpaHnuaTa. 

Ako e true, c/ieflHi/mT koa e ki3/ikiLueH (i/i3n"b/iHHBa ce aBTOMaTi/mHo): 



this.Init += new System. EventHandler (this . Page_Init) ; 
this. Load += new System. EventHandler (this . Page_Load) ; 



198 nporpaMnpaHe 3a .NET Framework (tom 2) 

ASP.NET caM HaMupa MeTOflM c MMeHa KaTO Buttoni_ciick h rn M3BMKBa KaTO 
o6pa6oT4MK Ha c"b6nTneTO click 3a kohtpo/i Buttoni. 

ripi/i Hy>Kfla ot BucoKa npon3BOAMTe^HOCT, ce npenoptuBa fla He ce M3no/i3Ba 

aBTOMaTM4HO Bp"b3BaHe. 

>Kn3HeH MMK-b/i Ha ASP.NET crpaHMLjMTe 

ripi/i BCAKa 3aaBKa 3a ASP.NET crpaHwua cepi/m ot cb6kiTi/m ce cnynBaT b 
CTporo onpefle/ieHa nocneflOBaTe/iHOcr, i/i3Becma ioto ">KM3HeH uwKb/i Ha 
CTpaHnuaTa" (page event life cycle). TyK me M36ponM v\ o6achmm hakom ot no- 

Ba>KHMTe Cb6klTMfl: 

Page_init - cny>Kki 3a MHMuna^M3MpaHe Ha Web server KOHTpo/ikiTe b 
CTpaHnuaTa. no BpeMe Ha ki3n"b/iHeHi/ieTO My He Tpa6Ba fla ce ocbiuecTB^Ba 
AOCTbn ao KOHTpo/iMTe. Moxe fla ce M3no/i3Ba 3a 3afle/i*iHe Ha pecypcu. 

Page_Load - M3BMKBa ce BceKM nvr, KoraTO CTpaHnuaTa 6"bfle noMCKaHa - 
KaKTO npn ntpBOHana/iHO OTBap^He Ha CTpaHnuaTa, TaKa v\ cnefl noTpe6n- 
Te/iCKO flewcTBue (npuMepHO HaTMCKaHe Ha 6yTOH b Hea). C"b6nTneTO ce 
M3no^3Ba 3a ki3B/ikmaHe Ha flaHHMTe, nont/iHeHki b KOHTpo/iMTe, KaKTO v\ 3a 
npoMAHa Ha cbCTOAHneTO Ha KOHTpo/iMTe b crpaHwuaTa. 

Cb6wrn$iTa Ha KOHTpo/iMTe cnywaT 3a o6pa6oTKM b code-behind naoTa, 
komto ca CBtp3aHM c OTfle/iHkiTe kohtpo^m ot crpaHwuaTa (HanpuMep 

Buttonl_Click, TextBoxl_Changed) . 

Page_PreRender - M3BMKBa ce npeflki fla ce 3ano4He peHfli/ipaHeTO (rendering) 
Ha CTpaHnuaTa. PeHflkipaHeTO Ha crpaHkiuaTa e npouecbT Ha cb3flaBaHe Ha 

M3XOflHMfl HTML KOfl OT . aspx CTpaHMUaTa, BK/lKDHBaLfl KOHTpO^MTe B Hefl M 

AaHHMTe, no/iyneHki ot noTpe6i/iTe/ifl ao MOMeHTa. Ha Ta3M CTbnKa CTOMHOCTMTe 
Ha KOHTpo/iMTe ca B"b3CTaHOBeHM ot BM3ya^HOTO ctCTOAHne (view state) i/i 
MoraT fla 6"bflaT HaHeceHM nocneflHi/i npoMeHM, komto fla 6"bflaT 3anncaHM 
o6paTHO b Hero, npeflu crpaHkiuaTa fla ce noKaxe b 6pay3tpa. 

Page_unioad - M3BMKBa ce npw npwK/iionBaHe Ha peHflnpaHeTO Ha 
CTpaHnuaTa. M3no/i3Ba ce 3a ocBo6o>KflaBaHe Ha pecypcu. 

Cbomctboto IsPostBack 

B ASP.NET npeflHa3Ha4eHneTO Ha cpopMMTe e fla BptiuaT MHCpopMauna 
o6paTHO kbm ctpB-bpa 3a o6pa6oTKa. To3m npouec ce Hapn^a "postback". Cbc 
cbomctboto IsPostBack Ha K/iaca Page MO>xe fla ce npoBepn fla/iw CTpaHnua 
ce 3ape>Kfla 3a nptB ntT. Ako IsPostBack e true, Tpa6Ba fla ce i/i3n"b/iHki 
ntpBOHana/iHMfl nHMuna/iki3aukiOHeH koa, a aKO e false (T.e 3aaBKaTa e 
npeflM3BMKaHa ot KOHTpo/ia Ha crpaHi/maTa), fla ce ki3n"b/iHi/i koa, komto 
OTroBapa Ha ct6nTneTO, npefli/i3BMKa/io BptiuaHeTO Ha crpaHwuaTa. 



& 



Ako CTpaHMLtaTa ce yinyii\yianyi3yipa c koa, komto Tpn6Ba fla ce 
M3ni>/iHM caMO BeflHbw (HanpuMep noni>/iBaHe Ha DataSet ot 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 199 



6a3aTa flam-in), BMHarM npoBepflBatrre fla/iu th ce OTBapn 3a 
ni>pBM m»T m/im e b pe3ymar Ha postback! 



Eto efli/m npuMep: 



private void Page_Load (ob j ect sender, 
System. EventArgs e) 

{ 

if ( ! Page. IsPostBack) 

{ 

// Executes only on initial page load 
// Initialize controls here 

} 

// This executes on every request 
// Controls are already initialized 



Cbomctboto AutoPostBack 

Ako MCKaTe HOBaTa ctomhoct Ha KOHTpo/iaTa fla 6"bfle He3a6aBHO M3npaTeHa 
Ha cbpBtpa, 6e3 fla naKaTe noTpe6i/iTe/iflT fla HaTMCHe Ha hakom 6yTOH, MO>xe- 
Te fla yKa>KeTe ctomhoct true Ha cbomctboto AutoPostBack Ha KOHTpo/iaTa. B 

MOMeHTa, B KOMTO nOTpe6MTe/lflT npOMeHM CTOMHOCTTa Ha KOHTpo^aTa, MHCpop- 

MaunflTa me ce M3npaTM Ha ctpBtpa. CtpBtptT ocbBpeMeHABa KOHTpo/ii/iTe Ha 
CTpaHnuaTa v\ vv\ Bptiua Ha K/ineHTa. TaKa crpaHi/iuaTa CTaBa no-rbBKaBa v\ 

MHTepaKTMBHa. 

B c/ieflBaiflkifl npuMepeH HTML koa ListBox KOHTpo/iaTa M3no/i3Ba cbomctboto 
AutoPostBack. BceKM ntT, KoraTO noTpe6wTe/iflT npoMeHfl CTOMHOCira v\, 
CTpaHnuaTa ce npaiua Ha ctpBtpa aBTOMaTi/mHO v\ B"b3HMKBa ct6nTneTO 
seiectedindexchanged (T.e., aKO MMa MeTOfl, acounnpaH c Hero, TOM me ce 

kl3ITb/lHM): 



<asp : DropDownList id="ListBoxl" runat="server' 
AutoPostBack="True"> 
<asp : ListItem>First Choice</asp : Listltem> 
<asp : ListItem>Second Choice</asp : Listltem> 

</asp : DropDownList> 



flo6aBAMe m KOfl b code-behind CTpaHnuaTa, komto fla noKa>Ke HOBOM36paHaTa 
ctomhoct b TeKCTOBO no/ie: 



private void ListBoxl_SelectedIndexChanged 
(object sender, System. EventArgs e) 

{ 

TextBoxl . Text = ListBoxl . Selectedltem. Value; 

} 



200 nporpaMnpaHe 3a .NET Framework (tom 2) 

HTML escaping npo6/ieMM 

KoraTO no/iynaBaMe ashhh ot K/ikieHT, Tpa6Ba BMHarn p,a npoBepsiBaMe p,anv\ 
cneui/ia/iHMTe 3Haun b TeKCTOBMTe npoMeH/ii/iBi/i ca onucaHM npaBki/iHO. 

B HTML e3MKa, 3Hau.kiTe 3a no-Ma/iKO v\ no-ro/iflMO ('<' v\ '>') ca cneu.ua/iHki 
cmmbo^m m 6pay3"bpnTe MHTepnpeTupaT flyMaTa Me>Kfly tax KaTO onepaTop v\nv\ 
KOMaHfla. rioHAKora ce Ha/iara p,a ki3no/i3BaMe Te3M 3Haun KaTO «-iacT ot TeKCT. 
3a p,a BM3ya/iM3npaMe TaKbB 3HaK, Tpa6Ba p,a ki3no/i3BaMe cneu.ua/iHO 
3anncBaHe (escaping). Ta3M TexHMKa ce Hapwua escaping, 3aiuoTO necro ce 
pea/iki3wpa c nocraBAHe Ha o6paTHO HaK/iOHeHa nepTa ('\') npeAH 3HaKa. 

HanpuMep 3HaunTe 3a no-Ma/iKO v\ no-ro/iflMO ('<' v\ '>') ce 3anncBaT TaKa: 
&it; i/i > (It = less than, gt = greater than). 

B HTML 3ani/iCBaHeTO Ha eflMH v\nv\ noBene i/iHTepBa/ia BMHarn ce B"b3npneMa 
KaTO eAMH MHTepBa^ v\ BM3ya/iHO ce npeAcraBH KaTO eAHH MHTepBa/i. Ako 
MCKaTe fla nocraBMTe noBene ot eAHH kiHTepBa/i, ki3no/i3BaTe cneu.ua/iHkm 
3HaK   (nbsp = nonbreaking space). 

3a noBe^e kiHCpopMaukm nor/ieAHeTe "The HTML Coded Character Set" 
( http://www.w3.org/MarkUp/html-spec/html-spec 13.html ) b catiTa Ha World 
Wide Web Consortium (W3C) v\nv\ xnnepBp-b3KMTe Ha Kpaa Ha Ta3M r/iaBa. 

ripaBM^aTa 3a KOflnpaHeTO Ha cneu.ua/iH kiTe 3Haun cb3flaBaT noTeHu.ua/iHki 
npo6/ieMM npn no/iynaBaHeTO Ha TeKCTOBM ashhh ot noTpe6kiTe/isi, komto c/ieA 
TOBa Tpa6Ba p,a ce ki3ni/iujaT b HTML crpaHkiua. 

HTML escaping npo6/ieMn - npuMep 

Eto eAMH npocT npuMep, b komto Bt3HMKBa escaping npo6/ieM: 



string userName = "\"<script language= ' JavaScript ' >while ( 1 ) 
alert ( 'bug! ' ) </script>"; 



noTpe6kiTe/iflT e M3npaTi/i/i ropHkia CkiMBO/ieH hm3. Ako ro npucBOMM Ha 
TextBox HflMa p,a MMa npo6/ieMki: 



TextBoxl . Text = userName; 



Ako o6ane ro npucBOMM Ha eTMKeT, cbAtpwaHkieTO My ce MHTepnpeTupa KaTO 
HTML koa m T03M koa me 6"bAe v\3nbi\ueu: 



Labell.Text = userName; 



BMecTO p,a ce ki3ni/iLue KaTO TeKCT b eTMKeTa, b 6pay3"bpa ce noflBABa c/ieAHOTO 
c"bo6iueHne: 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 201 



|rC WebForml - Windows Internet Explorer 


Jtfx| 


ra^">f ^ | & http : //loca Ihost/De T | \*t \ | X | | Search Goog le 


l*H 


ik & Q WebForml 1 A T T § T 


» 




±1 


Istrinq userName = "\"<scr 


Windows Internet Explorer 


*j 




string userrs ame = "'â– " 
Button | 


* 


bug! 








; OK 
















d 


| *lJ Local intranet § 


.100% - 



PeujeHneTO Ha to3m npo6/ieM e na ce ki3no/i3Ba CTaTM4HMflT MeTOfl 

Server . HtmlEncode ( ... ) : 



Labell.Text = Server . HtmlEncode (userName) ; 



liO WebForml - Windows Internet Explorer 


|n|x| 




P - 
» 


G^V-'} T |&http://localhosVDemo-r*J *t X |search Google 

& <£ §p WebForml | Qj T T # T L^Page » 




A 


(string userName = "\"<scr 

string userName = "\"<script language— JavaScript '>while(l) alert('bug!') 
<'script>" 

Button | 




*j Local intranet <St 100% 


T A 



Cera bci/iuko e KaKTO Tpa6Ba. Ako pa3r/ieflaMe KaK e 3anncaH koabt b M3xofl- 
HaTa HTML CTpaHnua, me 3a6e/ie>KMM, ne e 6w/ia npoMeHeHa caMO ntpBaTa 
KaBMUKa: 



<input name="InputTextBox" type="text" value="\" <script 
language= ' JavaScript ' >while ( 1 ) alert (' bug !'); </script>" ...> 



202 nporpaMnpaHe 3a .NET Framework (tom 2) 

CBi>p3BaHe c flaHHM (Data binding) 

ASP.NET npeA-nara hob AeK/iapaTMBeH CMHTaKCuc 3a CBtp3BaHe c AaHHM (data 
binding). To3m i/i3K/iioni/iTe/iHO rbBKaB CMHTaKCuc no3BO/iflBa CB"bp3BaHeTO He 
caMO c 6a3M ot AaHHM, ho m etc CBOMCTBa, KO^eKunn, M3pa3M, Aopn pe3y/iTaâ„¢ 
ot MeTOAM. B HTML-noAo6HMfl koa Ha ye6 cpopMMTe CB"bp3BaHeTO Ha AaHHMTe 
CTaBa b ceKUMM ot BMAa <%# %>. Eto hako/iko npuMepa: 

- CbC cbomctbo: 



Customer: <%# custID %> 



C KO/ieKUM5i: 



Orders: <asp:ListBox id="Listl" datasource= ' <%# myArray %>' 
runat=" server "> 



- C M3pa3: 




















Contact: <%# 

%> 


( customer 


First 


Name 


+ 


II 


II 


+ 


customer 


LastName ) 



C pe3y/iTaT ot mstoa: 



Outstanding Balance: <%# GetBalance (custID) %> 



KaK pa6oTM MeTOfli>T DataBind(...)? 

BtnpeKM ne M3r/ie>KAa nOA06eH Ha <% Response . Write ( customer . Name ) %> 

mjim <%= customer. Name %>, noBeAeHneTO Ha MeTOAa e pa3/ikmHO. floKaTO 
ntpBMTe ABa 6/iOKa ce i/i3n"b/iHHBaT KoraTO crpaHwuaTa reHepupa HTML ot 
Render (...) MeTOAa, ASP.NET M3pa3MTe 3a CB"bp3BaHe c AaHHM ce i/i3n"b/iHflBaT 
npn M3BMKBaHeTO Ha DataBind(...) . Ako MeTOAtT He ce M3BMKa, ue/ikisiT pernoH 
<%#... %> ce nrHopupa. 

DataBind(...) e MeTOA Ha K/iaca Page m Ha ctpBtp KOHTpo/iMTe. KoraTO ce 

M3BMKa DataBind(...) Ha pOAMTe/lCIOTa KOHTpO/ia, TOM Ce M3BMKBa KaCKaAHO M 
3a BCM4KM HeMHM Aeua. M3BMKBaHeTO Ha DataBind(...) Ha BrpaAeHMfl 06eKT 
Page (Page.DataBind(...) V\I\V\ nO-npoCTO DataBind(...) ), npeAM3BMKBa OueHfl- 

BaHeTO Ha bcmukm M3pa3M (<%#... %>) 3a CB"bp3BaHe c AaHHM. HaM-necro 

DataBind(...) ce M3BMKBa OT Page_Load Cb6klTMeTO: 



void Page_Load (Ob j ect sender, EventArgs e) 

{ 

Page . DataBind ( ) ; 

} 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 203 

Mo>Ke fla ce M3no/i3Ba nonâ„¢ HaBcaicbfle b .qeK/iapaTkiBHaTa nacr Ha . aspx 
CTpaHnua, crura fla ce Bptiua noflxoflaiu Tun flaHHM. B hakom cnynaw ce 
Ha/iara npeo6pa3yBaHe Ha flaHHMTe. 

CBi>p3BaHe Ha kohtpo/im c flai-mii - npiiMep 

ntpBMflT npuMep 3a CB"bp3BaHe c flaHHM, komto me pa3r/ieflaMe, pa6oTM 
flupeKTHO etc CBOMCTBa Ha crpaHi/iuaTa. Eto KOfla: 



<html> 
<body> 

<h3xfont f ace="Verdana">CB r bp3BaHe c flaHHM (DataBinding) 

K'bM cbomctbo Ha CTpaHMuaTa</ f ontx/h3> 
<form runat=server ID="FormExamplel"> 

Customer: <b>|<%# custID %>|</bxbr> 
Open Orders: <b>|<%# orderCount %>|</b> 
</f orm> 
</body> 
</html> 



Eto m KOfla b code-behind CTpaHnuaTa: 



void Page_Load (Ob j ect sender, EventArgs e) 

{ 

Page.DataBind ( ) ; 

} 

string custID 

{ 

get 

{ 

return "Porsche"; 

} 
} 

int orderCount 

{ 

get 

{ 

return 911; 

} 
} 



Eto ro pe3y/iTaTbT: 



204 nporpaMnpaHe 3a .NET Framework (tom 2) 

fc»l^mMli.BMJ.iB ; M!ff.l.lJJ!),I..I.IIJI,y.lWJIJJ. M,IHB!!ilJHI!IHl 



File Edit View Favorites Tools Help 



y Bad>. - _j t jj ,gj I Search Favorites â– > - /] - 



Address \^\ http://localhost/Demo-6-DataBinding/Examplel.aspx 



â–¼J ^j Go Links 



CBi>p3BaHe c naHHH (Data Binding) ki>m cbomctbo Ha CTpatmijaTa 

Customer: |Porsche| 
Open Orders: |911| 



^Done 



|*j Local intranet 



Ba>KHO e p,a M3BMKaMe MeTOAa Page . DataBind ( ) . Ako ro 3aKOMeHTnpaMe, eTO 
KaKBO ce cnyuBa: 



File Edit View Favorites Tools Help 



3 Back '(3*0 L?] <&\ P Search i> Favorites & | : .1- g. $ - G 



Address j@ http://localhost/Derno-6-DataBinding/Examplel.aspx 



_^J Go Links " 



CBi>p3BaHe c flaHHM (DataBinding) ki>m cbomctbo Ha CTpammaTa 



~] 



Customer: || 
Open Orders: 



*_J Local intranet 



KaKTO BM>KflaMe, hmluo He e M3nncaHO Me>KAy BepTMKa/iHkiTe nepâ„¢. 

B c/ieflBaiunfl npuMep eflina KOHTpo/ia me flocrbriBa flaHHM ot flpyra KOHTpo/ia. 
B KOHKpeTHkisi cnynai/i eTMKeT (Label) me M3nncBa i/i36pam/m maT ot naAaiu 
cnncbK. Eto ro KOAa: 



<html> 










<body> 










CBTipsBaHe 


c flaHHM (DataBinding) ktdM cbomctbo Ha 


flpyra 


CtpB'Bp 


Ha KOHTpOJia 








<form runat="server" ID="F 


ormExample2 "> 






<asp : Dr 


opDownList id="Dr 


opDownListState" 


runa 


t="server"> 


<asp 


ListItem>CA</asp 


Listltem> 






<asp 


ListItem>IN</asp 


Listltem> 






<asp 


ListItem>KS</asp 


Listltem> 






<asp 


ListItem>MD</asp 


Listltem> 






<asp 


ListItem>MK/asp 


Listltem> 






<asp 


ListItem>OR</asp 


Listltem> 







HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



205 



<asp : ListItem>TN</asp : Listltem> 
<asp : ListItem>UT</asp : Listltem> 
</asp : DropDownList> 
<asp: Button Text="Submit" OnClick="ButtonSubmit_Click" 

runat="server" ID="ButtonSubmit" Name="Buttonl" /> 
Selected State: 

<asp:Label text='<%# StateList . Selectedltem. Text %>' 
runat=server ID="LabelState" Name="LabelState"/> 
</f orm> 
</body> 
</html> 



Pa36kipa Ce, B Page Load MeTOAa M3BMKBaMe DataBind(...) . Pe3y/lTaT"bT e: 



1 3 http://localhost/Demo-6-DataBinding/EKample2.aspK - Microsoft Internet Explorer 


-inlx 


File Edit View Favorites Tools Help 


sr 


©Back .fi.ggfl P Search fr Favorites © £]* S« 1*1 ' D £1 


Address |^f] http://localhost/Demo-6-DataBinding/Exarnple2.aspx 


dH=» 


Links " 


CBi>p3BaHe c flaHHM (DataBinding) ktjm cbomctbo 
ctpetpHa KOHTpO/ia 


Ha flpyra 


d 


IIBl^l Submit | 


Selected State: TN 


^)Done 


|*J Local intranet 


A 



B TpeTMfl npuMep me 3apeflMM naflaiu cnwcbK ot MacuB. HeKa MMaMe ye6 
cpopMa c naAaiu cnwcbK Ha Hea. 3a KpaTKOCT me AaAeM KOAa caMO ot code- 
behind K/iaca: 



void Page_Load (Ob j ect Sender, EventArgs E) 

{ 

if ( ! Page. IsPostBack) 

{ 

ArrayList values = new ArrayList ( ) ; 



lues 


.Add 


"IN") ; 


lues 


.Add 


"KS") ; 


lues 


.Add 


"MD") ; 


lues 


.Add 


"MI " ) ; 


lues 


.Add 


"OR") ; 


lues 


.Add 


"TN") ; 



DropDownListCountries . DataSource 
DropDownListCountries . DataBind ( ) ; 



values; 



206 



flporpaMnpaHe 3a .NET Framework (tom 2) 



void ButtonSubmit_Click (Ob j ect sender, EventArgs e) 

{ 

LabelChosen . Text = "You chose: " + 

DropDownListCountries . Selectedltem. Text; 
} 



Ot T03i/i koa naAaiunflT cnwcbK ce 3ape>Kfla c hako/iko maTa. B"ropi/mT MeTOA 
M3nncBa b eTMKeT M36paHMfl maT. 



R.IBIBMJimiWBIJ.iMiJ.iB^MJiMF^U.lWJIJJ.U.IJI.IJJJ.i agaBa 



File Edit View Favorites loots Help 



Q Back - O T 3 lU >&l\P S8a«*i & Favorites \ 0- S* $ T D & 



Address j@ http : //localhost/Demo-6-DataBinding/Exarnple3 . aspx 



â–¼ I Ej Go Links 



CBfepseaiie c AaHHM (DataBinding) Ha DropDownList 

|TN ^l Submit I 
You chose: TN 






|^J Local intranet 



Cera me AeMOHcrpwpaMe noKa3BaHe Ha ashhh b DataGrid ot Ta6/ii/meH 
M3T04HMK Ha flaHHM (b cnynafl DataView): 



<%@ Import namespace="System. Data" %> 

<html> 
<head> 

<script language="C#" runat="server"> 

void Page_Load (Ob j ect sender, EventArgs e 



{ 



if ( ! Page. IsPostBack) 

{ 

DataTable dt = new DataTable () ; 

DataRow dr; 

dt . Columns .Add (new DataColumn ( "IntegerValue" , 

typeof (Int32) ) ) ; 
dt . Columns .Add (new DataColumn ( "StringValue" , 

typeof ( string) ) ) ; 
dt . Columns .Add (new DataColumn ( "DateTimeValue" , 

typeof (DateTime) ) ) ; 
dt . Columns .Add (new DataColumn ( "BooleanValue" , 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 207 



typeof (bool ) 



f 
{ 


or 


(int i 


= 1; i <= 


9; 


i++) 


dr 


= dt 


NewRow ( ) , 








dr 


[0] = 


i; 








dr 


[1] = 


"Item " + i. 


ToString 




dr 


[2] = 


DateTime 


Now 


; 




dr 


[3] = 


(i % 2 != 


= 0) 


? true 



false; 



dt .Rows .Add (dr) 



) 



dataGridExample . DataSource = new DataView (dt) ; 
dataGridExample . DataBind ( ) ; 



} 



} 



</script> 
</head> 
<body> 

<h3xfont f ace="Verdana">CB r bp3BaHe c saHHH (DataBinding) Ha 
DataView</fontx/h3> 

<form runat=server ID="FormExample4"> 

<asp : DataGrid id="dataGridExample" runat="server" ... /> 

</f orm> 
</body> 
</html> 



ripn KOMnn^npaHeTO My ce noi<a3BaT flaHHMTe b 6pay3"bpa: 



'=? http://localho5t/Demo-&-DataBinding/EHample4.aspH - Microsoft Internet Explorer 



^jn|2< 



File Edit View Favorites Tools Help 



1/ 



©Back - O " 3 i»l 'it | P Search f? Favorites € \ 0- Q, ^ - □ jfX 



Address g] http://localhost/Demo-6-DataBinding/Example4.aspx 



^IH< 



CBi>p3BaHe c flaHHH (DataBinding) Ha DataView 



IntegerValue 


StringValue 


DateTime Value 


Boole anValue 


1 


Item 1 


06.9.2005 r. 23:42:49 


True 


2 


Item 2 


06.9.2005 r. 23:42:49 


False 


3 


Item 3 


06.9.2005 r. 2342:49 


True 


4 


Item 4 


06.9.2005 r. 2342:49 


False 


5 


Item 5 


06.9.2005 r. 23:42:49 


True 


6 


Item 6 


06.9.2005 r. 2342:49 


False 


7 


Item 7 


06.9.2005 r. 2342:49 


True 


8 


Item 8 


06.9.2005 r. 23:42:49 


False 


9 


Item 9 


06.9.2005 r. 2342:49 


True 



d 



|*_Jj Local intranet 



A 



208 nporpaMnpaHe 3a .NET Framework (tom 2) 

B noc/ieflHkifl npuMep me HanpaBMM CB"bp3BaHe Ha flaHHM c M3pa3M 
(expressions) v\ MeTOflu, komto me M3BMKBaMe napaMeTpi/mHo: 



<html> 
<head> 

<script language="C#" runat="server"> 

void Page_Load (Ob j ect Src, EventArgs E) 

{ 

if ( ! Page. IsPostBack) 

{ 

ArrayList values = new ArrayList ( ) 

values. Add (0) 

values. Add (1) 

values. Add (2) 

values. Add (3) 

values. Add (4) 

values. Add (5) 

values. Add (6) 

DataListExample . DataSource = values; 
DataListExample . DataBind ( ) ; 



} 



) 



String EvenOrOdd (int number) 

{ 

if ( (number % 2) ==0) 

return "Even"; 
else 

return "Odd"; 

} 
</script> 
</head> 
<body> 

CBtp3BaHe c jaHHH (Databinding) k , bm MeTOflM m M3pa3H 

<form runat=server ID="FormExample5"> 

<asp : DataList id="DataListExample" runat="server" ... > 
<ItemTemplate> 

Number Value: <%# Container . Dataltem %> 
Even/Odd: <%# EvenOrOdd ( (int ) Container . Dataltem) 
</ItemTemplate> 
</asp:datalist> 
</f orm> 
</body> 
</html> 



To3M ntT AaHHMTe ce noKa3BaT b DataList, b Lua6/iOHa, Ha komto ce noi<a3BaT 
AaHHMTe ot ue/ionwc/ieH MacuB m M3BMKBaHMflTa ot MeTOfl. Ha MeTOAa ce 
noflaBa nopeflHaTa ue/ionwcneHa ctomhoct. 3a6e/ie>KeTe rbBKaBOcrra Ha 



T/iaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



209 



pa6oTaTa c flaHHM - MO>KeM fla B3eMeM nopeflHua 3annc ot 6a3a ot flaHHM v\ Ha 
HeroBa ocHOBa fla noKaweM .qoiTb/iHMTe/iHM ctomhoctm v\i\v\ v\3\\s\j\o npoMeHeHM 

flaHHM. 



3 http://localhost, Demo-6-DataBinding/EK-ample5.aspK - Microsoft Internet Explorer 



File Edit View Favorites loo Is Help 



_Jfl|x| 



Q Back - O T 3 [2 'ti I P Search iV Favorites € | 0" & JKJ » C 



Address y^\ http://localhost/Demo-6-DataBindina./Ex.ample5..aspx 



^IH< 



CB~bp3BaHe c flaHHM (Databinding) kt>m MeTOfli* m M3pa3M 



Number 


Value 


Even/Odd: Even 


Number 


Value 


1 Even/Odd: Odd 


Number 


Value 


2 Even/Odd: Even 


Number 


Value 


3 Even/Odd: Odd 


Number 


Value: 4 Even/Odd: Even 


Number 


Value 


5 Even/Odd: Odd 


Number 


Value 


6 Even/Odd: Even 



|*J Local intranet 



//. 



Pa6oTa c 6a3M ot AaHHM ot ASP.NET 

B npaKTMKaTa npn mouth bcmukm ye6 npM/io>KeHMfl ce Ha/iara pa6crra c flaHHM. 
Tnnn4HMflT cueHapuM BK/iK>HBa BM3ya^M3aun5i Ha Ta6/ikmHki flaHHM, MflBaiun ot 
Ta6^Mun b 6a3aTa flaHHM, KaKTO v\ Ao6aB*iHe Ha hobm 3anncn v\ peflaKTupaHe v\ 
M3TpnBaHe Ha ctiuecTByBaiun. TaKMBa npn^OKeHMa o6mkhob6ho ce M3rpa>K- 
flaT 4pe3 CB-bp3BaHe Ha ASP.NET ye6 cpopMM c ADO.NET. 

ripeflu fla M3ACHMM no KaicbB HanMH MOxeM fla M3rpa>KflaMe ye6 npn^OKeHMa, 
ki3no/i3Bamki pe/iauMOHHM 6a3M ot flaHHM, HeKa cm npMnoMHMM ocHOBHMTe 
KOHuenuMM ot AD0.NET. IHe HanpaBMM caMO o6iu o63op Ha B3aMM0fleM- 
CTBMeTO Me>Kfly ASP.NET m ADO.NET. 3a noBe^e noflpo6HOCTM 3a ADO.NET m 
pa6oTaTa c 6a3M ot flaHHM, pa3r/ie,qaMTe r/iaBaTa, nocBeTeHa cneuMa/iHO Ha 
Ta3M TeMa. 



0630p Ha ADO.NET 

npM c"b3flaBaHeT0 Ha ye6 caMTOBe, komto Tpa6Ba fla noflfl"bp>KaT xm/iaam 
eflHOBpeMeHHM noceiueHMa ot xm/iaah noTpe6MTe/iM, me ca Hy>KHM cbmHfl 
6poM OTBopeHM Bpt3KM KtM 6a3aTa ot flaHHM. flopM cbpBtpMTe, OTrOBapfllflM 
3a noflflp"b>KKaTa Ha 6a3aTa ot flaHHM, fla ycne^T fla M3fl"bp>KaT Ha TOBa 
HaTOBapBaHe, CKopociTa, c koato me pa6oTM npM/io>KeHMeTO, me e HeTbpnMMO 
6aBHa. 3aT0Ba e cm/iho npenoptuMTe/iHO npM pa6oTa c 6a3M ot flaHHM c 
ASP.NET fla ce M3no/i3Ba HecB"bp3aHMAT MOAe/i. 



210 nporpaMnpaHe 3a .NET Framework (tom 2) 

06eKTM 3a pa6oTa c 6a3M oTflaHHM 

B r/iaBaTa 3a ADO.NET Te3M o6eKTM ca no,qpo6HO o6acHeHM, 3aT0Ba TyK caMO 
me rn cnoMeHeM v\ me 0T6e/ie>KMM KaK ce M3no/i3BaT b ASP.NET. 

- Connection - Bp"b3Ka K"bM 6a3aTa OT flaHHM. 

- command - KOMaHfla, cnywema 3a M3n"b^HABaHe Ha 3aaBKM Btpxy 6a3aTa 

OT flaHHM M 3a M3B/lMHaHe Ha flaHHM. 

- DataReader - neTeu. Ha flaHHM, BtpHaTM KaTO pe3y/iTaT ot 3aaBKa ot 
6a3aTa ot flaHHM. 

- Dataset - Keuj Ha nacr ot 6a3aTa ot flaHHM b naMeira. C"bfl"bp>Ka 
Ta6^MUM, pe^auMM, orpaHM^eHMfl m t.h. 

- DataAdapter - cpeflCTBO 3a M3B^M4aHe Ha flaHHMTe ot 6a3aTa m o6hoba- 

BaHeTO MM 4pe3 DataSet 06eKTM. 

Bn3yann3npaHe Ha flaHHM 

no4TM bcako ye6 npM^o>KeHMe, KoeTO no/i3Ba 6a3a ot flaHHM, MMa Hy>Kfla fla 
npeflCTaBM Te3M flaHHM Ha noTpe6MTe/ifl. KoraTO ce OTHaca ao eflMHM^HM no/ie- 
Ta (np. noTpe6MTe^CKO MMe m/im flaTa) ce M3no/i3BaT eTMKeTM m/im ziMTepa/iM. 
KaKBO o6ane fla npaBMM, aKO MCKaMe fla noKa>KeM cnMCbKa Ha bcmukm noTpe- 
6MTe^M c TexHMTe fleTaM^M nofl cpopMaTa Ha Ta6/iMu.a? V\nv\ aKO MCKaMe fla vv\ 
noKa>KeM b naflaiuo MeHK>? 3a fla pea/iM3MpaMe Te3M m mhoto flpyrM MaHMny- 
^auMM MO>KeM fla M3no/i3BaMe T.Hap. CB"bp3aHM kohtpo/im (bound controls). Te 
MrpayiT Ba>KHa po/ia b pa3pa6oTKaTa Ha ye6 npM/io>KeHMfl, 3aiuoTO no3BO/iflBaT 
6"bp3a m MHTyMTMBHa pa6oTa. 

IHe pa3r/ie,qaMe flBa BMfla CB"bp3BaHe Ha flaHHMTe - npocTO m c/io>kho, KaKTO m 

HaM-Ba>KHMTe CBtp3aHM KOHTpO/lM. 

CBi>p3BaHe Ha flaHHM (data binding) 

CB"bp3BaHeT0 Ha flaHHM e npouecbT Ha flMHaMMUHO M3B/iMnaHe Ha flaHHM ot 
3aflafleH m3T04hmk m BM3ya/iM3MpaHeT0 mm npe3 noflxoflaiflM kohtpo/im. 

3a pa3^M4HMTe kohtpo/im m3T04hmkbt Ha flaHHM ce 3aflaBa npe3 pa3/iMHHM 

CBOMCTBa - Text, DataSource, DataTextField. C/iefl Ma/1K0 Lfle 06flCHMM KaK 
Ce M3n0^3BaT Te3M CBOMCTBa npM pa3^M4HMTe CB"bp3aHM KOHTpO/lM. 

Tpa6Ba fla 0T6e/ie>KMM, ne b hakom c/iynaM (HanpMMep npM M3no/i3BaHeTO Ha 

CBOMCTBOTO DataSource) , CB"bp3BaHe He Ce M3B"bpilJBa, npeflM fla Ce M3BMKa 
MeTOfl"bT DataBindO . 

M3T04HMUMTe Ha flaHHM 3a CB"bp3aHMTe kohtpo/im MoraT fla ca pa3H0p0flHM, He 

CaMO flaHHM OT 6a3M OT flaHHM. M3T04HMK Ha flaHHM MO>Ke fla e BCeKM 06eKT OT 

K/iac, MMn^eMeHTMpaiu MHTepcpekica icoiiection. 1/lMn/ieMeHTau.MflTa Ha to3m 
MHTepcpeMC flaBa bcmuko Heo6xoflMMO, 3a fla ce M3B"bpujM CB"bp3BaHeT0 Ha 
flaHHMTe. KaTO pe3y/iTaT ot TOBa, MO>KeM fla M3no/i3BaMe KaTO m3T04hmum Ha 
flaHHM 3a CB"bp3aHM kohtpo/im BCAKa eflHa ot c/ieflHMTe CTpyKTypM: 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 211 

- K/iacoBe ot .NET Framework, komto WMn/ieMeHTkipaT icollection: 
MacuBM, cnncbun (copTupaHM v\nv\ CB"bp3aHn), xeiu Ta6/ikmw, CTeKOBe, 
onaujKM, penHi/iKOBi/i KO/ieKui/ii/i. 

- noTpe6nTe^CKM K/iacoBe, MMn^eMeHTupaiun MHTepcpewca icollection 
v\nv\ HAKOki npon3BOAeH Ha Hero (npuMepHO iList). 

- K/iaCOBe, CB"bp3aHkl C pa60TaTa C 6a3M flaHHkl - DataTable V\ DataSet. 
T"bM KaTO 06eKT OT Tkin DataSet MO>Ke fla Cbfl"bp>Ka MHOTO DataTable 
06eKTM C/iefl KaTO yKa>KeM Ha DataSource CBOMCTBOTO DataSet o6eKTa, 

Tpa6Ba fla 3aflafleM Ha cbomctboto DataMember MMeTO Ha Ta6/ii/iuaTa, 

KOflTO MCKaMe fla CB"bp>KeM. 

- Oki/iTpwpaHM noflMHO>KecTBa ot peflOBeTe Ha eflHa DataTable Ta6/iwua- 
Ta: o6eKTM ot Tun Dataview. 

He MOxeM flupeKTHO fla 3aflafleM KaTO m3T04hmk Ha flaHHM 3a CB"bp3BaHe XML 
AOKyMeHT. Tpa6Ba fla 3apeflMM cbfltpaoHkieTO Ha flOKyMeHTa b eflHa ot 
cnoMeHaTMTe no-rope crpyKTypw, 3a fla ce B"b3no/i3BaMe ot CB"bp3BaHeTO Ha 

flaHHM. 

llpOCTO CBl>p3BaHe 

npocTOTO CB"bp3BaHe yKa3Ba Bp"b3Ka Me>Kfly HflKaKBM flaHHM v\ cbomctbo Ha 
HAKOfl KOHTpo/ia. Ta3M Bp"b3Ka ce 3aflewcTBa npn M3BMKBaHeTO Ha MeTOfla 
DataBindO Ha cpopMa v\i\v\ KOHTpo/ia, KoraTO CB"bp3BaiflMflT M3pa3 ce oueHABa 
m ce npw/iara. 

CB"bp3Baiu M3pa3 npeflCTaB^ABa BceKM TeKCT, 3arpafleH b TaroBeTe <%# v\ %>. 
CB"bp3BaiflM M3pa3M MO>KeM fla nocTaBAMe HaBCAKbfle b .aspx (.ascx) cpaw/ia 
Ha ye6 cpopMa/ KOHTpo/ia. HaM-necro Te 3aMecTBaT CTOMHOCTTa Ha hakom aTpn- 
6yT Ha KOHTpo/ia. OrpaacflaT ce c eflMHM4HM iobi/iukm, 3a fla ce OT/ii/maBaT ot 
aTpn6yTMTe, komto ca cabomhh KaBMUKi/i: 



<asp: Button ID="btnName" Runat="server" 
Text='<%# "Bail MBaH" %>' /> 



Ako cb3flafleM HOBa ye6 cpopMa, nocTaBMM b Hea ropeonncaHna 6yTOH v\ 
HaTMCHeM [F5], me 3a6e/ie>KkiM, ne KaTO TeKCT Ha 6yTOHa He ce noi<a3Ba 
HMiflo. ToBa e TaKa, 3aiuoTO He CMe i/i3BHKa/in MeTOfla DataBindO. 3a fla 
npopa6oTM ropHMHT npuMep, Tpa6Ba fla M3BMKaMe T03M MeTOfl, npuMepHO npn 
o6pa6oT4MKa Ha c"b6nTneTO Load Ha cpopMaTa: 



private void Page_Load (ob j ect sender, System. EventArgs e) 

{ 

this . DataBind ( ) ; 

} 



TopHMflT npuMep He 6m ce ki3no/i3Ba/i b npaKTMKaTa, 3aiflOTO 6nxMe nocTur- 

UdtlWA CblflMfl eCpeKT flMpeKTHO C Text="BaM MBaH". V\OI\3V\je OT TaiCbB CMHTaK- 



212 



flporpaMnpaHe 3a .NET Framework (tom 2) 



cue ce BM>KflaT b c/iynai/ue, KoraTO 3a CB"bp3Baiu M3pa3 yKa3BaMe no-c/io>KeH 
M3pa3. B M3pa3a MoraT fla ce BMKaT MeTOflu Ha e3MKa, Ha komto ce KOMrm/inpa 
CTpaHnuaTa, HanpuMep: 



<asp 


textbox 


id= 


"tx 


tFirstName" 


runat 


="server" 


Text=' 


<%# 


GetD 


ata 


( "FirstName 


") %>' 


/> 


<asp 


textbox 


id= 


"tx 


tLastName" 


runat= 


"server" 


Text=' 


<%# 


GetD 


ata 


("LastName" 


) %>' 


/> 



Tpa6Ba fla HanpaBMM yTOHHeHkie, ne MeTOflMTe, yuacrBamw b M3pa3a, Tpa6Ba 
fla ca AOCTbnHki bbb cpopMaTa. OopMaTa e HacneflHkiK Ha code-behind K/iaca v\ 
cneflOBaTe/iHO He MOweM fla M3BMKaMe ot Hea nacreH (private) MeTOfl Ha 
code-behind K/iaca. 3aTOBa luom flecpMHupaMe MeTOflu, komto MCKaMe fla 
M3BMKBaMe ot cpopMaTa, Tpa6Ba fla mm yKaweM bmammoct public, v\nv\ 
protected. Eto npwMep: 



public string GetData ( string f ieldName ) 

{ 

switch (f ieldName) 

{ 

case "FirstName": 

return "MBaH"; 

break; 
case "LastName": 

return "MBaHOB"; 

break; 
default : 

return "Unknown"; 

break; 



Ctiokho CBi>p3BaHe 

Mhoto necro hm ce Ha/iara fla Bki3ya/iki3kipaMe ro/iflMO KO/iwuecTBO flaHHM, 
M3B/ieneHi/i ot 6a3a ot flaHHM. C/io>khoto CB"bp3BaHe npeflcraB/iHBa CB"bp3BaHe 
Ha MHO>KecTBO peflOBe/cBOMCTBa c eflHa KOHTpo/ia. l/l3no/i3Ba ce npeflMMHO b 
cnncb^HMTe m MTepupaiflMTe kohtpo/im, komto me pa3r/ieflaMe no-,qo/iy. 



KoHTpojiw 3a noKa3BaHe Ha aaHHM 

Mo>KeM yc/iOBHO fla pa3,qe/ii/iM KOHTpo/ikiTe 3a noKa3BaHe Ha flaHHM b flBe 
rpynn - cnwcbUHM v\ MTepupaiun. 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 213 

CniiCbHHIi KOHTpO/IM 

CnMCbUHklTe KOHTpO/lkl Ca DropDownList, CheckBoxList, RadioButtonList M 

ListBox. OnrypupaHeTO Ha AyMaTa List (cnwcbK) b MMeTO mm, noi<a3Ba ne 
c/iywaT 3a npeAcraBsiHe Ha AaHHkiTe noA cpopMaTa Ha cnwcbK. HeKa pa3r/ie- 
AaMe KaKBM ca o6iui/iTe Heiua Me>KAy tax. 

6a30BM$iT K/iac ListControl 

K/iacoBeTe Ha crmcbUHMTe kohtpo/im npoi/i3/iM3aT ot eAHH v\ cbiu a6cTpaKTeH 
6a30B K/iac - ListControl. Tom ocurypflBa ro/isiMa nacr ot cpyHKui/iOHa/i- 
HOCTTa Ha cnwcbUHMTe kohtpo/im. 

BcflKa cnwcbUHa KOHTpo/ia cbAtpwa KO/ieKui/m items. Ta3M KO/ieKuwa 
OTroBapa 3a e/ieMeHTMTe Ha crmcbKa. BceKM e/ieMeHT Ha cnncbKa e ot Tun 
Listitem m MMa Tpn CBOMCTBa, komto ro xapaKTepw3kipaT - Text, Value M 
Selected. IIO/ieTO Text CbA"bp>Ka TeKCTa, KOMTO Rd Ce nOKa>Ke. llO/ieTO Value 

cbAtpwa CTOMHOCTTa Ha ctOTBeTHMfl e/ieMeHT. npuMepHO MO>KeM p,a noKaweM 
cnwcbK c MMeHaTa Ha A"bp>KaBMTe Bt/irapwyi, TepMaHMfl, Pycua, CAIH, v\ p,a 
M3no^3BaMe 3a K/iionoBa ctomhoct TexHMTe A"bp>KaBHM KOAOBe - BGR, DEU, 
RUS, USA. no/ieTO selected cbAtpwa 6y/ieBa ctomhoct, noKa3Baiua p,anv\ 
cbOTBeTHi/iflT e/ieMeHT Ha cnncbKa e M36paH. 

OCHOBHaTa CpyHKUMOHa^HOCT, KOflTO npeAOCTaBAT CriMCbUHMTe kohtpo^m, e 
B"b3MO>KHOCT 3a M36op ot e/ieMeHTMTe Ha cnncbKa. 

TeKym M36paH e/ieMeHT b cnncbHHM kohtposim 

3a pa6oTa c M36paHMTe e/ieMeHTM ce ki3no/i3BaT CBOMCTBaTa seiectedindex, 

Selectedltem M SelectedValue : 

- seiectedindex Bptiua MHAeKca Ha ntpBMfl M36paH e/ieMeHT ot cnwcbKa. 
Ako HHMa TaKtB, Bptiua -l. CrowHOCTTa Ha TOBa no/ie MO>Ke p,a ce 
3aAaBa nporpaMHO. 

- selectedltem Bptiua ntpBMfl M36paH e/ieMeHT ot cnncbKa. Ako HHMa 
TaKtB, Bptiua null. 

- SelectedValue Bptiua CTOMHOCTra Ha iTbpBkifl M36paH e/ieMeHT ot 
crmcbKa. Ako H^Ma TaKtB, Bptiua null. Moxe p,a M3no/i3BaMe TOBa 
no/ie, KoraTO MCKaMe p,a 3aAaAeM nporpaMHO Ha HflKoa cnwcbUHa koh- 
Tpo/ia M36paH e/ieMeHT, ho He 3HaeM Ha koa no3nunfl ce HaMupa b 
cnncbKa. HanpuMep, aKO MMaMe cni/ictK c bci/iukm AtpwaBM v\ MCKaMe 
Bt/irapwyi Aa e M36paHa, ho He 3HaeM Ha koa no3nunfl ce HaMnpa. 
ToraBa 3aAaBaMe KaTO ctomhoct Ha no/ieTO SelectedValue - "BGR". 

BCklUKM CnMCbUHM KOHTpo/lkl MMaT Cb6klTkie SelectedlndexChanged. To ce 

npeAM3BMKBa npn npoM^Ha Ha MHAeKca Ha ntpBkisi M36paH e/ieMeHT. 

E/ieMeHTkiTe Ha cnwcbUHkiTe kohtpo/ii/i MoraT Aa ce AecpMHupaT ochobho no Tpn 
Hankma: AeK/iapaTMBHO (AnpeKTHO b .aspx/.ascx cpaw/ia), AHHaMkinHO (KaTO 
ce Ao6aBAT eAHH no eAHH b M3nt/iHMM koa), h 4pe3 CBtp3BaHe (KaTO cbOTBeT- 



214 nporpaMnpaHe 3a .NET Framework (tom 2) 

HaTa cnwcbUHa KOHTpo/ia ce CB"bp>xe c hakom m3T04hmk Ha flam-m). IHe fleMOH- 
CTpupaMe BceKM eflkm ot TpnTe MeTOfla. 

CnMCbHHM KOHTpO/lM M CB"bp3BaHe C AaHHMTe 

BCM4KM CnMCbUHkl KOHTpO/lM MMaT eflHM M CbLflM CBOMCTBa, OTrOBapflLflM 3a 
CB"bp3BaHeTO C M3T04HMUM Ha flaHHM - DataSourcs, DataTextField, 
DataValueField, DataTextFormatString M DataMember : 

- DataSource Onpefle/lfl M3T04HMKa Ha ashhu. 

- DataTextField onpefle/ifl CTOMHOCTMTe Ha Koe no/ie ot M3T04HMKa Ha 
AaHHM fla ce ki3no/i3BaT 3a ctomhoctm Ha no/ieTO Text 3a e/ieMeHTMTe Ha 
cnncbKa. 

- DataValueField onpefle/ia CTOMHOCTMTe Ha Koe no/ie ot M3T04HMKa Ha 
AaHHM fla ce M3no/i3BaT 3a ctomhoctm Ha no/ieTO value 3a e/ieMeHTMTe 
Ha cnncbKa. 

- DataTextFormatString Onpefle/lfl KaK"bB CpopMaTkipaifl HM3 fla ce 
M3no/i3Ba 3a Bi/i3ya/iki3kipaHe Ha TeKCTa. B cnynai/i, ne M3T04HMK"bT Ha 
flaHHM e OT TMn DataSet, C"bfl"bp>KaiU nOBene OT eflMH DataTable 06eKT, 

ce M3no/i3Ba no/ieTO DataMember, KoeTO 3aflaBa KOfl T04HO Ta6/iwua fla 
ce M3no/i3Ba. 

KoHTpo/iaTa DropDownList 

KoHTpo/iaTa DropDownList noi<a3Ba flaHHMTe nofl cpopMaTa Ha naflaiu cnwcbK, 
ot komto MO>Ke fla ce M36npa caMO eflMH e/ieMeHT: 



MeMO flyx 



|Me40 JQyk 
Tiirtp 
ripac^o 
Hopn 



BceKM eflMH ot e/ieMeHTMTe Ha cnwcbKa e o6eKT ot Tun Listitem. HeKa noKa- 
>KeM KaK CTaBa taxhoto flecpMHupaHe 3a DropDownList KOHTpo/iaTa b ropHna 
npuMep. MMa Tpn ochobhm Hankma: fleK/iapaTMBHO (cram 4 ho), flMHaMMUHO i/i 
npe3 CB"bp3BaHe Ha flaHHM (data binding). 

fleK/iapaTMBHo (craTMHHo) 3aAaeaHe Ha e/ieMeHTMTe b 

CnHCbHHH KOHTPO/1M 

fleK^apaTMBHOTO (i/i3Becmo oiue KaTO CTaTMHHo) 3aflaBaHe Ha e/ieMeHTMTe b 
cnncb^HM kohtpo^m e Haw-npocri/mT BapnaHT fla 3apeflMM flaHHM b cnwcbUHa 
KOHTpo/ia. To CTaBa npe3 flecpMHupaMe e/ieMeHTMTe flupeKTHO b .aspx (.ascx) 
cpaw/ia: 



<asp : DropDownList ID="ddlList" Runat="server"> 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 215 



<asp 


Listltem 


Value= 


. ii -i 


'>Me^o nyx</ 


asp : Listltem> 


<asp 


Listltem 


Value= 


= "2 


'>TMr r bp</asp 


: Listltem> 


<asp 


Listltem 


Value= 


= "3 


'>Ilpacyo</as 


p : Listltem> 


<asp 


Listltem 


Value= 


.ii q 


'>MopM</asp : 


Listltem> 


</asp:E 


ropDownList> 









flMHaMHHHO 3aA3BaHe Ha e/ieMeHTMTe B CnHCbHHH KOHTPOS1M 

ripn AHHaMM^HOTO 3aAaBaHe Ha e/ieMeHTMTe b cnwcbUHi/i kohtpo^m ce M3no/i- 

3Ba CBOMCTBOTO Items. 

Eto eAMH npuMep. flecpMHupaMe KOHTpo/iaTa b .aspx (.ascx) cpai/i/ia: 



<asp : DropDownList ID="ddlList" Runat="server"> 
</asp : DropDownList> 



Cnep, TOBa AHHaMMUHO Ao6aBHMe e/ieMeHTkiTe b KOfla: 



ddlList 


Items 


.Add (new 


Listltem 


"Meqo nyx", "1") ) ; 


ddlList 


Items 


.Add (new 


Listltem 


"Twr'bp", "2") ) ; 


ddlList 


Items 


.Add (new 


Listltem 


"npacyo", "3") ) ; 


ddlList 


Items 


.Add (new 


Listltem 


"Mopw", "4") ) ; 



3aAaBaHe Ha e/ieMeHTMTe b cnMCbHHM kohtpo/ih npe3 
CBi>p3BaHe Ha flaHHM 

CB"bp3BaHeTO Ha ashhh etc cnwcbUHa KOHTpo/ia ce M3no/i3Ba Haw-necTO, 
KoraTO AaHHMTe MABaT ot 6a3aTa ashhu. To ce pea/ii/i3i/ipa Ma/iKO no-cno>KHO b 
cpaBHeHne etc craTMUHOTO v\ AHHaMkinHOTO 3aAaBaHe Ha e/ieMeHTMTe. 

3ano4BaMe c yi<a3BaHe Ha M3T04HMKa Ha ashhh, ioto me i/i3no/i3BaMe ABa 
pa3^M4HM Tuna. ritpBHAT me 6"bAe MacuB ot noTpe6i/iTe/iCKi/i o6eKTM, a btopm- 

flT DataSet, C"bA"bp>KaiU DataTable. 

noTpe6nTe^CKMflT K/iac, ot komto me ce escrow MackiBvr, M3r/ie>KAa TaKa: 



public class Character 

{ 

private string name; 
private long id; 
public string Name 

{ 

get { return name; } 
set { name = value; } 

} 

public long ID 

{ 

get { return id; } 
set { id = value; } 

} 



216 flporpaMnpaHe 3a .NET Framework (tom 2) 





public Character ( string name, 

{ 

this. name = name; 


long id) 








this. id = id; 






} 




} 







flecpMHupaMe KOHTpo/iaTa b .aspx v\s\v\ . ascx cpaw/i: 



<asp : DropDownList ID="ddlList" Runat="server" 

DataTextField="Name" DataValueField="ID"> 
</asp : DropDownList> 



M3KycTBeHO me c"b3flafleM MacuB ot e/ieMeHTki character (Ha npaKTMKa to3m 
MacuB Moxe e i/i3B/ieneH ot 6a3a ot ashhh): 



Character [] bookCharacters = new Character ['_ 

{ 

new Character ( "Meyo Ilyx", 1), 
new Character ( "Tnr r bp" , 2), 
new Character ( "Ilpacyo" , 3), 
new Character ( "Mopw" , 4) 

}; 

ddlList . DataSource = bookCharacters; 
ddlList . DataBind ( ) ; 



B noc^eAHMTe RBa peAa ot npuMepa, MacuBtT bookCharacters ce 3aAaBa 

KaTO M3T04HMK Ha ASHHH 3a DropDownList KOHTpO/iaTa M Ce M3BMKBa MeTOA"bT 
DataBind(), 3a Rd Ce CB"bp>KaT ASHHUTe CHejl. 

3a Aa AeMOHCTpupaMe CB"bp3BaHe c Dataset o6eKT, me ce Ha/io>Kki v\ Hero p,a 
cb3AaAeM M3KycTBeHO. HeKa AecpMHupaMe OTRenen MeTOA, komto Bptiua o6eKT 

OT TMn DataSet: 



public DataSet GetDataSource ( ) 

{ 

DataSet dataSource = new DataSet ( ) ; 

DataTable charactersTable = new DataTable ( "Characters" ) 

Characters . Columns .Add ( "ID" , typeof (long) ) ; 
Characters . Columns .Add ( "Name" , typeof ( string) ) ; 

DataRow rowl = charactersTable . NewRow () ; 

DataRow row2 = charactersTable . NewRow () ; 

DataRow row3 = charactersTable . NewRow () ; 

DataRow row4 = charactersTable . NewRow () ; 

rowl ["Name"] = "Meqo Ilyx"; 
rowl ["ID"] = 1; 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 217 



row2 [ "Name"] = "Twrtp"; 

row2 ["ID"] = 2; 

row3 [ "Name"] = "Ilpacyo"; 

row3["ID"] = 3; 

row4["Name"] = "Mopw"; 

row4["ID"] = 4; 

charactersTable . Rows .Add ( rowl ) ; 
charactersTable . Rows .Add ( row2 ) ; 
charactersTable . Rows .Add ( row3 ) ; 
charactersTable . Rows .Add ( row4 ) ; 

da taS our ce . Tables .Add (charactersTable) 

return dataSource; 



} 



flecpMHupaMe KOHTpo/iaTa b . aspx m/im . ascx cpaw/ia: 



<asp : DropDownList ID="ddlList" Runat="server" 

DataSource='<%# GetDataSource ( ) %>' DataTextField="Name' 
DataValueField="ID" DataMember="Characters"> 

</asp : DropDownList> 



B npuMepa no-rope KaTO ctomhoct Ha cbomctboto DataSource CMe 3afla/iM 

CB"bp3BaiU M3pa3, KOMTO M3BMKBa CpyHKUklflTa GetDataSource () . CB"bp3BaiU 

M3pa3 MO>Ke fla ce 3a,qaBa caMO 3a TOBa no/ie Ha cnwcbUHa KOHTpo/ia. yi<a3a/iki 
CMe cbiuo m CTOMHOCTTa Ha cbomctboto DataMember fla e "Characters" - MMeTO 
Ha Ta6^nuaTa ot Dataset o6eKTa, koato cnyww 3a m3T04hmk Ha ashhu. B 
c/iynaa Dataset o6eKTbT MMa caMO eflHa Ta6/ikiua v\ no/ieTO DataMember MO>xe 
fla 6"bfle nponycHaTO, ho CMe ro fla/in 3a nt/iHOTa. 

KoHTpo/iaTa CheckBoxList 

Ta3M KOHTpo/ia noKa3Ba flaHHMTe nofl cpopMaTa Ha cnwcbK ot checkBox 
kohtpo^m, ot komto MoraT fla ce M36npaT npon3BO^eH 6poki e^eMeHTM. Eto 
KaK M3Me>Kfla ta: 



DMeno Ilyx 
DTurtp 
DlIpacHO 
â–¡ HopH 



Ha^MHMTe, no komto MoraT fla ce 3aflaflaT e/ieMeHTMTe Ha cnwcbio, ca 
aHa/iorwuHM Ha Te3M 3a DropDownList KOHTpo/iaTa. /lon"b/iHkiTe/iHkiTe xapaK- 

TepMCTMKM 3a CheckBoxList Ce Onpefle/lflT npe3 nO/ieTaTa RepeatColumns, 
RepeatDirection M RepeatLayout : 



218 nporpaMnpaHe 3a .NET Framework (tom 2) 

- Hpe3 cbomctboto Repeatcoiumns ce 3a,qaBa b ko/iko ko/iohi/i fla ce 
noKa>Ke cnwcbKbT (no noflpa36npaHe b eflHa). 

- Cbomctboto RepeatDirection onpefle/ia b KaKBa nocoKa fla ce 
noflpe>KflaT e/ieMeHTMTe Ha cnwcbKa - vertical (no noflpa36npaHe) v\nv\ 

Horizontal. 

HeKa flecpMHupaMe KOHTpo/iaTa TaKa: 



<asp : CheckBoxList ID="chkCharactersList" Runat="server' 
RepeatColumns="2 " RepeatDi rection= "Vertical "> 
<asp : Listltem Value="l">Meyo Ilyx</asp : Listltem> 
<asp : Listltem Value="2 ">TMr r bp</asp : Listltem> 
<asp : Listltem Value="3">Ilpacyo</asp : Listltem> 
<asp : Listltem Value="4">Mopw</asp : Listltem> 

</asp : CheckBoxList> 



B T03M cnynai/i pe3y/iTaTbT me 6"bfle c/ieflHH5rr: 



ZlMenoIIyx DlIpacHO 
QTHrtp DHopH 



AKO CBOMCTBOTO RepeatDirection klMa CTOMHOCT Horizontal, BMeCTO 

vertical, to pe3y/iTaTbT me e c^eflHMAT: 



ZlMenoIIyx [HTHrbp 
ZIIIpacHO ZlHopH 



Cbomctboto RepeatLayout OTTOBapa 3a Hani/ma, no komto ce npeflcraBflT e/ie- 
MeHTMTe Ha cnncbKa. To MO>Ke fla npneMa caMO flBe ctomhoctm - Flow v\ 
Table. CTOMHOCTTa My no noflpa36npaHe e Table. Ako CTOMHOCTra e Fiow[,], 
3a fla ce npeflcraBHT e/ieMeHTMTe Ha pa3/innHw peflOBe (eflMH nofl flpyr), c/iefl 
noc^eflHMfl e/ieMeHT Ha BceKM pefl ce nocraBsi <br>, 3a fla ce npeMi/me Ha 
c^eflBaiflMfl. Ako CTOMHOCTra e Table, e/ieMeHTi/ue ce npeflcraBAT b Ta6/iwnHa 
CTpyKTypa. 

KoHTpo/iaTa RadioButtonList 

Pa3/lMKklTe Me>Kfly CheckBoxList M RadioButtonList ca B HanklHa Ha npefl- 

craBAHe Ha flaHHMTe v\ b 6poa Ha e/ieMeHTMTe, komto MoraT fla ce M36npaT 
eflHOBpeMeHHO. 

ripn RadioButtonList e/ieMeHTMTe Ha cnncbKa ce npeflcraBAT TaKa: 

OMeno Hvx 
OTurbp 
OlIpacHO 
OHopH 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 219 

CaMO eAMH e/ieMeHT ot cnwcbKa MO>Ke fla 6"bfle M36paH. 

Ha^MHMTe 3a flecpi/mi/ipaHe Ha e/ieMeHTkue Ha cnwcbKa v\ CBOMCTBaTa Ha 
KOHTpo^aTa ca cbiunTe, iokto npn checkBoxList. 

KoHTpo/iaTa ListBox 

Ta3M KOHTpo/ia noKa3Ba flaHHMTe nofl cpopMaTa Ha cnwcbK, nocTaBeH b kytma. 



Msmo riyx 
Tkirbp 
ripac40 
Hopn 



MMa ABe CBOMCTBa, komto xapaKTepn3npaT Ta3M KOHTpo/ia: Rows v\ 

SelectionMode : 

- CTOMHOcrra Ha no/ieTO Rows onpefle^a ot ko/iko pefla ce cbcrow 
KyTMATa. Ako e/ieMeHTMTe Ha cnwcbKa ca noBene ot Ta3M ctomhoct, 
ota^cho Ha KyTMATa ce nosiBflBa n/it3raiua ce zieHTa (scroiiBar). 

- Cbomctboto SelectionMode MO>Ke fla npweMa caMO flBe ctomhoctm - 

Single M Multiple. AKO CTOMHOCTTa My e Single, TO OT CnklCbKa MO>Ke 

fla ce M36npa caMO eflMH e/ieMeHT. B npoTMBeH c/iynaw MO>Ke fla ce 
M3B"bpujBa MHO>KecTBeHa ce^eKunfl. 

I/I Te pupa 114 m kohtpo/im 

Cnncb^HMTe kohtpo^m npeflocraBflT 6a30BaTa cpyHKuwoHa/iHOcr, Heo6xoflMMa 
Ha eflHO ye6 npw/io>KeHi/ieTO fla KOMyHMKupa ycneiuHO c noTpe6kiTe/i*i. Hpe3 
tax flaHHMTe ce noi<a3BaT Ha noTpe6i/iTe/ifl v\ tom MO>xe fla HanpaBM M36op ot 
tax. 

B mhoto cnynaw e yflanHO Te3M flaHHM fla ce npeflcraBAT b Ta6/ii/meH bma. 
HanpuMep, aKO pa6oTMM c 6a3a ot flaHHM v\ MCKaMe HaiueTO npw/io>KeHkie fla 
Bki3ya/iki3kipa bcmukm flaHHM ot flafleHa Ta6/ikiua. 

CTapMflT HdHMH 3a MTepaULMfl 

Hy>KflaTa ot BM3ya/iM3kipaHe Ha flaHHM b Ta6/ii/mHa cpopMa He e Heiuo hobo. B 
K/iacwuecKOTO ASP (npeflu noyiBaTa Ha ASP.NET) ce no/i3Bauje cnep,uv\s\ HanwH 
Ha pea/iM3auwfl: 



<table border="l" cellpadding="0" cellspacing="0"> 
<tr> 
<% 

int dataltemsCount = Data . Tables [ 0] . Rows . Count; 

int dataColumnsCount = Data . Tables [ 0] . Columns . Count; 



220 flporpaMnpaHe 3a .NET Framework (tom 2) 



for(int i=0; i < dataColumnsCount; i++) 
{ 

O S 

<td align="center" 

style="background-color : #00AAFF; padding: 5px; "> 
<b> 

<%= Data. Tables [0] . Columns [i] . ColumnName %> 
</b> 
</td> 
<% }%> 
</tr> 
<% 

for(int i = 0; i< dataltemsCount; i++) 
{ 

<tr style="background-color : white; "> 

for(int j = 0; j< dataColumnsCount; j++) 
{ 

<td style="padding : 5px; "> 

<%= Data. Tables [0] .Rows[i] [j] . ToString ( ) %> 
</td> 
<% }%> 
<tr> 

<% }%> 
</table> 



B npuMepa no-rope CMe ki3no/i3Ba/ii/i o6eKTa Data, komto e ot Tun Dataset. 
TtM KaTO m 3a HanpeA me hm ce Ha/io>Kki p,a ro M3no/i3BaMe b pa3/ikmHi/i npn- 
Mepn, HeKa 3aAaAeM cnep,Haja AecpMHuuna 3a Data: 



private DataSet dsData; 

public DataSet Data 

{ 

get 

{ 

return dsData; 

} 
} 

private void Page_Load (ob j ect sender, System. EventArgs e) 

{ 

GenerateDataSet ( ) ; 

} 

private void GenerateDataSet ( ) 
{ 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



221 



} 



dsData = new DataSet ( ) ; 

DataTable dtData = new DataTable ( "Characters" ) ; 

dtData. Columns .Add ( "Character First Name"); 

dtData . Columns .Add ( "Character Last Name") ; 

dtData . Columns .Add ( "Character Birth Date", typeof (DateTime) 

dtData. Columns .Add ( "Character Age", typeof ( Int32 )) ; 



DataRow drData 



dtData . NewRow ( 



drData [ "Character First Name"; 
drData [ "Character Last Name"] 
drData [ "Character Birth Date"; 
drData ["Character Age"] = 35; 
dtData . Rows . Add ( drData ) ; 



drData 



dtData . NewRow ( 



drData [ "Character First Name"; 
drData [ "Character Last Name"] 
drData [ "Character Birth Date"; 
drData ["Character Age"] = 28; 
dtData . Rows . Add ( drData ) ; 



drData 



dtData . NewRow ( 



drData [ "Character First Name"; 
drData [ "Character Last Name"] 
drData [ "Character Birth Date"; 
drData ["Character Age"] = 21; 
dtData . Rows . Add ( drData ) ; 



drData 



dtData . NewRow ( 



drData [ "Character First Name"; 
drData [ "Character Last Name"] 
drData [ "Character Birth Date"; 
drData ["Character Age"] = 51; 
dtData . Rows . Add ( drData ) ; 

dsData. Tables .Add (dtData) ; 



= "Meqo"; 
"nyx"; 
= new DateTime (1971, 4, 1) 



= "npacyo"; 
"Cbmhckm" ; 
= new DateTime (1978, 5, 11) 



= "Twr'bp"; 
"BeHrajicKM" ; 
= new DateTime (1984, 8, 12) 



"Mopw"; 

'MarapncyeHKO " ; 
new DateTime (1955, 4, 30) 



flecpMHupaMe o6eKTa Data ioto cbomctbo Ha CTpaHnuaTa, KoeTO Bptiua n/ieH- 
npoMeH/iMBaTa dsData. no BpeMe Ha 3ape>KAaHe Ha crpaHi/iuaTa (Page_Load) 

M3BMKBaMe MeTOAa GenerateDataSet ( ) . TOM MHMUMa^M3Mpa dsData C npn- 

MepHM ashhu. 3a npocTOTa TyK AaHHMTe He ce B3eMaT ot 6a3a ot ashhh, ho 
TOBa e 6e3 3Ha4eHne 3a ue/ikue Ha AeMOHCTpaunaTa. 



222 nporpaMnpaHe 3a .NET Framework (tom 2) 

KaK pa6oTM npnMepi>T? 

fla ce BtpHeM o6paTHO kbm npuMepa. Ako CTe pa3pa6oTBa/in npn/ic»KeHMfl c 
ASP, T03M npuMep curypHO bm ce CTpyBa ROHRKbRe no3HaT. 3a Te3M, komto 
TentpBa 3anonBaT fla ce 3ano3HaBaT c pa3pa6oTKa Ha ye6 npn^OKeHMa c 
ASP.NET, KOfltT curypHO M3r/ie>KAa ki3K/iionkiTe/iHO o6"bpKBaiu. HflMa fla ce 3a- 
A"b^6o4aBaMe b p,ejav\i\v\, a me o6achmm caMO K/iionoBkiTe nacm Ha npuMepa. 

KaKTO CTe 3a6e/ifl3a/in, TyK no oco6eH Hani/m ce CMecBaT ctpBtpHM Tare-Be (<% 
%>) m o6nKHOBeH HTML. HeKa pa3r/ieAaMe cnep,Hwn OTp*i3"bK koa: 



<b>Character List</b> 


<br 


/> 








<% for (int i = ; 

{ 

%> 


i < 


10; 


i++) 




















<b> <% if ( (i % 


2)> 


0) 


( %> 


<i> 


V. o 


}%> 


Character <%= 


(i+1) %> 










<% if ( (i % 2)> 


0) 


{ %> 


</i> 


<% 


}%> 


</b> 


<br /> 














<% } %> 














<b>Total : 10</b> 















B pe3y/iTaT Ha MHTepnpeTupaHeTO Ha to3m koa, b ye6 6pay3"bpa Ha Kj\v\ema 
me npucTurHe c/ieAHi/mT HTML: 



<b>Character 


List</b> <br /> 


<b> 




Character 


1 


</b> 




<br /> 




<b> <i> 




Character 


2 


</i> </b> 




<br /> 




<b> 




Character 


3 


</b> 




<br /> 




<b> <i> 




Character 


4 


</i> </b> 




<br /> 




<b> 




Character 


5 


</b> 




<br /> 




<b> <i> 




Character 


6 


</i> </b> 




<br /> 




<b> 





HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



223 



Character 


7 


</b> 




<br /> 




<b> <i> 




Character 


8 


</i> </b> 




<br /> 




<b> 




Character 


9 


</b> 




<br /> 




<b> <i> 




Character 


10 


</i> </b> 




<b>Total : 10</b> 



B KpaMHa CMeTKa 6pay3"bp"bT me noKawe cnej\Hv\n cnncbK: 



Hero L is t 


Hero 1 


Hero 2 


Hero 3 


Hero 4 


Hero 5 


Hero 6 


Hero 7 


Hero 8 


Hero 9 


Hero 10 


Tola! : 10 



ripuMepHMAT KOfl ce MHTepnpeTupa TaKa: 3a BCflKa ctomhoct Ha i ot ao 9 ce 
M3n"b/iHflBa ta/ioto Ha umcb/ia. B Hero bcmuko, KoeTO He e 3arpafleHO b 
ctpBtpHM TaroBe (<% %>) ocTaBa HenpoMeHeHO, a bci/iuko 3arpafleHO b 
ctpBtpHM TaroBe ce MHTepnpeTupa. 

To3M onpocTeH npuMep AeMOHcrpwpa KaK MO>xe p,a ce pea/ii/i3i/ipa noBTopeHne 
Ha HTML e/ieMeHTM. B irbpBOHana/iHkifl npuMep BMecTO cpMKCupaHa ctomhoct 

10 M3nO/13BaMe dataColumnsCount M dataltemsCount. 

To3M Ha^MH Ha pea/i i/i3aui/isi Ha npeAcraBflHe Ha ashhm b Ta6/ii/meH bma e 
TBtpAe HenpaKTkmeH, ho npeAH ASP.NET He e kiMa/io Apyra a/iTepHaTMBa. 
OcHOBHMTe My HeAOCTarbun MABaT ot Heo6xoAHMOCTra ot CMecBaHeTO Ha npo- 
ueAypeH koa h HTML, KoeTO boah ao HeneT/iMBOcr Ha HanncaHOTO v\ 3aTpya- 
HeHMfl b noAAP"b>KKaTa. 

Hy>KAaTa ot Hani/m 3a npeAcraBflHe Ha p,auuv\je b Ta6/iwneH bma e AOBe/ia ao 

Cb3AaBaHeTO Ha KOHTpo/lklTe DataGrid, DataList M Repeater. 



224 nporpaMnpaHe 3a .NET Framework (tom 2) 

CxoACTBa mokay MTepMpaufMTe kohtpo/im 

BCM4KM MTepupaiUM KOHTpO/lkl C"bfl"bp>KaT CnklCbK C e^eMeHTM, OTrOBOpHM 3a 

reHepupaHeTO Ha m3xoahma HTML. 

DataGrid noi<a3Ba 3anncnTe b HTML Ta6/iwua (npe3 Tara <tabie>), KtAeTO 
BceKM e/ieMeHT ce npeAcraBfl b OTAe/ieH peA- K/iacbT DataGriditem e 
npeAHa3Ha4eH p,a Bki3ya/iki3wpa Ta6/ii/meH 3annc v\ 3aTOBa e Hac/ieAHMK Ha 

K/iaca TableRow. 

AHa/lOrklUHO DataList e CbCTaBeH OT e/ieMeHTM OT TMn DataListltems. 

K/iacbT Repeater, ot APyra CTpaHa, no3BO/i*iBa irb/iHa HacTpoMKa Ha 
M3XOAHMA HTML. 3aTOBa K/iacbT 3a e/ieMeHTMTe My Repeateritem He e 

Hac/ieAHklK Ha TableRow. 

ripn M3BMKBaHe Ha MeTOAa DataBindO ce npeMMHaBa npe3 bcmuki/i 3anncn Ha 
cbomctboto DataSource. 3a BceKM 3annc ce cb3AaBa HOBa MHCTaHuna ot Tun 

DataWebControlNameltem M 3anklCbT ce CB"bp3Ba CbC CBOMCTBOTO V\ Dataltem. 

C"b6nTmi Ha MTe pupa 114 MTe kohtpo/im 3a CB~bp3BaHe C AaHHMTe 

MTepupaiuMTe kohtpo/im noAAtpwaT hhko/iko o6lum Cb6i/iTMfl, Kacaeiun npo- 
ueca Ha CB"bp3BaHeTO Ha AaHHMTe: 

- Cb6klTkieTO ItemCreated ce aKTMBkipa 3a BCeKM HOB 
DataWebControlNameltem A06aBeH K"bM KOHTpo/iaTa, npeAH Oiue Rd e 
MHMUMa^M3MpaHO CBOMCTBOTO Dataltem. Cb6klTkieTO ItemDataBound ce 

c/iyuBa BeAHara cnep, nHMuna/iM3auMflTa Ha cbomctboto Dataltem. A 

ItemCommand Cb6klTI/ieTO ce aKTMBkipa npn BCflKa KOMaHAa OT Button or 

LinkButton b MTepupaiuaTa KOHTpo/ia. 

- flpyra Ba>KHa o6iua xapaKTepucTMKa Ha MTepupaiun kohtpo/im e, ne 

BCM4KM n03BO/lflBaT M3nO/13BaHeTO Ha LUa6/10HM. KOHTpO/lMTe DataList l/l 
Repeater 3aA"b/l>KMTe/lHO M3MCKBaT UJa6/10HM, AOKaTO npn DataGrid 

M3no/i3BaHeTO mm e He3aA"b/i>Ki/iTe/iHO. 

- DataGrid M DataList ca Hac/ieAHMUM Ha K/iaca WebControl, AOKaTO 
Repeater e Hac/ieAHMK Ha K/iaca Control. K/iaCbT WebControl MMa 
MHO>KeCTBO CBOMCTBa CBtp3aHM C BM3ya/lM3ai4MflTa: BackColor, 
ForeColor, CssClass, BorderStyle M AP- Repeater KOHTpo/ia He 

noAAtpwa AnpeKTHO Te3M CBOMCTBa, ho aHa/iorwuHki cpopMaTupaiun 
HacTpoMKM MoraT Aa 6"bAaT yKa3BaHM npe3 iua6/iOHMTe My. 

KoHTpo/iaTa DataGrid 

Ot r/ieAHa TOUKa Ha BrpaAeHM bbsmokhoctm, DataGrid e Haw-MOiuHaTa ot 
MTepupaiunTe kohtpo/im. 3a CMeTKa Ha TOBa, ta He e rbBKaBa no OTHOiueHMe 
Ha reHepupaHMfl HTML koa. Tom BMHarn reHepupa HTML Ta6/inun, KaTO 3a 
BCAKa CB"bp3aHa KO/iOHa ce cb3AaBa peA 4pe3 Tara <tr> v\ 3a bcako no/ie ot 
3annca, ce cb3AaBa KO/iOHa npe3 Tara <td>. 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 225 

Cpefl BrpafleHMTe bbsmokhoctm Ha DataGrid KOHTpo/iaTa ca copTupaHe, 
CTpaHnpaHe v\ peflaKuna Ha AaHHMTe flupeKTHO b Ta6/ikiuaTa. npuMepHO npe3 
yKa3BaHe Ha cbomctboto Aiiowsorting = true m Ma/iKO Aont/iHMTe/ieH koa, 
ziecHO MO>Ke p,a ce npeAOcraBki Ha noTpe6i/iTe/ifl cpeACTBO 3a copTupaHe. 

C DataGrid MOxeM mhoto 6"bp30 p,a pea/iki3wpaMe noKa3BaHe Ha ashhh b 
ASP.NET ye6 crpaHi/iua. CaMO Tpa6Ba p,a nocraBMM KOHTpo/ia b crpaHi/iuaTa, 

Aa yKa>KeM DataSource V\ p,a M3BMKBaMe DataBind(). DataGrid MMa CBOMCTBO 

AutoGenerateCoiiomns, c KoeTO Mcoxe Aa yKa>KeM p,anv\ KO^OHMTe ce reHepn- 
paT aBTOMaTM^HO, v\nv\ p,anv\ caMO me 3aAaBaMe kom ot tax p,a ce noKa>KaT v\ 
no KaKtB Ha^MH. 

BcflKa KO/iOHa b DataGrid e MHCTaHunfl Ha K/iac, Hac/ieAHi/iK Ha 
DataGridcoiiimn. BrpaAeHMTe TunoBe ko/iohm ca: 

- BoundColumn - KO/lOHa, CBtp3aHa C nO/ie OT M3T04HMKa Ha ashhu. 

noKa3Ba AaHHMTe noA cpopMaTa Ha o6mkhob6h TeKcr. 

- Buttoncoivunn - KO/iOHa, noKa3Bama 6yTOH. 

- Editcoiiamn - KO/iOHa 3a peAaKunfl Ha AaHHM. 

- HyperLinkcoiumn - KO/iOHa, noKa3Bama xi/inepBp"b3Ka, KaTO TeKCTa v\ 
URL-to MoraT Aa 6"bAaT ot ojp,enuv\ no/ieTa Ha M3T04HMKa Ha AaHHM. 

- Tempiatecoiumn - KO/iOHa Lua6/iOH, npe3 KOATO MO>Ke Aa ce reHepupa 
npow3BO/ieH M3X0AeH HTML. MMa Lua6/iOHki 3a pa3/ikmHHTe nacm Ha 
Ta6^MUaTa: ItemTemplate, HeaderTemplate, FooterTemplate M 
EditltemTemplate. 

npoM3BOAMTe^HOCTTa Ha DataGrid noHAKora MO>Ke Aa e npo6/ieM, Tbv\ ioto 
npi/i ro/iflM o6eM AaHHM pa3Mep"bT ViewState Ha KOHTpo/iaTa CTaBa 3Hani/i- 
Te/ieH. Ako ViewState 6"bAe i/i3K/iK>neH, to TOBa me e 3a CMeTKa Ha Bt3MO>K- 
HOCTMTe 3a copTupaHe, crpaHi/ipaHe v\ peAaKTupaHe. 

KoHTpo/iaTa DataList 

Heo6xoAMMOCTTa ot DataList B"b3HMKBa, KoraTO npeACTaBAHeTO Ha AaHHi/i b 
HTML Ta6/inua c no eAMH 3annc Ha peA e HeyAanHO. noHHKora MO>Ke Aa 
MCKaMe Aa noKaweM noBene ot eAHH 3annc Ha peA v\nv\ p,a peiuuM Aa w3no/i- 

3BaMe <span> BMeCTO <table> TarOBe. 

ripn DataList KOHuenunflTa 3a "ko/iohm" He npucbCTBa. Bcmuki/i HacTpoMKM ce 
3aAaBaT npe3 Lua6/iOHi/i, b komto pa3pa6oTHMKbT MO>Ke Aa yKawe KOM6nHaunfl 
ot HTML m koa 3a CBtp3BaHe c AaHHMTe. npuMepHO cneAHi/mT ItemTemplate 
me noKa>Ke no/ieTO Name ot i/i3TOHHi/iKa Ha AaHHn: 



<asp : DataList runat="server" id="lstCharacterNames"> 

<ItemTemplate> 

<%# DataBinder .Eval (Container . Dataltem, "Name") %> 

</ItemTemplate> 
</asp : DataList> 



226 nporpaMnpaHe 3a .NET Framework (tom 2) 

MoxeM ziecHO fla pa3UJnpnM ropHna Lua6/iOH, 3a fla noKaweM Name no/ieTO 
y,qe6e/ieHO v\ nofl Hero fla flo6aBMM no/ie ID: 



<asp : DataList runat="server" id="lstCharacterNamesAndIDs"> 
<ItemTemplate> 

<b><%# DataBinder.Eval (Container. Dataltem, "Name") %></b> 
<br/> 

<%# DataBinder.Eval (Container. Dataltem, "ID") %> 
</ItemTemplate> 
</asp : DataList> 



3a BceKM 3annc b M3T04HMKa Ha flaHHM Ha DataList, ce peHflupa M3xofleH 
HTML cnefl ioto ce oueHM CB"bp3BaHeTO, yKa3aHO b itemTempiate. noflfltp- 
xaT ce cneflHMTe TunoBe iua6/iOHM: 

- ItemTempiate - LUa6/10H 3a e/ieMeHTa 

- AlternatingltemTemplate - aKO e yKa3aH, BCeKM C/ieflBaLfl e/ieMeHT OT 
M3T04HMKa Ha flaHHM, V\3UOI\3Bdt T03M Llja6/10H BMeCTO ItemTempiate. 

- EdititemTempiate - Lua6/iOH Ha e/ieMeHTa b pe>KMM Ha peflaKunfl. 

- HeaderTempiate - Lua6/iOH 3a 3amaBHMfl e/ieMeHT. noKa3Ba ce caMO aKO 
cbomctboto ShowHeader e true. 

- FooterTempiate - Lua6/iOH 3a 3aK^K)4MTe^HMfl e/ieMeHT. noKa3Ba ce 

CaMO aKO CBOMCTBOTO ShowFooter e true. 

- SelectedltemTemplate - LUa6/10H 3a M36paH e/ieMeHT 

- SeparatorTemplate - LUa6/10H, npi/l/iaraH C/iefl BCflKO fl06aBflHe Ha 
DataListltem. 

no noflpa36i/ipaHe, DataList noKa3Ba BceKM e/ieMeHT KaTO pefl b HTML 
Ta6/ikiu.a. Hpe3 cbomctboto Repeatcoiumns MoxeM fla yKaxeM ko/iko e/ie- 
MeHTM MCKaMe fla ce cbfltpwaT Ha BceKM pefl. MoxeM npe3 cbomctboto 

RepeatLayout, KOeTO npneMa CTOMHOCTM Table V\J\V\ Flow, fla 3aflafleM fla ce 

no/i3BaT <span> TaroBe BMecTO <tabie>, Te3M floirb/iHi/iTe/iHi/i b"B3mo>khoctm 

npaBflT DataList KOHTpO/iaTa nO-rbBKaBa OT DataGrid. 

C LUa6/10Ha Editltemlndex M Cb6klTMflTa EditCommand, UpdateCommand M 
CancelCommand, KOHTpo/iaTa DataList CblflO nOflfl"bp>Ka peflaKTkipaHe Ha 

MflCTO, ho pea^M3aunflTa M3MCKBa noBene nporpaMnpaHe ot CTpaHa Ha 
pa3pa6oT4MKa. Oiue no-TpyfloeMKO e MMn/ieMeHTkipaHeTO Ha b"B3mo>khoctm 3a 
copTupaHe i/i CTpaHnpaHe b DataList KOHTpo/ia. 

KoHTposiaTa Repeater 

KoHTpo/iaTa Repeater npefl/iara MaKCMMa/iHa rbBKaBOcr b peHflnpaHeTO Ha 
HTML. T*i e yaanHO peiueHkie, KoraTO He MCKaMe fla M3no/i3BaMe hmto HTML 
<table>, HMTO cepklfl OT <span> TaroBe. 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 227 

Repeater npefl/iara c/ieflHMTe neT Lua6/iOHa, hi/iato cpyHKuna Bene hm e ,qo6pe 
no3HaTa: 

- AlternatingltemTemplate 
FooterTemplate 
HeaderTemplate 
ItemTemplate 
SeparatorTemplate 
HeaderTemplate M FooterTemplate yKa3BaT HTML, KOMTO fla ce nOKawe 

cbOTBeTHO npeflw h cnefl flaHHMTe, CB"bp3aHM c KOHTpo/iaTa. 

AlternatingltemTemplate M ItemTemplate yKa3BaT HTML KOfla M CB"bp3- 

Baiunfl CMHTaKCuc 3a peHAnpaHe Ha e/ieMeHTkue ot M3T04HMKa Ha flaHHM. 

HeKa CB"bp3BaMe flaHHM 3a repoi/ue ot KHuraTa "Meno riyx" c Repeater 
KOHTpo/ia m eflHO ot no/ieTaTa e Name. Ako MCKaMe fla noKa>KeM cnwcbK c 
MMeHaTa mm b HecopTupaH cnwcbK MO>xeM fla ki3no/i3BaMe c/ieflHwa CMHTaKCuc: 



<asp : Repeater runat="server" id="rptCharacterNames"> 
<HeaderTemplate> 

<ul> 
</HeaderTemplate> 
<ItemTemplate> 

<li><%# DataBinder.Eval (Container. Dataltem, "Name") %></li> 
</ItemTemplate> 
<FooterTemplate> 

</ul> 
</FooterTemplate> 
</asp : Repeater> 



TtM KaTO Repeater He e Hac^eflHMK Ha webcontroi m He npefl/iara CBOMCTBa 
3a yKa3BaHe Ha cm/ia Ha cpopMaTupaHe, to aKO MCKaMe fla noKaweM MMeHaTa 
Ha reponTe c yfle6e/ieH wpi/icpT, Tpa6Ba b ItemTemplate fla flo6aBkiM HTML 
Tara <b>: 



<ItemTemplate> 

<lixb><%# DataBinder.Eval (Container .Dataltem, "Name' 
%></bx/li> 
</ItemTemplate> 



Ta3M oco6eHOCT Ha Repeater KOHTpo/iaTa BOflu noHAKora ao no-Te>KKi/i, a 
cneflOBaTe/iHO v\ no-TpyflHO neTMMki Lua6/iOHki. Ctiuo TaKa aKO ce Ha/io>Kki fla 
pea^M3npaMe copTupaHe v\ crpaHi/meH nper/iefl, Tpa6Ba fla ro pea/iw3wpaMe ot 
Hy/iaTa. 

npeflMMCTBaTa Ha Repeater ca b HeMHaTa rbBKaBOcr v\ flo6pa npon3BOfln- 

Te/IHOCT. 



228 nporpaMnpaHe 3a .NET Framework (tom 2) 

YnpaB/ieHMe Ha cbcrojmiieTO 

Ye6 CTpaHnunTe ce npexBtp/isiT npe3 HTTP npcrroKO/ia. Te He 3ana3BaT cbcro- 

flHMeTO CM, T"bM KaTO He 3HaflT fla^M 3aflBKMTe MflBaT OT eflklH M CblU K/lkieHT. 

CrpaHwukiTe ce cb3AaBaT HaHOBO npn bcako o6p"biueHne KbM ctpBtpa. Ako He 
ce M3no/i3Baxa Aont/iHkiTe/iHM MexaHM3MM 3a ynpaB/ieHkie Ha cbcroflHweTO 
(state management), B"b3MO>KHOCTi/iTe Ha ye6 npw/io>KeHkiflTa 6nxa 6m/im mhoto 
orpaHM^eHM. 

B K/iaci/mecKkiTe ASP npi/i/io>KeHkifl T03M npo6/ieM ce peiuaBa no hako/iko 
Hani/ma, npe3: 6mckbmtkm (cookies), napaMeTpn3npaHM aApecu (query string), 
m npe3 ASP o6eKTMTe 3a npw/io>KeHkie (application) v\ 3a cecua (session). B 

ASP.NET BCM4KM Te3M TeXHMKM Ca Ha Hawe pa3nO^O>KeHMe, KaTO B"b3MO>KHO- 

CTMTe mm ca o6oraTeHM b mhoto OTHOweHMfl. 

rioflxoflMTe 3a ynpaB/ieHi/ie Ha cbcroaHkieTO b ye6 npw/io>KeHi/iflTa ce pa3Ae/i*iT 
Ha ABe KaTeropnn - ot CTpaHa Ha K/iweHTa (Client-side) v\ ot CTpaHa Ha ctp- 
Btpa (Server-side), ripn ynpaB/ieHwe Ha cbCTOAHneTO ot CTpaHa Ha K/iweHTa, 
cbpB"bp"bT He na3M MHCpopMaunaTa MHCpopMauna Me>Kfly 3aaBKMTe, a ta ce 
cbxpaHHBa Ha crpaHkiuaTa v\nv\ Ha KOMnKrrbpa Ha K/iweHTa. 

ritpBO me pa3r/ieAaMe Client-side TexHMKM - 6mckbmtkm, napaMeTpn3npaHM 
aflpecu, ckpmtm no/ieTa v\ ViewState. C/ieA TOBa me HanpaBMM o63op Ha 
ctpBtpHMTe MexaHM3MM 3a ynpaB/ieHkie Ha cbCTOAHneTO Ha hmbo npw/io>KeHi/ie 

M HMBO CeCMfl. 

Bmckbmtkm (Cookies) 

BucKBMTKaTa (cookie) e Ma/iKO napue MHCpopMauna, M3npaTeHa ot ye6 cbp- 
Btpa ao K^neHTCKM 6pay3"bp. Bpay3"bp"bT no noApa36npaHe cbxpaHABa no/iy- 
neHaTa 6ncKBMTKa v\ ot Hero ce onaKBa p,a n M3npaiua o6paTHO KbM ctpBtpa 
npn BCAKa cneABama 3a*iBKa. 1/lHCpopMau.kiflTa b Hea MO>xe p,a e npow3BO/iHa, 
crura ufl/iocTHkiflT pa3Mep Ha 6ncKBMTKaTa (nHCpopMaunaTa v\ MeTa ashhh 3a 
caMaTa 6ncKBMTKa) p,a He HaABMiuaBa 4 KB. HeKa p,a pa3r/ieAaMe hakoi/i ot 

CBOMCTBaTa, C KOMTO Ce XapaKTepM3kipaT 6klCKBklTKMTe. 

CBOMCTBa Ha 6MCKBMTKMTe 

ETO HflKOM OT nO-Ba>KHMTe CBOMCTBa Ha 6MCKBMTKMTe: 

- Expires - yi<a3Ba Kora i/i3Tkma Ba/ikiAHOcrra Ha 6ncKBMTKaTa. Ako He ce 
yKaxe, 6ncKBMTKaTa ce 3ana3Ba caMO b naMerra. Ako TOBa cbomctbo ce 
3aAaAe, 6ncKBMTKaTa ce 3anncBa Ha TBtpAna auck m ce na3M 3a BpeMe- 
to, KoeTO e yKa3aHO. KoraTO 6pay3"bp"bT M3npaiua AaAeHa 6ncKBMTKa, 
tom npoBep^Ba p,anv\ HeMHaTa Ba/ikiAHOcr He e M3TeK/ia v\ aKO TaKa, tom 
He a M3npaiua KbM ctpBtpa, a a M3TpnBa. He Tpa6Ba p,a 3a6paBAMe, ne 
noTpe6nTe^flT MO>Ke p,a M3Tpne 6ncKBMTKaTa no bcako BpeMe. 

- Domain - 06/iacrra ot MHTepHeT aApecu, Ha komto MO>Ke p,a ce npaiua 
6ncKBMTKaTa. no noApa36npaHe TOBa e aApecbT, ot komto e Aow/ia, ho 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 229 

MO>Ke fla ce yKawe v\ Apyro. 5pay3"bp"bT M3npaiua caMO 6ncKBMTKHTe, 
npeflHa3Ha4eHM 3a noncKaHUfl MHTepHeT aflpec. 

- Path - irbT Ha aflpecnTe, ,qo komto MO>Ke fla ce npaiua 6ncKBMTKaTa. 
BucKBMTKaTa HflMa fla ce npaiua Ha aflpecu ot no-BMCOKO hmbo b 
fltpBOTO Ha flupeKTopnnTe. ripuMep: aKO ntTAT e /sites/ Stefan, ta 
HflMa fla ce npaâ„¢ Ha /sites/dido, hmto Ha /sites, ho me ce npaTM Ha 
/sites/stefan/pics. no noflpa36npaHe CTOMHOCTTa Ha TOBa cbomctbo e 
BnpTya^HaTa flupeKTopua, ot koato ntpBOHana/iHO e flow/ia 6mckbmt- 
KaTa, ho MO>Ke v\ fla ce npoMeHM. 

MexaHM3"bM Ha pa6<rra c 6mckbmtkm 

3a fla pa3r/ie,qaMe no-noflpo6HO MexaHM3M"bT Ha 6ncKBMTKHTe, HeKa MMaMe 
npuMepHa 6ncKBMTKa c MMe UserlD v\ ctomhoct "StefanDobrev" - MMeTO Ha 
K^neHTa. HeKa flaTaTa Ha M3Ti/maHe (cbomctboto Expires) e 17-tm AHyapn 

2006 r., 06/iaCTTa (CBOMCTBOTO Domain) e devbg.org, a ITbTflT (CBOMCTBOTO 

Path) - r/iaBHaTa BkipTya/iHa flwpeKTopi/m. 

Eto nacrra ot HTTP xefltpa, 3acflrama 6ncKBMTKaTa, koato me ce no/iynw npn 
K/iweHTa: 



Set-Cookie: UserID=Stef anDobrev; path=/ ; domain=devbg. org; 
Expires=Saturday, 17-Jan-06 00.00.01 GMT 



Ako K/ikieHTCKi/mT 6pay3tp e Internet Explorer, naniOTa, b koato me ce Cbx- 
paHM 6klCKBMTKaTa, e \Documents and Settings \Username\Cookies, a 
CpaM/l"bT Lfle e C MMe: username@domainname.txt. B C/iynafl, aKO nOTpe6klTe/lflT 

Ha cucTeMaTa e sdobrev, cpaM/ivr me MMa MMe sdobrev@devbg.org[i] . txt. 
ripn BCAKa c^eflBaiua 3a*iBKa KbM to3m flOMeMH v\ ntT, yKa3aH b 6ncKBMTKaTa, 
6pay3"bp"bT e fl/itweH fla M3npaTM cbfltpwaHi/ieTO Ha 6ncKBMTKaTa b HTTP 
xefltpa, komto cbiuo M3npaiua. B c/iynayi TOBa me e: 



Cookie: User ID: StefanDobrev; 



ToBa M3npaiuaHe me npofl"b/i>Ki/i, flOKaTO e Ba/ikiflHa 6ncKBMTKaTa. Tpa6Ba fla 
ce MMa npeflBMfl, ne noTpe6kiTe/iflT MO>Ke fla Hacrpow 6pay3"bpa cm, TaKa ne fla 
He npneMa 6mckbmtkm. 

KaTO CTpyKTypa 6ncKBMTKHTe npeflcraB/uiBaT Ta6/iwua ot HapefleHM tpomkm ot 
Tuna aflpec-MMe-CTOMHOCT. Bpay3"bp"bT pa3no3HaBa ctpBtpa no HeroBna URL 
aflpec m M3npaiua caMO Te3M 6ncKBMTKMTe, npeflHa3HaneHM 3a Hero. 

npMJlOKeHMfl Ha 6MCKBMTKMTe 

KaKTO Bene 3HaeM, HTTP npoTOKO/itT He MO>Ke fla 3ana3M cbCTOAHneTO Ha 
flafleHa 3aaBKa (tom e stateless npoTOKO/i). BucKBMTKUTe MoraT fla ce i/i3no/i- 
3BaT fla pa36epeM fla/iw 3aaBKMTe MflBaT ot eflMH v\ cbu\v\ K/iweHT. 

Hpe3 MexaHM3Ma Ha 6ncKBMTKHTe, ctpBtptT Moxe fla c/ieflki noTpe6nTe/ifl i/i 
fla My Bptifla nepcoHa/ii/i3kipaHO cbfltpwaHkie, cnp^MO HeroBMTe Hy>KflM, m3mc- 



230 nporpaMnpaHe 3a .NET Framework (tom 2) 

KBaHMfl m MHTepecn. KtM TOBa npn^OKeHne MO>Ke fla npwnm:/ikiM v\ 
B"b3MO>KHOCTTa 3a npocneAflBaHe noBefleHneTO Ha noTpe6kiTe/i*i v\ M3rpa>KflaHe 
Ha KapTa Ha HaM-necro noceiuaBaHMTe ot Hero CTpaHnun. 

flpyro TflXHO npki/io>KeHkie e 3a aBTOMaTMUHO B/iki3aHe Ha noTpe6kiTe/i*i b Rap,e- 
Ha ye6 6a3npaHa ci/icreMa npn HeroBOTO cneABamo v\p,saue. ToBa e B"b3MO>KHO 
nopaAM cpaKTa, ne 6ncKBMTKHTe MoraT p,a ocTaHaT HeorpaHi/meHO At>/iro BpeMe 
npn K^neHTCKMfl 6pay3"bp. 

BMCKBMTKMTe b .NET Framework 

B .NET Framework i/ma ABa K/iaca, komto npeAOcraBHT Aocrbn 3a pa6oTa c 

6MCKBMTKM. 

system. Net. cookie ce ki3no/i3Ba npw HanpaBaTa Ha K/ineHTCKM npn^OKeHMa, 
KaTO mm npeAOcraBfl cpyHKui/iOHa/iHOora p,a neTaT 6ncKBMTKHTe, BtpHaTM ot 
AaAeHa ye6 3aaBKa. 

Sy stem. Web. HttpCookie ce l/l3no/l3Ba B ASP.NET 3a AOCTbn AO 6klCKBMTKMTe B 
ye6 npn^OKeHne. Hpe3 cbomctboto cookies Ha K/iacoBeTe HttpResponse v\ 

HttpRequest MMaMe AOCTbn AO KO/ieKUMfl, KOflTO CbA"bp>Ka BCM4KM 6MCKBMTKM, 

M3npaTeHM ot ctpBtpa v\nv\ BtpHaTM ot K/iweHTa. 

npMMep - neTeHe ot 6mckbmtk3 

C T03i/i npuMep me ki/uocrpwpaMe iok MO>Ke p,a ce i/i3B/iene AaAeHa 6ncKBMTKa 
ot K/ineHTCKa 3aaBKa v\ p,a ce M3no/i3Ba ctomhoct, cbxpaHeHa b Hea: 



HttpCookie cookie = Request . Cookies [ "UserlD" ] ; 
if ( cookie != null ) 

{ 

LabelUsername . Text = cookie [ "Username" ] ; 

LabelExpires . Text = cookie . Expires; 
} 



Ckpmtm no/ieTa 

CKpnTMTe no/ieTa ca i"ioao6hi/i Ha TeKCTOBMTe no/ieTa, ho c Ta3M pa3/ii/iKa, ne 
He ce noi<a3BaT b 6pay3"bpnTe. KoraTO eAHa CTpaHnun e npaTeHa ao ctpBtpa, 
cbA"bp>KaHMeTO Ha CKpnTMTe no/ieTa ce npaiua b HTTP Form KO/ieKuwaTa, 
3aeAHO etc CTOMHOCTMTe Ha APyrnTe no/ieTa. Ckpmtoto no/ie nrpae po/iflTa Ha 
A"bp>xaTe/i 3a MHCpopMauna, cneuwcpkinHa 3a crpaHkiuaTa. 

CKpMTMTe no/ieTa KaTO HTML e/ieMeHTM 

CKpnTMTe no/ieTa b HTML (hidden) MMaT cnep,uv\je aTpn6yTn: 

- name - BBTpewHO MMe Ha no/ieTO, cnywemo 3a MAeHTMCpuKauna 

- value - ctomhoct, KOATO p,a 6"bAa M3npaTeHa ao ctpBtpa. 
Eto eAMH npuMep: 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 231 



<input type="hidden" name="Language" value="English"> 



CKpMTMTe no/ieTa b .NET Framework 

ASP.NET npeflOCTaBfl KOHTpo/iaTa HtmlinputHidden, koato npefl/iara cpyHK- 



UMOHa^HOCTra Ha ckpmto no/ie: 




protected System. Web . UI . Html Controls 


HtmlinputHidden Hiddenl; 


// Assign a value to Hidden field 




Hiddenl .Value = "invisible data"; 




// Petrieve a value 




string str = Hiddenl .Value; 





Oco6eHOCTM Ha CKpiiTMTe no/ieTa 

3a fla M3no^3BaTe CKpMTMTe no/ieTa, Tpa6Ba fla ynoTpe6nTe HTTP POST 
MeTOAa 3a npaiuaHe Ha ye6 CTpaHnun. 

Cbmo TaKa MMaMTe npeflBi/ifl, ne croMHOCTTa He e Hairb/iHO CKpnTa 3a ncrrpe- 
6v\jenn. Tom MO>Ke fla n bmam b cope KOfla Ha crpaHi/iuaTa v\ flopi/i fla n 
npoMeHM. ToBa npaBM CKpnTMTe no/ieTa HeyflanHki 3a cbxpaH^BaHe Ha nyBcr- 

BMTe^Ha M KOHCpMfleHUkia^Ha MHCpopMauna. 

napaMeTpn3npaHM aapecn (Query Strings) 

napaMeTpn3npaHMTe aflpecu npeflocraBflT necen, ho orpaHkmeH, HanwH 3a 
noflfl"bp>KaHe Ha MHCpopMauna 3a cbCTOAHneTO. 

npMMep 3a napaMeTpn3npaH aApec 

EflMH napaMeTpn3npaH URL aflpec MO>xe fla H3Me>Kfla no cneflHi/m HanwH: 



http : //asp . net/getstarted/def ault . aspx?tabid=61 



KoraTO ce no/iynkl 3a*lBKa 3a getstarted/default.aspx, MO>KeM OT Hefl ZieCHO 
fla M3B/ieneM kom Ta6 e 61/1/1 M36paH npe3 cneflHkifl koa: 



string selectedTabID = Request . Params [ "tabid" ] ; 



Oco6eHOCTM npw M3nosi3BaHeTO Ha napaMeTpn3npaHn aApecM 

napaMeTpnTe b 3a*iBKaTa ca bmammm b URL aflpeca v\ Ha npaKTMKa He ocury- 
pyiBaT HMKaKBa curypHOCT. 

riOBeneTO 6pay3tpn noflfltpwaT flo 255 3HaKa b URL. ToBa 3Hani/iTe/iHO 
orpaHkmaBa npi/i/io>KeHkieTO Ha to3m noflxofl. 



232 nporpaMnpaHe 3a .NET Framework (tom 2) 

TexHO/ioniflTa ViewState 

ViewState (Bki3ya/iHO cbcroyiHkie) e TexHO/iorwyi, npe3 koato MO>Ke fla ce 

C"bXpaHM MHCpOpMaUMfl 3a C"bCTOflHMeTO Ha CtpBtpHMTe KOHTpO/lkl M ashhh, 

BtBefleHM ot noTpe6kiTe/isi npn nocneflOBaTe/iHki 3aaBKM kbm eflHa v\ cbiua 
CTpaHnua. TpaAMunoHHMTe HTML enewemw ca 6e3 cbcroflHwe v\ He 3ana3BaT 
hmto flaHHMTe, hmto HacTpoMKMTe ot CTpaHa Ha K/iweHTa. 

HeKa cm npeACTaBMM eAHa ye6 cpopMa, cbCToaiua ce ot mhoto Ha 6pow 
no/ieTa, komto K/iweHTbT Tpa6Ba fla noirb/iHki. C/iefl noirb/iBaHeTO v\ Tpa6Ba fla 
Ba^MAnpaMe BtBefleHaTa MHCpopMauna. Ako MMa HeTOHHOcâ„¢, noTpe6kiTe/iHT e 
3afl"b^>KeH othobo fla BtBefle usi/iaTa MHCpopMauna. Hpe3 TexHO/iorwflTa 
ViewState BtBefleHMTe ot noTpe6i/iTe/ifl flaHHM ce 3ana3BaT Me>Kfly 3aaBKMTe v\ 
He e Hy>KHO taxhoto B"bBe>KflaHe fla craBa OTHana/io. 

C'bpB'bpHM kohtpo/im m ViewState 

E/iaroflapeHwe Ha ViewState TexHO/iori/iflTa, ro/iHMa nacr ot ctpBtpHMTe koht- 
po/iw MoraT fla 3ana3BaT CBoeTO cbcroyiHi/ie (cTOMHOCTMTe Ha OTfle/iHMTe mm 
CBOMCTBa). BcflKa flMHaMM4Ha npoMAHa Ha BtTpewHOTO cbCTOAHne (npoMAHa 
Ha cbomctbo, CB"bp3BaHe c flaHHM m flp.) Ha flafleHa ctpBtpHa KOHTpo/ia ce 
3ana3Ba, 3a fla Moxe fla 6tfle peHflnpaHa npn K/iweHTa, KoraTO MMa noc/ieflo- 
BaTe^HM 3aaBKM KtM eflHa m cbiua crpaHkiua. 

ViewState ioto Macro 3a cbxpaHUBaHe Ha MHcpopMaunyua 

OcBeH 3a ctxpaHflBaHe BvrpewHOTO cbcroflHwe Ha ctpBtpHMTe kohtpo/im 
ViewState MO>xe fla ce M3no/i3Ba v\ 3a cbxpaHHBaHe Ha MHCpopMauna Me>Kfly 

HflKO/IKO pOStback M3BklKBaHklfl. CBOMCTBOTO ViewState Ha System. Web. 

ui. control (6a30BMfl K/iac, komto Hac^eflflBaT bcmukm ye6 kohtpo/im, 

BK/lK)HMTe/lHO M Page) npeflOCTaBfl flOCTbn flO pe^HMKOBa KO^eKUMfl OT Tun 

MMe-CTOMHOCT, KOATO Moxe fla ce M3no^3Ba 3a ctxpaHABaHe Ha MHCpopMauna. 

npMMep - cbxpaHnBaHe m M3BsiimaHe Ha a^hhh ot ViewState 

Ctc cneflBamkifl npuMep me i/i/uocrpkipaMe KaK Mowe fla cbxpaHMM MHCpopMa- 
UMfl BtB ViewState o6/iacn"a v\ c/iefl TOBa fla n M3B/ieneM ot Hea. 

3ana3BaHe bbb ViewState: 



ViewState [ "Username" ] = TextBoxUsername . Text . Trim ( ) ; 



M3B/innaHe Ha Bene cbxpaHeHa MHCpopMauna ot ViewState: 



LabelUsername . Text = (string) ViewState [ "Username" ] ; 



3a6e/ie>KKa: aKO b penHMKOBaTa KoneKuwa HflMa e/ieMeHT etc 3aflafleHna 
k/ikdh, ce Bptifla null. 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 233 

MexaHM3i>M Ha pa6oTa Ha ViewState TexHo/iorMfua 

BcflKa MHCpopMaunfl, flo6aBeHa bbb ViewState (61/1/10 to npn flkmaMMUHa 
npoMAHa Ha ctpBtpHa KOHTpo/ia m/im npe3 cbomctboto ViewState), ce cepna- 
/in3wpa m ce M3npaiua Ha K/iweHTa nofl cpopMaTa Ha ckpmt HTML e/ieMeHT etc 
c^eflHMfl BMfl: 



<input type="hidden" name=" VIEWSTATE" 

value="dDw5NjUlMTU103Q8cDxsPFRydWU7PjtsPFZpemliaWxpd 
Hk7Pj470z47Pm+DzsKPsEqi3imV91UMfxhbK/Rc" /> 



KoraTO K/iweHTbT HanpaBM HTTP POST 3a*iBKa kbm cbiuaTa crpaHi/iua, cbfltp- 
>KaHneTO Ha ckphtma e/ieMeHT ce flecepkia/iki3kipa, B"b3craHOBflBa ce BtTpew- 
hoto cbcroflHwe Ha ctpBtpHMTe kohtpo^m m ce 3airb/iBa pe^HMKOBa KoneKixwn, 

AOCTbrma npe3 ViewState CBOMCTBOTO. 

Cepna^M3aunflTa v\ flecepkia/ii/i3aui/iflTa ce M3BtpujBaT c noMOurra Ha K/iaca 

LosFormatter, KOMTO e OnTMMM3MpaH 3a pa60Ta C npMMMTMBHM TunoBe, 
CMMBO/1HM HM30Be, MaCMBM M XeilJ-Ta6^MUM . 

KaKTO Bene OT6e/iH3axMe, i/mcpopMaui/mTa, 3ana3eHa bbb ViewState 06/iaoTa, 
ce cepwa/iki3kipa. ToBa 03HanaBa, ne aKO MCKaMe fla 3ana3MM MHCTaHuna Ha 
AecpMHupaH ot Hac noTpe6kiTe/iCKki K/iac, tom Tpa6Ba fla e MapKupaH c aTpn- 

6yTa [Serializable] . 

CroMHOCTTa Ha ckpmtma e/ieMeHT viewstate e BASE64 npeflcraBAHe Ha 

cepi/ia/iM3wpaHkiTe kohtpo/im ot cpopMaTa. BtnpeKM ne Ta3M i/mcpopMaui/m He e 
ziecHO 4eTMMa, ta He e KpunTupaHa v\ MO>Ke fla 6"bfle fleKOflnpaHa. 



& 



He cbxpaHnBaMTe KOHCpHfleHMMa/iHa MHCpopMauimi bi>b 
ViewState! 



3a fla ce M36erHe cpa/iLuwcpm<auMfl Ha ViewState MHCpopMaunaTa, BceKM nvr, 
KoraTO ASP.NET cb3flaBa cepna/iki3npaHMfl ViewState, aBTOMaTi/mHO kbm Hero 
ce flo6aB*i v\ xeiu koabt My. ripn cneflBama 3a*iBKa ce npoBepyiBa fla/in 
flaHHMTe ot ViewState MMaT cbiuna xeiu koa (T.e. p,anw He ca npoMeHeHu). 
Ta3M onunfl MO>Ke fla ce m3k/ik>hi/i, KaTO b flupeKTMBaTa @Page 3aflafleM 

CTOMHOCT false Ha aTpkl6yTa EnableViewStateMac. 

noAAisP^aHe Ha ViewState 

Ako flafleHa ye6 crpaHwua cbfltpwa MHOxecTBO kohtpo/ii/i, ufljiocrHmrr pa3- 
Mep Ha ViewState 06/iacira MO>Ke fla HapacHe flpacrkinHO, KoeTO ot cboa 
CTpaHa yBe/iwuaBa pa3Mepa Ha crpaHwuaTa, koato ce M3npaiua kbm K/ii/ieHTa. 
B noflo6HM c/iynaw MO>xe fla orpaHn^MM i/i3no/i3BaHeTO Ha ViewState caMO 
Btpxy KOHTpo/ii/iTe, komto ce Hy>KflaaT ot Hero. HanpuMep 3a KOHTpo/ia ot Ti/in 
Label, KOATO MMa 3aflafleHO cbomctbo Text b aspx crpaHi/iuaTa M 3HaeM, ne 
TOBa m ocraHa/ikiTe v\ CBOMCTBa HHMa fla ce npoMeHAT, e pa3yMHO fla i/i3k/ikdhi/im 
ViewState-a. ToBa MO>Ke fla crane TaKa: 



234 flporpaMnpaHe 3a .NET Framework (tom 2) 



<asp: Label ID="LabelName" Runat="server" Text="Stef an" 
EnableViewState="False" /> 



M3K^K)4BaHeTO Ha ViewState MO>Ke fla CTaHe v\ Ha hmbo crpaHkiua: 



<%@ Page EnableViewState="False" %> 



ToBa e yao6ho, aKO MCKaMe fla pa3peujMM M3no/i3BaHeTO Ha ViewState caMO 
3a onpefle/ieHi/i kohtpo/im. 

3ana3BaHe Ha ViewState b Session o6eKTa 

KoraTO o6eM"bT Ha MHCpopMaunaTa, cbxpaHeHa bbb ViewState, HapacHe, 
unnocjHwnj pa3Mep Ha HTML crpaHi/iuaTa, M3npaTeHa KbM K/iweHTa, chuxo 
HapacTBa. ToBa MO>Ke fla flOBefle ao M3npaiuaHe Ha CTpaHnun c pa3Mep ot 
oko/io 0.5 - 1 MB, KoeTO He e npenop"bni/iTe/iHO. 

EflMH cueHapnw, b komto e yqanHO fla noflfl"bp>KaMe Ma^bK ViewState e, KoraTO 
pa3pa6oTBaMe npi/i/io>KeHkifl 3a mo6m^hm K/iweHTM. B Te3M cuTyaunn e flo6pe 
fla ro cbxpaHABaMe Ha flpyro macto, KaTO M36erHeM HeroBOTO peHflnpaHe npn 
K^neHTa m b cbiuoTO BpeMe 3ana3MM cbcroyiHkieTO. B npi/iMepa me noKa>KeM 
KaK TOBa MO>Ke fla CTaHe b session o6eKTa. 3a ue/iTa me npenoKpneM flBa ot 

BkipTya/lHMTe MeTOflM Ha K/iaca Sy stem. Web. UI. Page: LoadPageStateFrom 
PersistenceMedium( ) M SavePageStateToPersistenceMedium(...) â–  ETO M 

KOfla, komto ocbiuecTBflBa TOBa: 



protected override object LoadPageStateFromPersistenceMedium ( 

{ 

return Session [ "ViewState" ] ; 

} 

protected override void SavePageStateToPersistenceMedium ( 
object viewState) 

{ 

Session [ "ViewState" ] = viewState; 

} 



C T03i/i npuMep fleMOHCTpupaxMe KaK MO>KeM fla KOHTpo/iwpaMe MexaHM3Ma Ha 
3anncBaHe v\ 3ape>KflaHe Ha ViewState MHCpopMaunaTa. Mo>Ke fla ce ki3no/i3BaT 
m npon3BO^HM flpyrw MecTa 3a cbxpaHeHkie: 6a3M ot flaHHM, cpaw/iOBe, co6- 
CTBeHM ckpmtm no/ieTa m flp. 

C"bCTOfiHMe Ha npusioweHueTO 

B paMKMTe Ha ASP.NET npn^OKeHne MHCpopMauna fla 6tfle cnofle/iHHa npe3 

K/iaca HttpApplicationState (flOCTbrmaH Hafi-neCTO 4pe3 Application 
CBOMCTBOTO Ha HttpContext 06eKTa). T03M K/iac HM npeflOCTaBfl pe^HMKOBa 

KO/ieKunfl, KtfleTO MOxeM fla cbxpaHABaMe o6eKTM v\ CKa/iapHM ctomhoctm, 

CBtp3aHM C MHO>KeCTBO ye6 3aflBKM M K/lMeHTM. 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 235 

ripn ntpBaTa 3a*iBKa kbm URL pecypc ot BkipTya/maTa flupeKTopua Ha 
ASP.NET npn^OKeHne ce cb3flaBa MHCTaHuna Ha K/iaca 

HttpApplicationState. V\0 BpeMe Ha BCflKa 3aflBKa BCM4KM MOAy/in 
HttpModule M 06pa60T4MUM HttpHandlers (b TOBa HMC/lO ASP.NET CTpaHMUM- 

Te), MMaT flOCTbn Ta3M MHCTaHUMfl 4pe3 CBOMCTBOTO Application Ha 
HttpContext 06eKTa. 

3a noAflP"b>KKa Ha CbcroflHwe Ha hmbo npi/i/io>KeHkie ASP.NET hm npeflOcraBfl: 

Pe^HMKOBa KO/ieKunfl, AOCTbrma 3a bci/iukm o6pa6oT4nun Ha 3aaBKM b 
npn^OKeHneTO. 

/leceH MexaHM3"bM 3a CMHxpoHM3aunfl ao npoMeH/iMBMTe Ha 

CbCTOflHI/ieTO. 

CurypHOCT, ne flpyrn ASP.NET npn/ic»KeHkifl He MoraT fla flOCTbnBaT v\ 
npoMeHAT cbCTOAHneTO Ha HaiueTO npki/ic»KeHkieTO. 

M3no/i3BaHe Ha cbCTOflHiieTO Ha npM/ioweHMeTO 

npoMeH^MBMTe Ha cbCTOAHneTO Ha Application o6eKTa, ca Ha npaKTMKa 
r/io6a/iHki 3a ASP.NET npw/io>KeHkie. 3aTOBa npn B3eMaHe Ha peiueHne fla/iw 
fla vv\ M3no^3BaMe, Tpa6Ba fla MMaMe npeflBMfl cneflHi/ue cpaKTopn: 

- riaMeT - naMerra He ce ocBo6o>KflaBa flOKaTO npoMeH/ikiBaTa He 6"bfle 
3aMeHeHa v\nv\ npeMaxHaTa. B hakom c/iynaw e /iowa Mflea fla ce fltpwaT 
nocTOAHHO b naMeTTa paflKO flocrbnBaHw flaHHM c ronnM pa3Mep. 

- HnujKOBa 6e3onacHOCT - aKO o6eKTMTe, komto cbxpaHHBaMe, He ca 
HMUJKOBO o6e3onaceHM, to Tpa6Ba fla no/ic»KkiM flont/iHMTe/iHW ycw/ii/m 
3a CMHxpoHM3npaHe Ha flocTtna ao tax. 

- Ci<a/ikipyeMOCT - npn M3no/i3BaHe Ha 3aK/iionBaHkifl 3a ocurypaBaHe Ha 
HnujKOBa 6e3onacHOCT, onepaunoHHaTa cwcreMa 6/iOKkipa flpyrnTe pa6o- 
TeiflMTe HMiuKM, naKami/i 3a pecypca. ToBa MO>xe fla flOBefle ao 3Hanw- 
Te/iHO naflaHe Ha npoi/i3BOfli/iTe/iHOCTTa Ha npw/io>KeHkieTO. 

- B"b3craHOBflBaHe Ha flaHHi/ue - no BpeMe Ha M3n"b/iHeHMe Ha npi/i/io- 
>xeHi/ieTO, flOMewHtT Ha npi/i/io>KeHi/ieTO MO>Ke fla 6"bfle yHMiuo>KeH bbb 
BceKM MOMeHT (b pe3y/iTaT Ha cpuB, npoMeHM b KOfla, n/iaHkipaHO 
pecTapTupaHe Ha npoueca, v\ flp.). B TaicbB c/iynaw flaHHi/ue 3a ctCToa- 
HkieTO Ha npn^OKeHneTO me 6"bflaT 3ary6eHM. Ako TaKOBa noBefleHne e 
He>xe/iaTe/iHO, Tpa6Ba fla npeflnpneMeM flont/iHHTe/iHO crbriKki 3a 
peiuaBaHe Ha npo6/ieMa. 

- CbCTOHHkieTO Ha npw/io>KeHi/ieTO He e cnofle/ieHO b paMKMTe Ha ye6 
cpepMa (npn^OKeHne, M3n"b/iH*iBaHO Ha hako/iko cbpBtpa) v\nv\ ye6 
rpaflMHa (npw/io>KeHi/ie, i/i3n"b/iHflBaHO Ha hako/iko npoueca Ha eflMH ctp- 
Btp). npoMeH^MBMTe, cbxpaHflBaHi/i b cbCTOAHneTO Ha npn^OKeHneTO, 
ca r/io6a/iHM caMO b paMKMTe Ha eflMH npouec. 

BtnpeKM Te3M oco6eHOCTM, npoMeH/iMBkue Ha hmbo npn^OKeHne MoraT fla 
6"bflaT mhoto no/ie3HM. B tax MO>xeM fla na3MM paflKO i/i3B/ii/maHa, ho necro 



236 nporpaMnpaHe 3a .NET Framework (tom 2) 

AOCTbnBaHa MHCpopMauna ot 6a3M ot flaHHM v\ TaKa fla noflo6pnM 3HanwTe/iHO 
CKopocTTa Ha o6pa6oTKa Ha 3aaBKMTe. Ot Apyra crpaHa, to3m ecpeKT MO>KeM 
Aa 6"bAe nocTurHaT v\ c MexaHM3MMTe 3a KeiunpaHe b ASP.NET, komto me 
pa3r/ieAaMe no-K"bCHO. 

KO/ieKUMM 3a CbCTOflHMeTO Ha npM/io>KeHMeTO 

K/iaCbT HttpApplicationState npeAOCTaBfl ABe KO^eKUMM: Contents M 
StaticObjects. 

Ko/ieKUkisiTa contents AaBa AOCTbn ao npoMeH/ikiBkiTe Ao6aBeHM no cnep,uv\s\ 
HanwH: 



Application [ "AppStartTime" ] = DateTime . Now; 



MO>KeM M3PM4HO Aa M3no^3BaMe CBOMCTBOTO Contents: 



Application . Contents [ "AppStartTime" ] = DateTime . Now; 



Ko/ieKui/iflTa staticobjects npeAOcraBfl AOCTbn ao npoMeH/ii/iBkiTe, AecpMHM- 

paHM 4pe3 <object runat=" server" > Taro Be B"bB Cpaki/ia Global. asax: 



<object runat="server" scope="application" 

ID="MyInfo" PROGID="MSWC .MYINFO"> 
</ob j ect> 



Mo>xeM as M3no^3BaMe TaKa AecpuHnpaHMTe o6eKTM no cs\ep,Hv\s\ HanwH: 



<html> 

</body> 

Application Level Title: <%= Mylnfo. Title %> 

<body> 
</html> 



CMHXpOHM3aL4Mfl Ha AOCTbTia AO CbCTOflHMeTO Ha npM/lOKeHMeTO 

Hako/iko hmujkm Ha npM/io>KeHMeTO MO>Ke eAHOBpeMeHHO Aa AOCTbnBaT ctom- 
hoctm, ctxpaHeHM b cbCTOAHneTO Ha npw/io>KeHkieTO. C/ieAOBaTe/iHO Tpa6Ba 
Aa ce norpn>KMM Aa ocurypuM, ne ki3no/i3BaMe Te3M npoMeH/ii/iBki no 6e3ona- 
ceH Hani/iH. 

3a ue/lTa, K/iaCbT HttpApplicationState npeAOCTaBfl ABa MeTOAa Lock ( ) M 

unlock o, komto orpaHM^aBaT Aocrtna ao npoMeH/ikiBi/iTe Ha npi/i.no>KeHMeTO 
caMO ao eAHa HMUJKa. 

M3BMKBaHe Ha Lock ( ) MeTOAa Ha Application o6eKTa Kapa ASP.NET Aa 
6/iOKkipa onuTMTe Ha HMUJKMTe Aa AOCTbnBaT cbcroyiHkieTO Ha npn^OKeHneTO, 

AO M3BMKBaHe Ha Unlock () . 

C/ieAHMAT koa AeMOHCTpupa TexHMKaTa Ha 3aK/iK>nBaHe: 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 237 



Application . Lock ( ) ; 

Application [ "SomeGlobalCounter " ] = 

(int) Application [ "SomeGlobalCounter" ] + 1; 
Application . UnLock ( ) ; 



Ako He M3BMKaMe unlock o, to 3aK/iK>nBaHeTO me 6"bAe npeMaxHaTO aBTOMa- 
tm4ho luom npnK/iK)4M 3a*iBKaTa, v\i\v\ npM timeout, v\nv\ npn noflBABaHe Ha 
Heo6pa6oTeHO M3K/iK>neHMe, KoeTO fla npeKpaâ„¢ o6pa6oTKaTa Ha OTroBopa. 

C"bCTOfiHMe Ha cecwMTe 

ASP.NET npeAOCTaBfl b"B3mo>khoct 3a 3ana3BaHe Ha MHCpopMauna 3a B3anMO- 
AewcTBueTO c onpe,qe/ieH noTpe6MTe/i Me>Kfly OTfle/iHMTe 3aaBKM. ripn pa3pa- 
6oTKaTa Ha ye6 npn^OKeHMa necro ce Ha/iara fla pea/iM3MpaMe TaKaBa 
cpyHKUkiOHa/iHOCT. Tunn^eH npuMep e ye6-6a3kipaHa CMcreMa 3a pa6oTa c 
e^eKTpoHHa noma, ripn Hea noTpe6MTe/iMTe ntpBO ce MfleHTucpnunpaT npe3 
noTpe6nTe^CKO MMe v\ napo/ia, a cnep, TOBa CMcreMaTa vv\ "no3HaBa" ao 
MOMeHTa Ha 3aTBapaHeTO Ha ye6 6pay3tpa v\nv\ v\3i\v\3aue ot CMcreMaTa. 

BrpafleHMTe b ASP.NET bbsmokhoctm 3a noflflptxKa Ha noTpe6i/iTe/ici<a cecua 
(session state) hm no3BO/isiBaT fla: 

- MfleHTMCpnunpaMe v\ K/iacMCpMu.MpaMe aBTOMaTMUHO b /lomnecKa cecua 

BCMUKM 3aflBKM, MflBaiflM OT eflMH M CbLfl 6pay3"bp. 

- 3ana3BaMe flaHHM Ha cbpBtpa 3a cecnaTa, c ue/i M3no/i3BaHeTO mm 

Me>Kfly MHO>KeCTBO OTfle/lHM 3aflBKM. 

- J\a o6pa6oTBaMe b KOfla hm cb6v\Twn, CB"bp3aHM etc cecM^Ta 

(Session_OnStart, Session_OnEnd, M T.H.). 

- ABTOMaTMUHO fla 6"bflaT ocBo6o>KflaBaHe flaHHMTe 3a cecM^Ta, aKO b 
onpefle^eH nepMOfl ot BpeMe He ce no/iyuM 3asiBKa ot 6pay3"bpa. 

noflflp"b>KKaTa Ha cecMM b ASP.NET ce xapaKTepM3Mpa c: 

- /lecHOTa 3a no/i3BaHe. 

- HaflexflHO 3ana3BaHe Ha flaHHM, ycroMUMBO Ha pecrapTMpaHe Ha IIS v\nv\ 
Ha pa6oTHMfl npou.ee Ha ASP.NET. 

- CKa/iMpyeMOcr b ye6 cpepMa m ye6 rpaflMHa. 

- Bt3MO>KHOCT 3a cpyHKUMOHMpaHe m 6e3 HTTP 6mckbmtkm. 

- rio-flo6po 6"bp30fleMCTBMe cnp^MO K/iacMnecKOTO ASP. 

3a6e/ie>KKa: CbcrosiHMeTO Ha cecMMTe He ce 3ana3Ba M3B"bH rpaHMUMTe Ha 
eflHO ye6 npM/ioxeHMe. 



238 nporpaMnpaHe 3a .NET Framework (tom 2) 

llAeHTMcftMLjMpaHe Ha cecmi 

BcflKa aKTMBHa ASP.NET cecua ce MfleHTucpnuupa v\ npoc/ieA^Ba npe3 120- 
6mtob hm3 sessioniD. Tom e cbcraBeH ot ASCII cmmbo^m m Mowe p,a yuacma 
b URL aApecn. 

sessioniD CTOMHOCTMTe ce reHepwpaT TaKa, ne p,a ca yHMKa/iHM v\ AOcraTbUHO 
npon3BO^HM, 3a p,a He MO>xe no MAeHTucpuKaTop Ha HOBa ceci/m p,a ce OTKpue 
MfleHTucpMKaTop Ha npeflnujHa. 

sessioniD HM30BeTe ce npexBtp/isiT Me>KAy 3aaBKMTe npe3 HTTP 6ncKBMTKa 
v\nv\ npe3 BK^K)4BaHe b URL aflpecnTe, b 3aBMCMMOCT ot HacTpoMKMTe Ha 
npn^OKeHneTO. 

3ana3BaHe Ha cbcroflHweTO b paMKMTe Ha cecwn 

ASP.NET no3BO^ABa 3ana3BaHeTO Ha npon3BO/iHM ashhm 3a cecua b 
penHMKOBa KO^eKunfl, koato ce ctxpaHflBa b naMeTTa Ha IIS npoueca. 

KoraTO i/i3no/i3BaMe pe>KMM in-process, T.e. flaHHi/ue 3a cecnaTa ce na3AT 
AnpeKTHO b ASP.NET npoueca, Tpa6Ba p,a MMaMe npeflBMfl, ne Te me 6"bflaT 
3ary6eHM aKO aspnet_wp.exe v\i\v\ application domain 6"bAaT pecTapTupaHM. 
ToBa MO>Ke p,a c/iyni/i b cnep,uv\je cueHapnn: 

- Ha/ii/mkie Ha aTpn6yT b e/ieMeHTa <processModei> Ha web.config 
cpaw/ia, komto p,a p,osep,e ao crapTwpaHe Ha hob ASP.NET pa6oTeH 
npouec (npuMepHO yKa3aH /immmt Ha naMeTTa). 

- ripOMflHa B Global, asax kl/lkl Web.config Cpafi/lOBeTe. 

- npoMeHM b \Bin AnpeKTopuflTa Ha ye6 npw/io>KeHi/ieTO. 

B pe>KMM out-of-proc, BMecTO p,a ce noAA"bp>i<aT >kmbm o6eKTM b pa6oTHna 
npouec, T.Hap. State Server cbxpaHABa cbcroflHkieTO b naMeira, a pa6oTHMAT 
npouec ce o6p"biua npn Hy>Kfla kbm Hero. B pe>KMM SQL, CbcroflHkieTO Ha 
cecuflTa ce na3i/i b SQL Server. 

ASP.NET pa6oTHMAT npouec cepna^M3npa cecuMHMTe o6eKTMTe b Kpaa Ha bca- 
Ka 3aaBKa. ripn c/ieABama 3a*iBKa AaHHMTe ce n3B/iwnaT ot State ctpBtpa 
KaTO ABOM4HM noTOui/i, Aecepkia/iw3kipaT ce v\ ce nocraBHT b HOBa KO/iei<ui/ifl, 
Bene totobm 3a ynoTpe6a. no to3m Hani/m MO>Ke p,a ce pea/iki3kipa 3ana3BaHe 
Ha cbCTOHHi/ieTO npn cpuB Ha pa6oTHna npouec. A Aont/iHkiTe/iHO Moxe 
napa/ie/iHO p,a pa6oT*iT hako/iko npoueca, KoeTO npaBM to3m noAxoA no- 
CKa/iwpyeM. 

CrpyKTypa Ha cbcronHMeTO Ha cecmi 

K/iacbT, MMn^eMeHTkipaiu noAAPtwiOTa Ha cecuMHM ashhm e HTTP wopyna 

SessionStateModule. TOM reHepupa l/l M3B/lM4a yHMKa^HM MAeHTMCpMKaTOpM 

Ha cecuflTa v\ cm B3ai/iMOAewcTBa c AOCTaBnmo Ha yc/iyra no cbxpaHeHne Ha 
AaHHMTe 3a cecnaTa. 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 239 
riOfl06HO Ha HttpApplicationState, K/iaCbT SessionState npeflOCTaBfl RBe 

KO/ieKu,m/i contents m staticobjects. Pa6oTaTa c tax e aHa/iorwuHa Ha Ta3M 
Ha HttpApplicationState. IHe flafleM KpaTKM npuMepn: 



Session [ "AppStartTime" ] = DateTime . Now; 

Session. Contents [ "AppStartTime" ] = DateTime . Now; 



Eto KaK yKa3BaMe o6xBaT "session" Ha npoMeH/ii/iBa b Global. asax cpaw/ia: 



<OBJECT RUNAT=" SERVER" SCOPE="SESSION" 

ID="MyInfo" PROGID= " Scripting . Dictionary "> 
</OBJECT> 



KoHCpnrypnpaHe Ha cbcroflHiieTO Ha cecMn 

KaKTO cnoMeHaxMe, b ASP.NET Moxe as M36npaMe Me>KAy Tpn pe>KMMa Ha 
cbxpaHHBaHe Ha ashhi/i 3a cecnn: in-process, State Server, v\ SQL Server. 
He3aBMCMMO Ha kom MexaHM3"bM ce cnpeM, KOHCpurypupaHeTO Ha cbcroyiHkieTO 
Ha cecuMTe npoTi/ma b ABe cpa3M. ritpBO, MOAy/itT 3a cbcroflHwe ce Ao6aBH 
KtM HTTP 3aaBKaTa. no noApa36npaHe, Ta3M HacTpowKa ce 3aAaBa Ha hmbo 
KOMnKiTtp BtB cpaw/ia Machine . config. Eto npuMepHa ceKunfl ot to3m cpai/i/i: 



<httpmodules> 










<add name="sessionState" 








type=" System. Web 


SessionState . S 


ession 


St 


ateModule, 


Version=l. 0. 3300 


0, Culture=neut 


ral, 






PublicKeyToken=b7 7a5c5 61934e0 8 9 


" /> 






</httpmodules> 











BTopaTa CTtnKa e p,a yKaxeM >xe/iaHi/iTe aTpn6yTM 3a KOHCpwrypaui/m npe3 
aTpn6yTa <sessionstate>. CpeA no-Ba>KHMTe HacTpoMKM ca: 

- mode - pe>KMM ("Inproc", "StateServer" v\nv\ "SQLServer"). 

- COOkieless - RdtJWA Rd Ce M3nO/13BaT 6MCKBMTKM. 

- timeout - TaMMayT 3a M3TM4aHe Ha cecna. 

Ba/iMflai4Mjq Ha flamm 

Bcako eAHO MHTepaKTMBHO npn^OKeHne, no3BO/isiBa Ha noTpe6kiTe/ikiTe cm as 
B"bBe>KAaT ashhu. HecTO ce cnyuBa no HeBHMMaHne v\nv\ npeAHaMepeHO as 
6"bAaT BtBeAeHM rpeujHM ashhu. Ako He ce o6pa6oT*iT TaKMBa HeonaKBaHki 
CMTyauuM, Te MoraT as AOBeAaT ao HeonaKBaHO noBeAeHne Ha npw/io>KeHMeTO 
m Aopn ao cpuBaHe Ha ua/iaTa cwcreMa. KoraTO ce onaKBa BtBeAeHMTe ashhu 
Aa ca ot onpeAe/ieH Tun (npuMepHO ue/ionwcneH, pea/ieH v\ t.h.), b onpeAe- 
/ieH MHTepBa/i (npuMepHO ot ao 100) v\nv\ p,a OTroBapaT Ha no-c/io>KHi/i npa- 
Bki/ia (npuMepHO as ca Ba/iMAeH e-mail), pa3pa6oTni/iK"bT e A-ntweH p,a noACM- 
rypn, ne BtBeAeHMTe ot noTpe6wTe/ifl ashhu OTroBap^T Ha Te3M v\3v\CKBauv\s\. 



240 nporpaMnpaHe 3a .NET Framework (tom 2) 

ripouecbT Ha npoBepKa Ha BtBefleHMTe flaHHM HapwuaMe Banv\p,au,v\n Ha 
AaHHMTe. 

Ye6 npn^o>KeHMflTa, pa3pa6oTeHM c ASP.NET ye6 cpopMM, npeflOcraBflT 
B"b3MO>KHOCT 3a MHTepaKTMBHa pa6oTa Ha noTpe6kiTe/ifl. BtBefleHMTe ot 
noTpe6nTe^fl flaHHM ce npoBepaBaT v\ aKO He cnroBapHT Ha onaKBaHkiTe ot 
npn^OKeHneTO, ye6 cpopMaTa He no3BO/iflBa npeMMHaBaHe kbm flpyra cpopMa, 
flOKaTO flaHHMTe He 6"bflaT KopurnpaHM. 

3a fla ce pea/iki3kipa ecpeKTMBHa Ba/ikiflauwyi Ha flaHHMTe, ASP.NET hm 
npeflocTaBfl Ha6op ot kohtpo/im HapeneHki Ba/ikiflaTopw. Te b 3Hani/iTe/iHa 
CTeneH ynecHABaT M3B"bpujBaHeTO Ha npoBepKMTe. 

RequiredFieldValidator - npoeepxa 3a HaswHue Ha 

flaHHM 

KOHTpo/iaTa RequiredFieldValidator npOBepflBa fla/lM nOTpe6MTe/lflT e 

B"bBe/i M3o6iuo HAKaKBM flaHHM. ToBa e eflMH ot Haw-necTO M3no/i3BaHMTe b 
npaKTMKaTa Ba/ikiflaTopw. 

RequiredFieldValidator - npiiMep 

flpoBepKa fla^n noTpe6kiTe/iflT e noirb/iHki/i no/ieTO 3a MMe b flafleHa cpopMa: 



<asp : RequiredFieldValidator id="requiredFieldValidator" 
runat="server" ErrorMessage="Name Field is required" 
ControlToValidate="txtName">*</asp : RequiredFieldValidator> 



noHflKora hm ce Ha/iara fla npoBepuM fla/iw flaHHMTe, BtBefleHM ot noTpe6nTe- 
/i*i, ca pa3^M4HM ot HAKaKBa n"bpBOHana/iHa ctomhoct. ripuMepHO aKO i/i3no/i- 

3BaMe KOHTpO^aTa DropDownList, B KOflTO Ca M36pOeHM BCM4KM fltp>KaBM, M 

KaTO ntpBM HeroB e/ieMeHT ctom "Select your country", ecrecTBeHO e fla He 
MCKaMe fla no3BO/ii/iM Ha noTpe6kiTe/ifl fla M36epe cny>Ke6Hkifl 3annc. TyK naK 

MO>Ke fla M3nO/13BaMe RequiredFieldValidator, KaTO caMO Tpfl6Ba fla yKa- 

>KeM ntpBOHana/iHa ctomhoct b cbomctboto initial value. 

RequiredFieldValidator - ouje eAMH npMMep 

Eto KaK ce i/i3no/i3Ba Ba/ii/iflaTopvr b to3m c/iynaw: 



<asp : DropDownList id="ddlCountries" runat="server"> 

<asp : Listltem Value="0">Select your country</asp : Listltem> 

<asp : Listltem Value="l">Bulgaria</asp : Listltem> 

<asp : Listltem Value="2 ">USA</asp : Listltem> 

<asp : Listltem Value="3">United Kingdom</asp : Listltem> 

</asp : DropDownList> 

<asp : RequiredFieldValidator id="rfvCountry" runat="server" 
ErrorMessage="Please select your country" 
InitialValue="0" ControlToValidate="ddlCountries"> * 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 241 



</asp : RequiredFieldValidator> 



CompareValidator - npoBepKa Ha BxoflHMTe flai-mx 

comparevaiidator e Ba/iMflaTop, no/ie3eH b cnynaMTe, KoraTO MCKaMe: 

- fla cpaBHMM BxoflHMTe flaHHM Ha eflHa KOHTpona c Te3M Ha flpyr; 

- fla CpaBHMM BXOflHMTe flaHHM C KOHCTaHTHa CTOMHOCT 

- fla ycTaHOBMM p,anw BtBefleHMTe flaHHM ca ot onpe,qe/ieH TMn. 

Ako MCKaMe fla cpaBHMM flaHHMTe b flBe kohtpo/im (npMMepHO flBe TextBox 
kohtpo/im), ntpBO Tpa6Ba fla yKa>KeM Ha Ba/iM,qaTopa koa e 6a30BaTa kohtpo- 

/ia (ControlToCompare) M KOfl e Ba/lMflMpaHaTa (ControlToValidate). 3a fla 

ce onpefle/iM KaKBO touho cpaBHeHMe fla ce M3BtpujM (paBeHCTBO, no-ronaMO, 
no-Ma/iKO, no-ro/iflMO v\nv\ paBHO, no-Ma/iKO v\nv\ paBHO v\i\v\ pa3/iMHHo), ce 

M3nO/13Ba CBOMCTBOTO Operator, KOeTO MMa CTOMHOCTM - Equal, GreaterThan, 
GreaterThanEqual, LessThan, LessThanEqual, NotEqual. flon"b/lHMTe.nHO 

npe3 cbomctboto Type Ha Ba/iM,qaTopa, MO>Ke fla ce yKaxe m TMnvr Ha flaHHM- 
Te, komto onaKBaMe fla 6"bflaT nont/iHeHM ot noTpe6MTe/ia. Ba/iMflHMTe TMnoBe 

ca String, Integer, Double, Date, Currency. CTOMHOCTTa no nOflpa36MpaHe 

e string. Ako CMe 3a,qa/iM flpyra, npeflM fla ce M3B"bpujM cpaBHeHMe Me>Kfly 
CTOMHOCTMTe Ha 3aflafleHMTe kohtpo/im, ce npoBep^Ba fla/iM CTOMHOcrra Ha 
KOHTpo/iaTa ControlToValidate e ot obOTBeTHMfl TMn. B c/iynafi ne He e, 
npoBepKaTa 3a Ba/iMflHOcr Bptiua OTpMuaTe/ieH pe3y/iTaT. Ako CTOMHOcrra Ha 
KOHTpo^aTa ControlToCompare, He e ot 3aflafleHMfl TMn, a Ta3M b 
ControlToValidate e onaKBaHaTa, to npoBepKaTa MMHaBa. 3aTOBa Tpa6Ba fla 
ce npaBM M3pM4Ha Ba/iMflauMH 3a TMna Ha flaHHMTe b KOHTpo/iaTa 

ControlToCompare. flpyra OC06eHOCT Ha CompareValidator e, ne aKO HflMa 
B"bBefleHa CTOMHOCT B eflHa OT flBeTe KOHTpo/lM ControlToValidate M 

ControlToCompare, npoBepKaTa MMHaBa. riopaflM TOBa ce Ha/iara BMHarM fla 

ce M3nO/13Ba B KOM6MHai4Mfl C RequiredFieldValidator. 

B C/iynaM, ne He e 3aflafleHO CBOMCTBOTO ControlToCompare, a 
ValueToCompare, cpaBHeHMeTO e CbC CTOMHOCTTa B"bB ValueToCompare. AKO Tfl 

He e ot yKa3aHMfl TMn b cbomctboto Type, ce xBtp/ia HttpException. B c/iy- 

nafi, ne ca 3aflafleHM M ControlToCompare M ValueToCompare, C npMOpMTeT e 
ControlToCompare . 

Ako MCKaMe caMO fla npoBepMM fla/iM CTOMHOcrra Ha KOHTpo/iaTa 

ControlToValidate e OT 3aflafleHMfl TMn, 3aflaBaMe Ha CBOMCTBOTO Operator, 
CTOMHOCT DataTypeCheck. 

CompareValidator - npnMepn 

npoBepKa fla/iM ctomhoctmt6 Ha flBe tckctobm no/ieTa cbfltpwaT eflHaKBM 

CTOMHOCTM : 



242 flporpaMnpaHe 3a .NET Framework (tom 2) 



<asp : CompareValidator id="compareValidator" runat="server" 
ErrorMessage="The two fields do not match" 
ControlToValidate="TextBoxl" ControlToCompare="TextBox2 " 
Type="String" Operator="Equal"> </asp : CompareValidator> 



flpoBepKa fla/iM CTOMHOora Ha eflHO TeKCTOBO cbBnafla c HM3a "Baw Knpo": 



<asp : CompareValidator id="compareValidator" runat="server" 
ErrorMessage="The value is not ' Baw Kwpo ' " 

ControlToValidate="TextBoxl" ValueToCompare="Eaii Knpo" 
Type="String" Operator="Equal"> </asp : CompareValidator> 



flpoBepKa fla/iM CTOMHOora Ha eAHO no/ie e ot ue/ionMC/ieH Tun: 



<asp : CompareValidator id="compareValidator" runat="server' 
ErrorMessage="You have to enter an integer value" 
ControlToValidate="TextBoxl" Type=" Integer" 
Operator="DataTypeCheck" /> </asp : CompareValidator> 



RangeValidator - npoBepKa nonaaai-ie b MHTepBasi 

HecTO Ha ye6 pa3pa6oT4MUMTe mm ce Ha/iara fla ocurypaT, ne flaHHMTe, 
BtBefleHM ot noTpe6i/iTe/i*i, ca b onpe,qe/ieH MHTepBa/i (npuMepHO, ne nonaflaT 
b nepnofl orpaHM^eH ot flBe p,ajv\ v\nv\ ca Me>KAy flBe nMC/ieHM ctomhoctm). 3a 

Ta3M ue/1 MO>Ke fla M3nO/13BaMe KOHTpO/iaTa RangeValidator, KOflTO MMa 

mhoto o6lum CBOMCTBa c CompareValidator. Pa3/im<aTa e, ne npn Hea Tpa6Ba 
Aa yKaxeM rpaHnun 3a CTOMHOCTMTe b KOHTpo/iaTa: MMHMMa/iHa 

MinimumValue M MaKCMMa/lHa - MaximumValue . KaKTO npn 

CompareValidator, aKO MMa HecbOTBeTCTBue Ha BtBefleHMTe flaHHM v\ 

CBOMCTBOTO Type, B"b3HMKBa HttpException. AKO B KOHTpO/iaTa 

controiToVaiidate He ca BtBefleHM flaHHM, npoBepKaTa MMHaBa ycneujHO. 

3aTOBa neCTO ce Ha/iara fla ce KOM6MHMpa C RequiredFieldValidator. 

RangeValidator - npMMep 

flpoBepKa 3a flaTa ot 2006 roflMHa: 



<asp : RangeValidator 
id="rangeValDate" 
Type="Date" 

ControlToValidate="txtDate" 
MaximumValue= "2006/12/31" 
MinimumValue="2 6/l/l" 
runat=" server" /> 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 243 

RegularExpressionValidator - cpaBHqeaHe c 
pery/inpeH M3pa3 

Ba^MAaunfl Ha bxoahm flaHHM npe3 pery/isipHM M3pa3M e onucaHa b AeTaw/iw b 
eflHOMMeHHaTa TeMa. ASP.NET npeAOcraBsi KOHTpo/ia ReguiarExpression 
validator 3a no3MTMBHa Ba/ikiAaui/m Ha BtBeAeHMTe ot noTpe6kiTe/ifl ashhu. 
Tpa6Ba Aa ce yKa>KaT KOHTpo/iaTa, koato me 6"bAe Ba/ikiAnpaHa - 

ControlToValidate, M pery/lflpHMflT M3pa3, C KOMTO Rd Ce M3B"bpilJM 
npOBepiOTa - ValidationExpression. Ba/lMAaUMflTa MO)Ke Aa ce M3B"bpilJM 

KaKTO npn K/iweHTa, TaKa v\ Ha ctpBtpa. ripn npoBepKa npn K/iweHTa, ce 
M3no/i3BaT pery^apHMTe M3pa3M b JavaScript, hi/ihto CMHTaKCuc e iioamho- 
>KecTBO Ha CMHTaKCuca, noAA"bp>KaH ot K/iaca Regex. npenoptukiTe/iHO e npn 

3aAaBaHe Ha ValidationExpression Aa ce M3nO/13Ba CMHTaKCMCa Ha JScript 

pery/iapHMTe M3pa3M, 3a Aa ce M36erHaT HectOTBeTCTBua. KaKTO npn 
npeAxoAHO M36poeHMTe Ba/ii/iAaTopw, TaKa v\ npn to3m, aKO b KOHTpo/iaTa 
ControlToValidate, He ca BtBeAeHM AaHHM, npoBepKaTa MkmaBa ycneujHO. 

RegularExpressionValidator - npMMep 

npoBepKa Ha Ba/ikiAeH e-mail aApec (TOBa e onpocreH npuMep, pery/isipHMflT 
M3pa3, komto e o6xBaiua bci/iukm Ba/ikiAHM aApecu e 3HanwTe/iHO no-ro/isiM): 



<asp : RegularExp 


cessionValidat 


or id= 


"revEmail" 


runat= 


="server" 


ErrorMessage= 


"Email is not 


valid. 


ii 








ControlToVali 


date="txtEmail 


ii 










ValidationExp 


ression= 












"\w+( [-+ 


. ]\w+)*@\w+( [- 


• ]\w+) 


*\. 


\w+( [-. 


]\w+)* 


"> ! 


</asp : RegularExpressionVal 


idator> 







CustomValidator - npon3BO/iHa npoeepxa 

OnucaHMTe no-rope kohtpo/im noKpuBaT ro/iflMa nacr ot pea/iHMTe Hy>KAn Ha 
pa3pa6oT4MKa 3a Ba/ikiAauwfl Ha AaHHMTe. KoraTO ca Ha/iara npw/iaraHe Ha no- 
cno>KHa ziorkiKa 3a Ba/ikiAnpaHe Ha AaHHMTe MO>xeM Aa M3no/i3BaMe kohtpo- 

ZiaTa CustomValidator. 

Ba>KHa xapaKTepucTMKa Ha Ba/iMAaTopwTe e, ne Ba/ii/iAauwflTa BMHarn ce 
M3BtpujBa m Ha ctpBtpa, Aopn Aa ce e ki3B"bpujki/ia Ha K/iweHTa. B Aocera 
M36poeHMTe ao MOMeHTa KOHTpo/in, TOBa CTaBa aBTOMaTM^HO, ho npn 
CustomValidator ce Ha/iara caMM Aa Ao6aBMM Te3M cpyHKunn. ToBa CTaBa c 
npuxBaiuaHe b ye6 cpopMaTa Ha c"b6nTneTO servervaiidate, KoeTO e c 

apryMeHT 06eKT OT TMn ServerValidateEventArgs. 3a ue/lTa ca HM Hy>KHM 

CTOMHOCTTa Ha KOHTpo/iaTa, koato ce Ba^MAupa, m npoMeH/iMBa, b koato Aa 

BtpHeM pe3y/lTaTa. ApryMeHTbT OT Tkin ServerValidateEventArgs, nOAaAeH 

ot c"b6nTneTO, c"bA"bp>Ka croi/iHOCTTa Ha Ba/ikiAnpaHaTa KOHTpo/ia 

ControlToValidate B CBOMCTBOTO Value. C/ieA M3B"bpilJBaHe Ha npOBepiOTa, 

Tpa6Ba Aa BtpHeM pe3y/iTaT npe3 cbomctboto isvaiid. 



244 nporpaMnpaHe 3a .NET Framework (tom 2) 

CustomValidator - npimep 

3a fla n^KDCTpupaMe ynoTpe6aTa Ha CustomValidator KOHTpo/ia, HeKa 
pa3r/ieflaMe cpopMa etc c/ieAHOTO cbfltpwaHMe: ABa 6yTOHa 3a a/iTepinaTkiBeH 
M36op (RadioButton), npe3 komto noTpe6MTe/iHT yKa3Ba cboa no/i (M"b>K / 
>KeHa), m eflHO TeKCTOBO no/ie, b KoeTO tom noirb/iBa cboa ETH. ETH e 
fleceTuncppeH HOMep, b komto ntpBMTe wecr umcppm ca 3a po>KfleHaTa flaTa, 
ceAMaTa m ocMaTa ca 3a cny>Ke6Ha MHCpopMauMa 3a paMOH, fleBeTaTa e 3a 
no/ia, a fleceTaTa uMCppa e KOHTpo/iHa. A/iropMTbMtT Ha npecMsiTaHe Ha 
fleceTaTa UMCppa e M3BecreH, ho cera H^Ma fla ro flMCKyTMpaMe.] McKaMe fla 
CBepMM fla/iM flafleHO ETH, cbOTBeTcma Ha M36paHMfl no/i. Ako eflMH noBeK e 
mi>>k, fleBeTaTa UMCppa e neTHa, aKO e >KeHa - HeneTHa. Ha Ta3M 6a3a me 

M3rpaflMM Ba^MflaUMfl npe3 KOHTpo/iaTa CustomValidator. HaCTTa ot ye6 

cpopMaTa, koato hm MHTepecyBa, e: 



<asp : RadioButton ID="rbtnFemale" Runat="server" 

Text="aCeHa" Checked="True" GroupName=" Gender" /> 
<asp: RadioButton ID="rbtnMale" Runat="server" 

Text="M r bac" GroupName="Gender" /> 
<asp:TextBox id="txtEGN" runat="server" /> 
<asp : CustomValidator id="cvEGN" Runat="server" 

ErrorMessage="B r bBejin CTe HeBajiMfleH ETH" 

EnableClientScript="True" 

ControlToValidate="txtEGN" 

ClientValidationFunction="ValidateEGN">*</asp: CustomValidator 
> 



OCBeH CTaHflapTHMfl aTpM6yT ControlToValidate Ha CustomValidator 

KOHTpo^aTa CMe 3ap,anw m aTpM6yTa ciientvaiidationFunction. B Hero ce 
3aflaBa MMeTO Ha JavaScript cpyHKUM^Ta, OTroBapaiua 3a Ba/iMflauMATa npM 
K^MeHTa. B KOfla 3afl cpopMaTa ce a6oHMpaMe 3a ct6MTMeTO ServerValidate: 



cvEGN. ServerValidate += 

new ServerValidateEventHandler (cvEGN ServerValidate) 



OyHKUMflTa cvEGN ServerValidate (...) pea/lM3Mpa Ba/lMflaUMflTa Ha ctpBtpa: 



private void cvEGN_ServerValidate (ob j ect source, 
ServerValidateEventArgs args) 

{ 

string pattern = @" A [ 0-9] { 10 } $ " ; 

if ( Regex . IsMatch (args .Value, pattern) ) 

{ 

int genderDigit = 

Convert . ToInt32 ( args .Value . Substring (8,1) 
iff (genderDigit % 2) ==0 ) 

{ 

iff rbtnMale. Checked ) 

{ 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 245 



args.IsValid =true; 

} 
else 

{ 

args.IsValid = false; 

} 
} 
else 

{ 

iff rbtnFemale . Checked ) 

{ 

args.IsValid =true; 

} 
else 

{ 

args.IsValid = false; 

} 
} 
} 
else 

{ 

args.IsValid = false; 

} 
} 



Ta3M cpyHKunfl M3no/i3Ba e/ieMeHTapeH pery/iapeH M3pa3, 3a p,a npoBepn p,as\v\ 
noTpe6nTe^flT e BtBe/i CMi/ic/iei-m ashhu. OyHKui/mTa, koato OTroBapa 3a 
Ba/iMAaukisiTa npn K/iweHTa, ce pea/iki3kipa Ha e3MK, noAAtpwaH ot 6pay3"bpnTe 
(Haw-necTO ce ki3no/i3Ba JavaScript v\ VBScript). Eto cpyHKUi/mTa 
validateEGN(...) Ha JavaScript: 



<script language=" j avascript"> 

function ValidateEGNf source, arguments ) 

{ 

var pattern = / A [ 0-9] { 10 } $/; 

var rbtnMale = document . getElementByld ( "rbtnMale" ) ; 

var rbtnFemale = document . getElementByld ( "rbtnFemale" ) ; 

if ( pattern . test (arguments .Value) ) 

{ 

var genderDigit = arguments .Value . substr ( 8 , 1 ) ; 
iff (genderDigit % 2) ==0 ) 

{ 

if ( rbtnMale . checked ) 

{ 

arguments . IsValid =true; 

} 
else 

{ 

arguments . IsValid = false; 



246 flporpaMnpaHe 3a .NET Framework (tom 2) 



} 
} 
else 

{ 

iff rbtnFemale . checked ) 

{ 

arguments . I sValid =true; 

} 
else 

{ 

arguments . IsValid = false; 

} 
} 
} 
else 

{ 

arguments . IsValid = false; 

} 
} 
</script> 



ValidationSummary - cniicbK Ha rpeuiKUTe 

KoraTO noTpe6kiTe/ikiTe nont/iBaT cpopMM, MoraT fla BtBeflaT rpeujHM flam-m b 
noBene ot eflHa KOHTpo/ia. B TaKMBa cnynaw e Haw-yflo6HO fla ce M3Kapa 
cnncbK (pe3K>Me) Ha rpeujKMTe v\ 3a ue/ua ASP.NET hm npeflocraBsi KOHTpo/ia 

ValidationSummary. Ilpkl M3B"bpilJBaHe Ha Ba/lklflauklfl BCeKM Ba/lklflaTOp 

npoBepaBa ,qa/ii/i ca BtBefleHM KopeKTHM flaHHM v\ aKO He ca, b KOHTpo/ia 

ValidationSummary ce M3Be>KflaT Cto6lfleHMflTa 3a rpeilJKa, 3aflafleHM 4pe3 
aTpn6yTa ErrorMessage. 

KoHTpo/iaTa ValidationSummary npefl/iara c^eflHMTe onunn: 

- Cbomctboto DispiayMode onpe,qe/ifl no KaKtB Hani/m fla ce noKa>KaT 
rpeujKMTe. B"b3MO>KHi/iTe ctomhoctm 3a Hero ca - BuiietList, List, 

SingleParagraph. CTOMHOCTTa no nOflpa36kipaHe e BuiietList. 

- Cbomctboto Enabieciientscript onpe,qe/ifl fla^n npw K/iweHTa fla ce 
M3n"b^HM CKpunT m fla ce M36erHe xofleHe ao cbpBtpa, v\nv\ cnwcbicbT c 
rpeujKMTe fla ce nont/iHM naK Ha cbpBtpa. CTOMHOCTTa no noflpa36n- 
paHe e true. 

- Cbomctboto showsummary onpefle/ifl p,anv\ cnnctKtT c rpeujKM fla ce 
noKa3Ba Ha noTpe6i/iTe/ifl. CTOMHOCTTa no noflpa36npaHe e true. 

- Cbomctboto showMessageBox onpefle/isi fla/iw fla ce noKaxe Ha 
noTpe6i/iTe/ifl cnwcbicbT c rpeujKM nofl cpopMaTa Ha MessageBox. Ako 

CTOMHOCTTa Ha T03I/I aTpkl6yT e true, 3a fla ce nOKa>Ke MessageBox, e 
Heo6xOflMMO M CTOMHOCTTa Ha EnableClientScript fla e true. 

CTOMHOCira no noflpa36npaHe e false. 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 247 



- Cbomctboto HeaderText onpeAe/ia KaKBO fla e 3ar/iaBkieTO Ha pe3K)MeTO 
c rpeujKM. CTOMHOcrra no noApa36npaHe e npa3HMAT hm3. 

MepapxMfl Ha K/iacoeeTe Ba/inflaTopn 

C/ieAHaTa K/iac AHarpaMa onucBa wepapxnaTa Ha Ba/ii/iAaTopwTe: 




BaseCompareValidator CustomValidator RegularExpressionValidator RequiredFieldValidator 



Compare Validator 



RangeValidator 



Ba^MAaTopnTe ce ABflBaT cneukia/iki3wpaHki Label kohtpo/im. 5a30BMflT K/iac 

BaseValidator AeCpMHMpa 06lUMTe 3a BCM4KM Ba/lklAaTOpkl CBOMCTBa - 
ControlToValidate, Display, EnableClientScript, Enabled, 
ErrorMessage, IsValid. RangeValidator M CompareValidator HacneA^BaT 
OT BaseCompareValidator o6lUOTO CBOMCTBO Type. 

O6114M ceoMCTBa 3a Ba/mflaTopMTe 

KaTO Hac^eAHnun Ha 6a30BMfl K/iacBaseVaiidator, BCM4KM Ba^MAaTopn MMaT 

HflKOM 06lUM CBOMCTBa: 



ControlToValidate 
BXOAHMTe ASHHU. 



3aAaBa Ha koh KOHTpo/ia p,a 6tAaT npoBepeHM 



Display - KOHTpo/ii/ipa no KaKtB Ha^MH p,a ce noi<a3Ba TeKCTa Ha 
Ba^MAaTopa (craBa AyMa 3a croi/iHOCTTa Ha cbomctboto Text, a He 3a 

CTOMHOCTTa Ha CBOMCTBOTO ErrorMessage). B"b3MO>KHI/ITe CTOMHOCTM 3a 
T03M aTpn6yT Ca - Dynamic, Static, None. CTOMHOCTTa no nOApa36kl- 

paHe e static, ripn None He ce noKa3Ba hmluo. Pa3/ii/iKaTa Me>KAy 
Dynamic m static e Ma/iKa m e CB"bp3aHa c cpaKTa, ne Ba^MAaTopnTe ce 
BM3ya/iki3kipaT (render) KaTO <span> TaroBe. KoraTO Display MMa 
CTOMHOCT Dynamic, aTpi/l6yTbT style Ha <span> Tara H3Me>Kfla TaKa: 
style=" color: Red; display : none; " . flOKaTO npn Static, aTpn6yTbT 
style Ha <span> Tara M3Me>KAa TaKa: style=" color: Red; 
visibility:hidden;". Pa3/lklKaTa e B TOBa, ne npoCTpaHCTBOTO, 3aeTO 

ot TeKCTa Ha Ba/11/iAaTopa npn ctomhoct static, e npeABapwTe/iHO 
3aAe/ieHO, AOKaTO npn Dynamic ce 3aAe/i*i npn noyiBaTa Ha TeKCTa. 

EnableClientScript - yKa3Ba p,ai\V\ Ba/lMAaUMflTa 3a ASAeHMfl 

Ba^MAaTop me ce M3B"bpujn v\ npn K/iweHTa, v\nv\ caMO Ha ctpBtpa. 



248 nporpaMnpaHe 3a .NET Framework (tom 2) 

ripneMa ctomhoctm true m false ( no noflpa36npaHe - true). BceKM 
eflMH ot Ba/ikiflaTopwTe c ki3K/iK>neHi/ie Ha customvaiidator MMa pea/iw- 
3aunfl Ha npoBepKaTa 3a Ba/ikiflHOcr npn K/iweHTa. Ako croMHOCTra Ha 
EnableClientScript e true, npw K/iweHTa ce npaBM npoBepKa, KaTO B 
c/iynaw Ha HeBa/iMAHki ashhh ce cnecrsiBa xoAeHeTO ro ctpBtpa. 

- Enabled - KOHTpO^Mpa P,ai\V\ CbOTBeTHMflT Ba/iMAaTop e aKTMBeH v\nv\ He. 

CTOMHOCTTa no noApa36npaHe e true. 

- ErrorMessage - cbxpaHABa cbo6meHweTO 3a rpeujKa, KoeTO ce noi<a3Ba 
Ha noTpe6nTe^fl npn BtBeAeHM HeKopeKTHM ashhu. 

- isvalid - noi<a3Ba p,anv\ cbOTBeTHi/isiT Ba/iMAaTop e MMHa/i ycneujHO 
npoBepKaTa Ha AaHHMTe. CTOMHOCTTa Ha TOBa no/ie no noApa36npaHe e 

true. 

Kora m Ki>Ae ce M3Bi>piiiBa BasiuAaLjMflTa? 

KoraTO M3no/i3BaMe craHAapTHMTe Ba/ikiAaTopw Ha ASP.NET, npoBepKaTa 3a 

Ba^MAHOCT Ce M3B"bpilJBa BMHarM Ha C"bpB"bpa. B 3aBMCMMOCT OT CTOMHOCTTa Ha 

no/ieTO EnableClientScript MO>xe Aa MMa npoBepKa m npn K/iweHTa, ho 
3aA"b^>KMTe^HO ce npoBep^Ba i/i Ha ctpBtpa. 

ripn npoBepKaTa 3a Ba/ikiAHOcrra Ha p,auuv\je, ce 3aAaBa 6y/ieBa ctomhoct Ha 
cbomctboto isvalid Ha ye6 cpopMaTa, b 3aBMCMMOCT p,anv\ npoBepKaTa e 
MMHa/ia ycneujHO hjih He. Ta3M ctomhoct ce 3aAaBa aBTOMaTMUHO ot MeTOAa 
Ha cpopMaTa validate o, komto ce M3BMKBa no BpeMe Ha i/i3n"b/iHeHkieTO Ha 
ye6 cpopMaTa. 3a p,a pa3ni/iTaMe, ne no/ieTO isvalid cwvbpwa KopeKTHa ctom- 
hoct, Tpa6Ba p,a 3HaeM b kom eTan ot MOAe/ia Ha M3n"b/iHeHne Ha cpopMaTa ce 
M3BMKBa T03M MeTOA- He era rpeujKa b npaKTkiiOTa e p,a ce npoBep^Ba p,anv\ 
cpopMaTa e Ba/ikiAHa npn c"b6nTneTO Load Ha cpopMaTa. ToBa e norpeujHO, 3a- 

LUOTO MeTOA"bT Validate () Ce M3BMKBa C/ieA C"b6klTMeTO Load i/i npeAM 

c"b6nTMflTa, CBtp3aHM c ocraHa/iMTe kohtpo/im Ha cpopMaTa (click, 

SelectionChange M APyrn). 

MMa c/iynaw, b komto He MCKaMe p,a ce npoBep^BaT 3a Ba/ii/iAHOcr BtBeAeHMTe 
ot noTpe6i/iTe/i*i ashhu. HaM-TpuBna^HMflT npuMep e c cpopMa, b koato noTpe- 
6nTe^AT Tpa6Ba p,a BtBeAe HAKaKBM ashhh v\ p,a noTBtpAM c 6yTOHa submit, 
ho Aa MO>Ke m Aa ce OTKa>Ke c 6yTOHa cancel. B to3m c/iynaw Tpa6Ba npn 
HaTMCKaHe Ha submit Aa ce M3B"bpujM Baj\v\p,a\\v\s\, a npn HaTMCKaHe Ha cancel 
Aa He ce npaBM TaKaBa. 3a ue/iTa Ha aTpn6yTa causesvaiidation Ha 6yTOHa 

Cancel ce 3aAaBa CTOMHOCT false. 

3 a mo BMHarw Ha CbpBi>pa? 

Ba^MAaunflTa npn K/iweHTa CTaBa npe3 CKpunTOBe, M3n"b/iHflBaHM Ha MaiunHaTa 
Ha noTpe6kiTe/i*i. riOTpe6kiTe/ii/iTe MoraT Aa BAHTHaT hmboto Ha curypHOCT v\ 
v\3\\s\no Aa 3a6paHAT M3n"b/iHeHi/ieTO Ha CKpunTOBe. 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 249 

CKpunTOBeTe 3a BanwRauwn ca 6a3npaHM Ha TaKa HapeneHkifl Document 
Object Model, npn pa3/ikmHMTe 6pay3-bpn (Internet Explorer, Firefox, 
Netscape, Opera...) v\ flopn npn pa3/ii/mHi/iTe Bepcun Ha eflMH 6pay3"bp to3m 
MOfle/i e pea^M3npaH no pa3/iwneH Hani/m, BtnpeKM yTBtpfleHkiTe o6lum craH- 
AapTM. B pe3y/iTaT Ha TOBa Ba/ikiflau.wflTa npn pa3/ikmHHTe 6pay3"bpn MO>xe fla 
AaAe pa3^M4HM pe3y/iTaâ„¢. 

flont/iHHTe/iHO Tpa6Ba fla ce MMa npeflBMfl, ne CKpunTOBeTe ca npocTO o6mk- 
HOBeH TeKCT, MHTepnpeTupaH ot 6pay3tpa Ha K/iweHTa. noTpe6i/iTe/iflT MMa 
nt/iHaTa CBo6ofla fla peflaKTupa CKpunTa v\ fla ro HaKapa fla npaBM TOBa, 
KoeTO tom no>xe/iae. 

Te3M cpaKTM oko/io curypHOCTTa v\ KOHCkicreHTHOCTTa Ha CKpunTOBeTe ca 
npn^MHaTa npoBepKaTa 3a Ba/ikiflHOcr Ha flaHHMTe BMHarn fla ce npaBM Ha 
cbpBtpa. 

Oco6eHOCTM npn Ba/maaujiisiTa npn K/meHTa 

Ba^MflaunflTa npn ASP.NET 1.1 MMa hakoi/i oco6eHOCTM. Ta MMa eflHO Ba>KHO 
orpaHM^eHkie: 



& 



Ba/iMflai4MfiTa, pea/in3npaHa npe3 CTaHflapTHirre Ba/inflaTopn 
Ha ASP.NET 1.1, pa6oTM caMO c Internet Explorer. 



3a fla M3B"bpujM Ba/inflau.Mfl, ASP.NET peHflupa flont/iHMTe/ieH CKpunT Ha 
JavaScript, komto e cbBMecTMM caMO c Internet Explorer. 3a fla ce M3B"bpujn 
npoBepKa 3a bcmukm Ba/ikiflaTopw npn K/iweHTa, Te ce nocraBflT b JavaScript 
MacuB m cnefl TOBa eflMH no eflMH npoBepsiBaT fla/ii/i noTpe6i/iTe/iHT e BtBe/i 
KopeKTHM flaHHM. HacTra ot CKpunTa, koato ce noflfl"bp>Ka caMO ot Internet 
Explorer e: 



document . all [ "validator name"] 



TaKa, aKO ye6 CpopMaTa MMa neTWpkl RequiredFieldValidator KOHTpo/lkl, 

JavaScript koabt M3r/ie>Kfla no cnep,uv\s\ HanwH: 



var Page_Validators = new Array ( 

document . all [ "RequiredFieldValidatorl" ] 
document . all [ "RequiredFieldValidator2 " ] 
document . all [ "RequiredFieldValidator 3" ] 
document . all [ "RequiredFieldValidator 4" ] 



ripo6/ieM"bT MO>xe fla 6"bfle M36erHaT v\ b ASP.NET 1.1, ho 3a ue/iTa Tpa6Ba 
nporpaMMCTa fla pea/iki3kipa cbom kohtpo/im 3a Ba/ikiflaTopw. B cneflBamaTa 
Bepcufl Ha ASP.NET (2.0) T03M npo6/ieM e peiueH v\ Ba/iMflaui/iyrra npn K/iweHTa 
pa6oTM c BCM4KM ye6 6pay3"bpn. 



250 nporpaMnpaHe 3a .NET Framework (tom 2) 

nOTpe6MTe/lCKM KOHTpO/lM 

HTML m ye6 ctpBtp KOHTpo/ikiTe npeA/iaraT /ieceH Hani/m 3a noBTopHO i/i3no/i3- 
BaHe (reuse) Ha cpyHKuwoHa/iHOcr. Ho necro ce Ha/iara Ha hako/iko Mecra fla 
MCKaMe Aa w3no/i3BaMe KOM6nHaunfl ot rpyna kohtpo/im, komto p,a MMaT 
eAHaKtB bma m/m^m noBeAeHne. 3a ue/iTa ASP.NET npeA/iara bbsmokhoct 3a 
pa3pa6oTKa Ha noTpe6i/iTe/iCKki kohtpo/im (user controls). Te npeAOcraBAT 
yAo6eH Ha^MH 3a cnoAe/iHHe Ha cpyHKui/iOHa/iHOcr v\ noTpe6kiTe/iCKi/i MHTep- 
cpewc Me>KAy CTpaHnunTe Ha npw/io>KeHi/ieTO. 

noTpe6nTe/iCKM kohtpo/im m ye6 4>opMM 

noTpe6nTe^CKaTa KOHTpo/ia e e/ieMeHT noAo6eH Ha ASP.NET ye6 cpopMa, 
komto MO>Ke Aa ce Brpa>KAa b Apyrn ASP.NET ye6 cpopMM. riOAo6HO Ha ye6 
cpopMMTe, noTpe6nTe^CKMTe kohtpo^m ca ctpBtpHM KOMnoHeHTM, komto npeA- 
ziaraT noTpe6wTe/iCKki MHTepcpewc v\ cpyHKui/iOHa/iHOcr. 

OcHOBHaTa pa3/ikiKa Me>KAy noTpe6i/iTe/iCKHTe kohtpo/im m ye6 CTpaHnunTe e, 
ne ntpBMTe He ca npeAHa3HaneHki Aa ce noKa3BaT AnpeKTHO b 6pay3tp. 3a Aa 
6"bAaT M3no^3BaHM, Tpa6Ba Aa 6"bAaT BK/iK>neHM b ye6 cpopMa. 

riOTpe6MTe/lCKMTe KOHTpo/lkl ca Hac/ieAHklU.M Ha System.Web.UI.UserControl 

b o6eKTHMfl MOAe/i Ha ASP.NET. Te ce onucBaT bbb cpaw/i c pa3UJnpeHne 

( . ascx). 

npeflMMCTBa npn M3no/i3BaHeTO Ha noTpe6nTe/iCKM 

KOHTpO/lM 

- CaMOCTOATe^HM - noTpe6nTe^CKMTe kohtpo/im ca caMOCTOHTe/iHi/i v\ npe- 
AOCTaBAT OTAe/iHM npocTpaHCTBa ot MMeHa (namespaces) 3a npoMeH/in- 
BMTe. TaKa He ce no/iynaBaT ko/im3mm etc cbiuecTByBaiun MeTOAH h 
CBOMCTBa Ha crpaHi/iuaTa, koato no/i3Ba noTpe6nTe/iCKaTa KOHTpo/ia. 

- npen3no/i3BaeMM (reusable) - noTpe6nTe/iCKMTe kohtpo/im MoraT Aa ce 
M3no/i3BaT noBene ot BeAH"b>K Ha eAHa v\nv\ hako/iko CTpaHnun. 

- E3mkobo HeyTpa/iHM - noTpe6nTe/iCKMTe kohtpo/im MoraT Aa 6"bAaT 
nucaHM Ha pa3/ikmeH nporpaMeH e3MK ot M3no/i3BaHMfl b crpaHkiuaTa, b 
koato ce pa3no/iaraT. 

Cnofle/inHe Ha noTpe6HTe/iCKH kohtpo/im 

noTpe6nTe/iCKMTe kohtpo/im MoraT Aa ce cnoAe/iflT Me>KAy bcm^km CTpaHnun 
Ha ye6 npn/iOKeHneTO, ho mhoto TpyAHO ce cnoAe/iflT Me>KAy pa3/iM4HM ye6 
npi/i/io>KeHi/m. Ako MCKaMe no-iunpoKO npen3no/i3BaHe 6e3 copy&paste, 
Tpa6Ba Aa pa3pa6oTBaMe Web custom kohtpo/im, nweTO cb3AaBaHeTO e mhoto 
no-TpyAoeMKO. 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 251 

M3no/i3BaHe Ha noTpe6nTe/iCKii kohtpo/im 

noTpe6nTe^CKaTa KOHTpo/ia MO>Ke fla ce nocTaBM bbb BC^Ka ASP.NET ye6 
cpopMa. OopMaTa, kohto flo6aBH KOHTpo/iaTa, ce Hapi/ma flOMaKi/m (host). 
OopMaTa flo6aBfl KOHTpo/iaTa, KaTO i/i3no/i3Ba flupeKTMBaTa @Register. 

npuMepHO M3no^3BaHe: 



<%@ Register TagPref ix="demo" TagName="validNum" 
Src="numberbox . ascx" %> 



ATpi/i6yrbT TagPrefix yKa3Ba yHi/iKa/mo npocTpaHCTBO ot MMeHa 3a noTpe6n- 
Te/iCKaTa KOHTpo/ia, 3a fla H^Ma ko^m3mm, aKO ctiuaTa KOHTpo/ia ce ki3no/i3Ba 
noBTopHO. ATpn6yT"bT TagName e MMe Ha MHCTaHUMATa Ha KOHTpo/iaTa. Atpm- 
6yTtT src e pe/iaTMBeH ntT ao cpaw/ia Ha KOHTpo/iaTa. 

Ci>3flaBaHe Ha noTpe6HTe/iCKa KOHTpo/ia - npuriep 

B to3m npuMep me cb3flafleM noTpe6kiTe/iCKa KOHTpo/ia, koato cny>KM 3a 
MeHK). MeHKDTO b eflMH cawT 6m Tpyi6Ba/io fla npi/icbCTBa Ha BC^Ka CTpaHnua ot 
caMTa m 3aTOBa e noflxoflamo fla ro HanpaBMM noTpe6kiTe/ici<a KOHTpo/ia. TaKa 
Ha BCAKa CTpaHnua me ,qo6aBflMe caMO MeHK) KOHTpo/iaTa, BMecTO fla 
cb3flaBaMe MeHK) ot Hy/iaTa. 

HeKa ntpBO cb3fla,qeM Tpn ye6 cpopMM - 3a Hana/iHa crpaHkiua (Main), 3a 
CTpaHnua c KOHTaKTM (Contacts) v\ 3a crpaHi/iua c i/mcpopMaui/m (About). 



<%@ Page language="c#" Codebehind="MainForm. aspx . cs" 
AutoEventWireup=" false" 

Inherits="Demo_4_WebUserControl .WebForml" %> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > 
<HTML> 
<HEAD> 

<title>WebForml</title> 

<meta name="CODE_LANGUAGE" Content="C#"> 

<meta name="vs_def aultClientScript" content=" JavaScript"> 
<meta name="vs_targetSchema" 
content="http : //schemas .microsoft . com/ intelli sense/ ie5"> 
</HEAD> 
<body MS_POSITIONING="GridLayout"> 

<form id="Forml" method="post" runat="server"> 

<asp:Label id="LabelMain" style="Z-INDEX : 101; LEFT: 
136px; POSITION: absolute; TOP: 16px" runat="server">Main Page 
</asp : Label> 
</f orm> 
</body> 
</HTML> 



KaKTO BM>KflaTe Ha Hen i/ma caMO eflMH eTMKeT OT6e/ifl3Bam MMeTO Ha 
CTpaHnuaTa (Main, Contacts, About). 



252 nporpaMnpaHe 3a .NET Framework (tom 2) 

me ce 3aeMeM c HanpaBaTa Ha noTpe6kiTe/ici<aTa KOHTpo/ia: 





<1 l> x 


EMBJE5BBB3BH!!B3!B3SMB^^^^^^^MM 


Zl ^5 


a 




.^ Solution 'Demo-S-WebUserControl' (1 project) 




|| * 


,_i... i^ (^'iiiiffu^fj 


a 


Build 
Rebuild 








ED-- (jo) References 
^U AboutForm.^ 












mil 
fa 


Add New Item,,, 
Add Existing Item,,, 
New Folder 


Add â–º 




2^^K^3 


u 
m 


Add Reference... 
Add Web Reference. . . 




^^9 


Add Web Form... 


Set as Startup Project 

Debug â–º 




1'tiMiiirini t-ua 


Q Add Web User Control... 






a 


Add HTML Page... 


Save Demo-5-WebUserControl 






Add Web Service... 
Add Component... 
Add Class... 


Paste 

Remove 

Rename 
















Properties 















B"bBe>KflaMe MMe 3a KOHTpo/iaTa: 



Add New Item - Demo-5-WebUserControl 



Categories: 

I El- f3 Web Project Items 



Templates: 



Web Form Web Service Mobile Web 
Form 



d a 



Class Component Data Form 

Class Wizard 



Data Set Web User Mobile Web 

Control User Control 



zi 



An ASP.NET server control created using the visual designer 
Name: I MenuUserControl.ascx 



Open 



Help 



rio/iynaBaMe cpaw/i c pa3UJnpeHne ascx, b komto MMa irbpBOHana/mo c/ieflHWflT 
KOfl: 



<%@ Control Language="c#" AutoEventWireup="f alse" 
Codebehind="MenuWebUser Control .ascx.cs" 
Inherits="Demo_5_WebUserControl . MenuWebUserControl " 
TargetSchema="http : //schemas .microsoft . com/intellisense/ie5"%> 



T/iaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



253 



3a fla ce noyiBflT 6yTOHM b Mei-uoTO, flo6aBAMe cnej\HV\n koa 3a Tpn ye6 koh- 
Tpo/iw 3a 6yTOHn: 



<P> 

<asp : HyperLink id="LinkMain" runat="server" 

NavigateUrl="MainForm. aspx">Main</asp : HyperLink> 

<br/> 

<asp : HyperLink id="LinkContacts" runat="server" 

NavigateUrl="ContactsForm. aspx">Contacts</asp : HyperLink> 

<br/> 

<asp : HyperLink id="LinkAbout" runat="server" 

NavigateUrl="AboutForm. aspx">About</asp : HyperLink> 
</p> 



BceKM 6yTOH boam ,qo eflHa ot Tpi/ue ye6 cpopMM, komto cb3flafloxMe. C/ieflBa- 
maTa CTbnKa e fla flo6aBMM HOBaTa KOHTpo/ia kbm bc^iio ot TpnTe ye6 cpopMM. 
Eto KaK M3Me>KAaT HOBono/iy^eHMTe ye6 cpopMn: 

MainForrn.aspx AboutForm.aspK ContactsFornn.aspx A â–º 



; UserControl - Menu ; About Page 



Q Design E HTML 



Cera hm ocraBa caMO fla nycHeM npn^OKeHneTO v\ fla npoBepuM KaKBO CMe 
HanpaBM/iki: 



£? WebForml - Windows Internet Explorer 



Jnjxj 



T | & http : //loca IhostyDe rno-4- WobUserContro I/Ma inFor m . aspx jj | *tj |_X 



M WebForr 



1 Page T ® Tools T 






Main 

Contacts 

About 



Main Page 



Done 



^j Local intranet 



*U00% - ^ 



254 nporpaMnpaHe 3a .NET Framework (tom 2) 

Bcmuko pa6oTM KaKTO Tpa6Ba - MeHKDTO hm npeHacouBa kbm OTfle/iHi/ue crpa- 

HMUM. 

3a6e/ie>KKa: KoHTpo/ikue MoraT fla ce 3ape>KflaT flkmaMkinHO c Loadcontroi ( ) 
MeTOfla. He e 3afl"b/i>KkiTe/iHO fla rn fleK/iapwpaMe b . aspx crpaHi/iuaTa. 

ripoc/ieflnBaHe m Ae6i>rBaHe Ha ye6 npMJio>KHMfl 

3a fluarHOCTnunpaHe Ha npo6/ieMki b ye6 npw/ic»Kei-ii/mTa ce ki3no/i3BaT flBe 
ochobhm TexHMKM - npoc/ieflHBaHe (tracing) v\ fle6"brBaHe (debugging). 

l/lH4>opMaL4Mfi no BpeMe Ha H3ni>/iHeHHe 

floKaTO ye6 npi/i/io>KeHi/ieTO pa6oTM, MO>xeTe fla cb6i/ipaTe i/mcpopMau.i/m ioto 
M3no^3BaTe K/iacoBeTe Trace m Debug. B"b3MO>KHO e fla M3B"bpujBaTe c/ieflHMTe 
fleMCTBMfl no BpeMe Ha pa6crra Ha npw/io>KeHi/ieTo: 

- fla M3nncBaTe ctomhoctm Ha npoMeH/iMBw; 

- fla pa36epeTe fla/ii/i onpefle/ieHM M3MCKBaHMfl ca ki3n"b/iHeHM. HanpuMep 
MeTOfltT Trace. writeif (...) M3nncBa c"bo6ifleHne caMO KoraTO e i/i3n"b/i- 
HeHO flafleHO yc/iOBkie; 

- fla npocneflsiBaTe ntTa Ha w3n"b/iHeHkie Ha npn^OKeHneTO. Mo>KeTe fla 
cneflBaTe nporpaMHaTa /iorm<a Ha flafleHa ye6 cpopMa, flOKaTO npki/io>Ke- 
HueTO ce ki3n"b/iHflBa, 3a fla npoBepi/ue fla/iki bci/iuko ce M3B"bpujBa KaKTO 
onaKBaTe. 

npoc/ieflsiBaHe 

K/iaC0BeTe Trace M Debug OT npocrpaHCTBOTO OT MMeHa System. Diagnostics 

ca CTaHflapTHMfl MexaHM3"bM b .NET Framework 3a M3nncBaHe (noKa3BaHe) Ha 
MHCpopMaunfl no BpeMe Ha i/i3n"b/iHeHkie (runtime). 

C Trace MHCpopMaunflTa ce noKa3Ba Ha caMaTa ye6 crpaHkiua v\nv\ ce 3ana3Ba 
b naMerra. 3a fla ce cnep,v\ cbcrosiHi/ieTO Ha ye6 npn^OKeHneTO b TpaflnunoH- 
HMTe ASP CTpaHkiun Moxeiue fla ce M3no/i3BaT MeTOfli/ue Response. write ki/iki 
M3nncBaHe Ha debug MHCpopMauna b Label kohtpo/im Ha ye6 cpopMaTa. 
npeflMMCTBOTO Ha Trace npefl Te3M noflxoflu e, ne npoc/ieflflBaHeTO Mcoxe fla 
ce KOHTpo^upa ueHTpa/iki3kipaHO npe3 HacTpoMKMTe b KOHCpurypaunoHHUfl 
cpaw/i web.config. TaKa c/iefl KaTO CBtpiunTe c fle6"brBaHeTO Ha npw/io>Ke- 
HueTO cm, MOweTe ziecHO fla i/i3K/iK>nnTe noKa3BaHeTO Ha MHCpopMaunaTa. 

MeTOflMTe Ha K/iaca Debug, me ce i/i3n"b/iHHT caMO aKO npn^OKeHneTO e 
KOMnn^npaHO b fle6"br pe>KMM v\ e crapTwpaHO b fle6"brep. KoraTO cb3flaBaTe 
release Bepcua, M3BMKBaHMflTa H^Ma fla ce i/i3n"b/iH*iT. C K/iaca Debug MO>KeTe 
fla M3nncBaTe c"bo6iueHMfl b Output npo3opeu.a Ha fle6"brepa Ha Visual Studio 
.NET. M3no/i3BaHeTO Ha K/iaca Debug He HaMa/isiBa Hafle>KflHOCTTa Ha npw/io- 
>KeHneTO, 3aiuoTO koabt He ce npoMeHfl - b release pe>KMM Te3M onepaTopn 
npocTO He ce i/i3n"b/iHflBaT. 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 255 

npoc/ieflJiBaHe Ha hmbo crpaHMija h npmicoKeHMe 

npoc^eflflBaHeTO Mcoxe fla bm noMorHe fla fluarHOCTupaTe npo6/ieMi/i v\ fla 
aHa^M3npaTe npon3BOAMTe^HOCTTa. MoxeTe p,a nuiueTe AnpeKTHO b crpaHkiua- 
Ta v\nv\ p,a 3ana3BaTe trace MHCpopMaunaTa b 6a3a OTflaHHM. 

ripn npoc^eflflBaHe Ha hmbo CTpaHnua (page-level tracing), cbo6meHMflTa ce 
Ao6aB*iT b Kpaa Ha ye6 crpaHi/iuaTa, 3a koato e nycHaTO npocneflflBaHeTO. 
ripn npoc^eflflBaHe Ha hmbo npn/io>KeHi/ie (application-level tracing) cbo6me- 
HMATa ce Ao6aBHT kbm BCflKa crpaHi/iua b npn^OKeHneTO. 

M3no^3BaHeTO Ha npocneAflBaHe, nycHaTO caMO 3a OTAe/iHa CTpaHnua, 
no3BO/isiBa 6"bp30 p,a ce bmam MHCpopMaui/mTa ot npocneAflBaHeTO, AOKaTO ce 
pa3r/ie>KAa cbAtpaoHkieTO Ha crpaHi/iuaTa. KoraTO crane HeHy>KHO, to MO>Ke 
AnpeKTHO Aa 6tAe M3K/iK>neHO, 6e3 p,a npeMaxBaTe bcm^km Trace. write (...) 
onepaTopn ot KOAa. 

npoc^eA^BaHeTO Ha hmbo npi/i/ioxeHi/ie (application-level tracing) ce kohtpo- 
ziwpa ot web.config cpaw/ia m AaBa noBene rbBKaBOCT. HanpuMep MO>xe cbo6- 
lueHMflTa ot npoc^eA^BaHeTO Aa ce na3AT b naMeTTa, v\ no-KtCHO Aa ce 
noKa3BaT npe3 i/i3no/i3BaHeTO Ha cneu.ua/iHaTa CTpaHnua trace. axd. 

KaTeropHM Ha npoc/ieA^saHe 

MMa hhko/iko KaTeropnn ot MHCpopMauna, komto ce noKa3BaT b Trace: 

- Request Details - i/mcpopMau.i/m 3a 3aaBKaTa: MAeHTucpuKaTop Ha 
cecuflTa (ID), BpeMe Ha 3aaBKaTa, bma Ha 3a*iBKaTa v\ craTyc Ha 
3aaBKaTa; 

- Trace Information - m3xoa (Output) ot CTaHAapTHM v\ noTpe6kiTe/iCKki 
AecpMHupaHM trace onepaTopn. Ko/iOHaTa "From First(s)" yKa3Ba 
BpeMeTO b ceKyHAM, OTKaKTO ntpBOTO c"bo6iueHne b Ta3M ceKu.i/m e 6m/io 
noKa3aHO. Ko/iOHaTa "From Last(s)" yi<a3Ba BpeMeTO, M3Mi/iHa/io ot 
noKa3BaHeTO Ha npeAMiiJHMfl peA- 3a acHOTa: 3a BceKM ABa 
nocneAOBaTe/iHki 3annca (peAa) MMaMe: From First(s) - From Last(s) Ha 
BTopufl e paBHO Ha From First(s) Ha ntpBua; 

- Control Tree - cnncbK Ha bcmukm e/ieMeHTM, komto ca Ha crpaHi/iuaTa, c 
ro^eMMHaTa Ha BceKM ot tax; 

- Cookies Collection - cnnctK Ha bcmukm M3no/i3BaHM 6mckbmtkm 
(cookies); 

- Headers Collection - cnwcbK Ha bcm^km 3anncn b HTTP xeAtpa; 

- Form Collection - cnnctK Ha KOHTpo/ikiTe v\ TexHMTe ctomhoctm bbb 
cpopMaTa (<form runat="server">...); 

- Server Variables - cnncbK Ha bcmukm ctpBtpHM npoMeH/iMBw: MMeTO 
Ha ctpBtpa, TeKymo M3n"b/iHflBaHaTa . aspx CTpaHnua v\ t.h. 



256 



flporpaMnpaHe 3a .NET Framework (tom 2) 



06eKTbT Trace 

OCBeH K/iaca System. Diagnostics. Trace, CbLfleCTByBa M eflHOMMeHHO CBOM- 
CTBO Ha CTpaHMUaTa Trace, KOeTO e OTTkin TraceContext. C HerOBa nOMOLfl B 

ceKUMATa "Trace Information" OCBeH noKa3BaHeTO Ha CTaHAapTHa (npeflecpw- 
HupaHa) MHCpopMaunfl ot npoc^eflflBaHeTO, MO>xeTe fla M3nncBaTe v\ npoi/i3BO/i- 
hm c"bo6iueHMfl b onpefle^eHM ot Bac KaTeropnn. l/l3no/i3BaT ce MeTOflMTe 

Trace. Write(...) M Trace .Warn (...) , KOMTO pa60TflT no nOfl06eH Hani/IH, C 

eAMHCTBeHaTa pa3/im<a, ne Trace, warn (...) M3nncBa cbo6meHMflTa b nepBeHO. 

flHHaMHHeH kohtpo/1 Bi»pxy npocneflflBaHeTO 

Ctc cbomctboto Trace . isEnabied npoc/ieflflBaHeTO MO>Ke flMHaMM4HO fla ce 
BK^K)4Ba/n3K^K)4Ba. Cbomctboto e c no-ro/isiM npnopnTeT ot HacTpoMKMTe 3a 
npocneflHBaHe Ha hmbo npi/i/io>KeHi/ie. 

HacTpoMKM Ha npocneAflBaHeTO 

flopn KoraTO 6"bfle nycHaTO npoc/ieflflBaHe Ha hmbo npi/i/io>KeHkie, HacrpoMKMTe 
3a npoc^eflflBaHeTO Ha hmbo crpaHi/iua ce 3ana3BaT. HanpuMep, aKO ce 
M3K/iK)nki npoc^eflflBaHe 3a hakoh crpaHkiua, a npoc/iefl*iBaHeTO 3a uh/ioto 
npw/io>KeHkie e nycHaTO, 3a crpaHkiuaTa HsiMa fla ce no^BM npoc/ieflflBama 
MHCpopMaunfl. C^eflHaTa Ta6/ikiua noKa3Ba pe3y/iTaTMTe ot pa3/ikmHMTe 
KOM6nHaunM npoc^eflflBaHe Ha hmbo npn^OKeHne v\ Ha hmbo crpaHi/iua: 



Ha HMBO CTpaHML(a 


Ha HMBO 

npM/io>KeHMe 


Pe3ysrraT 3a KOHKpeTHaTa 
CTpaHMLta 


Trace=True 


6e3 3Ha4eHne 


MMa npoc^eflflBaHe (trace) 


Trace= False 


6e3 3Ha4eHne 


HflMa npoc^eflflBaHe (trace) 


He e yKa3aHO 


Trace=True 


MMa npoc/ieflflBaHe (trace) 


He e yKa3aHO 


Trace = False 


HflMa npocneflflBaHe (trace) 



ATpn6yrbT pageOutput 

3a yKa3BaHe Ktfle fla ce noKa3BaT ch>o6meHkiflTa ot npoc/ieflflBaHeTO MO>KeM 
fla ce M3no/i3BaMe aTpn6yTa pageOutput Ha e/ieMeHTa trace bbb cpaw/ia 
web.config. Ako e true, cto6iueHMflTa ce noKa3BaT Ha caMaTa crpaHwua c/iefl 
Kpaa Ha cbfltpaoHkieTO v\ (flo6aBAT ce OTflo/iy). Ako e false, cbo6meHi/iflTa ce 
3anncBaT b naMeTTa. Eto eflMH npuMep 3a i/i3K/iK>nBaHe Ha cbo6meHkisiTa ot 
CTpaHnuaTa (3ana3BaT ce b naMeira): 



<conf iguration> 

<system. web> 

<trace enabled="true" pageOutput="f alse" /> 

</ system. web> 
</asp : DropDownList> 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 257 

CTpaHMuaTa trace. axd 

Ako MHCpopMaunflTa ot npoc^eflflBaHeTO He ce noi<a3Ba Ha crpaHkiuaTa, ta ce 
3ana3Ba b naMerra. Mcoxe fla 6"bfle BMA^Ha, KaTO ce ki3no/i3Ba cneu.ua/iHa 
CTpaHnua, koato e BK/iK>neHa no no,qpa36i/ipaHe bbb bcako ye6 npi/i/io>KeHkie. 
AflpectT Ha CTpaHnuaTa e: http://cbPB"bp/npoeKT/trace.axd . 

riopaflu npn4MHM CB"bp3aHM etc curypHOCTTa, Ta3M CTpaHnua noHAKora e 
flo6pa fla 6"bfle cnpsiHa. ToBa MO>Ke fla CTaHe Ha hmbo ye6 cbpBtp npe3 koh- 
cpurypauMOHHMfl cpaw/i machine. config. Tom ce HaMupa b ci/icreMHaTa nanKa 

C:\WINDOWS\Microsoft.NET\Framework\vl.l.4322\CONFIG, KaTO HflKOM OT 

flupeKTopnnTe MO>xe fla ca c pa3/innHw MMeHa: 



<httpHandlers> 

<add verb="*" path="trace . axd" 
type="System. Web . Handlers . TraceHandler"> 
</httpHandlers> 



B ropHMfl npuMep, 3a fla 6"bfle cnpaHa crpaHkiuaTa, Tpa6Ba aTpw6yTbT path fla 
MMa 3a ctomhoct npa3eH TeKCT (path=""). 

npoc/ieflJiBaHe b noTpe6MTe/iCKM KOMnoHeHT 

Ako eflMH KOMnoHeHT ce BMKa ot ye6 cpopMa, b Hero MoraT fla ce i/i3no/i3BaT 

MeTOflMTe 3a npoc/ieflflBaHe (KaTO Trace. Write (...) M Trace. Warn (...) ). TOBa 

no3BO^ABa fla ce reHepupaT cbo6meHi/m 3a npocneflHBaHe (trace messages) 
3a ye6 cpopMaTa v\ 3a KOMnoHeHTa. 

KoraTO ce no3BO/iw npocneflHBaHe b KOMnoHeHT, cbo6meHi/mTa ce M3nncBaT b 
pe3y^TaTMTe Ha BC^Ka crpaHkiua, koato no/i3Ba KOMnoHeHTa flopn aKO npoc- 
^eflflBaHeTO 3a Ta3M CTpaHnua e cnp^HO. 

OTfla/ieHeHO fle6t>rBaHe 

nofl OTfla/ieneHO fle6"brBaHe (remote debugging) ce pa36npa fle6"brBaHe Ha 
npw/io>KeHi/m Ha OTfla/ieneH ctpBtp. Mo>KeTe fla fle6"brBaTe ot eflHa pa6oTHa 
CTaHUMfl ASP.NET npM/io>KeHMfl, M3n"b/iH*iBaHki Ha MHOxecTBO ctpBtpn. 

3a OTfla/ieneHOTO fle6"brBaHe ce M3MCKBaT: 

- Visual Studio .NET v\nv\ HeroBMTe KOMnoHeHTM 3a OTfla/ieneHO no/i3BaHe, 
MHcra/iwpaHi/i Ha ctpBtpa. 

- Visual Studio .NET, MHcra/ikipaHO Ha pa6oTHaTa CTaHuna. 

- AflMMHMCTpaTMBHM npaBa 3a ctpBtpa. 

- AKayHTbT, M3no^3BaH 3a ctpBtpa, fla e b rpynaTa Debugger Users. 
CrbnKii 3a OTfla/ienei-io Ae6t>rBaHe: 

1. CTapTupa ce Visual Studio .NET Ha K/iweHTCKaTa Mawi/ma. 

2. File -> Open -> Project From Web. 



258 nporpaMnpaHe 3a .NET Framework (tom 2) 

3. B Open Project From Web flkia/ioroBaTa KyTMMKa ce nmue aflpeca (URL) 
Ha cbpBtpa. 

4. B Open Project flkia/ioroBaTa KyTMMKa ce M36npa npoeKTbT Ha OTfla/ie- 
4eHMfl ctpBtp. 

5. Cnefl KaTO ce otbopm npoeKTbT, MO>xe fla ce i/i3no/i3BaT breakpoints Bee 
eAHO npn^OKeHneTO e /lOKa/iHO. 

OnTMMM3aLjM5i, KOHC^urypauufl m pa3rpi>ii4aHe Ha 
ASP.NET npu/ioweHMfi 

J\o MOMeHTa pa3r/ie,qaxMe ocHOBHkue KOHuenunn v\ TexHMKM 3a pa3pa6oTKa Ha 
ASP.NET ye6 npi/i/io>KeHi/m. Cera, HeKa o6"bpHeM BHMMaHne Ha cpeACTBaTa 3a 
onTMMM3npaHe Ha ye6 npn^OKeHna npe3 KeiunpaHe v\ Ha npoueca Ha 
pa3rp"biuaHe Ha ye6 npw/io>KeHkie b cpeflaTa, KbfleTO Tpa6Ba fla pa6oTM 
(deployment), KaKTO v\ CBtp3aHMTe c TOBa HacrpowKi/i Ha KOHCpurypaunoHHM 
cpaw/iOBe. 

OnTMMM3npaHe npe3 KeiiinpaHe 

ripn M3rpa>KflaHeTO Ha ro/ieMki ye6 npn^OKeHna, komto me 6"bflaT ki3no/i3BaHi/i 
eflHOBpeMeHHO ot mhoto noTpe6kiTe/ii/i b paMKMTe Ha MMHyTM v\i\v\ ceKyHflu, 
Hue me noBTapaMe eflHM v\ cbu\v\ onepaunn 3a BC^Ka i/iHflkiBkiflya/iHa 3asiBKa 
KtM HaiueTO npn^OKeHne. 3a fla M36erHeM to3m noBTapaiu ce npouec, MO>Ke 
fla M3no/i3BaMe KeiunpaHe. KeiunpaHeTO e npouec Ha 3ana3BaHe Ha necro 
flocTbnBaHM flaHHM {v\nv\ TaKMBa, ni/ieTO i/i3B/ikmaHe OTHeMa mhoto pecypcn) b 
naMerra {v\nv\ flpyro xpaHki/ii/ime). TaKa Te MoraT ziecHO v\ 6"bp30 fla 6tflaT 
M3B/ieneHM npn noBTopHO noncKBaHe. 

KeujMpaHe b ASP.NET 

KeiunpaHeTO e eflHa ot HaM-necro i/i3no/i3BaHi/iTe TexHMKM 3a onTMMH3aunfl Ha 
ASP.NET npw/iOKeHwe. B ASP.NET MMa flBa BMfla KeiunpaHe. ritpBi/mT e 
Kewi/ipaHe Ha ua/iaTa aspx crpaHkiua (reHepupaHna HTML koa) v\i\v\ nacm ot 
Hea. BTopuflT e KeiunpaHe Ha cneuwcpwuHa 3a npw/io>KeHi/ieTO MHCpopMauna, 
koato me 6"bfle noBTopHO flocrbnHa 3a pa3pa6oTHMKa. 

KeujMpaHe Ha crpamma m/im otac/ihh cpparMeHTM ot Hen 

KeiunpaHeTO Ha ASP.NET crpaHi/iua ce M3pa3*iBa b 3ana3BaHe Ha HTML KOfla, 
komto Tfl e reHepwpa/ia 3a onpe,qe/ieH nepnofl ot BpeMe. ripn noBTopHO 
M3BMKBaHe Ha cbujaTa crpaHwua, npeflu to3m nepnofl fla e M3TeKb/i, KbM 
K^neHTCKMfl 6pay3"bp ce M3npaiua Bene reHepupaHna HTML. To3m npouec 3Ha- 
nwTe/iHO noflo6p*iBa 6"bp30fleMCTBneTO Ha npi/i/io>KeHkieTO, KaTO flopn 3aflaBaHe 
Ha nepnofl ot hako/iko ceKyHflu MO>Ke fla flafle bmamm pe3y/iTaT. 

3a fla yKa>KeM, ne MCKaMe flafleHa crpaHkiua fla ce Keiuupa, Tpa6Ba fla i/i3no/i- 
3BaMe flupeKTMBaTa eoutputcache. Eto m npuMep, komto yKa3Ba, ne flafleHaTa 
CTpaHnua (ki/ii/i KOHTpo/ia) Tpa6Ba fla ce Keiuupa 3a 30 ceKyHflu: 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



259 



<%@ OutputCache Duration="30" VaryByParam="None" 



CtiunflT pe3y/iTaT Moxe fla nocTurHeM v\ b KOfla, komto ctom 3afl crpaHMuaTa. 
Eto npuMep KaK MO>KeM fla HanpaBMM TOBa: 



Response . Cache . SetExpires (DateTime . Now. AddSeconds ( 30 ) ) ; 
Response . Cache . SetCacheability (HttpCacheability . Server) 



HsiMa fla ce BnycKaMe b noflpo6HOCTM 3a pa3/im<aTa Me>Kfly flBaTa HanMHa, 
caMO me cnoMeineM, ne npe3 MeTOflMTe Ha HttpCachePoiicy (MHCTaHuna Ha 

T03M Tl/in Ce Bptlfla OT CBOMCTBOTO Cache Ha Response) MMaMe flOCTbn Ha 
HMCKO HMBO flO pa3/lMHHMTe OnU.MM 3a KeilJMpaHe. flOKaTO npe3 flupeKTMBaTa 

outputcache hm ce npeflocTaBfl eflHO flo6po hmbo Ha a6crpaKu.Mfl, ioto acho 
fleK^apupaMe KaKBO touho fla ce Keiunpa. 

HeKa fla pa3r/ieflaMe no-Ba>KHMTe aTpn6yTM Ha flupeKTMBaTa eoutputcache: 



ATpn6yT 


Ormcai-me 


Duration 


BpeMe 3a KemnpaHe 

YKa3Ba BpeMeTO b ceKyHflu, 3a KoeTO flafleHaTa crpaHMua 
(noTpe6nTe^CKa KOHTpo/ia) me ce Keiunpa. ATpn6yrbT e 
3afl"b/i>Ki/iTe/ieH. 


VaryByParam 


Keuwpane Ha Bepaw no napaMertp 

Hpe3 to3m aTpn6yT MO>Ke fla KeiunpaMe hako/iko pa3/iMHHM 
Bepcuki Ha CTpaHnuaTa. Tom hm no3BO/iflBa fla 3aflafleM 
cnMCbK ot napaMeTpM, pa3fle/ieHM c TOUKa m 3aneTaa, 
cnpyiMO komto fla ce KeujMpaT pa3/iMHHMTe BepcMM, noHe>Ke 
ctfltp>KaHMeTO Ha crpaHMuaTa (peHflMpaHM^T HTML) MO>Ke 
fla e pa3/iMHHO cnp^MO flafleH napaMeTbp ot query string, 
ATpM6yT"bT e 3afl"b/i>KMTe/ieH. HeroBM ctomhoctm MO>Ke fla 

ca * M None. 


VaryByControl 


KemnpaHe Ha Bepaw no ID Ha Kompona 

ATpM6yTbT e noflo6eH Ha npeflxoflHMfl c M3K/iioneHMe, ne 
KaTO ctomhoct ce 3aflaBaT ID Ha noTpe6MTe/iCKMTe 
kohtpo/im, komto MCKaMe fla KeujMpaMe. 


Shared 


Ke lum pa He Menmy or/ie/iHM crpaH^uM 

To3M aTpM6yT ce yKa3Ba caMO b noTpe6MTe/iCKM kohtpo/im. 
HeroBOTO npeflHa3HaneHMe e fla yKaxe fla/iM KeujMpaHaTa 
KOHTpo/ia MO>Ke fla ce M3no/i3Ba Me>Kfly OTfle/iHMTe crpa- 
hmum Ha npM/io>KeHMeTO. M3no/i3Ba ce npM craTMUHM 
noTpe6MTe^CKM kohtpo/im, HanpMMep zioro m/im 6aHep. 



260 nporpaMnpaHe 3a .NET Framework (tom 2) 

KewupaHe Ha AaHHM 

flocera pa3r/ieflaHkiflT MeTOfl 3a KeiunpaHe 6ewe Ha hmbo CTpaHnun v\ reHepn- 
paHM ot tax HTML. Cera me pa3r/ieAaMe flpyri/m bma 3a KeiunpaHe b ASP.NET, 
a MMeHHO KeiunpaHeTO Ha MHCpopMauna (o6eKTn), koato fla 6"bfle ziecHO 
flocTbnHa npn noBTopHO noncKBaHe. ToBa e B"b3MO>KHO 6/iaro,qapeHkie Ha 

K/iaca System. Web. Caching. Cache, KOMTO C/iy>KM KaTO KOHTeMHep (peUHMKOBa 

KO/ieKunfl) 3a o6eKTM, komto me 6"bflaT ki3no/i3BaHi/i noBTopHO. HeKa fla 
pa3r/ie,qaMe hakom ot npeflkiMcmaTa v\ HeflocTarbunTe Ha cache K/iaca, cnep, 
KoeTO me ce cnpeM Ha pa3/ikmHHTe HanwHki 3a Ao6aB*iHe Ha o6eKTM b Keiua v\ 
taxhoto yHMiflo>KaBaHe (invalidation). 

npeflMMCTBa: 

- OcurypaBa 6"bp3 flocTtn flo o6eKTM, nweTO cb3flaBaHe e 6aBHO, cicbno 
v\nv\ OTHeMaiuo mhoto pecypcn (ki3B/iwnaHe ot 6a3a flaHHki, ye6 ycnyra, 

KpunTkipaHO yCTpOMCTBO m flp.). 

- noflfl"bp>Ka aBTOMaTM^HO 3aK^K)4BaHe Ha o6eKTa, komto ce i/i3no/i3Ba. 
ToBa no3BO/i*iBa 6e3onacHa KOHKypeHTHa pa6oTa Hafl to3m o6eKT. 

- npefl/iara pa3HOo6pa3HM onunn 3a yHkimowaBaHe Ha o6eKTMTe b Hero 
(flopn m 3a taxhoto o6paTHO cb3flaBaHe npe3 callback cpyHKunn). 

- ABTOMaTM^HO 3anonBa fla yHMiuo>KaBa KeiunpaHMTe o6eKTM, KoraTO 
pecypcuTe Ha ctpBtpa HaMa/iesiT. 

HeflocTaT-bMn/3a6e/ie>KKM: 

- Mo>xe fla ce i/i3no/i3Ba b paMKMTe Ha eflHO npi/i/io>KeHkie, T.e. bcako eflHO 
npn^OKeHne MMa cbom Kern, komto e eflMHCTBeH v\ He MO>Ke fla 6"bfle 
cnofle^AH c ocraHa/ikiTe npn^OKeHna. 

- TopHOTO orpaHkmeHi/ie ecpeKTMBHO boam ao 3ary6a Ha CKa/iwpyeMOCT. 
06eKTMTe ca tacho CBtp3aHM c npn^OKeHneTO, pa6oTeiuo Ha KOHKpeT- 
HMfl ctpBtp m He MoraT fla 6"bflaT cnofle/iflHki Me>Kfly ctpBtpn b ye6 
cpepMM. 

- cache KOHTeMHeptT e aKTMBeH (>kmb), flOKaTO npn^OKeHneTO pa6oTM. 
ripn pecTapTupaHe Ha npw/ioweHkieTO cache o6eKT"bT ce cb3flaBa othobo. 

- cache KOHTeMHeptT He MO>Ke fla ctxpaHABa flaHHki 3a KOHKpeTeH 
noTpe6i/iTe/i. 3a Ta3M ue/i ce ki3no/i3Ba cecn^Ta (Httpsessionstate) v\nv\ 
pe^HMKOBaTa KO/ieKui/m Httpcontext. items, aKO MCKaMe fla 3ana3MM 
MHCpopMaunfl caMO 3a TeKyiuaTa 3aaBKa. 

KeujMpaHe Ha AaHHM - npuMepu 

KaKTO Bene cnoMeHaxMe, ,qo6aBflHeTO Ha o6eKTM b Keiua MO>Ke fla CTaHe no 

HflKO/lKO Ha^MHa C pa3^M4HM nO/lMTMKM 3a yHMlflOKeHMeTO Ha fl06aBflHMfl 

o6eKT. 

CTaHflapTHMAT Ha^MH e fla ce o6"bpHeM kbm Keiua KaTO penHMKOBa KO/ieKun*i. 
Eto eflMH npuMep: 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 261 



DataSet dsUsers = GetAllUsers ( ) ; 
Cache [ "UsersDataSet" ] = dsUsers; 



M3B^M4aHeTO Ha Bene flo6aBeH o6eKT cbiuo e craHAapTHo: 



DataSet dsUsers = (DataSet) Cache [ "UsersDataSet" ; 



Ako o6eKTbT Me>KAyBpeMeHHO e 61/1/1 yHwmoweH, ce Bptiua null. 

no/iMTMKM 3a yHMU40>KaBaHe Ha o6eKTMTe npw KewiipaHe 

J\a pa3MeflaMe no-noflpo6HO MeTOfla insert (...) Ha cache. To3m MeTOfl MMa 
hako/iko flecpMHMUMM c pa3/ikineH 6pow napaMeTpw, KOMTO MO>Ke fla M3no^3Ba- 
Me, 3a p,a 3aAaBaMe pa3/innHw no^MTMKM othocho TOBa Kora p,a ce yhmluokm 
flo6aBAHMflT o6eKT. Eto npuMepn 3a ki3no/i3BaHero Ha BCAKa eflHa ot tax: 

YHMii40>KaBaHe Ha flo6aBnHMn o6eKT c/iefl onpeae/ieH nepnofl ot 
BpeMe. C^eflHMAT koa flo6aBfl o6eKT, komto me 6"bfle yHMiuo>KeH cnep, 5 
MMHyTn: 



Cache . Insert ( "myKey" , myValue, null, DateTime . Now. AddMinutes ( 5 ) 
Cache . NoSlidingExpiration) ; 



yHMLqo>KaBaHe Ha flo6aBaHna o6eKT cnen onpeae/ieH nepnoa ot 
BpeMe ot noc/ieflHOTO My M3no/i3BaHe. C/ieAHkisiT koa Ao6aB*i o6eKT, 
komto me 6"bfle yHMiuo>KeH 20 ceKyHflu, cnep, KaTO e 6m/i i/i3no/i3BaH. Ako 
b c^eABaiunTe 20 ceKyHAH othobo M3B/ieneM to3m o6eKT ot Keiua, 
OT^MTaHeTO Ha ceKyHAMTe 3anonBa OTHana/io: 



Cache . Insert ( "myKey" , myValue, null, Cache . NoAbsoluteExpiration, 
TimeSpan . FromSeconds (20) ) ; 



YHiiiijowaBaHe Ha flo6aBnHMn o6e«T npw flaaeHa 3aBMCMMoa 
(npoMfiHa Ha cpaftsi mm yHuujowaBaHeTO Ha flpyr o6eKT ot 
Keiua). B nocneAHMTe ABa npuMepa TpeTi/m napaMeTbp, komto 
noAaBaMe Ha MeTOAa, e cacheDependency. Hpe3 KOHCTpyKTopnTe Ha 
to3m K/iac MO>KeM p,a yKa>KeM M3TpnBaHe Ha Ao6aBAHMfl o6eKT npn 
npoMAHa Ha AaAeH cpati/i (cbBKynHOCT ot cpaw/iOBe) v\nv\ npn 
yHMiuo>KaBaHeTO Ha Apyr o6eKT (cbBKyrmocr ot o6eKTn) ot Keiua. 

Eto npuMep, komto i/i/iK>CTpnpa KaK Ao6aBHHi/mT o6eKT me ce yHMiuoxn, 
KoraTO cpaw^tT myconfig.xml 6"bAe npoMeHeH: 



Cache . Insert ( "myKey" , myValue, 

new CacheDependency (Server . MapPath ( "myConf ig . xml " ) 



3aflaBaHe Ha npnopnTeT Ha flo6aB5iHMn o6eKT. .Apyra btd3mo>khoct, 
koato hm ce npeAOcraBfl, e p,a 3aAaAeM npnopnTeT Ha Ao6aBAHMfl o6eKT. 
KoraTO cbpBtpvr 3anonHe p,a ocBo6o>KAaBa pecypcn, cpaBHHBa 



262 nporpaMnpaHe 3a .NET Framework (tom 2) 

npnopnTeTMTe Ha bcmukm o6eKTM v\ yHMiuo>KaBa Te3M c Haw-HMCbK 

npMOpMTeT. B"b3MO>KHMTe npMOpMTeTM Ca CTOMHOCTI/ITe Ha M36pOMMMfl Tun 
CacheltemPriority - Low, BelowNormal, Normal (Default), 
AboveNormal, High, NotRemovable. B CI\ep,Ba\i\V\ft npMMep 06eKTbT, 

komto flo6aBAMe, me e efli/m ot nocneflHkiTe yHMiuoKeHu: 



Cache . Insert ( "myKey" , myValue, null, Cache . NoAbsoluteExpiration, 
Cache . NoSlidingExpiration, CacheltemPriority . High, null); 



M3BMKBaHe Ha callback cjjyhkmmjj, KoraTO aaaeH o6eKT 6nBa 

yHMLL(0>KeH. KeilJ K/iaCbT HM npeAOCTaBfl V\ B"b3MO>KHOCT 3a M3BMKBaHe 

Ha Hawa callback cpyHKui/m. 3a ue/iTa Tpa6Ba p,a cb3AafleM MHCTaHuna Ha 

fle/ieraT OT Tl/in CacheltemRemovedCallback. ETO npMMep: 



public void RemovedCallback ( string aKey, object aValue, 
CacheltemRemovedReason aCallbackReason ) 

{ 

switch ( aCallbackReason ) 

{ 

case CacheltemRemovedReason . Expired : 
//do work when item is expired 
break; 
case CacheltemRemovedReason . DependencyChanged : 
//do work when item's dependency changed 
break; 
default : 
break; 
} 
} 

private void Cacheltem( string aKey, object altem ) 

{ 

CacheltemRemovedCallback onRemove = 

new CacheltemRemovedCallback (RemovedCallback) ; 

Cache . Insert ( aKey, altem, null, Cache . NoAbsoluteExpiration, 
Cache . NoSlidingExpiration, CacheltemPriority. Default, 
onRemove ) ; 
} 



B"b3MO>KHOCTTa 3a M3BMKBaHe Ha callback cpyHKunn MO>xe p,a ce M3no/i3Ba v\ 3a 
fla ce nocTaBM o6eKTa othobo b Keiua. 

KoHcjDMrypMpaHe Ha ASP.NET npiuio>KeHfie 

KoHCpurypaunflTa Ha eflHO ASP.NET npn^OKeHne ce M3B"bpujBa Ha ocHOBaTa Ha 
cbBKynHOCT ot hako/iko XML 6a3npaHM KOHCpurypaunoHHM cpaw/ia. M3HacaHe- 
to Ha KOHCpurypaunoHHMTe HacrpoMKM b ojp,eneu cpaw/i (a He b KOfla) p,asa 
M3K^K)4MTe^HO ziecHa npoueflypa 3a pa3rp"biuaHe Ha npw/io>KeHi/ieTO (XCOPY 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 263 

Deployment). ToBa no3BO/iflBa v\ npoM^Ha Ha hakom ot HacrpoMKkiTe, 6e3 fla 
ce Ha/iara npeKOMnw/iaukifl. 

OaM/i-bT Machine. config 

BceKM ASP.NET ye6 CbpBtp i/ma cbom r/io6a/ieH KOHCpurypaunoHeH cpati/i - 
Machine . config. TOM ce HaMkipa b: systemroot\Microsof t .NET\ 
Framework\<versionNumber>\CONFIG\Machine . config, ICbfleTO systemroot 
CTaHflapTHO e C:\WINDOWS, a versionNumber e vl. 1.4322 3a .NET 

Framework 1.1 B to3m cpaw/i ce cbfltpwaT r/io6a/iHMTe HacTpowKM (HacTpowKM 
no noflpa36npaHe). Te ce npw/iaraT Btpxy bcako eflHO ye6 npn^OKeHne. H^Ma 
fla ce cnnpaMe noflpo6HO Ha tax , caMO me cnoMeHeM, ne b Machine . config 
ce ctfltpxaT m r/io6a/iHkiTe HacTpoMKMTe 3a machineKey, Tom c/iy>Kki 3a Kpun- 
TupaHe m xeiunpaHe Ha ViewState v\ 6ncKBMTKaTa 3a cecnaTa. B c/iy^aw, ne 
HMaMe npn^OKeHne, KoeTO pa6oTM b web-farming cpefla (Ha hako/iko ctp- 
Btpa), Tpa6Ba fla CMe noflcurypuM, ne CTOMHOCTMTe Ha machineKey Ha BceKM 
eflMH ot ctpBtpnTe ca eflHaKBM. 




HenpaBM/iHa npoMAHa Ha cpaPi/ia Machine . config Mowe fla 
OKawe B/inflHne Ha bcuhkh ye6 npmio>KeHMfl, komto pa6oT«T 
Ha cbpBi>pa. 



OaM/i-bT Web. config 

OcBeH r/io6a/iHi/m KOHCpurypaunoHeH cpaw/i 3a ctpBtpa bcako eflHO OTfle/iHO 
npw/io>KeHkie MMa cbom co6cTBeH KOHCpurypaunoHeH cpai/i/i - web. config. Tom 
Bene hm e no3HaT, 3aiuoTO KoraTO cb3fla,qeM hob ye6 npoeKT, TOBa e eflMH ot 
cpaw/iOBeTe, komto aBTOMaTMUHO e flo6aBeH b Hero. Eto KaK H3Me>Kfla tom b 
peflaKTopa Ha Visual Studio: 

Web.config I <1 > X 



<?xml version="l . 0" encoding="utf-8" ?> 
<configuration> 

<system.web> 

<compilation def aultLanguage="c#" debug="true" /> 

<cu3tomError3 mode="RemoteOnly" /> 

<authentication mode="Windows" /> 

< authorization 

<allow users="*" /> <!-- Allow all users --> 
</ authorization 

<trace 

enabled=" false" 

request Limit="10" 

pageOutput=" false" 

traceMode="SortByTime" 

localOnly="true" 
/> 






A 



264 



flporpaMnpaHe 3a .NET Framework (tom 2) 



BtB cpai/i/ia web.config ce yKa3BaT cneuncpn^HMTe HacTpowKM 3a npn^OKeHM- 
eTO, KaTO HAKOM ot Tax MO>Ke fla npenoKpuBaT Te3M ot cpai/i/ia Machine, 
config. BCM4KM HacTpoMKM ca pa3no/io>KeHki i/iepapxi/mHO b pa3/ikinHM ceKunn 
v\nv\ KaTeropnn. 3a p,a pa36epeM KaKBO touho MO>Ke p,a KOHCpurypupaMe, HeKa 
Aa pa3MeAaMe no-3HanwMkiTe ot tax. 

KaTeropMH b Web.config 

HacTpoMKMTe, komto MO>KeM fla 3aflafleM bbb cpai/i/ia web.config, CB"bp3aHM c 
pa6oTaTa Ha ye6 npi/i/io>KeHi/ieTO, ce HaMnpaT b ceKun^Ta system. web. Eto 
HeMHMTe no-Ba>KHMTe noAceKu.nn: 



CeKMiin 


OnMcaHMe 


authentication 


M36op Ha MeTOA Ha aBTeHTHKauna v\ HeroBMTe CBOMCTBa. 
noflpo6HO me ce cnpeM Ha aBTeHTHKauna b nacrra 
"CurypHOCT". 


authorization 


npeAOCTaBfl B"b3MO>KHOCT 3a AeK/iapaTMBHO npw/iaraHe 
Ha curypHOCTTa, 6a3npaHa Ha po/iw (role-based 
security) v\ OTopn3aunflTa Ha noTpe6wTe/ikiTe. 


browserCaps 


B"b3MO>KHOCT 3a 3aAaBaHe Ha cpi/i/iTpw, cnpaMO komto 
6pay3"bpa, HanpaBM/i 3aaBKaTa, Moxe Aa ce pa3no3Hae 
m acounnpa. 


compilation 


HacTpoMKM, yKa3Baiun no KaKbB Hani/m Aa ce KOMnn- 
ziwpa npn^OKeHneTO, KoraTO AOMAe ntpBaTa 3a*iBKa KbM 
Hero. 


customErrors 


B-b3MO>KHOCT 3a KOHCpwrypwpaHe KaK ASP.NET Aa ce 
cnpaBfl c B"b3HMKHa/ikiTe rpeiuKM v\ M3K/iK>neHi/m. 


globalization 


HacTpowKM Ha r/io6a/iM3au.i/iflTa Ha npi/i/io>KeHi/ieTO, b 
TOBa hmc/io Ky/iTypaTa Ha npi/i/io>KeHkieTO, KOAnpaHeTO 
Ha cpaw/iOBeTe, 3aaBKMTe v\ OTroBopnTe, HanpaBeHM ot m 
K"bM cbpBtpa. 


httpHandlers 


npeAOCTaBfl B"b3MO>KHOCT 3a acounnpaHe Ha K/iacoBe, 
komto Aa o6pa6oTAT 3aaBKM KtM AaAeHM pecypcu. 


httpModules 


npeAOCTaBfl B"b3MO>KHOCT 3a Ao6aBAHe Ha Aont/iHkiTe/iHM 
MOAy/in, komto Aa npeAOCTaBAT AaAeHa cpyHK- 
UMOHa^HOCT. CecuflTa, aBTeHTHKaunaTa v\ OTopn3aunflTa 
ca pea^M3npaHM KaTO TaKMBa MOAy/in. 


identity 


B"b3MO>KHOCT 3a i/iMnepcoHau.i/m Ha TeKyiunfl noTpe6nTe/i, 
c komto ce acounnpaT 3aaBKMTe KbM cbpBtpa. 


pages 


npeAOCTaBfl B"b3MO>KHOCT Aa ce npOMeHflT HaCTpOMKMTe 
no noApa36npaHe 3a bci/iukm CTpaHnun b npM/io>KeHM- 
eTO. 


processModel 


BoraT Ha6op ot HacrpoMKki 3a M3n"b/iHeHkieTO Ha npw/io- 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



265 





>KeHi/ieTO ot IIS, BK/iK>ni/iTe/iHO p,anw fla ce ki3no/i3Ba ye6 
cpepMa. 


sessions tate 


Pa3HOo6pa3HM HacTpoMKM 3a cecuflTa - fla/iw fla ce 
M3no/i3BaT 6mckbmtkm, fla/iw cecuflTa fla 6"bAe cbxpaHe- 
Ha b SQL ctpBtp m flp. 


trace 


HacTpoMKM 3a npoc^eflflBaHeTO Ha npi/i/io>KeHkieTO - 
fla/iki fla ce npocneAflBa, fla ce noKa3Ba nv\ flHeBHMicbT 
(log) Ha CTpaHnuaTa v\ flp. 



3a6e/ie>KKa: CbfltpaoHi/ieTO Ha web.config e nyBCTBi/ue/iHO kbm Ma/iKi/i i/i 
r/iaBHM 6yKBM. 

Pa3UJMpneMaTa CTpyKTypa Ha cpaftsia Web.config 

KaKTO Bene pa3r/ie,qaxMe, cpaw/i"bT web.config hm npeflocraBfl 6oraTa B"b3- 
mo>khoct 3a KOHCpurypupaHe Ha OTfle/iHMTe nacm ot npi/i/ioxeHkieTO. Ho BCHKa 
pa3r/ie,qaHa ,qo cera HacTpoMKa 6ewe craHflapTHO npeflocraBeHa ot ASP.NET. 
KaK o6ane fla ctxpaHMM Haiua cneuwcpkinHa MHCpopMauna 3a npw/io>KeHi/ieTO b 
KOHCpurypaunoHHMfl cpaw/i? 3a Ta3M ue/i MO>xe fla i/i3no/i3BaMe cneuwa/iHaTa 

ceKUMfl B Web.config CpaM/ia - appSettings. B Hefl MO>Ke fla 3aflaBaMe 

flBOMKM k^k)4-ctomhoct. Te ca flocTbnHM nporpaMHO no BpeMe Ha ki3n"b/iHeHkie 
Ha npw/io>KeHi/ieTO. Eto npuMepeH KOHCpurypaunoHeH cpaki/i: 



<conf iguration> 
<system. web> 

</ system. web> 
<appSettings> 
Odd 

key="ConnectionString" 

value="server=demoserver; database=pubs; uid=sa; pwd=" /> 
<add 

key="MailServer" 
value="DemoHost" /> 
</appSettings> 
</conf iguration> 



l/l3B/ii/maHeTO Ha Te3M ctomhoctm CTaBa no cneflHkifl HanwH: 



string connectionString = System. Configuration . 

Conf igurationSettings .AppSettings [ "ConnectionString" ] ; 
SqlConnection conn = new SqlConnection (connectionString) 

SmtpMail . SmtpServer = System. Conf iguration . 
Conf igurationSettings .AppSettings [ "MailServer" ] ; 



ASP.NET hm flaBa B"b3MO>KHOCT fla M3rpa>KflaMe Haiun co6cTBeHM kohcpm- 
rypaunoHHM ceKunn b cpai/i/ia web.config. Hpe3 tax MO>xeM fla crpyKTypwpaMe 



266 nporpaMnpaHe 3a .NET Framework (tom 2) 

KOHCpurypaunoHHMTe HacTpoMKM Ha npn^OKeHneTO v\ fla rpynnpaMe b ojp,enuv\ 
6/iOKOBe /lorwuecKki CB"bp3aHMTe. 

MepapxMii Ha KOHCpMrypauMOHHiiTe cpan/iOBe 

BcflKa AnpeKTopua b ye6 npM/io>KeHMe MO>Ke Aa cbAtpwa cbom co6cTBeH 
KOHCpurypaunoHeH cpai/i/i (web.config), b komto MO>Ke p,a ce npeAecpm-mpaT 

HaCTpOMKMTe 3a Ta3M AHpeKTOpMfl M BCM4KM HeMHM nOAAHpeKTOpMM . riO T03M 

Ha^MH ce no/iynaBa wepapxna Ha KOHCpurypaunoHHMTe Hacrpoi/iKki v\ cpaw/iOBe. 
Haw-OTrope ctom r/io6a/iHM*iT KOHCpurypaunoHeH cpaw/i 3a ctpBtpa - 
Machine . config. HeroBMTe HacTpoMKM ce Hac/ieAflBaT ot r/iaBHMJi KOHCpury- 
paunoHeH cpaw/i 3a npi/i/io>KeHkieTO (cpaw/ia web.config, pa3no/io>KeH b r/iaB- 
HaTa AnpeKTopua). Te ce npw/iaraT Btpxy bcmukm noAAnpeKTopnn. 

Pa3rpi>ii4aHe Ha npmioweHiieTO 

Cnep, KaTO Bene pa3r/ieAaxMe KaKBM ca B"b3MO>KHOCTMTe 3a KOHCpurypupaHe Ha 
npn^OKeHneTO, cera me cnpeM BHMMaHneTO cm Btpxy HeroBOTO pa3rp"biuaHe 
(deployment) v\ nocneABamaTa ro noAAPt>>KKa v\ o6HOBABaHe. Ho Ma/iKO npeAH 
TOBa me npocneAHM CTtnKMTe 3a kmcra/ikipaHe v\ KOHCpurypupaHe Ha ye6 
ctpBtpa. 

MHCTa/iMpaHe m KOHCpurypupaHe Ha ye6 cbpBi>pa 

Ye6 ctpB-bp-bT (IIS - Internet Information Services) He e MHcra/iMpaH 
craHAapTHO b Windows 2000 v\nv\ Windows XP (HeiuaTa He ctoat TaKa npn 
Windows Server 2000 v\ 2003). 3a p,a ro MHcra/ikipaMe, Tpa6Ba p,a HanpaBMM 

C^eAHOTO. 

1. OTBapflMe Control Panel M M36npaMe Add or Remove Programs. 

2. Ot noflBki/ikifl ce npo3opeu M36npaMe eTMKeTa Add/Remove windows 
Components. 

3. Ot HOBonosiBM/ikifl ce cnncbK c KOMnoHeHTM Ha onepaunoHHaTa ci/icreMa 

M36npaMe M MHCTa^kipaMe Internet Information Services (IIS). 



T/iaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



267 



& Add 01 Remove Programs 



Q0B 



Change or 
Remove 
Programs 






Currently installed programs: 



"2 5how updates 



5ortby: Name 



Add New 
Programs 

& 

Add/Remove 

Windows 
Components 

» 

Set Program 

Access and 

Defaults 



Windows Components Wizard 



m 



Windows Components 

You can add or remove components of Windows XP. 




To add or remove a component, click the checkbox A shaded box means that onlj) 
part of the component will be installed. To see what's included in a component, click 
Details. 

Components: 

â–¡ ^"Indexing Service COMB 

^Internet Explorer COMB rj 

* '^Internet Information Services (IIS) 13,5 MB \ 

n ^Management and Monitoring Tools 2,0 MB 

f~l rJat"Mess^npnuei]inn MB UU 

Description: Includes Web and FTP support, along with support for FrontPage, 
transactions. Active Server Pages, and database connections. 

Total disk space required: 56,2 MB f ^ .. 1 

Space available on disk: 1 894,1 MB ' ejAS^ — J 



< Back 



Next;- 



Cancel 



ed 



5,28MB 
24,93MB 

3,48MB 

6,74MB 
61,54MB 

5,15MB 

12,82MB 
20,24MB 
0,43MB 
0,11MB 
7,52MB 

0,36MB 

85,12MB 

rarely 



To change this program or remove it From your computer, click Change/Remove. 



Last Used On 01.4.2005 r. 
Change/Remove 



Ako ycneujHO CMe i/i3B"bpujki/ii/i ropeonidcaHaTa onepau,id*i, me Tpa6Ba p,a 
pecTapTupaMe Windows. Cnep, pecrapTkipaHe, ot control Panel -> 

Administrative Tools -> Internet Information Services MO>KeM A<3 

OTBopuM idHTepifceidca 3a KOHCJDMrypMpaHe Ha ctpBtpa. 

B cnynaid, ne CMe idHcra/ikipa/iki Visual Studio .NET npeflu IIS {v\nv\ M3o6iuo 
i-mMaMe Visual Studio), me e Heo6xoAHMO p,a peridCTpupaMe ASP.NET pa6oT- 
Hidfl npou.ec. 3a ue/ua Tpa6Ba p,a BtBeAeM cneAHkm peA b KOMaHAHkm idHTep- 
npeTaTop Ha Visual Studio, HaMnpaiu ce b HeroBOTO noAMeHK) b start 

MeHhOTO: 



aspnet regiis -i 



ToBa MO>Ke p,a crane id KaTO crapTkipaMe cpaM/ia aspnet_regiis.exe, komto ce 

HaMldpa B systemroot\Microsof t.NET\Framework\versionNumber\ C napa- 
MeTtp -i. 

Heo6xoAMMM 4>aM/iOBe 

KaKTO bcm4kh .NET npid/io>t<eHidfl, TaKa id ASP.NET ye6 npid/io>t<eHidflTa ce 
pa3rp-biuaT 4pe3 npocTO KonnpaHe (XCOPY deployment). Heo6xoAHMkiTe dpav\- 
ziOBe, komto Tpa6Ba p,a KonnpaMe bbb BidpTya/maTa AnpeKTopua Ha npn/io>Ke- 
HkieTO, ca: 



268 nporpaMnpaHe 3a .NET Framework (tom 2) 

- naniOTa bin, koato cbAtpwa KOMnw/ikipaHi/iTe code-behind K/iacoBe v\ 
BCM4KM aceM6/ikiTa, komto CMe pecpepwpa/iki b Haujua npoeKT. 

- BCM4KM ye6 cpopMM (* . aspx) m noTpe6kiTe/iCKki KOHTpO/lkl (*.ascx) 

- KOHCpurypauMOHHMTe cpaw/iOBe Ha npi/i/io>KeHi/ieTO (web.config) v\ cpaw/ia 
3a o6pa6oTKa Ha r/io6a/iHki Cb6kiTi/m (Global. asax). 

- BCAKaKBM Apyrn Aont/iHMTe/iHi/i cpaw/iOBe, komto M3no/i3Ba npi/i/io>KeHkie- 
to - KapTMHKM, /iwueH3Hki cpaw/iOBe M AP- 

- aKO npn/iOKeHneTO M3no/i3Ba AHHaMkinHa KOMni/i/iau.i/m, me ca hm hy>khm 
m code-behind cpaw/iOBeTe (*.aspx.cs v\ *.ascx.cs). 

BckinKki ocraHa/iw cpaw/iOBe, komto ce HaMnpaT b AnpeKTopn^Ta Ha npi/i/iowe- 
HkieTO, He ca Heo6xoAHMM (*.sin, *.csproj, *.resx). KaKTO Bene cnoMe- 
HaxMe, aKO He i/i3no/i3BaMe AHHaMkinHa KOMnw/iaui/ifl, code-behind cpai/i/iOBeTe 
cbiuo HflMa Aa ca hm Heo6xoAHMM. 

06HOBiiBaHe Ha npn/ic»KeHMeTO 

06HOBABaHeTO Ha ye6 npn^OKeHneTO ce M3B"bpujBa npe3 KonnpaHe Ha bcmukm 
npoMeHeHM CTpaHnun v\ noTpe6i/iTe/iCKi/i kohtpo/ii/i, KaKTO v\ Ha aceM6/ikiTO, 
KoeTO ctAtpxa KOMnn^npaHMTe code-behind K/iacoBe. Ako MMa npoMeHM b 
KOHCpurypaunoHHMTe cpaw/iOBe Ha npw/io>KeHi/ieTO, Te cbiuo Tpa6Ba Aa 6"bAaT 
o6HOBeHM. Pa6oTHMAT npou.ec Ha ASP.NET cnep,v\ 3a npoMeHM b bin AnpeKTO- 
pi/mTa m KOHCpurypauMOHHMTe cpaw/iOBe v\ aKO HacTtn^T TaKMBa, aBTOMaTMUHO 
pecTapTupa npM/io>KeHMeTO. Cnep, pecrapTkipaHe ntpBi/mT noTpe6wTe/i, komto 
noncKa AaAeHa crpaHkiua, me npeAH3BHKa JIT KOMnw/iaukifl Ha npw/io>KeHkieTO. 

CwrypHOCT b ASP.NET 

KoHu.enu.kmTa 3a curypHOCT e 3a/ierHa/ia b ocHOBaTa Ha ASP.NET. Ye6 
npn^o>KeHMflTa, komto M3rpa>KAaMe, no BC^Ka BepoflTHOCT me ce no/i3BaT ot 
mhoto Ha 6poki noTpe6kiTe/in v\ curypHO me ca AOCTtnHM npe3 1/lHTepHeT. ToBa 
M3MCKBa ot ASP.NET Aa npeA/ioxn Ao6pe pa3BMT MexaHM3tM 3a ocurypaBaHe 
Ha curypHOCT. 

CurypHOCTTa b ASP.NET ce ocHOBaBa Ha ufl/iocmaTa cucTeMa 3a curypHOCT b 
.NET m b 4acTHOCT Ha MOAe/ia, 6a3npaH Ha po/iw (Role-Based Security). 
ASP.NET npeA-fiara MOAe/iw 3a aBTeHTHKauna (authentication) v\ OTopn3aun5i 
(authorization), komto 3aeAHO c npeAOcraBeHkiTe yc/iyrw ot ye6 ctpBtpa (IIS) 
M3rpa>KAaT UH/iocmaTa i/iHCppacrpyKTypa 3a CkirypHOora b ASP.NET. BtnpeKM 
ne b TeMaTa 3a curypHOCT, me pa3r/ieAaMe aBTeHTHKaunaTa v\ OTopn3aunflTa, 
HeKa m cera ce cnpeM Ha Te3M ABe AeMHOCTM. 

ABTeHTMKaMMq II OTopn3ai4nq 

ripeAM Aa pa3MeAaMe b p,ejav\nv\ KaK ce M3B"bpujBa aBTeHTHKaunaTa b 
ASP.NET m OTopn3aunflTa npn AOCTbna ao 3aiunTeHM pecypcn, HeKa o6achmm 

ntpBO KaKBO 03Ha4aBaT TepMMHMTe "aBTeHTMKaUMfl" M "OTOpM3aUMfl". 



T/iaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



269 



ABTeHTMKaUMSI 

ABTeHTMKaunflTa e npouecbT Ha pa3no3HaBaHe Ha flafleH noTpe6kiTe/i. noTpe- 
6v\jenf\j ce npeflcraBH KaTO npeflocraBH ashhh 3a ce6e cm (Hanp. noTpe6n- 
Te/iCKO i/iMe m napo/ia). Te3M .qaHHki ce npoBepyiBaT 3a Ba/ikiflHOcr. Ako ca 
Ba/iMAHki, noTpe6nTe^flT ce cukua 3a aBTeHTMKupaH. B npoTMBeH cnynai/i My ce 
OTKa3Ba flocrbn flo cwcreMa v\nv\ noncKaHUfl pecypc. B ASP.NET MMa Tpn 
Bt3MO>KHOCTM 3a aBTeHTMKaunfl : windows, forms v\ passport aBTeHTHKauna. 
IHe ce cnpeM no-no,qpo6HO Ha BC^Ka ot tax cnefl Ma/iKO. 

OTOpM3ai4Mfl 

OTopn3aunflTa e npou.ec Ha CBtp3BaHe Ha noTpe6i/iTe/i c p,ap,euv\ npaBa. 3a 
OTopn3npaH ce cukua noTpe6i/iTe/i, komto MMa npaBO fla pa6oTM c noncKaHna 
pecypc ki/ii/i fla M3B"bpujn KOHKpeTHaTa onepauna. Bbb BepuraTa Ha curypHOCT- 
Ta TOBa e c/ieflBaiunflT npou.ec cnefl aBTeHTHKaunaTa - cnefl KaTO pa36epeM 
kom e noTpe6nTe^flT, Hue Tpa6Ba fla 3HaeM KaKBM ca HeroBMTe npaBa. B 
ASP.NET 3a OTopn3aun5q ce M3no/i3Ba MOfle/i-bT Role-Based Security, T.e. BceKM 
noTpe6i/iTe/i Moxe fla e b eflHa v\i\v\ noBene po/iki. npouecbT Ha OTopi/i3au.wfl 
MO>Ke fla ce M3B"bpujBa He caMO Ha hmbo noTpe6i/iTe/i, ho m Ha hmbo po/ia. 



BMfloee aBTeHTMKauLMfi b ASP.NET 

KaKTO Bene cnoMeHaxMe, b ASP.NET MMa Tpn BMfla aBTeHTHKauna: windows, 
forms m passport (BCbiflHOCT ca neTupn, ho neTBtpTMAT e none - HMKaKBa). 
IHe pa3MeflaMe BceKM eflMH ot tax, ioto ce cnpeM Ha HeroBi/ue npeflMMCTBa v\ 
HeflocTaTtun. IHe o6cbflMM b kom cuTyaunn kom MOfle/i fla M3no/i3BaMe. 

Windows aBTeHTHKauiin 

Windows aBTeHTHKaunaTa pa3ni/iTa Ha caMaTa onepaunoHHa ci/icreMa fla npe- 
flocTaBM MHCpopMaunfl fla/iw flafleHMAT noTpe6kiTe/i e to3m, 3a komto ce npefl- 
CTaBfl. 3a ue/ua, aKO flafleHa crpaHi/iu.a e flocrbnHa caMO 3a aBTeHTMKupaHn 
noTpe6kiTe/in, npefl noTpe6kiTe/ifl ce noflBABa fli/ia/ioroB npo3opeu.. B Hero tom 
Tpa6Ba fla BtBefle MMe v\ napo/ia: 



r it-nr — I 


Connect to local host LJjL* 1 


% ^H 


localhost 
User name: 
Password: 






g V 












HI Remember my password 




OK Cancel 









270 nporpaMnpaHe 3a .NET Framework (tom 2) 

TaKa BtBefleHMTe flaHHM ce npoBepaBaT 3a Ba/ikiAHOcr cnpaMO noTpe6MTe/iMTe 
Ha ctpBtpa v\nv\ Ha flOMetiHa, b komto tom ce HaMnpa. Ako ca Ba/ikiAHki, noTpe- 
6nTe/iflT ce cnwTa 3a aBTeHTMKupaH. 

KaK me ce 3ana3M MHCpopMaunaTa, ne flafleH noTpe6kiTe/i Bene e aBTeHTMKM- 
paH, 3aBMCM ot HacTpoMKMTe, koi/ito HanpaBMM Ha ye6 cbpBtpa. Bb3mo>khoc- 
TMTe ca c^eAHMTe: basic, digest v\ integrated OTopn3aunfl. HeKa fla pa3r/ieAa- 
Me BCAKa ot tax HaKpaTKo: 

Basic aBTeHTMKauMfl 

ToBa e Haw-npocTkiflT MeTOA 3a aBTeHTi/iKaui/m v\ HakJ-Henpenoptni/iTe/iHi/mT, 
3aiuoTO napo/iaTa ce npeflaBa b hmct bma b HTTP xefltpa Ha BC^Ka 3aaBKa. 
ripeflMMCTBaTa Ha to3m MeTOfl ca, ne e ocpwui/ia/iHO npneT CTaHflapT v\ ce 
noAAtpxa ot BCM4KM cbBpeMeHHM 6pay3tpn. 

Digest aBTeHTHKaunn 

noflo6Ha e Ha basic aBTeHTHKaunaTa c eflHO eflMHCTBeHO npeflMMCTBO - MMeTO 
m napo/iaTa He ce npeAaBaT b hmct bma. BtnpeKM TOBa M3MCKBa caMMTe 
napo/iki p,a ca b hmct bma {v\i\v\ KpunTupaHn) Ha ctpBtpa, KoeTO 03HanaBa, we 
AOCTbirbT ao Hero Tpa6Ba p,a e orpaHkmeH. 

Integrated Windows aBTeHTMKauiin 

ToBa e HaM-curypHMAT MeTOA 3a aBTeHTHKauna b Windows cpeAa. ripn Hero He 
ce npeAaBa HMKaKBa KOHCpkiAeHuwa/iHa MHCpopMauna (H^Ma Ana/ioroB npo30- 
peu 3a B"bBe>KAaHe Ha ashhh), a noTpe6kiTe/isiT ce aBTeHTMKupa KaTO TeKymo 
B/ie3/ikisi (logged) noTpe6wTe/i b onepaunoHHaTa ci/icreMa, ot koato MABa 
3aHBi<aTa. EcTecTBeHO curypHOCTTa v\ yAo6cTBOTO MMaT CBO^Ta ueHa - Ta3M 
B"b3MO>KHOCT ce noAA^pwa caMO ot Internet Explorer (ye6 ctpBtpa v\ 6pay- 
3"bpa ocbiuecTBABaT KOMyHMKaunaTa no cbom co6cTBeH Hani/m). l/l3no/i3BaT ce 
nopTOBe, pa3^M4HM ot 80, 3a p,a ce octiuecTBM aBTeHTHKaunaTa, KoeTO MO>xe 
Aa e npo6/ieM, aKO MMa 3aiunTHa CTeHa (firewall) b Mpe>xaTa. 

Cnep, KaTO pa3MeAaxMe BC^Ka eAHa ot B"b3MO>KHOCTi/iTe 3a Windows aBTeH- 
TMKaunfl, HeKa Aa bmamm KaK Aa 3aAaAeM koa Aa w3no/i3BaMe. 

3a Hana/io yKa3BaMe Aa ce i/i3no/i3Ba Windows aBTeHTHKauna b KOHCpurypa- 
UMOHHMfl cpaw/i Ha npn^OKeHneTO web.config: 



Authentication mode="Windows" /> 



Cnep, TOBa OTBapaMe KOHCpurypaunoHHaTa KOH30/ia Ha IIS v\ c AeceH 6yTOH 
Btpxy Hawkifl npoeKT M36npaMe Properties. Ot noflBki/ikia ce npo3opeu 
M36npaMe eTMKeTa Directory Security v\ HaTMCKaMe 6yTOHa Edit, komto ce 
HaMkipa b ntpBaTa ceKui/m: Anonymous access and authentication 

control (b>k. cpurypaTa). Cnep, TOBa MMaMe b"B3mo>khoct Aa M36epeM Heo6xo- 
AMMMfl hm MeTOA - b cnyna$i CMe M36pa/ii/i Integrated Windows aBTeHTM- 
KaunflTa. 



T/iaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



271 



Demo Properties 






HTTP Headers 



Custom Errors 



ASP.NET 



Virtual Directory 



Documents 



Directory Security 



â– Anonymous access and authentication control 

Enable anonymous access and edit the 
authentication methods for this resource. 



Edit.. 



IP address and domain name restrictions - 



Authentication Methods 



Grant or deny access to this resourc 
IP addresses or internet domain nam 



â– Secure communications- 



Require secure communications anc 
enable client certificates when this 
resource is accessed. 



OK 



Can 



m 



| Anonymous access 

No user name/password required to access this resource. 
Account used for anonymous access: 


User name: 


IUSRJJGAZ 


Browse... 








Password: 










Allow IIS to control password 





Authenticated access — 

For the following authentication methods, user name and password 
are required when 

- anonymous access is disabled, or 

â–  access is restricted using NTFS access control lists 

Digest authentication for Windows domain servers 
1 1 Basic authentication (password is sent in clear text) 


Default domain: 




Select... 






Realm: 




Select... 


Integrated Windows 


authentication 



c 



OK 



Cancel 



Help 



Windows aBTeHTHKaunaTa e Haw-Ao6pe p,a ki3no/i3BaMe, aKO pa3pa6oTBaMe 
npi/i/ic»Kei-ii/ie, KoeTO me ce i/i3no/i3Ba b paMKMTe Ha ep,na KOMnaHna (b HeMHua 
MHTpaHeT), KtfleTO noTpe6kiTe.ni/iTe ca nacr ot noTpe6kiTe/iCKi/ifl flOMeMH v\ ca 
cpMKCupaH 6pow. To3M bma aBTeHTMKau,Mfl e Henpi/i/io>KkiM, aKO npH/ioxeHweTO 
me ce M3no/i3Ba b MHTepHeT. 

Forms aBTeHTMKaijMfi 

ToBa e MO>Ke 6m Haw-necro M3no/i3BaHkiflT MeTOfl 3a aBTeHTHKauna b ASP.NET. 
B Hero caMOTO npn^oxeHne ce rpuxn 3a aBTeHTMKupaHeTO Ha noTpe6nTe^MTe. 
Cnep, Ma/iKO me pa3r/ieAaMe noflpo6eH npuMep KaK p,a M3no/i3BaMe to3m bma 
aBTeHTMKaunfl, a cera HeKa pa3r/ieAaMe npuHunna, Ha komto ta ce 6a3npa. 

Forms aBTeHTHKauim - npuHLjMn Ha AeiicTBMe 

ripn noncKBaHe Ha pecypc (crpaHkiua), komto e pa3peiueH caMO 3a aBTeHTM- 
KnpaHM noTpe6kiTe.ni/i, K/iweHTCKi/iflT 6pay3"bp ce npeHacouBa kbm npeABapn- 
Te/iHO yKa3aHa crpaHkiua, Ha koato me ce M3B"bpujn aBTeHTHKaunaTa. ripn 
ycneujHa aBTeHTkiKau,i/m KtM K/iweHTa ce M3npama 6ncKBMTKa, koato yKa3Ba, 



272 nporpaMnpaHe 3a .NET Framework (tom 2) 

ne noTpe6nTe^flT e Bene aBTeHTMKupaH. ripn BC^Ka c/ieflBama 3asiBKa 6mck- 
BMTKaTa ce npuxBaiua v\ M3no/i3Ba ot ASP.NET 3a pa3no3HaBaHe Ha aBTeHTM- 
KkipaHMTe noTpe6nTe/in. 

Forms aBTeHTMKaunflTa e Haw-MacoBO M3no/i3BaHkiflT MeTOfl 3a aBTeHTHKauna, 
3aiuoTO e mhoto yAo6eH 3a pea/iki3wpaHe Ha KOHKpeTHa ziornKa 3a 
ynpaB/ieHkie Ha noTpe6i/iTe/ikiTe. To3m MeTOfl e v\ Haw-yao6eH, aKO pa3pa- 
6oTBaMe npn^o>KeHMfl, komto me ce no/i3BaT b MHTepHeT, icbfleTO 6poaT Ha 
noTpe6nTe^MTe e cm/iho AWHaMi/meH. Eahhctb6hoto HeyAo6cTBO e, ne pa34MTa 

Ha 6MCKBMTKM, HO M 3aTOBa e nOMMC^eHO, KaTO MMa B"b3MO>KHOCT 3a cecufl 6e3 

6mckbmtkm - cookieless session. 

ABTeHTMKaijMfl m OTopM3au.mi Hpe3 Forms authentication m Role- 
based security - nptmep 

B c/ieflBaiunfl npuMep me pa3r/ieAaMe KaK MO>xe p,a M3no/i3BaMe Forms aBTeH- 
TMKaunflTa b pea/iHa cuTyauna. KaTO Hana/io me 3aflaAeM i/i3no/i3BaHeTO Ha 
Forms aBTeHTHKauna bbb cpaw/ia web.config: 



<authentication mode=" Forms" > 

<forms loginUrl="Login . aspx" /> 
</authentication> 



ATpki6yrbT loginuri ce M3no/i3Ba, 3a fla yKaxeM Ha koa crpaHwua me ce 
aBTeHTMKupa noTpe6i/iTe/iflT. ripn noncKBaHe Ha crpaHkiua, M3MCKBaiua aBTeH- 
TMKaunfl, noTpe6nTe^flT me 6"bfle npeHaconeH kbm Login. aspx, icbfleTO me 
MO>Ke p,a ce aBTeHTMKupa. flpyraTa HacTpoMKa, kohto Tpa6Ba p,a HanpaBMM b 
KOHCpurypaunoHHMfl cpaw/i, e p,a yKaxeM kom pecypcn me M3MCKBaT aBTeHTM- 
Kauwfl. Eto cpparMeHT ot KOHCpurypaunoHeH cpaw/i, komto flecpMHupa bcmukm 
ye6 cpopMM nop, AnpeKTopnaTa Admin p,a M3MCKBaT aBTeHTMKupaHn noTpe6nTe- 



<conf iguration> 
<system. web> 

</ system. web> 
<location path= "Admin "> 
<system. web> 

<authorization> 

<deny users="?" /> 
</ author! zation> 
</ system. web> 
</location> 
</conf iguration> 



CtmoTO MO>Ke p,a ce nocTurHe, KaTO nocraBkiM web.config b AnpeKTopi/mTa 
Admin etc cneflHOTO cbfltpaoHwe: 



<conf iguration> 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 273 



<system. web> 

<authorization> 

<deny users="?" /> 
</ author! zation> 
</ system. web> 
</conf iguration> 



HeKa ce cnpeM Ma/iKO no-noApo6HO Ha ceKunaTa authorization v\ uev\Hv\ie 
AtiuepHM e^eMeHTM. E/ieMeHTbT deny OTKa3Ba Aocrbna ao to3m pecypc Ha 
cbOTBeTHMTe noTpe6nTe^n v\nv\ po/ii/i, KaTO 3a noTpe6kiTe/iw ce M3no/i3Ba 
aTpn6yT"bT users, a 3a po/iw - roles (aKO pa3peiueHMTe ca noBene ot eflHa, 
Te ca pa3Ae^eHM etc 3aneTaa). AHa/iori/mHO MMa e/ieMeHT allow, komto 
pa3peiuaBa Aocrbna. KaTO ctomhoctm Ha Te3M aTpn6yTM MoraT p,a ce 
M3no/i3BaT m 3HaunTe * (bcm4km noTpe6kiTe/iw) m ? (noTpe6nTe^MTe, komto He 
ca aBTeHTMKupaHn). KoraTO ASP.NET npoBep^Ba p,anw noTpe6kiTe/i MMa 
AOCTbn ao AaAeH pecypc, npaBki/iaTa ce npi/i/iaraT OTrope HaAO/iy. Ako ce 
CTurHe ao npaBki/io, KoeTO My pa3peiuaBa v\nv\ OTKa3Ba Aocrbn, to ce 
ki3n"b/iH*iBa, a CToaiunTe noA Hero ce nrHopupaT. Ako H^Ma TaKOBa, ce cnwTa, 
ne noTpe6kiTe^flT i/ma Aocrbn ao noncKaHna pecypc. 

Cera me pa3r/ieAaMe KaK me M3r/ie>KAa HaiuaTa cpopMa 3a Bnv\3ane b cwcre- 
MaTa. Eto ctiuecTBeHaTa nacr ot Login. aspx cpaw/ia: 



<form id="LoginForm" method="post" runat="server"> 




<table border="0" cellSpacing="2 " cellPadding="2 "> 




<tr> 




<td>Username :</td> 




<td> 




<asp:TextBox id="TextBoxUsername" runat="server" 


/> 


</td> 




</tr> 




<tr> 




<td>Password :</td> 




<td> 




<asp:TextBox id="TextBoxPassword" runat="server" 




TextMode="Password" /> 




</td> 




</tr> 




<tr> 




<td colspan="2"> 




<asp: Button id="ButtonLogin" 




runat="server" Text="Login" /> 




</td> 




</tr> 




<tr> 




<td colspan="2"> 




<asp: Label id="LabelErrorMessage" runat="server" 


/> 


</td> 




</tr> 





274 flporpaMnpaHe 3a .NET Framework (tom 2) 



</table> 
</f orm> 



Eto m KaK me M3r/ie>KAa cpopMaTa b K/iweHTCKkisi 6pay3"bp: 



| ^ Login - Windows Internet Explorer 




-ln|x| 


|^http://localhost/Login.aspx _^J | **J [xj |Googl8 


P - 


& <£ ^ Login 


|a -B 


-#-©-©• * 




i 


Username : 




Password : 


Login | 




Done 


*lJ Local intranet 


^100% - ^ 



Cera me pa3r/ieAaMe KOAa, komto M3B"bpujBa aBTeHTHKaunaTa. MeTOAtT, komto 
o6pa6oTBa c"b6nTneTO click Ha 6yTOHa ButtonLogin, e b code-behind cpaw/ia 

Ha CpopMaTa Login, aspx: 



private void ButtonLogin_Click (ob j ect sender, EventArgs e) 

{ 

if (TextBoxUsername . Text == TextBoxPassword. Text ) 



{ 



FormsAuthentication . RedirectFromLoginPage ( 
TextBoxUsername . Text, false ) ; 

} 
else 

{ 

LabelErrorMessage . Text = "Invalid login!"; 

} 



} 



Ha irbpBMfl peA M3BtpujBaMe HanBHa Banv\p,au,v\9\ Ha noTpe6kiTe/iCKOTO MMe v\ 
napona, KaTO vv\ cpaBHHBaMe p,anv\ ca paBHM. B pea/iHa cuTyauna me hi/i ce 
Ha/io>Kki Aa ce o6"bpHeM kbm 6a3aTa ot ashhh v\i\v\ p,a M3BMKaMe ye6 ycnyra, 3a 
Aa ycTaHOBMM p,anv\ AaHHkiTe ca Ba/ikiAHn. B cnynai/i, ne ca eanv\p,uv\, Tpa6Ba 

Aa M3BMKaMe CTaTMUHklfl MeTOA RedirectFromLoginPage (...) Ha K/iaca 

FormsAuthentication. Tom npweMa ABa napaMerbpa: noTpe6kiTe/iCKOTO MMe, 
KoeTO me ce 3anmue b 6ncKBMTKaTa 3a aBTeHTHKauna v\ cp/iar, p,anv\ Ta3M 
6ncKBMTKa Aa ocTaHe 3a onpeAe/ieHO BpeMe npn K/iweHTa (npoA"b/i>Ki/iTe/iHO- 
CTra ce KOHCpurypupa b web.config). Btopmat napaMeTbp cny>KM Aa ce M36er- 
He onepaunflTa no aBTeHTHKauna, aKO 3aTBopnM 6pay3"bpa. MeTOAvr npeHa- 
co4Ba noTpe6nTe^fl kbm ntpBOHana/iHO noncKaHna ot Hero pecypc, komto e 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 275 

M3MCKBa^ aBTeHTMKaunfl. Ako MCKaMe fla ro npeHaconwM Ha flpyro macto, 
Tpa6Ba fla i/i3no/i3BaMe flpyr craTkmeH MeTOfla setAuthcookie(...) , komto caMO 
M3npaiua 6ncKBMTKaTa 3a aBTeHTHKauna. flpyr no/ie3eH MeTOfl Ha K/iaca 

FormsAuthentication e HashPasswordForStoringlnConf igFile (...) . TOM 

cny>Ki/i 3a xeiunpaHe Ha noTpe6kiTe/iCKMTe napo/ii/i. Ako noTpe6kiTe/iflT He e 
B"bBe/i npaBM^HO CBOi/ue flaHHM, M3nncBaMe cbo6meHi/ie 3a rpeujKa. 




He ci>o6ii4aBaMTe Ha noTpe6nTe/inTe nanvi ca c6i>pKa/iii caMO 
MMeTO m/im caMO napo/iaTa. ToBa Mowe fla m HacoHM kt»m 
noTpe6nTe/iCKMTe MMeHa Ha cbiflecTByBaiflii noTpe6nTe/in v\ 
fla flOBefle flo npo6MBM b curypHOCTTa Ha npmio>KeHMeTO. 



C/iefl KaTO npocneflwxMe KaK CTaBa aBTeHTHKaunaTa, HeKa fla pa3r/ieflaMe KaK 
ce M3B"bpujBa OTopn3aunflTa npe3 curypHOCT, 6a3npaHa Ha po/in. EflMHCTBe- 
hmjit KOfl, komto Tp*i6Ba fla HanmueM 3a ue/ua, e b Giobai.asax.es cpaw/ia: 



protected void Application_AuthenticateRequest (Ob j ect sender, 
EventArgs e) 

{ 

if (HttpContext . Current . User != null) 

{ 

if (HttpContext . Current . User . Identity. IsAuthenticated) 

{ 

Formsldentity identity = 

HttpContext . Current . User . Identity as Formsldentity; 
if (identity != null) 

{ 

if (identity. Name == "Stefan" ) 

{ 

HttpContext . Current . User = new GenericPrincipal ( 
identity, new string[]{ "Web Developer" } ) ; 
} 
} 
} 
} 
} 



MeTOfl"bT Application_AuthenticateRequest ce M3BMKBa, KOraTO flafleH 

noTpe6i/iTe/i 6"bfle aBTeHTMKupaH. Eto KaKBO npaBMM b to3m c/iynafi. npoBepa- 
BaMe fla/iw HancTMHa e aBTeHTMKupaH v\ aKO e TaKa, npoBepaBaMe fla/in ce 
M3no^3Ba Forms aBTeHTHKauna. Ako TaKaBa e Ha/ii/mHa, Moxe fla ki3no/i3BaMe 
cbomctboto Name Ha o6eKTa identity, KoeTO hm Bptifla Bene cbxpaHeHOTO 
MMe 3a noTpe6nTe^fl b 6ncKBMTKaTa 3a aBTeHTHKauna. Cnep, TOBa pea/iM3M- 
paMe ziornKaTa 3a 3aflaBaHe po/ikiTe Ha noTpe6i/iTe/isi, komto ce e aBTeHTMKM- 
pa/i. B c/iynaa Ha noTpe6kiTe/i5i "Stefan" ce 3aflaBa po/ia "Web Developer", 
KoeTO me My no3BO/ii/i flocrbn ao bcmukm pecypcn, komto ca pa3peiueHM KaKTO 
3a Hero, TaKa v\ 3a HeroBaTa po/ia. 



276 nporpaMnpaHe 3a .NET Framework (tom 2) 

Passport aBTeHTMKauMfl 

To3M MeTOfl ce 6a3npa Ha ycnyraTa MS Passport, koato Microsoft npefl^ara Ha 
CBOMTe K^neHTM. Ta3M yc/iyra BCbiuHOCT npeAcraB/isiBa rd/iamo eAHHHO xpaHM- 
/lrnue Ha MHCpopMaunfl 3a perncTpupa/in ce noTpe6kiTe/ii/i. 1/lHCpopMauwflTa 3a 
tax e AOCTbrma npe3 ye6 ycnyrw. MfleaTa Ha Ta3M yc/iyra e, ne noTpe6kiTe/iflT 
B/iki3a b cucTeMaTa caMO BeAHtw v\ cnep, TOBa MO>xe p,a B/iki3a AnpeKTHO v\ b 
Apyrn cawTOBe, M3no/i3Baiun ctiuaTa aBTeHTHKauna. M3/iw3aHeTO MO>Ke fla 
CTaHe KaKTO ot TeKyiuna cai/iT, TaKa v\ ot bcmukm caMTOBe, b komto e Bj\s\3bn 
noTpe6nTe^flT. ripeAHMCTBaTa Ha to3m noAxoA ca, ne ce npeAOcraBH eAMHeH 
MexaHM3tM 3a pa6oTa c noTpe6kiTe/iki (eAMHHa 6a3a ot ashhh), KaKTO v\ ne 
MMa bmcoko hmbo Ha cwrypHOcr. HeAOcraTbui/iTe ca, ne yc/iyraTa He e 6e3- 
n/iaTHa, a v\ pa6oTaTa Ha npi/i/io>KeHkieTO CTaBa 3aBMCMMO ot TpeTa CTpaHa (b 
cny^an Microsoft). 

CnrypHOCT Ha hmbo CbpBi>p (IIS Security) 

3a cpi/ma/i me pa3r/ieAaMe KaKBO hm npeAOcraBH IIS ctpBtpa 3a ocurypaBaHe 
Ha curypHOCT Ha npi/i/io>KeHi/ieTO. Ochobhoto npeAHa3HaneHwe Ha eAHH ye6 
ctpBtp e pja o6c/iy>KBa 3aaBKMTe, HanpaBeHM ot K/iweHTCKkiTe 6pay3"bpn kbm 
pecypcn, komto ce HaMnpaT Ha ctpBtpa. rioncKaHUflT pecypc MO>xe p,a He 
cbiuecTByBa v\nv\ K/iweHTbT Aa HHMa npaBO p,a ro bmam. 

Pa3r/ie>KAaHe cpaw/ioBeTe Ha d>pBi>pa 

CraHAapTHO IIS pa3peiuaBa Aocrbna caMO ao onpeAe/ieHki pecypcn (* . aspx, 
*.htmi, *.jpg m AP-)/ ocraHa/ii/iTe cpaw/iOBe He ce o6c/iy>KBaT (Hanp. 

Web.config, *.csH AP-)- 

Ako e Heo6xoAMMO OTAa/ieneHO pa3r/ie>KAaHe Ha cpaw/iOBeTe Ha npw/io>Ke- 
HueTO, MO>Ke Aa ro pa3peujMM, KaTO MapKupaMe HacrpoMKaTa Directory 
Browsing, HaMnpaiua ce b MeHKrro Properties, lupaKBawKM c AeceH 6yTOH 
Btpxy ye6 npn^OKeHneTO b noTpe6nTe^CKMfl MHTepcpewc Ha IIS. 

Ha cpurypaTa no-AO/iy e noKa3aH Ana/iorvr 3a HacTpoMKa Ha "Directory 
Browsing" onunaTa. 



T/iaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 



277 



Demo Properties 



3S 



HTTP Headers 



Custom Errors 



ASP.NET 



Virtual Directory 



Documents 



Directory Security 



When connecting to this resource, the content should come from: 
(+) A directory located on this computer 
O A share located on another computer 
O A redirection to a URL 





Local Path: | D:\Projects\Demo FINALVDemo FINALS 


Browse... 


1 1 Script source access 
0Read 
â–¡ Write 
3!Diretj^ry browsing 


Log visits 
Index this 


esource 


Application Settings 
Application name: 
Starting point: 
Execute Permissions: 
Application Protection: 










Remove 


â– digAZ web ..ADemo 






Configuration... 


Scripts only 


V 


Unload 






Medium (Pooled) 


v 









OK 



Cancel 



Apply 



Help 



AHOHMMeH AOCTbn 

rioMCKBaHeTO Ha pecypc ot cpaw/iOBaTa ci/icreMa Ha ye6 cbpBtpa Tpa6Ba p,a ce 
MAeHTMCpnuupa c Ba^MAeH noTpe6i/iTe/i Ha ci/icreMaTa. BcflKa 3a*iBKa, Hanpa- 
BeHa ot K^neHTCKM 6pay3"bp kbm pecypc, 3a komto e pa3peweH aHOHMMeH 
AOCTbn, ce MAeHTMCpnuupa KaTO aHOHMMHa (crura p,a He e HanpaBeHa npe3 
Internet Explorer, hi/imto noTpe6nTe/i e b Mpe>KaTa Ha ctpBtpa) v\ ce acounupa 
etc c/iy>Ke6HMfl noTpe6i/iTe/i iusR_machinename, KtAeTO machinename e MMe- 
to Ha cbpBtpa. To3M noTpe6i/iTe/i ce Ao6aBfl b cwcreMaTa npn MHcra/iaukiflTa 
Ha cbpBtpa. 

Ako MCKaMe p,a pa3peujMM aHOHMMeH AOCTbn ao dpafi/iOBeTe m/m/im p,a npoMe- 
hmm noTpe6nTe^fl, c komto ce acounupa aHOHMMHi/m AOCTbn, othobo Tpa6Ba 
Aa lupaKHeM c AeceH 6yTOH Btpxy npi/i/io>KeHkieTO v\ p,a M36epeM Properties. 



278 



nporpaMnpaHe 3a .NET Framework (tom 2) 
Demo Properties 



BB 



HTTP Headers 



Custom Errors 



ASP.NET 



Virtual Directory 



Documents 



Directory Security 



f Anonymous access and authentication control — 

Enable anonymous access and edit the 
authentication methods for this resource. 



Edit... 



r IP address an 



r Secure comnn 



Authentication Methods 



u 



M Anonymous access 

NtJirser name/password required to access this resource. 

Account used for anonymous access: 




User name: 


IUSR_LIGAZ| 




Browse... 














Password: 








Allow IIS to control password 









Authenticated access 

For the following authentication methods, user name and password 
are required when 

- anonymous access is disabled, or 

- access is restricted using NTFS access control lists 

1 I Digest authentication for Windows domain servers 
1 1 Basic authentication (password is sent in clear text) 


Default domain: 




Select... 






Realm: 




Select... 


Integrated Windows 


authentication 



OK 



Cancel 



Help 



T03M nvr Tpa6Ba p,a M36epeM Directory Security v\ mpaKaMe Btpxy 6yTOHa 
Edit, komto ce HaMupa b ntpBaTa cei<ui/m: Anonymous access and 
authentication control. 



& 



He flaBafrre no-rosierm npaBa ot Heo6xoAMMMTe 3a flocrbn Ha 
aKayHTa IUSR_machinename. 



KpMnTMpaHe Ha Bpi>3KaTa npe3 SSL 

Ye6 ctpBtptT (IIS) npeA/iara v\ B"b3MO>KHOCT 3a KpunTupaHe Ha Bpt3KaTa, 
ioto 3a ue/ua ce M3no/i3Ba Haki-pa3npocTpaHeHMflT CTaHAapT Secure Sockets 
Layer (SSL). CraHAapTHO 6pay3"bp"bT v\ ctpBtptT KOMyHMKupaT KaTO cm 
npaiuaT MHCpopMaunaTa b npaB TeKCT. M3no^3BaMKM SSL cepTucpMKaT, ABeTe 
CTpaHM no curypeH HankiH o6MeHAT k/ikdh, komto me ce M3no/i3Ba 3a KpunTM- 
paHe Ha KOMyHMKaunaTa Me>KAy tax. flopn v\ HeAo6po>Ke.naTe/i p,a npuxBaHe 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 279 

npeflaBaHaTa MHCpopMauna, tom H^Ma fla e b cbCTOAHne fla vv\ fleKpunTupa 
(noHe b pa3yMHM cpoKOBe v\ c HopMa/iHki TexHkinecKki cpeflCTBa). 3a fla ce 
M3no^3Ba SSL, Ha ctpBtpa Tpa6Ba fla ce MHcra/iwpaT Heo6xoflMMMTe 
cepTucpMKaTM. Te MoraT fla 6"bflaT v\3p,ap,euv\ eflMHCTBeHO ot onpefle/ieHMTe 
opraHM 3a TOBa (Certification Authorities). CraHflapTHO SSL KOMyHMKaunaTa 
npoTi/ma Ha nopT 443 v\ MO>xe fla ce no3Hae no TOBa, ne aflpecvr Ha cawTa 
3ano4Ba chttps://. 

Ynpa>KHeHii5i 

1. C"b3flaMTe ye6 npoeKT. Pa3MeflaMTe reHepupaHMTe cpai/i/iOBe v\ o6acHeTe 3a 
KaKBO cny>Ki/i BceKM eflMH ot tax. noKa>KeTe code behind cpaw/iOBeTe. 
OTne^aTawTe "Hello world" b aspx cpaw/i v\ b code behind cpafi/i. noKaxeTe 
cpaw/iOBeTe, aBTOMaTi/mHO reHepupaHM b nanKaTa Assembly. 

GetExecutingPath ( ) . 

2. Cb3flaMTe HTML cpopMa, kohto npeflaBa cbfltpxaHneTO Ha textarea no/ie 
KtM ctpBtpa m ctpBtptT ro OTnenaTBa b hobo no/ie. He i/i3no/i3BawTe 
code-behind cpaw/i. 

3. C"b3flaMTe ASP.NET ye6 cpopMa, koato npeflaBa cbfltpwaHi/ieTO Ha textarea 
no/ie KtM ctpBtpa, komto ro OTnenaTBa b hobo no/ie. 

4. M3no^3BaMTe src aTpn6yTa Ha @Page flupeKTMBaTa, 3a fla HanpaBMTe 
CTpaHnua, koato HflMa Hy>Kfla ot KOMnki/iau.M5i. 

5. C"b3flaMTe ye6 cpopMa, koato no napaMeTpn 3aflafleHM b GET 3aaBKaTa fla 
onpefle^a wi/ipom/maTa Ha TeKCTOBa KyTna, aflpeca Ha xnnepBp"b3Ka v\ 
BMCO^MHaTa Ha KapTMHKa. OopMaTa fla ce HanpaBM b flBa BapnaHTa - c 
noMOurra Ha HTML v\ Ha Web ctpBtpHM kohtpo/im. 

6. C"b3flawTe ye6 cpopMa, koato fla MMa flBe TeKCTOBM no/ieTa v\ eflMH 6yTOH. 
ripn HaTMCKaHe Ha 6yTOHa fla ce M3B"bpujn npoBepKa Ha K/ikieHTCKaTa 
CTpaHa fla/in flBeTe TeKCTOBM no/ieTa MMaT eflHaKBa ctomhoct m caMO ToraBa 
cpopMaTa fla ce noflafle Ha cbpBtpa. 

7. C"b3flawTe ye6 cpopMa c TeKCTOBO no/ie v\ 6yTOH. ripn HaTMCKaHeTO Ha 
6yTOHa OTne^aTawTe BtBefleHna TeKCT b KOHTpo/ia ot Tun Label v\ b flpyr 
Web server KOHTpo/ia ot Tun TextBox b pe>KMM MultiLine. BtBefleTe b 
TeKCTOBOTO no/ie HeKopeKTHM cmmbo^m m OTCTpaHeTe HTML escaping 
npo6/ieMa, KbfleTO tom ce noflBABa. 06acHeTe pa6oTaTa Ha KOHTpo/iMTe. 

8. npuxBaHeTe c"b6nTMflTa 3a bcmukm eTann ot >KMBOTa Ha CTpaHnunTe c 
noMOurra Ha MeTOflu v\ pea/iki3kipaMTe npocneflflBaHe 3a tax. 

9. C"b3flawTe noTpe6nTe/ici<a KOHTpo/ia, komto fla Bi/i3ya/ii/i3i/ipa MeHK). 
KoHTpo/iaTa Tpa6Ba fla MMa CBOMCTBa 3a MHMuna^M3auMfl Ha MeHKrro - 
AByMepeH MacuB cbfltpwam MMeTO v\ CTpaHnuaTa Ha cbOTBeTHna e/ieMeHT. 
MMn^eMeHTupaMTe cbomctbo, KoeTO fla onpefle/ia uBeTa v\ ujpucpTa Ha 
MeHKrro. flpeueHeTe MMa nv\ Hy>Kfla ot ViewState noflflp"b>KKa. 



280 nporpaMnpaHe 3a .NET Framework (tom 2) 

10. Cb3flaMTe HTML crpaHkiua, koato fla OTnenaTBa Tuna Ha 6pay3"bpa, IP-to m 
nopTa, komto K^neHTa ki3no/i3Ba, 3a fla otbopm crpaHi/iuaTa. 

11. C"b3flaMTe ye6 crpaHi/iua, koato fla 3ana3Ba cbfltpwaHi/ieTO Ha TeKCTOBO 
no/ie b session o6eKTa v\ fla ro OTnenaTBa b no/ie ot Tun eTMKeT. 

12. Cb3flaMTe flBe CTpaHnun, komto fla cm npeflaBaT MHCpopMauna BtBefleHa ot 
noTpe6i/iTe/ifl npe3 6ncKBMTKa. BucKBMTKaTa Tpa6Ba fla e Ba/ikiflHa 5 mmh. 

13. C"b3flaMTe CTpaHnua, koato fla noi<a3Ba Ta6/iwu.a, b koato Ha BceKM pefl 
MMa pa3no/io>KeHM Label KOHTpo/iw m eflMH 6yTOH. ripn HaTMCKaHe Ha 
6yTOHa, Label KOHTpo/ikiTe Ha TeKyiuna pefl fla ce CKpi/mT v\ fla ce noKawaT 
TextBox kohtpo^m c TeKyiflOTO cbfl"b p>Ka h m e Ha Label KOHTpo/iMTe. ripn 
noBTopHO HaTMCKaHe Ha 6yTOHa, fla ce BtpHe ntpBOHana/iHOTO 
ctCTOAHne. fla He ce ki3no/i3BaT no-yc/io>KHeHi/ie kohtpo/im KaTO DataGrid, 

DataList M nOfl06HM. 

14. Cb3flaMTe cpopMa 3a perncTpauna Ha noTpe6kiTe/in c flaHHM 3a MMe, 
v\Mev\i\, napo/ia, noBTap^He Ha napo/iaTa, Te/iecpOH v\ onuna 3a cbr/iacwe c 
o6iflMTe yc/iOBi/ia Ha cawTa. Bcmuki/i no/ieTa ca 3afl"b/i>KkiTe/iHki v\ cbo6me- 
HMATa 3a rpeujKM fla ce M3Be>KflaT b o6iua KOHTpo/ia. rio/ieTaTa 3a MMew/i v\ 
Te^ecpOH fla ce Ba/iwflkipaT c pery/iapeH M3pa3, a flBeTe no/ieTa 3a napo/ia 
fla ce npoBep^BaT fla/iw ca c eflHaKBa ctomhoct. 

15. Cb3flaMTe ye6 cpopMa, kohto cbfltpwa DataGrid KOHTpo/ia. Pea/ii/i3npai/iTe 
CB"bp3BaHe c Ta6/iwuki ot 6a3aTa ot flaHHM Northwind v\ pea/iki3kipawTe 
M36op, peflaKTupaHe v\ TpneHe Ha peflOBe. copTupaHe v\ crpaHkipaHe Ha 
pe3y^TaTMTe. 

16. Bn3ya/iM3npaMTe flaHHMTe ot Ta6/ii/iu.a c noMOLirra Ha Repeater KOHTpo/ia. 

17. C"b3flaMTe ye6 catiT c "login" crpaHkiua, crpaHkiua 3a aflMMHMCTpaTMBeH 
flocTbn m CTpaHnua 3a ny6/iwneH flocrbn. Pea^M3npaMTe v\ "logout" cpyHK- 
UMOHa^HOCT. M3no^3BaMTe Forms authentication v\ po/ii/i Ha noTpe6nTe- 
j\v\je. 

18. C"b3flaMTe ye6 crpaHkiua, koato fla MMa Tpn 6yTOHa v\ eflHO no/ie - eTMKeT. 
C eflMHMAT 6yTOH fla ce kiHMu.ua/iM3Mpa cache o6eKTa etc ctomhoct, koato 
"ocTapaBa" cnep, 10 ceKyHfln. C btopmat 6yTOH - ctomhoct, koato fla 
"ocTapaBa" 10 ceKyHflu c/iefl HacTOfliunfl MOMeHT. C TpeTi/mT 6yTOH fla ce 
M3Be>Kfla CTOMHOCTTa Ha to3m e/ieMeHT ot Kewa v\ fla ce noKa3Ba b 
eTMKeTa. 

19. C"b3flaMTe noTpe6nTe^CKa KOHTpo/ia, komto fla ki3no/i3Ba M3xoflfliuo 
KeiunpaHe etc 3aBMCMMOCT no e/ieMeHT ot cache o6eKTa. 

20. riOKa>KeTe i/ifleHTkinHOcrra Ha npoueca, komto M3n"b/iHflBa ASP.NET npo- 
eKTa, npn MOfle/i Ha pa6oTa Ha IIS 5.1 « IIS 6.0 c noMOurra Ha cneflHMTe 
MeTOflu: 

- Page . User . Identity . Name ; 

- System. Security . Principal . Windows Identi ty. GetCurrent ( ) .Name; 



HnaBa 16. M3rpa>KflaHe Ha ye6 npmioweHmi cASP.NET 281 
- System. Threading. Thread. CurrentPrincipal . Identity .Name; 

21. Cb3flaMTe ye6 crpaHkiua, koato fla Cb3flafle npa3eH cpai/i/i b Program 
Files nanKaTa. KoHCpurypupaMTe npaBM/iHO npaBaTa Ha nanKaTa, TaKa ne 
Aa 6"bAe pa3peiueHO nucaHeTO Ha IIS npoueca. 

M3no/i3BaHa JiiuepaTypa 

1. Mwxaw/1 Ctomhob, ASP.NET ye6 6a3npaHM npw/icoKeHi/m - http://www. 
nakov.com/dotnet/lectures/Lecture-15-ASP.NET-and-Web-Applications- 
vl.01.zip 

2. MSDN Documentation - http://msdn.microsoft.com/ 

3. World Wide Web Consortium (W3C) - The HTML Coded Character Set - 
http://www.w3.org/MarkUp/html-spec/html-spec 13.html iokto m no-nt- 
/ieH cnnctK http://www.natural-innovations.com/wa/doc-charset.html 

4. Jeff Prosise, Programming Microsoft .NET, Microsoft Press, 2002, ISBN 
0735613761 

5. Andrew Duthie , Microsoft ASP.NET Programming with Microsoft Visual C# 
.NET Version 2003 Step by Step, Microsoft Press, 2003, ISBN 0735619352 



Bt/irapcKa a co una una 
Ha paspaSoTMMUMTe na co<t>Tyep 



www.devbg.org 



Et/irapcKa acounaunsq Ha pa3pa6oT4MUMTe Ha coc|DTyep 
(5APC) e HecronaHCKa opraHM3aunfl, koato noflnoMara npo- 
cJDecnoHa^HOTO pa3BMTne Ha 6"b^rapcKMTe coc|DTyepHM cneun- 
a/iwcn/i npe3 o6pa30BaTe^HM v\ Apyrn MHnunaTHBn. 

5APC pa6oTM 3a HacbpnaBaHe o6MAHaTa Ha onuT Me>Kfly pa3- 
pa6oT4MUMTe m 3a ycbBtpujeHCTBaHe Ha TexHkue 3HaHmi v\ 
yMeHMfl b 06/iacTra Ha npoeKTupaHeTO v\ pa3pa6oTKaTa Ha 
coc|DTyep. 

AcounaunflTa opraHM3npa cneukia/iki3kipaHki KOHCJDepeHUMM, 
ceMMHapn m KypcoBe 3a o6yneHwe no pa3pa6oTKa Ha coc|DTy- 
ep m coc|DTyepHM TexHO/iorww. 

5APC opraHM3npa cb3flaBaHeT0 Ha Haui/iOHa/iHa aKafleMna no 
pa3pa6oTKa Ha coc|3Tyep - yne6eH ueHTbp 3a npoifceci/iOHa/i- 
Ha noAroTOBKa Ha coc|DTyepHM cneui/ia/ikicâ„¢. 



T/iaea 17. Mhotohmiukobo 
nporpaMiipaHe 11 

CliHXpOHIi3aL4li5l 



ABTOpii 

A^eKcaHAtp PyceB 
MBaH MuTeB 

He06X0flMMM 3HaHM51 

- Ba30BM no3HaHkifl 3a .NET Framework v\ CLR 

- 5a30BM no3HaHMfl 3a o6iuaTa CMcreMa ot TunoBe b .NET (Common Type 
System) 

- 5a30BM no3HaHkifl 3a e3MKa C# 

- Ea30BM no3HaHMfl no onepaunoHHM cucTeMM 

- ATpn6yTM 

C'bfl'bp^aHiie 

MHoro3aflaHHOCT 

- ripo6/ieM"bT - 3aiuo MHoro3aAanHOCT? 

- riO/13MTe OT MHOr03aAa4HOCTTa 

- PeujeHneTO - npouecu v\ hmujkm 

- KaKBO npeA/iaraT HMUJKMTe v\ Kora ca yao6HM? 

- BnAOBe MHoro3aAa4HOCT 

- MMn^eMeHTauuM Ha MHoro3aAanHOCT 

- floMeMHM Ha npn^OKeHneTO 
Hmujkm 

- KaK pa6oTAT HMUJKMTe? 

- no-Ba>KHM n/ieHOBe Ha K/iaca Thread 

- ripMOpHTeT Ha HMUJKMTe 

- CbCTOflHMfl M >KMBOT Ha HMUJKMTe 

- Thread Local Storage 

- Thread-Relative Static Fields 



284 nporpaMnpaHe 3a .NET Framework (tom 2) 

- noBpe>KflaHe Ha ashhm v\ flpyrn Heyqo6cTBa 

CMHXpOHM3aL(Mfl 

- HaM-flo6poTO peiueHne 

- CTpaTernn 3a CMHxpoHM3aunfl 

- CnHxpoHM3npaHM naca>KM koa 

- CklHXpOHM3MpaHM KOHTeKCTM 

- MethodlmplAttribute 

- HeynpaB^flBaHa cnHxpoHM3aunfl - waitHandie 

- K/iacn4ecKM cnHxpoHM3aunoHHM npo6/ieMM 

- riy/l OT HMUJKM - ThreadPool 

MHTepc|)eilC'bT I Synchronize Invoke 

TaiiMepii 

ACMHXpOHHM M3BMKBaHMfl 

- ACMHXpOHHM M3BMKBaHMfl Ha MeTOAM M npMJ10>KeHMfl 

- Acmhxpohho M3BMKBaHe npe3 Ae/ieraT 

- MOAe/1 3a aCMHXpOHHM M3BMKBaHMfl 

- 1/lHTepcpeMCbT IAsyncResult 

- npnK/iK)4BaHe Ha acuHxpoHeH mctoa 

B Ta3M TeMa ... 

B HacToaiuaTa TeMa me pa3r/ieAaMe MHoro3aAanHOCTTa b cbBpeMeHHMTe one- 
paunoHHM cucTeMM m cpeACTBaTa 3a napa/ie/iHO M3n"b/iHeHMe Ha nporpaMeH 
koa, koi/ito hm npeAOCTaBfl .NET Framework. IHe o6"bpHeM BHMMaHne Ha hmlu- 
KMTe (threads), TexHMTe cbCTOflHua v\ ynpaB/ieHMeTO Ha TexHua >KM3HeH umcb/i 
- CTapTupaHe, npucnuBaHe, cb6y>KAaHe, npeKpaTABaHe v\ AP- 

IHe pa3MeAaMe cpeAcmaTa 3a cnHxpoHM3aunfl Ha hmujkm npn Aocrbn ao 
o6lum ashhh, KaKTO m HanMHMTe 3a M34aKBaHe Ha 3aeT pecypc v\ M3BecTABaHe 
npi/i ocBo6o>KAaBaHe Ha pecypc. IHe ce cnpeM Ha cnHxpoHM3aunoHHMTe 
o6eKTM b .NET Framework, KaKTO v\ Ha HeynpaB/iflBaHkue CMHxpoHH3aunoHHM 
o6eKTM Ha onepaunoHHaTa CMcreMa. 

IHe M3ACHMM KOHuenunflTa 3a pa6oTa c BrpaAeHMfl b .NET Framework ny/i ot 
hmujkm (thread pool), HanMHMTe 3a acMHxpoHHO M3n"bJiHeHMe Ha 3aAanM, cpeA- 
CTBaTa 3a kohtpoji HaA taxhoto noBeAeHMe m npenoptuBaHMTe npaKTMKM 3a 
pa6oTa c tax. 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 285 



MHoro3aflanHOCT 

B Ta3M irbpBa T04Ka ot TeMaTa me o6achmm KaKBO e MHoro3aflanHOOTa v\ 

KaK"bB CMMCb/1 MMa OT Hefl. Ka3aHO HaKpaTKO, MHOr03aflaHHOCTTa e B"b3MO>K- 

HOCTra Ha npouecopa fla pa3npefle/ifl BpeMeTO cm Btpxy noBene ot eflHa 
3a,qana. 

npo6/ieMi>T 

HecTO Ha eAHO npM/io>KeHMe ce Ha/iara fla M3B"bpujBa BpeMeoTHeMaiun onepa- 
\\v\v\. floKaTO Te ce M3n"b/iHflBaT, noTpe6i/iTe/iHT Tpa6Ba fla 6"bfle M3BecTflBaH 3a 
CTaTyca Ha pa6oTa. Tom Tpa6Ba fla e HaacHO p,anv\ npw/io>KeHi/ieTO npoflt/iwaBa 
Aa M3BtpujBa o6pa6oTKM v\nv\ e 6/iOKwpa/io. 

B flpyrn cnynaw eflHO npi/i/io>KeHkie Tpa6Ba fla M34aKBa ocBo6o>KflaBaHeTO Ha 
cnofle/ieH pecypc, 3a fla MO>xe fla npofl"b/i>Ki/i pa6oTaTa cm. To3m m ropHi/mT 
cueHapnn fleMOHCTpupaT Heo6xofli/iMOCTra ot MexaHM3"bM, komto fla no3BO/i*iBa 
noflflp"b>KKa Ha napa/ie/iHO w3n"b/iHeHkie Ha hako/iko onepaunn. 

no/i3MTe OT MHOr03aflaHHOCTTa 

B cnynawTe Ha MHoronpouecopHM cucTeMM MHoro3a,qanHOCTTa boai/i ao 
noBMiueHa npoki3BOflkiTe/iHOCT. KoraTO ki3iTb/iHeHkieTO Ha npi/i/io>KeHkieTO e 
pa3fle/ieHO Ha nacm, komto MoraT fla 6"bflaT i/i3n"b/iHeHM He3aBMCMMO eflHa ot 
flpyra, to Te MoraT fla ce pa3npe,qe/iflT Me>Kfly npouecopnTe v\ fla npkiK/iionaT 
3a no-Ma/iKO BpeMe. 

B eflHonpouecopHMTe ci/icreMki, MHoro3a,qanHOCTTa e He no-Ma/iKO Ba>KHa, 
3aiuoTO no3BO/iHBa Ha npw/io>KeHi/ieTO fla B3anMOfleMCTBa no-flo6pe c noTpe- 
6nTe/ifl, KaTO nocTOAHHO ro M3BecTABa 3a cbcroflHweTO cm m e cnoco6HO fla 
OTroBapa Ha flewcTBUflTa My bbb BceKM MOMeHT. 

MHoro3afla4HOCTTa e mhoto no/ie3Ha v\ KoraTO eflHa cwcreMa ce M3no/i3Ba ot 
mhoto noTpe6kiTe/iki eflHOBpeMeHHO. Pa3npe,qe/iyiHeTO Ha npouecopHOTO BpeMe 
Me>Kfly noTpe6nTe^MTe, npe3 noMOurra Ha HMUJKMTe, cb3flaBa 3a BceKM eflMH ot 
tax n^K)3MflTa, ne pa6oTi/i caM c npM/io>KeHMeTO. CtiueBpeMeHHO He ce 
M3pa3xoflBaT m3^mujhm cucTeMHM pecypcw 3a noflfl"bp>KaHe Ha \\s\n npouec 3a 
BceKM noTpe6kiTe/i. 

3auio e Hy>KHa MHoro3aflaHHOcr - npiiMep 

HeKa pa3MeflaMe 3a npuMep npw/io>KeHkie, KoeTO npn HaTMCKaHe Ha 6yTOH 
M3n"b/iH*iBa BpeMeoTHeMaiua onepaui/m. npe3 TOBa BpeMe, noTpe6i/iTe/iCKMflT 
MHTepcpewc He OTroBapa, Tbv\ KaTO npn^OKeHneTO e 3aeTO c v\3nv\cj\euv\s\. 

ripn CTapTupaHe Ha nporpaMaTa, BM>KflaMe c/ieflHOTo: 



286 



flporpaMnpaHe 3a .NET Framework (tom 2) 



1 Why Multithreading? [X 




rpacpM4HMflT MHTepcpewc Ha npn^OKeHneTO ce cbcrow caMO ot eflHO TeKCTOBO 
no/ie, b KoeTO noTpe6wTe/iflT p,a B"bBe>Kfla npoki3BO/ieH TeKCT v\ 6yTOH, b 
o6pa6oTKaTa Ha komto ctom cneAHaTa BpeMeoTHeMaiua onepauna: 



private void buttonStart Job_Click (ob j ect sender, 
System. EventArgs e) 

{ 

// Start the job in the current thread 
new TimeTakingJob ( ) . Job ( ) ; 



K/iacbT TimeTakingJob MMa c/ieAHaTa pea/iM3aui/m : 



class 


TimeTakingJob 


{ 








public 


void Job ( ) 


{ 










1 


ong 


sum = 0; 




f 


Dr 


(int i=0; K100000; i++) 




{ 










for (int j=0; j<100000; j++) 






{ 


if (i=j) 

{ 

sum++; 

} 






} 






} 






} 








} 









3a6e^A3BaMe, ne cpyHKui/iyua M3n"b/iHflBa RBa B/io>KeHi/i unKt/ia, komto boaat 
AO eAHO npoA"b/i>KkiTe.nHO i/i3nwc/ieHkie. 

KaK pa6oTM npnMepi>T? 

KoraTO noTpe6kiTe/iflT HaTMCHe 6yTOHa, TOBa Te>KKO M3ni/ic/ieHi/ie 3anonBa p,a ce 
M3n"b/iHflBa b MaBHaTa HMUJKa Ha npn^OKeHneTO. IHe AecpMHupaMe KaKBO 



HnaBa 17. Mhotohmlukobo nporpaMnpaHe v\ CMHxpoHM3aumi 287 

to4ho e HMiuKa b c/ieABamaTa TOUKa, 3acera MO>KeM p,a cuMTaMe HMUJKaTa 3a 
nacr (eflMHMua) ot npn^OKeHneTO. 

Pe3y^TaT"bT ot HaTMCKaHeTO Ha 6yTOHa e 3aMp"b3BaHe Ha noTpe6i/iTe/iCKM5i 
MHTepcpewc. npn^OKeHneTO e 3aeTO c npoA"b/i>KMTe/iHM M3HMC/ieHM*i v\ He MO>Ke 
fla o6pa6oTM HMKaKBM AeMCTBua Ha noTpe6MTe/i*i AOKaTO He npm</iK>ni/i etc 

CMeTKMTe. 

A/iTepHaTMBaTa 

3a p,a ce M36erHe to3m npo6/ieM, koabt, komto ce M3n"b/iH*iBa npn HaTMCKa- 
HeTO Ha 6yTOHa, Tpa6Ba p,a M3r/ie>KAa noAo6HO Ha cnep,Hwn: 



p 


rivate voi 


d buttor 


Start Job 


Click (ob j ect 


sender, 


{ 


System. EventArgs 


e) 








// Start 


the job 


in a 


sep 


erate thread 






Thread t 


= new Thread ( 










new Th 


readStar 


t (new 


TimeTakingJob ( ) . 


Job ) ) ; 


} 


t. Start ( ) 


' 











ToraBa M3HMC/ieHMeTO ce nycKa b OTAe/iHa HMiuKa v\ noTpe6i/iTe/iCKkiflT 
MHTepcpewc pearupa KopeKTHO. Pa6oTa Ha npouecopa e p,a pa3npeAe/iM 
BpeMeTO cm Me>KAy HMWKaTa 3a n3nnc/ieHkieTO v\ HMUJKaTa 3a MHTepcpewca. 

PeuieHueTO - npouiecM m hmujkm 

npouectT e ctBKynHOCTTa ot naMeT, creK v\ koa Ha npn^OKeHneTO. Onepa- 
UMOHHaTa cucTeMa pa6oTM c npouecu, komto noTpe6MTe/iMTe B"b3npneMaT KaTO 
npw/io>KeHi/m - TOBa ca ABe MMeHa 3a eAHO v\ cbu\o noHHTi/ie. KaKTO BMA^xMe b 
npeAMUJHMfl npuMep, eAMH npouec MO>Ke p,a M3MCKBa napa/ie/iHO M3n"b/iHeHMe 
Ha noBene ot eAHa 3aAana. 3aTOBa npouecnTe ca cbcraBeHM ot eAHa v\nv\ 
noBene hmujkm, komto ce M3n"b/iHHBaT eAHOBpeMeHHO ot vi\ep,ua TOUKa Ha 
noTpe6wTe/ifl (BCtiuHOCT Ta3M m/ik>3m*i ce nocTura, KaTO npouecoptT necro v\ 
6"bp30 npeBK/iiouBa Me>KAy tax). HnujKaTa e ocHOBHaTa eAMHuua, 3a koato ce 
3aAe/ia npouecopHO BpeMe. 

npOUeCM M HMUIKM 

IHe ce cnpeM Ha npn^MKUTe v\ pa3/iMKMTe Me>KAy npouecnTe v\ HMUJKMTe. 

KaKTO npouecnTe, TaKa v\ HMUJKMTe, MMaT co6cTBeH creK v\ MMaT onpeAe/ieH 
npnopnTeT. ripouecnTe ca He3aBMCMMM eAMH ot Apyr no OTHOiueHMe Ha naMeT 
m ashhu. 3a pa3/iMKa ot tax, bcmukm hmujkm b eAMH npouec cnoAe/iHT o6iua 
naMeT - naMerra Ha npoueca, kbm komto npMHaAJiewaT. 

flOKaTO npOUeCMTe CtAtpxaT M3n"b/lHMMMfl KOA, HMUJKMTe TO M3ntJlHflBaT - 

npouecMTe ca nacMBHM, a HMUJKMTe - aKTMBHM. 



288 nporpaMnpaHe 3a .NET Framework (tom 2) 

KaKBO npefl/iaraT HiiuiKiiTe? 

l/l3no/i3BaHeTO Ha hako/iko hmujkm cb3,qaBa BnenaT/ieHMe 3a M3B"bpujBaHe Ha 
mhoto 3aAa4M eAHOBpeMeHHO. npn^MHaTa e, ne npouecoptT ce npeflocraBfl Ha 
BCAKa HMiuKa 3a H^KaKbB onpefle^eH MHTepBa/i ot BpeMe (KBaHT). Pa3npe,qe- 
nnHejo Ha BpeMeTO ce ocbiuecTBABa Ha 6a3aTa Ha pa3/iMHHM CTpaTernn. 

Cnep, M3TM4aHeTO Ha to3m KBaHT, ce no/iynaBa npeKbCBaHe v\ npouecoptT ce 
npeAOcraBfl Ha c/ieflBamaTa naKama HMiuKa. ripeicbCBaHeTO e MexaHM3tM, 
no3BO^ABaiu HopMa^HaTa nocneflOBaTe/iHOcr ot npouecopHM mhctpykumm fla 
6"bfle npoMeHeHa. To3m Tun npeKtCBaHna ca M3BecTHM KaTO cocpTyepHM 
npeKtCBaHMfl - Te ca npeflBapMTe/iHO n/iaHMpaHM v\ cmhxpohhm c pa6oTaTa Ha 
npouecopa. OcBeH tax, npouecoptT Mowe fla no/iynaBa v\ xapflyepHM 
npeKtCBaHMfl, komto ca acuHxpoHHM, t. e. MoraT fla nocrbnyiT b npoM3BO/ieH 
MOMeHT. Te ctiflo boaat ao npoMAHa b M3n"b/iHflBaHaTa nocneflOBaTe/iHOcr ot 

MHCTpyKUMM. 

MMeHHO MexaHM3MtT Ha npeKtCBaHMflTa npe3 flocraTbUHO Ma/ibK MHTepBa/i ot 
BpeMe cb3flaBa BnenaT/ieHMeTO 3a eflHOBpeMeHHO M3n"b/iHeHne Ha noBene 
onepaunn. KoraTO HanpuMep noTpe6MTe/i$iT B"bBe>Kfla flaHHM b TeKcroo6pa6oT- 
Baiua nporpaMa, flpyrn flaHHM MoraT fla ce nenaTaT Ha npuHTep. Bm 6m/io 
Heyflo6HO 3a noTpe6kiTe/ifl aKO He Mowe fla Btpiun flpyra pa6oTa, flOKaTO 
npuHTeptT pa6oTM. 

Kora ca yao6hm HuiiiKUTe? 

Yflo6HO e fla ce no/i3BaT hmujkm npM o6cjiy>KBaHe Ha mhoto noTpe6MTejiM 
eflHOBpeMeHHO, Hanp. npM npMJio>KeHMe ot TMn ye6 cbpBtp. KoraTO noTpe- 
6MTeji ce CBtpxe, ce nycKa HOBa HMiuKa, npe3 koato fla pa6oTM. AHa/iorMUHO 
e m CB"bp3BaHeTO c 6a3a ot flaHHM, BCAKa Bp"b3Ka kbm Hea ce o6cny>KBa ot 
OTflejiHa HMiuKa. 

npM Mpe>KOBa KOMyHMKauMfl (Hanp. npe3 cokctm), KOMyHMKauM^Ta MO>Ke fla 
6"bfle M30JiMpaHa b OTflejiHa HMiuKa m flOKaTO npMJio>KeHMeTO naKa OTroBop ot 
ApyraTa crpaHa, fla M3B"bpujBa flpyra nojie3Ha pa6oTa. 

BcflKa HMiuKa MMa npMopMTeT. HMUJKMTe c no-BMCOK npMopMTeT 3aeMaT npoue- 
copa no-necro. TaKa MOxeM fla onpefle/isiMe npMopMTeTM Ha OTflejiHMTe 
3aflanM b eflHO npMJio>KeHMe. 

M3n"bJiHABaHeTO Ha abjitm M34MCJieHMa (KaTO b npMMepa), BMHarM Tpa6Ba fla 
CTaBa Ha 3afleH njiaH, 3a fla MO>Ke noTpe6MTe/iCKMHT MHTepcpekic fla pearMpa 
Ha noTpe6MTejiCKM 3aaBKM. 

MHoro3aflaHHOCT - BiiflOBe 

CtiuecTByBaT flBa BMfla MHoro3a,qanHOCT - KOonepaTMBHa m M3npeBapBaiua. 

npM KOonepaTMBHaTa MHoro3aflanHOCT (cooperative multitasking), BC^Ka 
HMiuKa caMa peiuaBa kojiko npouecopHO BpeMe m e Heo6xoflMMO. BeflH"b>K 
3aejia npouecopa, ta ro ocBo6o>KflaBa caMO aKO npMK/iiouM pa6oTaTa cm mjim 
Tpa6Ba fla naKa 3a HAKaKbB pecypc - Hanp. flafleHO cb6MTMe mjim bxoa ot 



HnaBa 17. Mhotohmlukobo nporpaMnpaHe v\ CMHxpoHM3aumi 289 

noTpe6nTe^fl. ToBa o6ane MO>Ke fla flOBefle ,qo 6e3KpaMHO crr/iaraine 
(starvation) Ha ocraHa/iMTe hmujkm m Te fla naKaT Heonpe,qe/ieHO A"b/iro. B 
hmctma v\ BMfl, KOonepaTMBHaTa MHoro3afla4HOCT MMa mhoto orpaHM^eHM 
npi/i/ic»KeHkm. 

ripn M3npeBapBau4aTa MHoro3apiaHHOCT (preemptive multitasking), 3a bca- 
Ka HMiuKa npeflBapkiTe/mo ce 3afle/isi npouecopHO BpeMe. CucTeMeH cocpTyep, 
HapeneH n/iaHMpoBUMK (task scheduler), e cnroBopeiH 3a TOBa pa3npefle/iei-me 
Ha BpeMeTO. B Kpaa Ha BceKM TaicbB npeflBapMTe/iHO 3afla,qeH MHTepBa/i ot 
BpeMe, HMiuKaTa ce CHeMa ot npouecopa, 6e3 3HaneHMe fla/ii/i e npMK/iionM/ia 
pa6oTaTa cm. 

B cbBpeMeHHMTe onepaunoHHM CMcreMM (Windows 2000, Windows XP), ce 
ki3no/i3Ba M3npeBapBaiua MHoro3aflanHOcr. Ta e no-6e3onacHa, Tbv\ KaTO npn 
Hen npouecoptT He MO>xe fla 6"bfle 3aeT ot eflHa hmluio 3a Heonpefle/ieHO 
BpeMe m HflMa pmck ot 6e3KpawHO OT/iaraHe 3a ocraHa/iMTe. 

HflKOM CMCTeMM M3nOJ13BaT KOM6MHMpaH BapkiaHT - HMUJKMTe C BMCOK 

npnopnTeT 3aeMaT npouecopa ao nprncnionBaHeTO cm (KOonepaTMBHo), a 
ocraHa/ikiTe - Ha MHTepBa/iM (M3npeBapBaiuo). 



llMnjieMeHTauiiii Ha MHoro3aflaHHOCT 

MHoro3afla4HOCTTa MO>xe fla 6"bfle MMn/ieMeHTMpaHa no flBa HanMHa - caMO- 
CToyrre/iHa MHoro3aflanHOCT (Apartment Threading) v\ CBo6oflHa MHoro3aflan- 
hoct (Free Threading). 



Apartment 

[Global Data 


Apartment 


Process 


Global Data 


Global Data 








Thread 


Thread 


Thread 


Thread 


Instruction 


Instruction 


Instruction 


Instruction 










Instruction 


Instruction 


Instruction 


Instruction 




. 













Apartment Threading Free Threading 

ripn caMOCTOHTe/iHaTa MHoro3aflanHOcr, BceKM npou.ec no/iynaBa Konne Ha 
flaHHMTe, Hy>KHM 3a HeroBOTO M3nt^HeHne. BcaKa HMiuKa ce crapTi/ipa b HenH 
co6cTBeH npouec, TaKa ne H^Ma cno,qe/ieHM flaHHM Me>Kfly HMUJKMTe b eflMH 
npouec. BcflKa pa6oTa, koato MCKaMe fla M3B"bpujMM b HMiuKa, ce M3BtpujBa b 
OTfle^eH npouec. Ta3M MHoro3aflanHOcr e M3BtHnpouecHa (out-of-process). 

ripn CBo6oflHaTa MHoro3aflanHOcr flaHHMTe b npoueca ca cnofle/ieHM Me>Kfly 
HMUJKMTe m npouecoptT MO>xe fla CMeHM HMiuKaTa, KaTO b cbiuoTO BpeMe He 
CMeHfl flaHHMTe, c komto ce pa6oTM. 



290 nporpaMnpaHe 3a .NET Framework (tom 2) 

CBo6oflHaTa MHoro3a,qanHOCT (Free Threading) e no-ecpeKTMBHOTO peiueHne v\ 
3aT0Ba ce M3no/i3Ba no-necro b npaKTi/iKaTa. B .NET Framework HMUJKMTe 
ki3no/i3BaT MMeHHO Free Threading MOfle/ia. 

CaMOcroflTe/ma MHoro3aAaHHOcr 

ripn MOfle^a Ha caMOcroyiTe/iHaTa MHoro3a,qanHOCT (STA) BC^Ka HMUJKa 
">KMBee" b OTfle^eH anapTaMeHT b paMKkue Ha npoueca. ripouecbT MO>Ke fla 
MMa npon3BO^eH 6pow anapTaMeHTM v\ je fla cnofle/iaT ashhh noMe>Kfly cm 
npe3 nocpeflHMK (proxy). ripn^OKeHneTO peiuaBa Kora v\ 3a ko/iko flt/iro 
Tpa6Ba fla ce M3n"b/iHflBa HMUJKaTa bbb BceKM anapTaMeHT. Bcmukm 3aaBKM ce 
cepna^M3npaT npe3 Windows onawKa etc cbo6meHMfl, TaKa ne no bchko 
BpeMe ce flocTbnBa caMO eflMH anapTaMeHT v\ cneflOBaTe/iHO caMO eflHa HMUJKa 
ce M3n"b/iHflBa. STA e MOfle/ivr, komto no3HaBaT noBeneTO Visual Basic 
pa3pa6oT4Mun, 3aiuoTO npeflu nosiBaTa Ha VB.NET caMO tom e 6m/i flocTtneH 
3a VB npi/i/io>KeHi/mTa. 

CBo6oAHa MHoro3aAaHHOCT 

ripn CBo6oflHaTa MHoro3a,qanHOCT (MTA) flaHHMTe b npoueca ca cno,qe/ieHM 
Me>Kfly HMiuKMTe m npouecopvr Moxe fla CMeHM HMUJKaTa, KaTO b cbiuoTO 
BpeMe He CMeHfl flaHHMTe, c komto ce pa6oTM. To3m noflxofl ce M3no/i3Ba 
necro, 3aiuoTO no3BO^ABa noBMiueHa ecpeKTMBHOCT. B .NET Framework ce 
noflfl"bp>Ka MMeHHO Free Threading MOfle/ia, ho 3a B3anMOfleMCTBne c COM MMa 
npeflBMfleHM HanMHa 3a pa6oTa etc STA. 

flOMeMHM Ha npusioweHueTO (Application Domains) 

KoraTO ce CTapTupa eflHO .NET npn^OKeHne, onepaunoHHaTa cwcreMa Cb3- 
flaBa HeynpaB^ABaH npouec. npM/ioweHkieTO o6ane He MO>Ke fla ce i/i3n"b/iH*iBa 
flupeKTHO b HeynpaB^ABaHMfl npouec. 3aTOBa ce B"bBe>Kfla flont/iHMTe/iHO 
hmbo Ha a6cTpaKunfl Me>Kfly npn^OKeHneTO v\ npoueca, HapeneHO flOMeMH Ha 
npi/i/io>KeHi/ieTO. floMeMHtT e /lomnecKO noH^Tue, 3a pa3/im<a ot npoueca, 
komto e cpki3i/mecKki. EflMH HeynpaB/iflBaH npouec C"bfl"bp>Ka eflMH v\nv\ noBene 
ynpaB^ABaHM flOMeMHM Ha npn^OKeHneTO. 

flOMeMHM Ha npHsioweimeTO - npeAMMCTBa 

- no npuHunn npouec He MO>Ke fla no/i3Ba flaHHM Ha flpyr npouec. ToBa 
orpaHM^eHne MO>Ke fla 6"bfle 3ao6m<o/ieHO c ynoTpe6aTa Ha nocpeflHMK 
(proxy), ho TOBa o6mkhob6ho CTaBa 3a CMeTKa Ha ycno>KHflBaHe Ha KOfla. 
M3no^3BaMKM flOMeMHM Ha npM^o>KeHMeTO, MO>KeM fla CTapTMpaMe 
noBene ot eflHO npM/io>KeHMe b eflMH m cbu\ npouec. TaKa cnofle/iflHeTO 
Ha flaHHM Me>Kfly npM^oxeHMATa 6MBa 3HanMTe/iHO ynecHeHO 

- floMeMHMTe Ha npM/io>KeHMeTO flon"b/iHMTe/iHO ce pa3,qe/iflT Ha koht6kctm. 
KoHTeKCTbT e ctiuo ziorMnecKO noHATMe. 06eKTMTe, onepMpaiflM b eflMH 

KOHTeKCT, Ca KOHTeKCTHO CB"bp3aHM 06eKTM. 3a KOHTeKCTHO CB"bp3aHMTe 

o6eKTM, .NET Framework npeflocraBsi flont/iHMTe/ieH MexaHM3"bM 3a cmh- 
xpoHM3auMfl, komto me 6"bfle pa3MeflaH b TOUKaTa 3a CMHxpoHM3auMa. 



HnaBa 17. Mhotohmlukobo nporpaMnpaHe v\ CMHxpoHM3aumi 291 
- floMeMHMTe Ha npn^OKeHneTO noAA"bp>KaT npoBepKa Ha Tuna Ha 

flaHHMTe, KOMTO Cbfl"bp>KaT. 

Ctiuo ioto npouecnTe, flOMeMHMTe Ha npn^OKeHneTO MoraT fla cbAtpwaT 
eflHa v\nv\ noBene hmujkm. 

3a flocTtn flo flOMetiH Ha npn^OKeHneTO .NET Framework npeflocraBfl K/iaca 

Sy s tern . AppDomain . 

Hmujkm 

HnujKMTe (threads) npeAOcraBHT b"B3mo>khoct Ha npouecopa p,a M3n"b/iHHBa 
hako/iko 3afla4M eflHOBpeMeHHO, KaTO napa/ie/iHOTO M3n"b/iHeHMe ce CMMy/iMpa 
npe3 nocTOAHHO npeBK^K)4BaHe Me>Kfly 3afla4MTe npe3 mhoto KpaTKM MHTep- 
Ba/iM ot BpeMe. BcaKa HMUJKa M3n"b/iH*iBa HHKaKBa 3aAana (nporpaMeH koa) 
KaTO ot BpeMe Ha BpeMe 3aeMa npouecopa 3a mhoto KpaTKO BpeMe, cnep, 
KoeTO ro ocBo6o>KflaBa 3a M3n"b/iHeHMe Ha flpyra HMUJKa. 

KaK pa6oTnT HuuiKiiTe? 

HeKa pa3MeflaMe npuHunnHaTa cxeMa Ha pa6oTa Ha n/iaHMpoBUMKa Ha 
3aflankiTe (task scheduler), komto pa3npefle^a npouecopHOTO BpeMe Me>KAy 

BCMUKM aKTMBHM HMUJKM. 



7\/- 



o 

a) 

a> 

E 



Instruction 



Instruction 



Instruction 



Instruction 



Interrupt 




Return to Queue 



Thread 



Thread 



Thread 



Thread 



Thread 



/ / 


CD 


3 


0) 


3 


a 


O) 


c 


c 


c 


3 


01 


/ 



Ot cxeMaTa ce BM>KAa, ne b AaAeH momcht ce noAAtpwaT M3BecTeH 6poM 
TeKymo M3n"bJiHABaHM hmujkm (b AflCHaTa KOJiOHa). Tbfi KaTO npouecoptT e 
eAMH, Te ca noApeAeHM b onaujKa m BC^Ka M3naKBa cboa peA- KoraTO eAHa 
HMUJKa no/iyuM Aocrtn ao npouecopa, Ha Hea ce npeAOcraBH KBaHT ot BpeMe 
(time slice). Tom 3anonBa c nopeAHaTa 3a M3n"bJiHeHMe npouecopHa MHcrpyK- 
UMfl m 3aB"bpujBa c MHCTpyKUMfl 3a npeKtCBaHe, KoeTO e 3HaK 3a npouecopa p,a 
3anoMHM perMCTpMTe Ha HMUJKaTa, koato e M3n"bJiHsiBa/i (t. e. p,a 3ana3M 
AOKbAe e CTMTHajio M3n"b/iHeHMeTO Ha HMUJKaTa). Me>KAyBpeMeHHO, HMUJKaTa 



292 nporpaMnpaHe 3a .NET Framework (tom 2) 

ce Bptiua b onawKaTa, OTicbfleTO ce M36npa cneflBamaTa 3a ki3n"b/mei-ikie. Ta 
3ano4Ba ot TaM, ao icbfleTO e cri/inna/ia npn nocneAHOTO cm 3aeMaHe Ha 
npouecopa v\ npouecbT ce noBTapa umk/imuho. 

l/l3ni>/iHeHHe Ha hako/iko hmujkm - npMMep 

IHe flafleM cnep,uv\s\ npuMep 3a fleMOHCTpauna: 



SmallExample . cs 



using System; 

using System. Threading; 

namespace SmallExample 

{ 

class ThreadClass 

{ 

public void DoTaskl() 

{ 

for( int i=0; i<100; i++ ) 

{ 

Console. WriteLine ("Threadl: j ob ( { } ) " , i ) ; 

Thread. Sleep (1) ; 
} 
} 

public void DoTask2() 

{ 

for( int i=0; i<100; i++ ) 

{ 

Console. WriteLine ("Thread2 : j ob ( { } ) " , i ) ; 
Thread. Sleep (1) ; 
} 
} 
} 

class MainThread 

{ 

static void Main ( string [ ] args) 

{ 

ThreadClass threadClass = new ThreadClass ( ) 
Thread threadl = new Thread ( 

new Threads tart (threadClass .DoTaskl) ) ; 
Thread thread2 = new Thread ( 

new ThreadStart (threadClass . DoTask2 ) ) ; 
threadl. Start ( ) ; 
thread2 .Start ( ) ; 
} 
} 



HnaBa 17. Mhotohmlukobo nporpaMnpaHe v\ CMHxpoHM3aumi 293 



KaK pa6oTM npnMepi>T? 

T/iaBHaTa HMWKa Ha npM/io>KeHMeTO 3anonBa M3irb/iHeHMe ot MeTOfla Main(...) 

Ha K/iaca MainThread. C"bC C"b3AaBaHeTO Ha ABa 06eKTa OT K/iac Thread, 

cb3AaBaMe ppe hmujkm. ripn cb3AaBaHeTO Ha HMWKa, noAaBaMe KaTO 
napaMeTtp MeTOAa, ot komto ta p,a 3anonHe M3irb/iHeHMeTO cm. B cnynayi, TOBa 

ca MeTOAMTe DoTasklO M DoTask2() Ha K/iaca ThreadClass. ThreadStart e 

Ae/ieraT, komto onpeAe/ia curHaTypaTa Ha MeTOAa - tajio Ha HMWKaTa, a 
MMeHHO - MeTOA 6e3 napaMeTpn, komto He Bptiua ctomhoct. 

C M3BMKBaHeTO Ha MeTOAa start o Ha ABeTe hmujkm, BCHKa ot tax 3anonBa p,a 
ce M3n"b/iHflBa m Btpxy KOH30JiaTa 3anonBa p,a ce M3nMCBa koh ao icbAe e 
CTMrHajia. npM CTapTMpaHe Ha npMMepa ce BM>KAa, ne necro ABeTe hmujkm 

npMKJ!K)4BaT n04TM eAHOBpeMeHHO, TbM KaTO M3ntJlHflBaT eKBMBajieHTeH KOA- 



I <^"D:\ book\Demo-2-Small-Example\bin\Debug\Demo-2-Small-Example.exe" 



Threadl:job(95) 
Thread2:job(95) 
Threadl:job(96) 
Thread2:job(96) 
Threadl:job(97) 
Thread2:job(97) 
Threadl:job(98) 
Thread2:job(98) 
Threadl:job(99) 
Thread2:job(99) 
Press any key to continue. 



GT 



I-*! 



K/iaci>T Thread 

B .NET Framework 3a M3n"bJiHeHMe Ha hmujkm ce M3noji3Ba K/iacvr system. 

Threading . Thread. T03M KJiaC npeAOCTaBfl CpyHKUMOHaJlHOCT 3a CTapTMpaHe M 

ynpaBJieHMe Ha hmujkm. HeKa pa3rjieAaMe HeroBMTe no-Ba>KHM njieHOBe: 

Thread (ThreadStart) 

C"b3AaBa MHCTaHUMfl. rioAaBa ce Reneraj c MeTOA, komto p,a ce M3n"bJiHM npM 
CTapTMpaHe. C"b3AaBaHeTO Ha HMUJKa Bene 6e AeMOHCTpMpaHO. 

Sleep(...) 

"npMcnMBa" TeKymaTa HMUJKa 3a yKa3aHMfl 6poM MMJiMceKyHAM. MeTOAtT e 
CTaTM^eH m 6jiOKMpa TeKymo M3irb/iHflBaHaTa HMUJKa. CjieA M3TMnaHeTO Ha 
3aAaAeHMfl MHTepBaji, ta npoA"b/i>KaBa pa6oTaTa cm. 



294 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Suspend() 

Ako HMiuKaTa pa6oTM, a npeycraHOBABa BpeMeHHO. Ako e npeycraHOBeHa, He 
ce c/iyHBa hmluo. 3a pa3/ii/iKa ot sieepo, npe3 komto hi/iluio npeycraHOBABa 
ce6e cm 3a HflKaicbB cpMKCupaH kiHTepBa/i ot BpeMe, suspendo npeycraHOBABa 
HMiuKa 3a Heonpefle/iei-io BpeMe v\ th ocraBa b TOBa cbcroflHkie ao 

M3BMKBaHeTO Ha Resume(), KOMTO nOflHOBflBa M3n"b/lHeHkieTO M. 

Resume() 

noAHOBflBa HMiuKa, koato e 6w/ia npeycTaHOBeHa (suspended). Ako HMiuKaTa 
pa6oTM, He npaBM hmluo. 




HeKopeKTHOTO M3no/i3BaHe Ha Suspend() v\ Resume() Mowe 
fla flOBefle ao CMHxpoHM3ai4MOHHM npo6/ieMM. Ako flBe hmqjkm 
B3anMHO ce naKaT 3a Resume(), hmto eflHa hams fla Mowe fla 
npofl~b/i>KM m me ce cmme flo "Mi>pTBa xBaTKa" (deadlock). 



Suspend() m Resume() - npMMep 

KaTO npuMep 3a suspendo v\ Resume o, me flaueM eAHO KpaTKO Windows 
Forms npki/ioweHkie. ripn crapTkipaHe to nenaTa uaueH TeKCT 6yKBa no 6yKBa 
etc 3a6aBAHe Me»<uy OTfle/iHkiTe 6yKBM. Bw3ya/iHO npH/ioxeHkieTO M3r/ie>Kua 
no c^eAHMfl Ha^MH: 



Suspend() ar, d ResumeQ Demo 



This application demonstrates Thread. Suspend!) and 
Thread. Resurine() rneth 



Suspend 



Resume 



HeKa pa3MeAaMe cbLuecmeHaTa nacr ot cope Koua Ha npuMepHOTO npw/io- 
>KeHne: 



delegate void CharParamDelegate (char aChar) ; 

private const string MESSAGE="This application demonstrates " 
"Thread. Suspend ( ) and Thread. Resume ( ) methods. " ; 

private Thread mThread; 

private System. Windows . Forms . TextBox textBoxMessage; 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 295 



private System. Windows . Forms . Button buttonResume; 
private System. Windows . Forms . Button buttonSuspend; 

private void MainForm_Load (ob j ect sender, System. EventArgs e) 

{ 

mThread = new Thread (new ThreadStart (this . PrintMessages )) ; 

mThread. IsBackground = true; 

mThread. Start ( ) ; 

SuspendThread ( ) ; 
} 

private void SuspendThread ( ) 

{ 

mThread . Suspend ( ) ; 

buttonSuspend. Enabled = false; 

buttonResume . Enabled = true; 
} 

private void ResumeThread ( ) 

{ 

mThread. Resume ( ) ; 

buttonSuspend. Enabled = true; 

buttonResume . Enabled = false; 
} 

private void AppendTextToTextBox (char aChar) 

{ 

textBoxMessage . AppendText (aChar . ToString ( ) ) ; 

} 

/// <summary> 

/// PrintMessages ( ) runs in a separate thread and slowly 

/// prints messages in the MainForm's text box. 

/// </summary> 

private void PrintMessages ( ) 

{ 

while (true) 

{ 

foreach (char letter in MESSAGE . ToCharArray () ) 

{ 

try 

{ 

this . Invoke (new CharParamDelegate ( 

AppendTextToTextBox), new obj ect []{ letter }) ; 

} 

catch (Exception) 

{ 

// Can not call Invoke ( ) bacause the form is closed. 

return; 
} 



296 flporpaMnpaHe 3a .NET Framework (tom 2) 



Thread. Sleep (50) ; 
} 
} 
} 

private void buttonSuspend_Click (ob j ect sender, 
System. EventArgs e) 

{ 

SuspendThread ( ) ; 

} 

private void buttonResume_Click (ob j ect sender, 
System. EventArgs e) 

{ 

ResumeThread ( ) ; 

} 



KaK pa6oTM npnMepi>T? 

ripn 3ape>KflaHe Ha cpopMaTa, ce nycKa eflHa HMUJKa, koato bbb BeneH urncb/i 
M3nncBa p,ap,eH tckct b TeKCTOBO no/ie cmmbo/i no cmmbo/i. ripeAM fla a 

nyCHeM, ycraHOBflBaMe B true CBOMCTBOTO V\ IsBackground, C KOeTO a 

nycKaMe bbb c|dohob pe>KMM. TaKa ta me cnpe aBTOMaTMUHO npn nprncnionBaHe 
Ha r/iaBHaTa HMUJKa, t. e. npn 3aTBap*iHeTO Ha cpopMaTa. flBaTa 6yTOHa bmiot 
ctOTBeTHO MeTOAMTe suspendo m Resume o m onpeAe/iHT b AaAeHkm momsht 
kom 6yTOH Aa 6"bAe no3BO/ieH. 

OTne^aTBaHeTO Ha BceKM ojp,eneu cmmbo/i MMHaBa npe3 MeTOAa Form. 
invoke(...). l~lo to3m Ha^MH noTpe6nTe^CKMflT MHTepcpewc Ha npn^OKeHneTO ce 
npoMeHfl eAMHCTBeHO ot r/iaBHaTa HMUJKa Ha npw/io>KeHkieTO. 



& 



He npoMeHUMTe rpacpMHHMH noTpe6MTe/iCKM uhrrepcpeiic ot 
BisHUJHa HMiiJKa. nocneflCTBmiTa MoraT fla 6i>flaT HenpeflCKa- 
3yeMn: 3a6aBnHe, "3aBMCBaHe", noBpefla Ha flai-n-m v\ flp. 



IsAlive 

Cbomctboto IsAlive MMa ctomhoct true, c/ieA KaTO HMiuKaTa ce CTapTupa. 
HopMa/iHOTO npnK^K)4BaHe Ha HMiuKaTa v\nv\ npeKpaTABaHeTO v\ nopaAH 
BtHiiJHa HaMeca npoMeHAT CTOMHOCTTa Ha IsAlive Ha false. noBene 
MHCpopMaunfl 3a cbCTOAHMflTa, npe3 komto eAHa HMiuKa npeMMHaBa, Aasa 

Threads tate. 

IsBackground 

Cbomctbo 3a neTeHe v\ 3annc. EAHa HMiuKa MO>Ke Aa e Ha npeAeH (foreground) 
v\nv\ 3aAeH (background) n/iaH. 



HnaBa 17. Mhotohmlukobo nporpaMnpaHe v\ CMHxpoHM3aumi 297 

KoraTO bcmukm hmujkm Ha npefleH n/iaH b eflMH npou.ec npMK/uonaT, tom 
npnK^K)4Ba. CLR BMKa Aborto 3a bcmukm hmujkm Ha 3afleH njiaH (M3BecTHM 

OLUe KaTO HMUJKM, pa60TeiUM B"bB c|dohob pe>KMM). 

IsThreadPoolThread 

Cbomctbo 3a neTeHe m 3anMC. MMa ctomhoct true, aKO HMUJKaTa npMHaAJie>KM 
Ha ynpaBJiflBaHMfl ny/i ot hmujkm, MHane e false. 

Name 

Cbomctbo 3a neTeHe m 3anMC Ha MMeTO. Bc^Ka HMUJKa b .NET Framework MO>Ke 
Aa MMa MMe. ToBa cbomctbo e no/ie3HO 3a MfleHTMCpMUMpaHeTO Ha hmujkmtc 
npM Ae6"brBaHe m M3Be>KflaHe Ha AHarHOCTMUHM cbo6meHMfl. 

Priority 

Cbomctbo 3a neTeHe m 3anMC Ha npMopMTeTa Ha HMUJKaTa. Bt3MO>KHMTe 

CTOMHOCTM ca Lowest, BelowNormal, Normal (no nOApa36MpaHe), 
AboveNormal M Highest. 

ThreadState 

Cbomctbo caMO 3a neTeHe. CbAtpwa cbCTO^HMeTO Ha HMUJKaTa. CbcroyiHMflTa, 
b komto eAHa HMUJKa Moxe p,a nonaAHe, me 6"bAaT noApo6HO o6acHeHM b 
cjieABamaTa TOUKa - 3acera MOweM p,a cuMTaMe, ne cbcroaHMeTO Ha eAHa 
HMUJKa onpeAejia HanpMMep p,anv\ TeKymo ta pa6oTM mjim M3naKBa. 

Abort() 

XBtpjlfl ThreadAbortException B M3BMKaHaTa HMUJKa, C KOeTO o6MKHOBeHO 

npeKpaTABa HMUJKaTa. npM onpeAejieHM yc/iOBMH, Aborto Mowe m p,a He 
npeKpaTM HMUJKaTa. ToBa me 6"bAe o6acHeHO b TOUKa 'TlpeKpaTflBaHe". 

Interrupt() 

AKO HMUJKaTa e B CbCTOflHMe WaitSleepJoin, XBtpjlfl Threadlnterrupted- 

Exception. HMUJKaTa MO>Ke Aa npMXBaHe TOBa M3KJiK>neHMe m p,a npoA"bJi>KM 
M3ntJiHeHMeTO cm. Ako ta He ro npMXBaHe, CLR ro npMXBama m npeKpaTHBa 
HMUJKaTa. 

Ako HMUJKaTa He e b ctCTOAHMe waitsieepjoin, M3BMKBaHeTO Ha 

Interrupt () He npaBM HMIUO. 

Join() 

M3BMKBamaTa HMUJKa M3naKBa, AOKaTO M3BMKaHaTa npMKJiK)4M. Mo>Ke Aa ce 
yKaxe TaMMayT. 

Join() - npHMep 

ToBa e no3HaTMAT hm npMMep smaiiExapie.es, ho TyK rjiaBHaTa HMUJKa cnMpa 
pa6oTaTa cm m npoAt/iwaBa eABa cjieA npMK/iionBaHeTO Ha APyrMTe ABe. 



298 



flporpaMnpaHe 3a .NET Framework (tom 2) 



static void Main ( string [ ] args) 

{ 

Console .WriteLine ( "Main thread started."); 
ThreadClass threadClass = new ThreadClass 
Thread threadl = new Thread ( 

new Threads tart (threadClass .DoTaskl) ) ; 
Thread thread2 = new Thread ( 

new ThreadStart (threadClass . DoTask2 ) ) ; 
threadl. Start ( ) ; 
thread2 .Start ( ) ; 
threadl . Join ( ) ; 
thread2 . Join ( ) ; 
Console .WriteLine ( "Main thread finished.") 



CrapTi/ipaHeTO Ha nporpaMaTa boam ro cneRHwa pe3y/iTaT: 



° : \ "D:\book\Demo-5-Small-Example-Plus-Join\bin\Debug\Demo-5-S. 



Thread2:job(95) 

Threadl: job (96) 

Thread2:job(96) 

Threadl: job (97) 

Thread2:job(97) 

Threadl: job (98) 

Thread2:job(98) 

Threadl: job (99) 

Thread2:job(99) 

Main thread finished. 

Press any key to continue 



t*L 



^inlx] 



Start() 

CrapTwpa noconeinaTa HMUJKa. Onepaukiyua He e 6/iOKkipama (Bptiua ynpaB/ie- 
HueTO BeAHara). ripn M3BMKBaHe Ha starto onepaunoHHaTa cwcreMa Cb3- 
AaBa HOBa HMUJKa v\ CMeHfl cbcroHHweTO v\ b Running, ripn onuT 3a noBTopHO 

CTapTkipaHe, ce XB"bp/lfl ThreadStateException. 



npMOpMTeT 

B noBeneTO 1/iMn/ieMeHTau.m/i Ha mhotohmiukoboct (multithreading), ce 
noAA"bp>Ka m npnopnTeT 3a HMUJKMTe. Ha 6a3aTa Ha npnopnTeTa, n/iaHkipoBnw- 
KtT (task scheduler) onpeAe/ia MHTepBa/ia ot BpeMe, komto cneABa p,a 6"bAe 
OTAe^eH Ha HMUJKaTa. OnepaunoHHaTa cwcreMa He e A-n"b>KHa p,a ce cbo6pa- 
3ABa c npeABapwTe/iHO 3aAaAeHna npnopnTeT, ho o6mkhob6ho ro npaBM. 



HnaBa 17. Mhotohmlukobo nporpaMnpaHe v\ CMHxpoHM3aumi 299 

npMopMTeT - npMMep 

me HanpaBMM HOBa npoMAHa b smaiiExampie.es. ripeflu fla CTapTupaMe 
ABeTe hmujkm ot r/iaBHaTa, me npoMeHMM npi/iopi/ueTa Ha eflHaTa. 



thread2 . Priority = ThreadPriority. Highest; 
threadl. Start ( ) ; 
thread2 .Start ( ) ; 



me ocTaBMM Ha mtTajenn caM fla HanpaBM cpaBHeHneTO Ha pe3y/iTaTMTe. 

CbCTOflHMSI 

KaKTO BMflflXMe b npuMepnTe ,qo MOMeHTa, BC^Ka HMUJKa MMHaBa npe3 
pa3^M4HM cbCTOAHMfl no BpeMe Ha CBoeTO ctiuecTByBaHe - HanpuMep fla 
M34aKBa mjim fla ce M3n"b/iHflBa. TeKymoTO cbcroaHMe Ha HMUJKaTa ce cbfltpwa 
b npoMeH^MBaTa Threadstate. EflHa HMiuKa MO>Ke fla ce HaMupa v\ b noBene 
ot eflHO cbCTOAHne Ha M36poeHMfl Tun Threadstate (noHewe tom MMa aTpn6yT 

FlagsAttribute, KOMTO n03BO/lflBa no6MTOBO KOM6MHMpaHe Ha CTOMHOCTMTe 

My). OTfle^HMTe cbcroflHMH ca cneflHkiTe: 

- unstarted - HMiuKaTa e cb3flafleHa, ho He e M3BMKaH MeTOfla starto. 
B MOMeHTa, b komto start ( ) 6"bfle M3BMKaH, HMiuKaTa npeMMHaBa B 
ctCTOflHue Running m no HMKaKtB Ha^MH He MO>Ke fla ce BtpHe o6paTHO 

B TOBa CbCTOflHMe. 

- Running - HMiuKaTa e CTapTupaHa, He e 6/iOKMpaHa v\ He onaKBa fla 

nO/iyUM ThreadAbortedException (M3K/lK>neHMe, KOeTO ce XB"bp/lfl npn 
M3BMKBaHe Ha MeTOfla Abort () ). 

- waitsieepjoin - HMiuKaTa e 6/iOKnpaHa, cnep, KaTO e 61/1/1 M3BMKaH 
HflKOM OT MeTOflMTe Wait() , Sleep ( ) kl/lkl Join(). 

- SuspendRequested - 3a HMUJKaTa e M3BMKaH MeTOfla Suspend(), HO BCe 

oiue He e npeycraHOBeHa, a ce M3naKBa 6e3onaceH MOMeHT TOBa fla ce 

M3B"bpilJM. 

- suspended- HMiuKaTa Bene e npeycraHOBeHa. 

- AbortRequested - M3BMKaH e MeTOfl"bT Abort ( ) 3a HMUJKaTa, HO Tfl Olfle 
He e nOJiynMJia M3K/lK>neHMeTO ThreadAbortException, KOeTO me ce 

onMTa fla n npeKpaTM. 

- Aborted - HMUJKaTa Bene e npeKpaTeHa KaTO eflHOBpeMeHHO c TOBa ce 

HaMMpa M B CbCTOflHMeTO Stopped. 

- stopRequested - ot HMUJKaTa e noMCKaHO fla npeKpaTM pa6oTaTa cm. 

- stopped - HMUJKaTa e npeKpaTeHa mjim cjiefl KaTO m e 6mji M3BMKaH 
MeTOfltT Abort o , mjim cjiefl KaTO e npMK/iionM/ia no ecTecTBeH HanMH. 



300 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Background - HMUJKaTa e B"bB CpOHOB pe>KMM. 



>KMBOT Ha HMUIKMTe 

CtBKynHOCTTa ot bcmukm ctCTOAHMfl, npe3 komto eAHa HMiuKa MO>Ke fla 
npeMMHe no BpeMe Ha CBoeTO cbmecrByBaHe, onpeAe/ifl HeMHua >KM3HeH 
ueiicbji. 3ano3HaxMe ce etc cbcroflHi/iflTa v\ MeTOflMTe, komto npeflM3BMKBaT 
npexoAMTe Me>KAy tax. Cera me ki/uocTpwpaMe Ka3aHOTO etc cneAHaTa cxeMa 
Ha CbcroflHkiflTa v\ npexoAMTe: 



StartQ 



IsAlive 



i 



I 



All Done 



I 



1 



SuspendQ SleepQ WaitXQ JoinQ AbortQ 



[interruptQ] 



J2_ 

[InterruptQ] 



[ ResumeQ ] [Expire time] I Notified 



Suspended WaitSleepJoin WaitSleepJoin WaitSleepJoin Stopped 



Aimed 

Thread 

Destroyed 



Thread 
Stopped 



npeKpaTflBaine Ha Humma 

EAHa HMiuKa MO>Ke p,a 6"bAe npeKpaTeHa 6e3yc/iOBHO npe3 M3BMKBaHe Ha 

MeTOAa Thread . Abort () . M3BMKBaHeTO Ha T03M MeTOA npeAM3BMKBa 
ThreadAbortedException B HMUJKaTa, 3a KOflTO e M3BMKaH. TOBa M3KJlK>neHMe 

e no-cneunajiHO, TbM KaTO cneA eBeHTyajiHaTa cm o6pa6oTKa b catch 6/iOKa 
Ha HMUJKaTa, to ce xBtp/ia noBTopHO ot CLR. C iiobtophoto xBtpji^He Ha 

M3KJlK)4eHMeTO, CLR M3ITb/lHflBa BCM4KM finally 6jlOKOBe M npMK/lKDUBa HMUJ- 
KaTa. ripeKpaTABaHeTO Ha HMUJKaTa Moxe p,a ce 3a6aBM HeonpeAejieHO At/iro, 
b 3aBMCMMOCT ot M34MCJieHMATa BtB finally, 3aTOBa ce npenoptuBa 
M3BMKBaHe Ha MeTOAa Join(), 3a p,a CMe CMrypHM, ne HMUJKaTa e npMKJiK)- 

4MJia. riOBTOpHOTO XBtp/lflHe Ha ThreadAbortedException MO>Ke Rd 6"bAe 
OTMeHeHO 4pe3 M3BMKBaHe Ha Thread. ResetAbortO B catch 6/lOKa Ha 

npeKpaTABaHaTa HMUJKa - ToraBa ta me npoA"bJi>KM M3n"bJiHeHMeTO cm. 

Ako HMUJKaTa HaB/ie3e b HeynpaB/iHBaH koa m ToraBa no/iyuM 3a*iBKa 3a 
npeKpaTABaHe, CLR "MapKMpa" HMUJKaTa m a M3naKBa p,a ce BtpHe b 
ynpaBJiflBaH koa. 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 301 



M3no^3BaHeTO Ha Thread.Aborto He e HaM-flo6pnflT Ha^MH fla kohtpo/im- 

paMe >KMBOTa Ha eflHa HklLUKa. ThreadAbortedException e M3K/lK)neHkie, KOe- 

to TpyflHO fla o6pa6oTeHO KopeKTHO. CbmecTByBaT mhoto no-yqo6Hi/i Mexa- 
hm3mm 3a CMHxpoHM3aunfl Me>Kfly HMiuKM, c komto me ce 3ano3HaeM no-flo/iy. 

ripeKpaTHBaHe Ha HMiuxa - npHMep 

IHe pa3LunpMM npuMepa, komto flafloxMe 3a MeTOflMTe suspendo v\ Resume(). 
nporpaMaTa othobo M3nncBa TeKCT cmmbo/i no cmmbo/i, ho MMaMe b"B3mo>khoct 
m fla npeKpaTMM HMUJKaTa bbb BceKM momsht. napa/ie/iHO c TOBa, ce c/ieflsiT 
cbCTOAHMflTa, npe3 komto MMHaBa HMUJKaTa. 



Priority, State, Suspend, Resume, Interrupt and Abort Demo 



This example illustrates how to use Threads tate. Suspend!), 
Resume!), Sleep!), I 



Suspend!) 



Resume() 



Interrupt!) 



Abort!) 




Thread state = [Background, WaitSleepJoin] 
Thread state = Background] 



EflMHCTBeHOTO, KoeTO npaBMM b MaBHaTa HMiuKa Ha npw/io>KeHi/ieTO, e fla 

nyCHeM flBe flpyrn HMIUKM - mBackgroundThread, KOflTO Lfle e OTrOBOpHa 3a 
M3nMCBaHeT0 Ha TeKCTa, V\ mStatusWatchThread, KOflTO Lfle C/ieflkl CbCTOflHM- 
eTO Ha mBackgroundThread. M flBeTe HMUJKM ce nyCKaT B"bB CpOHOB pe>KMM. 



private void MainForm_Load (ob j ect sender, System. EventArgs e) 

{ 

BackgroundThread backgroundThread = 

new BackgroundThread (this ) ; 
mBackgroundThread = new Thread (new 

ThreadStart (backgroundThread. DoDisplayMessage) ) ; 
mBackgroundThread. IsBackground = true; 
mBackgroundThread . Start ( ) ; 

StatusWatchThread statusWatchThread = 
new StatusWatchThread (this ) ; 



302 flporpaMnpaHe 3a .NET Framework (tom 2) 



mStatusWatchThread = new Thread (new 

ThreadStart ( statusWatchThread. DoStatusWatch) ) ; 
mStatusWatchThread. IsBackground = true; 
mStatusWatchThread. Priority = ThreadPriority. Highest; 
mStatusWatchThread. Start ( ) ; 
} 



B K/iaca Ha cpopMaTa ca npeABMAeHM v\ RBa MeTOfla, npe3 komto CTapTupaHMTe 
HMiuKM p,a npoMeHAT rpacpM4HMfl m MHTepcpewc. Eamhmat Ao6aBfl hob pefl b 
ListBox KOHTpo/ia, a flpyrnflT npucBOABa TeKcr Ha t6kctoboto no/ie. 



public void DisplayThreadState ( ) 

{ 

string newStateMsg = String . Format ( "Thread state = [{0}]", 
mBackgroundThread . ThreadState ) ; 

if (listBoxThreadState. Items . Count != 0) 

{ 

string oldStateMsg = (string) listBoxThreadState . Items [ 

listBoxThreadState . Items . Count- 1] ; 
if (newStateMsg != oldStateMsg) 

{ 

listBoxThreadState. Items .Add (newStateMsg) ; 

} 
} 
else 

{ 

listBoxThreadState. Items .Add (newStateMsg) ; 

} 

listBoxThreadState . Selectedlndex = 
listBoxThreadState . Items . Count- 1; 
} 

public void ShowMessagelnTextBox ( string aMessage) 

{ 

textBoxMessage . Text = aMessage; 

} 



HeTupnTe 6yTOHa b a^cho ot TeKCTOBcrro no/ie BMKaT cbOTBeTHi/ue MeTOflu Ha 

mBackgroundThread. HflMa p,a ASBaMe TflXHaTa MMn/ieMeHTaui/lfl. 

HnilJKaTa mBackgroundThread M3nMCBa TeKCTa 6yKBa no 6yKBa M o6pa6oTBa 
Bt3MO>KHMTe M3K/iK>neHi/m. Othobo me noA^epTaeM M3no^3BaHeTO Ha 
Form, invoke (...) ToraBa, KoraTO noTpe6nTe/iCKMfl MHTepcpewc Ha r/iaBHaTa 
HMiuKa ce npoMeHfl ot BtHWHa HMUJKa. 



delegate void StringDelegate ( string aString) ; 
public class BackgroundThread 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 303 



private const string MESSAGE = 

"This example illustrtates how to use ThreadState, Suspend ()"- 
", Resume (), Sleep () , Interrupt () , Abort () , Priority and "+ 
"IsBackground methods and properties of the System. Threading"- 
" .Thread class . " ; 

private MainForm mMainForm; 

public BackgroundThread (MainForm aMainForm) 

{ 

mMainForm = aMainForm; 



public void DoDisplayMessage 
{ 



try 
{ 



for (int len=l; len<=MESSAGE . Length; len++) 

{ 

try 

{ 

string msg = MESSAGE . Substring ( 0, len) ; 
mMainForm. Invoke ( new 

StringDelegate (mMainForm. ShowMessagelnTextBox) , 
new ob j ect [ ] {msg} ) ; 

} 

catch (Exception) 



{ 



} 



return; 



Thread. Sleep (100) ; 
} 

catch (ThreadlnterruptedException) 

MessageBox . Show ( "ThreadlnterruptedException" , "Info") ; 
return; 

catch (ThreadAbortException) 

MessageBox. Show ( "ThreadAbortException", "Info") ; 
finally 

MessageBox . Show ( "Finally block reached.", "Info"); 
MessageBox . Show ( "Thread finished by itself.", "Info"); 



304 nporpaMnpaHe 3a .NET Framework (tom 2) 

HnujKaTa mstatusWatchThread 10 n"bTM b ceKyHflaTa npoBepyiBa ctCTOflHueTO 

Ha HMUJKaTa mBackgroundThread M aKO HaCTbnkl npOMflHa, TO OTnenaTBa B 
ListBox KOHTpO/ia. 



delegate void VoidDelegate ( ) ; 

public class StatusWatchThread 

{ 

private MainForm mMainForm; 

public StatusWatchThread (MainForm aMainForm) 

{ 

mMainForm = aMainForm; 

} 

public void DoStatusWatch ( ) 

{ 

while (true) 

{ 

try 

{ 

mMainForm. Invoke ( 

new VoidDelegate (mMainForm. DisplayThreadState) ) ; 

} 

catch (Exception) 

{ 

return; 

} 

Thread. Sleep (100) ; 

} 
} 
} 



KaK pa6oTM npnMepi>T? 

HaTMCKaHeTO Ha 6vTOHMTe Suspend v\ Resume boam ro cbuxwn pe3y/iTaT, 
KaKTO m BtB Bene AaAeHi/m npuMep. KoraTO HaTMCHeM Abort, TOBa npeAH3BMK- 

Ba ThreadAbortException B mBackgroundThread. l/l3ITb/lHflBa ce CbOTBeTHMfl 

catch 6/iok, cnep, KoeTO CLR npeKpaT^Ba HMUJKaTa, M3n"b^HflBaMKM npeAH 
TOBa finally 6/iOKa. C"bo6iueHneTO, KoeTO hm Ka3Ba, ne HMUJKaTa e npi/iK/iio- 
nw/ia caMa, He ce noKa3Ba. 

HeKa b catch K/iay3aTa Ao6aBMM cneRHwn pep,: 



catch (ThreadAbortException) 

{ 

MessageBox. Show ( "ThreadAbortException", "Info") ; 

Thread. ResetAbort ( ) ; 
} 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 305 

Cera CLR He yHMiuo>KaBa HMUJKaTa, 3aT0Ba c/ieA o6pa6oTKaTa Ha i/i3K/iK>ne- 
HueTO m finally 6/iOKa, HMiuKaTa npoA"b/i>i<aBa v\ ce noi<a3Ba c"bo6iueHneTO 
"Thread finished by itself" ("HmuKaTa 3aBtpujn caMa."). 

Thread Local Storage (/iOKa/iHM 3a HiiuiKaTa namm) 

Thread Local Storage e KOHTeMHep, b komto BC^Ka HMUJKa MO>xe fla cbxpaH^Ba 
co6cTBeHM ashhu. BceKM e/ieMeHT ce cbAtpxa b cbOTBeTeH c/iot 3a ashhh, 

KOMTO ce npeACTaBfl OT 06eKT OT K/iaca System. LocalDataStoreSlot. 

HnujKaTa MO>Ke p,a cm cb3AaAe TaicbB c/iot c MeTOAHTe Thread. 

AllocateNamedDataSlot(...) kl/ll/l Thread. AllocateDataSlot () . AKO Cb3AaAe- 

hmjit c/iot e HanMeHOBaH, KtM Hero MO>xeM as ce o6p"biuaMe v\ no MMe, b 
npoTMBeH c/iynaw e AOCTtneH caMO no pecpepeHun^Ta, BtpHaTa npn HeroBOTO 
cb3AaBaHe. 

C/iot, cb3AaAeH ot AaAeHa HMUJKa, e HeAOcrbneH 3a ocraHa/iMTe hmujkm. 
flont/iHHTe/iHO, aKO b paMKMTe Ha eAMH npouec e cb3AaAeH c/iot c HsiKaKBO 
MMe m Apyra HMUJKa ce onuTa p,a cb3AaAe hob c/iot etc ctiuoTO MMe, me ce 

XB"bp/lM M3K/lK)4eHkie. 

Thread Local Storage - npiiMep 

3a Aa M/iK)CTpnpaMe pa6oTaTa c Thread Local Storage me AaAeM cnep,Hwn 
npuMep: 



class TLSDemo 

{ 

[STAThread] 

static void Main ( string [ ] args) 

{ 

Threads threads = new Threads ( ) ; 
Thread createDataThread = new Thread ( 

new ThreadStart (threads . CreateDataThread) ) ; 
createDataThread. Start ( ) ; 

Thread readDataThread = new Thread ( 

new ThreadStart (threads . ReadDataThread) ) ; 
readDataThread. Start ( ) ; 
readDataThread. Join ( ) ; 
createDataThread. Resume ( ) ; 
} 
} 

class Threads 

{ 

private const string SLOT_NAME = "temp slot"; 

public void CreateDataThread ( ) 

{ 

LocalDataStoreSlot slot = 



306 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Thread. AllocateNamedDataSlot (SL0T_NAME) ; 
string data = "DATA"; 
Thread. SetData (slot, data); 
Console. WriteLine ( "Threadl : writes data:({0}) into TLS,", 

"then suspends", data); 
Thread. CurrentThread. Suspend ( ) ; 
object oData = Thread. GetData ( slot ) ; 
Console .WriteLine ( "Threadl : data after tampering: {0}", 

oData) ; 



public void ReadDataThread i 



I 



LocalDataStoreSlot slot = 

Thread . GetNamedDataSlot ( SLOT_NAME ) ; 
Thread. SetData (slot, "TAMPERED DATA"); 
Console .WriteLine ( "Thread2 : tampers data in TLS, writes, 

"{0}", "TAMPERED DATA"); 



} 



KaK pa6oTM npnMepi>T? 

HnilJKaTa createDataThread Cb3AaBa HaMMeHOBaH C/10T 3a ASHHM M 3anMCBa 

HAKaKBM npuMepHM ashhh b Hero. M3BMKBaHeTO Ha suspendo no3BO/iHBa Ha 
readDataThread fla 3anonHe fla ce M3n"b^HABa. Tsi ce onuTBa fla 3anniue hobm 
AaHHM b Cbiunfl c/iot. TbM KaTO T03M c/iot o6ane npkiHafl/ie>Kki kbm Thread 
Local Storage Ha ntpBaTa HMUJKa, onurbT e HeycneweH v\ pe3y/iTarbT e 
c^eAHMAT: 



^"D:\book\Demo-7-Thread-Local-Storage\bin\Debug\Demo-7-Thread. 



'Threadl: writes data: (DATA) into TLS, then suspends 
Thread2: tampers data in TLS, writes TAMPERED DATA 
Threadl: data after tampering: DATA 
Press any key to continue^ 



^x 



Thread-Relative Static Fields (crammm no/ieTa, 

CB~bp3aHM C HMUJKaTa) 

CTaTM^HMTe no/ieTa, CB"bp3aHM c HMUJKaTa AOHflicbAe HanoAo6siBaT o6nKHOBe- 
HMTe CTaTM^HM H/ieH-npoMeH/ikiBki b eAHH K/iac Te ce AeK/iapwpaT no 
aHa/iorwuHO HanwH v\ TOBa, KoeTO vv\ OT/ii/maBa e, ne ca npnApy>KeHM ot 
aTpn6yTa [Threadstatic] . BcflKa crapTkipaHa HMUJKa no/i3Ba OTAe/iHa 
MHCTaHunfl Ha Ta3M n/ieH-npoMeH/iMBa. 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 307 



Thread-Relative Static Fields - npuMep 

3a fla ki/uocrpi/ipaMe pa6oTaTa c aTpn6yTa [Threadstatic] me M3no/i3BaMe 
cnep,Hwn npuMep: 



class Threadstatic 

{ 

[STAThread] 

static void Main ( string [ ] args) 

{ 

for( int i=0; i<10; i++ ) 

{ 

ThreadStart threadDelegate = new ThreadStart (new 

MyThread ( ) .DoTask) ; 
Thread currentThread = new Thread (threadDelegate) ; 
currentThread. Start ( ) ; 



class MyThread 

{ 

// This initialization is executed in the static 
// constructor, called by the main application thread 
[Threadstatic] 
public static int abc = 42; 

public void DoTask () 



{ 



) 



abc++; 

Console . WriteLine ( "abc={ } " , abc) ; 



} 



KoraTO T03M KparbK koa ce i/i3n"b/iHki, M3X0fl"bT e Ha nptB nor/iefl CTpaHeH: 

^Jnjxj 



c\ "D:\book\Demo-8-Thread-Relatiue-Static-Fields\bin\Debug 



abc=l 
abc=l 
abc=l 
abc=l 
abc=l 
abc=l 
abc=l 
abc=l 
abc=l 
Press any key to continue 



A 



308 



flporpaMnpaHe 3a .NET Framework (tom 2) 



KaK pa6oTM npnMep"t>T? 

TyK n/ieH-npoMeH/iMBaTa abc e MMeHHO thread-relative craTMUHO no/ie. 
flecerre CTapTupaHM hmujkm M3no/i3BaT AeceT pa3/iMHHM MHCTaHunn Ha abc. 
MHMui/ia/iki3auMflTa abc=42 o6ane i-mMa 3HaneHMe, 3amoTO KOHCTpyKToptT Ha 
MyThread ce M3n"b^HABa b r/iaBHaTa HMiuKa. H/ieH-npoMeH/iMBaTa c aTpn6yT 
[Threadstatic] ce MHMuna^M3Mpa othobo npn CTapTupaHeTO Ha HMUJKaTa v\ 
HeMHa rpn>Ka e fla ro MHMu.Ma/iM3Mpa KopeKTHO. 

Ako npeMaxHeM aTpn6yTa [Threadstatic], TOBa me 6"bfle eflHa o6nKHOBeHa 
CTaTM4Ha n/ieH-npoMeH/ikiBa, o6ma 3a bcmukm CTapTupaHM hmujkm: 



c\ "DAbookXDemo-S-Thread-Relatiue-Static-FieldsXbinXDebugVDemo... 1 I 




abc=43 




abc=47 i 




abc=48 r 




abc=49 




abc=50 




abc=51 




abc=52 P 




abc=44 




abc=45 




abc=46 




Press any key to continue^ "~ 




|<l 1 A/, 



Heyflo6cTBa npn pa6oTaTa c hmuikm 

He Tpa6Ba fla ce npeKa/isiBa c ynoTpe6aTa Ha hmujkm. YnpaBJieHMeTO Ha mhoto 
hmujkm m npeBKJiionBaHeTO ot eflHa HMUJKa kbm flpyra OTHeMa BpeMe, noHfl- 
Kora HaflBMUjaBauj.o BpeMeTO 3a M3n"bJiHeHMeTO mm. Ot Ta3M rjieflHa TOUKa, 3a 
rojiflM 6poM KpaTKM onepauMM e flo6pe fla ce M3noji3Ba nyji ot hmujkm (thread 
pool), a He mhoto Ha 6poM hmujkm, komto M3ntJiHABaT eflHOKpaTHO no eflHa 
Ma/iKa 3a,qana. 

riapajiejiHaTa pa6oTa Ha mhoto hmujkm e cbuxo TpyflHa 3a cjiefleHe. Ta boam m 
flo Heo6xoflMMOCTTa ot CMHxpoHM3au.Mfl, KOATO fla npeflOTBpaTM noBpe>KflaHe 
Ha flaHHMTe. 



npo6/ieMM npii pa6oTa c 0611411 flaHHM 

Pa6oTaTa c o6lum flaHHM ot hako/iko hmujkm eflHOBpeMeHHO KpMe b ce6e cm 
mhoto onacHOCTM, komto Tpa6Ba fla 6"bflaT npeflBMfleHM m npeflOTBpaTeHM npe3 
noflxoflamM nporpaMHM TexHMKM. TMnM4HM TaKMBa onacHOCTM ca noBpew- 
flaHeTO Ha flaHHM (race condition) m "MtpTBaTa xBaTKa" (deadlock). 



HnaBa 17. Mhotohmlukobo nporpaMnpaHe v\ CMHxpoHM3aumi 309 

noBpe>KAaHe Ha ashhm 

flaHHM, komto ca o6lum 3a flBe mjim noBene hmujkm, ziecHO MoraT fla 6"bflaT 
noBpeAeHM, aKO flocrbirbT ao tax He e cnHxpoHM3npaH. KoraTO flBe hmujkm 
nMiuaT eflHOBpeMeHHO b naMeT, 3aflejieHa 3a HflKaKBa npoMeHJiMBa, pe3yjua- 
TMTe ca HenpeflBMflMMM. To3m npo6jieM e M3BecTeH ioto "noBpe>KflaHe Ha 
flaHHM" mjim "cbcre3aHMe" (race condition). 

noBpe>KAaHe Ha ashhm - npHMep 

3a npMMep me flafleM eflMH KJiac, komto npeflcraB/iflBa 6aHKOBa CMeTKa. 
KoraTO flBe hmujkm eflHOBpeMeHHO TerjuiT napM ot Ta3M 6aHKOBa CMeTKa, 
ocTaTbKtT b Hea CTaBa HeKopeKTeH. 



class Bank 

{ 

static void Main ( string [ ] args) 

{ 

Account ace = new Account ( ) ; 

acc.mBalance = 500; 

Console .WriteLine ( "Account balance = {0}", acc.mBalance) 

Thread userl = new Thread ( new ThreadStart 
(acc.WithdrawlOO) ) ; 

Thread user2 = new Thread ( new ThreadStart 
(acc.WithdrawlOO) ) ; 

userl . Start ( ) ; 

user2 . Start ( ) ; 

userl . Join ( ) ; 

user2 . Join ( ) ; 

Console .WriteLine ( "Account balance = {0}", acc.mBalance) 
} 
} 

class Account 

{ 

public int mBalance; 

public void WithdrawlOO ( ) 

{ 

int oldBalance = mBalance; 

Console .WriteLine ( "Withdrawing 100 . . . " ) ; 

// Simulate some delay during the processing 

Thread. Sleep (100) ; 

int newBalance = oldBalance - 100; 

mBalance = newBalance; 
} 



C/iefl M3n"bJiHeHMeTO Ha nporpaMaTa, ocraTbKvr no CMeTKaTa He e 300, a 400: 



310 flporpaMnpaHe 3a .NET Framework (tom 2) 



c\ "D:\book\Demo-9-Race-Conditions\bin\Debug\Demo-9-Race-Con. 



Recount balance = 500 
Withdrawing 100. . . 
Withdrawing 100. . . 
Recount balance = 400 
Press any key to continue 



_ln|x| 




±. 1 










â–º 


/a 



Pe3y/iTarbT e M3HeHaflBam, 3amoTO ABeTe hmujkm eflHOBpeMeHHO npoMeHAT 
eflHa m ch>ma 'H/ieH-npoMeH/iMBa. rio/iyneHaTa rpeujKa e BpeMe3aBMCMMa - aKO 
npucnuM HMiuKMTe 3a flpyr MHTepBa/i ot BpeMe, v\nv\ ntK He vv\ npucnuM 
M3o6iuo, pe3y^TarbT MO>Ke m fla e BepeH. 

M-bpTBa xBaTKa (deadlock) 

flpyr onaceH CMHxpoHH3aunoHeH npo6/ieM e T.Hap. "MtpTBa XBaTKa" 
(deadlock). ToBa e cbCTOAHne, npn KoeTO flBe hmujkm B3aMMHO ce naKaT 3a 
ocBo6o>KAaBaHe Ha 3aeTM ot tax pecypcM. HanpMMep hmluio A M3noji3Ba 
pecypca X m 6m ro ocBo6oflM/ia npM B"b3MO>KHOCT fla 3aeMe pecypc Y. Hmluio B, 
ot CBOfl CTpaHa, M3noji3Ba Y m naKa X. rio/iynaBa ce "yBMCBaHe", npM KoeTO 
hmto eflHa ot ABeTe hmujkm He Moxe fla npofl"b/i>KM. 

TMnM^HO 3a CMTyauMATa "MtpTBa XBaTKa" e, ne He MO>Ke fla ce no/iyuM, aKO 
cnoAejieHMAT pecypc e caMO eAMH. Ako pecypcMTe ca hhkojiko, "MtpTBaTa 
XBaTKa" MO>Ke fla ce M36erHe, aKO Te ce B3MMaT b eflHaKbB pefl ot pa3JiM4HMTe 
hmujkm. HanpMMep aKO b npeflMWHMfl npMMep HMUJKa A ntpBO B3MMa pecypca 
X, a cjiefl TOBa Y m HMUJKa B ce onMTBa fla B3eMe b cbmMfl peA ntpBO pecypc 
X, a cjiefl TOBa pecypc Y, He MO>Ke fla ce no/iyuM 6e3KpaMHO naKaHe. Mjim 
HMUJKaTa me B3eMe flBaTa pecypca, mjim HMUJKaTa B - cnopefl TOBa koa e 6M/ia 
ntpBa. 

CliHXpOHM3ai4M51 

B Kpaa Ha npeflMUJHaTa TOUKa noKa3axMe ao KaKBO MO>Ke fla flOBefle eflHOBpe- 
MeHHMAT flocTbn flo o6uj.m pecypcM. Ue/iTa Ha CMHxpoHM3auMflTa e TOBa fla He 
ce flonycKa. TyK me pa3r/ieflaMe hakom CTpaTerMM 3a CMHxpoHM3auMfl. 



Haii-flo6poTO peuieHiie 3a o6mnTe flai-mii 

B MfleajiHMfl BapMaHT, m3o6uj.o HAMaMe cno,qe/ieHM flaHHM. Ako flaHHMTe b 
o6eKTMTe ca KancyjiMpaHM TaKa, ne fla He e Hy>KHO fla 6"bflaT cnofle/i^HM 
Me>Kfly flBe m noBene hmujkm, npo6/ieMMTe c o6uj.MTe flaHHM aBTOMaTMUHO 
OTnaflaT. rioHAKora o6ane e Ha/io>KMTe/iHO fla cnofle/isiMe flaHHM m b TaKbB 
c/iynaki Tpa6Ba fla M3noji3BaMe MexaHM3MMTe 3a CMHxpoHM3auMfl, komto .NET 
Framework npefl/iara. 



HnaBa 17. Mhotohmlukobo nporpaMnpaHe v\ CMHxpoHM3aumi 311 

CnHxpoHM3npaHM "naca>Kii" KOfl (synchronized code 
regions) 

TyK ce CMHxpoHM3npaT caMO ojp,enuv\ yuacrbUM ot KOfla - Te3M, komto ca 
Pmckobm. KpnTM^Ha ceKunfl HapMnaMe yuacrbK ot KOAa, flo komto He Tpa6Ba 
Aa 6"bAe AonycKaH eAHOBpeMeHeH Aocrbn. 3a rapaHTupaHe 6e3onaceH Aocrbn 
AO KpnTM4Ha ceKunfl MO>Ke Aa M3no/i3BaMe K/iionoBaTa AyMa lock v\nv\ K/iaca 

Monitor. 



lock (ob j ) 

{ 

// code 

} 



v\nv\ 



Monitor . Enter (obj ) ; 
try 

{ 

// code 

} 
finally 

{ 

Monitor .Exit (obj ) ; 

} 



06eKTbT obj Tpa6Ba Aa 6"bAe ot pecpepeHTeH Tun (aKO He e, ce M3B"bpujBa 
onaKOBaHe, KoeTO me AOBeAe ao 6e3pe3y/iTaTHO 3aK/iK>nBaHe Ha pa3/ii/meH 
HOBOCb3AaAeH o6eKT npn bcako B/iM3aHe b ceKUMHTa). Ha mhctoto Ha obj Aa 
necro ce no/i3Ba this mjim n/ieH-npoMeH/iMBa, AecpMHupaHa cneuMa/iHO 3a 
ue/iTa. B cnynai/iTe, KoraTO MCKaMe Aa 3aiunTMM craTkinHa n/ieH-npoMeH/iMBa 
v\nv\ KpnTM^HaTa ceKunfl e b ta/ioto Ha craTMneH MeTOA, obj MO>Ke Aa 6"bAe 

typeof (class) . 

Pa6oTa c kpmtmhhm ceKD.nn - npuMep 

Ot MaBHaTa HMUJKa Ha nporpaMaTa me nycHeM ABe Apyrn hmujkm, crapTM- 
paiun ot eAMH v\ cbux MeTOA- KoraTO eAHaTa HMUJKa 3anonHe M3iTb/iHeHMe, 
ApyraTa me naKa, 3aiuoTO o6pa6oTKaTa Ha ABeTe hmujkm e b KpMTMUHa ceKUMa 

M AOCTblTbT AO Hefl e CMHXpOHM3MpaH. 



public class MonitorEnterExitDemo 

{ 

private int mCounter = 0; 

public void CriticalSection ( ) 

{ 

Monitor .Enter (this ) ; 
try 



312 flporpaMnpaHe 3a .NET Framework (tom 2) 



} 



{ 

Console . WriteLine ( "Entering { } . " , 
Thread. CurrentThread. Name) ; 

for(int i = 1; i <= 5; i++) 

{ 

mCounter++; 

Console .WriteLine ( " { } : count er={ 1 } " , 
Thread. CurrentThread. Name, mCounter) ; 

Thread. Sleep (500) ; 
} 

Console .WriteLine ( "Exiting { } . " , 
Thread. CurrentThread. Name) ; 

} 
finally 

{ 

Monitor .Exit (this) ; 

} 



} 



public static void Main ( ) 

{ 

MonitorEnterExitDemo demo = new MonitorEnterExitDemo i 

Thread threadl = new Thread (new 

ThreadStart (demo . CriticalSection) ) ; 
threadl. Name = "Threadl"; 
threadl. Start ( ) ; 

Thread thread2 = new Thread (new 

ThreadStart (demo . CriticalSection) ) ; 
thread2.Name = "Thread2"; 
thread2 .Start ( ) ; 
} 



KoraTO M3n"b^HMM nporpaMaTa, BM>KAaMe, 4e BTopaTa HMUJKa Bnv\3a b kpmtm4- 
HaTa cm ceKunfl eflBa c^efl ioto ntpBaTa e npuK^KD^n^a: 



HnaBa 17. Mhotohmlukobo nporpaMnpaHe v\ CMHxpoHM3aumi 313 



'-â– â– â– â–  "D:\Projects\MonitorDemo\bi n\Debug\MonitorD6mo.exe" 



Entering Threadl. 
ihreadl : counter=l 
Threadl: counter=2 
Threadl: counter=3 
Threadl: counter=4 
Threadl: counter=5 
Exiting Threadl. 
Entering Thread2. 
Thread2 : counter=6 
Thread2 : counter=7 
Thread2 : counter=8 
Thread2 : counter=9 
Thread2 : counter=10 
Exiting Thread2 . 
Press any key to continue. 



iL 



5[ 



KaK pa6oTM npnMepi>T? 

M3pa3"bT Monitor. Enter (this) nOCTaBfl Hana/IOTO Ha KpMTMUHaTa CeKUMfl. 

HnujKaTa, koato ntpBa ro M3irb/iHM (b c/iyna*i, TOBa e threadl), "3aK/iK>nBa" 
KOfla cnep, to3m pefl ,qo ocBo6o>KflaBaHeTO Ha MOHMTopa c Monitor. 
Exit (this) ; BtB finally K/iay3aTa. EflBa ToraBa, cnep, KaTO KpnTM^HaTa 
ceKunfl e "0TK/iK>neHa", APyraTa HMUJKa MO>Ke fla B/ie3e b Hea. 

CbLuwflT ecbeKT MO>Ke fla ce nocTurHe v\ c K/iionoBaTa flyMa lock. 

me ocTaBMM Ha nMTaTe/i*i caM fla HanpaBM cpaBHeHneTO npn /11/inca Ha cmh- 

XpOHM3ai4Mfl. 

MeTOAMTe Wait(...) h Pulse(...) 

Wait (object) M Pulse (object) ca flBa OT Ba>KHMTe MeTOflM Ha K/iaca 
Monitor. M3BMKBaHeTO Ha Monitor. Wait(object) OCB06o>KflaBa MOHMTOpa Ha 

noconeHkifl o6eKT v\ 6/iOKMpa BMKaiuaTa HMUJKa, flOKaTO He cm BtpHe 
MOHMTopa. ToBa 6/iOKMpaHe Tpae ao M3BMKBaHeTO Ha Monitor. Pulse (object) 
ot flpyra HMUJKa. ripn 6/iOKMpaHeTO Ha HMUJKaTa Moxe fla ce yKa>Ke TaMMayT. 
Ako TaKtB HflMa, HMiuKaTa MO>Ke fla ocraHe 6/iOKMpaHa 3aBMHarn, b c/iynaM, 
ne Pulse (...) He 6"bfle M3BMKaH. B to3m MHTepBa/i ot BpeMe, HMiuKaTa ctom b 
onaujKaTa Ha naKamki hmujkm. 

MeTOfltT Monitor. Pulse (...) MO>xe fla ce M3BMKa caMO ot TeKyiuna 
npMTexaTe^ Ha MOHMTopa Ha o6eKTa - T.e. ot KpwTi/mHa ceKuna. HnujKaTa 
npeMMHaBa b onawKaTa Ha hmujkm, totobm fla ce M3irb/iHflBaT m fla B3eMaT 

MOHMTOpa. 

K"bM Te3M flBa MeTOfla MO>KeM fla npMUMC/lMM M Monitor. PulseAll (...) , KOMTO 

MMa fleMCTBMe, aHa/iorMUHO Ha Pulse (...), ho 3a ua/iaTa onaujKa ot naKam.M 

HMUJKM. 



314 nporpaMnpaHe 3a .NET Framework (tom 2) 

Wait(...) m Pulse(...) - npimep 

fleMOHCTpaunflTa ki/uocrpkipa CMHxpoHM3aunfl Me>Kfly HMiuKM npe3 3acnnBaHe M 

Cb6y>KflaHe (Monitor.Wait(...) M Monitor . Pulse (...) ). B npMMepa ce C"b3AaBaT 

ABe HMiuKM, BCAKa ot komto M3BtpujBa HAKaKBa pa6oTa, cb6y>Kfla APyraTa v\ 
3acnnBa. 



public class WaitPulse 

{ 

private object mSync; 
private string mName; 

public WaitPulse ( string aName, object aSync) 

{ 

mName = aName ; 

mSync = aSync; 
} 

public void DoJob ( ) 

{ 

lock (mSync) 

{ 

Console. WriteLine ("{ 0} : Start", mName); 

Console .WriteLine ("{ } : Pulsing...", mName); 
Monitor . Pulse (mSync) ; 

for(int i = 1; i <= 3; i++) 

{ 

Console .WriteLine ("{ } : Waiting...", mName); 
Monitor. Wait (mSync) ; 

Console .WriteLine ("{ } : WokeUp", mName); 

Console .WriteLine ("{ } : Do some work...", mName); 

Thread. Sleep (1000) ; 

Console .WriteLine ("{ } : Pulsing...", mName); 
Monitor . Pulse (mSync) ; 

} 

Console .WriteLine ("{ } : Exiting", mName); 

} 
} 
} 

public class WaitPulseDemo 

{ 

public static void Main (String [ ] args) 

{ 

object sync = new object (); 

WaitPulse wpl = new WaitPulse ( "WaitPulsel" , sync); 



HnaBa 17. Mhotohmlukobo nporpaMnpaHe v\ CMHxpoHM3aumi 315 



Thread threadl = 


= new Thread (new ThreadStart (wpl . DoJob) ) ; 


threadl. Start ( ) , 




WaitPulse wp2 = 


new WaitPulse ( "WaitPulse2 " , sync); 


Thread thread2 = 


= new Thread (new ThreadStart (wp2 . Do Job) ) ; 


thread2 .Start ( ) , 
} 
} 





KaK pa6oTM npnMepi>T? 

ripn CTapTupaHe, cb3AaBaMe o6eKTa sync. KoraTO cb3AaBaMe HMUJKMTe, mm 
npeAaBaMe to3m o6eKT v\ cnHxpoHM3aunflTa ce M3B"bpujBa no Hero. Bc^Ka ot 

HMUJKMTe M3BMKBa Monitor . Pulse (mSync) , C KOeTO Cb6y>Kfla flpyraTa HMUJKa, 

aKO Tfl e 3acna/ia. Cnep, TOBa, b umcb/i, BC^Ka ot HMUJKMTe 3acnnBa, aoioto He 
6"bfle cb6yAeHa ot APyraTa, Btpiun HflKaKBa pa6oTa v\ cb6y>KAa APyraTa. 

B pe3y/iTaT, ABeTe hmujkm ce peAyBaT - AOKaTO eAHaTa pa6oTM, APyraTa cnn. 



^ "D:\book\Demo-12-Interclass-Synchronization\bin\Debug\De 



WaitPulse2: Waiting... 
WaitPulsel: WokeLIp 



WaitPulsel: WokeLIp 

WaitPulsel: Do some work. 

WaitPulsel: Pulsing... 

WaitPulsel: Exiting 

WaitPulse2: WokeLIp 

WaitPulse2: Do some work. 

WaitPulse2: Pulsing... 

WaitPulsel: Exiting 
Press any key to continue 



_|n| xj 




±. 1 








â– w 1 


jj 





CnHxpoHM3npaHM kohtckctii (Synchronized Contexts) 

ToBa e CMHxpoHM3aunfl Ha hmbo K/iac. 3a ue/iTa, K/iacbT Tpa6Ba p,a HacneAflBa 
contextBoundobject. 06eKTMTe ot TaicbB K/iac onepupaT b eAMH KOHTeKcra, 
komto e nacr ot AOMeMHa Ha npn/iOKeHneTO. Ako 3a TaicbB K/iac M3no/i3BaMe 

aTpn6yTa SynchronizationAttribute, HerOBMTe MeTOAM ca HMUJKOBO o6e3- 

onaceHM, t. e. ABa mjim noBene MeTOAa He MoraT p,a 6"bAaT M3n"b/iH*iBaHM eAHO- 
BpeMeHHO ot pa3/ii/mHki hmujkm. CTaTM^HMTe 4JieHOBe o6ane He ca npeAna- 

3eHM. 

CMHxpoHM3MpaHeTO e Ha hmbo KJiac - He MOxeM p,a noAAtpxaMe cmhxpohm- 
3auMfl no OTHOiueHMe Ha H^KaKbB yuacrbK ot KOAa. 



316 nporpaMnpaHe 3a .NET Framework (tom 2) 

CMHXpOHM3MpaH KOHTCKCT - npMMep 

K/iacbT cbo e HacneAHkiK Ha contextBoundobject m MMa aTpn6yT 

[SynchronizationAttribute]. fl,Bd HerOBM MeTOAa C/iy>KaT 3a Tfl/10 Ha o6lUO 
6 hmujkm. Eamhmat MeTOA e no-6tp3 ot Apyrwfl, KaTO TOBa He B/ikme Btpxy 

CMHXpOHM3ai4MflTa. 



class Starter 

{ 

static void Main ( ) 

{ 

CBO syncClass = new CBO ( ) ; 

Console .WriteLine ( "Main thread starts 6 threads :\n" 
"3 doing Jobl and 3 doing Job2.\n\n" + 
"Tasks should execute consequently . \n" ) ; 

for (int i=0; i<6; i++) 

{ 

Thread t; 
iff i%2==0 ) 

t = new Thread ( new ThreadStart ( 
syncClass . DoSomeTaskl ) ) ; 
else 

t = new Thread ( new ThreadStart ( 
syncClass . DoSomeTask2 ) ) ; 
t. Start ( ) ; 
} 
} 
} 

[SynchronizationAttribute] 
class CBO : ContextBoundobject 

{ 

public void DoSomeTaskl ( ) 

{ 

Console .WriteLine ( "Jobl started. " ) ; 

Thread. Sleep (2 000) ; 

Console .WriteLine ( "Jobl finished. \n" ) ; 
} 

public void DoSomeTask2 ( ) 

{ 

Console .WriteLine ( " Job2 started. " ) ; 

Thread. Sleep (1500) ; 

Console .WriteLine ( " Job2 finished. \n" ) ; 
} 



Pe3y/iTarbT e cnep,Hv\f\j: 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 317 



c\"D:\book\ Demo- 10-Context-Bound-Obiects\bin\Debug\ Demo- 10- 



Main thread starts 6 threads: 
3 doing Jobl and 3 doing Job2. 

Tasks should execute consequently. 

Jobl started. 
Jobl finished. 

Job2 started. 
Job2 finished. 



^Jnjxj 



B flafleH MOMeHT, He noBene ot ej\v\H MeTOfl Ha K/iaca MO>Ke fla ce ki3n"b/iH*iBa m 
HMiuKMTe ce M3naKBaT eAHa Apyra. 



MethodlmplAttribute 



MethodimpiAttribute e aTpn6yT, no3BO/iflBam "3aK/iK>nBaHe" Ha nan MeTOfl, 
He3aBMCMMO ot TOBa fla/ii/i MeTOfltT e craTi/meH v\nv\ He. M3no/i3Ba ce no 
c/ieAHi/m Hani/m: 



[Methodlmpl (MethodlmplOptions . Synchronized) 
public void DoSomeTask ( ) 
{ 



// Some code 



} 



no to3m Hani/iH MO>xe Aa cnHxpoHM3npaMe Aocrtna ao DoSomeTask o . 
AHa/iorwueH me 6"bAe pe3y/iTarbT, aKO ki3no/i3BaMe K/iK>noBaTa AyMa lock 
Btpxy KOAa Ha ue/ii/ifl MeTOA- 

HeynpaB/iflBaHa cnHxpoHM3auiMq - K/iacbT WaitHandle 

CnHxpoHM3aunflTa, koato pa3r/ieAaxMe ao MOMeHTa, 6eiue ynpaB/iHBaHa 
CMHxpoHM3aunfl. Bkmarki, KoraTO ki3no/i3BaMe K/iK>noBaTa AyMa lock, K/iaca 
Monitor v\i\v\ aTpn6yTM 3a cnHxpoHM3aunfl, TOBa e cnHxpoHM3aunfl, kohtpo/im- 
paHa ot CLR. 

B Ta3M touio me cne3eM Ha Ma/iKO no-HMCKO hmbo, 3a Aa pa3r/ieAaMe 
HeynpaB/iflBaHaTa cnHxpoHM3aunfl (unmanaged synchronization), ripn Hea ce 
M3no^3BaT o6eKTM Ha onepaunoHHaTa ci/icreMa. 

HeynpaB^ABaHaTa ci/iHxpoHki3aui/m b .NET Framework e npeAcraBeHa ot 

6a30BMfl K/iac WaitHandle M HerOBMTe Hac/ieAHklUkl - Mutex, AutoResetEvent 
M ManualResetEvent. 06eKTMTe OT Te3M K/iaCOBe Ca npMMMTMBM 3a cnHxpo- 

HM3aunfl Ha onepaunoHHaTa ci/icreMa. MeTOAHTe Ha WaitHandle ce M3no/i3BaT 



318 nporpaMnpaHe 3a .NET Framework (tom 2) 

3a M3naKBaHeTO Ha ch6v\Twn. CnHxpoHM3aunflTa ce ocHOBaBa Ha "cwrHa/iki- 
3npaHeTo" Ha Te3M cb6v\Tv\s\. 

flo6pe e fla ce BHMMaBa c yncrrpe6aTa Ha HeynpaB/iflBaHa cnHxpoHM3aunfl. 
He3aBMCMMO, ne Ha momshtm ta flaBa no-ro/ieMki b"B3mo>khoctm ot 
ynpaB^ABaHaTa, HeMHaTa 3aBMCMMOCT ot onepaunoHHaTa cwcreMa npaBM 
npeHOCMMOCTTa Ha KOfla no-TpyqHa. OcBeH TOBa, K/iacbT Monitor i/i3no/i3Ba 
no-ecpeKTMBHO cucTeMHMTe pecypcu. 

WaitHandle - no-Ba>KHM mctoam 

Eto hakom ot HaM-necro M3no^3BaHMTe MeTOAM Ha K/iaca WaitHandle: 

static bool WaitAny (WaitHandle [] ) 
- static bool WaitAll (WaitHandle [ ] ) 
virtual bool WaitOne() 

TpnTe M36poeHM MeTOfla ca npeflecpuHnpaHM b K/iaca WaitHandle, ho 3a fla 
o6achmm flewcTBueTO mm me ce cnpeM caMO Ha to3m TexeH 6a30B cpopMaT. 

waitAny(...) 6/iOKwpa TeKymaTa HMUJKa ao no/iynaBaHeTO Ha ntpBua cwrHa/i ot 
MacuB ot WaitHandle o6eKTM, a WaitAll (...) - flo no/iy^aBaHe Ha curHa/i ot 
bcm4km o6eKTM. Te3M MeTOflu ca 6e3 aHa/ior npn ynpaB/iHBaHaTa cmhxpohm- 

3ai4l/lfl, Hanp. npe3 K/iaca Monitor. 

3a pa3/im<a ot ntpBMTe flBa MeTOfla, komto ca craTi/mHki, waitoneo e MeTOfl 
Ha MHCTaHUMATa. KoraTO ce npeflecpMHupa b K/iac, HacneflHkiK Ha WaitHandle, 
tom 6/iOKwpa TeKyiuaTa HMUJKa, flOKaTO TeKyiuna WaitHandle o6eKT no/iyni/i 
cwrHa/i. B c^eflBaiuaTa TOUKa me fleMOHcrpwpaMe ynoTpe6aTa Ha to3m MeTOfl 
3a K/iaca Mutex. 

K/iaci>T Mutex 

K/iacbT Mutex e Hac^eflHMK Ha WaitHandle m npeflcraB/isiBa "MyTeKc" - 
npuMMTMB 3a CMHxpoHM3aunfl Ha onepauwoHHaTa ci/icreMa. Tom Hanoflo6flBa 
Monitor, ho He e CB"bp3aH c o6eKT. CaMaTa flyMa "MyTeKc" npoi/i3/iM3a ot 
aHMMMCKMfl TepMMH 3a B3anMHO ki3K/iK>nBaHe (mutual exclusion). 

KoraTO eflHa HMUJKa npnflo6ne MyTeKca, flpyra MO>Ke fla ro B3eMe eflBa c/iefl 
KaTO ntpBaTa ro ocBo6ofln. Bc^Ka HMUJKa MO>Ke fla noncKa MyTeKca c 
Mutex.waitone() m cnep, KaTO npwK/iionki pa6oTaTa cm, fla ro ocBo6ofln c 

Mutex . ReleaseMutex () . BeflH"b>K npnfl06w/ia MyTeKC npe3 M3BMKBaHe Ha 

waitoneo, HMiuKaTa MO>Ke fla M3BMKa ctiunfl MeTOfl npon3BO/ieH 6pow ntTM, 
KaTO npofl"b/i>KaBa HopMa/iHOTO cm i/i3iTb/iHeHkie. 3a fla 6"bfle ocBo6ofleH 
MyTeKca o6ane, ReleaseMutex ( ) Tpa6Ba fla 6"bfle M3BMKaH cbiflkifl 6poki ntTM. 

MeTOflMTe WaitAll (...) V\ WaitAny(...) , fleCpMHMpaHM B 6a30BMfl K/iac 

WaitHandle, TyK MoraT ycneujHO fla ce npw/iaraT. 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 319 

CMHxpoHM3auMn c Mutex - npnMep 

C/ieflBaiunflT KOfl peiuaBa no3HaTaTa 3aflana 3a cnHxpoHM3npaH flocrbn ro 
AafleHa KpnTM^Ha ceKuna, ho npe3 Mutex o6eKT. 



class MutexMain 

{ 

const int THREAD_COUNT = 5; 

static void Main ( string [ ] args) 

{ 

Mutex commonMutex = new Mutex ( ) ; 

Thread [] demoThreads = new Thread [THREAD_COUNT] ; 

for (int i=0; i<THREAD_COUNT; i++) 

{ 

MutexThread mutexThread = new MutexThread (commonMutex) ; 

demoThreads [i] = new Thread ( 

new ThreadStart (mutexThread. Perf ormSomeTask) ) ; 

demoThreads [ i ] . Start ( ) ; 
} 

foreach (Thread thread in demoThreads) 

{ 

thread. Join ( ) ; 

} 

Console. WriteLine ( "Main Thread Exits"); 
} 
} 

class MutexThread 

{ 

Mutex mMutex; 

public MutexThread (Mutex aMutex) 

{ 

mMutex = aMutex; 

} 

public void Perf ormSomeTask ( ) 

{ 

mMutex . WaitOne ( ) ; 

Thread. Sleep (200) ; 

Console .WriteLine ( "\nStarting some job..."); 

for (int i=0; i<10; i++) 

{ 

Thread. Sleep (100) ; 
Console. Write (" | ") ; 

} 

Console .WriteLine ( "\nJob finished. " ) ; 

mMutex . ReleaseMutex ( ) ; 



320 



flporpaMnpaHe 3a .NET Framework (tom 2) 



KaK pa6oTii npnMep"t>T? 

Ha BCM4KM HMiuKM, komto cb3AaBaMe b MeTOAa Main (...), noAaBaMe ep,v\H 

06eKT OT K/iac Mutex. TaKa BCMUKM HMIUKM OT MaCMBa demoThreads pa60TflT c 

eAMH m cbiu MyTeKC. Bcmukm hmujkm MMaT 3a o6pa6oTKa MeTOAa 

PerformSomeTask ( ) . KoraTO HflKOfl OT era pTM pa H kITe HMUJKM M3ITb/lHM peAa 

niMutex.waitoneO ;, Tfl no/iynaBa MyTeKca aKO e CBo6oAeH, BJiM3a b 
KpMTM^HaTa ceKUMfl, CBtpujBa HAKaKBa pa6oTa m ocBo6o>KAaBa MyTeKca c 

iriMutex . ReleaseMutex ( ) . TaKa Ce rapaHTMpa B3aMMHOTO M3KJlK)4BaHe. 



Pe3yjuaT"bT ot M3n"bJiHeHMeTO e cnep,Hv\f\j: 



° : \ "D:\book\Demo-13-Mutex-Example\bin\Debug\Demo-13-IVlutex-E. 



Main Thread Exits 
Starting some job. . . 
Job finished. 
Starting some job. . . 
Job finished. 



Jnjxj 



K/iacoBeTe AutoResetEvent n ManualResetEvent 

ToBa ca oiue ABa KJiaca, komto HacneAflBaT waitHandie m npeAcraB/iflBaT 

npMMMTMBM 3a CMHXpOHM3ai4Mfl. 06eKTMTe OT KJiaC AutoResetEvent M 
ManualResetEvent ca Cb6MTMfl M MOraT Aa MMaT RBe CbCTOflHMfl - 

CMTHajiM3MpaHM m HecMrHajiM3MpaHM . Eaho cb6MTMe MO>Ke abho Aa ce 

yCTaHOBM B CMTHajlM3MpaHO CbCTOflHMe C MeTOAa Set() M B HeCMrHajlM3MpaHO 
- C Reset ( ) . 

AutoResetEvent 06eKT, CMTHajlM3MpaH 4pe3 Set ( ) , CMTHajlM3Mpa caMO 

ntpBMfl naKam MaHMnyjiaTop. CjieA ntpBMfl M3n"bJiHeH waitoneo ot to3m 
o6eKT, cb6MTMeTO ce Bptiua b HecMrHajiM3MpaHO cbcroyiHMe. Ako cb6MTMeTO 

o6ane e OT KJiac ManualResetEvent, TO CMrHa/lM3Mpa BCM4KM naKaLUM MaHMny- 
JiaTOpM. BeAHt>K CMTHajlM3MpaHO, TO MO>Ke Aa 6"bAe BtpHaTO B HeCMTHajlM3M- 
paHO CbCTOflHMe eAMHCTBeHO C M3BMKBaHe Ha Reset () . 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 321 

AutoResetEvent m ManualResetEvent - npimep 

Ctc c^eflBaiunfl npuMep me fleMOHCTpupaMe pa6oTaTa c K/iacoBeTe 

AutoResetEvent M ManualResetEvent M U\e nOKaweM pa3/lMKMTe npn CMTHa- 

^M3npaHeTO Ha cb6i/iTMflTa. HeKa Haw-HanpeA pa3MeAaMe c/iynaa, b komto 

C"b6klTMeTO e OT Tkin AutoResetEvent. 



class MainClass 

{ 

const int THREADS_COUNT = 5; 

static void Main ( ) 

{ 

AutoResetEvent evnt = new AutoResetEvent ( false) ; 

for (int i=0; i<THREADS_COUNT; i++) 

{ 

OneWhoWaits oww = new OneWhoWaits (evnt, (i+l)*500); 

Thread thread = new Thread (new 

ThreadStart (oww. Perf ormSomeTask) ) ; 

thread. Start ( ) ; 
} 

Thread. Sleep (100) ; 

for (int i=0; i<THREADS_COUNT; i++) 

{ 

Console .WriteLine ( "\nPress [Enter] to signal the Reset"- 
" Event . " ) ; 

Console . ReadLine ( ) ; 

evnt . Set ( ) ; 
} 

Console .WriteLine ( "\nMain thread finished."); 
} 
} 

class OneWhoWaits 

{ 

WaitHandle mWaitHandle; 
int mWaitTime; 

public OneWhoWaits (WaitHandle aWaitHandle, int aWaitTime) 

{ 

mWaitHandle = aWaitHandle; 

mWaitTime = aWaitTime; 
} 

public void Perf ormSomeTask ( ) 

{ 

Console .WriteLine ( "Thread {0} started and sleeps.", 



322 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Thread. CurrentThread. GetHashCode ( ) ) ; 
Thread. Sleep (mWaitTime) ; 
Console .WriteLine ( "Thread {0} woke up and is now waiting. 

Thread. CurrentThread. GetHashCode ( ) ) ; 
mWaitHandle . WaitOne ( ) ; 
Console .WriteLine ( "Thread {0} was signaled and exits.", 

Thread. CurrentThread. GetHashCode ( ) ) ; 



KaK pa6oTM npnMepi>T? 

Haw-Hanpefl, cb3,qaBaMe cnHxpoHM3aunoHHMfl o6eKT evnt v\ ro no,qaBaMe Ha 
nerre hmujkm, komto CTapTupaMe. ApryMeHTbT false b KOHCTpyKTopa Ha evnt 
noKa3Ba, ne c"b6nTneTO e b HecnrHa^M3npaHO cbcroflHwe npn cb3flaBaHeTO cm. 

CTapTkipaHMTe HMUJKM ce 6/lOKMpaT Ha peAa mWaitHandle.WaitOne() ; M naKaT 

noTpe6MTejia fla HaTMCHe [Enter], c KoeTO fla ce CMTHajiM3Mpa cb6MTMeTO. Tbm 
ioto cb6MTMeTO e ot TMn AutoResetEvent, c BCAKO HaTMCKaHe Ha [Enter] 
nponycKaMe no eAHa HMUJKa. CneA neTOTO HaTMCKaHe, bcmukm hmujkm npMK- 

JlK)4BaT. 



° : \ "D:\book\Demo-14-Reset-Event-Example\bin\Debug\Demo-14-R. 



Thread 1 started and sleeps. 
Thread 3 started and sleeps. 
Thread 4 started and sleeps. 
Thread 5 started and sleeps. 
Thread 2 started and sleeps. 

Press [Enter] to signal the Reset Event. 



Press [Enter] to signal the Reset Event 
Thread 1 woke up and is now waiting. 
Thread 1 was signaled and exits. 



^jnjxj 



HeKa CMeHMM caMO TMna Ha cb6MTMeTO, KoeTO cb3,qaBaMe: 



ManualResetEvent evnt = new ManualResetEvent ( false) 



Cera ntpBOTO HaTMCKaHe Ha [Enter] boam ro npMK/iionBaHe Ha bcmukm hmujkm 
- BKJiiouMTejiHO m Te3M, komto ome He ca 3ano4HajiM fla 4aKaT. ToBa e TaKa, 
3auj.OTO cjiefl pefla evnt . set o ; , cb6MTMeTO HMKbfle He ce Bptma b 

HeCMrHaJlM3MpaHO CbCTOflHMe. ManualResetEvent C"b6MTMeTO MO)Ke fla ce 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 323 

BtpHe b HecnrHa^M3npaHO cbcroyiHkie caMO CReseto, 3aTOBa HeKa HanpaBMM 
m Ta3M npoMAHa: 



for (int i=0; i<THREADS_COUNT; i++) 

{ 

Console .WriteLine ( "\nPress [Enter] to signal the Reset "- 
"Event. ") ; 

Console . ReadLine ( ) ; 

evnt . Set ( ) ; 

// code added 

Thread. Sleep (10) ; 

evnt . Reset ( ) ; 
} 



Cera HaTMCKaHeTO Ha [Enter] npeflM3BMKBa nponycKaHe caMO Ha HMUJKMTe, 
komto b T03i/i MOMeHT ca naKamw - AOcmrHa/ii/iTe ,qo pefla mWaitHandie. 
waitone();. Tbki KaTO c/iefl ci/irHa/iw3wpaHeTO Ha c"b6nTneTO, ro BptiuaMe 
P"b4HO b HecnrHa/iM3npaHO cbCTOAHne, 3a ocraHa/ikiTe hmujkm to Bene e 
HeckirHa/iki3npaHO v\ Te naKaT hobo HaTMCKaHe Ha [Enter]. 

K/iacbT Interlocked 

rioHAKora eAMHCTBeHOTO, KoeTO hm Tpa6Ba, e fla yBe/innwM v\nv\ HaMa/ikiM 
flafleHa ctomhoct v\j\v\ fla pa3MeHMM ctomhoctm no cnHxpoHM3npaH HanwH. 
Pa36npa ce, motom 3a ue/ua fla i/i3no/i3BaMe MyTeKCM, ho TOBa ao ro/iHMa 
CTeneH me yc/io>KHki KOfla hm. 3a yflOB/ieTBopaBaHe Ha Te3M necro cpeiuaHM 
M3MCKBaHMfl .NET Framework npeflocraBfl K/iaca interlocked. Tom npefl/iara 
hako/iko CTaTM^HM MeTOfla 3a aTOMapHa pa6oTa c npoMeH/iMBM. ATOMapHa 
Hapn^aMe BC^Ka onepauna, koato v\i\v\ ce M3n"b/iH*iBa u^/iaTa, v\nv\ He ce 

M3n"b^HflBa M306lflO. 

Increment^...) m Decrement(...) 

MeTOflMTe Increment (...) M Decrement (... ) C/iy>KaT CbOTBeTHO 3a yBe/lkmaBaHe 

m HaMa^flBaHe Ha ctomhoct. Te npneMaT eflMHCTBeH napaMerbp ot Tkin ref 
int v\nv\ ref long m KaTO pe3y/iTaT BptiflaT CTOMHOCTTa, no/iyneHa cnefl 
M3B"bpujBaHe Ha onepaunaTa. 



int i = 2; 

int newValue = Interlocked. Increment ( ref i ) ; 

Debug .Assert (i == 3 ) ; 

Debug .Assert (newValue == 3 ) ; 



Ako yBe/ikinkiM npoMeH/ikiBaTa c i++, TOBa He e aTOMapHa onepauna - 
CTOMHOCTTa Ha npoMeH^MBaTa ce 3anncBa b perncTtp, CTOMHOCTTa v\ ce 
yBe/iwuaBa v\ ce 3anncBa o6paTHO b npoMeH/ikiBaTa, v\nv\ o6iuo Tpn onepaunn. 



324 nporpaMnpaHe 3a .NET Framework (tom 2) 

Exchange(...) m CompareExchange(...) 

MeTOfl"bT Exchange (... ) C/iy>Kkl 3a pa3MflHa Ha CTOMHOCTM, flOIOTO 

CompareExchange (... ) cpaBHHBa flBe npOMeH/lklBM M aKO ca paBHM no CTOMHOCT, 

yKa3Ba HOBa ctomhoct 3a eAHaTa. flBaTa MeTOAa MMaT no Tpn Bepcun, 
pa3^M4aBaiun ce caMO b Tuna Ha napaMeTpi/ue, c komto onepupaT (int, float 
v\i\v\ object). BptiuaHMflT pe3y/iTaT e ot Tun, cbiuna KaTO Tuna Ha apryMeH- 

TMTe MM. 

npMMep c CompareExchange(...) 

flOKaTO npeAHa3Ha4eHneTO Ha MeTOfla Exchange (...) e acho, to ceMaHTmoTa 

Ha CompareExchange (... ) He e TO/lKOBa npoCTa M 3aTOBa me M/lK>CTpnpaMe 

flewcTBueTO My c npuMep: 



using System. Threading; 

public class ThreadSaf eTotalAccumulation 

{ 

private int totalValue = 0; 

public int AddToTotal (int valueToAdd) 

{ 

int initialValue, computedValue; 

do 

{ 

initialValue = totalValue; 

computedValue = initialValue + valueToAdd; 

} while (initialValue != Interlocked. CompareExchange ( 
ref totalValue, computedValue, initialValue)); 



return computedValue; 



} 



KaK pa6oTM npnMep"t>T? 

K/iaCbT ThreadSafeTotalAccumulation Cbfl"bp>Ka no/ie totalValue, K"bM 

KoeTO MCKaMe fla flo6aBMM HflKaKBa ctomhoct no hmujkobo 6e3onaceH HanwH. 
KoraTO B/ie3eM b umcb/ia, 3anoMH*iMe CTapaTa cyMa b initialValue v\ 

npeCMflTaMe HOBaTa B computedValue. CompareExchange (... ) cpaBHflBa 

totalValue m initialValue. Ako He ca paBHM, 3Ha4M APyra HMiuKa e ycna/ia 
fla o6hobm o6iuaTa cyMa no BpeMe Ha ki3n"b/iHeHkie Ha umcb/ia. ToraBa 

CompareExchange (... ) He o6HOBflBa totalValue, a Bptlfla Cbfl"bp>KaHI/ieTO Ha 
totalValue, KOeTO e pa3/ll/IHHO OT initialValue, M UMK"b/l"bT ce nOBTapfl. B 
MOMeHTa Ha M3/ll/l3aHe OT UkllCb/ia, computedValue e 3anncaH B totalValue. 



HnaBa 17. Mhotohmlukobo nporpaMnpaHe v\ CMHxpoHM3aumi 325 
BptluaMe computedValue, a He totalValue, 3aiUOTO totalValue MO>Ke 

Me>KflyBpeMeHHO fla 6"bfle npoMeHeHa. 

K/iacbT interlocked e no/ie3eH caMO b cnynawTe, KoraTO npoMAHaTa Ha 
npoMeH^MBMTe MMHaBa BMHarn npe3 Hero v\ HMKora He vv\ MOflncpnunpaMe 
AnpeKTHO. 

KnacMnecKM CMHxpoHH3aMMOHHn 3aflami 

C/iynaMTe, b komto flBe v\ noBene hmujkm ce KOHKypupaT 3a o6lum pecypcn, 
necro cm npM/iMnaT. M3BecTHM ca hako/iko ochobhm KaTeropnn npo6/ieMM, 
npeACTaBeHM ot ci\ep,uv\je K/iacMnecKM cnHxpoHM3aunoHHM 3aAanM 

3aAanaTa "npon3BOflHTe/i - noTpe6nTe/i" (The Producer - 
Consumer Problem) 

flBe hmujkm, yc/iOBHO HapeneHM "npoM3BOflMTeji" m "noTpe6MTeji", cnoflejiaT 
o6iua onaujKa ot ashhm c HHKaKBa A"bJi>KMHa. npoM3BOAMTejiaT cb3AaBa ashhm 
m tm npM6aBfl KtM onaujKaTa. Ot cboh CTpaHa, noTpe6MTe/iHT vv\ neTe ot Hea. 
npo6jieMMTe, komto B"b3HMKBaT, ca CJieAHMTe: 

- nopaAM orpaHM^eHMfl pa3Mep Ha onaujKaTa, npoM3BOAMTejiaT He Tpa6Ba 
Aa ce onMTBa p,a 3anMCBa ashhm b Hea, KoraTO e nt/iHa. Ako TOBa e 
TaKa, tom naKa, AOKaTO noTpe6MTe/iflT nponeTe hakom ot e/ieMeHTMTe m 

OCB060AM MflCTO. 

- noTpe6MTejiflT He Tpa6Ba Aa ce onMTBa Aa 4eTe ot npa3Ha onaujKa. B 
to3m cnynaM tom me naKa, AOKaTO npoM3BOAMTejiaT Ao6aBM hob 
ejieMeHT. 

3aAa4aTa e M3Becma oiue noA MMeTO "orpaHM^eH 6ycpep" (bounded buffer). 
HeMHMAT nacreH c/iynaki, b komto At/i>KMHaTa Ha onaujKaTa e 6e3KpaMHa, e 
M3BecTHa KaTO "HeorpaHM^eH 6ycpep" (unbounded buffer). ToraBa OTnaAa 
ycjiOBMeTO npoM3BOAMTejiflT Aa He nMiue b nt/iHa onaujKa m peiueHMeTO ce 
onpocTABa. 

3aAanaTa "npon3BOAHTe/i - noTpe6nTe/i" - npMMepHO peiueHMe 

B .NET Framework He e npeAOcraBeH CTaHAapTeH KJiac 3a peiueHMe Ha to3m 
npo6jieM, ho npMJio>KeHMeTO Ha Ta3M 3aAana b npaKTMKaTa e tojiamo. IHe 
AaAeM npMMepHO peiueHMe Ha npo6jieMa, KoeTO jiecHO no3BO/iflBa Aa 6tAe 
npeM3noji3BaHO npM Hy>KAa: 



using System; 

using System. Collections; 

using System. Threading; 

public class SharedQueue 

{ 
private static object [] mSharedQueue; 
private static int mCurrentElementPointer = -1; 



326 flporpaMnpaHe 3a .NET Framework (tom 2) 



private static int mCapacity; 

public SharedQueue (int aCapacity) 

{ 

mSharedQueue = new obj ect [aCapacity] ; 

mCapacity = aCapacity; 
} 

public void Enqueue (obj ect aObject) 

{ 

while (true) 

{ 

lock (this ) 

{ 

if (mCurrentElementPointer < mCapacity- 1 ) 

{ 

mCur rentElement Point er++; 
mSharedQueue [mCurrentElementPointer] 
aOb j ect; 

Monitor . Pulse (this ) ; 
return; 

} 
else 

{ 

Monitor. Wait (this) ; 

} 
} 
} 
} 

public object Dequeue ( ) 

{ 

while (true) 

{ 

lock (this ) 

{ 

if (mCurrentElementPointer != -1) 

{ 

object result= 
mSharedQueue [mCurrentElementPointer] ; 
mCurrentElementPointer--; 
Monitor . Pulse (this ) ; 
return result; 

} 
else 

{ 

Monitor. Wait (this) ; 

} 
} 
} 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 327 



} 
} 



KaK pa6oTM npnMep"t>T? 

Pea^M3npaH e cnynayiT c orpaHwueH 6ycpep. OnepaunnTe flo6aBHHe v\ M3Ba>K- 
flaHe Ha e/ieMeHT ca ci/iHxpoHH3npai-m v\ 6/iOKkipaT CbOTBeTHO npn npeirb/iHeHa 
v\nv\ npa3Ha onaujKa. 

flo6aBAHeTO Ha e/ieMeHT b onaujKaTa (b>k. MeTOfla Enqueue (...) ) e B"b3MO>KHO 
caMO KoraTO hmkom He n no/i3Ba b p,ap,eHwn momsht h ts He e npeirb/iHeHa. 
Ako b MOMeHTa onaujKaTa ce no/i3Ba (T.e. e 3aK/iK>neHa), naiOMe fla 6"bfle 
OTK/iioneHa. ToBa ce ocurypaBa ot lock 6/iOKa. C/iefl TOBa, aKO onaujKaTa He 
e npeirb/iHeHa, flo6aBAMe hobma e/ieMeHT b Hea v\ BMKaMe Monitor. Pulse () , 
3a fla cb6yAMM naKamwTe hmujkm, 6/iOKkipa/iki b MeTOAa Dequeue o (aKO MMa 
TaKMBa). Ako onaujKaTa e npeirb/iHeHa, npucnuBaMe c Monitor.waito 
TeKymaTa Hi/iwKa. Ta me 6"bfle cb6y,qeHa ot flpyra HMUJKa, koato ycneujHO e 
ki3n"b/iHM/ia MeTOfla Dequeue o m e ocBo6oflki/ia MflCTO b onaujKaTa. 

M3Ba>KflaHeTO Ha e/ieMeHT ot onaujKaTa pa6oTM a6co/iK>THO aHa/iorwuHO Ha 
Ao6aBflHeTO. 

3aAanaTa "HeTijM v\ niicami" (The Readers-Writers Problem) 

B Ta3M 3afla4a MMaMe eflMH v\nv\ noBene "nuca^n", komto hciot fla nmuaT 
Btpxy flafleH o6iu pecypc, HanpuMep cpaw/i. YcnopeflHO Ha tax, eflMH v\nv\ 
noBene "neTui/i" neTaT ot cbiuna pecypc. 3a fla e KopeKTeH flocrbirbT ao 
o6iflMfl pecypc, Heo6xoflMMO e fla ca cna3eHM c/ieflBamwTe yc/iOBM*i (yc/iOBkm 
Ha BepHiuaMH): 

- npoM3BO/ieH 6pow neTuw MoraT fla MMaT eflHOBpeMeHeH flocrbn ao 
pecypca - TOBa H^Ma KaK fla nopoflu cnHxpoHM3aunoHHM npo6/ieMki, 
3aiuoTO b to3m MOMeHT pecypcbT He ce npoMeHfl. 

- Ako Ha niveau e npeflocraBeH flocTbn ao pecypca, flocTbirbT Ha bcmukm 
ocraHa/iki Tpa6Ba fla 6"bfle 3a6paHeH - He3aBncnMO p,anv\ neTun v\nv\ 
rmcanw. 

- Hmto eflMH neTeu v\nv\ ni/ican He Tpa6Ba fla naKa 6e3KpaMHO flt/iro 

.NET Framework npefl/iara peiueHne Ha Ta3M 3a,aana - K/iacbT 

ReaderWriterLock. KpMTM4HMflT pecypc ce 3aK/lK>HBa C MeTOflMTe 
AcquireReaderLock (...) M AcquireWriterLock (...) , CbOTBeTHO 3a neTeu M 
nwcan. OCB06o>KflaBaHeTO CTaBa C ReleaseReaderLock ( ) M 
ReleaseWriterLock() . CBOMCTBaTa IsReaderLockHeld M IsWriterLockHeld 

hm MHCpopMnpaT p,anv\ pecypcbT e TeKymo 3aK/iioneH ot neTeu v\nv\ ot ni/ican. 
Eto eflMH npuMepeH a/iropwTbM 3a TOBa, KaK fla M3no/i3BaMe K/iaca 

ReaderWriterLock. 



class Resource 



328 flporpaMnpaHe 3a .NET Framework (tom 2) 



ReaderWriterLock rwLock = new ReaderWriterLock ( ) ; 



public void Read i 



{ 



rwLock . AcquireReaderLock (Timeout . Infinite) 
try 

{ 

// Many can read, writers are blocked 

} 
finally 

{ 

rwLock . ReleaseReaderLock ( ) ; 



public void Write ( ) 

{ 

rwLock . AcquireWriterLock (Timeout . Infinite) 
try 

{ 

// One can write, readers are blocked 

} 
finally 

{ 

rwLock . ReleaseWriterLock ( ) ; 



} 



3aAanaTa "06flABamn cpmiococpM" (The Dining Philosophers 
Problem) 




B Ta3M 3aflana, hhko/iko cpw/iococpa ctoat oko/io Kptr/ia Maca v\ BceKM ot tax 
M3B"bpujBa caMO 2 AewcTBi/m - xpaHM ce v\nv\ mmc/im. 3a fla 3anonHe flafleH 
cpM/iococp fla ce xpaHM, tom ce Hy>Kflae eflHOBpeMeHHO ot flBeTe bm/imum, komto 
CTOflT B/lflBO M BflflCHO OT HMHMflTa My. Ako eflMH cpM/iococp B3eMe eflHaTa 
BM/iwua, ho He MO>Ke fla B3eMe b to3m MOMeHT m APyraTa (3aiuoTO ta e 3aeTa), 
tom He MO>xe fla 3anonHe fla ce xpaHM flOKaTO He ce cflo6Me m c Hea. MMa pmck 



HnaBa 17. Mhotohmlukobo nporpaMnpaHe v\ CMHxpoHM3aumi 329 

BceKM cpM/iococp fla xBaHe eflHa ot BM^nunTe b flafleH momsht v\ fla naKa 
6e3KpaMHO 3a .qpyraTa. ToBa me flOBefle ,qo "MtpTBa xBaTKa" (deadlock). 
3aflanaTa e fla ce m3mmcjim a/iropMTbM 3a xpaHeHe Ha cpM/iococpMTe, npn komto 
He ce nojiynaBaT "mbptbm xBaTKn". 

3aflanaTa "06flflBamn 4>msioco4>m" - peujeHun 

EflHO npuMepHO peiueHne Ha npo6/ieMa e fla HapeflMM BM/iMu.MTe v\ fla 
M3MCKBaMe cpM/iococpMTe fla vv\ B3eMaT b HapacrBam pefl. HeKa MMaMe 5 
cpM/iococpa o6o3Ha4eHM c PI, P2, P3, P4, m P5, a BM/iMu.MTe fla ca HOMepupaHM 
c Fl, F2, F3, F4, v\ F5. ritpBUflT cpM/iococp (PI) me B3eMe ntpBaTa BM/iMua 
(Fl) npeflu fla ce nocerHe KbM BTopaTa (F2). On/iococpMTe ot P2 ao P4 me ce 
fltpxaT aHa/iorMUHO, B3eMaMKM Fx npeflu Fx+1. 0M/iococp"bT P5 o6ane me 
B3eMe Fl npeflu F5 v\ MMeHHO Ta3M acuMeTpua me npeflOTBpaâ„¢ "MtpTBa 
XBaTKa". MMn^eMeHTaunflTa Ha TOBa peiueHne e TpuBna^Ha. 

flpyro npocTO peiueHne Ha npo6/ieMa e fla pa3r/ieflaMe MacaTa KaTO cnofle/ieH 
pecypc m npn 3anonBaHe Ha onepaunaTa "B3MMaHe Ha flBe bmjimu.m" fla 
M3no^3BaMe 3aK/iK>nBaHe Ha MacaTa c KpnTM^Ha ceKuna. AHa/iorMUHO 
nocrbriBaMe v\ npn onepaunaTa "BptmaHe Ha flBe bm/imu.m". no to3m HanwH 
npaBMM onepauuMTe "B3MMaHe Ha flBeTe bm/imu.m" m "BptmaHe Ha flBeTe 
bm/imu.m" aTOMapHM, a TOBa 03HanaBa, ne He MO>Ke fla ce no/iyuM "MtpTBa 
XBaTKa". 



riy/i ot hmujkm (ThreadPool) 



npe3 to/iam nepnofl ot CBoeTO cbmecrByBaHe, HMUJKaTa ce HaMupa b 

CbCTOflHkie ThreadState.WaitSleepJoin - OnaKBaLfla C/iyHBaHeTO Ha HflKaKBO 

c"b6nTne v\nv\ npucnaHa etc sieep(...). noHAKora HMUJKaTa ce "c"b6y>Kfla" 3a 
mhoto KpaTKM nepnoflu, caMO 3a fla npoBepn fla/iM e M3irb/iHeHO HsiKaKBO 
yc/iOBMe. noflfltpxaHeTO Ha mhoto HeaKTMBHM hmujkm e m3jimujho m KOHcyMMpa 
pecypcM. 

rioflxofltT Ha nyjia ot hmujkm HaMa/iflBa HaTOBapBaHeTO npM cb3flaBaHe m 
yHMmo>KaBaHe Ha hmujkm. Tpyna hmujkm, HapeneHM pa6oTHM hmujkm (worker 
threads), ce cb3flaBaT b Hana/iOTO Ha MHoroHMUJKOBOTO npMJio>KeHMe m 
cpopMMpaT nyji. Pa6oTHMTe hmujkm ca cpMKCMpaH 6poM - BeflHtx ct3flafleHM, 
He ce y6MBaT m He ce cb3flaBaT hobm. npM HOBa 3a,qana, nyjrbT npeflocraBfl 
pa6oTHa HMUJKa 3a HeMHOTO M3n"bJiHeHMe. Cjiefl npMK/iionBaHe Ha pa6oTaTa, 
HMUJKaTa ce Bptma b nyjia 6e3 fla ce yHMmoxaBa. MexaHM3M"bT e noflxoflam 
3a mhoto Ha 6poM 3a,qanM, komto MoraT fla ce M3iTb/iHflBaT napajiejiHO. 
3aflanMTe 3a M3n"bJiHeHMe ce Hape>KflaT b onaujKa m 3anonBaT fla ce 
M3iTbJiHflBaT npM npeflocTaBeHa mm pa6oTHa HMUJKa. 

EflMH npou.ee MO>Ke fla MMa caMO eflMH ny/i ot hmujkm, o6m 3a bcmukm flOMeMHM 
Ha npMJio>KeHMeTO b npoueca. CraHflapTHO, ny/ivr ot hmujkm e orpaHMneH Ha 
25 hmujkm Ha npouecop. 



330 nporpaMnpaHe 3a .NET Framework (tom 2) 

npeflMMCTBa 

riy/i"bT ot hmujkm npeM3no/i3Ba HMUJKMTe. He ce ry6n BpeMe 3a cb3flaBaHe v\ 
yHMmo>KaBaHe Ha hmujkm. 

3aAa4aTa, o6c/iy>KBaHa ot pa6oTHMTe hmujkm, ce ocBo6o>KflaBa ot 3aA"b/i>Ke- 

HMeTO Rd TM C"b3AaBa M KOHTpOJIMpa. 

YBejiM^aBaHeTO Ha npoM3BOAMTejiHOCTTa e He caMO no OTHOiueHMe Ha TeKy- 
luoto npMJio>KeHMe, ho m no OTHOiueHMe Ha APyrMTe CTapTMpaHM npouecM. 
nocTOflHHMflT 6poM Ha pa6oTHMTe hmujkm no3BOJiflBa Ha onepauMOHHaTa cmc- 
TeMa Aa onTMMM3Mpa KBaHTa ot BpeMe, npeAOcraBAH Ha HMUJKMTe ot bcmukm 
npouecM. 

HenocTarbMM 

riyjTbT ot hmujkm e HeyAo6eH, KoraTO e Hy>KHa KOHTpo/iMpama HMUJKa. Bcmukm 
pa6oTHM hmujkm ca paBHonocTaBeHM. 

Pa6oTHMTe hmujkm He Tpa6Ba Aa pa6oTHT Btpxy cnoAejieHM AaHHM. Ako MMa 
Hy>KAa ot CMHxpoHM3au.Mfl, nyjTbT He e Ao6po peujeHMe, 3amoTO no CBO^Ta 
ctmHOCT e acMHxpoHeH. 

Ako HAKOfl ot 3aAa4MTe OTHeMa mhoto BpeMe, ta MO>Ke Aa 3a6aBM ocTaHajiMTe. 

Ako AaAeHa 3aAana e b nyjia ot hmujkm, ta He MO>Ke Aa ce npeMaxHe ot Hero. 

K/iaci>T ThreadPool 

B .NET Framework, ny/ivr ot hmujkm e MMnjieMeHTMpaH b KJiaca ThreadPool. 
Hpe3 MeTOAa QueueUserWorkitem(...) Ao6aBAMe HOBa 3aAana b onaujKaTa. 
ritpBOTO M3BMKBaHe Ha MeTOAa cb3AaBa nyjia ot hmujkm Ha npoueca. 

ThreadPool - npiiMep 

IHe AaAeM cnep,Hwn npMMep 3a Ao6aBAHe Ha 3aAanM b onaujKaTa Ha nyjia ot 

HMUJKM M TflXHOTO M3n"bJlHeHMe : 



class ThreadPoolDemo 

{ 

const int TASKS_COUNT = 10 0; 

public static void LongTask (ob j ect aParam) 

{ 

Console .WriteLine ( "Started: {0}.", aParam); 

Thread. Sleep (500) ; 

Console .WriteLine ( "Finished: {0}.", aParam); 
} 

static void Main ( ) 

{ 

Console .WriteLine ( "Press [Enter] to exit."); 



HnaBa 17. Mhotohmlukobo nporpaMnpaHe v\ CMHxpoHM3aumi 331 



for (int i = l; i<=TASKS_COUNT; i++) 

{ 

string taskName = "Task" + i; 
ThreadPool . QueueUserWorkltem (new 
WaitCallback (LongTask) , taskName) 



Console . ReadLine i 



KaK pa6oTM npnMep"t>T? 

Haw-Hanpefl, r/iaBHaTa HMUJKa Ha npn^OKeHneTO flo6aBfl b ny/ia 100 3afla4M. 
ripn Ao6aBAHeTO, noconBaMe MeTOA, komto p,a ce M3n"b/iHM, KaTO M3no/i3BaMe 
Ae/ieraTa WaitCallback, HaMnpaiu ce b npocTpaHCTBOTO ot MMeina system. 

Threading. MeTOA"bT QueueUserWorkItem(...) n03BO/lflBa Rd nOAaAeM K"bM 

o6pa6oTKaTa v\ Aont/iHMTe/ieH napaMeTbp, b cnynafl - MMeTO Ha 3aAanaTa. 

3aAa4MTe ce M3n"b/iHflBaT acuHxpoHHO, no peAa Ha nocrbnBaHeTO mm. B AaAeH 
MOMeHT ce M3nt^HABaT no hhkojiko 3aAanM, KaTO touhmht mm 6pow ce 
onpeAe/i*i ot 6poa Ha TeKymo cbo6oahmt6 pa6oTHM hmujkm. 



Pe3y/iTaTbT ot M3n"b/iHeHneTO M3r/ie>KAa TaKa: 



c\ "D:\book\Demo-15-Thread-Pool\bin\Debug\Demo-15-Thread-Poo. 



parted: Task97. 
Finished: Task85. 
Started: Task98. 
Finished: Task86. 
Started: Task99. 
Finished: Task87. 
Started: TasklOO. 
Finished: Task88. 
Finished: Task89. 
Finished: Task90. 



^Jnjxj 



A 



MeTOfli>T ThreadPool. RegisterWaitForSingleObject() 

MoxeM as M3no/i3BaMe to3m MeTOA, KoraTO MCKaMe ny/ia ot hmujkm p,a naKa 3a 
HAKaKBO cb6MTMe. MeTOAtT perMCTpMpa AejieraT. MeTOAtT, CB"bp3aH c Ae/ie- 
raTa, ce M3n"bJiHABa iokto npM CMrHajiM3MpaHeTO Ha TOBa cb6MTMe, TaKa m 
cjieA M3TM4aHeTO Ha 3aAaAeH TaMMayT. 



332 nporpaMnpaHe 3a .NET Framework (tom 2) 

RegisterWaitForSingleObject() - npimep 

fla pa3MeflaMe eflMH npnMep 3a i/i3no/i3BaHeTO Ha MeTOfla ThreadPooi. 

RegisterWaitForSingleObject ( ) : 



static void Main ( ) 

{ 

AutoResetEvent ev = new AutoResetEvent ( false) ; 
object param = "some param"; 
RegisteredWaitHandle waitHandle = 

ThreadPooi . Regis terWaitForSingleOb j ect ( 

ev, new WaitOrTimerCallback (WaitProc) , param, 1000, 
false ) ; 
Console .WriteLine ( "Press [Enter] to signal the wait handle.") 
Console . ReadLine ( ) ; 

Console .WriteLine ( "Main thread signals."); 
ev.Set ( ) ; 

Console .WriteLine ( "Press [Enter] to continue."); 
Console . ReadLine ( ) ; 

Console .WriteLine ( "Main thread unregisters . " ) ; 
waitHandle . Unregister (ev) ; 

Console .WriteLine ( "Press [Enter] to exit."); 
Console . ReadLine ( ) ; 
} 

public static void WaitProc (obj ect aState, bool aTimedOut) 

{ 

string cause = aTimedOut ? "TIMED OUT" : "SIGNALLED"; 

Console .WriteLine ( "WaitProc executes; cause = {0}", cause); 
} 



KaK pa6oTM npnMepi>T? 

riOfl06HO Ha MeTOfla QueueUserWorkltem (... ) , Regis terWaitFor Single - 

object(...) cb3flaBa ny/ia ot hmujkm npn CBoeTO M3BMKBaHe. Haw-Hanpefl, 

nOC04BaMe Cb6l/ITkieTO, KOeTO naiOMe - TOBa e ev OT TMn AutoResetEvent. 

KaTO M3no^3BaMe fle/ieraTa WaitOrTimerCallback, noco^BaMe MeTOfla 
WaitProc (...) , komto me ce M3n"b^HABa npn ckirHa/iki3kipaHe Ha c"b6nTneTO. 
KtM MeTOfla WaitProc (...) MO>KeM fla noflafleM npow3BO/ieH napaMeTbp - 
o6eKTbT astate, Ha komto npeflki TOBa CMe 3ap,anv\ ctomhoct "some param". 
TaMMayTbT, npe3 komto me ce M3n"b/iHflBa MeTOfla, e eflHa ceKyHfla. 
noc^eflHMflT napaMeTbp onpefle/ia fla/iw MeTOfla fla ocTaHe perncTpupaH 3a 
c"b6nTneTO cnep, ntpBOTO cm i/i3n"b/iHeHwe, p,anw fla ce M3n"b/iHflBa Ha BC^Ka 
cnrHa^M3aunfl Ha c"b6nTneTO v\ Ha BceKM v\3jeKbi\ TawMayT. Tbi/i KaTO 
CTOMHOCTTa My e false, MeTOfltT HflMa aBTOMaTM^HO fla 6"bfle fleperi/icrpwpaH 
cnefl ntpBOTO cm ki3n"b/iHeHwe. 



HnaBa 17. Mhotohi/ilukobo nporpaMnpaHe v\ CMHxpoHM3aumi 333 



Ot to3m MOMeHT HaTaTbK, MeTOfltT 3anonBa fla ce ki3n"b/myiBa Ha BC^Ka 
ceKyHfla nopaflu ki3TeK"b/i TaMMayT. HaTMCKaHeTO Ha [Enter] boam ro 
cnrHa^M3npaHe Ha ct6nTneTO v\ eAHOKpaTHO M3nt/iHeHne Ha waitProc(...) , ho 
Bene aTimedout MMa ctomhoct false. M3n"b/iHeHkiflTa no M3TeKt/i TaMMayT 

npOfl"b/l>KaBaT £0 flOCTkiraHeTO Ha waitHandle.Unregister(ev) ; . flepern- 

CTpupaHeTO CTaBa npe3 pecpepeHUkisua waitHandie, BtpHaTa npn perncTpn- 
paHeTO. 



'^\ "D:\book\Demo-16-RegisterWaitForSingleObject\bin\Debug\Di 



Press [Enter] to signal the wait handle. 
WaitProc executes; cause = TIMED OUT 
WaitProc executes; cause = TIMED OUT 

Main thread signals. 

WaitProc executes; cause = SIGNALLED 

Press [Enter] to continue. 

Main thread unregisters. 
Press [Enter] to exit. 

Press any key to continue. 



- â–¡ x 



l/lHTep<t>eMCbT ISynchronizelnvoke 

KoraTO koa, i/i3n"b/iHflBaH b HMUJKaTa Tl, M3BMKa MeTOfl Ha o6eKT, to3m MeTOfl 
o6nKHOBeHO ce i/i3n"b/iH*iBa cmhxpohho b cbiuaTa HMUJKa Tl. noHAKora o6ane 
ce Ha/iara ki3n"b/iHeHweTO BMHarn p,a npoTwua b HMUJKaTa, KtfleTO e cb3AaAeH 
o6eKTa (HeKa a o6o3HanwM c T2). TkinwueH npuMep 3a TaKaBa Heo6xoAHMOcr 
ca K/iacoBeTe 3a cpopMM v\ kohtpo/im b .NET Windows Forms, komto Tpa6Ba 
BMHarn p,a o6pa6oTBaT cbo6meHMflTa b CbiuaTa HMUJKa, b kohto ca 6m/im 
c"b3flafleHM. 3a p,a ce cnpaBM c noflo6HM c/iynaw, .NET Framework npeflocTaBa 

MHTepcpewca System. ComponentModel . ISynchronizelnvoke: 



public interface ISynchronizelnvoke 

{ 

object Invoke (Delegate method, object [] args); 
IAsyncResult Beginlnvoke (Delegate method, object [] args); 
object Endlnvoke ( IAsyncResult result); 
bool InvokeRequired {get;} 



fl3no/i3BaHe Ha ISynchronizelnvoke 

ISynchronizelnvoke npeflocTaBfl CTaHflapTeH MexaHM3"bM 3a M3BMKBaHe Ha 
MeTOAM Ha o6eKTM, >KMBeeiun Ha flpyrn hmujkm. HeKa eAHH o6eKT p,a 



334 nporpaMnpaHe 3a .NET Framework (tom 2) 

MMn/ieMeHTMpa I Synchronize Invoke M K/lweHTCKkl KOfl Ha HMUJKa Tl fla 

M3BMKa invoke (...) Btpxy T03M o6eKT. ToBa me flOBefle ao cneflHaTa 
nocneflOBaTe/iHOcr ot fleMCTBua: 

1. B/iOKupaHe Ha M3BMKBaiuaTa Hi/iwKa Tl. 

2. Mapuja^M3aunfl Ha M3BMKBaHeTO ao HMUJKaTa T2. 

3. l/l3n"b/iHeHkie Btpxy HkiwKaTa T2. 

4. Mapuja/iM3aunfl Ha BtpHaTMTe ctomhoctm ao HMUJKaTa Tl. 

5. BptiuaHe Ha KOHTpo/ia Ha HMUJKaTa Tl. 

invoke (...) npweMa fle/ieraT, cbOTBeTeH Ha MeTOfla, komto me 6"bfle M3n"b/iHeH 
Ha T2, m MacuB ot o6eKTM ioto napaMeTpn. 

M3no/i3BaHe Ha ISynchronizelnvoke - npMMep 

IHe p,ap,eM ep,v\H npuMep, b komto K/iac 3a Ka/iKy/iaTop i/iMn/ieMeHTwpa 

ISynchronizelnvoke M npeflOCTaBfl Add(...) MeTOfl 3a Cb6kipaHe Ha ABe 

nwc/ia. B KOfla CMe nponycHa/iw cbiunHCKaTa peanv\3auwn Ha MeTOflMTe Ha 
ISynchronizelnvoke, a me KOHueHTpupaMe BHMMaHneTO cm Btpxy Hani/ma Ha 
no/i3BaHeTO Ha K/iaca b K/iweHTCKi/i koa. Eto Bee naK KaK M3r/ie>Kfla CKe/ieTa Ha 

K/iaca Calculator. 



public class Calculator : ISynchronizelnvoke 

{ 

public int Add(int argl, int arg2) 

{ 

int threadID = Thread. CurrentThread. GetHashCode () ; 
Console. WriteLine ( "Callback thread ID is " + threadID) 
return argl + arg2; 

} 

// ISynchronizelnvoke implementation here . . . 

} 



Eto KaK ce M3no/i3Ba K/iaca calculator: 



public delegate int AddDelegate (int argl, int arg2); 

public void Calculatorlnvoke ( ) 

{ 

int threadID = Thread. CurrentThread. GetHashCode () ; 
Console .WriteLine ( "Client thread ID is " + threadID) 

Calculator calc = new Calculator ( ) ; 

AddDelegate addDelegate = new AddDelegate (calc .Add) ; 

object [] arr = new object [] {3,4}; 

int sum = (int) calc . Invoke (addDelegate, arr ) ; 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 335 



} 


Debug. Assert (sum 


== 7) 


' 














EflMH B"b3MO>KeH M3XOfl, 


KOMTO 


MO>KeM 


fla 


no/i 


yH 


MM, 


e 


c^eflHMAT: 


Ca 
CI 


llback thread ID 
lent thread ID is 


is 29 
30 

















KaK pa6oTM npnMep"t>T? 

TbCi ioto o6pa6oTKaTa ce ki3n"b/iH*iBa Ha Hi/iwKa, pa3/ikmHa ot Ta3M Ha 

K/lkieHTCKI/lfl KOfl, MO>KeM fla M3B"bpilJMM aCMHXpOHHO M3BMKBaHe Hpe3 MeTOflMTe 
BeginInvoke(...) M Endlnvoke (...) . ACMHXpOHHMflT MexaHkl3"bM Ha pa60Ta e 

onucaH noApo6HO no-Ha.qo.ny b TeMaTa. 

Cbomctboto invokeRequired noKa3Ba fla/iw K^neHTCKaTa HMiuKa e ctiuaTa 
ioto Ta3M, Ha koato Tpa6Ba fla ce ki3n"b/iHki MeTOAa Ha o6eKTa. Ako e cbiuaTa 

(T.e. InvokeRequired e paBHO Ha false), MeTOfl"bT MO>Ke fla 6"bfle M3BMKaH 
flMpeKTHO 6e3 MexaHkl3Ma Ha I Synchronize Invoke. 

Windows Forms n ISynchronizelnvoke 

5a30BMTe K/iacoBe b Windows Forms i/i3no/i3BaT i synchronize invoke. BceKM 
K/iac HacneflHkiK Ha control pa3HMTa Ha Windows cbo6iueHMfl v\ Ha onaujKaTa 
ot cb6nTMfl, KtfleTO Te 6nBaT o6pa6oTBaHM b 6e3KpaeH uwK"b/i. Ho cbo6iue- 
HMATa 3a flafleH npo3opeu ce flocraBAT caMO ao HMUJKaTa, KtfleTO e 6m/i 
cb3flafleH. 3aTOBa, b o6iunfl cnynaw, flocrbntT ,qo Windows Forms K/iacoBe ot 
flpyra HMiuKa Tpa6Ba fla CTaBa ki3K/iK>nkiTe/iHO v\ caMO npe3 MeTOflMTe Ha 

I Synchroni z e Invoke . 

TaMMepM 

HecTO b npn^o>KeHMflTa, komto pa3pa6oTBaMe, Bt3HMKBa Heo6xo,qi/iMOCT ot 
M3n"b^HABaHe Ha 3a,qanki npe3 pery/isipHki BpeMeBM i/iHTepBa/ii/i. TawMepnTe 
npeflocTaBAT TaKaBa ycnyra. Te ca o6eKTM, komto M3BecTflBaT npn^OKeHneTO 
npn M3TM4aHe Ha npeflBapwTe/iHO 3aflafleH MHTepBa/i ot BpeMe. TawMepnTe ca 
no/ie3Hki b peflnua cueHapnn, HanpuMep, KoraTO MCKaMe fla o6HOBABaMe 
nepi/iofli/mHO noTpe6nTe^CKMfl MHTepcpewc c aKTya/iHa MHCpopMauna 3a CTaTyca 
Ha HAKaKBa 3a,qana v\nv\ fla npoBep^BaMe cbCTOAHneTO Ha npoMeHaiun ce 

flaHHM. 

TaKaBa ycnyra M3r/ie>Kfla Ha nptB uovnep, ziecHa 3a i/iMn/ieMeHTaui/i*i. MoweM 
fla M3no/i3BaMe pa6oTHa HMiuKa, koato 3acnnBa 3a onpe.qe.neHO BpeMe v\ 
nocne M3BecTABa 3a cb6y>KflaHeTO cm. Ho Tpa6Ba fla pea/iw3wpaMe v\ mhoto 
flpyrn cpyHKunn: 3a Hana/io v\ Kpati Ha OT6poaBaHe Ha BpeMeTO, 3a ynpaB- 
zieHkie Ha pa6oTHaTa HMiuKa, 3a npoMAHa Ha MHTepBa/ia, 3a 3aflaBaHe Ha 

CpyHKUMfl 3a 06paTHO l/l3BMKBaHe. 



336 nporpaMnpaHe 3a .NET Framework (tom 2) 

.NET Framework hm npeflocraBsi HaroTOBO Tpn pa3/ikmHki peiueHMfl 3a to3m 
npo6/ieM. IHe pa3r/ieAaMe Kora e yqanHO fla i/i3no/i3BaMe BceKM eflMH ot 
K/iacoBeTe, komto me pa3r/ieAaMe. 

System.Timers.Timer 

K/iaCbT System.Timers.Timer MMa C/ieAHaTa flecpMHMUMfl: 



public class Timer 

{ 

public Timer ( ) ; 

public Timer (double interval); 

// Properties 

public bool AutoReset { get; set; } 

public bool Enabled{ get; set; } 

public double Interval { get; set;} 

public ISynchronizelnvoke SynchronizingOb j ect { get; set; } 

//Events 

public event ElapsedEventHandler Elapsed; 

// Methods 

public void Close ( ) ; 
public void Start ( ) ; 
public void Stop ( ) ; 
/* Other members */ 
} 



K/iacbT npeflocTaBsi cb6nTne 3a i/i3Ti/maHe Ha BpeMeBna m-uepBa/i Elapsed, 

KOeTO e fle^eraT OT Tkin ElapsedEventHandler, flecpMHkipaH KaTO: 



public delegate void ElapsedEventHandler i 
object sender, ElapsedEventArgs e); 



ripn M3TM4aHe Ha MHTepBa^a, yKa3aH b cbomctboto interval, TaMMeptT ot 

TMn System.Timers.Timer Uje M3BMKa 3anMCa/ll/ITe ce 3a C"b6MTMeTO MeTOAM, 

M3no^3BaMKM HMiuKa ot ny/ia. Ako ki3no/i3BaMe eAHH v\ cbu\ MeTOA 3a 
no/iynaBaHe Ha cb6nTMfl ot hako/iko TaMMepa, npe3 apryMeHTa sender MO>KeM 

Aa TM pa3rpaHM4MM. K/iaCbT ElapsedEventArgs npe3 CBOMCTBOTO DateTime 

signaiTime hm npeAOcraBfl touhoto BpeMe, KoraTO e 61/1/1 M3BMKBaH MeTOAa. 
3a CTapTupaHe v\ cnnpaHe Ha M3BecTABaHeTO, MO>KeM Aa M3BMKaMe cbOTBeTHO 

Start () M Stop() MeTOAMTe. CBOMCTBOTO Enabled HM n03BO/lflBa Aa MHCTpyK- 

TupaMe TawMepa Aa nrHopupa cb6kiTi/ieTO Elapsed. ToBa npaBM Enabled 

CpyHKUMOHa/lHO eKBMBa^eHTHO Ha CbOTBeTHMTe Start() M Stop() MeTOAM. 

KoraTO npi/iK/uonkiM c TaMMepa, Tpa6Ba Aa M3BMKaMe ciose(), 3a Aa ocbo- 
6oahm CbOTBeTHMTe cucTeMHM pecypcw. 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 337 



System.Timers.Timer - npimep 

ETO npMMep 3a ynOTpe6aTa Ha System.Timers.Timer: 



using System; 

using System. Timers; 

using System. Threading; 

class SystemTimerClient 

{ 

System.Timers.Timer mTimer; 
int mCounter = 0; 

public SystemTimerClient ( ) 

{ 

mTimer = new System. Timers . Timer () ; 

mTimer . Interval = 1000; // One second 

mTimer . Elapsed += new ElapsedEventHandler (OnTick) ; 

mTimer. Start ( ) ; 

//Can block, because the Timer uses thread from thread pool 
Thread. Sleep (4000) ; 

mTimer . Stop ( ) ; 
mTimer . Close ( ) ; 
} 

private void OnTick (obj ect source, ElapsedEventArgs e) 

{ 

string tickTime = e . SignalTime . ToLongTimeString ( ) ; 

mCounter++; 

Console .WriteLine (mCounter . ToString ( ) + " " + tickTime); 
} 

private static void Main ( ) 

{ 

SystemTimerClient obj = new SystemTimerClient ( ) ; 

} 
} 



Pe3y/iTarbT ot i/i3n"b/meHi/ieTO Ha nporpaMaTa e: 



1 


16 


13 


31 


2 


16 


13 


32 


3 


16 


13 


33 



KaK pa6oTM npnMepi>T? 

Tbti KaTO MeTOAtT, komto e o6pa6oT4MK Ha ct6nTneTO 3a M3TM4aHe Ha 
MHTepBa^, ce M3n"b/iHflBa b OTfle/iHa HMUJKa, Tpa6Ba p,a ocurypuM cmhxpohm- 
3npaH flocTtn flo 4^eH-npoMeH^MBMTe Ha o6eKTa. 



338 nporpaMnpaHe 3a .NET Framework (tom 2) 

CBOMCTBOTO SynchronizingObject HM n03BO/lflBa fla yKa>KeM 06eKT, MMn/ie- 
MeHTkipaiU I Synchronize Invoke. TOM me 6"bfle l/l3nO/13BaH OT TaMMepa 3a 

M3n"b^HeHneTO Ha cpyHKunaTa 3a o6paTHO M3BMKBaHe b onpeAe/ieHa Hi/iwKa, 
BMecTO b HMiuKa, npMHaA/iewama Ha ny/ia. ToBa e yao6ho, npuMepHO, KoraTO 

HMaMe TaMMep OT Tkin System. Timers. Timer B K/iac, Hac/ieAHklK Ha 
windows . Forms . Form. Ako yKa>KeM caMaTa cpopMa Ha CBOMCTBOTO 
SynchronizingObject, TO MeTOfl"bT 06pa60T4MK Ha Elapsed me ce M3n"b/1HM B 

ocHOBHaTa HMiuKa Ha noTpe6nTe^CKMfl MHTepcpewc, KtAeTO 6e3onacHO MO>xeM 
Aa npoMeHAMe CBOMCTBaTa Ha cpopMaTa v\ KOHTpo/iMTe v\. 

Visual Studio .NET MMa BrpaAeHa nOAAP"b>KKa 3a System. Timers. Timer B 

AM3aMHepa cm. Mo>KeM AnpeKTHO Aa npwB/iankiM TaicbB o6eKT ot pa3Ae/ia 
KOMnoHeHTM Btpxy Windows cpopMa, ASP.NET cpopMa v\nv\ ye6 ycnyra v\ Aa My 
yKaxeM obOTBeTHMTe CBOMCTBa. B c/iynaa Ha Windows Forms, AH3ai/iHep"bT Ha 

VS.NET aBTOMaTM4HO yKa3Ba CBOMCTBOTO SynchronizingObject Ha MHCTaH- 

UMATa Ha caMaTa cpopMa. 

System.Threading.Timer 

ripoCTpaHCTBOTO OT MMeHa System. Threading CbA"bp>Ka APyr K/iac 3a TaMMep, 

komto e cbc c^eAHaTa AecpMHuunfl: 



public sealed class Timer : MarshalByRefOb j ect, IDisposable 

{ 

public Timer (TimerCallback callback, 

object state, long dueTime, long period); 

/* More overloaded constructors */ 

public bool Change (int dueTime, int period); 

/* More overloaded Change ( ) */ 

public virtual void Dispose (); 
} 



System.Threading.Timer npi/l/lkma Ha System. Timers . Timer M CbLUO 

M3no/i3Ba ny/ia c hmujkm. OcHOBHaTa pa3/im<a e, ne tom no3BO/i$iBa Ma/iKO no- 
pa3LunpeH kohtpo/i - MO>Ke Aa yi<a3BaMe Kora Tai/iMepa Aa 3anonHe Aa 
OT6po*iBa, KaKTO m Aa npeAaBaMe BCflKaKBa MHCpopMauna Ha MeTOAa 3a 
o6paTHM M3BMKBaHMfl npe3 o6eKT ot npoi/i3BO/ieH Tun. 3a Aa no/i3BaMe 
System.Threading.Timer, Tpfl6Ba B KOHCTpyKTOpa My Aa nOAaAeM Ae/ieraT OT 
TMn TimerCallback, AecpMHMpaH KaTO: 



public delegate void TimerCallback (obj ect state) 



ripM BCflKO M3TM4aHe Ha BpeMeBMfl MHTepBa/1, me 6"bAaT M3BklKBaHM MeTOAMTe 

b T03i/i Ae^eraT. 06mkhob6ho KaTO o6eKT 3a cbcroaHkie MMa no/i3a Aa 
noAaBaMe ch3Rajenn Ha TaMMepa, 3a Aa motom Aa w3no/i3BaMe cbmHfl MeTOA 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 339 

3a o6paTHM M3BMKBaHMfl 3a o6pa6oTKa Ha Cb6kiTkifl ot MHO>KecTBO TaMMepn. 
flpyrnflT napaMerbp b KOHcrpyKTopa Ha Tai/iMepa e BpeMeBM^T MHTepBa/i. Tom 
MO>Ke v\ p,a 6"bfle npoMeHeH BnocneACTBkie c M3BMKBaHe Ha change (...) MeTOAa. 

System. Threading. Timer He npefl/iara yfl06eH HanklH 3a CTapTkipaHe M 

cnnpaHe. HeroBaTa pa6oTa 3anonBa BeAHara cnep, KOHcrpywpaHeTO My (no- 
touho c/ieA M3TM4aHeTO Ha noAaAeHOTO crapTOBO BpeMe) v\ npeicbCBaHeTO My 
CTaBa caMO npe3 Dispose(). Ako MCKaMe p,a ro pecrapTkipaMe Tpa6Ba p,a 
c"b3AaAeM hob o6eKT. 

System. Threading. Timer - npMMep 

ETO eAMH npMMep 3a ynOTpe6aTa Ha System. Threading. Timer: 



using System; 

using System. Threading; 

class ThreadingTimerClient 

{ 

private Timer mTimer; 
private int mCounter = 0; 

public ThreadingTimerClient ( ) 

{ 

Start ( ) ; 

Thread. Sleep (4000) ; 

Stop ( ) ; 
} 

private void Start ( ) 

{ 

TimerCallback callBack = new TimerCallback (OnTick) ; 

mTimer = new Timer (callBack, null, 0, 1000); 
} 

private void Stop ( ) 

{ 

mTimer . Dispose ( ) ; 

mTimer = null; 
} 

private void OnTick (obj ect state) 

{ 

mCounter++; 

Console . WriteLine (mCounter . ToString ( ) ) ; 
} 

private static void Main ( ) 

{ 

ThreadingTimerClient obj = new ThreadingTimerClient ( ) ; 

} 



340 flporpaMnpaHe 3a .NET Framework (tom 2) 



Pe3y/iTarbT ot M3n"b/iHeHkieT0 Ha nporpaMaTa e: 




System. Windows. Forms.Timer 

npOCTpaHCTBOTO OT MMeHa System. Windows. Forms Cbfl"bp>Ka OLfle eflklH K/iac 

3a TaMMep, komto e etc cneflHaTa flecpMHuuna: 



public cl 

{ 

public 


ass Timer : Component, IComponent, 


Idisposable 


Timer ( ) ; 




public 


bool Enabled{ virtual get ; virtual 


set; } 


public 


int Interval {get; set;} 




public 


event EventHandler Tick; 




public 


void Start ( ) ; 




public 
} 


void Stop ( ) ; 





BtnpeKM, ne MeTOflklTe Ha System. Windows. Forms. Timer MHOTO npw/lkmaT Ha 
Te3M Ha System. Timers . Timer, TO System. Windows . Forms . Timer He kl3nO.fl- 

3Ba ny/ia c hmujkm 3a o6paTHMTe i/i3Bi/iKBaHi/m kbm Windows Forms npi/i/io>Ke- 
HkieTO. BMecTO TOBa, npe3 onpe,qe/ieHO BpeMe tom nycKa Windows cbo6me- 
HkieTO wm_timer b onaujKaTa 3a cbo6meHkifl Ha TeKymaTa HMUJKa. 

l/l3n0/13BaHeT0 Ha System. Windows. Forms. Timer ce pa3/lkmaBa OT ynoTpe6aTa 
Ha system. Timers. Timer, caMO no CMTHaTypaTa Ha .qe/ieraTa 3a o6paTHM 

M3BMKBaHMfl, KOMTO B C/iyna*l e CTaHAapTHMflT EventHandler. 

VS.NET MMa BrpafleHa nOflflP"b>KKa 3a System. Windows. Forms. Timer B flM3aw- 

Hepa cm. Mo>KeM flupeKTHO fla npwB/iankiM TaicbB o6eKT ot pa3,qe/ia Windows 
Forms Btpxy Windows cpopMa. 

T"bM KaTO npn Windows Forms TawMepnTe bcmukm cpyHKunn 3a o6paTHM 
M3BMKBaHMfl ce M3n"b/iH*iBaT Ha MaBHaTa HMiuKa 3a noTpe6i/iTe/iCKi/i*i MHTep- 
cpewc, to HflMa Hy>Kfla ot flont/iHi/iTe/iHa cnHxpoHM3aunfl. ToBa o6ane MO>Ke fla 
e npo6/ieM, 3aiuoTO npn BpeMeoTHeMaiun onepaunn npn^OKeHneTO H^Ma fla 
MO>Ke fla OTroBapa 6tp30. 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 341 

KaK fla M36epeM TaiiMep? 

Ako pa3pa6oTBaMe Windows Forms npw/io>KeHkie, o6mkhob6ho e Haw-^ecHO fla 
M3no/i3BaMe system. windows. Forms. Timer. B noBeneTO flpyrn cnynaw e no- 

yflaHHO fla nO/13BaMe System. Timers. Timer. MeTOflMTe My M3r/ie>KflaT no- 
MHTyMTMBHM M nO-yqo6HI/l OT Te3kl Ha System. Threading. Timer. 

Volatile no/ieTa 

Ako KOfltT hm M3no/i3Ba ny6/ikmHki no/ieTa, to onTi/iMi/i3au.i/ikiTe, komto 
M3BtpujBa KOMnn^aToptT, MoraT fla flOBeflaT ao HeonaKBaHM npo6/ieMki. Ako 
CTOMHOCTTa Ha TaKaBa npoMeH/iMBa ce nponwTa hako/iko ntâ„¢, KOMnw/iaTop"bT 
MO>Ke fla a Keiuupa npn ntpBOTO neTeHe bbb BpeMeHHa ziOKa/iHa npoMeH/iMBa, 
BMecTO fla octiuecTBflBa flocrbn ao Hea npe3 o6eKTa, Ha kototo npwHafl/ie>KM. 
fla pa3MeflaMe cneflHkm npuMep: 



class MyClass 

{ 

public int Number; 






public static void Main ( ) 

{ 

MyClass obj = new MyClass (); 






int numl = obj. Number; 




int num2 = obj. Number; //Compiler may use 
} 
} 


cached value here 



0nTMMM3aunMTe npn KOMnw/iauwfl MoraT fla flOBeflaT ao noflo6peHa 
npon3BOflMTe^HOCT, oco6eHO b umk^m. npo6/ieM"bT e, ne aKO HacTtnn 
npeBK^K)4BaHe Ha aKTMBHaTa Hi/iwKa cnep, kiHkm.kia/iki3au.wflTa Ha numl v\ npeflu 
Ta3M Ha num2, m flpyra HMUJKa npoMeHM CTOMHOcrra Ha Number, to num2 me 
cwvbpwa CTapaTa KeiunpaHa ctomhoct. 

Ako MCKaMe fla M3no/i3BaMe TaKMBa ny6/innHn no/ieTa (a no-npenoptni/iTe/iHO 
e M3no/i3BaHeTO Ha CBOMCTBa) 6e3 fla cnHxpoHM3npaMe M3pn4HO flocTbna ao 
tax, MOxeM fla ce B"b3no/i3BaMe ot volatile no/ieTaTa, komto ce noflfltpwaT 
ot KOMnw/iaTopa Ha C#. Te ce flecpMHupaT c K/iK>noBaTa flyMa volatile: 



public volatile int Number; 



ripn volatile no/ieTa, KOMnn^aToptT He Keiuupa CTOMHOCTra mm, a BMHarn a 
nponi/iTa HaHOBO. BtB Visual Basic.NET H^Ma eKBkiBa/ieHT Ha C# K/iK>noBaTa 
flyMa volatile. npenoptuBaMe BMecTO fla ce no/i3BaT volatile no/ieTa, fla 
cm 3aK/iK>nBaMe M3pn4HO o6eKTa v\nv\ no/ieTaTa, 3a fla rapaHTupaMe 6e3onaceH 

flOCTbn flO TAX. 



342 nporpaMnpaHe 3a .NET Framework (tom 2) 

ACMHXpOHHM M3BMKBaHM5l 

AcuHxpoHHMTe M3BMKBaHMfl ca MomeH MexaHM3tM 3a napa/ie/mo M3n"b/iHeHMe 
Ha hako/iko 3aAa4M, npn komto He e Heo6xoAHMO M3pn4HO fla ce cb3flaBa 
HOBa HMiuKa 3a BCflKa 3aAana. 

KaKBO e aCMHXpOHHO M3BMKBaHe? 

no noflpa36npaHe MeTOflMTe b KOfla Ha nporpaMaTa ce M3n"b/iHflBaT cmh- 
xpohho, ToecT M3n"b/iHeHweTO npeMMHaBa Ha cneRBauxwn onepaTop naK cnep, 
KaTO npnK^K)4M TeKymnflT MeTOfl. ripn acuHxpoHHOTO M3BMKBaHe He ce i/i3naK- 
Ba Kpaa Ha ki3n"b/iHeHkieTO Ha TeKyiuna onepaTop, a BeflHara ce npeMMHaBa Ha 
c^eABaiunfl. 06pa6oTKaTa Ha acuHxpoHHOTO M3BMKBaHe ce M3B"bpujBa b 
OTAe/iHa HMiuKa, koato o6mkhob6ho e ot craHAapTHi/m ny/i c hmujkm. 

Ki>fle ce no/i3Ba acuHxpoHHO M3BMKBaHe? 

B .NET Framework ujupoKO ce M3no/i3BaT acuHxpoHHM M3BMKBaHMfl npn bxoa- 
m3xoa ot cpaw^OBM m Apyrw noTOuw, npn MpexoBM onepaunn c HTTP v\ TCP, 
npn OTAa/ieneHO M3BMKBaHe c Remoting, npn ASP.NET XML ye6 yc/iyrw v\ 
Apyrn. Acmhxpohhoto nporpaMwpaHe ce pea/iw3wpa ziecHO b Hawi/m koa c 
noMOiuTa Ha Ae/ieraâ„¢. KaTO a/uepHaTkiBa MOxeM v\ caMM p,a npeAOcraBMM 
ABeH acuHxpoHeH MHTepcpewc 3a HaiunTe K/iacoBe, KaKTO me bmamm Ma/iKO no- 

K"bCHO. 

Acmhxpohho M3BMKBaHe npe3 ae/ieraT 

fle/ieraTMTe npeAOcraBflT b"B3mo>khoct 3a ziecHO acuHxpoHHO M3BMKBaHe Ha 
CMHxpoHHM MeTOAM. Tpa6Ba caMO p,a cb3AaAeM Ae/ieraT etc curHaTypa, 
ctOTBeTHa Ha MeTOAa v\ MO>KeM p,a ki3no/i3BaMe cpyHKunnTe 3a 3anonBaHe Ha 
acuHxpoHHO M3BMKBaHe: Begininvoke(...) m 3a M3naKBaHe Ha no/iynaBaHe Ha 

pe3y/lTaTa: EndInvoke(...) . 

Acmhxpohho M3BHKBaHe Hpe3 Ae/ieraT - npMMep 

MoxeM pja n^KDCTpupaMe Ka3aHOTO c npocT npuMep, onucBaiu acuHxpoHHO 
cyMnpaHe Ha ABe ue/iw nwc/ia: 



using System; 

using System. Threading; 

class AsyncCallDemo 

{ 

public delegate int SumDelegate (int a, int b); 

public int Sum(int a, int b) 

{ 

Thread. Sleep (3000) ; 
return a + b; 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 343 



} 

static void Main ( ) 

{ 

SumDelegate asyncCall = new SumDelegate ( 
new AsyncCallDemo ( ) . Sum) ; 

Console .WriteLine ( "Starting method async."); 
IAsyncResult status = asyncCall . Beginlnvoke ( 5, 6, null, 

null) ; 
Console .WriteLine ( "Async method is now working..."); 

Console .WriteLine ( "Calling Endlnvoke ( ) ..."); 

Console .WriteLine ( "It will block until method finishes. 

int result = asyncCall . Endlnvoke ( status ) ; 

Console .WriteLine ( "Endlnvoke ( ) returned. " ) ; 

Console .WriteLine ( "Result = {0}", result); 



KaTO pe3y/iTaT ot M3n"b/iHeHi/ieTO, me no/iynwM cneRHwn m3xoa: 



Starting method async. 

Async method is now working. . . 

Calling Endlnvoke ( ) . . . 

It will block until method is finished. 

Endlnvoke ( ) returned. 

Result = 11 



B MeTOAa Sum(...) CMe C/10>KI/I/1I/I pefla Thread. Sleep (3000) M 3aTOBa C/ieA 

c-bo6iueHneTO "It will block until method is finished." ce no/iynaBa 6/w30 3- 
ceKyHAHO 3a6aBAHe. M3BMKBaHeTO Ha Endlnvoke (...) 6/iOKwpa i/i3n"b/iHeHweTO 

Ha TeKyiUa HMUJKa, AOIOTO He npklK/lKDUM CbOTBeTHOTO aCMHXpOHHO M3BMKBaHe. 

Mofle/i 3a acMHxpoHHO nporpaMupai-ie 

no^3BaHeTO Ha nenerajw 3a acMHxpoHHO M3BMKBaHe e yAo6HO, 3aiuoTO He 
M3MCKBa nucaHe Ha mhoto koa. V\Ma o6ane cnynai/i, b komto ce Ha/iara M3pn4- 
ho Aa MMn^eMeHTupaMe acMHxpoHHO M3BMKBaHe Ha MeTOA- ToBa e Heo6xoAn- 
mo, KoraTO 6"bp30AeMCTBneTO e kphtm^ho (ki3no/i3BaHeTO Ha Ae/ieraâ„¢ MO>Ke 
Aa e Te>KKo) v\nv\ aKO MeTOAtT Tpa6Ba Aa ce M3BMKBa caMO acMHxpoHHO. B 
TaKMBa cnynaw ce npenoptuBa cneABaHeTO Ha yTBtpAeHna b .NET Framework 
MOAe/i 3a acuHxpoHHM M3BMKBaHMfl, c komto me ce 3ano3HaeM cera. 

CnrHaTypa Ha MeTOflMTe 3a acuHxpoHHM M3BMKBaHMq 

HeKa Aa npeAOcraBWM acuHxpoHHaTa Bepcua Ha cpyHKUkisua sum(...), koato 
cyMupa ABe ue/ioni/icneHki nwcna. B .NET Framework MeTOAMTe npeAHa3Ha- 

HeHM 3a aCMHXpOHHO M3BMKBaHe M3n0^3BaT HOTaUMflTa BeginXXXXX ( ... ) M 



344 nporpaMnpaHe 3a .NET Framework (tom 2) 

Endxxxxx(.) , KbfleTO xxxxx e CMHxpoHHaTa Bepcufl Ha MeTOfla. B cj\y<Aaa 
Tpa6Ba fla flecpMHupaMe Beginsum(...) m Endsiom ( ... ) , 3a fla HanpaBMM craH- 
flapTHa acuHxpoHHa Bepcua Ha MeTOfla sum(...) : 



IAsyncResult BeginSum (int a, int b, 
AsyncCallback requestCallback, 
object stateObject 



AsyncCallback e Renerar KtM MeTOfl, komto fla ce M3BMKa cnefl npi/iK/iionBaHe 
M3n"b^HeHneTO Ha acuHxpoHHOTO M3BMKBaHe. Ako noflafleM null, HAMa fla ce 
M3n"b/iHM HMiuo cnep, 3aB"bpwBaHeTO. 



int EndSum ( IAsyncResult ar) ; 



Ha 6/lOKHpamklfl MeTOfl EndSum(...) My ce nOflaBa IAsyncResult, BtpHaT KaTO 

pe3y/iTaT ot Beginsum(...) m TaKa ce M3naKBa npkiK/iionBaHeTO Ha pa6oTaTa Ha 

aCMHXpOHHMfl MeTOfl. 

MHTepctieMCbT IAsyncResult 

ETO KaKBM CBOMCTBa npeflOCTaBfl MHTepCpekiCbT IAsyncResult: 



interface IAsyncResult 

{ 

object AsyncState {get;} 

WaitHandle AsyncWaitHandle {get;} 

bool CompletedSynchronously {get;} 

bool IsCompleted {get;} 
} 



AsyncState Bptlfla CblflMfl 06eKT, nOflafleH KaTO stateObject Ha BeginSumO . 

ToBa e Ha^MH 3a cnefleHe Ha CTaTyca Ha pa6oTa v\ caMO acuHxpoHHO 

M3BMKBaHMflT MeTOfl Tpfl6Ba fla ro npoMeHfl. 

AsyncWaitHandle Ce M3nO/13Ba KaTO napaMeTbp Ha MeTOflMTe WaitAll(...) , 
WaitOneO V\J\V\ WaitAny(...) Ha K/iaca WaitHandle 3a M3naKBaHe npMK/lK>HBa- 
HeTO Ha aCMHXpOHHMfl MeTOfl. 

CompletedSynchronously Bptlfla true, aKO aCMHXpOHHMflT MeTOfl e npklK/lKD- 

ni/i/i 6"bp30 pa6oTa, oiue npeflu Kpaa Ha M3BMKBaHeTO Ha Beginxxxxx(.) . 

IsCompleted Bptlfla true aKO aCMHXpOHHMflT MeTOfl e npi/IK/lKDHI/l/l CBOflTa 

pa6oTa. Hpe3 MexaHM3Ma "polling" MO>KeM npe3 onpefle/ieHO BpeMe fla npoBe- 

pflBaMe MCTklHHOCTTa Ha IsCompleted, flOKaTO BtpHe true. 

npoBepxa 3a npMKsiioHBaHe Ha acwHxpoHHOTO 

M3BMKBaHe 

MMa neTkipw HanwHa fla npoBepuM fla/iw e npi/iK/uoni/i/i eflMH acuHxpoHeH MeTOfl 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 345 

- Hpe3 MexaHM3Ma "polling" npOBepflBaMe IAsyncResult. IsCompleted 

npe3 onpefle^eHO BpeMe. 

- Hpe3 hakom ot MeTOflMTe 3a CMHxpoHM3aunfl Ha waitHandie c napa- 

MeTbp CBOMCTBOTO IAsyncResult . AsyncWaitHandle. Mo>KeM M fla 3afla- 

fleM TaMMayT, 3a fla He ce naKa 6e3KpaMHO fl"b/iro. 

- Hpe3 M3BMKBaHe Ha EndXXXXX(.) , KOMTO 6/lOKkipa M3n"b^HeHMeTO, flOKa- 

to acuHxpoHHMflT MeTOfl He CBtpujn pa6oTaTa CM. 

- Hpe3 noflaBaHe Ha MeTOfl 3a o6paTHO M3BMKBaHe Ha Beginxxxxx(...) 
npe3 fle^eraTa Asynccaiiback, komto npneMa eflMHCTBeH napaMeTbp ot 
Tun IAsyncResult. rioflafleHMflT MeTOfl me 6"bfle M3BMKBaH, KoraTO 
acuHxpoHHMflT MeTOfl n p w k/i k> n w pa6oTa. MMaMe flocTtn ao pe3y/iTaTa 

4pe3 CBOMCTBOTO AsyncState. 

kl3naKBaHe Ha acMHxpoHHa onepauun - h$ikosiko npuMepa 

IHe fleMOHCTpupaMe M36poeHMTe noflxoflu c eflMH npuMep, b komto acuH- 
xpohho 4eTeM flaHHM ot cpaM/i. ritpBO me pa3MeflaMe hakom o6lum npoMeH- 
i\v\bv\ v\ MeTOflM Ha K/iaca FileReaderDemo, a nocne nooTfle/iHO cpyHKUMMTe, 
pea^M3npaiun BceKM eflMH ot noflxoflMTe: 



using System; 
using System. 10; 
using System. Text; 
using System. Threading; 

internal class FileReaderDemo 

{ 

private const string FILE_NAME = "data.txt"; 
private const int READ_BUF_SIZE = 8192; 
private const int WAIT_TIMEOUT = 50; 

private Stream GetFileStream ( string aFileName) 

{ 

FileStream stream = 

new FileStream( 

aFileName, FileMode . Open, 

FileAccess . Read, FileShare . Read, 

READ_BUF_SIZE, true) ; 
return stream; 



Acmhxpohho neTeHe c polling: 



public void AsynchronousPollReadFile i 
{ 



346 flporpaMnpaHe 3a .NET Framework (tom 2) 



Stream stream = GetFileStream ( FILE_NAME ) ; 
byte[] buf = new byte [READ_BUF_SIZE] ; 
IAsyncResult readResult = stream. BeginRead ( 
buf, 0, buf. Length, null, null); 

Console .Write ( "Asynchronous Poll Read"); 
while (! readResult . IsCompleted) 

{ 

Thread. Sleep (WAIT_TIMEOUT) ; 
Console. Write ("."); 

} 

Console . WriteLine ( ) ; 

using (stream) 

{ 

int bytesRead = stream. EndRead ( readResult ) ; 

string data = Encoding .ASCII . GetString (buf , 0, bytesRead) 

Console .WriteLine ( "\tCount of bytes: {0}", bytesRead); 

Console. WriteLine ("\tData: {0}\n", data); 
} 



ACMHXpOHHO neTeHe CWaitHandle: 



public void AsynchronousWaitReadFile ( ) 

{ 

Stream stream = GetFileStream ( FILE_NAME ) ; 
byte[] buf = new byte [READ_BUF_SIZE] ; 
IAsyncResult readResult = stream. BeginRead ( 
buf, 0, buf. Length, null, null); 

Console .Write ( "Asynchronous Wait Read"); 

bool finished; 

do 

{ 

finished = readResult . AsyncWaitHandle . 
WaitOne (WAIT_TIMEOUT, false); 

Console. Write ("."); 
} while ( ! finished) ; 
Console .WriteLine ( ) ; 

using (stream) 

{ 

int bytesRead = stream. EndRead ( readResult ) ; 

string data = Encoding .ASCII . GetString (buf , 0, bytesRead) 

Console .WriteLine ( "\tCount of bytes: {0}", bytesRead); 

Console. WriteLine ( "\tData: {0}\n", data); 
} 



ACMHXpOHHO neTeHe C EndRead(...) 



HnaBa 17. Mhotohmiukobo nporpaMnpaHe v\ CMHxpoHM3aumi 347 



public void AsynchronousEndReadFile ( ) 

{ 

Stream stream = GetFileStream ( FILE_NAME ) ; 
using (stream) 

{ 

byte[] buf = new byte [READ_BUF_SIZE] ; 
IAsyncResult readResult = stream. BeginRead ( 

buf, 0, buf. Length, null, null); 
int bytesRead = stream. EndRead ( readResult ) ; 
string data = Encoding .ASCII . GetString (buf , 0, bytesRead) 
Console .WriteLine ( "Asynchronous End Read"); 
Console .WriteLine ( "\tCount of bytes: {0}", bytesRead); 
Console. WriteLine ("\tData: {0}\n", data); 



} 



} 



P,a 3aB"bpujMM c npuMep 3a acuHxpoHHO neTeine c MeTOfl 3a o6paTHO m3bmk- 
BaHe. Hy>KeH hm e eflMH noMomeH K/iac FileReadstate 3a cbCTO^HneTO Ha 
onepaunflTa. Bnoc^eACTBue b MeTOAa onReadcompieted(...) me ro M3no^3- 
BaMe 3a o6pa6oTKa Ha KpawHua pe3y/iTaT: 



public void AsynchronousCallbackReadFile ( ) 

{ 

Stream stream = GetFileStream ( FILE_NAME ) ; 

byte[] buf = new byte [READ_BUF_SIZE] ; 

FileReadstate state = new FileReadstate ( stream, buf ) ; 

AsyncCallback readDone = new 

AsyncCallback (this . OnReadCompleted) ; 
IAsyncResult readResult = stream. BeginRead ( 

buf, 0, buf. Length, readDone, state); 

} 

private void OnReadCompleted ( IAsyncResult aResult) 

{ 

FileReadstate state = (FileReadstate) aResult .AsyncState; 
Stream stream = state . Stream; 
using (stream) 

{ 

int bytesRead = stream. EndRead (aResult ) ; 

byte [ ] buf = state . Buf fer; 

string data = Encoding .ASCII . GetString (buf , 0, bytesRead) 

Console .WriteLine ( "Asynchronous Callback Read"); 

Console .WriteLine ( "\tCount of bytes: {0}", bytesRead); 

Console. WriteLine ("\tData: {0}\n", data); 
} 
} 

internal class FileReadstate 
{ 



348 flporpaMnpaHe 3a .NET Framework (tom 2) 



private Stream mStream; 
private byte [ ] mBuffer; 

public Stream Stream 

{ get { return mStream; } } 

public byte [ ] Buffer 

{ get { return mBuffer; } } 

public FileReadState (Stream aStream, byte [ ] aBuffer) 

{ 

mStream = aStream; 

mBuffer = aBuffer; 
} 



ynpawHeHMA 

1. Hani/iweTe nporpaMa, kohto crapTi/ipa npeABapwTe/iHO 3aAaAeH 6pow 
HMiuKM. BcsiKa HMiuKa M3nncBa "Thread X started", cnn (Thread. Sleep()) 
c/iynaeH 6pow Mki/ikiceKyHAH h M3nncBa "Thread X stopped". X Tpa6Ba p,a ce 
3aAaBa b KOHCTpyKTopa Ha K/iaca, komto cbAtpwa MeTOAa, ki3no/i3BaH b 
ThreadStart fxenevara. 

2. Hani/iweTe Windows Forms npi/i/io>KeHi/ie, KoeTO p,a Ttpcn 3aAaAeH TeKCT 
BtB BCM4KM cpai/i/iOBe ot yKa3aHa AnpeKTopua (noAo6HO Ha TtpceHeTO ot 
Windows Explorer) KaTO ki3no/i3BaTe hmujkm. Pea^M3npaMTe no npaBM/ieH 
Ha^MH npeKpaTABaHe Ha TbpceHeTO. 

3. Pa3MeAatiTe peweHi/ieTO Ha npo6/ieMa "npoki3BOAHTe/i/KOHcyMaTop". Ha- 
npaBeTe npuMepHO npi/i/io>KeHMe, c KoeTO p,a TecTBaTe p,anv\ n peA.fi o>xeHaTa 
pea^M3aunfl pa6oTM KopeKTHO. 

4. PeweTe npo6/ieMa "o6flABaiun cpM/iococpw" npe3 noAxoA^iun CMHxpoHM3a- 
Umohhm MexaHM3MM. HanpaBeTe npn^OKeHne, c KoeTO Aa TecTBaTe p,anv\ 
pa6oTM npaBM/iHO. 

M3no/i3BaHa /liuepaTypa 

1. Muxan/i Ctomhob, Mhotohmlukobo nporpaMnpaHe v\ CkiHxpoHi/i3au.nfl, 
http://www.nakov.eom/dotnet/lectures/Lecture-16-Concurrency-vl.0.ppt 

2. Juval Lowy, "Programming .NET Components", O'Reilly, 2003, ISBN 
0596003471 

3. Tom Archer, Andrew Whitechapel, "Inside C# 2 nd Edition", Microsoft Press, 
2002, ISBN 0735616485 

4. MSDN Library - http://msdn.microsoft.com 



T/iaea 18. Mpewoeo 11 
MHTepHeT nporpaMiipaHe 



ABTOpii 

Teoprn rieH^eB 
MBaw/io XpMCTOB 

He06X0flMMM 3HaHMfl 

- Ba30BM no3HaHMfl 3a .NET Framework 

- Ba30BM no3HaHMfl 3a e3MKa C# 

- 5a30BM no3HaHMfl no KOMniOTbpHM Mpe>KM, TCP/IP, npoTOKO/iw m yc/iyrw 

- no3HaHkifl no mhotohmlukobo nporpaMnpaHe v\ CMHxpoHH3aunfl 

Cb/vbpwaHue 

- OSI MOAe/1. OCHOBHM Mpe>KOBM nOHflTMfl 

- IP aApec, DNS, nopT, MpexoB MHTepc|DeMC 

- TCP, UDP, COKeT Bp-b3Kkl 

- Ochobhm MpexoBM yc/iyrw 

- K/iacoBe 3a MpexoBO nporpaMnpaHe 

- KOMyHMKaUMfl no TCP - TcpClient, TcpListener 

- 06c/iy>KBaHe Ha mhoto K/iweHTM eAHOBpeMeHHO 

- KoMyHMKaunfl no UDP - udpciient 

- K/iaC0BeTe IpAddress, Dns, IPEndPoint 

- CoKeTM Ha hmcko hhbo c K/iaca Socket 

- flOCTbn flO MHTepHeT pecypCM no URI - WebClient, HttpWebRequest, 
HttpWebResponse 

- npoTOKO^M 3a pa6oTa c e-mail. M3npaiuaHe v\ no/iynaBaHe Ha e-mail 

- K/iacoBe 3a M3npaiuaHe Ha e-mail. ripuKpeneHM (fcaw/iOBe (attachments) 

B Ta3M TeMa ... 

B HacToamaTa TeMa me pa3r/ieAaMe hakom ochobhm cpeACTBa, npeA/iaraHM ot 
.NET Framework 3a MpexoBO nporpaMnpaHe. IHe 3anonHeM c KpaTKO BtBe- 
AeHne b npuHunnnTe Ha pa6oTa Ha cbBpeMeHHMTe KOMniOTbpHM Mpexn v\ 
MHTepHeT m me pa3r/ieAaMe npoTOKO/ii/iTe, npe3 komto ce ocbmecrBflBa Mpe- 



350 nporpaMnpaHe 3a .NET Framework (tom 2) 

>KOBaTa KOMyHMKaunfl. 06eKT Ha flucKycua b TeMaTa ca KaKTO K/iacoBeTe 3a 
nporpaMnpaHe Ha hmbo TCP v\ UDP coKeTM, TaKa v\ hakom K/iacoBe, npefl- 
/laramki no-cneuwcpwuHM Bt3MO>KHOCTM - npeAcraBHHe Ha IP aApecw, M3n"b/i- 
HeHne Ha DNS 3aaBKM v\ AP- B Kpaa Ha TeMaTa me ce cnpeM Ha cpeACTBaTa 3a 
M3B/ikmaHe Ha ye6-pecypcn ot 1/lHTepHeT, KaKTO v\ Ha K/iacoBeTe 3a pa6oTa c 
e-mail b .NET. 

OSI MOfle/i 

3a HaMa^ABaHe Ha cno>KHOCTTa Mpe>KMTe ca pa3Ae/ieHki Ha c/ioeBe. BceKM 
cnov\ M3no^3Ba ycnyrwTe Ha c/ioa, HaMnpaiu ce nop. Hero, 6e3 p,a ce MHTe- 
pecyBa ot TOBa KaK pa6oTM tom v\i\v\ no-ropHMAT c/iom. Eto eAHa >KMTekicKa 
cuTyaunfl, b koato 3aA"b/i>KeHMflTa cbiuo ca pa3Ae/ieHi/i Ha c/ioeBe. 

HeKa pa3MeAaMe ro/iHMaTa cocpTyepHa KOMnaHna "Mapc". Ha6/iki>KaBa hobo- 
roAMUJHOTO npa3HeHCTBO Ha cpupMaTa v\ wecptT Ka3Ba Ha ceKpeTapKaTa p,a 
M3npaTM noKaHa Ha npeAaHna K/iweHT r-H Xpmctob. LUecptT He ce MHTepecyBa 
Aa/iw ceKpeTapKaTa me M3npaTM e/ieKTpoHHa noma, p,anv\ me ce o6aAn no 
Te/iecpOHa v\nv\ u\e M3no/i3Ba yc/iyrwTe Ha MecTHaTa noiueHCKa cny>K6a. 3a 
Hero e AOcraTbUHO caMO p,a HapeAM Aa ce M3npaTM noKaHaTa. CeKpeTapKaTa 
ot CBOfl CTpaHa peiuaBa, ne Haw-yaanHO e p,a M3npaTM nucMOTO npe3 noiueH- 
CKaTa c/iy>K6a - HanncBa aApeca, 3a/ien*i MapKM v\ nycKa nucMOTO. CeKpe- 
TapKaTa cbmo He ce MHTepecyBa ot TOBa p,anv\ K/iweHTbT >KMBee b cbceAHna 
KBapTa/i v\nv\ b hhkom Aa/ieneH rpaA- ToBa e pa6oTa Ha noiueHCKaTa c/iy>K6a, 
koato me ce norpuxn 3a AOCTaBKaTa Ha noKaHaTa M3no^3BaMKM KO/ia, B/iaK 
v\nv\ b hakom cnynaw caMO/ieT. 

Eto KaK BceKM enow ce rpn>KM 3a co6cTBeHMTe cm 3aA"b/i>KeHMfl v\ He ce 
MHTepecyBa ot AeTai/i/ikiTe ot pa6oTaTa Ha ocraHa/ikiTe c/ioeBe. 

CnopeA CBeTOBHO B"b3npneTMTe craHAapâ„¢ 3a KOMniOTbpHi/i Mpe>KM Ha opraHM- 
3aun5qTa IEEE (Institute of Electrical and Electronics Engineers) KOMyHMKa- 
UMMTe BtB BCAKa Mpe>Ka ce ocbmecTB^BaT Ha cnep,uv\je 7 HMBa: 



Application ( npmio>KHO hmbo ) 



Presentation ( npeflCTaBMTejiHO hmbo ) 



Session ( cecMMHO hmbo ) 



Transport ( TpaHcnopTHO hmbo ) 



Network ( MpewoBO hmbo ) 



Data Link ( CBi»p3Baino hmbo ) 



Physical ( cpM3MHecKO hmbo ) 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 351 

KoMyHMKaunflTa Ha bcako hmbo 3aBncn ot cneuwa/ieH Ha6op mhctpykumm, 
HapeneH npoTOKO/i, komto yKa3Ba iok Tpa6Ba fla ce MHTepnpeTupa MHCpopMa- 
UMATa, no/iyneHa ot OTcpeiuHaTa crpaHa. 

On3imecKO hmbo 

On3M4ecKOTO hmbo ce rpn>KM 3a npeHacflHeTO Ha ashhm npe3 KOMyHMKa- 
UMOHHaTa cpeAa. OcHOBHa c|DyHKUMfl Ha to3m cj\ov\ e p,a ynpaB/iHBa KOAHpa- 
HeTO m fleKOflnpaHeTO Ha cwrHa/ikiTe, npeACTaB/iflBamw ABOkinHkue uncppn v\ 
1. 

CBl>p3Bail40 HMBO (Ka Ha/1 HO HMBO) 

Tpn>KM ce 3a o6MeHa Ha 6/iOKOBe ashhm Me>KAy ABeTe cm ere mm, KaTO OTKpuBa 
m eBeHTya^HO Kopurupa B"b3HkiKHa/ii/iTe rpeujKM. Ctiuo TaKa ynpaB/iflBa 
AOCTbna ao KOMyHMKaunoHHaTa cpeAa Ha 6a3aTa Ha hakom ot npoTOKO/iMTe: 
Ethernet, Token ring, PPP v\ AP- 

Mpe>KOBO HMBO 

OcurypaBa MapujpyTM3aunflTa Ha eAMHuun MHCpopMaui/m ot MaujMHaTa-M3T04- 
hmk ao MawkiHaTa-no/iynaTe/i. Tunn^HM npoTOKO/iw ca: IPv4, IPv6, ICMP, 
IGMP, X.25, IPX n AP- 

TpaHcnopTHO HMBO 

ToBa hmbo no3BO^ABa KaKTO npeHacflHeTO Ha ojp,ei\uv\ naKeTM, TaKa v\ cb3Aa- 
BaHeTO Ha HaAe>KAHM KOMyHMKaunoHHn KaHa/iM 3a npeHOC Ha ashhh. Tpn>KM 
ce 3a cb3AaBaHe, noAAPt>KKa v\ 3aTBap*iHe Ha KOMyHMKaunoHHUTe KaHa/iw. 
Hakom ot npoTOKO/ikiTe 3a TpaHcnopTHOTO hmbo ca: TCP, UDP, RTP, SPX v\ AP- 

CeCMMHO HMBO 

0praHM3npa v\ cnHxpoHM3npa npo3panHaTa o6MHHa Ha MHCpopMauna Me>KAy 
ABa npoueca b onepaunoHHMTe cucTeMM Ha KOMyHMKaunoHHUTe MaiunHM. Tm- 
nn4HM npoTOKO^n ca: RPC, NetBIOS, X.225 v\ AP- 

npeflCTaBMTe/iHO hmbo 

npeAcraBMTe/iHOTO hmbo ocurypaBa o6iu cpopMaT 3a npeAcraBAHe Ha ashhutc 
no BpeMe Ha TexHi/m o6MeH b Mpe>KaTa. ToBa ce Ha/iara, 3a p,a 6tAe B"b3MO>KHO 

KOMyHMKkipaHeTO Me>KAy KOMnKDTpM C pa3^M4HO npeACTaBflHe Ha ASHHHTe. 

Tunn^HM cxeMM 3a yHncpnunpaHe Ha AaHHkiTe ca : XDR, ASN.l, SMB v\ AP- 

l1pM/10>KHO HMBO 

npoTOKO^MTe ot TOBa hmbo 3aAaBaT cpopMaTMTe m npaBki/iaTa 3a o6MeH Ha 
AaHHM Me>KAy KOMyHMKupaiunTe npn^OKeHna. TaKMBa npoTOKO/in ca Hanpn- 
Mep: HTTP, SMTP, POP3, DNS v\ AP- 



352 nporpaMnpaHe 3a .NET Framework (tom 2) 

Ochobm Ha Mpe>KOBOTO nporpaMiipaHe 

B Ta3M nacr me ce 3ano3HaeM c hhkoi/i ochobhm noHflTna v\ npoTOKO/in 3a 
Mpe>KOBO nporpaMi/ipaine. 

IP aflpec 

IP aflpectT e yHmo/ieH aflpec, v\3uoi\3sau ot Mpe>KOBM ycTpowcTBa (o6mk- 
HOBeHO KOMnKupn). l/l3no/i3Ba ce 3a pa3no3HaBaHe Ha ycrpoMCTBaTa, KoraTO 
Te cm KOMyHMKupaT. IP aApecvr e KaTO Te/iecpOHeH HOMep - KoraTO MCKaTe p,a 
ce CB"bp>KeTe c onpeAe/ieH Te/iecpOHeH nocr, ki3no/i3BaTe HeroBna HOMep. 

CeraujHMflT craHAapTeH npoTOKO/i b MpexnTe e IP Bepcua 4. HeroBMTe aApecu 
ca c ro/ieMMHa 32 6nTa. 06mkhob6ho ce 3anncBaT KaTO neTkipw oceM6nTOBM 
m\cj\a, pa3Ae^eHM c T04Ka, HanpuMep: 194.145.63.12 v\nv\ 212.50.1.217. 
Ta3M Bepci/ia Ha npoTOKO/ia MO>xe p,a npeAOCTaBM HaA 4 MM/iwapAa pa3/ikmHi/i 
aApeca. B noc/ieAHMTe toamhh ce OKa3Ba, ne TOBa He e AOcrarbUHO. 

Pa3pa6oTeH e hob npoTOKO/i - IP Bepcua 6, komto Bee oiue He e ujmpoko 
pa3npocrpaHeH. AApecnTe ot T03M npoTOKO/i ca c ro/ieMkma 128 6nTa. Tex- 
hmjit 6pow e 2 128 , KoeTO e npi/i6/iw3MTe.nHO paBHO Ha 3.403 x 10 38 . 06mk- 
HOBeHO aApecnTe ce 3anncBaT KaTO oceM LuecmakiceTMUHM nwc/ia b MHTepBa/ia 
0-FFFF, HanpuMep: 2001:0db8:85a3:08d3:1319:8a2e:0370:7334. 

Domain Name Service (DNS) 

KoMnKupnTe b MHTepHeT ce pa3no3HaBaT npe3 IP aApecu, ho Te3M hmc/iobm 
MAeHTucpuKaTopn He ca /lecHki 3a 3anoMHAHe ot noBeK. noBeneTO xopa 
npeAno^MTaT p,a pa6oTHT c MMeHa. Ako MCKaTe p,a nponeTeTe HOBMHMTe ot 
CTpaHnuaTa Ha BecTHMK "Kani/iTa/T, me bm e no-/iecHO p,a ce ceTMTe 3a 
www.capital.bg , BMecTO 3a aApeca 193.194.140.15. 3aTOBa e cb3AaAeHa 
cucTeMaTa DNS (Domain Name Service), koato c/iyww 3a ynpaB/ieHwe Ha 
cbOTBeTCTBMATa Me>KAy IP aApecu v\ MMeHa (HapwuaHki AOMeMHn). Tn MO>xe p,a 
npeo6pa3yBa MMeHa b aApecu v\ o6paTHO. 

nopT 

Ha eAMH v\ cbux KOMniOTbp o6mkhob6ho pa6oTAT noBene ot eAHO npM/io>KeHMfl. 
B o6iunfl cnynai/i KOMnK>Tbp"bT MMa caMO eAHa cpi/i3i/meci<a Bp"b3Ka kbm 
MpexaTa. Ta3M Bp"b3Ka MO>xe p,a 6"bAe M3no/i3BaHa 3a KOMyHMKauna c noBene 
ot eAHO npn.no>KeHkie. KaK pa3/iwnaBaMe kom ashhh 3a Koe npM/io>KeHMe ca? 
M3no^3BaMKM 16-6mtobo ni/icno, HapwuaHO nopT, pa3rpaHM4aBaMe KOMyHM- 
KaunoHHMTe KaHa^n Ha pa3/iwnHHTe npw/io>KeHi/ifl eAHH ot Apyr. M3npaman"bT, 
M3npaiuaMKM ashhm 3a AaAeH KOMmoTbp, noAaBa v\ HOMep Ha nopT. TaKa 
MHCpopMaunflTa AOCTura ao npaBki/iHkifl cm no/iynaTe/i - KOHKpeTHOTO npw/io- 
>KeHne, OTroBapaiuo Ha to3m nopT. Hecro ce Ka3Ba, ne AaAeHO npw/io>KeHkie 
"c/iywa" Ha onpeAe/ieH nopT. 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 353 

Ochobhm Mpe>KOBii yc/iym 

B Mpe>xaTa pa6oTAT mhoto craHflapTHki ycnyrw. ripneTO e hakom ot nony/iap- 
HMTe Mpe>KOBM n p m /i owe h m a fla MMaT CTaHAapTeH nopT no no,apa36kipaHe. 
3aTOBa HOMepaTa Ha nopTOBe flo 1024 ca 3ana3eHM 3a craHflapTHM yc/iyâ„¢. 3a 
fla ce M36erHaT npo6/ieMki etc 3ackmaHeTO Ha flBe npi/i/io>KeHi/ifl, komto ce 
onuTBaT fla ki3no/i3BaT eflMH v\ cbu\ nopT, ce npenoptuBa, aKO pa3pa6oTBaTe 
npn^OKeHne, KoeTO "c/iywa" Ha flafleH nopT, fla M36epeTe nopT Hafl 1024. 
noflpo6eH cnncbK c nopTOBeTe, i/i3no/i3BaHi/i ot nony/iapHki npw/io>KeHkifl, 
MO>Ke fla HaMepnTe Ha http://www.iana.org/assiqnments/port-numbers . 



ZTO HflKOM OT 


Han-M3BecTHMTe Mpe>KOBM yc/iyrw: 


Yc/iyra 


nopT 


OnkicaHkie 


HTTP 


80 


flocTtn flo ye6 caMTOBe, pecypcn v\ yc/iyrw 


SMTP 


25 


M3npaiuaHe Ha e-mail 


POP3 


110 


M3B^M4aHe Ha e-mail 


FTP 


21 


flocrbn flo OTfla^e^eHM cpaw/iOBe 


DNS 


53 


M3B/iM4aHe Ha IP no MMe Ha ctpBtp v\ o6paTHOTO 


SSH 


22 


CurypeH flocTtn flo OTfla/ieneH TepMMHa/i 



Mpe>KOB MHTep4>eiic 

Mpe>KOBMAT MHTepcpewc e a6crpaKTHa CTpyKTypa, npe3 koato onepaunoHHaTa 
cucTeMa ynpaB/isiBa M3npaiuaHeTO v\ npneMaHeTO Ha MHCpopMauna no Mpe- 
>KaTa. B"b3MO>KHO e eflHa MaiunHa fla 6"bfle CB"bp3aHa kbm hako/iko Mpe>KM 
eflHOBpeMeHHO. ToraBa kbm BCHKa Mpe>Ka Mawi/maTa MMa pa3/ii/meH MpexoB 
MHTepcpewc. BceKM MHTepcpewc MMa pa3/iwneH IP aflpec, cbOTBeTHO v\ 
MaujMHaTa MMa noBene ot eflMH IP aflpec. 



Loopback MHTep4>eMC 

noBe^eTO MMn^eMeHTauuM Ha IP npoTOKO/ia npeflocraBAT cny>Ke6eH MHTep- 
cpewc 3a o6paTHa Bp"b3Ka kbm /ioi<a/iHaTa Mawkma. Ue/ikiflT TpacpMK, M3npaTeH 
npe3 to3m MHTepcpewc, ce Bptiua o6paTHO Ha KOMniOTbpa, komto ro e 
M3npaTki/i. HaM-M3no^3BaHMflT IP aflpec Ha Loopback MHTepcpewca e 

127.0.0.1 3a IP BepCMfl 4. CTaHflapTHMflT flOMeMH, OTrOBapfllfl Ha T03M MHTep- 

cpewc, e locaihost. ToBa e mhoto no/ie3HO 3a nporpaMMCTUTe, pa3pa6oTBaiun 
Mpe>KOBM npi/i/io>KeHi/m, 3aiuoTO no3BO/iHBa pa3pa6oTBaHeTO v\ TecmaHeTO Ha 
Mpe>KOBM npn^o>KeHMfl, 6e3 fla e Hy>KHO KOMnK)Tbp"bT, Ha komto ce pa3pa6oTBa 
npn^OKeHneTO, fla e CB"bp3aH kbm Mpe>Ka. 



354 nporpaMnpaHe 3a .NET Framework (tom 2) 

npOTOKOJTbT TCP 

ripoTOKO/ivr TCP e eflMH ot Haw-ujupoKO pa3npocTpaHeHMTe npoTOKO/iw 3a 
Mpe>KOBa KOMyHMKaunfl. To3M npoTOKO/i cb3AaBa HaAe>KfleH ABynoconeH KOMy- 
HMKaunoHeH Kanan 3a o6MeH Ha flaHHM. ToBa rapaHTupa, ne M3npaTeHMTe 
flaHHM me npucTurHaT b cbiuna pefl, b komto ca M3npaTeHM. Ako flaHHMTe He 
MoraT p,a ce M3npaTflT v\nv\ no/iynaT, me B"b3HMKHe rpeujKa. KoMyHMKaunoH- 
hmjit KaHa/i ctiuecTByBa, flOKaTO HflKoa ot flBeTe crpaHki He ro npeKpaâ„¢. 
KoMyHMKaunflTa no npoTOKO/ia TCP ce i/i3no/i3Ba b npn^OKeHMfl, b komto 
peAtT Ha npucTuraHe Ha p,auuv\je v\ HaAe>KAHOCTTa ca Ba>KHM. 

npOTOKOJTbT UDP 

ripoTOKO/ivr UDP no3BO^ABa M3npaiuaHe v\ npneMaHe Ha Ma/iKki He3aBMCMMM 
eAMH ot Apyr naKeTM c ashhh, HapeneHi/i datagram riaiceâ„¢. He rapaHTupa 
peAa Ha npucTuraHe Ha datagram naKeTMTe, hmto ne Te m3o6luo me 
npucTurHaT. 3a CMeTKa Ha TOBa e no-6"bp3 ot npoTOKO/ia TCP. l/l3no/i3Ba ce b 
npw/io>KeHi/m, b komto CKopocTTa Ha npeAaBaHe Ha AaHHMTe e no-Ba>KHa ot 
HaAe>KAHOCTTa. HanpuMep, aKO vnep,aje BMAeo MaTepwa/i no 1/lHTepHeT, H^Ma 
Aa e ot ro/iflMO 3HaneHi/ie, aKO ot BpeMe Ha BpeMe BMecTO eAHa TOUKa ot 
eKpaHa ce noflBki 3Be3AnnKa. Ho me e ot to/iamo 3HaneHkie, aKO KaAPMTe ce 
3a6aBAT m ce no/iynaBa 3aB/iwnaHe Ha o6pa3a. B TaKMBa npn^OKeHna e 
/iori/inHO Aa ce M3no/i3Ba npoTOKO/ivr UDP. 

KaK flee OTfla/ieneHM MawMHM cm "roBopnT"? 

Ako MCKaMe Aa ocbmecTBMM Bp"b3Ka Me>KAy ABa KOMmoTtpa v\ Aa pa3MeHMM 
onpeAe/ieHki p,auuv\, ce Hy>KAaeM ot npi/i/io>KeHkie "K/iweHT" v\ npw/io>KeHi/ie 
"ctpBtp": 






flaHHM 
80 4 » 2096 

flaHHM 



^ 




MauiiiHa MauiMHa 

CtpBtp KJIIieHT 

ritpBO Tpa6Ba Aa crapTkipaMe ctpBtpHOTO npw/iOKeHwe, KaTO ro HaKapaMe Aa 
"c/iywa" Ha AaAeH nopT. HeKa TOBa e nopT 80. K/iweHTCKOTO npki/io>KeHMe ce 
crapTi/ipa Ha KOMmoTbpa-K/iweHT v\ ce onuTBa Aa ycraHOBki KOMyHMKaunoHeH 
KaHa/i, CB"bp3BaMKM ce etc ctpBtpHMfl KOMnKDTtp, KaTO yKa3Ba IP aApeca v\ 
nopTa, ki>m komto MCKa Aa ce CB"bp>Ke. 3a Aa e ycneujHa KOMyHMKaunaTa, e 
Hy>KHO K^neHTbT Aa MO>Ke Aa M3npama AaHHM Ha ctpBtpa, ho m cbpBtpvr Aa 
MO>Ke Aa M3npama Ha K/iweHTa. KoraTO ctpBtptT M3npama AaHHM Ha K/iweHTa, 
ce Hy>KAae He caMO ot IP aApec, ho m ot nopT. 3a ue/iTa v\i\v\ K/iweHTbT caM 
onpeAe/ia nopTa, v\nv\ onepaunoHHaTa cwcreMa My 3aAaBa TaKbB. Cnep, KaTO 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMMpaHe 355 

KOMyHMKaunoHHMflT KaHa/i e cb3flafleH, ycneujHO MoraT fla ce o6MeH*iT flaHHM, 
flOKaTO eflHa ot flBeTe crpaHM He npeKpaTM Bp"b3KaTa. 

K/iacoBe 3a MpewoBO nporpaMMpaHe b .NET 

Mpe>KOBOTO nporpaMMpaHe Ha npaKTMKa ce cbcroM b nucaHe Ha koa, komto fla 
ynpaB/iHBa o6MeHa Ha naKeTM flaHHM no MpewaTa v\ fla o6pa6oTBa no/iyneHaTa 
MHCpopMaunfl. K/iacoBeTe, komto .NET Framework npefl/iara 3a TOBa, ca 
pa3npeAe^eHM b flBe ochobhm MMeHHn npocTpaHCTBa - system. Net v\ system. 

Net. Sockets. Hpe3 OnpOCTeHM K/iaCOBe KaTO TcpClient, TcpListener M 

udpciient ziecHO MOxeM fla pea/iM3MpaMe KOMyHMKauna cbOTBeTHO no TCP v\ 
UDP npoTOKO/i. OcBeH tax, MO>KeM fla M3no/i3BaMe no-cpyHKUMOHa/iHMsi K/iac 
socket, KaKTO m MHO>KecTBOTO noMOiflHM K/iacoBe 3a nporpaMMpaHe Ha npn- 
/io>kho hi/ibo (application layer), npe3 komto fla pea/in3wpaMe v\ fla M3no/i3BaMe 
CbOTBeTHkiTe yc/iym (ye6-nporpaMnpaHe, DNS yc/iym, noiueHCKM yc/iym v\ 

T.H.). 

npocTpaHCTBOTO System. Net.Sockets 

TyK ce HaMnpaT cnoMeHaTMTe no-rope ochobhm K/iacoBe 3a ocbiuecTBABaHe Ha 

KOMyHMKaUMfl 4pe3 COKeTM, KaKTO M HflKO/IKO nOMOlflHM K/iaCa, Ha KOMTO HflMa 

fla ce cnMpaMe noflpo6HO - K/iacoBe 3a onuMM, 3a M3K/iioneHMfl m 3a MpexoBO 
nporpaMMpaHe npM mo6m/ihm ycrpoi/icTBa. 

K/iacoBeTe Tcpciient m TcpListener c/iywaT 3a pea/iM3MpaHe Ha Bp"b3Ka no 
TCP npoTOKO/ia. ntpBMflT K/iac ce M3no/i3Ba b K/iMeHTCKaTa nacr ot 
npM/io>KeHMeTO m npe3 Hero ce CB"bp3BaMe no TCP c OTBopeH nopT Ha 
OTfla/ieneHa MaujMHa. MeTOflMTe My no3BO/i*iBaT Bp"b3Ka c onpefle/ieH coKeT m 
npMeMaHe m M3npaiuaHe Ha flaHHM. TcpListener pea/iM3Mpa cbpBtpHaTa nacr 
Ha Bp"b3KaTa - npe3 Hero "c/iywaMe" Ha onpe,qe/ieH nopT 3a MflBaiflM 3aaBKM 

Bp"b3KM M yCTaHOBHBaMe Bp"b3Ka C"bC CtOTBeTHMfl COKeT. 

K/iacbT udpciient M3n"b^HABa 3afla4aTa 3a ocbmecTBABaHe Ha KOMyHMKauMa 
no UDP npoTOKO/ia. KaKTO o6acHMXMe, Ta3M KOMyHMKauMa He BK/iK>nBa 
ycTaHOBABaHe m noflfl"bp>KaHe Ha KOMyHMKauMOHeH KaHa/i, KaKTO e npM TCP, 
eTO 3aiuo to3m K/iac e flocraTbueH 3a pea/iM3MpaHeTO m. 

K/iacbT socket pea^M3Mpa a6crpaKUM5Tra Ha Berkeley Sockets API ( http:// 
www.answers.com/topic/berkeley-sockets ') m e 3HanMTe/iH0 no-cpyHKUMOHa/iHO 
o6o6iueHMe Ha npeflHMTe tpm K/iaca. Hpe3 Hero MOxeM fla ocbiuecTBMM Bp"b3Ka 

nO KOMTO M fla e OT npOTOKO/lMTe Ha Mpe>KOBO M nO-HMCKM HMBa ot OSI 

MOfle/ia, HanpMMep IP, IPv6, ICMP, IDP m flpyrM. K/iacbT MMa MeTOflM KaKTO 3a 
cnywaHe 3a Bp"b3KM m ycraHOBABaHe Ha Bp"b3Ka (connection), TaKa m 3a 
M3npaiuaHe m no/iynaBaHe Ha flaHHM. Hpe3 K/iaca socket MOxeM cbu\o fla 
ocbiuecTBflBaMe m acMHxpoHHO npeflaBaHe Ha flaHHM. 

noc^eflHMflT no-BaxeH K/iac ot TOBa npocTpaHCTBO e K/iacbT Networkstream - 
cneuMa^M3auMfl Ha o6MKHOBeHMfl K/iac 3a noTOK, komto pea/iM3Mpa cneuMCpM- 

4HMTe 3a Mpe>KOB TpaHCCpep Ha flaHHM 0C06eH0CTM. 



356 nporpaMnpaHe 3a .NET Framework (tom 2) 

OcraHa/iMTe n/ieHOBe Ha npocrpaHCTBOTO system. Net. sockets ca pa3/iMHHM 
M36poeHM Ti/inoBe v\ noMOiuHM K/iacoBe KaTO HanpuMep ProtocoiType, 
SocketOptionLevel, MulticastOption M flp. IHe vv\ pa3MeflaMe no-noflpo6HO 
b KOHTeKcra Ha M3no/i3BamMTe vv\ K/iacoBe. npocrpaHCTBOTO cbAtpwa v\ K/iaca 

3a M3K/lK>neHI/m SocketException. 

npocTpaHCTBOTO System. Net 

ToBa npocTpaHCTBO cbAtpwa no-o6iu Ha6op ot K/iacoBe, hhkom ot komto 
pea/iM3kipaT yc/iyrM ot npM/io>KHO hmbo, Apyrn ca noMOiuHM K/iacoBe, komto 
M3no/i3BaMe 3a yao6ctbo, TpeTM cnywaT 3a onunn v\ t.h. 

Hpe3 K/iaCOBeTe HttpWebRequest M HttpWebResponse MO>KeM Rd M3nO/13BaMe 

HTTP ycnyrMTe v\ p,a ocbiuecTBABaMe 3aaBKM c to3m npoTOKO/i ao pa3/iMHHM 
ye6-pecypcn. Hpe3 o6pa6oTKaTa Ha Te3M 3aaBKM v\ OTroBopnTe mm MOweM 
ziecHO p,a nocTpouM npocT BapnaHT Ha o6mkhob6h ye6-6pay3"bp. 

K/iacbT Dns m MeTOAMTe My hm AaBaT AOCTbn ao DNS ycnyrMTe 3a M3B/iMnaHe 
Ha MMe Ha MaiunHa no IP aApeca v\ b MpexaTa v\ o6paTHOTO. 

K/iaCOBeTe Cookie, CookieCollection M CookieContainer C/iy>KaT 3a o6pa- 

6oTKa Ha 6mckbmtkm (cookies). ToBa ca Ma/iKM tskctobm cpaM/iOBe, komto ce 
HaMnpaT Ha K/iMeHTCKMTe MaiunHM. KoraTO noTpe6kiTe/i ce aBTeHTMKupa b 
hhkom cawT, b TaKMBa cpaw^OBe ce 3ana3Ba pa3/iMHHa MHCpopMauna KaTO 

/1MHHM HaCTpOMKM M T.H., KOflTO nOC/ie MO>Ke Rd Ce HeTe OT CbpBtpHOTO 

npn^OKeHne. 

K/iaCOBeTe IPAddress, IPHostEntry M IPEndPoint C/iy>KaT 3a CbxpaHflBaHe 

Ha IP aApecn. ritpBHAT npeAcraBfl eAMH IP aApec, btopmat e cnwcbK ot cbOT- 
BeTHM aApecu v\ MMeHa (no DNS), a TpeTn^T e ABOMKa ot aApec v\ HOMep Ha 
nopT. 

WebRequest M WebResponse Ca a6CTpaKTHM K/iaCOBe, KOMTO CbA"bp>KaT 06lUMTe 

onepauuM, Heo6xoAMMM 3a ocbmecTBHBaHe Ha 3aaBKM kbm MpexoBM pecypcu. 

EAHa TflXHa MMn^eMeHTaUMfl ca HttpWebRequest M HttpWebResponse, KOMTO 

pa3r/ieAaxMe, a Apyra ABOMKa HacneAHMUM ca FileWebRequest v\ 

FileWebResponse, KOMTO OCbLUeCTBflBaT AOCTbn AO pecypCM B"bB CpaM/lOBaTa 

cucTeMa npe3 URI etc cxeMa fiie://xxxx. 

K/iacbT webciient e o6o6meH K/iac, npe3 komto MO>KeM p,a ocbiuecTBABaMe 
AOCTbn ao npoM3BO/ieH pecypc 4pe3 URI (Uniform Resource Identificator) 

bi>b cpaM^OBaTa CMCTeMa, MHTepHeT m/im ziOKa/iHa Mpe>Ka. 

Hpe3 06eKTMTe OT TMn NetworkCredential MO>KeM Rd na3MM MHCpopMaUMfl 3a 

noTpe6MTe^CKO MMe m napo/ia npM aBTeHTMKauMa kbm pa3/iMHHM aApecM b 

Mpe>KaTa, a K/iaCOBeTe SocketPermission, DnsPermission M WebPermission 

KOHTpo/iMpaT AOCTbna ao ctOTBeTHMTe pecypcM. Tax HAMa p,a pa3r/ie>KAaMe 
noApo6HO. 

OcraHa/iMTe K/iacoBe, Renerajv\ m M36poeHM TMnoBe b npocTpaHCTBOTO ca c 
no-orpaHMneHa ynoTpe6a m cnywaT 3a noMOiuHM Ha ocHOBHMTe. 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 357 

ripeflCTaBflHe Ha IP aflpecM b .NET Framework 

npeAM P.a npucTbnuM kbm Mpe>KOBOTO nporpaMnpaHe, Ao6pe e p,a no3HaBaMe 
Ha^MHMTe, no komto aflpecnTe Ha MaiunHMTe b Mpe>KaTa ce npeflCTaBAT b .NET 
Framework. MaKap ne MeTOAMTe, komto me M3no/i3BaMe, necro no3BO/iHBaT v\ 
AnpeKTHO M3nncBaHe Ha aApeca ioto hm3 v\i\v\ hmc/io, n/iaTCpopMaTa npeA-nara 
hako/iko K/iaca, komto Kancy/iMpaT a6cTpaKUMATa Ha Mpe>KOB aApec, v\ ca 
YAo6hm 3a M3no^3BaHe. 

K/iaci>T IP Ad dress 

KaKTO Bene cnoMeHaxMe, BceKM o6eKT ot to3m K/iac npeACTaBa touho eAMH IP 
aApec (o6nKHOBeHM IPv4 aApecu, KaKTO v\ IPv6 aApecu). MoxeM p,a cb3Aa- 

BaMe IPAddress 06eKTM 4pe3 KOHCTpyKTOpMTe MM M/1M 4pe3 CTaTM4HMfl MeTOA 
Parse (string) . 

KoHCTpyKTopvr IPAddress (byte [] ) npneMa 3a apryMeHT MacuB ot 6aMTOBe, 
komto OTroBapyiT Ha 6awTOBeTe Ha IP aApeca, komto MCKaMe p,a npeACTaBMM. 
06"bpHeTe BHMMaHMe, ne nopaAM 6"br b .NET Framework 1.1 T03M KOHCTpyKTop 
pa6oTM KopeKTHO caMO c IPv6 aApecM (npMeMa caMO 16-6aMTOBM MacMBM). 

KoHcrpyKToptT IPAddress (long) MHMUMa^M3Mpa IP aApeca nOCpeACTBOM 
unno no/io>KMTe/iHO hmc/io, KoeTO ce no/iynaBa KaTO noc/ieAOBaTe/iHOcr ot 
6aMTOBeTe, komto cbcraBAT aApeca. 

MeTOAtT Parse (string) ce M3no^3Ba HaM-^ecTO 3a cb3AaBaHe Ha o6eKTM ot 
TMn IPAddress. Tom no/iynaBa eAMH napaMeTbp, komto npeAcraB/iABa craH- 
AapTHMfl bma 3a 3anMCBaHe Ha IP aApecM b Mpe>KaTa - "D.D.D.D" (neTMpM 
AeceTM^HM 4MC/ia b MHTepBa^a 0-255) 3a IPv4 m "H:H:H:H:H:H:H:H" (oceM 
LuecmaMceTMUHM HMC/ia b MHTepBa/ia 0-FFFF) 3a IPv6. TaKtB e m bma^t Ha 
pe3y/iTaTa ot npM/iaraHeTO Ha MeTOAa TostringO Btpxy o6eKT ot K/iaca 

IPAddress. 

3a6e/ie>KeTe, ne 3a M3no/i3BaHeTO Ha mctoam KaTO Parse (string) m 
TostringO c aApecM TMn IPv6, to3m npoTOKO/i Tpa6Ba p,a e MHcra/iMpaH Ha 
onepauMOHHaTa CMcreMa. ripM Windows 2003 Server TOBa e TaKa no 
noApa36MpaHe, ho 3a Windows 2K m Windows XP Tp*i6Ba p.a ce MHcra/iMpa 
P"b4HO, MHCTpyKUMM 3a KoeTO MoraT p,a ce HaMep^T Ha caMTa Ha Microsoft 
( http://www.microsoft.com/technet/prodtechnol/winxppro/plan/faqipv6.mspx '). 

C^eAHMAT npMMep noKa3Ba cb3AaBaHeT0 Ha o6eKT ot TMn IPAddress: 



// 


IPv4 a 


ddress - 


212 


.30.23 


.111 














// 


byte[] 


constructor 


does 


lot work 


on 


.NET 1 


.1 


for 


IPv4! ! ! 


// 


Constructor by 


Ion 


g 
















long addressNumber = 


(long) 


111 


"256 


*256 


*256 + 


23 


*256 


*256 + 




30*256 


+ 212; 




















IPAddress 


addrl = 


new 


IPAdd 


ress 


(add 


ress 


Number 


; 






// 


Parse 


method 




















IPAddress 


addr2 = 


IPAddress 


. Parse (" 


212. 


30.23. 


in 


"); 





358 flporpaMnpaHe 3a .NET Framework (tom 2) 



Console. WriteLine ("addrl={ 0} , addr2={l}", addrl, 


addr2 ) ; 


// IPv6 address - 20ac : 103 : de85 : 12 : : : 1 : 23f 




// byte [ ] constructor 




byte[] bytes2 = { 0x20, Oxac, 0x1, 0x3, Oxde, 0x85, 0x0 


0x12, 0x0, 


0x0, 0x0, 0x0, 0x0, 0x1, 0x2, 0x3 f } ; 




IPAddress addr3 = new IPAddress (bytes2 ) ; 




// Parse method 




IPAddress addr4 = IPAddress . Parse ( "20ac : 103 : de85 


12:0:0:l:23f") ; 


Console. WriteLine ("addr3={ 0} , addr4={l}", addr3, 


addr4) ; 


// Output: 




// addrl=212.30.23.111, addr2=212 . 30 . 23 . Ill 




// addr3=20ac:103:de85:12: :l:23f, addr4=20ac : 103 


de85:12: :l:23f 



3a6e/ie>KeTe, ne npn IPv6 BceKM 6ai/iT b MacuBa OTroBapa caMO Ha flBe wecr- 
HakiceTM^HM uwcppki, T.e. caMO Ha no/iOBi/maTa ot BC^Ka neTkipwukicppeHa 
rpyna. flpyraTa oco6eHOCT e, ne b hhc/ioto ot Tun long, b KoeTO ce ctxpa- 
HflBa aApectT, ce peA^T Ha 6afiTOBeTe e o6"bpHaT, KoeTO 6m mot/io p,a AOBeAe 
AO o6"bpKBaHe, aKO He BHMMaBaMe. 

HflKOM nOSie3HM MeTOA" M CBOMCTBa 

K/iacbT IPAddress pa3no/iara c hjiko/iko yao6hm b"B3mo>khoctm, komto 6nxMe 
momm Aa M3no/i3BaMe. ToBa ca Haw-Bene read-only no/ieTaTa Loopback, Any, 

None M Broadcast, KOMTO HM npeAOCTaBflT HflKO/lKO CTaHAapTHM aApeCa B"bB 
BMAa Ha MHMUMa^M3MpaHM IPAddress 06eKTM. 

- Loopback e /iOKa/iHi/mT aApec (127.0.0.1) Ha Mawi/maTa. 

- Any (0.0.0.0) n None (255.255.255.255) ca a6cTpaKTHM aApecu, komto 
ce M3no/i3BaT npn CB"bp3BaHeTO Ha coKeTM, 3a Aa 03HanaT, ne cbpB"bp"bT 
MO>Ke Aa cnywa 3a MABaiua Bpt3Ka cbOTBeTHO ot BceKM eAHH (Any) v\nv\ 
hmto eAMH (None) aApec. 

- rio/ieTO Broadcast (cbmo 255.255.255.255) npeAOcraBH cneuwa/ieH 
aApec b ziOKa/iHaTa Mpe>Ka. Ako M3npaTMM IP naKeT Ha to3m aApec, me 
ro no/iynaT bcmukm, CB"bp3aHM b Mpe>KaTa. 

- Cbomctboto AddressFamily noKa3Ba pjaiwA aApecbT e ot IPv4 v\nv\ IPv6 
Tun. 

- MeTOAtT GetAddressBytesO Bptiua MacuB ot 6aMTOBeTe Ha aApeca. 
Pe3y^TaTbT ot to3m mctoa MO>Ke Aa ce M3no/i3Ba b KOHCTpyKTopa 
IPAddress (byte []) , komto Bene CnOMeHaXMe. 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 359 



K/iaci>T IPEndPoint 



K/iacbT iPAddress hm Rasa flo6pa a6crpaKUkifl Ha ep,v\H craHAapTeH aflpec b 
Mpe>xaTa, ho KaKTO Bene o6acHMXMe, 3a ncTMHCKa Bpt3Ka c o6MeH Ha flaHHM 
ce Hy>KflaeM v\ ot p,ap,eu nopT. npocTpaHCTBOTO system. Net npeA-nara K/iaca 
IPEndPoint KaTO a6cTpaKunfl Ha abomio (aflpec, nopT), koato Bene Mowe fla 
cny>Kki 3a cb3AaBaHeTO Ha Bp"b3KaTa. 

06eKTMTe ot K/iaca IPEndPoint cb3flaBaMe c eflMH ot flBaTa KOHCTpyKTopa 

IPEndPoint (IPAddress address, int port) V\J\V\ IPEndPoint (long 

address, int port), KaTO npi/i BTopufl noAaBaMe KaTO napaMeTbp nwc/iOBaTa 
ctomhoct Ha aApeca (noAo6HO Ha KOHCTpyKTopa Ha iPAddress). 

CBOMCTBaTa Address m Port AaBaT AOCTbn ctOTBeTHO ao aApeca (bbb bma Ha 

06eKT OT IPAddress) M nopTa Ha ABOMKaTa. CBOMCTBOTO AddressFamily 
othobo yKa3Ba BMAa Ha aApeca (IPv4 v\ IPv6). 

MaKCkiMa/iHi/mT v\ MMHMMa^HMJiT AonycTMM HOMep Ha nopT MOxeM p,a npoBepuM 

C nO^eTaTa MaxPort V\ MinPort. ripn BCe He MinPort 06klKH0BeH0 MMa ctom- 

hoct 0, 3a HaujMTe noTpe6kiTe/iCKki npw/io>KeHkifl e Ao6pe p,a pe3epBnpaMe 
nopTOBe c HOMepa Me>KAy 1024 v\ 65536. KaKTO Bene o6acHMXMe, TOBa e TaKa, 
noHexe ocraHa/ikiTe ca pe3epBnpaHM 3a craHAapTHM ycnyrw. 

C^eAHMAT koa AeMOHCTpupa ct3AaBaHeTO Ha eAHH IPEndPoint o6eKT: 



IPAddress address = IPAddress . Parse ( "212 . 30 . 23 . Ill" ) ; 
IPAddress addressV6 = IPAddress . Parse ( "20a : 103 : d5 : 12 : : : 1 : 2f" ; 

IPEndPoint endpoint = new IPEndPoint (address, 8080 ) ; 
IPEndPoint endpointV6 = new IPEndPoint (addressV6, 8081 ) ; 

Console . WriteLine ( 

"The endpoint ('{0}',{1}) has address type: {2}", 

endpoint .Address, endpoint . Port, endpoint .AddressFamily) ; 
Console .WriteLine ( 

"The endpoint ('{0}',{1}) has address type: {2}", 

endpointV6 .Address, endpointV6 . Port, 

endpointV6 .AddressFamily) ; 

// Output: 

// The endpoint ( ' 212 . 30 . 23 . Ill ' , 8080 ) has address type: 

InterNetwork 

// The endpoint ( ' 20a : 103 : d5 : 12 : : 1 : 2f ' , 8081 ) has address type: 

InterNetworkV6 



KoMyHMKauMfi no TCP coKeT c TcpClient 

3a cb3AaBaHeTO Ha eAHa cpyHKunoHnpaiua TCP Bp"b3Ka ce Hy>KAaeM eAHOBpe- 
MeHHO ot ctpBtpHa m K/iweHTCKa nacr. CtpBtpHaTa nacr e Heo6xoAHMa, 3a p,a 
npneMe "noBMKBaHeTo" ot K/iweHTCKaTa v\ p,a cb3AaAe Bp"b3Ka Me>KAy ABeTe 



360 nporpaMnpaHe 3a .NET Framework (tom 2) 

KpaMHM to4km. 06nKH0BeH0 cbpBtpHaTa nporpaMa noeMa v\ caMaTa komyhm- 
Kaunfl no Bp"b3KaTa. ripn MOfle/ia Ha TCP Bp"b3Kki, B"b3npweT b .NET, Cbp- 
BtpHMAT K/iac TcpListener cny>Ki/i caMO 3a ycTaHOBABaHe Ha Bpt3KaTa c 
K^neHTCKaTa nacr (hm*ito a6cTpaKunfl e K/iacvr Tcpciient). C/iefl TOBa ce 

MHMUMa^M3Mpa BTOpa MHCTaHUMfl Ha K/lkieHTCKMfl K/iaC, KOflTO fla OCblUeCTBM 

caMaTa KOMyHMKauna ot crpaHa Ha cbpBtpa. TaKa Ha npaKTMKa Tcpciient 
Btpujn ocHOBHMTe 3a,qanki, CB"bp3aHM c npeHOca Ha ashhh no TCP Bp"b3KaTa. 
IHe pa3r/ieflaMe ntpBO HeroBMTe oco6eHOCTM v\ Hani/m Ha ynoTpe6a, c/iefl 
KoeTO me ce cnpeM v\ Ha K/iaca TcpListener m me noKa>KeM KaK MO>xe fla ce 
Cb3flafle flByc^OMHO Mpe>KOBO npn^OKeHne, eflHaTa nacr ot KoeTO nrpae 
po/iHTa Ha ctpBtp, a flpyraTa - Ha K/iweHT. 

Cb3flaBaiie vx CBi>p3BaHe Ha TcpClient 

3a cb3flaBaHeTO Ha o6eKT ot K/iaca Tcpciient MO>KeM fla noflxoflMM no flBa 
Ha^MHa - fla cb3flafleM HecB"bp3aH K/iweHT, komto noc/ie fla CBtpweM npe3 
MeTOfla connect (...) , v\i\v\ fla cb3flafleM K/ineHT, komto oiue npn MHnuna^n- 
3npaHeTO cm fla onuTa fla ce CB"bp>Ke c flafleHna cbpBtp. 

HecB"bp3aH K^neHT cb3flaBaMe npe3 KOHCTpyKTopa Tcpciiento. Tom MHnuna- 
/in3wpa TCP coKeT, komto ce o6B"bp3Ba c /iOKa/iHki*i Mpe>KOB MHTepcpewc v\ etc 
cnynawHO M36paH ot onepaunoHHaTa ci/icreMa CBo6ofleH nopT. 3a fla o6pa3y- 
BaMe MCTMHCKa TCP Bp"b3Ka, Tpa6Ba fla 3aflafleM v\ BTopi/m coKeT, komto MO>Ke 
fla 6"bfle KaKTO Ha OTfla/ieneHa Mawkma, TaKa v\ Ha ziOKa/iHaTa. 

3aflaBaHeTO Ha flpyrna Kpaw Ha Bp"b3KaTa npaBMM npe3 MeTOfla 

Connect (address, port) . TOM MMa Tpn BapnaHTa, KaTO B 3aBMCMMOCT OT flaH- 

HMTe, c komto pa3no/iaraMe, MOxeM fla 3aflafleM flBOMKaTa (address, port) 
KaTo: 

- eflMH apryMeHT OT Tl/m IPEndPoint - Connect (IPEndPoint) 

- aflpec KaTO IPAddress 06eKT M nopT KaTO HI/IC/10 - Connect (IPAddress, 
int) 

- aflpec KaTO HI/13 M nopT KaTO HklC/10 - Connect (string, int) 

noc/ieflHkisiT BapnaHT ce ki3no/i3Ba HaM-necro, Tbv\ KaTO He ce Ha/iara fla 
ct3flaBaMe m3^mujhm o6eKTM. flpyrnTe flBa ca no/ie3Hki, KoraTO CMe no/iynw/iw 
aflpeca v\nv\ ua/iaTa flBOMKa KaTO pe3y/iTaT ot flpyra onepauna. 

MeTOfltT connect (...) ce onuTBa fla ocbiuecTBM Bpt3Ka kbm yKa3aHaTa kom6m- 
Haunfl ot aflpec v\ nopT. Ako TOBa CTaHe ycneujHO, Tcpciient o6eKTbT Mi/maBa 
b CB"bp3aHO cbcroflHkie m no Hero Bene MoraT fla ce npeflaBaT flaHHM. B 
npoTMBeH c/iynai/i ce xBtp/ifl socketException c onucaHne Ha rpeujKaTa. Eto 
3aiuo e flo6pe fla orpa>KflaMe M3BMKBaHeTO kbm MeTOfla connect (...) b try- 

catch-finally 6/10K, KaTO B"bB finally naCTTa fla 3aTBapflMe COKeTa npe3 

MeTOfla close o . 

MeTOfltT close o 3aTBapa cb3flafleHMfl coKeT v\ M3B"bpujBa flewcTBi/mTa no 
ocBo6o>KflaBaHeTO Ha pecypcuTe, CBtp3aHM c Hero. KaKTO noBeneTO noflo6HM 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 361 

MeTOflM b .NET, tom ce M3BMKBa aBTOMaTM^HO npn yHMiuo>KaBaHeTO Ha o6eKTa, 
ho BMHarn e Ao6pa v\p,es\ fla cm noflcurypuM M3BMKBaHeTO My b cnynati Ha 
M3K/iK>neHkie, KoeTO B"b3npenflTCTBa aBTOMaTMUHOTO o6ptiueHne kbm MeTOfla. 

Ka3aHOTO flOTyK MO>xeM fla ki/uocrpkipaMe etc cj\ep,uv\s\ npuMep: 



TcpClient client = new TcpClient ( ) ; 
try 

client . Connect ( "www. abv. bg" , 80 ) ; 
catch (SocketException se) 

Console .WriteLine ( "Could not connect: {0}", se .Message) ; 
finally 

client . Close ( ) ; 



ripoMeH/ii/iBaTa client fleK/iapwpaMe M3B"bH try 6/iOKa, 3a fla MO>xeM fla a 
M3no^3BaMe v\ cnep, CB"bp3BaHeTO. 

Cia3flaBaHe Ha CBi>p3aH TcpClient 

BTopuflT BapnaHT 3a CB"bp3BaHe Ha K/ineHTCKua o6eKT e fla M3no/i3BaMe hakom 

OT KOHCTpyKTOpMTe TcpClient ( IPEndPoint endpoint) M TcpClient (string 
address, int port), ripn TAX OTHOBO Ce MHMUMa^M3Mpa COKeT CB"bp3aH C 

ziOKa/iHMfl MpexoB aflpec v\ c npoi/i3BO/ieH CBo6ofleH nopT Ha Mawi/maTa, ho 
BeflHara cnefl TOBa hobmat TcpClient o6eKT onuTBa fla octiuecTBM Bp"b3Ka c 
ABOMKaTa aflpec-nopT, 3aflafleHa ot napaMeTpnTe (cbOTBeTHO nofl cpopMaTa Ha 

IPEndPoint 06eKT V\J\V\ KaTO HM3 M HMC/IO). KaKTO M npM MeTOfla Connect!...), 
aKO Bp"b3Ka He MO>Ke fla ce ycraHOBM, ce XB"bp/lfl SocketException. 



TcpClient client; 
try 

client = new TcpClient ( "www. abv. bg" , 80 ) ; 
catch (SocketException se) 

Console .WriteLine ( "Could not connect: {0}", se .Message) ; 

finally 

if (client != null) 
client . Close ( ) ; 



362 nporpaMnpaHe 3a .NET Framework (tom 2) 

ripM T03M KOfl Tp*l6Ba fla MMaMe npeflBMfl B"b3MO>KHOCTTa KOHCTpyKTOptT fla 
npeflM3BMKa OutOfMemoryException M KOfl"bT client . Close ( ) B"bB finally 
6/lOKa Ha CBOM pep, fla flOBefle flO NullPointerException. Eto 3aiUO TaM 

npoBepaBaMe fla/iw o6eKT"bT ot Ki\v\emcKv\s\ K/iac e 6m/i cb3p,ap,eH v\ eflBa 
ToraBa ce o6p"biuaMe kbm MeTOfla close o . 

Ci>3flaBaHe Ha npocT TCP nopT CKeHep - npuMep 

IHe npn^o>KMM Hay^eHOTO 3a cb3AaBaHeTO v\ CB"bp3BaHeTO Ha coKeTkue ot 
K/iaca Tcpciient, 3a fla npoBepuM cbcroflHkieTO Ha nopTOBeTe Ha /ioi<a/iHaTa 
MaujMHa. 3a ue/ua nocneflOBaTe/iHO me onuTaMe CB"bp3BaHe c aflpec 127.0.0.1 
(/lOKa/iHMfl aApec Ha Mpe>KOBi/m i/iHTepcpewc) Ha pa3/ii/mHi/i nopTOBe v\ me 
npoBepHBaMe p,ai\v\ Bp"b3KaTa e ycnewHa. Ako nonaAHeM b o6pa6oTKa Ha 
ki3K/iK>neHwe Tun socketException, nopTtT 6m Tpsi6Ba/io fla e 3aTBopeH, b 
npoTMBeH cnynaw Bp"b3Ka MO>Ke fla ce ocbiuecTBM v\ noprbT e OTBopeH. 
Pa36npa ce TOBa e npocr npuMep v\ CKeHeptT HHMa fla MMa hmto 6"bp3i/maTa, 

HI/ITO CpyHKUMOHa^HOCTTa Ha MCTMHCKMTe nopT CKeHepM, HO BCe naK fleMOH- 

CTpupa M3no^3BaHeTO Ha K/iaca Tcpciient. 

3a M3rpa>KflaHeTO Ha CKeHepa i/i3n"b/iHflBaMe c/ieflHi/ue crbnKn: 

1. CTapTupaMe VS.NET v\ cb3flaBaMe hob KOH30/ieH npoeKT. 

2. B"bBe>KflaMe KOfla Ha nporpaMaTa, komto e noflo6eH Ha ki3/io>KeHkiTe no- 
rope npuMepn. 3a /iOKa/iHi/m aflpec M3no/i3BaMe no/ieTO iPAddress. 

Loopback. 



using System; 

using System. Net; 

using System. Net . Sockets; 

class SimpleTcpScanner 

{ 

static void Main ( string [ ] args) 

{ 

// Scanning local TCP ports from 130 to 150 
for (int port = 130; port <= 150; port++) 

{ 

Tcpciient tcpciient = new Tcpciient ( ) ; 
try 

{ 

// IPAddress. Loopback = "127.0.0.1" 
tcpciient . Connect ( IPAddress . Loopback, port) ; 
Console .WriteLine ("{ } : open", port); 

} 

catch (SocketException) 

{ 

Console .WriteLine ("{ } : closed", port); 

} 
finally 



T/iaBa 18. Mpe>KOBO v\ MHTepHeT nporpaMkipaine 363 



tcpClient . Close ( ) ; 



} 



3. Cera Bene MOxeM fla crapTwpaMe nporpaMaTa. KaKTO ce BM>Kfla ot 
M3xofla, noBeneTO nopTOBe, komto CMe onkiTa/iw fla otbopmm Ha Ta3M 
MaujMHa, ca 3aTBopeHn: 



o-.\ C:\WlND0WSlSystem32lcmd.exe 


130: closed 


.*. 


131: closed 




132: closed 




133: closed 




134: closed 




135 : open 




136: closed 




137: closed 




138: closed 




139: closed 




140: closed 




141: closed 




142: closed 




143: closed 




144: closed 




145: closed 




146: closed 




147: closed 




148: closed 




149: closed 


. . 


150: closed 




hi |> 



npeflaBaHe Ha flam-ni no TCP cokct npe3 TcpClient m 
NetworkStream 

3a fla M3B"bpujMM KOMyHMKaunfl m npeHOC Ha flaHHM no cb3flafleHaTa TCP 
Bpt3Ka, Tpa6Ba fla M3BMKaMe MeTOfla GetstreamO Ha K/iaca TcpClient, cue a 

KaTO CMe CB"bp3a/lM HailJMfl COKeT K"bM HflKOM CtpBtp. MeTOfl"bT GetStreamO 
Bptlfla 06eKT OT Tkin NetworkStream, 4MMTO MeTOflM M3nO/13BaMe 3a 

npexBtp/isiHeTO Ha MHCpopMauna no Mpe>xaTa. Ako TcpClient o6eKTbT He e 

CB"bp3aH, MeTOfl"bT GetStreamO npeflM3BMKBa kl3K/lK)HeHMe OT Tun 

InvalidOperationException. C/ieflHMflT KOfl Cb3flaBa nOTOK 3a nucaHe B 
Haiunfl TCP COKeT: 



TcpClient client = new TcpClient ( "www. abv. bg" , 80) 
NetworkStream stream = client . GetStream () ; 



K/iaCbT NetworkStream Hac/ieflflBa K/iaca Stream M 3ana3Ba CBOMCTBaTa n 

MeTOflMTe, xapaKTepHM 3a bcmukm noTOun c hakom oco6eHOCTM. Ha npaKTMKa 



364 nporpaMnpaHe 3a .NET Framework (tom 2) 

npeflaBaHeTO v\ npneMaHeTO Ha flaHHM no TCP npoTOKO/i ce CBe>Kfla ao 
ynoTpe6aTa Ha MeTOflkue Read(...) v\ write (...) - b .NET Mpe>KOBaTa Bp"b3Ka 
cbiuo ce npeAcraBfl KaTO a6crpaKui/ifl npe3 ncrroK, b komto MO>Ke p,a ce nuiue v\ 
Aa ce neTe. 

Oco6eHOCTM Ha NetworkStream 

Mpe>KOBMTe noTOun ce xapaKTepn3npaT Haw-Be^e c TOBa, ne He no3BO/iflBaT 
npon3BO^eH Aocrbn ao AaHHMTe. ToBa e TaKa, noHe>Ke AaHHMTe MABaT Ha 
nopunn no TCP Bp"b3KaTa m He e B"b3MO>KHO Aa ce 3Hae touhmat mm pa3Mep, 
hmto Aa ce M36npaT AaHHM Ha npow3BO/iHO macto b noTOKa. Eto 3aiuo 
^eTeHeTO v\ nucaHeTO b MpexoBMTe noTOun e caMO nocneAOBaTe/iHO. no Ta3M 

npM4MHa CBOMCTBOTO CanSeek BMHarM MMa CTOMHOCT false, a M3n0^3BaHeTO 
Ha Hac/ieAeHMTe CBOMCTBa Length V\ Position, KaKTO M Ha MeTOAMTe Seek M 
SetLength, npeAM3BMKBa NotSupportedException. 

flpyra oco6eHOCT e, ne 3aTBapaHeTO Ha Mpe>KOBMfl noTOK c MeTOAa close o 
o6nKHOBeHO He e Heo6xoAHMO - to ce M3B"bpujBa npn 3aTBapaHeTO Ha npw/ie- 
>Kaiunfl coKeT (b cnynafl Tcpciient). 06paTHOTO o6mkhob6ho He e bapho, ho 

MO>KeM Aa M3nO/13BaMe KOHCTpyKTOpa NetworkStream (Socket socket, bool 

ownssocket) , 3a Aa cb3AaAeM noTOK, o6B"bp3aH etc CBtp3aH coKeT, TaKa ne 
3aTBapaHeTO Ha noTOKa, Aa AOBeAe v\ ao 3aTBapaHe Ha coKeTa. 3a ue/iTa Ha 
napaMeTtpa ownssocket Tpa6Ba Aa npucBOMM ctomhoct true. 

KOHCTpyKTOpMTe Ha NetworkStream M3nO/13BaT K/iaca Socket, 3a KOMTO Oiue 

He CMe roBopw/ii/i, ho Te hm AaBaT b"B3mo>khoct Aa M3B/ieneM noTOK ot npon3- 

BO/1HM CBtp3aHM COKeTM C pa3/ll/IHHkl Mpe>KOBM n pOTO KO/1 kl , CTMTa Te Aa MMaT 
CTOMHOCT SocketType . Stream B CBOMCTBOTO SocketType. 3a TOBa me CTaHe 

AyMa othobo Ma/iKO no-K"bCHO. rio/ie3HO e Aa 3HaeM, ne npn ki3no/i3BaHeTO Ha 
Te3M KOHCTpyKTopn MO>KeM Aa 3aAaAeM v\ napaMeTbp ot Tun FileAccess, 
komto Aa ynpaB/iABa v\ pe>KMMa Ha Aocrbn Ha noTOKa (Read, write v\nv\ 

ReadWrite): 



Socket socket = new Socket (AddressFamily. InterNetwork, 

SocketType . Stream, ProtocolType . Tcp) ; 
socket . Connect (new IPEndPoint 

(IPAddress. Parse ( "12 7 . . . 1" ) , 135) ) ; 
NetworkStream stream = new NetworkStream ( socket, 

FileAccess . ReadWrite, true) ; 
// FileAccess values require using the System. 10 namespace 
stream. Close () ; // This also closes the socket 



AKO COKeTbT He e CB"bp3aH, V\S\V\ He e OT nOTOneH Tkin (SocketType. Stream), 
OnMTbT 3a Cb3AaBaHeT0 Ha NetworkStream no T03M COKeT BOAM AO 

ioException. ripaBaTa 3a neTeHe v\ nucaHe Ha noTOKa MoraT Aa 6"bAaT 

npOBepeHM npe3 n03HaTMTe OT nOTOUMTe CBOMCTBa CanWrite V\ CanRead. 
KaKTO BM>KAaMe, K/iaCbT NetworkStream npeA-fiara AOCTa B"b3M0>KH0Câ„¢ M 

pa3^M4HM Ha^MHM 3a AewcrBkie m cb3AaBaHe. flpn Bee TOBa, KoraTO pa6oTMM c 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 365 

onpocTeHMfl K/iac Tcpciient, Haki-yflo6HO e fla i/i3no/i3BaMe MMeHHO MeTOfla 
GetstreamO 3a no/iynaBaHe Ha noTOK, komto e b cbcroyiHkie fla i/i3n"b/iH5iBa 

BCM4KM Heo6xOflMMM 3a TCP Bp"b3KaTa fleMHOCTM. 

npiieMaHe Ha abhhm c NetworkStream 

Cnefl KaTO CMe Cb3fla/iw TCP cokct v\ CMe no/iyni/i/ii/i flocrbn flo noTOK, no 
komto fla M3B"bpujBaMe TpaHecpep Ha MHCpopMauna b to3m coKeT, neTeHeTO 
(npneMaHe) Ha flaHHM MO>KeM fla ocbiuecTBMM c MeTOfla Read(byte[] buffer, 

int offset, int size). napaMeTbpvr buffer e MaCMB, B KOMTO Lfle Cbxpa- 

HABaMe no/iyneHkiTe flaHHM, a size yKa3Ba ko/iko 6awTa fla 6tflaT nponeTeHki 
(Haw-MHoro pa3Mepa Ha MacuBa). napaMeTbptT offset yi<a3Ba ot koa no3M- 
\\v\s\ HaTarbK fla 3anonHe 3anncBaHeTO Ha flaHHM b MacuBa. ToBa ce M3no/i3Ba, 
KoraTO no HflKaKBa npwuwHa neTeM nopunn, no-Ma/iKki ot ro/ieMi/maTa Ha 
6ycpepa v\ c/ieflBamaTa nopui/m Tpa6Ba fla 6"bfle 3anncaHa ot HflKaKBa cneflBa- 
ifla no3Munfl HaTaTtK, 3a fla He npunoKpue Bene nponeTeHi/iTe flaHHM. Eamh 
npuMep 3a neTeHe c MeTOfla Read(...) M3r/ie>Kfla TaKa (3a acHOTa TyK v\ b flpyrn 
npuMepn cnecTABaMe o6pa6oTKaTa Ha M3K/iK)neHi/iflTa, KaKBaTO i/mane He 
Tpa6Ba fla nponycKaMe): 



TcpClient client = new TcpClient ( "www. abv. bg" , 80); 

NetworkStream stream = client . GetStream () ; 

byte[] buffer = new byte [4096]; 

int bytesRead = stream. Read (buff er, 0, buf fer . Length) 



MeTOfltT Read(...) Bptifla 6poa Ha nponeTeHMTe 6ai/iTOBe. Tom He e 3afl"b/i>Kki- 
Te/iHO 6poflT, yKa3aH ot napaMeTbpa size, 3aiuoTO flaHHMTe, M3npaTeHM ot 
OTcpeiflHaTa CTpaHa, MO>xe fla ca no-Ma/iKO. IHe o6"bpHeM BHMMaHne, ne to3m 
MeTOfl 6/iOKkipa ki3n"b/iHeHkieTO Ha nporpaMaTa - TOBa 03HanaBa, ne nocneflBa- 
iflMTe onepauuM He ce i/i3n"b/iH*iBaT, flOKaTO He 6"bflaT nponeTeHM HflKaKBM 
flaHHM (KaKTO m npi/i BCM4KM noTOuw b cmhxpohho M3n"b/iHeHwe). Ako Hanpw- 
Mep M3n"b^HMM ropHMfl npuMep, me ce cnynw touho TOBa - tbm KaTO HaujuaT 
K^neHTCKM coKeT He e M3npaTki/i 3aaBKa kbm abv.bg no TCP Bp"b3KaTa, a 
npocTO ce e CB"bp3a/i, tom HsiMa fla no/iynw HMKaKBM flaHHM OTTaM v\ M3n"b/iHe- 
HueTO Ha nporpaMaTa ocTaBa 6/iOKkipaHO. 

ToBa MO>Ke fla ce M36erHe, KaTO npoBepuM CTOMHOCira Ha cbomctboto 

DataAvailable Ha K/iaca NetworkStream, npeflkl fla M3n"b/1HMM Read(.) . AKO 

TOBa cbomctbo e true, to v\i\v\ b noTOKa MMa flaHHM 3a neTeHe, npn KoeTO 
MeTOfltT Read(...) 3aB"bpujBa, v\nv\ coKeTbT e 3aTBopeH ot OTcpeiflHaTa CTpaHa, 

npM KOeTO Read(...) OTHOBO 3aB"bpilJBa M Bptlfla CTOMHOCT (T.e. TOM He MO>Ke 

noBene hmluo fla nponeTe ot 3aTBopeHMfl coKeT): 



TcpClient client = new TcpClient ( "www. abv. bg" , 80) 

NetworkStream stream = client . GetStream () ; 

byte [ ] buffer = new byte [4096]; 

int bytesRead; 

if ( stream. DataAvailable) 



366 flporpaMnpaHe 3a .NET Framework (tom 2) 



bytesRead = stream. Read (buff er, 0, buf fer . Length) 



C/ieA Ta3M npepa6oTKa nporpaMaTa 3aB"bpujBa ycnewHO npn M3n"b/iHeHMeTO Ha 

TOpHMfl KOfl. 

npeAaBaHe Ha flaHHM c NetworkStream 

M3npaiuaHeTO Ha flaHHM no Bp"b3KaTa CTaBa c noTOHHi/ifl MeTOfl write (byte [] 
buffer, int offset, int size), ripi/i Hero noAaBaMe 6ycpep b naMeTTa, ot 
komto fla ce neTe MHCpopMaunaTa, koato Tpa6Ba fla 6"bfle 3anncaHa b noTOKa. 
napaMeT"bp"bT offset noKa3Ba ot koa no3nunfl HaTaTbK fla ce neTe 
MHCpopMaunfl ot 6ycpepa, a size - ko/iko 6aMTa fla 6"bflaT 3anncaHM ot 6ycpepa 
b noTOKa. MeTOfltT write (...) He Bptiua ctomhoct - aKO He cbmecTByBa 
npo6/ieM Ha no-HMCKO hmbo, HanpuMep c MpexoBaTa Bp"b3Ka, b noTOKa BMHarn 
MO>Ke fla ce 3anniuaT npow3BO/iHO KO/iwuecTBO flaHHM, eTO 3aiuo BMHarn ce 
npaBM onuT fla ce 3anniuaT bcmukm yKa3aHM ot size 6awTOBe. 

Oco6eHOCT Ha Mpe>KOBOTO npeflaBaHe Ha flaHHM no TCP e, ne caMM^T 
npoTOKO/i i/i3no/i3Ba BtTpeujHO 6ycpepnpaHe npn npeflaBaHeTO Ha flaHHM. ToBa 
03Ha4aBa, ne aKO 3anniueM b noTOKa MHCpopMauna, no-Ma/iKa ot pa3Mepa Ha 
to3m BtTpeweH 6ycpep, HAMaMe rapaHuna, ne ta me flocTurHe ao OTcpeiflHaTa 
crpaHa. 3a Ta3M ue/i BMHarn Tpa6Ba fla i/i3no/i3BaMe MeTOfla Flusho c/iefl 
M3BMKBaHeTO Ha write(...). ToBa hm ocurypaBa etc curypHOCT M3npaiuaHeTO 
Ha flaHHMTe no Bpt3KaTa: 



stream. Write (buf fer, 0, buf fer . Length) ; 
stream. Flush ( ) ; 



KoMyHMKauiMfl c TcpClient - npuMep 

IHe fleMOHCTpupaMe eflHO Hant/iHO M3rpafleHO npocTO K/iweHTCKO npw/io- 
>xeHi/ie, pea^M3npaHO c noMOiflTa Ha K/iaca Tcpciient. 3a fla noKa>KeM 
KOMyHMKaunflTa no TCP KaHa/ia, MMaMe flBa BapnaHTa. Mo>KeM fla M3no/i3BaMe 
hhkom ctpBtp b MHTepHeT, a MO>KeM fla M3no^3BaMe v\ /ioi<a/ieH ctpBtp - 
ctpB-bpa IIS (Internet Information Services), komto ce kiHcra/ikipa ioto 
nacT ot Windows 2000, XP v\ 2003 Server. 

HaiuMflT npuMep me pa6oTM no c/ieflHkifl Hankm: ntpBO Cb3flaBaMe MHCTaHuna 
Ha K/iaca Tcpciient, a noc/ie ce onuTBaMe fla ce CBtpxeM c M36paHMfl xoct 
Ha nopT 80, KtfleTO o6mkhob6ho c/iywa HTTP CbpBtp. C/iefl TOBa M3B/innaMe 
noTOKa, b komto me npeflaBaMe flaHHM b OTBopeHna coKeT. Hpe3 MeTOfla 
write (...) me M3npaTMM eflHa 3a*iBKa HTTP GET, c koato fla noncKaMe cbfltp- 
xaHneTO Ha 3ar/iaBHaTa CTpaHnua Ha flOMeMHa, c komto ce CMe ce CB"bp3a/iw. 
riocne npo4MTaMe OTroBopa Ha ctpBtpa KaTO ki3no/i3BaMe MeTOfla Read(...) b 
urncb/i flOKaTO pe3y/iTaTbT ot Hero CTaHe 6aMTa, KoeTO me 03HanaBa, ne 
HflMa noBene MHCpopMauna 3a neTeHe. C/iefl TOBa me OTnenaTaMe to3m 
OTroBop Ha eKpaHa v\ me 3aB"bpujMM M3n"b/iHeHi/ieTO Ha nporpaMaTa. 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 367 



Heo6xoflMMMTe CTtnKM 3a M3rpa>KflaHeTO Ha npuMepa ca cneflHi/iTe. Ako H^Ma 
fla M3no^3BaMe IIS, CTbnKi/ue 1-3 MO>Ke fla ce nponycinaT. 

1. CTapTupaMe IIS, aKO He e Bene crapTkipaH. ToBa MO>Ke fla ce npoBepn no 
cneflHi/ifl Ha^MH - ctpBtptT e crapTwpaH, aKO npn noncKBaHeTO Ha 
aflpec http://localhost/ b 6pay3tpa ce 3ape>Kfla crpaHwuaTa Ha IIS. Ako 
TOBa e TaKa, MO>KeM fla Mi/meM Ha CTtnKa 4. B npoTMBeH cnynai/i 
M3n"b^HABaMe crbnKM 2 h 33a crapTkipaHe Ha cbpBtpa. 

2. B Windows XP MO>xeM fla crapTkipaMe ycnyraTa, koato OTroBapa 3a IIS, 
KaTO OTMfleM b Control Panel | Administrative Tools | Services. 
M36npaMe ycnyraTa IIS Admin ot cnwcbKa, cnefl KoeTO M36npaMe 
eTMKeTa Extended nofl cnncbKa Ha ycnyrwTe v\ mpaKBaMe Btpxy 
npenpaTKaTa Start the service: 



m ® ® m, 



Services (Local) 



*^4 Senricas (Local) 



IIS Admin 

Start the service 



Description: 

Allows administration of Web and FTP 
services through the Internet 
Information Services snap-in 



Name 



J Distributed Link Tracking Client 

i Distributed Transaction Coordinator 

i DNS Client 

J Error Reporting Service 

i Event Log 

i Fast User Switching Compatibility 

jGEARSecurity 

i Help and Support 

J Human Interface Device Access 

JIM API CD-Burning COM Service 
i Indexing Service 

tTi-.l-a.-nah f nr^ ^-h,â„¢ Pimm =11 fir^\ ! TnH I 



' 



\ Extended / Standard / 



Cera OTBapaMe Control Panel | Administrative Tools | Internet 

Information Services v\ npe3 HaBurauna b fltpBOTO ot/ihbo nocneflo- 
BaTe/iHO OTBapaMe Local Computer | Web Sites | Default Web Site. 

Cnep, TOBa Tpa6Ba fla mpaKHeM Btpxy 6yTOHa Start Item Btpxy /ieH- 
TaTa c MHCTpyMeHTM rope baacho: 



368 



flporpaMnpaHe 3a .NET Framework (tom 2) 



met Information Services 



E 



%$ Internet Information Services 



| Path 



Default Web Site (Stopped) 



3- JJ STAVRI (local computer) 
3-Gl Web Sites 

{$â– â– & IISHelp 

H-CJ _vti_bin 

l+l-f^ Printers 

l+l-f^ CrystalReportWebFormVia 

l+l-Pn aspnet_client 



HI 

J 



Nai 

ca 



c:\windows\f 
C:\Program F 
C:\WINDOWj 
E:\Prograrnsi 



4 



Start item 
IISHelp 

yti_bin 

Printers 

CrystalReportWebFormViewer2 

aspnet_client 

CD_Project_WS 

CD_Web 

Demo-9-Northwind5ervice 



4. ripn CTapTupaH IIS, Bene mokcm p,a cb3AafleM hob KOH30/ieH npoeKT bbb 
Visual Studio .NET. 

5. B"bBe>KflaMe KOAa Ha nporpaMaTa. 06"bpHeTe BHMMaHne Ha ynoTpe6aTa 
Ha K/iaca streamwriter, 6/iaroflapeHwe Ha komto M3no/i3BaMe MeTOfla 

WriteLine (...) : 




4 9 6; 



using System; 

using System. 10; 

using System. Net; 

using System. Net . Sockets; 

using System. Text; 

class TcpClientDemo 

{ 

const int RECEIVE_BUF_SIZE 

static void Main ( ) 

{ 

// Connect to the server 

TcpClient tcpClient = new TcpClient ( ) ; 

try 

{ 

tcpClient. Connect ( "localhost" , 80) ; 
// Possibly replace with "www.abv.bg" 

} 

catch (SocketException) 



{ 



Console .WriteLine ( "Error : Unable to connect to the 
server . " ) ; 
Environment .Exit (-1 ) ; 



T/iaBa 18. MpewoBO v\ Mi-rrepHeT nporpaMnpaHe 369 



try 

{ 

NetworkStream ns = tcpClient . GetStream ( ) ; 
using (ns) 

{ 

// Send HTTP GET request to the Web server 
try 

{ 

StreamWriter writer = new StreamWriter (ns ) ; 
writer. WriteLine ("GET http : //localhost/ HTTP/1.0"); 
// Possibly "GET http://www.abv.bg/ HTTP/1.0" 
writer .WriteLine ( ) ; 
writer . Flush ( ) ; 

} 

catch ( IOException) 

{ 

Console .WriteLine ( "Error : Cannot send request."); 

Environment .Exit (-1 ) ; 
} 

// Receive the HTTP answer from the server 
try 

{ 

byte[] buf = new byte [RECEIVE_BUF_SIZE] ; 
while (true) 

{ 

int bytesRead = ns.Read(buf, 0, buf. Length); 
if (bytesRead == 0) 

{ 

// Server closed the connection 
break; 

} 

string data = Encoding .ASCII . GetString (buf , 0, 

bytesRead) ; 

Console .Write (data) ; 
} 
} 
catch (IOException) 

{ 

Console .WriteLine ( "Error : Cannot read the server 
response . " ) ; 
Environment .Exit (-1 ) ; 
} 
} 
} 
finally 

{ 

// Close the connection to the server (if it is still 
open) 



370 



flporpaMnpaHe 3a .NET Framework (tom 2) 




CrapTwpaMe nporpaMaTa. OnaKBaHMHT m3xoa e craHAapTHi/mT HTTP 
OTroBop, komto Tpsi6Ba p,a ctA"bp>Ka th/ioto Ha noncKaHUfl AOKyMeHT. 
Ako CMe ce CB"bp3a/iw kbm IIS, OTroBopvr me hm Ka3Ba, ne o6eKT"bT, 
komto CMe noi/iCKa/ii/i, Mowe p,a 6tAe HaMepeH Ha aApec http://localhost/ 
localstart.asp . Ako He HaweTO K/iweHTCKO npw/io>KeHi/ie, a hakom mctmh- 
ckm 6pay3"bp M3npaTM cbiuaTa 3aaBKa, tom me 6"bAe npeHaconeH MMeHHO 
KtM to3m aApec m me M3npaTM aBTOMaTMUHO HOBa 3aaBKa kbm Hero. 







cv C:\WlNDOWSVSystem32lcmd.exe 


X 


HTTP/i.i 302 Object noved 

Server: Microsof t-I IS/5 .1 

Date: Ued, 27 Jul 2005 18:59:46 GMT 

X-Powered-By: flSP.NET 

Location: localstart.asp 

Connection: Keep-flliue 

Content-Length: 135 

Content-Type: text/html 

Get-Cookie: ASPSESSI0NIDGQGQGZEQ=fiLAPFL0Dr1BJKAKFB0FPLKCIH ; path 

Cache-control: private 

<head><t itle>Object noued</tit le></head> 

KbodyXhl>Object Moved</hl>This object nay be found <a HREF="lo 

e</a>.</body> 




i â–º 
i — i 1 — 


A 



Ako CMe M3no.n3Ba.ni/i IIS, motom p,a bmahm KaKBO CTaBa, KoraTO HHMa 
Bp"b3Ka KtM noco^eHMfl cbpBtp. HeKa cnpeM IIS noAo6HO Ha onucaHMa b 
t. 2 m t. 3 Ha^MH, ho Cbc Stop... BMecTO etc Start..., v\ othobo 
CTapTupaMe nporpaMaTa, me no/iyni/iM cbiuo onaKBaH pe3y/iTaT: "Error: 

Unable to connect to the server.", 3aiUOTO nopT 80 Ha ZlOKa/lHaTa 

MaujMHa e 3aTBopeH v\ MeTOAvr connect (...) npeAH3BHKBa M3K/iK)neHkie. 



HaCTpOMKM Ha TCP Bpi>3KaTa Hpe3 CBOMCTBaTa Ha 

TcpClient 

Hako/iko CBOMCTBa Ha K/iaca TcpClient hm no3BO/iflBaT Aa KOHTpo^npaMe 
pa3^M4HM napaMeTpn Ha KOMyHMKaunaTa no TCP Bpt3KaTa. BHMMaTe/iHOTO hm 
M3no/i3BaHe MO>Ke Aa onTHMH3npa TpaHecpepa Ha AaHHM b hakom no-oco6eHM 
cnynaw, HanpwMep, KoraTO M3no/i3BaMe caMO Ma/iKi/i naKeâ„¢ AaHHM. HanpMMep 

npe3 CBOMCTBaTa NoDelay M SendBuf ferSize MO>Ke Aa ce KOHTpO/lkipa Kora 

T04HO M3npaTeHOTO c"bo6iueHne Aa HanycKa TCP 6ycpepnTe Ha onepauwoHHaTa 
CMCTeMa. rioBene MHCpopMauMa 3a HacTpowKHTe Ha TcpClient MO>Ke Aa ce 
OTKpwe b MSDN AOKyMeHTaukiflTa. 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 371 

M3rpa>KflaHe Ha TCP CbpBi>p c TcpListener 

Cera me pa3r/ieAaMe K/iaca TcpListener, c noMOurra Ha komto MO>KeM p,a 
c"b3AafleM ctpBtpHO npn^o>KeHMe, c KoeTO p,a CBtpweM Bene noKa3aHMfl TCP 
K^neHT. me HanoMHMM, ne to3m K/iac cny>Ki/i eflMHCTBeHO 3a npneMaHe v\ 
MHMuna^M3MpaHe Ha Bpt3Ka (connection) ot crpaHa Ha ctpBtpa, a komyhm- 
KaunflTa no Hea ce ocbmecTBABa npe3 MHCTaHunn Ha K/iaca Tcpciient no 
HankiHMTe, komto Bene pa3r/ieflaxMe. KaK touho ce ocbiuecTBABa Bp"b3KaTa 
Me>KAy ABaTa K/iaca, me pa36epeM ot cneABamkiTe peAOBe. 

Ci>3flaBaHe Ha TcpListener 

K/iaCbT TcpListener MMa ABa KOHCTpyKTOpa, KOMTO Ca MAeHTM4HM - 
TcpListener (IPEndPoint) M TcpListener (IPAddress , int) . M ABaTa KOH- 
CTpyKTOpa 3aAaBaT aApec Ha ziOKa/ieH Mpe>KOB MHTepcpeMC m Ha ziOKa/ieH nopT, 
Ha komto cbpB"bp"bT p,a cnywa 3a noMCKaHa TCP Bp"b3Ka. npM ntpBMfl 
KOHCTpyKTop ABOMKaTa (aApec, nopT) ce 3aAaBa npe3 apryMeHT ot TMn 
IPEndPoint, a npM BTopMfl ce M3no^3Ba aApec noA cpopMaTa Ha IPAddress 
o6eKT m unno hmc/io 3a HOMep Ha nopT. B"b3MO>KHO e p,a ce M3no/i3Ba m 
KOHCTpyKToptT TcpListener (int) , npM komto caMO 3aAaBaMe nopT, ho ce 
npenoptuBa BMecTO Hero p,a ce M3no/i3Ba hakom ot ropHMTe KOHCTpyKTopM. 

Ako He MCKaMe p,a yKa3BaMe KOHKpeTHO Ha kom aApec me "c/iywa" ctpBtptT, 
MO>KeM p,a M3no^3BaMe KOHcrpyKUMHTa iPAddress.Any 3a 3aAaBaHe Ha aApec. 
ToraBa npM Ha/iMUMeTO Ha noBene ot eAMH MpexoB MHTepcpeMC Ha KOMniOTbpa, 
ctpBtptT me cnywa Ha BCMUKMTe. Ako ntK 3a HOMep Ha nopT 3aAaAeM 
hmc/ioto 0, onepauMOHHaTa CMCTeMa aBTOMaTMUHO pa3npeAe/ifl hakom ot 
CBo6oAHMTe nopTOBe Me>KAy 1024 m 65535. 

Ako ocTaBMM nopTa p,a ce M36Mpa aBTOMaTMUHO, to CTOMHOcrra My MO>KeM p,a 
npoBepMM c/ieA TOBa npe3 cbomctboto LocaiEndpoint. To Bptiua ctomhoct ot 
a6cTpaKTHMfl K/iac EndPoint m Tpa6Ba p,a npeo6pa3yBaMe pe3y/iTaTa no cnep,- 
HMfl Ha^MH: 



TcpListener listener 


= new 


TcpListener 


( I PAdd 


ress .Any, 


0); 


listener . Start () ; 
















IPEndPoint endPoint = 


= (IPEndPoint) list 


ener . L 


ocalEndpoint; 


Console . WriteLine 


"Address 


{0}; 


Port: 


{!}", 


endPoint 


.Address, 


endPoint . Port ) ; 
















listener . Stop ( ) ; 
















// Output: 
















// Address: 0.0.0. 


0; 


Port: 


3108 











npueMaHe Ha TCP Bpi>3KH 

B ropHMfl npMMep CMe v\3uoi\3Bai\v\ MeTOAa starto. Hpe3 to3m mctoa yKa3- 
BaMe Ha cbpBtpHMfl o6eKT p,a 3anonHe p,a "c/iywa" 3a Bp"b3KM Ha M36paHMfl (ot 
Hac v\nv\ ot onepauMOHHaTa CMCTeMa) ziOKa/ieH nopT. Bcako K/iMeHTCKO npM/io- 



372 nporpaMnpaHe 3a .NET Framework (tom 2) 

>KeHne, KoeTO ce oni/iTa fla ce CB"bp>Ke c HawaTa Mawkma Ha to3m nopT, Bene 
me MO>Ke fla ocbiuecTBM MCTMHCKa TCP Bp"b3Ka. 

Ako npucTurHaT noBene 3aaBKM 3a Bp"b3KM, Te ce Hape>KflaT b cneuwa/iHa 
onaujKa v\ naKaT fla 6"bflaT npneTM ot cbpBtpa. ripneMaHeTO CTaBa npe3 
MeTOfla AcceptTcpciient ( ) . CnywaHeTO 3a Bpt3KM npofl"b/i>KaBa v\nv\ flOKaTO 
6"bfle M3BMKaH MeTOfltT stopo (npn KoeTO bcmukm Heo6pa6oTeHM 3aaBKM ce 
ry6flT), v\nv\ flOKaTO onaujKaTa ce 3an"b/iHki c MaKCkiMa/iHOTO KO/iwuecTBO 

3aflBKM, npn KOeTO Ce npeflM3BklKBa SocketException. 

MeTOfltT AcceptTcpciient ( ) npweMa ntpBaTa naKama 3asiBKa 3a Bp"b3Ka v\ 
Bptifla KaTO pe3y/iTaT kiHcrai-mkifl Ha K/iaca Tcpciient. Hpe3 MeTOflMTe Ha 
to3m K/iac, komto Bene pa3MeflaxMe, Hue MOweM fla ynpaB/iHBaMe Bpt3KaTa v\ 
fla M3npaiuaMe v\ npneMaMe flaHHM ot CTpaHaTa Ha ctpBtpa no cbiuna Hani/m, 
no komto noKa3axMe npn K/iweHTCKOTO npn^OKeHne. Ha npaKTMKa flBeTe 

CTpaHM M3BtpilJBaT MfleHTM4HM fleMCTBMfl npM npeHOCa Ha flaHHM. 

OnucaHMTe flOTyK fleMCTBua MO>xeM fla fleMOHcrpwpaMe etc cj\ep,uv\s\ KpaTbK 
npuMep : 



TcpListener listener = new 

TcpListener (IPAddress. Parse ("127. 0.0.1"), 2222); 
listener . Start () ; 

TcpClient client = listener . AcceptTcpciient (); //blocks execution 
listener . Stop ( ) ; 

NetworkStream stream = client . GetStream () ; 
using (stream) 

{ 

StreamWriter writer = new StreamWriter ( stream) ; 
writer . WriteLine ( "Hello ! " ) ; 
writer . Flush ( ) ; 

} 

client . Close ( ) ; 



Oco6eHOCTM Ha MeTOAa AcceptTcpClient() 

AcceptTcpciient ( ) e 6/iOKkipama onepaunfl. Ako b onaujKaTa H^Ma naKama 
3aaBKa 3a Bp"b3Ka, M3n"b/iHeHneTO Ha nporpaMaTa 6/iOKkipa ao npucTuraHeTO 
Ha TaKaBa 3asiBKa. 3a fla M36erHeM to3m ecpeKT, MOweM fla npoBep^BaMe 
CTOMHOCTTa, BtpHaTa ot MeTOfla PendingO. Ako ta e true, to MMa 3a*iBKa 3a 
c"b3flaBaHe Ha TCP Bp"b3Ka v\ MO>KeM fla w3no/i3BaMe AcceptTcpciient () , KaTO 
CMe curypHM, ne tom H^Ma fla 6/iOKkipa ki3n"b/iHeHkieTO. 

M3BMKBaHeTO Ha AcceptTcpciient ( ) e B"b3MO>KHO caMO 3a Bene c/iyujam 
ctpBtp (Ha komto e 61/1/1 M3BMKaH MeTOfltT start o), b npoTi/iBeH cnynaw ce 

npeflM3BMKBa M3K/lK)neHMe OT TMn InvalidOperationException). C/iefl 

3aB"bpujBaHeTO My Haw-ropHaTa 3a*iBKa b onaujKaTa ce npeMaxBa OTTaM 1/1 
no/iyneHi/iflT o6eKT ot K/iaca Tcpciient noeMa v\3\\su\o KOMyHMKaunaTa no 
Ta3M Bp"b3Ka. Me>KflyBpeMeHHO ctpBtptT MO>Ke fla npoflt/iwaBa fla cnywa Ha 
yKa3aHMfl nopT. 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 373 

B HaCTHOCT TOpHMTe flyMM 03Ha4aBaT CbLUO, He TcpListener 06eKTbT HflMa 

kohtpo/i Btpxy coKeTMTe, npe3 komto ce pea^M3npaT noeTMTe npn 

AcceptTcpClient ( ) Bp"b3KM M M3BMKBaHeTO Ha MeTOAa Stop ( ) HflMa fla vv\ 

3aTBopn Te3M Bpt3KM. nporpaMMCTbT caM Tpa6Ba p,a ce norpn>KM 3a 3aTBapa- 
HeTO Ha BCAKa OTBopeHa no to3m HanMH Bp"b3Ka. 

MeTOAtT AcceptSocket() 

IHe OT6e^e>KMM HaKpaTKO, ne ocBeH AcceptTcpClient ( ) cbiuecTByBa oiue 
eAMH MeTOA, komto MO>Ke p,a noeMe 3aaBKa 3a TCP Bp"b3Ka. ToBa e MeTOAtT 
Acceptsocket ( ) , c komto npeAaBaMe ynpaB/ieHMeTO Ha Bp"b3KaTa Ha o6eKT ot 
TMn socket, a He Ha o6eKT ot TMn Tcpciient. KaKTO me bmamm no-KbCHO, 
TOBa hm Aasa noBene rbBKaBOcr m b"B3mo>khoctm. 

npocT TCP CbpB-bp - npiiMep 

IHe pa3MeAaMe eAMH no-ufl/iocreH npMMep, komto pea/iM3Mpa cpaBHMTe/iHO 

npOCTO CbpBtpHO npM^O>KeHMe npe3 K/iaCOBeTe TcpListener, TcpClient M 

Networkstream. HaujMflT ctpBtp me cnywa Ha nopT 2222 Ha bcmukm Mpe>KOBM 
MHTepcpeMCM m me nocpeiua BCsiKa K/iMeHTCKa nporpaMa etc 3aaBKa 3a TCP 
Bp"b3Ka. CtpBtptT ce ocBeAOMABa 3a MMeTO Ha K/iMeHTa, M3npaiuaMKM tckctob 
peA no noTOKa, cb3AaAeH ot Bpt3KaTa npe3 K/iaca Networkstream, c/ieA 
KoeTO M3npaiua no3ApaB KbM Hero m npMK/iiouBa Bp"b3KaTa. npMeMaHeTO Ha 

K/lMeHTCKM Bp"b3KM LUe M3B"bpilJMM B UMKb/1, TaKa He HOBa Bp"b3Ka LUe MO>Ke Rd 

6"bAe ocbmecTBeHa eABa KoraTO e npMK/uonM/ia TeKyiuaTa. HaujMflT cbpBtp He 
MO>Ke Aa o6cny>KBa noBene k/imchtm eAHOBpeMeHHO m me npaBM TOBa 
nocneAOBaTe/iHO. KoraTO hakom k/imcht BtBeAe KOMaHAaTa "exit" BMecTO MMe, 

UMKb/l"bT LUe npMK/lKDHM. 

3a Aa nocTpoMM, CTapTMpaMe m TecTBaMe TOBa npM/io>KeHMe, Tpa6Ba Aa M3B"bp- 
ujMM c^eAHMTe CTtnKM: 

1. CTapTMpaMe VS. NET m cb3AaBaMe hob KOH30/ieH npoeKT. 

2. B"bBe>KAaMe KOAa Ha nporpaMaTa: 



using System; 

using System. 10; 

using System. Net; 

using System. Net . Sockets; 

using System. Text; 

class SimpleTcpServer 

{ 

const int LISTENING_PORT = 2222; 
const string EXIT_COMMAND = "exit"; 

static void Main ( string [ ] args) 

{ 

IPEndPoint serverEndPoint = 



374 flporpaMnpaHe 3a .NET Framework (tom 2) 



} 
} 



new IPEndPoint ( IPAddress . Any, LISTENING_PORT) ; 
TcpListener server = new TcpListener ( serverEndPoint) ; 
server . Start ( ) ; 
Console .WriteLine ( "Simple TCP Server started listening on 

{ } . . . " , server . LocalEndpoint ) ; 

while (true) 

{ 

TcpClient client = server . AcceptTcpClient () ; 
Console .WriteLine ( "Accepted client connection."); 
try 

{ 

NetworkStream ns = client . GetStream () ; 
using (ns) 

{ 

StreamWriter writer = new StreamWriter (ns ) ; 

writer .Write ( "Enter your name: "); 

writer . Flush ( ) ; 

StreamReader reader = new StreamReader (ns ) ; 

string name = reader . ReadLine () ; 

if (name == EXIT_COMMAND) 

{ 

break; 

} 

writer .WriteLine ( "Hello, {0}", name) ; 

writer . Flush ( ) ; 
} 
} 
finally 

{ 

client . Close ( ) ; 

Console .WriteLine ( "Client connection closed."); 
} 
} 

server . Stop () ; //This could also be in a try-finally block 
Console .WriteLine ( "Simple TCP Server stopped."); 



CTapTupaMe nporpaMaTa v\ a ocraBaMe fla pa6oTM b naioine Ha 
K/iweiHTCKki 3aHBKi/i 3a TCP Bp"b3Ka. HaujuflT cbpBtp M3Be>Kfla c"bo6iueHne 
"Simple TCP server started listening at 0.0.0.0:2222...". 

3a M3npo6BaHeTO Ha npoeKTa, me Tpa6Ba fla ki3no/i3BaMe H^KaKBO 
K/iweHTCKO npn^OKeHne. ToBa MO>Ke fla e K/iweHTbT, komto M3rpaflMXMe b 
npeflnujHMfl npuMep, ho TyK me M3no/i3BaMe BrpafleHi/m b Windows 
yHMBepca^eH K/iweHT telnet. 3a ue/ua OTBapsiMe Command Prompt ot 
Start MeHiOTO b Windows m/im B"bBe>KflaMe KOMaHflaTa cmd b Run. Ha 
KOMaHflHMfl pefl, npn pa6oTeiu oiue cbpBtp, B"bBe>KflaMe KOMaHflaTa 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 375 



telnet localhost 2222. MoxeM fla bmahm b npo3opeua Ha HaweTO 
npn^OKeHne, ne e npneTa K/ii/ieHTCKaTa Bp"b3Ka v\ Ha eKpaHa Ha telnet ce 
noKa3Ba MCKaHe 3a MMeTO Ha K/iweHTa. B"bBe>KAaMe HflKaKBO MMe, 
ctpBtptT hm M3npaiua oiue eAMH peA h Bp"b3KaTa npi/iK/iiouBa: 



C:\WlND0WSVSystem32Vcmd.exe - Simp leServer.exe 



â–  1 P 



Simple TCP Server started listening on 0.0.0.0:2222... 

Accepted client connection. ^^^^^^^^— 

Client connection closed. | o-\ C:\WlNDOWS\System32kmd.exe 

lEnter jiour name : Joro 
iHello, Joro 



Connection to host lost. 



5. Bp"b3KaTa Ha telnet e npwK/iionM/ia, ho HawkmT ctpBtp npoA"b/i>i<aBa p,a 
c/iywa, AOKaTO BtBeAeM KOMaHAaTa "exit" BMecTO MMe. J\a oni/uaMe p,a 
nycHeM ABe K/iweHTCKM cecnn eAHOBpeMeHHO. IHe ce y6eAHM, ne bto- 
paTa me Tpa6Ba Aa M3nai<a 3aB"bpwBaHeTO Ha ntpBaTa v\ ep&a ToraBa 
no/iynaBa c"bo6iueHneTO "Enter your name:". 

6. Cera motom Aa BtBeAeM v\ KOMaHAaTa "exit" v\ p,a ce y6eAHM, ne th 
HancTMHa nprncniouBa pa6oTaTa Ha cbpBtpa. 

06c/iy>KBaHe Ha MHoro kjwxqhtvx eflHOBpeMeHHO 

Pa36npa ce, cbpBtp, komto MO>Ke Aa o6cny>KBa K/iweHTkiTe caMO nocneAOBa- 
Te/iHO, He e oco6eHO no/ie3eH b npaKTwiOTa. Hy>KAaeM ce ot MexaHM3tM, 
komto Aa no3BO/ii/i Ha ctpBtpa Aa ce 3aHMMaBa He3aBMCMMO etc cb3AaAeHMTe 

K/lkieHTCKM Bp"b3KM. T03M MexaHM3"bM HM Ce OCMTypflBa OT MHOTOHklLUKOBOTO 

nporpaMnpaHe (b>k. TeMaTa 3a hmlijkm m CMHxpoHM3aun?i ). 

CxeMaTa 3a pea/ii/i3i/ipaHe Ha eAHOBpeMeHHO o6c/iy>KBaHe Ha mhoto K/iweHTM e 
cneAHaTa: M3no/i3BaMe eAHH K/iac, komto c/iyww 3a ctpBtp v\ npneMa 
K/ikieHTCKkiTe Bp"b3KM no HanwHa, onucaH b npeAHWHMfl npuMep. 06pa6oTKaTa 
Ha Bp"b3KaTa, koato Aocera npaBMXMe b ta/ioto Ha ctpBtpHMfl K/iac, cera 
M3HacflMe b OTAe^eH K/iac, o6eKT ot komto ce MHMuna^M3Mpa c no/iyneHi/m npn 
npneMaHeTO Ha Bp"b3KaTa Tcpciient. To3m K/iac ocbmecTBABa KOMyHMKaunaTa 
c K/iweHTa, cnep, KoeTO 3aTBapa cb3AaAeHMfl TCP coKeT. 

B ctpBtpHMfl K/iac cnywaMe 3a 3aaBKM 3a TCP Bp"b3KM v\ npn no/iyneHa 
TaKaBa, crapTkipaMe HOBa HMUJKa, koato Aa 3anonHe w3n"b/iHeHi/ieTO cm ot 
r/iaBHMH MeTOA Ha K/iaca, komto me o6pa6oTBa K/iMeHTCKaTa Bp"b3Ka. no to3m 
Ha^MH o6pa6oTKaTa ce ocbmecrBflBa napa/ie/iHO v\ He3aBMCMMO ot npoAt^xa- 
BaiuoTO b ctpBtpHMfl K/iac cnywaHe 3a hobm Bp"b3KM, 3a komto npocTO ce 

Ct3AaBaT HOBM HMUJKH. 

T/iaBHi/iflT MeTOA b CTapTupaHaTa HMUJKa MMa 3aAanaTa Aa 3aB"bpujn KOMyHM- 
KaunflTa c K^neHTa, Aa 3aTBopn coKeTa v\ HaKpaa Aa npeKpaTM co6ctb6hoto cm 
AewcTBue, c KoeTO o6pa6oTKaTa Ha to3m K/iweHT nprncnionBa. 



376 nporpaMnpaHe 3a .NET Framework (tom 2) 

Ka3aHOTO flOTyK me ki/uocrpkipaMe c eflHO Bene 3aB"bpiueHO no-cpyHKUkiOHa/iHO 
npn^OKeHne etc ctpBtpHa v\ K/iwei-iTCKa nacr. 

EflHOBpeMeHHO o6c/iy>KBaHe Ha K/meHTM c TcpListener 
- npMMep 

C T03i/i npuMep me noKaxeM iok ce pea/iM3Mpa cxeMaTa, koato o6acHMXMe no- 
rope. 3a CbpBtpeH K/iac me HM C/iy>KM K/iaCbT ThreadedTcpServer, KOMTO e 

aHa/iomneH Ha K/iaca ot npeAMWHMH npMMep (oTBapa nopT 2222 Ha /iOKa/i- 
HaTa MaujMHa v\ cnywa Ha Hero), ho He o6pa6oTBa K/iMeHTCKaTa Bp"b3Ka. Ta3M 
ziorMKa me M3HeceM b Apyr K/iac - ciientThread, b 4mmto KOHCTpyKTop me 
noflaBaMe KaTO napaMerbp o6eKTa ot K/iaca Tcpciient, komto me no/iynMM ot 

ThreadedTcpServer npn npneMaHeTO Ha HOBa K/lMeHTCKa Bp"b3Ka. 

KoMyHMKaunflTa c K/iMeHTa ocbmecTBABaMe b MeTOfla serveciient ( ) Ha 
K/iaca ciientThread. J\o HeroBOTO M3n"b^HeHne crura Me npe3 cb3flaBaHe Ha 
HMiuKa nocpeACTBOM K/iaca Thread, cnep, KoeTO b th/ioto My me 3aTBopnM 
OTBopeHMTe coKeT m noTOK m me npkiK/iKDHMM M3n"b^HeHneTO Ha HMUJKaTa. ripn 
B"b3HMKBaHe Ha npo6/ieM (M3K/iK>neHMe), nporpaMaTa yBeAOMABa 3a rpeujKa. 
Me>KAyBpeMeHHO ctpBtptT npoA"b/i>i<aBa p,a cnywa 3a hobm Bp"b3KM (tom H5iMa 
Aa npeKpaTABa pa6oTaTa cm npM KOMaHAaTa "exit", iokto 6eiue npM npeAMiu- 
HMfl npMMep). 

IHe cb3AaAeM m eAHO K/iMeHTCKO npM/ioweHMe b paMKMTe Ha Ta3M AeMOH- 
CTpauMfl, KoeTO Aa noAo6pM HaiueTO cbiuecTByBaiuo npM/io>KeHMe ot ntpBMfl 
npMMep. TyK me M3no/i3BaMe cneuMa/ieH K/iac, komto p,a ocbiuecTBABa caMO 
^eTeHeTO m nMcaHeTO Ha ashhm, KaTO ABeTe AeMHOCTM me crapTMpaMe b 
OTAe^HM HMiuKM. no to3m HanMH cm ocMrypyiBaMe 6e3npo6/ieMHOTO eAHOBpe- 
MeHHO M3B"bpujBaHe Ha ABeTe AeMHOCTM, komto no npMHUMn ca 6/iOKMpaiuM 
onepauMM m MoraT Aa cb3AaAaT npo6/ieM npM HeBHMMaTe/iHO cmhxpohm3m- 
paHe. 

Ci>3AaBaHe Ha mhoi-ohmlukob TCP o>pBi>p - npMMep 

CTtnKMTe 3a pea/iM3auMH Ha ctpBtpHOTO npM/io>KeHMe ca cneAHMTe: 

1. C"b3AaBaMe hob KOH30/ieH npoeKT bbb VS .NET. 

2. B"bBe>KAaMe KOAa Ha K/iaca ThreadedTcpServer: 



using 


System; 




using 


System. 10; 




using 


System. Net; 




using 


System. Net .Sockets; 




using 


System. Threading; 




class 

{ 

con 


ThreadedTcpServer 




st int LISTENING PORT = 


= 2222; 



T/iaBa 18. Mpe>KOBO v\ MHTepHeT nporpaMkipaine 377 



public static void Main ( ) 

{ 

IPEndPoint serverEndPoint = 

new IPEndPoint (IPAddress. Any, LISTENING_PORT) ; 
TcpListener server = new TcpListener ( serverEndPoint ) ; 
server . Start ( ) ; 

Console .WriteLine ( "Server started listening on {0}...", 
server . LocalEndpoint) ; 

while (true) 

{ 

TcpClient client = server . AcceptTcpClient () ; 
ClientThread clientThread = new ClientThread (client ) ; 
Thread thread = new Thread ( 

new ThreadStart (clientThread. ServeClient) ) ; 
thread. Start ( ) ; 
} 
} 



} 



3. flo6aBAMe v\ Kop,a Ha K/iaca clientThread. OcHOBHkiflT MeTOA TyK, KaKTO 
Bene o6flcm/ixMe, e serveciient ( ) , komto M3B"bpujBa pa6oTaTa no KOMy- 
HMKaunflTa c K^neHTa. M3no/i3BaMe noMOiuHMTe MeTOAM sendText( 

string) M ReceiveLine ( ) , KOMTO CbOTBeTHO M3npaiuaT M npneMaT 

c"bo6iueHMflTa ao v\ ot K/iweHTCKOTO npn^OKeHne. Te Ha cbom pefl 

M3nO/13BaT K/iacOBeTe StreamReader M StreamWriter 3a nO-yao6Hkl 

noTO^HM onepaunn. Othobo o6p"biuaMe BHMMaHne Ha ynoTpe6aTa Ha 
MeTOfla Fiush(). 3afla/iki CMe v\ ctomhoct 10 ceKyHflu Ha cbomctboto 

ReceiveTimeout. B C/iynaw Ha BXOflHO-M3XOflHM V\I\V\ Mpe>KOBM rpeilJKM, 

me npeAM3BMKaMe eAHO noTpe6i/iTe/iCKO M3K/iK)neHMe ot K/iac 

SendReceiveException, KOMTO C"b3AaBaMe HaKpafl: 



class ClientThread 

{ 

const int SOCKET_TIMEOUT = 10 * 1000; // 10 seconds 

private TcpClient mTcpClient; 

private NetworkStream mNetworkStream; 

private StreamReader mReader; 

private StreamWriter mWriter; 

public ClientThread (TcpClient aTcpClient) 

{ 

mTcpClient = aTcpClient; 

mTcpClient .ReceiveTimeout = SOCKET_TIMEOUT; 

mNetworkStream = mTcpClient . GetStream () ; 

mReader = new StreamReader (mNetworkStream) ; 

mWriter = new StreamWriter (mNetworkStream) ; 
} 



378 flporpaMnpaHe 3a .NET Framework (tom 2) 



public void ServeClient ( ) 

{ 

Console .WriteLine ( "Accepted client connection."); 
try 

{ 

SendText ( "Enter your name: "); 

string name = ReceiveLine ( ) ; 

string response = "Hello, " + name + "\n"; 

SendText (response) ; 

} 

catch (SendReceiveException sre) 

{ 

Console .WriteLine ( sre .Message) ; 

} 
finally 

{ 

mNetworkStream. Close ( ) ; 

mTcpClient . Close ( ) ; 

Console .WriteLine ( "Client connection closed."); 
} 
} 

private void SendText ( string aText) 

{ 

try 

{ 

mWriter .Write (aText) ; 

mWriter . Flush ( ) ; 

Console. WriteLine ("Sent: {0}", aText . Trim (' \n ')) ; 

} 

catch (IOException ioex) 

{ 

throw new SendReceiveException ( 

"Error: Can not send data to the client.", ioex) ; 
} 
} 

private string ReceiveLine ( ) 

{ 

try 

{ 

string line = mReader . ReadLine ( ) ; 
if (line == null) 

{ 

throw new SendReceiveException ( 

"Error: Connection closed by the client.", null) 

} 

Console .WriteLine ( "Received: {0}", line); 

return line; 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMnpaHe 379 



} 

catch (IOException ioex) 



{ 



throw new SendReceiveException ( 

"Error: Can not receive data from the client.", ioex) ; 



class SendReceiveException : ApplicationException 

{ 

public SendReceiveException (String aMessage, 

Exception aCause) : base (aMessage, aCause) 
{ 

) 



Ha to3m eTan MO>KeM fla crapTwpaMe npn^OKeHneTO v\ othobo fla v\3non- 
3BaMe telnet, 3a fla ce CBtpweM c locaihost Ha nopT 2222. KaKTO v\ b 
npeflnujHMfl npuMep, onuTBaMe fla ocbiuecTBMM eflHOBpeMeHHO hako/iko 
K^neHTCKM cecnn. To3m ntT TOBa He e npo6/ieM 3a noflo6peHMfl cbpBtp. 
ripn TecTBaHeTO Tpa6Ba fla MMaMe npeflBMfl, ne CMe Hacrpoi/i/iM ctpBtpa 
fla nai<a 10 ceKyHflu 3a B"bBe>KflaHe Ha bxoa ot K/iweHTa, cnep, KoeTO 
Bpt3KaTa ce npeicbCBa (TaicbB c/iynaw ce BM>Kfla Ha KapTMHKaTa). no 
>xe/iaHi/ie motom fla yBe/ii/mwM Ta3M ctomhoct. 



o--\ C:\WlND0WSlSystem32tcmd.exe - Server.exe 



Server started listening on 0.0.0.0:2222... 

Accepted client connection. 

Sent: Enter your name: 

Error: Can not receive data from the client 

Client connection closed. 

Accepted client connection. 

Sent: Enter your name: 

Accepted client connection. 

Sent: Enter your name: 

Received: Joro 

Sent: Hello, Joro 

Client connection closed. 

Received: Pesho 

Sent: Hello, Pesho 

Client connection closed. 






Gb3AaBaHe Ha mhctohmlukob TCP k/ihcht - npMMep 

HeKa cera c"b3flafleM K/iweHT 3a Haujua ctpBtp. Heo6xoflMMO e K/iweHTbT fla e 
cnoco6eH eflHOBpeMeHHO fla neTe flaHHM ot cbpBtpa v\ fla naKa bxoa ot koh30- 
/iaTa. ripn npucTuraHe Ha flaHHM ot ctpBtpa tom vv\ OTnenaTBa Ha KOH30/iaTa, 
a npo^eTeHOTO Ha KOH30/iaTa M3npaiua kbm ctpBtpa. no to3m HanwH cuMy- 
ziwpa noBefleHneTO Ha CTaHflapTHna telnet K/iweHT b Windows. 



380 nporpaMnpaHe 3a .NET Framework (tom 2) 

Eto CTbnKMTe 3a cb3flaBaHeT0 Ha K/iMeHTCKOTO npn^OKeHne: 

1. Cb3AaBaMe hob KOH30/ieH npoeKT bbb VS .NET, KbAeTO me pea/iM3MpaMe 
K/ii/ieHTCKO npn^OKeHne. 

2. BtBe>KflaMe KOAa Ha K/iaca client, ripn pea/iM3auM*iTa My, iokto Bene 
cnoMeHaxMe, me cb3flafleM flBe hmujkm, eflHaTa ot komto me neTe, a 
ApyraTa me nrnue. M ABeTe 3anonBaT b rflaBHMJi MeTOA Ha K/iaca 

TextTransmitter, KOMTO me Cb3AaAeM CJieA Ma/IKO, KaTO MHMUMa- 

^M3npaT HeroBM MHCTaHunn c pa3^M4HM noTOun. HnujKaTa, koato me 
neTe ot noTpe6nTe^fl v\ me npama kbm cbpBtpa i/i3no/i3Ba 3a neTeHe 
noTOKa console, in, a 3a ni/icaHe - ct3AaAeHna ot Mpe>KOBMfl noTOK 

StreamWriter. 06paTHO, HMUJKaTa, KOflTO neTe OT CbpBtpa M M3Be>KAa 

Ha eKpaHa, me M3no/i3Ba 3a neTeHe M3B/ieneHMfl Mpe>KOB noTOK, o6bmt c 

MHCTaHUMfl Ha StreamReader, a me nMLUe B KOH30/1HMA nOTOK 

console. out. Btpxy HMiuKMTe ce M3n"b/iH*iBa MeTOAtT Join(), komto, 
KaKTO 3HaeM ot MaBaTa 3a MHoroHMUJKOBO nporpaMnpaHe , Kapa TeKy- 
maTa Hi/iwKa Aa M3naKa npMK/iionBaHeTO Ha Te3M ABe hmujkm, npeAM Aa 
MO>Ke Aa 3aB"bpujM: 



using System; 

using System. Net; 

using System. Net . Sockets; 

using System. 10; 

using System. Threading; 

class Client 

{ 

const string SERVER_HOST = "127.0.0.1"; 
const int SERVER_PORT = 2222; 

static void Main ( string [ ] args) 

{ 

TcpClient tcpClient = new TcpClient ( ) ; 
try 

{ 

tcpClient. Connect (SERVER_HOST, SERVER_PORT) ; 

} 

catch (SocketException) 

{ 

Console .WriteLine ( "Can not connect to the server."); 

Environment .Exit (-1 ) ; 
} 

NetworkStream ns = tcpClient . GetStream () ; 
using (ns) 

{ 

StreamReader reader = new StreamReader (ns ) ; 
TextTransmitter serverToConsole = 

new TextTransmitter ( reader, Console . Out ) ; 



T/iaBa 18. Mpe>KOBO v\ Mi-rrepHeT nporpaMkipaine 381 



Thread serverToConsoleThread = new Thread ( 

new Threads tart ( serverToConsole . Transmit) 
serverToConsoleThread. Start ( ) ; 

StreamWriter writer = new StreamWriter (ns ) ; 
TextTransmitter consoleToServer = 

new TextTransmitter (Console . In, writer); 
Thread consoleToServerThread = new Thread ( 

new Threads tart (consoleToServer . Transmit) 
consoleToServerThread. Start ( ) ; 

serverToConsoleThread. Join ( ) ; 
consoleToServerThread. Join ( ) ; 



HaKpafl Cb3AaBaMe M K/iaca TextTransmitter. Tom e o6iu K/iac, KOMTO 
npneMa b KOHCTpyKTopa cm ep,v\u noTOK 3a ni/icaHe v\ ep,v\u 3a neTeine, 
cnefl KoeTO b ochobhma cm MeTOfl Transmit () M3no/i3Ba 6e3KpaeH 
UMK"b/i, 3a fla neTe ot ntpBMfl noTOK m fla 3anMCBa nponeTeHOTO bbb bto- 

PMA. riO T03M HaHMH HMUJKMTe, KOMTO M3nO/13BaT KOH30/iaTa 3a pa3/lMHHM 

ue/iM, He cm npenaT m KOMyHMKauMsua ce ocbiuecTBABa r/iaflKo: 



class TextTransmitter 

{ 

const int BUFFER_SIZE = 1024; 

private TextReader mReader; 
private TextWriter mWriter; 

public TextTransmitter (TextReader aReader, TextWriter aWriter) 

{ 

mReader = aReader; 

mWriter = aWriter; 
} 

public void Transmit ( ) 

{ 

char[] buf = new char [BUFFER_SIZE] ; 
while (true) 

{ 

int charsRead = mReader . Read (buf , 0, buf . Length) ; 
if (charsRead == 0) 

{ 

// End of the stream reached --> the socket is closed 
Environment .Exit (-1 ) ; 

} 

mWriter .Write (buf , 0, charsRead); 

mWriter . Flush ( ) ; 



382 



flporpaMnpaHe 3a .NET Framework (tom 2) 




4. Cera Bene CMe totobm fla crapTwpaMe Haujua K/iweHT. 3a nenra crapâ„¢- 
paMe m ctpBtpa (aKO CMe ro H3racn/iki) v\ npoc/ieflflBaMe KaK MO>KeM 
eAHOBpeMeHHO c hhko/iko K/iweHTa fla no/iynaBaMe MHCpopMauna. Cnefl 
no3HaTOTO Bene B"bBe>KflaHe Ha MMeTO v\ BtpHaTi/m no3ApaB, Bpt3KaTa ce 
npeKpaTABa ot crpaina Ha ctpBtpa v\ K/iweHTCKaTa nporpaMa npi/iK/iiouBa 
M3n"b/iHeHneTO cm. 

flBaTa npoeKTa MO>KeM fla crapTkipaMe b OT,qe/iHki kiHCTaHu.nn Ha Visual Studio 
.NET, a MCoxeM v\ fla crapTkipaMe HanpaBO KOMni/i/ikipaHi/iTe mm M3n"b/iHMMM 
cpaw/iOBe. flpyr BapnaHT e fla o6eflMHMM flBaTa npoeKTa b eflMH solution Ha 
cpeflaTa v\ fla vv\ crapTkipaMe 3aeflHO. ToBa MO>KeM fla HanpaBMM KaTO b 
OTBopeH solution flo6aBMM noc/ieflOBaTe/iHO flBaTa npoeKTa npe3 KOMaHflaTa 
File | Open | Project/Solution... Cnefl TOBa b Solution Explorer 
aKTMBupaMe KOMaHflaTa Set Startup Projects... v\ b flwa/ioroBkisi npo3opeu 
M36npaMe onuki^Ta Mulltiple startup projects. 



BBSS 



- * X 




ED- ijp sei 
El M 



i 



^Solution [ 
Properties 



iHPffiWWyiWPWPTiW WttflyiW^ 



Build Solution 
Rebuild Solution 
Clean Solution 
Batch Build... 
Configuration Manager. 
Project Dependencies. . , 
Project Build Order... 
Add 



Set Startup Projects. 



Qj9 Paste 
Rename 



Igj] Properties 



KoMyHMKauMfi no UDP c UdpClient 

KaKTO HaKpaTKO o6acHMXMe b Hana/iHi/iTe 6e/ie>KKi/i, KOMyHkiKaui/urra no UDP 
npoTOKO/ia ce pa3/iwnaBa 3HanwTe/iHO ot Ta3M no TCP. BTopaTa (kohto flocera 
pa3Me>KflaxMe) pa3HMTa Ha a6crpaKTHki "KOMyHMKaunoHHn KaHa/iw", no komto 
noTOHHO fla ce npeflaBaT flaHHMTe. TaM ce M3B"bpujBa kohtpo/i Ha no/iyneHaTa 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 383 

MHCpopMaunfl, TaKa ne fla H^Ma onacHOCT ot 3ary6a Ha flaHHM. ToBa e no- 
curypHO, ho ce ocbiuecTBABa no-cno>KHO v\ no-6aBHO. Eto 3aiuo b hakom 
c/iynaw e no-yAo6HO fla ce ki3no/i3Ba Apyr Tun KOMyHMKauna. 

ripn UDP o6MeH"bT Ha flaHHM e Ha "naKeTeH" npuHunn. TaM HsiMa KOMyHMKa- 
UMOHeH Kanan v\ acho onpefle/ieHa Bp"b3Ka (socket connection). BcaKa ot 
CTpaHMTe M3npaiua naKeTM ot flaHHM (datagram packets) Ha aflpeca Ha 
ApyraTa, 6e3 fla ce MHTepecyBa p,anv\ Te ca cyv\vuaj\v\, v\nv\ He. KaKTO Bene 
noconwxMe, BtnpeKM HeHafle>KflHOCTTa cm, to3m Tun o6MeH Ha flaHHM e no- 
6"bp3 ot TCP, 3aiuoTO HflMa Hy>Kfla fla ce noflfl"bp>Ka KOMyHMKaunoHeH Kauan. 
UDP ce npeflno4MTa, KoraTO CKopoora MMa no-ro/iflMO 3HaneHkie 3a npw/io>Ke- 
HueTO ot curypHOCTTa v\ pefla Ha npucTuraHe Ha flaHHMTe. 

noHe>Ke c UDP He ce Ha/iara c"b3flaBaHe v\ noflflptxKa Ha HflKaKBa Bpt3Ka, 
HflMa m Hy>Kfla ot cbOTBeTHna ctpBtpeH K/iac, KaKTO npn TCP KOMyHMKaunaTa. 
Bcm4km fleMCTBMfl no o6MeHa Ha flaHHM npe3 UDP ce M3B"bpujBaT b .NET ot 
K/iaca udpciient, komto me pa3r/ieflaMe Ha cneflBami/iTe peflOBe. 

KoHCTpyKTopn Ha UdpClient 

K/iaCbT MMa HflKO/IKO KOHCTpyKTOpa, KOMTO OTrOBapflT Ha CbOTBeTHMTe koh- 
CTpyKTOpM Ha TcpClient. UdpClient ( IPEndPoint LocalEP) HI/I n03BO/lflBa fla 

cb3flafleM MHCTaHunfl Ha udpciient, CB"bp3aHa c flafleH /iOKa/ieH UDP coKeT 
(ziOKa/ieH aflpec v\ nopT). ripn udpciient (int port) yKa3BaMe caMO nopTa, a 
npn udpciient o - ocTaBAMe onepaunoHHaTa cwcreMa fla M36epe v\ Hero. 
ri/iaTCpopMaTa .NET npefl/iara v\ BapnaHTM Ha Te3M KOHCTpyKTopn, npn komto 
ce yKa3Ba TkintT Ha croflmi/m OTflO/iy npoTOKO/i (IPv4 v\nv\ IPv6), ho TOBa He e 
3afl"b/l>KMTe/lHO. KOHCTpyKTOptT UdpClient (string host, int port) Lfle 

pa3MeflaMe cnep, Ma/iKO. 

3anaBaHe Ha OTfla/ieneH cbpBi>p no noapa36npaHe 

Cnefl KaTO CMe Cb3fla/ii/i MHcraHui/m Ha udpciient v\ CMe a CB"bp3a/iw c 
HflKaKtB /iOKa/ieH aflpec, ot komto me M3npaiuaMe datagram naKeTMTe, Bene 
CMe totobm fla 3anonHeM o6MeHa Ha flaHHM. ritpBO o6ane MO>KeM fla 3aflafleM 
OTfla/ieneH cbpBtp no noflpa36npaHe. ToBa He e 3afl"b/i>Ki/iTe.nHO, ho hm npefl- 
/iara yflo6cTBOTO fla He yKa3BaMe ctpBtpa npn bchko M3npaiuaHe Ha flaHHM. 

3aflaBaHeTO Ha OTfla/ieneH ctpBtp no noflpa36npaHe MO>Ke fla crane no flBa 
Ha^MHa. EflMHMAT e fla w3no/i3BaMe HanpaBO ropecnoMeHaTna KOHcrpyKTop 

UdpClient (string host, int port). 3a pa3/lklKa OT OCTaHa/lklTe pa3MeflaHM 

KOHCTpyKTopn, tom He 3aflaBa /iOKa/ieH aflpec v\ nopT (Te ce M36npaT ot 
onepaunoHHaTa cwcreMa), a 3aflaBa MMeHHO OTfla/ieneH ctpBtp. 

flpyrnflT Ha^MH e npe3 MeTOfla connect (...) b hakom ot BapnaHTMTe My - 

Connect (IPEndPoint) , Connect (IPAddress , int) M Connect (string, int). 

ripn BCM4KMTe 3aflaBaMe othobo aflpec v\ nopT Ha OTfla/ieneHkifl cbpBtp, Ha 
komto me npaiuaMe naKeTM. 



384 nporpaMnpaHe 3a .NET Framework (tom 2) 

He3aBMCMMO no kom HanwH CMe 3ap,anw ctpBtpa, orryK HaTarbK MO>KeM fla 
npaiuaMe v\ fla no/iynaBaMe flaHHM caMO kbm m ot Hero. Ako onuTaMe fla 
yKaxeM Apyr ctpBtp Ha MeTOAa send(...), me no/iyni/iM i/i3K/iK>neHwe. CbpBt- 
P"bT no noflpa36npaHe Mowe fla ce CMeHM othobo c MeTOAa connect (...) . 

M3npainaHe Ha UDP naKeni - Me to a Send(...) 

MeTOfla send(...) M3no^3BaMe, 3a fla M3npaiuaMe naKeTM (datagrams) no UDP 
npoTOKO/ia. Ako CMe 3afla/ii/i OTfla/ieneH ctpBtp no noflpa36npaHe, to npe3 
cneflHMfl KOfl MOxeM fla M3npaTMM KtM to3m ctpBtp HM3a "Hello, world": 



UdpClient client = new 


UdpClient ( "127 .0.0.1", 


2222) ; 


string hello = "Hello, 


world" ; 




byte [ ] data = Encoding 


ASCII .GetBytes (hello) ; 




client . Send (data, data 


Length) ; 




client . Close ( ) ; 







TyK ki3no/i3BaMe BapnaHTa send(byte[] , int) . ripn Hero noflaBaMe MacuB ot 
6aMTOBe, komto Tpa6Ba fla ce M3npaTAT c UDP naKeTa, KaKTO v\ btopm napa- 
MeTtp, yKa3Baiu ko/iko 6atiTa ot MacuBa fla ce M3npaTAT. 06"bpHeTe BHMMaHne 
Ha Hankma, no komto npeo6pa3yBaMe Hawi/m hm3 b MacuB ot 6awTOBe npe3 
MeTOflMTe Ha K/iaca Encoding. ToBa e craHflapTHaTa npaKTMKa npn M3npaiuaHe 

Ha TeKCTOBM flaHHM. 

MeTOfla send(...) MO>KeM fla ki3no/i3BaMe v\ KaTO 3aflafleM aflpec (m nopT), Ha 
komto fla ce npaiuaT flaHHMTe. KaKTO Bene Ka3axMe, TOBa MO>Ke fla crane caMO 
aKO He CMe 3ap,anv\ Bene TaKtB no noflpa36npaHe. AflpecbT noflaBaMe KaTO 
flont^HMTe^eH napaMeTbp nofl cpopMaTa Ha iPEndPoint v\i\v\ KaTO hm3 v\ hmc/io 

3a nopT - Send(byte[], int, string, int). B npMMepa MO>KeM fla BMflMM 

ntpBMfl BapnaHT c IPEndPoint: 



UdpClient client = new UdpClient ( ) ; 




string hello = "Hello, world"; 




byte[] data = Encoding .ASCII . GetBytes (hello 


; 


IPEndPoint ep = new IPEndPoint ( "127 . . . 1" , 


2222) ; 


client . Send (data, data . Length, ep) ; 




client . Close ( ) ; 





Ochobhoto, KoeTO Tp*i6Ba fla 3anoMHMM 3a MeTOfla send(...), e ne tom He hm 
rapaHTupa, ne HaiunTe flaHHM ca no/iyneHw. Ako TaKOBa noTBtpxfleHne e 
Ba>KHO 3a HaiuaTa nporpaMa, Tpa6Ba v\j\v\ fla ki3no/i3BaMe TCP KOMyHMKauna, 
v\nv\ fla pa3pa6oTMM HAKaKtB Hani/m 3a HOTucpuKauna 3a no/iyneHM naKeTM ot 
OTcpeiflHaTa CTpaHa. 

He 6nBa fla 3a6paB*iMe cnefl npwK/iionBaHe Ha o6MeHa Ha flaHHM fla M3BMKaMe 
m MeTOfla close o, 3a fla 3aTBopnM coKeTa. 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 385 

nojiynaBaHe Ha UDP naKeTM - Me to a Receive(...) 

3a pa3/lMKa OT Send(...), T03M MeTOfl MMa caMO eflMH BapnaHT - Receive (ref 

iPEndPoint sender) . C Hero c/iywaMe Ha /iOKa/ieH aflpec v\ nopT 3a no/iy- 
neHki UDP naKeTM. Ta3M onepauna e 6/iOKwpama n M3nt^HeHneTO Ha nporpa- 
MaTa cnupa, flOKaTO He no/iynwM naKeT Ha OTBopeHna UDP nopT, 3aTOBa 
Tpa6Ba fla BHMMaBaMe c Hea. /loKa/iHMflT aflpec ce 3aflaBa npn KOHcrpyK- 
TopnTe, KaKTO BMflflXMe, m/im ntK ce M36npa aBTOMaTkinHO ot onepaunoHHaTa 
cucTeMa, b c/iynaw ne He e 3aflafleH. 

riapaMeTbpvr sender ce npeflaBa no pecpepeHui/m v\ b Hero ce 3ana3Ba 
MHCpopMaunfl 3a aflpeca v\ nopTa Ha ctpBtpa, ot komto CMe no/iynM/iM UDP 
naKeTa. 

Pe3y^TaT"bT ot MeTOfla Receive (...) e MacuB ot flaHHM Tun byte. 06nKHOBeHO 
ce Ha/iara fla ro npeo6pa3yBaMe ao flpyr K/iac, npe3 komto fla MO>xeM fla 
pa6oTMM c no/iyneHMTe flaHHM. HanpuMep hm3 MO>KeM fla no/iynwM (o6paTHO 

Ha ropHMfl npMMep) npe3 MeTOfla Encoding. GetString (byte [] ) . 

C/ieflHi/iTe peflOBe koa fleMOHCTpupaT i/i3no/i3BaHeTO Ha MeTOfla Receive (...) : 



IPEndPoint listener = new IPEndPoint ( IPAddress .Any, 1111); 
UdpClient udpListener = new UdpClient (listener ) ; 
IPEndPoint sender = new IPEndPoint ( IPAddress .Any, 0); 
byte [ ] packet = udpListener . Receive ( ref sender); 
Console .WriteLine ("{ } bytes received from {1}", 

packet . Length, sender) ; 
Console .WriteLine ( "String rappresentation : {0}", 

Encoding. ASCII . GetString (packet) ) ; 



Ako ce onuTaMe fla M3npo6BaMe to3m npuMep, me ce c6/i"bCKaMe c npo6/ieMa, 
3a komto Bene cnoMeHaxMe. M3n"b/iHeHMeTO Ha nporpaMaTa cni/ipa npn MeTOfla 
Receive (...) , 3aiflOTO naKa fla no/iyuM H^KaKbB UDP naKeT. 3a fla M3npo6BaMe 
npn^OKeHneTO, me hm Tpa6Ba v\ flpyra nporpaMa, koato fla M3npaiua TaKMBa 
naKeTM. ToBa me noKa>KeM b cneflBamnTe peflOBe. 

KoMyHMKauiMq c UdpClient - npiiMep 

IHe pa3MeflaMe flBe npn^OKeHna, M3no/i3Bamn UdpClient K/iaca, eflHOTO ot 
komto me M3n"b^HABa po/iflTa Ha npneMHMK Ha MHCpopMaunaTa, a flpyroTO me 
M3npama naKeTM. 3a ue/iTa Tpa6Ba fla noflcurypuM, ne flBeTe MHCTaHunn Ha 
UdpClient me i/i3no/i3BaT eflHM m ctmn nopT v\ MHTepcpewc, KaTO 3a eflHaTa 
TOBa me 6"bfle ziOKa/ieH aflpec (Ha komto fla c/iywa), a 3a flpyraTa - 
OTfla/ieneH (Ha komto fla npama)- Eto KaK npaBMM TOBa. 

1. CTapTMpaMe VS .NETcTyflMO m ct3flaBaMe hob KOH30/ieH npoeKT. 

2. B"bBe>KflaMe KOfla Ha cbpBtpHMfl K/iac (komto cnywa 3a UDP naKeTMTe). 
06Btp3BaMe ro c /lOKa/iHMsi aflpec m nopT 1111 npe3 KOHcrpyKTopa Ha 

UdpClient, C/iefl KOeTO M3n"b/lHflBaMe MeTOfla Receive (...) B UMKb/i: 



386 flporpaMnpaHe 3a .NET Framework (tom 2) 



using System; 

using System. Net; 

using System. Net . Sockets; 

using System. Text; 

class UdpServerDemo 

{ 

const int LISTENING_PORT = 1111; 

public static void Main ( ) 

{ 

IPEndPoint serverEndPoint = 

new IPEndPoint (IPAddress. Any, LISTENING_PORT) ; 
UdpClient udpServer = new UdpClient ( serverEndPoint ) ; 
Console . WriteLine ( 

"UDP Server is waiting for client packets..."); 

while (true) 

{ 

IPEndPoint senderEP = new IPEndPoint ( IPAddress .Any, 0) 
byte [ ] packet = udpServer . Receive ( ref senderEP); 
string message = Encoding .ASCII . GetString (packet ) ; 
Console .WriteLine ( 

"Datagram packet received from {0}:{1}.", 
senderEP, message); 
} 



CTapTupaMe npi/i/ioweHi/ieTO v\ ro ocraBAMe fla pa6oTM. OTBapaMe HOBa 
MHCTaHunfl Ha Visual Studio .NET v\ cb3flaBaMe hob npoeKT, b komto 
B"bBe>KAaMe KOfla Ha K/iweHTCKi/m K/iac. K/iweHTCKaTa nporpaMa Tpa6Ba 
fla M3no^3Ba ctiunfl nopT 3a OTfla/ieneH ctpBtp. ripn ctpBtpHaTa 
M3no^3BaxMe 3a aflpec iPAddress.Any, ho TyK Tpa6Ba fla yKaweM TOneH 
aflpec, Ha komto fla npaiuaMe. noHewe ctpBtptT bbpbm /ioio/iho, 
yKa3BaMe /lOKa/iHwa loopback aflpec "127.0.0.1": 



using System; 

using System. Net; 

using System. Net . Sockets; 

using System. Text; 

class UdpClientDemo 

{ 

const string SERVER_HOST = "127.0.0.1"; 
const int SERVER_PORT = 1111; 

public static void Main ( ) 

{ 

string welcomeMsg = "Hello"; 



T/iaBa 18. Mpe>KOBO v\ MHTepHeT nporpaMkipaine 387 



byte [ ] data = Encoding .ASCII . GetBytes (welcomeMsg) ; 
UdpClient udpClient = new UdpClient (SERVER_HOST, 

SERVER_PORT) ; 
udpClient . Send (data, data . Length) ; 
Console. WriteLine ("UDP packet sent to {0}:{1}.", 

SERVER HOST, SERVER PORT) ; 



} 



4. Cera crapTkipaMe v\ K/iweHTa v\ Ha6/iK>AaBaMe craBamoTO b npo3opeua Ha 
ctpBtpa. TaM ce M3Be>Kfla c"bo6iueHne, ne e no/iyneH UDP naKeT, KaKTO 

M HerOBOTO C"bA"bp>KaHMe B"bB BMA Ha TeKCTOB HM3. K/lkieHTbT npMK^K)4Ba 

AewcTBueTO cm, a ctpBtptT npoAt/iwaBa p,a c/iywa. MoxeM p,a crapâ„¢- 
paMe oiue BeAH"b>K K/iweHTCKOTO npi/i/io>KeHkie v\ me Ha6/iK>AaBaMe cbiuna 
pe3y/iTaT. CtpBtptT me e aKTMBeH, AOKaTO npeicbCHeM ptuHO i/i3n"b/iHe- 
HueTO My. 



I o-.\ CilWlNDOWSlSyste m32kmd.exe - UdpServer.exe 



I UDP Seruer is waiting for client packets... 
Datagram packet received from 127.0.0.1:2891 
Datagram packet received from 127.0.0.1:2892 



â–  1 â–¡ 



: Hello. 
: Hello. 



cC C:\WlNDOWS\System32lcmd.exe 



|UDP packet sent to 127.0.0.1:1111. 



HDP 



CoKeTM Ha no-HMCKO hmbo - K/iacbT Socket 

K/iaCOBeTe UdpClient, TcpClient M TcpListener o6klKHOBeHO Ca AOCTaTbUHkl 

3a ue/ii/iTe Ha nporpaMnpaHeTO c Te3M ABa npoTOKO/ia. 3a no-rbBKaBO 
M3no/i3BaHe Ha coKeTMTe MOxeM o6ane p,a M3no/i3BaMe BMecTO tax K/iaca 
socket. Tom npeA-fiara mhoto noBene bbsmokhoctm v\ BCtiuHOCT pa3r/ieAaHMTe 
Bene K/iacoBe ca HeroBM Hac/ieAHkiuw, cneui/ia/iki3kipaHi/i 3a pa6oTa c AaAeH 

npOTOKO/1. 

K/iacbT socket pea/iki3kipa a6cTpaKunyi Ha coKeT b uav\-o6u\ CMkicb/i, cbo6- 
pa3HO cpyHKunoHa^HOCTTa, onucaHa b MHTepcpewca "Berkeley sockets". ToBa e 
Ha6op ot hako/iko AecpkiHwpaHM o6lum onepaunn, komto no3BO/iflBaT Mpexo- 
BaTa KOMyHMKaunfl no npoi/i3BO/ieH Mpe>KOB npoTOKO/i. Ha c/ieABamwTe peAOBe 
me pa3MeAaMe HaKpaTKO KaK MO>KeM p,a M3no/i3BaMe K/iaca socket 3a npor- 
paMnpaHe c npoki3BO/ieH Tun coKeTM Ha no-HMCKO hmbo, KoeTO pa3LUkip*iBa 
rtBKaBOCTTa v\ Bt3MO>KHOCTMTe Ha HaiueTO npn^OKeHne; KaKTO v\ npo6/ieMMTe, 
komto MO>Ke Aa cpeiuHeM, KoraTO ce /imlui/im ot TACHaTa cneukia/iki3aumi Ha 

TcpClient, TcpListener M UdpClient. 



Ci>3flaBaHe Ha Socket o6cktm v\ Twn Ha coKeTa 

KOHCTpyKTOptT Ha K/iaca M3r/ie>KAa eTO TaKa - Socket (AddressFamily, 

socketType, ProtocoiType) . TyK ce noAaBaT Tpn napaMeTbpa, BceKM ot ko- 



388 nporpaMnpaHe 3a .NET Framework (tom 2) 

mto e ot cneui/ia/ieH M36poeH Tun. 3aeflHO TpnTe onpefle/isiT BMfla Ha coKeTa. 
K/iacbT socket noflfl"bp>Ka KOMyHMKauna npe3 ro/iflMO KO/ii/mecrBO npoTOKO/iw 
(TCP, UDP, IP, IPv6, ICMP, IGMP, IPX v\ flp.) v\ MMeHHO napaMeTpnTe, 3aAa- 
p,euv\ npn MHMuna^M3auMflTa, yKa3BaT kom ot tax me ce ki3no/i3Ba. 

AddressFamily e M36poeH Tun, komto yKa3Ba HanwHa Ha npeACTaBAHe Ha 
aApecnTe b KOMyHkiKaui/mTa. 3a HaiunTe \\ei\v\ me M3no/i3BaMe croi/iHOCTTa 

AddressFamily. InterNetwork. Tfl HM n03BO/lflBa fla M3nO/13BaMe IP aflpeCM 

(fla cm npunoMHMM, ne cbomctboto AddressFamily Ha o6eKTMTe ot K/iaca 

IPEndPoint BptlUa TOUHO Ta3M CTOMHOCT - BCbLUHOCT nO-06lUMflT K/iaC 

EndPoint ctiuecTByBa MMeHHO 3aiuoTO c K/iaca socket MOxeM p,a M3no/i3BaMe 
m flpyrn TunoBe aflpecupaHe). 

socketType e APyr M36poeH Tun, 4mmto ctomhoctm onpenennj BMAa Ha 
coKeTa. Pa3^M4HMTe BMflOBe coKeTM MMaT pa3/ikmHki xapaKTepucTMKn. Hakom 
noAfl"bp>KaT Bp"b3Ka Me>Kfly crpaHMTe, flpyrn - He. OTfle/iHO hakom npeflaBaT 
AaHHMTe b naKeTM c touho onpeAe/ieHM rpaHnun, aoioto Apyrn M3no/i3BaT 
noTO^Ha KOMyHMKaunfl, b kohto rpaHMUMTe Me>KAy naKeTMTe ce ry6^T. 3a 
pa3^M4HMTe npoTOKO^n, komto MCKaMe p,a ki3no/i3BaMe, Tpa6Ba Aa M36epeM 
noAxoAaiunfl bma coKeT. Ako He HanpaBMM TOBa KopeKTHO, me no/iynwM 
socketException npw M3BMKBaHeTO Ha KOHCTpyKTopa. Hue me M3no/i3BaMe 

CTOMHOCTMTe SocketType . Stream 3a TCP (nOTOHHa KOMyHMKaUMfl C Bp"b3Ka) M 

socketType . Dgram 3a UDP (naKeTHa KOMyHMKaunfl 6e3 Bp"b3Ka). flpyrn 
Bt3MO>KHM TkinoBe ca socketType . Raw (AnpeKTHO npeAaBa IP naKeTM 6e3 
Aont/iHMTe/iHa o6pa6oTKa, HanpuMep 3a npoTOKO/iw ICMP v\nv\ IGMP), 
SocketType . Seqpacket (naKeTHa KOMyHMKaUMfl C Bp"b3Ka) M AP- 

HaKpaa, napaMeTtptT ot M36poeHMfl Tun ProtocoiType onpeAe/isi caMi/ia npo- 
toko/i, komto .NET me ki3no/i3Ba, 3a Aa npeAaBa cbo6meHMflTa. KaKTO Bene 

Ka3aXMe, KOM6wHaUMflTa OT ProtocoiType M SocketType Tpfl6Ba Aa e KOpeKT- 
Ha. 3a ProtocoiType . Tcp Tpfl6Ba Aa CMe 3aAa/lM SocketType . Stream, a 3a 
ProtoclType . Udp - SocketType . Dgram. 

CneAHkiflT koa cb3AaBa eAMH noToneH coKeT c Bp"b3Ka: 



Socket socket = new Socket (AddressFamily . InterNetwork, 
SocketType . Stream, ProtocoiType . Tcp) ; 



Ochobhm onepaMMM c K/iaca Socket 

HeKa cera pa3r/ieAaMe kom ca onepaunnTe, AecpuHnpaHM ot Berkeley Sockets 
Interface, v\ npe3 kom MeTOAM Te ce pea/ii/i3kipaT b .NET Framework. 

KaKTO 3HaeM, eAHH coKeT MO>Ke Aa M3n"b/iHABa po/iHTa Ha cbpBtp v\nv\ Ha 
K/iweHT. Ot CTpaHaTa Ha ctpBtpa, BceKM coKeT Tpa6Ba Aa ki3n"b/iHM hhko/iko 
AewcTBUfl. Ako coKeTbT i/i3no/i3Ba Bp"b3KM, tom Tpa6Ba Aa ce o6B"bp>Ke c hakom 
nopT Ha ziOKa/iHaTa ci/icreMa, Aa ro otbopm v\ p,a 3anonHe Aa c/iywa 3a MABamn 
3aaBKM 3a Bp"b3Ka, cnep, KoeTO Aa npneMa Bpt3KaTa v\ p,a M3npama v\ npneMa 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 389 

flaHHM OT K/lMeHTCKMfl COKeT. AKO M3nO/13BaHMflT npOTOKO/1 He M3MCKBa Bp"b3KM, 

ce MCKa caMO cbpBtpvr fla ce o6B"bp>Ke c hakom nopT. 

CoKeTM c Bpi>3Ka no TCP 

IHe pa3MeAaMe ntpBO onepaunnTe, komto Tpa6Ba p,a ce M3BtpiuaT ot 
ctpBtpa, a nocne v\ Te3M ot K/iMeHTa. 

K/iaci>T Socket ioto cbpBi>p 

CB"bp3BaHeTO c ziOKa/ieH nopT CTaBa npe3 MeTOAa Bind(iPEndPoint 
localEP) . rioAaBa My ce napaMerbp, komto cwvbpwa ziOKa/ieH MpewoB aApec 
m HOMep Ha nopT. KaKTO 3HaeM, MOweM p,a M3no/i3BaMe iPAddress.Any 3a 
aApec, KaKTO m 3a HOMep Ha nopT, aKO MCKaMe tom p,a ce M36epe ot 
onepaunoHHaTa CMcreMa. 

Cnep, KaTO CMe M3BMKa/iM Bind(...), 3anonBaMe p,a cnywaMe 3a Bp"b3KM npe3 

MeTOAa Listen (int backlog). riapaMeTbptT backlog e HMC/10, KOeTO yKa3Ba 

ko/iko 3aaBKM 3a Bp"b3Kki MoraT p,a 6tAaT 3aA"bp>KaHM ot onepaunoHHaTa 
cucTeMa b onaujKa, AOKaTO npMK/iiouM ntpBaTa. ripn M36npaHeTO Ha Ta3M 
ctomhoct Tpa6Ba p,a noMHMM, ne ro/iflMa onaujKa MO>Ke Aa 3a6aBM AewcTBueTO 
Ha nporpaMaTa. 

npneMaHeTO Ha k/imchtckm Bp"b3KM CTaBa npe3 MeTOAa Accepto. Tom hm 
Bptiua o6eKT ot Tun socket, komto onucBa HOBaTa Bpt3Ka v\ npe3 komto 
MOxeM Aa KOMyHMKMpaMe c K/iMeHTCKaTa CTpaHa. Btpxy to3m COKeT He motom 
othobo Aa npM/iaraMe Bind(...) m Listen(). Mo>KeM o6ane Aa no/iynMM 
MHCpopMauMfl 3a aApeca, ot komto MABa Bp"b3KaTa, npe3 cbomctboto 
RemoteEndPoint. Tp*i6Ba Aa MMaMe caMO npeABMA, ^e TOBa cbomctbo Bptiua 
pe3y/iTaT ot o6lumh K/iac EndPoint m Tpa6Ba Aa ro npeo6pa3yBaMe ao 

IPEndPoint. 

KaKTO Ce BM>KAa, AeMCTBMflTa, KOMTO M3B"bpilJBaXMe C TcpListener, CM/1HO 

HanoMHAT Te3M c K/iaca socket. TaM MeTOAMTe Bind(...) m Listen o 6axa 

06eAMHeHM B Start () M KOHCTpyKTOpa, a MeTOA"bT AcceptTcpClient ( ) 

no3BO^flBaiue Aa MHMUMa^M3MpaMe KOMyHMKauMOHHMa COKeT HanpaBO etc 
cneuMa/iM3MpaHMH K/iac Tcpciient. 

C^eAHMAT npMMep AeMOHcrpMpa onMcaHMTe onepauMM: 



Socket socket = new Socket (AddressFamily. InterNetwork, 

SocketType . Stream, ProtocolType . Tcp) ; 
socket .Bind (new IPEndPoint ( IPAddress .Any, 2222)); 
socket . Listen ( 10 ) ; 

Console .WriteLine ( "Waiting for a client..."); 
Socket client = socket .Accept () ; 
IPEndPoint clientEP = 

( IPEndPoint) client . RemoteEndPoint; 
Console .WriteLine ( "Connected with {0}:{1}", 

clientEP .Address, clientEP . Port ) ; 



390 flporpaMnpaHe 3a .NET Framework (tom 2) 



// Communication 


with 


the 


client 


goes 


here 


client . Close ( ) ; 












socket . Close ( ) ; 













K/iacbT Socket ioto k/imcht 

Pa6oTaTa etc socket ot CTpaHaTa Ha K/iweHTa e oiue no-necna. Othobo 

Tpfl6Ba fla Cb3flafleM Hy>KHMfl HM COKeT CtC SocketType . Stream M 

ProtocoiType . Tcp, cnep, KoeTO, BMecro fla npw/iaraMe MeTOflMTe Bind(...) v\ 
Listen (...), Tpa6Ba fla ce CBtpweM etc ctpBtpa npe3 MeTOfla connect ( 
remoteEP) . KaTO apryMeHT noflaBaMe o6eKT ot Tuna iPEndPoint, 3a fla 
onrnueM aflpeca v\ nopTa, c komto MCKaMe fla HanpaBMM Bpt3Ka. C/iefl 
3aB"bpujBaHeTO Ha MeTOfla connect (...) Bene CMe Cb3p,anv\ CB"bp3aH COKeT v\ 
MO>KeM fla ro i/i3no/i3BaMe 3a npeflaBaHe Ha flaHHM Me>Kfly K/iweHTa v\ ctpBtpa. 

noHe>Ke Bp"b3Ka no Mpe>KaTa He BMHarn MO>xe fla ce ocbiuecTBM, npn 
cb3flaBaHeTO Ha K/iweHTCKaTa nporpaMa e xy6aBO fla ki3n"b/iH$iBaMe 
connect (...) b try-catch 6/iok. TaKa, aKO B"b3HMKHe npo6/ieM npn Bpt3KaTa, e 
AOCTaT"b4HO fla npuxBaHeM npeflM3BMKBaHMfl socketException v\ fla yBeflOMMM 
noTpe6nTe^fl, ne nporpaMaTa He MO>xe fla ce CB"bp>Ke etc ctpBtpa. 

C/iefl npnK^K)4BaHeTO Ha KOMyHMKaunaTa Tpa6Ba fla M3BMKaMe nocneflOBa- 
Te/IHO MeTOflMTe Shutdown (SocketShutdown) M Close(). ri"bpBMflT noflcury- 
pyiBa, ne BCM4KM flaHHM, naKamM no Bp"b3KaTa, ca npeflafleHM v\ npneTM 
ycneiuHO, npeflu ta fla 6"bfle npeKpaTeHa. ApryMeHTbT My e ot M36poeHMfl Tun 
SocketShutdown, KaTO ocBeH aKO He MCKaMe fla MMn/ieMeHTi/ipaMe HAKaKBO 
cneuwa/iHO noBefleHne, Tpa6Ba fla noflafleM SocketShutdown. Both. MeTOflvr 
close o ocBo6o>KflaBa pecypcuTe, CB"bp3aHM etc coKeTa, v\ ro 3aTBapa. Tom 
Tpa6Ba fla ce M3BMKa v\ ot ctpBtpHaTa CTpaHa. B npuMepnTe me noKa>KeM KaK 
touho CTaBa TOBa. 

KaK fla npeflaBaMe flaHHM Me>Kfly KsiueHTa m cbpBi>pa? 

flaHHM no TCP Bp"b3KaTa MO>KeM fla npeflaBaMe npe3 MeTOflMTe send(...) v\ 

Receive)...) . Te MMaT nO HflKO/IKO CpOpMM, KaTO B HaM-npOCTklfl MM BMfl npocTO 

Tpa6Ba fla noflafleM eflMH MacuB ot Tun byte[], komto fla cny>Ki/i 3a m3T04hmk 
v\nv\ npneMHMK Ha npeflaBaHMTe flaHHM. no >Ke/iaHwe MO>KeM fla yKa3BaMe 
Aont/iHi/iTe/iHO ko/iko to4ho 6ai/iTa fla ce M3npaTAT v\nv\ npneMaT no Bp"b3KaTa, 

a 4pe3 BapnaHTMTe Send(byte[], int, SocketFlags) M Receive (byte [] , 

int, SocketFlags) MOxeM fla yKa3BaMe m pa3^M4HM onuuM 3a KOMyHMKa- 

UMflTa, KOMTO Ca CTOMHOCTM Ha M36pOeHMfl TMn SocketFlags. MeTOfl"bT 

Receive (...) Bptifla KaTO pe3y/iTaT 6poa no/iyneHki no Bp"b3KaTa 6ai/iTOBe. 
KoraTO to3m pe3y/iTaT e 0, Bp"b3KaTa e 6n/ia npeKpaTeHa ot OTcpeiflHaTa 
CTpaHa. MoxeM fla M3no/i3BaMe to3m cpaKT KaTO yc/iOBkie 3a npeKpaTABaHe Ha 
UMKb/ia, b komto o6nKHOBeHO me npeflaBaMe v\ npneMaMe flaHHMTe. 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 391 

06"bpHeTe BHMMaHne, ne MeTOflMTe send(...) v\ Receive (...) He npneMaT apry- 
MeHTM, yKa3Baiun c koto ce npoBe>Kfla KOMyHMKauna. B MOMeHTa Ha M3BMKBa- 
HeTO mm coKerbT Bene Tpa6Ba p,a e CB"bp3aH - v\i\v\ p,a e 61/1/1 M3BMKaH MeTOAtT 
connect (...) ot K/iMeHTCKaTa CTpaHa, v\i\v\ p,a e no/iyneH KaTO pe3y/iTaT ot 
MeTOfla Accept o 3a ctpBtpHaTa CTpaHa. Cnep,uv\je npuMepn 3a flBaTa BMAa 
coKeTM fleMOHCTpupaT Ha^MHa Ha ynoTpe6a Ha send(...) v\ Receive (...) cnep, 
KaTO Bene ca i/i3n"b/iHeHM no CB"bp3BaHe ot ropHMTe npuMepn: 



// Server code 

string welcome = "Welcome to my test server"; 

data = Encoding .ASCII . GetBytes (welcome) ; 

client . Send (data, data. Length, SocketFlags . None) ; 

// Client code 

Socket socket = new Socket (AddressFamily. InterNetwork, 

SocketType . Stream, ProtocolType . Tcp) ; 
try 

{ 

socket . Connect (new IPEndPoint( 

IPAddress. Parse ("127. 0.0.1") , 2222) ) ; 

} 

catch (SocketException e) 

{ 

Console .WriteLine ( "Unable to connect to server."); 

return; 
} 

int recv = socket . Receive (data) ; 

stringData = Encoding .ASCII . GetString (data, 0, recv) ; 

Console .WriteLine ( stringData) ; 



Ako m ABeTe crpaHM ce ouv\iai no eAHO v\ cbiuo BpeMe p,a M3npaiuaT v\nv\ p,a 
naKaT ashhh, me ce CTurHe ao cuTyauna, b koato m K/ineHTbT, v\ ctpBtptT me 
ocraHaT 3aBMHarn 6/iOKi/ipaHM, noHe>Ke Te3M onepaunn ca 6/iOKkipami/i. Hue 
caMM Tpa6Ba p,a noACurypuM, ne npn M3npaiuaHeTO v\ npneMaHeTO Ha ashhh 
CTpaHMTe ce peAyBaT. 

riOTOHHa KOMyHMKaUMfl 

flaHHM c K/iaca socket MO>KeM p,a npeAaBaMe v\ noTonHO. 3a ue/iTa i/i3no/i3- 
BaMe K/iaca Networkstream, komto Bene pa3MeAaxMe. Tom v\wa KOHCTpyKTop, 
komto npneMa KaTO napaMeTbp o6eKT ot Tun socket v\ ziecHO MO>KeM p,a ro 
cb3AaAeM ot Haujufl coKeT. IIotohhoto npeAaBaHe Ha ashhm v\wa hakom 
npeAMMCTBa v\ no >Ke/iaHi/ie MO>KeM p,a i/i3no/i3BaMe Hero v\ MeTOAHTe My 
Read(...) M Write (...), KOMTO no-rope 06flCHMXMe noApo6HO. Cbomctboto 
DataAvaiiabie hm no3BO/iflBa BtB BceKM eAMH MOMeHT p,a npoBepuM p,anv\ MMa 
AaHHM 3a 4eTeHe ot noTOKa. 

Oiue noBene cpyHKuwoHa/iHOcr MOxeM p,a npnAo6neM, aKO cb3AaAeM o6eKTM 

Ha K/iaC0BeTe StreamWriter M StreamReader. Te ce l/IHkmkia/lkl3MpaT npe3 



392 nporpaMnpaHe 3a .NET Framework (tom 2) 

Networkstream o6eKTa m hm flaBaT B"b3MO>KHOCT fla M3npaiuaMe m neTeM 

TeKCTOBM flaHHM OT nOTOKa. MeTOflMTe ReadLineO M ReadToEndO HM n03BO- 

nnBaj fla neTeM flaHHM ao Kpaa Ha eflMH TeKCTOB pefl v\nv\ ao Kpaa Ha ue/iwa 
noTOK. 06"bpHeTe BHMMaHne, ne Te me BtpHaT null, aKO H^Ma flaHHM b 
noTOKa, a MeTOflvr Read(...) me BtpHe ioto 6pow nponeTeHM 6aMTOBe, ho 3a 
pa3/im<a ot MeTOfla Receive (...) Ha K/iaca socket, TOBa He 03HanaBa, ne 
Bp"b3KaTa e 3aTBopeHa. 3a fla npoBepuM fla/iM TOBa e TaKa, Tpa6Ba fla 
orpa>KflaMe M3BMKBaHeTO Ha MeTOfla b try-catch 6/iok m fla npuxBaiuaMe 
ioException, npeflM3BMKBaHeTO Ha komto Haw-BepoflTHO e 6m/io CB"bp3aHO c 
npeycTaHOBABaHe Ha Bp"b3KaTa. 

K/iaCbT StreamWriter MMa CbOTBeTHMfl MeTOfl WriteLine (...) , KOMTO flMpeKTHO 

M3npaiua TeKCTOB pefl no coKeTa. Heiuo, KoeTO Tpa6Ba fla 3anoMHMM npn 
M3no^3BaHeTO Ha to3m MeTOfl, KaKTO m Ha BCM4KM noTO^HM MeTOflM 3a nucaHe, 
e BMHarn fla M3BMKBaMe MeTOfla Flush o cnefl tax. 




Bninarn M3BMKBaMTe MeTOfla Flush o cnefl KaTO npnK/iK)HMTe c 
niicaHeTO b MpewoB noTOK! no to3m h3hmh ocfirypnBaTe, ne 
naHHHTe ci>c CMrypHOCT ca M3npaTeHM no Bpi>3KaTa, a He ca 
ocTaHa/iM b ziOKa/iHMTe TCP 6ycpepn. 



C^eflHMTe npuMepn MOflncpnunpaT ropHMfl koa, M3no/i3BaMKM noTOHHa komyhm- 
Kauna: 



// Server code 












StreamWriter wri 


ter = new 


St 


reamW 


riter 


(new 


Networkstream ( 


client) ) ; 










writer .WriteLine 


( "Welcome 


to 


my t 


est server" ) ; 


// Client code 












// Connecting to 


server . . 










StreamReader rea 


der = new 


St 


reamR 


eader 


(new 


Networkstream ( 


socket) ) ; 










Console .WriteLine ( reader . Rea 


dLine 


()); 





B to3m npuMep pa3HMTaMe, ne ctpBtptT me M3npaTM noHe eflMH TeKCTOB pefl. 
OnepaunflTa me 6/iOKnpa ao npouMTaHeTO My. 

TCP KOMyHMKaLiMfl c K/iaca Socket - npuMep 

IHe pea^M3npaMe eflHO ua/ioctho peiueHne ot flBe npocTM npn^OKeHMa, npefl- 
craBflmn ctpBtp m K^neHT, komto KOMyHMKupaT no TCP etc cpeflCTBaTa Ha 
K/iaca socket. 06tpHeTe BHMMaHne, ne pea/iM3auMHTa TyK He hm na3M ot 
hhkom cneuncpM4HM 3a TCP npo6/ieMM Ha npeflaBaHeTO Ha flaHHM, 3a komto me 
CTaHe flyMa cnep, Ma/iKO. 

1. OTBap^Me VS. NET m cb3flaBaMe hob KOH30/ieH npoeKT 3a cbpBtpHOTO 
npM^o>KeHMe. 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 393 

C^eflHMAT KOfl pea/iki3kipa K/iaca server. 06"bpHeTe BHMMaHne, ne b 
umcb/ia noflaBaMe Ha MeTOfla send(...) cbxpaHeHaTa b recv ctomhoct 3a 
6poki no/iyneHki 6aMTOBe. Ako BMecTO TOBa noflaBaxMe HanpuMep 
data. Length, 6m Tpfl6Ba/io BceKM ntT p,a penHMuna^M3MpaMe MacuBa 
data, 3aiuoTO e B"b3MO>KHO npeAHWHOTO c"bo6iueHne p,a e 61/1/10 no-A"b/iro 
m hoboto fla e npkinoKpki/io caMO nacr ot Hero, a cbomctboto Length fla 
e ocraHa/10 HenpoMeHeHO. 



class Server 

{ 

public static void Main ( ) 

{ 

Socket socket = new Socket (AddressFamily. InterNetwork, 

SocketType . Stream, ProtocolType . Tcp) ; 
IPEndPoint ipep = new IPEndPoint ( IPAddress . Any, 2222); 
socket . Bind (ipep) ; 
socket . Listen ( 10 ) ; 

Console .WriteLine ( "Waiting for a client..."); 
Socket client = socket .Accept () ; 

IPEndPoint clientep = (IPEndPoint) client . RemoteEndPoint; 
Console .WriteLine ( "Connected with {0} at port {1}", 

clientep .Address, clientep . Port ) ; 

string welcome = "Welcome to my test server"; 
byte [ ] data = data = Encoding .ASCII . GetBytes (welcome) ; 
client . Send (data, data. Length, SocketFlags . None) ; 
while (true) 

{ 

int recv = client . Receive (data) ; 

if (recv == 0) 
break; 

Console .WriteLine (Encoding .ASCII . Gets t ring (data, 0, recv) ) 

client . Send (data, recv, SocketFlags . None) ; 
} 

Console .WriteLine ( "Disconnected from {0}", 

clientep .Address ) ; 
client . Close ( ) ; 
socket . Close ( ) ; 



} 



} 



3. Cb3AaBaMe oiue eflMH KOH30/ieH npoeKT 3a K/iweHTCKOTO npn^OKeHne. 
TyK npn onuTa 3a Bp"b3Ka etc cbpBtpa nocraBflMe MeTOfla connect (...) b 
try-catch 6/iok, 3aiuoTO b HopMa/iHi/i yc/iOBMfl Bp"b3KaTa MO>Ke m p,a He 
ce ocbiuecTBM v\ Tpa6Ba p,a pearnpaMe aAeKBaTHO. 

class Client 
{ 



394 flporpaMnpaHe 3a .NET Framework (tom 2) 



} 



public static void Main ( string [ ] args) 

{ 

Socket socket = new Socket (AddressFamily. InterNetwork, 

SocketType . Stream, ProtocolType . Tcp) ; 
try 

{ 

IPEndPoint ipep = new IPEndPoint( 

IPAddress. Parse ("127. 0.0.1") , 2222) ; 
socket . Connect (ipep) ; 

} 

catch (SocketException e) 

{ 

Console .WriteLine ( "Unable to connect to server."); 

Console .WriteLine (e . ToString ( ) ) ; 

return; 
} 

byte[] data = new byte [1024]; 

int recv = socket . Receive (data) ; 

string strData = Encoding .ASCII . GetString (data, 0, recv) 

Console .WriteLine ( strData) ; 

while (true) 

{ 

string input = Console . ReadLine () ; 

if (input == "exit") 
break; 

socket . Send (Encoding .ASCII . GetBytes (input) ) ; 

data = new byte [1024]; 

recv = socket . Receive (data) ; 

strData = Encoding .ASCII . GetString (data, 0, recv) ; 

Console .WriteLine ( strData) ; 
} 

Console .WriteLine ( "Disconnecting from server..."); 
socket . Shutdown (Socket Shutdown .Both) ; 
socket . Close ( ) ; 
} 



CTapTupaMe ntpBO cbpBtpHcrro, a nocne v\ K/iwei-iTCKOTO npi/i/io>Kei-me. 
OnuTBaMe fla M3npaTMM hhko/iko c"bo6iueHMfl, cnep, KoeTO npeKpaT^BaMe 
Bpt3KaTa ot CTpaHa Ha K/ii/ieHTa c KOMaHflaTa "exit". 

McoxeM fla BMflMM, ne aKO HanpuMep 3aTBopnM Hacw/iCTBei-io cbpBtpa, 
me npeflM3BMKaMe M3K/iK>nei-me npn K/ii/ieHTa. 



T/iaBa 18. Mpe>KOBO v\ MHTepHeT nporpaMkipaine 395 



c::'.. "C :U)ocu merits and SettingsVEvgenilDesktopW... |HH|Q 1 


waiting for a client... 1 
Connected with 127.0.0.1 at port 1566 \— 
Hi, i J n testing 
Disconnected from 127.0.0.1 
Press any key to continue 


^H 




c:v 'CiUDocuments and SettingsVEvgenilDesk... |H|"1 [E3 


_ 


Welcome to my test server 
Hi, i J n testing 
Hi, i J n testing 
exit 


â–¡ 

( 

â–¡ 
I 




^^B 


Disconnecting from server... 
Press any key to continue. 



npo6/ieMM npH TCP Bpi>3KiiTe c x/iaca Socket 

TopHMflT npuMep AeMOHcrpwpa npocTa peanmauwn na cbpBtp v\ K/iweHT, 
M3no^3Baiun TCP Bp"b3Ka. B noBeneTO cnynaw ta He e AOcrarbUHa 3a 
ocurypaBaHeTO Ha HaAe>KAHa KOMyHMKauna. TCP v\wa hako/iko oco6eHOCTM, 
komto Tpa6Ba p,a ce i/maT npeABMA npi/i pa6oTa c no-o6mi/m K/iac socket, 
3aiuoTO necro ce OKa3BaT npwnwHa 3a npo6/ieMM. Eamh ot npo6/ieMi/iTe e 
pa3Mep"bT Ha 6ycpepa, noAaBaH Ha MeTOAa Receive (...) . 

T03M 6ycpep o6mkhob6ho e no-ro/iflM ot Heo6xoAHMOTO, npn KoeTO nocneAO- 
BaTe^HM o6p"biuaHMfl kbm Receive (...) irb/iHAT pa3/ikinHa nacr ot Hero, 6e3 p,a 
M3TpnBaT crapaTa MHCpopMauna. 3a p,a ce npeAna3kiM ot HeKopeKTHO M3Be>K- 
AaHM c"bo6iueHMfl, CMeceHM c nacm ot npeAHWHM, BMHarn Tpa6Ba v\i\v\ p,a 
MHMuna^M3MpaMe HaHOBO 6ycpepa, v\nv\ 3aAt>/i>Ki/iTe/iHO p,a M3Be>KAaMe caMO 
TO/iKOBa 6awTa ot Hero, ko/ikoto hm e yi<a3a/i KaTO BtpHaTa ctomhoct 
Receive (...) . Ako 6ycpep"bT e no-Ma/i"bK ntK, me hm Tpa6BaT noBene o6p"biue- 
Hkifl KtM MeTOAa 3a eAHO c"bo6iueHne, KoeTO boah ao /iori/mecKki npo6/ieMki. 

Ochobhoto HeyAo6cTBO Ha TCP npoTOKO/ia e, ne tom He Atp>Ki/i CMeTKa 3a 
rpaHMUMTe Me>KAy OTAe/iHi/iTe c"bo6iueHMfl, komto ce M3npaiuaT no Mpe>xaTa. Te 
MMHaBaT ntpBO npe3 TCP 6ycpepnTe Ha onepaunoHHaTa cwcreMa, OTKbAeTO 
cnep, TOBa HaiueTO npM/io>KeHMe vv\ B3MMa npe3 MeTOAa Receive)...) . Ako 
npeAM P.a CMe nowcKa/iki bcmukm ashhm ot 6ycpepa, npucTurHe hobo cbo6me- 
Hue, to B/iki3a b onaujKaTa v\ Bene H^Ma Hani/m p,a ce HaMepn rpaHnuaTa 
Me>KAy HeAonponeTeHOTO ntpBO v\ HOBonpocrwrHa/iOTO BTopo cto6iueHne. J\o- 
n"b/iHMTe/iHa onacHOCT e, ne TOBa p^ako ce 3a6e/i*i3Ba npn TecTOBe c /iOKa/ieH 
ctpBtp m nporpaMMCTMTe He yceiuaT BeAHara, ne MMa npo6/ieM. 

Hako/iko ca ocHOBHMTe BapnaHTM 3a cnpaBAHe c to3m npo6/ieM: 

- Bc*iKa CTpaHa naKa 3a OTroBop, npeAH P.a M3npaTM hobo c"bo6iueHne. 
ToBa e Ao6po peiueHne, ho He BMHarn e B"b3MO>KHO b ziori/iKaTa Ha 
nporpaMaTa. 



396 nporpaMnpaHe 3a .NET Framework (tom 2) 

- npeflaBaT ce caMO c"bo6iueHMfl c cpMKCupaH pa3Mep v\ ce neTe ot 6ycpepa, 
flOKaTO ce 3an"b^HAT 6aMTOBeTe Ha to3m pa3Mep. ToBa peiueHne MMa 
oneBkifleiH HeAOcraTbK, ne orpaHMnaBa BMAa Ha cbo6meHMflTa, a n aKO Te 
ca no-Ktcn ot to3m pa3Mep, ce xa6n m3/imluho MpewoB TpacpMK. 

- ripeAaBaT ce cbo6meHMfl c npoMeH/iMBa A"b/i>KMHa, koato ce noAaBa KaTO 
4-6aMTOBa AaHHa ot Tun int b Hana/iOTO Ha c"bo6iueHneTO. 3a ue/iTa ce 

M3nO/13BaT MeTOAMTe BitConvertor.GetBytes(int) M BitConvertor . 
ToInt32 (byte [ ] ) . AKO CM KOMyHMKkipaT MailJMHM C pa3/lMHHO 

noApe>KAaHe Ha 6akiTOBeTe, ce M3no/i3Ba v\ yHMBepca/iHOTO MpewoBO 

nOApe>KAaHe npe3 IPAddress.HostToNetworkOrderO M IPAddress. 

NetworkToHostorderO . MeTOAt>T e MO>Ke 6m Haw-Ao6poTO peiueHne Ha 
npo6/ieMa. 

- Eaho Apyro peiueHne e p,a ce cnara npeABapMTe/iHO yKa3aH 6aMT ioto 
"MapKep 3a Kpaw" cnep, bcako c"bo6iueHne. Cnep, TOBa ce neTe ao to3m 
6awT. ToBa Ha/iara Aont/iHMTe/iHa o6pa6oTKa v\ napcBaHe, a v\ Tpa6Ba p,a 
CMe curypHM, ne to3m 6aMT He ce cpeiua b caMOTO c"bo6iueHne, KoeTO e 
npo6/ieM. MeTOAtT e HaM-Ao6"bp npn TeKCTOBM cbo6meHMfl v\ 3a TaKMBa 
ce pea^M3npa aBTOMaTMUHO b noTOHHaTa KOMyHMKauna npe3 

StreamWriter M StreamReader, KaTO 3a MapKep ce M3nO/13Ba CMMBO/l"bT 

3a hob peA- 

CBOMCTBa Ha coKeTMTe m 3aflaBaHe Ha onqHM 

K/iacbT socket npnTe>KaBa hako/iko CBOMCTBa, komto hm pjaeaj MHCpopMauna 
3a cbCTOAHneTO Ha coKeTa. Cbomctboto Available HanpuMep hm Bptiua 
KO/iM4ecTBOTO ashhh, komto b MOMeHTa MoraT p,a 6"bAaT nponeTeHM OT COKeTa. 
CBOMCTBaTa Connected, LocalEndPoint M RemoteEndPoint HM AaBaT MHCpop- 
MaUMfl Ranw, C KOTO M Ha KOM nopT e CB"bp3aH COKeTbT, KaTO RemoteEndPoint 
MO>Ke AS Ce M3nO/13Ba CaMO aKO CMe M3ITb/lHM/lM Bind(...). Cbomctboto 

Blocking no3BO/iflBa p,a c"b3AaBaMe cokctm, 3a komto onepauMMTe no no/iyna- 
BaHe Ha cbo6meHMfl He 6/iOKMpaT M3n"b/iHeHMeTO Ha nporpaMaTa. 3a TOBa me 
roBopMM Ma/iKO no-noApo6HO b cneABamMTe peAOBe. 

CbmecTByBaT n peAMua onuMM, komto KOHTpo/iMpaT noBeAeHMeTO Ha COKeTa m 
MoraT Aa ce 3aAaBaT b xoAa Ha nporpaMaTa. ToBa CTaBa npe3 MeTOAa 

SetSocketOption (SocketOptionLevel level, SocketOptionName name, 
int value). B 3aBMCMMOCT OT BMAa Ha OnUMflTa, MeTOA"bT MMa BapMaHTM, npM 

komto noc^eAHMAT napaMeTbp e byte[] m aopm no-o6iuoTO object. 

OnuMMTe ca pa3Ae/ieHM Ha HMBa, komto ce cbAtpwaT b M36poeHMfl TMn 

SocketOptionLevel. B"b3MO>KHMTe CTOMHOCTM Ca Tcp, Udp, IP M Socket. Te 

yKa3BaT BMAa Ha onuM^Ta. Ha bcako hmbo MMa mhoto ctomhoctm, cbAtpwamM 

Ce B M36pOeHMfl TMn SocketOptionName, KaTO nOAaBaMKM HflKOfl OT TAX Ha 

MeTOAa SetSocketOption (...) , Tpa6Ba Aa noAaAeM m cbOTBeTHOTO m hmbo KaTO 
ntpBM napaMeTtp. napaMeTbpvr value yKa3Ba CTOMHOCTra, koato MCKaMe Aa 
AaAeM Ha onuM^Ta. HanpMMep onuM^Ta ReceiveTimeout e ot hmbo socket m a 

3aAaBaMe no C/ieAHMfl HaHMH - SetSocketOption ( SocketOptionLevel. 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 397 
Socket, SocketOptionName.ReceiveTimeout, 3000). TOBa yKa3Ba, ne MeTO- 

flMTe 3a no/iynaBaine Tpa6Ba fla naiOT naKeT no 3 ceKyHflu, npeflu fla npeflM3- 

BMKaT M3K/lK)neHMe. flpyrn klHTepeCHkl OnUMH ca NoDelay, MaxConnections, 

Debug, ipoptions m AP- noBene MHCpopMaunfl 3a cneui/icpwuHaTa onuna, koato 
bm e Heo6xoAMMa, MO>xeTe p,a HaMepi/ue b MSDN. 

TeKymaTa ctomhoct Ha onuna MO>KeM p,a B3eMeM c MeTOAa Getsocketoption ( 

SocketOptionLevel, SocketOptionName) , KOMTO HM Bptiua 06eKT OT TMn 

object m Tpa6Ba Aa npeo6pa3yBaMe pe3y/iTaTa ao Tuna, komto onaKBaMe. 

CoKeT no npoTOKO/i UDP 

KoMyHMKaunflTa no UDP npe3 K/iaca socket He ce pa3/iwnaBa oco6eHO ot Ta3M 
no TCP m e no-npocra. He Tpa6Ba Aa cb3AaBaMe Bp"b3KM c Listen (...) v\ 
connect (...) , AOcrarbUHO e caMO Aa M3npaiuaMe v\ npneMaMe c"bo6iueHMfl (UDP 

datagrams) C MeTOAHTe SendTo (byte [ ] data, EndPoint remote) M 
ReceiveFrom (byte [ ] data, ref EndPoint remote). 

Socket, komto KOMyHMKupa no UDP, cb3AaBaMe no cj\ep,uv\s\ HanwH: 



Socket socket = new Socket (AddressFamily. InterNetwork, 
SocketType . Dgram, ProtocolType . Udp) ; 



fl,Be UDP npi/i/io>KeHkifl MoraT Aa KOHTaKTyBaT noMe>KAy cm Ha npoi/i3BO/iHi/i 
nopTOBe, ho aKO MCKaMe eAHOTO Aa nrpae po/iHTa Ha UDP cbpBtp, MO>KeM Aa 
ro CB"bp>KeM c onpeAe/ieH nopT Ha onepaunoHHaTa ci/icreMa npe3 MeTOAa 

Bind (EndPoint ep) : 



IPEndPoint ipep = new IPEndPoint ( IPAddress . Any, 9050) 
socket . Bind (ipep) ; 



Cera ctpBtptT me no/iynaBa c"bo6iueHMfl caMO Ha to3m nopT. 

ripn MeTOAa SendTo (...) npe3 napaMerbpa remote yKa3BaMe OTAa/ieneHkifl 
ctpBtp, KtM komto me ki3npamaMe c"bo6iueHneTO. KaTO ki3K/iK>ni/iM to3m 
AeTaw/i, noBeAeHneTO Ha MeTOAa Ay6/iwpa TOBa Ha MeTOAa send(...), komto 
Bene pa3MeAaxMe. AHa/iori/mHO Ha Hero, MO>xeM Aa M3no/i3BaMe v\ no-pa3UJM- 

peHaTa CpopMa SendTo (byte [ ] data, int size, SocketFlags flags, 

EndPoint remote), 3a Aa yKa>KeM to4ho ko/iko 6ai/iTa ot 6ycpepa M3npaiuaMe. 

ripn MeTOAa ReceiveFrom (...) noAaBaMe eAMH napaMeTbp no pecpepeHuna, b 
komto ce 3ana3Ba MHCpopMaunaTa 3a OTAa/ieneHkifl cbpBtp, ot komto e aolu/io 
c"bo6iueHneTO. ToBa hm no3BO/iHBa nocne Aa M3npaTMM cto6iueHne o6paTHO 
ki>m cbLuwfl ctpBtp. 06"bpHeTe BHMMaHne, ne 3a TOBa ce Ha/iara npeo6pa3y- 
BaHe KtM a6cTpaKTHMfl K/iac EndPoint: 



398 flporpaMnpaHe 3a .NET Framework (tom 2) 



EndPoint remote = (EndPoint) (new IPEndPoint ( IPAddress . Any, 

byte[] data = new byte [1024]; 

int recv = socket . ReceiveFrom (data, ref remote); 

Console .WriteLine ( "Message received from {0}:", 

remote . ToString ( ) ) ; 
Console .WriteLine (Encoding .ASCII . GetString (data, 0, recv)) 
string welcome = "Welcome to the .NET course!"; 
data = Encoding .ASCII . GetBytes (welcome) ; 
socket . SendTo (data, data. Length, SocketFlags . None, remote) 



Ako me KOMyHMKupaMe c eflkm efli/mcTBeH ctpBtp, i-mMa Hy>Kfla fla ki3no/i3- 

BaMe SendTo(...) M ReceiveFrom (...) . riOfl06HO Ha K/lkieHTCKMfl BapnaHT Ha 

socket npn TCP, Tpa6Ba caMO fla M3BMKaMe MeTOfla connect (...) , c komto fla 
yKa>KeM to3m eflMHCTBeH ctpBtp. ripn TCP to3m MeTOfl M3rpa>Kfla pea/iHa Bp"b3- 
Ka Me>Kfly K/ineHTa v\ ctpBtpa. ripn UDP TaKaBa Bp"b3Ka HHMa, ho MeTOfltT 
yKa3Ba Ha Haujua o6eKT, ne tom me M3npaiua ashhh BMHarn kbm to3m ctpBtp 
m me npneMa datagram naKeTM caMO ot Hero: 



Socket socketToServer = new Socket (AddressFamily. InterNetwork, 

SocketType . Dgram, ProtocolType . Udp) ; 
IPEndPoint ipep = new IPEndPoint ( IPAddress . Loopback, 9050); 
socketToServer . Connect (ipep) ; 
string welcome = "Hello, are you there?"; 
byte[] data = Encoding .ASCII . GetBytes (welcome) ; 
socketToServer . Send (data) ; 
int recv = socketToServer . Receive (data) ; 



npo6/ieMM npw UDP 

ripn KOMyHMKaunflTa no UDP npo6/ieM"bT c rpaHnunTe Me>KAy cto6iueHMflTa He 
cbmecTByBa. UDP He noflfltpwa BtTpeujHM 6ycpepn v\ bchko cbo6meHi/ie ce 
npneMa HaBeflH"b>K. ToBa o6ane Ha cbom pefl boam ao flpyrn npo6/ieMki. 

Ako 6ycpep"bT, komto i/i3no/i3BaMe b ReceiveFrom (...) , e TBtpfle Ma/i"bK, 3a fla 
no6epe ua/ioto c"bo6iueHne, flaHHMTe Ha npaKTMKa me ce M3ry6flT. B Ta3M 
CMTyaunfl ce npeflM3BMKBa M3K/iK)neHkie ot Tun socketException, KoeTO 
MHCpopMupa, ne b 6ycpepa He e i/ma/io flocraTbUHO macto 3a uenwn datagram 
naKeT. Hue MO>xeM fla y/iOBMM TOBa ki3K/iK)neHkie v\ fla M3npaTMM cbo6iueHne, 
ne MMa npo6/ieM. ToBa He peiuaBa npo6/ieMa etc 3ary6eHMTe flaHHM, ho Bee 
naK flaBa bbsmokhoct Ha flpyraTa CTpaHa fla pa36epe, ne Heiuo He e Hapefl. 
EflMHMAT BapnaHT 3a M3xofl ot CMTyaunflTa e fla MMa npoTOKO/i Me>Kfly 
CTpaHMTe 3a MaKCkiMa/iHa fl"b/i>KkiHa Ha cbo6iueHne. Ako TOBa orpaHkmaBa 
ziorwKaTa hm o6ane, MO>KeM npocTO fla noflfltpwaMe npoMeH/iMBa fl"b/i>KMHa Ha 
6ycpepa v\ KoraTO B"b3HkiKHe npo6/ieM, fla a yBe/iwukiM v\ fla ro pei/iHwui/ia/iw- 
3npaMe, KaTO M3npaTMM cbo6iueHne c MO/i6a 3a noBTopHO M3npaiuaHe. flo6pe 
e fla ce OT6e/ie>Kki, ne to3m npo6/ieM He CbmecTByBa npn udpciient K/iaca, 
KtfleTO 6ycpep"bT ce yBe/ii/maBa aBTOMaTi/mHO. 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 399 

flpyrnflT npo6/ieM c UDP e B"b3MO>KHaTa 3ary6a Ha naKeTM. ripn TCP cwcreMaTa 
Ha npoTOKO/ia ce rpn>KM TOBa fla He craBa, ho TyK H^MaMe rapaHuna, ne eflHO 
M3npaTeHO cbo6meHkie HancTMHa e npwcmrHa.no. noHAKora TOBa He e 
npo6/ieM 3a HaiueTO npw.nc»KeHi/ie, ho aKO fltpwi/iM bchko cbo6meHi/ie fla 
npucTura, MO>KeM fla floroBopuM c flpyraTa CTpaHa M3npaiuaHe Ha noTBtp- 
>KflaBaiu OTroBop. TyK Tpa6Ba fla ce MMa npeflBMfl, ne naKaHeTO 3a OTroBop c 
ReceiveFrom ( ... ) m Receive (...) no npuHunn e 6/iOKwpama onepauwa M aKO 
MMa flt^roTpaeH npo6/ieM c no/iynaBaHe Ha naKeTM, HaweTO npi/i/io>KeHkie Ha 
npaKTMKa me ocraHe bmcaluo b 6e3KpaMHO naKaHe. 3a fla ce cnpaBMM c TOBa, 
MO>KeM fla M3no/i3BaMe acuHxpoHHM coKeTM (3a komto me CTaHe flyMa c/iefl 
Ma/iKo) m o6eKT ot K/iaca Timer, komto fla cneflki M3MMHa/iOTO BpeMe 3a 
naKaHe v\ fla ro npeKpaT^Ba, KoraTO to crane mhoto. A/iTepHaTkiBHO, MO>KeM 
fla M3no/i3BaMe 3aflaBaHeTO Ha onunaTa ReceiveTimeout Ha coKeTa, koato 
yKa3Ba ko/iko BpeMe fla naKaT MeTOflMTe 3a no/iynaBaHe Ha cbo6meHi/ifl. 
KoraTO TOBa BpeMe i/i3Tene, othobo ce xBtp/ia socketException, komto 
MO>KeM fla y/iOBMM v\ cnep, KaTO onuTaMe fla M3npaTMM oiue hako/iko ntTi/i 
c"bo6iueHneTO, v\ fla yBeflOMMM K/iweHTa, ne MMa npo6/ieM c Bp"b3KaTa ao 
ctpBtpa. 

noHe>Ke Tpa6Ba fla npoBepaBaMe 3a flBa Tuna socketException v\ fla 
o6pa6oTBaMe flBe pa3/innHw cuTyaunn, b catch 6/iOKa e xy6aBO fla npoBepuM 
BtTpeujHMfl WinSock koa Ha rpeujKa Ha ki3K/iK>neHi/ieTO npe3 cbomctboto 
ErrorCode. Ako KOfltT e 10040, npo6/ieM"bT e b Ma/iKkia 6ycpep. Ako koabt e 
10054, npo6/ieM"bT e bbb Bp"b3KaTa flo CbpBtpa. 

UDP KOMyHMKauMA c K/iaca Socket - npMMep 

C to3m npuMep me noKa>KeM eflHO K/iweHTCKO v\ eflHO cbpBtpHO npi/i/io>KeHkie, 
komto fleMOHCTpupaT npaBki/iHOTO ocurypyiBaHe Ha UDP KOMyHMKauna npe3 
K/iaca socket, TaKa ne fla M36erHeM npo6/ieMMTe, onucaHM no-rope. 

K/iacbT server, komto me HanniueM, e o6mkhob6h K/iac, komto pea/iw3npa 
CTpaTernflTa 3a o6MeH Ha cbo6meHi/ifl, kohto Bene pa3r/ie,aaxMe. CtpBtptT 
M34aKBa no/iynaBaHe Ha datagram naKeT ot hakom K/iweHT, cnefl KoeTO My 
M3npaiua no3,qpaBkiTe/iHO c"bo6iueHne v\ 3anonBa fla ce fl"bp>KM KaTO echo 
ctpBtp, T.e. M3npaiua o6paTHO Ha K/ikieHTa bchko cbo6meHi/ie, KoeTO no/iyni/i. 

no-MHTepeceH e K/iacbT client. B Hero pea/iki3kipaMe ojp,eneu MeTOfl 

SendReceive( Socket, by te [ ] , IPEndPoint) , npe3 KOMTO Lfle ce B"b3nO/l- 

3BaMe ot o6acHeHMTe no-rope TexHMKM 3a npeoflo/isiBaHe Ha npo6/ieMkiTe etc 
3ary6eHM naKeTM v\ Ma/ibK 6ycpep. B ta/ioto Ha MeTOfla onuTBaMe fla M3npaTMM 
noconeHOTO bbb btopma apryMeHT c"bo6iueHne kbm ctpBtpa, noconeH c 
aflpeca cm b TpeTi/m apryMeHT. Ako npn T03M onuT y/iOBMM SocketException, 
npoBepyiBaMe Tuna My v\ pearnpaMe no cbOTBeTHna HanwH. 

B Tfl/iOTO Ha K^neHTCKaTa nporpaMa M3npaiuaMe eflHO Hana/iHO c"bo6iueHne 
ki>m ctpBtpa Ha /lOKa/iHkifl Mpe>KOB MHTepcpewc v\ Ha nopT 2222 (Ha komto 
cnywaMe etc ctpBtpHaTa nporpaMa), c^efl KoeTO 3ano4BaMe fla 4eTeM ot 
KOH30/iaTa cto6iueHMfl v\ fla rn M3npaiuaMe, ^aKawKM 3a OTroBop, KaTO 



400 nporpaMnpaHe 3a .NET Framework (tom 2) 

yBeflOMABaMe noTpe6kiTe/isi, aKO v\ cnep, onuTMTe 3a noBTopHO M3npaiuaHe 
HflMa OTroBop. KoMaHflaTa "exit" npeKpaTABa pa6oTaTa Ha K/ii/ieHTa. 

IHe o6"bpHeM BHMMaHne, ne Tpa6Ba fla ocurypuM no HflKaicbB HanwH M3BecTne, 
ne K^neHTtT e npei<paTi/i/i Bp"b3KaTa, KoraTO TOBa CTaHe. 3a pa3/im<a ot TCP, 
TyK ctpBtptT HflMa KaK fla pa36epe TOBa aBTOMaTMUHO (3aiuoTO Ha npaKTeixa 
HflMa Bp"b3Ka) m Tpa6Ba fla ro yBeflOMMM (HanpuMep fla npenpaTMM KOMaHflaTa 
"exit" m KtM Hero), 3a fla MO>xe tom fla i/i3/ie3e ot umcb/ia, b komto naKa 
c"bo6iueHMfl ot K/iweHTa. 

floirb/iHMTe/iHki MeTOflM 3a MfleHTMCpMKaunfl Ha K^neHTM Tpa6Ba fla ce pa3pa- 
6otat, KoraTO ctpBtptT me pa6oTM c noBe^e ot eflMH K/iweHT eflHOBpeMeHHO. 
noHe>Ke MeTOfltT ReceiveFrom (...) npweMa BCM4KM c"bo6iueHMfl Ha UDP nopTa, 
Ha komto "c/iywa" cbpBtpa, BMHarn Tpa6Ba fla npoBepaBaMe aflpeca, ot komto 
MflBa c"bo6iueHneTO, 3a fla 3HaeM ot kom K/iweHT MflBa. 

3a fla nocTpouM npw/io>i<eHMeTO Tpa6Ba fla i/i3n"b/iHMM cnep,Hv\je crbnKM: 

1. OTBap^Me VS .NET v\ cb3flaBaMe hobo koh30/iho npw/io>KeHi/ie. 

2. B"bBe>KflaMe KOfla Ha cbpBtpHkifl K/iac: 



class Server 

{ 

static void Main ( string [ ] args) 

{ 

Socket server = new Socket (AddressFamily. InterNetwork, 

SocketType . Dgram, ProtocolType . Udp) ; 
IPEndPoint ipep = new IPEndPoint ( IPAddress . Any, 2222); 
server . Bind ( ipep ) ; 

Console .WriteLine ( "Waiting for a client..."); 
IPEndPoint sender = new IPEndPoint ( IPAddress .Any, 0); 
EndPoint client = (EndPoint) (sender); 
byte[] data = new byte [1024]; 

int recv = server . ReceiveFrom (data, ref client); 
Console .WriteLine ( "Message received from {0}:", 

client . ToString ( ) ) ; 
Console .WriteLine (Encoding .ASCII . GetString (data, 0, recv)) 
string welcome = "Welcome to my test server"; 
data = Encoding .ASCII . GetBytes (welcome) ; 

server . SendTo (data, data. Length, SocketFlags . None, client) 
while (true) 

{ 

data = new byte [1024]; 

recv = server . ReceiveFrom (data, ref client); 

Console .WriteLine ( 

Encoding .ASCII . GetString (data, 0, recv)); 
server . SendTo (data, recv, SocketFlags . None, client); 
} 
} 



T/iaBa 18. MpewoBO v\ Mi-rrepHeT nporpaMkipaine 401 
3. C"b3flaBaMe oiue eflMH K0H30/ieH npoeKT v\ B"bBe>KflaMe KOfla Ha 

K^MeHTCKMfl K/iac. 



class Client 

{ 

const int MAX_RETRY_ATTEMPTS = 4; 
const int BUFFER_INCREMENT = 10; 

private static byte [ ] data = new byte [1024]; 
private static EndPoint remote = (EndPoint) 

new IPEndPoint (IPAddress .Any, 0); 
private static int size = 30; 

private static int SendReceive (Socket s, byte [ ] message, 
EndPoint server) 

{ 
int recv = 0; 
int retry = 0; 
while (true) 

{ 

if (retry != 0) 

Console .WriteLine ( "Retry #{0}", retry); 
try 

{ 

s . SendTo (message, message . Length, SocketFlags . None, 
server) ; 

recv = s . ReceiveFrom (data, ref remote); 

} 

catch (SocketException e) 

{ 

if (e.ErrorCode == 10054) 

Console .WriteLine ( "Error connecting to server"); 
else if (e.ErrorCode == 10040) 

{ 

Console .WriteLine ( "Error receiving packet"); 
size += BUFFER_INCREMENT; 
data = new byte [size]; 

} 

recv = 0; 

} 

if (recv > 0) return recv; 

else 

{ 

retry++; 

if (retry > MAX_RETRY_ATTEMPTS ) return 0; 
} 
} 
} 

public static void Main ( ) 



402 flporpaMnpaHe 3a .NET Framework (tom 2) 



} 



{ 
IPEndPoint ipep = new IPEndPoint( 

IPAddress. Parse ("127. 0.0.1") , 2222) ; 
Socket client = new Socket (AddressFamily. InterNetwork, 

SocketType . Dgram, ProtocolType . Udp) ; 
client . SetSocketOption (SocketOptionLevel . Socket, 

SocketOptionName . ReceiveTimeout, 3000) ; 
string greeting = "Hello, are you there?"; 
data = Encoding .ASCII . GetBytes (greeting) ; 
int recv = SendReceive (client, data, ipep); 
if (recv > 0) 

string strData = Encoding .ASCII . GetString (data, 0, recv) ; 
Console . WriteLine ( strData) ; 

else 

Console .WriteLine ( "Unable to talk with remote host"); 
return; 

while (true) 

string input = Console . ReadLine () ; 
if (input == "exit") 

break; 
recv = SendReceive ( 

client, Encoding .ASCII . GetBytes (input ) , ipep); 
if (recv > 0) 

{ 

strData = Encoding .ASCII . GetString (data, 0, recv) ; 
Console .WriteLine ( strData) ; 

} 
else 

Console .WriteLine ( "Did not receive an answer"); 

} 

Console .WriteLine ( "Stopping client" ) ; 
client . Close ( ) ; 
} 



4. CTapTupaMe cbpBtpa v\ ro ocraBAMe p,a c/iywa 3a MABaiun cbo6meHMfl. 
C/ieA TOBa CTapTupaMe v\ K/iwei-iTa. npuMepeH pe3y/iTaT cnep, hako/iko 
Cbo6meHkifl M3Me>Kfla no cj\ep,uv\s\ Ha^MH: 



T/iaBa 18. Mpe>KOBO v\ MHTepHeT nporpaMkipaine 403 



o--\ C:\WlNDOWS\System32Vcmd.exe - Client .exe 



ItJelcome to my test server 
Hi, this is Mars i 

Hi, this is Mars I e=v C:\WlNDOWSlSys 



HUP 



oa C:\WlNDOWSlSystem32lcmd.exe - Netwoiktests... |H@ IS 



Waiting for a client... 

Message receiued from 127.0.0.1:2580: 

Hello, are you there? 

Hi, this is Mars 



Li 



HflKO/IKO flyMM 3a aCMHXpOHHMTe COKeTM 

KaKTO Bene M3flCHMXMe, bcmukm COKeTM 6/iOKkipaT Ha onpefle/ieHi/i onepaunn 

KaTO HanpMMep Accept (), Connect (...) , Send(...) M Receive (...) , flOKaTO Te3M 

MeTOflM He 3aB"bpwaT flewcTBueTO cm. rioHe>Ke TOBa MO>xe fla npofl"b/i>Kki 6e3- 
KpaMHO, b mhoto c/iynaw e Ao6pe no HHKaicbB HanwH fla mokcm fla B"b3o6HO- 
bmm xofla Ha nporpaMaTa cnep, 6/iOKi/ipamaTa onepauna, flopn ta fla e b Kpaw- 
Ha CMeTKa HeycneujHa. ToBa Ba>KM b oco6eHO ro/iflMa CTeneH 3a rpacpwuHM 
npn^o>KeHMfl, KtfleTO He e npaBM/iHO fla no3BO/i*iBaMe ua/ioto npi/i/io>KeHi/ie fla 
OTHeMa KOHTpo/ia Ha noTpe6wTe/ifl flOKaTO naKa 6/iOKkipam MeTOfl, komto Mowe 
fla He 3aB"bpujn no pefl npn^MHn, HanpuMep cra6i/i/iHOCTTa Ha Mpe>xaTa. 

Cbomctboto Blocking 

3a fla ce cnpaBMM c to3m npo6/ieM, MO>xeM fla ki3no/i3BaMe cbomctboto 
Blocking, 3a KoeTO Bene CTaHa flyMa. Ako 3aflafleM Ha TOBa cbomctbo ctom- 
hoct false, to coKeTtT npecTaBa fla TpeTupa Te3M onepaunn KaTO 6/iokm- 
paifln. ToBa 03Ha4aBa, ne HanpuMep MeTOfltT Receive (...) me npoBepn fla/iki 
MMa flaHHM 3a no/iynaBaHe v\ aKO fla - me rn no/iynw, - a aKO H^Ma, me BtpHe 
m me 3aB"bpujn, 6e3 fla naKa fla ce noaBflT HAKaKBM flaHHM (KaKTO e no 
noflpa36npaHe). 



ACMHXpOHHM MeTOflM 

no-flo6"bp BapnaHT (aoko/ikoto hm flaBa noBene b"B3mo>khoctm 3a o6pa6oTKa) 
e fla M3no/i3BaMe t. Hap. acuHxpoHHM MeTOflM Ha K/iaca socket. ToBa ca 

flBOMKM MeTOflM OT TMna BeginXXX ( ... ) M EndXXX(...), KOMTO OTroBapaT Ha craH- 

flapTHMTe MeTOflM m MMn/ieMeHTwpaT CTaHflapTHna 3a .NET MO,qe/i Ha acuH- 

XpOHHO M3BMKBaHe Ha MeTOflM. 

IHe flafleM npuMep c MeTOfla Accepto. KaKTO 3HaeM, tom ce M3BMKBa npn 
ctpBtpa m 6/iOKkipa, flOKaTO He ce noaBu K/iweHTCKa Bp"b3Ka, KaTO Bptma b 
pe3y/iTaT HOBOCb3flafleH coKeT 3a Ta3M Bp"b3Ka. Ako MCKaMe noTpe6MTe/i*iT fla 
e b cbCTOAHne fla M3B"bpujBa v\ flpyrn 3a,qanki, flOKaTO cbpB"bp"bT naKa 3a 
K^neHTCKO 3annTBaHe, M3no/i3BaMe MeTOfla void BeginAccept( 



404 nporpaMnpaHe 3a .NET Framework (tom 2) 

AsyncCallback callback, Object state) . ritpBUflT napaMeTbp e fle/ieraT, 
komto C04M ki>m cpyHKunflTa, KOATO me ce M3n"b^HM, KoraTO ce nOflBM 
K^neHTCKa Bp"b3Ka. B o6pa6oTKaTa Ha Ta3M cpyHKui/m Tpa6Ba fla M3BMKaMe 

MeTOAa Socket EndAccept(IAsyncResult result), KOMTO Bene Lfle HM flafle 

KaTO pe3y/iTaT hobma coKeT. 

rioHewe Ae/ieraT"bT callback e etc 3aflafleH npoTOTun, He M0>xeM fla My 
noflafleM KaTO napaMerbp caMna coKeT, 3a komto Tpa6Ba fla M3BMKaMe 
EndAccept ( ... ) . no Ta3M npn^MHa coKeTa noflaBaMe KaTO btopm apryMeHT Ha 

BeginAccept ( ... ) . T03M apryMeHT e OT TMn Object M C/iy>KI/l MMeHHO 3a 

npeflaBaHe Ha Heo6xoflMMa MHCpopMauna Me>Kfly ocHOBHaTa nporpaMa v\ 
callback MeTOfla, KtfleTO MO>KeM fla i/i3no/i3BaMe coKeTa, ki3B/iwnaMKki ro ot 
cbomctboto Asyncstate Ha napaMerbpa result: 



static void Main ( string [ ] args) 

{ 

Socket socket = new Socket (AddressFamily. InterNetwork, 
SocketType . Stream, ProtocolType . Tcp) ; 

IPEndPoint ipep = new IPEndPoint ( IPAddress . Any, 2222); 

socket . Bind (ipep) ; 

socket . Listen ( 10 ) ; 

socket . BeginAccept (new AsyncCallback (AcceptCallback) , socket); 

// Do some stuff 
} 

private static void AcceptCallback ( IAsyncResult iar) 

{ 

Socket socket = (Socket ) iar .AsyncState; 

Socket client = socket . EndAccept (iar ) ; 

// Send message to client, handle communication 
} 



no CbLflklfl HanklH npoueflkipaMe C MeTOflklTe BeginSend(...) , EndSend(...) , 
BeginConnect(...) , EndConnect (...) M T. H. U\e OT6e/ie>KI/IM caMO, ne Te3M 

MeTOflM ca Ha pa3no/io>KeHMe caMO 3a K/iaca socket. no-cneui/ia/ii/i3npaHHTe 

K/iaCOBe, KOMTO pa3MeflaXMe (UdpClient, TcpClient l/l TcpListener) He nOfl- 
fl"bp>KaT aCMHXpOHHO M3BMKBaHe. 

MeTOflMTe Poll(...) m Select(...) 

K/iacbT npefl/iara oiue flBa MeTOfla, komto MO>KeM fla i/i3no/i3BaMe, 3a fla He 
no3BO/ikiM Ha coKeTa fla ocTaHe b 6/iOKi/ipaHO cbCTOAHne. 

npoBepKa 3a 6/ioKnpaHe c Poll(...) 

MeTOfl"bT Poll(int time, SelectMode mode) npOBepflBa B npOfl"b/l>KeHI/ie Ha 

time MMKpoceKyHflM (1 ceKyHfla = 1000000 MMKpoceKyHflu) fla/iw coKeTbT me 
6/iOKi/ipa Ha flafleHa onepauna, onpe,qe/ieHa ot napaMeTbpa mode. Ako TOBa e 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 405 

TaKa, Poii(...) Bptiua false v\ Hue 3HaeM fla He BMKaMe MeTOfla, komto 6m 
6/iOKkipa/i M3n"b^HeHneT0 Ha nporpaMaTa. 

SelectMode e M36poeH TMn M Cbfl"bp>Ka Tpn CTOMHOCTki: SelectRead, 
SelectWrite M SelectError. IHtpBaTa npOBepflBa fla/lM MMa Bp"b3KM 3a 

npneMaHe v\ fla/iw MMa ashhh 3a no/iynaBaHe v\ Bptiua true, aKO HAKoe ot tax 
e BnpHO v\nv\ aKO Bpt3KaTa e 3aTBopeHa. seiectwrite Bptiua true, aKO 
coKeTtT e 6m/i CB"bp3aH c connect (...) v\nv\ aKO no Bp"b3KaTa MoraT fla ce 
M3npaTAT uaHHM, a SelectError npoBepyiBa ua/iki e kiMa/io rpeiuKki npn 
connect (...) m npeuaBaHeTO Ha uaHHM. 

C/ieflHkiflT npuMep noKa3Ba KaK fla M3no/i3BaMe Poll (...), 3a fla neTeM uaHHM b 
He6/iOKkipaiu pe>KMM npn cb3flafleHki npoMeH/ikiBki socket (3a ctpBtpHaTa 
crpaHa) v\ client (3a K/iweHTCKaTa crpaHa). Othobo pea/iki3kipaMe no3HaTMfl 
ctpBtp, komto noBTapa no/iyneHkiTe ot K/ikieHTa cbo6iueHi/m. 



while (true) 

{ 

result = client. Poll (3000000, SelectMode . SelectRead) ; 
// Do some stuff 
if ( result) 

{ 

data = new byte [1024]; 

recv = client . Receive (data) ; 

if (recv == 0) 

break; 
Console . WriteLine ( 

Encoding .ASCII . GetString (data, 0, recv)); 
client . Send (data, recv, 0); 

} 
else 

{ 
// Do other stuff 

} 
} 



Bi>3mo>khoctm Ha MeTOAa Select(...) 

CraTMUHMflT MeTOA Select(IList checkRead, IList checkWrite, IList 

checkError) M3B"bpujBa cbiuwTe ueMCTBUfl, ho 3a noBene o6eKTM ot K/iaca 
socket eAHOBpeMeHHO. Bcmukm TaKMBa o6eKTM, cbfltpwaiuw ce b KO/ieKuwaTa 

checkRead, ce npOBepflBaT CbC SelectRead; BCM4KM B checkWrite - CbC 

seiectwrite m t.h. C/ieu ki3n"b/iHeHkieTO Ha MeTOfla KO/ieKum/iTe cbfl"bp>KaT 
caMO Te3M coKeTM, 3a komto BtpHaTaTa ctomhoct (npn npoBepKa KaTO c 
Poll (...)) e true. To3m MeTOfl e no/ie3eH, KoraTO pa6oTMM c hhko/iko K/ikieHTa 
eflHOBpeMeHHO - ToraBa MO>KeM fla nocraBMM TexHMTe coKeTM b KO^eKunnTe v\ 
fla vv\ npoBepuM c MeTOfla seiect(...). C/iefl 3aB"bpujBaHeTO Ha MeTOfla, 
o6xo>KflaMe KO/ieKuwkiTe v\ M3BtpujBaMe cbOTBeTHMTe fleMCTBua, 3a komto Bene 
3HaeM, ne H*iMa fla 6/iOKkipaT i/i3n"b/iHeHkieTO. He 6nBa fla ce 3a6paBH, ne 



406 nporpaMnpaHe 3a .NET Framework (tom 2) 

select (...) npoMeHfl noflafleHMTe My KO/ieKuww. Ako MCKaMe fla 3ana3MM 
BCM4KM coKeTM, Tpsi6Ba fla vv\ na3MM b flpyra KoneKixwn npn M3BMKBaHeTO Ha 
MeTOfla. 

Multicasting b .NET Framework 

rioHAKora e yflo6HO flafleHO cbo6meHkie fla ce M3npaiua Ha bcmukm K/iweHTki b 
ziOKa/iHaTa Mpe>Ka, HanpuMep 3a peK/iaMa. ToBa CTaBa, KaTO M3npaTMM naKeT 
Ha cneu.ua/ieH 3ana3eH aflpec, v\ ce Hapkma broadcasting. Multicasting ce 
Hapi/ma M3npaiuaHeTO Ha naKeT Ha rpyna ot npeflBapwTe/iHO 3aflafleHM aflpecu 
HaBeflH"b>K. TyK me pa3r/ie,qaMe HaKpaTKO cpeflCTBaTa b .NET Framework 3a 
pea/iki3kipaHe Ha broadcasting c multicasting. 

Broadcasting coxem 

B onucaHneTO Ha K/iaca iPAddress cnoMeHaxMe no/ieTO iPAddress. 
Broadcast, KoeTO hm flaBa /lOKa/iHkisi broadcast aflpec. Ako M3npaTMM 
c"bo6iueHne Ha to3m aflpec npe3 MeTOfla sendTo (...), c/ieflBa to fla ce no/iynw 
ot bcmhkm CBtp3aHM b ziOKa/iHaTa Mpewa a6oHaTM. rioHe>Ke .NET HHMa fla hm 
no3BO/ii/i fla HanpaBMM TOBa c o6mkhob6h, cb3fla,qeH no noflpa36npaHe, coKeT, 
Tpa6Ba fla npoMeHMM CTOMHOCTTa Ha onunaTa Broadcast no cnep,uv\s\ HanwH: 



Socket broadcast = new Socket (AddressFamily . InterNetwork, 

SocketType . Dgram, ProtocolType . Udp) ; 
broadcast . SetSocketOption (SocketOptionLevel .Socket, 

SocketOptionName . Broadcast, 1 ) ; 
string message = "This is a broadcast message"; 
byte [ ] data = Encoding .ASCII . GetBytes (message) ; 
broadcast . SendTo (data, 

new IPEndPoint (IPAddress .Broadcast, 2222)); 



rio/iynaBaHeTO Ha broadcast c"bo6iueHMfl ot crpaHa Ha K/iweHTa He ce 
pa3/ikmaBa ot o6mkhob6ho no/iynaBaHe Ha c"bo6iueHMfl c ReceiveFrom(...) . 
Oco6eHOCT Ha broadcast M3npaiuaHeTO e eflMHCTBeHO, ne coKeTbT Tpa6Ba fla 
pa6oTM c datagram naKeTM, T.e. Tpa6Ba fla ki3no/i3BaMe SocketType . Dgram 3a 
Tun Ha coKeTa v\ o6mkhob6ho pa6oTMM c UDP. 

Multicasting coKem 

3a pa3/ii/iKa ot broadcasting, multicasting KOMyHMKaunaTa He e orpaHi/meHa 
caMO b paMKMTe Ha ziOKa/iHaTa Mpewa. 3a multicasting ca pe3epBnpaHM 
BCM4KM IP aflpecu b r/io6a/iHaTa Mpewa b i/iHTepBa/ia 224.0.0.1 ao 
239.255.255.255. BceKki ot Te3M aflpecu npeflcraBH eflHa T.Hap. multicast 
rpyna. EflHO npn^OKeHne MO>Ke fla ce a6oHnpa 3a noflo6Ha rpyna, npn KoeTO 
to me no/iynaBa bcmukm naKeTM, M3npaTeHM kbm IP aflpeca Ha rpynaTa. 

3a cb3flaBaHeTO Ha coKeT, komto fla KOMyHMKupa c multicast cbo6meHkifl, 
othobo Tpa6Ba fla 3aflafleM onpefle/ieHa onuna. A6oHnpaHeTO 3a flafleHa 
rpyna MOKeM fla bmamm b npuMepa: 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMnpaHe 407 



Socket multicast = new Socket (AddressFamily. InterNetwork, 

SocketType . Dgram, ProtocolType . Udp) ; 
IPEndPoint ipep = new IPEndPoint ( IPAddress . Any, 2222); 
multicast . Bind (ipep) ; 
multicast . SetSocketOption (SocketOptionLevel .IP, 

SocketOptionName . AddMembership, 

new MulticastOption (IPAddress. Parse ( "22 4 . . . 56" ) ) ) ; 



l/l3no/i3BaMe onunaTa AddMembership, KOATO npweMa 3a CTOMHOCT 06eKT OT 
Tkin MulticastOption, 4MMTO KOHCTpyKTop Ha cbom peA npneMa KaTO ctom- 
hoct IPAddress m TyK noAaBaMe Banv\p,eu multicast rpynoB aApec. 06"bpHeTe 
BHMMaHne, ne MeTOAa setsocketoption(...) Tpa6Ba p,a M3BMKaMe cnep, MeTOAa 
Bind(...). OrryK HaTaTbK coKeTbT multicast me no/iynaBa KaKTO cbo6meHkifl, 
onpeAe^eHM 3a aApeca, 3a komto e M3BMKaH Bind(...), TaKa v\ TaKMBa, 
onpeAe^eHM 3a aApeca Ha multicast rpynaTa. 

3a M3npaiuaHe Ha multicast c"bo6iueHMfl He ce Hy>KAaeM ot cneu.ua/iHa 
HacrpoMKa Ha onunnTe, a npocTO M3npaiuaMe cto6iueHne Ha cbOTBeTHwa 
multicast aApec. 

EAHa oco6eHOCT Ha T03M bma KOMyHkiKau.i/m e T.Hap. Time To Live (TTL) 
ctomhoct Ha IP naKeTkiTe. Ta no noApa36npaHe e 1, KoeTO 3Hanw, ne HaiunTe 
naKeTM He MoraT p,a npeMkmaT npe3 MapiupyTM3aTop (router) v\ Ha npaKTMKa 
multicast cbo6meHi/mTa othobo ce npeAaBaT caMO b paMKMTe Ha /ioi<a/iHaTa 
Mpe>Ka, aKO aApecbT e TaM. TTL BpeMeTO MO>KeM p,a noAo6pnM etc cneAHOTO 

3aAaBaHe Ha OnUklflTa MulticastTimeToLive: 



multicast . SetSocketOption (SocketOptionLevel .IP, 
SocketOptionName .MulticastTimeToLive, 50) ; 



IHe OT6e^e>KMM caMO oiue, ne rpyna MO>Ke p,a 6"bAe v\ HanycHaTa KaTO 3aAaAeM 
multicast aApeca, c komto CMe pa6oTM/iki, npn npoMHHa CTOMHOOTa Ha 

OnUMflTa DropMembership : 



multicast . SetSocketOption (SocketOptionLevel .IP, 
SocketOptionName . DropMembership, 
new MulticastOption (IPAddress. Parse ( "224 . . . 56" ) 



Multicasting c K/iaca UdpClient 

K/iacbT udpciient cbiuo noAA"bp>Ka MeTOAM 3a multicasting. ToBa ca 

JoinMulticastGroup (IPAddress , int) M LeaveMulticastGroup 

(IPAddress, int) . TyK ntpBMAT napaMerbp yKa3Ba aApeca, komto npeAcraBH 
multicast rpynaTa, a btopmat 3aAaBa AnpeKTHO TTL croi/iHOCTTa. 

M3npaiuaHeTO v\ npneMaHeTO Ha cbo6meHkifl He ce pa3/ii/maBa oco6eHO ot 
Bene pa3MeAaHOTO npn socket. Eahhctb6ho Tpa6Ba p,a noMHMM p,a noAaBaMe 
Ha KOHCTpyKTopa Ha udpciient HOMepa Ha nopTa, Ha komto MCKaMe p,a 



408 



flporpaMnpaHe 3a .NET Framework (tom 2) 



no/iynaBaMe cbo6meHMfl, 3aiuoTO aixo HAMa 3aflafleH nopT, 
joinMuiticastoption(...) me ce npoBa/iM m me npeflM3BMKa M3K/iioneHMe. 



M3no/i3BaHe Ha DNS ycnyrw npe3 K/iaca Dns 

3a M3n"b^HflBaHe Ha DNS 3aaBKM b .NET Framework M3no/i3BaMe K/iaca Dns. C 
noMomTa Ha HeroBMTe MeTOAM MO>KeM p,a npoBepuM MMeHaTa Ha AOMeMHMTe, 
komto OTroBap^T Ha flafleHM aflpecu Ha MaiunHM, KaKTO v\ o6paTHcrro. 

Pe3y/iTaTbT ot DNS 3aflBKMTe, M3irb/iHflBaHM npe3 K/iaca Dns, e bbb bma Ha 
o6eKTM ot K/iaca iPHostEntry. To3M K/iac MMa HAKO/iKO CBOMCTBa, b komto ce 
3ana3Ba MHCpopMaunaTa, koato hm MHTepecyBa. MMeTO Ha flOMewHa ce HaMupa 

B CBOMCTBOTO HostName. B CnMCbKa OT IPAddress 06eKTM AddressList Ce 

na3AT BCM4KM aApecM, acounnpaHM c to3m AOMewH, a b cnncbKa ot HM30Be 
Aliases - BCM4KM nceBflOHMMM Ha flOMewHa, npe3 komto tom cbu\o e 
flocTbneH. 

Ochobhmat MeTOfl, komto me M3no/i3BaMe, e MeTOfltT Resolve (string) . Tom 
Bptiua o6eKT ot TMna IPHostEntry, a npMeMa 3a napaMeTbp eflMH hm3, komto 
MO>Ke fla e v\nv\ MMe Ha flOMeMH, v\nv\ IP aflpec (b CTaHflapTHMa bma c neTMpM 
eflHo6aMTOBM nMC/ia, pa3Ae^eHM c toukm). C/ieAHMHT npMMep AeMOHCTpMpa 
M3no^3BaHeTO My: 



IPHostEntry iphe = Dns . Resolve ( "www. microsoft . com" ) ; 
Console .WriteLine ( "Information for www.microsoft.com"); 
Console .WriteLine ( "Host name: {0}", iphe . HostName) ; 
foreach ( string alias in iphe .Aliases ) 

{ 

Console .WriteLine ( "Alias : {0}", alias); 

} 

foreach ( IPAddress address in iphe .AddressList ) 

{ 

Console .WriteLine ( "Address : {0}", address . ToString () ) 



Eto m pe3y/iTaTa - MMeHaTa m nceBAOHMMMTe Ha xocra www.microsoft.com : 









c:'.. C:\WlNDOWS\System32Vcmd.exe 




^a 


* 


Information for www.nicrosoft.coni 

Host name: lbl.www.ns.akadns.net 

Alias: www.nicrosoft.con 

Alias: toggle.www.ns.akadns.net 

Alias: g.www.ns . akadns .net 

Address: 207.46.19.60 

Address: 207.46.20.30 

Address: 207.46.20.60 

Address: 207.46.198.30 

Address: 207.46.198.60 

Address: 207.46.199.60 

Address: 207.46.225.60 

Address: 207.46.19.30 







T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 409 
OcBeH MeTOfla Resolve (...) , HMaMe Ha pa3no^o>KeHMe v\ MeTOflMTe 

GetHostByName(...) M GetHostByAddress (...) , KOMTO npneMaT C"bOTBeTHO MMe 

Ha flOMeMH m aflpec, ho tbm ioto noHAKora He ce 3Hae no iokbo me MCKaMe fla 
TtpcuM (HanpuMep npn bxoa ot noTpe6kiTe/i*i, komto MO>Ke fla BtBefle iokto 
IP aApec, TaKa v\ MMe Ha AOMetiH), e 3a npenoptuBaHe fla M3no/i3BaMe MeTOfla 

Resolve (...) . 

ACMHXpOHHM DNS 3anBKM 

K/iacbT Dns npefl/iara v\ acuHxpoHHM 3aaBKM, HanpuMep npe3 MeTOflMTe 

BeginResolve (string, AsyncCallback, object) M EndResolve ( 

AsyncResuit) . Ako He MCKaMe nporpaMaTa hm fla 6/iOKMpa npn eBeHTya/iHO 
naiOHe 3a ottobop ot DNS cbpBtp, MO>xeM fla vv\ M3no/i3BaMe b eflHa 
npuMepHa npepa6oTKa Ha ropHi/ia npuMepTaKa: 



static void Main ( string [ ] args) 

{ 

Object state = new Object (); 

AsyncCallback OnResolved = new AsyncCallback (Resolved) ; : 

Dns . BeginResolve ( "www. microsoft . com" , OnResolved, state); 

// Do some other stuff 

Console . Read () ; // This is to prevent program termination 
} 

private static void Resolved ( IAsyncResult ar) 

{ 

IPHostEntry iphe = Dns . EndResolve (ar) ; 

Console .WriteLine ( "Host name: { } " , iphe . HostName) ; 

foreach ( string alias in iphe .Aliases ) 

{ 

Console. WriteLine ( "Alias : { } " , alias ) ; 

} 

foreach ( IPAddress address in iphe . AddressList ) 

{ 

Console .WriteLine ( "Address : { } " , address ) ; 

} 
} 



l/l3no/i3BaMe MeTOfla console. Read o 3a fla 3a6aBMM M3n"b/iHeHkieTO Ha 
nporpaMaTa - b npoTMBeH c/iynaw ta me nprncnionki BeflHara cnefl m3bmk- 
BaHeTO Ha BeginResolve (...) m HHMa fla ycneeM fla BMflMM ecpeKTa ot 
noc/ieflBaiuoTO acuHxpoHHO M3BMKBaHe Ha MeTOfla Resolved (...) . BtnpocHMfl 
MeTOfl npaBMM craTMneH, 3a fla MO>xeM fla ro M3no/i3BaMe npn cb3flaBaHeTO Ha 

fle/ieraTa OnResolved B CTaTMUHMfl KOHTeKCT Ha Main(...) . 

Pa6oTa c ye6 pecypcu - K/iacbT WebClient 

MMeHHOTO npocTpaHCTBO system. Net hm npeflocraBsi m yflo6HMfl K/iac 
webciient, npe3 komto MOxeM ziecHO fla M3B"bpujBaMe npocTa KOMyHMKauMa 



410 



flporpaMnpaHe 3a .NET Framework (tom 2) 



no HTTP npoTOKO/ia c hakom ye6-cbpB"bp. MeTOflMTe Ha K/iaca ca cbcpeflOTO- 
4eHM b flBe ochobhm HanpaB/ieHi/ifl - 3a ki3B/ikmaHe (download) Ha flaHHM v\ 3a 
M3npaiuaHe (upload) Ha flaHHM. 



fl3B/iimaHe Ha naHHM no HTTP 

K/iacbT webciient hm no3BO/iflBa fla no/iynkiM pe3y/iTaTa ot HTTP 3a*iBKa bbb 
bma Ha HTML (T.Hap. raw HTML), 3ana3eH b MacuB ot Tkin byte. 3a ue/iTa 
M3no/i3BaMe MeTOAa DownioadData ( string uri) . KaTO apryMeHT noAaBaMe 
aApeca Ha ye6-pecypca (o6mkhob6ho aApec Ha MHTepHeT CTpaHnua), komto 
MCKaMe Aa M3Ter/iMM. ToBa e hm3, o6pa3yBaH no craHAapTHMTe npaBki/ia 3a 
URI. MoxeM Aa M3B/iH4aMe hako/iko Tuna pecypcn - HTTP (http://), HTTP no 
SSL KaHa/i (https://), KaKTO v\ /iOKa/iHM pecypcn (file://). Cnep,Hv\nj 
npuMep AeMOHCTpupa ynoTpe6aTa Ha MeTOAa DownioadData (...) : 



static void Main ( string [ ] args) 

{ 

WebClient wc = new WebClient ( ) ; 

byte [ ] response = wc . DownioadData ( "http : //www. nakov. com" ) ; 

Console . WriteLine (Encoding .ASCII . Gets t ring (response) ) ; 



B pe3y/iTaT no/iynaBaMe HTML cbAtpaoHkieTO Ha noconeHaTa CTpaHnua: 



C :\WlNDOWS\Syste m 3 2Vc md .exe 



IPPP 



|<Jitnl> 



;iiead> 



K/head> 



|<bodg> 



<title>Suetlin Nakou</title> 

<meta http-equiu="Content-Type" content 

<link rel="stylesheet" type="text/css" 



Li 



J 



KaKTO o6nKHOBeHO, TeKCTOBOTO npeACTaBAHe Ha no/iyneHMTe AaHHM no/iyna- 
BaMe npe3 MeTOAMTe Ha K/iaca Encoding. 06tpHeTe oiue BeAHtx BHMMaHne, 
ne TyK Tpa6Ba Aa ce noAaAe nt/ieH URI hm3 3a pecypc. ToBa e pa3/im<a 
HanpuMep c K/iaca Dns v\ K/iaca Tcpciient, KtAeTO noAaBaxMe caMO MMe Ha 
AOMetiH, m Tpa6Ba Aa ce BHMMaBa 3a rpeujKM. Ako He c/iokmm "http://" 
OTnpeA, webciient me ce onuTa Aa Tbpcw pecypca "www.nakov.com" b 
/ioi<a/iHaTa cpaw/iOBa ci/icreMa v\ me ce npeAM3BMKa i/i3K/iK)neHkie ot Tkin 
webException. Te3M M3K^K)4eHMfl onucBaT pa3/ikmHHTe npo6/ieMi/i, KOMTO 
MeTOAMTe 3a HTTP KOMyHMKauna MoraT Aa cpeiuHaT npn ki3n"b/iHeHkieT0 cm. 

C^eABaiuaTa cxeMa ki/uocrpkipa MOAe/ia "3a$iBKa-OTroBop", komto ce i/i3no/i3Ba 
npn M3B/ii/maHe Ha ye6 pecypcn no npoTOKO/i HTTP: 



T/iaBa 18. Mpe>KOBO v\ MHTepHeT nporpaMkipaine 411 



http : //www . nakov . com 




HTTP 3aflBxa 



HTTP OTroBop 




192.168.0.24 
( jorro) 



<html> 
<head> 

</head> 
<body> 
</body> 
</html> 



195.69.120.35 
(www . nakov . com) 



M3Ter/inHe Ha (paPin ot URL 

Ako MCKaMe fla i/i3Ter/ii/iM cpaw/i ot flafleH aApec, MoxeM fla ro HanpaBMM 
othobo c MeTOfla DownioadData(...) m fla o6pa6oTMM no/iyneHkisi MacuB ot Ti/in 
byte[]. no-^ecHO o6ane e fla M3no/i3BaMe npeflocTaBeHna MeTOfl 

DownloadFile (string URI , string filename), Ilpi/I Hero KaTO BTOpn 

apryMeHT noflaBaMe MMe Ha cpaw/i Ha /ioi<a/iHaTa cpaw/iOBa cwcreMa v\ .NET 
Framework ce rpuxn fla 3anniue b Hero i/i3B/ieneHkiTe flaHHn: 



static void Main ( ) 

{ 

WebClient wc = new WebClient ( ) ; 

wc . DownloadFile ( "http : //www. nakov. com" , "data . html" ; 

Console . WriteLine ( "File downloaded" ) ; 
} 



Ako cera npoBepuM cbfltpwaHkieTO Ha cpaw/ia data. html, komto Tpa6Ba fla e 
3ana3eH b nanKaTa bin\Debug Ha HaiueTO npi/i/io>KeHkie (KtfleTO e crapTwpaH 
m M3nt^HMMMflT cpaw/i Ha nporpaMaTa), me bmamm, ne to e ctiuoTO KaTO 
M3X0fla ot iTbpBkisi npuMep. 

kl3B/iMnaHe Ha AaHHM ot URL npe3 noTOK 

K/iacbT webciient npefl/iara oiue eflMH MeTOfl 3a download - TOBa e MeTOflvr 

OpenRead( string URI). riOfl06HO Ha DownloadData (...) TOM M3B/lkma raw 
HTML ot OTroBopa Ha HTTP 3asiBKaTa kbm nocxmeHi/ifl ot URI pecypc, ho a 
npeflocraBsi bbb bma Ha noTOneH o6eKT ot K/iaca stream. ToBa hm no3BO/iflBa 
fla o6pa6oTBaMe kiHCpopMaui/mTa Ha nopunn, a He HaBeflHtx. C"b3flaBaMKM 
eflMH neTeu ot Tuna streamReader Ha 6a3aTa Ha no/iyneHi/m noTOK, MO>KeM fla 
no/iynkiM no-rbBKaBM B"b3MO>KHOCTM 3a o6pa6oTKa. C/ieflBamkisiT npuMep 
noKa3Ba KaK fla no/iynwM nHCpopMaunaTa ot cbpBtpa b noTOneH bma c 

OpenRead ( ... ) : 



412 flporpaMnpaHe 3a .NET Framework (tom 2) 



WebClient client = new WebClient ( ) ; 

Stream stream = client . OpenRead ( "http : //www. nakov. com" ) ; 

StreamReader reader = new StreamReader ( stream) ; 

while (true) 

{ 

string response = reader . ReadLine () ; 
if (response == null) { 
break; 

} 

Console . WriteLine (response) ; 

} 

reader . Close ( ) ; 



To3M KOfl M3Be>Kfla cbiunfl pe3y/iTaT KaTO npeo6pa3yBaHeTO Ha MacuBa ot 

6aMTOBe OT DownloadData(...) B HM3, HO He TO npaBM HaBeAH"b>K, a 

nocneAOBaTe/iHO, v\ hm no3BO/iflBa, aKO >xe/iaeM, p,a M3BtpujBaMe HflKaKBa 
o6pa6oTKa Ha flaHHkue, flOKaTO vv\ neTeM. 

npoBepKa Ha HTTP xeAtpnTe 

BtB BceKM HTTP OTroBop ocBeH p,aHHv\je Ha caMna noncKaH pecypc ce 
BK/iionBaT m pa3/iwnHki nacm noMomHa MHCpopMaunfl, komto HapwuaMe HTTP 
headers. ToBa ca HanpuMep flaHHM 3a KOflOBaTa Ta6/ikiua Ha ki3B/ikmaHMfl 
TeKCT, 3a xapaKTepucTMKMTe Ha ye6-cbpB"bpa, 3a KeiunpaHeTO Ha ye6-pecypca 
m t.h. Te He ce BK/iK>nBaT b raw HTML nacrra v\ He MOxeM p,a vv\ bmamm npe3 

DownloadData(...) HO CBOMCTBOTO ResponseHeaders Ha K/iaca WebClient HM 

no3BO^ABa cnefl M3B"bpiueHa 3aaBKa fla npoBepuM CTOMHOCTMTe Ha Te3M 

peflOBe C MeTaflaHHM. CBOMCTBOTO ResponseHeaders no CbmeCTBO e eAHa 
KO/ieKUkm OT TMn WebHeaderCollection, KOflTO 06x0>KflaMe no CTaHAapTHMfl 

Ha^MH, ki3B/innaMKM K/iK>noBeTe m npw/ie>KamkiTe mm ctomhoctm, HanpuMep 
TaKa: 



WebClient client = new WebClient ( ) ; 

byte [ ] data = client . DownloadData ( "http : //www. nakov. com" ) 

WebHeaderCollection headers = client . ResponseHeaders; 
for (int i=0; i<headers . Count; i++) 

{ 

string key = headers . Keys [i] ; 

string val = headers [i] ; 

Console. WriteLine ("{ 0} = {1}", key, val); 
} 



Pe3y/iTaTbT ot ki3iTb/iHeHkieTO Ha to3m koa e cneflHWflT: 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 413 



C :\WlNDOWSlSyste m3 2Vc md .exe 



HIS IB 



Bate = Sun, 16 Oct 2005 10:31:09 GMT 
Seruer = Apache/1 .3 .27 <Unix> PHP/4.3.10 
Last -Modified = Tue, 11 Oct 2005 09:58:51 GMT 
ETag = "2498e9-12ac-434b8cdb" 
Accept— Ranges = bytes 
Content-Length = 4780 
Keep-Alive = tine out =15, max=iQQ 
Connection = Keep-flliue 
Content-Type = text/html 



in. 



M3npauiaHe Ha flaHHM no HTTP 

M3npaiuaHeTO Ha ashhh kbm ye6 cbpBtp CTaBa no nonâ„¢ aHa/iorwueH HanwH. 

Pa3n0^araMe C MeTOfll/ITe UploadData(...) V\ UploadFile(...) , KOMTO HM 

no3BO^ABaT fla M3npaTMM o6o6iueHM flaHHM i/i/ii/i nan cpai/i/i no Bpt3KaTa etc 
ctpBtpa. Pa36npa ce, b o6iunfl c/iynaw Tpa6Ba fla i/maMe cbOTBeTHMTe npaBa, 
3a fla ro HanpaBMM. KaK fla yKa>KeM napo/ia v\ noTpe6kiTe/iCKO MMe, 3a fla 
no/iyni/iM Te3M npaBa, me o6achmm cnefl Ma/iKO. 

MeTOfl"bT UploadData( string URI , string method, by te [ ] data) M3npaifla 

MacuB ot 6awTOBe kbm cbpBtpa. YnoTpe6aTa My e noflo6Ha Ha 
DownioadData(...) , ho KaTO BTopn napaMeTbp MOxeM fla yKaxeM (He3afl"b/i- 
>KMTe^Ho) MeTOfla Ha HTTP 3a5iBKaTa. no noflpa36npaHe tom e "post", ho 
MO>KeM fla M3no^3BaMe v\ "get". 

MeTOfltT UploadFile (string URI, string method, string filename) HM 

no3BO/i*iBa upload Ha /ioi<a/ieH cpaw/i (yKa3aH ot filename) Ha cbpBtpa. 1/1 
flBaTa MeTOfla BptiuaT KaTO pe3y/iTaT MacuB ot Tun byte[], b komto ce 
cwvbpwa eBeHTya^eH HTTP OTroBop ot crpaHa Ha ctpBtpa. C/ieflHi/mT npuMep 
fleMOHCTpupa M3no^3BaHeTO mm: 



WebClient wc = 


= new 


WebClient ( ) ; 








string 


data = 


"This is 


the data 


to 


pos 


t"; 


byte[] 


array = 


= Encodin 


g. ASCI I . Ge 


tBytes 


(data) ; 


wc . Upl 


DadData 


(args 


[0], 


array) ; 








wc . Upl 


DadFile 


(args 


[0], 


"file . zip 


") 







C T03M KOfl me M3npaiuaMe ntpBO eflMH hm3, a nocne v\ cpaw/ia "file. zip" 
(komto, pa36i/ipa ce, Tpa6Ba fla cbiuecTByBa) Ha aflpeca, noconeH KaTO 
napaMeTbp Ha KOMaHflHua pefl Ha nporpaMaTa. 

riOfl06HO Ha OpenRead ( ... ) , WebClient npefl/iara M MeTOfl 3a nOTOHHO 

M3npaiuaHe Ha flaHHM kbm ctpBtpa. HeroBaTa curHaTypa e openwrite (string 

URI, string method), OTHOBO C He3afl"b/l>KMTe/ieH BTOpn apryMeHT, M B 

pe3y/iTaT ot M3n"b/iHeHi/ieTO My no/iynaBaMe o6eKT ot Tun stream, npe3 komto 
MO>KeM fla cb3flafleM no-yflo6HMa 3a ynoTpe6a streamwriter. 



414 nporpaMnpaHe 3a .NET Framework (tom 2) 

M3npauiaHe Ha napaMeTpu kt»m HTTP 3anBKa 

MeTOfl"bT UploadValues (string URI, string method, NameValueCollection 

values) e Ma/iKO no-pa3/iwneH ot ropHMTe Tpn. Tom He ce ki3no/i3Ba 3a upload 
KtM ctpBtpa, a c/iy>Ki/i 3a noAaBaHe Ha napaMeTpn Ha o6pa6oTBaiu CKpi/inT, 
CMMy^npaMKM M3npaiuaHeTO mm npe3 HTML cpopMa. Ako MeTOfltT Ha 
M3npaiuaHeTO e "get", Te ce flo6aBflT kbm URI aflpeca bbb cpopMaTa 

?name=value&name=value M T.H.; a aKO MeTOA"bT e "POST", ce M36pOflBaT B 

th/ioto Ha HTTP 3aHBi<aTa. 

npuMeptT, komto me AaAeM, i/i3no/i3Ba noflfltpxaHaTa ot noKanen IIS ctpBtp 
CTpaHnua "testform.aspx", ho no >Ke/iaHkie MO>Ke p,a ce M3no/i3Ba npon3BO- 
nen aflpec, 3a komto ce onaKBa fla o6pa6oTBa pe3y/iTaTki ot cpopMa. KaKTO v\ 
npn upioadData(...) m uploadFile (...) pe3y/iTaTbT ot MeTOfla e pea/iHO HTTP 
OTroBoptT ot CTpaHa Ha ctpBtpa bbb bma Ha byte[] MacuB. Hpe3 Hero MOweM 
Aa pa36epeM KaK e pearwpa/ia nporpaMaTa 3a o6pa6oTKa Ha AaHHMTe, komto 
noAaBaMe. 



string uri = "http : //localhost/testf orm. aspx" ; 

NameValueCollection nvcn = new NameValueCollection ( ) ; 

nvc.Add ( "lastname", "Dijkstra") ; 

nvc . Add ( "f irstname" , "Edsgar") ; 

WebClient wc = new WebClient ( ) ; 

byte [ ] response = wc . UploadValues (uri, nvc); 

Console . WriteLine (Encoding .ASCII . Gets t ring (response) ) 



ABTeHTMKaMMq c Credentials 

HecTO npn Bp"b3Ka c pa3/iwnHn ye6-cbpB"bpi/i ce Ha/iara Aa ce aBTeHTMKupaMe 
npeA tax, 3a Aa no/iyni/iM Heo6xoAMMMTe npaBa 3a M3B/ii/maHe v\ M3npaiuaHe 
Ha pa3/innHM ye6-pecypcn. ToBa motom Aa HanpaBMM, M3no/i3BaMKi/i cbom- 

CTBOTO Credentials Ha K/iaca WebClient. 

Cbomctboto credentials noAAtpwa ctomhoctm ot ABa K/iaca b npocTpaH- 

CTBOTO System. Net - NetworkCredential M CredentialCache. 06eKTMTe OT 

K/iaca NetworkCredential npeACTaBAT eAHa KOM6nHaunfl ot noTpe6nTe^CKO 
HMe m napo/ia (a 3a Windows ctpBtpn - v\ v\we Ha AOMei/iH). TaicbB o6eKT 

MO>KeM Aa C"b3AaAeM C KOHCTpyKTOpa NetworkCredential (string username, 
string password) V\J\V\ npe3 KOHCTpyKTOpa NetworkCredential ( ) M nocnep,- 
BaiUO yCTaHOBflBaHe Ha CBOMCTBaTa UserName V\ Password. ripMCBOflBaMKM Ha 

credentials TaKa cb3AaAeHMfl o6eKT Bene MO>KeM Aa ce CB"bp>KeM etc caMT, 
komto M3MCKBa aBTeHTMKaunfl, HanpwMep npe3 DownioadData(...) . Ako MMeTO 
m napo/iaTa ca BepHM, me no/iynwM pe3y/iTaTa ot HTTP OTroBopa, b npoTMBeH 
cnynai/i me ce npeAM3BMKa ki3K/iK>neHkie: 



WebClient wc = new WebClient ( ) ; 

string uri = "http : //localhost/testlogin" ; 

NetworkCredential nc = new NetworkCredential 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMnpaHe 415 



wc . Credentials = nc; 
try 

{ 

byte [ ] response = wc . DownloadData (uri ) ; 

Console . WriteLine (Encoding .ASCII . Gets t ring (response) ) ; 

} 

catch (WebException exception) 

{ 

Console .WriteLine ( "Try different username/password" ) ; 

} 



OCBeH NetworkCredential, MO>KeM fla M3nO/13BaMe m K/iaca 

credentiaicache. 06eKTMTe ot T03M K/iac cbxpaHABaT 3anncn 3a aflpecu M 

C"bOTBeTHMTe MM 06eKTI/l OT Tkin NetworkCredential. 3anMCM MO>KeM p,a 
A06aBflHe C MeTOAa Add (string URI, string authmode, NetworkCredential 

credential) . npi/i to3m MeTOfl BTopuflT napaMeTbp yi<a3Ba Tuna Ha aBTeH- 
TMKaunfl ("Basic" v\nv\ "Digest" 3a MD5 xeiunpaHe Ha aaHHMTe). 

AKO npklCBOMM Ha CBOMCTBOTO Credentials 06eKT OT Tkina Credentiaicache, 
TO npM BCflKO M3BMKBaHe Ha DownloadData (...) V\J\V\ OCTaHa/lklTe MeTOflM 3a 

Bp"b3Ka etc ctpBtp, .NET npoBep^Ba fla/iw hakom ot 3anncnTe He cbBnafla c 

TtpceHMfl aApec V\ aKO MMa TaiCbB - M3nO/13Ba CbOTBeTHkm NetworkCredential 

o6eKT 3a aBTeHTMKaunfl. 

ApyrM no/ie3HM ceoMCTBa Ha WebClient 

Cbomctboto BaseAddress hm no3BO/i*iBa p,a 3aAaAeM o6iu aflpec 3a bcmukm 
onepauuM, M3BtpujBaHM c webciient. To3M aApec ce Ao6aB*i b Hana/iOTO Ha 
yKa3aHMfl b cbOTBeTHna apryMeHT Ha MeTOflMTe 3a ki3B/ikmaHe v\ M3npaiuaHe Ha 
AShhh aApec. ToBa ce M3no/i3Ba, KoraTO me ce CB"bp3BaMe caMO c ep,v\u v\ 

CbU\V\ CaMT, OT KOMTO HM Tpfl6BaT pa3/lMHHM peCypCM, KOMTO MO>KeM ,qa 
3aAaAeM nO-KpaTKO C OTHOCMTe/ieH ITbT CnpflMO BaseAddress: 



WebClient wc = new WebClient ( ) ; 

wc . BaseAddress = "http://www.devbg.org/"; 

byte [ ] response = wc . DownloadData ( "dotnetbook" ) ; 

Console .WriteLine (Encoding .ASCII . Gets t ring (response) 



flpyro MHTepecHO cbomctbo e Query-string, c KoeTO MO>KeM fla M3B"bpujMM 

HeiUO nOfl06HO Ha MeTOfla UploadValues(...) , l/l3nO/13Bai/iKkl GET. QueryString 

npneMa 3a ctomhoct cbu\o Namevaiuecoiiection ot MMeHa Ha napaMeTpn i/i 
TexHMTe ctomhoctm, komto nocne ce Ao6aBAT b craHAapTHkifl c|3opMaT Ha Kpaa 
Ha noflafleHOTO URI npn BC^Ka 3asiBKa 3a pecypc kbm ye6-cbpB"bp. 



416 nporpaMnpaHe 3a .NET Framework (tom 2) 

HTTP 3a*iBKM c K/iacoBeTe HttpWebRequest m 
HttpWebResponse 

K/iacbT webciient hm npeflocTaBfl ocHOBHaTa cpyHKui/iOHa/iHOcr, koato 
o6kiKHOBeHO e Hy>KHa 3a pa6crra c HTTP npoTOKO/ia. Ako MCKaMe no-cpMH 
kohtpo/i Btpxy 3aaBKMTe hm m MMaMe HaMepeHne fla o6pa6oTBaMe no-rbBKaBO 
pe3y/iTaTa ot OTroBopa, MO>KeM ,qa i/i3no/i3BaMe cneukia/iki3kipaHi/iTe K/iacoBe 

HttpWebRequest M HttpWebResponse. 3a flOCTbn flO /lOKa/lHM pecypCM Ca 
nOflXOflflLflM K/iacOBeTe FileWebRequest M FileWebResponse, HO nOHe>Ke Te 

npeAOCTaBAT ctiuaTa cpyHKui/iOHa/iHOcr ioto Te3M 3a pa6oTa c HTTP, HHMa fla 
vv\ pa3Me>KflaMe cneuna/iHO. 

Ci>3flaBaHe Ha HHTP 3asiBKa 

K/iaCbT HttpWebRequest e HaC/ieflHMK Ha a6crpaKTHklfl K/iaC WebRequest M 3a 

cb3AaBaHeTO My M3no/i3BaMe MeTOfla create (string uri), KaTO nocne 
npeo6pa3yBaMe pe3y/iTaTa ,qo >xe/iaHkifl Tun: 



HttpWebRequest request = 

(HttpWebRequest) WebRequest . Create ( "http : //www. nakov. com" ) 



C/ieA KaTO CMe Cb3fla/iki no to3m Hani/m o6eKTa Ha 3asiBKaTa, MO>KeM fla 
HacTpouM no we/iaHwe HeroBMTe CBOMCTBa. K/iacbT HttpWebRequest npefl/iara 

HD/IAMO KO/lMHeCTBO TaKMBa CBOMCTBa, KOMTO fla yKa>KaT TOUHO OC06eHOCTMTe 

Ha 3aaBKaTa. HanpuMep cbomctboto Method yKa3Ba MeTOfla Ha 3aaBKaTa (get, 

POST, HEAD, PUT V\ flp.); CBOMCTBOTO AllowAutoRedirect yKa3Ba fla/lkl 3aflB- 

KaTa aBTOMaTM^HO fla ce noflafle othobo kbm noconeHi/m aflpec, aKO b OTroBop 
no/iynw yKa3aHne 3a npeHaconBaHe; a CBOMCTBa KaTO Accept, contentType 
v\nv\ userAgent 3aflaBaT ctomhoctm Ha cbOTBeTHMTe 3ar/iaBHH no/ieTa (HTTP 
headers) Ha 3aaBKaTa. Bcmukm headers MO>xeM fla nper^eAaMe npe3 cbom- 

CTBOTO Headers, KOeTO KaKTO npn WebClient MMa 3a CTOMHOCT 06eKT OT TMn 
WebHeaderCollection. M3n0^3BaMKM TOBa CBOMCTBO, MO>KeM M fla C"b3flaBaMe 

hobm 3arflaBHH no/ieTa (ocBeH npe,q/iaraHi/iTe ot K/iaca), KaTO npocTO vv\ flo6a- 

BflMe K"bM KO^eKUMflTa. 

Hpe3 cbomctboto Proxy MO>xeM fla yKa>KeM proxy server, npe3 komto fla 
Mi/maBa HaiuaTa 3a*iBKa. ToBa e no/ie3HO 3a Bp"b3Ka c hakom pecypcn 3afl 
3aiflMTHM CTeHM (firewalls) v\ flp. CTOMHOCTTa Ha TOBa cbomctbo e ot Tun 
webProxy m MO>KeM fla ro 3aflafleM no cneflHkiyi HanwH: 



WebProxy proxy = new WebProxy ( "193 . 95 . 112 . 71 : 8080" ) 
request . Proxy = proxy; 



kl3npauiaHe Ha aaHHM kt>m HTTP cbpBi>p 

flaHHM KtM noconeHMfl b KOHCTpyKTopa v\nv\ b cbomctboto Requesturi aflpec 
MO>KeM fla M3npaiuaMe npe3 MeTOfla GetRequeststreamO . KaTO pe3y/iTaT ot 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 417 

M3BMKBaHeTO My no/iynaBaMe eflMH o6eKT ot K/iaca stream, npe3 komto MO>KeM 
fla noAaBaMe flaHHM, M3no^3BaMKM 3a yao6cTBO m K/iaca streamwriter: 



HttpWebRequest request = (HttpWebRequest) WebRequest . Create 

"http : //localhost/testf orm. aspx" ) ; 
request .Method = "POST"; 
string postData = "f irstname=Edsgar" ; 

request . ContentType="application/x-www-f orm-urlencoded" ; 
request . ContentLength=postData . Length; 
Stream stream = request . GetRequestStream () ; 
StreamWriter sw = new StreamWriter ( stream) ; 
sw. Write (postData) ; 
stream. Close ( ) ; 



06"bpHeTe BHMMaHne, <Ae ce Ha/iara fla CMeHMM MeTOfla Ha request ot get Ha 

POST, 3aiflOTO B npOTMBeH C/iynaM GetRequestStream () Lfle npeflM3BMKa 

M3K^K)4eHne. ToBa e TaKa, noHe>Ke He MO>xeM fla M3npaiuaMe flaHHM c MeTOfla 
get, komto no npuHunn cny>KM 3a M3TeMAHe Ha flaHHM. OcBeH TOBa Tpa6Ba fla 
yKa>KeM KO/iwuecTBOTO Ha MHCpopMaunaTa, kohto M3npaiuaMe, 3aflaBaMKM 

CbOTBeTHaTa CTOMHOCT Ha CBOMCTBOTO ContentLength. 

He 6nBa fla 3a6paBHMe fla 3aTBopnM noTOKa, KoraTO npMK/uonMM c Hero. B 
npoTMBeH cnynai/i noc/ieflBamw M3irb/iHeHMfl Ha HaiuaTa HTTP 3asiBKa me npe- 

flM3BMKBaT M3K/lK>HeHMfl, 3aiflOTO Bp"b3KaTa He e npMK^K)4M/ia. 

no/iynaBaHe Ha HTTP oiroEtop 

no-necTO Hue He MCKaMe fla M3npaiuaMe flaHHM, a npocTO fla M3B/ieneM 
oiroBop Ha 3aaBKa 3a onpefle/ieH ye6-pecypc. 3a ue/ua M3no/i3BaMe MeTOfla 

GetResponse ( ) . TOM Bptlfla 06eKT OT K/iaca HttpWebResponse, KOMTO 

c"bfl"bp>Ka OTroBopa Ha ctpBtpa. 

Ot BceKM HTTP OTroBop o6mkhob6ho hm MHTepecyBaT hako/iko Heiua - Cbfltp- 
>KaHneTO Ha 3ar/iaBHMTe no/ieTa, HTTP CTaTyc KOfla v\ cbfltpwaHMeTO Ha caMna 
OTroBop. 

ritpBOTO MO>KeM fla M3B/ieneM no hako/iko Ha^MHa. 3a no-necro cpeiuaHMTe 
3ar/iaBHM no/ieTa, KaTO HanpuMep Content-Type, Content-Length, 
Content-Encoding MMa cneuMa/iHM CBOMcma Ha K/iaca HttpWebResponse, 

KOMTO MO>KeM fla flOCTbriBaMe, CbOTBeTHO ContentType, ContentLength M T.H. 

Mo>KeM m fla i/i3B/ieneM CTOMHOcrra Ha npoM3BO/iHO 3aMaBHO no/ie (aKO TaKbB 

MMa B OTrOBOpa) npe3 MeTOfla GetResponseHeader (string header). AKO 

MCKaMe HanpaBO bcmukm 3ar/iaBHi/i no/ieTa, MO>KeM fla M3no/i3BaMe v\ no3Ha- 

TOTO CBOMCTBO Headers, KOeTO OTHOBO HM flaBa KO/ieKUMfl OT flBOMKM MMe- 
CTOMHOCT. 

Cbomctboto statuscode hm flaBa MHCpopMauMfl 3a HTTP CTaTyc KOfla Ha 
c"bo6iueHMeTO ot ctpBtpa. KoflOBeTe ca mhoto m pa3/iM4HM, KaTO pa3/iMHHMTe 
mm nopeflHM umcppm o6pa3yBaT CMMCb/ia Ha ua/ioto cbo6iueHMe. Koa 200 
03Ha4aBa ycnewHa 3aaBKa m nocneflBam ottobop, a KOflOBeTe c BMfla 40X ce 



418 nporpaMnpaHe 3a .NET Framework (tom 2) 

i/i3no/i3BaT 3a rpeujKM. rioBene MHCpopMauna MO>Ke fla ce HaMepn b MHTepHeT, 
HanpuMep RFC 2616 ( http://www.w3.org/Protocols/rfc2616/rfc2616- 

SeclQ.html ). StatusCode e OT Tkin HttpStatusCode - M36poeH Tkin, 4MMT0 

ctomhoctm OTroBapyiT Ha pa3/imHHMTe KOAOBe, HanpuMep HttpStatusCode . ok 

(3a KOfl 200) V\S\V\ HttpStatusCode. NotFound (3a KOfl 404). 

CtAtpxaHneTO Ha oiroBopa MO>KeM fla nponeTeM, cb3flaBaMKM iiotok 3a 

neTeHe OT HttpWebResponse npe3 MeTOfla GetResponseStream() . T03M MeTOfl 

othobo hh flaBa o6eKT ot K/iaca stream, komto fla i/i3no/i3BaMe 3a neTeHe 

4pe3 Cb3flaBaHeTO Ha StreamReader: 



string url = "http://www.devbg.org/"; 
HttpWebRequest request = 

(HttpWebRequest ) WebRequest . Create (url ) ; 
HttpWebResponse response = 

(HttpWebResponse) request . GetResponse ( ) ; 
string contentType = response . ContentType; 
Console .WriteLine ( "Content-Type : {0}", contentType); 
Stream stream = response . GetResponseStream () ; 
using (stream) 

{ 

StreamReader sr = new StreamReader ( stream) ; 

string responseBody = sr . ReadToEnd ( ) ; 

Console .WriteLine ( responseBody) ; 
} 



M3B/iMHaHe Ha Cookies 

BepoflTHO BceKM ce e c6/i"bCKBa/i c T.Hap. cookies (6mckbmtkm) - Ma/iKM 
TeKCTOBM cpaw/iOBe Ha /lOKa/iHaTa MaiunHa Ha K/iweHTa, b komto ye6-cbpB"b- 
puTe 3ana3BaT pa3/ikmHa MHCpopMauna 3a K/iweHTa, HanpuMep noTpe6kiTe/iCKO 
MMe, napo/ia, ceckm v\ t.h. .NET Framework hm npefl/iara zieceH Hani/m 3a 
nper/ie>KAaHe Ha cookies, 3anncaHM ot ctpBtpa npn ki3n"b/iHeHwe Ha 
3aaBKaTa. 

ripeflu fla M3BMKaMe MeTOfla GetResponse o , Tpa6Ba fla cb3flafleM eflMH 
npa3eH o6eKT Ha K/iaca cookiecontainer m fla ro npucBOMM Ha cbomctboto 

CookieContainer Ha HailJMfl HttpWebRequest 06eKT. C/iefl l/l3n"b/lHeHkie Ha 

3aaBKaTa bcm^km 3anncaHM cookies ce cbxpaHABaT b cbomctboto cookies Ha 

K/iaca HttpWebResponse B"bB BMfl Ha CookieCollection, KOflTO MO>KeM fla 
o6xoflMM: 



string url = "http://www.amazon.com/"; 
HttpWebRequest request = 

(HttpWebRequest) WebRequest . Create (url ) ; 
request . CookieContainer = new CookieContainer () ; 
HttpWebResponse response = 

(HttpWebResponse) request . GetResponse ( ) ; 
foreach (Cookie ck in response . Cookies ) 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMnpaHe 419 



Console. WriteLine ("{ 0} = {1}", ck.Name, ck. Value); 



} 



M3n"b^HeHneTO Ha to3m koa hm noKa3Ba b TeKCTOB bma KaKBa MHCpopMaui/m ce 
3ana3Ba KaTO cookies Ha ziOKa/iHaTa hm Mawkma: 



C :WlNDOWS\Syste m3 2V md .exe 



HIS IB 



I b b ido s _path_cont in ue -shopping = continue-sho 
4816834-2305542&continue-shopping-post-data= 
ic .gateway .default 
tibid-nain = 430-3044iiO-3828SS3 



Li 



1 



Apyru BMflOBe WebRequest n WebResponse 

K/iaC0BeTe HttpWebRequest, HttpWebResponse M FileWebRequest, 
FileWebResponse ce rpklwaT 3a nOAAP"b>KKaTa Ha npOTOKO/lMTe http://, 

https:// m file://. Ako >xe/iaeM p,a M3B"bpujBaMe 3aaBKM no Apyr npoTOKO/i 
Ha npi/i/io>KHO hmbo (HanpuMep ftp://), MO>KeM p,a cm HanmueM Hac/ieAHi/mw 

Ha a6CTpaKTHMTe K/iacOBe WebRequest M WebResponse V\ Rd pa60TMM C TAX. 3a 

ue/iTa Tpa6Ba p,a noMHMM hako/iko Ba>KHM npaBi/i/ia (HanpuMep p,a He 

Cb3AaBaMe KOHCTpyKTOp, a p,a pa3HklTaMe Ha MeTOAa WebRequest. Create (...) ) 

v\ p,a He 3a6paBAMe p,a CBtpweM hobma K/iac c >Ke/iaHM*i bma npoTOKO/i. ToBa 

CTaBa 4pe3 MeTOAa RegisterPrefix( string prefix, IWebRequestCreate 
create) Ha K/iaca WebRequest. KaTO ntpBM apryMeHT nOAaBaMe MMeHHO 

npecpMKca Ha npoTOKO/ia, c komto me CBtpweM Haujua hob Tun, a ioto btopm 
apryMeHT - Ha npaKTMKa Haujua K/iac, komto p,a pea/iw3wpa MeTOAa create (...) 
(npe3 to3m MeTOA me ce cb3AaBaT o6eKTMTe Ha 3aaBKMTe) v\ p,a MMn/ieMeHTwpa 

MHTepCpeMCa IWebRequestCreate, KOMTO CbA"bp>Ka npOTOTMna Ha T031/I MeTOA- 

Ako Bene MMaMe perncTpupaH 3a to3m npecpMKC K/iac, me no/iynwM M3K/iK>ne- 
Hue. 



Pa6oTa c HTTP 3aHBKM - npuMep 

C^eAHaTa AeMOHcrpauwfl noKa3Ba HaKpaTKO M3no/i3BaHeTO Ha 

HttpWebRequest M HttpWebResponse. C"b3AaBaMe eAHH HttpWebRequest 

o6eKT, nocne M3n"b/iHflBaMe get 3aaBKa c Hero v\ M3Be>KAaMe Ha eKpaHa 
pa3^M4HaTa MHCpopMauna, cbAtpwama ce b no/iyneHi/iyi no to3m HanwH o6eKT 
ot K/iaca HttpWebResponse. 3a Ta3M ue/i : 

1. OTBap^Me VS .NET v\ cb3AaBaMe hobo koh30/iho npw/io>KeHkie. 

2. B"bBe>KAaMe KOAa Ha nporpaMaTa. IHe i/i3no/i3BaMe 3asiBKa kbm cawTa Ha 
Google, ho TOBa, pa36npa ce, Moxe p,a ce npoMeHM ziecHO. C"b3AaBaMe 

K/iac HttpWebRequestWebResponse M 3anMCBaMe B Hero OCHOBHMfl MeTOA 

Ha nporpaMaTa: 



420 



flporpaMnpaHe 3a .NET Framework (tom 2) 



static void Main ( string [ ] args) 

{ 

string url = "http://www.google.com/"; 
HttpWebRequest request = 

(HttpWebRequest ) WebRequest . Create (url ) ; 
HttpWebResponse response = 

(HttpWebResponse) request . GetResponse ( ) ; 

WebHeaderCollection headers = response . Headers; 
Console. WriteLine ( "HTTP headers : \n{ }" , headers); 

string contentType = response . ContentType; 

Console .WriteLine ( "Content-Type : {0}\n", contentType); 

Console .WriteLine ( "Response body: \n" ) ; 
Stream stream = response . GetResponseStream () ; 
using (stream) 



} 



{ 



StreamReader sr = new StreamReader ( stream) 
string responseBody = sr . ReadToEnd ( ) ; 
Console .WriteLine ( responseBody) ; 



3. CrapTwpaMe npi/i/io>Kei-meTO, 3a p,a ki3n"b/iHi/iM 3a*iBKaTa. Pe3y/iTarbT 
H3Me>Kfla no cnep,Hwn Hanm-i: 



C :YW1ND0 WSlSyste m3 2Vc md .exe 



HI-IIQ 



HTTP headers: 

Cache-Control: private 

Content— Type : text/html 

Set-Coohie: PREF=ID=70a594781bab29ef :TM=1131840626 : 

JuU; expires =Sun, 17-Jan-2038 19:14:07 GMT; path=/; 

Seruer: GUS/2.1 

[Transfer— Encoding: chunked 

Date: Sun, 13 Nou 2005 00:10:26 GMT 



Content-Type: text/htnl 

Response body: 

<html><head><meta http-equiu="content-type" content 
h-1 "><t it le >Google</t it le Xsty le >< • — 
body,td,a,p, .h<f ont-f amily:arial, sans-serif ;> 
â– h<font-size: 20px;> 



Li 



Pa6oTa c e/ieKTpoHHa no mi a 



B CBeTa AHeBHO ce o6MeHflT Mki/iwapAH e/ieKTpoHHM nwcMa. HecbMHeHO 
pa3MAHaTa Ha e/ieKTpoHHi/i nucMa e M3K/iionMTe/iHO nony/iapeiH MeTOA 3a 
KOMyHMKaunfl. HeKa pa3r/ieflaMe npoTOKO/ikue, CB"bp3aHM c M3npaiuaHeT0 v\ 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 421 

no/iynaBaHeTO Ha e/ieicrpoHHa noma v\ KaK MO>KeM fla M3npaiuaMe e/ieKTpoHHM 
c"bo6iueHMfl etc CTaHflapTHMTe cpeflCTBa Ha .NET Framework. 

npoTOKOJiM 3a M3TeivmHe Ha e/ieKTpoHHaTa noma 

KoraTO cm cb3fla,qeTe HOBa noiueHCKa kytma, Ha cneu.Ma/ieH KOMniOTbp 3a Bac 
ce cb3flaBa macto, KtfleTO MoraT fla npucTuraT BaiunTe nucMa. Ochobho MMa 
flBa MeTOfla fla npoBepi/ue cbfltpwaHMeTO Ha TOBa xpaHM/iMme Ha e/ieKTpoHHw 
nucMa. ritpBHAT Ha^MH e npe3 ye6 MHTepcpewc, npn komto nucMaTa ca npefl- 
CTaBeHM npefl Bac nofl cpopMaTa Ha ye6 crpaHMua. Btopmat HanMH e npe3 
M3no^3BaHeTO Ha e-mail K/iMeHT KaTO Microsoft Outlook, Pegasus v\nv\ Eudora. 
3a fla MoraT Te3M K/iweHTki fla ocbmecrBflT Bp"b3Ka etc ctpBtpa, Ha komto ce 
na3flT nucMaTa, ce M3no/i3Ba npoTOKO/i-bT Post Office Protocol Bepcua 3 (POP3) 
i/i/ii/i Internet Message Access Protocol (IMAP). 

npOTOKO/TbT POP3 

npoTOKO/ivr POP3 ochobho no3BO/iflBa fla v\3Tevns\Te v\ M3TpnBaTe nucMaTa ot 
noiueHCKMfl ctpBtp. KoHuenunflTa 3a pa6oTa c Hero npeflno/iara, ne K/iMeHTbT 
ctxpaHflBa noiuaTa cm /ioio/iho v\ ot BpeMe Ha BpeMe ce CBtp3Ba etc 
cbpBtpa, M3TeMfl HOBMTe nucMa v\ vv\ M3TpnBa ot TaM. ZloKa/iHO nucMaTa 
MoraT fla ce noflpe>KflaT no nanKM, npuMepHo: Bxoflfliun (Inbox), M3xoflfliun 
(Sent Items) v\ t. h. 

npOTOKOJ11>T IMAP 

rioflxofltT c POP3 ce OKa3Ba Henoflxoflaiu, KoraTO noTpe6i/iTe/i*iT M3no/i3Ba 
hako/iko pa3^M4HM MaujMHM 3a BceKMflHeBHaTa cm pa6oTa m Tpa6Ba fla neTe 
noiuaTa cm ot BCAKa ot tax. HacrbnBa Heo6xoflMMOCTTa noiuaTa, opraHM3M- 
paHa b nanKM, 3aeflHO c aflpecHaTa KHMra fla ce cbxpaHABaT b ueHTpa/iHO 
xpaHM/iMuje, flo KoeTO fla ce no3BO/iflBa OTfla/ieneH flocrbn. 

3a Ta3M u.e/i e cb3fla,qeH m npoTOKO/ivr IMAP. Tom noflfl"bp>Ka nanKM etc 
c"bo6iueHMfl m onepauMM KaTO ,qo6aBflHe Ha cbo6meHMe, npeMecTBaHe Ha 
c"bo6iueHMe, M3TpMBaHe Ha cbo6meHMe. MMa m flpyrM bkbmokhoctm KaTO 
TtpceHe no k/ik>hobm flyMM b nanKMTe Ha cbpBtpa. 

M3Ter/ifiHe Ha e/ieKTpoHHaTa noma c .NET Framework 

B .NET He e MMn/ieMeHTMpaHO M3Ter/iHHeTO Ha noiuaTa hmto c npoTOKO/ia 
POP3, hmto c IMAP. Ako >Ke/iaeM fla cb3flafleM npM/io>KeHMe, KoeTO M3Ter/ia 
noma, Tpa6Ba caMM fla cm MMn/ieMeHTMpaMe pa6oTaTa no hakom ot Te3M 

npOTOKO^M. 

M3npau4aHe Ha e/ieKTpoHHa noma 

3a flocTaBKaTa Ha e/ieKTpoHHOTO nMCMO ao no/iynaTe/i*i ce M3no/i3Ba Mpe>xa ot 
KOMnKDTpM, komto MoraT fla npenpaiuaT cbo6meHMflTa, flOKaTO Te flocTMTHaT ao 
KpaMHaTa cm ue/i. Te3M KOMnKrrpM cm KOMyHMKMpaT nocpeflCTBOM npoTOKO/ia 
SMTP - Simple Mail Transfer Protocol m ce HapM^aT SMTP ctpBtpM. 3a fla 



422 



flporpaMnpaHe 3a .NET Framework (tom 2) 



ocbiuecTBMM Bp"b3Ka c HflKOM SMTP CbpBtp, e Hy>KHO fla M3no^3BaMe npoTO- 
KO/ia SMTP. M3npaiuaMKM nucMO flo komto m fla e SMTP CbpBtp, CMe curypHM, 
ne TOBa nucMO me flocTurHe ao no/iynaTe/ia, 3aiuoTO SMTP ctpBtpa i/ma 3a 
ue/i fla ycTaHOBM touho Ktfle e no/iynaTe/isu v\ fla ro M3npaTM M36npaMKM 
onTMMa/ieH irbT. Ho kom SMTP CbpBtp fla i/i3no/i3BaMe? HaM-flo6pnflT BapnaHT 
e fla M3no/i3BaMe SMTP ctpBtpa Ha flocraBni/iKa, npeflocraBflm hm flocrbn ao 
MHTepHeT. 




POP3 

CtpBtp 



SMTP 

CbpBfep 




M3npaman Ha e-mail 



nonyHaTen Ha e-mail 



kl3npaii4aHe Ha e/ieKTpoHa noma c .NET Framework 

3a M3npaiuaHe Ha e/ieicrpoHHO c"bo6iueHne me M3no/i3BaMe K/iaca system. 

Web . SmtpMail . 

Haii-/iecHiinT HanMH aa M3npaTMM e/ieKTpoHHO nucMO 

Ako MCKaMe fla M3npaTMM npocri/mKO e/ieicrpoHHO nwcMO c noMOLirra Ha .NET, 
MO>KeM fla ro HanpaBMM c MMHMMyM ycv\nv\n. Hy>KHO e caMO fla 3aflafleM SMTP 

CbpBtp, K"bM KOMTO fla M3npaTMM nMCMOTO. TOBa Lfle HanpaBMM, M3nO/13BaMKM 

CTaTM4HOTO no/ie smtpserver Ha K/iaca SmtpMail. CtiflMHCKOTO M3npaiuaHe 
Ha c"bo6iueHneTO CTaBa npe3 craTMUHMfl MeTOfl send(...) Ha cbiuna K/iac. 
MeTOfltT npneMa neTkipi/i napaMerbpa, cbOTBeTHo: aflpec Ha noflaTe/ia, aflpec 
Ha no/iynaTe/ia, no/ieTO "othocho" (subject) v\ TeKcra Ha cbo6meHi/ieTO. 
B"b3HMKBa BtnpocbT fla/iw KoraTO B"bBe>KflaMe aflpeca Ha noflaTe/ifl, e 
B"b3MO>KHO fla BtBefleM BceKM e^eKTpoHeH aflpec, komto >xe/iaeM? Ako MO>xeM, 
HMiflo HflMa fla hm npeni/i fla M3npaiuaMe e/ieKTpoHHM nucMa ot MMeTO Ha 
ctcefla, wecpa v\nv\ flopn npe3MfleHTa. B KpaMHa CMeTKa ce OKa3Ba, ne SMTP 
npoTOKO/i"bT HflMa Ha^MH fla npoBepn fla/iw CMe BtBe/iw cboa e/ieKTpoHeH 
aflpec v\nv\ He. MoweM fla BtBefleM nonâ„¢ npoi/i3BO/ieH aflpec Ha noflaTe/i. 
Hakom SMTP ctpBtpn He no3BO/isiBaT M3npaiuaHeTO Ha e/ieKTpoHHM nucMa ot 
HecbiuecTByBaifl flOMeMH v\ TOBa 6m npeflki3BMKa.no ki3K/iK>neHkie npn 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 423 

M3n"b^HeHne Ha MeTOfla 3a M3npaiuaHe. flpyrn SMTP ctpBtpn 6nxa npoMeHki/iw 
aflpeca, TaKa ne M3npaiuaHeTO fla CTaHe ot cbiuecTByBaiu AOMefiH. 

Ka3aHOTO flOTyK MOKeM fla MjnocTpwpaMe etc cjieflHMfl npMMep : 



string from = "ivan@somemail.bg"; 
string to = "draganka@somemail.net"; 
string subject = "Cool Subject"; 
string body = "This is the message body"; 
SmtpMail . SmtpServer = "smtp.MyISP.com"; 
SmtpMail . Send ( from, to, subject, body); 



Oco6eHOTO b cnynaa e, ne aKO M3npaiuaHeT0 Ha cbo6meHneTO He e ycneujHO, 

LUe Ce npeAM3BMKa System. Web . HttpException kl3K/lK>neHI/ie. 

OopMaT Ha e/ieKTpoHHMTe C"bo6meHna 

Bcako e/ieKTpoHHO nucMO e b TeKCTOB cpopMaT v\ cbAtpwa 3ar^aBHa nacr v\ 
th/io. B 3ar/iaBHaTa nacr ce cbAtpwa cny>Ke6Ha MHCpopMauna, a b ta/ioto ce 
cbA"bp>Ka TeKCTtT Ha cbo6iueHneTO. 3ar/iaBHaTa nacr ce cbCTOM ot MHO>KecTBO 
no/ieTa, npeAOcraBflmw MHCpopMauna 3a nucMOTO (Hapi/maHM cbu\o xeAtpn 
v\nv\ headers). Te3M no/ieTa ca TeKCTOBM 3anncn bbb bma k/iioh: ctomhoct. 
Eto hako/iko npuMepHM 3ar/iaBHH no/ieTa: 



Return-Path: <doctora@ 


gmail . 


com> 




From: <doctora@gmail . com> 








To: <kolio@kolev. net> 










Subject: proba 










Date: Sat, 29 Oct 2005 


15: 


37 


:51 


+ 0300 



Hakom ot 3ar/iaBHkiTe no/ieTa ce Ao6aBAT npn cbcraBAHe Ha nucMOTO. TaKMBa 
ca 3aMaBHMTe no/ieTa, o6o3HanaBamn no/iynaTe/ifl, ki3npamana, cocpTyepa 
M3no/i3BaH 3a cbcraBAHe Ha nucMOTO v\ AP- A MMa hakom no/ieTa, komto ce 
Ao6aBAT AOirb/iHkiTe/iHO. ritTa Ha eAHO nucMO MO>Ke p,a Mi/me npe3 hako/iko 
pa3^M4HM SMTP ctpBtpa v\ BceKM ctpBtp Ao6aB*i no eAHO 3ar/iaBHO no/ie b 
nucMOTO, o6o3Ha4aBaiuo, ne nucMOTO e Mkma/io npe3 to3m ctpBtp. 3apaAn 
TOBa MO>Ke Aa sv\p,v\je b 3ar/iaBHaTa nacr Ha HsiKoe nucMO hako/iko 3ar/iaBHH 
6/iOKa - TOBa ca no/ieTaTa c k/ikdh Received. 



Received: from cyclone.host.bg (cyclone.host.bg 
[217.160.253.243] ) 

by beeblebrox.host.bg (8.13.1/8.12.11) with ESMTP id 
j9TCbulS025094 

for <doktora@kolev.com>; Sat, 29 Oct 2005 15:37:57 +0300 
Received: from nproxy.gmail.com (nproxy.gmail.com 
[64.233.182.202] ) 

by cyclone.host.bg (Postfix) with ESMTP id C5B741939B4 

for <doktora@kolev.com>; Sat, 29 Oct 2005 15:40:43 +0300 
(EEST) 
Received: by nproxy.gmail.com with SMTP id x4so204908nfb 



424 



flporpaMnpaHe 3a .NET Framework (tom 2) 



for <doktora@kolev.com>; Sat, 29 Oct 2005 05:37:54 -0700 



;pdt) 



KaKTO BMflflXMe no-rope, MO>Ke fla M3npaTMM nucMO c M3npaman BceKM Ba/iM- 
AeH e^eKTpoHeH a,qpec. E/iaroflapeHMe Ha Te3M 3ar/iaBHM nacm, noKa3Baiun 
ntTfl Ha nucMOTO, b noBeneTO cnynaM MO>KeM fla npeueHMM fla/iM flafleHO 
nucMO e M3npaTeHO ot aflpeca, komto e HanncaH ioto M3npaman, v\nv\ ot 
hhkom 3/iOHaMepeH xaKep. 

Multipurpose Internet Mail Extension (MIME) 

KaKTO Ka3axMe no-rope, eflHO e/ieKTpoHHO nucMO e M3rpafleHO caMO ot TeKCT. 
3aTOBa e Heo6xoflMMO fla MO>KeM fla npeo6pa3yBaMe npuKa^eHMTe cpai/i/iOBe ao 
TeKCT m cbOTBeTHO no.nynaTe.rmT fla Moxe fla npeo6pa3yBa TeKCTa ao abomhhm 
cpaM/iOBe, 6e3 fla MMa 3ary6n. 3a Te3M ue/iM e cb3flafleHO pa3UJnpeHneTO 
Multipurpose Internet Mail Extension (MIME). 

MIME e craHflapTeH cpopMaT 3a cbo6meHMfl. l/l3no/i3Ba ce b pa3/iMHHM cmrreMi/i 
3a o6MAHa Ha cbo6meHMfl v\ b nacmocT npn e/ieKTpoHHaTa noma. 



From; 
To; 

Date: 
Subject: 



MIME Header 



MIME-Version: 
Content-Type: 



Message Body 



MIME Body 



MIME flo6aBfl 5 hobm 3ar/iaBHki no/ieTa b Kpaa Ha 3ar/iaBHaTa Hacr Ha 
e/ieKTpoHHOTO nucMO m BceKM npuKa^eH cpaw/i (npeo6pa3yBaH ao TeKCT) ce 
flo6aBfl b Kpaa Ha nucMOTO. 

EflMH MIME flOKyMeHT ce CbCTOM ot CbBKynHOCT ot cpai/i/iOBe (flOKyMeHTu), 
BceKM, ot komto e KOflnpaH KaTO TeKCT (HanpuMep npe3 KOflnpaHe BASE64) v\ 
MMa 3aflafleH Tun (Content-Type) v\ cbfltpwaHMe. TunoBeTe b MIME craHflapTa 
MoraT fla 6"bflaT HaM-pa3/iMHHM: PDF flOKyMeHTM, ZIP apxuBM, HTML CTpaHnun, 

KapTMHKM, My3MKa M T.H. 3a BCeKM TMn CM MMa yHMKa/ieH MfleHTMCpMKaTOp. 



T/iaBa 18. MpewoBO v\ Mi-rrepHeT nporpaMkipaine 425 



MIME - npMMep 



me flafleH eflMH npuMep 3a e/ieicrpoHHO nucMO, KoeTO e M3rpafleHO npe3 MIME 
CTaHAapTa. To cbfltpwa 3 AOKyMeHTa: nucMOTO b TeKCTOB cpopMaT, nucMOTO b 
HTML cpopMaT v\ cpai/i/i, komto e npuKpeneH kbm nucMOTO (attachment): 



From: "Svetlin Nakov" <nakov@nospam. somewhere . org> 

To: "Mincho Penchev <mincho@mail . penchev. org>" 

Subject: Hello, Mincho 

Date: Sun, 16 Jul 2005 11:45:25 +0300 

MIME -Version : 1.0 

Content-Type: multipart/mixed; 

boundary=" =_NextPart_0 0_0 03_01C6A8CD . 53FD2 9 60" 

X-Priority: 3 

X-MSMail-Priority: Normal 

X-MimeOLE: Produced By Microsoft MimeOLE V6 . 00 . 3790 . 2663 

This is a multi-part message in MIME format. 

=_NextPart_000_0003_01C6A8CD.53FD2960 

Content-Type : multipart/alternative; 

boundary=" =_NextPart_0 01_0 04_01C6A8CD . 53FD2 9 60" 

=_NextPart_001_0004_01C6A8CD.53FD2960 

Content-Type: text/plain; 
charset="windows-12 51" 
Content-Transfer-Encoding: 8bit 

3flpaBew, Mhhio! 

IlMiue tm CBeTJiMH HaKOB . I!o3flpaBM ot Co$Mfl. McKaM fla Te noKaHH Ha 
eflMH ceMMHap 3a MT cneunajiMCTM . Bwk npmioaceHaTa noKaHa. 

Svetlin Nakov 

National Academy for Software Development 

academy . devbg . org 

=_NextPart_001_0004_01C6A8CD.53FD2960 

Content-Type: text/html; 
charset="windows-12 51" 
Content-Transfer-Encoding: 8bit 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 

<htmlxhead> 

<meta http-equiv="Content-Type" content="text/html; 

charset="windows-12 51"x/head> 

<body> 

<p><font f ace="Arial">3flpaBeii, Mmhio ! <br><br> 

nwiue tm CBeTJiMH HaKOB. no3flpaBM ot Co$Mfl. McKaM fla Te noKaHH Ha 

eflMH ceMMHap 3a MT cneuMajiMCTM . Bwk npMJioaceHaTa noKaHa . <br><br> 

<font color="#000080"Xb>Svetlin Nakov</bx/f ont><br> 



426 flporpaMnpaHe 3a .NET Framework (tom 2) 



<font size="2"Xfont color="#000080">National Academy for 

Software Development^/ f ont><br> 

<a href="http : //academy. devbg . org/ "> 

academy, devbg . org</a></f ontx/f ontx/p> 

</body></html> 



=_NextPart_001_0004_01C6A8CD.53FD2960 — 

=_NextPart_000_0003_01C6A8CD.53FD2960 

Content-Type : application/msword; 

name=" BARS -seminar- 2 6- July-2 05-pokana .doc" 
Content-Transfer-Encoding : base 64 
Content-Disposition : attachment; 

f ilename=" BARS -seminar- 2 6- July-2 05-pokana .doc" 

0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAACAAAAf 
gAAAAAAAAAA 



AAsAAAAAAAAAHhAAAAEAAAA4AAAARGF0YWJhc2UgUHJvZ3JhbWlpbmcgQmVzdCBQc 

mFjdGljZXMg 

LSBUZWNobml j YWwgU2VtaW5hcgAMEAAAAgAAAB4AAAAGAAAA 



-= NextPart 000 0003 01C6A8CD . 53FD2960- 



CbcraBflHe Ha esieKTpoHHO nncMo 

Bene BMA^xMe iok mokcm ziecHO fla M3npaTMM e/ieicrpoHHO nucMO, ho to3m 
Ha^MH 3a pa6oTa He hm npeflocraBH mhoto bbsmokhoctm. Cera me ce 3ano3- 

HaeM C K/iaca Sy s tern. Web. Mail. Mai lMes sage. T03M K/iac HM n03BO/lflBa fla 

cb3flafleM c"bo6iueHne, M3no^3BaMKM noBene b"B3mo>khoctm ot noKa3aHOTO no- 
rope. 

Mo>xeM fla M3no/i3BaMe no/ieTaTa From, To, subject v\ Body, 3a cb3flaBaHe Ha 
nucMO, aHa/iorwnHO Ha nucMOTO, i/i3npaTeHO no ziecHkifl Hani/m. 

MHTepecHO e, ne c noMOiflTa Ha to3m K/iac MO>KeM fla npoMeHMM npnopnTeTa 
Ha nucMOTO v\nv\ fla yKa>KeM cxeMaTa Ha KOflnpaHe. Ctiuo TaKa MO>KeM fla 
yKa>KeM fla/iw nucMOTO e b HTML v\nv\ b TeKCTOB cpopMaT. Ako M3npaiuaMe 
nucMa b HTML cpopMaT, noBeneTO K/iweHTki me MoraT fla vv\ BM3ya/iM3kipaT, ho 
Tpa6Ba fla 3HaeM, ne MMa v\ K/ii/ieHTM, komto HHMaT TaKaBa b"B3mo>khoct. 



MailMessage message = new MailMessage () ; 

message. From = "doktor_ivanov@somemail.com"; 

message. To = "kaka_tonka@mail.bg"; 

message . Sub j ect = "Zdrasti!"; 

message . BodyFormat = MailFormat . Html; 

message. Body = @"<html><bodyXhl>Sreshtata dovechera se 

"otmenia . </hlx/body></html>" ; 
SmtpMail . SmtpServer = "mail.interbgc.com"; 
SmtpMail . Send (message) ; 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 427 



npMKaneHM cpaftsioBe 



3a fla M3npaTMM npm<aneH cpai/i/i b .NET Framework, MO>KeM fla ki3no/i3BaMe 

K/iaca System. Web. Mail. MailAttachment. B KOHCTpyKTOpa Ha K/iaca yKa3- 

BaMe >xe/iaHi/m <\>av\n v\ ro CB"bp3BaMe c nucMOTO no cnep,Hwn HanwH: 



MailMessage message = new MailMessage () ; 
message . From = "didi@kaval.com"; 
message. To = "bobby@duduk.net"; 
message . Sub j ect = "Hi, Bobby!"; 
message. Body = "Here's my picture! !"; 
MailAttachment attachment = new 

MailAttachment ( @"c : \ images \ logo . gif " ) ; 
message .Attachments .Add (attachment) ; 
SmtpMail . Send (message) ; 



ABTeHTMxauiMfl npeA SMTP cbpBi>p 

C HapacTBaHeTO Ha Hewe/iaHaTa noma (spam), ce 0Ka3a, ne mhoto SMTP 
ctpBtpn ce M3no^3BaT 3a M3npaiuaHe Ha He>xe/iaHa noma. Ha/io>Kki ce SMTP 
ctpBtpnTe fla npefl/iaraT ycnyrkue cm caMO Ha flOKa3a/ii/i caMO/ikmHOora cm 
noTpe6kiTe/in. ToBa o6mkhob6ho CTaBa npe3 noTpe6wTe/iCKO MMe v\ napo/ia. B 
.NET Framework 1.0 H^Ma noflflp"b>KKa Ha TaicbB bma aBTeHTHKauna. BtB 
Bepcufl 1.1, MaKap v\ no Ma/iKO CTpaHeH HanwH, Bene e BtBefleHO aBTeHTMKM- 
paHeTO npefl SMTP cbpBtpa. l/l3no/i3Ba ce k/i a cvr MailMessage: 



MailMessage message = new MailMessage () ; 

message . Fields .Add ( "http : //schemas .microsoft . com/cdo/conf iguratio 

n/"+ "smtpauthenticate" , 1); 
message . Fields .Add ( "http : //schemas .microsoft . com/cdo/conf iguratio 

n"+ "/sendusername" , "doktora"); 
message . Fields .Add ( "http : //schemas .microsoft . com/cdo/conf iguratio 

n/"+ "sendpassword", "1234567"); 



B n^KDCTpupaHMfl npwMep flo6aBAMe Tpn 3annca. ntpBMHT 3annc yi<a3Ba Hanw- 
Ha, M3no^3BaH 3a aBTeHTHKauna. Btopmat 3annc yKa3Ba noTpe6kiTe/iCKOTO 
MMe (b hakom cnynaw to cbBnafla c e/ieKTpoHHkifl aflpec) - b cnynayi noTpe6n- 
Te/iCKOTO MMe e "doktora". TpeTi/mT 3annc 3a,qaBa napo/iaTa, b c/iynasi TOBa e 
"1234567". 

TpeujKaTa "Could not access CDO Object" 

KaKTO cnoMeHaxMe no-rope, aKO M3npaiuaHeT0 Ha noiuaTa e HeB"b3M0>KH0 
nopaflu HAKaKBa npwnwHa, me 6"bfle npeflM3BMKaH0 M3K/iK>neHMe ot Tun 
system. web. HttpException. Mhoto 3a6/iy>KflaBaLuo e, KoraTO pa3r/ie>KflaMe 

kl3K/lK>neHkieT0 M B nO/ieTO Message e M3nMCaH0 "Could not access CDO 

object". no-HanwHaem nporpaMMCT 6m Morb/i fla ce 3a6/iyflw, ne TOBa e 
rpeujKaTa, KoeTO He e bapho. Mctmhckoto c"bo6iueHne MO>xeM fla M3B/ieneM no 
c^eflHMfl HanwH: 



428 flporpaMnpaHe 3a .NET Framework (tom 2) 



try 

{ 

SmtpMail . Send (message) ; 

} 

catch (System. Web . HttpException ex) 

{ 

Console .WriteLine ( "Unable to send message: {0}", 
ex. InnerException . InnerException . Message) ; 

} 



Bki>KAaTe, ne npo6/ieMMTe c K/iaca MaiiMessage ca mhoto, ho flOKaTO Microsoft 
He flo6aBAT mctmhckm K/iac 3a npaiuaHe Ha e-mail, hm ocTaBaT B"b3MO>KHOCTMTe 
fla HanniueM caMM SMTP K/iac, fla cm HaMepuM TaKbB ot TpeTM flocraBUMUM 
mjim fla ce npuMnpuM c Heyflo6cTBaTa Ha K/iaca MaiiMessage. 

Ynpa>KHeHM5i 

1. OnuiueTe 7-Te c/ioa ot OSI MpexoBna MOfle/i. 

2. 06flCHeTe noHflTMATa: IP aflpec, DNS, nopT, Mpe>KOB MHTepcpewc, TCP, UDP 
m coKeT Bp"b3Ka. KaKBa e pa3/iMKaTa Me>Kfly npoTOKO/iMTe TCP v\ UDP? 

3. OnuiueTe ocHOBHMTe Mpe>KOBM ycnyrM b MHTepHeT, KaKBM npoTOKO/iM 
M3no^3BaT m kom TCP nopTOBe. 

4. Pea^M3npaMTe Windows Forms npi/i/io>KeHi/ie, Hanoflo6flBaiuo no cpyH- 
KunoHa/iHOCT MHCTpyMeHTa telnet. ripn^OKeHneTO Tpa6Ba fla noflfltpxa 
CB"bp3BaHe ki>m OTfla/ieneH TCP ctpBtp, M3npaiuaHe v\ npneMaHe Ha flaHHM 
m npeKtCBaHe Ha ycraHOBeHa coKeT Bp"b3Ka. M3no/i3BaMTe hmujkm, 3a fla 
HanpaBMTe Bt3MO>KHO eflHOBpeMeHHOTO M3npaiuaHe v\ no/iynaBaHe Ha 

flaHHM. 

5. Pea/i M3ki pa MTe MHoronoTpe6nTe^CKM ctpBtp 3a pa3roBopn (chat server). 
CtpBtptT Tpa6Ba fla pa6oTM no npoTOKO/i TCP v\ fla no3BO/iflBa perncTpn- 
paHe Ha noTpe6kiTe/iw v\ M3npaiuaHe Ha cbo6iueHMfl Me>Kfly noTpe6MTe/iMTe. 
YntTBaHe: Pea^M3npaMTe 2 KOMaHflM: user <username> v\ send 

<username> <message>. Pa60TeTe C TeKCTOBM nOTOUM. HanpaBeTe BCflKa 

KOMaHfla fla e touho eflMH TeKCTOB pefl v\ cbpBtpvr fla Bptiua npn BCsiKa 
KOMaHfla 1 TeKCTOB pefl OTroBop (ok mjim err). 3a BceKM noTpe6MTe/i 
M3nO/13BaMTe 2 TCP Bp"b3KM (m 2 hmujkm, komto fla tm o6cjiy>KBaT) - eflHaTa 
3a npMeMaHe Ha KOMaHflM, a flpyraTa 3a M3npaiuaHe Ha cbo6iueHMfl. 
C"bo6iueHMATa, komto He ca M3npaTeHM, cbxpaH^BaMTe b 6jiOKMpama o6ma 
onaujKa (shared queue) . 

6. PeajiM3MpaMTe Windows Forms KJiMeHT 3a ctpBtpa 3a pa3roBopM (chat 
server) ot npeflHaTa 3a,qana. 

7. fla ce peajiM3MpaT UDP BepcMM Ha chat ctpBtpa m KJiMeHTa 3a Hero: 
BMecTO no TCP Bp"b3KM bcm4km KOMaHflM m cbo6ifleHMfl Tp*i6Ba fla ce npa- 
iuaT npe3 UDP naKeTM. 



T/iaBa 18. MpewoBO v\ MHTepHeT nporpaMkipaine 429 

8. HanniueTe Windows Forms npw/io>KeHkie, KoeTO ki3n"b/iH$iBa DNS 3aaBKM 
(npeo6pa3yBa ot MMe Ha Mawkma kbm IP aflpec v\ o6paTHOTo). 

9. fl,a ce pea/iki3kipa npw/io>KeHkie, KoeTO ki3B/ikma r/iaBHaTa crpaHkiua ot 
caMTa http://www.devbq.org/ i/i OTnenaTBa bcmukm npenpaTKM 
(hyperlinks). 3a n3B/iwnaHe Ha npenpaTKi/ue M3no^3BaMTe noAxoA^m 
pery/iapeH M3pa3. 

lO.fla ce Hanniue na^K (Web spider) 3a cb6wpaHe Ha e-mail aApecn. naaKvr 
pa6oTM TaKa: 3anonBa ot p,ap,eu URI aflpec b MHTepHeT v\ w3B/inna 
ctAtpxaHneTO My. Hpe3 noflxoflaiun pery/iflpHM M3pa3M ki3B/iwna ot Hero 
BCM4KM e-mail aApecu v\ bcmukm npenpaTKM (hyperlinks). ripenpaTKMTe 
KaH0HM3npa (npaBM vv\ Ha URI aflpecu) v\ nocraBfl b onawKa. floKaTO He 
6tAe cnp^H, naaicbT o6pa6oTBa no Cbiuna Hani/m nopeAHkia URL aApec ot 
onaujKaTa. Pa3Mep"bT Ha onaujKaTa p,a ce orpaHi/mi/i ao 50 000. 3a no- 
ro/iflMO 6"bp30AeMCTBne p,a ce pa6oTM c 10 hmujkm eAHOBpeMeHHO. 3a 
M3B/ikmaHe Ha AaAeH URI aApec M3no^3BaMTe K/iaca WebClient. 3a 
KOM6kiHi/ipaHe Ha a6co/iK>TeH v\ pe/iaTi/meH URI i/i3no/i3BaMTe KOHCTpyKTopa 
Ha Uri K/iaca. 

ll.fla ce ctCTaBM nporpaMa, koato M3npaiua AaAeHO e-mail cto6iueHne 
(3anncaHO b TeKCTOB cpaw^) Ha cnwcbK ot no/iynaTe/iw (3aAaAeHM npe3 
TeKCTOB <\>av\n). SMTP ctpBtptT m noAaTe/iflT Ha e-mail cbo6meHneTO 
Tpa6Ba as ce 3aAaBaT ot KOHCpurypaunoHHua cpaw/i Ha npM/io>KeHMeTO. 

12.fla ce pea/iM3wpa npi/i/iOKeHwe, KoeTO ctom b "task bar" o6/iacn"a v\ 
M3npaiua Ha BceKM 10 MMHyTM npeABapi/iTe/iHO 3aAaAeH cpaw/i Ha 
npeABapnTe^HO 3aAaAeH e-mail aApec. 

M3no/i3BaHa /liuepaTypa 

1. MBaki/io Xpmctob, MpewoBO v\ MHTepHeT nporpaMkipaHe - http://www. 
nakov.com/dotnet/lectures/Lectu re- 17-Internet-Access-vl.O.ppt 

2. CBeT/ikiH HaKOB, MHTepHeT nporpaMnpaHe c Java, Faber, 2004, ISBN 954- 
775-305-3 - http://www.nakov.com/books/inetiava/ 

3. Richard Blum, C# Network Programming, Sybex, 2003, ISBN 0782141765 

4. MSDN Training, Programming with the Microsoft® .NET Framework (MOC 
2349B), Module 11: Internet Access 

5. OSI model - Wikipedia, the free encyclopedia - http://en.wikipedia.org/ 
wiki/OSI model 



Eth 



HPC 



% % L nO PH3PHEQ TUB HB CO (Ty£P 



fr^ 



HAMMOHA/1HA AKAflEMIIfl no PA3PAEOTKA HA COOTYEP 



JleKTopiiTe 

» CBeTflHH HaKOB e 

aBTop Ha fleceTKM TexHi/mecKi/i 

ny6/lMKai4MM M HflKO/lKO KHMTM, 

CBtp3aHM c pa3pa6oTKaTa Ha 
cocfrryep, 3apaflM KoeTO e Tbp- 

CeH rieKTOp l/l KOHCy/lTaHT. 

Tom e pa3pa60TMMK c flt/iroro- 
fluiueH onMT, pa6oTnri no pa3- 
HOo6pa3HM npoeKTM, pea/in3M- 

paHM C pa3/lMMHM TeXHO/10n/|l/l 

(.NET, Java, Oracle, PKI m pp.) 
m npenoflaBaTeri no cbBpeMeH- 
hm cocf)TyepHM TexHO^oruM b CY 

"CB. KjlMMeHT OxpMflCKM". 

npe3 2004 r. e HOCMTe/i Ha 
HarpaaaTa "fliKOH ATaHacoB" 
Ha npe3MfleHTa Ha Et/irapi/ia 
Teopru ritpBaHOB. 

CBeT/iMH HaKOB ptKOBOflu o6y- 
MeHneTO no Java TexHO/iornn b 
AKaaeMMflTa. 

» MaprHH KynoB e 

cocfrryepeH MHweHep n kohcv/i- 
TaHT c flt/iroroflniueH onuT b 
M3rpa>KflaHeTO Ha peweHi/isi c 
n/ia-rrJpopMi/iTe Ha Microsoft. 

MapTMH e onuTeH MHCrpyKTop m 
cepTM0MunpaH ot MaMKpoco0T 
pa3pa6oTMMK no nporpaMi/ue 
MCSD, MCSD.NET, MCPD m 
MVP m MexflyHapofleH /leicrop b 
CBeTOBHaTa opraHki3aui/i5i Ha 
.NET noTpe6nTe^CKMTe rpynw 
IN ETA. 

MapTMH KynoB ptKOBOflki o6y- 
HeHkieTO no .NET TexHO/iorm/i b 
AKafleMMsua. 



AKafleMMATa 

» Hai4MOHa/iHa aKaAeMim no pa3pa- 
6oTKa Ha cocpTyep (HAPC) e ueHTbp 
3a npo0ecnoHa/iHO o6yHeHi/ie Ha co0- 
TyepHM cneui/ia/ii/icn/i. 

» HAPC npoBewfla BE3n/lATHO Kyp- 
coBe no pa3pa6oTKa Ha co0Tyep 1/1 CbB- 
peMeHHM co0TyepHM TexHO/iornn b Co- 
0i/ia 1/1 flpyrn rpaflOBe. 

» npefl/iaraHM cneu,i/ia/iHOCTi/i: 

â–  BiaBeAeHMe b nporparmpaHeTO 
(c e3Mu,MTe C# m Java) 

â–  Core .NET Developer 

â–  Core Java Developer 

» KanecTBeHO o6yneHiie c mhoto 

npaKTMHecKM npoeKTM 1/1 i/mfli/iBi/ifly- 
a/iHO BHMMaHne 3a BceKi/i. 

» TapaHTMpaHa pa6oTa! TpyaoB ao- 
roBop npi/i nocTbnBaHe b AKafleMi/iflTa. 

» EE3n/1ATHO! 

Ym/iTe 6e3njiaTHO BtB BtBefli/iTe/iHi/iTe 
KypcoBe m no cn/ineHfli/ii/i ot pa6oTOfla- 
Te/iMTe b c/ieflBam,MTe Hi/ma. 



http://academy.devbg.org 



T/iaea 19. OTpawemie Ha 
TiinoeeTe (Reflection) 



ABTOp 

flMMMTtp KaHeB 

He06X0flMMM 3HaHMfl 

- 5a30BM no3HaHM5q 3a .NET Framework v\ Common Language Runtime 
(CLR) 

- 5a30BM no3HaHMfl 3a e3MKa C# 

- Ba30BM no3HaHM5q 3a MSIL 

ClafllapMOHMe 

- KaKBO e Global Assembly Cache? 

- KaKBO e Reflection? 

- 3ape>KflaHe Ha aceM6/iMTa 

- M3B^M4aHe MHCJDopMaukifl 3a aceM6/iw 

- npeMaxBaHe Ha aceM6/iMTa ot naMeTTa 

- M3ynaBaHe n/ieHOBeTe Ha Tun 

- M3B/ii/maHe Ha MeTOAM h napaMeTpnTe mm 

- M3B/innaHe Ha napaMeTpnTe Ha MeTOA 

- flMHaMM4HO M3BMKBaHe Ha MeTOAM 

- Reflection Emit 

B Ta3M TeMa ... 

B HacToaiuaTa TeMa me npeAcraBMM noHATneTO Global Assembly Cache (GAC) 
m OTpaxeHne Ha TunoBeTe (reflection). IHe ce 3ano3HaeM c HanwHMTe 3a 
3ape>KAaHe Ha aceM6/iw. IHe noKaxeM KaK MOxeM p,a M3B/ieneM MHCJDopMaunfl 
3a TunoBeTe b AaAeHO aceM6/iw v\ 3a n/ieHOBeTe b AaAeH Tun. IHe pa3r/ieAaMe 
Ha^MHM 3a AHHaMMUHO M3BMKBaHe Ha n/ieHOBe ot AaAeH Tun. IHe pa36epeM 
KaK MOxeM Aa cb3AaAeM eAHO aceM6/iw, p,a AecJDMHupaMe TunoBe b Hero v\ p,a 
ro 3anniueM bbb <\>av\n no BpeMe Ha i/i3n"b/iHeHkie Ha AaAeHa nporpaMa. 



432 flporpaMnpaHe 3a .NET Framework (tom 2) 



KaKBO e Global Assembly Cache? 

Global Assembly Cache (GAC) e ueHTpa/iHO xpaHM/imue Ha cnc-Ae/iei-m 
aceM6/ikiTa, ao komto ce ocbiuecTBABa flocrbn ot mhoto npw/io>KeHkifl. BcflKa 
.NET v\HCTanau.\A5\ MMa ep.v\H Global Assembly Cache. 06mkhob6ho tom ce 
HaMupa b AnpeKTopuflTa: 



C : \Windows\Assembly 



flupeKTopuflTa Ha GAC MMa onpeAe/ieHa CTpyKTypa, cbcraBeHa ot MHOxecrBO 
noAAnpeKTopnn, b komto ce HaMnpaT MaHncpecT cpaw/iOBeTe Ha cbxpaHABa- 
HMTe aceM6/ikiTa. MMeTO Ha flafleHa noflflnpeKTopua b GAC ce reHepupa 
cnpyiMO MMeTO Ha cbxpaHABaHOTO aceM6/iw b Hea. no to3m HanwH b GAC ce 
noAtpxa Bp"b3Ka Me>KAy cnoAe/ieHO aceM6/iw v\ noAAnpeKTopna. 

OcBeH cnoAe^eHM aceM6/ii/iTa, b OTAe/iHa ceKuna Ha GAC, ce cbxpaHHBa 
npeKOMni/i/ikipaHi/i aceM6/ii/iTa, npn nweTO M3n"b/iHeHMe, cpeAaTa He M3BMKBa 
BceKM ntT JIT KOMnw/iaTopa, a i/i3n"b/iH*iBa AnpeKTHO npeKOMnw/ikipaHkifl koa. 

B Global Assembly Cache ce na3M v\ CBa/ieH ot MHTepHeT v\nv\ /iOKa/iHi/i Mpe>KM 
koa Ha aceM6/ii/iTa. CpeAaTa orpaHkmaBa Aocrbna ao tax, KaTO vv\ cbxpaH^Ba 
b nacma ceKunfl Ha GAC. 

CbxpaHABaHkiTe cuop,eneuv\ aceM6/ikiTa b GAC, 3aA"b/i>KkiTe/iHO Tpa6Ba pja ca 
ci/i/iho MMeHyBaHM, KoeTO vv\ MAeHTucpnuupa yHMKa/iHO. nocraBAHeTO Ha 
aceM6^MTaTa b GAC craBa npe3 kmcra/ikipaHe. 

1/lHCTa/inpaHe Ha aceM6/iMTa b GAC 

3a Aa ce i/i3no/i3Ba nacmo aceM6/iw ot AaAeHO npn^OKeHne e AOcraTbUHO to 
Aa ce Konupa b AnpeKTopn^Ta, b koato ce HaMupa npw/io>KeHi/ieTO. CnoAe/ie- 
HMTe aceM6/ikiTa He MoraT Aa ce KonnpaT HanpaBO b GAC - Te Tpa6Ba Aa ce 
MHcra/ikipaT. 

MHCTa^npaHeTO Ha aceM6/ii/iTa b GAC CTaBa c noMOurra Ha MHCTpyMeHTM 3a 
MHCTa^aunfl, komto no3HaBaT CTpyKTypaTa My. Eahh ot Haw-necTO ki3no/i3Ba- 
HMTe MHCTpyMeHTM 3a MHcra/ikipaHe, Aei/iHcra/ii/ipaHe v\ noKa3BaHe Ha aceM6- 
/lMTa b GAC e Global Cache Accessibly Utility (gacutii.exe). 

Mhoto noTpe6nTe^n npeAnonwTaT Aa M3no/i3BaT Windows Explorer 3a MHcra- 
ziwpaHe Ha aceM6/ikiTa. ToBa CTaBa no cneAHi/m HaniiH: 

1. CTapTupaMe Windows Explorer. 

2. OTBapflMe AHpeKTOpMflTa C:\Windows\Assembly. 

3. B3MMaMe cpaw/ia, cbAtpwam MaHwcpecra Ha aceM6/iMTO, KoeTO MCKaMe 
Aa MHcra/ikipaMe v\ ro nycKaMe b npo3opeua Ha Windows Explorer v\ 
aceM6/ikiTO me 6"bAe kiHcra/ii/ipaHO. 



T/iaBa 19. ChpaweHkie Ha TunoBeTe (Reflection) 433 



S* C:\WINDOWS\assembly 



File Edit View Favorites Tools Help 



If 



Q 



* £$LP Search g/ Folders Efl |J| X. 1!!?]- 



Address l£| C:\WINDOWS\assembly 



v 0Go 



Folders 



GB-fCfr Programs 

\r°\ temp 

Q> TIZL 

i^ Video 

B-{^| WINDOWS 

5)-Q $NtServicePackUninstall$ 
fr^i addins 
■£| aod 
{£| AppPatch 
SH'f^ii assembly 
S'Gl Cache 
r-frTi Config 
r-fr^Ti Connection Wizard 
H-fil C5C 
r "{Si Cursors 
E-fil Datecs 
QD"{£| Debug 

EtH'P^ Downloaded Installations 
Ml Downloaded Program Files 
B-fr^i Driver Cache 
fr^i EHome 
Ir^i Fonts 
S-Gl Help 

r-fr^i IIS Temporary Compressed 
B-lS) ime 

1 



Global Assembly Name 

JADODB 
iilSConMan 
ii^LlConManDataStore 
iifalConManServer 
nftlCRVsPackageLib 

ufal CrystalDecisions . CrystalReports . Engine 
Ufa] CrystalDecisions. ReportSource 
ii|£j CrystalDecisions . Shared 
nf£J CrystalDecisions . Web 
i$] CrystalDecisions , Windows , Forms 
liffil CrystalEnterpriseLib 
iili] Crystallnf oStoreLib 
iilijCrystalKeyCodeUb 
ulilCrystalPluginMgiiib 
jftjCrystalReportPluginLib 
iiftjcscomprngd 
alljCustornMarshalers 
iifsjCustomMarshalers 
uftlCustomMarshalers 
ufalemucm 
UltlEnvDTE 
an Extensibility 
iitijextractsdk 
jiftllEExecRemote 
sftlTFHosh 



Type 



Culture Public Key Token flj 



7.0.3300.0 


b03f5f7flld50a3a 


7.0.5000.0 


b03f5f7flld50a3a 


7.0.5000.0 


b03f5f7flld50a3a 


7.0.5000.0 


b03f5f7flld50a3a 


9.1.5000.0 


692fbea5521el304 


9.1.5000.0 


692fbea5521el304 


9.1.5000.0 


692fbea5521el304 


9.1.5000.0 


692fbea5521el304 


9.1.5000.0 


692fbea5521el304 


9,1,5000,0 


692fbea5521el304 


9,1,5000,0 


692fbea5521el304 


9,1,5000,0 


692fbea5521el304 


9,1,5000,0 


692fbea5521el304 


9,1,5000,0 


692fbea5521el304 


9,1,5000,0 


692fbea5521el304 


7.0.5000.0 


b03f5F7flld50a3a 


Nativ... 1.0.5000.0 


b03f5F7flld50a3a 


Nativ... 1.0.5000.0 


b03f5F7flld50a3a 


1.0.5000.0 


b03f5F7flld50a3a 


1.0.0.0 


b03f5F7flld50a3a 


7.0.3300.0 


b03f5F7flld50a3a 


7.0.3300.0 


b03f5F7flld50a3a 


7.0.5000.0 


b03f5F7flld50a3a 


1.0.5000.0 


b03f5F7flld50a3a 


1 n qnnn n 


hmFqF7F1 1Hqn^3s 



V 



1 object(s) selected 



j My Computer 



riOAAP'bWKa Ha MHOrO BepCMM 

EflHa ot ocHOBHMTe uenw Ha GAC e noAAtpwaHeTO Ha MHO>KecTBO Bepcun Ha 
eflHO aceM6/iw. EAHOBpeMeHHOTO noflfltpxaHe Ha hako/iko i/iHcra/ii/ipaHM Bep- 
cmm Ha eAHO m cbiuo aceM6/in ce i/i3no/i3Ba ot CLR cpeAaTa npn ynpaB/ieHM- 
eTO Ha 3ape>KflaHeTO Ha aceM6/ii/iTa. MHcra/ikipaHeTO Ha HOBa Bepcua Ha eflHO 
aceM6/iw He B/ikme Ha Bene MHcra/ii/ipaHkiTe npw/icoKeHi/m. ripn crapTkipaHe Ha 
npn^OKeHne, ki3no/i3Bamo cnoAe/ieHO aceM6/ii/i, CLR cpeAaTa npoBep^Ba c 
KOfl Bepcufl e M3rpafleHO npi/i/io>KeHkieTO v\ 3ape>Kfla cnoAe/ieHOTO aceM6/iw c 
noflxoflfliuaTa Bepcua. 



nper/iefl Ha GAC npe3 Windows Explorer 

C noMOurra Ha Windows Explorer MO>xe fla ce pa3r/ieAa cbAtpaoHkieTO Ha GAC 
b yAo6eH m pa36npaeM bma. B Hacroflmi/m npuMep me 6tAe AeMOHcrpwpaHO 
KaK CTaBa TOBa. 

1. CTapTupaMe Windows Explorer. 

2. OTBap^Me AnpeKTopuflTa c:\windows\Assembiy m BM>KAaMe kiHcra/ikipa- 
HMTe aceM6/iMTa b GAC Ha Haujua KOMniOTbp: 



434 



flporpaMnpaHe 3a .NET Framework (tom 2) 



m C:\WINDOWSYassembly - Microsoft Internet Explorer 



File Edit View Favorites Tools Help 



Q 



Back 



Q-&IP 



Search 



Folders 



» 0X 



Address |£=) C:\WINDOWS\assembly 



$7 



Go 



Global Assembly Marine Type 

HIS) Accessibility 

jConMan 

llfl ConManData5tore 

ISlConManServer 

|£)CRVsPackageLib 
HIS) CrystalDecisions.CrystalReports. Engine 

ft) CrystalDecisions . ReportSource 
sfsj CrystalDecisions . Shared 
df£j CrystalDecisions.Web 
HIS) CrystalDecisions. Windows. Forms 
blljCrystalEnterpriseLib 
SfflCrystallnfoStoreLib 
Eil^I Cry stalKey CodeLib 
b^jCrystalPluginMgrLib 
blij CrystalReportPluginLib 
bffijcscorinpringd 
:!ilCustomMarshalers Native Imaaes 



Version Culture Public Key Token 

1.0.5000.0 b03f5f7flld50a3a 

7.0.5000.0 b03f5f7flld50a3a 

7.0.5000.0 b03f5f7flld50a3a 

7.0.5000.0 b03f5f7flld50a3a 

9.1.5000.0 692fbea5521el304 

9.1.5000.0 692fbea5521el304 

9.1.5000.0 692fbea5521el304 

9.1.5000.0 692fbea5521el304 

9.1.5000.0 692fbea5521el304 

9.1.5000.0 692fbea5521el304 

9.1.5000.0 692fbea5521el304 

9.1.5000.0 692fbea5521el304 

9.1.5000.0 692fbea5521el304 

9.1.5000.0 692fbea5521el304 

9.1.5000.0 692fbea5521el304 

7.0.5000.0 b03f5f7flld50a3a 

1.0.5000.0 b03f5f7flld50a3a 



1 object(s) selected 



3. Pa3r/ie>KflaMe aceM6/iMTaTa ot cnnctKa. 

Bcako aceM6/iw MHcra/ikipaHO b GAC ce noi<a3Ba b Windows Explorer etc 
CBOMTe xapaKTepucTMKn: 

- Global Assembly Name - MMeTO Ha aceM6/iMTO 

- Type - Tkina Ha aceM6/iMTO 

- Version - Bepcua Ha aceM6/ii/iTO 

- Culture - Ky/uypa Ha aceM6/ii/iTO 

- Public Key Token - ny6/iwneH k/ikdh Ha aceM6/iMTO 

flont/iHi/iTe/iHki xapaKTepucTMKM 3a AaAeHO aceM6/iw ca AOcrbnHw npn M36op 
Ha Properties ot koht6kcthoto MeHio, KoeTO ce noKa3Ba npn HaTMCKaHe Ha 
AeceH 6yTOH Ha MMUJKaTa Btpxy 3annc 3a aceM6/iw. /Jont/iHkiTe/iHi/iTe xapaK- 
TepucTMKM ce noKa3BaT b Ana/ioroB npo3opeu: 



T/iaBa 19. OTpaweHkie Ha TunoBeTe (Reflection) 435 



'.-.m ADODB Properties 



General 


Version 




Name: 


ADODB 


References: 


1 


Last Modified: 


07,8,2004 r. 19:05:28 


Culture: 


Neutral 


Version: 


7,0,3300,0 


Public Key Token 


b03f5f7flld50a3a 


CodeBase: 







OK 



Cancel 



Help 



flaAeHO aceM6/ii/i Mcoxe p,a ce M3Tpne ot GAC ioto ce M36epe Delete ot 
KOHTeKCTHOTO MeHK), KoeTO ce noi<a3Ba npn HaTMCKaHe Ha fleceH 6yTOH Ha 
MMiuKaTa Btpxy 3annc 3a aceM6/iw. 

nper/iefl Ha GAC npe3 Administrative Tools 

C"bfl"bp>KaHMeTO Ha GAC Mcoxe fla ce pa3r/iefla v\ c noMOurra Ha Microsoft .NET 
Framework Configuration. 



-> Administrative Tools --> Microsoft .NET 
2. Ot no/ieTO My Computer M36npaMe "Assembly Cache". 



1. OTBapaMe Control Panel 
Framework Configuration 



436 



flporpaMnpaHe 3a .NET Framework (tom 2) 



r it .NET Configuration 1.1 



File Action View Help 



+ 



My Computer 

%BSES1 

[45} Configured Assemblie: 
Jg] Remoting Services 

a) Runtime Security Polic 

H Applications 



> 




Assembly Cache 



The assembly cache contains the set of assemblies 
available to all applications targeting the .NET 
Framework. Multiple versions of the same assembly 
can be placed in the assembly cache. This allows two 
applications to correctly execute even if they require 
different versions of the same shared assembly. 



Tasks 



View List of Assemblies in the Assembly Cache 

Toggle to the list of assemblies in the assembly cache, 

Add an Assembly to the Assembly Cache 

This copies an assembly file into the cache. After the 
assembly has been added, the assembly can be used as a 
configured assembly or added to the Policy Assemblies list. 




W Show this Help topic by default. 



3. rioc/ieABaMe xnnepBpt3KaTa View List of Assemblies in the Assembly 
Cache v\ pa3rvie>KflaMe aceM6/ii/iTaTa ot cni/icbKa. 



r 

r ( e .NET Configuration 1.1 I 


D@® 


File Action View Help 


£j, My Computer 
j--^g Assembly Cache 
j--Qi} Configured Assem 
; J^) Remoting Services 

El-la) Runtime Security F 
â–  yg Applications 


Assembly Name 


| Version 


Locale 


Public Key Token * 


â– ^Accessibility 


1.0.5000.0 


neutral 


b03f5f7flld50a3a 




ESjADODB 


7.0.3300.0 


neutral 


b03f5f7flld50a3a 


^JconMan 
^JconManDataStore 


7.0.5000.0 
7.0.5000.0 


neutral 
neutral 


b03f5f7flld50a3a 
b03f5f7flld50a3a 


'-$ ConManServer 


7.0.5000.0 


neutral 


b03f5f7flld50a3a 






â– ^CRVsPackageLib 


9.1.5000.0 


neutral 


692fbea5521el304 






^CrystalDecisions. , 


. 9.1.5000.0 


neutral 


692fbea5521el304 






^CrystalDecisions. , 
^5 CrystalDecisions. , 
^5 CrystalDecisions. , 


. 9.1.5000.0 
. 9.1.5000.0 
. 9.1.5000.0 


neutral 
neutral 
neutral 


692fbea5521el304 
692fbea5521el304 
692fbea5521el304 






^5 CrystalDecisions. , 


. 9.1.5000.0 


neutral 


692fbea5521el304 






^CrystalEnterpriseL 


b 9.1.5000.0 


neutral 


692fbea5521el304 






^CrystallnfoStoreLi 


b 9.1.5000.0 


neutral 


692fbea5521el304 






^JcrystalKeyCodeLit 


9.1.5000.0 


neutral 


692fbea5521el304 






{SJcrystalPluginMgrLi 


b 9.1.5000.0 


neutral 


692fbea5521el304 






^CrystalReportPlug 


,. 9.1.5000.0 


neutral 


692fbea5521el304 






^Jcscompmgd 


7.0.5000.0 


neutral 


b03f5f7flld50a3a 






^©CustornMarshalers 


1.0.5000.0 


neutral 


b03f5f7flld50a3a 




IIHHI > 


^©CustornMarshalers 


1.0.5000.0 


neutral 


b03f5f7flld50a3a 


V 


< 


mi 




> 



T/iaBa 19. ChpaweHkie Ha TunoBeTe (Reflection) 437 

OTpawetme Ha TunoBeTe 

OTpaxeHneTO Ha Ti/moBeTe (reflection) e efli/m hob MexaHM3"bM, npeAOCTaBeH 
ot n/iaTctjopMaTa .NET Framework, flaBaiu b"B3mo>khoct 3a no/iynaBaHe Ha 
MHctjopMaunfl 3a TunoBeTe no BpeMe Ha i/i3n"b/iHeHkie Ha nporpaMaTa. ToBa 
no3BO/iflBa npoeKTupaHeTO Ha fli/maMMUHO pa3UJnpflBaiun ce npM/io>KeHMfl, kbm 
komto ziecHO MoraT fla ce flo6aBAT TunoBe Ha flpyrn nporpaMMCTM v\ KOMnaHMM. 

B HAKaKBa ctjopMa OTpaweHkie (reflection) MMa bbb bcmukm ynpaB/iflBaHki n/iaT- 
ctjopMM KaTO Java, Perl v\ ,qp. 

KaKBO e Reflection? 

Reflection e MexaHM3"bM, flaBaiu c/ieflHMTe b"B3mo>khoct Ha .NET npw/io>Ke- 
HMATa: 

- fla M3y4aBaT MeTaflaHHkue Ha aceM6/iMTa 

- fla M3ynaBaT TunoBeTe b flafleHO aceM6/iw 

- flklHaMMUHO fla M3BMKBaT MeTOflM 

- flMHaMM4HO fla ct3flaBaT hobm aceM6/ii/iTa, fla vv\ M3n"b/iH*iBaT v\ fla vv\ 
3ana3BaT KaTO ctjai/i/i 

C noMOiflTa Ha OTpaweHkie, flafleHO npi/i/io>KeHi/ie Mowe fla 3apeflM flkmaMMUHO 
flafleHO aceM6/iw (DLL ctjai/i/i), fla M3B/iene ot Hero flafleH Tun, fla ro MHcraH- 
uupa flMHaMM4HO m fla My M3BMKa MeTOflMTe. MexaHM3M"bT Ha OTpaweHkie 
no3BO/iflBa fla ce flo6aB*iT no BpeMe Ha M3n"b/iHeHne kbm flafleH MeTOfl MSIL 

MHCTpyKUMM, C/iefl KOeTO TOM fla Ce M3n"b/1HM. B"b3MO>KHOCTMTe npeflocTaBeHM 

ot T03M MexaHM3"bM ujupoKO ce i/i3no/i3BaT npn nucaHeTO Ha KOMnw/iaTopw v\ 
MHTepnpeTaTopn Ha CKpunT e3nun. C noMOurra Ha reflection MoraT fla ce 
nmuaT n/itri/mki (plugins). 

3ape>KflaHe Ha aceM6/iMTa 

OTpaxeHneTO Ha TunoBeTe (reflection) MO>Ke fla ce M3no/i3Ba, KoraTO no 
BpeMe Ha ki3n"b/iHeHwe, flafleHO npw/io>KeHi/ie Tpa6Ba fla no/iynw MHctjopMauna 
3a aceM6/iw v\nv\ Tun. ToBa MO>Ke fla ce nocTurHe npe3 cb3flaBaHe Ha 

System. Reflection. Assembly 06eKT, MfleHTMCtjUUMpaifl 3apefleHO aceM6/lM M 

M3BMKBaHeTO Ha npeflocTaBeHMTe ot Hero MeTOflM v\ CBOMCTBa. K/iacvr 

System. Reflection. Assembly npeflCTaBfl aceM6/lkl B CLR cpeflaTa. 

System. Reflection. Assembly 06eKT MO>Ke fla ce Cb3flafle npe3 M3BMKBaHeTO 
Ha MeTOflMTe Assembly. Load (...) V\I\V\ Assembly . LoadFrom(...) . 

3ape>KAaHe npe3 Assembly. Load(...) 

MeTOfl"bT System. Reflection. Assembly. Load(...) npneMa KaTO napaMeTbp 
MMe Ha aceM6/lM V\I\V\ 06eKT OT TMn System. Ref lection. AssemblyName, KOMTO 

onucBa aceM6/ii/iTO. ripn M3BMKBaHe Ha to3m MeTOfl, aceM6/ii/iTO ntpBO ce 
Ttpcn b GAC, cnefl TOBa b 6a30BaTa flupeKTopua Ha npw/io>KeHi/ieTO v\ HaKpaa 



438 nporpaMnpaHe 3a .NET Framework (tom 2) 

b nacTHMTe ntTMiua. Ako He 6"bfle HaMepeHO TbpceHOTO aceM6/iw, ce noflaBa 

kl3K/lK)neHkie FileNotFoundException. MeTOfl"bT Bptiua 3apefleHOTO aceM6/iw. 

3ape>KAaHe npe3 Assembly. LoadFrom(...) 

MeTOA"bT System. Reflection. Assembly. LoadFrom(...) npneMa KaTO napaMe- 

Ttp ntTfl Ha cpaw/ia Ha aceM6/ii/iTO, KoeTO i/iCKaMe p,a 3apeAHM. ripn M3BMKBa- 
HeTO Ha to3m MeTOfl, CLR cpeflaTa 3ape>Kfla yKa3aHna ot napaMeTbpa cpaw/i. 

B"bTpeilJHO ce M3BklKBa Assembly. Load (...) . AKO He ce HaMepn TtpceHMflT 
Cpafi/1, ce nOAaBa M3K/lK>neHMeTO FileNotFoundException. MeTOA"bT Bptiua 
3apeAeHOTO aceM6/lkl. T03kl MeTOA e nO-6aBeH OT Assembly. Load (...) . 

M3BJiiiHaHe MHcjDopMaMMq 3a aceM6/m 

M3B^M4aHeTO Ha MHCpopMaunfl 3a aceM6/iw CTaBa c noMOLirra Ha CBOMCTBaTa Ha 

K/iaca System. Reflection. Assembly: 

- FullName - C"bA"bp>Ka ITb/lHOTO MMe Ha aCeM6^MTO, BK/lKDHBaLUO Bepcufl, 

Ky/uypa v\ k/ikdh (Public Key Token). 

- Location - cbAtpwa ntTAT, ot KBAeTO e 3apeAeHO aceM6/ii/iTO. 

- EntryPoint - CbAtpwa MeTOAa, ot komto me 3ano4He i/i3n"b/iHeHweTO Ha 
aceM6/iMTO. 

- GiobaiAssembiyCache - 6y/ieBa ctomhoct, KOATO noKa3Ba p,anv\ aceM- 
6/imto e 6m/io 3apeAeHO ot GAC. 

flByKpaTHO 3ape>KAaHe Ha aceM6/in - npMMep 

B HacTOfliukifl npuMep ce AeMOHcrpwpa AByKpaTHO 3ape>KAaHe Ha aceM6/in i/i 
ce i/i/uocrpkipa xoAtT Ha M3n"b^HeHne Ha cj\ep,uv\s\ nporpaMeH koa: 



using System; 

using System. Reflection; 

using System. 10; 

class AssemblyDoubleLoad 

{ 

static private void ShowAllAsemblies ( ) 

{ 

foreach (Assembly assembly in 

AppDomain . CurrentDomain . GetAssemblies 

{ 

Console . WriteLine (assembly. FullName) ; 

Console .WriteLine (assembly. Location) ; 

Console .WriteLine ( ) ; 
} 
} 

static void Main ( ) 
{ 



T/iaBa 19. ChpaweHkie Ha TunoBeTe (Reflection) 439 



// List all assemblies at the beginning 

Console .WriteLine ( " In the beginning 



ShowAllAsemblies 



// Load mscorlib.dll with Assembly . Load ( ) and list all 

// asemblies 

Assembly. Load ( "ms cor lib . dll" ) ; 

Console .WriteLine ( " After loading Mscorlib 

with Assembly . Load ( ) "); 

ShowAllAsemblies ( ) ; 

// Load mscorlib.dll from a different path 
Assembly. LoadFrom ( @" . . \ . . \mscorlib . dll" ) ; 

Console .WriteLine ( " After loading mscorlib.dll from a 

different path " ) ; 

ShowAllAsemblies ( ) ; 



C/iefl ki3n"b/iHeHkie Ha npuMepa ce no/iynaBa cnej\HV\f\T pe3y/iTaT: 



c* C Vdot_net_book\Le>:tiire-1 B-Reflection\Demo-2-DoubleLoad\bin\Debue\Demo-2-DoubleLoad HBu 



In the beginning 

Inscorlib, Uersion=i .0.5000.0, Culture =neutral, PublicKeiiToken=b77a5c561934e089 
p :\windows\nicrosof t . net\f ramework\ul .1 .4322\nscorlib.dll 

Beno— 2— DoubleLoad, Uers ion =0_ 0.0.0, Culture =neutral, PublicKeyToken=null 

C:\dot_net_book\Lecture-18-Reflection\Deno-2-DoubleLoad\bin\Debug\Deno-2-DoubleL 

pad.exe 

After loading Mscorlib with Assembly .LoadO 

Mscorlib, Uersion=i. 0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
: :Nwindows\nicrosof t . net\f rameworkSul .1 -4322\nscorlib.dll 

Deno-2-DoubleLoad, Version =0.0. 0.0, Culture =neutral, PublicKeipToken=null 
C:\dot_net_book\Lecture-18-Ref lee tion\Deno-2-DoubleLoadSbinSDebugSDeno-2—DoubleL 
pad.exe 

After loading nscorlib.dll fron a different path 

tnscorlib, Uersion=l .0.5000.0, Culture=neutral, PublicKeyIoken=b77a5c561934e089 
p :\windows\nicrosof t . net\f ramework\ul .1 .4322\nscorlib.dll 

Deno-2-DoubleLoad, Uersion=0. 0.0.0, Culture =neutral, PublicKeyToken=null 
C:\dot_net_book\Lecture— 18— Reflect ion\Deno— 2— Do ubleLoad\b in \Debug\De no— 2— Double I. 
pad.exe 

Lscorlib, Uersion=l. 0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
c :\dot _net_book\lecture-18-reflection\deno-2-doubleload\nscorlib.dll 



OnMcaHMe Ha npMMepa 

K/iaCbT AssemblyDoubleLoad OT npMMepa klMa eAHH CTaTMHeH MeTOA 
ShowAllAsemblies (...) , KOMTO M3Be>Kfla B KOH30/iaTa ITb/lHklTe MMeHa M MeCTO- 

no/io>KeHi/iyi Ha bcmuki/i 3apefleHM aceM6/ikiTa b TeKyiuna AppDomain Ha 
npn^OKeHneTO. 

Haw-HanpeA b npuMepa ce M3Be>Kfla kmqoopMaukifl 3a aceM6/ikiTaTa, 3apefleHM 
ot CLR cpeflaTa npn crapTkipaHe Ha npuMepa. ToBa ca aceM6/ikiTaTa 



440 nporpaMnpaHe 3a .NET Framework (tom 2) 

mscorlib.dll M Demo-2-DoubleLoad.exe. AceM6/lklT0 mscorlib.dll Cbfltp- 

>Ka noBeneTO cucTeMHM TunoBe ot npocTpaHCTBOTO system Ha .NET 
Framework. 

C/iefl TOBa M3pn4HO ce npaBM onuT 3a 3ape>KflaHe Ha aceM6/iMTO 

mscorlib.dll C nOMOLUTa Ha MeTOfla Assembly. Load (...) . T03M MeTOA npweMa 

eAMH napaMeTtp, MMeTO Ha aceM6/ii/iTO, KoeTO MCKaMe p,a 3apeAHM. Cnep, 
M3BMKBaHeTO Ha Assembly. Load (...) naK ce M3Be>KAa MHCpopMaunfl 3a 3apefle- 
HMTe aceM6/ikiTa. B to3m c/iynaw He ce 3ape>Kfla hobo aceM6/iw b naMeTTa, 
3aiuoTO CLR irbpBO npoBep^Ba p,anv\ noncKaHOTO aceM6/iw He e Bene 3apefleHO 
m aKO e TaKa He ro 3ape>KAa btopm ntT. 




no noflpa36npaHe b eflMH flOMeiiH Ha npfisiomeHiieTO 
(AppDomain) eflHO aceM6/iM ce 3ape>Kfla caMO BeflHi>>K. 



3a p,a 3apeAMM ABa ntTM aceM6/iMTO mscorlib.dll ro KonnpaMe b Apyra 
AnpeKTopua, 3a Aa 3a6/iyqnM CLR, ne aceM6/ikiTaTa ca pa3/iwnHn. B c/iynaa 
TOBa e AnpeKTopuflTa Ha npoeKTa. 

M3BMKBaMe OTHOBO MeTOAa Assembly. LoadFrom(...) C napaMeTbp ntTfl ao 

TeKymaTa AnpeKTopua Ha npuMepa v\ MMeTO Ha aceM6/ikiTO (mscorlib.dll), 
KoeTO boam ao noBTopHOTO My 3ape>KAaHe. ripn OTnenaTBaHe Ha MHCpopMaunfl- 
Ta 3a 3apeAeHMTe aceM6/ii/iTa b npw/io>KeHi/ieTO ce BM>KAa, ne mscorlib.dll e 
3apeAeHO eAHH ntT npn crapTkipaHe Ha npw/io>KeHkieTO v\ btopm nvr ot TeKy- 
maTa AnpeKTopi/m Ha npki/io>KeHMeTO. 

npeMaxBaHe Ha aceM6/iMTa ot naMeTTa 

B CLR cpeAaTa He ce noAAtpwa npeMaxBaHe Ha KOHKpeTHO aceM6/iw ot 
naMeTTa. Ot naMeTTa MO>xe Aa ce npeMaxHaT bcmukm aceM6/ikiTa, 3apeAeHM b 

AaAeH AppDomain. TOBa CTaBa C nOMOLUTa Ha CTaTklUHI/m MeTOA AppDomain. 

unioad(...), komto npweMa pecpepeHunfl kbm AppDomain, 4mmto aceM6/iMTa 
MCKaMe Aa npeMaxHeM ot naMeTTa. l/l3no/i3BaHeTO Ha to3m MeTOA He ce 
npenoptuBa nopaAM ro/iHMaTa BepoaTHOcr ot rpeujKM. 

M3yHaBaHe Ha TwnoBeTe b aceM6/iu 

ripn hakom npn^o>KeHMfl e Ba>KHO Aa ce 3Hae p,anv\ onpeAe/ieH Tun cbiuecTBy- 
Ba b AaAeHO aceM6/iw v\ iokbi/i mctoam h CBOMCTBa npeA.nara tom. Ta3M 
MHCpopMaunfl MO>Ke Aa He e AOCTbnHa no BpeMe Ha KOMnw/ikipaHe Ha 
aceM6/ii/iTO, ho Aa ce 3Hae no BpeMe Ha HeroBOTO ki3n"b/iHeHkie. ToraBa ce 
Ha/iara M3no/i3BaHeTO Ha OTpa>xeHi/ie 3a AHHaMkinHO M3ynaBaHe Ha TunoBeTe b 
AaAeHO aceM6/iw. flwHaMMUHOTO M3B/ikmaHe Ha MHCpopMauna 3a TunoBeTe He e 
ot Haki-6"bp3MTe onepauuM v\ 3aTOBa e npenoptuwTe/iHO Aa ce ki3no/i3Ba caMO, 
KoraTO e a6co/iK>THO Heo6xoAHMO. ripn to3m noAxoA 3a i/i3B/ii/maHe Ha MHCpop- 
Maunfl 3a TunoBe, MO>Ke Aa ce AonycHaT rpeujKM, CB"bp3aHM c 6e3onacHOCTra 
Ha TunoBeTe, komto KOMni/i/iaToptT He MO>Ke Aa OTKpue v\ nonpaBM. 



T/iaBa 19. ChpaweHkie Ha TunoBeTe (Reflection) 441 

KsiacbT System. Type 

K/iacbT system. Type e a6cTpaKTeH 6a30B K/iac, HacneAHMK Ha K/iaca system. 
Reflection. Member info. To3M K/iac npeAcraBH p,ap,eH Tun ot Common Type 
System (CTS) v\ npeAOcraBfl B"b3MO>KHOCT 3a noynaBaHe Ha BCkinKi/ue My 
n/ieHOBe: 

- no/ieTa 

- MeTOAM 

- CBOMCTBa 

- C"b6MTM51 

- B/10>KeHkl TunoBe 

K/iacbT system. Type e ocHOBeH 3a MexaHM3Ma Ha OTpa>KeHi/ie v\ npeAOcraBH 
MHO>xecTBO CBOMCTBa 3a AOCTtn ao MeTaAaHHMTe Ha AaAeH Tun. IHe pa3r/ie- 
AaMe hakom ot CBOMCTBaTa, AectjuHnpaHM b K/iaca system. Type: 

- BaseType - Bptiua poAMTe^CKMfl Tun Ha TeKymnfl Tun 

- Attributes - Bptiua aTpn6yTMTe, CBtp3aHM c TeKymnfl Tun 

- FuliName - Bptiua nt/iHOTO MMe Ha TeKymnfl Tun 

- isAbstract - Bptiua true, aKO TuntT e a6cTpaKTeH 

- IsArray - Bptiua true, aKO TkintT e MaCMB 

- isByRef - Bptma true, aKO TuntT e pectjepeHTeH 

- isciass - Bptiua true, aKO TuntT e K/iac 

- iscoMObject - Bptma true, aKO TuntT e COM o6eKT 

- isEnum - Bptiua true, aKO TuntT npeAcraB/iflBa M36poeH Tun (eHyMe- 
paunfl) 

- Islnterface - Bptiua true, aKO TkintT e MHTepctjeMC 

- isPublic - Bptiua true, aKO TuntT e AeK^apupaH KaTO ny6/iwneH 

no/iynaBaHe Ha System.Type o6eKT 

MMa pa3^M4HM Ha^MHM 3a no/iynaBaHe Ha System.Type o6eKT. Eahh ot tax e 
c noMOurra Ha MeTOAa GetTypeO Ha K/iaca system. object, ripn M3BMKBaHeTO 
Ha to3m MeTOA CLR cpeAaTa Bptiua pectjepeHuna kbm Tuna Ha yKa3aHna 
o6eKT. no T03i/i Ha^MH 3a BceKM o6eKT Moxe as ce no/iynw HeroBi/m Tun. 
C^eABaiunflT ctjparMeHT noKa3Ba KaK ce M3B/iM4a Type o6eKT ot npoMeH/iMBa 

OT TMn double: 

double d = 0.2; 

Type t = d. GetType ( ) ; 



442 nporpaMnpaHe 3a .NET Framework (tom 2) 

K/iacbT system. Type npefl/iara HflKO/iKO npeflecpMHupaHM Bepcun Ha craTwu- 
HM5i MeTOfl GetType(...) , npneMaiun KaTO napaMerbp string. C/ieflBamwflT 
cpparMeHT noKa3Ba iok ce ki3B/ii/ma Type o6eKT c noMOLirra Ha system. 

Type . GetType (...) : 



Type t = Type. GetType ( "System. Double" ) ; 



T03M MeTOfl ce M3no/i3Ba ot bcm^km .NET e3nun m 3aTOBa npn M3no/i3BaHeTO 
My He MO>Ke fla My noflafleM KaTO napaMeTbp C# nceBflOHMM Ha Tun 
(HanpuMep int, float, string, ...). Tp*i6Ba fla ce noflaBa irb/iHOTO MMe Ha 
Tuna, komto MCKaMe fla no/iynwM. 

K/iaCbT System. Assembly npefl/iara MeTOfla GetTypesO, C HkmTO nOMOlfl 

MoraT fla ce no/iynaT bci/iukm TunoBe ot flafleHO aceM6/iw. 

M3ynaBaHe H/ieHOBeTe Ha Tun 

M3B/ikmaHeTO Ha n/ieHOBeTe Ha flafleH Tun CTaBa c noMOurra Ha cneflHMTe 

MeTOflM, flecpMHkipaHM B K/iaca System. Type: 

- Getconstructors(...) - Bptifla KOHCTpyKTopnTe Ha TeKyiflMfl Tun. 

- GetEvents(...) - Bptifla flecpMHupaHMTe v\nv\ HacnefleHki c"b6nTMfl Ha 
TeKyiflMfl Tun. 

- GetFieids(...) - Bptifla no/ieTaTa Ha TeKyiuna Tun (flecpuHnpaHM b Tuna 
ki/iki Hac^efleHu). 

- Getinterfaces(...) - Bptifla flecpMHupaHMTe m HacnefleHM MHTepcpewcn 
Ha TeKyiflMfl Tun. 

- GetMembers(...) - Bptlfla BCM4KM H/ieHOBe (nO/ieTa, C"b6klTMfl, CBOMCTBa M 

flp.) flecpMHupaHM b Tuna v\nv\ Hac/iefleHM. 

- GetMethods(...) - Bptifla MeTOflMTe flecpMHupaHM b Tuna v\nv\ Hac/iefleHM. 

- GetProperties(...) - Bptma CBOMCTBaTa flecpMHupaHM b Tuna v\nv\ 
Hac^efleHM. 

- invokeMember ( ... ) - M3BMKBa yKa3aH n/ieH Ha TeKyiflkifl Tun. Mo>xe fla ce 
M3no/i3Ba 3a M3BMKBaHe Ha KOHcrpyKTop v\nv\ MeTOfl, 3a npoMsiHa Ha 
no/ie v\nv\ cbomctbo, iokto m 3a flpyrn no-c/io>KHi/i fleMCTBMfl. 

- IsInstanceOfType(...) - Bptlfla true, aKO nOCOneHklflT 06eKT e MHCTaH- 
\\v\s\ Ha TeKyiflMfl Tun. 

- Sys tern. Type. FindMembers ( ... ) - Bptlfla no 3aflafleH Cpkl/lTbp H/ieHOBeTe 

ot onpefle^eH bma Ha flafleH Tun. 
BckinKki pa3MeflaHM MeTOflM Ha K/iaca system. Type (c ki3K/iK>neHkie Ha 

IsInstanceOfType(...) ) BptlflaT MaCMB C pecpepeHUMM OT Tkin System. 
Reflection. Member Info M/1M HerOB Hac/ieflHMK. K/iaCbT Memberlnfo e 6a30B 

K/iac Ha BCM4KM K/iacoBe, npeflCTaB^flBaiflu BMflOBeTe n/ieHOBe Ha flafleH Tun v\ 



T/iaBa 19. ChpaweHkie Ha TunoBeTe (Reflection) 443 

Ha K/iaca system. Type. rio-HaTarbK b HacToaiuaTa TeMa me pa3r/ieflaMe no- 
noApo6HO K/iacoBeTe 3a BMflOBeTe n/ieHOBe Ha flafleH Tun v\ caMna K/iac 
Memberinfo. Ba>KHO e 3acera p,a ce 3Hae, ne K/iacbT Memberinfo npeA/iara 
c^eAHMTe CBOMCTBa, komto ca o6lum 3a BCM4KM n/ieHOBe Ha p,ap,eH Tun: 

- Member Inf o.DeclaringType - Bptiua System. Type 06eKT, KOMTO 

OTpa3flBa Tuna, b komto e AeqoMHMpaH n/ieHa. 

- Member Inf o.MemberType - Bptiua BMAa Ha H/ieHa (no/ie, MeTOA, TMn, 
CBOMCTBO, KOHCTpyKTOp M/1M C"b6MTMe). 

- Memberinfo. Name - Bptiua MMeTO Ha H/ieHa M/1M TMna KaTO string. 

- Memberinfo. Ref lectedType - Bptiua System. Type 06eKT, KOMTO e 

M3no^3BaH 3a no/iynaBaHeTO Ha to3m o6eKT. 

M3ynaBaHe H/ieHoeeTe Ha Tun - npHMep 

B HacTOfliuMfl npMMep ce AeMOHcrpMpa M3B/iMnaHe Ha MMeHaTa Ha TMnoBeTe ot 
aceM6/iM m MMeHaTa Ha n/ieHOBeTe Ha AaAeH TMn no 3aAaAeH cfjM/iTbp m ce 
M/iK>crpMpa xoAtT Ha M3n"b/iHeHMe Ha c/ieAHMH nporpaMeH koa: 



using System; 

using System. Reflection; 

struct SomeStructure 

{ 

} 

class AssemblyTypesDemo 

{ 

public void SomePublicMethod i 

// Some code 



private void SomePrivateMethod ( ) 
// Some code 

private static void SomeStaticMethod ( ) 
// Some code 

static void Main ( ) 

Assembly currentAssembly; 

currentAssembly = Assembly . GetExecutingAssembly i 

foreach (Type type in currentAssembly . GetTypes ( ) 



444 flporpaMnpaHe 3a .NET Framework (tom 2) 



Memberlnfo [ ] members = type . FindMembers ( 
MemberTypes .Method, 

BindingFlags . Nonpublic | BindingFlags . Instance, 
Type . FilterName, 

foreach (Memberlnfo member in members) 

{ 

Console .WriteLine ("{ }.{ 1 }()" , type. Name, member. Name) 



Console .WriteLine ( ) ; 



C/ieA M3n"b^HeHne Ha npuMepa ce no/iynaBa cnej\Hv\f\T pe3y/iTaT: 



c\ "C:\MS Content and Curriculum\PPT\ -Lecture- 18-Reflecth 



SomeStructure.Finalizef ) 
SomeStructure.MemberwiseClonef ) 

RssemblyTypesDemo. Final ize( ) 
RssemblyTypesDemo. SomePrivateMethocH ) 
AssembiyTypesDemo. MemberwiseClonef ) 

Press any key to continue 



l± 



Jnjxj 



OnncaHne Ha npuMepa 

B K/iaca AssembiyTypesDemo 3a ue/iMTe Ha npwMepa ca AecpMHupaHM ocBeH 

MeTOA"bT Main(...) eAHH ny6/lMHeH MeTOA SomePublicMethod(...) M ABa naCTHM 
MeTOAa - SomePrivateMethod() M SomeStaticMethod( ) , KaTO BTOpMflT e CTa- 
TkmeH. flecpMHMpaHa e V\ B"bHLUHa 3a K/iaca AssembiyTypesDemo CTpyKTypa - 
SomeStructure. 

ripn CTapTMpaHe Ha npMMepa 4 pe3 Assembly. GetExecutingAssemblyO B3MMa 

aceM6/ii/iTO, ot KoeTO e CTapTupaHna koa (b cnynafl, KOAa ot npnMepa Demo-3- 

AssemblyTypesInf o) . 

Cnep, KaTO CMe no/iynw/iw CTapTupaHOTO aceM6/iw, c noMOurra Ha MeTOAa 
Assembly. GetTypesO i/i3B/ii/maMe BCM4KM TkinoBe ot Hero m no/iynaBaMe 
MacuB ot system. Type o6eKTM. BceKM e/ieMeHT ot MacuBa npeAcraB/iflBa 
OTpaxeHne Ha eAHH Tun, AecpMHupaH b HaweTO aceM6/iw. 



T/iaBa 19. ChpaweHkie Ha TunoBeTe (Reflection) 445 
3a BCeKM OT nO/iyneHMTe System. Type 06eKTkl BMKaMe MeTOfla System. Type. 

FindMembers (...) . riapaMeTpwTe, komto noflaBaMe Ha to3m MeTOfl, onpeAe/iflT 
KaKBM BMAOBe n/ieHOBe MCKaMe fla HaMepuM. ritpBHAT napaMeTbp 

(MemberTypes. Method) Ha T03M MeTOA yKa3Ba, He MCKaMe Rd TbpCMM 

MeTOAMTe b p,ap,euv\s\ Tun. C ocraHa/ikiTe napaMeTpn yKa3BaMe KaK MeTOA'bT 

Sys tern. Type. FindMembers (... ) Rd M3B"bpilJM TbpceHeTO. BTOpMflT napaMeTbp 

yKa3Ba, ne MCKaMe p,a Tbpci/iM MHCTaHunn Ha Heny6/innHw mctoah Ha p,e>p,euv\s\ 
Tun. TpeTMAT napaMeTbp yKa3Ba KaK p,a ce ctjw/iTpi/ipaT HaMepeHMTe MeTOAH, b 
cnynayi no MMe. HeTBtpTnaT napaMeTbp yKa3Ba caMna ctjw/iTbp, no komto p,a 
ce M3B"bpujBa cfjki/iTpwpaHeTO Ha HaMepeHMTe MeTOAM Ha Tuna. 

MeTOA'bT Sys tern. Type. FindMembers (... ) Bptiua OTpa>KeHMflTa Ha HaMepeHMTe 

MeTOAM b AaAeH Tun. 3a BceKM MeTOA ce OTnenaTBaT MMeTO My n b kom Tun e 
AeK/iapupaH. 



Reflection K/iacoBe 3a BiiflOBeTe H/ieHOBe 

B .NET Framework e pea/lkl3kipaH K/iaCbT System. Ref lection. Memberlnfo, 
npflK Hac/ieAHklK Ha System. Object. K/iaCbT Memberlnfo e 6a30B a6CTpaKTeH 

K/iac 3a BCM4KM K/iacoBe, no3BO/i*iBamki M3B/ikmaHe Ha MHctjopMaui/isi 3a n/ieHO- 
BeTe Ha AaAeH Tun c noMOiuTa Ha OTpa>KeHne. C/ieABamaTa cJDnrypa noKa3Ba 
wepapxuflTa Ha K/iacoBeTe Hac/ieAHkiui/i Ha Memberlnfo: 



Sys tern . Reflection .Memberlnfo 



System . Reflection . Eventlnf o 



System . Reflection . Fieldlnf o 



Sys tern . Reflection . MethodBase 



System . Reflection . Constructorlnf o 



Sys tern . Reflection . Methodlnf o 



System . Reflection . Propertylnf o 



System. Type 



KaKTO ce BM>KAa ot cJDnrypaTa, 3a BceKM bma 4/ieH Ha Tkin MMa cbOTBeTeH K/iac 
(0Tpa>KeHne), komto ro onucBa. K/iacoBeTe b FCL Eventinfo, Fieidinfo, 

Methodlnfo, Constructorlnf o, Propertylnfo M Type n03BO/151BaT AOCTbn 

cbOTBeTHO ao MeTaAaHHMTe Ha cb6v\Twn, no/ieTa, MeTOAH, KOHcrpyKTopi/i 1/1 
B^o>KeHM TunoBe, komto ce c"bA"bp>KaT b AaAeH Tun. 

ripn M3B/iM4aHeTO Ha n/ieHOBeTe ot AaAeH Tun c noMOurra Ha MeTOAa 

GetMembers(...) Ha K/iaca System. Type ce Bptiua MaCMB OT 06eKTM OT TMn 



446 nporpaMnpaHe 3a .NET Framework (tom 2) 

Memberinfo. BCM4KM ocraHa/iki MeTOflu 3a flocTbn flo n/ieHOBeTe Ha flafleH Tun 

Ha K/iaca Type, KaTO GetConstructors(...) , GetEvents (...) , GetFields (...) , 
GetMethods(...) , GetProperties (...) M GetNestedType (...) , BptLflaT CbOTBeTHO 
MaCMB OT MHCTaHUMM Ha TMnOBeTe Constructorlnfo, Eventlnfo, Fieldlnfo, 
Methodlnfo, Property Info M Type. 

M3BJiiiHaHe Ha Me to am m napaMeTpiiTe mm 

C^eflBaiunflT cpparMeHT ot koa noKa3Ba KaK KaTO i/maMe MHCTaHuna Ha 
HflKaKtB Haw Tkin, MO>KeM fla no/iynwM OTpaxeHneTO Ha flafleH MeTOfl v\ fla 
M3B/ieneM napaMeTpnTe My. 



Methodlnfo someMethod = myType . GetMethod ( "SomeMethod" ) ; 
foreach ( Parameterlnf o param in someMethod. GetParameters 

{ 

Console . WriteLine (param. ParameterType) ; 

} 



B noKa3aHi/isi koa, ntpBO c noMOLirra Ha MeTOfla Type.GetMethod(...) no/iyna- 
BaMe OTpa>KeHMe Ha MeTOfla c MMe "someMethod". Cnep, TOBa M3BMKBaMe 
MeTOfla Methodlnfo. GetParameters (...) m no/iynaBaMe napaMeTpwTe Ha MeTO- 
fla b MacuB ot Tkin Parameter info. B KOH30/iaTa, 3a BceKM ki3B/ieneH napaMe- 
Ttp ce M3Be>Kfla HeroBMAT Tun. 

flHHaMHHHO MHcraHLjMpaHe Ha Tun 

B HAKOM npw/io>KeHi/ifl ce Ha/iara He caMO fla no/iynwM MHCpopMauna 3a flafleH 
Tun, flecpMHupaH b flafleHO aceM6/iw, ho m fla ct3flafleM MHCTaHuna Ha to3m 
Tun. EflMH ot HanwHkiTe 3a TOBa e c noMOurra Ha K/iaca system. Activator. 
To3M K/iac ce w3no/i3Ba 3a flkmaMMUHO cb3flaBaHe v\nv\ aKTMBupaHe Ha flafleH 
Tun. K/iacbT system. Activator npefl/iara c^eflHMTe CTaTM^HM MeTOflu 3a Cb3- 
flaBaHe Ha MHCTaHunn Ha flafleH Tkin: 

- Createlnstance(...) - Cb3flaBa MHCTaHUMfl Ha nOCOneH Tkin nOflafleH 
KaTO string 06eKT V\I\V\ KaTO MHCTaHUMfl Ha System. Type. 

- CreateInstanceFrom(...) - MHCTaHUkipa Onpefle/ieH TMn OT flafleHO 

aceM6/iki. MMeTO Ha aceM6/ii/iTO v\ Tuna ce noflaBaT KaTO ci/imbo/ihm 

HM30Be. 

- CrsateComlns tanceFrom ( ... ) - Cb3flaBa MHCTaHUMfl Ha COM 06eKT. 

MMeTO Ha Tkina v\ Ha cpaw/ia KtfleTO e flecpMHupaH tom, ce noflaBaT KaTO 

CMMBO/1HM HM30Be. 
flMHaMHHHO M3BMKBaHe Ha H/ieHOBe Ha AaACH TMn 

flnHaMM4HOTO M3BMKBaHe Ha flafleH n/ieH Ha flafleH Tun ce M3BtpujBa Ha flBe 
CTtnKM. Ha iTbpBaTa crbnKa ce M36npa noflxoflsimi/mT n/ieH, komto MCKaMe fla 
6"bfle M3BMKaH. Ta3M CTtnKa ce Hapwua CB"bp3BaHe (binding). Ha BTopaTa 



T/iaBa 19. ChpaweHkie Ha TunoBeTe (Reflection) 447 

CTbnKa ce aKTMBupa HaMepeHMAT n/ieH. Ta3M CTtnKa ce Hapwua M3BMKBaHe 
(invoking). 

Eahh ot HankiHkiTe fla ce CB"bp>KeM c flafleH n/ieH Ha flafleH Tun, 6e3 tom p,a 

6"bfle M3BMKaH, e C nOMOLirra Ha MeTOAHTe Type.GetConstructors(...) , 
Type. GetFields (...) , Type . GetMethods (...) , Type . GetProperties (...) . BCklUKkl 

Te3M MeTOAM BptiuaT pec|DepeHUMM kbm o6eKTM, hmmto Tun npeA/iara cnep,HMTe 
MeTOAM 3a AOCTtn ao cneukictjkmeH n/ieH Ha Tuna: 

- FieldInfo.GetValue(...) - B3MMa CTOMHOCT Ha no/ie. 

- Fieidinfo.setvaiue(...) - 3aAaBa ctomhoct Ha no/ie. 

- Constructorlnfo. Invoke (...) - M3BMKBa KOHCTpyKTOp M C"b3AaBa MH- 

craHui/m Ha Tuna. 

- PropertyInfo.GetValue(...) - M3BMKBa MeTOAa 3a M3B/lMHaHe Ha CBOM- 
CTBO get. 

- PropertyInfo.SetValue(...) - M3BMKBa MeTOAa 3a VCTaHOBflBaHe Ha 
CBOMCTBO set. 

- Me thodlnfo. Invoke (...) - M3BMKBa MeTOA Ha TMn. 

flpyr Ha^MH 3a AHHaMkinHO M3BMKBaHe Ha n/ieHOBeTe Ha AaAeH Tun e c 
nOMOlUTa Ha MeTOAa Type. invokeMember(...) , komto me pa3r/ieAaMe cneA 

Ma/IKO. 

flMHaMHHHO H3BMKBaHe Ha MeTOA^ - npHMep 

B HacTOfliunfl npi/mep ce AeMOHcrpwpa AHHaMi/mHO cb3AaBaHe Ha MHCTaHuna 
ot Tun system. DateTime, M3BMKBaHeTO Ha HenH MeTOA h nponwTaHe Ha Hew- 

HO CBOMCTBO. 



using System; 

using System. Reflection; 

class LateBindingDemo 

{ 

static void Main ( ) 

{ 

// Load the assembly mscorlib.dll 

Assembly mscorlibAssembly = Assembly . Load ( "mscorlib . dll" ) 

// Create an instance of DateTime by calling 
// new DateTime (2004, 1, 5) 
Type systemDateTimeType = 

mscorlibAssembly. GetType ( "System. DateTime" ) ; 
object[] constructorParams = new object[] {2004, 1, 5}; 
object dateTimelnstance = Activator . Createlnstance ( 

systemDateTimeType, constructorParams) ; 

// Invoke DateTime .AddDays ( 10 ) 



448 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Type [ ] addDaysParamsTypes = 

new Type [ ] { typeof (System. Double) } ; 
Methodlnfo addDaysMethod = systemDateTimeType . GetMethod ( 

"AddDays", addDaysParamsTypes) ; 
object [] addDaysParams = new object [] {10}; 
object newDateTimelnstance = 

addDaysMethod. Invoke (dateTimelnstance, addDaysParams) ; 

// Get the value of the property DateTime . Date and print it 
Propertylnfo datePropertylnf o = 

systemDateTimeType . GetProperty ( "Date" ) ; 
object datePropertyValue = 

datePropertylnf o . GetValue (newDateTimelnstance, null) ; 
Console.WriteLine ( " { :dd.MM. yyyy} ", datePropertyValue) ; 



} 



C/iefl i/i3n"b/meHi/ie Ha npuMepa ce no/iynaBa cnej\Hv\f\T pe3y/iTaT: 

^Jnjxj 



c\ "C:\MS Content and Curriculum\Presentatioi 



15701.2094 

Press any key to continue 



OniicaHMe Ha npuMepa 

ritpBOHana/iHO ce 3ape>Kfla aceM6/ii/iTO mscoriib.dll, KoeTO cbAtpwa noBe- 
neTO cucTeMHM TkinoBe ot npocrpaHCTBOTO system Ha .NET Framework. 

Hpe3 M3BMKBaHe Ha Activator . Createlnstance (...) ce Cb3flaBa MHCTaHUMfl Ha 
TMna System. DateTime, KaTO Ha KOHCTpVKTOpa Ha System. DateTime ce 

noAaBaT ioto napaMeTpn Tpi/i ue/ionwc/ieHM ctomhoctm, npeACTaBaiun AaTaTa 
05.01.2004. 

Cnep, TOBa c noMomTa Ha MeTOAa Type, invoke (...) ce ki3B/iwna OTpaxeHneTO 

Ha MeTOAa AddDays (double) Ha Tkina System. DateTime. TaKa kl3B/ieneHMflT 

MeTOA ce M3BMKBa c napaMerbp 10, komto Ao6aBfl 10 ahm kbm AaTaTa 
05.01.2004. B pe3y/iTaT ce Bptiua o6eKT, komto e MHCTaHuna Ha Tuna 

Sy s tern . DateTime . 

Ot no/iyneHkifl system. DateTime o6eKT ce M3B/ikma m OTne^aTBa CTOMHOCTTa 
Ha cbomctboto c MMe Date. OTne^aTaHaTa AaTa e 15.01.2004. 



T/iaBa 19. ChpaweHkie Ha TunoBeTe (Reflection) 449 
MeTOA"bT Type.InvokeMember(...) 

ripn M3BMKBaHe Ha MeTOfla Type. InvokeMember (... ) BBTpeWHO ce M3B"bpilJBa 

CBtp3BaHeTO m M3BMKBaHeTO Ha TbpceHMfl n/ieH Ha AafleHMfl Ti/m. 

KoraTO BklKaMe MeTOfla Type. InvokeMember (...) 3a M3BMKBaHe Ha MeTOA Ha 

AaAeH Tun v\ to3m MeTOA He 6"bAe HaMepeH, ce noAaBa ki3K/uoneHi/ie system. 

MissingMethodException. B C/iynaM, ne MeTOA"bT 6"bAe HaMepeH, TOM ce 
M3BMKBa M InvokeMember (... ) Bptiua pe3y/lTaTa OT M3BMKBaHeTO Ha HaMepeHMfl 
MeTOA- MeTOA"bT InvokeMember (...) Bptiua null aKO M3BMKaHMflT MeTOA e 
AeqonHnpaH KaTO void. 

B K/iaca Type MMa HflKO/IKO npeAeqOMHUpaHM BepCMH Ha InvokeMember (...) . 

IHe pa3r/ieAaMe BepcuaTa c Haw-MHoro napaMeTpn. flpyrnTe npeAeqoMHupaHM 
Bepcuki Ha InvokeMember (... ) npneMaT HAKOM ot napaMeTpi/iTe c noApa36n- 
paiun ce ctomhoctm. MeTOAtT MMa c/ieAHaTa AeqonHMUMfl: 



public object InvokeMember i 
string name, 

BindingFlags invokeAttr, 
Binder binder, 
object target, 
ob j ect [ ] args, 
Culturelnfo culture 



BCM4KM napaMeTpn, C M3K/lK)neHI/ie Ha target, nOAaBaHkl Ha InvokeMember (...) 

yKa3BaT c KaKtB n/ieH Ha AaAeH Tkin tom Tpa6Ba Aa ce CBtpxe. 

napaMeT"bp"bT name yi<a3Ba MMeTO Ha n/ieHa, c komto MCKaMe Aa ce CBtpxe 

InvokeMember (...) . 

napaMeT"bp"bT invokeAttr OT Tkin System. Reflection. BindingFlags yKa3Ba 

npaBM/iaTa, no komto InvokeMember (...) Tpa6Ba Aa M36epe caMO eAMH n/ieH ot 
AaAeH Tun. 

napaMeTtptT binder OT Tkin System. Reflection. Binder yKa3Ba TMnOBeTe 

Ha napaMeTpnTe, komto InvokeMember (...) Tpa6Ba Aa M3no/i3Ba, 3a Aa M3BMKa 
AaAeH MeTOA- 

napaMeTbpvr target e pectjepeHu,kifl kbm o6eKT, hmmto MeTOA MCKaMe Aa 

M3BMKaMe C MeTOAa InvokeMember (...) . 

napaMeTbpvr args OT Tkin System. Object nOAaBa Ha InvokeMember (... ) ap- 
ryMeHTMTe, C KOMTO Aa 6"bAe M3BMKaH kl3B/ieneHkm OT InvokeMember (...) MeTOA- 

napaMeTbpvr culture ce kl3nO/13Ba npn CB"bp3BaHe Ha InvokeMember (...) c 

AaAeH MeTOA- InvokeMember (...) i/i3no/i3Ba AaAeHa Ky/iTypa, noAaAeHa c to3m 
napaMeTtp, npn KOHBepTupaHe Ha TunoBeTe Ha apryMeHTMTe 3a MeTOA, komto 
MCKaMe Aa M3BMKaMe. 



450 



flporpaMnpaHe 3a .NET Framework (tom 2) 




BcetCM m»T, KOraTO ce BflKa MeTOflTaT InvokeMember (...), TOM 

M3Bi>piiJBa CBi>p3BaHe c KOHKpeTeH H/ieH Ha flafleH Tun v\ cnefl 
TOBa ro M3BMKBa. ripoLtecbT Ha CBi>p3BaHe OTHeMa BpeMe. B 
cnynafi, ne necTO ce ocbiflecrBfiBa flocrbn flo flafleH H/ieH Ha 
flafleH Tun, no-flo6pnnT noflxofl e cneflHmiT - eflMH ni>T fla ce 
CBi>p>KeM c Hero, c noMOiflTa Ha hdkom ot MeTOflMTe, npeflo- 
CTaBeHM ot K/iaca system. Type, c/iefl KoeTO fla ro M3BMKBaMe 
ko/ikoto niaTM >Ke/iaeM. 



InvokeMember(...) - npMMep 

Ctc c^eflBaiunfl KpaTtK npuMep fleMOHCTpupaMe M3no^3BaHeTO Ha MeTOfla 

InvokeMember (... ) : 



using System; 

using System. Reflection; 

namespace InvokeMemberDemo 

{ 

class AssemblyType 

{ 

int mAssemblyField; 

public AssemblyType ( ref int x) 
{ 



x = x + 5 ; 
mAssemblyField 



x + 10; 



class InvokeMemeberDemo 

{ 

static void Main ( ) 



{ 



// Get AssemblyType type 

Type t = Type . GetType ( "InvokeMemberDemo .AssemblyType" ) ; 

object [ ] args = new Object [] { 10 }; 

Console .WriteLine ( "Before constructor called: x={0}", 

args[0] ) ; 
BindingFlags bf = BindingFlags . Public | 

BindingFlags . Nonpublic | BindingFlags . Instance; 

// Create AssemblyType object 

Object obj = t . InvokeMember (null, bf | 

BindingFlags . Createlnstance, null, null, args, null); 
Console .WriteLine ( "Created object type: {0}", 

obj . GetType ( ) ) ; 
Console .WriteLine ( "After constructor returns: x={0}", 

args[0] ) ; 



T/iaBa 19. ChpaweHkie Ha TunoBeTe (Reflection) 451 



// Read object field 

int value = (int) t . InvokeMember ( "mAssemblyField" , bf | 

BindingFlags . GetField, null, ob j , null, null); 
Console .WriteLine ( "Read field value: {0}", value); 



C/ieA M3n"b/iHeHne Ha nporpaMaTa no/iynaBaMe cnep,Hv\n pe3y/iTaT: 



D \Dim WC P i o jet H \Reflet tio n I in vot eMemm be i Demo \bi n\De b . . . HI"! EJ 



Before constructor called: x=10 

Created object type: InuokeMenberDemo .AssemblyType 

After constructor returns: x=15 

Read field value: 25 



A 



KaK pa6oTM npnMep"t>T? 

npuMeptT fleMOHCTpupa AHHaMMUHO cb3AaBaHe Ha MHCTaHuna ot Tun 

AssemblyType M npoHMTaHe Ha HerOBOTO no/ie mAssemblyField C nOMOLirra Ha 
MeTOfla Type. InvokeMember (... ) . 

B npuMepa e flecJDMHupaH K/iac AssemblyType, b komto MMa KOHcrpyKTop 

AssemblyType (ref int x) M int no/ie mAssemblyField. 

ritpBOHana/iHO b npuMepa no/iynaBaMe system. Type o6eKT, npeAcraBflm 

flec|DMHMpaHMfl OT Hac AssemblyType TMn. 

B npMMepa C nOMOLUTa Ha MeTOAa Type. InvokeMember (...) AHHaMMUHO M3BMK- 
BaMe KOHCTpyKTOpa AssemblyType (ref int x) Ha AeqOMHMpaHMfl OT HaCTMn. 

MeTOA"bT Type . InvokeMember (... ) ce M3BMKBa CbC C/ieAHMTe napaMeTpn, 3a Rd 

MO>Ke p,a ce CBtpxe c KOHcrpyKTopa Ha AssemblyType Tuna v\ p,a ro M3BMKa: 

- null - yi<a3Ba MMeTO Ha n/ieHa, komto MCKaMe p,a M3BMKaMe c noMOurra 

Ha MeTOAa Type. InvokeMember (...) . 

- bf | BindingFlags . Createlnstance - cfj/iarbT Createlnstance nOAaAeH 
Ha MeTOAa Type. InvokeMember (...) , nOCOUBa, ne Type . InvokeMember (... ) 

Tpa6Ba p,a ce CBtpwe v\ M3BMKa KOHCTpyKTop. napaMeTbptT bf yKa3Ba, 

4e KOHCTpyKTOptT, KOMTO MCKaMe P.5 M3BMKaMe, Tpfl6Ba Rd Ce TtpCM 
KaKTO Me>KAy ny6/lMHHMTe (BindingFlags. Public), TaKa M Me>KAy He- 
ny6/lMHHMTe (BindingFlags. Nonpublic) H/ieHOBe, KOMTO He ca CTaTMH- 
HM (BindingFlags . Instance). 



452 nporpaMnpaHe 3a .NET Framework (tom 2) 

- null - yKa3Ba TunoBeTe Ha napaMeTpMTe, komto Tpa6Ba fla noflafleM Ha 
KOHCTpyKTopa, komto MCKaMe fla M3BMKaMe c noMOurra Ha MeTOfla 

Type . InvokeMember (...) . 

- null - yKa3Ba o6eKTa, hmmto n/ieH i/iCKaMe fla M3BMKaMe c noMOurra Ha 

MeTOfla Type. InvokeMember (... ) . 

- args - cbfl"bp>Ka napaMeTpMTe, c komto Tpa6Ba fla ce M3BMKBa koh- 
CTpyKTopa Ha AssembiyType Tuna, M3BMKBaH c noMOiflTa Ha MeTOfla 

Type . InvokeMember (...) . 

- null - yKa3Ba Ky/iTypaTa, koato Tpa6Ba fla ce M3no/i3Ba npn CB"bp3Ba- 

He Ha KOHCTpyKTopa C MeTOfla Type. InvokeMember (...) . 

Pe3y/lTaTbT OT M3BMKBaHeTO Ha MeTOfla Type. InvokeMember (...) c noconeHMTe 
napaMeTpn e o6eKT ot AssembiyType Tun. TuntT Ha HOBOCb3fla,qeHMfl o6eKT, 

C/iefl M3BMKBaHe Ha MeTOfla Type. InvokeMember (...) ce OTnenaTBa Ha KOH30- 

naja. 

ripn M3BMKBaHe Ha KOHCTpyKTopa AssembiyType (ref int x) OT MeTOfla 
Type . InvokeMember (...) , ce MHMUMa/lM3Mpa nO/ieTO mAssemblyField, flecpMHM- 

paHO b Tuna AssembiyType m CTOMHOCTTa Ha noflafleHi/m apryMeHT Ha koh- 

CTpyKTOpa AssembiyType (ref int x) ce yBe/lMHaBa C 5. 

CTOMHOCTTa Ha apryMeHTa, noflafleH Ha KOHCTpyKTopa Ha AssembiyType Tuna, 

C/iefl M3BMKBaHeTO My OT MeTOfla Type. InvokeMember (...) , ce OTnenaTBa Ha 
KOH30^aTa. 

C/iefl KaTO CMe Cb3fla/1M 06eKT OT Tkin AssembiyType, BMKaMe nOBTOpHO 
MeTOfla Type . InvokeMember (... ) C ue/1 fla M3B/ieneM CTOMHOCTTa Ha HerOBOTO 
mAssemblyField no/ie. 

riapaMeTpnTe, komto noflaBaMe npn btopoto M3BMKBaHe Ha InvokeMember (...) , 
ca c^eflHMTe: 

- "mAssemblyField" - yKa3Ba MMeTO Ha nO/ieTO HMflTO CTOMHOCT MCKaMe 

fla nponeTeM. 

- bf I BindingFlags . GetField - yKa3Ba, ne MCKaMe fla nO/iyHMM 
CTOMHOCTTa Ha nO/ieTO mAssemblyField 

- null - yKa3Ba TMnoBeTe Ha napaMeTpMTe, komto Tpa6Ba fla noflafleM Ha 

MeTOfla, KOMTO MCKaMe fla M3BMKaMe C nOMOLflTa Ha InvokeMember (...) . 

- obj - cbfl"bp>Ka o6eKTa ot TMn AssembiyType, CTOMHOCTTa Ha 4MeTO no/ie 
MCKaMe fla nponeTeM. 

- null - yKa3Ba, napaMeTpMTe komto Tpa6Ba fla noflafleM Ha MeTOfla, 

KOMTO MCKaMe fla M3BMKaMe C nOMOlflTa Ha InvokeMember (...) . 

- null - yKa3Ba Ky/iTypaTa, koato Tpa6Ba fla ce M3no/i3Ba npM CBtp3BaHe 

Ha MeTOfla Type. InvokeMember (...) C TbpceHMfl H/ieH. 



T/iaBa 19. ChpaweHkie Ha TunoBeTe (Reflection) 453 

Pe3y/iTaTbT ot i/i3Bi/iKBaHeTO Ha Type. invokeMember(...) c ropenoconeHMTe 
napaMeTpn e crofiHOCTTa Ha no/ieTO mAssembiyFieid b AHHaMkinHO Cb3flafle- 
HM5i ot Hac o6eKT ot Tun AssembiyType. rio/iyneHaTa ctomhoct ce OTne^aTBa 
Ha KOH30/iaTa. 

Reflection Emit 

System. Reflection. Emit e npOCTpaHCTBO OT MMeHa, npeflOCTaBfllUO K/iaCOBe, 

c 4MATO noMOiu KOMni/i/iaTopw m npn^o>KeHMfl MoraT p,a cb3AaBaT hobm aceM- 
6/iMTa, TunoBe, MeTOAH h Aa reHepupaT AHHaMkinHO Microsoft Intermediate 
Language (MSIL) mhctpykumm. K/iacoBeTe ot TOBa npocTpaHCTBO HaMnpaT 
hd/iamo npi/i/io>KeHMe npn pa3pa6oTKa Ha KOMni/i/iaTopw v\ MHTepnpeTaTopn 3a 
CKpunTOBM e3Mun. C K/iacoBeTe ot TOBa npocTpaHCTBO MoraT p,a ce c"b3AaBaT 
ue/iw aceM6/ikiTa, p,a ce i/i3n"b/iH*iBaT v\ p,a ce 3ana3BaT Ha ahcio. 

kl3nosi3BaHe Ha Reflection Emit 

K/iaC0BeTe OT System. Reflection. Emit n03BO/lflBa C"b3AaBaHeTO, KaKTO Ha 

Ufl/io aceM6/ii/i, TaKa v\ Ha ojp,ei\uv\ HeroBM wopynw. Cb3AaBaHeTO Ha TunoBe b 
AaAeH MOAy/i, no BpeMe Ha ki3n"b/iHeHkie, AeqbuHnpaHeTO Ha MeTOAH, cb6nTHfl 
m CBOMCTBa ch>mo Ha/iara M3no/i3BaHeTO Ha K/iacoBeTe ot npocrpaHCTBOTO ot 

MMeHa System. Reflection. Emit. K/iaC0BeTe, npeAOCTaBfllUM Te3M B"b3MO>K- 

hoctm, ca: 

- AssemblyBuilder - K/iac, n03BO/lflBam AHHaMMUHO C"b3AaBaHe Ha 
aceM6/lkl. T03M K/iac e Hac/ieAHMK Ha K/iaca System. Assembly. flec|DMHM- 

paHMTe b Hero MeTOAH no3BO/iflBaT 3ape>KAaHe v\ cb3AaBaHe Ha wop,ynv\, 
AeqbuHnpaHe Ha pecypcn, KaKTO v\ 3anncBaHe Ha AHHaMkmHO cb3AaAeHO 

aceM6/lM B"bB qbai/i/1. C MeTOAa AssemblyBuilder. SetEntryPoint (...) ce 

3aAaBa BxoAHa touio 3a M3n"b/iHeHi/ie Ha AaAeHO aceM6/iw. 

- ModuieBuiider - K/iac, no3BO/iHBam AecJDMHupaHe m AHHaMMUHO c"b3Aa- 
BaHe Ha MOAynn 3a AaAeHO aceM6/iw. 

- TypeBuiider - K/iac, no3BO/i*iBam AecJDMHupaHe m AHHaMMUHO ct3AaBaHe 
Ha TunoBe. To3m K/iac e Hac/ieAHWK Ha K/iaca system. Type. flecJDMHupa- 
HMTe b Hero MeTOAH no3BO/iflBaT cb3AaBaHeTO Ha bcmukm BMAOBe n/ieHO- 
Be 3a AaAeH Tun. 

- ConstructorBuilder - K/iac, n03BO/lflBam AHHaMklUHO Cb3AaBaHe Ha 

KOHCTpyKTopn 3a AaAeH Tkin. To3m K/iac e HacneAHMK Ha K/iaca 

System. Constructorlnf o. 

- MethodBuilder - K/iaC, n03BO/lflBam AHHaMM4HO C"b3AaBaHe Ha MeTOAH 

3a AaAeH Tun v\ npeAOcraBflm MeTOAM v\ CBOMCTBa 3a pa6oTa c tax. To3m 

K/iac e Hac/ieAHklK Ha K/iaca System. Methodlnfo. 

- PropertyBuilder - K/iac, n03BO/lflBaiU AHHaMMUHO Cb3AaBaHe Ha CBOM- 
CTBa 3a AaAeH Tun v\ npeAOCTaBfliu MeTOAH h CBOMCTBa 3a pa6oTa c tax. 

T03M lOiace Hac/ieAHklK Ha K/iaca System. Property Info. 



454 nporpaMnpaHe 3a .NET Framework (tom 2) 

- EventBuiider - K/iac, no3BO^ABaiu flecpMHupaHeTO Ha cb6nTMfl 3a flafleH 
K/iac. 

reHepwpaHe Ha MSIL mhctpykumm 

flnHaMM4HOTO reHepwpaHe Ha MSIL mhctpykumm CTaBa c noMOLirra Ha K/iaca 

System. Reflection. Emit. ILGenerator. M3nO/13BaHeTO Ha T03M K/iac n03BO- 

nnBa no BpeMe Ha M3n"b/iHeHne Ha flafleHa nporpaMa fla ce flo6aB*iT MSIL 
mhctpykumm 3a flafleH MeTOfl v\i\v\ KOHcrpyKTop. K/iacbT ILGenerator npefloc- 
TaBfl MeTOAMTe Emit(...) m Emitcaii(...) 3a flo6aBHHe Ha noc/ieflOBaTe/iHOcr ot 
MSIL mhctpykumm. C noMOiuTa Ha flpyrw MeTOflki Ha to3m K/iac MoraT fla ce 
AeK/iapwpaT /ioi<a/iHi/i npoMeH/ikiBM v\ fla ce cb3,qaBaT 6/iOKOBe 3a npuxBaiuaHe 

Ha kl3K/lKDHeHI/lfl B flafleH MeTOfl. MeTOfl"bT EmitWriteLine (...) fl06aBfl HH" 

CTpyKUkin 3a OTne^aTBaHe Ha hm3 Ha KOH30/iaTa. 

K/iaC0BeTe MethodBuilder M ConstructorBuilder npeflOCTaBHT MeTOfl 
GetlLGenerator ( ) , KOMTO Bptlfla CbOTBeTHO ILGenerator 3a MeTOfl V\I\V\ 
KOHCTpyKTOp. 

flMHaMHHHO reHepnpaHe Ha aceM6/iw - npMMep 

B HacTOfliflMfl npuMep ce cb3flaBa aceM6/ii/i no BpeMe Ha ki3n"b/iHeHi/ie Ha 
nporpaMaTa. flecpMHupa ce MOfly/i, Tun v\ MeTOfl. Cb3flafleHOTO aceM6/iw ce 
3anncBa bbb cpai/i/i. C/ieflBamkisiT koa fleMOHcrpi/ipa KaK CTaBa TOBa: 



using System; 

using System. Reflection; 

using System. Reflection . Emit; 

class Ref lectionEmitDemo 

{ 

static void Main ( ) 

{ 

AssemblyName assemblyName = new AssemblyName () ; 
assemblyName . Name = "DynamicAssembly" ; 

// Create new assembly 
AssemblyBuilder newAssembly = 

AppDomain . CurrentDomain . Def ineDynamicAssembly ( 

assemblyName, AssemblyBuilderAccess . RunAndSave) ; 

// Create new module in the new assembly 

ModuleBuilder newModule = newAssembly . Def ineDynamicModule 
"NewModule", "EmitedAssembly.exe") ; 

// Create new type in the new module 
TypeBuilder newType = newModule . Def ineType ( 
"HelloWorldType", TypeAttributes . Public) ; 

// Create new method in the new type 



T/iaBa 19. ChpaweHkie Ha TunoBeTe (Reflection) 455 



MethodBuilder newMethod = newType . Def ineMethod ( 
"WriteHello", MethodAttributes . Static | 
MethodAttributes . Public, null, null); 

// Generate the MSIL code in the new method 
ILGenerator msilGen = newMethod. GetlLGenerator () ; 
msilGen . EmitWriteLine ( "Hello World! Today is " + 

DateTime .Now) ; 
msilGen . Emit (Opcodes .Ret) ; 

// Instantiate the new type 

Type helloWorldType = newType . CreateType () ; 

Object instance = Activator . Createlnstance (helloWorldType) 

// Run the method WriteHello from the new type 
Methodlnfo helloWorldMethod = 

helloWorldType . GetMethod ( "WriteHello" ) ; 
helloWorldMethod. Invoke (instance, null ) ; 

// Save the assembly to an executable file 
newAssembly . SetEntry Point (helloWorldMethod) ; 
newAssembly . Save ( "EmitedAssembly . exe" ) ; 



C/iefl M3n"b/iHeHne Ha npuMepa ce no/iynaBa cnep,Hv\5\T pe3y/iTaT: 



c\ "C:\MS Content and Cumculum\Presentations\ Lecture- 18-Refl 



iHello World! Today is 15.10.2005 r. 18:07:02 
Press any key to continue^ 



OnncaHne Ha npnMepa 

ritpBOHana/iHO b npnMepa ce cb3flaBa hobo aceM6/iw, c noMOiuTa Ha MeTOfla 

AppDomain. CurrentDomain . Def ineDynamicAssembly (...) . T03M MeTOfl npi/ieMa 

ABa napaMerbpa - MMeTO Ha aceM6/iMT0, KoeTO MCKaMe p,a cb3p,ap,eM, v\ qo/iar, 
yKa3Baiu, ne cb3flafleHOTO aceM6/ii/i Tpa6Ba fla MO>Ke p,a ce i/i3n"b/iH*iBa v\ 
3anncBa bbb qoaw/i. 

B HOBOCb3flafleHOTO aceM6/iw npe3 M3BMKBaHe Ha MeTOfla AssembiyBuiider. 

DefineDynamicModule(...) ce Cb3AaBa HOB MOp,yi\ C MMe 

EmitedAssembly.exe, C/ieA KOeTO K"bM Hero ce Cb3AaBa HOB ny6/lkmeH TMn 

HelloWorldType. Cb3AaAeHOTO b Haujufl npi/iMep aceM6/iw ce cbCTOM ot caMO 
eAMH MOAy/i. 



456 



flporpaMnpaHe 3a .NET Framework (tom 2) 



B Tuna HeiioWoridType ce cb3flaBa ny6/ikmeH craTkmeH MeTOfl writeHeiloO . 
ripn c"b3flaBaHeTO Ha MeTOfla ce no/iynaBa o6eKT ot Tun MethodBuiider, ot 

KOMTO Ce B3MMa 06eKT OTTMn ILGenerator 3a HOBOC"b3flafleHMfl MeTOfl. 

B MeTOfla WriteHeiloO ce reHepupa nocneflOBaTe/iHOcr ot MSIL mhctpykumm, 
koato nenaTa TeKCT Ha KOH30/iaTa. 

3a fla ce fleMOHcrpwpa, ne pa6oTM, HOBOC"b3flafleHMAT Tun ce MHCTaHuupa v\ My 
ce M3BMKBa MeTOfla WriteHeiloO , komto e flecpMHupaH KaTO craTkmeH. 

3a BxoflHa touio Ha reHepupaHOTO aceM6/iw ce 3aflaBa MeTOflvr WriteHeiloO 

M C/iefl TOBa aceM6/lklTO ce 3anMCBa B"bB Cpaw/1 EmitedAssembly.exe. 

ripoc/ieflyiBaHe Ha M3ni>siHeHiieTO Ha npMMepa 

3a npocneflHBaHe crbriKa no CTbnKa M3n"b/iHeHneTO Ha npuMepa, MOxeM fla 

M3nO/13BaMe npoeKTa Demo-5-ReflectionEmit OT fleMOHCTpaUMMTe. 

1. OTBapflMe npoeKTa Demo-5-ReflectionEmit.sln, KOMTO Cbfl"bp>Ka KOfla 
ot ropHMfl npuMep. 

2. C/iaraMe touio Ha npeicbCBaHe Ha noc/ieflHua pefl Ha Main() MeTOfla. 

3. CrapTkipaMe npw/io>KeHi/ieTO c [F5]. 



i Demo-5-RefLectionEmit - Microsoft Visual C# .NET [break] - RefLectionEmitDerno.es 



File Edit View Project Build Debug Tools Window Help 

l-l-E^BS » * B, "•"■|.^| y Debug 
B%fc-*«|*'*|11|/*?*J4*, I ► II ■ D 



t> 51 t = % Hex | ® • 



!#BJ-. 



RenectiDnEmitDemD.cs 



:â– >, 'â– :: :'.'<<'â– :: 



gtfReflectionEmitDemo 



~3 |s*Nain() 



3 >%- fa 



TypeBuilder neuType - newModule . DefineType ( 
"HeiioWoridType", Type Attributes . Public) ; 

// Create new method in the new type 
MethodBuiider ne wile t hod = newType . Def inellethod ( 

"WriteHello", Met hodAt tributes . Stat ic | Met hodAt tribute; 

null, null] ; 

// Generate the MSIL code 

ILGenerator msilGen = newMethod. GetlLGenerator ( ) ; 
rBsilC-en.EmitllriteLine ("Hello World! Today is " + DateTime.Ni 
msilGen. Emit (OpCodes . Ret 1 ; 

// Instantiate the new type 

Type helloWorldType = newType . CreateType [ ) ; 

Object instance - Activator . Create Instance (helloWorldType) ; T 

I 



[-: -=p Demo-5-ReflectionEmit 

.+: *tf Bases and Interfaces 
■-*♦ Main() 



*â–  | | LjjJ Solution Explorer 5ff Class View | 



? X | 



* X Task List - Build Error tasks shown (filtered) 1 X 



Value 



| Type 



Name 

El helloWorldType -["HelloWorldType"} System. T 

R newAssembly -[System. Reflection. Emit. AssemblyBuilder)- System, R 

- L±] SySterriiReflecti r .Assembly {System. i. Emit. Assembly/Builder} System. R 

CodeBase < men : >':e: y.nng 

EntryPoint ^undefined value > System. R 

[i, j . y. 'ijriN n.;';i ;.-:-r, . . I '/_" ;.irir.o 

□ J£3 Watch 1 I 



v Description 



Click here to add a new task 



I 



13 Task List | Ijj) Call Stack ijjp Breakpoints | 



Ready 



Ha KapTMHKaTa e noKa3aH H3Mea ot VS.NET b MOMeHT Ha ki3n"b/iHeHkie 
Ha npuMepa. 



T/iaBa 19. ChpaweHkie Ha TunoBeTe (Reflection) 457 

C/iefl KaTO CMe ki3n"b/n-m/in npuMepa OTMBaMe b flupeKTopnaTa Ha npoeK- 
Ta, OTBapyiMe noflflnpeKTopnaTa . \bin\Debug v\ Bki>KflaMe, ne e cb3fla,qeH 

cfjaki/1 C MMe EmitedAssembly.exe. 

CrapTkipaMe ot KOH30/iaTa EmitedAssembly.exe m no/iynaBaMe cnep,Hv\n 
pe3y/iTaT: 



4NT Prompt - C:\WINDOWS\system32\cmd.exe 



^Jnjx 



C:\>"\HS Content and Curriculum\Presentations\Le 

ctionEmit\bin\Debug\Emitedflssembly.exe" 

Hello World* Today is 15.10.2005 r. 18:07:02 

C:\>_ 



KaKTO ce Bi/i>Kfla, reHepupaHOTO aceM6/iw e Hant/iHO ctjyHKuwoHa/iHO 1/1 
Mcoxe fla ce ki3n"b/iHki KaKTO BceKM flpyr .exe ctjaw/i. 



Ynpa>KHeHii5i 

1. KaKBO e Global Assembly Cache? 3a KaKBO c/iy>Kki? 

2. OnwujeTe noHe eflMH HanwH 3a nper/ie>KflaHe Ha aceM6/ii/iTaTa ot Global 
Assembly Cache. 

3. fla ce pea/iki3kipa Windows Forms npw/io>KeHi/ie, KoeTO no3BO/i*iBa fla ce 
3ape>Kfla M36paHO ot noTpe6kiTe/ifl aceM6/iw v\ noKa3Ba MHctjopMauwfl 3a 
Hero (ntT ot icbfleTO e 3apefleHO, p,anv\ e 3apefleHO ot GAC, BxoflHaTa My 

TOUKa M T.H.). 

4. fla ce pea/i i/i3i/i pa koh30/iho npi/i/io>KeHkie, KoeTO 3ape>Kfla aceM6/iMTO 
mscoriib.dll m OTnenaTBa MMeHaTa Ha bcmukm TunoBe b Hero. 

5. fla ce pea/iki3kipa koh30/iho npw/io>KeHkie, KoeTO 3ape>Kfla aceM6/ikiTO 

mscoriib.dll M HaMkipa BCM4KM MeTOflM Ha Tl/ina System. DateTime, KOMTO 

e flecJDMHupaH b Hero. 

6. CtCTaBeTe Windows Forms npw/io>KeHi/ie, KoeTO 3ape>Kfla aceM6/ii/i, MMeTO 
Ha KoeTO ce M36npa ot noTpe6wTe/ifl, v\ ki3B/iwna ot Hero MMeHaTa v\ 
napaMeTpnTe Ha KOHCTpyKTopnTe Ha bcmuki/i TunoBe, flecJDMHupaHM b Hero. 

7. flec|DMHMpaMTe MHTepcfjeMC ICalculatable, KOMTO flecJDMHkipa MeTOfl double 

calculate (int[] ) . HanmueTe koh30/iho npn^OKeHne, KoeTO neTe ot 
TeKCTOB ($av\n peflnua ot nwcna, HaMupa bcm^km aceM6/ikiTa ot 3aflafleHa 

flkipeKTOpMfl, B KOMTO MMa MMn/ieMeHTaUklfl Ha ICalculatable M npe3 BCflKO 

ot tax M3BtpujBa npecMsiTaHeTO calculate (...) m OTne^aTBa pe3y/iTaTa. 
TecTBatiTe KaTO cb3flafleTe flBe aceM6/ii/iTa, b komto MMa Tun, 



458 nporpaMnpaHe 3a .NET Framework (tom 2) 

kiMn/ieMeHTkipam icalculatable. EflHOTO aceM6/iw Tpa6Ba fla M3Hkic/iflBa 
cpeflHO apwTMeTkmi-io, a flpyroTO cyMa Ha e/ieMeHTMTe ot noflafleHna MacuB. 

8. CbcraBeTe nporpaMa, koato nponi/iTa BtBefleHa TeKCTOBa noc/ieflOBaTe/i- 
hoct m c"b3flaBa aceM6/iw cwvbpwamo Tun, komto cbAtpwa MeTOfl OTnenaT- 
Baiu Ta3M TeKCTOBa noc/ieAOBaTe/mocr. TeHepupaHOTO aceM6/in Tpa6Ba p,a 
6"bfle ctxpaHeHO, KaTO i/i3n"b/iHHM cpaw/i. 

M3no/i3BaHa JiiuepaTypa 

1. V\Bav\j\o XpucTOB, OTpa>KeHne Ha TunoBeTe (Reflection) - http://www. 
nakov.com/dotnet/lectures/Lecture- 18-Reflection-vl.O.ppt 

2. Teoprn MBaHOB, OrpaweHkie Ha TunoBeTe (Reflection) - http://www. 
nakov.com/dotnet/2003/lectures/Reflection.doc 

3. Jeffrey Richter, Applied Microsoft .NET Framework Programming, Microsoft 
Press, 2002, ISBN 0735614229 

4. Jesse Liberty, Programming C#, 3rd Edition, O'Reilly, 2003, ISBN 
0596004893 

5. Professional C#, 3rd, Wrox Press, 2004, ISBN 0764557599 

6. MSDN Library - http://msdn.microsoft.com 



T/iaea 20. CepnajiM3aunfl 
Ha flaHHM 



ABTOp 

Pafloc^aB MBaHOB 

Heo6xoflMMM 3HaHMn 

- 5a30BM no3HaHM5q 3a .NET Framework, CLR (Common Language 
Runtime) v\ o6iuaTa cwcreMa ot TunoBe b .NET (Common Type System) 

- no3HaHMfl 3a e3MKa C# 

- no3HaHMfl 3a pa6oTa c noTOun ot ashhm 

- no3HaHMfl no OTpaxeHne Ha TunoBeTe (reflection) 

- no3HaHMfl 3a aTpn6yTMTe b .NET Framework 

- ri03HaHM5q 3a pa6oTa c XML b .NET Framework 

Cb/vbpwaHMe 

- KaKBO e cepna^M3aunfl? Kora v\ 3aiuo ce ki3no/i3Ba? 

- OopMaTepn (Formatters) 

- ripouecbT Ha cepna^M3aunfl 

- Cepna^M3aunfl v\ Aecepna/iM3au.nfl - npuMep 

- ripuMep 3a 6nHapHa cepna/iw3au.kifl 

- ripuMep 3a cepna^M3aunfl no MpexaTa 

- ripuMep 3a A"b^6oKO KonnpaHe Ha o6eKTM 

IDeserializationCallback 

- KoHTpo^npaHe Ha cepkia/iki3au.kiflTa. iserializable 

- XML cepkia/iM3au.M5q 

- KoHTpo^npaHe Ha m3xoahma XML 

B Ta3M TeMa ... 

B HacToamaTa TeMa me pa3r/ieAaMe cepna/iM3au.nflTa Ha ashhh b .NET 
Framework. IHe o6achmm KaKBO e cepi/ia/iM3au.Mfl, 3a KaKBO ce M3no/i3Ba v\ KaK 
Aa KOHTpo^npaMe npoueca Ha cepna/iM3au.nfl. IHe ce 3ano3HaeM c BMAOBeTe 
cJDopMaTepn (formatters). IHe o6*ichmm KaKBO e XML cepna/in3au.M5i, KaK 

pa60TM Tfl M KaK MO>KeM AS KOHTpO^MpaMe M3XOAHMA XML npM HeMHOTO ki3no/i- 

3BaHe. 



460 flporpaMnpaHe 3a .NET Framework (tom 2) 



Cepna/iM3ai4M5i 

B cbBpeMeHHOTO nporpaMnpaHe necro ce Ha/iara p,a ce cbxpaHki cbcroHHkieTO 
Ha flafleH o6eKT ot naMerra v\ fla ce B"b3craHOBi/i cnep, ki3Becmo BpeMe. ToBa 
no3BO/iflBa o6eKTMTe BpeMeHHO p,a ce cbxpaHABaT Ha TBtpAMfl ahck v\ p,a ce 
M3no/i3BaT cnep, BpeMe, KaKTO v\ p,a ce npeHacaT no MpewaTa v\ p,a ce B"b3cra- 
HOBABaT Ha OTAa/ieneHa MaiunHa. 

npo6^eMMTe npn cbxpaHeHneTO v\ B"b3craHOBflBaHeTO Ha o6eKTM ca mhoto m 3a 
cnpaBAHeTO c tax MMa pa3/innHw noAxoAH. 3a p,a ce HaMa/i*rr ycv\i\v\s\ja Ha 
pa3pa6oT4MUMTe b .NET Framework e M3rpaAeHa TexHO/iorwyi 3a aBTOMaTM- 
3aunfl Ha to3m npouec, HapeneHa cepna/iM3ai4iin. HeKa ce 3ano3HaeM no- 
noApo6HO c Hea. 

KaKBO e cepna/iM3aMnq (serialization)? 

Cepkia/iki3aukisiTa e npouec, komto npeo6pa3yBa o6eKT v\nv\ CB"bp3aH rpacp ot 
o6eKTM ao noTOK ot 6atiTOBe, KaTO 3ana3Ba cbcroyiHkieTO Ha HeroBMTe no/ieTa 
m CBOMCTBa. rioTOK"bT Moxe Aa 6"bAe ABOi/meH (binary) v\nv\ TeKCTOB (XML). 

KaKBO e flecepnann3aMnq (deserialization)? 

06paTHMAT npouec Ha cepi/ia/iki3aukiflTa e Aecepna^M3aunflTa. flecepna^M3a- 
UMATa e npoueca Ha npeo6pa3yBaHe Ha noTOK ot 6awTOBe o6paTHO ao o6eKT. 
flecepna^M3npaHMflT (B"b3craHOBeHki$iT) o6eKT 3ana3Ba cbCTOAHneTO Ha opurn- 

Ha/lHMfl 06eKT (CTOMHOCTMTe B nO/ieTaTa V\ CBOMCTBaTa cm). 

Kora ce M3no/i3Ba cepna/iM3aMnq? 

IHe pa3MeAaMe hakom ot Haw-necri/iTe npn^OKeHna Ha cepna^M3aunflTa v\ 
Aecepna^M3aunflTa. 

3ana3BaHe Ha cbcroflHMeTO Ha o6eKT 

Cepna^M3aunflTa ce M3no/i3Ba 3a cbxpaHeHwe Ha MHCpopMauna v\ 3ana3BaHe 
Ha cbCTOAHneTO Ha o6eKTM. M3no^3BaMKM cepna^M3aunfl, AaAeHa nporpaMa 
MO>Ke Aa ctxpaHM cbcroflHweTO cm B"bB cpaw/i, 6a3a ashhh v\i\v\ Apyr HOCkiTe/i v\ 
cnep, BpeMe Aa ro B"b3craHOBM o6paTHO. 

npeAaBaHe Ha o6eKT npe3 KOMyHMKaijMOHHa Mpe>Ka 

Cepwa/iM3aukiflTa MO>Ke Aa ce ki3no/i3Ba 3a npeAaBaHe Ha o6eKTM npe3 Mpe>xa. 
3a ue/iTa o6eKTbT ce cepi/ia/iM3kipa v\ ce TpaHcnopTupa npe3 MpexaTa, cnep, 
KoeTO ce Aecepna^M3npa, 3a Aa ce npecb3AaAe a6co/iK>THO cbiuna o6eKT, 
komto e 6m/i M3npaTeH. ripuMepHO npn^OKeHne Ha to3m mctoa e 3a npeAa- 
BaHe Ha AaHHM Me>KAy ABe nporpaMM. 



HnaBa 20. Cepna/iM3aunfl Ha flaHHM 461 

npMsio>KeHMe BiaTpeiiJHo b .NET Framework 

TexHO/iorwkiTe ot .NET Framework M3no/i3BaT BvrpeujHO cepkia/iM3aumi 3a 
HAKOM 3aAa4M, HanpuMep: 

- 3a 3ana3BaHe Ha cbcroflHweTO Ha ceci/mTa (t. Hap. "session state") b 
ASP.NET 

- 3a KonnpaHe Ha o6eKTM b clipboard b Windows Forms 

- 3a npeflaBaHe Ha o6eKTM no ctomhoct ot eflMH flOMei/iH Ha npw/io>KeHkie 
(application domain) b Apyr 

- 3a fl"b/i6oi<o KonnpaHe Ha o6eKTM (deep copy) 

- b TexHO/iori/iflTa 3a OTfla/ieneHO M3BMKBaHe .NET remoting 

flpym npM/io>KeHMfl 

Cnefl ioto eflMH o6eKT 6"bfle npeBtpHaT b noTOK ot 6ai/iTOBe, tom MO>xe fla 
6"bfle KpunTupaH, KOMnpecupaH v\nv\ o6pa6oTeH no flpyr HanwH b cbOTBeTCTBue 
c ue/iTa, koato CMe cm nocTaBM/iw. Te3M npouecu ca npo3panHki, T.e. He 3aBM- 
cat ot cepna^M3npaHMfl o6eKT. 06eKT"bT ce cepna/iM3npa v\ Hue o6pa6oTBaMe 
noTOKa ot 6awTOBe, 6e3 fla ce MHTepecyBaMe KaKBM ca CTpyKTypaTa v\ cbfltp- 
>KaHneTO Ha o6eKTa. TaKa cepna^M3aunflTa y/iecH^Ba o6pa6oTKaTa Ha o6eKTM 
noHexe no3BO/iHBa fla ce 3anmuaT b noTOK. 

3auio fla M3no/i3BaMe cepna/iM3aMnq? 

3ana3BaHeTO Ha eflMH o6eKT MO>Ke fla ce HanpaBM v\ ptuHO, 6e3 i/i3no/i3BaHeTO 
Ha cepi/ia/iM3auwfl. To3m noflxofl necro e TpyaoeMtK v\ npe,apa3no/iara kbm 
flonycKaHe Ha mhoto rpeujKM. npouecvr CTaBa no-cnoxeH, KoraTO ce Ha/iara 
fla 3ana3MM wepapxna ot o6eKTM. 

ripeflCTaBeTe cm, ne M3rpa>KflaTe 6n3Hec npn^OKeHne c 10 000 K/iaca v\ 
Tpa6Ba fla 3ana3MTe cnoxeH rpaifc ot HaB"bp3aHM eflMH c flpyr o6eKTM. ripefl- 
CTaBeTe cm KaK ce Ha/iara fla nuiueTe koa bbb BceKM K/iac, komto ce cnpaBfl c 
npoTOKO/iw, HecbBnafleHne Ha TunoBeTe npn K/ikieHT/cbpBtp, ynpaB/ieHkie Ha 
rpeujKM, o6eKTM conemi/i kbm flpyri/i o6eKTi/i (umk/imuho), pa6oTa etc crpyK- 
Typn, MacuBM m t.h. npw no-crapwTe n^aTCJDopMM ce pa6oTeiue TaKa, 3aiuoTO 
HAMaiue aBTOMaTM^Ha cepna^M3aunfl. 

CepMa/iM3auM$iTa b .NET e aBTOMaTMHHa 

Cepi/ia/iM3aui/mTa b .NET Framework npaBM ue/in*i T03M npouec no o6xo>Kfla- 
HeTO Ha rpac|Da, 3anonBam ot flafleH o6eKT v\ 3anncBaHeTO My b noTOK npo3- 
paneH m aBTOMaTM^eH. Ta hm flaBa yflo6eH MexaHM3"bM 3a pea/iki3kipaHeTO Ha 

TaKaBa (fcyHKUMOHa/lHOCT C MMHMMa/lHM yCM/lMfl. 

Cepna/iM3npaHe Ha umk/imhhm rpacpH ot o6eKTM 

C noMOiflTa Ha cepna/iM3aunflTa MO>KeM fla cepna/iM3npaMe umk/imuhi/i rpac|DM 
ot o6eKTM, T.e. o6eKTM, komto ce pecJDepupaT eflHM ot flpyrn. B o6iunfl c/iynaw 
cbxpaHABaHeTO v\ npeflaBaHeTO Ha TaKMBa crpyKTypw He e ziecHO, ho b .NET 



462 nporpaMnpaHe 3a .NET Framework (tom 2) 

Framework TOBa ce pea/iki3wpa ot CLR m rpn>KaTa He e Ha nporpaMkicra. 
OopMaTeptT cepkia/iki3kipa BceKM o6eKT caMO no BeflH"b>K v\ He B/iki3a b 
6e3KpaeH uwK"b/i (cpopMaTepnTe me o6cbAHM Ma/iKO no-HaTarbK b Ta3M TeMa). 

Kpan>K npiiMep 3a cepnann3aMnq? 

C/ieflBaiunflT cppameHT koa ki/uocrpi/ipa KaK MO>KeM fla cepna/iM3npaMe o6eKT 
m p,a ro 3anniueM b 6i/mapeH cpaw/i etc cpeAcmaTa Ha .NET Framework: 



string str = ".NET Framework"; 






BinaryFormatter f = new BinaryFormatter ( ) ; 






using (Stream s = new FileStream( "sample .bin", 

{ 

f . Serialize ( s, str) ; 

} 


FileMode 


Create) ) 







Ha irbpBkifl pefl e flecpMHupaH o6eKT"bT, komto me cepna/iM3npaMe. Tom MO>Ke 

Aa 6"bAe BCflKaiCbB Tkin - Int32, String, DateTime, Exception, Image, 
ArrayList, HashTable, nOTpe6wTe/lCKkl AecpMHMpaH K/iac M T.H. B c/iynaa CMe 
i/i3no/i3Ba/ii/i o6eKT ot Tkin string. 06eKTtT, komto me 6"bAe cepna/iM3npaH, 
Tpa6Ba Aa OTroBapa Ha cneukia/iHM M3MCKBaHMfl, komto me o6achmm no- 
HaTarbK b HacroflLuaTa TeMa. 

3a Aa cepna^M3npaMe o6eKT, Tpa6Ba Aa cb3AaAeM cpopMaTep (formatter). 
OopMaTeptT e cneuwa/ieH K/iac, komto MMn/ieMeHTwpa MHTepcpewca 
iFormatter. Tom M3BtpujBa ua/iaTa pa6oTa no cepna^M3npaHeTO v\ Aecepna- 
^M3npaHeTO Ha wepapxna (rpacp) ot o6eKTM v\ 3anncBaHeTO mm b noTOK. 
Cepna^M3npaHeTO ce M3B"bpujBa ot MeTOAa serialize (...) . KaTO ntpBM napa- 
MeTtp, to3m MeTOA onaKBa Hac^eAHMK Ha K/iaca system. 10. stream. ToBa e 
noTOKtT, b komto me ce cepna^M3npaT AaHHMTe, KoeTO 03HanaBa, ne o6eKTbT 

MO>Ke Aa ce cepna^M3npa B MemoryStream, FileStream, NetworkStream M T.H. 

FjTopi/iflT napaMeTtp Ha MeTOAa e o6eKTbT, komto me ce cepna^M3npa. 

rioTOK"bT, b komto me cepna/iw3kipaMe o6eKTa e AecpMHupaH Ha TpeTna peA b 
npuMepHMfl cpparMeHT koa. M3no/i3BaHaTa using KOHcrpyKui/m rapaHTupa 
3aTBapaHeTO Ha i/i3no/i3BaHMfl b Hea noTOK cneA npi/iK/iionBaHe Ha pa6oTaTa c 
Hero. 

Cepi/ia/ii/i3aui/mTa Ha o6eKTa ce M3B"bpujBa npe3 M3BMKBaHe Ha MeTOAa 

Serialize (...) . B npoueca Ha Cepkia/lkl3ai4klfl ce 06x0>KAaT (npe3 reflection) 

BCM4KM n/ieH-npoMeH/ii/iBi/i Ha o6eKTa v\ ce cepna^M3npaT caMO n/ieHOBeTe Ha 
MHCTaHUMATa, 6e3 CTaTM^HMTe v\ n/ieHOBe. BnAMMOCTTa Ha n/ieH-npoMeH/ii/maTa 
HflMa 3Ha4eHne - cepna/iw3kipaT ce Aopn private no/ieTaTa. 

OopMaTepn (Formatters) 

OopMaTepnTe cbAtpwaT ziori/iKaTa 3a 3anncBaHe Ha pe3y/iTaTa ot cepna/iw3a- 
UMATa b noTOK, T.e. pea/iM3i/ipaT cpopMaTupama ziorwKa. OopMaTeptT e K/iac, 

KOMTO MMn^eMeHTkipa MHTepcpeMCa IFormater. MeTOAt>T My Serialize (...) 



HnaBa 20. Cepna/iM3aunfl Ha aaHHi/i 



463 



npeo6pa3yBa o6eKTa ao noTOK ot 6ai/iTOBe. MeTOfltT Deserialize (...) neTe 
AaHHMTe ot noTOKa v\ npec"b3flaBa o6eKTa. 

OopMaTepnTe cbAtpwaT /iorm<aTa 3a cJDopMaTupaHe Ha cepkia/iki3wpaHHTe 
o6eKTM. CLR o6xo>Kfla MeTaflaHHMTe 3a n/ieH-npoMeH/iMBM v\ npe3 reflection 
n3B/iwna CTOMHOCTMTe mm. M3B/ieneHi/iTe CTOMHOCTMTe ce noAaBaT cnep, TOBa Ha 
c|DopMaTepa, 3a p,a vv\ 3anniue no noAxoA^iu HanwH b noTOKa. 

.NET Framework hm ocurypaBa ABa craHAapTHki c|DopMaTepa, AecJDMHupaHM b 

npoCTpaHCTBOTO System. Runtime. Serialization: 

- Binary-Formatter - cepna/iM3npa o6eKT b ABOkmeH c|DopMaT. rio/iyne- 
HMAT b pe3y/iTaT Ha cepna^M3aunflTa noTOK e mhoto KOMnaKTeH. 

- soapFormatter - cepkia/ii/i3kipa o6eKT b SOAP c|DopMaT. 3a pa3/ii/iKa ot 

ABOM4HMA CJDOpMaT, SOAP CJDOpMaTbT OCMTypflBa C"bBMeCTMMOCT C APyTM 

cm ere mm, 3aiuoTO npeACTaB^ABa XML-6a3npaH craHAapT 3a o6MAHa Ha 
c"bo6iueHMfl m e He3aBMCMM ot n/iaTc|3opMaTa. SOAP craHAapTbT me 
pa3r/ieAaMe b p,ejav\i\v\ b TeMaTa 3a ye6 yc/iym . 

MoxeM Aa cb3AaBaMe noTpe6nTe/iCKM Aec|3MHMpaHM cJDopMaTepn. Te HacneAfl- 
BaT a6crpaKTHkifl K/iac Formatter, ocurypflBaiu 6a30Ba c|DyHKUkiOHa/iHOCT. 



npouecbT Ha cepnann3npaHe 

Ha cJDnrypaTa cxeMaTi/mHO e noKa3aHO KaK pa6oTHT npouecnTe Ha cepna- 
^M3npaHe m Aecepna^M3npaHe b .NET Framework: 



[Serial izable] 
class DataClass 

i 

string Name = "The name is Data Class" 

string text = "Some Data"; 

[Non Serialized] string No = NonSerisI": 

int ID = 34980357; 

public void Method 1 (){...} 

public int Getl_ength{ get{...} set{..} } 



I 



"AssemblyName. 

Vers ion= 1 .0. 1 809 36302 , 

Cjltjre=neLJtral, 

Publ i cKeyToken =n ull" 

"DataClass" 

"The name is Data Class" 

"Some Data" 

34980357 



[Serial i table] 
class DataClass 

{ 

string Name = "The name is Data Class" 
string tBxt = "Soma Data"; 
[NonSerialized] string No = null; 
int ID = 34980357; 

public void Method 1 CM-,} 

public int GetLength{ get{..,} set{..} } 




} 



"AssemblyName, 
Versions. 0.1 809 36302, 
Culture=neijtral, 
Publ i cKeyToken =n ull" 

"DataClass" 

"The n-ame is Data Class" 

"Some Data" 

34980357 



464 nporpaMnpaHe 3a .NET Framework (tom 2) 

ripn cepna^M3npaHeTO Ha o6eKTa b noTOKa ce 3anncBaT MMeTO Ha K/iaca, MMe- 
to Ha aceM6/ii/iTO (assembly) v\ Apyra MHCpopMauna 3a o6eKTa, KaKTO v\ bcmukm 
n/ieH-npoMeH/ikiBki, komto He ca MapKupaHM KaTO [Nonseriaiized] (ynoTpe- 
6aTa Ha to3m aTpn6yT me o6achmm no-HaTarbK b Ta3M TeMa). ripn Aecepwa/iw- 
3aunflTa MHCpopMaunflTa ce neTe ot noTOKa v\ ce npecb3AaBa o6eKTbT. 

KparbK npMMep 3a cepnann3aiJiMq 

HacTOflLUkiflT npuMep ki/uocrpi/ipa cepna^M3npaHeTO Ha o6eKTM, KaTO ce o6p"b- 
iua BHMMaHne Ha hakom M3MCKBaHMfl, Ha komto Tpa6Ba fla OTroBapa cepwa/iM- 
3i/ipaHi/mT o6eKT: 



using System. 10; 

using System. Runtime .Serialization. Formatters . Binary; 

[Serializable] 
class FirstExample 

{ 

public int mNumber; 

[NonSerialized] public int mid; 

public string mName; 
} 

class Serializer 

{ 

public void Serialize () 

{ 

FirstExample obj = new FirstExample () ; 
BinaryFormatter f = new BinaryFormatter ( ) ; 
using (Stream stream = new FileStream( 
"x.bin", FileMode. Create) ) 

{ 

f . Serialize ( stream, ob j ) ; 

} 
} 

public void Deserialize ( ) { . . . } 



KaK pa6oTM npnMepi>T? 

HeKa pa3r/ieAaMe K/iaca FirstExample, komto CMe AecpMHupa^n b npuMepa. 
06tpHeTe BHMMaHne Ha aTpn6yTa [serializable], HaMnpaiu ce npeAH AecpH- 
HMunflTa Ha K/iaca. ripi/i/io>KeH kbm AaAeH Tun, to3m aTpn6yT yKa3Ba, ne 
MHCTaHUMMTe Ha Tuna MoraT p,a 6"bAaT cepkia/iki3wpaHki. ripn onuT 3a cepwa/iki- 
3npaHe Ha o6eKT, hmmto Tkin HflMa aTpn6yTa [Serializable] CLR npeAH3- 
BMKBa M3K/lK)neHMe OT Tkin SerializationException. flOITb/lHklTe/lHO yC/10- 

Bue, 3a ycneujHaTa cepna^M3aunfl Ha o6eKT e, ne bcmukm TunoBe Ha n/ieH- 
npoMeH^MBMTe Ha o6eKTa, komto me 6"bAaT cepkia/iki3wpaHki, Tpa6Ba chuxo p,a 

npMTexaBaT aTpn6yTa [Serializable] . 



HnaBa 20. Cepna/iM3aumi Ha flaHHM 465 

06"bpHeTe BHMMaHne Ha aTpn6yTa [Nonseriaiized] , HaMnpaiu ce npefl fleK- 
ziapaukiflTa Ha npoMeH/iMBaTa mid b K/iaca FirstExampie. Hpe3 to3m aTpn6yT 
yKa3BaMe, ne cbOTBeTHMAT n/ieH Ha K/iaca He Tpa6Ba fla 6"bfle cepna^M3npaH. 
npn4MHMTe fla He cepna^M3npaMe hhkom ot n/ieHOBeTe Ha K/iac ca pa3/iMHHM - 
Te MO>Ke fla cbfltpaoT ceKpeTHa MHCJDopMauMfl, koato He Tpa6Ba fla 6"bfle ctx- 
paHABaHa v\nv\ fla c"bfl"bp>KaT flaHHM, komto He ca hy>khm npn npecb3,qaBaHeTO 
Ha o6eKTa. 

Cepna^M3aunfl Ha o6eKT ot flecJDMHupaHMfl K/iac FirstExampie, me M3BtpujMM 

B"bB CJDyHKUMflTa Serialize () Ha K/iaca Serializer. l~l"bpBO flec|DMHMpaMe 

o6eKTa, komto me cepna^M3npaMe. C/iefl TOBa cb3flaBaMe c|DopMaTep, komto 
me M3B"bpujn pa6oTaTa no cepna^M3aunflTa Ha o6eKTa. B npuMepa CMe M3no/i- 

3Ba/lM CJDOpMaTep OT TMn Binary-Formatter, KOMTO e H/ieH Ha npOCTpaHCTBOTO 
System. Runtime. Serialization. Formatters .Binary. C/iefl C"b3flaBaHeTO Ha 

c|DopMaTepa, cb3flaBaMe noTOKa, b komto me 6"bfle cepMa/iM3MpaH o6eKTa - b 

npMMepa CMe M3nO/13Ba/lM FileStream. M3n0^3BaHaTa using KOHCTpyKUMfl 

rapaHTMpa 3aTBapaHeTO Ha M3no/i3BaHM*i b Hea noTOK cnep, npMK/uonBaHe Ha 
pa6oTaTa c Hero. HaKpaa M3BMKBaMe c|DyHKUMflTa serialize (...) Ha c|DopMaTepa 
m o6eKTa ce cepMa/iM3Mpa. 

Kpan>K npMMep 3a flecepna/iM3auiMq 

B to3m npMMep me M/uocrpMpaMe KaK npoTMna flecepMa/iM3auMHTa Ha o6eKTM: 



using System. 10; 

using System. Runtime .Serialization. Formatters . Binary; 

[Serializable] 
class FirstExampie 

{ 

public int mNumber; 

[NonSerialized] public int mid; 

public string mName; 
} 

class Serializer 

{ 

public void Serialize (){...} 

public void Deserialize ( ) 

{ 

BinaryFormatter f = new BinaryFormatter ( ) ; 
using (Stream stream = new FileStream( 
"x.bin", FileMode.Open) ) 

{ 

FirstExampie fe = (FirstExampie) 
f. Deserialize ( stream) ; 
} 
} 



466 flporpaMnpaHe 3a .NET Framework (tom 2) 



KaK pa6oTM npnMepi>T? 

To3M npuMep e /lorwuHO npoAt>/i>KeHi/ie Ha npeflxoAHna npuMep 3a cepwa/iM- 

3ai4Mfl. B Hero me pa3r/ieAaMe MeTOAa Deserialize () Ha K/iaca Serializer, 
koato 6eiue nponycHaTa b npeAHWHMfl npuMep. 

B Hana/iOTO Ha cpyHKUMHTa Deserialize o ct3AaBaMe cpopMaTepa, komto me 
Aecepna^M3Mpa 06eKTa. OTHOBO M3nO/13BaMe Binary-Formatter, noHexe 
TaKtB Tun cpopMaTep CMe ki3no/i3Ba/iw npn cepna^M3npaHeTO Ha o6eKTa b 
npeAMUJHMfl npuMep. C/ieA TOBa cb3AaBaMe noTOKa, ot komto me Aecepwa/iki- 
3npaMe o6eKTa. HaKpaa M3BMKBaMe cpyHKunaTa Deserialize (...) Ha cpopMaTe- 
pa, koato Bptiua KaTO pe3y^TaT Aecepna^M3npaHMfl o6eKT. BptiuaHMflT Tun ot 

CpyHKUMflTa Deserialize (...) e System. Object, 3aTOBa npeAH Aa npMCBOMM 

pe3y/iTaTa Ha npoMeH/ikiBa ot Tun FirstExampie, Tpa6Ba Aa ro npeo6pa3yBa- 

Me K"bM T03M Tkin. 

EiiHapHa cepna/iM3auiMq - npuMep 

me npeACTaBMM oiue eAMH npuMep 3a cepkia/iki3auwfl v\ Aecepna^M3aumi Ha 

AaHHM 4pe3 BinaryFormatter : 



using System; 

using System. 10; 

using System. Runtime . Serialization; 

using System. Runtime .Serialization. Formatters . Binary; 

[Serializable] 
class Animal 

{ 

private string mDescription; 
[NonSerialized] private int mSpeed; 

public string Description 

{ 

get 

{ 

return mDescription; 

} 
set 

{ 

mDescription = value; 

} 
} 

public int Speed 

{ 

get 



HnaBa 20. Cepna/iM3aumi Ha flam-m 467 



{ 

return mSpeed; 

} 
set 

{ 

mSpeed = value; 

} 
} 
} 

class SerializeToFileDemo 

{ 

static void Deserialization ( ) 

{ 

Animal animal 1 = new Animal () ; 

animall . Description = "One pretty chicken"; 

animal 1 . Speed = 3; 

Animal animal2 = new Animal ( ) ; 
animal2 . Description = "Buggs bunny"; 
animal2 .Speed = 1000; 

IFormatter formatter = new BinaryFormatter () ; 
Stream stream = 

new FileStream ( "data . bin" , FileMode . Create) ; 
using (stream) 

{ 

formatter . Serialize ( stream, animall ) ; 

formatter . Serialize ( stream, animal2 ) ; 
} 
} 

static void DoDeserialization ( ) 

{ 

IFormatter formatter = new BinaryFormatter () ; 

Stream stream = new FileStream ( "data . bin" , FileMode . Open) 

using (stream) 

{ 

Animal animall = (Animal) formatter . Deserialize ( stream) 
Console .WriteLine (" (Description : {0}, Speed: {1})", 
animall . Description, animall . Speed) ; 

Animal animal2 = (Animal) formatter . Deserialize ( stream) 
Console .WriteLine (" (Description : {0}, Speed: {1})", 
animal2 . Description, animal2 . Speed) ; 
} 
} 

static void Main ( ) 
{ 



468 flporpaMnpaHe 3a .NET Framework (tom 2) 



Console . WriteLine 


"Performing 


serialization. ") ; 


DoSerialization ( ) ; 






Console .WriteLine 


"Done.\n") ; 




Console .WriteLine 


"Performing 


deserialization. ") ; 


DoDeserialization 


); 




Console .WriteLine 
} 
} 


"Done.\n") ; 





CneA M3n"b/iHeHne Ha npuMepa, ce no/iynaBa cnep,Hv\9\T pe3y/iTaT: 



f\ "C:\MS Content and Cumculum\PPT\ -Lecture- 19-Serialieai 



Performing serialization. 
Done. 



Performing deserialization. 

(Description: One pretty chicken, Speed: 0) 

(Description: Buggs bunny, Speed: 0) 

Done. 



Jnjxj 



Press any key to continue 



UL 



T 



A/a 



KaK pa6oTM npnMep"t>T? 

B Hana/iOTO Ha npuMepa flecpMHupaMe K/iaca Animal. ATpn6yrbT 
[seriaiizabe] yKa3Ba, ne MHCTaHUMMTe My MoraT fla 6"bflaT cepna^M3npaHM. 
H/ieH-npoMeH/ikiBaTa mspeed e MapKupaHa c aTpn6yTa [Nonseriaiized] , 
nopaAM KoeTO He ce cepi/ia/in3npa. 

K/iaCbT SerializeToFileDemo Cbfl"bp>Ka CpyHKUMMTe DoSerialization ( ) M 
DoDeserialization () , KOMTO M3B"bpLUBaT pa6oTaTa no cepna^M3aunflTa M 
Aecepna^M3aunflTa Ha o6eKTMTe. 

OyHKUMflTa DoSerialization () Cb3flaBa RBe MHCTaHUMM Ha K/iaca Animal, 

npucBOABa ctomhoctm Ha no/ieTaTa mm m vv\ cepna^M3npa nocneAOBaTe/iHO b 

ABOMHeH CpaM/1, KaTO 3a ue/lTa M3nO/13Ba CpOpMaTep OTTMn Binary-Formatter. 

OyHKUMflTa DoDeserialization () AecepMa/lM3Mpa cepMa/lM3MpaHMTe MHCTaH- 
UMM m crmenaTBa no/ieTaTa mm. 

ripM CTapTMpaHe Ha nporpaMaTa ce M3BMKBa MeTOAa Deserialization () m 
cnefl TOBa DoDeserialization o , npM KoeTO CTOMHOCTMTe Ha no/ieTaTa Ha 
cepMa^M3MpaHMTe o6eKTM ce OTnenaTBaT Ha eKpaHa. 3a6e/ie>KeTe, ne 
CTOMHOCTTa Ha no/ieTO speed ce ry6M, 3aiuoTO He ce cepMa/iM3Mpa 3apaAM 

aTpM6yTa [NonSerialized] , KOMTO CMe M3nO/13Ba/lM B K/iaca Animal. 



HnaBa 20. Cepna/iM3aumi Ha flaHHM 469 

Cepna/iM3aMnq no Mpe>KaTa - npiiMep 

C HacTOfliunfl npuMep me OHaMeflHM KaK MO>KeM fla cepna^M3npaMe fltpBO- 
BMAHa CTpyKTypa ot ashhh c Binary-Formatter m fla a npeineceM Ha flpyr 
KOMnKiTtp npe3 TCP/IP Mpexa. 

B npuMepa me npeHacflMe >kmbothm (nHCTaHunn Ha K/iaca Animal). npi/iMepvr 
ce cbcroM ot Tpn npoeKTa - ki3npaman Ha flaHHM (Animaisender), no/iynaTe/i 
Ha flaHHM (AnimaiReceiver) m 6n6/inoTeKa 3a TunoBeTe, onucBaiflu >kmbot- 

HMTe (AnimalLibrary) . Mo>KeM fla TM Cb3flafleM B"bB VS.NET KaTO Tpn OTfle/lHkl 

npoeKTa b eflHO v\ cbu\o peiueHne (Solution) v\i\v\ KaTO 2 peujeHna: eflHOTO, 

Cbfltp>KaiUO AnimalSender M AnimalLibrary, a flpyrOTO - AnimaiReceiver M 
AnimalLibrary. B nOC/ieflHklfl C/iynaM Lfle HMaMe B"b3MO>KHOCT fla OTBOpMM M fla 

fle6"brBaMe eflHOBpeMeHHO npn^OKeHMATa 3a M3npaiuaHe v\ 3a npneMaHe Ha 
>kmbothm b OTfle/iHM MHCTaHUMM Ha VS.NET KaTO o6maTa 4aCT Me>Kfly TAX 
(6kl6/ll/IOTeKaTa AnimalLibrary) HflMa fla ce KOnupa flBa n"bTH. 

En6/iMOTeKaTa c TwnoBe 

Bn6^noTeKaTa c TunoBeTe, onucBaiun >kmbothmt6, e o6iua 3a ki3npamana n 3a 
no/iynaTe/i*i. Bcmukm TunoBe b 6n6/iwoTeKaTa ca OT6e/iH3aHki c aTpn6yTa 
[seriaiizabie] , 3a fla ce no3BO/ii/i npw Hy>Kfla fla 6"bflaT cepkia/ii/i3kipaHki ot 
CLR. B Hea ca flecJDMHupaHM Tpn Tuna - Eye, claws v\ Animal: 



Eye . cs 



using System; 

namespace AnimalLibrary 

{ 

[Seriaiizabie] 
public class Eye 

{ 

private string mDescription; 
private double mDioptre; 

public Eye (string aDescription, double aDioptre) 

{ 

mDescription = aDescription; 

mDioptre = aDioptre; 
} 

public override string ToString ( ) 

{ 

string result = String . Format ("({ } , {1})", 

mDescription, mDioptre); 
return result; 
} 
} 
} 



470 nporpaMnpaHe 3a .NET Framework (tom 2) 

K/iaCbT Eye Cbfl"bp>Ka flBe H/ieH-npOMeH/lMBM - mDescription M mDioptre, 

komto ce MHMuna^M3MpaT ot KOHCTpyKTopa Ha K/iaca. B K/iaca e npeflecpMHM- 
paH MeTOAa TostringO, komto Bptma CMMBO/ieH hm3, onucBaiu cbAtpwai-me- 
to Ha o6eKT ot to3m Tun. 



Claws . cs 



using System; 

namespace AnimalLibrary 

{ 

[Serializable] 
public class Claws 

{ 

public string mDescription; 

public Claws (string aDescription) 

{ 

mDescription = aDescription; 

} 

public string Description 

{ 

get 

{ 

return mDescription; 

} 
} 

public override string ToString ( ) 

{ 

return mDescription; 

} 
} 



} 



K/iaCbT Claws Cbfl"bp>Ka eflHa H/ieH-npOMeH/lklBa - mDescription, KOflTO ce 

MHMuna^M3Mpa ot KOHCTpyKTopa Ha K/iaca. flecpMHupaHO e cbomctboto 
Description, KoeTO e caMO 3a neTeHe v\ Bptiua croi/iHOCTTa Ha n/ieH-npoMeH- 

ZlMBaTa mDescription. B K/iaca e npeAecpMHkipaH MeTOA"bT ToStringO, KOMTO 

Bptiua CMMBO^eH hm3, onwcBam cbA"bp>KaHMeTO Ha o6eKT ot to3m Tun. 



Animal . cs 



using System; 
using System. Text; 

namespace AnimalLibrary 
{ 



HnaBa 20. Cepna/iM3aumi Ha flam-m 471 



[Serializable] 
public class Animal 

{ 

private string mName; 
private Claws mClaws; 
private Eye[] mEyes; 

public string Name 

{ 

get 

{ 

return mName; 

} 

set 

{ 

mName = value; 

} 
} 

public Claws Claws 

{ 

get 

{ 

return mClaws; 

} 

set 

{ 

mClaws = value; 

} 
} 

public Eye[] Eyes 

{ 

get 

{ 

return mEyes; 

} 

set 

{ 

mEyes = value; 

} 
} 

public override string ToString ( ) 

{ 

StringBuilder sbEyes = new StringBuilder ( " "); 
foreach (Eye eye in mEyes) 



472 flporpaMnpaHe 3a .NET Framework (tom 2) 



{ 

sbEyes .Append (eye) ; 
sbEyes .Append ( " "); 

} 

string eyesAsString = sbEyes . ToString () ; 

string result = 

String. Format (" (Name: {0}, Claws: {1}, Eyes: {2})", 

mName, mClaws, eyesAsString); 
return result; 



} 
} 



K/iaCbT Animal CbA"bp>Ka Tpn H/ieH-npOMeH/lMBM - mName OT Tkin string, 
mClaws OT Tkin Claws M mEyes, KOflTO e MaCMB OT Tkin Eye. B K/iaca ca 

flecpMHupaHM CBOMCTBa 3a AOCTbn flo H/ieH-npoMeH^MBMTe m e npeflecpMHupaH 
MeTOAa TostringO, komto Bptma CMMBO/ieH hm3, onwcBam ctAtpxaHneTO Ha 

06eKT OT T03I/I Tun. 

3a mo e Hy>KHa 6n6/inoTeKaTa c TMnoeeTe? 

Bn6^noTeKaTa c TunoBeTe e Hy>KHa 3a fla MoraT M3npaman"bT v\ no/iynaTe/iflT 
Aa pa6oTAT c ep,v\u v\ cbux, o6iu v\ 3a ABaMaTa, Tun, komto p,a npexBtp/i^T npe3 
Mpe>KaTa. To3m Tun e npenoptuwTe/iHO Aa ce HaMupa b o6luo 3a ABeTe npw/io- 
>KeHMfl aceM6/iw. He ce npenoptuBa i/i3npaman"bT v\ no/iynaTe/iflT caMM Aa cm 
AecpMHupaT Tuna, komto ce npexBtp/ifl. 

BcbiuHOCT nocneAHOTO TexHkinecKki e B"b3MO>KHO (ot r/ieAHa touio Ha Mexa- 
HM3MMTe 3a cepna/iw3aui/m Ha .NET Framework), ho caMO aKO K/iacbT, komto 
ce cepkia/iki3wpa v\ npn M3npamana v\ npn no/iynaTe/isi e c eAHO v\ cbiuo MMe, 
ot eAMH m cbiu namespace m e AecpMHupaH b aceM6/iw etc cna6o MMe, KoeTO v\ 
npn M3npamana, n npn no/iynaTe/i*i MMa eAHO v\ cbiuo vw\e v\ Bepci/m. 




npenop-bHMTe/iHO e KoraTO ce cepna/in3MpaT flai-n-m m ABeTe 
CTpaHM (cepna/iM3npaLi40TO npmio>KeHMe v\ flecepna/in3npa- 
moTO npn/io>KeHMe) fla pa6oT«T c eflMH v\ o»m Tun, T.e. fla 
no/i3BaT 061140 aceM6/in, b KoeTO e flecpm-mpaH to3m Tun. 



npM/io>KeHMeTO-M3npaii4aH Ha AammTe 

Eto KaK M3Me>KAa cope koa^t Ha npi/i/io>KeHkieTO, KoeTO M3npaiua MHCTaHunn 
Ha K/iaca Animal no MpeaoTa kbm APyroTO npki/io>KeHkie, KoeTO vv\ no/iynaBa: 



Animal Sender . cs 



using System; 

using System. Net . Sockets; 

using System. Runtime . Serialization; 



HnaBa 20. Cepna/iM3aumi Ha flaHHM 473 



using System. Runtime .Serialization. Formatters . Binary; 
using AnimalLibrary; 

class AnimalSender 

{ 

const string SERVER_HOSTNAME = "localhost"; 
const int SERVER_PORT = 10000; 

static void Main ( ) 

{ 

Animal animal = new Animal ( ) ; 

animal. Name = "My fluffy cat"; 

animal. Claws = new Claws ("Sharp beautiful claws") ; 

animal. Eyes = new Eye[] 

{ 

new Eye ("Left eye", 1.05), 

new Eye ("Right eye", 0.95) 
}; 

TcpClient tcpClient = 

new TcpClient (SERVER_HOSTNAME, SERVER_PORT) ; 
try 

{ 

IFormatter formatter = new BinaryFormatter ( ) ; 
NetworkStream stream = tcpClient . GetStream () ; 
using (stream) 

{ 

formatter . Serialize ( stream, animal ) ; 

} 

Console .WriteLine ( "Sent animal: {0}", animal); 

} 
finally 

{ 

tcpClient . Close ( ) ; 

} 
} 
} 



npi/i/ic»Kei-iMeTO-M3npaman cb3AaBa i/ih era hums Ha K/iaca Animal, AecJDMHupaH 
b 6n6/inoTeKaTa AnimalLibrary m MHMu,na^M3Mpa HeMHMTe no/ieTaTa. C/iefl 
TOBa OTBapa TCP cokst kbm nonynajenn (npe3 K/iaca TcpClient), cepwa/iM- 
3npa MHCTaHUMATa v\ a M3npaiua no coKeTa. CnwTa ce, ne no/iynaTe/iHT cnywa 
Ha nopT 10 000 Ha /ioi<a/iHaTa MaiunHa (localhost). 

npmio>KeHiieTo-no/iyHaTe/i Ha ABHHMTe 

HeKa cera pa3r/ieflaMe v\ npw/io>KeHkieTO, KoeTO nocpeiua cepkia/iki3wpaHHTe 
AaHHM m vv\ Aecepna^M3npa v\ M3no/i3Ba: 



474 flporpaMnpaHe 3a .NET Framework (tom 2) 



AnimalReceiver . cs 



using System. Net . Sockets; 

using System. Runtime . Serialization; 

using System. Runtime .Serialization. Formatters . Binary; 

using AnimalLibrary; 

class AnimalReceiver 

{ 

const int SERVER_PORT = 10000; 

static void Main ( ) 

{ 

TcpListener tcpListener = 

new TcpListener (IPAddress .Any, SERVER_PORT) ; 
tcpListener . Start () ; 
Console . WriteLine ( "Server started. " ) ; 

while (true) 

{ 

TcpClient client = tcpListener . AcceptTcpClient () ; 
try 

{ 

IFormatter formatter = new BinaryFormatter ( ) ; 
NetworkStream stream = client . GetStream () ; 
using (stream) 

{ 

Animal animal = 

(Animal ) formatter . Deserialize ( stream) ; 
Console .WriteLine ( "Received animal: {0}", animal); 
} 
} 
finally 

{ 

client . Close ( ) ; 

} 
} 
} 
} 



npki/ic»KeHkieTO-no/iynaTe/i OTBapa CbpBtpcKM TCP coKeT (Ha nopT 10 000 Ha 
ziOKa/iHaTa MaiunHa) v\ naKa 3a 3aaBKM ot K/iweHTa. ToBa ce M3B"bpujBa c 
noMOiuTa Ha MHcraHui/m Ha K/iaca TcpListener, nweTO npeflHa3HaneHkie e fla 
cnywa 3a Bp"b3KM ot TCP K/iweHTM. ripn npucTuraHe Ha 3aaBKa ot K/iweHTa, 
npw/io>KeHkieTO nponi/iTa M3npaTeHMTe ot K/iweHTa flaHHM v\ ce onuTBa fla vv\ 
flecepna^M3npa b MHcraHui/m Ha K/iaca Animal. Cnefl flecepna^M3aunflTa, 
cbfltpxaHneTO Ha o6eKTa ce M3Be>Kfla b KOH30/iaTa. 



HnaBa 20. Cepna/iM3aunfl Ha aaHHi/i 



475 



npocsieAflBaHe Ha npimepa c VS.NET 

3a fla npoc^eflMM KaK ce ki3n"b/iH*iBa npuMeptT, MO>KeM fla cb3flafleM flBe 
peiueHMfl (Solutions) c VS.NET v\ p.a vv\ crapTwpaMe. 

1. CrapTMpaMe VS.NET V\ Cb3AaBaMe peiueHMeTO AnimalReceiver . sin, 

KoeTO me npeAcraB/iflBa ctpBtpa (ki3npamana Ha ashhh). B Hero Cb3- 

flaBaMe npoeKTMTe AnimalReceiver. csproj kl AnimalLibrary . csproj M 

KonnpaMe b tax cbOTBeTHi/ia mm cope koa. CrapTi/ipaMe ctpBtpa c 

[Ctrl-F5] . 

2. CrapTkipaMe HOBa MHCTaHuna Ha VS.NET v\ no Cbiuna Hani/m Cb3flaBaMe 
peujeHneTO-K^neHT Animaisender.sin, KoeTO me nocpema M3npaTeHMTe 
AaHHM. B Hero c"b3AaBaMe npoeicra Animal sender, csproj m Ao6aBAMe 
Bene cb3AaAeHi/isi npoeKT AnimalLibrary. csproj. KonwpaMe B npoeKTa 

Animal Sender, csproj COpc KOAa OT HerOBMTe K/iacOBe. CrapTkipaMe 

K^neHTa c [ctri-F5] m Ha6^K>AaBaMe npexBtp/uiHeTO Ha ashhu. 

ripn CTapTupaHeTO Ha npw/io>KeHi/ieTO-no/iynaTe/i, b KOH30/iaTa ce M3nncBa 
"server started.". C/ieA CTapTupaHeTO Ha npi/i/io>KeHi/ieTO-ki3npaLuan b He- 
roBaTa KOH30/ia ce no/iynaBa cj\ep,uv\s\T pe3y/iTaT: 



oa "C:\MS Content and Curriculum\PPT\-Lecture-19-5erialization\Demo-2-Net 



Sent animal: (Name : My fluffy cat. Claws : Sharp beautiful claus. Eyes 
e, 1,05> (Right eye, 0,95) > 
Press any key to continue 



^]n]x] 



(Left eyQ 



Ako ce BtpHeM b npo3opeu.a Ha npw/io>KeHkieTO-no/iynaTe/i, me bmamm, ne to e 
no/iyni/i/io npaBki/iHO i/i3npaTeHi/m ot npn^o>KeHMeTO-M3npaiua4 o6eKT ot K/iaca 

Animal: 



C:\MS Content and Curriculum\PPT\-Lecture-19-5erialization\Demo-2-NetworkSerialization\A~ 



^Jnj*] 



Seruer started. 

Received animal: (Name: My fluffy cat, Claus: Sharp beautiful claus. Eyes: (Lef 

t eye, 1,05) (Right eye, 0,95) > 



/Vi>/i6oko KonnpaHe Ha o6eKTM - npuMep 

HacTOfliuMflT npuMep M/uocTpwpa KaK motom p,a pea/iM3kipaMe At/i6oKO Konn- 
paHe (deep copy) Ha o6eKT, M3no^3BaMKM cepna/iki3au.kifl. fl"b/i6oKOTO Konnpa- 
He He caMO cb3AaBa pecJDepeHUMa, ho m K/iOHkipa bcmuki/i n/ieH-npoMeH/ikiBM Ha 
T03M 06eKT M BCM4KM n/ieH-npoMeH/iwBM Ha n/ieH-npoMeH/iMBkue Ha o6eKTa M 
t.h. peKypcuBHO, 3a Aa HsiMaT ABaTa o6eKTa hmto eAHa o6iua pecJDepeHuna. no 
npuHunn c"b3AaBaHeTO Ha A"b/i6oKO Konne e HeTpwBkia/ieH npo6/ieM, ho peiua- 
BaHeTO My npe3 cepna/iki3au.kifl e ziecHo: 



using System; 
using System. 10; 



476 flporpaMnpaHe 3a .NET Framework (tom 2) 



using System. Text; 

using System. Runtime . Serialization; 

using System. Runtime .Serialization. Formatters . Binary; 

[Serializable] 
class SomeClass 

{ 

public StringBuilder mSomeStringBuilder; 

public string mSomeString; 

public object mSomeObject; 

public int mSomelnt; 

public SomeClass mSomeClass; 
} 

class DeepCopyDemo 

{ 

static void Main ( ) 

{ 

SomeClass original = new SomeClass (); 

original .mSomeString = "As cbm o6wKHOBeHO CTpHHrie. "; 
original .mSomeStringBuilder = new StringBuilder ( 
"3amo to3m Twn Me 3aHMMaBa c tha rjiynocTM? ! " ) ; 
original .mSomeObj ect = new object (); 
original .mSomelnt = 12345; 
original .mSomeClass = original; 

SomeClass copy = 

(SomeClass) DeepCopyDemo . DeepCopy (original ) ; 

Console . WriteLine ( "copy .mSomeString={ } " , 

copy .mSomeString ); 
Console .WriteLine ( "copy .mSomeStringBuilder={ } " , 

copy .mSomeStringBuilder ) ; 
Console .WriteLine ( "copy .mSomeOb j ect={ } " , 

copy .mSomeObj ect ) ; 
Console .WriteLine ( "copy .mSomeInt={ } \n" , copy .mSomelnt ) 

Console .WriteLine ( "copy .mSomeClass == copy ? {0}\n", 
Ob j ect . ReferenceEquals (copy .mSomeClass, copy) ); 

Console .WriteLine ( "copy .mSomeClass == original ? {0}\n", 
Ob j ect . ReferenceEquals (copy .mSomeClass, original) ); 

Console .WriteLine ( "Identical instances? {0}", 

Ob j ect . ReferenceEquals (copy, original) ) ; 
Console .WriteLine ( "Equal mSomeString? {0}", 

copy .mSomeString == original .mSomeString) ; 
Console .WriteLine ( "Equal mSomeString by reference? {0}", 

Ob j ect . ReferenceEquals (copy .mSomeString, 

original .mSomeString) ) ; 



HnaBa 20. Cepna/iM3aumi Ha flaHHM 477 



Console .WriteLine ( "Equal mSomeStringBuilder? {0}", 

copy .mSomeStringBuilder == original .mSomeStringBuilder ) 
Console .WriteLine ( 

"Equal mSomeStringBuilder .ToString () ? {0}", 

copy .mSomeStringBuilder . ToString ( ) == 

original .mSomeStringBuilder . ToString ( ) ) ; 
Console. WriteLine ( "Equal mSomeObject? {0}", 

copy .mSomeOb j ect == original .mSomeObj ect ) ; 
Console. WriteLine ( "Equal mSomelnt? {0}", 

copy .mSomelnt == original .mSomelnt ) ; 



} 



public static object DeepCopy (ob j ect aSourceOb j ect ) 

{ 

IFormatter formatter = new BinaryFormatter ( ) ; 

formatter . Context = 

new StreamingContext (StreamingContextStates . Clone) ; 

Stream memStream = new MemoryStream ( ) ; 

formatter .Serialize (memStream, aSourceOb j ect) ; 

memStream. Position = 0; 

object resultObject = formatter . Deserialize (memStream) 

return resultObject; 
} 



} 



KaK pa6oTM npnMepi>T? 

B Hana/iOTO Ha npuMepa flecJDMHupaMe K/iaca someciass, komto e cepna/iM3n- 
pyeM m cbAtpwa hako/iko n/ieH-npoMeH/ii/iBki ot pa3/iwnHki TunoBe, bk/ikdum- 
Te/iHO m eAHa n/ieH-npoMeH/ikiBa ot co6cTBeHMfl cm Tun someciass (MMaMe 
peKypcuBHO AecJDMHupaH K/iac). B npuMepa me HanpaBMM A"b/i6oKO Konne Ha 

06eKT OT T03M K/iac 

B Hana/iOTO Ha c|DyHKUMflTa Main() c"b3AaBaMe o6eKT ot Tun someciass v\ 
MHMuna^M3MpaMe n/ieH-npoMeH/ikiBMTe My etc ctomhoctm. 3a6e/ie>KeTe, ne 
4/ieH-npoMeH^MBaTa msomeciass ctAtpxa pec|DepeHUMfl io>m caMi/m o6eKT. 

Cnep, i/iHkmna/iM3npaHeTO Ha H/ieH-npoMeH/ikiBkiTe cb3AaBaMe Konwe Ha o6eK- 
Ta, KaTO M3BMKBaMe (fcyHKUMHTa DeepCopy (... ) Ha K/iaca. Tn cb3AaBa At/i6oKO 
Konne Ha noAaAeHi/m ioto napaMeTbp o6eKT v\ Bptiua TOBa Konne KaTO pe3y/i- 
TaT ot M3BMKBaHeTO cm. 3a Aa 6"bAe cb3AaAeHO KonneTO, o6eKT"bT ce cepwa/iw- 
3npa b noTOK b naMerra (Memory-stream) m cnep, TOBa ce Aecepwa/in3i/ipa b 
HOBa MHCTaHunfl. H/ieH-npoMeH/iMBMTe b Aecepna^M3npaHOTO Konwe ce cb3Aa- 
BaT npaBki/iHO, noHewe cepna^M3npaiuMflT MexaHM3"bM Ha CLR o6xo>KAa bcmh- 
km n/ieH-npoMeH/iMBM v\ vv\ cepkia/iw3wpa. 

C/ieA KaTO CMe Cb3p,anw At>/i6oKO Konwe, M3Be>KAaMe cbAtpaoHkieTO Ha n/ieH- 
npoMeH/ikiBMTe My v\ npoBepaBaMe aoko/iko HOBono/iyneHkiflT o6eKT e touho 
Konne Ha opi/irwHa/i"bT. Pe3y/iTaTi/iTe ot npoBepKMTe cbu\o ce M3Be>KAaT b 

KOH30^aTa. 



478 nporpaMnpaHe 3a .NET Framework (tom 2) 

C/iefl M3n"b^HeHne Ha npuMepa, ce no/iynaBa cneRHwnj pe3y/iTaT: 



ci "C:\MS Content and Curriculum\PPT\-Lecture-19-Seriali2ation\Demo-3-DeepCopy\bin\DebuQ\... I I 



copy .mSomeString=H , 3 cbM o6hkhob6ho CTpHHrne. 

copy .mSomeStringBuilder=3aiuo T03H Tun Me 3aHHMaea c tma rnynocTH?! 

copy . mSomeObject=System . Object 

copy . mSomeInt=12345 

copy .mSomeClass == copy ? True 

Identical instances? False 

Equal mSomeString? True 

Equal mSomeString by reference? False 

Equal mSomeStringBuilder? False 

Equal mSomeStringBuilder. ToStringf )? True 

Equal mSomeObject? False 

Equal mSomelnt? True 

Press any key to continue^ 



Pe3y/iTarbT noKa3Ba, ne opnrwHa/i"bT v\ KonneTO, KaKTO v\ bcmukm TexHM 
cbCTaBHM nacm cpM3M4ecKM ca pa3no/io>KeHki Ha pa3^M4HM Mecra b naMeTTa. 
Te HAMaT o6lum pecpepeHunn, T.e. pea/iki3wpa/iki CMe At>/i6oKO KonnpaHe Ha 
o6eKTa. 



IDeserializationCallback 

Cepkia/iki3au.kiflTa ce ocbiuecTBABa ziecHO, KoraTO cepna^M3npaMe o6eKTM, 
komto He 3aBMCAT ot Apyrw o6eKTM. B pea/iHOcrra necro o6eKTMTe ce 
cepna^M3npaT 3aeflHO, ioto hhkoi/i ot tax 3aBncaT ot APyrnTe. ToBa e 
npo6/ieM, noHe>Ke npn flecepna^M3aunflTa He e onpefle/ieH pefltT, b komto ce 
B"b3craHOBHBaT o6eKTMTe. B cnynai/iTe, KoraTO ce Ha/iara fla 3HaeM Kora e 
3aB"bpujw/ia Aecepna^M3aunflTa, 3a p,a M3B"bpujMM AOirb/iHi/iTe/iHi/i AewcTBHH 
Btpxy Aecepna^M3npaHMfl o6eKT, MO>KeM fla MMn/ieMeHTkipaMe MHTepcpewca 

IDeserializationCallback. 

MHTepcpeMCbT IDeserializationCallback Cbfl"bp>Ka eflMH MeTOfl, KOMTO Tpfl6- 

Ba p,a MMn/ieMeHTi/ipaMe - onDeseriaiization(...) . CLR M3n"b^HABa T03M Me- 
toa cneA nt/iHaTa Aecepi/ia/iM3au.i/m Ha o6eKTa. B MOMeHTa Ha M3n"b/iHeHne Ha 
MeTOAa e curypHO, ne bcm^km n/ieH-npoMeH/ikiBM ca Bene Aecepna/iki3kipaHw. 

IDeserializationCallback - npMMep 

B HacTOfliuMfl npuMep me 6"bAe OHar/ieAeHO M3no/i3BaHeTO Ha MHTepcpewca 

IDeserializationCallback 3a M3B"bpilJBaHe Ha AeMCTBMfl C/ieA Aecepwa/1M3M- 

paHeTO Ha AaAeH o6eKT: 



using System; 

using System. 10; 

using System. Runtime . Serialization; 

using System. Runtime .Serialization. Formatters . Binary; 



HnaBa 20. Cepna/iM3aumi Ha flam-m 479 



namespace Demo_4_IDeserializationCallback 

{ 

[Serializable] 

class Circle //: IDeserializationCallback 

{ 

private double mRadius; 

[NonSerialized] 
private double mPerimeter; 

[NonSerialized] 
private double mArea; 

public Circle (double aRadius) 

{ 

mRadius = aRadius; 

InitlnternalState ( ) ; 
} 

private void InitlnternalState ( ) 

{ 

mPerimeter = 2 * Math. PI * mRadius; 

mArea = Math. PI * mRadius * mRadius; 
} 
/* 

void IDeserializationCallback . OnDeserialization ( 

object aSender) 

{ 

InitlnternalState ( ) ; 

} 
*/ 

public override string ToString ( ) 

{ 

string result= String . Format ( 

"Radius: {0}, Perimeter: {1}, Area: {2}", 
mRadius, mPerimeter, mArea); 
return result; 
} 
} 

class IDeserializationCallbackDemo 

{ 

static void Main ( ) 

{ 

Circle circle = new Circle (3.0); 

Console .WriteLine ( "Original circle: {0}", circle); 

IFormatter formatter = new BinaryFormatter ( ) ; 
Stream stream = new MemoryStream ( ) ; 



480 



flporpaMnpaHe 3a .NET Framework (tom 2) 



formatter . Serialize ( stream, circle) ; 
stream. Position = 0; 
Circle newCircle = 

(Circle) formatter .Deserialize ( stream) ; 

Console .WriteLine ( "New circle: {0}", newCircle) 



} 



npocneAflBaHe Ha npMMepa 

Ako cera crapTkipaMe npuMepa, me no/iynwM cnep,Hwn pe3y/iTaT: 



^jnjx] 



oa "C:\MS Content and Curriculum\PPT\-Lecture-19-Serialization\Demo-4-IDeserializatio 



Original circle: Radius: 3, Perimeter: 18,8495559215388, flrea: 28,2743338823081 
New circle: Radius: 3, Perimeter: 0, Area: 
Press any key to continue 



Tpa6Ba p,a o6tpHeM BHMMaHne Ha TOBa, ne no/ieTaTa 3a /lkiue v\ napaMeTbp ce 
ry6siT, 3aiuoTO ce cepwa/iki3kipa v\ Aecepna^M3npa caMO paflnyctT. 

HeKa cera npeMaxineM KOMeHTapnTe ot 3arpafleHMfl c tax koa m M3n"b/iHkiM ot- 
hobo npuMepa. To3m ntT flecepna^M3npaHMflT o6eKT e KopeKTHO B"b3CTaHOBeH: 



ca "C:\MS Content and Curriculum\PPT\-Lecture-19-Serialization\Demo-4-IDeserializati 



Original circle: Radius: 3, Perimeter: 18,8495559215388, Area: 28,2743338823081 \ 
New circle: Radius: 3, Perimeter: 18,8495559215388, Area: 28,2743338823081 
Press any key to continue 



KaK pa6oTM npnMepi>T? 

K/iacbT circle onucBa reoMeTpwuHaTa cpurypa "Kptr", kohto MO>Ke p,a ce 
cepna/ii/i3npa KaTO ce ctxpaHM caMO paAnycbT Ha Kptra. OcraHa/ikiTe no/ieTa 
ca cpyHKUMM Ha to3m paflnyc m He e Heo6xoflMMO fla ce cbxpaHABaT, 3aTOBa ca 

MapKkipaHM C aTpn6yTa [NonSerialized] . 

ripn flecepna^M3npaHeTO Ha o6eKTa e Heo6xoflMMO bcm^km xapaKTepucTMKn 
(no/ieTa) Ha Kptra p,a 6"bAaT B"b3craHOBeHM. ToBa me 6"bfle M3B"bpiueHO ot Me- 

TOAa IDeserializationCallback.OnDeserialization(...) , KOMTO ce M3BMKBa 

ot CLR, cnefl KaTO o6eKT"bT e cb3flafleH munno. 

B npuMepa ce cb3AaBa o6eKT ot Tkin circle c onpeAe/ieH paAnyc. 06eKTbT ce 
cepkia/iki3kipa, cnefl KoeTO ce flecepwa/iki3kipa v\ cbfltpaoHkieTO My ce OTnenaT- 
Ba b KOH30^aTa. 

ripn irbpBOTO M3n"b^HeHne Ha npuMepa, koabt CB"bp3aH c kiMn/ieMeHTaukiATa Ha 

MHTepcpewca IDeserializationCallback e B KOMeHTapn, nopaAH KOeTO He ce 

M3BMKBa cpyHKUMATa, B"b3CTaHOBflBama no/ieTaTa, komto He ce cepna/iM3npaT. 



HnaBa 20. Cepna/iM3aunfl Ha flaHHM 481 

ToBa e npn^MHaTa no/ieTaTa 3a nv\u,e v\ paflnyc fla ce ry6*iT npn flecepkia/iM3a- 
UMATa. 

C/iefl KaTO npeMaxHeM KOMeHTapnTe oko/io KOfla, CB"bp3aH c kiMn/ieMeHTauwATa 

Ha MHTepc|DeMCa IDeserializationCallback M kl3ITb/lHklM OTHOBO npMMepa, 

BM>KAaMe, ne no/ieTaTa, komto He ca 6m/im cepkia/ii/i3kipaHki ca B"b3craHOBeHki 
KopeKTHO npn flecepna^M3aunflTa. Cnep, ioto cepi/ia/iki3kipaHi/iTe npoMeH/iMBM 
ca 6m/im B"b3craHOBeHki v\ o6eKTbT e 61/1/1 v\3u,nno Cb3flafleH, e M3n"b/iHeH MeTO- 
fl"bT IDeserializationCallback. OnDeserialization (...) , C KOeTO ca npeM3- 

nwc/ieHM nwuejo m napaMeTbpa Ha Kptra. 

ISerializable m KOHTpo/mpaHe Ha cepnajiM3auiMaTa 

MMa cnynai/i, b komto ce Ha/iara fla KOHTpo/iwpaMe HanwHa, no komto ce 
cepna^M3npaT o6eKTMTe. HanpuMep MO>Ke fla MCKaMe fla HaMa/ii/iM o6eMa Ha 
ctxpaHeHaTa MHCJDopMauMfl 3a o6eKTa, oco6eHO, aKO flaHHMTe ce 3anncBaT bbb 
cJDaM/i . 3a fla npeflecJDMHupaMe aBTOMaTi/mHaTa cepv\anv\3au,v\f\, Tpa6Ba fla mm- 
n^eMeHTupaMe MHTepc|DeMca ISerializable, flecJDMHupaH b npocTpaHCTBOTO 

System. Runtime . Serialization. 

MMn/ieMeHTwpaMKM MHTepc|DeMca ISerializable, Tpa6Ba fla npeflocraBMM pe- 
a/iki3au,Mfl Ha MeTOfla GetobjectData(...) , KaKTO m Ha cneuwa/ieH kohctpyktop, 
komto me 6"bfle M3no/i3BaH, KoraTO o6eKT"bT ce flecepi/ia/iki3kipa. Te npneMaT 
eflHM m cbiflu napaMeTpn - MHCTaHuna Ha K/iaca seriaiizationinfo v\ mh- 

CTaHUMfl Ha CTpyKTypa OTTkin StreamingContext. 

MeTOAtT GetObjectData(SerializationInfo, StreamingContext) 

ripn cepna^M3aunflTa Ha o6eKT ot K/iac, 1/iMn/ieMeHTnpam MHTepc|DeMca 

ISerializable, CJDOpMaTeptT M3BMKBa CJDyHKUMflTa GetObjectData (...) . Ilo/ie- 
TaTa, KOMTO Lfle 6"bflaT cepna/lM3npaHI/l, ce fl06aBflT B Seriaiizationinfo 

o6eKTa, noflafleH KaTO napaMeTbp Ha ifcyHKui/mTa. ToBa CTaBa c noMOurra Ha 
MeTOfla Addvalue ( ... ) Ha T03i/i o6eKT, komto flo6aBfl no/ieTaTa KaTO abomkm 
MMe/cTOMHOCT. 3a MMe MO>Ke fla 6"bfle i/i3no/i3BaH npow3BO/ieH TeKCT. 

Ako HaujuflT K/iac e HacnefleH ot 6a30B K/iac, komto i/iMn/ieMeHTwpa MHTep- 

CJDekica ISerializable, Tpfl6Ba fla M3BMKaMe base. GetObjectData (info, 

context), 3a fla no3BO/ii/iM Ha 6a30BMfl o6eKT fla cepi/ia/in3npa CBOMTe no/ieTa. 

KoHCTpyKTopiaT .ctor(SerializationInfo, StreamingContext) 

no BpeMe Ha flecepna/iw3aui/iflTa npe3 to3m cneuwa/ieH KOHCTpyKTop Ha K/iaca 
ce noflaBa seriaiizationinfo o6eKT. 3a fla B"b3CTaHOBMM ctCTOflHueTO Ha 
cepkia/iki3wpaHMfl o6eKT, Tpa6Ba fla i/i3B/ieneM CTOMHOCTMTe Ha no/ieTaTa My ot 
seriaiizationinfo o6eKTa. ToBa CTaBa npe3 MMeHaTa, komto CMe M3no/i3Ba- 
nv\ npn cepna^M3aunflTa Ha no/ieTaTa. Ako K/iacbT hm HacneflHBa K/iac, 
MMn/ieMeHTMpam MHTepc|DeMca ISerializable, Tpa6Ba M3BMKaMe 6a30BMAT 

KOHCTpyKTOp, 3a fla n03BO/lMM Ha 6a30BMfl 06eKT fla B"b3CTaHOBM CBOMTe 

no/ieTa. 



482 flporpaMnpaHe 3a .NET Framework (tom 2) 




He Tpn6Ba fla 3a6paB«Me fla uMn/ieMeHTtipaMe to3m koh- 
crpyKTop, 3au40TO KOMnmia-rop-bT HiiMa ksk fla hm 3afli>si>KM 
fla ro HanpaBMM. Ako 3a6paBMM fla MMn/ieMeHTMpaMe koh- 
CTpyKTopa, no BpeMe Ha flecepna/in3npaHeTO Ha o6eKTa me 
6i>fle xBi>p/ieHO M3K/iK>HeHMe. 



M3B/lMHaHeT0 Ha CTOMHOCT OT Serializationlnf o 06eKT CTaBa npe3 noAaBa- 

HeTO Ha MMeTO, acounnpaHO etc crowHOCTTa, Ha eflkm ot Getxxx(.) MeTOfli/ue 
Ha serializationlnf o, KtfleTO xxx ce 3aMeHfl c Tuna Ha CTOMHOcrra, koato 

LUe 6"bfle l/l3B/ieneHa - HanpMMep GetString(...) , GetDouble(...) M flp. 

KoHTpo/iMpaHe Ha cepna/in3aiJimiTa - npiiMep 

HacTOfliunflT npuMep ki/uocTpwpa Har/ieAHO, KaK MOxeM fla KOHTpo/iwpaMe 
cepi/ia/iki3auki*iTa, MMn^eMeHTupawKn MHTepcpewca ISerializable: 



using System; 

using System. Runtime . Serialization; 

[Serializable] 

class Person : ISerializable 

{ 

private string mName; 
private int mAge; 

private Person (Serializationlnf o alnfo, 
StreamingContext aContext) 

{ 

mName = ( string) alnfo . GetString ( "Person ' s name"); 

mAge = alnfo . Getlnt32 ( "Person ' s age"); 
} 

void ISerializable. GetOb j ectData (Serializationlnfo 
alnfo, StreamingContext aContext) 

{ 

alnfo.AddValue ("Person's name", mName); 
alnfo.AddValue ("Person's age", mAge); 
} 
} 



KaK pa6oTM npnMep"t>T? 

B npuMepa flecpMHupaMe K/iaca Person, komto e cepna^M3npyeM v\ cbfltpwa 
flBe 4/ieH-npoMeH^MBM - mName m mAge, 4MMT0 ctomhoctm me 3ana3kiM ripn 
cepna^M3aunflTa. K/iacvr kiMn/ieMeHTkipa MHTepcpewca ISerializable, KoeTO 
03Ha4aBa, ne me npeflocraBi/i co6cTBeHa cepna/iM3aunfl Ha no/ieTaTa cm. 

Tpa6Ba fla MapKupaMe Haujua K/iac c aTpn6yTa [serializable], BtnpeKM ne 
MMn^eMeHTupaMe MHTepcpewca ISerializable. Be3 to3m aTpn6yT CLR He 
C4MTa, ne MHCTaHUMMTe Ha K/iaca MoraT fla 6"bflaT cepkia/in3npaHM. 



HnaBa 20. Cepna/iM3aumi Ha flaHHM 483 

HaujuflT K/iac wMn/ieMeHTkipa MHTepc|DeMca iseriaiizabie, 3aTOBa npeflocra- 
BflMe pea^M3au,Mfl Ha MeTOfla GetobjectData(...) v\ Ha KOHcrpyKTopa, komto 
me ce M3BMKa npn flecepkia/iki3auwflTa. 

B MeTOfla GetobjectData(...) flo6aBAMe CTOMHOCTMTe Ha flBeTe no/ieTa Ha K/ia- 

ca B Serializationlnfo 06eKTa. TOBa CTaBa npe3 MeTOfla AddValue(...) , Ha 

komto noflaBaMe MMeTO, KoeTO me acounnpaMe etc croi/iHOCTTa Ha npoMeH/iw- 
BaTa m caMaTa npoMeH/ikiBa. ToBa MMe me 6tfle M3no/i3BaHO npn flecepwa/iM- 
3aunflTa 3a ki3B/ikmaHe Ha crowHOCTTa Ha npoMeH/ikiBaTa. 

B KOHcrpyKTopa Ha K/iaca ki3B/ikmaMe CTOMHOCTMTe Ha npoMeH/iMBMTe ot 
serializationlnfo o6eKTa. 3a ue/iTa M3no/i3BaMe MMeHaTa, komto CMe aco- 
Unnpa^M etc CTOMHOCTMTe no BpeMe Ha cepkia/iw3auwflTa mm. npaBM Bne- 
naT/ieHkie, ne b npuMepa KOHCTpyKTopvr 3a flecepkia/iM3aui/m e fleK/iapwpaH 
KaTO private, ho TOBa He e rpeujKa, 3aiuoTO CLR MO>xe fla M3BMKBa flopn 

HaCTHM KOHCTpyKTOpM. 

KoHCTpyKToptT m MeTOfltT Getob jectData (...) npweMaT KaTO BTopn napaMeTtp 
streamingcontext o6eKT, yKa3Baiu Ktfle ce cepi/ia/iki3kipa o6eKT"bT. Ha 
streamingcontext CTpyKTypaTa me ce cnpeM no-HaTaT"bK b Ta3M TeMa. 

PiaHHa cepMa/iM3auMfl c ISerializable - npMMep 

IHe npeflCTaBMM oiue eflMH npuMep 3a ptuHO cepna/iM3npaHe Ha o6eKTM b 
.NET Framework npe3 MMn/ieMeHTauwfl Ha MHTepc|DeMca iseriaiizabie: 



using System; 

using System. 10; 

using System. Runtime . Serialization; 

using System. Runtime .Serialization. Formatters . Soap; 

namespace Demo_5_ISerializable 

{ 

[Serializable] 
public class Person : ISerializable 

{ 

protected int mAge; 
protected string mName; 

public Person ( string aName, int aAge) 

{ 

mName = aName ; 

mAge = aAge; 
} 

protected Person (Serializationlnfo alnfo, 
Streamingcontext aContext) 

{ 

mName = alnfo . GetString ( "Person ' s name"); 

mAge = alnfo . Getlnt32 ( "Person ' s age"); 
} 



484 flporpaMnpaHe 3a .NET Framework (tom 2) 



public virtual void GetOb j ectData (Serializationlnf o alnfo, 
StreamingContext aContext) 

{ 

alnfo.AddValue ("Person's name", mName); 

alnfo.AddValue ("Person's age", mAge); 
} 
} 

[Serializable] 

sealed class Employee : Person 

{ 

private string mJobPosition; 

public Employee ( string aName, int aAge, 

string aJobPosition) : base (aName, aAge) 

{ 

mJobPosition = aJobPosition; 

} 

private Employee (Serializationlnf o alnfo, 

StreamingContext aContext) : base (alnfo, aContext) 

{ 

mJobPosition = alnfo . GetString ( "Employee ' s job"); 

} 

public override void GetObj ectData (Serializationlnf o alnfo, 
StreamingContext aContext) 

{ 

base . GetObj ectData (alnfo, aContext) ; 

alnfo .AddValue ( "Employee ' s job", mJobPosition); 
} 

public override string ToString ( ) 

{ 

string value = String . Format ( 

"(Name: {0}, Age: {1}, Job: {2})", 
mName, mAge, mJobPosition) ; 
return value; 
} 
} 

class ISerializableDemo 

{ 

static void Main ( ) 

{ 

Employee employee = new Employee ( "Jeff rey Richter", 

45, "CEO") ; 
Console .WriteLine ( "Employee = {0}", employee); 
FileStream empoyeeFile = new FileStream ( "employee . xml" , 



HnaBa 20. Cepna/iM3aumi Ha flaHHM 485 



FileMode. Create) ; 
using (empoyeeFile) 

{ 

IFormatter formatter = new SoapFormatter ( ) ; 
formatter .Serialize (empoyeeFile, employee) ; 
Console . WriteLine ( "Employee serialized. " ) ; 

empoyeeFile . Seek ( 0, S eekOri gin . Begin) ; 
Employee deserializedEmployee = 

(Employee) formatter .Deserialize (empoyeeFile) 
Console .WriteLine ( "Employee deserialized. " ) ; 
Console .WriteLine ( "Deserialized = {0}", 

deserializedEmployee) ; 



} 
} 
} 



KaK pa6oTM npnMepi>T? 

B npuMepa CMe flec|DkiHMpa/iM K/iac Person v\ HeroB HacneflHMK - K/iac 

Employee. M flBaTa K/iaca MMn^eMeHTkipaT MHTepc|DeMCa ISerializable M 
flec|DMHMpaT MeTOfl 3a Cepkia/lkl3ai4klfl GetObjectData(SerializationInfo, 
StreamingContext) , KaKTO M KOHCTpyKTOp 3a flecepkia/ll/l3aui/lfl CbC CbLflaTa 

curHaTypa. 

K/iacbT Person e cbiunflT ioto b npeAMUJHMfl npuMep, ho CMe flo6aBki/iw 
KOHCTpyKTOp, komto MHkmi/ia/iM3kipa no/ieTaTa My. 

K/iaCbT Employee MMa eflHa 4/ieH-npOMeH^MBa mJobPosition. ntpBMflT 

KOHCTpyKTOp cny>Kki 3a MHMuna^M3auMfl Ha no/ieTa Ha K/iaca. B Hero tom 

M3BMKBa KOHCTpyKTOpa Ha 6a30BMfl K/iaC l/l C/iefl TOBa MHMUMa^M3Mpa CBOeTO 

no/ie. BTopuflT KOHCTpyKTOp ce M3no/i3Ba 3a flecepna^M3aunfl Ha o6eKTa, KaTO 
3a ue/iTa ce M3BMKBa KOHcrpyKToptT 3a flecepi/ia/iki3auki*i Ha 6a30Bi/m K/iac v\ 
cnep, TOBa ce B"b3craHOBflBa CTOMHOcrra Ha n/ieH-npoMeH/ikiBaTa mJobPosition 

OT nOflafleHMfl Serializationlnfo 06eKT. B MeTOfla GetObjectData (...) ITbpBO 
Ce M3BMKBa base.GetObjectData(...) , 3a fla MO>Ke 6a30BMflT K/iac fla CbXpaHM 

no/ieTaTa cm m c/ieA TOBa ce cbxpaHHBa CTOMHOCira Ha n/ieH-npoMeH/iMBaTa 
mJobPosition. B K/iaca e n peAec|D v\ h m pa h MeTOAa TostringO, komto Bptiua 
CMMBO^eH hm3, onwcBam cwvbpwaHi/ieTO Ha o6eKT ot to3m Tun. 

3a fla fleMOHCTpupaMe pa6oTaTa Ha cepkia/iM3aukiflTa v\ flecepna/iM3aunflTa, 

B"bB CJDyHKUMflTa Main ( ) Ha K/iaca ISerializableDemo Cb3flaBaMe 06eKT OT 

K/iaca Employee m OTnenaTBaMe cbfltpxaHneTO My b KOH30/iaTa. Cnep, TOBa 
ct3flaBaMe soapFromatter, c komto cepkia/iM3kipaMe o6eKTa b SOAP c|DopMaT 
(me ro pa3MeflaMe b fleTaw/iki b TeMaTa 3a ye6 yc/iym v\ ro 3anncBaMe bbb 
cpan/ia employee. xmi. HaKpaa flecepkia/iM3npaMe cepkia/iki3kipaHkifl o6eKT v\ ro 
OTnenaTBaMe b KOH30/iaTa. Eto KaKbB e pe3y/iTaTbT cnep, ki3iTb/iHeHkieTO Ha 
npuMepa: 



486 



flporpaMnpaHe 3a .NET Framework (tom 2) 



m-i 



*â– â– â– â– â–  "C:\MS Content and Curriculum\PPT\ -Lecture- 19-Serialization\Demo-5-ISe 

Employee = (Name: Jeffrey Richter, Age: 45, Job: CEO) 

Employee serialized. 

Employee deserialized. 

Deserialized = (Name: Jeffrey Richter, flge: 45, Job: CEO) 

Press any key to continue^ 



KaKTO BM>KflaMe, MHCpopMaunaTa e B"b3craHOBeHa KopeKTHO v\ ptuHO pea/iM3M- 
paHMTe cepna/iki3auwfl v\ Aecepna/iw3aukifl pa6oT*iT ycneujHO. Eto KaK H3Me>K- 
fla i/i cbAtpxaHneTO Ha cpaw/ia employee. xmi, b komto e 3anncaH cepna/iM3n- 
paHMAT o6eKT: 



Demo-5-ISerializable - Microsoft Visual C# .NET [design] - employee.Kml 



JSlxJ 



File 



Edit View Project Build Debug XML Tab[e Tools Window Help 
•&-gyfl X^(S « - " ' <P ' % | ► Debug 
3 .•!> I IS, % fc. *t I * * I A % % % I ft . 



g*£ Serializable 



I5erializableDermo.es employee.Kml 



< > x 



V 



<SOJlP-ENV: Envelope xmlns : xsi= rr http : //www. w3 . org/ 2 00 1/XMLSchema- instance" xmlns : xsd= rr " 

<JSOAP-ENV:Body> 

<al: Employee id="re±-l" xmlns : al="http : //schemas .micuosof t . com/ clu/nsassem/ Demo 5 IS 

<Peuson_x002 7_s_x002 0_name id="uef-3 ">Jef f uey Richteu</Pe]rson_x002 7_s_x002 0_name> 

<Person_x0027_s_x0020_age>4S</PeESon_x0027_s_xOOZO_age> 

<Employee_x002 7_s_x002 0_job id="Eef-1">CEO</Eniployee_x002 7_s_x002 0_job> 

</al:Employee> 

</50AP-ENV:Body> 

</50AP-ENV: Envelopes 



± 



id 



H XML S Data | 



H Output 



Ready 



Chi 



MMeHaTa Ha XML TaroBeTe ce B3eMaT ot 3aAafleHMTe npn cepna/iw3aui/mTa 
MMeHa, KaTO ckiMBO/ikue, komto He ca flonycTMMM b MMeHa Ha TaroBe ce 
3aMeHAT etc cbOTBeTHa escaping noc/ieflOBaTe/iHOcr. 

KoHTeKCT Ha cepMa/iM3auMfl (Streaming Context) 

CrpyKTypaTa streamingcontext ce ki3no/i3Ba, 3a p,a ce yKa>Ke KtAe ce 
cepi/ia/iki3kipa o6eKTbT. Tn MMa ABe ny6/ikmHi/i CBOMCTBa: 

- Context - 06eKT acounnpaH C MHCTaHUklfl Ha Streamingcontext. Ta3M 

ctomhoct o6nKHOBeHO He ce M3no/i3Ba ocBeH, aKO He CMe acoukiwpa/iki 
MHTepecHa ctomhoct c Hea b npoueca Ha cepkia/iki3auwfl. 

- State - CTOMHOCT OT M36pOMMMfl TMn StreamingContextStates. no Bpe- 

Me Ha cepna^M3aunflTa TOBa cbomctbo yi<a3Ba icbfle ce cepna^M3npa 



HnaBa 20. Cepna/iM3aunfl Ha AaHHM 487 

o6eKTbT. HanpuMep, KoraTO cepna^M3npaMe bbb cfjaM/i, CTOMHOcrra My 
me 6"bfle File, no BpeMe Ha flecepna^M3au,Mfl, cbomctboto yKa3Ba ot 
Kbp,e Aecepkia.fi M3kipaMe AaHHMTe. 

B"b3MO>KHMTe CTOMHOCTM Ha StreamingContextStates M TeXHMTe 3HaneHMfl ca 
c/ieAHkiTe: 

- crossProcess (0x0001) - AaHHMTe ce cepna^M3npaT b Apyr npou.ec Ha 

CbLUMfl KOMnK)T"bp. 

- crossMachine (0x0002) - AaHHMTe ce cepi/ia/iki3kipaT Ha Apyr KOMnio- 
Tbp. 

- File (0x0004) - AaHHMTe ce cepkia/iki3kipaT bbb dpav\n. 

- Persistence (0x0008) - AaHHMTe ce cepMa/iM3MpaT b 6a3a ot AaHHM, 
<£aM/i v\nv\ Apyr HOCMTe^. 

- Remoting (0x0010) - AaHHMTe ce cepMa/iM3MpaT OTAa/ieneHO Ha 
HeonpeAe^eHO macto, KoeTO MO>Ke Aa e Ha Apyr KOMniOTbp. 

- other (0x0020) - He e M3BecTHO KbAe ce cepMa^M3MpaT AaHHMTe. 

- clone (0x0040) - yKa3Ba, <Ae rpa<fc-bT ot o6eKTM ce K/iOHMpa. flaHHMTe 
ce cepMa^M3MpaT b cbiuMa npouec. 

- crossAppDomain - AaHHMTe ce cepMa^M3MpaT b Apyr AOMeMH Ha 
npM^o>KeHMe. 

- ah (OxOOFF) - cepMa^M3MpaHMTe AaHHM MoraT Aa ca ot BceKM koh- 

TeKCT. 
riOAaBaMKM StreamingContext 06eKT, <$>0pMaTep"bT AaBa MHCJDOpMaUMfl KaK me 

6"bAe M3no/i3BaH cepMa^M3MpaHMAT o6eKT. Ta3M MHCJDopMauMa MO>Ke Aa 6"bAe 
M3no^3BaHa ot o6eKTa, 3a Aa onpeAe/iM KaK Aa cepMa/iM3Mpa AaHHMTe cm. B 
3aBMCMMOCT ot TOBa KbAe me 6"bAe cepMa/iM3MpaH, o6eKTbT MO>Ke Aa cepMa- 
^M3Mpa pa3/iMneH 6poM ot no/ieTaTa cm, Aa HanpaBM Aont/iHMTe/iHa o6pa- 
6oTKa Ha AaHHMTe v\nv\ npMMepHO Aa xBtp/iM M3K/iK>neHMe. He BceKM K/iac MMa 
Hy>KAa ot TaKaBa Aont/iHMTe/iHa o6pa6oTKa, ho cJDopMaTepvr hm npeAOcraBH 
Heo6xoAMMaTa MHCJDopMauMa m aKO hm e Hy>KHa, MO>Ke Aa n M3no/i3BaMe. 

3a ecf)eKTMBHOCTTa Ha cepnajiM3auiMflTa 

Tpa6Ba Aa MMaMe npeABMA, ^e cepMa/iM3auMHTa e OTHOCMTe/iHO 6aBeH npouec, 
TtM KaTO M3c^eABa TMnoBeTe m M3B/iMna CTOMHOCTMTe mm npe3 OTpa>KeHMe 
(reflection). Ako Tpa6Ba Aa M3B"bpujBaMe neTeHe m nMcaHe Ha orpoMeH 6poM 
o6eKTM m npoM3BOAMTe/iHOCTra e ot Ba>KHO 3Ha4eHMe, ce npenoptuBa Aa ce 

pea^M3Mpa P"bHHO 3anMCBaHe Ha CTOMHOCTMTe B nOTOK M P"bHHO B"b3CTaHO- 

BABaHe Ha o6eKTMTe BMecTO Aa ce M3no/i3Ba BrpaAeHaTa b .NET cepMa/iM3a- 
UMfl. ripMMepeH cueHapMM, b komto e no-Ao6pe Aa ce pea/iM3Mpa ptnHa 
cepMa^M3auMfl e, KoraTO pa3pa6oTBaMe npM/io>KeHMe 3a mo6m/iho ycrpoi/icTBO 
c orpaHMneHM pecypcM (6aBeH npouecop, Ma/iKO naMeT m t.h.). 



488 nporpaMnpaHe 3a .NET Framework (tom 2) 

XML cepiia/iM3ai4M5i 

J\o MOMeHTa pa3r/ieAaxMe K/iacwuecKaTa cepv\anv\3au,v\f\ v\ Aecepi/ia/iki3aui/m Ha 
o6eKTM. HeKa cera ce 3ano3HaeM c oiue eflHa bbsmcokhoct 3a cbxpaHABaHe v\ 
Bt3CTaHOBABaHe cbcroflHi/ieTO Ha o6eKTM, koato .NET Framwork npeAOcraBH 
Ha nporpaMMCTa - XML cepkia/iM3aunflTa. 

KaKBO e XML cepiia/w3aiJLMfi? 

XML cepna^M3aunfl npeAcraB/iflBa 3anncBaHeTO Ha ny6/iwnHHTe no/ieTa Ha 
o6eKT b XML cpopMaT c ue/i cbxpaHeHkie v\nv\ npeHacsiHe. Tn e nacT ot BrpaAe- 
HaTa noAAP"b>KKa Ha XML b .NET Framework. 06paTHMflT npouec Ha XML 
cepna^M3aunflTa e XML Aecepna/ii/i3aunflTa. 

XML cepna^M3aunflTa cb3AaBa hakom orpaHkineHkifl, komto Tpa6Ba p,a MMaMe 
npeABMA- ripn Hea ce cepna/iM3npaT caMO ny6/iwnHHTe no/ieTa v\ He ce 
3ana3Ba ue/iooTa Ha Tuna. XML cepna/iM3aunflTa He Mcoxe p,a ce cnpaBM c 
UkiK/ikinHO CB"bp3aHM rpacpn ot o6eKTM. MoraT p,a ce cepna^M3npaT BCflKaKBM 
o6eKTM, ho K^acbT Tpa6Ba p,a MMa KOHcrpyKTop 6e3 napaMeTpn. 

BctiuHOCT XML cepkia/ii/i3aui/iflTa He e cepna/ii/i3aunfl b mctmhckma CMMCb/i Ha 
TOBa noHATue, 3aiuoTO He cbxpaHABa v\ B"b3craHOB*iBa irb/iHOTO cbcroflHwe Ha 
o6eKTMTe, a caMO 4 a cm ot Hero. 

XML cepna/iM3aMnq - npuMep 

B c/ieABaiunfl npuMep me M/uocTpwpaMe KaK eAMH K/iac MO>xe p,a cepi/ia/in3npa 
AaHHMTe cm npe3 XML cepwa/iki3aunfl: 



public class Student 

{ 

public string mName; 
public int mAge; 

public void SerializeToXml (Stream aStream) 

{ 

XmlSerializer xmlSerializer = 

new XmlSerializer (typeof (Student) ) ; 

xmlSerializer .Serialize (aStream, this ) ; 
} 

public static Student DeserializeFromXml (Stream aStream) 

{ 

XmlSerializer xmlSerializer = 

new XmlSerializer (typeof (Student) ) ; 

Student st = (Student) xmlSerializer . Deserialize (aStream) ; 

return st; 
} 



HnaBa 20. Cepna/iM3aumi Ha flaHHM 489 

KaK pa6oTM npnMep"t>T? 

K/iacbT student MMa ABe ny6/iwnHki no/ieTa - mName v\ mAge. Te Tpa6Ba fla ca 
ny6/ikmHi/i, 3a p,a MoraT p,a ce 3ana3HT npn XML cepna/ii/i3aunflTa. 

Pea/ii/i3kipa/iki CMe MeTOfl seriaiizeToXmi(...) , komto cepna^M3npa flaHHMTe Ha 
K/iaca b XML c|DopMaT b noAaAeHna My KaTO napaMeTbp noTOK. 3a ue/ua 
cb3AaBaMe o6eKT ot K/iaca XmlSerializer m M3BMKBaMe MeTOAa My 
serialize (...) , komto cepna/iM3npa MHCTaHunflTa Ha K/iaca b noTOKa. 

MeTOA"bT DeserializeFromXml (...) C/iy>KI/l 3a Aecepna/lM3npaHe Ha ASHHUTe OT 

noAaAeHMfl My ioto napaMeTbp noTOK. 3a ue/ua cb3AaBaMe o6eKT ot K/iaca 

XmlSerializer M M3BMKBaMe MeTOAa My Deserialize (...) , KOMTO Aecepwa/IM- 

3npa AaHHMTe ot noTOKa v\ Bptiua Aecepi/ia/iM3kipaHkifl o6eKT. 

npocTa XML cepna/iM3aMMfl - npiiMep 

IHe npeACTaBMM oiue eAHH no-noApo6eH npuMep, ki/uocrpkipam b"B3mo>khoctm- 
Te Ha .NET Framework 3a cepi/ia/iki3aukifl Ha o6eKTM b XML c|DopMaT 4pe3 K/iaca 

XmlSerializer: 



using System; 

using System. 10; 

using System. Xml . Serialization; 

public class Student 

{ 

private string mName; 
private int mAge; 

public string Name 

{ 

get { return mName; } 

set { mName = value; } 
} 

public int Age 

{ 

get { return mAge; } 

set { mAge = value; } 
} 

public override string ToString ( ) 

{ 

string result = 

String. Format (" (Name: {0}, Age: {1})", Name, Age); 
return result; 
} 
} 

class XmlSerializationDemo 



490 flporpaMnpaHe 3a .NET Framework (tom 2) 



static void Main ( ) 

{ 

Student student = new Student ( ) ; 

student . Name = "flflflo Mpa3"; 

student. Age = 9 9; 

Console .WriteLine ( "Original = {0}", student); 

// Serialize student object to "student . xml" file 
XmlSerializer xmlSerializer = 

new XmlSerializer (typeof (Student) ) ; 
FileStream outputStream = File . OpenWrite ( "student . xml" ) 
using (outputStream) 

{ 

xmlSerializer .Serialize (outputStream, student) ; 

} 

Console .WriteLine ( "Student serialized. " ) ; 

// Deserialize student object from "student . xml" file 
FileStream inputStream = File . OpenRead ( "student . xml" ) ; 
using (inputStream) 

{ 

Student deserializedStudent = 

(Student) xmlSerializer .Deserialize (inputStream) ; 
Console .WriteLine ( "Student deserialized. " ) ; 
Console .WriteLine ( "Deserialized = {0}", 
deserializedStudent) ; 
} 
} 



} 



KaK pa6oTM npnMepi>T? 

B npuMepa CMe flecpMHkipa/iw K/iaca student, komto MMa flBe ny6/innHw cbom- 
CTBa, komto me 6"b,qaT cepna/iM3npaHM. B K/iaca e npeflecpkiHwpaH MeTOflvr 

ToStringO, KOMTO BptlUa CMMBO/ieH HM3, OnMCBaiU C"bfl"bp>KaHMeTO Ha o6eKT 

ot T03M Tun. T03M MeTOfl me M3no^3BaMe 3a Bki3ya/iki3aui/i*i Ha student 

06eKTM. 

B"bB CpyHKUMflTa Main() Ha K/iaca XmlSerializationDemo Cb3flaBaMe 06eKT 

ot K/iaca student, MHMuna^M3MpaMe ro v\ OTnenaTBaMe cbfltpwaHweTO My b 
KOH30/iaTa. C/iefl TOBa cb3AaBaMe o6eKT ot K/iaca xmlSerializer v\ 
M3no^3BaMe MeTOfla My serialize (...) , 3a fla cepna/iw3kipaMe MHcraHUkiflTa Ha 
K/iaca student BtB cpaw/ia student. xml. HaKpasi, M3no^3BaMKM MeTOfla 

Deserialize (...) Ha K/iaca XmlSerializer, M3BtpilJBaMe flecepwa/lM3auklflTa 

ot XML flOKyMeHT kbm kiHcraHUkm Ha student v\ OTnenaTBaMe cbfltpxaHneTO 
Ha Ta3M MHCTaHunfl b KOH30/iaTa. Eto KaKtB e pe3y/iTaTbT cnefl M3n"b/iHeHMeTO 
Ha npuMepa: 



HnaBa 20. Cepna/iM3aumi Ha aaHHi/i 



491 



o-\ "C:\M5 Content and Curriculum\PPT\-Lecture-19-Serialization\Demo[~r| 



Original = (Name: flano Mpas, Age: 99> 

Student serialized. 

Student deserialized. 

Deserialized = (Name: Qfino Mpaa, Age: 99> 

Press any key to continue 



^ 



KaKTO BM>KAaMe, MHCJDopMaunflTa e B"b3CTaHOBeHa KopeKTHO. OpurnHa^HMflT 
o6eKT m o6eKTbT, no/iyneH cnep, Aecepna^M3aunflTa, ca eflHaKBM. Eto KaK M3- 
r/ie>Kfla v\ cbAtpwaHweTO Ha cpaw/ia student. xmi, b komto e 3anncaH cepna- 

^M3MpaHMflT o6eKT: 



Demo-6-SimpleXmlSerialization - Microsoft Visual C# .NET [design] - student.Hml 



File Edit View Project Build Debug XML Tab[e Tools Window Help 

a s a . b | m. %, &- ** | * # | a % % * | a „ aarb i 




Bn>KflaMe, He b XML <fcai/i/ia ca 3anncaHM bci/ihkm ny6/ii/mHi/i n/ieHOBe Ha cepna- 

/lM3HpaHI/lfl Student 06eKT. 



KoHTpo/inpaHe Ha m3xoahm$i XML 

Ako e Hy>KHO, MO>KeM p,a KOHTpo/ikipaMe m3xoahma XML, reHepupaH ot K/iaca 
xmiseriaiizer. ToBa CTaBa npe3 aTpn6yTM, komto npw/iaraMe kbm K/iaca v\nv\ 
KtM HeroBMTe no/ieTa. Eto KparbK npuMep: 



using System. Xml . Serialization; 
public class OptionalOrder 

{ 

[XmlElement (ElementName = "Tax_Rate' 
public decimal TaxRate; 

[XmlAttribute] 
public string FirstOrder; 

[ Xml I gnoreAt tribute] 
public bool FirstOrderSpecif ied; 



492 flporpaMnpaHe 3a .NET Framework (tom 2) 



[XmlArrayAttribute ( "Items") ] 
[XmlArrayltem ( "MeraberName" ) ] 
public OrderedItem[ ] Orderedltems; 

[XmlElement] 
public Employee [] Employees; 



} 



B npuMepa CMe flecpMHi/ipa/iw K/iaca optionaiorder. Kbm no/ieTaTa My CMe 
npw/io>Kki/iki aTpn6yTM, npe3 komto yKa3BaMe KaK fla ce 3anniuaT b XML - npe3 
XML e/ieMeHTi/i, 4pe3 XML aTpn6yTM v\ flp. 

Hpe3 aTpn6yT"bT XmlElement yi<a3BaMe, ne no/ieTO, kbm KoeTO e npw/io>KeH, 
Tpa6Ba fla ce cepna^M3npa KaTO XML e/ieMeHT. Hpe3 Hero MO>KeM fla kohtpo- 
ziwpaMe xapaKTepucTMKMTe Ha XML e/ieMeHTa, KaTO Haw-necTO ro M3no/i3BaMe 
3a yKa3BaHe Ha MMeTO Ha e/ieMeHTa. 

ATpn6yTtT xmiAttribute yKa3Ba, ne no/ieTO, kbm KoeTO e npw/io>KeH, Tpa6Ba 
fla ce cepkia/iki3wpa KaTO XML aTpn6yT. no noflpa36npaHe xmiserializer 
cepna^M3npa ny6/ikmHi/iTe no/ieTa KaTO XML e/ieMeHTM. 

ATpn6yT"bT xmiignoreAttribute yKa3Ba, ne no/ieTO He Tpa6Ba fla 6"bfle cepn- 
a^M3npaHO. 

ATpn6yT"bT XmlArrayAttribute yKa3Ba, ne no/ieTO, KtM KoeTO e npi/i/io>KeH, 
Tpa6Ba fla 6"bfle cepna^M3npaHO KaTO MacuB. Hpe3 to3m aTpn6yT MO>Ke fla 
yKaxeM v\ MMeTO Ha reHepupaHna XML e/ieMeHT. 

ATpn6yTtT XmlArrayltem o6nKHOBeHO ce M3no/i3Ba 3aeflHO c aTpn6yTa 
XmlArrayAttribute m MfleHTMCpnuupa Tun, komto MO>xe fla ce cepna/ii/i3npa B 
MacuB. Hpe3 to3m aTpn6yT cbiuo MO>xe fla yKaxeM MMeTO Ha reHepupaHna XML 
e/ieMeHT (KaKTO CMe HanpaBM/iw b Haujua npuMep). 

KoHTpo/i Ha XML cepuasiM3aLjMfiTa - npuMep 

IHe npeflCTaBMM oiue eflMH, no-o6ujnpeH, npuMep KaK npe3 aTpn6yTM Moxe fla 
ce KOHTpo/iwpa npouecbT Ha XML cepkia/iki3aukiflTa: 



using System; 
using System. 10; 

using System. Runtime . Serialization; 
using System. Xml . Serialization; 

[XmlRoot ("animal") ] 
public class Animal 

{ 

[XmlArray ( "eyes") ] 
[XmlArrayltem ( "eye") ] 



HnaBa 20. Cepna/iM3aumi Ha flam-m 493 



public Eye[] Eyes; 
[XmlElement ("claws") ] 
public Claw[] Claws; 
[Xmllgnore] 
public string SomeMember = "Some member"; 

public Animal Friend; 



} 



public class Eye 

{ 

[XmlAttribute ( "vision" ) ] 
public double Vision; 

public Eye ( ) 

{ 

} 

public Eye (double aVision) 

{ 

Vision = aVision; 

} 
} 

public class Claw 

{ 

[XmlElement (ElementName="claw" ) ] 
public string Description; 

public Claw ( ) 

{ 

} 

public Claw(string aDescription) 

{ 

Description = aDescription; 

} 
} 

public class ControllingSerializationDemo 

{ 

public static void SerializeAnimalToXml (Animal aAnimal, 
string aFileName) 

{ 

XmlSerializer xmlSerializer = 

new XmlSerializer ( typeof (Animal ) ) ; 
TextWriter writer = new StreamWriter (aFileName) ; 
using (writer) 

{ 

xmlSerializer .Serialize (writer, aAnimal ) ; 



494 flporpaMnpaHe 3a .NET Framework (tom 2) 



} 

public static Animal DeserializeAnimalFromXml ( 
string aFileName) 

{ 

TextReader reader = new StreamReader (aFileName) ; 
using (reader) 

{ 

XmlSerializer xmlSer = new XmlSerializer (typeof (Animal ) 
object deserializedAnimal = xmlSer . Deserialize ( reader ) ; 
return (Animal) deserializedAnimal; 

} 
} 

public static void Main ( ) 

{ 

Animal animal 1 = new Animal () ; 

animall . Eyes = new Eye[] {new Eye (1.05), new Eye (0.85)}; 

animall . Claws = new Claw[] { 

new Claw ("Left claw"), 

new Claw ("Right claw")}; 

Animal animal2 = new Animal ( ) ; 

animal2.Eyes = new Eye[] {new Eye (1.00), new Eye (1.00)}; 

animal2 . Claws = new Claw[] {new Claw ( "Beautiful claw") }; 

animall . Friend = animal2; 
// animal2 . Friend = animall; 

SerializeAnimalToXml (animall, "animal . xml" ) ; 
Console . WriteLine ( "Animal serialized. " ) ; 

Animal deserializedAnimal = 

DeserializeAnimalFromXml ( "animal . xml" ) ; 
Console .WriteLine ( "Animal deserialized. " ) ; 



KaK pa6oTM npnMep"t>T? 

K/iacbT Animal cbAtpwa HAKO/iKO no/ieTa, 3a komto CMe yi<a3a/ii/i npe3 aTpn- 

6yTMTe XmlArray, XmlArrayltem, XmlElement M Xmllgnore KaK Tpfl6Ba Rd ce 
3anniuaT b m3xoahma XML. 

K/iacoBeTe Eye v\ claw, komto ce M3no/i3BaT ot K/iaca Animal cbiuo no/i3BaT 
aTpn6yTM, 3a fla onmuaT KaK p,a ce 3anniuaT b i/i3xoahi/i*i XML. 

B K/iaca ControllingSerializationDemo ca pea/1 kl3kl pa Hkl RBd MeTOfla - 
SerializeAnimalToXml M DeserializeAnimalFromXml, KOMTO CbOTBeTHO 

cepna^M3npaT v\ flecepna^M3npaT Animal o6eKTM. 



HnaBa 20. Cepna/iM3aunfl Ha aaHHi/i 



495 



BtB MeTOfla Main() cb3flaBaMe flBe MHCTaHunn Ha K/iaca Animal, 3aflaBaMe 
ctomhoctm Ha ny6/iwnHHTe mm n/ieHOBe m npaBMM eflHaTa MHCTaHuna n/ieH Ha 
ApyraTa. Cnep, TOBa M3B"bpujBaMe cepna/in3au.i/m bbb cpaw/ia animal. xmi v\ 
Aecepna^M3npaMe to3m cjDaM/i, 3a p,a no/iyni/iM o6paTHO 3anncaHaTa b Hero 
Animal MHCTaHunfl. Cnefl KaTO M3n"b/iHMM npwMepa no/iynaBaMe cnep,Hv\f\j 
pe3y/iTaT: 



ca "C:\MS Content and Curriculum\PPT\-Leci 



Animal serialized. 
Animal deserialized. 
Press any key to continue 



^Jnjxj 



A 



06eKTbT 6nBa cepna/iM3npaH v\ cnep, TOBa o6paTHO flecepna^M3npaH. Ha 
KapTMHKaTa no-flo/iy BM>KAaMe KaK ki3rvie>KAa v\ cpaw/i"bT animal. xmi, no/iyneH 
npn cepkia/iki3aukiflTa Ha o6eKTa. 

3a6e/iH3Ba ce, ne no/ieTO someMember He e 6m/io cepi/ia/iki3kipaHO, noHe>Ke e 
MapKupaHO c aTpn6yTa xmiignore. MMeHaTa Ha e/ieMeHTi/ue ca TaKMBa, KaK- 
bmto CMe yi<a3a/ii/i npe3 aTpn6yTMTe, komto CMe npn/ic»Kki/iki kbm no/ieTaTa. 

Ako b ropHMfl npuMep npeMaxHeM KOMeHTapa ot pefla "animai2. Friend = 
animaii" m TaKa HanpaBMM flBeTe MHCTaHunn Ha K/iaca Animal umk/imuho 
CB"bp3aHM eflHa c flpyra v\ ki3n"b/iHkiM cnefl TOBa npuMepa, me no/iynwM v\3kj\\o- 
neHi/ie. ToBa ce c/iyuBa, 3aiuoTO XML cepna/iM3au.nflTa He Mowe fla cepwa/in- 

3Mpa U.MK/1MHHM CTpyKTypM. 



f..i,HmajmiB»!ML^BiBBifl« i w,i«wi;iJ«iBmM™m^M 

File Edit View Project Build Debug XML Table lools Window Help 


^Jn|_x| 


llp-1^ T ^0l£P&%fe^-^-<P-l^ > Debug ^ r# Serializable 


-,s# : 


'mm^\m%^^-\m^\A%%i^\m, 




m 


'.•:- m tt : I if ■■;. ":-i i b i::Nvr [■:(..■:■ ■: • arnmaLiml | 


Ox 


o 


& 




<?Kitil version="l . 0" encQding="utf-B" ?> 

< animal xitilns : xsd="http : //www. w3 . org/2 001/XMLSchema" xralns : xsi="http : //www. w3 
<eyes> 

<eye vision="l . 05" /> 
<eye vision= rr 0.85" /> 
</eyes> 
<;clatfs> 


org/20 


IS" 






<claw>Lef t claw</claw> 




3 






</claiijs> 








<clatirs> 




VI 






<claw>Ricjht clau</claw> 




il 






</cla.w3> 










<Friend> 




% 






<eyes> 




o 






<eye vision-"l" /> 




tf 






<eye vision="l" /> 




s 






</eyes> 




~- 






<clanj3> 











<claw> Beaut if ul claw</claw> 










</claws> 










</Friend> 










</animal> 


- 




i 


1 


| ED XML | @ Data | 


| 1 Output 






Build succeeded | Ln 18 Col 12 Ch 12 


|INE 





496 nporpaMnpaHe 3a .NET Framework (tom 2) 

BfeHineH KOHTpo/i Ha XML cepna.nM3aMMflTa 

B .NET Framework e npeflBMfleH MexaHM3"bM, komto hm no3BO/i*iBa fla kohtpo- 
zikipaMe XML cepna/ii/i3aunflTa M3BtH o6eKTa, T.e. 6e3 fla yKa3BaMe TOBa b m3- 
xoflHMfl KOfl Ha K/iaca. To3m MexaHM3"bM ce i/i3no/i3Ba, KoraTO HAMaMe flocrbn 
flo M3xoflHMfl KOfl Ha K/iaca v\nv\ KoraTO MCKaMe fla cb3flafleM eflMH Ha6op ot 
cepna^M3npyeMM K/iacoBe, ho fla cepi/ia/ii/i3i/ipaMe o6eKTMTe no pa3/iwneH 
Ha^MH b 3aBMCMMOCT ot TOBa Ktfle ce M3n0^3BaT. 

BtHiuHMflT kohtpo/1 Ha cepna/iM3aunflTa npn/iwna mhoto Ha KOHTpo/ia Ha 
cepna^M3aunflTa c aTpn6yTM. OyHKuwoHa/iHOCTTa e ctiuaTa KaTO npn Hea, 
flopn K/iacoBeTe ca ctiunTe, caMO MexaHM3M"bT 3a ,qo6aBflHe e pa3/ikmeH. 

BtHiiJHMflT kohtpo/i Ha cepkia/iki3aukiflTa ce M3B"bpujBa npe3 K/iacoBeTe 

XmlAttributesOverrides M XmlAttributes. Hpe3 TAX, 3a BCeKM H/ieH Ha 

flafleH K/iac, ce 3aflaBa KO/ieKui/m XmlAttributes, onucBaiua cpopMaTa Ha 
M3XOflHMfl XML. 3a ue/lTa ce Cb3flaBa XmlAttributesOverrides o6eKT, KOMTO 
no-K"bCHO ce noflaBa Ha KOHcrpyKTopa Ha xmlSerializer. Pe3y/iTaTHMflT 

XmlSerializer 06eKT l/l3nO/13Ba MHCpOpMaUMflTa, KOflTO Ce C"bfl"bp>Kaiua B 
XmlAttributesOverrides, 3a fla Onpefle/IM KaK fla M3BtpilJM cepwa/lM3auklflTa. 
XmlAttributesOverrides 06eKTa Cbfl"bp>Ka KO/ieKUkm OT TkinOBe, 3a KOMTO me 

6"bfle npeflecpMHupaHa aBTOMaTMUHaTa cepna^M3aunfl, KaKTO v\ XmlAttributes 
o6eKT, acounnpaH c BceKM eflMH ot tax. XmlAttributes o6eKTbT cbfltpwa 
M36paH Ha6op ot aTpn6yTM, yKa3Baiun KaK fla 6"bflaT cepna/iM3npaHi/i bcako 
eflHO no/ie, cbomctbo v\i\v\ K/iac. 

HeKa pa3MeflaMe c/ieflBami/m cppameHT koa, i/i/iK>CTpi/ipam KaK CTaBa TOBa: 



XmlAttributeOverrides overrides = new XmlAttributeOverrides ( ) 
XmlAttributes attribs = new XmlAttributes ( ) ; 

attribs . XmlElements .Add (new XmlElementAt tribute ( "PersonName" ) 
overrides .Add (typeof ( Person) , "Name", attribs); 
XmlSerializer xmlSerializer = 

new XmlSerializer (typeof ( Person) , overrides); 



B npuMepa yKa3BaMe Ha XML cepwa/iki3aukiflTa, ne no/ieTO (i/i/iki cbomctboto) 

Name Ha K/iaca Person Tpfl6Ba fla ce 3anniue B XML Tar C kIMe PersonName. 

ritpBO Ct3flaBaMe XmlAttributesOverrides 06eKT. C/iefl TOBa Cb3flaBaMe 
XmlAttributes 06eKT M KbM KO/ieKUklflTa My XmlElements fl06aBflMe HOB 
XmlElementAttribute. riOC/ie, kl3nO/13BaMKM MeTOfla Add(...), fl06aBflMe 
XmlAttributes 06eKTa K"bM XmlAttributesOverrides 06eKTa. KaTO napaMeT- 

pn Ha MeTOfla noflaBaMe v\ Tuna, 3a komto npeflecpMHupaMe cepi/ia/iki3auki*iTa, 
KaKTO m MMeTO Ha no/ieTO, umato cepna^M3aunfl npeflecpMHupaMe. HaKpaa 

noflaBaMe XmlAttributesOverrides 06eKTa Ha KOHCTpyKTOpa Ha 
XmlSerializer. 



HnaBa 20. Cepna/iM3aumi Ha flaHHM 497 

BfeHineH KOHTpo/i Ha cepna;iM3aMMflTa - npiiMep 

IHe npeflCTaBMM eflMH npuMep, ki/uocTpwpam, KaK MO>KeM fla KOHTpo/iwpaMe 
c|DopMaTa Ha m3xoahma XML AOKyMeHT npn XML cepv\anv\3au,v\f\ no HeAeK/iapa- 
TMBeH ntT (6e3 fla ce npoMeHfl cope KOfla Ha K/iaca, komto ce cepna/iM3npa): 



using System; 

using System. 10; 

using System. Xml . Serialization; 

public class Person 

{ 

public string Name; 

public int Age; 

public string [] Friends; 
} 

class OverridingXmlSerializationDemo 

{ 

static void Main ( ) 

{ 

Person person = new Person ( ) ; 

person. Name = "Bail MaHraji"; 

person. Age = 82; 

person . Friends = new string [] { "flflflo Mpa3", "Ba6a 3ra"j; 

XmlAttributeOverrides overrides = 
new XmlAttributeOverrides ( ) ; 

XmlAttributes nameAttributes = new XmlAttributes ( ) ; 
XmlElementAttribute nameElement = 

new XmlElementAttribute ( "PersonName" ) ; 
nameAttributes . XmlElements .Add (nameElement) ; 
overrides .Add (typeof ( Person) , "Name", nameAttributes); 

XmlAttributes f riendsAttributes = new XmlAttributes ( ) ; 
XmlArrayAttribute friendsArray = 

new XmlArrayAttribute ( "PersonFriends" ) ; 
f riendsAttributes . XmlArray = friendsArray; 
XmlArrayltemAttribute f riendsArrayltem = 

new XmlArrayltemAttribute ( ) ; 
f riendsArrayltem. ElementName = "FriendName" ; 
f riendsAttributes . XmlArrayltems .Add ( f riendsArrayltem) ; 
overrides .Add (typeof ( Person) , "Friends" , 

f riendsAttributes ) ; 

TextWriter writer = new StreamWriter ( "person . xml" ) ; 
using (writer) 

{ 

XmlSerializer xmlSer = new XmlSerializer (typeof ( Person) , 
overrides ) ; 



498 



flporpaMnpaHe 3a .NET Framework (tom 2) 



} 



xmlSer .Serialize (writer, person) ; 

} 

Console .WriteLine ( "Person instance serialized."! 



KaK pa6oTM npiiMepi>T? 

/Jeep i/ihm pa/i w CMe K/iac Person c HflKO/iKO no/ieTa. B Hana/iOTO Ha cpyHKui/mTa 
Main() cb3AaBaMe MHCTaHunfl Ha K/iaca Person m MHMuna^M3MpaMe HeMHMTe 
no/ieTaTa. Cnep, TOBa Ha no/ieTO Name ot K/iaca Person cbnocraBAMe KO/ieKuwfl 
ot XML aTpn6yTM, komto yi<a3BaT, ne TOBa no/ie Tpa6Ba fla ce cpopMaTupa KaTO 

XML e/ieMeHT C MMe PersonName. riOC/ie Ha nO/ieTO Friends OT K/iaca Person 

(KoeTO npeflcraB/iHBa MacuB ot HM30Be) cbnocraBHMe KoneKixwn ot XML 
aTpn6yTM, komto yKa3BaT, ne TOBa no/ie Tpa6Ba fla ce cpopMaTupa ioto XML 
e/ieMeHT c nMe PersonFriends, KoeTO cbfltpxa b ce6e cm 3a BceKM e/ieMeHT 
ot MacuBa no eflMH XML e/ieMeHT c MMe FriendName. HaKpaa cepna/iM3npaMe 

06eKTa B"bB Cpafi/ia person. xml. 

Eto KaK M3Me>Kfla v\ cpaw/i"bT person. xml, no/iyneH npn cepi/ia/iM3aLLMflTa: 



% Demo-B-OverridingXmlSerialization - Microsoft Visual C# .MET [design] - person.Hml 



File Edit View Project Build Debug XML Tab[e Tools Window Help 
! IP - til - & H |3 Jt Hi (S I "O - n. ~ <p ~ 1^ I > Debug 
! S -b I H % ft. a. I tp iS I /* % % % I it , 



OvemdingXrnl5enalizationDemo.es person.Hml 



< > X 



[<?xitil vers ion=" 1.0" encoding="utf-S"?> 

<Peuson xitilns : xsd="http: //www. w3 . oug/2 001/XIILSchema" xitilns : xsi="http: 
<PersonNaitie>EaH MaHraji</PersonNattie> 
<Age>S2</Age> 
<PersonFriends> 

<FriendNaH]e>flsso IIpa3</FrieiidWame> 
<FuiendNanie>Ea6a JIra</FriendWai[ie> 
</PersonFriencis> 
</Person> 







* 



// 



•n 



ED XML (D Data 



12) B Output 



Ready 



Ln 1 



Coll 



Chi 



INS 



A 



Bn>KflaMe, ne no/ieTaTa ca cepkia/iki3kipaHki no Hani/ma, komto CMe yKa3a/iw 
npe3 aTpn6yTMTe, komto CMe npki/io>KM/iM KbM tax. 



npii/io>KeHiie: FormatterServices 

IHe pa3r/ieflaMe cbBceM HaKpaTKO, 6e3 fla flaBaMe npuMep, cpeflCTBaTa 3a 
pea/i M3a Likifl Ha co6cTBeHM cpopMaTepn b .NET Framework. Eaho ot Te3M 

cpeflCTBa e K/iaCbT FormatterServices. TOM npeflOCTaBfl OCHOBHaTa CpyHK- 



HnaBa 20. Cepna/iM3aunfl Ha flaHHM 499 

Ui/iOHa/mocT, koato Tpa6Ba fla npwTeaoBa c|DopMaTepa - M3B/iMnaHe Ha cepna- 
^M3npyeMMTe n/ieHOBe Ha o6eKT, onpefle/iflHe Ha TexHMTe TunoBe v\ M3B/iMnaHe 
Ha CTOMHOCTMTe mm. To3m K/iac He Moxe p,a 6tae HacneAflBaH. 

MeTOflM 3a cepna/iM3aMnq 

public static MemberInfo[] GetSerializableMembers(Type) 

MeTOAtT npneMa KaTO napaMeTtp Tuna Ha K/iaca, komto me 6"bAe cepna^n- 
3npaH, m Bptiua KaTO pe3y/iTaT MacuB ot Memberinfo o6eKTM, ctAtpwaiuM 
MHCJDopMauMfl 3a cepkia/iki3wpyeMkiTe n/ieHOBe Ha K/iaca. 

public static Object[] GetObjectData (Object, MemberInfo[]) 

MeTOAtT npneMa KaTO napaMeTpn o6eKT, komto iue 6"bAe cepna^M3npaH v\ 
MacuB c n/ieHOBeTe, komto Tpa6Ba 6"bAaT M3B/ieneHM ot o6eKTa. 3a BceKM ot 
tax ce M3B/iMna CTOMHOCTTa, acouMMpaHa c Hero b cepi/ia/iM3kipaHki*i o6eKT v\ 
Te3M ctomhoctm ce BptiuaT KaTO MacuB ot o6eKTM. flt/i>KMHaTa My e cbiuaTa, 
KaTO At>/i>KkiHaTa Ha MacuBa c n/ieHOBeTe, M3B/iMnaHM ot o6eKTa. 

MeTOflM 3a flecepna/iM3aMnq 

public static Type GetTypeFromAssembly(Assembly, String) 

MeTOAtT HaMupa Tuna Ha onpeAe/ieH o6eKT b AaAeHO aceM6/iw. Tom npneMa 
KaTO napaMeTpn aceM6/iMTO v\ MMeTO Ha o6eKTa, komto me ce TtpcM, v\ Bptiua 
KaTO pe3y/iTaT Tuna Ha to3m o6eKT. 

public static Object GetUninitializedObject(Type) 

MeTOAtT npneMa KaTO napaMeTtp Tun Ha o6eKT v\ Bptiua KaTO pe3y/iTaT HOBa 

MHCTaHUMfl Ha 06eKT OT ASAeHMfl Tun. 

public static Object GetObjectMembers(Object, MemberInfo[], 
Object[]) 

MeTOAtT nont/iBa etc ctomhoctm no/ieTaTa Ha o6eKT, KaTO Te3M ctomhoctm ce 
B3eMaT ot MacMB c o6eKTM. 3a ue/iTa KaTO napaMeTpM My ce noAaBaT o6eKTa, 
4mmto no/ieTa iue ce 3ant/iBaT, MacMB ot Memberinfo o6eKTM, onMCBaiu kom 
no/ieTa p,a ce 3ant/iBaT m MacMB c o6eKTM, ot komto iue ce B3eMaT ctom- 
HOCTMTe 3a no/ieTa. KaTO pe3y/iTaT ce Bptiua o6eKTa c nont/iHeHM no/ieTa. 

ynpa>KHeHMfl 

1. fla ce uecJDMHMpa K/iac Graph, komto onMCBa HaconeH rpac|D (npeACTaBeH 
KaTO MacMB ot BtpxoBe). fla ce Aec|3MHMpa K/iac Node, komto onMCBa eAMH 
Bptx ot rpac|Da. K/iactT Node Tpa6Ba p,a ctAtp>Ka MHCJDopMauMOHHa nacT 

(TeKCTOBO nO/ie) M MaCMB OT HaC/ieAHMUM (MHCTaHUMM Ha CtlUMfl K/iac 

Node), fla ce Pea/iM3Mpa (fcyHKUMOHa/iHOcr, koato cepMa/iM3Mpa m uecepM- 
a^M3Mpa MHCTaHUMM Ha K/iaca Graph. 



500 nporpaMnpaHe 3a .NET Framework (tom 2) 

2. OnuTaMTe ce fla cepna^M3npaTe 6nHapH0 MHCTaHuna Ha K/iaca system, 
collections. Hashtabie. OnuTaMTe cnep, TOBa fla cepna^M3npaTe xew- 
Ta6/iwu.a c XML cepv\anv\3au,v\n. KaKBM npo6/ieMki B"b3HMKBaT? Mo>KeTe nv\ fla 
o6acHMTe 3aiuo XML cepna/iM3au.nflTa He pa6oTM? npefl/ioxeTe a/uep- 
HaTMBHO peiueHne. 

3. fleCpMHMpaMTe K/iaCOBe Country V\ Town, KOMTO Cbfl"bp>KaT MHCpOpMaUMfl 3a 

A"bp>KaBM m rpaflOBe. Mo>Ke fla cukuaTe, ne b eflHa fltpwaBa MMa mhoto 
rpaflOBe. Pea^M3npaMTe 6nHapHa v\ XML cepkia/iki3au.kifl v\ flecepna/in3au.kifl 
3a Te3M K/iacoBe. Pea^M3npaMTe TCP ctpBtp, komto no MMe Ha fltpwaBa 
Bptifla MHCpopMaunfl 3a fl"bp>KaBaTa 3aeflHO c bcmukm rpaflOBe b Hea (bbb 
BMfl Ha 6nHapHO cepna^M3npaH country o6eKT). Pea/in3wpaMTe Windows 
Forms K/iweHTCKO npi/i/io>KeHi/ie 3a TCP ctpBtpa, KoeTO no3BO/iaBa fla ce 

kl3B/lkma M BM3ya^M3Mpa MHCpOpMaUMfl 3a fl"bp>KaBMTe. K/ll/ieHTbT M ctpBtptT 

Tpa6Ba fla noflfl"bp>KaT flBa pe>KMMa Ha pa6oTa - c 6nHapHa cepkia/iki3au.kifl v\ 
c XML cepwa/iM3aui/i5q. 

4. 06acHeTe 3aiuo soapFormatter MO>Ke fla cepna^M3npa uwK/iwueH rpacp ot 
o6eKTM, a XML cepkia/ii/i3aui/iflTa He MO>xe. YntTBaHe: Cb3p,av\je u.MK/inneH 
rpacp ot o6eKTM, cepkia/iM3aMTe ro no flBaTa HanwHa v\ cpaBHeTe M3xoflHMTe 
XML cpai/i/iOBe. 

l/l3no/i3Bai-ia JiiuepaTypa 

1. Mwxaki/i Ctomhob, Cepna/iki3au.kifl Ha flaHHM - http://www.nakov.com/ 
dotnet/lectures/Lecture-19-Serialization-vl.O.ppt 

2. MSDN Library - http://msdn.microsoft.com 

- Object Serialization in the .NET Framework 

- System. Runtime. Serialization Namespace 

- System. Runtime. Serialization. Formatters Namespace 

- System. Xml. Serialization Namespace 

- XML and SOAP Serialization 

- XmlSerializer Class 

- Controlling XML Serialization Using Attributes 

- Attributes That Control Encoded SOAP Serialization 

- Attributes That Control XML Serialization 

- The XML Schema Definition Tool and XML Serialization 

- Generating SOAP Messages With XML Serialization 

- FormatterServices Class 

3. Vyacheslav Biktagirov, .NET Serialization - http://www.csharphelp.com 
/archives/a rchive38.htm I 

4. Mickey Williams, CodeGuru: .NET Serialization - http://www.codequru. 
com/columns/DotNet/article.php/c6595/ 



T/iaea 21. Ye6 
yc/iyrii c ASP.NET 



ABTOpii 

fleflH Bap^eB 
CTec|DaH flo6peB 

He06X0flMMM 3HaHMfl 

- Ba30BM no3HaHMfl 3a .NET Framework 

- Ba30BM no3HaHMfl 3a e3MKa C# 

- Ba30BM no3HaHM5q 3a ASP.NET 

- Ha^a/iHki yMeHMfl 3a pa6oTa c Visual Studio .NET 

- no3HaHM5q no XML 

- ATpn6yTM 

Cb/vbpwaHue 

llHCppacrpyKTypaTa Ha ye6 ycnyrirre 

- Pa3npeAe^eHM npn^OKeHMa 

- Hy>KflaTa ot ye6 ycnyri/i 

- yc/iyrw m ye6 yc/iyrw 

- UDDI AnpeKTopnn 3a ye6 ycnyrw 

- OTKpuBaHe Ha ye6 yc/iyrw (DISCO) 

- WSDL onucaHMfl Ha yc/iyrw 

- SOAP - c|DopMaT Ha 3aflBKMTe 

- npoTOKO^eH CTeK Ha ye6 yc/iyrwTe 

- CueHapnn 3a M3no/i3BaHe Ha ye6 yc/iyrw 

- .NET Enterprise npn^OKeHna 
Ye6 yc/iyriue b ASP.NET 

- ApxnTeKTypa 

- Cb3AaBaHe v\ ny6/im<yBaHe Ha ye6 yc/iyrw 

- M3no^3BaHe Ha ye6 ycnyrw. TeHepupaHe Ha Me>KflMHeH (npoKCn) K/iac 

- Ye6 yc/iyrkue v\ VS.NET - Cb3AaBaHe v\ KOHcyMnpaHe 

- ATpn6yTM 3a ye6 yC/iyrklTe - [WebService], [WebMethod] 

- flpexBtp/iflHe Ha TunoBe (type marshalling) 



502 nporpaMnpaHe 3a .NET Framework (tom 2) 

- Pa3rp"biuaHe (deployment) Ha ye6 ycnyri/i Btpxy IIS 

- fle6trBaHe Ha ye6 ycnyrw 

- Mofle/i"bT Ha M3n"b^HeHne Ha ye6 ycnyrkue b ASP.NET 

- ACMHXpOHHO M3BMKBaHe 

- Ye6 yc/iyrw v\ pa6oTa c flaHHM 

- rioAAP'b>KKa Ha cecnn 

- CurypHOCT Ha ye6 yc/iyrkue. CurypHOCT npe3 cecnn 

- M3K^K)4eHMflTa b ye6 ycnyrwTe 

B Ta3M TeMa ... 

B HacToamaTa TeMa me pa3r/ieflaMe ye6 ycnyrkue v\ pa6oTaTa c tax npe3 
cpeflCTBaTa Ha .NET Framework v\ ASP.NET. IHe m3achmm KOHuenunnTe v\ 
CTaHAapTMTe, komto ctoat b ocHOBaTa Ha ye6 yc/iyri/iTe, v\ u\e o6hchi/im 3aiuo 
Te ca ce npeBtpHa/iw b craHflapT 3a MHTerpauna v\ Me>Kflyn/iaTCpopMeHa 
KOMyHMKaunfl. me ce 3ano3HaeM c pa3/iwnHki cueHapnn 3a M3no/i3BaHeTO mm. 
IHe pa3r/ieAaMe npn^OKeHneTO Ha ye6 ycnyrwTe 3a M3rpa>KflaHe Ha mhoto- 
cnov\uv\ .NET Enterprise npi/i/io>KeHkifl. IHe pa3r/ieflaMe nporpaMHua MOfle/i 3a 
ye6 ycnyrw b ASP.NET m cpeACTBaTa 3a taxhoto M3rpa>KflaHe, ki3n"b/iHeHwe v\ 
pa3rptiuaHe (deployment). IHe ce cnpeM v\ Ha hakom necro cpeiuaHM 
npo6/ieMki i/i yTBtpfleHM npaKTMKH npn pa3pa6oTKaTa Ha ye6 ycnyrw npe3 .NET 
Framework v\ ASP.NET. 



HnaBa 22. OTfla/ieneHM M3BMKBaHHfl c .NET Remoting 503 



B"b3HMKBaHeTO Ha ye6 ycnyriue 

B 3opaTa Ha MHTepHeT ocHOBHa ue/i e 6w/ia p,a ce HanpaBAT ny6/iwnH0 
flocTtnHM onpefle/iei-iki flOKyMeHTM, CTaTMM v\ Apyrn pecypcn 3a xopa, komto ca 
6m/im 3anHTepecoBaHM ot taxhoto cbAtpwaHwe. C 6"bp3crro pa3BMTne Ha 
MHTepHeT TexHO/iori/ikiTe b Kpaa Ha 90-Te vop,v\uv\ MHTepHeT CTaBa macto He 
caMO 3a ye6 CTpaHnun, ho m eflMHHO macto 3a o6MAHa Ha cbo6meHMfl n 
MHCJDopMauMfl Me>Kfly pa3/innHM npn^o>KeHMfl. /luncaTa Ha eAMHeH craHAapT 3a 
onucaHneTO v\ pa3npocTpaHeHneTO mm, iokto m Hy>KAaTa ot aAanTepn 3a 
MHTerpaunfl Ha Bene cbiuecTByBaiunTe TexHO/iorkiw, nopa>KAaT M3rpa>KAaHeTO 
Ha hob He3aBMCMM (KaKTO ot caMOTO npi/i/io>KeHi/ie TaKa v\ ot n/iaTifcopMaTa, Ha 
koato e pa3no/io>KeH) CTaHAapT - SOAP (Simple Object Access Protocol). flHec 
pa6oTaTa Ha bcako ye6 6a3npaHO npn^OKeHne, KoeTO e OTBopeHO kbm CBeTa, 
e HeMnc^MMa 6e3 ye6 yc/iyrwTe, 3aiuoTO Te ca ce npeBtpHa/iw b CTaHAapT 3a 
Me>KAyn/iaTc|DopMeHa KOMyHkiKaukm v\ MHTerpauna v\ ce ocHOBaBaT Ha Bene 
yTBtpAM/iki ce b r/io6a/iHaTa Mpe>Ka MOAe/iw v\ CTaHAapTM. 

Pa3npefle/ieHM npusioweHUfi 

B AHeujHO BpeMe noBeneTO npi/i/io>KeHi/m ce cbcrosrr ot hako/iko ojp,enuv\ 
KOMnoHeHTa, komto B3anMOAekicTBaT noMe>KAy cm, m 3aeAHO peiuaBaT eAHa 
o6iua 3aAa4a. Hpe3 pa3Ae/iflHeTO Ha hako/iko cbcraBHM 4 a cm, ziorwKaTa Ha 
caMOTO npi/i/io>KeHMe ce pa3npeAe/i*i Me>KAy ojp,ei\uv\je My KOMnoHeHTM, BceKM 
ot komto e /iori/mecKM o6oco6eH, MMa acHa OTroBopHOCT v\ MO>Ke p,a e pa3no- 
/io>KeH c|DM3M4ecKM Ha OTRenen KOMniOTbp. OrryK MABa v\ MMeTO Ha caMMTe 
npM/io>KeHMfl - pa3npeAe^eHM. OcHOBeH npuHunn npn cbcraBflHeTO Ha BceKM 
KOMnoHeHT e tom p,a M3n"b/iHflBa Ao6pe AecJDMHupaHa 3aAana (strong cohesion) 
m Aa e /lorwuecKki He3aBMCMM (loosely coupled) ot ocraHa/ikiTe KOMnoHeHTM. 

Moae/m 3a pa3npefle/ieHM npii/io>KeHiisi 

C roAMHMTe eBO/iK>u.kisiTa Ha coqbTyepHMTe TexHO/iornn e npeMi/ma/ia npe3 
pa3^M4HM MOAe^n Ha pa3npeAe/ieHi/i npn^OKeHna, BceKM ot komto v\wa CBOMTe 
cm^hm m c/ia6n CTpaHM. J\a pa3MeAaMe hakom ot tax: 

- Mofleji "K/iMeHT/CT»pBi»p" - npn to3m MOAe/i npw/iOKeHweTO e 
AByc^OMHO. Ha ctpBtpa ca pa3no/io>KeHM AaHHkiTe 3a ci/icreMaTa v\ 
o6iuaTa 3a bcmukm ziorwKa, a npn K/ii/ieHTa ctom npn^OKeHne, KoeTO 
B3anMOAeMCTBa c noTpe6MTe/ii/iTe v\ KOMyHMKupa etc ctpBtpa. Twni/meH 
c/iynaw Ha TaKaBa ewevewa e ctpBtp c 6a3a ot ashhh m MHOxecTBO 
K^neHTM, komto pa6oTAT c o6mnTe ashhh ot ctpBtpa. 

- Mofle/i "Pa3npefle/ieHM o6eKTM" - to3m MOAe/i npeAOcraBfl B"b3MO>K- 
hoct 3a OTAa/ieneH Aocrbn ao o6eKTM, KaTO no3BO/iflBa c"b3AaBaHe Ha 
o6eKTM Btpxy OTAa^e^eH ctpBtp v\ M3BMKBaHe TexHM MeTOAM. Eto hakom 
apxnTeKTypn, komto M3no^3BaT to3m MOAe^: 

- DCOM (Distributed Component Object Model) - npeAcraB/iHBa pa3- 
ujupeHne Ha COM MOAe/ia b Windows onepaunoHHM cucTeMM, KoeTO 



504 nporpaMnpaHe 3a .NET Framework (tom 2) 

no3BO/i*iBa COM KOMnoHeHTM, kiHcra/ikipaHM Ha OTAa/ieneHM eflHa ot 
flpyra MaujMHM, fla KOMyHMKupaT noMe>KAy cm. COM/DCOM apxkueK- 
TypaTa e pa3pa6crreHa ot Microsoft v\ BtnpeKM, ne e npeHeceHa v\ 
Btpxy Apyrn n/iaTCpopMM, HewHOTO ochobho npeAHa3HaneHwe cm 
ocTaBa Haw-Be^e 3a onepaunoHHMTe cucTeMM Ha Microsoft Windows. 

- CORBA (Common Object Request Broker Architecture) - npeflcraB- 
ziflBa OTBopeH craHflapT 3a KOMyHMKauna Me>KAy o6eKTM, pa3no/io- 
xeHM Btpxy OTAa/ie^eHM eAHa ot Apyra MaiunHM. CraHAapTbT e 
pa3pa6oTeH ot KOHCopunyMa OMG (Object Management Group). 
BtnpeKM, ne npaBM KOMyHUKaunaTa He3aBMCMMa KaKTO ot e3MKa, Ha 
komto ca HanncaHM npw/io>KeHkiflTa, TaKa v\ ot onepaunoHHaTa cmc- 
TeMa, Btpxy koato ce i/i3n"b/iHflBaT, CORBA He e Ha6pa/i nony/isipHOCT 
3apaAM ro^AMaTa cm c/io>khoct m TpyAHOcrra 3a kiMn/ieMeHTauwfl. 

- Java RMI (Remote Method Invocation) - npeAcraB/isiBa craHAapT 3a 
pa3npeAe^eHM npn^OKeHna, pa3pa6oTeH ot Sun, v\ 6a3npaH Ha Java 
n/iaTCpopMaTa. no3BO/iflBa KOMyHMKauna Me>KAy OTAa/ieneHM o6eKTM, 
pa3pa6oTeHM Ha Java, npe3 OTAa/ieneHO M3BMKBaHe Ha MeTOAHTe mm. 
3a pa3/im<a ot CORBA v\ DCOM, RMI e 3Ham/iTe/iHO no-onpocTeH, ho 
pa6oTM caMO c Java o6eKTi/i. 

- .NET Remotinq - npeAcraB/iflBa TexHO/iorna, ki3no/i3BaHa b .NET 
Framework, koato ocurypaBa zieceH v\ npo3paneH Aocrtn ao OTAa/ie- 
4eHM .NET o6eKTM. Pa6oTM caMO c .NET o6eKTM. 

- Mofleji "ye6 yc/iyrn" - 6a3npaH e ki3u.fl.no Ha OTBopeHM craHAapâ„¢ 3a 

OTAa^e^eHM M3BMKBaHMfl, B 4MATO OCHOBa ctom XML. Haw-necro 3a KOMy- 

HMKaunflTa ce M3no/i3BaT HTTP npoTOKO/itT v\ MOAe/ivr 3aaBKa-OTroBop, 
KoeTO npaBM 1/lHTepHeT v\ WWW v\p.eaj\Hv\ 3a npeHOCHa cpeAa Ha ye6 
yc/iyrwTe, a ouaM MABa v\ MMeTO mm. Ye6 ycnyrwTe ce caMOonncBaT npe3 
e3MKa WSDL v\ TOBa 3HanwTe/iHO onpocraBa M3no/i3BaHeTO mm. 

Ye6 ycnyrwTe ca HacToaiueTO v\ 6"bAeiueTO Ha pa3npeAe/ieHHTe npi/i/io>KeHi/iyi. B 
caMaTa cm ctiuHOCT Te npeAcraB/iHBaT cpyHKu.MOHa/iHO He3aBMCMMM nporpaMHM 
KOMnoHeHTM m M3Be>KAaT Me>KAyn^aTCpopMeHaTa KOMyHMKauna Ha hobo hmbo 
Ha a6cTpaKunfl, KoeTO e 3aBMCMMO ot KOMnaHkiflTa-npoki3BOAMTe/i, M3no/i3Ba- 
HMfi nporpaMeH e3MK v\nv\ cocpTyepHa n/iaTCpopMa. 

Hy>KflaTa ot ye6 yc/iyrw 

Bene pa3MeAaxMe hakom ot Bene cbiuecTByBaiunTe wop,env\ 3a pa3npeAe/ieHi/i 
npn^o>KeHMfl m ki3TbKHaxMe nacr ot HeAOCTaTbunTe mm. Cera me ce cnpeM no- 
noApo6HO Ha Hy>KAaTa ot ye6 ycnyrw v\ me M3ACHMM 3aiuo ce e crwrHa/io ao 

TflXHOTO Cb3AaBaHe. 

HeAOCTaTiiUM Ha Moae/ia "K/meHT/cbpBTjp" 

MoAe/itT K^neHT-ctpBtp (AByc^OMHa apxwTeicrypa) He nacBa Ao6pe Ha 
MAeyiTa 3a pa3npeAe/ieHHTe npn^OKeHna, 3aiuoTO c HapacTBaHe Ha c/io>khoct- 
Ta mm HapacTBa v\ Hy>KAaTa ot cb3AaBaHeTO Ha noBene ot ABa c/ioa. 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 505 

OcTaBa B"b3M0>KH0CTTa fla ce i/i3no/i3Ba MOAe/i 3a OTAa/ieneina KOMyHMKauna, 
komto no3BO^ABa M3rpa>KflaHeT0 Ha mhotoc^omhh pa3npeAe/ieHki npw/io>KeHkifl. 
flBaTa HaM-necro i/i3no/i3BaHi/i noAxofla 3a TOBa ca "Pa3npeAe/iei-m o6eKTn" v\ 
"Ye6 yc/iyrki". 

HeAOCTaTi>uM Ha m often a "Pa3npefle/ieHM o6eKTn" 

C ujupoKOTO HaB^M3aHe Ha MHTepHeT v\ HeroBOTO MacoBO i/i3no/i3BaHe ce e 
3apoAM/ia Hy>KAaTa ot pa3npeAe/ieHM npw/io>KeHi/m, komto p,a KOMyHMKupaT 
noMe>KAy cm nocpeACTBOM r/io6a/iHaTa Mpe>Ka. 

MoAe/itT "Pa3npeAe^eHM o6eKTn" He e cb3AaAeH c npe3yMrmi/i*iTa, ne Tpa6Ba 
Aa M3no^3Ba MHTepHeT KaTO npeHOCHa cpeAa. BceKM eAHH ot pa3r/ieAaHMTe 
pa3HOBMAHOCTM Ha MOAe/ia e pa3ni/iTa/i Ha cbom co6cTBeH npoTOKO/i 3a 
npeHacflHe Ha MHCJDopMauMflTa. flo6aBAMKM Ha/iwuweTO Ha 3aiunTHM creHki 
(firewalls) b MHTepHeT npocTpaHCTBOTO, KOMyHMKaunaTa Me>KAy OTAe/iHMTe 
npi/i/io>KeHkifl CTaBa cm/iho 3aTpyAHeHa. 

OcHOBeH npo6/ieM npn TexHO/iorwkiTe Tun "Pa3npeAe/ieHki o6eKTn" ca /lkincaTa 
Ha Me>KAyn/iaTc|3opMeHa cbBMecmMOcr (interoperability) v\ TpyAHOCTMTe npn 
M3rpa>KAaHeTO Ha xeTeporeHHa MHCJDpacTpyKTypa 3a npeAOcraBeHaTa yc/iyra. 
M3no^3BaHeTO Ha OTAa/ieneH o6eKT v\nv\ HeroB MeTOA M3MCKBa, npn K/iweHTa 
Aa e MMn^eMeHTupaHa cbmaTa apxnTeKTypa, KaKBaTO v\ Ha ctpBtpa, a TOBa 
boam ao cki/iHa TexHO/iori/mHa o6B"bp3aHOCT Me>KAy AOcraBUkiKa Ha yc/iyraTa v\ 

HeMHMTe KOHCyMaTOpM. 

Oiue eAMH npo6/ieM Ha pa3r/ie>KAaHkifl MOAe/i e noAAPt>>KKaTa Ha pa3/innHw 
BepcuM m HacTpoMKM Ha npw/io>KeHkieTO. 3a Aa MO>xe K/iweHTbT Aa M3no/i3Ba 
AaAeH OTAa/ieneH o6eKT, tom Tpa6Ba Aa e cbo6pa3eH c Bepci/m Ha npi/i/io>Ke- 
HueTO, KoeTO e pa3no/io>KeHO Ha OTAa/ieneHaTa MaiunHa, iokto Aa M3no/i3Ba v\ 

MAeHTM4HM HaCTpOMKM C HerO. 

kl3MCKBaHMn 3a cbBpeMeHHMTe pa3npeAe/ieHM npmicoKeHmi 

HeAOCTaTtunTe Ha MOAe/ia "Pa3npeAe/ieHM o6eKTn" cJDopMnpaT M3MCKBaHMfl, Ha 
komto Tpa6Ba Aa OTroBapa cbBpeMeHHaTa apxnTeKTypa 3a pa3npeAe/ieHki npn- 
/io>KeHkifl. Hakom ot tax ca cneAHkiTe: 

- Me>KAyn^aTc|DopMeHa KOMyHMKauna - OTAa/ieneHkiTe nporpaMHM KOMno- 
HeHTM Tpa6Ba Aa ca p,ocrbuuv\ 3a K/ineHTM c pa3/ikmHki onepaunoHHM 
cucTeMM, M3rpaAeHM Btpxy pa3/ikmHki coc|DTyepHM n/iaTc|DopMM m c pa3- 
/imuhm e3Mun 3a nporpaMkipaHe. 

- Ba3npaHa Ha OTBopeHM MHTepHeT craHAapTki v\ TexHO/iornn - pa3/iwn- 
HMTe KOMnoHeHTM Ha pa3npeAe^eHMTe npn^OKeHMfl Tpa6Ba Aa ca ziecHO 
AOCTbnHM npe3 MHTepHeT v\ p,a ce Bt3no/i3BaT v\3\\su\o ot npeAMMCTBaTa 
Ha r/io6a/iHaTa Mpexa. Te Tpa6Ba Aa He ca TexHO/iorwuHO o6B"bp3aHM c 
AaAeH AOcraBUMK. 

- CaMOonncaHne - apxnTeKTypaTa 3a pa3npeAe/ieHki npw/io>KeHi/ifl Tpa6Ba 
Aa npeAOCTaBfl b"B3mo>khoct 3a caMOonncaHne Ha nporpaMHMTe KOMno- 
HeHTM, KoeTO Aa no3BO/i*iBa taxhoto M3no^3BaHe 6e3 Aa e Heo6xoAMMO 



506 nporpaMnpaHe 3a .NET Framework (tom 2) 

npeflBapkiTe/iHO no3HaBaHe Ha crpyKTypaTa mm m MHTepcpewcbT 3a 

flOCTbn flO TAX. 

Ye6 ycnyrwTe pewaBaT bcmukm Te3M npo6/ieMki, a ocBeH TOBa OTKpuBaT v\ hobm 
xopn30HTM npefl pa3pa6oT4MUMTe Ha pa3npe,qe/ieHki npi/i/ioxeHkifl. HeKa vv\ 
pa3r/ieflaMe b p,ejav\i\v\. 



Ye6 yc/iyrw 



Ye6 ycnyrwTe ca HOBa epa b pa3pa6oTKaTa Ha pa3npe,qe/ieHki npw/io>KeHkifl. Te 
npeflocTaBAT hobo hmbo Ha a6crpaKUkifl Hafl Bene cbiuecTByBaiunTe MOfle/iw, 
KoeTO ctom HaA e3MUMTe 3a nporpaMnpaHe, onepaunoHHMTe cwcreMM v\ Mpe- 
>KOBMTe KOMyHMKaunoHHM npoTOKO/iw. B"b3no^3BaMKM ce ot Bene M3rpafleHMTe 
TexHO^orn^HM MOfle^n b 1/lHTepHeT i/i 6a3npaMKM ce v\3\\s\no Ha OTBopeHM 
CTaHAapTM, ye6 yc/iyrwTe ce npeBptiuaT b ocHOBHaTa i/mcppacrpyKTypa, kohto 

CB"bp3Ba BCM4KM KOMnKDTbpHM yCTpOMCTBa. 

ripeAM fla ce cnpeM no-no,qpo6HO Ha TexHO/iorwyiTa Ha ye6 ycnyri/iTe, HeKa 
irbpBO o6achmm KaKBO BCbiuHOCT 03HanaBa TepMUHtT "yc/iyra" . 

KaKBO e yc/iyra? 

B pea/iHMfl >kmbot yc/iyraTa npeflcraB/iHBa eflUHnua pa6oTa M3BtpiueHa ot 
AOcraBUkiKa Ha yc/iyrw. Ha BceKM ot Hac My ce cnynBa/io fla My ce pa3Ba/iw 
Te^eBM3opa v\nv\ fla My ce 3anyujn BOflonpoBOfleH KaHa/i. B TaKtB cnynaw Hue 
M3BMKBaMe TexHMK m tom Tpa6Ba fla peujn npo6/ieMa, KaTO npeflcraBki npefl 
Hac >Ke^aHMfl pe3y/iTaT - nonpaBeH Te/ieBM3op v\nv\ OTnyiueH KaHa/i. 

B onucaHMTe cueHapnn Hue ce HBABaMe K/ii/ieHTM Ha yc/iyraTa, T.e. HeMHM 
KOHcyMaTopn, a cpupMaTa, 3a koato pa6oTM TexHi/iKtT, HenH flocraBUMK. 
Yc/iyraTa MMa hcho flecpuHnpaHM bxoahm napaMeTpn v\ acHa ue/i (M3xoflHM 
pe3y^TaTn). Ta MMa pa3/innHw KanecrBeHw xapaKTepucTMKn: ueHa Ha caMaTa 
yc/iyra, BpeMe 3a HewHOTO M3B"bpujBaHe, KopeKTHOcr npn i/i3n"b/iHeHi/ieTO v\ v\ 
flpyrn. Yc/iyraTa e ziecHa 3a i/i3no/i3BaHe - Hue He ce MHTepecyBaMe no KaKtB 
Ha^MH HaujuflT Te/ieBki3op me 6"bfle nonpaBeH v\nv\ ko/iko ycv\j\v\s\ me M3pa3- 
xoflBa BOflonpoBOfl4MK"bT 3a fla OTnyujn KaHa/ia - 3a Hac e Ba>KHO pa6oTaTa fla 
6"bfle CBtpiueHa. Yc/iyraTa e v\ BMHarn flocTbnHa npn Hy>Kfla ot Hea. 

KaKBO e ye6 yc/iyra? 

Ye6 ycnyrwTe He caMO Hanoflo6flBaT ycnyrwTe ot pea/iHkifl >kmbot, ho m MOfle- 
ziwpaT taxhoto noBefleHne. Te npeflcraB/iHBaT nporpaMHM KOMnoHeHTM (ha- 
KaKBa cneuncpM4Ha ziornKa, M3nnc/inTe/ieH pecypc v\nv\ onpefle/ieHa MHCpopMa- 
Ukisi), komto ca flocTtnHM OTfla/ieneHO npe3 ye6. 

Ye6 ycnyrwTe ca flocTbnHM Ha npaKTMKa ot BceKM K/iweHT, komto noflfl"bp>Ka 
Bp"b3Ka c ye6, 3aiuoTO i/i3no/i3BaT OTBopeHM 1/lHTepHeT craHflapâ„¢ 3a KOMyHM- 
Kaunfl. Te ca He3aBMCMMM KaKTO ot onepaunoHHaTa cwcreMa, TaKa v\ ot 
n^aTCpopMaTa v\ e3MUMTe 3a nporpaMnpaHe, Ha komto ce pa3pa6oTBaT. 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 507 

ApxnTeKTypHO ye6 yc/iyrwTe ca c|DyHKUMOHa^HO He3aBMCMMM KOMnoHeHTM v\ ca 
cna6o o6B"bp3aHM c K/iweHTa, komto vv\ M3no/i3Ba (loosely coupled). K/iweHTbT 
nop"b4Ba, ycnyraTa i/i3n"b/iHHBa noptuKaTa v\ Bptiua pe3y/uaTa o6paTHO npn 
K^neHTa. K/iweHTbT He ce m-uepecyBa KaK touho pa6oTM ye6 ycnyraTa v\ 3a p,a 
n M3no/i3Ba He Tpa6Ba fla 3Hae hmluo noBene 3a Hea ocBeH iokbi/i bxoahm 
AaHHM p,a v\ noAaAe. 



ripHHMMn Ha fleMCTBMe Ha ye6 yc/iyrnTe 

Ye6 yc/iyrkue npeAcraB/iflBaT XML 6a3npaH CTaHAapT 3a OTAa/ieneHO m3bmk- 
BaHe Ha <fcyHKu.kiOHa/iHOCT. Te pa6oTHT Ha npuHunna Ha o6MHHa Ha npocTM 
SOAP c"bo6iueHMfl Me>KAy K/ikieHTa v\ AOcraBUMKa Ha ycnyraTa. Bchko cbo6me- 
Hue ce cbCTOM ot ashhm m MeTaAaHHM, onucBaiun Te3M ashhu. IHe ce cnpeM 
no-noApo6HO Ha CTaHAapTa SOAP v\ Ha crpyicrypaTa Ha SOAP C"bo6iueHMflTa 
Ma/iKO no-HaTarbK, KoraTO pa3r/ie>KAaMe i/iHcfrpacrpyKTypaTa Ha ye6 ycnyrme . 

Ye6 yc/iyrwTe ki3no/i3BaT yTBtpAeHna b MHTepHeT v\ npi/i ye6 TexHO/iornnTe 
MOAe/i "3aflBKa/oTroBop" (request/response), t. e. 3a BCflKa eAHa OTAe/iHa 
3aaBKa ki>m ctpBtpa, tom Bptiua OTAe/ieH OTroBop cneuwa/iHO 3a Hea. no 
ctiuMfl MOAe/i pa6oTAT v\ ye6 npn.no>t<eHkiaTa : ye6 K/iweHTbT noAaBa HTTP 
3aaBKM, a ye6 ctpBtptT vv\ o6pa6oTBa v\ Bptiua HTTP oiroBop. 

npeHOC Ha SOAP cbo6iiieHMfi no HTTP 

ripn ye6 yc/iyrkiTe npoTOKO/i"bT 3a npeHOC Ha 3aaBKMTe v\ OTroBopi/ue no 
noApa36npaHe e HTTP, ho KaTO TaicbB MO>xe p,a ce M3no/i3Ba v\ BceKM Apyr 
npoTOKO/i, komto MO>xe p,a npeHacyi XML ashhh. CneABamaTa cJDnrypa m/ikdct- 
pupa M3no^3BaHeTO Ha HTTP 3a npeHOC Ha SOAP Ch>o6meHkifl: 



POST /path/bank, asmx HTTP/' 1.1 
Con tent -Type : text/aunl 
SOAPActlon; " urn : banking; transfer" 

Content-Length: nnnn 

Ooap i Envelope, . , 



Request 





Response 



HTTP/1, 1 200 OK 
Content- Type: text/aunl 
Content- Length: nnnn 

< s o ap : Envel ope , . . 



HTTP/1.1 500 Internal Server Error 
Content- Type : text/xml 
Content- Length: nnnn 

<soap : Envelops... 



508 nporpaMnpaHe 3a .NET Framework (tom 2) 

HTTP 3aaBKaTa ce cbcrow ot flBe nacm: xefltp, komto cbfltpwa pa3/iwnHn 
napaMeTpn Ha 3a*iBKaTa (nHCpopMauna 3a caMaTa 3a*iBKa v\ 3a K/iweHTa, komto 
n M3npaiua) v\ th/io, KoeTO Cbfltpwa SOAP Cbo6meHkieTO. SOAP C"bo6iueHneTO 
ce cbCTOM cbuxo ot flBe nacm: flaHHM (SOAP body) v\ MeTaflaHHM (SOAP 
header). 

B xefltpa Ha HTTP 3a*iBKaTa ce nocouBa HeMHMflT bma. B npuMepa e i/i3no/i- 
3BaHa HTTP-POST 3a*iBKa no Bepcua 1.1 Ha HTTP npoTOKO/ia. B xefltpa ce 
3aflaBa oiue TkiirbT Ha cbfltpwaHweTO (content-Type), komto Tpa6Ba fla e 
text/xml, T"bM KaTO SOAP Cbo6meHki*iTa npeflcraB/iflBaT XML. 3a*iBKaTa 3a- 
A"b/i>Ki/iTe/iHO Tpa6Ba fla cbfltpwa v\ xefltpa soAPAction, flopn v\ aKO tom e 6e3 
cbfl"bp>KaHMe. HeroBOTO npeflHa3HaneHwe e fla yKa>Ke cbLUHOcrra Ha SOAP 
C"bo6iueHkieTO. 

C^efl KaTO no/iynw TaKa cpopMnpaHaTa 3aaBKa, ctpBtptT M3npaiua OTroBop, 
komto MO>Ke fla e v\i\v\ etc CTaTyc 200 ok (ycnex), v\i\v\ CTaTyc 500 internal 
server Error (rpeujKa). TpeiuKa ce Bptifla, aKO SOAP c"bo6iueHneTO, M3npa- 
TeHO KaTO OTroBop, cwvbpwa SOAP Fault, t. e. B"b3HkiKHa/i e npo6/ieM 
(ki3K/iioneHi/ie) npn M3n"b/iHeHweTO Ha yc/iyraTa. 

MH4>pacTpyKTypa Ha ye6 ycnyrwTe 

Cnefl KaTO npoc/ieflwxMe b p,ejav\i\v\ KaK ce TpaHcnopTupaT SOAP 3aaBKMTe 1/1 
cbOTBeTHMTe mm OTroBopn, cera me pa3r/ie,qaMe uyi/iaTa kmcppacrpyKTypa Ha 
ye6 ycnyrwTe - CbBKynHOcrra ot craHflapTMTe, MOfle/iMTe v\ npuHunnnTe, Ha 
komto Te ce 6a3npaT. 





§ 



1 Directory 

( h ttp : //u ddi , m I crosoft, org ) 

The client attempts to locate an XML Web service 

A URL to a discovery document I? linked. 

UDDI (or other 

2 Disco very directory 

( h ttp : //w w w ,c on toso ,co m/defa ul t ,d Iscc ) serv ice) 

The client requests the discovery document. 
The discovery document is returned. 



3 Description 

( h ttp : //w <ti w ,c on toso ,co m/M y WebSe r vice . WS DL ) 



XML Web \\_ The client requests the service description. 

service client 

The service description is returned. 



Wire Format 

The client requests the XML Web service. 

The service response is returned. 




Ustohhhk: MS DIM Library 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 509 

MHCJDpacTpyKTypaTa Ha ye6 ycnyrwTe e M3rpafleHa Btpxy hako/iko ochobhm 
npuHunna: ta npaBM yc/iyrkiTe ziecHO flOCTbnHki, caMOonncBaiun ce v\ M3no/i3- 
Baiun Bene yTBtpfleHi/i v\ CTaHAapTM3npaHn npoTOKO/iw 3a KOMyHMKauna. 

Ha cxeMaTa no-rope ca npeflcraBeHki OT,qe/iHi/iTe KOMnoHeHTM ot ufl/iocmaTa 
MHCJDpacTpyKTypa Ha ye6 yc/iyri/iTe: 

1. flupeKTopufl (Directory) - npeflcraB/iHBa ueHTpa/iki3kipaH0 macto ( KaTa/ior) 
3a cbxpaHeHne Ha onwcaHi/m Ha ye6 yc/iyrw, pa3pa6oTeHM ot pa3/ii/mHi/i 
npon3BOflMTe^M. npeflocTaBfl B"b3MO>KHOCT 3a TbpceHe Ha ycnyrw no pa3- 
/1M4HM napaMeTpn. M3no/i3Ba ce CTaHAaprbT UDDI (Universal Description, 
Discovery, and Integration), komto c/iyww 3a perncTpauna, OTKpuBaHe v\ 
CB"bp3BaHe ki>m KOHKpeTHa ye6 ycnyra. 

2. OTKpuBaHe (Discovery) - TOBa e npouecbT Ha HaMnpaHe onucaHneTO Ha 
flafleHa ye6 ycnyra. DISCO cneunc|DMKauMflTa npeflocraBfl Hani/m 3a otkpm- 
BaHe Ha oni/icaHi/mTa Ha ye6 yc/iyri/i, pa3no/io>KeHi/i Ha onpeAe/ieH ctpBtp. 

3. OnucaHne (Description) - 3a fla MO>KeM fla i/i3no/i3BaMe onpe,qe/ieHa ye6 
ycnyra Tpa6Ba fla 3HaeM HeMHOTO onucaHne (nporpaMeH MHTepc|DeMc). 
OnucaHneTO ce M3roTBfl no CTaHflapTM3npaH HanwH npe3 ki3no/i3BaHe Ha 
XML 6a3kipaHkifl e3MK 3a onucaHne Ha kiHTepc)DeMca Ha ye6 yc/iyrw - WSDL 
(Web Services Description Language). 

4. OopMaT Ha 3aaBKMTe (Wire Format) - 3a fla 6"bflaT yHMBepca/iHM ye6 
yc/iyrwTe ce Hy>Kfla*iT ot craHflapâ„¢ v\ npoTOKO/iw, komto ca yTBtpflki/iki 
mactoto cm b 1/lHTepHeT npocTpaHCTBOTO. ToBa ca XML, XSD, HTTP v\ SOAP. 

BckinKki Te3M KOMnoHeHTM ca o6B"bp3aHM noMe>Kfly cm m M3rpa>KflaT ufl/iocmaTa 
MHCJDpacTpyKTypa Ha ye6 ycnyrwTe. IHe ce cnpeM no-noflpo6HO Ha BceKM eflMH 

OT TAX. 

AnpeKTopnn 3a ye6 yc/iyrn 

flupeKTopnnTe 3a ye6 yc/iyrw npeflcraB/iflBaT eflMHHO macto, KbfleTO pa3/innHw 
npoM3BOflMTe/in ny6^MKyBaT MHCJDopMaunfl 3a yc/iyri/iTe, komto npefl/iaraT. 
flupeKTopnnTe ca KaTO ye6 yKa3aTe/i 3a yc/iyrw (KaTa/ior). CaMMTe ye6 ycnyrw 
ca opraHM3npaHM b pa3/innHw KaTeropnn, KaTO no to3m HanwH e y/iecHeHO 
HaMnpaHeTO Ha ycnyrw 3a onpefle/ieHa ue/i v\nv\ nocTaBeHa 3a,aana. flupeKTO- 
pnnTe npefl^araT TtpceHe Ha ycnyrw no 3aflafleHM napaMeTpn (npon3BOfli/iTe/i, 
KaTeropua, MMe). riy6/ii/iKyBaHeTO v\ TbpceHeTO Ha MHCJDopMauMfl 3a flafleHa ye6 
ycnyra CTaBa nocpeflCTBOM UDDI CTaHflapTa. 

Universal Description, Discovery, and Integration (UDDI) 

UDDI npeflcraB/iflBa OTBopeH XML 6a3npaH CTaHflapT 3a perncTpupaHe, 
OTKpuBaHe m CB"bp3BaHe KtM ye6 yc/iyrw. Cneunc|DMKauMflTa My e pa3pa6oTeHa 
ntpBOHana/iHO cbBMecmo ot Microsoft v\ IBM, a b MOMeHTa ce noflfltpxa v\ 
pa3BMBa ot KOHCopunyMa OASIS (Organization for the Advancement of 
Structured Information Standards). 



510 



flporpaMnpaHe 3a .NET Framework (tom 2) 



UDDI caM no ce6e cm Chino e ye6 yc/iyra. Hei/maTa cpyHKU.i/iOHa/iHOCT BK/iiouBa 
perncTpaunfl v\ TbpceHe Ha flpyrw yc/iyrw. 

Microsoft npefl/iara Ha6op ot K/iacoBe (UDDI SDK), 4pe3 komto MoraT fla ce 
pa3pa6oTBaT npn/io>KeHkifl, ki3no/i3Bamki ua/iaTa molu m rbBKaBOCT Ha UDDI. 
Te3M K/iacoBe Hairb/iHO cbBnaflaT c onucaHMTe b cneuncpuKaunaTa Ha UDDI 
CTaHflapTa. 



npMMepM 3a UDDI AupeKTopim 

Eto hako/iko npuMepa 3a UDDI flkipeKTopm/i, ny6/iwnHO flocrbrmw b MHTepHeT: 

- http://uddi.microsoft.com ( http://test.uddi.microsoft.com ') 

- https://uddi.ibm.com/ubr/reqistry.html 
( https://uddi.ibm.com/testreqistry/reqistry.html ') 

- http://uddi.sap.com ( http://udditest.sap.com ') 

3a6e/ie>KKa: b cko6m ca aflpecwTe, komto MoraT fla ce M3no/i3BaT 3a TecTOBM 
\\ei\v\ v\nv\ no-BpeMe Ha pa3pa6oTKa. 



Eto KaK M3r/ie>Kfla UDDI flupeKTopnaTa Ha Microsoft: 



3 Microsoft UDDI Business Registry (UBR) node - Microsoft Internet Exp 



File Edit View Favorites look Help 



Jnjjc] 



©Sack - O - £ jg ; | P Search Favorites € - . jj - • & ii £i (H -Ji 



Address |.*j http://uddi,m«:rosoft.com/search/frames.aspx?frarnes=trueasearch=aa4W621-3ebe-470a-a9cb-828al613d7ci_^ I^Go Li*s 



uddi 

Business Registry Node 



Home Search 



Search 




5-ttj.n In 



I UDDI Help 



"3^i 



Results | Explorer 



B'Jffc Cape Clear Software 
\ Andy Grove 
tj USA Headquarters 
| European Headquarters 

bAHHWIHIMIHMIWI 

B'i^ http://live.capesdence.co 
'"j^ Airport Weather 
B Z§S CapeConnect SOAPBuilder " 
Sz£l Corporate Web Site 

4* http://www.capeclear.corr 
B Z§S Developer Web Site 

^ www, capescience.com 
B Z^X PolyCalc web Service 
Ei*f http://live-capesciencexo 



£3 



A 



Cipt Clatr Softwiri 

^ Airport Weather Check 



An XML Web service uses standard Web protocols to share data with one or 
applications, regardless of how each service is implemented in its native en 1 
details, categorizations, and access points (bindings) for a service using the 



more 

'ironment. View 
tabs below. 



Details [ Bindings | Categories 



Details provide the service name and a brief description. The service key i 
and is intended for use in programmatic queries. 



Service Key: 

55c48719-52dc-49d2-9a74-7c01383771b7 



(en) 

Airport Weather Check 

1 record(s) found. 



Descriptions 



(en) 

Web Service to provide weather information for international airports 

1 record(s) found. 



40 Internet 



Ha KapTMHKaTa MOxeM fla bmamm, ne CMe HaMepw/iw ye6 yc/iyra, kohto me hm 
npeflocTaBM MHCpopMauna KaKBO e BpeMeTO b ro/iHMa nacr ot MexflyHapoflHM- 



HnaBa 22. OTfla/ieneHM M3BMKBaHHfl c .NET Remoting 511 

Te nejwuxa. OcBeH Ta3M ycnyra KOMnaHkiflTa-npoki3BOflkiTe/i (Cape Clear 
Software) npefl/iara oiue hako/iko, komto MO>KeM fla bmamm b naeaja nacr Ha 
npo3opeua. B p,ejav\nv\je 3a yc/iyraTa ce Bi/i>Kfla v\ uev\Hv\s\T service Key. B 
UDDI perncTpnTe npn perncTpupaHeTO Ha AaAeHa ye6 yc/iyra, Ha Hea v\ ce 
flaBa yHMKa^eH MAeHTnc|DMKaTop - service Key, komto a npaBM yHi/iKa/iHa b 
r/io6a/iHaTa Mpe>Ka. To3m MfleHTnc|DMKaTop cnep, TOBa MO>Ke fla ce M3no/i3Ba 3a 
flMHaMM^eH flOCTbn flo yc/iyraTa npe3 UDDI. 

OTKpiiBaHe Ha ye6 yc/iyni 

Pa3MeflaxMe KaKBO npeflcraB/iflBaT UDDI flupeKTopnnTe 3a ycnyri/i, a cera me 
npocnefli/iM npoueca Ha OTKpuBaHe Ha ye6 yc/iyrw. To3m npouec MMa 3a ue/i 
j\OKanv\3a\\v\s\ m M3B^M4aHe Ha onucaHMATa Ha ye6 yc/iyrw, pa3no/io>KeHki 
Btpxy flafleH cbpBtp. 3a OTKpuBaHeTO Ha yc/iyrwTe ce M3no/i3Ba DISCO cne- 

UMCJDMKaUMflTa. 

DISCO (Discovery of Web Services) 

DISCO cneunc|DMKauMflTa e pa3pa6oTeHa ot Microsoft v\ MMeTO v\ MflBa ot 
HeMHOTO npeflHa3Ha4eHne. DISCO e cbu\o XML 6a3npaH craHflapT v\ v\wa 
M3K^K)4MTe^HO npocTa crpyKTypa. HeroBaTa ue/i e fla noconi/i Bpt3KaTa kbm 
cpaM/ia c onucaHneTO Ha ye6 yc/iyraTa, Bp"b3KaTa kbm caMaTa yc/iyra v\ Bp"b3Ka 
ki>m flOKyMeHTaunfl 3a yc/iyraTa. floKyMeHTMTe c DISCO onucaHne ce ctxpa- 
HHBaT BtB <\>av\n c pa3LunpeHMe .disco. Eto npuMep 3a TaicbB <\>av\s\: 



TypesService . disco 



<?xml version="l. 0" encoding="utf-8 "?> 
<discovery 

xmlns="http : //schemas . xmlsoap . org/ disco/ "> 
<contractRef 

ref="http : //www. my server . com/Demo- 5-Service- 

Types /TypesService . asmx?wsdl" 
docRef="http : //www. my server . com/Demo- 5-Service- 

Types/TypesService . asmx" 
xmlns="http : //schemas . xmlsoap .org/disco/scl/" /> 
<soap 

address="http : //www. my server . com/Demo- 5-Service- 

Types/TypesService . asmx" 
xmlns : ql="http : //www. my server . com/ schemas/ 

Demo_5_Service_Types/" 
binding="ql : TypesServiceSoap" 

xmlns="http : //schemas . xmlsoap .org/ disco/soap/" /> 
</discovery> 



06nKHOBeHO .disco c|3aM^"bT ce pa3no/iara b vnaeuaia flupeKTopua Ha cbOT- 
BeTHaTa ye6 yc/iyra. HanpuMep, aKO yc/iyraTa e pa3no/io>KeHa Ha ye6 ctp- 
Btpa www.myserver.com v\ ce Ka3Ba math v\ r/iaBHaTa v\ flupeKTopua e etc 
ctiuoTO MMe, to ntTAT KtM .disco (fcaw/ia 3a Ta3M yc/iyra me 6"bfle 
http://www.myserver.com/math/math.disco . 



512 nporpaMnpaHe 3a .NET Framework (tom 2) 

Ye6 yc/iyrMTe, pa3pa6oTeHM c ASP.NET, BptiuaT cboa disco cpaw/i, KoraTO ca 
M3BMKaHM c napaMeTbp ?disco, HanpuMep http://www.myserver.com/Demo- 
5-Service-Tvpes/TypesService.asmx?disco . 

UDDI H DISCO 

KaKTO Bene pa36paxMe, v\ UDDI v\ DISCO hm npeA-naraT Ha^MHn 3a OTKpuBaHe 
Ha ye6 ycnyrM. A KaKBa e pa3/im<aTa Me>KAy flBaTa craHAapTa? 

UDDI hm npeAOcraBH ueHTpa/iM3MpaH0 macto perncTpupaHe Ha ycnyrM, 
KtfleTO Te ca pa3npefle/ieHki b pa3/iMHHM KaTeropnn, cnpyiMO HAKaKBM 
npn3Haun. Ako MCKaMe HawaTa ye6 ycnyra p,a e o6iuecTBeHO flocTtnHa v\ 
ziecHO OTKpuBaeMa, Tpa6Ba p,a n perncTpupaMe b UDDI perncTpnTe. 

CTaHAaprbT DISCO hm AaBa B"b3M0>KH0CT 3a OTKpuBaHe Ha bcmukm ye6 ycnyrM, 
pa3no^o>KeHM ziOKa/iHO Ha KOHKpeTeH ctpBtp, nopaflu KoeTO e mhoto yqo6eH 
b npoueca Ha pa3pa6oTKaTa Ha cocpTyep. DISCO e v\ tacho MHTerpupaH c 
Visual Studio .NET. 

HflKOki ye6 ycnyrM Moxe p,a HHMaT DISCO onucaHne, 3aiuoTO to He e 
3aA"b/i>KkiTe.nHa, a caMO npenoptuMTe/iHa nacr ot ye6 ycnyrMTe. 

WSDL onkicaHMd Ha yc/iyrw 

C^eABaiuaTa Ba>KHa nacr ot MHCppacrpyKTypaTa Ha ye6 ycnyrMTe e taxhoto 
onucaHne. 3a fla MO>xeM p,a M3no/i3BaMe AaAeHa ye6 ycnyra, Tpa6Ba p,a 3HaeM 
HeMHMfl MHTepcpewc 3a flocTtn. Tom npeAcraB/uiBa onucaHne Ha MeTOflMTe, 
komto ye6 yc/iyraTa npeAOcraBH, TexHMTe MMeHa, bxoahm m m3xoahm napaMeT- 
pn, M3no^3BaHMTe TunoBe ashhm m Apyrn MeTaAaHHM 3a caMaTa ycnyra. 

3a onucaHneTO Ha MHTepcpewca v\ HanMHa Ha Aocrbn p,o ye6 ycnyrM ce 
M3no/i3Ba XML 6a3npaHM5qT e3MK WSDL (Web Services Description Language), 
neTe ce "yn3A"b.n". Tom ctiuo e OTBopeH CTaHAapT v\ c HeroBOTO pa3BMTne ce 
3aHMMaBa W3C (World Wide Web Consortium). 

Eaho ot npeAMMCTBaTa Ha WSDL e, ne tom e pasujupaeM bbb bcako eAHO 
OTHOiueHMe. Tom hmto hm o6Btp3Ba c KOHKpeTeH TpaHcnopTeH npoTOKO/i, hmto 
M3MCKBa onpeAe/ieHa cxeMa, no koato p,a onMCBaMe cno>KHMTe TMnoBe, komto 
M3no/i3BaMe b HaujMTe ycnyrM. TaKa e B"b3M0>KH0 pa3/iMHHM TexHO/iorMM p,a 
M3no^3BaT pa3^M4HM XML 6a3MpaHM onMcaHMfl Ha TMnoBeTe ashhm, c komto 
pa6oTAT. 

C"biuo KaKTO BptiuaT cbo*i disco cpafi/i, ye6 ycnyrMTe pa3pa6oTeHM c ASP.NET, 
BptiuaT WSDL onMcaHMeTO cm KoraTO 6"bAaT M3BMKaHM ch>c cneu.Ma/iHMfl napa- 
MeTbp ?wsdl. HanpMMep: 

http://www.myserver.com/Demo-5-Service-Types/TypesService.asmx7wsdl 

WSDL onncaHne - npiiriep 

HeKa p,a pa3r/ieAaMe no-noApo6HO WSDL onMcaHMeTO Ha eAHa npMMepHa ye6 
ycnyra - ycnyraTa Typesservice.asmx (b>k. npMMepa ot TOUKa "ripexB"bp.naHe 
Ha TMnoBe" ): 



HnaBa 22. OTfla/ieneHM kBBkiKBaHkm c .NET Remoting 513 



TypesService . wsdl 



<?xml version="l. 0" encoding="utf-8 "?> 
<def initions 

xmlns : http="http : //schemas . xmlsoap . org/wsdl/http/ " 
xmlns : soap="http : //schemas . xmlsoap . org/wsdl/soap/ " 
xmlns: s="http: //www. w3 . org/2 1/XMLSchema" 
xmlns : s0="http : //www. my server . com/Demo_5_Service_Types/ " 
xmlns : soapenc="http : //schemas . xmlsoap . org/soap/encoding/ " 
xmlns : tm="http : //microsoft . com/wsdl/mime/textMatching/ " 
xmlns :mime="http : //schemas . xmlsoap . org/ wsdl /mime/ " 
targetNamespace= 

"http : //www. my server . com/services/Demo_5_Service_Types/ " 
xmlns="http : //schemas . xmlsoap . org/wsdl/ "> 
<types> 

<s : schema 
element FormDef ault=" qualified" targetNamespace= 

"http : //www. my server . com/Demo_5_Service_Types/ "> 
<s:import namespace="http : //www. w3 . org/2001/XMLSchema" /> 
<s: element name="GetColors"> 

<s : complexType /> 
</s : element> 

<s : element name="GetColorsResponse"> 
<s : complexType> 
<s : sequence> 

<s: element minOccurs="0" maxOccurs="l" 

name="GetColorsResult" type="s0 :ArrayOf Color" /> 
</s : sequence> 
</s : complexType> 
</s : element> 

</s : schema> 
</types> 
<message name="GetColorsSoapIn"> 

<part name="parameters" element="sO : GetColors" /> 
</message> 
<message name="GetColorsSoapOut"> 

</message> 

<portType name="TypesServiceSoap"> 
<operation name="GetColors"> 
<documentation> 

Returns a list of available colors. 
</documentation> 
<input message="sO : GetColorsSoapIn" /> 
<output message="sO : GetColorsSoapOut" /> 
</operation> 
<operation name="CalculateDistance"> 



514 flporpaMnpaHe 3a .NET Framework (tom 2) 



</operation> 

</portType> 

<binding name="TypesServiceSoap" type="sO : TypesServiceSoap"> 
<soap : binding 

transport="http : //schemas . xmlsoap . org/soap/http" 
style="document" /> 
<operation name="GetColors"> 

<soap : operation soapAction="http : //www. devbg . org/ services/ 
Demo_5_Service_Types/GetColors" 
style="document" /> 
<input> 

<soap:body use="literal" /> 
</input> 
<output> 

<soap:body use="literal" /> 
</output> 
</operation> 

</binding> 

<service name="TypesService"> 
<documentation> 

Demo Web service - demonstrates complex type marshalling. 
</documentation> 
<port name="TypesServiceSoap" binding="sO : TypesServiceSoap"> 
<soap : address location="http : //www. my server . com/ Demo- 5- 
Service-Types/TypesService . asmx" /> 
</port> 
</service> 
</def initions> 



CTpyKTypa Ha WSDL onncaHneTO 

WSDL M3rpa>Kfla eAHO a6cTpaKTH0 onucaHne Ha yc/iyraTa - noflA^pxaHMTe 
MeTOflM, M3no^3BaHMTe TunoBe flaHHM, HanwH 3a flocrbn ao yc/iyraTa, iokto m 
caMMAT m aflpec. no-Ba>KHM e/ieMeHTki ot WSDL onucaHneTO ca: 

- types - TMirbT Ha flaHHMTe, komto ce noflaBaT v\nv\ BptiuaT ot yc/iyraTa. 
no noflpa36npaHe ce M3no/i3Ba XSD 3a onucBaHeTO mm (b>k. TeMaTa 
" Pa6oTa c XML ", ho Moxe p.a ce no/i3Ba v\ Apyra cxeMa 3a onucaHne Ha 

flaHHM. 

- message - onucBa c"bo6iueHMflTa, komto me ce o6MeH*rr Me>Kfly yc/iyraTa 
m K^neHTa, KaKTO m ot KaicbB Bene onucaH Tun ca napaMeTpnTe mm. 

- portType - a6cTpaKTHaTa AecpMHuuna 3a ye6 ycnyra. Cbcroi/i ce ot 
KOHKpeTHM onepauuM (MeTOAn). Cnp^MO BMfla Ha onepaunaTa MO>xe fla 
MMa BxoflHM, M3XOAHM v\i\v\ ctflt p>Ka iu m rpeujKa e^eMeHTM (fault), komto 
conaT KtM Bene onucaHMTe cbo6meHi/m. 



HnaBa 22. OTfla/ieneHM M3BMKBaHMfl c .NET Remoting 515 



- binding - yKa3Ba no KaKtB Ha^MH me ce o6MeHflT cbo6meHkiflTa 3a 
BCAKa ot Bene flecJDMHupaHMTe onepaunn. 

- service - KOHKpeTHaTa flecJDMHMunfl Ha ye6 ycnyraTa, koato rpynupa 

BCM4KM Bene OnucaHM B PortType OnepaUMM C KOHKpeTeH Binding. 

3aAaBa v\ aflpeca Ha ye6 ycnyraTa. 

Eto m fluarpaMa, koato npeflCTaBa onucaHMTe Bp"b3KM Me>Kfly OTAe/iHMTe e/ie- 
MeHTM Ha WSDL onucaHneTo: 




PortType 



Operation Operation 




Protocol 
(SOAP, etc.) 





Types 






simpleType 


complexType 











Content 



SOAP - cpopMaT Ha 3a«BKMTe 

Cnep, KaTO pa3rvieAaxMe KaK ce OTKpuBaT v\ onucBaT ye6 yc/iyri/iTe, cera me ce 
cnpeM Ha Haw-Ba>KHaTa nacr ot TaxHaTa MHqbpacTpyKTypa, a MMeHHO KaK Te ce 
npeHacyiT b xeTeporeHHa cpefla KaKBaTO e 1/lHTepHeT. 

B AAPOTO Ha ye6 yc/iyrkiTe ctom SOAP craHflaprbT, 6/iaroAapeHkie Ha komto 
K/iweHTbT m AOCTaB4MK"bT Ha yc/iyrw o6MeH*iT C"bo6iueHMfl noMe>KAy cm. 

SOAP (Simple Object Access Protocol) e XML 6a3npaH qbopMaT 3a o6M5iHa Ha 
CTpyKTypupaHa v\ Tnnn3npaHa MHCJDopMaunfl b ye6 npocTpaHCTBOTO. ripn Cb3~ 
AaBaHeTO Ha CTaHAapTa e cna3BaH eAHH ocHOBeH npuHunn - tom p,a He 6"bAe 
yc^o>KHflBaH AOirb/iHMTe/iHO (c/io>KHki apxnTeKTypn KaTO CORBA, Bene ca no- 
Ka3a/iw, ne He ca eqbeKTMBHki b 1/lHTepHeT), ot TyK MABa v\ HeroBOTO MMe. 



516 nporpaMnpaHe 3a .NET Framework (tom 2) 

npeAMMCTBa Ha SOAP 

He caMO 3apaflM CBoyua npocTOTa SOAP e no/iynM/i noflKpenaTa Ha Microsoft, 
IBM, Sun Microsystems, SAP v\ AP- Eto hakom flpyrn HeroBM npenMymecTBa: 

- l/l3no/i3Ba Bene yTBtpfleHM b 1/lHTepHeT wop,env\: XML 3a onucaHne Ha 
c"bo6iueHneTO, XSD 3a onucaHne Ha M3no/i3BaHMTe TunoBe v\ HTTP KaTO 
TpaHcnopTeH npoTOKO/i. 

- flecpMHupa CBOfl co6cTBeHa v\ He3aBMCMMa CMcreMa 3a o6MAHa Ha ch>o6- 
meHMfl (messaging framework), kohto e rbBKaBa v\ ziecHO pa3LUMp*ieMa. 

- He e TflCHO CB"bp3aH c KOHKpeTeH e3MK 3a nporpaMnpaHe v\nv\ n/iaTCpopMa 
3a pa3pa6oTKa. SOAP He npeflocraBsi nporpaMeH MHTepcpewc (API), a 
ocraBfl HeroBaTa pa3pa6oTKa 3a KOHKpeTHi/ia e3MK v\i\v\ n/iaTCpopMa (.NET 
Framework, Java, PHP, ...). 

- npeAOcraBfl Mewflyn/iaTCpopMeHa KOMyHMKauna, 3aiuoTO b caMaTa cm 
ctiuHOCT tom e M3rpaAeH Btpxy OTBopeHM CTaHAapTM (XML). 

- He e CB"bp3aH c KOHKpeTeH TpaHcnopTeH npoTOKO/i. KaTO TaicbB MO>Ke p,a 
ce M3no^3Ba BceKM, komto Mowe p,a npeHaca XML (HanpMMep HTTP, TCP, 
FTP, SMTP, ...). 

- CraHAapTHO SOAP Cbo6meHMHTa ce npeHacsiT no HTTP, KoeTO no3BO/i*iBa 
Te Aa 6"bAaT npeMMHaBaT npe3 3aiuMTHM CTeHM (firewalls). 

Pa3BMTneTO Ha SOAP 

B Hana/iOTO Ha CBoeTO pa3BMTMe (1998 r.) SOAP cneuMCpMKauMATa ce e CB-bp3- 
Ba/ia MaBHO c TexHO/iorMATa Ha XML 6a3MpaHMTe OTAa/ieneHM M3BMKBaHMfl Ha 
MeTOAM - XML-RPC (Remote Procedure Call). Ta e onMCBa/ia no cbom co6cTBeH 
Ha^MH TMnoBeTe, komto ca ce npeAaBa/iM Me>KAy K/iMeHTa m cbpBtpa. 

ripe3 1999 r. cb3AaTe/iMTe Ha SOAP 3a/iaraT Ha XML Schema (XSD), npe3 
koato Aa onMCBaT TMnoBeTe, M3no/i3BaHM b SOAP cbo6meHMeTO. 

rio-K-bCHO, npe3 2001 r., XSD e npMeT ocpMU.Ma/iHO ot W3C KaTO npenop-b^BaH 
CTaHAapT 3a o6M*iHa Ha XML c"bo6iueHMfl. 

riocreneHHO SOAP Ha6Mpa nony/i*ipHOCT m no/iynaBa noAKpenaTa Ha Microsoft. 
OopMMpa ce BepcMfl 1.0 Ha CTaHAapTa. IBM m APyrM cocpTyepHM KOMnaHMM 
BM>KAaT npeMMymecTBaTa Ha SOAP m npe3 npo/ieira Ha 2001 r. 3aeAHO c 
Microsoft M3roTBAT BepcMfl 1.1. ripoMeHMTe cnp^MO BepcMfl 1.0 ca He3HanM- 
Te^HM, ho no-Ba>KHOTO e, ne Bene ue/iTa Ha SOAP He e eAMHcmeHO ojp,ane- 
neHOTO M3BMKBaHe Ha MeTOAM. SOAP caM no ce6e cm Bene npeAcraB/iyiBa 
framework 3a o6MAHa Ha XML 6a3MpaHM cbo6iueHMfl. ToraBa e npeA/ioweHa 
npeA W3C m npMeTa KaTO ocpMu.Ma/ieH CTaHAapT cneu.MCpMKau.MHTa SOAP 
BepcMfl 1.1. 

B MOMeHTa SOAP craHAapTbT MMa BepcMfl 1.2, KaTO npoMeHMTe cnpaMO 1.1 He 
ca 3HanMTe/iHM (eAHa ot tax e, ne SOAP Bene He e aKpoHMM, a npocTO MMe). B 
.NET Framework 1.1 e pea/iM3MpaH SOAP BepcMfl 1.1. 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 517 

CrpyKTypa Ha SOAP cbo6meHHHTa 

CTpyKTypaTa Ha eflHO SOAP cbo6meHi/ie He e cno>KHa. Ta ce cbCTOM ot flBe 
^acTki: SOAP xefltp (header) v\ SOAP ta/io (body), a KaTO KopeHOB e/ieMeHT 
Ha ua/ioto c"bo6iueHne ctom e/ieMeHTbT n/iHK (envelope), komto Tpa6Ba fla 
cbfl"bp>Ka npocTpaHCTBOTO ot MMeHa (namespace) 3a SOAP c"bo6iueHneTO. 

Ha cneflBamaTa cJDnrypa e noKa3aHa crpyKTypaTa Ha eflHO npocTO SOAP 
c"bo6iueHne. Mo>KeM fla bmamm m npocrpaHCTBOTO ot MMeHa, KoeTO b c/iynaa e 
http://schemas.xmlsoap.org/soap/envelope/ cnpaMO Bepci/m 1.1 Ha SOAP 
craHflapTa. Bbb Bepcua 1.2 TOBa npocTpaHCTBO e CMeHeHO v\ HeroBnaT hob 
MfleHTnc|DMKaTop b r/io6a/iHaTa Mpe>Ka (URI - Uniform Resource Identifier) e: 
http://www.w3.org/2003/05/soap-envelope/ . 



<?xml version="1.0" encoding="utf-8"?> 



<soap:Envelope 

xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 



<soap:Header> 

<From>Stefan</From> 

<To>Dido</To> 
</soap:Header> 



<soap:Body> 

<Task>Make me a cup of coffee.</Task> 
</soap:Body> 



</soap:Envelope> 



Cnefl KaTO pa3r/ieflaxMe npuMepHOTO SOAP c"bo6iueHne, cera me ce cnpeM no- 
noflpo6HO Ha ocHOBHMTe HeroBM enewernvw xefltp v\ th/io. 

SOAP xeA"bp 

E^eMeHTbT xefltp He e 3afl"b/i>KMTe/ieH b eflHO SOAP c"bo6iueHne, ho aKO tom 
npucbCTBa 3afl"b^>KMTe^H0 Tpa6Ba fla e npeflu ta/ioto Ha cbo6meHi/ieTO. 
HeroBaTa ue/i e fla pa3ujnpn caMOTO cbo6meHi/ie KaTO flo6aBM flont/iHMTe/iHa 

MeTa MHCJDOpMaUMfl (MeTaflaHHM) M3B"bH Tfl/IOTO. Ta3M MHCJDOpMaUMfl MO>Ke fla 

MMa pa3/ikmeH xapaKTep. Eto m hakom ot HaM-necrwTe npn^OKeHna Ha SOAP 
xefltpa: 

- MapujpyTM3aunfl (routing) - aKO cbo6meHi/ieTO e npeflHa3HaneH0 3a 
hhko/iko no/iynaTe/i*i v\nv\ Tpa6Ba fla npeMi/me npe3 pa3/innHw touki/i, b 
xefltpa MO>Ke fla ce yKa>Ke MHCJDopMauMfl 3a MapujpyTM3npaHe (nocneflo- 
BaTe/iHOora Ha npeMMHaBaHe npe3 OT,qe/iHi/iTe toukm). 

- TpaH3aKunfl - aKO cbo6meHi/ieTO e nacr ot pa3npe,qe/ieHa TpaH3aKun- 
OHHa cucTeMa, ta MO>Ke fla ce onuiue b xefltpa. 



518 nporpaMnpaHe 3a .NET Framework (tom 2) 

- ABTeHTMKaunfl (authentication) - no/iynaTe/iaT MO>Ke fla M3MCKBa no,qa- 
Te^AT fla ce aBTeHTMKupa npeflu ch>o6meHi/ieTO fla 6"bfle o6pa6oTeHO. 
ABTeHTMKaunflTa Moxe fla ce 6a3npa Ha napo/iki, Ha uncppoBM noflnncn v\ 
cepTucpMKaTM v\nv\ Ha flpyr MexaHM3"bM. 

- CurypHOCT - aKO no/iynaTe/iflT MCKa fla e curypeH, ne cbo6meHi/ieTO He e 
noflnpaBeHO, noflaTe/iflT MO>Ke fla noflnniue uncppoBO ta/ioto Ha cbo6me- 
HueTO m fla nocTaBM reHepupaHna noflnnc b xefltpa (TexHO/iorwsiTa Ha 
UkicppoBMfl noflnnc b onucaHa noflpo6HO b TeMaTa " CurypHOCT b .NET 
Framework ". 

- KoMnpecufl - aKO th/ioto Ha cbo6meHweTO e o6eMHO, no,qaTe/iflT MO>Ke 
fla ro KOMnpecupa v\ fla yKawe BMfla Ha ki3no/i3BaHkifl KOMnpecupaiu 
a/iropi/iTbM b xefltpa. 

SOAP Tfl/io 

3a pa3/im<a ot xefltpa SOAP ta/ioto e 3afl"b/i>KMTe/ieH enewem, 3aiuoTO b Hero 
e pa3no/io>KeHa cbiflHOCTTa Ha cbo6meHi/ieTO. Ta/ioto MO>Ke fla cbfltpwa 
KaKtBTO m fla e TeKcr (b nacmocr XML), crura HeroBaTa CTpyKTypa fla He 
pa3Ba/ia Ta3M Ha cbo6meHneTO. 1/lMa flBa BMfla SOAP cbo6meHMfl: npo- 
ueflypHO-opneHTupaHM (procedure-oriented) v\ flOKyMeHTHO-opneHTupaHM 
(document-oriented). 

ripM flOKyMeHTHO-OpneHTMpaHMTe C"b06lfleHMfl BCflKaiCbB BMfl MHCpOpMaUMfl 

MO>Ke fla 6"bfle KOflnpaHa (encoded) v\ M3npaTeHa ao cbOTBeTHi/m no/iynaTe/i. 
.NET Framework, HanpuMep, hm flaBa B"b3MO>KHOCTTa v\ fla cepna/iM3npaMe 
flafleH o6eKT npe3 soapFromatter (b>k. TeMaTa " Cepi/ia;iki3au.i/ia Ha flaHHn ") v\ 
fla ro M3npaTMM KaTO SOAP cbo6meHkie. 

3a pa3/im<a ot flOKyMeHTHO-opneHTupaHM Cbo6meHkifl npn npoueflypHO-opn- 
eHTupaHMTe ce ocbmecTBHBa ABycrpaHHa KOMyHMKauna Me>Kfly K/iweHTa v\ 
cbpBtpa. K/iweHTbT M3npaiua 3a*iBKa kbm ctpBtpa, KaTO b ta/ioto Ha cbo6me- 
HueTO yKa3Ba, kom npeflocTaBeH MeTOfl MCKa fla M3BMKa v\ c KaKBM napaMeTpn. 
CtpBtptT o6pa6oTBa 3aaBKaTa v\ Bptiua OTroBop, cbfltpwam pe3y/iTaTa ot 
M3nt^HeHneTO Ha MeTOfla, o6paTHO kbm K/iweHTa. 

06M$iHa Ha SOAP ci>o6iiieHM$i - npMMep 

Eto npuMepHa 3aaBKa, HanpaBeHa ot K/iweHT, komto M3BMKBa MeTOfl 3a 
HaMnpaHe Ha pa3CTOHHi/ieTO Mexfly flBe toukm b npaBOtrb/iHa KOopfli/maTHa 
cucTeMa: 



<?xml version="l. 0" encoding="utf-8 " ?> 
<soap : Envelope 

xmlns : xsi="http : //www. w3 . org/ 2 01/XMLS enema- instance" 
xmlns:xsd="http: //www. w3 . org/2 1/XMLSchema" 
xmlns : soap="http : //schemas . xmlsoap . org/ soap /envelope/ "> 
<soap : Body> 

<CalcDi stance xmlns="http : //www. devbg . org/Calc"> 
<pl> 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 519 



<x>4</x> 
<y>5</y> 
</pl> 
<p2> 

<x>7</x> 
<y>-3</y> 
</p2> 
</CalcDistance> 
</soap : Body> 
</soap : Envelope> 



BcflKa T04Ka e npeflcraBeHa KaTO CTpyKTypa c flBe KOopflMHaTM. MeTOfltT, 
komto me ce M3BMKa Ha ctpBtpa c napaMeTpn flBeTe toukm, e caicDistance. 
Eto m OTroBoptT, komto me ce BtpHe cnep, HeroBOTO ycneujHO i/i3n"b/iHeHwe: 



<?xml version="l. 0" encoding="utf-8 " ?> 
<soap : Envelope 

xmlns : xsi="http : //www. w3 . org/ 2 01/XMLS enema- instance" 
xmlns:xsd="http: //www. w3 . org/2 1/XMLSchema" 
xmlns : soap="http : //schemas . xmlsoap . org/ soap /envelope/ "> 
<soap : Body> 

<CalcDistanceResponse xmlns="http : //www. devbg . org/Calc/ "> 
<CalcDistanceResult> 

8,54400374531753 
</CalcDistanceResult> 
</CalcDistanceResponse> 
</soap : Body> 
</soap : Envelope> 



SOAP rpeuiKa (fault) 

Ta/ioto Ha SOAP c"bo6iueHneTO MO>Ke fla cbAtpwa v\ MHCJDopMauMfl 3a B"b3HMK- 
Ha/iw rpeujKM v\nv\ i/i3K/iioneHkifl npn M3n"b/iHeHweTO Ha ycnyraTa. 1/lHCpop- 
MaunflTa 3a rpewKaTa, aKO MMa TaKaBa, ce 3anncBa b e/ieMeHTa fault. 

Eto ta/ioto Ha npuMepHO SOAP c"bo6iueHne etc SOAP rpeujKa, KoeTO e 
M3npaTeHO kbm K/iweHTa, 3aiuoTO Ha ctpBtpa e xBtp/ieHO i/i3K/iK>neHkie: 



<soap : Body 

xmlns : soap="http : //schemas . xmlsoap . org/ soap /envelope/ "> 
<soap : Fault> 

<f aultcode>soap : Server</f aultcode> 
<f aultstring> 

Attempted to divide by zero. 
</f aultstring> 
<detail /> 
</soap : Fault> 
</soap : Body> 



SOAP fault Moxe p,a cbAtpwa hako/iko eneMenra. Eto no-Ba>KHi/iTe ot tax: 



520 



flporpaMnpaHe 3a .NET Framework (tom 2) 



fauitcode - yKa3Ba Ktfle e B"b3HkiKHa/ia rpeujKaTa. 

fauitstring - npeAOcraBfl TeKCTOBO onucaHne Ha rpewKaTa. 

detail - He3afl"b^>KMTe^eH e/ieMeHT, komto MO>Ke fla cbAtpwa XML c 
AOirb/iHi/iTe/ma MHCpopMauna 3a rpeujKaTa. 



npoTOKO/ieH CTeK Ha ye6 yoiyriiTe 

Ye6 ycnyrwTe, KaKTO Bene MO>Ke 6m ere ce y6eAH/iw, o6eAMHABaT b ce6e cm 
mhoto TexHO/iornn. 3a BCflKa OTAe/iHa nacr ot TflXHaTa MHCppacrpyKTypa MMa 
OTAe^eH CTaHAapT, komto onucBa KaK ce M3BtpujBa B3anMOAeMCTBneTO c 
ocraHa/ikiTe nacm ot MHCppacrpyKTypaTa. 3a p,a msachmm B3anMOOTHOiueHMflTa 
Me>KAy OTAe^HMTe craHAapâ„¢ v\ npoTOKO/iw, HeKa pa3r/ieAaMe cneABamaTa 
cpurypa, kohto onucBa ojp,ei\uv\je cnoeBe ot KOMyHMKaunaTa c ye6 yc/iyrwTe: 











SOAP 


Cto6meHne 










WSDL 


\Amepdpev\c 










XSD 


Cxeivia 










XML 


flaHHM 










HTTP 


TpaHcnopT 









IHe 3ano4HeM OTAO/iy Harope, KaTO ce abm>kmm ot no-o6iunTe craHAapâ„¢ ki>m 
Te3M, komto ca no-TACHO CBtp3aHM c ye6 ycnyrwTe. 

Ha hmbo TpaHcnopT ctom npoTOKO/i-bT HTTP, komto e b ocHOBaTa Ha WWW v\ 
ye6 TexHO^ornnTe. KaKTO Bene 3HaeM, HTTP pea/iki3kipa MOAe/ia "3aaBKa - 
OTroBop", komto ce M3no^3Ba m npn ye6 ycnyrwTe. Eahh ot HeAOcraTbuwTe Ha 
HTTP e, ne He noAA^pxa CTaHAapTHO cecua, t. e. tom e stateless (HsiMa cbcro- 
AHue). BcflKa 3aaBKa e OTAe/iHa 3a ce6e cm m He3aBMCMMa ot ocraHa/ikiTe. no 
Ta3M npn^MHa ye6 ycnyrwTe Haw-^ecTO pea/iki3kipaT cpyHKui/iOHa/iHOcr, npn 
koato He ce na3M cbcroflHwe, ho npe3 cneuwa/iHM TexHMKM, komto me 
pa3r/ieAaMe no-HaTaTbK, to3m npo6/ieM MO>Ke p,a ce npeoAO/iee. 

Ochobhoto npeAHa3HaneHi/ie Ha HTTP e p,a npeHaca ashhm ot ye6 ctpBtpa 
K"bM K^neHTa. B c/iynayi Ha ye6 ycnyrwTe Te3M ashhh ca noA cpopMaTa Ha XML. 
Cbc CBOATa npocTOTa, molu m pasujupaeMOCT XML e Hai/i-yHkiBepca/iHM5iT HanwH 
3a npeHacflHe Ha crpyKTypwpaHa MHCpopMauna b r/io6a/iHaTa Mpexa. MMeHHO 
nopaAM TOBa, XML e b ocHOBaTa Ha bcmukm craHAapâ„¢ v\ npoTOKO/iw, CB"bp3aHM 
c ye6 ycnyrkiTe. 

OnucaHneTO Ha crpyKTypaTa v\ cpopMaTa Ha npeAaBaHMTe bbb bma Ha XML 
AaHHM ce M3B"bpujBa npe3 XSD cxeMM. Hpe3 XSD ce onucBaT TunoBeTe ashhm, 
npeHacflHM npn M3Bi/iKBaHeTO Ha ye6 yc/iyrw. 



HnaBa 22. OTfla/ieneHM M3BMKBaHMfl c .NET Remoting 521 



Hpe3 Bene onucaHMTe TunoBe ce M3rpa>Kfla a6crpaKTHkiflT nporpaMeH MHTep- 
cJDewc Ha yc/iyraTa npe3 e3MKa 3a onucaHne Ha ye6 yc/iyrw (WSDL). 

SOAP CTaHflapTtT ocurypaBa MHCJDpacTpyKTypa 3a M3npaiuaHe v\ no/iynaBaHe 
Ha XML c"bo6iueHMfl, npe3 komto ce M3BMKBaT npeflocTaBeHMTe MeTOflu ot ye6 
ycnyraTa v\ ce no/iynaBa pe3y/iTaTbT ot taxhoto M3n"b/iHeHi/ie. 

Eto m eAHa AnarpaMa, koato noi<a3Ba B3anMOBpt3KMTe Me>KAy ojp,ei\uv\je 
npoTOKO/in i/i CTaHAapTM, pa3Ae^eHM b Tpn /lorwuecKM CTeKa: CTeK 3a o6MHHa 
Ha c"bo6iueHMfl, CTeK 3a onucaHMa v\ CTeK 3a OTKpuBaHe Ha ye6 yc/iyrw: 



XML, 
SOAP, 
HTTP 




WSDL 
Schemas 




UDDI 







Message exchange 
(The wire stack) 



Description 
(The description stack) 



Publication & discovery 
(The discovery 
agencies stack) 



CueHapiiM 3a M3no/i3BaHe Ha ye6 yc/iyriue 

CneA KaTO ce 3ano3HaxMe c apxHTeicrypaTa v\ MHCJDpacTpyKTypaTa Ha ye6 yc/iy- 
ruTe, cera HeKa pa3r/ieAaMe pa3/innHw cueHapim, b komto MOxeM p,a M3no/i3- 
BaMe ye6 ycnyrw. 

Ye6 ycnyri/iTe HaMnpaT Bee no-ro/iflMO npw/io>KeHi/ie npn M3rpa>KAaHeTO Ha 
pa3npeAe^eHM cm ere mm, 3aiuoTO ca c/ia6o o6B"bp3aHM c K/iweHTa, M3no/i3BaT 
OTBopeHM CTaHAapTM m Ha npaKTMKa ca "nonâ„¢" yHi/iBepca/iHM. Eto hakoi/i ot 
Haw-necTO cpeiuaHMTe cueHapnn, b komto ye6 ycnyrwTe nrpa^T Ba>KHa po/ia. 

flocTaBAHe Ha aaHHM 

Eaho ot Haki-4ecTMTe npM/io>KeHMfl Ha ye6 ycnyrwTe e 3a pea/iki3wpaHe Ha 
AOCTbna ao 6a3a ashhm {v\j\v\ MHCJDopMaunfl ctxpaHeHa Ha OTAa/ieneHO macto). 
EAMHCTBeHaTa po/ia Ha ye6 ycnyraTa b to3m c/iynaw e p,a ce CB"bp>KM c 
AOcraBUkiKa Ha AaHHMTe, p,a rn ki3B/iene v\ nocne p,a vv\ npeAOcraBM Ha 
K^neHTa. C^eAHaTa AnarpaMa ki/uocrpkipa to3m cueHapnw: 




Data Consumer 



XML Web Service 



Data Storage 



522 nporpaMnpaHe 3a .NET Framework (tom 2) 

yc/iyrn ktjm K/iiieHTCKii npiiJioweHiifi 

C HapacTBaHe Ha ynoTpe6aTa Ha ye6 ycnyrwTe, mhoto npw/io>KeHkifl (b TOBa 
hmc/io m MS Office) npeflocraBHT bbsmokhoct 3a M3no/i3BaHe v\ KOHcyMnpaHe 
Ha yc/iyrw flupeKTHO. no to3m Hani/m ce M36arBa M3rpa>KflaHeTO Ha Me>KflkiHeH 
cnov\ Me>Kfly ycnyraTa v\ K/iweHTCKOTO npw/io>KeHkie, a TOBa noflo6pyiBa bvt- 
peujHaTa CTpyKTypa Ha npi/i/io>KeHi/ieTO. C MacoBaTa ynoTpe6a Ha ye6 ycnyrw, 
Ha koato CMe CBMfleTe^n, ce onaKBa Bee noBene Hacro/iHM v\ ctpBtpHM npw/io- 
>xeHi/ifl fla ce B"b3no/i3BaT ot TaxHaTa molu. 

MHTerpaMMq Ha npu/ioweHMsi 

flpyr mhoto necro cpeiuaH cueHapnw 3a ki3no/i3BaHeTO Ha ye6 ycnyrw e 3a 
MHTerpaunfl Me>Kfly pa3/iwnHn npn^OKeHMfl. CaMaTa MHTerpauna MO>Ke fla e: 

- 5n3Hec MHTerpaunfl - M3rpa>KflaHe Ha 6n3Hec npouec, 6a3npaH Ha ye6 
yc/iyrw, hmmto KOHcyMaTopn me ca OTfle/iHkiTe KOMnaHMM, yuacTBamw b 
npoueca. ripuMep: npeflaBaHe Ha nopBUKa ot npoflaBana KtM to3m, 
komto e OTroBopeH 3a Hei/maTa flocraBKa. 

- Me>Kflyn^aTCpopMeHa MHTerpauna - B3anMOfleMCTBne Me>Kfly npw/io>KeHi/ifl 
pa6oTeifln Ha pa3/ikmHki n/iaTCpopMi/i nofl pa3/ikmHki onepaunoHHM 
CMCTeMM. ripuMep: ye6 ycnyra, pa3pa6oTeHa Ha ASP.NET, ce KOHcyMkipa 
ot mo6m/iho K^neHTCKO npw/io>i<eHi/ie, pa3pa6oTeHO Ha Java. 

B po/isiTa Ha aflanTepM 

ripi/i hakom npn^o>KeHMfl ye6 yc/iyrwTe MoraT fla B/iM3aT b po/i^Ta Ha 
aflanTepn, t. e. fla TpaHCCpopMnpaT no 3aflafleHM npaBki/ia v\ cxeMM BxoflfliuoTO 
c"bo6iueHne v\ fla ro npenpaiuaT no BepuraTa kbm HeroBna no/iynaTe/i. 



Outgoing message 

< 





Transformation 



XML Web Service 



Incoming message 



TaKOBa npw/io>KeHi/ie Ha ye6 ycnyri/iTe He e MacoBO pa3npocTpaHeHO, ho 
ycneujHO ce M3no/i3Ba b peflnua ro/ieMM cocpTyepHM npoeKTM. M3no/i3BaHeTO 
Ha ye6 yc/iyrwTe KaTO TpaHCCpopMnpaiun aflanTepn e KOHuenui/m, ycneujHO 
MMn^eMeHTupaHa b Microsoft BizTalk Server, KtfleTO MMa OTfle/ieH framework 
3a pa3pa6oTKa Ha aflanTepn. 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 523 

Bpi>3Ka MOKfly OTfle/iHMTe KOMnoHeHTii Ha Enterprise 
npiiJio>KeHii$i 

B noc/ieflHMTe roflUHM ce Ha/iara TeHfleHunaTa pa3/iMHHMTe KOMnoHeHTM Ha 
eflHO Enterprise npn^OKeHne (me pa3r/ieAaMe no-noflpo6HO Enterprise npi/i/io- 
>KeHMATa cnep, Ma/iKo) p,a KOMyHMKupaT noMe>KAy cm npe3 ye6 ycnyrM. 

VonnMa nacr ot HOBMTe npoAyKTM Ha Microsoft ocBeH craHAapTeH noTpe6n- 
Te/iCKM MHTepc|DeMC (ye6 npn^OKeHne v\nv\ Windows desktop npn^OKeHne) 
npefl/iaraT v\ ye6 ycnyra, npe3 koato pa3pa6oT4MUMTe MoraT p,a M3no/i3BaT v\ 
HaArpa>KAaT npn^OKeHneTO (ye6 yc/iyraTa npeAcraB/iflBa API 3a flocrbn flo 

OCHOBHaTa CJDyHKUMOHa^HOCT). 

C^eABaiuaTa KapTMHKa M/uocrpMpa M3no/i3BaHeTO Ha yc/iyra 3a Bp"b3Ka kbm 
6a3aTa ashhm b tpmc/iomho npw/io>KeHi/ie. B Hero npe3 K/iacoBeTe ot ADO.NET 
3a Aocrbn flo 6a3aTa ashhm ce M3B/iMnaT AaHHMTe noA cbopMaTa Ha Dataset 
o6eKTM. Ye6 yc/iyraTa o6pa6oTBa Te3M ashhm m ot Cb3AaBa 6n3Hec o6eKTM, 
komto ce M3npaiuaT kbm Ki\v\ema npe3 SOAP c"bo6iueHMfl: 



A / 

SOAP 

Front End 4 ^. ... . _ 

/ i- *» ^ ^7 Z Z- r Web Service 
(client) Serialized object 



ADO.NET Back End 



DataSet (Database) 



Enterprise npu/iowei-iiifi 

Cnep, KaTO pa3MeAaxMe Haw-^ecTUTe npn^OKeHna Ha ye6 ycnyrwTe, cera me 
ce cnpeM no-noApo6HO Ha Enterprise npn^OKeHMATa v\ me bmamm 3aiuo ye6 
yc/iyrMTe nrpa^T K/iionoBa po/ia npn thxhoto M3rpa>KAaHe. 

Kom npiiJio>KeHiin ca Enterprise? 

"Enterprise npn^OKeHMflTa" 03HanaBa mhotoc^omhh pa3npeAe/ieHM npw/io>Ke- 

HMfl, KOMTO OTrOBapflT Ha M3MCKBaHMflTa Ha ro/ieMMTe KopnopaTMBHM K/lMeHTM. 

Te ce cbcroflT ot MHO>KecTBO KOMnoHeHTM, komto ca MHTerpupaHM noMe>KAy CM 
m pa6oTAT KaTO eAHO \\s\no. 3a p,a OTroBapaT Ha cbBpeMeHHMTe 6M3Hec 
M3MCKBaHMfl m CTaHAapTM, Te3M pa3npeAe/ieHM npM/io>KeHMfl Tpa6Ba p,a MMaT 
c^eAHMTe xapaKTepMCTMKM: 

- M3K^K)4MTe^H0 HaAe>KAHM (reliable) - eAHa rpeujKa b HenoAxoA^iu 
MOMeHT MO>Ke p,a npMUMHM orpoMHM 3ary6M. 

- Cm/iho CKa/iMpyeMM (scalable) - p,a noeMaT m o6pa6oTBaT 3aaBKMTe Ha 

CTOTMUM nOTpe6MTe/lM, KOMTO pa60TflT KOHKypeHTHO B ASAeH MOMeHT. 

- JlecHO pa3UJMpfleMM (extensible) - KoraTO K/iMeHTbT noMCKa HOBa 
cbyHKUMOHa^HOCT p,a He ce Ha/iara ua/ioto npM/io>KeHMe p,a 6"bAe 
npeHanMcaHO, a caMO p,a ce pa3UJMpM HeroBaTa cbyHKUMOHa/iHOcr. 



524 



flporpaMnpaHe 3a .NET Framework (tom 2) 



CurypHM (secure) - curypHOCTTa b npki/io>i<eHkieTO fla He e "3aK"bpneHa", 
a fla e 3a/ierHa/ia fl"b/i6oi<o b HeroBna flM3aMH. 

ycTOM^MBM Ha cpwBOBe (fault tolerant) - fla pa6crryiT b kphtm^hm 
CMTyauuM, a KoraTO hakom ot KOMnoHeHTM Ha npi/i/io>KeHi/ieTO cnpe fla 
pa6oTM, TOBa fla He boam ao cpuB Ha ua/iaTa cwcreMa. 



.NET Enterprise npiiJiowei-iiifl 

no-npuHunn Enterprise npn^OKeHMATa ca mhotoc^omhh, ho K/iacwuecKaTa 
apxnTeKTypa 3a tax cm ocraBa Tpwcnoi/iHaTa: enow 3a flaHHkue, 6n3Hec enow m 
npe3eHTaunoHeH enow. H^Ma fla ce cnnpaMe noflpo6HO Ha Ta3M apxHTeicrypa, 
3aiuoTO noflpo6HO Bene pa3r/ie,qaxMe HeMHMTe xapaKTepucTMKn b TeMaTa 
" flocrbn flo flaHHM c ADO.NET ". IHe pa3r/ieflaMe caMO M3rpa>KflaHeT0 Ha 6m3- 
Hec cnofl npe3 ye6 ycnyrw. 

5n3Hec jiorMKa b ye6 ycnyrw 

B cbBpeMeHHMTe cucTeMM Bee no-necro usi/iaTa 6n3Hec /iorm<a Ha npi/i/ioxe- 
HueTO 6nBa M3HeceHa b ye6 ycnyri/i. ToBa e TaKa, 3aiuoTO ye6 ycnyrwTe ca 
ziecHO flocTtnHM npe3 1/lHTepHeT v\ ocurypaBaT b"B3mo>khoct 3a Me>Kflyn/iaT- 
cpopMeHa KOMyHMKaunfl, t. e. TexHi/ue KOHcyMaTopn MO>xe fla ca mhoto pa3- 
/imuhm: ye6 npki/iOKeHi/isi, Windows Forms K/iweHTM, mo6m^hm ycTpowcTBa, 
KaKTO m flpyrn CMapT K/iweHTki ( smart clients ). Ye6 ycnyrkue OTBap^T cwcre- 
MaTa KtM B3anM0fleMCTBne c pa3/innHM KpaMHM K^neHTM, pea^M3npaHM Btpxy 
pa3/ikmHki n/iaTCpopMM. 

Ha c^eflBaiuaTa fluarpaMa e noKa3aHa cxeMaTMUHO K/iackmeciOTa Tpwc/ioi/iHa 
apxnTeKTypa, pea/iki3wpaHa etc cpeflCTBaTa Ha .NET n/iaTCpopMaTa c w3no/i3- 
BaHeTO Ha ye6 yc/iyrw: 



r 



Ye6 KjmeHT 




npe3eHTai4MOHeH 
-cjiom (Presentation-^ 
Tier) 



HTTP 



Ye6 6pay3tp 




Cnoii 3a flaHHM_ 
f~(Back End) 



Windows Forms 
npunoKeHne 
(Rich client) 



ADO.NET- 



Ba3a ot flaHHM 



HnaBa 22. OTfla/ieneHM M3BMKBaHMfl c .NET Remoting 525 

Pa3npeAesieHM npmiOKeHMH (Distributed Applications) 

KaKTO Bene 3HaeM, MHoroc/iOMHkiTe pa3npe,qe/ieHM npw/io>KeHkifl chuxo cnaflaT 
kbm rpynaTa Ha Enterprise npi/i/io>KeHi/mTa. MHoroc/iOMHMTe npn^OKeHMfl ca 
no-KOMn^eKCHM ot Tpkic/iOMHkiTe, ho npn tax CKa/ii/ipyeMOOTa e no-ro/iflMa, 
3aiuoTO OTfle^HMTe KOMnoHeHTM MoraT fla ce pa3no/io>KaT Ha pa3/ikinHM 
ctpBtpn m fla ce onTMMM3npaT nooTfle^HO (pa3npefle/i*iHeTO, Btpxy hhko/iko 
cbpBtpa, Ha OTfle^HM ye6 yc/iyrw v\nv\ KOMnoHeHTM ot eflHO npM/io>KeHMe, ce 
Hapwua "ye6 abepMa" - Web farm). C/ieflBamaTa fluarpaMa noKa3Ba BM3MflTa 
Ha Microsoft 3a M3rpa>KflaHeTO Ha pa3npefle/ieHw npn^OKeHMa: 




o 

o 

3 

3 
c 

s' 

O 


o 

s 

o' 

CU 
'JZI 

(D 

3 


(I 
O 

C 
13. 



UI Components 



UI Process Components 



Service Interfaces 



Business 
Workflows 



Business 
Components 



Business 
Entities 





Data Access Logic 
Components 


Service Agents 






L J 
' 1 


L 

' 1 


' 



Data Sources 



Services 




£\,a 3anonHeM pa3r/ie>KAaHeTO Ha fluarpaMaTa oirope Haflo/iy. Haw-OTrope ctom 
noTpe6nTe^flT, komto Bi/i>Kfla eflMHCTBeHO noTpe6kiTe/iCKMfl MHTepobeMC 3a 
pa6oTa c npn^OKeHneTO. Tom He ce MHTepecyBa hmto KaKBa 6a3a ot flaHHM 
M3no/i3BaMe, hmto ot ko/iko cnofl e M3rpafleHa apxi/iTeicrypaTa; 3a Hero e 
Ba>KHO ko/iko e 6"bp30 m Hafle>KflHO e npi/i/io>KeHi/ieTO. 

npenop"b4Ba ce fla HAMa HMKaKBa BrpafleHa (hard-coded) MHubopMaunfl b 
KOMnoHeHTM, komto ocbiflecTBABaT UI (User Interface), a BC^KaKBa /iori/iKa no 
HaBuraunflTa fla ce M3Hece b OT,qe/iHi/i KOMnoHeHTM (UI Process Components). 



C/ieflBa 6n3Hec c/ioat, komto e pa3fle/ieH Ha neTkipw KOMnoHeHTa: 



526 nporpaMnpaHe 3a .NET Framework (tom 2) 

- Business Workflow - pea/iki3kipa 6n3Hec npeBki/iaTa, komto ce npw/iaraT 
b cucTeMaTa v\ M3B"bpujBa opKecTpaunflTa Me>Kfly OTAe/iHi/iTe 6n3Hec 
npouecu (ocbiuecTBABa CBtp3BaHeTO Ha npouecnTe); 

- Business Components - pea/iki3kipaT caMaTa 6n3Hec ziorwKa Ha 
npn^OKeHkieTO (ocHOBHMTe pa6oTHM npouecu); 

- Business Entities - npeAcraB/isiBaT Mop,ei\v\ Ha 6n3Hec o6eKTM ot 
pea/iHi/m CBAT (HanpuMep npoAyKT, K/ineHT, noptuKa, ...); 

- Service Interface - ye6 yc/iyri/i, komto npeAOcraBsiT Aocrtn ao 6n3Hec 
ziori/iKaTa Ha npn^OKeHneTO Ha Haw-BucoKO hmbo. Te npeAcraB/iflBaT 
nporpaMHOTO API Ha npi/i/io>KeHi/ieTO (t. Hap. 6n3Hec cpacaAa). 

Ha Haw-HMCKO hmbo ca pa3no^o>KeHM KOMnoHeHTMTe 3a Aocrtn ao 6a3aTa 
(Data Access Logic Components) v\ KOMnoHeHTMTe, komto yKa3BaT KaK bbhiuhm 
ycnyri/i MoraT p,a M3no/i3BaT Te3M npeAOcraBeHki ot ci/icreMaTa. riapa/ie/iHO c 
U^/iaTa Ta3M CTpyKTypa BtpBM v\ npeAOCTaBeHaTa hm ot .NET Framework 
6oraTa cpyHKuwoHa/iHOcr 3a ynpaB/ieHkie Ha ckirypHOcrra v\ i/i3K/iK>neHkiflTa. 

Ye6 yc/iyriiTe b ASP.NET 

.NET Framework hm Aasa 6oraTa i/mcppacrpyKTypa v\ MHOxecTBO ot craH- 
AapTHM K/iacoBe, npe3 komto ziecHO v\ 6"bp30 ce cb3AaBaT v\ i/i3no/i3BaT ye6 
yc/iyrw. Te MMn/ieMeHTkipaT npeAaBaHeTO v\ npneMaHeTO Ha SOAP cbo6meHkifl, 
ocurypaBaT npeo6pa3yBaHeTO Ha Ti/inoBe ot XML b .NET TunoBe v\ o6paTHO, 
npeAOCTaBAT b"B3mo>khoct 3a aBTOMaTi/mHO reHepupaHe Ha WSDL onucaHna v\ 
aBTOMaTkmHO reHepupaHe Ha npoKCM K/iacoBe ot WSDL onucaHna. E/iaro- 
AapeHne Ha ASP.NET cno>KHaTa MHCppacrpyKTypa, CB"bp3aHa c i/i3no/i3BaHeTO 
Ha ye6 yc/iyrwTe ocraBa CKpnTa 3a nporpaMkicra. 

HeKa pa3r/ieAaMe b p,ejav\i\v\ cpeACTBaTa Ha .NET n/iaTCpopMaTa v\ no- 
cneu.ua/iHO Ha ASP.NET 3a pa6oTa c ye6 ycnyrw. 

npocTpaHCTBa OT MMeHa 

B ASP.NET MMa hhko/iko npocTpaHCTBa ot MMeHa, komto ca CB"bp3aHM etc 
cb3AaBaHeTO v\ KOHcyMnpaHeTO Ha ye6 ycnyri/i. HeKa vv\ pa3r/ieAaMe HaKpaTKO. 

System.Web. Services 

Ye6 ycnyri/iTe ce pea/iw3wpaT b npocTpaHCTBOTO system. web. services. To 
cbAtpwa BCM4KM K/iacoBe, komto ca Heo6xoAMMM 3a cb3AaBaHeTO Ha ye6 
yc/iyrw 4pe3 .NET Framework. KoraTO ce M3no/i3Ba Visual Studio .NET noBene- 
TO K/iaC0Be Ha System. Web. Services OCTaBaT HeBMAMMM 3a pa3pa60T4MKa, 

3aTOBa HflMa p,a ce 3aA"b/i6onaBaMe b noApo6HO onucaHne Ha bcmuko. TpnTe 

OCHOBHM nOAnpoCTpaHCTBa OT MMeHa Ha System. Web. Services ca 
Description, Discovery M Protocols. 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 527 



System. Web. Services. Description 

npocrpaHCTBOTO OT MMeHa System. Web. Services. Description Cbfl"bp>Ka K/ia- 

coBeTe, Hy>KHM 3a onucaHneTO Ha ye6 ycnyrwTe, KaTO ce M3no/i3Ba Microsoft 
SDL (Service Definition Language) - wMn/ieMeHTau.i/m Ha Microsoft Ha WSDL 
craHflapTa. 

Visual Studio .NET i/i3no/i3Ba Te3M K/iacoBe 3a fla Cb3flafle .disco v\ .vsdisco 
cJDaki^OBe. EflMH ot no-MHTepecHMTe K/iacoBe e serviceDescription. Tom hm 
no3BO^ABa neTeH, nuiueM v\ o6pa6oTBaHe WSDL flOKyMeHTM. Eto KpaTbK 
npuMep 3a HeroBOTO M3no/i3BaHe: 



ServiceDescription newDescription = 

ServiceDescription . Read ( "SomeXMLDescriptionFile . wsdl" ) ; 
// Manipulate the description or create new Web service using it 
newDescription .Write ( "newService . wsdl" ) ; 



System. Web. Services. Discovery 

npocrpaHCTBOTO System. Web. Services. Discovery ce CbCTOkl OT K/iacOBeTe, 
komto ce rpn>KaT 3a OTKpi/iBaHeTO Ha ye6 yc/iyrw. B"bB Visual Studio .NET, ko- 
raTO ce flo6aBM Web Reference, Te3M K/iacoBe OTKpuBaT .vsdisco <£aM/iOBeTe, 
komto onucBaT ye6 yc/iyrkiTe. 

System.Web. Services. Protocols 

npoCTpaHCTBOTO System. Web . Services . Protocols CbA"bp>Ka K/iacOBe, KOMTO 

ce M3no^3BaT 3a flecJDMHupaHe Ha npoTOKO/iw, no3BO/iflBamki npeHOca Ha ch>o6- 
meHMfl Me>Kfly ASP.NET ye6 ycnyraTa v\ npM/io>KeHMflTa, komto a M3no/i3BaT. 
Te3M K/iacoBe ce M3no/i3BaT o6mkhob6ho b TaKa HapeneHMTe Me>KAHHHki 
(proxy) K/iacoBe. Ochobho ce rpwwaT 3a oc|DopMflHeTO Ha SOAP cbo6meHi/iflTa. 

ApxMTeKTypa Ha ASP.NET ye6 yc/iyriue 

noflo6HO Ha ASP.NET npw/io>KeHi/mTa, ye6 yc/iyrkiTe ce pa3no/iaraT Btpxy ye6 
ctpBtp (IIS v\nv\ hakom Apyr) v\ ce M3n"b/iHflBaT ot pa6oTHMfl npou.ec Ha 
ASP.NET. C^eflBaiuaTa cJDnrypa ki/uocrpkipa KaK npoTkma npouecbT Ha M3n"b/i- 
HeHne Ha eAHa ye6 ycnyra: 



KjllieHTCKM 
KOfl 



r|jiaTc|3opMa 
(.NET /Java 
/PHP /Perl) 



OC 



SOAP 3aflBKa 





SOAP OTfOBOp 



<^> 



ISAPI (pMJlTbp 



IIS 



<^> 



ASP.NET Web ycjiyra 

[WebMethod] 
public string Blah ( ) 
{ ... } 



ASP.NET pa6oTeH npouiec 



Common Language Runtime 



OnepaunoHHa cucTeivia (Win2000, WinXP, Win2003) 



528 nporpaMnpaHe 3a .NET Framework (tom 2) 

K/ikieHTCKkiflT koa M3BMKBa MeTOfl Ha ye6 ycnyraTa npe3 M3npaiuaHe Ha SOAP 
3aaBKa. Ye6 ycnyraTa M3n"b/iHflBa M3BMKaHMfl MeTOfl v\ Bptiua pe3y/iTaTa My 
othobo KaTO SOAP cbo6meHne. flaHHMTe, komto ce npeAaBaT Me>KAy ycnyraTa 
m npn^OKeHneTO, ce cepna/iw3i/ipaT KaTO XML. 

Ye6 ycnyrwTe M3no/i3BaT OTBopeHM craHAapTM v\ 6/iaroAapeHwe Ha TOBa 
K^neHTCKMflT koa Mcoxe p,a e pa3no/io>KeH Btpxy pa3/ikmHki n/iaTCpopMM v\ 
onepaunoHHM CMCTeMM (.NET, Java, PHP, Perl v\ Apyrn). 

KaTO Me>KAMHeH cnov\ ctoat ISAPI cpw/iTbp v\ ye6 CbpBtp (Haw-necTO IIS). 
ISAPI (Internet Server Application Program Interface) no3BO/iHBa Ha pa3pa- 
6oT4MUMTe Aa pea^M3npaT ye6 6a3npaHM npw/io>KeHi/m, pa6oTeiun mhoto no- 
6"bp30 ot CTaHAapTHMTe CGI (Common Gateway Interface) npn^OKeHna. npn- 
4MHaTa 3a TOBa ce Kpue b TACHaTa MHTerpauna Ha ISAPI c ye6 ctpBtpa. 
OcBeH Internet Information Server Ha Microsoft MMa v\ Apyrn ctpBtpn 
noAA"bp>KaiuM ISAPI cpw/iTpw. 

IIS (Internet Information Server) npneMa HTTP 3asiBKkiTe v\ vv\ npeAaBa Ha 
ISAPI, komto vv\ npeAaBa Ha ASP.NET pa6oTHMfl npouec, komto vv\ o6pa6oTBa. 

Ot CTpaHaTa Ha ye6 ycnyraTa ctoat ASP.NET pa6oTHki5rr npouec v\ CLR 
(Common Language Runtime), komto ynpaB/iyiBaT HeMHOTO M3n"b/iHeHne. 

ASP.NET pa6oTHkisiT npouec e cneuwa/ieH npouec, komto e 4acT ot .NET 
Framework v\ ce rpuxn 3a o6pa6oTKaTa Ha 3aaBKM kbm ASP.NET. M3no/i3Ba ce 
KaKTO npn ye6 npw/io>KeHi/ifl, TaKa v\ npn ye6 yc/iyrw. 

Ci>3flaBaHe Ha ye6 yc/iyrn 

3a Aa ce cb3AaAe ye6 ycnyra b .NET Framework ce cb3AaBa cpai/i/i c 
pa3LunpeHMe .asmx. 3a Aa ce yKaxe, ne to3m cpaw/i e ye6 yc/iyra, b Hana/iOTO 
Ha cpaw/ia ce nocraBfl c/ieAHkiflT Tar: 



<%@ WebService Language="C#" Class="SomeServiceClass" %> 



Cnep, TOBa ce cb3AaBa K/iac c MMe cbOTBeTCTBamo Ha 3aAaAeHOTO b Tara. To3m 

K/iac Tp$l6Ba Aa Hac/ieAflBa System . Web . Services . WebService V\I\V\ KbM Hero 

Aa e npi/i/io>KeH aTpw6yTbT [WebService] . 

B 3aBMCMMOCT KaKBa e ue/iTa Ha yc/iyraTa, MO>Ke Aa ce i/iMn/ieMeHTkipaT eAMH 
v\nv\ hako/iko ye6 MeTOAa, KaTO npeA BceKM ce nocraBsi aTpw6yTbT 
[WebMethod] . To3M aTpn6yT yKa3Ba, ne AaAeHM^T MeTOA Tpa6Ba Aa e ny6/ikm- 
ho AOCTtneH npe3 MHTepcpewca Ha ye6 ycnyraTa. 



[WebMethod] 
public void SomeMethod (. 

{ 

// Some Code 

} 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 529 

Cb3flaBaHe Ha ye6 ycnyrw - npnMep 

KaTO pea/ieH npnMep me c"b3flafleM ye6 ycnyra c eflMHCTBeH ye6 MeTOfl, komto 
no 3aAaAeHM RBe uenw ni/icna npecMATa v\ Bptiua cyMaTa mm. 

Cb3AaBaMe <fcai/i/ia Addservice . asmx m b Hero 3anncBaMe c/ieAHi/m koa: 



<%@ WebService Language="C#" Class="AddService" %> 

using System; 

using System. Web . Services; 

public class AddService : WebService 

{ 

[WebMethod] 
public int Add(int a, int b) 

{ 

return a + b; 

} 
} 



Ye6 yoiyniTe n ye6 npiisiOMtei-iiiflTa 

KaKTO Bene cnoMeinaxMe, ye6 ycnyrkue b .NET Framework ce i/i3n"b/iHflBaT ot 
pa6oTHMfl npouec Ha ASP.NET KaTO o6mkhob6hm ye6 npw/io>KeHkifl. Cxoa- 
ctboto Me>KAy ye6 yc/iyrwTe v\ ye6 npn^OKeHMATa He cnupa caMO ao npoueca, 

KOMTO VV\ M3n"b/lHflBa. 

Ye6 ycnyrwTe, Cbu\o KaKTO ye6 npw/io>KeHi/iflTa, MoraT p,a ce KOHCJDkirypwpaT v\ 
HacrpoMBaT nocpeACTBOM <£ai/i/iOBeTe web.config v\ Global. asax. Te cbiuo ce 
pa3no/iaraT Btpxy ye6 CbpBtp (o6mkhob6ho IIS, ho He 3aA"b/i>KkiTe/iHO). 

BcbiuHOCT ye6 npki/io>KeHkiflTa npneMaT HTTP 3aaBKM v\ oiroBapyiT c HTTP ot- 
roBopi/i, npe3 komto BptiuaT Haw-4ecTO HTML AOKyMeHT. Cbmo KaTO tax, ye6 
yc/iyrkue npneMaT HTTP 3aaBKM v\ oiroBapflT c HTTP OTroBopn, ho 3aaBKMTe v\ 
OTroBopnTe CbAtpwaT SOAP Cbo6meHkifl. Cxoactboto e ro/iflMO. Pa3/im<aTa e 
caMO b c"bA"bp>KaHMeTO Ha 3aaBKMTe, b HannHa Ha TaxHaTa o6pa6oTKa v\ bbb 
BptiuaHMfl pe3y/iTaT. 

ny6/iMKyBaHe Ha ye6 yc/iyrii 

riy6/im<yBaHeTO Ha ye6 yc/iyri/i Moxe p,a CTaHe no hako/iko Hani/ma, ioto Te no 

CBOflTa CblUHOCT n pa bat eAHO M CblUO. 

KonMpaHe Ha yc/iyraTa b IIS m perMCTpaunn 

ritpBUflT Ha^MH 3a ny6^MKyBaHe Ha ye6 ycnyra e npe3 KonnpaHe Ha yc/iyraTa 
b IIS m perncTpaunflTa v\ KaTO ye6 npn^oxeHne: 

1. KonnpaMe ua/iaTa nanKa Ha ye6 yc/iyraTa bbb <£i/i3kmecKaTa nanKa, kbm 
koato C04M ye6 cawrbT no noApa36npaHe Ha IIS (o6mkhob6ho TOBa e 

AMpeKTOpuflTa "C:\lnetpub\wwwroot"). 



530 



flporpaMnpaHe 3a .NET Framework (tom 2) 



CrapTkipaMe aAMUHMCTpaTHBHaTa K0H30/ia Ha IIS. ToBa MO>KeM fla 
HanpaBMM KaTO ot CTapT MeHKrro Ha Windows M36epeM Run v\ cnefl TOBa 
b noflBM^Mfl ce npo3opeu HanmueM "inetmgr". Cne,q KaTO crapTwpa, 
aAMMHMCTpaTMBHaTa KOH30/ia noKa3Ba bcm^km nanKM HaMnpaiun ce b 

"C:\lnetpub\wwwroot" M BCM4KM OCTaHa/lM BMpTya^HM AHpeKTOpMM. 

HaMnpaMe TOKy-iuo KonnpaHaTa nanKa AddService v\ ot koht6kcthoto 
MeHK) M36npaMe Properties: 



*f Internet Information Services 



JnlJl 



File Action View Help 



a ml x ar ^Oilif 15.1 â–º 



§£j Internet Information Services 
&-1 NAKOV (local computer) 
B-Cl Web Sites 

B~0 Default Web Site 
S-^ IISHelp 
&-$> QuickStart 
[j--^ MobileQuickStart 
E1--CJ _vti_bin 
EE--CJ Printers 
rg-Cj CrystalReportWebFor 
r+l-Q AddService 
ffi~£3 FTP Sites 

H-% Default SMTP Virtual Server 
J I 



Name 



Path v 



Li Printers Explore 
^IISHelp Open 
^MobileQu Browse 
JfiQuickStar - 
CiCrystaIRe New 
Ci_vti_bin Al1 Tjsks 



Delete 

Rename 

Refresh 



jUl 



Help 



Opens property sheet for the current selection. 



C:\WINDOWS\v 
c:\windows\hel| 
c:\prograrn File 
c:\Program File 
C:\program File 
C:\program File 



4. OTBapa ce npo3opei_rbT 3a ynpaB/ieHwe Ha HacrpoMKMTe 3a cbOTBeTHaTa 
nanKa. 3a fla CTaHe flocrbnHa ye6 ycnyraTa ot TyK c"b3flaBaMe Web 
Application KaTO HaTMCHeM 6yTOHa [create]. 



AddService Properties 



Directory I Documents | Directory Security | HTTP Headers | Custom Errors | 
When connecting to this resource, the content should come from: 

»(• [The designated director^ 
C A share located on another computer 
C A redirection to a URL 



J]x| 



|\AddSe 






Local Path: 

r Script source access 

p Read 

V Write 

W Directory browsing 

Application Settings 

Application name: 

Starting point: 

Execute Permissions: 



W Log visits 

[7 jndew this resource 



iDefault Application 
<DefaultWebSite> 
(Scripts only 



Application Protection: I Medium (Pooled) 




OK 



Cancel 



Apply 



Help 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 531 



TaKa HaiuaTa ntpBa ye6 ycnyra CTaBa AOCTbnHa ot cneAHi/ifl aflpec: 
http://localhost/AddService/AddService.asmx . 

PerHCTpauMii Ha yc/iyraTa 6e3 KonupaHe b IIS 

BTopuflT Hani/m 3a ny6/im<yBaHe, iokto Bene cnoMeHaxMe, no cbiuecrBO 
npaBM ctiuoTO - c"b3flaBa Web Application b ye6 cbpBtpa, ho ro npaBM no 
pa3/ii/meH Ha^MH. 

B npeflCTaBeHaTa no rope nocneAOBaTe/iHOcr ce Ha/io>Ki/i fla KonnpaMe nan- 
KaTa Ha yc/iyraTa b o6maTa AnpeKTopua Ha IIS. ToBa no npuHunn He e 
npo6/ieM, ho noBeneTO pa3pa6oTni/iui/i npeAnoni/iTaT p,a i/maT flo6pa noApeA6a 
Ha cbfl"bp>KaHMeTO Ha TBtpflna cm flMCK. Ako bcm4km ye6 npn^o>KeHMfl ce 
nocTaBAT b eflHa nanKa, TOBa BHaca Ma/ibK xaoc v\ boah ao 3ary6a Ha BpeMe b 
TtpceHe npn no-ro/isiM 6pow npi/i/io>KeHi/m. flpyro ocHOBaHne, p,a He ce 
KonnpaT ye6 ycnyri/i v\nv\ ye6 npn^OKeHna b naniOTa wwwroot, ce noflBABa 
npn ye6 cbpBtpi/i, b komto i/ma fleceTKM, flopn ctotmum ye6 caMTOBe v\ BceKM e 
etc co6cTBeH URL aApec. B TaKaBa eAHa CMTyaui/m 6m 61/1/10 nary6HO bcmukm 
cawTOBe p,a ca b eAHa nanKa. 

HeKa npeAno/io>KMM, ne <fcn3MnecKM HaiuaTa ye6 yc/iyra ce HaMi/ipa b nanKaTa 

E : \WebServices\AddService. 

3a Aa cb3AaAeM ye6 npn^oxeHne 3a Ta3i/i yc/iyra ce M3no/i3Ba eAHH ot 
c^eAHMTe Ha^MHn: 

PerHCTpauMn Ha BHpTya/ma flnpeKTopna ot Windows Explorer 

AddService Properties LiJBi 



General] Sharing || Security [ Web Sharing | Customize | 



Internet Information Services 



Share on: Default Web Site 



O D° n °t share this folder 
(*} Share this folder 
Aliases 



Edit Alias 



(Xj 



Directory: 
Alias: 



E : \WebS er vice^AddService 



AddService 



<â–  Access permissions 


' 


0Read 


1 1 Script source access 


D Write 


1 1 Directory browsing 



Application permissions — 
O None 
® Scripts 
O Execute [includes scripts] 



OK 



Cancel 



OK 



Cancel 



Apply 



532 



flporpaMnpaHe 3a .NET Framework (tom 2) 



1. OTMBaMe ao naniOTa E:\webservices m lupaKaMe c flecHna 6yTOH Ha 
MMiuKaTa Btpxy naniOTa Addservice. 

2. Ot KOHTeKCTHOTO MeHK) i/i36wpaMe Properties. B otbopm/ii/iat ce npo30- 
peu OTMBaMe Ha eTMKeTa Web Sharing. 

3. M36npaMe Share this folder v\ b pe3y/iTaT ce noflBJiBa npo3opeu, b 
komto 3anncBaMe MMeTO, KoeTO MCKaMe fla MMa HaiuaTa ye6 yc/iyra. 
C/ieA TOBa HaTMCKaMe 6yTOHa [ok] 3a fla ce BtpHeM o6paTHO b 
Properties npo3opeua. 

PerMCTpauMn Ha BHpTyasma flMpeKTopna ot aAMHHHCTpaTHBHaTa 
KOH30/ia Ha IIS 

1. OTBapyiMe aflMMHMCTpaTMBHaTa KOH30/ia 3a ynpaB/ieHkie Ha IIS. 
IHpaKaMe c flecHna 6yTOH Ha MMiuKaTa Btpxy Default Web Site. 
rioconBaMe c MMiuKaTa New v\ ot noyiBki/iOTO ce koht6kctho MeHK) 
M36npaMe Virtual Directory: 



^j Internet Information Services 



sua 



File Action View Help 



a|B | ffi 1 ® B §i $ . > ■ il 



Open 
Browse 



Start 
Stop 
Pause 



Internet Information Services 
J) ARCHER (local computer) 

fi-Q We b Sites 

- â– # Default V'- k c:1 - 

♦ £| IISHc Ex P |ore 

+ Cj tswe 

+ CJ _vti_ 

+ d Printi 

+ â–  Qj Scrip 

+ 8& Webl 

+ He Datin 

+ 2£ Datin 
B-O Adds 
&Q Arch. 
Ej-'O aspn 
i+l-f""1 imagi 

+ £§i Mess 

+ gj: Web< 
E-Q _priv 
S-Cl _vti_ 
EJ-Q _vti_ 
lj-Cl _vti_ 
i-Q _vti_script 



All Tasks 



View 



JgillSHelp 
L^tsweb 
LJ_vti_bin 
Lj Printers 
C| Scripts 
gwebCalendar 
f§:DatingSiteWS 
£f;DatingSite 
(_) AddService 



Virtual Directory, 



k 



Rename 
Refresh 
Export List.. 



Properties 



Help 



Server Extensions Web 
Server Extensions Administrator 

S^ WebCalendarService 

CH jDrivate 

_| _vti_cnf 

LD _vti_log 

LD_vti_pvt 

I _vti_script 

i 







< 











Create new Web Virtual Directory 



CrapTkipa ce Virtual Directory Creation Wizard, c noMomra Ha komto 
no mhoto zieceH HanwH ce cb3,qaBa ye6 npn^OKeHne. HaTMCKaMe [Next] 
m Ha c/ieABaiuaTa CTtnKa B"bBe>KflaMe b no/ieTO Alias MMeTO Ha HaiuaTa 
yc/iyra. Ha c/ieflBaiuaTa CTtnKa MO>xe fla HanpaBMM flBe Heiua. V\nv\ 
HaTMCKaMe 6yTOHa [Browse] m b nosiBki/ikifl ce hob npo3opeu M36npaMe 
flMpeKTOpMflTa E:\WebServices\AddService, V\J\V\ HanpaBO fl B"bBe>KflaMe 

b no/ieTO Directory. Ha cneflBamaTa CTtnKa M36npaMe iokbm npaBa 3a 
flocTtn me MMa ao HaiuaTa yc/iyra. TyK Moxe fla ce ocraBHT Te3M npaBa, 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 533 



komto ca no no,qpa36kipaHe. 1/1 TaKa CTuraMe ,qo nocneflHaTa crbnKa, 
KtfleTO nocpeflCTBOM 6yTOHa [Finish], 3aB"bpujBaMe cb3,qaBaHeTO Ha 
BMpTya/maTa AnpeKTopna. 

HacTpoMKa Ha npaBaTa 3a Aocrbn 

Ako cera ce oni/uaMe fla otbopmm aApeca Ha HawaTa ycnyra, Haw-BepoflTHO 
HflMa fla ycneeM, nopaflu orpaHi/meHi/i$i Ha <£ki3i/mecKkifl flocrbn 3a neTeHe 

Btpxy nanKaTa E:\WebServices\AddService. BtnpeKM, ne n03BO/lklXMe 

Aocrbna npe3 ye6 ao aApeca http://localhost/AddService/ 

AddService.asmx , <£ki3kmecKkiflT flocrbn ,qo cbOTBeTHaTa nanKa e 3a6paHeH. 

Ye6 ycnyraTa ce M3n"b/iHflBa ot pa6oTHi/m npouec Ha ASP.NET v\ KoraTO ao ye6 
cbpBtpa npucTurHe 3asiBKa 3a .qafleHa ye6 ycnyra, tom crapTkipa ASP.NET 
pa6oTHMfl npouec. Tom ntK ot cboh CTpaHa ce 3ape>Kfla c npaBaTa 3a AOCTbn 
Ha cneuwa/iHkifl noTpe6wTe/i aspnet (b Windows 2003 Server T03M noTpe6wTe/i 
ce Hapwua Network service). TaKa pa6oTHMAT npouec ce onuTBa fla 

OC"blfleCTBM flOCTbn flO C|DM3M4eCKaTa nanKa E:\WebServices\AddService, 3a 

koato o6ane HHMa npaBa. 

3a fla My flafleM Heo6xoflMMMTe npaBa, OTBapaMe Windows Explorer v\ OTMBaMe 
AO E:\webservices. IHpaKaMe c flecHMfl 6yTOH Ha MMiuKaTa Btpxy nanKaTa 
Addservice n ot KOHTeKCTHOTO MeHK) M36npaMe Properties. B OTBopi/i/iwyi ce 
npo3opeu OTMBaMe Ha eTMKeTa Security. 

B"b3MO>KHO e to3m eTMKeT fla ro HflMa. ToBa Haw-necTO ce c/iyuBa, KoraTO kom- 
nK)Tbp"bT He e nacr ot flOMeH. 3a fla ro noKa>KeM ot MeHKrro Tools M36npaMe 
Folder Options. B otbopm/ima ce npo3opeu, OTMBaMe Ha eTMKeTa View. B 
nacrTa Advanced Settings ki3K/iK>nBaMe noc/ieflHaTa HacTpoMKa, a MMeHHO 
Use simple file sharing: 



Folder Options 



General View File Types Offline Files 



Folder views 



You can apply the v ; :^ ; Details or Tiles) that 

you are using for : lis folder to all folders. 



Apply to All Folders 



: : te*i .'-, : -n' 



Advanced settings: 



I I Launch folder windows in a se;: 
Ir^l Managing pairs of Web pages and folders 
Show and manage the pair as a single file 
O Show both parts and manage them individually 
O Show both parts but manage as a single file 
W\ Remember each folder's view 
I I Restore previous folder windows at logon 
I I Show Control Panel in My Computer 
[~~l Show encrypted or compressed NTFS files in color 
Show pop-up description for folder and desktop items 



- 



-'â– â–  : w. â– :â– ->â–  'â– :/?. --yJii 



J&. 



Cancel Apply 



534 



flporpaMnpaHe 3a .NET Framework (tom 2) 



1/1 TaKa, Bene 6m Tp*i6Ba/io eTMKeTbT Security fla ce noi<a3Ba. OTMBaMe b Hero 
m HaTMCKaMe 6yTOHa [Add], b pe3y/iTaT Ha KoeTO ce OTBapa npcoopeu Select 
Users or Groups. B aKTMBHOTO TeKCTOBO no/ie BtBe>KAaMe noTpe6wTe/i 

ASPNET (kl/lM 3a Windows 2003 Server CbOTBeTHO Network Service): 



AddService Piopeities 


s@ 










| General || Sharing [ Security | Web Sharing || Customize | 




Group or user names: 








fij Administrators [ARCHERV\dministrators) 


[a 






f$ CREATOR OWNER 


(7 




| 










Select this object type: 




Users, Groups, or Built-in security principals 


Object Types... 1 


From this location: 






ARCHER 


Locations... 


Enter the obiect names to select f examples!; 


ASPNET 


Check Names 1 








1 Advanced... 


M 


K Cancel 






For special permissions or for advanced settings, 1 aj. 


anced 
















| OK || Cancel | 


Apply 









C TaKa HanpaBeHMTe HacrpofiKM Bene ye6 yc/iyraTa 6m Tpfl6Ba/io p,a pa6oTM 
6e3 npo6/ieMM. ripn ntpBMfl HanwH Ha ny6/ikiKyBaHe M36erHaxMe HacrpoMKMTe 
Ha npaBaTa 3a cpki3kinecKaTa nariKa nopaAH cneAHaTa npn^MHa. ripn KonnpaHe 
Ha nanKaTa Addservice b c:\inetpub\wwwroot npaBaTa, Ha noTpe6kiTe/ifl 
aspnet, 3a Aocrbn ao Hea ce HacneAflBaT aBTOMaTkinHO ot nanKaTa 
c:\inetpvib\wwwroot. Ako o6ane 3a Ta3M nanKa He ca AaAeHM npaBa 3a 
Aocrbn, ua/iaTa onucaHa no-rope npoueAypa Tpa6Ba othobo p,a ce i/i3n"b/iHki. 

KoMnM/iiipaHe Ha ye6 yc/iyraTa 

KoraTO cb3AaAOXMe HaiuaTa ycnyra, nocraBkixMe uenwnj v\ cope koa b .asmx 
cpaki/i. nopaAM TOBa He ce Ha/io>Kki HMKaKBa KOMnw/iaukifl, ho aKO koa^t e b 
OTAe^eH .cs cpaw/i, ce Ha/iara cnep, KOHCpurypupaHe Ha yc/iyraTa, ta p,a ce 
KOMni/i/ikipa. B TaKMBa cnynaw .asmx cpaki/i"bT ce Cbcroi/i eAHHCTBeHO ot Tara: 



<%@ WebService Language="c#" Codebehind="AddService . asmx . cs" 
Class="MyServise.AddService" %> 



KoMnn^npaHeTO Ha C# KOAa, komto e nacr ot yc/iyraTa (t. Hap. Code Behind), 
MO>Ke Aa ce i/i3B"bpLui/i c VS.NET v\nv\ c KOH30/iHi/ifl KOMnw/iaTop ( HanpuMep c 
KOMaHAaTa "csc.exe /target: library"). llO/iyneHklTe npn KOMnkl/iaLlklflTa 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 535 



aceM6/ikiTa Tpa6Ba fla ce 3anniuaT b noflflnpeKTopua bin Ha BkipTya/maTa 
flupeKTopua Ha ycnyraTa. 

TecTBaHe Ha HamaTa ni>pBa ye6 ycnyra 

C/iefl KaTO Bene CMe ny6/ikiKyBa/iw KOHdDMrypwpa/iM ye6 ycnyraTa b IIS, ocTaBa 
fla n TecTBaMe fla/iw pa6oTM npaBki/iHO. M3BMKBaMe ye6 ycnyraTa ot aflpec: 

http://localhost/AddService/AddService.asmx 

noflBflBa ce c^eflHMAT npo3opeu, Ha komto ca M36poeHM bci/iukm ye6 MeTOflu ot 
ycnyraTa: 



H AddService Web Service - Microsoft Internet Explorer 



Jnjxj 



File Edit View Favorites Tools Help 



# 



©Back ' O ' H!l ® I P Search .Favorites 6 | 3' & I3l - [ 



Address 



http ://localhosVAddService/AddService.asrnx 



1 



Go 



Links 



AddService 



The following operations are supported. For a formal definition; please review the 
Service Description . 

• Add 

This web service is using http://tempuri.org/ as its default namespace. 

Recommendation: Change the default namespace before the XML Web 
service is made public. 

Each XML Web service needs a unique namespace in order for client applications 
to distinguish it from other services on the Web. http://tempuri.org/ is available 
for XML Web services that are under development, but published XML Web 
services should use a more permanent namespace, 

Your XML Web service should be identified by a namespace that you control, For 
example, you can use your company's Internet domain name as part of the 
namespace, Although many XML Web service namespaces look like URLs, they 
need not point to actual resources on the Web, (XML Web service namespaces are 
URIs.) 

For XML Web services creating using ASP.NET, the default namespace can be 
changed using the WebService attribute's Namespace property, The WebService 
attribute is an attribute applied to the class that contains the XML Web service 
methods, Below is a code example that sets the namespace to 
"http://microsoft.com/webservices/": 

C# 

[WebService (Namespace="http : //microsoft . corn/webseuvices/ ") 
public class MyUebService { 
// implementation 

lJ I 



*_J Local intranet 



A 



536 flporpaMnpaHe 3a .NET Framework (tom 2) 



B c/iynayi TOBa e eflMHCTBeHO MeTOfltT Add. IHpaKaMe c MMUJKaTa Btpxy Hero v\ 
ce 3ape>Kfla crpaHkiua, b koato mokcm ca BtBefleM ctomhoctm Ha BxoflHMTe 
napaMeTpi/i. 



â– jl AddService Web Service - Microsoft Internet Explorer 



^Jnjx 



File Edit View Favorites Tools Help 



# 



©Back ' O ' HI #> I P Search .'v Favorites | 3' §k [d] ~ D 



Address 



â– â– &] http://localhost/AddService/AddService.asmx?op=Add jj J Go 



Links 



AddService 



Click here for a complete list of operations. 



Add 

Test 

To test the operation using the HTTP POST protocol; click the 'Invoke' button. 



Parameter Value 

I 

I 



Invoke 



^Done 



VJ Local intranet 



A 



B"bBe>KflaMe flBe npuMepHM ni/ic/ia, fla KaweM 2 v\ 3, v\ HaTMCHeM 6yTOHa 
[invoke] . ToBa M3BMKBa ye6 yc/iyraTa. Pe3y/iTarbT ce Bptiua b XML cpopMaT: 



<?xml version="l. 0" encoding="utf-8 " ?> 
<int xmlns="http : //tempuri . org/ ">5</int> 



Ako BtBefleM rpeujHM bxoahm flaHHM, npuMepHO TeKCT BMecTO \\s\no nwcno, ce 
npeflM3BMKBa ki3K/iK>neHkie npn onuTa fla ce KOHBepTupa TeKCT ,qo int32: 



Cannot convert alabala to System. Int32 . 

Parameter name: type --> Input string was not in a correct 

format . 



M3no/i3BaHe Ha ye6 yc/iyrn 

flocera o6acHMXMe KaK ce cb3flaBaT ye6 ycnyrwTe. Taxhoto ochobho npeflHa3- 
HaneHkie o6ane e fla 6"bflaT "KOHcyMnpaHn", T.e. ki3no/i3BaHki ot flpyrn 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 537 

npn/ic»Kei-ikifl. ToBa ce ocbiuecTBABa nocpeflCTBOM pa3MAHa Ha SOAP cbo6me- 
HMfi Me>Kfly OTfla/ieneHOTO npw/io>KeHkie v\ ye6 yc/iyraTa. 

3a fla ce ocbiuecTBM TOBa o6ane Tpa6Ba fla MMa MexaHM3"bM, komto fla 
npeBptiua 3aflBKkiTe, OTroBopi/iTe v\ Ti/inoBeTe ot m kbm SOAP Ch>o6meHkifl. B 
.NET Framework to3m MexaHM3"bM ce pea/iki3wpa npe3 t. Hap. m6>kamhhm 
(proxy) K/iacoBe. Me>KflMHHMTe K/iacoBe ctoat Me>Kfly ye6 yc/iyraTa v\ ojpjane- 
neHOTO npn^OKeHne v\ BtpwaT pa6oTaTa Ha npeo6pa3yBaTe/i Ha SOAP ch>o6- 
meHMflTa. 

Me>KAMHHMTe (proxy) K/iacoBe 

.NET Framework hm ocurypaBa ki3K/iK>nkiTe/iHO zieceH Hani/m 3a cb3,qaBaHe Ha 
Me>KflMHHM K/iacoBe. TeHepupaHeTO CTaBa aBTOMaTi/mHO ot WSDL flec|DMHM- 
UMATa Ha ye6 yc/iyraTa. 3a npuMepa flafleH no-paHO WSDL AecJDMHuunflTa e 
AOCTbrma ot a,qpec: 

http://localhost/AddService/AddService.asmx?wsdl 

KaKTO BceKM eAMH K/iac b .NET Framework, TaKa v\ Me>KflMHHMTe K/iacoBe 
npeflcraB/iflBaT cope koa Ha C# (Visual Basic .NET v\nv\ hakom Apyr e3MK). B 
AewcTBHTe^HOCT po/iflTa Ha Me>KflkiHHMTe K/iacoBe e fla flaflaT Ha noTpe6kiTe/ifl 
eAMH zieceH v\ Tnnn3npaH HanwH 3a M3BMKBaHe, KaKTO cmhxpohho TaKa v\ acuH- 
xpohho, Ha ye6 MeTOflu ot eflHa yenyra. 

reHepwpaHe Ha Me>KflMHeH K/iac 

Eamh zieceH HanwH 3a reHepupaHe Ha Me>KflMHHM K/iacoBe e npe3 MHcrpyMeHTa 
wsdi. 3a fla reHepupaMe Me>KflMHeH K/iac 3a noc/ieflHi/ifl npuMep e flocraTbUHO 
fla otbopmm Visual Studio .NET 2003 Command Prompt v\ fla HanniueM: 



wsdl http : //localhost/AddService/AddService . asmx?wsdl 



.NET Framework cb3flaBa Me>KflMHHMfl K/iac 3a HaiuaTa ye6 yenyra v\ ro 
nocTaBfl BtB cpaM/ia Addservice.es. 3a BceKM MeTOfl Ha ye6 ycnyraTa b to3m 
K/iac ce cb3flaBaT no 3 MeTOfla. KoHKpeTHO 3a noc/ieflHMfl npuMep wsdi 
reHepupa c/ieflHMTe MeTOflu: 



publ 
{ 

} 


ic 


AddService ( ) 


















this.Url = "http: 


//localhos 


t/AddService/AddS 


ervice 


asmx" ; 


publ 
{ 


ic 


int Add (int a, 


int 


b) 














ob; 


ect [ ] results 


= th 


is . Invoke 


"Add", 


new 


ob 


ject [] 


{ 




















3-r 

b}); 




} 


return ((int) (results 


[0] ) ); 















538 flporpaMnpaHe 3a .NET Framework (tom 2) 



public System. IAsyncResult BeginAdd(int a, int b, 

System. AsyncCallback callback, object asyncState) 

{ 

return this . Beginlnvoke ( "Add" , new object [] { 

a, 

b}, callback, asyncState); 
} 

public int EndAdd (System. IAsyncResult asyncResult) 

{ 

object[] results = this . Endlnvoke (asyncResult ) ; 
return ( (int) ( results [ 0] ) ) ; 

} 



Add(...) Ce l/l3nO/13Ba 3a CklHXpOHHO l/l3BMKBaHe, a BeginAdd(...) M EndAdd(...) - 

3a acuHxpoHHO M3BMKBaHe Ha ye6 MeTOAa. AcuHxpoHHme M3BMKBaHMa Ha ye6 
ycnyri/i me pa3r/ieAaMe no-KtCHO b HacToaiuaTa TeMa. 

M3no/i3BaHe Ha mokamhch K/iac 

no CBOATa cbiuHOCT npoKCM K/iacoBeTe He ce pa3/ikmaBaT ot o6nKHOBeHMTe 
K/iacoBe. M3no/i3BaT ce no cbmwfl HanwH - ntpBO ce MHCTaHunpaT (cb3AaBa ce 
o6eKT ot npoKCM K/iaca) v\ cnep, TOBa ce bmiot HeroBMTe MeTOAn: 



AddService addSevice = new AddService 
int sum = addService . Add ( 5, 6); 



Me>KAy M3BMKBaHeTO Ha o6mkhob6h K/iac m Me>KAMHeH K/iac, pa36npa ce MMa 

HflKO/IKO pa3^MKM. 

EAHaTa ot tax e, ne M3BMKBaHeTO MO>Ke p,a ce 3a6aBM, tbm KaTO Tpa6Ba p,a ce 
ocbiuecTBM KOMyHMKaunfl ao OTAa/ieneH ctpBtp. 

ripn M3BMKBaHe Ha MeTOAMTe Ha Me>KAMHHMfl K/iac MoraT Aa ce no/iynaT 

SoapException V\J\V\ WebException. WebException B"b3HMKBa npn npo6/ieM C 

KOMyHMKaunflTa c yc/iyraTa (HanpuMep aKO cbpBtptT e HeAOCTbneH), a 
SoapException B"b3HMKBa, aKO e HacTbnw/i npo6/ieM Ha ctpBtpa no BpeMe Ha 
M3n"b^HeHneTO Ha ye6 MeTOAa (HanpuMep, aKO e HacTbnw/io p,eneuv\e Ha 0). 




no BpeMe Ha M3ni>/iHeHiie Ha MeTOfl b ye6 yc/iyraTa n3K/iiOHe- 
HkiDTa, komto MoraT fla Bi>3HMKHaT, MoraT f\a ca ot pa3/iimeH 

BMfl (invalidCastException, DivideByZeroException, . . . ), HO 

He3aBMCMMO ot TOBa npw K/iweHTCKOTO npusioweHiie npMCTMra 

eflMHCTBeHO SoapException, T.e. OpMrMHa/IHOTO M3K/IK)HeHMe 

ce ry6n. 



B Kpaa Ha TeMaTa me noKaweM onucaHMAT npo6/ieM etc 3ary6aTa Ha opurn- 
Ha/iHOTO M3K^K)4eHne MO>Ke Aa 6"bAe 3ao6m<o/ieH no npo3paneH HanwH v\ npn 
K^neHTa Aa ce no/iyni/i opwrkma/iHOTO i/i3K/iK>neHwe. 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 539 



kl3nosi3BaHe Ha Me>KflMHeH K/iac - npuMep 

3a fla fleMOHCTpupaMe KOHcyMnpaHeTO Ha ye6 ycnyra npe3 Me>KAHHeH K/iac, 
me cb3AaAeM K/iweHTCKO npn/io>i<eHMe, KoeTO M3BMKBa cb3AaAeHaTa yc/iyra 

AddService . 

3a ue/ua Ha npuMepa cb3AaBaMe nanKa, b kohto me Atp>Ki/iM Hy>KHMTe 
<fcaM/iOBe. HeKa 3a KOHKpeTHOcr ta p.a e "E:\ciient". OTBap^Me Visual Studio 
.NET 2003 Command Prompt v\ OTMBaMe ao nanKaTa "E:\ciient", cnep. KoeTO 
M3n"b^HABaMe KOMaHAaTa: 



wsdl http : //localhost/AddService/AddService . asmx?wsdl 



B pe3y/iTaT ce cb3AaBa Me>KAMHHMflT K/iac Addservice.es. B cbujaTa nanKa 

C"b3AaBaMe V\ dpaM/ia "AddServiceClient.es" CbC C/ieAHOTO CbA"bp>KaHkie: 



usin 


g System; 






publ 
{ 

St 

{ 


ic class AddServiceClient 






atic void Main ( ) 






AddService addService = new AddService ( 


); 






int a = 5; 








int b = 6; 








int sum = addService .Add (a, b); 






} 
} 


Console. WriteLine ("{ 0} + {1} = {2}", a, 


b, 


sum) ; 



3a Aa KOMnw/ikipaMe npi/i/io>KeHi/ieTO, nuiueM b Command Prompt KOMaHAaTa: 



CSC * . cs 



B pe3y/iTaT no/iynaBaMe KOMnw/ikipaHOTO aceM6/iw Addserviceciient.exe, 
KoeTO npn M3nt^HeHkie M3Be>KAa cnep,Hwn pe3y/iTaT: 



(S C:\WINDOWS\system32\cmd.exB 


-N 


X 


Microsoft Win do us KP [Uersion 5.1.2600] 
<C> Copyright 1985-2001 Microsoft Corp. 




± 


E:\>cd Client 






E:\Client>AddServiceClient .exe 
E + 6 = 11 






E:SClient>_ 




T 1 







540 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Ye6 yc/iyriiTe n VS.NET - cb3flaBaiie m KOHcyMiipai-ie 

Visual Studio .NET MMa cw/iHa nofl,qp"b>KKa Ha ye6 yc/iyrw. Cb3,qaBaHeTO v\ 
KOHcyMnpaHeTO mm CTaBa nonTki aBTOMaTi/mHO - 6e3 fla nuiueM flont/iHMTe/ieH 
KOfl Ha ptKa. 

Ci>3AaBaHe Ha Hoea ye6 ycnyra c VS .NET 

3a fla cb3flafleM HOBa ye6 ycnyra, OTBapaMe Visual Studio .NET v\ ot MeHKrro 
M36npaMe File | New | Project. Ot noflBM/iwfl ce npo3opeu M36npaMe 
ASP.NET Web Service. 



File 


Edit View 


Project 


Build 


Debug Tools Window Help 


New 






â–º 


_=p Project... Ctrl+Shift+N 




Open 
Close 






â–º 


t|] File... Ctrl+N 
i^3 Blank Solution... 




B no/ieTO Location ce noflBABa aApec no no,apa36i/ipaHe, Ha komto fla 6"bfle 
c-b3flafleHa ye6 ycnyraTa, npuMepHO http://localhost/WebServicel . To3m 
aflpec e Btpxy /ioio/iho i/iHCTa/iwpaHWflT IIS. 

Mo>KeM fla npoMeHMM to3m aflpec Ha flpyr (npuMepHO Ha http://localhost/ 
NewWebService '), crura Ha Hero fla He cbiuecTByBa Bene flpyro ye6 npw/io- 
>KeHne. 

ripn Cb3flaBaHe Ha HOBa ye6 ycnyra Visual Studio .NET npaBM cneflHOTo: 

1. Ct3flaBa .sin cpaw/i b flupeKTopnaTa 3a npoeicm no noflpa36npaHe: 



C:\Documents and Settings \<your user name>\My Documents\ 
Visual Studio Pro jects\<WebServiceName>\<WebServiceName>. sin 



2. Cb3flaBa BnpTya^Ha flMpeicropi/m b IIS b flupeKTopnaTa Ha ye6 cawTa no 
noflpa36npaHe Ha IIS: 



C : \lnetput\wwwroot\<WebAppName> 



3. Cb3flaBa b Hea cpaw/iOBeTe Ha npoeicra: 



Bin\, 




<Web Se r vi ceName > 


cspro j , 


<WebServiceName> 


cspro j . webinf o , 


<Web Se rvi ceName > 


asmx, 


<Web Se rvi ceName > 


asmx. cs , 


<WebServiceName> 


asmx. resx, 


Assemblylnf o . cs , 




Web . conf ig , 




Global . asax, 




Global . asax . cs , 




Global . asax . resx 





HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 541 

Othobo ce noyiBflBa npo6/ieM"bT c npaBaTa, Heo6xoflMMM 3a cb3flaBaHeTO Ha 
npoeKTa b naniOTa no noflpa36npaHe c:\inetput\wwwroot\. OcBeH TOBa 
MOxeM p,a MCKaMe HaiuaTa ye6 yc/iyra p,a e pa3no/io>KeHa Ha Apyro macro Ha 

TBtpAMfl AUCK. 

3a as peujMM Te3M npo6/ieMki Haw-^ecHO, npeAH Aa 3anonHeM cb3AaBaHeTO Ha 
ye6 ycnyraTa MO>KeM Aa cb3AaAeM nanKa TaM, KbAeTO MCKaMe Aa ce cb3AaAe 
npoeKTa, HanpMMep B E:\WebServices\NewService\, m no onucaHMfl no-paHO 
Ha^MH Aa HacTpouM npaBaTa 3a Aocrbn (Web Sharing v\ Security). Cnep, TOBa 
Tpa6Ba Aa perncTpupaMe HOBaTa nanKa KaTO BwpTya/iHa AnpeKTopua b IIS v\ 
TaKa npn cb3AaBaHeTO Ha ye6 ycnyraTa Newwebservice, dpaw/iOBeTe v\ me ce 

HaMMpaT B E:\WebServices\NewService\ BMeCTO B C:\lnetput\wwwroot\. 

KoHcyMMpaHe ye6 yc/iyra c VS.NET 

IHe AeMOHCTpupaMe KaK MOxeM Aa ki3no/i3BaMe Bene cbmecrByBama ye6 
yc/iyra ot VS.NET. 3a ue/iTa HeKa cb3AaAeM eAHO hobo koh30/iho npn/ioxeHne 
Addserviceconsoie. McKaMe TOBa npw/io>KeHkie Aa M3no^3Ba ycnyraTa 
Addservice. flo6aBAMe Bp"b3Ka KtM ye6 ycnyraTa KaTO ot MeHKrro Project 
M36npaMe Add Web Reference: 

Project | Build Debug Tools ReSharpe 

?:§! Add Windows Form .. . 

Yjgl Add Inherited Form . . . 



Add Reference. 



Add Web Reference. 



Set as Startup Project 



k 



ConsurneWebService Properties, 



B pe3y/iTaT Ha TOBa ce noflBABa npo3opei_i, cnywew, 3a HaMnpaHe Ha ye6 
ycnyraTa. IHoa no/ieTO URL ce noflBHBaT hako/iko Bpt3KM, komto no3BO/i*iBaT 
ziecHO TbpceHe Ha ye6 ycnyrw: 



Start Browsing for Web Services 

Use this page as a starting point to find Web services, You can click the links 
below, or type a known URL into the address bar. 

Browse to: 

â–  Web services on the local machine 

â–  Browse UDDI Servers on the local network 

Query your local network for UDDI servers. 

â–  UDDI Directory 

Query the UDDI business registry to find companies and production Web 



Test Microsoft UDDI Directory 

Locate test Web services to use during development. 



542 nporpaMnpaHe 3a .NET Framework (tom 2) 

ritpBaTa Bp"b3Ka hm no3BO/i*iBa fla pa3r/ie,qaMe ye6 ycnyrMTe, ny6/ikiKyBai-m Ha 
/ioi<a/iHaTa hm MaiunHa. BTopaTa flaBa bbsmokhoct fla norbpcuM ye6 yc/iyra b 
/ioi<a/iHaTa hm Mpexa. TpeTaTa Bp"b3Ka hm npaiua b crpaHMuaTa 3a TbpceHe Ha 
ye6 yc/iym b UDDI 6M3Hec perMCTtpa. HeTBtpTaTa npenpaTKa hm boam ao 
CTpaHMua 3a TbpceHe Ha TecTOBM ye6 yc/iym, no/ie3HM npM pa3pa6oTKa m 
o6y4eHMe. 

Pa36Mpa ce, BMHarM MO>KeM fla cm BtBefleM flMpeKTHO aflpeca Ha ye6 ycnyraTa 
b no/ieTO URL m fla HaTMCHeM 6yTOHa [Go], cnefl KoeTO Visual Studio .NET 
3anonBa fla TtpcM wsdi onMcaHMeTO Ha noconeHMH aflpec: 

URL: |http://localhost/Add5ervice/Add5ervice.asmx _*J 3g<J\J 

C/iefl KaTO ro HaMepM, ce aKTMBMpa no/ieTO Web reference name. B Hero 
3anMCBaMe MMeTO Ha npocrpaHCTBOTO, b KoeTO MCKaMe fla ce reHepMpaT 
npoKCM K/iacoBeTe, npMMepHO Myservice. HaTMCKaMe cnep, TOBa 6yTOHa [Add 
Reference] m VS.NET Cb3flaBa 3a Hac Me>KflMHHMflT (proxy) K/iac, 3a flocrbn 
flo M36paHaTa ye6 ycnyra. 

3a fla M3no^3BaMe Bene cb3fla,qeHMflT Me>KflMHeH K/iac m 3a fla M3BMKaMe ye6 
yc/iyraTa, nocraBsiMe cnep,Hwn koa b .cs cpai/i/ia Ha npM/io>KeHMeTo: 



using System; 

public class AddServiceClient 

{ 

using MyService; 
static void Main ( ) 

{ 

AddService addService = new AddService ( ) ; 

int a = 5; 

int b = 6; 

int sum = addService .Add (a, b); 

Console. WriteLine ("{ 0} + {1} = {2}", a, b, sum) 
} 

} 



C TOBa c"b3flafloxMe cbiuoTO npM/io>KeHMe KaTO TOBa ot Cb3flaBaHe_Ha_ye6 
y_cnyr_M, caMO ne c noMOurra Ha Visual Studio .NET. 

ATpn6yTM 3a ye6 yoiyriiTe 

Ye6 ycnyrMTe M3no/i3BaT flBa ochobhm aTpM6yTa 3a onMcaHMe. ToBa ca 

[WebService] M [WebMethod] . HeKa TM pa3r/ieflaMe nO-BHMMaTe/lHO. 

ATpn6yrbT [WebService] 

To3M aTpM6yT ce M3no/i3Ba 3a onMcaHMe Ha caMMa K/iac Ha yc/iyraTa m ce 
nocTaBfl to4ho npeflM HeroBaTa flecpMHMUMfl. Hpe3 Hero MoraT fla ce 3aflaBaT 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 543 
i/iMe, XML npocrpaHCTBO ot MMeHa v\ KpaTKO onucaHne Ha yc/iyraTa. ToBa 

CTaBa nOCpeflCTBOM nO/ieTaTa: Name, Namespace M Description. 

l/l3no/i3BaHeTO Ha XML npocTpaHCTBa ot MMeHa no3BO/iflBa no yHMKa/ieH HanwH 
fla ce onpefle^AT e/ieMeHTM v\nv\ aTpn6yTM Ha XML flOKyMeHT. OnucaHneTO Ha 
eAHa XML ye6 ycnyra ce Aec|3MHMpa b XML c|DopMaT, v\ no cneuMa/iHO 4pe3 
e3MKa 3a onucaHne Ha ye6 yc/iyrw - WSDL. 

B onucaHkieTO Ha XML ye6 yc/iyrnTe, no/ieTO Namespace ot aTpn6yTa 
webservice ce M3no/i3Ba KaTO npocTpaHCTBO ot MMeHa no noflpa36npaHe 3a 
XML e^eMeHTM, komto flupeKTHO npnHafl^e>KaT Ha ye6 yc/iyraTa. HanpuMep, 
MMeTO Ha ye6 yc/iyraTa v\ HeMHMTe mstoam npMHaA.ne>KaT Ha npocrpaHCTBOTO 

OT MMeHa, nOCOneHO B no/ieTO Namespace. 

flo6pa npaKTMKa e p,a npoMeHsiTe CTOMHOcrra Ha no/ieTO Namespace, kohto e 
3aAaAeHa noApa36npaHe, TbM KaTO ta MAeHTMCJDMUMpa yHkiKa/iHOCira Ha ye6 
yc/iyraTa. Ako bcmukm ye6 yc/iym, komto ocbiuecTBABaT Bp"b3Ka noMe>KAy cm, 
M3no^3BaT eAHO m cbiuo npocTpaHCTBO ot MMeHa, me ce HapyiuaT ochobhm 
npaBM/ia npM onMcaHMeTO Ha SOAP naKeTMTe m cbOTBeTHO Te3M ye6 ycnyrM 
HflMa Aa MoraT p,a pa6oTAT 3aeAHO. CTOMHOCira Ha Namespace Tpa6Ba p,a e 
yHMKa^eH URI m/im URN MAeHTMCJDMKaTop, KaKTO npM bcmukm XML npocrpaH- 
CTBa (b>k. TeMaTa " Pa6oTa c XML "). 

Eto npMMep 3a M3no/i3BaHe Ha aTpM6yTa [webservice] : 



[WebService (Namespace="http : //localhost/xmlwebservices/ " , 

Description="ye6 ycjiyra 3a cb6npaHeTO Ha flBe uejiw ywcjia' 
Name="Add Service")] 

public class AddService : System. Web . Services .WebService 

{ 

} 



ATpn6yrbT [WebMethod] 

To3M aTpM6yT yKa3Ba, ne AaAeH MeTOA e AOCTbneH 3a Knv\enjv\je Ha ye6 

yc/iyraTa. TOM MMa C/ieAHMTe nO/ieTa: BufferResponse, CacheDuration, 
Description, EnableSession M MessageName. 

no/ieTO BufferResponse 

ToBa no/ie Ha aTpM6yTa WebMethod no3BO/i*iBa 6y<fcepMpaHe Ha OTroBopMTe Ha 
ye6 MeTOAa. KoraTO CTOMHOcrra My e true, ASP.NET 6y<fcepMpa ue/iMH OTroBop 
npeAM Aa ro M3npaTM kbm K/iMeHTCKOTO npM/io>KeHMe. 5yc|DepMpaHeTO e mhoto 
ec|DMKacHO m cnoMara 3a noAo6p*iBaHe Ha npoM3BOAMTe/iHOOTa KaTO HaMa/iflBa 
KOMyHMKauMATa Me>KAy pa6oTHMfl npouec m ye6 ctpBtpa. Ako CTOMHOcrra My 
e false ASP.NET 6y<£epMpa OTroBopa Ha napneTa ot no 16KB. CTOMHoara Ha 
TOBa no/ie ce cnara Ha false, caMO KoraTO He MCKaMe Aa Atp>KMM ua/ioto 
c"bA"bp>KaHMe Ha OTroBopa b naMeTTa HaBeAH"b>K. npMMepHO TaKbB 6m 6m/i 
c/iynaflT, aKO BptiuaMe cbAtpwaHMeTO Ha KO/ieKUMa, koato B3eMa CBOMTe 



544 nporpaMnpaHe 3a .NET Framework (tom 2) 

e/ieMeHTi/i ot 6a3a flaHHM. ToraBa 3afl"bp>KaHeTO Ha ue/ii/iyi cnroBop b naMerra 
MO>Ke fla npeflM3BMKa npent/iBaHe Ha naMerra. Ako He e yi<a3aHa ctomhoct 3a 
TOBa no/ie, croi/iHOCTTa no no,apa36i/ipaHe e true. 

l"1o/ieTO CacheDuration 

ToBa no/ie OTroBapa 3a KeiunpaHeTO Ha pe3y/iTaTMTe ot flafleH ye6 MeTOfl. 
KeiunpaHeTO ce w3no/i3Ba 3a fla yBe/ii/mw npow3BOflHTe/iHOCTTa Ha cbpBtpa, 
KoraTO flafleH ye6 MeTOfl npoMeHsi psiflKO BptiuaHna pe3y/iTaT. 

ASP.NET Keiuupa pe3y/iTaTMTe 3a bcako MHO>KecTBO bxoahm napaMeTpn, t. e. 
npn noflafleHM pa3/iwnHki napaMeTpn Ha ye6 MeTOfla H^Ma fla ce BtpHe Keiun- 
paHMAT pe3y/iTaT, a me ce ki3n"b/iHki MeTOfltT c HOBkue napaMeTpn v\ pe3y/iTa- 
TbT ctiflo me ce Keiunpa. ripn noBTopHO M3BMKBaHe Ha MeTOfla c eflHM v\ cbu\v\ 
napaMeTpn b paMKMTe Ha 3aflafleHna nepnofl ce Bptiua Bene KeujupaHMAT 
pe3y/iTaT. CTOMHOcrra Ha TOBa no/ie onpe,qe/ifl 3a ko/iko ceKyHflu ASP.NET fla 
Keiuupa pe3y/iTaTa. CrowHOCTTa 03HanaBa, ne KeiunpaHeTO e M3K/iK)neHO. 
Ako He e yi<a3aHa, CTOMHOCTTa 3a TOBa no/ie, no noflpa36npaHe e 0. 

no/ieTO Description 

Hpe3 TOBa no/ie ce 3aflaBa KpaTKO onucaHne 3a ye6 MeTOfla, KoeTO ce noyiBflBa 
b help CTpaHnuaTa Ha ycnyraTa. Ako He e yKa3aHa, CTOMHOcrra 3a TOBa no/ie, 
no noflpa36npaHe ce M3no/i3Ba npa3eH CMMBO/ieH hm3. 

no/ieTO EnableSession 

CTOMHOCTTa Ha TOBa no/ie onpe,qe/ifl p,anw 3a flafleHna ye6 MeTOfl e no3BO/ieHO 
M3no/i3BaHeTO Ha cecna. Ako ta e true, ye6 ycnyraTa MMa flocrbn ao cecnaTa 

4pe3 HttpContext. Current. Session V\J\V\ 4pe3 no/ieTO WebService . Session, 

aKO ce Hac^eflflBa 6a30Bi/mT K/iac WebService. Ako He e yKa3aHa, CTOMHOCTTa 
3a TOBa no/ie no noflpa36npaHe e false. Pa6oTaTa etc cecnn ki3no/i3Ba 
Cookies v\ TOBa MO>Ke fla npeflM3BMKa HecbBMecTMMOCTM c flpyrn n/iaTCpopMki, 
Tbv\ KaTO Cookies He ca nacr ot cneuncpuKaunnTe 3a ye6 yc/iyrw, a ca 
B"b3MO>KHOCT Ha HTTP npoTOKO/ia. rio-HaTaTbK b HacTOfliuaTa TeMa me 
pa3r/ieflaMe b fleTaw^n npo6.neMa 3a noflflP"b>KKa Ha cecnn . 

no/ieTO MessageName 

3aflaBaMKM ctomhoct Ha TOBa no/ie Ha aTpn6yTa webMethod, MOweM fla CMeHMM 
MMeTO Ha MeTOfla npn K/ikieHTa. ToBa no3BO/iaBa Ha ycnyraTa fla nocraBki 
yHMKa^HM MMeHa Ha npenoKpuBaiun ce MeTOflM. Ako He e yKa3aHa ctomhoct 3a 
TOBa no/ie, CTOMHOCTTa no noflpa36npaHe e caMOTO MMe Ha MeTOfla. KoraTO e 
3aflafleHa ctomhoct Ha no/ieTO MessageName, pe3y/iTaTHOTO SOAP c"bo6iueHne 
ot MeTOfla me OTroBapa Ha 3aflafleHOTO MMe BMecTO Ha MMeTO Ha mctmhckma 
MeTOfl b K/iaca Ha ye6 ycnyraTa. 

npexBi>p/isiHe Ha Tiinoee (marshalling) 

ripexBtp/iflHeTO Ha TunoBe (Mapuja^M3aunfl) e npouecbT Ha TpaHCCpopMauna 
Ha pa3/iwnHkiTe Ti/inoBe flaHHM ot SOAP v\ XML kbm .NET TunoBe v\ o6paTHOTO. 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 545 

Ha BceKM .NET Tun ce CbnocraBfl CbOTBeTeH SOAP Tun v\ o6paTHOTO - Ha 
BceKM SOAP Tun, onucaH b WSDL flecJDMHUUMflTa Ha ycnyraTa, ce CbnocraBfl 
.NET Tun. npexBtp/iflHeTO Ha TunoBeTe i/ma 1/1 CBOMTe oco6eHOCTM, c komto 
Tpa6Ba fla ce cbo6pa3flBaMe. 

He BCM4KM .NET TunoBe MoraT fla ce npexBtp/isiT npe3 ye6 yc/iyra. HanpuMep 
HflMa KaK fla npexBtp/iMM Ha OTfla/ieneHa Mawkma OTBopeH cjDaM/i . Hakom no- 
c/iokhm TunoBe, HanpuMep peKypcuBHMTe crpyKTypw ot flaHHM, cbiuo He 
MoraT fla ce npexBtp/isiT flupeKTHO, 3aiuoTO SOAP v\ WSDL CTaHflapTMTe ca no- 
o6lum m He ca cbo6pa3eHi/i c bcmukm oco6eHOCTM Ha .NET TunoBeTe. 

Pa3/innHM TunoBe flaHHM MoraT fla ce npeflaBaT KaTO napaMeTpn Ha ye6 MeTOfl 
m fla ce BptiuaT KaTO pe3y/iTaT. KoraTO HAKaKtB Tun flaHHM, o6eKT v\nv\ MeTOfl 
ce noflafle KaTO SOAP 3aaBKa v\i\v\ OTroBop, tom aBTOMaTi/mHO ce npexBtp/ia 

B"bB BMfl Ha XML. 

TbM KaTO BceKM e3MK 3a nporpaMnpaHe Moxe fla i/i3no/i3Ba SOAP, SOAP 
flecJDMHupa cbom co6cTBeHM TunoBe flaHHM. KoraTO ce noflaflaT HflKaKBM flaHHM 
b SOAP c"bo6iueHne, Te ce npexBtp/isiT b TexeH SOAP eKBMBa/ieHT. ToBa 
no3BO^ABa Ha pa3/ii/mHi/iTe e3nun c pa3/ii/mHki MMeHa Ha TunoBeTe fla KOMyHM- 
KnpaT ec|DeKTMBHO. OaKTbT, ne ye6 yc/iyrwTe ca 6a3npaHM Ha XML cepna^n- 
3aun5i, no3BO^ABa 3HanwTe/ieH 6pow TunoBe flaHHM fla 6"bflaT npexBtp/iflHki 
(b>k. TeMaTa " Cepna.ni/i3auMa Ha flaHHM "). 

npHMMTMBHH TMIlOBe 

CTaHflapTHMTe npMMMTMBHM TunoBe ce npexBtp/iflT flupeKTHO v\ 6e3npo6/ieM- 

HO. TOBa ca TkinOBeTe: string, char, byte, bool, sbyte, int, uint, long, 
ulong, short, ushort, float, double, decimal. 5e3 npo6/ieMM ce 

npexBtp/iflT m HAKOM CTaHflapTHM CTpyKTypn, KaTO Guid m DateTime. Hanpn- 
Mep CMMBO/iHMAT hm3 "Hello World" ce npexBtp/ifl bbb BMfla: 



<string>Hello World</string> 



Huc^OBMTe TunoBe cbiuo ce npexBtp/urr b TeKCTOB bma b crporo onpe,qe/ieH ot 
XML Schema (XSD) cneumfcwKaui/mTa c|DopMaT. 

kl36poeHM THnoBe 

Bcm4km M36poeHM TkinoBe ce npexBtp/isiT nofl c|DopMaTa Ha HM30Be KaTO ce 

B3eMaT MMeHaTa Ha kl36poeHklTe MM CTOMHOCTM: enum Color {Red, Blue}. 

K/iacoBe m CTpyKTypw 

Ot K/iacoBeTe v\ crpyKTypi/iTe ce caMO ny6/ii/mHi/iTe no/ieTa v\ CBOMCTBa. 

riOflfl"bp>KaT Ce B/10>KeHI/l TMnOBe V\ fltpBOBklflHM CTpyKTypM, HO He M UklK/lMUHM 

TunoBe. 3afl"b^>KMTe^HO yc/iOBkie 3a fla MO>Ke fla ce npexBtp/iw eflMH K/iac e 
tom fla MMa flecJDMHupaH KOHCTpyKTop 6e3 napaMeTpn. Eto hako/iko npuMepa 
3a CTpyKTypn v\ K/iacoBe, komto ce npexBtp/iflT 6e3npo6/ieMHo: 



public struct Point 



546 flporpaMnpaHe 3a .NET Framework (tom 2) 



{ 










public 


int 


x, y; 


} 








public class 


Student 


{ 










public 


int 


Age 




{ 








get 


{...} 






set 


{...} 






} 






} 









Te3M TkinoBe ce npexBtp/isiT bbb bma Ha XML no cneRHwn HanwH: 



<Point> 








<x xsi 


: type="xsd 


int 


'>5</x> 


<y xsi 


: type="xsd 


int 


'>5</y> 


</Point> 








<Student 


xsi : type=" 


nsl : 


Student" > 


<Age xsi : type="xsd: int">13</Age> 


</Student> 







BtnpeKM, ne ropHMTe MeTOflM He flecpMHupaT M3pn4HO kohctpyktop 6e3 napa- 
MeTpn, tom ce flecpMHupa no noflpa36npaHe ot KOMnw/iaTopa, tbm ioto Te3M 
TunoBe He AecpMHupaT hmto eAHH flpyr kohctpyktop (b>k. TeMaTa " Q6eKTHO- 
opueHTupaHO nporpaMkipaHe b .NET "). 

MaCHBH 

MacuBMTe ot npuMMTMBHM TkinoBe, M36poeHM TunoBe, K/iacoBe v\nv\ crpyKTypw 
Cbiuo ce npexBtp/iflT 6e3 npo6/ieMw: string[], color[], Point[]. 3a npuMep 
MO>KeM p,a pa3MeAaMe cnep,Hv\nj MacuB ot cmmbo/ihm HM30Be: 



string [] emailAddresses = new string [] 


{ 


"testEmaill@testDomain . com" , 




"testEmail2@testDomain . com" } ; 





Tom ce npexBtp/ia npn npeHacyiHe b SOAP C"bo6iueHMfl b cnej\HV\n cpopMaT: 



<emailAddresses xsi : type="SOAP-ENC : Array" 
SOAP-ENC: arrayType="xsd: string [2] "> 
<item xsi : type="xsd: string"> 
testEmaillStestDomain . com 
</item> 

<item xsi : type="xsd: string"> 
testEmail2@testDomain . com 
</item> 
</emailAddresses> 



HnaBa 22. OTfla/ieneHM M3BMKBaHHfl c .NET Remoting 547 



KOSieKUMM 



KO^eKUMMTe OT npMMMTMBHM Ti/inoBe, M36poeHM TunoBe, K/iacoBe M/1M CTpyK- 
Typn ce npexBtp/iHT KaTO MacuBM. ToBa 03HanaBa, ne aKO AafleH ye6 MeTOA 
Bptiua KoneKixwn (HanpuMep ArrayList), b WSDL onucaHneTO BMecTO KO/ieK- 
\\v\s\ TMirbT me 6"bfle flecJDMHupaH KaTO MacuB. B pe3y/iTaT Ha TOBa v\ b Me>KAHH- 
HMfl (proxy) K/iac MeTOAtT me Bptiua MacuB. 3a npuMep MO>KeM p,a pa3r/ie- 
AaMe M3BMKBaHeTO Ha cnep,Hwn ye6 mstoa: 



[WebMethod] 










public 

{ 

Arra 


ArrayList 


He 


lloWorld( ) 




/List list 


= 


new 


ArrayLis 


t(); 


list 


.Add ("item 


1 " ) ; 






list 


.Add ("item 


2 " ) ; 






list 


.Add (42) ; 










return list; 
} 











ripn M3BMKBaHeTO Ha T03M MeTOA pe3y/iTaTbT ce npexBtp/ifl bbb bma Ha XML b 
cneAHMfl c|DopMaT: 



<ArrayOfAnyType xmlns :xsd="http: //www. w3 . org/2 01/XMLSchema" 

xmlns : xsi="http : //www. w3 . org/2 01/XMLSchema- instance" 

xmlns="http : //localhost/xmlwebservices/ "> 

<anyType xsi : type="xsd: string">item K/anyType> 
<anyType xsi : type="xsd: string">item 2</anyType> 
<anyType xsi : type="xsd: int">42</anyType> 

</ArrayOfAnyType> 



DataSet o6eKTM 

DataSet o6eKTMTe cbiuo MoraT p,a ce npeAaBaT npe3 ye6 ycnyrw. Taxhoto 
npeACTaBAHe e Aocra o6eMMCTO v\ 3aTOBa Tpa6Ba p,a ce BHMMaBa, Tbi/i KaTO Te 
3Ha4MTe^HO yBe/ii/maBaT o6eMa Ha MHCJDopMauMfl, npexBtp/isiHa Me>KAy ycny- 
raTa v\ npi/i/io>KeHkiflTa. ripn npexBtp/iflHe Ha DataSet o6eKT ce npexBtp/ia 
XSD cxeMaTa My, nocneABaHa ot cepna^M3npaHMTe ashhh 3a BC^Ka ot 
Ta6^nuMTe My noA cjaopMaTa Ha XML. 

XmlNode 

BcflKaKBM XML c|DparMeHTM MoraT p,a ce npeAaBaT Me>KAy K/iweHTa v\ ycnyraTa b 
4mct bma. B .NET Framework Te3M XML c|DparMeHTM cbOTBeTcmaT Ha K/iaca 

Sy s tern . Xml . XmlNode . 

npexBTap/iflHe Ha TMnoBeTe - npMMep 

3a p,a AeMOHCTpupaMe npexBtp/isiHeTO Ha TunoBe Me>KAy K/iweHT v\ ye6 
ycnyra, me Cb3AaAeM npuMepHa ye6 ycnyra TypesService c hako/iko ye6 
MeTOAa. no onucaHMfl no-paHO Hani/m, cb3AaBaMe ntpBO yc/iyraTa, a c/ieA 
TOBa m noMOiueH K/iac, crpyKTypa v\ eHyMepaunn: 



548 flporpaMnpaHe 3a .NET Framework (tom 2) 



public enum Color 

{ 

Red, 
Blue 

}; 

public struct Point 

{ 

public int x, y; 

} 

public class Student 

{ 

// Private fields - not serialized and marshalled 
private string mName; 
private int mAge; 
private int mState = 0; 

public string Name 

{ 

get 

{ 

return mName; 

} 
set 

{ 

mName = value; 

} 
} 

public int Age 

{ 

get 

{ 

return mAge; 

} 
set 

{ 

mAge = value; 

} 
} 

// This parameterless public constructor 

// is required for the XML serialization 

public Student ( ) 

{ 

} 

public Student ( string aName, int aAge) 
{ 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 549 





mName = aName ; 


} 


mAge = aAge; 
} 



flo6aBAMe c^eAHMTe ye6 mstoah: 

GetcoiorsO - Bptiua MacuB ot Tun color. IHe BtpHe e^eMeHTMTe Ha M36po- 



eHMfl Tun color: 



[WebMethod (Description="Returns a list of available colors."; 
public Color [] GetColors ( ) 

{ 

Color [] colors = new Color [2], • 
colors [0] = Color. Blue; 
colors [1] = Color. Red; 

return colors; 
} 



caicuiateDistance (...) - npweMa KaTO napaMerbp ABe npoMeH/ikiBki ot Tun 
Point m Bptiua KaTO pe3y/iTaT pa3CTOHHi/ieTO Me>KAy ABeTe toukm b Ebk/imaobo 
npocrpaHCTBo: 



[WebMethod (Description="Calculates distance between two points 

in the plane . " ) ] 

public double CaicuiateDistance ( Point pi, Point p2) 

{ 

int dx = pl.x - p2.x; 

int dy = pl.y - p2.y; 

double distance = Math . Sqrt (dx*dx + dy*dy) ; 

return distance; 
} 



ConvertDegreesToRadians (...) - npneMa npOMeH/lMBa OT TMn double, npeA" 

CTaB^flBaiua ro/ieMi/maTa Ha trb/i b rpaAycn v\ Bptiua CTOMHOCTTa My b 
paAnaHM b cbiuaTa npoMeH/ikiBa. Ha npaKTMKa npoMeH/ikiBaTa e bxoaho- 
M3X0AHa. TaKMBa npoMeH/iMBM ce noAA"bp>i<aT CTaHAapTHO ot ye6 ycnyrwTe: 



[WebMethod (Description="Converts given angle from degrees to 
radians . " ) ] 
public void ConvertDegreesToRadians ( ref double aAngle) 

{ 

aAngle = (double) aAngle * Math. PI / 18 0; 

} 



Getstudents ( ) - Bptiua npwMepeH MacuB ot o6eKTM OTTun student: 



[WebMethod (Description="Returns a list of Student objects.") 



550 flporpaMnpaHe 3a .NET Framework (tom 2) 



public Student [] 


GetStudents 


) 




i 


Student [] students = new Student [3]; 




students [0] = 


new 


Student ( 


'MBaH", 


20) ; 




students [1] = 


new 


Student ( 


'Mapwfl" 


, 19); 




students [2 ] = 


new 


Student ( 


'5Kopo", 


21) ; 


} 


return students; 









GetDataSeto - cb3AaBa npwMepeH Dataset m ro Bptma KaTO pe3y/iTaT: 



[WebMethod (Description="Returns a DataSet with the tables Towns 

and Countries.")] 

public DataSet GetDataSet ( ) 

{ 

DataTable towns = new DataTable ( "Towns" ) ; 
towns . Columns .Add ( "id" , typeof (int )) ; 
towns . Columns .Add ( "name" , typeof ( string) ) ; 

DataRow sofia = towns . NewRow () ; 
sofia ["id"] = 1; 
sof ia [ "name" ] = "Co^ma"; 
towns . Rows .Add ( sofia) ; 

DataRow varna = towns . NewRow () ; 
varna["id"] = 2 ; 
varna [ "name" ] = "BapHa"; 
towns . Rows .Add (varna) ; 

DataTable countries = new DataTable ( "Countries" ) ; 
countries . Columns .Add ( "id" , typeof (int )) ; 
countries . Columns .Add ( "name" , typeof ( string) ) ; 

DataRow bg = countries . NewRow () ; 
bg["id"] = 1; 
bg["name"] = "B'bJirapMfl" ; 
countries . Rows .Add (bg) ; 

DataSet ds = new DataSet ( ) ; 
ds .Tables .Add (towns) ; 
ds . Tables .Add (countries ) ; 
return ds; 
} 



siowcaicuiation ( ) - npucnuBa HMiuKaTa Ha M3n"b/iHeHMe Ha MeTOAa 3a p,a 
cuMy^upa BpeMeoTHeMaiuo M3n"b^HeHne. IHe i/i3no/i3BaMe to3m MeTOfl no- 
HaTarbK, KoraTO pa3Me>KAaMe acuHxpoHHMTe M3BMKBaHHfl: 



[WebMethod (Description="Simultes a slow calculation."] 
public int SlowCalculation ( ) 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 551 



System. Threading. Thread. Sleep (3000) ; 
return 0; 



} 



Ako KOMnn/inpaMe cera ye6 yc/iyraTa v\ n 3apeAHM npe3 6pay3"bpa me bmamm 
cnncbKa ot mstoah, komto ca Ha pa3no/io>KeHi/ie p,a 6tAaT M3BMKaHM v\ KpaT- 
koto onucaHne 3aAaAeHO b no/ieTO Description Ha aTpn6yTa webMethod 3a 
BceKM ot tax: 



TypesService 



Demo Web service - demonstrates complex type marshalling. 

The following operations are supported. For a formal definition; please review the 
Service Description . 

• SlowCalculation 

Simultes a slow calculation. 

• ConvertPegreesToRadians 

Converts given angle from degrees to radians, 

• GetColors 

Returns a list of available colors. 

• Calculate Distance 

Calculates distance between two points in the plane, 

• GetDataSet 

Returns a DataSet with the tables Towns and Countries. 

• GetStudents 

Returns a list of Student objects. 



MoxeM Aa M3BMKBaMe MeTOAHTe, 3a p,a TecmaMe ycnyraTa npe3 ye6 6pay3"bpa 
v\nv\ MO>KeM as M3no/i3BaMe cneuwa/iHO HanncaH 3a ycnyraTa K/iweHT: 



static void Main ( ) 

{ 

MyServices . TypesService service = 
new MyServices . TypesService () ; 

// Invoke GetColors ( ) Web method 

MyServices . Color [ ] colors = service . GetColors 

Console . WriteLine ( "Colors : " ) ; 

foreach (MyServices . Color color in colors) 



{ 



Console .WriteLine (color) 



552 flporpaMnpaHe 3a .NET Framework (tom 2) 



} 



// Invoke CalculateDistance ( ) Web method 

MyServices . Point pi = new MyServices . Point () ; 

pl.x = 4; 

pl.y = 5; 

MyServices . Point p2 = new MyServices . Point () ; 

p2.x = 7; 

p2.y = -3; 

double distance = service . CalculateDistance (pi, p2 ) ; 

Console .WriteLine ( "\nDistance = {0}", distance); 

// Invoke ConvertDegreesToRadians (double angle) 

double angle = 90; 

service . ConvertDegreesToRadians ( ref angle) ; 

Console .WriteLine ( "\nAngle in radians = {0}", angle); 

// Invoke GetStudents ( ) 

MyServices . Student [ ] students = service . GetStudents () ; 

Console .WriteLine ( "\nStudents : " ) ; 

foreach (MyServices . Student student in students) 

{ 

Console .WriteLine ("{ } : {1}", student . Name, student .Age) ; 

} 

// Invoke GetDataSet ( ) 

DataSet ds = service . GetDataSet () ; 

DataTable towns = ds . Tables [ "Towns" ] ; 
Console .WriteLine ( "\nTowns : " ) ; 
foreach (DataRow town in towns. Rows) 

{ 

Console. WriteLine ("{ 0} : {1}", town ["id"], town [ "name" ]) ; 

} 

DataTable countries = ds . Tables [ "Countries" ] ; 

Console .WriteLine ( "\nCountries : " ) ; 

foreach (DataRow country in countries . Rows ) 

{ 

Console. WriteLine ("{ 0} : {1}", 

country [ "id" ] , country [ "name" ] ) ; 
} 



TopHMflT K/iweiHT pa34MTa Ha TkinoBeTe ot npocrpaHCTBOTO MyServices, komto 
ce reHepupaT aBTOMaTi/mHO ot VS.NET no WSDL onucaHneTO Ha ycnyraTa. 
Te3M TunoBe cbOTBeTcmaT Ha opkiri/ma/iHHTe .NET TunoBe, AecpuHnpaHM b 
ycnyraTa, ho pea/iHO ca ^OKa^HM K^acoBe, CTpyKTypn v\ eHyMepaunn, flecpn- 
HupaHM b Me>KAMHHMTe (proxy) K^acoBe Ha K^neHTa. 

Eto m KaK M3Me>Kfla pe3y^TaT"bT ot i/i3n"b/iHeHweTO Ha ropHna npuMepeH 
K/iweHTCKM koa: 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 553 



c\ C:\TypesServiceClient\TypesServiceClient.exe 


-Inlx 


Colors: 

Blue 

Red 


P| 


Distance = 8,54400374531753 


1 


Rngle in radians = 1,5707963267949 


| 


Students: 
HeaH : 20 
MapHA : 19 
lopo : 21 




Towns: 

1 : Co<PM5i 

2 : BapHa 




Countries: 
1 : EbnrapHfl 


1 


^ | 


_lL 



Ae6i>rBaHe Ha ye6 yoiyrw 

no OTHOiueHMe Ha Ae6"h>rBaHeTO ye6 yc/iyrwTe no hmluo He ce pa3/ikmaBaT ot 
ye6 npn^o>KeHMflTa. Te ce Ae6"brBaT no a6co/iK>THO aHa/iorwueH HanwH. Visual 
Studio .NET hm p,aBa B"b3MO>KHOCTTa iokto p,a crapTkipaMe HanpaBO ycnyraTa b 
pe>KMM Debug, TaKa v\ fla ce npuKa^MM kbm pa6oTHMfl npou.ec, o6cny>KBam 
ASP.NET. Te3M ABaTa noAxoAa 3a Ae6"brBaHe ca noApo6HO onucaHM b TeMaTa 
" Ye6 npn/io>t<eHna c ASP.NET " . 



Mofle/i"bT Ha H3ni>/iHeHHe Ha ye6 yc/iyrwTe b ASP.NET 

Ye6 ycnyrwTe ca ct3AaAeHM 3a p,a 6"bAaT i/i3no/i3BaHi/i ot Apyrn npn^OKeHna. 
Te HAMaT rpacJDkmeH noTpe6i/iTe/iCKki MHTepc|DeMC v\ KoraTO noTpe6wTe/iflT MCKa 
Aa ce B"b3no^3Ba ot h^ko*! ye6 ycnyra, tom Tpa6Ba p,a ce o6"bpHe kbm H^Koe 
npi/i/io>KeHkie, KoeTO a i/i3no/i3Ba. 

HecTO ntTM K/iweHTki Ha ye6 yc/iyrkiTe ca ASP.NET ye6 npn^OKeHna. MoAe/ivr 
Ha M3n"b/iHeHne npn TaKMBa cucTeMn MO>xeM Aa npeAcraBkiM cxeMaTMUHO no 
cneAHMfl Ha^MH: 



554 flporpaMnpaHe 3a .NET Framework (tom 2) 



Browser 



Client 



Web Server 
with .aspx pages 




Server 



Web Server 
with .asmx pages 



Service 



K/ikieHTbT M3npaiua 3aaBKa KtM ye6 ctpBtpa 3a onpeAe/ieHa 
CTpaHnua. 



. aspx 



Ye6 ctpBtptT M3BMKBa ISAPI 6ki6/ikiOTei<aTa Ha .NET Framework - 
aspnet_isapi.dll, KOATO ce rpn>KM 3a noHaTarbWHaTa o6pa6oTKa Ha 
3aaBKaTa. .NET Framework napcBa .aspx crpaHwuaTa, KOMnki/iwpa n v\ n 
M3n"b^HABa (ToBa CTaBa b c/iynaw, ne 3aaBKa kbm Ta3M crpaHi/iua ce 
noflaBa 3a ntpBM ntT. Ako He e TaKa, HanpaBO ce ki3n"b/iH*iBa Bene 
3apeAeHMAT koa). 

no BpeMe Ha w3n"b/iHeHkieTO Ha KOMnn^npaHMfl koa, ASP.NET npw/io>Ke- 
HueTO ce o6p"bma KtM MeTOAM Ha Me>KAHHHi/m (proxy) K/iac, komto e 
reHepupaH v\ KOMnw/ii/ipaH 3aeAHO c npi/i/io>KeHi/ieTO. Te3M MeTOAM npne- 
MaT cbiuMTe napaMeTpn v\ BptiuaT cbiuna pe3y/iTaT iokto m pea/iki3kipa- 
HMTe b ye6 yc/iyraTa. 

Me>KAMHHMTe (proxy) MeTOAH ot cboa CTpaHa KOHcrpyi/ipaT SOAP Cbo6- 
lueHMfl m vv\ M3npaiuaT ao ye6 yc/iyraTa. ToBa CTaBa no cbiuna Hani/m, no 
komto ce M3BMKBaT . aspx CTpaHnun - othobo npe3 HTTP 3aflBKa KtM ye6 
CbpB-bpa m M3BMKBaHe Ha ISAPI cpw/iTbpa 3a ASP.NET. 

Ye6 yc/iyraTa MMa cbom co6cTBeH MOAe/i Ha BtTpewHO ki3n"b/iHeHkie. 
SOAP c"bo6iueHneTO ce napcBa v\ ce M3BMKBa cbOTBeTHMAT MeTOA- B 
pe3y/iTaT ce Bptiua HAKaKbB pe3y/iTaT, komto othobo ce cepna/iki3wpa b 
SOAP cpopMaT m ce Bptiua Ha ye6 npw/io>KeHkieTO. 

Me>KAMHHMflT (proxy) MeTOA Aecepi/ia/ii/i3wpa SOAP Cbo6meHkieTO n Bpt- 
ma pe3y/iTaTa KaTO .NET o6eKT. 

ASP.NET ye6 npw/io>KeHkieTO AOBtpiuBa M3n"b/iHeHkieTO cm m Bptiua otto- 
Bop Ha 3aaBKaTa Ha K/iweHTa noA cpopMaTa Ha HTML crpaHkiua. 



HnaBa 22. OTfla/ieneHM M3BMKBaHMfl c .NET Remoting 555 

B CTbnio HOMep 5 ot M3irb/iHeHMeTO Ha noKa3aHMfl MOAe/i cnoMeHaxMe 3a 
BtTpeujHMfl MOfle/i Ha M3irb/iHeHMe 3a ye6 ycnyraTa. Tom onucBa npoueca, 
komto ce i/i3n"b/iHHBa npn M3BMKBaHe Ha ye6 ycnyra ot MOMeHTa Ha nocrbn- 
BaHe Ha SOAP 3a*iBKaTa ao MOMeHTa, b komto ce Bptiua OTroBop. 3a BC^Ka 
3aaBKa K"bM ye6 ycnyra ASP.NET M3iTb/iHflBa cneflHOTo: 

1. MHCTaHuupa ce K/iacvr Ha ye6 ycnyraTa. 

2. 3afle/ia ce OTAe/iHa HMUJKa ot o6uj.mh ny/i c hmujkm. 

3. M3n"b^HABa ce 3aaBKaTa b Ta3M HMUJKa - M3BMKBa onpeAe/ieHMH MeTOfl. 

4. Bptiua ce pe3y/iTaTa KbM K/iMeHTa - othobo noA cjaopMaTa Ha SOAP 
c"bo6iueHne. 

5. HniiJKaTa ce Bptiua o6paTHO b o6uj.m*i nyn c hmujkm. 

6. OcraBfl MHCTaHUM^Ta Ha K/iaca Ha ycjiyraTa p,a 6wie yHMiuoxeHa ot 
CMCTeMaTa 3a nonMCTBaHe Ha naMerra (garbage collector). 

EcrecTBOTO Ha ye6 ycjiyrMTe ce cbcroM b TOBa Te p,a MoraT p,a 6"bAaT 
M3no/i3BaHM ot mhoto npMJio>KeHMfl eAHOBpeMeHHO, KoeTO boam ao Heo6xoAM- 
MOCTTa mhoto 3aaBKM Aa ce o6cjiy>KBaT eAHOBpeMeHHO. HMUJKMTe 3a M3irb/iHe- 
HMe, KaKTO bcm4km ocTaHajiM pecypcM b peajiHMfl CBAT, ca KpaeH 6poM. npM 
AOCTaT"b4HO ro/iflMa HaTOBapeHOCT Ha ye6 ycjiyraTa, 3aaBKMTe CTaBaT noBene 
ot Ha/iM4HMTe hmujkm. B TaKbB cnynai/i ASP.NET nocraBfl 3aaBKMTe b onaujKa m 
KoraTO ce ocbo6oam HMUJKa, b Hea 3anonBa M3n"b/iHeHMeTO Ha c/ieABamaTa 
3aaBKa ot onaujKaTa. 

Acmhxpohho M3BMKBaHe Ha ye6 yc/iyrn 

KoraTO cb3AaBaMe npMJio>KeHMfl, MCKaMe Te BMHarM Aa OTroBapaT Ha noTpe6M- 

TejlCKOTO B3aMMOAeMCTBMe, He3aBMCMMO, 4e MO)Ke npMJ10>KeHMeTO Aa M3Btp- 

ujBa HAKOfl Te>KKa m BpeMeoTHeMaiua onepauM^. Ako eAHa TaKaBa onepauMa 
ctA"bp>Ka b ce6e cm M3BMKBaHe Ha ye6 ycjiyra (oco6eHO, aKO TOBa CTaBa npe3 
MHTepHeT, a He Ha ziOKa/iHaTa MaujMHa), M3ntJiHeHMeTO Moxe Aa OTHeMe 
rojiflMO KO/iMnecTBO BpeMe. 

ripaKTMKaTa noKa3Ba, ne 3a6aBAHMfl ot nopflAt>Ka Ha 200 MMJiMceKyHAM ao 
Ufljia ceKyHAa, ca necro cpeiuaHM. ToBa MO>Ke m Aa He M3rjie>KAa mhoto, ho 3a 
noTpe6MTejiMTe TOBa e cepM03HO Apa3HeHMe, noHe>Ke noTpe6MTe/iCKMHT mh- 
Tepc|DeMC Hairb/iHO cnMpa Aa c|DyHKUMOHMpa 3a to3m nepMOA- 

rioTpe6MTejiCKMflT MHTepc|DeMC o6MKHOBeHO 6/iOKMpa AOKaTO ce M3BMKBa ye6 
MeTOA, 3aiuoTO tom, 3aeAHO c ye6 MeTOAa pa6oTAT b eAHa m ctiua HMUJKa. 
floKaTO ye6 MeTOAt>T He BtpHe pe3yjiTaT, HMUJKaTa 6/iOKMpa M3n"bJiHeHMeTO cm 
m TaKa noTpe6MTejiCKMAT MHTepc|DeMC He ce o6HOB*iBa. 

M3n"bJiHeHMeTO Ha BceKM MeTOA, komto npeAM3BMKBa 3HanMTe/iHO 3a6aBAHe, b 
ocHOBHaTa HMUJKa npeAM3BMKBa 6jiOKMpaHe Ha noTpe6MTejiCKMa MHTepijpeMC. 
ToBa Tpa6Ba Aa ce M36arBa. TaKOBa noBeAeHMe Ha npMJio>KeHMeTO MO>Ke Aa 
HaKapa noTpe6MTejia Aa 3anonHe Aa xBtpjia KJiaBMaTypM, Aa tpoujm mohm- 
topm, mjim ouj.e no-jioujo - HMKora noBene Aa He KynyBa BaujMfl cocjrryep. 



556 nporpaMnpaHe 3a .NET Framework (tom 2) 

MeTOAM 3a acMHxpoHHO M3BMKBaHe b Me>KAMHHMfl (proxy) K/iac 

KoraTO cb3flaBaMe Me>KflkiHeH (proxy) K/iac 3a .qafleHa ye6 ycnyra, .NET 
Framework reinepi/ipa b Hero MeTOflki, Hairb/mo aHa/iorwuHki Ha Te3M b ye6 
ycnyraTa. Ako otbopmm cope KOfla ocBeH craHflapTHMTe MeTOflu o6ane me 
3a6e/ie>KMM v\ TaKMBa, hmmto MMeHa 3anonBaT c "Begin" v\ "End" v\ 3aB"bpujBaT 
c MMeTO Ha ye6 MeTOfl. HanpuMep aKO ye6 yc/iyraTa i/ma ye6 MeTOfl c MMe 

CalculatePayment () , B Me>Kfll/IHHI/m (proxy) K/iac Lfle l/IMa C"bOTBeTHO MeTOA 
CalculatePayment ( ) , a CbLflO TaKa M flBa MeTOfla BeginCalculatePayment ( ) 
M EndCalculatePayment ( ) . riOC/ieflHklTe ce l/l3nO/13BaT npn aCMHXpOHHOTO 
M3BMKBaHe Ha ye6 yc/iyrw. 

TtCi KaTO npn acuHxpoHHOTO M3BMKBaHe ce 3afle^a floirb/iHMTe/iHa HMUJKa, 
He3aBMCMMa ot ocHOBHaTa, e Heo6xoflkiMO fla flecpMHupaMe MeTOfl, komto fla 
6"bAe M3BMKaH o6paTHO npn npi/iK/iionBaHe Ha pa6oTaTa Ha floirb/iHMTe/iHaTa 
HMiuKa. To3M MeTOfl 3afl"b^>KMTe^HO Tpa6Ba fla npneMa napaMeTbp ot Tun 

IAsyncResult. 

3a fla fleMOHCTpupaMe acMHxpoHHO M3BMKBaHe Ha ye6 MeTOfl, me M3no/i3BaMe 
flecpMHupaHMfl b npeflHaTa fleMOHcrpaui/ifl ye6 MeTOfl - siowcaicuiation ( ) . ot 

yC/iyraTa TypesService. 

3a ue/iTa cb3flaBaMe hobo koh30/iho npn^OKeHne c MMe AsynwscaiiDemo v\ b 
Hero flo6aBAMe cpaw/ia AsynwscaiiDemo.es m ye6 pecpepeHunfl kbm Cb3flafle- 
HaTa b npeflHaTa fleMOHcrpauwfl ye6 yc/iyra (TypesService). Eto cope KOfla 
Ha npuMepHOTO npM/io>KeHMe: 



AsynWSCallDemo . cs 



using System; 

using AsynWSCallDemo . MyServices; 

namespace AsynWSCallDemo 

{ 

class AsynWSCallDemo 

{ 

private static TypesService mService = new TypesService 

public static void Main ( ) 

{ 

AsyncCallback cb = new AsyncCallback (CallFinished) ; 
IAsyncResult ar = 

mService . BeginSlowCalculation (cb, mService) ; 
Console .WriteLine ( "Async call started."); 
Console .Write ( "Loading . " ) ; 
int cycleCounter = 0; 
while ( ! ar . Is Completed) 

{ 

cycleCounter++; 

} 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 557 



Console .WriteLine ( "Cycles Passed: " + cycleCounter) ; 

Console . ReadLine ( ) ; 
} 

private static void CallFinished ( IAsyncResult aAsyncResult ) 

{ 

Console .WriteLine ( "Async call completed."); 

int result = mService . EndSlowCalculation (aAsyncResult ) ; 

Console .WriteLine ( "Result = {0}", result); 



} 



B OCHOBHI/m MeTOA Main(...) Cb3flaBaMe 06eKT OT Tkin AsyncCallback, Ha 

komto b KOHCTpyKTopa noflaBaMe MeTOfla, komto fla 6"bfle M3BMKaH npn npuK- 
ziionBaHe Ha pa6oTaTa Ha flont/iHHTe/iHaTa Hi/iwKa. To3m o6eKT Tpa6Ba fla ce 
Cb3flafle, 3a fla 6tfle noflafleH c/iefl TOBa KaTO napaMerbp Ha MeTOfla, m3bmk- 
Baiu acuHxpoHHO ye6 MeTOfla Ha ye6 ycnyraTa. 

MHCTaHUMATa Ha ye6 yc/iyraTa b npuMepa e mService. M3BMKBaMe MeTOfla Ha 
mService BeginsiowCaicuiation (...) KaTO My noflaBaMe MHO>KecTBO napa- 
MeTpn. B c/iynaa ye6 MeTOfltT Ha yc/iyraTa H^Ma bxoahm napaMeTpn 3aTOBa 

noflaBaMe 3afl"b/l>KMTe/lHMTe cb (06eKTa OT Tkin AsyncCallback) V\ mService. 

Ako Ha ye6 MeTOfla ce noflaBaT HAKaKBM napaMeTpn, ToraBa Ha 

BeginsiowCaicuiation (...) ITbpBO Ce noflaBaT Te M C/iefl TOBa 

AsyncCallback M WebService 06eKTMTe. 

KaTO pe3y/lTaT BeginsiowCaicuiation (...) Bptlfla 06eKT OT Tkin 

IAsyncResult, komto MO>Ke fla ki3no/i3BaMe 3a npoc^eflflBaHe Ha cbcroHHweTO 
Ha M3n"b/iHeHne Ha ye6 MeTOfla. B cnynaa caMO yBe/ii/maBaMe croi/iHOCTTa Ha 
6pofl4, KaTO c/iefl npwK/iionBaHe Ha ki3n"b/iHeHkieTO Ha ye6 MeTOfla M3Be>KflaMe 
CTOMHOCTTa My Ha eKpaHa. Hpe3 no/ieTO iscompieted Ha o6eKTa, BtpHaT ot 
M3BMKBaHeTO Ha MeTOfla BeginsiowCaicuiation (...) , npoBepflBaMe fla/iki e 
npwK/iionki/io acuHxpoHHOTO M3n"b^HeHne Ha ye6 MeTOfla. 

MeTOfl"bT CallFinished (...) npneMa apryMeHT CbU\0 OT Tkin IAsyncResult, 
KaTO T03M 06eKT Ce V\3UOJ\3Bdt npM M3BMKBaHeTO Ha BTOpi/lfl MeTOfl 

EndSlowCalculation (...) , c komto no/iynaBaMe pe3y/iTaTa, BtpHaT ot 
acuHxpoHHOTO M3BMKBaHe. Pe3y/iTaTbT ot i/i3n"b/iHeHkieTO Ha ropHMfl npuMep e 
c/ieflHMflT: 

^'C documents and SettingsVDean VarchevUly DocumentsklolHet BookWr... _ |D| X 



flsync call started. 

Loading. Async call completed. 

Result = 

Cycles Passed: 381273958 



558 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Ye6 yc/iyrn m pa6oTa c aaHHM 

Mhoto necro ye6 ycnyrMTe ce no/i3BaT KaTO Me>KflMHeH c/iom b TpMC/iOMHMTe 
npn^o>KeHMfl. B eflMH TaicbB cueHapnw T^xHaTa ocHOBHa 3a,aana e M3B/iMna- 
HeTO m o6pa6oTKaTa Ha flaHHM ot 6a3aTa flaHHM, KaKTO v\ npneMaHeTO Ha 
flaHHM m BKapBaHeTO mm o6paTHO b 6a3aTa. Hpe3 tax HaM-necro ce pea/iM3Mpa 
ocHOBHaTa 6M3Hec ziorMKa Ha npM/io>KeHMflTa. 

B"b3MO>KHOCTTa Ha ye6 yc/iyrMTe fla npMeMaT m BptiuaT nonTM BCHKaicbB TMn 
flaHHM, npeflocraBfl M3K/iK>nMTe/iHO hd/iamo pa3HOo6pa3Me ot 06/iacTM Ha npM- 
zioxeHMe. B 3aBMCMMOCT ot npM^o>KeHMflTa KOHcyMaTopM, HaM-^ecTO ce npex- 

B"bp/lflT DataSet 06eKTM M/1M MaCMBM OT flaHHM. l/l3nO/13BaHeTO Ha DataSet, 

o6ane, e CB"bp3aHO Hatf-Bene c .NET npM/io>KeHMflTa m p^ako ce no/i3Ba npM 
xeTeporeHHM CMCTeMM. 

npM npM^o>KeHMfl, komto He noflfl"bp>KaT o6eKTM OTTMn DataSet, 3a npeHOC Ha 
flaHHM ce M3no^3BaT TaKa HapeneHMTe o6eKTM 3a npeHOC Ha flaHHM (DTO - 
Data Transfer Objects). npM npeHOca Ha flaHHM, Te3M o6eKTM ce cepMa/iM- 
3MpaT nofl cpopMaTa Ha XML, a caMMsrr K/iac Ha o6eKTa ce flecpMHMpa b WSDL 
onMcaHMeTO Ha yc/iyraTa. B flei/icTBMTe/iHOCT ce cepMa/iM3MpaT bcmukm 
ny6^M4HM no/ieTa m CBOMCTBa Ha o6eKTa. 

KoraTO Visual Studio .NET Cb3flaBa Me>KflMHeH (proxy) K/iac 3a yc/iyraTa, tom 
reHepMpa m K/iac ot TMna Ha o6eKTMTe 3a npeHOC Ha flaHHM, komto e 6e3 
MeTOflM, a ce cbctom caMO ot ny6/iMHHM no/ieTa. no ctiflMfl HanMH, aKO 
yc/iyraTa ce M3no/i3Ba He ot.NET, a ot Java, Perl, PHP m/im ot flpyra 
n/ianpopMa, CbOTBeTHMTe DTO o6eKTM ce npeo6pa3yBaT ot XML kbm o6eKTM ot 
ctOTBeTHMfl e3MK3a nporpaMMpaHe m n/iaTCpopMa. 

Ye6 ycnyrwTe h pa6oTa c abhhm b .NET 

TMnM^HMflT MOfle^ Ha pa6oTa c flaHHM npM .NET ye6 yc/iyra m .NET K/iMeHT e 
M/iK>crpMpaH cxeMaTM^HO Ha c/ieflHaTa cpMrypa: 



M3BMKBaHe Ha ye6 ycnyra 



XML 



DataSet 



DataSet 



KnneHT 



flpoMAHa Ha flaHHM 



npe3 XML 



U 



M3iTbJiHeHMe Ha SQL 3anBKa 
> 

Pe3yriTaT ot SQL 3aaBKa 



DataSet 
Ye6 ycnyra 



3anBKM 3a HaHacnHe 
Ha npoMeHMTe 



DB 



Ea3a ot flaHHM 



TMnM4HMflT CUeHapMM BK/lKDUBa C/ieflHMTe CTbllKM: 

1. K^MeHTCKOTO npM^o>KeHMe M3BMKBa MeTOfl ot ye6 yc/iyraTa. 

2. B ye6 yc/iyraTa ce M3n"b/iHHBaT nopeflMua ot ziorMnecKM onepauMM m 
eBeHTya/iHO SQL3asiBKa kbm 6a3aTa ot flaHHM. 

3. Pe3y/iTaTbT ot SQL 3aaBKaTa ce Bptiua Ha ye6 yc/iyraTa, KtfleTO tom ce 

OCpOpMfl B"bB BMfl Ha DataSet 06eKT M/1M 06eKT 3a npeHOC Ha flaHHM. 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 559 

4. To3M o6eKT ce cepna^M3npa b XML v\ b TaKaBa <£opMa ce Bptiua Ha 
K^neHTa. 

5. K/ineHTCKOTO npn^OKeHne M3B"bpujBa npoM^Ha Ha flaHHMTe v\ othobo nofl 
c|DopMaTa Ha XML vv\ Bptiua o6paTHO Ha ye6 ycnyraTa 3a 3annc. 

6. YcnyraTa, ot cboa CTpaHa, M3n"b/iHflBa Apyra 3aaBKa kbm 6a3aTa ot 
AaHHM, c koato 3anncBa npoMeHeHMTe ashhu. 

Ye6 ycnyrwTe h pa6oTa c AaHHM b .NET - npiiMep 

3a Aa AeMOHCTpupaMe pa6oTaTa c ashhm b ye6 ycnyrwTe, me cb3AaAeM 
npocTa ye6 ycnyra, cbAtpwama caMO ABa ye6 MeTOAa. Eamhmat me cny>KM 3a 
M3B^M4aHe Ha AaHHMTe ot 6a3aTa, a Apyrna 3a TAXHaTa npoMHHa. Cnep, TOBa 
me cb3AaAeM v\ K/iweHT 3a ye6 ycnyraTa, komto neTe AaHHMTe, npaBM npoMeHM 
no tax m Bptiua npoMeHMTe o6paTHO b ye6 ycnyraTa 

Ye6 ycnyra 3a pa6oTa c AaHHM b .NET 

ripn M3rpa>KAaHeTO ye6 ycnyraTa me ki3no/i3BaMe eAMH sqiDataAdapter 3a 
AOCTbn m npoMAHa Ha p,auuv\je ot Ta6/ii/iu.aTa "categories" Ha 6a3aTa ashhh 
"Northwind" b MS SQL Server. 

Hpe3 Drag and Drop Ha Ta6/ikiu.aTa "categories" cb3AaBaMe SqiDataAdapter 

M TO MMeHyBaMe sqlDataAdapterCategories. Visual Studio .NET aBTOMa- 

tm4ho reHepupa 3a Hac bcmukm KOMaHAH, komto ca Hy>KHM 3a AOCTbn ao 
ctOTBeTHaTa Ta6/ii/iu.a b 6a3aTa ashhu. Ot koht6kcthoto weu\o Ha 

sqlDataAdapterCategories Cb3AaBaMe DataSet K/iac DataSetCategories. 

Bene CMe totobm c DataSet o6eKTa v\ aAanTepa 3a Ta6/ii/m.aTa categories. 

Ct3AaBaMe V\ ABa ye6 MeTOAa GetCategories ( ) M UpdateCategories(...) , 

KaTO BTopuflT MeTOA npweMa KaTO napaMeTbp DataSet, cbAtpwam npoMeHMTe, 
HaHeceHM ot K/iweHTa: 



[WebMethod (Description="Gets all category entries as DataSet.") 
public DataSet GetCategories ( ) 

{ 

DataSetCategories dsCategories = new DataSetCategories ( ) ; 

sqlDataAdapterCategories .Fill (dsCategories ) ; 

return dsCategories; 
} 

[WebMethod (Description="Updates the category entries by given 

change list . " ) ] 

public void UpdateCategories (DataSet aDatasetCategoriesChanges ) 

{ 

sqlDataAdapterCategories . Update (aDatasetCategoriesChanges ) ; 

} 



TaKa ye6 ycnyraTa Bene e roTOBa v\ MOxeM Aa fl crapTkipaMe npe3 HaTMCKaHe 
Ha [F5] M Aa M3BMKaMe MeTOAa GetCategories () . KaTO pe3y/lTaT tom Bptiua 



560 nporpaMnpaHe 3a .NET Framework (tom 2) 

cepkia/iki3kipaH Dataset o6eKT, cbfl"bp>Kam Ta6/ikiuaTa categories, KaTO 
3aeflHO c Hero MflBa v\ onucBaiua ro XSD cxeMa. 

K/iMeHT 3a pa6oTa c ashi-im b .NET 

HeKa cera cb3p,ap,eM K/iweHTCKO Windows Forms npn^OKeHne, KoeTO p,a 
M3BMKBa MeTOAMTe Ha ye6 ycnyraTa. 3a ue/ua cb3AaBaMe hob Windows Forms 
npoeKT, ki>m komto flo6aBAMe ye6 pecpepeHuna kbm cb3flafleHaTa ye6 ycnyra 
( http://localhost/NorthwindService/NorthwindService.asmx ). ripenMeHyBaMe 
reHepupaHaTa cpopMa Ha MainForm. KaTO nacmo no/ie Ha cpopMaTa npn6a- 
BflMe MHCTaHunfl Ha ye6 ycnyraTa: 



private MyServices . NorthwindService mNorthwindService 
new MyServices . NorthwindService ( ) ; 



BtB cpopMaTa flo6aBAMe 6yTOHa 3a 3ape>KflaHe Ha flaHHi/ue, 6yTOH 3a 
3anncBaHe Ha AaHHi/ue v\ DataGrid KOHTpo/ia. KptiuaBaMe vv\ cbOTBeTHO 

buttonLoad, buttonSave M dataGridCategories. K"bM Cb6klTkieTO Click Ha 

ABaTa 6yTOHa npm<anBaMe CbOTBeTHO MeTOAHTe buttonLoad_ciick v\ 

buttonSave_Click, KOMTO M3BMKBaT CbOTBeTHO LoadData ( ) M SaveData ( ) . 
ripn C"b6klTMeTO Load Ha MainForm M3BMKBaMe CbLUO LoadData () . MeTOAMTe 
LoadData() M SaveData ( ) l/l3n"b/lHHBaT C/ieAHkm KOA: 



private void LoadData ( ) 

{ 

try 

{ 

// Load the categories table from the Web service 
mDsCategories = mNorthwindService . GetCategories () ; 

// Bind the data to the DataGrid control 
dataGridCategories . DataSource = mDsCategories; 
dataGridCategories . DataMember = "Categories"; 

} 

catch (Exception) 

{ 

MessageBox . Show ( 

"Can not retrive the categories from the server.", 
"Error") ; 



} 



} 



private void SaveData ( ) 

{ 

try 

{ 

DataSet dsCategoriesChanges = mDsCategories . GetChanges 

if (dsCategoriesChanges != null) 

{ 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 561 



// Commit the changes to the Web service 
mNorthwindService . UpdateCategories (dsCategoriesChanges ) ; 

MessageBox . Show ( "Categories updated succesfully . " , 
"Info") ; 
} 
} 
catch (Exception) 

{ 

MessageBox . Show ( 

"Can not update the categories.", "Error"); 



} 



// Refresh the categories table 
LoadData ( ) ; 



} 



MeTOA"bT LoadData () M3BMKBa MeTOAa Ha ye6 ycnyraTa GetCategories ( ) , 
KOMTO Bptiua DataSet 06eKT C Ta6/ll/luaTa "Categories". Pe3y/lTaTbT ce npn- 
CBOflBa Ha DataSource CBOMCTBOTO Ha dataGridCategories M Ha CBOMCTBOTO 

DataMember ce npucBOABa CMMBO^eH HM3 c MMeTO Ha Ta6^nuaTa - 

"Categories". TaKa ce M3BtpilJBa CB"bp3BaHe Ha Ta6/ll/luaTa C DataGrid KOH- 

Tpo/iaTa (data binding). Ue/ii/mT to3m koa e 3arpaAeH b try-catch 6/iok, b 
komto ce npuxBaiuaT eBeHTya/iHO B"b3Hi/iKHa/iMTe ki3KnioneHMfl. 

MeTOA"bT SaveDataO ntpBO B3eMa DataSet, KOMTO CbA"bp>Ka npOMeHeHMTe 
AaHHM M C T03M DataSet M3BMKBa MeTOAa UpdateCategories (...) Ha ye6 

ycnyraTa v\ HaKpaa BMKa othobo LoadDataO. Ha ycnyraTa ce npeAaBaT caMO 
HanpaBeHMTe npoMeHM (aKO MMa). Cnep, TOBa ce w3B/ikma ua/iaTa Ta6/iwi4a 
HaHOBO, 3a p,a ce pa6oTM c aKTya/iHM ashhh. ToBa 3ape>KAa npoMeHMTe, komto 
Apyrn noTpe6kiTe/iki Me>KAyBpeMeHHO ca HaHec/iw b 6a3aTa ashhu. 



â– s 


Horthwind Categores 




Q@Q 








CategorylD 


CategoryNam 


| Description 


Picture 


â–º 


1 


Beverages 


Soft drinks, c 


Byte[] Array 




2 


Condiments 


Sweet and sa 


Byte[] Array 




3 


Confections 


Desserts, can 


Byte[] Array 




4 


Dairy Product 


Cheeses 


Byte[] Array 




5 


Grains/Cereal 


Breads, crack 


Byte[] Array 




6 


nnaleee 


Prepared me 


Byte[] Array 




7 


Produce 


Dried fruit an 


Byte[] Array 




8 


Seafood 


Seaweed and 


Byte[] Array 


* 












Load 


Save 


1 









562 nporpaMnpaHe 3a .NET Framework (tom 2) 

noAAp'bWKa Ha cecMM 

no OTHOiueHMe noflflp"b>KKa Ha cecnn ye6 ycnyrwTe ca a6co/iK)THO aHa/iorwuHM 
Ha ye6 npw/io>KeHi/mTa. CecnnTe npn ye6 ycnyrwTe cbiuo npeflcraB/iflBaT 
MHCTaHUMM Ha K/iaca Httpsessionstate KaKTO m b ye6 npw/io>KeHkiflTa. Ctiun 
ca m o6eKTMTe 3a flocrbn ,qo cecnn - session 3a flocrbn ,qo TeKymaTa cecua v\ 
Application 3a AOCTbn flo KOHTeKCT Ha ua/iOTO npn^OKeHne. 

Touho KaKTO b ye6 npw/io>KeHkiflTa v\ ye6 ycnyrwTe MoraT fla 6"bAaT HacTpow- 
BaHM ot ye6 KOHCpurypaunoHHUfl cpaw/i. HacTpoMKMTe BK/iionBaT p,anw fla ce 
M3no^3BaT Cookies, Kbfle fla ce fltpxn ceci/mTa - b naMeTTa, b SQL Server, 
v\nv\ Ha flpyro Macro, cnefl ko/iko BpeMe fla i/i3Tene cecuMHOTO Cookie v\ t. h. 

Ako MCKaMe fla He M3no/i3BaMe cookie, 3aflaBaMe true b aTpn6yTa cookieiess 
Ha Tara sessionstate. Tpa6Ba fla ce MMa npeflBMfl, ne npn i/i3no/i3BaHeTO Ha 
cookieiess ceci/ia ce no/iynaBaT M3BecTHM npo6/ieMki b K/iweHTCKkiTe npw/io- 
>KeHMfl. Ma/iKO no-KbCHO me ce cnpeM Ha tax, KoraTO onucBaMe KOHcyMaunaTa 
Ha ye6 yc/iyri/i, M3no/i3Baiun cecnn. 

3a fla ce pa3peujn Ha flafleH ye6 MeTOfl fla M3no/i3Ba cecwflTa, e Heo6xoflMMO 
eflMHCTBeHO fla ce 3aflafle Ha no/ieTO Enabiesession Ha aTpn6yTa webMethod 
ctomhoct true, no no,qpa36kipaHe bcmuki/i ye6 MeTOflu He noflfltpwaT cecna. 

CecMM b ye6 yc/iyrw - npMMep 

3a fla fleMOHCTpupaMe KaK ce M3no/i3BaT cecnn b ye6 yc/iyri/iTe, me ct3flafleM 
npuMepHa ye6 yc/iyra, koato fla M3no/i3Ba o6eKTMTe session v\ Application. 
Tfl Lfle ce CbCTOkl OT flBa ye6 MeTOfla - GetSessionCounterO M 
GetApplicationCounter ( ) : 



[WebMethod (EnableSession=true, Description="Returns the next 
value of the local session counter.")] 
public int GetSessionCounter ( ) 

{ 

int counter = 0; 

if (Session [ "counter" ] != null) 

{ 

counter = (int) Session [ "counter" ] ; 

} 

counter++; 

Session [ "counter" ] = counter; 
return counter; 
} 

[WebMethod (Description="Returns the next value of the global 

application counter.")] 

public int GetApplicationCounter ( ) 

{ 

Application . Lock ( ) ; 
try 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 563 



{ 

int counter = 0; 

if (Application [ "counter" ] != null) 

{ 

counter = (int) Application [ "counter" ] ; 

} 

counter++; 

Application [ "counter" ] = counter; 

return counter; 

} 
finally 

{ 

Application . UnLock ( ) ; 

} 



} 



MeTOfl"bT GetSessionCounter ( ) MHMUMa^M3Mpa eflklH 6p05\<A npn ITbpBO M3BMK- 

BaHe, a aKO tom Bene ce cbAtpwa b ziOKa/iHaTa cecua, HeroBaTa ctomhoct ce 
B3eMa ot TaM. Cnep, TOBa croi/iHOCTTa Ha 6poana ce yBe/iwuaBa c eAMHuua, 
othobo ce nocraBfl b cecnaTa v\ ce Bptiua KaTO pe3y/iTaT ot M3BMKBaHeTO Ha 
MeTOfla. Ue/iTa e fla ce AeMOHcrpwpa, ne b cecnaTa MO>Ke fla ce fl"bp>KM 

MHCJDOpMaUMfl, KOflTO Ce 3ana3Ba Me>KAy OTAe/lHHTe M3BMKBaHklfl. 

T"bM KaTO Application o6eKTbT e o6m 3a bcmukm MHCTaHunn Ha ye6 yc/iyraTa, 
4mmto MeTOAM ce M3n"b^HABaT noHAKora eAHOBpeMeHHO, e Heo6xoAHMO 

AOCTblTbT AO Hero Ra e CMHXpOHkl3kipaH. MeTOA"bT GetApplicationCounter ( ) 

ntpBO M3B"bpujBa touho TOBa - 3a6paH$iBa AOCTtna ao o6eKTa ot Apyrn 
MHCTaHUMM Ha yc/iyraTa v\ cnep, TOBa npaBM a6co/iK>THO cbiuoTO KaKTO v\ 

GetSessionCounter () , KaTO HaKpafl OTHOBO pa3peiuaBa AOCTbna K"bM 
Application o6eKTa. 

CecMM b ye6 yc/iyrw - k/imchtcko npmiOKeHwe 

B 3aBMCMMOCT ot sv\p,a Ha cecuflTa Ha ye6 yc/iyraTa ce pa3peiuaBa v\ M3no/i3- 
BaHeTO Ha cecnn b K/iweHTCKO npw/io>KeHi/ie. Ako ceci/mTa Ha yc/iyraTa 
M3no^3Ba Cookies, eAHHCTBeHOTO, KoeTO Tpa6Ba p,a ce HanpaBM npn K/ii/ieHTa, 
e Aa ce Ao6aBM system. Net. cookiecontainer KtM ye6 yc/iyraTa: 



mSessionService = new SessionService 
mSessionService . CookieContainer = 
new System. Net . CookieContainer ( ) ; 



HeKa cb3AaAeM npocro Windows Forms npi/i/io>KeHi/ie, hi/iato c|DopMa ce cbcroii 

caMO OT ABe TeKCTOBM nO/ieTa - textBoxNextSessionCounter M 
textBoxNextAppCounter M ABa 6yTOHa - buttonNextSessionCounter M 
buttonNextAppCounter. Ilpi/I Cb6MTMeTO Click Ha 6yTOHMTe ce M3n"b/lHflBaT 
CbOTBeTHO MeTOAMTe: 



private void buttonNextSessionCounter_Click (ob j ect sender, 



564 flporpaMnpaHe 3a .NET Framework (tom 2) 



System. EventArgs e) 

{ 

int nextValue = mSessionService . GetSessionCounter () ; 

textBoxNextSessionCounter . Text = nextValue . ToString () ; 
} 

private void buttonNextAppCounter_Click (ob j ect sender, 
System. EventArgs e) 

{ 

int nextValue = mSessionService . GetApplicationCounter i 
textBoxNextAppCounter . Text = nextValue . ToString () ; 

} 



06pa6oT4MUMTe 3a HaTMCKaHe Ha 6vtoh M3BMKBaT cb3flafleHMTe b ye6 ycny- 
raTa MeTOAH h nocraBAT pe3y/iTaTa b cbOTBeTHMTe TeKCTOBM no/ieTa. 

IHe TecTBaMe npi/i/io>KeHkieTO, KaTO crapTkipaMe flBe HeroBM MHCTaHunn npe3 
HaTMCKaHe Ha [ctri+F5] ot VS.NET ABa ntTM nocneAOBaTe/iHO. KaTO HaTuc- 
KaMe nocneAOBaTe/iHO 6yTOHa 3a Next session counter Ha flBaTa npo3ope- 
ua, BM>KflaMe, ne CTOMHOCTMTe HapacTBaT nocneflOBaTe/iHO v\ b ABaTa npo30- 

peua. 06ane, aKO HanpaBklM CbLUOTO C 6yTOHa Next Application Counter, 

CTOMHOCTMTe He HapacTBaT nocneAOBaTe/iHO. BcflKa ctomhoct BtpHaTa ot 
GetApplicationCounter ( ) e c eAMHuua no-ro/iflMa ot npeAHWHaTa, He3aBM- 
cmmo kom M3BMKBa MeTOAa. npwuwHaTa e b TOBa, ne T03M MeTOA no/i3Ba 
Application o6eKTa, komto e o6iu 3a BCM4KM MHCTaHunn Ha ye6 ycnyraTa: 





Session Service Client S 












Next application counter 1 5 










Next session counter |3 






Session Service Client 














Next application counter 


V 












Next session counter |3 











Cookieless cecim ki>m ye6 yc/iyra 

ripn ye6 ycnyra etc cecnn 6e3 Cookies CMTyaunaTa CTaBa no-cno>KHa. ToBa, 
3a KoeTO no npuHunn ce i/i3no/i3BaT Cookies, e b tax p,a ce cbxpaHABa yHMKa- 
nen MAeHTucpMKaTop Ha cecuflTa. ripn ye6 npn^OKeHMATa, aKO cecnaTa He 
M3no/i3Ba Cookies, to3m MAeHTucpMKaTop ce npeHaca npe3 URL aApeca Ha 
npw/io>KeHkieTO. ripn M3BMKBaHeTO Ha ye6 ycnyraTa ot K/iweHTCKO npw/io>KeHkie 
ce M3n"b/iH*iBa npocTa HTTP 3aaBKa, b pe3y/iTaT Ha KoeTO ye6 ycnyraTa cbBceM 
HopMa/iHO npneMa, ne npw/io>KeHi/ieTO b cbiuHOCT e Browser v\ b OTroBop 
Bp-biua CTaHAapTeH HTTP ottobop "302 Found", a He "200 OK", iokto o^aKBa 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 565 
K/ikieHTCKOTO npn^OKeHne. B pe3y/iTaT Ha TOBa ce xBtp/ia webException 

M3K^K)4eHMe. 

KaK fla peujMM to3m npo6/ieM? EflHa ot B"b3MO>KHOCTMTe e fla npuxBaiuaMe 
M3K^K)4eHneTO m ro o6pa6oTBaMe no noflxoflaiu Hanm-i: 



private Uri mWebServiceUrl; 

// Some Code 

private void buttonNextSessionCounter_Click (ob j ect sender, 
System. EventArgs e) 

{ 

if (mWebServiceUrl == null) 

{ 

mWebServiceUrl = new Uri (mSessionService . Url ) ; 

} 
else 

{ 

mSessionService . Url = mWebServiceUrl . AbsoluteUri; 

} 

int nextValue = 0; 

try 

{ 

nextValue = mSessionService . GetSessionCounter () ; 
textBoxNextSessionCounter . Text = nextValue . ToString () ; 

} 

catch (WebException webException) 

{ 

HttpWebResponse httpResponse = 

webException . Response as HttpWebResponse; 
if ( httpResponse != null ) 

{ 

if (httpResponse . StatusCode == HttpStatusCode . Found) 

{ 

mWebServiceUrl = new Uri (mWebServiceUrl, 
httpResponse . Headers [ "Location" ] ) ; 
buttonNextSessionCounter_Click ( sender, e) ; 

} 
else 

{ 

throw webException; 

} 
} 
else 

{ 

throw webException; 

} 
} 



566 nporpaMnpaHe 3a .NET Framework (tom 2) 

3a fla peujMM npo6/ieMa ki3no/i3BaMe eflHa BtHWHa npoMeH/wBa 
mwebserviceuri, b KOATO fl"bp>KMM npoMeHeHMfl aApec Ha ye6 yc/iyraTa. B 
Hana/icrro Ha MeTOAa ce npoBep^Ba p,anv\ Ta3M npoMeH/iMBa e null v\ aKO e, ta 
ce cb3AaBa c TeKyiuna aApec Ha ye6 yc/iyraTa. Ako He e, to ye6 yc/iyraTa He 
M3no^3Ba aApeca cm no noApa36npaHe, a Apyr, 3aBnceiu ot MAeHTucpuKaTopa 
Ha cecuflTa Ha yc/iyraTa. ToraBa, aApecvr Ha ye6 yc/iyraTa, ce 3aMeH*i c 
aApeca ot npoMeH/ikiBaTa mwebserviceuri. XBtp/ieHOTO M3K^K)4eHne MMa 
cbomctbo Response, KoeTO A"bp>KM HTTP OTroBopa, BtpHaT ot ye6 ctpBtpa. 
Ako b AeMCTBMTe/iHOcr ce OKa>Ke, ne OTroBopvr e "302 Found", t. e. HeroBMAT 
statuscode e HttpstatusCode . Found, ToraBa ot Hero ce B3eMa HOBMAT aApec 

l/l Ce M3BMKBa OTHOBO CpyHKUMflTa. 

Pa36kipa ce, TOBa peweHkie He e craHflapTHO m Tpn6Ba fla ce M36nrBa! To 

e nopoAeHO ot cb3AaAeHi/m npo6/ieM. ripuHunnHO p^ako ce M3no/i3BaT cecnn 
b ye6 ycnyrwTe, komto p,a ca cookieless. 

Pt>HHa pea/iM3auMn Ha cecwM npe3 napaMeTpn 

CtiuecTByBa bbsmokhoct m pbuho p,a ce pea/ii/i3i/ipa ynpaB^eHneTO Ha 
cecuflTa. ToBa MO>Ke p,a crane, ioto ce AecpnHupa Aont/iHMTe/ieH ye6 MeTOA 
createsessiono b ye6 ycnyraTa, komto Aa Bptiua yHMKa/ieH MAeHTucpuKaTop 
Ha HOBa cecufl. Cnep, TOBa to3m MAeHTncpMKaTop MO>Ke Aa ce M3MCKBa Aa 6"bAe 
noAaBaH KaTO napaMeTtp npn M3BHKBaHeTO Ha bchhkh ocraHa/ii/i MeTOAH h tom 
Aa ce n3no/i3Ba KaTO k/ik>h b Application o6eKTa 3a cbxpaHeHkie Ha AaHHnTe 
ot cecuflTa Ha pa3/ikmHi/iTe noTpe6i/iTe/iw. Tpa6Ba, o6ane Aa ce noMkic/iw v\ 3a 
cnrypHOCTTa - aKTMBHMTe cecnn Tpa6Ba aBTOMaTi/mHO Aa ce M3TpnBaT npn 
npoA"b^>KMTe^Ha zinnca Ha 3kthbhoct (npuMepHO 5 MMHyTn), Tpa6Ba Aa 6tAaT 
AOCTaT"b4HO cnynaMHO reHepnpaHM, 3a Aa 6"bAe TpyqHO OTKpuBaHeTO mm n t.h. 
To3m noAxoA me AeMOHCTpupaMe b npaKTu^ecKMfl npoeKT b nocneAHaTa TeMa 
ot KHuraTa (b>k. ' TlpaKTi/mecKki npoeKT "). 

CnrypHOCT Ha ye6 yc/iyriue 

Ye6 yc/iyrwTe ce ki3no/i3BaT b mhoto pa3/ii/mHi/i CMTyau.nn. Ot CbBceM npocTM 
AByc/iOMHM npM/io>KeHMfl, cbCTOfliuM ce ot eAHO K^neHTCKO npn^oxeHne, KoeTO 
Aa ocurypaBa noTpe6kiTe/iCKkifl MHTepcpewc v\ ye6 yc/iyra, koato pea/iki3wpa 
ua/iaTa 6n3Hec ziorwKa v\ AOCTbna ao 6a3aTa, ao CbBceM c/io>KHki apxnTeKTypn, 
M3rpaAeHM M3u.fl.no Ha 6a3aTa Ha ye6 yc/iyri/i, B3anMOAeMCTBaiun eAHa c Apyra. 

KaKTO BCAKa eAHa yc/iyra, Bue MO>KeTe Aa npeA/io>KMTe BaiunTe ye6 ycnyrw Ha 
Baujn K^neHTM npe3 MHTepHeT. flocTbnvr b TaKbB c/iynaw Moxe Aa 6tAe 
no3BO/ieH caMO cpeiuy 3an/iamaHe. B TaKMBa CMTyau.nn cnrypHOCTTa e i/i3k/ik>- 
nwTe/iHO Ba>KHa. ripo6/ieM"bT KaK Aa orpaHi/mi/iM AOCTbna ao hhkoi/i ye6 MeTOAH 
caMO 3a OTopn3npaHM noTpe6nTe^n MMa hako/iko peiueHMfl. HeKa vv\ pa3r/ie- 
AaMe m o6achmm TexHMTe cm/ihm m cna6w CTpaHM. 

CiirypHOCT npe3 SSL/HTTPS 

Eamh ot npocTMTe Ha^MHn Aa 3aiunTMM HaAe>KAHO ua/iaTa KOMyHMKauna, 
M3B"bpujBaHa Me>KAy ye6 yc^yra v\ K^neHTCKO npn^o>KeHMe, e Aa M3no/i3BaMe 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 567 

KpunTupaH Kanan (SSL tunnel) 3a npeHacaHUTe flaHHM. TaKa OTroBopHOora 
3a aBTeHTMKaunflTa v\ 3a KpunTupaHeTO Ha Tpac|DMKa He e Ha ye6 ycnyraTa, a 
Ha ye6 CbpBtpa, Btpxy komto ta e ny6/iMKyBaHa. 

To3M noflxofl e zieceH 3a 1/iMn/ieMeHTau.nfl v\ ocurypaBa mhoto bmcoko hmbo Ha 
curypHOCT. Bb3mo>kho e fla ce M3no/i3Ba aBTeHTHKauna c umfcpoB cepTmfcwKaT, 
iokto ot CTpaHa Ha cbpBtpa npefl CBOMTe K/iweHTM, TaKa v\ ot CTpaHa Ha 
K^neHTMTe npefl cbpBtpa. Eamh ot npo6/ieMHTe e, ne unc|DpoBMTe cepTnc|DM- 
KaTM CTpyBaT CKbno, a aKO ce ki3no/i3BaT caMoptuHO noflnncaHM (self-signed) 
cepTMCJDMKaTM, cwrypHOCTTa Mowe fla 6"bfle KOMnpoMeTupaHa. 

CwrypHocT npe3 npeAasaHe Ha Aom>/iHHTejiHM napaMeTpM 

To3M noflxofl e CB"bp3aH c no,qaBaHe Ha flont/iHHTe/iHi/i napaMeTpn kbm ye6 
MeTOfla. ToBa Mowe fla ca noTpe6nTe/iCKO MMe v\ napo/ia, yHMKa/ieH 3a noTpe- 

6klTe/lfl MfleHTMC|DMKaTOp M flp. ripM M3BMKBaHe Ha BCeKM ye6 MeTOfl, tom me 

Tpa6Ba fla npoBep^Ba p,anv\ noflafleHMTe My napaMeTpn ca KopeKTHM. To3m 
noflxofl MO>Ke fla ce npw/iara, KoraTO ye6 MeTOflMTe, M3MCKBaiun OTopn3npaH 
flocTbn, He ca mhoto Ha 6pow, ho Kpue M3BecTHM pucKOBe. TbM KaTO cbo6me- 
HMATa, komto ce npeflaBaT ca b XML v\ H^Ma KpunTupaHe, ToraBa CTaBa mhoto 
ziecHO hakom fla nponeTe Te3M flont/iHMTe/iHM flaHHM, komto ce noflaBaT kbm 
ye6 MeTOfla. 

Bt3MO>KHO e noconeHMAT MeTOfl fla ce MOflmfcHUMpa, TaKa ne napo/iaTa fla He 
nvryBa b hi/ict bma, a aBTeHTHKaunaTa fla ce M3B"bpujBa no curypeH Ha^MH no 
cxeMaTa "Challenge/Response" (b>k. http://en.wikipedia.org/wiki/Challenqe- 
response authentication ). 

B"b3M0>KH0 e cbiuo aBTeHTMKaunflTa fla ce M3BtpujBa eflHOKpaTHO, npn KoeTO 
K/iweHTbT fla no/iynaBa cneu.i/ia/ieH MfleHTwfci/iKaTop (ticket), c komto fla ce 
aBTeHTMKupa cnefl TOBa npefl ye6 MeTOflMTe (fla ro noflaBa KaTO flont/iHM- 
Te/ieH napaMeTbp Ha BceKM ye6 MeTOfl). To3m MfleHTmfckiKaTop MO>Ke fla c/iyww 
eflHOBpeMeHHO v\ 3a noflflptxKa Ha K/iweHTCKa cecna. 

CwrypHocT npe3 ceoix 

CurypHOCTTa npe3 cecnn e eflMH 3Hani/iTe/iH0 no-yflo6eH 3a npw/iaraHe MeTOfl, 
otko/ikoto npe3 flont/iHMTe/iHM napaMeTpw. ripn Hero aBTeHTHKaunaTa Ha 
noTpe6wTe/ifl He CTaBa npn bchko M3BMKBaHe Ha BceKM ye6 MeTOfl, a caMO npn 
M3BMKBaHe Ha KOHKpeTeH ye6 MeTOfl (HanpuMep Login o), OTroBapam touho 
3a TOBa. Tom npoBep^Ba p,anv\ noTpe6i/iTe/iCKOTO MMe v\ napo/iaTa ca Ba/iwflHM 
m aKO e TaKa, OT6e/i*i3Ba TOBa b ASP.NET cecnaTa (Httpsessionstate 
o6eKTa) no HAKaKbB HanwH, HanpuMep KaTO nocTaBM b Hea noTpe6i/iTe/iCKOTO 
MMe nofl HAKaKbB k/ik>h. KoraTO ce M3BMKa hakom ye6 MeTOfl ot noTpe6kiTe/ifl, 
to3m ye6 MeTOfl npoBep^Ba p,anv\ b ceci/mTa e OT6e/iH3aHa aBTeHTHKaun^Ta Ha 
noTpe6i/iTe/ifl v\ aKO e TaKa npoflt/iwaBa M3n"b/iHeHMeT0 cm. 

3a pa3/ii/iKa ot ntpBua MeTOfl, to3m He M3MCKBa BceKM ntT fla ce noflaBaT 
flon"b/iHMTe/iHM napaMeTpn 3a aBTeHTHKauna, KoeTO flocTa y^ecHABa K^neHT- 
ckoto npi/i/io>KeHkie. 



568 nporpaMnpaHe 3a .NET Framework (tom 2) 

Ot MeflHa T04Ka Ha ci/irypHOcrra, o6ane, He e kom 3Hae ko/iko no-curypHO. 
OaKTtT, ne He npn bcako M3BMKBaHe Ha MeTOfl ce noflaBa KOHCpkiAeHuwa/iHa 
MHCpopMaui/m, flo HflKtAe 3aTpyaHHBa Aocrbna ro Hen Ha xaKepn, ho He 
peiuaBa npo6/ieMa. ripn M3BMKBaHe Ha ochobhma MeTOA 3a aBTeHTHKauna Bee 
naK ce npeAaBaT b nwcTTeKcr noTpe6wTe/iCKOTO MMe v\ napo/ia. 

ripn aBTOMaTM^HO ynpaB/ieHkie Ha cecnaTa e mhoto no-TpyAHO p,a ce pea/iw- 
3npa Challenge/Response cxeMaTa 3a aBTeHTHKauna, koato 3aiunTaBa napo- 
ziaTa Ha K/iweHTa ot "noAC/iyujBaHe no irbTfl". 

CwrypHOCT npe3 cecMii - npuMepHa ycnyra 

3a Aa AeMOHCTpupaMe to3m noAxoA, me HanpaBMM cbBceM npocra ye6 ycnyra, 
cnywema cm c ASP.NET ceckiyua 3a ocurypaBaHe Ha Aocrbn c aBTeHTHKauna 
AO hakom ot ye6 MeTOAMTe: 



const string USER_NAME_SESSION_KEY = "UserName"; 

[WebMethod (EnableSession=true, Description = 

"Checks given credentials and establishes a session.")] 
public void Login (string aUserName, string aPassword) 

{ 

if ( IsLoginValid (aUserName, aPassword)) 

{ 

Session [USER_NAME_SESSION_KEY] = aUserName; 

} 
else 

{ 

throw new AuthenticationException ( "Ivalid credentials! ") ; 

} 



WebMethod (EnableSession=true, Description 
"Terminates the active session (if any) . 
public void Logout ( ) 

Session .Abandon ( ) ; 



WebMethod (EnableSession=true, Description = 

"Returns some protected data. Requires active session.") 
public string GetProtectedData ( ) 

CheckSecurity ( ) ; 

return "This data is protected!"; 



WebMethod (Description="Returns some data. Does not require a 
session . " ) ] 
public string GetNotProtectedData ( ) 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 569 



return "This data is not protected."; 
} 

private void CheckSecurity ( ) 

{ 

string currentUser = (string) Session [USER_NAME_SESSION_KEY] ; 
if (currentUser == null) 

{ 

throw new AuthenticationException ( 

"Access denied! Please login first!"); 
} 
} 

private bool IsLoginValid ( string aUserName, string aPassword) 

{ 

// Just for the demo check if the user and password are equal 

return (aUserName == aPassword); 
} 

public class AuthenticationException : ApplicationException 

{ 

public AuthenticationException ( string aMessage) : 
base (aMessage) {} 
} 



B Hana/iOTO AeK/iapwpaMe ep,na KOHcraHTa ot Tun string, kohto me no/i3BaMe 
ioto k/ikdh, noA komto me 3anncBaMe b cecnaTa MMeTO Ha TeKyiuna aBTeHTM- 
KnpaH noTpe6nTe/i. Ochobhmat MeTOA 3a aBTeHTHKauna e Login(...). Tom 
M3BMKBa MeTOAa IsLoginValid (...) c noAaAeHMTe My noTpe6i/iTe/iCKO MMe v\ 
napo/ia. B 3aBMCMMOCT KaKBO BtpHe isLoginVaiid(...) v\nv\ ce nocraByi b 

ceCMflTa nOTpe6klTe/lCKOTO MMe V\I\V\ ce XB"bp/lfl AuthenticationException. 

MeTOAtT IsLoginValid (...) e M3K^K)4MTe^HO onpocTeH. Tom caMO npoBepsiBa 
Aa/iw noTpe6nTe^CKOTO MMe cbBnaAa c napo/iaTa. B pea/iHa ci/iTyaui/m npoBep- 
KaTa MO>Ke p,a ce M3B"bpujn b 6a3a ashhh v\i\v\ no Apyr HanwH. 

B ropHMfl npuMep MMa ABa MeTOAa, komto AeMOHcrpi/ipaT Aocrbna ao 
3aiunTeHM MeTOAM m ao He3aiunTeHM MeTOAM. B Hana/iOTO Ha MeTOAa 
GetProtectedData ( ) ce npoBepyiBa p,anv\ noTpe6kiTe/i*iT MMa npaBO Ha 
Aocrbn. MeTOAtT checksecurityo b AeMCTBMTe/iHOCT npoBepaBa p,anv\ 
o6eKTa b ceci/iflTa c k/ikdh "userName" e null. Ako e TaKa, ce xBtp/ia 

AuthenticationException. 3a Rd ce MMn/ieMeHTkipa (fcyHKUklOHa/lHOCTTa Ha 

M3^M3aHe ot cucTeMaTa, b npuMepa MMa MeTOA Logout o, komto npeMaxBa 
aKTMBHaTa ASP.NET cecmi. 

CwrypHOCT npe3 cecMii - npHMepeH K/meHT 3a ycnyraTa 

HeKa cera p,a nocrpowM eAHO cbBceM e/ieMeHTapHO Windows Forms K/iweHTCKO 
npw/io>KeHkie, AeMOHCTpupaiuo pa6oTaTa Ha npeACTaBeHaTa no-rope ye6 ycny- 
ra. noTpe6nTe^CKMflT My MHTepc|DeMC me npeAcraB/iABa ABe TeKCTOBM no/ieTa, 



570 nporpaMnpaHe 3a .NET Framework (tom 2) 

b komto me ce B"bBe>KAaT noTpe6kiTe/iCKO MMe v\ napo/ia, v\ neTkipw 6yTOHa - no 
eAMH 3a BceKM ye6 MeTOfl Ha ycnyraTa. ripn crapTkipaHe Ha npw/io>KeHi/ieTO, 
npn 3ape>KAaHe Ha r/iaBHaTa My cpopMa, ce MHCTaHuupa npoMeH/iMBa 3a ye6 
ycnyraTa m m ce npucBOABa KOHTeMHep 3a cookies: 



private void MainForm_Load (ob j ect sender, System. EventArgs e) 

{ 

// Instantiate the Web Service proxy class 
mSecuredService = new Services . SecuredService () ; 

// Add cookies container to the service proxy 
mSecuredService . CookieContainer = 
new System. Net . CookieContainer ( ) ; 
} 



ripn HaTMCKaHe Ha 6yTOHa [Login] ce B3eMaT CTOMHOCTMTe Ha TeKCTOBi/ue 
no/ieTa, M3BMKBa ce ye6 MeTOAtT Login (...) v\ aKO M3n"b/iHeHi/ieTO My Mi/me 
ycnewHO, ce M3Be>KAa c"bo6iueHne 3a ycnex. B npoTMBeH cnynaw ce M3Be>KAa 
c"bo6iueHne 3a rpeujKa: 



private void buttonLogin_Click ( 

object sender, System. EventArgs e) 

{ 

string user = textBoxUserName . Text; 
string pass = textBoxPassword. Text; 
try 

{ 

mSecuredService . Login (user, pass) ; 

MessageBox . Show ( "Login successfull . " , "Info"); 

} 

catch (SoapException se) 

{ 

MessageBox . Show ( se .Message, "Error") ; 

} 
} 



ripn HaTMCKaHe Ha 6yTOHa [Get Protected Data] npeAH Aa ce e aBTeHTM- 
Kwpa/i ycneujHO K/iweHTbT, v\3i\v\3a cbo6meHi/ie 3a rpeujKa. Ako K/iweHTbT, 
o6ane ce e aBTeHTMKkipa/i npeAH TOBa, ye6 MeTOAtT ce M3n"b/iHHBa ycnewHO v\ 
BtpHaTMAT ot Hero pe3y/uaT ce Bi/i3ya/ii/i3i/ipa: 



private void buttonGetProtectedData_Click ( 
object sender, System. EventArgs e) 

{ 

try 

{ 

string data = mSecuredService . GetProtectedData i 

MessageBox. Show(data, "Info") ; 
} 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 571 



catch (SoapException se) 

{ 

MessageBox . Show ( se .Message, "Error") ; 



} 



ripn HaTMCKaHe Ha 6yTOHa [Get Not Protected Data] ce M3BMKBa CbOTBeT- 

hm5it ye6 MeTOfl v\ ce M3Be>Kfla cbo6meHwe c pe3y/iTaTa: 



private void buttonGetNotProtectedData_Click ( 
object sender, System. EventArgs e) 

{ 

string data = mSecuredService . GetNotProtectedData () ; 
MessageBox. Show(data, "Info") ; 



ByTOHtT [Logout] M3BMKBa ye6 MeTOA, komto npeKpaTABa aKTMBHaTa cecua: 



private void buttonLogout_Click ( 

object sender, System. EventArgs e) 

{ 

mSecuredService . Logout ( ) ; 

MessageBox . Show ( "Logout successful!.", "Info"); 



Eto KaK M3Me>Kfla K/iweHTCKOTO npn^OKeHne b flewcTBue: 



iTest Secured Web Service 






User name: (test 




Login 


Logout 






Password: Y"â„¢" 










Get Not Protected Data 




Get Protected Data 













CwrypHocT npe3 cpeACTBaTa Ha Web Service Enhancements 
(WSE) 

To3M noflxofl hm npefl/iara Haw-flo6po o6e3nenaBaHe Ha ckirypHOcrra npn 
M3rpa>KAaHe v\ M3no/i3BaHe Ha ye6 yc/iyrw. WSE e ro/iflMa 6n6/iMOTeKa ot 
K/iacoBe, OTroBopHM 3a npneMaHeTO v\ npeflaBaHeTO Ha SOAP naKeTM Me>Kfly 
npn^o>KeHMflTa v\ ye6 yc/iyrwTe. WSE BCbiuHOCT npeflcraB/isiBa pa3UJnpeHne Ha 
.NET Framework v\ MO>Ke 6e3rmaTHO fla ce v\3jernv\ ot cawTa Ha MaMKpocodpT. 
Cnep, MHCTa^aunfl ce MHTerpupa bbb VS.NET. OnaKBa ce b 6"bfleiun Bepcun fla 
6-bfle flo6aBeH KaTO craHflapTHa 4acT ot .NET Framework v\ VS.NET. 

no OTHOiueHMe Ha ckirypHOora WSE npefl/iara MHO>KecTBO ot HanwHM 3a 
3aiunTa Ha npeAaBaHaTa MHdpopMaunfl. Hpe3 WSE mhoto ziecHO MO>xe fla ce 



572 



flporpaMnpaHe 3a .NET Framework (tom 2) 



pea/iM3kipa KpunTupaHe Ha Tpacpmo, uncppoBO noflnncBaHe, aBTeHTHKauna c 
napo/ia v\ npe3 uncppoBM cepTucpuKaTM 6e3 fla ce Ha/iara fla ce nuiue koa 3a 

TOBa. 

ll3K/iK>HeHii$iTa b ye6 yoiyriiTe 

06pa6oTKaTa Ha ki3K/iK>neHi/iflTa b ye6 ycnyrwTe He e TpwBkia/iHa. KaKTO Bene 
pa3r/ieAaxMe, SOAP craHAapTbT AecpMHupa HanwH 3a yi<a3BaHe Ha Bt3HMKHa- 
ziaTa npn i/i3iTb/iHeHi/ie Ha ycnyraTa rpeujKa, ioto MHCpopMaunaTa 3a Hea ce 
nocraBsi b e/ieMeHTa fault Ha SOAP ta/ioto. 



>KM3HeHHnT UMKbSI Ha eAHO SOAP cbo6uieHiie 

3a Aa cm M3ACHMM KaK T04HO ASP.NET o6pa6oTBa M3K/iioneHi/iflTa, HeKa p,a ce 
cnpeM Ma/iKO no-noApo6HO Ha >Kki3HeHMfl urncb/i Ha SOAP Cbo6meHMflTa: 

Ph*ss 2 
Deserialize 




Web 
Seiver 



Phase 4 
Deserialize 



Phase 3 
Serialize 



Ha cpurypaTa MO>xe Aa npoc/ieAHM >Ki/i3HeHkm ui/iK"b/i Ha eAHO SOAP Cbo6me- 
Hue. Oa3MTe, npe3 komto Mi/maBa to, ca cnep,HMTe: 

- Oa3a 1 - npoKCM K/iacbT, pa3no/io>KeH npn K/ineHTa, cepna/iM3npa 
HanpaBeHaTa 3a*iBKaTa bbb Ba/ii/iAHO SOAP c"bo6iueHne v\ ro M3npaiua 
KtM ctpBtpa. 

- Oa3a 2 - ASP.NET Aecepna^M3npa no/iyneHOTO Cbo6meHkie v\ i/i3n"b/iH*iBa 
cbOTBeTHMfl MeTOA ot ye6 ycnyraTa. 

- Oa3a 3 - no/iyneHkiAT pe3y/iTaT ot M3n"b/iHeHi/ieTO Ha ycnyraTa ce cepna- 
/in3wpa b SOAP c"bo6iueHne v\ ce M3npaiua kbm K/iweHTa. 

- Oa3a 4 - othobo npoKCM K/iacvr no/iynaBa cbo6meHi/ieTO, Aecepna/iM3n- 
pa ro m noAaBa no/iyneHi/m pe3y/iTaT Ha i/i3BkiKBami/m MeTOA ot K/iweHT- 
ckoto npn^OKeHne. 



HnaBa 22. OTfla/ieneHM M3BMKBaHMfl c .NET Remoting 573 

Bcmhkm H3K/iK>HeHHn ce 3aMecTBaT c SoapException 

KoraTO Ha CbpBtpa B"b3HMKHe i/i3K/iK>neHkie, ASP.NET aBTOMaTMUHO ro npuxBa- 
ma m ro o6pa6oTBa BvrpeujHO. To3m npou.ec BK/iK>nBa KOHcrpywpaHe Ha Ba- 
/imaho SOAP cbo6meHkie n cepna^M3npaHe Ha MHCJDopMauMfl 3a B"b3Hi/iKHa/iaTa 
rpeujKa bbb fault e/ieMeHTa Ha SOAP naKeTa. 

KoraTO c"bo6iueHneTO CTurHe ao K/ii/ieHTa, npoKCM K/iacbT aBTOMaTMUHO napcBa 
HeroBOTO Tfl/io m cnpflMO MHCJDopMauMflTa BtB fault e/ieMeHTa KOHcrpywpa 

SoapException. 

Bcm4ko H3Me>Kfla Mflea^HO Ha nptB nor^ea, ho iokto m b pea/iHi/ifl >kmbot, 

BCtlUHOCT He e TaKa. ripn KOHCTpynpaHeTO Ha SoapException eAMHCTBeHOTO, 

KoeTO ce 3ana3Ba ot B"b3HMKHa/iOTO i/i3K/iK>neHi/ie Ha ctpBtpa, e cbomctboto My 
Message, KoeTO cbfl"bp>Ka eflMHCTBeHO m caMO TeKCTOBO onucaHne Ha rpew- 
KaTa. BcflKaKBa flpyra MHCJDopMauMfl 3a i/i3K/iK>neHkieTO e 6e3B"b3BpaTHO M3ry- 
6eHa - ry6n ce KaKTO opi/irwHa/iHi/mT Tun Ha M3KnK>neHi/ieTO, TaKa v\ B/io>KeHi/i- 

Te M3K/lK>neHklfl (CBOMCTBOTO InnerException MMa CTOMHOCT null). 
HanpMMep, aKO flafleH ye6 MeTOA XBtp/lM DivideByZeroException, K/lMeHTbT 

BMecTO p,a no/iyni/i w3K/iK>neHi/ie ot ctiunfl Tun, no/iynaBa SoapException. 
ToBa cepno3HO B"b3npenaTCTBa ki3no/i3BaHeTO Ha nt/iHaTa molu Ha i/i3K/iK)ne- 
HkiflTa KaTO cbBpeMeHHO cpeflCTBO 3a o6pa6oTKa Ha rpeujKM v\ npo6/ieMHM 
CMTyaunn. 

PeuieHMeTO Ha npo6sieMa c M3K/noHeHMflTa 

He cm Mwc/ieTe, ne me ocraBMM to3m npo6/ieM OTBopeH. HanpoTMB, me bm 
npefl^o>KMM flBe HeroBM peiueHMfl. 

ritpBOTO peiuaBa npo6/ieMa no Ma/iKO 3ao6kiKO/ieH HanwH (workaround), ioto 
npaBM yc/iyraTa v\ K/iweHTa 3aBMCMMM. 3a pa3/iMKa ot Hero, btopoto npefloc- 
TaBfl npo3paneH HanwH 3a 3ana3BaHe Ha B"b3HMKHa/iOTO i/i3K/iK>neHwe, ho 
caMOTO e no-cno>KHO v\ M3MCKBa flo6po no3HaBaHe Ha ye6 yc^yrnTe v\ TexHO- 
j\ovv\v\Te, CBtp3aHM c TAX. 

PeuieHue 1 - npe3 koa 3a rpeuiKa 

IHe M3no/i3BaMe cnep,Hv\n noflxoA: HaiuaTa ue/i e p,a BtpHeM MHCJDopMaunfl kbm 
K/iweHTa, aKO Ha ctpBtpa B"b3HMKHe npo6/ieM. 3a ue/iTa flecJDMHupaMe M36opeH 

TMn (enum), KOMTO C"bA"bp>Ka BCM4KM B"b3MO>KHM rpewKki, KOMTO MoraT fla 

B"b3HMKHaT npw M3n"b/iHeHi/ieTO Ha AafleH ye6 MeTOA. 

Cnep, TOBa b ye6 MeTOAa, KbAeTO onaKBaMe p,a Bt3HMKHe M3K/iK)neHkieTO, ro 
npuxBaiuaMe v\ BptiuaMe cbOTBeTHna My koa Ha rpeujKa - MHCTaHuna Ha 
M36poeHMfl Tun, komto CMe AecJDMHupa^n. 

KoraTO c"bo6iueHneTO npucTurHe npn K/iweHTa, tom MO>Ke p,a npoBepn KOAa Ha 
rpeujKaTa v\ p,a M3B"bpujn H^KaKBO AewcTBue cnp^MO Hero. HsiMa p,a ce cnn- 
paMe noApo6HO Ha TOBa peiueHne, 3aiuoTO HeroBaTa pea/iM3au.i/m MO>Ke p,a ce 
pa3r/ieAa noApo6HO b npaKTkmecKWfl npoeKT (b>k. TeMaTa " npaKTM^ecKn 
npoeKT "). 



574 nporpaMnpaHe 3a .NET Framework (tom 2) 

me crr6e/ie>KkiM caMO hakom ot HeflocTarbunTe Ha to3m noflxofl. Ochobhmat ot 
tax e, KaKTO Bene cnoMeHaxMe, ne K/iweHTbT v\ ycnyraTa CTaBaT tacho 3aBM- 
cmmm, 3aiuoTO K^neHTtT e A-fi"b>KeH p,a npoBepaBa BceKM irbT B"b3HMKHa/ii/m koa 
3a rpeujKa. flpyr HeAOCTarbK e 3ary6aTa Ha BCflKaKBM B^oxeHM M3K/iioneHMfl. 
Mhoto cepno3eH npo6/ieM e /ii/incaTa Ha b"B3mo>khoct 3a AecpMHupaHe koa Ha 
rpeujKa 3a M3K/iK)neHMfl ot o6lu Tun, KaTO HanpuMep: ArithmeticException, 

ArgumentException, IndexOutOfRangeException M AP- Ty6n ce M B"b3MO>K- 

HOCTTa rpeujKMTe p,a ce o6pa6oTBaT Ha mhoto HMBa. Ha npaKTMKa to3m iioaxoa 
hm Bptiua b enoxaTa Ha npoueAypHOTO nporpaMnpaHe, npn KoeTO cpyHKUMMTe 
BptiuaT koa Ha rpeujKa. 

PeuieHMe 2 - npe3 SOAP pa3i±inpeHne 

Btopoto peiueHne npeoAO/iflBa npo6/ieMMTe Ha ntpBOTO, KaTO ce B"b3no/i3Ba 
ot pa3Lui/ip*ieMaTa CTpyKTypa Ha SOAP craHAapTa v\ npeAOcraBeHMTe hm 3a 
ue/iTa K/iacoBe ot .NET Framework. 

HaKpaTKO MAe^Ta, kohto me pea/iki3kipaMe e c/ieAHaTa: c noMOurra Ha 
pa3LunpeHMe Tun soapExtension me npuxBaHeM no/iyneHMTe b ye6 yc/iyraTa 
M3K^K)4eHMfl m me vv\ cepna/iM3npaMe b M3xoAaiuoTO SOAP c"bo6iueHne. 

ripi/i K/ineHTa me AecpMHupaMe soapinputFiiter (BxoAfliUMTe v\ M3X0AaiunTe 
cpw/iTpw ca eAHa ot cpyHKuwoHa/iHOCTkiTe npeAOcraBeHM hm ot WSE), komto me 
Aecepna^M3npa ki3K/iioneHkieTO v\ me ro xBtp/iyi ziOKa/iHO b K/iweHTCKOTO npn- 
/io>KeHMe. HeKa aHa/in3wpaMe npo6/ieMMTe, CBtp3aHM c pea/iki3aui/i*iTa Ha Ta3M 
v\p,es\, m npeA/io>KMM KOHKpeTHa MMn/ieMeHTaukifl. 

Cbpe-bptia nacT 

KaKTO Bene cnoMeHaxMe, Ha cbpBtpa me M3no/i3BaMe soapExtension, 6/iaro- 
AapeHne Ha komto me cepna/ii/i3npaMe i/i3K/iK)neHkieTO. K/iacvr soapExtension 
hm npeA-nara cpyHKui/iOHa/iHOcrra p,a pa3UJnpnM SOAP cbo6meHMeTO, KaTO ce 
HaMecuM b pa3/ikmHkiTe craAHki ot HeroBaTa o6pa6oTKa Ha cbpBtpa. 

ETannTe, komto MO>KeM p,a npuxBaHeM, ca cnep,Hv\je: BeforeDeseriaiize, 

Af terDeserialize, Bef oreSerialize M Af terSerialize, KaTO MMeTO Ha 

BceKM yKa3Ba Kora touho ce i/i3iTb/iHflBa (npunoMHeTe cm KapTMHKaTa c >KM3He- 
HMfi ukiKb/i Ha SOAP cto6meHkieTO). Eto npuMepeH koa, komto AecpMHupa 
HaiueTO pa3LunpeHMe seriaiizedExceptionExtension m ocurypflBa cepwa/iM- 

3MpaHe Ha B"b3HMKHa/10TO M3K^K)4eHMe: 



public class SeriaiizedExceptionExtension : SoapExtension 

{ 

Stream mOldStream; 
Stream mNewStream; 

public override Stream ChainStream (Stream aStream) 

{ 

mOldStream = aStream; 
mNewStream = new MemoryStream ( ) ; 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 575 



return mNewStream; 
} 

public override void ProcessMessage (SoapMessage aMessage) 

{ 

if (aMessage . Stage == SoapMessageStage . Af terSerialize) 

{ 

mNewStream. Position = 0; 

if (aMessage . Exception != null) 

{ 

if (aMessage . Exception . InnerException != null) 

{ 

InsertDetaillntoOldStream ( 

aMessage . Exception . InnerException) ; 
} 
} 
else 

{ 

CopyStream (mNewStream, mOldStream) ; 

} 
} 
else if (aMessage . Stage == 

SoapMessageStage . Bef oreDeserialize) 

{ 

CopyStream (mOldStream, mNewStream) ; 
mNewStream. Position = 0; 
} 
} 

private void InsertDetaillntoOldStream (Exception aException) 

{ 

XmlDocument doc = new XmlDocument ( ) ; 

doc . Load (mNewStream) ; 

XmlNode detailNode = doc . SelectSingleNode ( "//detail" ) ; 

try 

{ 

detailNode . InnerXml = 

GetSerializedExceptionXmlElement (aException) ; 

} 

catch (Exception exception) 

{ 

// Unable to serialize the exception 

detailNode . InnerXml = exception .Message; 
} 

XmlWriter writer = 

new XmlTextWriter (mOldStream, Encoding . UTF8 ) ; 
doc . WriteTo (writer) ; 



576 flporpaMnpaHe 3a .NET Framework (tom 2) 



writer . Flush ( ) ; 
} 

private string GetSerializedExceptionXmlElement ( 
Exception aException) 

{ 

StringWriter stringWriter = new StringWriter ( ) ; 
XmlWriter xmlWriter = new XmlTextWriter ( stringWriter ) ; 

xmlWriter . Writes tartElement ( "Serialized" ) ; 

xmlWriter .WriteString (SerializeException (aException) ) ; 

xmlWriter . WriteEndElement ( ) ; 

return stringWriter . ToString () ; 
} 

private string SerializeException (Exception aException) 

{ 

MemoryStream stream = new MemoryStream () ; 

IFormatter formatter = new SoapFormatter ( ) ; 

formatter . Serialize ( stream, aException) ; 

stream. Position = 0; 

return Encoding . UTF8 . GetString ( stream. GetBuf f er ( ) ) ; 
} 

private void CopyStream (Stream aFrom, Stream aTo) 

{ 

TextReader reader = new StreamReader (aFrom) ; 

TextWriter writer = new StreamWriter (aTo) ; 

writer . WriteLine ( reader . ReadToEnd ( ) ) ; 

writer . Flush ( ) ; 
} 

// SoapExtension methods implementation 

public override object Getlnitializer (LogicalMethodlnf o 
aMethodlnfo, SoapExtensionAttribute aAttribute) 

{ 

return null; 

} 

public override object Getlnitializer (Type aServiceType) 

{ 

return null; 

} 

public override void Initialize (obj ect alnitializer ) 

{ 

} 



} 



HnaBa 22. OTfla/ieneHM M3BMKBaHMfl c .NET Remoting 577 

3a fla flecJDMHupaMe K/iac, komto MO>Ke fla ce M3no/i3Ba KaTO pa3UJnpeHne 
(extension) Ha SOAP, Tpa6Ba fla HacneflMM a6crpaKTHM$i K/iac soapExtension, 
komto ce HaMupa b npocTpaHCTBOTO ot MMeHa (namespace) system. web. 

Services. Protocols. Hac/ieflflBaMKM SoapExtension Tpfl6Ba fla npunOKpneM 
(override) a6CTpaKTHMTe My MeTOflM: Initialize (...) , Getlnitializer (...) M 
ProcessMessage(...) . ntpBMflT OT TAX (TOM MMa flBe fleK/iapaUMM C pa3/lMHHM 

napaMeTpn) ce M3no/i3Ba 3a m-mui/ia/iki3kipaHe Ha flaHHM, komto me ce 
M3no/i3BaT BtTpeiuHO b SOAP pa3LUkipeHkieTO. B Haujua c/iynai/i HHMa fla ro 
M3nO/13BaMe. BTOpMflT MeTOfl ProcessMessage(...) e HaM-CbLfleCTBeHMflT. B 

Hero ce M3B"bpujBa o6pa6oTKaTa Ha c"bo6iueHneTO. 

ripeflu fla npeMMHeM kbm no-fleTaw/iHOTO My pa3r/ie>KflaHe, HeKa fla o6"bpHeM 
BHMMaHne Ha MeTOfla chainstream(...) . Tom e fleK^apupaH KaTO BMpTya/ieH b 
soapExtension n e eflMHCTBeHMAT Hani/iH, npe3 komto MOxeM fla no/iynwM 
noTOK KtM TeKyiflOTO SOAP c"bo6iueHne. TbM KaTO MCKaMe fla MOflnc|DMUMpaMe 
to3m noTOK, Tpa6Ba fla 3ana3MM pecJDepeHUMa kbm Hero (moidstream) v\ fla 
HanpaBMM hob noTOK (mNewstream), b komto me 3anniueM HaiueTO moamc|dmum- 
paHO c"bo6iueHne. 

fla npeMMHeM KtM k/ikdhobma MeTOfl ProcessMessage(...) . B Hero Tpa6Ba fla 
HanpaBMM flBe Heiua: ntpBO, aKO eTanvr ot o6pa6oTKaTa, b komto ce HaMMpa 
C"b06lfleHMeTO, e BeforeDeserialize (TOKy LflO nO/iyneHO M Olfle He flecepMa- 

^M3MpaHO), KOnMpaMe BXOflflLflMfl nOTOK (mOldStream) B KOHCTpyMpaHMfl HOB 
nOTOK (mNewstream) npe3 nOMOlflHMfl MeTOfl CopyStream(...) . 

Ako eTantT ot o6pa6oTKaTa e Afterseriaiize (M3xoflfliflOTO cbo6iueHMe e 
cepMa^M3MpaHO m e totobo 3a M3npaiuaHe kbm K/iMeHTa), npoBep^BaMe 3a 

B"b3HMKHa/10 M3K/lK>HeHMe. AKO HflMa TaKOBa, npOCTO KOnMpaMe HOBMfl nOTOK 

o6paTHO b CTapMfl. Ako ntK e B"b3HMKHa/io v\3Ki\\o^euv\e, HaMMpaMe detail 
e/ieMeHTa b SOAP rpewKaTa (fault), koato ce e reHepMpa/ia, m b Hero 
cepMa/iM3MpaMe M3K/iioneHMeTO (npMnoMHeTe cm, ne detail e/ieMeHTa MO>Ke 
fla c"bfl"bp>Ka XML). Othobo, Bene npoMeHeHOTO cbo6iueHMe 3anMCBaMe b 

CTapMfl nOTOK. 

06"bpHeTe BHMMaHMe, ne M3no/i3BaMe 6MHapHa cepMa/iM3auM*i m K/iaca 

SoapFormatter, a He XmlSerializer. BMHapHaTa cepMa/lM3ai4Mfl n03BO/lflBa 

fla ce cepMa/iM3MpaT He caMO ny6/iMHHMTe no/ieTa Ha M3K/iK>neHMeTO, a ua/ioto 
My cbcroflHMe (BK^K)4MTe^HO m nacmMTe BtTpeujHM no/ieTa). SOAP c|DopMa- 
TeptT no3BO/iHBa pe3y/iTaTbT ot cepMa/iM3auM*iTa fla e bbb bma Ha XML. 

K/iaCbT System. Runtime . Serialization . Formatters . Soap . SoapFormatter e 
flecJDMHMpaH B aceM6/lMTO System. Runtime. Serialization. Formatters. 

soap.dii m npeflM fla ce M3no/i3Ba Tpa6Ba fla flo6aBMM ptuHO kbm npoeKTa 
pec|DepeHUMfl kbm TOBa aceM6/iM. 



& 



MMaMTe npeflBMfl, ne npw cepna/iM3ai4nnTa Ha M3K/iK)HeHMeTO, 
bcmhkm HeroBM CBoiiCTBa ce npeflaBaT b tckctob bma. Ako 
Ta3M MHCpopMaMMn e KOHCpnfleHi4na/iHa, tji/ioto Ha SOAP cb- 



578 flporpaMnpaHe 3a .NET Framework (tom 2) 



o6u4eHneTO Mowe aa ce KpMnTMpa. 



Cnep, KaTO HaiueTO SOAP pa3UJnpeHne e totobo, HeKa fla pa3r/ie,qaMe no 
KaKtB Ha^MH MO>Ke fla ro npi/i/io>Ki/iM b ye6 yc/iyraTa. BapnaHTMTe ca flBa: npe3 
aTpn6yTM fla yKa>KeM KbM kom ye6 MeTOflM fla ce npw/iara v\nv\ npe3 KOHCpury- 
paunoHHa HacrpoMKa fla ro npw/io>Ki/iM Btpxy bcmukm ye6 MeTOflM. IHe pa3r/ie- 
flaMe m flBaTa BapnaHTa. 

HacTpoMKa b Web.config cpaftsia 

3a fla flo6aBMM SOAP pa3UJnpeHneTO KtM bcmukm ye6 MeTOflM, Tpa6Ba fla 
flo6aBMM c/ieflHMTe peflOBe b KOHCpurypaunoHHUfl cpai/i/i Ha ASP.NET ye6 
yc/iyraTa (Web.config), B ceKUMflTa system, web: 



<webServices> 

<soapExtensionTypes> 

<add type="SerializedExceptionExtension, MyWebService" 
priority="l" group="0" /> 
</soapExtensionTypes> 
</webServices> 



ATpn6yT"bT type yKa3Ba, kom e K/iacbT, komto me ce M3no/i3Ba, v\ b Koe 
aceM6/iw ce HaMupa tom. flpyrnTe flBa aTpn6yTa priority v\ group yi<a3BaT 
npnopnTeTa v\ noc/ieflOBaTe/iHOcrra Ha i/i3n"b/iHeHwe Ha SOAP pa3LuwpeHi/mTa 
(aKO MMa noBene ot eflHo). 

HacTpoMKa npe3 aTpn6yT 

HeKa fla pa3r/ieflaMe v\ BTopua Hani/m 3a npw/iaraHe Ha SOAP pa3UJnpeHneTO, 
KoeTO flecpMHupaxMe. To3m BapnaHT e no-rbBKaB, 3aiuoTO hm flaBa Bt3MO>K- 
HOCTTa fla npw/io>KkiM pa3UJnpeHneTO caMO Btpxy KOHKpeTHM ye6 MeTOflu, a He 
Btpxy BCM4KM. /JecpMHwpaMe K/iac (noTpe6nTe^CKM aTpn6yT), HacneflHkiK Ha 

SoapExtensionAttribute, KOMTO fla npunOKpue HerOBMTe a6CTpaKTHM cbom- 
CTBa Property M ExtensionType. ETO HerOBMflT COpc KOfl: 



[AttributeUsage (AttributeTargets .Method) ] 
public class SerializedExceptionExtensionAttribute : 
SoapExtensionAttribute 

{ 

public override Type ExtensionType 

{ 

get 

{ 

return typeof (SerializedExceptionExtension) ; 

} 
} 

public override int Priority 
{ 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 579 







get { 


return 0; 


} 






set { 


} 






} 








} 











Ha no-K"bceH eTan, aKO npn^OKMM kbm AaAeH ye6 MeTOA to3m aTpn6yT, tom 
me bk/ik)4m 3a Hero SOAP pa3UJnpeHneTO. 

Eto HaKpaa m KOAa Ha ye6 MeTOAa Btpxy, kbm komto CMe npw/io>KM/iki 

aTpn6yTa [SerializedExceptionExtension]. B T03M MeTOA CbBCeM yMMUJ- 
ZieHO npeAM3BMKBaMe kl3K/lK>neHI/ie DivideByZeroException, 3a Aa milOCTpkl- 

paMe HeroBaTa cepna^M3aunfl v\ npeAaBaHe kbm K/iweHTa Ha ye6 ycnyraTa: 



[WebMethod] 

[SerializedExceptionExtension] 
public int ThrowException ( ) 

{ 

int zero = 0; 

return 100 / zero; 
} 



TecTBaHe Ha SOAP pa3i±inpeHneTO 

Ako cera c/iokmm TOUKa Ha npeKtCBaHe (breakpoint) b HaiueTO SOAP 
pa3LunpeHMe v\ M3BMKaMe ye6 MeTOAa Ha yc/iyraTa npe3 TecTOBaTa crpaHwua 
Ha yc/iyraTa ot Internet Explorer, SOAP Extension K/iacbT HAMa Aa ce H3n"b/i- 
hm. ripn^MHaTa 3a TOBa e b Hankma, no komto ce M3BMKBa yc/iyraTa. 




ripn M3BMKBaHe Ha ye6 yc/iyra npe3 HetiHaTa TecrBaujaTa ye6 
CTpaHMLta (kohto ce noKa3Ba npn crapTupaHe yc/iyraTa ot 
VS.NET) ye6 MeTOflMTe ce M3ni>/iHnBaT c flwpeKTHa HTTP GET 
3anBKa, a He npe3 SOAP 3anBKa. ToBa e npiimiHaTa SOAP 
pa3LunpeHMflTa aa He ce M3ni>/iHnBaT npn M3BMKBaHeTO Ha 
ye6 MeTOflM no to3m HannH. 



Ako MCKaMe Aa TecTBaHe ye6 yc/iyraTa 3aeAHO c npwKaneHOTO kbm Hen SOAP 
pa3LunpeHMe, Tpa6Ba Aa HanniueM K/iweHTCKO npw/io>KeHi/ie, KoeTO a KOHcy- 
Mnpa. 

K/meHTCxa nacT 

CneA KaTO Bene CMe cepkia/iki3kipa/iki B"b3HkiKHa/iOTO i/i3K/iK>neHkie bbb Ba/ikiAHO 
SOAP c"bo6iueHne, HeKa Aa pa3r/ieAaMe KaKBO hm Tpa6Ba npn K/iweHTa, 3a Aa 
HanpaBMM ue/ii/m npouec Hant/iHO npo3paneH. HaiuaTa ue/i e Aa npuxBaHeM 
c"bo6iueHneTO, npeAM to Aa e cmrHa/io npn K/iweHTa, Aa npoBepuM 3a 
B"b3HMKHa^a rpeujKa v\ aKO MMa TaKaBa, Aa n Aecepi/ia/iw3wpaMe m Aa a 

XB"bp/lMM KaTO /10Ka/lHO kl3K/lK>HeHI/ie. 

KaKTO Bene cnoMeHaxMe, me i/i3no/i3BaMe eAHa ot <£yHKUkiOHa/iHOCTi/iTe Ha 

WSE - BXOAflLUMTe CJDM^TpM. (llOBene nOAP06HOCTM othocho WSE MO>Ke Aa 



580 



flporpaMnpaHe 3a .NET Framework (tom 2) 



HaMepnTe Ha a,qpec: http://msdn.microsoft.com/webservices/ , Kb,qeTO MO>Ke 
fla ce CBa/iki v\ aKTya/iHaTa mm Bepcua). Ha cneflBamaTa KapTMHKa MO>KeM fla 
bmamm onpocTeHaTa apxnTeKTypa, Ha kohto ce 6a3npaT WSE, a MMeHHO 
npw/iaraHe Ha p,ap,euv\ cbw/iTpw Btpxy M3xoflfliunTe c"bo6iueHMfl v\ o6paTHOTO mm 
Ha/iaraHe Btpxy BxoflfliunTe. 



j Output filters fc * 



Input filters. 



SOAP 

message 

render 



Input filters fc r- 



web 
Service 



Output filters V 



Ako Bene MMaMe wHCTa/iwpaHa Bepcua Ha WSE, MOxeM fla npeMMHeM KbM 
c"b3flaBaHeT0 Ha Haujua cbw/iTbp. Ho npeflu fla npeMMHeM KbM KOfla, HeKa 
ntpBO fla pa3peujMM M3no/i3BaHeTO Ha WSE b Haujua npoeKT, komto b cnynafl 
e npocro koh30/iho npw/iOKeHwe. 3a ue/ua c flecHna 6yT0H Ha MMUJKaTa 
LUpaKaMe Btpxy npoeKTa v\ ot no^Bi/i/iOTO ce koht6kctho MeHio M36npaMe WSE 
Settings X ..., K-bfleTO X e TeKymo MHcra/ikipaHaTa Bepcua Ha WSE. Ot 
nosiBi/i/ikm ce flwa/ioroB npo3opeu, MapKupaMe Enable this project for Web 
Services Enchantments v\ HaTMCKaMe [ok] : 



General |i Security | Routing ] Customised HdS j Poky | rcfcenlsswng | Diagnostics | 



WQ 


â„¢ 


F.jid 
R*t-Jd 




• 


Run Iest(s) 


j 

1 




Test With... t 




Project Eerjeri (fences... 


i £ 




Project Buid Cider... 

Add • 
Add Reference... 


E 




Add We> RrfnericB, . , 
Sei as Startup Propct 


8 

1 


y 

a 


MXIH â–º 


Saved*!* 








X 


Remove 




C: 


Rename 




Properties 




WSE Settings 2.0„. K 


H 



J*Enabte this project for Web Services Enhancements 



r* Enab'e f-'aosoft Web Services Enhancement Soap Extensions 

This wJ add the WSE SOW Extension to this project, This is only applcabfe to 
ASP.NET projects. 



WSE aBTOMaTi/mHO flo6aBAT KOHcburypaunoHeH cbaw/i 3a npki.no>KeHkieTO (aKO 
HflMa TaKtB), pa3no/iaraT CBOMTe HacTpoMKM b Hero v\ flo6aBAT pecbepeHuna 
kbm taxhoto aceM6/iki b npoeKTa. 

fla npeMMHeM kbm KOfla Ha Bxoflfliunfl cbmiTtp, komto me flecepna^M3npa 

B"b3HI/IKHa/10TO M3K^K)4eHMe, aKO i/ma TaKOBa: 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 581 



public class DeserializeExceptionlnputFilter : SoapInputFilter 

{ 

public override void ProcessMessage (SoapEnvelope aEnvelope) 

{ 

if (aEnvelope . Fault != null) 

{ 

Xml Document doc = new Xml Document ( ) ; 
doc . LoadXml ( aEnvelope . InnerXml ) ; 

XmlNode detailNode = doc . SelectSingleNode ( "//detail" ) ; 
if (detailNode != null) 

{ 

string serialized = 

GetNodeText (detailNode, "Serialized" ) ; 
if (serialized != string . Empty) 

{ 

Exception exception = 

DeserializeException (serialized) ; 
if (exception != null) 

{ 

throw exception; 

} 
} 
} 
} 
} 

private string GetNodeText (XmlNode aParent, string aNodeName) 

{ 

XmlNode node = aParent . SelectSingleNode (aNodeName) ; 
if (node != null) 

{ 

return node . InnerText; 

} 

return string . Empty; 

} 

private Exception DeserializeException ( 
string aSerializedException) 

{ 

byte [ ] buffer = 

Encoding . UTF8 . GetBytes (aSerializedException) ; 
MemoryStream stream = new MemoryStream (buff er) ; 

IFormatter formatter = new SoapFormatter ( ) ; 
return formatter . Deserialize ( stream) as Exception; 
} 
} 



3a p,a Moxe Raaen K/iac p,a ce i/i3no/i3Ba ioto bxoa^lu <fcki/iTbp, tom Tpa6Ba p,a 
HacneflflBa a6cTpaKTHMfl K/iac SoapInputFilter. Othobo k^kd^obmat MeTOfl e 



582 



flporpaMnpaHe 3a .NET Framework (tom 2) 



ProcessMessage(...) , ioto b Hero npoBepyiBaMe nanw MMa SOAP rpewKa. Ako 
MMa TaKaBa, HaMnpaMe "detail" e/ieMeHTa, B3MMaMe cbfltpaoHkieTO Ha Hero- 
bhji nofle^eMeHT "Serialized" (cnoMeHeTe cm, ne KaTO KopeHOB e/ieMeHT 
npn cepna^M3aunflTa Ha ctpBtpa, cb3fla,qoxMe e/ieMeHT MMeHHO c TOBa MMe). 
CbAtpwaHMeTO Ha eneMenja BCtiuHOCT e cepna/iM3npaHOTO M3K/iK>neHi/ie. 
flecepna^M3npaMe ro v\ ro xBtp/iflMe /ioio/iho b K/iweHTCKOTO npi/i/io>KeHkie. 

3a fla flo6aBMM TaKa cb3flafleHMfl cpw/iTbp kbm cpw/iTpkiTe Ha Haujua npoeKT 
othobo ot MeHKDTO Ha WSE i/i36wpaMe eTMKeTa Customized filters v\ ,qo6a- 
BflMe Haiukifl rJ>M/iTbp kbm BXOflflLflkiTe TaKMBa: 

[' 'f'n>j"i M'vcxi^Fx* epiionV ii-nl'.-iit]' i onfie, 
Goneui | Saaurty | Rautrtg Orftoirtied filter's | poicy | Tctenlssufig | Diatfwsucs | 
InptJt Flters 




Add,, 



Remove 



Customized FiMer Input 



OUtfit Htars 



UH_ 



Tjpe example 

kbant,[)BsenahEaE93oepbon[riputF)ber, Qsn/t 



OK 



El 



c«el 



fldd 



Edfc. 



Remove 



ToBa MO>Ke fla ce HanpaBM v\ ot KOHCpurypaunoHHUfl cpai/i/i Ha npi/i/io>KeHkieTO 
(TOBa e cpaw^tT App.config 3a VS.NET npoeKTu). HeKa fla pa3r/ieflaMe KaKBO 
ca flo6aBki/iki WSE b Hero: 



<?xml version="l 


0" 


encoding= 


= "utf 


-8"?> 




<conf iguration> 












<conf igSections> 










<section name="microsof t . 


web . 


services2 " 


type= 


"Microsoft 


Web 


. Services 2 . Configuration . 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 583 



WebS ervices Con f iguration, Microsoft .Web . Services 2 , 
Version=2 .0.0.0, Culture=neutral, 
PublicKeyToken=31bf3856ad364e35" /> 
</conf igSections> 
<microsof t . web . services2> 
<filters> 
<input> 

<add type="Client . DeserializeExceptionlnputFilter, 
Client" /> 
</input> 
</filters> 
<diagnostics /> 
</microsof t . web . services2> 
</conf iguration> 



BtnpeKM, ne b ropHi/m npuMep MMeTO Ha K/iaca, komto MMn/ieMeHTwpa 
(fcw/iTbpa m MMeTO Ha aceM6/ii/iTO, b KoeTO to3m K/iac e AecJDMHupaH, ca Ha 
pa3^M4HM peflOBe, TOBa e caMO 3aiuoTO He ce cb6npaT Ha eflMH pefl. B pea/iHa 
cuTyaunfl CTOMHOCTTa Ha aTpn6yTa type He Tpa6Ba p,a ce npeHaca Me>KAy 
peflOBeTe. 

OcTaHa p,a pa3r/ieAaMe nocneAHaTa nacr npn K/iweHTa - Ao6aB*iHe Ha 
pec|DepeHUMfl kbm ye6 ycnyraTa. flo6aBAHeTO He ce pa3/ii/maBa no hmluo ot 
o6kiKHOBeHOTO, eAMHCTBeHOTO no-pa3/ii/mHO e, ne moM WSE ca pa3peiueHM 3a 
npoeicra, Te aBTOMaTi/mHO reHepupaT hobm npoKCM K/iacoBe XxxWse, KtAeTO 
Xxx e MMeTO Ha npoKCM K/iaca cb3AaAeH ot Hac. Te3M K/iacoBe ca Hy>KHM 3a 
Aa MoraT npe3 tax p,a ce Ha/io>KaT Aec|DMHMpaHMTe c|Dki/iTpki. Eto m KOAa Ha 
K/iweHTa, komto M3no^3Ba npoKCM K/iaca cb3AaAeH ot WSE: 



class Client 

{ 

static void Main ( ) 

{ 

ExceptionServiceWse service = new ExceptionServiceWse ( ) 
try 

{ 

service . ThrowException ( ) ; 

} 

catch (DivideByZeroException) 

{ 

Console .WriteLine ( "Bravo!" ) ; 

} 
} 
} 



Ako CMe HanpaBki/iki bcmuko ycnewHO Tpa6Ba Aa bmamm At/iroonaKBaHkisi 
pe3y/iTaT: 



584 nporpaMnpaHe 3a .NET Framework (tom 2) 

"D:\Pi ojects\SoapExteption\t lientU>in\DebugVC lient. ... -|n| x| 



Brayo! 

Press any key to continue 



H 



Tom noKa3Ba, ne K/ineHTtT e npi/ixBaina/i DivideByZeroException, komto e 
noflafleH ot cbpBtpa. 

Ynpa>KHeHM5i 

1. KaKBM MOfle/ii/i 3a pa3npeAe/ieHi/i npi/i/io>KeHkifl no3HaBaTe? KaKBa e pa3/iw- 
KaTa Me>Kfly tax? 

2. KaKBO npeACTaB^ABaT ye6 ycnyri/iTe? KaKtB npo6/ieM peiuaBa Ta3M TexHO- 
/iori/i*i? 

3. KaKBO npeACTaB^ABa i/mcppacrpyKTypaTa Ha ye6 yc/iyrwTe? Ot KaKBO ce 

CbCTOM? 

4. KaKBO npeAcraB/iflBaT UDDI AnpeKTopnnTe v\ 3a KaKBO c/iywaT? 

5. KaKBO e DISCO v\ 3a KaKBO c/iy>Ki/i? 

6. KaKBO e WSDL v\ 3a KaKBO ce M3no/i3Ba? 

7. KaKBO e SOAP? Ot KaKBO ce cbcroii? 3a KaKBO ce M3no/i3Ba? 

8. OnuiueTe Tunn^HM cueHapnn 3a i/i3no/i3BaHe Ha ye6 ycnyrw npn .NET 
6a3npaHM npn^o>KeHMfl. 

9. 5e3 Aa M3no/i3BaTe VS.NET Cb3AawTe npocra ye6 ycnyra (.asmx cpaw/i), 
koato no 3aAaAeHa AaTa Bptiua p,eus\ ot ceAMnuaTa (Ha 6"b/irapcKM e3MK). 
MHCTa^npaMTe ye6 ycnyraTa Ha IIS. TecTBaMTe c Internet Explorer. 
Pa3r/ieAaMTe WSDL onucaHneTO. 

10. 5e3 Aa M3no/i3BaTe VS.NET c"b3AawTe K/iweHT (koh30/iho npn^OKeHne) 3a 
ye6 ycnyraTa ot npeAxoAHaTa 3aAana. 

11. C noMOurra Ha VS.NET Cb3AawTe ye6 ycnyra, koato npneMa 2 cmmbo/ihh 
HM3a m Bptiua ko/iko ntTM ntpBMflT ce cpeiua bbb btopma. flecpMHupaMTe 
yHMKa/ieH namespace 3a ye6 ycnyraTa. 3aAawTe noAxoA^iuo onucaHne Ha 
ye6 MeTOAa v\. 

12. C noMOurra Ha VS.NET Cb3AawTe K/iweHT 3a ye6 yc/iyraTa ot npeAXOAHaTa 
3aAa4a. 

13. B eAHO yuki/iwme yuaT yueHwuki, pa3npeAe/ieHM b pa3/innHw K/iacoBe. 
Bcm4km yueHkiuw ot AaAeH K/iac M3ynaBaT HflKaKBa CbBKynHOCT ot yne6Hki 
npeAMeTM v\ i/maT no hhko/iko oueHKM ot M3nMTBaHMflTa no BceKM npeAMeT. 
npoeKTupawTe pe/iauwoHHa cxeMa, koato p,a cbxpaHABa MHCpopMauna 3a 
y^eHMUMTe, K/iacoBeTe, yne6HMTe npeAMeTM v\ oueHKMTe. Pea/iki3kipawTe 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 585 

ye6 ycnyra, koato ki3n"b/iH*iBa c/ieflHMTe onepaunn (npe3 SQL KOMaHflM 
K"bM Bfl): 

- flo6aBflHe/M3TpnBaHe Ha K/iac 

- Ao6aBflHe/n3TpnBaHe/npoMflHa Ha yueHMK, n3B/iwnaHe Ha yHeHMUMTe 
(ot flafleH K/iac) 

- flo6aBflHe/M3TpnBaHe Ha yne6eH npeflMeT, ki3B/ikmaHe Ha yne6HMTe 
npeflMeTM (3a flafleH K/iac) 

- Ao6aBflHe/ki3TpkiBaHe/ki3B/ikmaHe Ha oueHKM (Ha flafleH yueHMK no 
flafleH npeflMeT) 

l/l3no/i3BaMTe CB-bp3aHki5i MO,qe/i otADO.NET. 

14.C"b3flaMTe Windows Forms K/iweHT 3a ye6 yc/iyraTa ot npeflxoflHaTa 
3afla4a. npi/i/io>KeHi/ieTO Tpa6Ba fla BM3ya/iM3i/ipa K/iacoBeTe v\ fla no3BO/ia- 
Ba HaBuraunfl cpefl tax. ripn M36op Ha flafleH K/iac Tpa6Ba fla ce noKa3BaT 
yueHi/iui/iTe, komto ro CbcraBflT v\ yne6HMTe npeflMeTM, komto Te3M yueHMUM 
M3ynaBaT. Tpa6Ba fla ce no3BO/iflBa peflaKTupaHe Ha yueHkiuwTe v\ yne6- 
HMTe npeflMeTM 3a TeKyiuna M36paH K/iac. ripn M36op Ha yueHkiK Tpa6Ba fla 
ce no3BO/i*iBa peflaKTupaHe Ha oueHKMTe My no BceKM ot yne6HMTe npefl- 
MeTM. ripn BCAKa peflaKunfl Tpa6Ba fla ce M3BMKBa ye6 MeTOfl ot yc/iyraTa 
npe3 komto M3MeHeHMATa fla ce HaHacsiT b 6a3aTa flaHHM. ripn npoMHHa Ha 
TeKyiflMfl M36paH K/iac, Tpa6Ba fla ce ki3B/ikmaT HaHOBO yueHkiui/iTe v\ 
npeflMeTMTe. ripn npoM^Ha Ha M36paHMfl yueHMK Tpa6Ba oueHKMTe My fla 
ce 3ape>KflaT HaHOBO ot ye6 yc/iyraTa. 

15.C"b3flawTe ye6 ycnyra, koato no 3aflafleH0 uh/io nwcno p (p e uint32) 
HaMupa m Bptiua 6poa npocTM nwc/ia b kiHTepBa/ia [l...p]. Yc/iyraTa 6m 
Tpsi6Ba/io fla pa6oTM 6aBH0 npn ro/ieMki ctomhoctm Ha p. Cb3flawTe 
Windows Forms npi/i/io>KeHkie, KoeTO cbfltpwa TeKCTOBO no/ie, 6yT0H v\ 
cnnctK. ripn BtBexflaHe Ha hmc/io b t6kctoboto no/ie v\ HaTMCKaHe Ha 
6yT0Ha Tpa6Ba fla ce M3BMKBa acuHxpoHHO ye6 yc/iyraTa 3a npecM^TaHe 
Ha npocTMTe nwc/ia Me>Kfly 1 « p. ripn 3aB"bpujBaHe Ha acuHxpoHHO m3bmk- 
BaHe pe3y/iTaTbT Tpa6Ba fla ce flo6aB*i b cnwcbKa bbb c|DopMaT "Primes in 

range [l...p] are XXX". He 3a6paBflMTe, ne aCMHXpOHHMTe M3BMKBaHMfl 

M3no^3BaT HMiuKM ot BrpafleHMfl Thread Pool Ha .NET Framework, komto 
He Tpa6Ba fla flocTbnBaT flupeKTHO noTpe6i/iTe/iCKkisi MHTepc|DeMC. 

16. ripoeKTupaMTe pe/iauwoHHa cxeMa ot Ta6/ikmw b MS SQL cbpBtp, koato 
onucBa noTpe6nTe^n v\ npaBaTa mm 3a flocTbn b flafleHa ci/icreMa. BceKM 
noTpe6nTe/i ce xapaKTepn3npa c MMe, login v\ napo/ia v\ Moxe fla MMa 
flocTtn flo noflMHO>KecTBO ot c|DyHKUMMTe Ha cucTeMaTa. BcflKa c|DyHKUMfl b 
cucTeMaTa cm MMa MMe v\ MO>Ke fla e flocrbnHa ot noflMHO>KecTBO Ha 
noTpe6nTe^MTe. Cb3p,av\je ye6 ycnyra, koato npe3 ki3no/i3BaHe Ha HecBtp- 
3aHMfl MOfle/i Ha flocrbn ao flaHHM b ADO.NET pea/iki3kipa ye6 MeTOflM 3a 

M3B^M4aHe Ha flaHHMTe (B"bB BMfl Ha DataSet) M 3a 06H0BflBaHe Ha 

npoMeHeHM flaHHM (cbfltpxaiun ce b DataSet). Pea^M3npaMTe Windows 
Forms npn^o>KeHMe, KoeTO no3BO/iaBa peflaKTupaHe Ha noTpe6nTe^MTe i/i 
TexHMTe npaBa M3no^3BaMKM ye6 yc/iyraTa. 



586 nporpaMnpaHe 3a .NET Framework (tom 2) 

17. Pea/iM3wpaMTe cwcreMaTa 3a ynpaB/ieHkie Ha noTpe6kiTe/in v\ TexHMTe 
npaBa ot npeflxoflHaTa 3aflana ioto flo6aBMTe aBTeHTHKauna b ye6 
ycnyraTa v\ 3aiunTMTe MeTOAMTe 3a Aocrbn flo flaHHi/ue npe3 ASP.NET 
ceckmTa. Ye6 ycnyraTa Tpa6Ba p,a no3BO/iflBa Aocrbn ro 3aiunTeHMTe 
MeTOflM caMO Ha noTpe6kiTe/ifl c MMe "admin". ritpBOHana/iHO Ch3p,av\je 
to3m noTpe6wTe/i AHpeicmo b 6a3aTa ashhh Ha ptKa. 

M3no/i3BaHa /liuepaTypa 

1. CBeT^MH HaKOB, Ye6 yc/iyrw c ASP.NET - http://www.nakov.com/dotnet/ 
lectures/Lecture-20-Web-Services-vl.O.ppt 

2. Ctoah 1/lopflaHOB, Ye6 yc/iyrw - http://www.nakov.com/dotnet/2003/ 
lectures/Web-Services .doc 

3. MSDN Training, Developing XML Web Services Using Microsoft® ASP.NET 
(MOC 2524B) 

4. Keith Ballinger, .NET Web Services: Architecture and Implementation, 
Addison Wesley, 2003, ISBN 0321113594 

5. Scott Short, Building XML Web Services for the Microsoft .NET Platform, 
Microsoft Press, 2002, ISBN 0735614067 

6. Damien Foggon, Daniel Maharry, Chris Ullman and Karli Watson , 
Programming Microsoft .NET XML Web Services, Microsoft Press, 2004, 
ISBN 0735619123 

7. Building the Next Generation of Service-based Software Systems, MSDN 
Library - http://msdn.microsoft.com 

8. The ASP Column - Using SOAP Extensions in ASP.NET, MSDN Library - 
http://msdn.microsoft.com 

9. Consuming a DataSet from an XML Web Service, MSDN Library - 
http://msdn.microsoft.com 

10. MSDN Library - http://msdn.microsoft.com 



r/iaea 22. OTfla/ieneHM 
M3BiiKBaHii5i c .NET Remoting 



ABTOp 

Bmktop Xmbkob 

Heo6xoflMMM 3HaHMn 

- 5a30BM no3HaHMfl 3a .NET Framework 

- Ba30BM no3HaHMfl 3a e3MKa C# 

- 5a30BM n03HaHMfl nO KOMniOTbpHM Mpe>KM m MHTepHeT TeXHO^OTHM 

- Ba30BM no3HaHMfl no pa3npefle/iei-iki apxnTeKTypn v\ cucTeMM 

- no3HaHMfl 3a cepna^M3aunflTa b .NET Framework 

CbAi>p>KaHMe 

- KaKBO e .NET Remoting? 

- Kora ce M3no/i3Ba Remoting? 

- Remoting MHCJDpacrpyKTypaTa 

- Remoting KaHa/iw v\ cJDopMaTepn. PerncTpauna Ha KaHa/i 

- AKTMBaUMfl Ha 06eKTM. AKTMBaUMfl OT CbpBtpa. AKTMBaUMfl OT K^neHTa 

- Mapuja/iM3aun5q (Marshaling). Marshal-by-Value o6eKTM. Marshal-by- 
Reference o6eKTM 

- Xmbot Ha o6eKTMTe (Lifetime). iLease 

- Remoting KOHCJDMrypauMOHHM <fcai/i/iOBe 

- ripaKTMKa: C"b3flaBaHe Ha Remoting cbpBtp v\ K/iweHT 

- ripo6/ieM"bT c o6iunTe TunoBe 

B Ta3M TeMa ... 

B HacToaiuaTa TeMa me pa3r/ieAaMe MHCJDpacTpyKTypaTa 3a OTfla/ieneHM m3bmk- 
BaHMfl, koato .NET Framework npeAOcraBa Ha pa3pa6oT4MUMTe. IHe o6achmm 
ocHOBMTe Ha Remoting TexHO/iori/iflTa v\ BceKM eAHH ot HeMHMTe KOMnoHeHTM. 
IHe 3ano4HeM c KaHa/iw v\ cJDopMaTepn v\ me npofl"b/i>KMM c OTAa/ieneHMTe 
o6eKTM m TAXHaTa aKTMBaunfl. IHe ce cnpeM Ha pa3/im<aTa Me>KAy pa3/ikinHMTe 
TunoBe OTAa/ieneHi/i o6eKTM, >KM3HeHHfl mm umcb/1 m BMAOBeTe MapLua/iw3aunfl. 
CrbnKa no crbnKa me AOCTurHeM ao cb3AaBaHeTO Ha npuMepeH Remoting 
ctpBtp m K/iweHT. IHe 3aB"bpujMM c o6flCHeHne Ha eAHH rbBKaB v\ npaKTkmeH 
HanwH 3a KOHclDnrypupaHe Ha u*i/iaTa Remoting MHCJDpacTpyKTypa. 



588 nporpaMnpaHe 3a .NET Framework (tom 2) 

Pa3npefle/ieHM npu/iowei-iiifi 

riopaAM c^o>KHMfl xapaKTep Ha AHeujHMTe npw/io>KeHkifl no-ro/iAMaTa nacr ot 
tax ca pa3npefle/iei-iki. Cbctoat ce ot hako/iko OTRennw KOMnoHeHTa, komto 
necro ntTM ca OTAa/ieneHki ep,v\n ot flpyr, ho 3a ue/iTa Ha npn^OKeHneTO 
Tpa6Ba p,a B3anMOAekicTBaT noMe>KAy cm. CbmecTByBaT hhko/iko yTBtpAeHi/i ot 
npaKTMKaTa MOAe/iw 3a pa3npeAe/ieHM npM/io>KeHMfl: 

- K/ikieHT/cbpB"bp - ABeTe CTpaHM KOMyHMKupaT noMe>KAy cm npe3 3aaBKM. 
K/iweHTbT M3npaiua 3aaBKa kbm cbpBtpa, cbpBtpa a o6pa6oTBa v\ Bptiua 
pe3y/iTaTa o6paTHO. 

- Pa3npeAe^eHM o6eKTM (distributed objects) - npuMepn 3a TaKMBa 
MHCppacTpyKTypn 3a: 

o DCOM - M3no/i3Ba ce b Microsoft Windows 

o CORBA - OTBopeH CTaHAapT, komto 3a cb>Ka/ieHi/ie e mhoto c/io>KeH 

o Java RMI - craHAapT 6a3npaH Ha Java TexHO/iorwflTa 

o .NET Remoting - craHAapT npeA-naraH ot .NET Framework 

- Ye6 yc/iyrw (Web services) - CTaHAapTM3npaHa TexHO/iorwyi, npn koato 

OTAe^HM 06eKTM Ha pa3^M4HM n^aTCpOpMM M CMCTeMM KOMyHMKMpaT 

nocpeACTBOM craHAapTHM SOAP Cbo6meHkifl. 

rio-HaTaT"bK b HacToaiuaTa TeMa me pa3r/ieAaMe noApo6HO caMO .NET 
Remoting TexHO/iornaTa. HsiMa p,a npaBMM cpaBHeHne Me>KAy pa3/ikinHMTe 
MOAe^n, TaKMBa tbm KaTO Ta3M TeMa He e o6eKT Ha HacToaiuaTa KHura. Ye6 
yc/iyrwTe b .NET Framework ca pa3r/ieAaHM noApo6HO b r/iaBaTa 3a ye6 
ycnyri/i . 

KaKBO e .NET Remoting? 

Remoting TexHO/iori/isiTa b .NET Framework npeA-nara Ha pa3pa6oTHMKa npo3- 
paneH AOCTtn ao OTAa/ieneHki o6eKTM, 6e3 m3^mujhm TpyAHOCTM v\ 3ary6a Ha 
rtBKaBOCT. noAxoA^iua e 3a c/iynai/i, KoraTO ce Ha/iara p,a ce AOCTbnBaT o6eK- 
tm, komto: 

- ce HaMnpaT b APyrAOMewH Ha npM/io>KeHMeTO (application domain) 

- npnHaA/ie>KaT Ha Apyr npou.ec 

- ce HaMnpaT Ha OTAa/ieneHa MaiunHa 

He3aBMCMMO ot MecTono/io>KeHMeTO Ha MHTepecyBaiunTe hm o6eKTM Remoting 
MHCppacTpyKTypaTa ocurypaBa zieceH HanwH 3a i/i3no/i3BaHeTO mm. KoMyHM- 
KaunflTa Me>KAy o6eKTMTe ce i/i3B"bpujBa npe3 CTaHAapTM3npaH MexaHM3"bM v\ 
cneuwa/iHaTa i/mcppacrpyKTypa, ocurypeHM ot .NET Framework. 

Kora ce M3no/i3Ba Remoting? 

TbM KaTO Remoting TexHO/iori/mTa hm no3BO/iHBa p,a octiuecTBUM Aocrtn ao m 
pea^M3aunfl Ha OTAa/ieneHki o6eKTM, Ta3M TexHO/iorwyi MO>Ke p,a 6"bAe peiueHne 
3a npo6/ieMki, CB"bp3aHM c MpexoBa KOMyHMKauna. CaMaTa i/mcppacrpyKTypa e 
rbBKaBa v\ pa3Lui/ip*ieMa. Tn p,asa peiueHMfl Ha to/iam Ha6op ot npo6/ieMi/i 6e3 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 589 

oco6ei-io ycn^Mfl ot CTpaHa Ha nporpaMi/icra. .NET Framework hm npefl^ara v\ 
a^TepHaTMBM b zikiueTO Ha ye6 ycnyrwTe v\ Mpe>KOBaTa KOMyHMKauna Ha no- 
hmcko hmbo (bm>k system. Net) . noBene 3a TOBa, Kora e yaanHO fla i/i3no/i3- 
BaMe Remoting, MOxeTe p.a HaMepnTe b ^acrra " Remoting cueHapnn ". 

Microsoft Indigo (WCF) 

flpyra 3apa>KAaiua ce TexHO/iori/m c to/iam noTeHu.na/i e Microsoft Indigo 
(Windows Communication Framework, WCF). Ta BK/iK>4Ba b ce6e cm bb3mo>k- 
HOCTMTe Ha ASMX (v\nv\ t. Hap. ye6 ycnyrw), .NET Remoting, Enterprise 
Services, WSE (Web Services Enchancements) v\ MSMQ (Microsoft Message 
Queue). B Indigo e Aopa3BMTa KOHu.enu.kmTa 3a KOMyHMKauna Me>KAy OTAa/ie- 
neHki o6eKTM, KaTO ce Ha6/uira Ha cbBMecTkiMOcrra Ha pa3/ikmHi/iTe cpeAM h 
n^aTCJDopMM. ApxnTeKTypaTa Ha Indigo e npuMep 3a MMn^eMeHTaunfl Ha Ha6n- 
paiuaTa nony/iapHOCT Service Oriented Architecture (SOA). 

3apaAM pa3BMTneT0 Ha Ta3M TexHO/iorna b .NET Framework 2.0 ce onaKBaT 
npoMeHM, CBtp3aHM etc caMMfl Remoting. 06paTHaTa cbBMecri/iMOcr e 3ana- 
3eHa, ho Microsoft npenoptuBaT npeMMHaBaHe kbm WCF (Indigo), c/ieA KaTO 
M3/ie3e c|DMHa^HaTa My Bepcun. 

Remoting MH4>pacrpyKTypaTa 

Remoting MHCJDpacTpyKTypaTa ce cbcroi/i ot: 

- KaHa/iM - KaHa/iki, no komto ce npeHacyiT AaHHkiTe v\ c"bo6iueHMflTa ot m 
KtM OTAa^e^eHMTe o6eKTM 

- 4>opMaTepn - OTroBapaT 3a cJDopMaTupaHeTO, KOAnpaHeTO v\ AeKOAnpa- 
HeTO Ha c"bo6iueHMflTa, komto ce npeHac^T npe3 KaHa/ikiTe b HAKaKtB 

CJDOpMaT 

- npoKCM o6eKTM - npeAaBaT M3BMKBaHMflTa Ha MeTOAM kbm m ot OTAa/ie- 

4eHMTe 06eKTM 

- MexaHM3MM 3a aKTHBai4nn - c/iy>KaT 3a c"b3AaBaHe v\ no/iynaBaHe Ha 
MHCTaHunfl Ha OTAa^e^eHMfl o6eKT 

- Mapiiia/iM3ai4Mfl - ocurypaBa npeHOC Ha o6eKTM, TexHMTe CBoi/icTBa, 
no/ieTa v\ t.h. 

KaTO Har/ieAeH npuMep 3a TOBa KaKBa e B3anMOBp"b3KaTa Me>KAn Te3M KOMno- 
HeHTM m KaK pa6oTAT Te, HeKa pa3r/ieAaMe c/ieAHaTa AnarpaMa: 



590 nporpaMnpaHe 3a .NET Framework (tom 2) 

KntieHTCKti Application Domain — N **- CtpBtpeH Application Domain 




KaK pa6oTM Remoting MHcfrpacTpyKTypaTa? 

ripi/i cb3AaBaHeTO Ha MHCTaHuna Ha OTfla/ieneH o6eKT Remoting i/iHCppacrpyK- 
TypaTa aBTOMaTi/mHO cb3,qaBa npn K/iweHTa npoKCM K/iac, komto ce rpn>KM 3a 
o6MAHaTa Ha cbo6meHi/mTa Me>Kfly K/iweHTCKi/m v\ ctpBtpHna o6eKT. 3a K/iweH- 
Ta cbiuecTByBaHeTO My ocTaBa He3a6e/ie>Ki/iMO, Tbv\ KaTO bcako M3BMKBaHe ce 
o6pa6oTBa aBTOMaTMUHO ot cpeflaTa. Cnep, ioto npoKCMTO no/iynw KOHTpo/ia 
Ha c"bo6iueHneTO, ro npeflaBa Ha c/ieflBamwfl B"b3e/i b i/mcppacrpyKTypaTa - 
KaHa/ia. KaHa/ivr pa6oTM thcho CBtp3aHO c cpopMaTep, komto cpopMaTupa 
flaHHMTe, o6MeHAHM Me>Kfly K/iweHTa v\ cbpBtpa. Cnep, TOBa c"bo6iueHneTO ce 
M3npaiua no TCP coKeT ,qo no/iynaTe/iyi, flecepna/iM3npa ce, ctpBtpHMflT o6eKT 
M3BtpujBa M3BMKBaHeTO m Bptma pe3y/iTaTa no o6paTHi/m ntT kbm K/ikieHTa. 
BcflKa ot onucaHMTe CTtnKM, c ki3K/iK>neHkie Ha cb3,qaBaHeTO Ha ctpBtpHO 
npoKCM, MO>Ke fla 6"bfle HacTpoeHa flont/iHHTe/iHO, TaKa ne fla OTroBapa Ha 

Cnei4MCpM4HM Hy>KAM. 

Remoting KaHa/m 

KaHa/ikiTe ce ki3no/i3BaT 3a npeHOC Ha c"bo6iueHMfl ot m kbm OT,qa/ieneHi/i 
o6eKTM. KoraTO K/iweHTbT M3BHKa MeTOA Ha OTfla/ieneH o6eKT, napaMeTpnTe, 
KaKTO m BCM4KM p,eTav\i\v\, CB"bp3aHM c flafleHOTO M3BMKBaHe, ce TpaHcnopTupaT 
npe3 KaHa/i ,qo o6eKTa. Pe3y/iTaTbT ot M3BMKBaHeTO ce Bptiua o6paTHO npn 
K^neHTa no cbmi/m HanwH. BceKM K/iweHT MO>xe fla M36epe KbM touho kom 
KaHa/i ot perncTpupaHMTe Ha ctpBtpa fla ce npwKanki, 3a fla KOMyHMKupa c 
OTfla^e^eHMfl o6eKT. ToBa flaBa ki3K/iK)nkiTe/iHa rbBKaBOCT Ha pa3pa6oTnm<a b 
M36opa Ha KaHa/i, TaKa ne tom fla OTroBapa Ha cneuncpn^HMTe Hy»<flM. 

3a KaHa/iw MoraT fla ce w3no/i3BaT craHflapTHMTe BrpafleHM KaHa/iw, TexHM 
MOflncpMKauMM m flopw Hant/iHO hobm, c"b3flafleHM ot pa3pa6oTHMKa KaHa/iw, 
komto fla KOMyHMKupaT no M36paH npoTOKO/i. B .NET Framework ca 
pea/i M3ki pa hm Tpn Tuna KaHa/in: 

- TCP KaHa/i - i/i3no/i3Ba ce hmct TCP coKeT. flaHHMTe ce cepna^M3npaT 
CTaHflapTHO nocpeflCTBOM 6nHapeH cpopMaTep v\ ce TpaHcnopTupaT 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 591 

nocpeflCTBOM TCP npoTOKO/i. ripn Hy>Kfla cJDopMaTeptT MO>Ke fla 6"bfle 
npeKOHCJDMrypMpaH KaTO SOAP. 

- HTTP xaHa/i - ki3no/i3Ba ce SOAP npoTOKO/i. Cbo6meHMflTa ce cepi/ia/iw- 
3npaT 4pe3 SOAP c|DopMaTep b XML c BK/iK>4eHi/i SOAP xefltpn. Mo>Ke fla 
ce KOHCJDMrypupa fla M3no/i3Ba 6i/mapeH c|DopMaTep BMecTO craHflapTHMH 
SOAP. KoMyHMKaunflTa Me>Kfly o6eKTMTe ce M3BtpujBa nocpeflCTBOM 
HTTP npoTOKO/i v\ ce i/i3no/i3Ba MO,qe/ia Ha 3asiBKa/oTroBop (request / 
response) noflo6HO Ha to3m b ye6 npi/i/io>KeHkiflTa. 

- flpyrn KaHa/iw - flecJDMHupaHM ot pa3pa6oTHMKa. Te Tpa6Ba fla 

MMn/ieMeHTkipaT klHTepc|DeMCklTe: IChannel, IChannelReceiver V\/\AJ\V\ 

ichanneisender. KaKTO ce BM>Kfla ot MMeHaTa Ha noc^eflHMTe flBa 
MHTepc|Dekica, ntpBMHT c/iy>Ki/i 3a KaHa/i, komto Moxe caMO fla npneMa 
c"bo6iueHMfl, a btopmat - 3a TaKbB, komto MO>Ke caMO fla M3npaiua. B 
noBeneTO cnynaw KaHa/iMTe MMn/ieMeHTkipaT v\ flBaTa MHTepc|DeMca, 3a fla 
MoraT fla KOMyHMKupaT b flBeTe nocoKM. 

KaHa/iMTe ce M3no/i3BaT KaKTO ot ctpBtpHMTe npi/i/io>KeHkifl, TaKa v\ ot 
K/iweHTCKkiTe. KaHa/itT Tpa6Ba fla 6"bfle perncTpupaH v\ ot flBeTe crpaHM npeflu 
Hana/iOTO Ha KOMyHMKauna Me>Kfly tax. 3a npeHOca Ha noTOKa ot cbo6meHkisi 
ce M3no^3BaT TCP nopTOBe, npe3 komto ce noflaBaT cJDopMaTupaHMTe flaHHM Ha 

M3BMKBaHeTO. 

PerMCTpauMn Ha KaHasi 

PerncTpaunflTa Ha KaHa/i e 3a,q"b/i>KkiTe/iHa crbnKa b noflroTBAHeTO Ha KOMyHM- 
KaunflTa c OTfla/ieneHki o6eKTM. To3m npouec MMa cnep,uv\je M3MCKBaHMfl v\ 
orpaHi/meHi/m: 

- Haw-Ma/iKO eflMH KaHa/i Tpa6Ba fla 6"bfle perncTpupaH npeflu fla 6"bfle 
HanpaBeHO o6p"biueHne kbm OTfla/ieneH o6eKT. KaHa/ikiTe 3aflt^>KMTe/iHO 
ce perncTpupaT npeflu perncTpaunaTa Ha caMMTe o6eKTM. 

- BceKM KaHa/i ce perncTpupa 3a flafleH application domain. B eflMH 
npouec e B"b3MO>KHO fla MMa hako/iko application domains. B MOMeHTa, b 
komto flafleHMfl npouec npi/iK/iioni/i pa6oTaTa cm, bcmukm KaHa/iw, komto 
ca perncTpupaHM b Hero, ce yHMiuo>KaBaT aBTOMaTi/mHO. 

- B paMKMTe Ha flafleH application domain BceKM KaHa/i Tpa6Ba fla MMa 
yHMKa^HO MMe. Pa3MeflaMTe npuMepa 3a fla BMflMTe Hani/ma, no komto 
MOxeTe fla 3aflafleTe yHMKa/iHO MMe Ha KaHa/i: 



IDictionary properties = new 


Has 


itable 


0; 


properties [ "name" ] = "httpl"; 








properties ["port"] = "9001"; 








ChannelServices . RegisterChannel ( 






new HttpChannel (properties 


, m 


11, nu 


ID); 



He e B"b3MO>KHO flBa v\nv\ noBene KaHa/ia fla 6"bflaT perncTpupaHM Btpxy 
efli/iH m c"biu nopT, no eflHO v\ cbu\o BpeMe, Ha eflHa v\ cbuxa Mawi/ma. Ot 
flpyra CTpaHa e B"b3MO>KHO eflMH KaHa/i fla 6tfle perncTpupaH Ha noBene 
ot eflMH nopT. 



592 nporpaMnpaHe 3a .NET Framework (tom 2) 

- B c/iynaw, ne He CTe curypHM kom nopT fla ki3no/i3BaTe 3a KaHa/ia, 
MoxeTe fla HaKapaTe Remoting MHCppacrpyKTypaTa fla bm npeflocraBki 
aBTOMaTM^HO CBo6ofleH nopT KaTO perncTpupaTe Kanan 3a nopT 0. 

- K/ineHTbT MO>Ke fla KOMyHMKupa c OTfla/ieneHkiyi o6eKT, ki3no/i3BawKM 
komto m fla e perncTpupaH KaHa/i. Remoting MHCppacrpyKTypaTa aBTOMa- 
tm4ho ocurypyiBa CB"bp3BaHeTO Ha OTfla/ieneHkifl o6eKT c npaBM/iHM5i 
Kanan. K/iweHTbT e 3aA"b/i>KeH fla perncTpupa Kanan npeflu fla ce onuTa 
fla KOMyHMKupa c OTfla/ieneHkm o6eKT. 

npMMep 3a perMcrpauMfl Ha xaHasi 

PerncTpaunflTa Ha KaHa/i MO>Ke fla ce M3B"bpujn no flBa HanwHa: 

Hpe3 K/iaca System. Runtime . Remoting . Channels . ChannelServices : 



using System. Runtime . Remoting . Channels; 
using System. Runtime . Remoting . Channels . Tcp; 



TcpChannel channel = new TcpChannel ( 1234 ) ; 
ChannelServices . Regis terChannel (channel ) ; 



Hpe3 K/iaca System. Runtime. Remoting. RemotingConf iguration M KOH- 

cpurypaunoHeH cpai/i/i: 



RemotingConf iguration . Configure ( "MyClient . exe . conf ig" ) ; 



KoHCpurypaunoHHMTe cpai/i/iOBe, ioto cpeflCTBO 3a HacTpowKa Ha Remoting 
MHCppacTpyKTypaTa, me pa3r/ie,qaMe Ma/iKO no-K"bCHO b HacToaiuaTa TeMa. 

OopMaTepn (formatters) 

Po/iflTa Ha cpopMaTepnTe b Remoting MHCppacrpyKTypaTa e fla cepi/ia/ii/i3wpaT 
c"bo6iueHMflTa Me>Kfly flBeTe CTpaHM b onpefle/ieH cpopMaT. Ha pa3no/io>KeHkie 
Ha pa3pa6oT4MUMTe ca flBa BrpafleHM cpopMaTepa n/iioc B"b3MO>KHOCTTa fla 
ct3flaflaT cbom co6cTBeH cpopMaTep, komto fla OTroBapa Ha cneui/icpi/mHWTe mm 

Hy>KflM. 

- SOAP cpopMaTep - cepna/iki3wpa noTOK b SOAP CbBMecmM XML 
cpopMaT. l/l3no/i3BaHeTO SOAP npoTOKO/ia no3BO/iflBa cbBMecrwMOCT c 
MHOxecTBO n/iaTCpopMM m K^neHTM. riopaflu ynoTpe6aTa Ha XML, o6eM"bT 
Ha npeflaBaHMTe flaHHM e to/iam m TOBa boai/i ao HaMa/iHBaHe Ha npon3- 

BOflMTe^HOCTTa. 

- EMHapeH cpopMaTep - cepna^M3npa noTOK b flBOi/meH cpopMaT, komto e 
c mhoto no-Ma/itK o6eM ot SOAP BapnaHTa. riopaflu BMfla Ha cepna/iw- 
3npaHMfl noTOK He e mriKOBa cbBMecrwM c pa3/ikmHki cucTeMM, ko/ikoto e 
SOAP noTOKa. 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 593 

- flpyr c|DopMaTep - <£opMaTep, pea/iki3kipaH ot pa3pa6oTnm<a 3a HeroBMTe 
cneunc|DM4HM uenw v\ uy>vjxv\. 

OopMaTepM no noApa36npaHe 

BceKM ot npeAOCTaBeHMTe ot .NET Framework KaHa/iw MMa c|DopMaTep no 
noflpa36npaHe. Ha pa3pa6oTHMKa ce npeflocraBfl totobo peiueHne etc cmc- 
TeMaTa ot K/iacoBe 3a ocbmecrBflBaHe Ha OTfla/ieneHkiTe M3BMKBaHMfl v\ tom 
MO>Ke fla ce cbcpeflOTOnw Btpxy pea/iM3aunflTa Ha nporpaMHaTa ziornKa. 
flBaTa KaHa/ia, komto ca BrpafleHM b Remoting MHCJDpacTpyKTypaTa, MMaT 
cJDopMaTepn no noflpa36npaHe: 

- TCP KaHa/i"bT MMa 6nHapeH c|DopMaTep. 

- HTTP KaHa^tT MMa SOAP c|DopMaTep. 

Te3M cJDopMaTepn MoraT fla ce npeKOHCJDMrypupaT. Eto efli/m npuMep KaK Moxe- 
Te fla pea/iki3wpaTe b CBoeTO npi/i/io>KeHkie TCP KaHa/i etc SOAP c|DopMaTep: 



SoapServerFormatterSinkProvider provider = 

new SoapServerFormatterSinkProvider ( ) ; 
IDictionary properties = new Hashtable ( ) ; 
properties [ "port" ] = 12345; 

TcpChannel channel = new TcpChannel (properties, null, provider); 



flpyr Ha^MH 3a npoMAHa Ha craHflapTHMH c|DopMaTep Ha BrpafleHkiTe KaHa/iw e 
npe3 peAaKTupaHe Ha KOHifci/irypaui/iOHHi/ifl <\>av\i\ machine . config. To3m Ha^MH 
e pa3r/ieflaH no,qpo6HO b nacrra onucBaiua KOHCJDMrypupaHeTO Ha Remoting 
MHCJDpacTpyKTypaTa b Kpaa Ha TeMaTa. 

AKTMBaMMq Ha o6eKTM 

npouecbT Ha cb3flaBaHe Ha MHCTaHuna Ha OTfla/ieneH o6eKT ce Hapi/ma 
aKTMBai4Mn. Remoting MHCJDpacTpyKTypaTa npeflocraBfl flBa Hankma 3a M3B"bp- 
LUBaHeTO v\: 

- C~bpBi>pHa aKTMBai4nn (server-side activation) - M3no/i3Ba ce b cny- 
naw, KoraTO HAMa Heo6xofli/iMOcr OTfla/ieneHkiTe o6eKTM fla noflfltpwaT 
CBoeTO cbCTOAHi/ie Me>Kfly flBe M3BMKBaHMfl (SingleCall) v\nv\ KoraTO 

MHO>KeCTBO K^kieHTM M3BMKBaT MeTOflM Ha eflHa M CblUa MHCTaHUMfl Ha 

o6eKTa m Tpa6Ba fla ce noflfltpwa cbcroflHkieTO Ha o6eKTa Me>KAy m3bmk- 
BaHMaTa (Singleton). 

- KsmeHTCKa aKTMBauimj (client-side activation) - MHcraHuwflTa Ha 
o6eKTa e cb3fla,qeHa caMO 3a K/iweHTa, komto a e M3BMKa/i. CaMO tom a 
ynpaB/iHBa v\ onpefle/ia BpeMeTO v\ 3a >kmbot. Xn3HeHMflT uwKb/i Ha to3m 
bma OTfla/ieneHi/i o6eKTM ce ynpaB/iABa npe3 lease-based cwcreMa Ha 
MHCJDpacTpyKTypaTa. 

ripeflu fla e B"b3MO>KHa aKTHBaunaTa Ha o6eKTM, e 3afl"b/i>KkiTe/iHO fla 6"bflaT 
perncTpupaH BceKM ot TunoBeTe Ha OTfla/ieneHkiTe o6eKTM, komto CMATaMe fla 
M3no^3BaMe. 



594 nporpaMnpaHe 3a .NET Framework (tom 2) 

SingleCall pe>KMM Ha aKTMBauim 

SingleCall pe>KMM"bT e npn^OKMM npn o6eKTM etc cbpBtpHa aKTMBauna. 
XapaicrepHO 3a to3m pe>KMM e, ne npn bchko M3BMKBaHe Ha MeTOA ot CTpaHa 
Ha K^neHTa ce cb3,qaBa HOBa MHCTaHuna Ha o6eKTa Ha cbpBtpa, koato 
o6cny>KBa M3BMKBaHeTO v\ BeflHara cnep, TOBa 3aB"bpwBa cboa >KM3HeH umkb/i. 

TaKMBa o6eKTM ca yqo6HM b c/iynai/i, ne MMaMe MeTOfl, komto Tpa6Ba fla 
CBtpujn onpefle^eHa pa6oTa, 3a M3B"bpujBaHeTO, Ha koato HAMaMe Hy>Kfla ot 
npeAMWHOTO cbCTOAHne (state) Ha o6eKTa. 06eKTM c TaicbB pe>KMM Ha pa6oTa 
y^ecHABaT 6a/iaHCMpaHeTO Ha HaTOBapBaHeTO (load-balancing) Ha ctpBtpa, 
TtM KaTO He ce Ha/iara fla ce noflfl"bp>Ka ctCTOflHueTO mm Me>Kfly OTfle/iHMTe 

M3BMKBaHMfl. 

Singleton pe>KMM Ha aKTMBaunn 

Singleton pe>KMM"bT e npn^OKMM npn o6eKTM etc cbpBtpHa aKTMBauna. XapaK- 
TepHO npn Hero e, ne cbiuecTByBa eflMHCTBeHa MHCTaHuna Ha OTfla/ieneHWfl 

06eKT M BCMUKM K/lMeHTM pa60TflT C Hefl. HeMHMTe flaHHM, MeTOflM M CBOMCTBa 

ca cnofle^eHM Me>Kfly bcmukm K/iMeHTM. CaMMflT o6eKT noflfl"bp>Ka CBoeTO 
c-bCTOAHne (state). 

To3M pe>KMM Ha aKTMBaunfl e noflxoflaiu, KoraTO flaHHMTe Ha o6eKTa, Tpa6Ba 
fla 6"bflaT cnofle^eHM v\nv\ KoraTO MHCTaHunpaHeTO v\ noflfl"bp>KaHeTO Ha 
cbCTOAHneTO Ha o6eKTa cb3flaBa flont/iHMTe/iHO HaTOBapBaHe. ripn M3no/i3Ba- 
HeTO Ha Singleton o6eKTM e B"b3MO>KHO hako/iko K/iMeHTa eflHOBpeMeHHO fla 
pa6oTAT c tax, nopaflu KoeTO Tpa6Ba fla ce ocurypn cnHxpoHM3aunfl npn 
flocTbna flo o6lum flaHHM (b>k. r/iaBaTa 3a hmlijkm m CMHxpoHM3aukia ). 

K/iMeHTCKa aKTHBauHfi 

ripn aKTMBaunfl ot CTpaHa Ha K/iweHTa, cnep, 3aaBKaTa Ha ctpBtpa ce Cb3fla- 
BaT MHCTaHUMM Ha OTfla/ieneHi/ifl o6eKT. Cb3flafleHM*iT o6eKT o6c/iy>KBa eflMH- 
CTBeHO CBOfl K^neHT. 06eKTbT MO>Ke fla noflfl"bp>Ka CBoeTO cbcroflHMe Me>Kfly 

M3BMKBaHMflTa. Xkl3HeHMflT UMK"b/l Ha BC5HO MHCTaHUMfl Ce KOHTpO/lMpa Hpe3 

lease-based cwcreMaTa Ha Remoting MHCppacrpyicrypaTa (me fl pa3r/ieflaMe 
noflpo6HO b nacrra " Xmbot Ha o6eKTMTe ". 

ripn BCflKa 3aaBKa 3a cb3flaBaHe Ha hob o6eKT ce Bptiua HOBa MHCTaHuna. C 
TaKtB Tun o6eKTM Tpa6Ba fla ce pa6oTM BHMMaTe/iHO, Tbv\ KaTO e B"b3MO>KHO 3a 
eflMH K^neHT Ha cbpBtpa fla MMa noBene ot eflHa MHCTaHuna. ripn npoeKTM- 
paHe Ha TaKMBa K/iacoBe Tpa6Ba fla ce OTfle/in BpeMe 3a onTMMH3npaHe Ha 
MeTOflMTe Ha K/iaca v\ fla ce HanpaBM nper/iefl Ha TOBa ko/iko m iokbm flaHHM 
cbfl"bp>Ka tom, 3a fla ce 06/ieKHM HaTOBapBaHeTO Ha cbpBtpa. 

PerMCTpauiMfi Ha OTfla/ieneH o6eKT 

PerMCTpauMATa Ha OTfla/ieneHMTe o6eKTM cneflBa BeflHara cnep, perMCTpauM^Ta 
Ha Remoting KaHa/iM. 3a fla M3B"bpujMM TOBa hm e Heo6xoflMMO fla npeflocra- 
bmm Ha Remoting MHCppacrpyKTypaTa cneflHMTe flaHHM: 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 595 

- MMeTO Ha aceM6/ii/iTO, b KoeTO ce HaMupa K/iaca, komto MCKaMe fla 
perncTpupaMe 

- Tuna Ha OTfla/ieneHkifl o6eKT 

- URI (Unique Resource Identifier) Ha o6eKTa, 4pe3 komto K/iweHTbT fla 
MO>Ke fla ce o6p"biua kbm Hero 

- b c/iynaw, ne o6eKT"bT e etc cbpBtpHa aKTMBauna - HeroBna pe>KMM Ha 
axTkiBaukia (SingleCall v\nv\ Singleton) 

Othobo MMaMe M36op Me>Kfly flBa Hankma 3a perncTpupaHe - npe3 koa v\i\v\ 
npe3 KOHCJDMrypauMOHeH cpafiji. 

Hpe3 perncTpaunflTa npeflocraBAMe flaHHM, komto onucBaT yHMKa/iHO Ha 
Remoting MHCJDpacTpyKTypaTa BceKM Tun, komto MCKaMe fla ki3no/i3BaMe KaTO 
OTfla/ieneH. To3m npou.ec Ha perncTpauna e 3a,q"b/i>KkiTe/ieH KaKTO 3a ctpBtpa 
TaKa m 3a K/iweHTa. Ba>KeH MOMeHT npn perncTpupaHeTO Ha TunoBeTe e 
perncTpaunnTe npn cbpBtpa v\ K/iweHTa fla cm cbOTBeTCTBaT. flpyro M3MCKBaHe 
e, TunoBeTe, komto ce ki3no/i3BaT 3a OTfla/ieneHM o6eKTM Ha ctpBtpa v\ Te3M 
Ha K/iweHTa fla MMaT eflHa v\ cbiua Bepcua v\nv\ noHe TexHMTe MHTepc|DeMCM fla 
cbBnaflaT. To3m KOHKpeTeH npo6/ieM e pa3vnep.au b naora " npo6.neM"bT c 
o6mnTe TunoBe ". 

PerMCTpaijMfl Ha CbpBi>pa (Server-Side Registration) 

Hpe3 nporpaMeH koa MMaMe Tpn b"B3mo>khoctm 3a perncTpupaHe Ha Tuna Ha 
o6eKT, komto MCKaMe fla e flocTbneH OTfla/ieneHO. M3no/i3BaT ce MeTOflMTe Ha 

K/iaca RemotingConf iguration: 

- RegisterWellKnownServiceType (...) C napaMeTbp, yKa3Baifl ne 06eKTbT 

Tpa6Ba fla ce ki3no/i3Ba b SingleCall pe>KMM - perncTpupa Tun Ha 
OTfla/ieneH o6eKT b pe>KMM SingleCall. flpuMep: 



RemotingConf iguration . RegisterWellKnownServiceType ( 

typeof (CommonTypes . Library) , // type of the remote object 

"Library", // assembly name 

WellKnownObj ectMode . SingleCall ) ; // activation mode 



RegisterWellKnownServiceType (...) C napaMeTbp yKa3Baifl ne 06eKTbT 

Tpa6Ba fla ce M3no/i3Ba b singleton pe>KMM - perncTpupa Tun Ha OTfla- 
zieneH o6eKT b pe>KMM singleton. flpuMep: 



RemotingConf iguration . RegisterWellKnownServiceType ( 

typeof (CommonTypes . Library) , // type of the remote object 

"Library", // assembly name 

WellKnownObj ectMode . Singleton) ; // activation mode 



RegisterActivatedServiceType(...) - perMCTpupa OTfla/ieneH 06eKT C 

K/iweHTCKa aKTMBaunfl. flpuMep: 



596 flporpaMnpaHe 3a .NET Framework (tom 2) 



RemotingConf iguration . RegisterActivatedServiceType ( 

typeof (CommonTypes . Library) ) ; //type of the remote object 



PerMCTpauHfi Ha Knnema (Client-Side Registration) 

Hpe3 nporpaMeH koa MMaMe ABa HanwHa 3a perncTpupaHe Ha Tuna Ha o6eKT, 
komto MCKaMe Aa no/i3BaMe OTAa/ieneHO ot hakom Remoting cbpBtp. l/l3no/i3- 

BaT ce MeTOAMTe Ha K/iaca RemotingConf iguration : 

- RegisterWellKnownClientType(...) - perMCTpupa Tkin C"bC CbpBtpHa 

aKTMBaunfl. He ce yi<a3Ba p,anw o6eKT"bT M3no/i3Ba pe>KMM singiecaii 
v\nv\ singleton, 3aiuoTO TOBa 3aBMCM ot ctpBtpa. K/lMeHTbT He MO)Ke M 
He Tpa6Ba Aa 3Hae TaKMBa noApo6HOcm b MMn/ieMeHTauwHTa v\ /iori/iKaTa 
Ha cbpBtpa. OopMaTtT Ha URI aApeca, komto ce noAaBa Ha MeTOAa, e 
c/ieAHkiflT: 



<npoTOKon>: //<HMe Ha cipBtpa mjim IP aflpec> : <nopT>/<rn>T flo 
aceM6jin c Tnna>/<Tnn> 



Eto eAMH npuMep 3a perncTpauna Ha OTAa/ieneH Tun c aKTMBauna ot 
CTpaHa Ha ctpBtpa: 



RemotingConf iguration . RegisterWellKnownClientType ( 

typeof (CommonTypes . Library) , // type of the remote object 
"http : //remoting_server : 1234/remoting/Library" ) ; // object URI 



RegisterActivatedClientType(...) - perMCTpupa TMn C K/lMeHTCKa 

aKTkiBaui/m. OopMaTtT Ha URI MAeHTucpuKaToptT e ci\ep,uv\s\T\ 



<npoTOKOJi>: //<MMe Ha cipBipa win IP aflpec>:<nopT> 



Eto npuMep 3a perncTpauna Ha OTAa/ieneH o6eKT, komto no/i3Ba K/iweHT- 
CKa aKTMBauna: 



RemotingConf iguration . RegisterActivatedClientType ( 

typeof (CommonTypes . Library) , // type of the remote object 
"http : //remoting_server : 1234" ) ; // URL of the server 



Cb3flaBaiie Ha MHcraHuiifi Ha OTfla/ieneH o6eKT 

3a Aa no/iynwM MHCTaHuna Ha AaAeH OTAa/ieneH o6eKT Tpa6Ba npeAH TOBa Aa 
CMe perncTpupa^n HeroBna Tun b Remoting i/iHCppacrpyKTypaTa. Cnep, TOBa 
MO>KeM Aa cb3AaAeM o6eKT ot to3m Tun no hakom ot cnep,uv\je HamiHki: 

- Hpe3 CTaTM4HMfl MeTOA GetObject(...) Ha K/iaca Activator - M3nO/13Ba 

ce 3a OTAa/ieneHi/i o6eKTM etc cbpBtpHa aKTMBauna. C"b3AaBa npoKCM 
o6eKT npn K/iweHTa, npe3 komto ce ocbmecrBflBaT bcm^km M3BMKBaHMfl. 
KoMyHMKaunfl etc ctpBtpa ce M3B"bpujBa eAMHCTBeHO npn M3BMKBaHeTO 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 597 

Ha MeTOAMTe v\ BptiuaHeTO Ha pe3y/iTaTa, a He npn c"b3AaBaHeTO Ha 
npoKCM o6eKTa. 



Library library = Activator . GetObj ect ( 

typeof (Library) , // type of the remote object 

"http : //remoting_server : 1234/remoting/Library" // object URI 

) as Library; 



Hpe3 onepaTopa new - Moxe p,a ce M3no^3Ba 3a cb3AaBaHe Ha o6eKTM 
etc ctpBtpHa m c K/iweHTCKa aKTMBaunfl. OcurypflBa i/i MexaHM3"bM 3a 
npeflaBaHe Ha napaMeTpn npn MHCTaHunpaHe. B C# onepaToptT new ce 
i/i3no/i3Ba KaKTO npn cb3flaBaHeTO Ha /ioi<a/iHi/i o6eKTM, TaKa v\ npn 
ct3AaBaHeTO Ha OTAa/ieneHi/i o6eKTM. 3a p,a cb3AaAeM OTAa/ieneH o6eKT 
c new, npeAM TOBa cbOTBeTHi/iAT K/iac Tpa6Ba p,a e 6m/i perncTpupaH b 
Remoting MHCJDpacTpyKTypaTa. B npoTMBeH cnynaw ce cb3AaBa /ioi<a/ieH 
o6eKT. Eto npuMepeH koa, komto cb3AaBa OTAa/ieneH o6eKT c onepaTopa 

new: 



// This class is located and registered on the server 
class Library 

{ 

private string mName; 

// Default constructor 
public Library () 

{ 

mName = "Library"; 

} 

// Parametrized constructor 
public Library ( string aName) 

{ 

mName = aName ; 

} 
} 



// This code runs on the client-side 

// Register the Library class as remote type 
RemotingConf iguration . RegisterWellKnownClientType ( 

typeof (CommonTypes . Library) , 

"http : //remoting_server : 12 34/remoting/Library" ) ; 

// Get object from the server using the default constructor 
Library libraryl = new Library (); 

//Get object from the server using the parameterized constructor 
Library library2 = new Library ("My library"); 



598 nporpaMnpaHe 3a .NET Framework (tom 2) 

KofltT 3a MHCTaHunpaHe Ha OTfla/ieneiH o6eKT c K/iK>noBaTa flyMa new He ce 
OT/iwuaBa ot cb3flaBaHeTO Ha o6mkhob6hm o6eKTM. M3o6iuo pa6oTaTa c OTfla- 
/ieneHM o6eKTM M3r/ie>KAa b noBeneTO c/iynaw, ioto ne nv\ ce i/i3n"b/iHHBa Btp- 
xy o6nKHOBeHM MHCTaHunn. Cnep, perncTpaunfl Remoting MHCppacrpyKTypaTa 
ce rpn>KM bcako M3BMKBaHe fla ce npexBtp/ia ot /lOKa/iHkia npoKCM K/iac kbm 
OTAa/ieneHMH o6eKT npo3panHO, 6e3 Aont/iHi/iTe/iHa HaMeca Ha nporpaMi/icra. 

Mapi±ia/iM3ai4nq (Marshaling) 

Mapuja/iM3aukiflTa (marshaling) e npou.ec Ha npeHOC Ha o6eKTM v\ ashhh 
Me>KAy Remoting K/ikieHTa v\ ctpBtpa. To3m npouec ce M3B"bpujBa npn bcako: 

- noflaBaHe Ha napaMeTpn Ha MeTOfl 

- BptiuaHe Ha pe3y/iTaT ot MeTOfl 

- flOCTbn flo no/ie v\nv\ cbomctbo Ha o6eKT v\nv\ Tun 
CnopeA Hani/ma, no komto ce npeHac^T MMa Tpn Tuna o6eKTn: 

- Marshal-By-Value o6eKTM - npeHacsrr ce no ctomhoct nocpeACTBOM 
cepna.fi ki3aui/ia . 

- Marshal-By-Reference o6eKTM - npeHac^T ce no pecpepeHuna. no 
cneuna^HOTO npn tax e, ne ce i/i3no/i3Ba OTAa/ieneHa pecpepeHuna. 

- Non-Marshaled o6eKTM - He ce npeHacsrr. npi/mi/ma 3a TOBa MO>Ke p.a 
6"bfle, ne o6eKTMTe CTaBaT HeBa/iwAHM M3B"bH cboa application domain 
v\nv\ KOHTeKCT, nopaAM cbo6pa>KeHi/ifl 3a curypHOCT v\ AP- 

Marshal-By-Value o6eKTM 

Marshal-By-Value ca bcmukm o6eKTM, komto ca MapKupaHM c aTpn6yTa 

[Serializable] V\/\AJ\V\ MMn/ieMeHTMpaT MHTepcpeMCa ISerializable. Te3M 

o6eKTM ce npeAaBaT no ctomhoct, T.e. taxho Konne ce npeHaca ao OTAa/ie- 
neHaTa Mawi/ma. KonnpaT ce bci/iukm cepkia/iM3kipyeMM no/ieTa v\ CBOMCTBa b 
o6eKTa. KaTO noBeAeHne Te ca noAo6HM Ha ctomhocthmt6 TunoBe b .NET 
Framework, ripn npoMAHa Ha AaHHkiTe ce npoMeHa caMO ziOKa/iHOTO Konne Ha 
o6eKTa. Ue/iMAT o6eKT ce npeHaca ao OTAa/ieneHaTa Mawi/ma HaBeAHtx (caMO 
c eAHO M3BMKBaMe) m TOBa ocurypaBa Ao6po 6"bp30AewcTBkie b cnynaki, ne 
o6eM"bT Ha AaHHMTe He e to/iam. 

Eto eAMH npuMep, b komto ca AecpuHnpaHM ABa K/iaca, komto ce Mapwa- 
/iM3wpaT no ctomhoct: 



[Serializable] 
public class Book 

{ 

private string mAuthor; 
private string mTitle; 

// Default constructor 
public Book ( ) 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 599 



} 



public class Author : ISerializable 

{ 

private string mName; 
private string [] mBooks; 

// Default constructor 

public Author ( ) 

{ 

} 

// Constructor for serialization only 
private Author (Serializationlnfo info, 
StreamingContext context) 

{ 

// Deserialize data to class fields 

} 

// ISerializable . GetObj ectData method 
public void GetObj ectData (Serializationlnfo info, 
StreamingContext context) 

{ 

// Serialize class fields 

} 



Marshal-By-Reference o6eKTM 

Marshal-By-Reference ca bcm^km o6eKTM, komto ca Hac/ieAHwuw Ha K/iaca 
MarshaiByRefobj 6e3 3Hanem/ie fla/iw TMiTbT e cepkia/iM3kipyeM. npeHacAT ce 
flo OTfla/ieneHaTa Mawkma nocpeflCTBOM OTfla/ieneHa pec|DepeHUMfl, ot koato ce 
cb3AaBa AHHaMM^HO npoKCM K/iac. Bcako M3BMKBaHe v\nv\ onepaunfl Btpxy 
o6eKTa ce M3B"bpujBa Btpxy npoKCM K/iaca, komto ot cboh crpaina npexBtp/ia 
Hy>KHMTe flaHHM KtM OTfla/ieneHaTa MHCTaHuna, KbfleTO ce i/i3iTb/iHflBa pea/mo 
M3BMKBaHeTO. To3m npouec ce noBTapa 3a bcako neTeHe v\nv\ ni/icaHe b no/ie 

V\I\V\ M3BMKBaHe Ha MeTOA, KOeTO 3HaHMTe/lHO nOHM>KaBa npOI/l3BOAMTe/lHOCTTa. 



[Serializable] 
public class Book : MarshalByRefOb j ect 

{ 

private string mAuthor; 
private string mTitle; 

// Default constructor 
public Book ( ) 



600 flporpaMnpaHe 3a .NET Framework (tom 2) 




>Kmbot Ha o6eKTMTe (Lifetime) 

B .NET Framework >KM3HeHHflT uwKb/i Ha o6eKTMTe ce ynpaB/iflBa ot ci/icreMaTa 
3a cb6npaHe Ha 6oK/iyKa (Garbage Collector). Tn c/iefli/i fla/iki flafleH o6eKT 
ce flocT-bnBa ot K/iweHTkiTe b flafleH application domain (AppDomain). KoraTO 
o6eKTbT cnpe fla 6"bfle ki3no/i3BaH tom no,q/ie>Ki/i Ha cb6npaHe ot ci/icreMaTa 3a 
6oK/iyK. Ako o6eKTMTe v\ K/iweHTi/iTe mm ca b eflMH v\ cbiu application domain, 
cucTeMaTa pa6oTM 6e3 npo6/ieMki. flopn b cnynai/i, ne K/iweHTbT v\ o6eKTMTe ca 

B OTfle/lHM flOMeMHM, HO B paMKMTe Ha eAMH M C"blfl npOUeC, OTHOBO HflMa 

HMKaKBM npo6/ieMM, Tbv\ KaTO Te BCM4KMTe cnofle/iflT o6iu ynpaB^ABaH xnwn 
(managed heap). 

C/iynaaT, b komto K^neHTMTe m o6eKTMTe ca b pa3/ikmeH npouec v\/v\nv\ 
MaujMHa, e no-oco6eH. Ako cwcreMaTa 3a cb6i/ipaHe Ha 6oK/iyKa pa6oTM no 
cbiunfl Ha^MH, to t*i BeflHara cnep, i/iHMuna/iki3kipaHeTO me OTKpue, ne kbm 
o6eKTa HflMa pecpepeHunn v\ BeAHara me ro o6abm 3a 6oK/iyK. 3a fla peiui/i 
to3m npo6/ieM Remoting kmcppacrpyKTypaTa npefl/iara "ci/icreMa 3a OTnycKaHe 
Ha ">kmbot Ha3aeM" 3a o6eKTMTe - lease-based lifetime management. 

>Kmbot Ha3aeM 

ripi/i ct3AaBaHeTO cm BceKM OTfla/ieneH o6eicr Ha ctpBtpa ce acounupa c 
Lease o6eKT, komto MMa 3a,qanaTa fla KOHTpo/iwpa >KM3HeHMfl My umcb/i. Tom 
onpefle^a BpeMeTO, 3a KoeTO OTfla/ieneHkiyi o6eKT e aKTMBeH v\ He nofl/ie>KM Ha 
ct6npaHe ot cwcreMaTa 3a cwcreMaTa 3a nonwcTBaHe Ha naMeTTa. 

Cneuwa/ieH o6eKT HapeneH Lease Manager cneflki ctpBtpHMTe o6eKTM v\ 
TexHMTe acounnpaHM Lease o6eKTM. BceKM Lease o6eKT MMa Hana/iHO BpeMe, 
KoeTO fla flaBa Ha3aeM (initial lease time). Lease BpeMeTO 3anonBa fla Tene 
cnep, KaTO ntpBaTa pecpepeHuna kbm ctpBtpHna o6eKT ce Mapiua/iki3kipa npe3 
rpaHnuaTa Ha flOMeMHa. floKaTO to e no-ro/iHMO ot Hy/ia, ce cui/iTa ne 
o6eKT"bT, acounnpaH c Hero, Bee oiue e aKTMBeH v\ CLR CMATa, ne cbpBtpHMfl 
o6eKT Bee oiue ce w3no/i3Ba ot K/iweHTa. Lease MeHMfl>K"bp"bT na3M pecpepeH- 
Ukifl KtM o6eKTa, 3a fla npeflOTBpaâ„¢ HeroBOTO cb6npaHe ot "cucTeMaTa 3a 
nonwcTBaHe Ha naMeTTa". 

KoraTO Lease BpeMeTO CBtpiuw, CLR peiuaBa ne o6eKT"bT He e Bene b 
ynoTpe6a v\ ne tom pecypcuTe My no,q/ie>KaT Ha ocBo6o>KflaBaHe. ripn CBtp- 
ujBaHe Ha BpeMeTO e B"b3MO>KHO fla MMa K/iweHTi/i, komto Bee oiue fla ce Hy>K- 
fla^T ot o6eKTa. B to3m momcht ce OTnpaBH 3aaBKa kbm BceKM ot tax fla/ii/i Bee 
oiue ce Hy>KflaflT ot o6eKTa. 



HnaBa 22. OTfla/ieneHM M3BMKBaHM5i c .NET Remoting 601 

CnoHCopn Ha o6eKTMTe 

BceKM K^neHT, komto MCKa fla 6"bfle "nonnTaH" p,anw MCKa fla ce yfl"b/i>Ki/i 
>KMBOTa Ha o6eKTa, komto tom no/i3Ba, Tpa6Ba fla npeflocraBH cneuwa/ieH 
o6eKT-cnoHCop. CnoHCopvr ot cboa CTpaHa peiuaBa p,anw fla yfl"b/i>Kki >KMBOTa 
Ha ctpBtpHMfl o6eKT v\nv\ He. Ako peiun fla yfl"b/i>Kki BpeMeTO 3a >kmbot, to 
Lease MeHkiflacbpvr M3n"b/iH*iBa >Ke/iaHweTO My. B npoTMBeH c/iynaw cwcreMaTa 
3a cb6i/ipaHe Ha 6oK/iyK MO>xe fla npn6epe o6eKTa. C/ieflBamaTa cxeMa o6ac- 
HflBa HaMeflHO npoueca: 



Process A Process B 

Host App Domain Client App Domain 





Object 
Lease 




Oli 




Holds 
reference 




L/llbiu 
















Lease 
Manager 




Sponsor 







OyHKui/iflTa Ha BceKM eflMH ot noKa3aHMTe o6eKTM e o6acHeHa no-flo/iy. Ta3M 
cxeMa 3a onpefle/iHHe Ha npoflt/iwi/iTe/iHOCTra Ha >KMBOTa e npn^OKMMa caMO 
3a Marshal-By-Reference o6eKTM c K/ikieHTCKa aKTMBauna v\ Singleton o6eKTM 
etc ctpBtpHa aKTMBaunfl. flBaTa c/iyna*i MMa cneuncfju^HM oco6eHOCTM, komto 
ca pa3MeflaHM no-flo/iy. Cera me HaconwM BHMMaHneTO cm kbm Lease o6eKTa, 
cnoHCopa v\ Lease MeHi/iflacbpa. 

Lease o6eKT"bT MMn/ieMeHTwpa kiHTepcfjekica iLease, komto npeflocraBfl 
cfjyHKunn 3a onpefle/iflHe >KMBOTa Ha acounnpaHMTe c Hero o6eKTM. KoHKpeTHa 

MMn^eMeHTaUMfl Ha T03I/I MHTepcfjeMC e K/iaCbT Lease B System. Runtime. 
Remoting . Lifetime. 

l/lHTep4>eiic-bT ILease 

MHTepcfjewcbT iLease ce HaMupa b npocTpaHCTBOTO ot MMeHa system. 

Runtime. Remoting. Life time. KaKTO nOKa3Ba CxeMaTa, 06eKTM OT T03M TMn 

flaBaT Ha3aeM >kmbot Ha acounnpaHMfl cm OTfla/ieneH cbpBtpeH o6eKT. 
Remoting MHcfjpacTpyKTypaTa aBTOMaTMUHO 3aflaBa ctomhoctm no noflpa3- 



602 nporpaMnpaHe 3a .NET Framework (tom 2) 

6kipaHe 3a CBOMCTBaTa Ha BCflKa MHCTaHUMfl OT T03M TMn, HO e B"b3MO>KHO M 

nporpaMMCTbT fla 3aflafle cbom co6ctb6hm. CBOMCTBaTa, komto i/iHTepcpewcbT 
npeAOCTaBfl ca: 

- initiaiLeaseTime - 3aflaBa BpeMeTO Ha >kmbot Ha o6eKTa. B c/iynaw ne 
MCKaMe p,a 3aAafleM Apyra ctomhoct ot Ta3M no noApa36npaHe, Tpa6Ba 
Aa ro HanpaBMM 3aAt>/i>KkiTe/iHO npeflM p,a CMe aKTMBupa^n o6eKTa. no 
noApa36npaHe BpeMeTO 3a >kmbot e 5 mmhytm. 

- RenewOnCallTime - 3aAaBa BpeMeTO, C KOeTO e B"b3MO>KHO p,a ce 
yBe/ikinki >KMBOTa Ha o6eKTa npn bcako M3BMKBaHe. no noApa36npaHe 
CTOMHOCTra My e 2 MMHyTM. Ba>KHO e Aa ce OT6e/ie>Ki/i, ne He e B"b3MO>KHO 
Aa ce no/iynw HaTpynBaHe Ha BpeMe npn MHTeH3MBHO no/i3BaHe Ha 
o6eKTa, TbM KaTO cpopMy/iaTa, no koato ce w3Hkic/iflBa hoboto BpeMe 3a 
>kmbot, e c/ieAHaTa: 



currentLeaseTime = MAX ( InitiaiLeaseTime - expiredTime, 
RenewOnCallTime ) 



C Apyrn AyMM RenewOnCallTime CTOMHOCTTa me kiMa ecpeKT, aKO e no- 
ro/iHMa ot ocTaBaiuoTO BpeMe 3a >kmbot, KaTO b TaKbB cnynaw ta 
onpeAe/ia ocraBamo BpeMe 3a >kmbot. Othobo CMe 3aA"b/i>KeHi/i Aa 
3aAaAeM Ta3M ctomhoct npeAM aKTHBaunaTa Ha o6eKTa. 

sponsorshipTimeout - 3aAaBa BpeMeTO, b KoeTO BceKM cnoHCop Tpa6Ba 
Aa OTroBopn Ha M3npaTeHaTa My 3aaBKa 3a OTnycKaHe Ha oiue BpeMe. B 
c/iynaw, ne He 6"bAe no/iyneH OTroBop, ce cnwTa, ne cnoHCopvr e 
OTKa3a/i. Ako hmto eAHH ot cnoHCopnTe He AaAe Aont/iHi/iTe/iHO BpeMe 
to o6eKTbT noA/ie>KM Ha yHMiuoKeHne. no noApa36npaHe CTOMHOCTra e 2 

MMHyTM. 

CurentLeaseTime - Bptiua KO/1KO BpeMe Oiue OCTaBa OT >KMBOTa Ha 

o6eKTa. 

currentstate - Bptiua cbCTOAHneTO Ha >KMBOTa Ha o6eKTa, KaTO 
ctomhoct ot ki36poeHi/m Tkin Leasestate. CTOMHOCTMTe, komto Bptma ca : 
initial b npoueca Ha aKTMBauMa; Active, KoraTO ocraBamoTO BpeMeTO 
3a >kmbot e no-ro/iflMO ot 0; Renewing b npoueca Ha Ao6aBAHe Ha BpeMe 
npn M3BMKBaHe; Expired b cnynaw 4e BpeMeTO 3a >kmbot e M3TeK.no; 
Null - npn npo6/ieM c ki3ni/ic/iHBaHeTO Ha cbcroflHweTO. Eto AecpMHM- 

UMflTa Ha Tkina LeaseState: 



[Serializable^ 














public enum 

{ 

Null = 0, 


LeaseState 


























Initial = 


1 


, // while 


initializing 






Active = 


2, 


// lease 


time 


greater 


than 





Renewing 


= 


3, // whil 


e renewing 








Expired = 


4 


// lease 


time 


equal 


to 








HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 603 



kl3nosi3BaHe Ha I Lease 

B c/iynaw, ne noflpa36npaiunTe ce ctomhoctm He ca yflo6HM, MO>KeM p,a 
npoMeHMM r/io6a/iHO 3a ua/ioto npw/iOKeHwe CTOMHOCTMTe npe3 CBOMCTBaTa 

LeaseTime, RenewOnCallTime M SponsorshipTimeout Ha K/iaca 
LifetimeServices (b npoCTpaHCTBOTO OT MMeHa System. Runtime .Remoting. 

Lifetime). TtM KaTO TOBa ca r/io6a/iHki HacTpoMKM 3a noBefleHneTO Ha 
OTAa^e^eHMTe o6eKTM, Te Tpa6Ba p,a 6"bAaT HanpaBeHM npeAH peri/icrpi/ipaHeTO 
Ha OTAa^e^eHMTe TunoBe, komto me M3no/i3BaMe. HanpuMep: 



static void Main ( ) 

{ 

Lif etimeServices . LeaseTime = TimeSpan . FromMinutes ( 10 ) ; 

Lif etimeServices . RenewOnCallTime = TimeSpan . FromMinutes ( 5 ) ; 

Lif etimeServices . SponsorshipTimeout = TimeSpan . FromMinutes ( 1 ) 



// Register remotable types or load config file 



} 



MoweM as npoMeHMM CTOMHOCTMTe Ha Lease o6eKTa, acounnpaH c KOHKpeTeH 
OTAa/ieneH o6eKT no cneAHi/m Hani/m: 



// Type definition 

public class ClientActivatedType : MarshalByRefOb j ect 

{ 

} 



// Create and activate the first instance 
ClientActivatedType caLongLiving = new ClientActivatedType ( ) , 

// Get the Lease object associated with it 
ILease longLiving = (ILease) 

RemotingServices . GetLif etimeService (caLongLiving) ; 

// Adjust the lifetime parameters 

longLiving . RenewOnCallTime = TimeSpan . FromMinutes ( 10 ) ; 

longLiving . SponsorshipTimeout = TimeSpan . FromMinutes ( 1 ) ; 

// Create and activate the second instance 
ClientActivatedType caShortLiving = new ClientActivatedType ( ' 

// Get the Lease object associated with it 
ILease shortLiving = (ILease) 

RemotingServices . GetLif etimeService (caShortLiving) ; 



604 flporpaMnpaHe 3a .NET Framework (tom 2) 



// Adjust the lifetime parameters 

shortLiving . RenewOnCallTime = TimeSpan . FromMinutes ( 1 ) ; 

shortLiving . SponsorshipTimeout = TimeSpan . FromSeconds ( 15 ) ; 



CbLUMTe HacTpoMKM MoraT fla 6"bflaT HanpaBeHM v\ nocpeflCTBOM KOHCpurypa- 
UMOHeH rj>ai/i/i. CTpyKTypaTa v\ cbfltpwaHweTO Ha KOHCpurypaunoHHUfl cpaw/i me 
6"bfle pa3MeflaH b nacrra "Remoting KOHCpurypaunoHHM cpai/i/iOBe". 

MHTep<t>eMCT>T ISponsor 

MHTepcpewcbT isponsor ce HaMupa b npocrpaHCTBOTO ot MMeHa system. 

Runtime. Remoting. Life time. KaKTO CnOMeHaXMe nO-paHO CnOHCOptT e 

o6eKT, komto MMa B/iacrra fla yflt/iwaBa BpeMeTO Ha >kmbot Ha OTfla/ieneHki 
o6eKTM. 3a fla MO>Ke fla ki3n"b/iH*iBa Ta3M po/ia o6eKT"bT Tpa6Ba fla MMn/ieMeH- 
Tupa MHTepcpewca isponsor. EflMHCTBeHnaT MeTOfl Ha to3m MHTepcpewc e 

Renewal ( ILease lease), KOMTO e flecpMHkipaH no C/ieflHklfl HanklH: 



public interface ISponsor 

{ 

TimeSpan Renewal ( ILease lease); 

} 



Lease MeHMflxtptT M3BMKBa to3m MeTOfl, KoraTO xnBOTbT Ha flafleH o6eKT e 
M3TeK"b^, 3a fla noncKa floirb/iHMTe/iHO BpeMe. 

3a fla flo6aBMM cnoHCop kbm flafleH OTfla/ieneH o6eKT MO>KeM fla M3no/i3BaMe 
MeTOfla Ha ILease o6eKTa Register (...) . (3a fla no/iynwM o6eKT ot TaicbB Tun 
Tpa6Ba fla M3BMKaMe MeTOfla GetLifetimeService(...) Ha >xe/iaHMfl OTfla/ieneH 
o6eKT, Ha komto me flo6aBHMe cnoHCop.) AHa/iori/mHO MO>KeM fla npeMaxHeM 

flafleH CnOHCOp OT OTfla/ieneH 06eKT npe3 MeTOfla Unregister(...) Ha ILease. 



// Activation of the object 
Library library = new Library (); 

// Getting lease object associated with current object 
ILease lease = RemotingServices . GetLif etimeService (library) 
as ILease; 

// Creating new sponsor 

MySponsor sponsor = new MySponsor ( ) ; 

// Attaching sponsor to our lease object 
lease . Register ( sponsor ) ; 

// Detaching sponsor from our lease object 
lease . Unregister ( sponsor ) ; 



npeMaxBaHeTO Ha cnoHCopa, nocpeflCTBOM MeTOfla unregister (...) , ot cnn- 
cbKa etc cnoHCopn Ha OTfla/ieneHkisi o6eKT He e 3afl"b/i>KkiTe/iHO, ho Ha npaK- 



HnaBa 22. OTfla/ieneHM M3BMKBaHMfl c .NET Remoting 605 

TMKa, aKO He ce ki3no/i3Ba, boah ao ro/isiMa 3ary6a Ha npoi/i3BOAHTe/iHOcr, tbm 
ioto Remoting cwcreMaTa OTnpaBfl 3aaBKM v\ naKa OTroBop ot bcckm pern- 
CTpupaH cnoHCop. TaKa ne npenoptuwTe/iHO e cnep, KaTO p,ap,eu cnoHCop 
CTaHe HeHyxeH, p,a 6"bAe M3BaAeH ot cnwcbKa Ha Ba/ikiAHi/iTe cnoHCopn. 

Ba>KHa oco6eHOCT Ha K/iacoBeTe, komto nrpa^T po/i*n~a Ha cnoHCopn e, He Te 
pea/iHO ce M3BMKBaT npe3 rpaHMUMTe Ha AOMeMHa Ha npw/io>KeHkieTO. nopaflu 
TOBa cnoHCoptT Tpa6Ba fla 6"bfle OTAa/ieneH o6eKT, komto ce Mapuja/iki3kipa no 
ctomhoct ki/iki no pec|DepeHUMfl. 

CnoHCop, Mapiiia/iM3npaH no ctomhoct 

ripn cnoHCopn, komto ca MapKupaHM eAMHCTBeHO KaTO cepna^M3npyeMM (c 
aTpn6yTa [seriaiizabie]), npw peri/icrpi/ipaHe Ha cnoHCop tom ce Mapwa/iM- 
3npa no ctomhoct ao cbpBtpHaTa CTpaHa. Ot TaM HaTaTbK cbpBtpvr ki3no/i3Ba 
CBoeTO Konne Ha cnoHCopa. ToBa ocurypaBa no-flo6po 6"bp30fleMCTBne tbm 
KaTO cnecTABa Mapuja/iki3i/ipaHeTO Ha cnoHCopa 3a bcako M3BMKBaHe. To3m 
Ha^MH hm Aasa b"B3mo>khoct p,a KOHTpo/iwpaMe >KMBOTa Ha o6eKTMTe ot r/ieAHa 
T04Ka Ha HaTOBapBaHeTO Ha ctpBtpa (KoeTO He BMHarn e noKa3aTe/iHO 3a 
TOBa, fla/iw o6eKT"bT Bee oiue e Hy>KeH Ha Knv\enja\). 3a cb>Ka/ieHkie npn 
peiuaBaHeTO p,ai\v\ p,a yirb/ixki >KMBOTa Ha AaAeH o6eKT cnoHCoptT MO>Ke p,a 
M3no^3Ba caMO i/iHifcopMaui/iflTa, koato MMa Ha ctpBtpa, TbM KaTO e ojp,ei\eu ot 
K/iweHTCKaTa nacr. 

CnoHCop, Mapuja/iii3MpaH no pecpepeHLjusi 

B cnynaw, ne cnoHCopvr HacneAflBa MarshaiByRefobject, tom ce HaMupa npn 
K^neHTa. T"bki KaTO v\wa Aocrbn ao K/ineHTCKaTa nacr, tom Moxe p,a 6a3npa 
CBOMTe peiueHMfl Ha MHCJDopMauMflTa, koato no/iynaBa ot K/iweHTa, KaTO ci\ep,v\ 
onpeAe^eHM HeroBM Cb6kiTi/m v\nv\ CBOMCTBa. 

B to3m c/iynaw B"b3HMKBa c^eAHMAT Btnpoc: aKO Lease o6eKTbT na3M ">kmb" 
OTAa/ieneHi/m ctpBtpeH o6eKT, v\ aKO cnoHCoptT na3M Lease o6eKTa ">kmb", 
KaKBO na3M cnoHCopa ">kmb"? OTroBopvr e, ne npn K/iweHTa Tpa6Ba p,a ce 
A"bp>KM pec|DepeHUMfl kbm cnoHCopa v\ o6mkhob6ho TOBa ce pea/iki3kipa npe3 
4/ieH-npoMeH^MBa Ha hakom noAxoA^iu K/iac. no to3m HanwH K/iweHTbT i/ma 
Bt3MO>KHOCT p,a Aeperi/icrpi/ipa CBOMTe cnoHCopn KoraTO 3aBtpujBa M3n"b/iHe- 
HueTO cm. ToBa MO>Ke p,a ce ocbiuecTBM v\ b MeTOAa Dispose () aKO K/iacvr 
MMn^eMeHTupa MHTepc|DeMca iDisposabie. KaKTO Bene cnoMeHaxMe Aepern- 
CTpupaHeTO Ha cnoHCopa noAo6p*iBa 3Hani/iTe/iHO npow3BOAHTe/iHOCTTa, Tbv\ 
KaTO Lease MeHMA>KtptT He ry6n BpeMe p,a AOCTbnBa HeBa/ikiAeH cnoHCop. 

flpyra xapaKTepHa oco6eHOCT Ha to3m Tun cnoHCopn e, ne Te ca callback 
o6eKTM ot r/ieAHa T04Ka Ha ctpBtpa. riopaAM TOBa v\ nopaAM M3MCKBaHMfl kbm 
curypHOCTTa b .NET 3a p,a pa6oTAT T03M bma cnoHCopn Tpa6Ba p,a yKa>KeM npn 
KOHCJDMrypupaHeTO Ha KaHa/ii/iTe c^eAHMTe CBOMCTBa: 

- K/iweHTbT Tpa6Ba p,a perncTpupa nopT 3a BceKM KaHa^. ToBa e Hy>KHO 3a 
Aa MO>Ke Lease MeHMA>K"bptT p,a MO>Ke p,a M3BMKBa cnoHCopa. no 
npuHunn HflMa 3Ha4eHne touho kom nopT me 6"bAe noAaAeH. flo6pa 
npaKTMKa e Aa ce noAaBa nopT 0, Tbv\ KaTO b to3m c^y^aki Remoting 



606 nporpaMnpaHe 3a .NET Framework (tom 2) 

cucTeMaTa caMa M36npa hakom nopT. KaHa/ivr, HOMepvr Ha nopTa v\ 
MecTOHaxo>KfleHMeTO Ha cnoHCopa ce M3nm:/iflBaT KoraTO ce Mapwa/iki- 
3npa pecpepeHUMATa Ha cnoHCopa ao ctpBtpa. 

>Kmbot Ha Singleton OTfla/ieneHM o6eKTM 

CeMaHTMKaTa Ha Singleton o6eKTMTe M3MCKBa Te fla MMaT HeorpaHi/meH >kmbot. 
nocpeflCTBOM CTaHflapTHMTe npoueflypn 3a onpe,qe/iflHe Ha npofl"b/i>KkiTe/i- 
HOCTTa Ha >KMBOTa b Remoting cwcreMaTa, TOBa e HeB"b3MO>KHO v\i\v\ Haw- 
Ma/iKOTO Heyflo6HO v\ HeecpeKTMBHO. 3a fla ce peiun to3m npo6/ieM npn 
npoeKTupaHeTO Ha Singleton o6eKTa Tpa6Ba fla ce npeflecpMHupa MeTOfla 

InitializeLifetileServiceO Ha 6a30BI/m K/iac MarshalByRefObject no 
c/ieflHkifl Ha^MH: 



public class MySingleton : MarshalByRefObject 

{ 

public override object InitializeLif etimeService 

{ 

// Returning null as Lease object 

// indicates that lease never expires 

return null; 

} 
} 



BptiuawKM null KaTO pe3y/iTaT ot MeTOfla Hue yi<a3BaMe, ne MCKaMe to3m 
o6eKT fla MMa 6e3KpaeH >kmbot. no to3m HanwH cbu\o peiuaBaMe npo6/ieMa etc 
cnoHCopnTe v\ Lease CBOMcmaTa onpefle/iflmw npoflt/iwHTe/iHOora Ha >KMBOTa 
Ha o6eKTa. 

Remoting KOH4>nrypaMMOHHn 4>aiisiOBe 

B HacTOfliuaTa ceKuna me pa3r/ieflaMe KOHCpurypaunoHHMTe cpaw/iOBe Ha 
Remoting MHCppacrpyKTypaTa v\ me flafleM onucaHne Ha TaroBeTe, komto ce 

M3n0^3BaT B TAX. TbM KaTO CbpB"bp"bT M K/lMeHTbT MMaT CBOM Cnei4MCpM4HM 

e^eMeHTM me rn pa3r/ieflaMe nocneflOBaTe/iHO. 

Remoting KOHCpurypaunoHHMTe cpaw/iOBe npeflcraB/iflBaT XML cpaw/iOBe etc 
cneuna/iHa CTpyKTypa. Pa6oTaTa c tax e ziecHa v\ Haw-Ba>KHOTO - Te npefloc- 
TaBAT rbBKaB HanwH 3a KOHCpurypupaHe Ha npn^OKeHna 6e3 fla ce Ha/iara 
npeKOMnn^npaHe (3a pa3/ii/iKa ot BapnaHTa, b komto HacTpoMKMTe ca 3afla- 
fleHM b nporpaMHMfl koa). B npaKTMKaTa e cm/iho npenoptuwTe/iHO fla kohcpm- 
rypaunflTa fla ce fl"bp>Ki/i b XML a He b nporpaMHua koa. 

3a fla HaKapaMe Remoting cwcreMaTa fla i/i3no/i3Ba to3m cpaw/i Tpa6Ba fla 

M3BMKaMe CTaTM4HMfl MeTOfl RemotingConf iguration . Configure (...) C eflMH- 

CTBeH napaMeTtp - ntTAT v\ MMeTO Ha KOHCpurypaunoHHua rj>ai/i/i: 



RemotingConf iguration . Configure ( "remoting . conf ig" ) ; 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 607 

rivrflT flo <£aM/ia, MMeTO v\ pa3UJnpeHneT0 My HAMaT 3HaneHkie, ocBeH b cnynai/i 
Ha xoctmht Ha aceM6^maTa cbc cno,ae;ieHMTe K/iacoBe b IIS . Remoting koh- 
cJDnrypaunoHHMTe <\>av\i\OBe ca flont/iHMTe/iHw v\ ca OTfle/iHM ot KOHCJDi/irypauw- 
OHHMTe fyawnose Ha npw/io>i<eHMeTO. 

C/iefl KaTO CMe M3BMKa/iM to3m MeTOA MOxeM fla npucTtnuM kbm aKTMBupaHe v\ 
M3no^3BaHe Ha OT,qa/ieneHi/iTe o6eKTM 6e3 HMKaKBM no-HaTaTbiuHki rpn>KM 3a 
KaHa/iki m cJDopMaTepn. 

CTpyKTypa m e/ieMeHTM Ha KOHCpMrypauMOHHMn cpaft/i 

B Ta3M nacr ot r/iaBaTa me pa3r/ieAaMe noApo6HO noBeneTO ot e/ieMeHTkiTe, 
komto MoraT fla ce cbfltpwaT b KOHCJDMrypauMOHHMfl §av\n Ha npi/i/io>KeHkie, 
ki3no/i3Bamo Remoting. OcBeH Ha/iwuweTO Ha npeflecJDMHupaHMTe XML TaroBe, 
b onpefle/ieHM cnynaw e Ba>KHO v\ thxhoto pa3no/io>KeHMe cnp^MO ocraHa/iMTe 
TaroBe b KOHCJDMrypaunflTa. IHe 3anonHeM pa3r/ie>KflaHeTO ot KopeHa Ha XML 

flOKyMeHTa - TOBa e TarbT <configuration>. 

<configuration> 

To3M Tar e KopeHvr Ha bcmukm e/ieMeHTM bbb (patina. Tpa6Ba fla ce cpeiua 

TOUHO BeflH"b>K. 

< system. runtime, remoting > 

HaMupa ce 3afl"b/i>KkiTe/iHO KaTO no,q-e/ieMeHT Ha <configuration>. B to3m Tar 
Tpa6Ba fla ce HaMnpaT bcmukm enewemw CBtp3aHM c KOHCJDwrypi/ipaHeTO Ha 
Remoting MHCJDpacTpyKTypaTa. Mo>Ke fla ce cpeiua caMO BeflH"b>K. 

<application> 

ripeflCTaB/lflBa 3afl"b/l>KklTe/lHO nOfl-e/ieMeHT Ha <system. runtime. remoting>. 

Ctfltpxa BCM4KM cneukic|DM4HM 3a npi/i/ioxeHkieTO flaHHM. Mo>xe fla ce cpeiua 

CaMO BeflH"b>K. 

V\wa He3afl"b/i>KMTe.neH aTpn6yT name, komto yKa3Ba MMeTO Ha npi/i/io>KeHMeTo: 



<application name="RemotingApp"> 
</application> 



<lifetime> 

HaMupa ce BMHarn nofl e/ieMeHTa <appiication>. C/iy>Kki 3a KOHC^nrypupaHe 
Ha BpeMeTO Ha >kmbot Ha o6eKTMTe. Ba>KM 3a bcmukm o6eKTM Ha TOBa npw/io- 
>KeHne. Te3M HacrpoMKki ce OTHacsiT 3a o6eKTMTe c K/ineHTCKa aKTMBauna v\ 3a 
Singleton o6eKTMTe. Te MMaT ec|DeKT caMO b KOHCJDMrypauMOHHMfl <\>av\n ua 
cbpBtpa, T.e. aKO b KOHCJDkirypaukiOHHkifl <\>av\n ua K/iweHTa vw\a TaicbB Tar, tom 
6nBa nrHopupaH. KoHclDnrypupaHeTO Ha BpeMeHaTa, CB"bp3aHM c >KM3HeHMfl 
UkiK"b/i, CTaBa npe3 aTpn6yTMTe Ha Tara: 



608 nporpaMnpaHe 3a .NET Framework (tom 2) 

- leaseTime - BpeMeTO "Ha 3aeM" Ha BceKM o6eKT, CB"bp3aH c flafleHOTO 
npn^OKeHne. no noflpa36npaHe MMa ctomhoct 5 MMHyTM. 

- sponsorshipTimeout - BpeMeTO, KoeTO Lease MeHMfl>K"bp"bT M3naKBa 
OTroBopa Ha cnoHCopa cnep, KaTO ro yBeflOMM ne flafleH Lease e ki3Teicb/i. 
Ako cnoHCoptT He OTroBopn b to3m nepnoA o6eKT"bT nofl^e>KM Ha 
ocBo6o>KAaBaHe ot CMcreMaTa 3a cb6wpaHe Ha 6oK/iyKa. no noApa36n- 
paHe BpeMeTO e 2 mmhytm. 

- renewOnCallTime - BpeMeTO, C KOeTO ce yBe/lMHaBa npOA"b/l>KMTe/lHOCT- 

Ta Ha >KMBOTa Ha o6eKT, npM bcako HeroBO M3BMKBaHe. 3a noBene 

nOAP06HOCTM OTHOCHO HaHMHa Ha M34MC^flBaHe Ha AOirb/lHMTe/lHOTO 

BpeMe BM>KTe nacrra "MHTepcpeMCtT iLease". rioApa36MpaiuaTa ce ctom- 

HOCT e 2 MMHyTM. 

- leaseManagerPollTime - BpeMeTO, KOeTO Lease MeHMA>K"bp"bT M3naKBa, 

cnep, KaTO e npoBepM/i CMCTeMaTa 3a Lease o6eKTM c M3TeK/io BpeMe, 
npeAM Aa 3anonHe HOBa npoBepKa. no noApa36MpaHe nepMOAt>T e 10 
ceKyHAM. 

EAMHMUMTe 3a M3MepBaHe Ha BpeMeTO ce 3anMCBa BeAHara cneA CTOMHOcrra 3a 

BCeKM aTpM6yT. CMMBO/lMTe 3a MepHMTe eAMHMUM He Ca 3aBMCMMM ot T/iaBHM M 

Ma^KM 6yKBM. Ba^MAHMTe ctomhoctm ca : 

- D - AHM 

- h - 4acoBe 

- M - MMHyTM 

- s - ceKyHAM 

- MS - MM^MCeKyHAM 

Eto KaK M3Me>KAa <iifetime> ceKUMATa b eAMH npMMepeH KOHCpMrypauMOHeH 



<application> 
<lif etime 

leaseTime="3m" 
sponsorshipTimeout="3 0s" 
renewOnCallTime="lm" 
leaseManagerPollTime="7 5 0ms" /> 

</application> 



<service> 

npeACTaB^flBa noA-e/ieMeHT Ha <appiication>. He e 3aA"b/i>KMTe/ieH e/ieMeHT 
m MO>Ke Aa ce cpeiua noBene ot BeAH"b>K b paMKMTe Ha eAMH KOHCpMrypa- 
UMOHeH cpaki/i. l/l3no/i3Ba ce KaTO KOHTeMHep, b komto ca M36poeHM m onMcaHM 
bcm4km OTAa^e^eHM TMnoBe, komto cbpB"bp"bT npeAOcraBsi 3a M3no^3BaHe. 
flopaAM TOBa MMa CMMCb/i caMO b npM/io>KeHMfl, komto Mrpa^T po/iflTa Ha 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 609 

cbpBtp. TtM ioto flafleHO npi/i/io>KeHi/ie MO>Ke fla 6"bfle eflHOBpeMeHHO KaKTO 
K^neHT TaKa v\ ctpBtp, to3m Tar e cbBMecri/iM c Tara <ciient>. B to3m Tar ce 
ctA"bp>KaT TaroBeTe <weiiknown> m <activated>, komto ca pa3r/ieAaHki no- 
AO/iy. 

<client> 

npeACTaB^flBa noA-e/ieMeHT Ha <appiication>. He e 3aA"b/i>KMTe/ieH e/ieMeHT 
m MO>Ke Aa ce cpeiua noBene ot BeAH"b>K. C/iy>Kki 3a KOHTei/iHep, b komto ca 
M36poeHM m onucaHM TunoBeTe Ha OTAa/ieneHkiTe o6eKTM, komto npw/io>Ke- 
HkieTO Moxe Aa w3no/i3Ba. Moxe Aa cbAtpwa TaroBeTe <weiiknown> v\ 
<activated>. MMa cnep,uv\je aTpn6yTn: 

- uri - onpeAe/ia URL aApeca, komto ce ki3no/i3Ba 3a aKTMBupaHe Ha 
K/iweHTCKM o6eKTM. Ako npn^OKeHneTO M3no/i3Ba TaKtB Tun o6eKTM, 
to3m aTpn6yT e 3aA"b/i>KkiTe/ieH. 

- dispiayName - ki3no/i3Ba ce caMO ot npi/i/io>KeHi/ieTO Admin Tool, 3a Aa 
MO>Ke noTpe6nTe^MTe My Aa OT/iwuaBaT BM3ya/iHO pa3/ii/mHkiTe TaKMBa 
TaroBe, KoraTO ca i/i3no/i3BaHki noBene ot eAHH. To3m aTpn6yT e He3a- 

A"b/l>KMTe/ieH. 

<wellknown> 

Mo>Ke Aa ce i/i3no/i3Ba KaTO noA-e/ieMeHT caMO Ha TaroBeTe <service> v\ 
<ciient>. M b ABaTa cnynafl to3m Tar e He3aAt>/i>KkiTe/ieH v\ MO>Ke Aa ce cpeiua 
noBene ot BeAHtx. Ttw KaTO Me>KAy HanwHkiTe, no komto ce M3no/i3Ba b ABaTa 
c/iynaa, MMa pa3/iwni/m, me vv\ pa3r/ieAaMe nooTAe/iHO. 

B KOHCJDMrypauMOHHMfl <\>av\i\ Ha cbpBtpa to3m Tar ce HaMupa noA Tara 
<service>. Tom onucBa OTAa/ieneHkiTe TunoBe etc cbpBtpHa aKTMBauna, 
npeA/iaraHM ot ctpBtpa. Hpe3 Hero ce onucBaT singiecaii v\ singleton 
o6eKTMTe. MMa ci\ep,uv\je 3aA"b^>KMTe/iHM aTpn6yTn: 

- mode - Tuna Ha aKTMBupaHna Ha cbpBtpa o6eKT. Ba/ikiAHkiTe ctomhoctm 

ca SingleCall M Singleton. 

- type - 03HanaBa nt/iHHsi Tun Ha o6eKTa. MMa cnep,uv\s\ c|DopMaT: 



<ni>/ieH Tun Ha o6eKTa>, <aceM6/in, b KoeTO ce Harmpa Tnni>T>, 

Version = <Bepcnji>, PublicKeyToken = <ny6/iMHeH kjik>h Ha cm/iho MMe- 
HyBaHOTO aceM6/in>, Culture = <Ky/iTypa> 



Version, PublicKey Token M Culture ce M3nO/13BaT CaMO npn Ckl/IHO MMeHy- 

BaHM aceM6/ikiTa. 

- objecturi - URI aApec Ha OTAa/ieneHi/ifl o6eKT, kbm komto K/iweHTbT ce 
o6p"biua. Tpa6Ba Aa 6"bAe yHMKa/iHO 3a BceKM Tun b npw/io>KeHi/ieTO. 
3aBMCMM e ot Ma/iKM m MaBHM 6yKBM. Oco6eHOCT npn to3m aTpn6yT e, ne 
KoraTO o6eKT-bT ce AOCTbnBa npe3 IIS (Internet Information Services), e 
Hy>KHO tom Aa 3aB"bpwa c pa3UJnpeHne .soap. floBene 3a ki3no/i3BaHeTO 



610 nporpaMnpaHe 3a .NET Framework (tom 2) 

Ha Remoting 4pe3 IIS MO>KeTe fla HaMepnTe b ^acTTa " Remotinq 
cueHapnn ". 

B KOHCpurypaunoHHMfl cpai/i/i Ha K/iweHTa <weiiknown> onucBa TunoBeTe etc 
ctpBtpHa aKTMBaunfl, komto K/iweHTbT ki3no/i3Ba. ATpn6yTMTe, komto ce 
ki3no/i3BaT b T03M c/iynaw ca: 

- type - 03HanaBa nt/iHWfl Tkin Ha o6eKTa. MMa ctiunfl cpopMaT KaTO 
cnynan etc CbpBtpHaTa KOHCpurypauna. 

- uri - aApectT, komto Tpa6Ba fla ce M3no/i3Ba, 3a fla Moxe K/ikieHTbT fla 
ce CB"bp>xe etc ctpBtpa v\ HeroBkue TunoBe. CbfltpwaHweTO Ha to3m 
aflpec 3aBncn v\ ot TOBa fla/ii/i b <appiication> Tara e BtBefleHO MMe Ha 
npn^OKeHneTO. 

3a fla npeflCTaBMM Har/ieflHO KOHCpurypaunoHHMTe b"B3mo>khoctm HeKa pa3r/ie- 
flaMe c^eflBaiflMTe flBa npuMepa. KoHCpurypauna Ha Remoting cbpBtp: 



server . conf ig 



<service> 

<wellknown mode="SingleCall" 

type="CommonTypes . Query, CommonTypes" 
ob j ectUri="Query" /> 
<wellknown mode="Singleton" 

type="CommonTypes . Library, CommonTypes" 
ob j ectUri="Library" /> 
</service> 



KoHCpurypaunfl Ha Remoting \u\v\em: 



client . conf ig 



<client> 

<wellknown type="CommonTypes . Query, CommonTypes" 

url="http : //remoting_server : 12 3 4 /Query" /> 
<wellknown type="CommonTypes . Library, CommonTypes" 
url="http : //remoting_server : 12 34/Library" /> 
</client> 



< activated > 

npeflcraB/iflBa no,q-e/ieMeHT Ha TaroBeTe <service> i/i <ciient> cbOTBeTHO b 
ctpBtpHMfl m b K^neHTCKMfl KOHCpwrypauwoHeH cpaki/i. OnucBa TunoBeTe c 
K^neHTCKa aKTMBaunfl, komto npn^OKeHneTO npefl/iara v\nv\ M3no/i3Ba. He e 
3afl"b^>KMTe^eH e/ieMeHT v\ MO>Ke fla ce cpeiua MHoroKpaTHO b Te3M flBe ceKunn. 
MMa eflMH 3afl"b/i>Ki/iTe/ieH aTpn6yT type, komto ce M3no/i3Ba v\ b flBaTa cnynafl 
3a onucBaHe Ha nt/iHHsi Tun Ha OTfla/ieneHi/ifl o6eKT. Eto npuMep 3a kohcpm- 
rypupaHe Ha K/iweHTCKa aKTMBauna ot CTpaHa Ha cbpBtpa: 



HnaBa 22. OTfla/ieneHM M3BMKBaHHfl c .NET Remoting 611 



server . conf ig 



<service> 

<activated type="CommonTypes . Book, CommonTypes" /> 
</service> 



Eto KaK M3Me>Kfla cbOTBeTHaTa KOHCJDMrypauMfl ot crpaHa Ha K/iweHTa: 



client . conf ig 



<client> 

<activated type="CommonTypes . Book, CommonTypes" /> 
</client> 



<channels> 

llpeflCTaB/lflBa nOfl-e/ieMeHT Ha Tara <system. runtime. remoting> V\I\V\ 
<application>. 

KoraTO ce HaMkipa riOfl <system. runtime . remoting>, C T03M Tar ce p,e<\>V\- 

HupaT hobm KaHa/iki, Cb3p,ap,euv\ ot pa3pa6oTni/iKa. 

B c/iynaa, KoraTO tom ce HaMupa nofl <appiication>, KOHCJDMrypupaMe Bene 
ctiuecTByBaiun v\nv\ Bene onucaHM KaHa/iki b ceKun^Ta <channeis> nofl 

<system. runtime . remoting>. 

CTaHAapTHMTe KaHa/iw KaTO TCP v\ HTTP KaHa/iMTe ca onucaHM bbb qbai/i/ia 
machine . conf ig. Ako MCKaMe fla npoMeHMM TAXHOTO noBefleHne r/io6a/iHO, 3a 
Ufl^aTa MaujMHa, MO>KeM fla peflaKTupaMe to3m cfjaM/i, ho TOBa He e npeno- 
P"b4MTe^Ha npaKTMKa, Tbv\ KaTO MO>xe fla otbopmm flynKa b ckirypHOcrra Ha 
MaujMHaTa. flpyr npo6/ieM e, ne aKO HaiueTO npn^OKeHne M3MCKBa TaKMBa 
npoMeHM, to TpyflHO 6m homo fla ce pa3npocrpaHflBa, tbm KaTO Tpa6Ba fla ce 
Ha/iara aflMMHMCTpaTMBHa HaMeca b npoueca Ha wHcra/ikipaHe, a cbiuo TaKa e 
Bt3MO>KHO fla ce no/iynaT HecbBMecTMMOCTM c flpyrn npw/io>KeHi/ifl, komto 
pa34MTaT Ha craHflapTHMTe HacTpoMKM. 3aTOBa e no-flo6pe fla ce i/i3no/i3BaT 
^OKa^HO flecJDMHupaHM KaHa/iw. 

<channel> 

Moxe fla ce M3no/i3Ba KaTO nofl-e/ieMeHT Ha <channeis> 6e3 3HaneHwe Kbfle 
ce HaMupa poflkiTe/iCKaTa ceKuna. C to3m Tar ce KOHCJDkirypwpaT napaMeTpnTe 
Ha BceKM eflMH ot KaHa/ikiTe, komto npw/io>KeHkieTO i/i3no/i3Ba. Mo>xe fla ce 
cbfltp>Ka b eflHa <channeis> ceKunfl noBene ot BeflHtx. nopaflu TOBa, ne b 
3aBMCMMOCT ot pa3no/io>KeHkieTO Ha poflMTe^CKMfl Tar, Ta3M CeKUMfl MMa 
pa3/ikinHO 3HaneHkie, me pa3r/ie,qaMe flBaTa cnynafl no OTfle/iHO. 

KoraTO <channels> ce HaMkipa nOfl <system. runtime . remoting> MO>KeM fla 

pa3Me>KflaMe Ta3M ceKuna KaTO Lua6/iOH Ha KaHa/ia. TarbT <channei> onucBa 
KaHa/ia v\ hakom ot HeroBMTe CBOMCTBa KaTO HanpuMep: 



612 nporpaMnpaHe 3a .NET Framework (tom 2) 

- id - yHMKa/mo MMe Ha KaHa/ia, KoeTO ce i/i3no/i3Ba 3a pecpepupaHe Ha 
KaHa/ia b flpyrn nacm Ha KOHCpurypaunoHHUfl cpai/i/i. He Tpa6Ba fla ce 
AonycKaT KaHa/in c eAHaKBM id aTpn6yTM, TbM KaTO napceptT He npeAy- 
npe>KAaBa 3a rpeujKa, a M3no/i3Ba HaBCAKbAe nocneAHO AeK/iapwpaHWfl 
KaHa/i c TOBa id. To3m aTpn6yT e 3aA"b/i>KkiTe/ieH. 

- type - irb/iHO MMe Ha K/iaca, komto i/iMn/ieMeHTkipa KaHa/ia. OnucBa ce b 
ctiuMfl cpopMaT, komto ce M3no/i3Ba npn aTpn6yTa type Ha Tara 
<weiiknown>. 3aA"b/i>KkiTe/ieH aTpn6yT. 

- name - MMe Ha KaHa/ia. M3no/i3Ba ce, KoraTO ce Ha/iara p,a ce perncT- 
pupa eAMH m cbiu Kanan, komto p,a "c/iywa" Ha noBene ot eAHH nopT. 

- priority - npnopnTeT Ha KaHa/ia cnpaMO APyrnTe perncTpupaHM ot 
npw/ic»KeHkieTO Kananw. ripn 3aaBKa kbm cbpBtpa Remoting cwcreMaTa 
M3no^3Ba Ta3M MHCpopMaunfl, 3a Aa HaMepn noAxoA^iu Kanan 3a Bp"b3Ka. 
no-ro/iHM npnopnTeT MMaT Kananv\je c no-ro/iAMa ctomhoct Ha to3m 
aTpn6yT. CTaHAapTHMTe Kananw, komto ca nacr ot .NET Framework, 
MMaT npnopnTeT paBeH Ha 1. OTpkiuaTe/iHkiTe nwc/ia ca chuxo Ba/ikiAHM 

CTOMHOCTM. 

- dispiayName - M3no/i3Ba ce caMO ot npi/i/io>KeHkieTO Admin Tool, 3a Aa 
MO>xe noTpe6nTe^MTe My Aa OT/ii/maBaT Bki3ya/iHO pa3/ii/mHi/iTe TaKMBa 
TaroBe, KoraTO ca i/i3no/i3BaHki noBene ot eAHH. To3m aTpn6yT e He3a- 

At>/l>KI/ITe/ieH. 

- CneuncpM4HM 3a KaHa/ia CBOMCTBa. TbM KaTO CBOMCTBaTa Ha Kananv\je He 
ce KOHTpo/iwpaT ot Remoting MHCppacrpyKTypaTa v\ BceKM KaHa/i MO>Ke 
Aa MMa cneukicpM4HM M3MCKBaHMfl, npe3 Ta3M cneuwa/iHa rpyna ot 
aTpn6yTM MO>xe Aa ce noAaBaT cneuncpn^HMTe ctomhoctm. 3a tax HflMa 
npeAecpMHupaHM aTpn6yTM. OopMaTbT, b komto ce noAaBaT CTOMHOCTMTe, 
e k/ik)4-ctomhoct. 3a no-Har/ieAHO npeAcraBHHe HeKa pa3r/ieAaMe eAHH 
npuMep: 



<channel id="customChannel" 

type="CommonTypes . Channels . CustomChannel, CommonTypes" 

myProperty="myValue" 

author="Viktor Zhivkov" /> 



KoraTO i/i3no/i3BaMe <channeis> b paMKMTe Ha <appiication> Tara Hue ce 
o6p"bmaMe KtM Bene AecpMHupaH KaHa/i b Apyra <channeis> ceKuna v\nv\ b 
machine . config cpaw/ia. B to3m c/iynaw Tpa6Ba Aa yKaxeM cnep,uv\je 3ap,-bi\- 
>KMTe^HM aTpn6yTn: 

- ref - 03Ha4aBa MMeTO (id aTpw6yTa) Ha Lua6/iOHa, komto pecpepupaMe. 

- port - HOMepa Ha nopTa, Ha komto KaHa/itT Tpa6Ba Aa "c/iywa". B 
K^neHTCKMTe KOHCpurypaunoHHM cpaw/iOBe motom Aa 3aAaAeM ctomhoct 
0, npn KoeTO Remoting cwcreMaTa aBTOMaTMUHO M36npa BMecTO Hac 
noAxoAflLUMfl nopT 3a Bp"b3Ka. 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 613 

KaHa/iMTe MMaT v\ Apyrn aTpn6yTM ocBeH M36poeHMTe 3afl"b/i>KMTe/iHM. IHe 
pa3r/ie,qaMe nooT,qe/iHO cnncbKa c aTpn6yTM Ha craHflapTHMTe BrpafleHM HTTP 
m TCP KaHa/iM. 

ATpn6yTM Ha HTTP KaHa/i: 

- clientConnectionLimit - Onpefle/lfl MaKCMMa/lHMfl 6pOM Ha eflHOBpe- 

MeHHMTe Bpt3KM 3a flafleH KaHa/i. no noApa36npaHe MMa ctomhoct 2. 

- proxyName - MMe Ha npoKCM ctpBtp. no T03M Hani/m ce KOHclDnrypupa 
Remoting MHCJDpacTpyicrypaTa fla M3no/i3Ba npoKCM ctpBtp. 

- proxy-Port - nopT Ha npoKCM cbpBtpa, komto fla ce M3no/i3Ba 3a 
KOMyHMKaunfl. YnoTpe6flBa ce 3aeAHO c proxyName aTpn6yTa. 

- useipAddress - 6y/ieBa ctomhoct 3a TOBa fla^n b URL aflpeckue Ha 
npeflocTaBAHMTe TunoBe ce M3no/i3Ba IP aflpec (true) v\nv\ MMe Ha 
MaujMHa (false). ripw/icoKHM e caMO b KOHCJDkirypauwflTa Ha ctpBtpa. no 
noApa36npaHe MMa ctomhoct true. 

- machineName - MMe Ha MaujMHaTa, KoeTO fla ce i/i3no/i3Ba npn KOMyHM- 
Kaui/ia BMecTO mctmhckoto m MMe. Ako e noflafleHa ctomhoct aBTOMa- 

TMUHO aTpn6yT"bT useipAddress npneMa CTOMHOCT false. 
ATpn6yTM Ha TCP Kanan: 

- useipAddress - 6y/ieBa ctomhoct 3a TOBa fla/iM b URL aflpecMTe Ha 
npeflocTaBAHMTe TMnoBe ce M3no/i3Ba IP aflpec (true) v\nv\ MMe Ha 
MaujMHa (false). ripM^o>KMM e caMO b KOHCJDMrypauMflTa Ha ctpBtpa. no 
noflpa36MpaHe MMa ctomhoct true. 

- rejectRemoteRequests - 6y/ieBa CTOMHOCT, KOflTO 3aflaBa fla/lM fla ce 
OTXB"bp/lflT Bp"b3KM OT flpyTM MailJMHM. KoraTO MMa CTOMHOCT true Ca 

pa3peiueHM caMO M3BMKBaHMfl Me>Kfly npouecMTe Ha eflHa MaujMHa. 
<channelSinkProviders> 

HaMMpa ce nOfl Tara <system. runtime. remoting> M C/iy>KM 3a KOHTeMHep Ha 

TaroBeTe, onMCBaiflM Tp"b6MTe Ha KaHa/ia (channel sink). Ta3M ceKUMfl ot 
KOHCJDMrypauMOHHMfl cpawyi He e 3afl"b/i>KMTe/iHa m MO>Ke fla ce cpeiua nav\- 
mhoto BeflH"b>K BtB (fcai/i/i. Ba^MflHMTe nofl-e^eMeHTM Ha to3m Tar ca 

<serverProviders> M <clientProviders> 

<serverProviders> 

To3M e/ieMeHT MO>Ke fla 6"bfle M3no/i3BaH KaKTO nofl Tara 

<channelSinkProviders>, TaKa M nOfl <channel>. TOM C/iy>KM 3a flec|DMHMpaHe 

m KOHCJDMrypMpaHe Ha flocraBUMUMTe (providers) ot crpaHa Ha ctpBtpa. 

no aHa/iorMfl c KaHa^MTe ntpBaTa ynoTpe6a flec|DMHMpa hob sink provider, a 
BTopaTa KOHCJDMrypMpa Bene cbiuecTByBaiu. CTaHflapTHMTe flocraBUMUM ca 
flec|DMHMpaHM BtB <£aM/ia machine . config. To3M Tar MO>Ke fla ce ynoTpe6*iBa 

CaMO BeflH"b>K. 



614 nporpaMnpaHe 3a .NET Framework (tom 2) 

CraHflapTHkiTe flocraBUMUki v\ cpopMaTepn Ha KaHa/ia ce npeKOHCpurypupaT, 
aKO M3no^3BaMe to3m Tar 3a pecpepwpaine v\nv\ fleK/iapwpaHe b <channei> 
ceKUkiflTa. B T03M c/iynai/i Tpa6Ba fla M36ponM bcm^km flOCTaBUkiuki v\ cpopMa- 
Tepn, komto me 6"b,qaT M3no/i3BaHM ot KaHa/ia. HanpuMep, aKO flo6aBi/iM b 
KOHCpurypaunoHHMfl cpai/i/i Ha K/iweHTa flocraBni/iK, a cnep, TOBa cpopMaTep, me 
no/iynwM M3K^K)4eHne (exception), aKO flocraBni/iK"bT He MMn/ieMeHTwpa HyxeH 
Ha cpopMaTepa MHTepcpewc. 

B Ta3M ceKUkia MoraT fla ce ki3no/i3BaT TaroBeTe <formatter> v\ <provider>. 
<clientProviders> 

TarbT <clientProviders> e aHa/lOTMHeH Ha <serverProviders>, C Ta3M 

pa3/ikiKa, ne flecpMHupa v\ KOHCpurypupa flocraBUkiukiTe ot crpaHa Ha K/iweHTa. 
< provider > 

M3nO/13Ba ce B ceKUMMTe <serverProviders> M <clientProviders>. OnMCBa 

sink provider Ha KaHa/ia, 3a komto ce OTHaca. Mo>xe fla ce cpeiua Hyna v\i\v\ 
noBene nvrw b eflHa ceKuna. 3a KOHCpurypupaHe ce ki3no/i3BaT cneflHMTe 
3afl"b^>KMTe^HM aTpn6yTn: 

- id - yHMKa/iHO MMe Ha flocraBUMKa, KoeTO me ce ki3no/i3Ba 3a 
pecpepupaHe. 

- type - nt/ieH Tkin Ha K/iaca, 4mato MHCTaHuna me 6"bfle flocraBUMKa. 
OopMaTtT Ha to3m aTpw6yT e cbu\v\s\T, KaKTO Ha .qocera pa3r/ie>KflaHkiTe 
aTpn6yTM <type>. 

- ref - nocouBa id Ha flocraBUMKa, komto ce pecpepupa. He MO>Ke fla ce 

kl3nO/13Ba B CeKUMM, KOMTO flecpkiHkipaT TaKMBa. 

OcBeH Te3M aTpn6yTM MO>KeM fla noflafleM Ha KOHCTpyKTopa Ha flocraBUMKa 
napaMeTpn npe3 cbfltpxaHneTO Ha <provider> Tara. Ot vnep.ua TOUKa Ha 
Remoting ci/icreMaTa, H^Ma 3HaneHkie KaKBO e MMeTO Ha Tara BtTpe, Tbv\ KaTO 
tom ce noflaBa KaTO DOM CTpyKTypa. Bcmukm XML aTpn6yTM v\ XML crpyKTypw 
b T03i/i Tar ce noflaBaT Ha KOHcrpyKTopa Ha flocraBni/iKa, onucaH b KOHCpury- 
paunflTa. BceKM eflMH ot flocraBni/iukiTe Tpa6Ba fla MMa KOHCTpyKTopn, komto 
npneMaT iDictionary v\i\v\ icoiiection KaTO BxoflHM napaMeTpw. PenHki- 
KOBaTa KO/ieKuwfl ce ki3no/i3Ba 3a KOHTeMHep Ha noflafleHMTe aTpn6yTM, a 
KO^eKunflTa - 3a DOM crpyKTypaTa Ha e/ieMeHTa v\ HeroBMTe nofl-e/ieMeHTM. 

Eto TaKa M3Me>Kfla nacr ot eflMH npuMepeH KOHCpurypaunoHeH cpaw/i. TarbT 

<filter>, KaKTO M aTpn6yTMTe mode, mask, ip Lfle 6"bflaT M3nO/13BaHM KaTO 

napaMeTpn 3a i/mcraHUkipaHeTO Ha flocraBUMKa ot Tun ipFiiter (to3m Tun e 
M3Mkic/ieH 3a npuMepa, He ro TbpceTe b .NET Framework!). 



<system. runtime . remoting> 
<channels> 

<channel ref="tcp" port="1234"> 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 615 



<server Provider s> 

<provider ref=ipFilter" mode="accept"> 

<filter mask="255.255.255.255" ip="192 . 168 . 1 . 1" /> 
</provider> 
</ server Provider s> 
</channel> 
</channels> 

<channelSinkProviders> 
<serverProvider> 

<provider id="ipFilter" 
type="CommonTypes . Providers . IpFilter, CommonTypes" /> 

</ server Provide r> 
</channelSinkProviders> 
</system. runtime . remoting> 



<formatter> 

M3nO/13Ba ce KaTO nOA-e/ieMeHT Ha <serverProviders> M 

<ciientProviders>. KoHCJDkirypwpa KaKtB c|DopMaTep me M3no^3Ba p,ap,eHwnT 
Kanan. Ako 6"bfle nponycHaT, ce ki3no/i3Ba noflpa36npaiunflT ce c|DopMaTep. 
Mo>Ke fla ce M36poaT hako/iko c|DopMaTepa, komto p,a o6pa6oTBaT nocneAO- 
BaTe/iHO AaHHMTe, npeMMHaBaiun npe3 KaHa/ia. B to3m c/iynaw APyraTa CTpaHa 
b KOMyHMKaunflTa Tpa6Ba fla 6"bfle KOHCJDi/irypwpaHa etc ctiuaTa noc/ieAOBa- 
Te/iHOcr ot cJDopMaTepn. 3a KOHCJDkirypwpaHe Ha c|DopMaTepa ce ki3no/i3BaT 
c^eAHMTe aTpn6yTn: 

- id - yHMKa/iHO MMe Ha c|DopMaTepa, KoeTO me ce n3no/i3Ba npn 
pecJDepupaHe. 

- type - nt/ieH Tun Ha K/iaca, ni/mTO kiHcraHui/m me 6"bAe c|DopMaTep. 
OopMaTtT Ha to3m aTpw6yT e cbuxwn, KaKTO b Aocera pa3r/ie>KAaHi/iTe 
aTpn6yTM <type>. 

- ref - nocouBa id Ha c|DopMaTepa, komto ce pecJDepupa. He MO>xe p,a ce 

M3n0^3Ba B CeKUMM, KOMTO AecJDMHupaT TaKMBa. 

- typeFilterLevel - OnpeAe^fl HMBOTO Ha n03BO/ieHMTe M3BMKBaHMfl. MMa 

ABe ctomhoctm: low m Full. noApa36npaiuaTa ce ctomhoct low He 
no3BO^ABa o6p"biueHMfl ot Tun callback. B cnynaw, ne hm ce Ha/iara p,a 
M3no^3BaMe TaKMBa, Tpa6Ba p,a npoMeHMM Ta3M ctomhoct Ha Full. Haw- 
necraTa npwuwHa 3a npoMHHa Ha Ta3M HacrpofiKa Ha c|DopMaTepa e 
i/i3no/i3BaHeTO Ha cnoHCopn c Mapuja/iki3aukifl no pec|DepeHUMfl (Te MMaT 
Hy>KAa ot callback M3BMKBaHMfl). 

riOAo6HO Ha AOcraBUkiukiTe, v\ cJDopMaTepnTe MoraT p,a 6"bAaT <£i/iho kohc|dm- 
rypupaHM c noTpe6wTe/iCKM aTpn6yTM v\ TaroBe b <formatter> ceKun^Ta. 
ripouectT e aHa/iorwueH Ha pa3r/ieAaHi/m no-rope. 



616 nporpaMnpaHe 3a .NET Framework (tom 2) 

flea pea/i hm KOHCpMrypauMOHHM cpausia - npMMep 

3a fla o6o6lumm v\ npnAafleM cpopMa Ha HaTpynaHMTe ao TyK cpaKTM 3a kohcpi/i- 
rypaunoHHMTe cpaw/iOBe, HeKa pa3r/ieAaMe ABa ua/iocthm pea/iHM npuMepa: 

ripuMep 3a ufl/iocreiH KOHCpurypaunoHeH cpaw/i 3a Remoting MHCppacrpyKTy- 
paTa ot CTpaHa Ha ctpBtpa: 

server . conf ig 



<conf iguration> 

<system. runtime . remoting> 

<application name="RemotingApp"> 
<service> 

<wellknown mode="SingleCall" 

type="CommonTypes . Query, CommonTypes" 
ob j ectUri="Query" /> 
<wellknown mode="Singleton" 

type="CommonTypes . Library, CommonTypes" 
ob j ectUri="Library" /> 
<activated type="CommonTypes . Book, Book" /> 
</service> 
<channels> 

<channel ref="tcp" port="1234"> 
<server Providers > 

<formatter ref="binary" typeFilterLevel="Full" /> 
</ server Provider s> 
<client Provider s> 

<formatter ref="binary"/> 
</ client Provider s> 
</channel> 

<channel ref="http" port="1235"> 
<server Provider s> 

<formatter ref="soap" typeFilterLevel="Full" /> 
</ server Provider s> 
<client Provider s> 

<formatter ref="soap"/> 
</ client Provider s> 
</channel> 
</channels> 
</application> 
</system. runtime . remoting> 
</conf iguration> 



ripuMep 3a ufl/iocreH KOHCpurypaunoHeH cpaw/i 3a Remoting MHCppacrpyKTy- 
paTa ot CTpaHa Ha K/ii/ieHTa: 



client . conf ig 



<conf iguration> 

<system. runtime . remoting> 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 617 



<application name="RemotingApp"> 
<lif etime 

leaseTime="3m" 
sponsorshipTimeout="3 0s" 
renewOnCallTime="lm" 
leaseManagerPollTime="7 5 0ms" /> 
<client url="http : //remoting_server"> 

<wellknown type="CommonTypes . Query, CommonTypes" 

url="http : //remoting_server/RemotingApp/Query" /> 
<wellknown type="CommonTypes . Library, CommonTypes" 

url="http : //remoting_server/RemotingApp/Library"/> 
<activated type="CommonTypes . Book, Book" /> 
</client> 
<channels> 

<channel ref="tcp" port="0"> 
<server Provider s> 

<formatter ref="binary"/> 
</ server Provider s> 
<client Provider s> 

<formatter ref="binary"/> 
</ client Provider s> 
</channel> 
</channels> 
</application> 
</system. runtime . remoting> 
</conf iguration> 



B Te3M ABa cjaaki/ia ca noKa3aHM Haw-Ba>KHMTe v\ necro cpeiuaHM e/ieMeHTM. B 
cnynaw, ne i/i3no/i3BaTe caMO BrpafleHMTe KaHa/iM, AOCTaBuwuw v\ cJDopMaTepn, 
me ca bm flocTarb^HM caMO TaKMBa KOHCJDMrypauMOHHM <\>av\j\ose. 

Remoting cueHapim 

OcBeH Remoting ci/icreMaTa, .NET Framework npeAOcraBH v\ Apyrn HanwHM 3a 
B3anMOAeMCTBne Me>KAy o6eKTM b pa3/ii/mHki AOMewHM Ha npw/io>Kei-meTO 
(application domains). BceKM ottax e cb3AaAeH c onpeAe/ieHa ue/i, rbBKaBOcr 

M M3MCKBaHMfl K"bM npOrpaMMCTMTe, KOMTO TO UOI\3BdtT. 

HaM-ro^eMMAT KOHKypeHT Ha Remoting TexHO/iorwyiTa ca ye6 ycnyrwTe. 
nopaAM TOBa, ne Te M3no/i3BaT HTTP npoTOKO/ia v\ SOAP cepi/ia/iM3auwfl, Te 
mhoto npw/ikmaT Ha Remoting peiueHne, ki3no/i3Bamo HTTP KaHa/i v\ SOAP 
c|DopMaTep. Ot cboa CTpaHa Remoting TexHO/iori/iflTa hm no3BO/i*iBa Aa nocra- 
bmm aceM6^MTaTa, komto cbAtpwaT TunoBeTe, komto me ki3no/i3BaMe KaTO 
OTAa/ieneHM b IIS. ripn^MKUTe Me>KAy ABeTe TexHO/iorww He ce ki3nepnBaT 
caMO c pa3MeAaHOTO ao TyK. B"b3HMKBa BtnpocbT, b kom cnynaw Koe peiueHne 
e no-yqanHO. 

ripn M36op Ha TexHO^ornfl 3a KOHKpeTHa cuTyauna, Tpa6Ba npeueHMM 
AOko/iko CMe onuTHM BtB BCAKa eAHa ot tax m aoko/iko Tfl me 6tAe yAo6Ha 



618 nporpaMnpaHe 3a .NET Framework (tom 2) 

3a pa6crra. HeKa pa3r/ie,qaMe KpnTepnn, no komto fla ce pbkoboamm npn 
B3eMaHeTO Ha TaKOBa peiueHne, no pefl Ha TexHua npnopnTeT. 

1. M3MCKBaHMfl KtM CMrypHOora: KoraTO Tpa6Ba fla KpunTupaMe flaHHi/ue v\ 
M3BMKBaHMATa v\/v\j\v\ fla aBTeHTMKupaMe noTpe6nTe^MTe, e flo6pe fla 
M3no/i3BaMe HTTP 6a3npaHO npn^oxeHne, KoeTO ce HaMupa b IIS. no to3m 
Ha^MH M3no^3BaMe cpeflCTBaTa, komto IIS npefl/iara v\ HaMa/iflBaMe nacr ot 
OTroBopHOCTTa m HaTOBapBaHeTO ot ce6e cm. MMaMe CBo6oflaTa fla M3no/i- 
3BaMe KaKTO ye6 yc/iyrM TaKa m Remoting. Ako peujMM fla M3no/i3BaMe 
Remoting M3B"bH IIS, to Tpa6Ba caMM fla ce norpM>KMM fla 3aiflMTMM CBOMTe 

flaHHM M KOfl. 

2. npoM3BOflMTe^HOCT: KaTO ufl/io Remoting TexHO/iorMATa e no-6"bp3a m no- 
npoM3BOflMTe^Ha ot CBOMTe KOHKypeHTM. HaM-flo6paTa KOM6MHauMa 3a 
c/iynafl e TCP KaHa/i c 6MHapHa cepMa/iM3auMH. Ye6 yc/iyrMTe 6Mxa 6m/im 
no-flo6"bp M36op, KoraTO H^MaMe Hy>Kfla ot xapaKTepHMTe 3a Remoting 
B"b3MO>KHOCTM, a CMe 3afl"b^>KeHM fla M3no^3BaMe HTTP KaHa/i etc SOAP 
cepMa^M3auMfl. 

3. CbBMecTMMOcr: npM TaKMBa M3MCKBaHMfl M36op"bT hm ca ye6 yc/iyrMTe. 
Remoting TexHO/iorMHTa e onTMMM3MpaHa 3a pa6oTa c .NET K/iMeHTM. 3a fla 
ce nocTMTHe no-flo6pa cbBMecrMMOcr c flpyrM TexHO/iorMM (Java, PHP, C+ + 
m flp.) Tpa6Ba fla ce M3no/i3Ba SOAP cpopMaTMpaHe Ha cbo6meHMHTa, KoeTO 
HaK/iaHfl Be3HMTe b no/i3a Ha ye6 yc/iyrMTe. BtnpeKM TOBa motom fla 
nocTaBMM HaiueTO Remoting npM/io>KeHMe b IIS, fla M3no/i3BaMe HTTP 
KaHa/i m SOAP cpopMaTep m fla ce B"b3no/i3BaMe ot CMrypHOora m Maiua6M- 
pyeMOCTTa, koato tom npefl/iara. 

4. Maiua6MpyeMOCT (scalability): b to3m cnynai/i eflMHCTBeHaTa npenoptKa e 
fla ce M3no^3Ba IIS KaTO cpefla 3a M3n"b/iHeHMe, He3aBMCMMO ,qa/iM CMe ce 
cnpe/iM Ha Remoting m/im ye6 yc/iym. 

5. OyHKUMOHa/iHOcr Ha CLR: npe3 Remoting MO>xeM fla M3no/i3BaMe no-nt/iHO 
B"b3MO>KHOCTMTe Ha .NET Framework. Hakom ot tax He ca Ha pa3no/io>KeHMe 
npM ye6 yc/iyrMTe, KaTO HanpMMep: 

- MHTepcpeMCM 

- KOHTeKCT Ha M3BMKBaHeTO 

- CBOMCTBa 

- MHfleKCaTOpM 

- ynpaB^ABaHM pa3UJMpeHMfl 3a C+ + 

- Mflea/iHO cbOTBeTCTBMe Me>Kfly bcmukm TMnoBe M3no/i3BaHM ot K/iMeHTa m 
ctpBtpa 

- fle^eraTM 

6. 06eKTHO-opMeHTMpaH flM3aMH Ha npM^oxeHMeTo: XML ye6 yc/iyrMTe He 
OTroBapaT Hant/iHO Ha o6eKTHO-opMeHTMpaHMfl flM3aMH. KaTO 14*1/10 Te ca 
ye6 pecypcM, komto noflo6HO Ha ye6 CTpaHMUMTe CTaHflapTHO He noflfltp- 
>KaT cbCTOAHMe. 3a pa3/iMKa ot tax Remoting o6eKTMTe ca o6eKTM b nt/iHMH 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 619 

CMMCb/i Ha flyMaTa. KaTO pe3y/iTaT Ta3M TexHO/iorwfl MMa c/ieflHMTe 
o6eKTHO-opneHTnpaHM B"b3MO>KHOCTM, komto OTCbCTBaT ye6 yc/iyrwTe: 

- o6eKTHM pecJDepeHunn KbM OTfla/ieneHi/i o6eKTM 

- HflKO/IKO B"b3MO>KHOCTM 3a aKTWBkipaHe Ha o6eKT 

- o6eKTHO-opneHTnpaHO ynpaB/ieHkie Ha cbCTOAHneTO 

- pa3npe,ae/ieHO ynpaB/ieHkie Ha >KMBOTa Ha o6eKTMTe 

ToBa ca K/iionoBkiTe toukm, komto Tpa6Ba fla ce o6mmc^at npn M36opa Ha 
TexHO/iorna 3a pea/in3auwfl Ha npM/io>KeHMe, KoeTO M3no/i3Ba OTfla/ieneHki 
o6eKTM. KaTO o6o6iueHne Ha bcmuko ao TyK, HeKa pa3r/ie,qaMe nooT,qe/iHO 
BCAKa eflHa ot HajikmHkiTe TexHO/iorm/i 3a Ta3M ue/i. 

HiiCTa Mpe>KOBa KOMyHMKaMmi 

M3no^3BaMKM K/iacoBeTe ot npocTpaHCTBOTO c MMeHa system. Net MO>KeM fla 
M3rpaflMM ot HynaTa cboa co6cTBeHa cwcreMa 3a KOMyHMKauna. Mo>KeM fla 
MMn^eMeHTupaMe cbom co6ctb6hm KaHa/iw, cJDopMaTepn, npoTOKO/iw v\ t.h. 
npo6^eM"bT c to3m noflxofl e, ne ce pa6oTM Ha hmcko hmbo m ce xBtp/iHT mhoto 
ycv\nv\s\ 3a "npeoTKpuBaHe Ha Ton/iaTa BOfla". 

XML ye6 yc/iyrn 

Ako me pa3pa6oTBaMe ye6 npn^OKeHne v\ pa3no/iaraMe c B"b3MO>KHOCTi/iTe Ha 
ASP.NET, to XML ye6 yc/iyrkiTe ca nonTki BMHarn npaBM/iHWAT M36op. rio/i3Ba- 
HeTO Ha OTBopeHMTe craHflapâ„¢ XML v\ SOAP vv\ npaBM M3K/iK>ni/iTe/iHO cbBMec- 

TMMM, HO B HflKOM C/iynaM TOBa e MMHyC, TbM KaTO HflMa Mflea^HO CbOTBeTCTBMe 

Me>Kfly TunoBeTe, komto K/iweHTkiTe ki3no/i3BaT, 3a fla i/i3B/ieKaT flaHHMTe. 

.NET Remoting 

Ta3M cucTeMa 3a KOMyHMKauna e rbBKaBa, pa3LUkipyieMa v\ He M3MCKBa 
nucaHeTO Ha mhoto koa. MoweM fla a ki3no/i3BaMe v\ no HanwH, noflo6eH Ha 
ye6 yc/iyrwTe. npenMyiuecTBaTa, komto ta npefl/iara ca: 

- B"b3MO>KHOCT 3a ny6/ikiKyBaHe v\ ki3no/i3BaHe Ha cbpBtpHi/i o6eKTM, ot 
komto m fla e Tun b npow3BO/ieH application domain (koh30/iho npi/i/io- 
>KeHne, Windows v\nv\ ye6 npw/io>KeHi/ie, ye6 ycnyra). 

- 3ana3BaHe Ha ctOTBeTCTBueTO Ha TunoBeTe npn 6i/mapHa cepi/ia/ii/i3auwfl 

- B"b3MO>KHOCT 3a npeflaBaHe Ha o6eKTM no pecJDepeHuna 

- KOHTpo/i Hafl npoueca Ha aKTMBauna v\ >kmbot Ha o6eKTMTe 

- B"b3MO>KHOCT fla ki3no/i3BaMe pa3pa6oTeHM OT TpeTM CTpaHM KaHa/iw M 
npoTOKO/in, 3a fla pa3UJnpnM Hani/iHMTe 3a KOMyHMKauna 

- B"b3MO>KHOCT 3a flupeKTHO yuacme b npoueca Ha KOMyHMKauna v\ fla ro 
ynpaB^ABaMe cnopefl HaiunTe Hy>KflM 



620 nporpaMnpaHe 3a .NET Framework (tom 2) 

Remoting cbpBi>p u K/meHT - npiiMep 

BpeMe e p,a pa3r/ieAaMe Ha npaKTMKa KaK M3r/ie>KAa ep,no npn/io>KeHi/ie, KoeTO 
M3no^3Ba Remoting. IHe pea/iki3kipaMe npocTO koh30/iho ripi/i/iowei-me ot Tun 
K^neHT/ctpBtp, KoeTO me o6cny>KBa 6i/i6/ii/iOTei<a c khmtm. ripM/iowei-meTO ce 
cbCTOM ot ABe nacm - Remoting ctpBtp v\ Remoting K/iweHT. 

KoAtT Ha npn^OKeHneTO e pa3npeAe/ieH b Tpn npoeKTa b eAHO VS.NET 
peiueHne (solution): 

- CommonTypes - b T03M npoeKT ce HaMkipaT o6iunTe TkinoBe, komto 
K/iweHTbT m ctpBtptT me M3no^3BaT. 

- Library-Server - CbpBtpHOTO npkl/lOKeHWe, KOeTO me HM OCMrypflBa 

AOCTtn ao OTAa^e^eHMTe o6eKTM. 

- LibraryClient - K/lMeHTCKOTO npM^O>KeHMe, KOeTO OCbLUeCTBflBa AOCTbn 

ao OTAa/ie^eHaTa 6ki6/ikiOTei<a. 

Ci>3flaBaHe Ha o6uj|MTe Tunoee 

3a p,a pea/ii/i3wpaMe Hy>KHaTa cpyHKuwoHa/iHOcr ce Hy>KAaeM ot cnep,Hv\je 
TunoBe: 

- Book - npeAcraB/iflBa eAHa KHura. MMa Tpn nacmki no/ieTa - MMe, aBTop 
m ISBN. flocT"bn"bT ao tax ce ocbmecTBflBa 4pe3 ny6/ikmHki CBOMcma. 3a 
Aa MWKeM p,a c/ieAHM M3n"b/iHeHMeTO Ha npM/io>KeHMeTO npn M3BMKBaHeTO 
Ha Te3M CBOMCTBa ce OTnenaTBa c"bo6iueHne b KOH30/iaTa Ha npi/i/io>Ke- 
HueTO. K/iacvr HacneAflBa MarhaiByRefobject, nopaAH KoeTO Ha K^neH- 
Ta ce npeAOcraBfl OTAa/ieneHa pecpepeHuna v\ bcmuki/i M3BMKBaHMfl ce 
M3B"bpujBaT Ha cbpBtpa. K/iacvr M3r/ie>KAa no cnep,Hv\n Hani/m: 



Book . cs 



using System; 

namespace CommonTypes 

{ 

public class Book : MarshalByRefOb j ect 

{ 

private string mAuthor; 

private string mTitle; 

private string mlsbn; 

public string Author 

{ 

get 

{ 

Console .WriteLine ( "Book ' s author retrieved.") 

return mAuthor; 
} 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 621 



set 

{ 

mAuthor = value; 

Console .WriteLine ( "Book ' s author updated."); 
} 
} 

public string Title 

{ 

get 

{ 

Console .WriteLine ( "Book ' s title retrieved. ") ; 

return mTitle; 
} 

set 

{ 

mTitle = value; 

Console .WriteLine ( "Book ' s title updated."); 
} 
} 

public string Isbn 

{ 

get 

{ 

Console .WriteLine ( "Book ' s ISBN retrieved. ") ; 

return mlsbn; 
} 

set 

{ 

Console. WriteLine ( "Book' s ISBN updated."); 
mlsbn = value; 
} 
} 

public Book (string aAuthor, string aTitle, string alsbn) 

{ 

mAuthor = aAuthor; 
mTitle = aTitle; 
mlsbn = alsbn; 
} 
} 
} 



Library - K/iacbT npeACTaB/iflBa 6ki6/inoTei<a ot khmtm. Cbfltpwa MacuB 
ot BCM4KM khmtm b 6ki6/ii/iOTeKaTa m ny6/inneiH MeTOA, komto ocurypflBa 
TflXHOTO M3B^M4aHe. B n p w /i o>Ke h w eTO Tpa6Ba p,a MMa eflHa eflMHCTBeHa 



622 nporpaMnpaHe 3a .NET Framework (tom 2) 

MHCTaHUMfl Ha T03M K/iac, T.e. Library e Singleton o6eKT. K/iaCbT CbLflO 
Hac^eflflBa MarhaiByRefobject m ce MapLua/iw3npa no pecpepeHunfl. 3a 
fla ocurypuM 6e3KpaeH >kmbot Ha o6eKTa, npeflecpMHupaMe MeTOfla 

InitializeLifetimeServiceO Ha 6a30BMfl K/iac, KaTO My yKa3BaMe fla 

Bptiua BMHarn null. K/iacbT M3r/ie>Kfla TaKa: 

Library . cs 



using System; 

namespace CommonTypes 

{ 

public class Library : MarshalByRefOb j ect 

{ 

private Book[] mBooks; 

public Library () 

{ 

Console .WriteLine ( "Library object activated."); 
mBooks = new Book[] 

{ 

new Book ("Steve McConnell", "Code Complete 2", 

"0735619670") , 
new Book ( "Svetlin Nakov", 

"Internet Programming in Java", "9547753053"), 
new Book ("Martin Fowler", "Ref actoring : Improving " 

"the Design of Existing Code", "0201485672") 

}; 

} 

public Book[] GetBooks ( ) 

{ 

Console .WriteLine ( "Library. GetBooks ( ) called. " ) ; 

return mBooks; 
} 

public override object InitializeLif etimeService ( ) 

{ 

return null; 

} 
} 



Cb3AaeaHe Ha CbpBi>p 

1/lMn/ieMeHTaukiflTa Ha ctpBtpa He e cno>KHa. Tom npeflcraB/iflBa koh30/iho 
npw/io>KeHi/ie, ni/mTO OTroBopHOCT e fla npeflocraBfl OTfla/ieneHM o6eKTM Ha 

K^MeHTMTe. 

OcHOBHMTe CTbnKM npw HeroBaTa peanv\3au,v\n ca cneflHMTe: 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 623 

1. PerncTpupaHe Ha KaHa/i - perncTpupaMe TCP Kaina/i Ha nopT 12345 c 
noflpa36npaiunfl ce 6nHapeH c|DopMaTep. 

2. PerncTpupaHe Ha TunoBeTe OT,qa/ieneHi/i o6eKTM - perncTpupaMe Tuna 

CommonTypes . Library KaTO Singleton 06eKT CbC CbpBtpHa aKTMBaUMfl. 

3. 3aMpa3*iBaMe ki3n"b/iHeHweTO Ha cbpBtpHOTO npi/i/io>KeHkie, 3a fla npe- 

AOTBpaTMM HerOBOTO 3aB"bpilJBaHe, TbM KaTO aKO CbpB"bp"bT 3aB"bpilJM 

CBoeTO M3n"b^HeHne, OTfla/ieneHkiTe o6eKTM CTaBaT HeflocrbriHi/i. He 
Tpa6Ba fla hm o6"bpKBa c|DaKTbT, ne CMe "npucna^n" r/iaBHaTa HMUJKa Ha 
caMOTO npn^OKeHne, 3aiuoTO HeroBaTa eflMHCTBeHa ue/i e fla perncT- 
pupa KaHa/iMTe v\ TunoBeTe, komto K/ii/ieHTMTe me i/i3no/i3BaT. Bcmukm 
ocraHa/iki MaHnny^auuM, CB"bp3aHM c KOMyHMKaunaTa Me>Kfly OT,qa/iene- 
HMTe o6eKTM m K^neHTa, ce M3B"bpujBaT aBTOMaTM^HO ot Remoting 
MHCJDpacTpyKTypaTa b hmujkm, pa3/ii/mHM ot r/iaBHaTa. 

KofltT Ha ctpBtpHOTO npi/i/io>KeHi/ie e cneflHkiflT: 



LibraryServer . cs 



using System; 

using System. Runtime . Remoting . Channels; 

using System. Runtime . Remoting . Channels . Tcp; 

using CommonTypes; 

namespace LibraryServer 

{ 

class LibraryServer 

{ 

const int LISTENING_PORT = 12345; 

static void Main ( ) 

{ 

// Create the Remoting TCP channel and register it 
TcpChannel channel = new TcpChannel (LISTENING_PORT) 
Channel Services . Regis terChannel (channel ) ; 

// Register the Library class as singleton server 

// activated object 

RemotingConf iguration . RegisterWellKnownServiceType 

typeof (CommonTypes . Library) , "Library", 

WellKnownOb j ectMode . Singleton) ; 

Console .WriteLine ( "Library remoting server is " + 

"listening on TCP port {0}", LISTENING_PORT) ; 
Console .WriteLine ( "Press [Enter] to exit."); 
Console . ReadLine ( ) ; 



624 nporpaMnpaHe 3a .NET Framework (tom 2) 

Cb3flaBaHe Ha kjimcht 

K/ikieHTCKOTO npn^OKeHne e aHa/iori/mHO Ha cbpBtpHOTO. Othobo 3a npocTOTa 
M3no/i3BaMe koh30/iho npw/ioweHwe, KoeTO me MMa 3a ue/i fla M3B/iene 
flaHHMTe 3a bcmukm khmtm ot 6n6/ikiOTei<aTa Ha cbpBtpa, nocne fla npoMeHM 
aBTopa Ha eflHa ot tax m fla OTnenaTa flaHHMTe 3a bcmukm khmtm b KOH30/iaTa. 
Othobo Mi/maBaMe npe3 CTaHflapTHMTe crbnKM npn pa6oTa c Remoting: 

1. PerncTpupaHe Ha KaHa/i - peri/icrpi/ipaMe TCP KaHa/i Ha nopT 12345 etc 
noflpa36npaiunfl ce 6i/mapeH cpopMaTep. Tpa6Ba KaHa/ikiTe ot flBeTe 
CTpaHM Ha KOMyHMKaunflTa fla ca eflHM v\ cbu\v\, 3a fla MO>Ke ta fla ce 
ocbiuecTBM ycneujHO. 

2. AKTMBupaHe Ha OTfla/ieneH o6eKT - K/iweHTbT no/iynaBa pecpepeHuna 
KtM eflMHCTBeHaTa MHCTaHuna, koato e Ha cbpBtpa, v\ ot TyK HaTaTbK 
MO>Ke fla pa6oTM c Hea cflKaw e /ioi<a/iHa 3a npn^OKeHneTO. 

3. M3no/i3BaMe OTfla/ieneHi/m o6eKT, KaKTO /ioi<a/ieH - b cnynafl M3BMKBaMe 
MeTOfla GetBooksO Ha K/iaca Library m c/iefl TOBa ocbiuecTBflBaMe 
flocTtn flo CBOMCTBaTa Ha K/iaca Book. 



LibraryClient . cs 



using System; 

using System. Runtime . Remoting . Channels; 

using System. Runtime . Remoting . Channels . Tcp; 

using CommonTypes; 

namespace LibraryClient 

{ 

class LibraryClient 

{ 

public static void Main ( ) 

{ 

// Create new client TCP channel and register it 

TcpChannel channel = new TcpChannel ( ) ; 

Channel Services . Regis terChannel (channel ) ; 

Console .WriteLine ( "Registered new client TCP channel."; 

// Activate the Library remote object 
Library remoteLibrary = (Library) 

Activator . GetOb j ect (typeof (Library) , 

"tcp: //localhost: 12345/Library" ) ; 
Console .WriteLine ( "The Library object activated."); 

// Retrieve the books from the server 
Book[] books = remoteLibrary . GetBooks () ; 

// Update the first book (through a server call) 
books [0] .Author = "Author changed"; 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 625 



// 


Print 


books (throu 


gh a series of 


server call 


s) 


f oreach 


(Book book in 


books ) 










1 


Consol 


e . WriteLine ( ' 


(Author: 


{0}; 


Title: 


{!}, 


ISBN: 


} 
} 
} 
} 


{2}) 


", book.Auth 


3r, book 


Title, 


book . 


Isbn) 





Tpa6Ba fla o6"bpHeM BHMMaHne Ha nocneflHi/iTe peflOBe Ha Main() MeTOfla Ha 
K/iweHTa - Te3M c umcb/ia 3a o6xo>KflaHe Ha bcm^km khmtm b 6n6/inoTeKaTa. 
T"bki KaTO KHkirnTe ce Mapuja/iki3kipaT no pec|DepeHUMfl bcako o6ptiueHne kbm 
TexeH MeTOA h/im cbomctbo ce pea/iw3wpa KaTO o6p"biueHne kbm ctpBtpa. 
KoraTO ce M3B"bpujBaT no hako/iko TaKMBa b urncb/i e B"b3MO>KHO fla 3ary6nM 
flocTa ot npon3BOflMTe/iHOCTTa Ha npn^OKeHneTO cm. To3m umcb/i e Tkini/mHO 
TflCHO mhcto b i/i3n"b/iHeHkieTO Ha nporpaMaTa v\ e flo6pe tom fla 6"bfle 
onTMMM3npaH. ToBa MO>Ke fla ca ocbiuecTBM KaTO HanpaBMM Tuna Book fla ce 
Mapuja/iki3kipa no ctomhoct. no to3m Hani/m K/iweHTbT me pa6oTM c /lOKa/iHki 
Konnfl Ha BCHKa KHura v\ me cm cnecTMM mhototo OTfla/ieneHM M3BMKBaHHfl b 
umcb/ia. ToBa peiueHne o6ane He Tpa6Ba fla ce npw/iara c/iano HaBcaicbfle, 
3aiuoTO BOflu flo npoMAHa b noBefleHneTO Ha o6eKTMTe ot Tun Book, tbm KaTO 
npn npoMAHa Ha TexHi/ue CBOMCTBa ce MOflmfci/iukipa caMO /ioio/ihoto mm Konne 
npn K^neHTa. 



C'bpB'bp'bT V\ K/meHTbT B fleilCTBUe 

Cnefl KOMnn^npaHe v\ crapTwpaHe Ha ctpBtpHOTO npi/i/io>KeHi/ie no/iynaBaMe 
c^eflHMfl pe3y/iTaT: 



\MS Content and Curriculum\Presentations\ Lecture-' 



Jnjx] 



Library remoting server is listening on TCP port 12345 
Press [Enter] to exit. 



CbpB"bp"bT e ycneujHO crapTkipa/i, peri/icrpkipa/i e Tuna Library KaTO OTfla/ie- 
neH o6eKT m onaKBa CBOMTe K/iweHTki. Ako b to3m MOMeHT KOMnn^npaMe i/i 
CTapTupaMe K/iweHTCKOTO npi/i/ioxeHwe, me no/iynwM cj\ep,uv\s\ pe3y/iTaT: 



626 flporpaMnpaHe 3a .NET Framework (tom 2) 



\n\xj 



*â– â– â–  "C:\MS Content and Curriculum\Presentations\Lecture-21-Remotin... 



Registered new client TCP channel. 

The Library object activated. 

(Author: Author changed; Title: Code Complete 2, 

(Author: Svetlin Nakov; Title: Internet Programmi 

(Author: Martin Fowler; Title: Refactoring: Impro 

e, ISBN: 0201485672) 



Press any key to continue. 



UL 



\A 



Bn>KAa ce, ne K/iweHTbT ycnewHO e o6hobi/i/i aBTopa Ha ntpBaTa KHura v\ e 
v\3Bj\s\K-bj\ ot cbpBtpa cnwcbKa Ha BCM4KM khmtm ot 6ki6/ikiOTei<aTa. C/iefl npn- 
K/iK>nBaHe Ha pa6oTaTa Ha K/iweHTa, KOH30/iaTa Ha ctpBtpa H3Me>Kfla no 
cneRHwn Hani/m: 



^]nj_xj 



ca "C:\MS Content and Curriculum\Presentations\Lecture-21-Remoting\Di 



Library remoting server is listening on TCP port 12345g 

Press [Enter] to exit. 

Library object activated. 

Library .GetBookst ) called. 

Book's author updated. 

Book's author retrieved. 

Book's title retrieved. 

Book's ISBN retrieved. 

Book's author retrieved. 

Book's title retrieved. 

Book's ISBN retrieved. 

Book's author retrieved. 

Book's title retrieved. 

Book's ISBN retrieved. 



ToBa noi<a3Ba, ne K/iweHTbT ycnewHO e aKTkiBkipa/i Library o6eKTa, c/iefl 
KoeTO e ki3BkiKa/i MeTOfltT My GetBooks(). C/iefl TOBa e o6HOBeHa eflHa ot 
KHurnTe m MHCpopMaunflTa 3a BCsiKa ot tax (3ar/iaBkie, aBTop v\ ISBN) e 6ki/ia 
M3B/ieneHa. rioHexe K/iacbT Book M3no/i3Ba Mapuja/iki3auMfl no pecpepeHuna, 

BCeKM flOCTtn flO CBOMCTBO OT T03M K/iaC OT CTpaHa Ha K/lkieHTa Ce l/l3n"b/lHflBa 

npe3 OTfla/ieneHO M3BMKBaHe Ha ctpBtpa. 

npMMep 3a MapLuasiM3auiMfl no ctomhoct 

HeKa cera HanpaBMM Ma/iKa npoMHHa b K/iaca Book, komto ce ki3no/i3Ba ot 
ctpBtpa, m fla ro HanpaBMM fla ce MapLua/iw3npa no ctomhoct. Tpa6Ba fla 
3aMeHMM pefla: 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 627 



public class Book : MarshalByRefOb j ect 



etc c/ieAHkifl pep,: 



[Serializable] public struct Book 



HeKa npeKOMni/i/ii/ipaMe cbpBtpa m naK crapTkipaMe ntpBO cbpBtpa, a cnep, 
TOBa K^neHTa. KoH30/iaTa Ha K/iweHTa cnep, ycneujHOTO My M3n"b/iHeHi/ie H3- 
rjieiKfla no cnep,Hwn HanwH: 



"C:\MS Content and Curriculum\Presentations\Lecture-21 



^Jnjxj 



Registered new client TCP channel. 

The Library object activated. 

Book's author updated. 

Book's author retrieved. 

Book's title retrieved. 

Book's ISBN retrieved. 

(Author: Author changed; Title: Code Complete 2, 

Book's author retrieved. 

Book's title retrieved. 

Book's ISBN retrieved. 

(Author: Svetlin Nakov; Title: Internet Programmi 

Book's author retrieved. 

Book's title retrieved. 

Book's ISBN retrieved. 

(Author: Martin Fowler; Title: Refactoring: Impro 

e, ISBN: 0201485672) 

Press any key to continue. 



flcHO ce 3a6e/iH3Ba, ne AOCTbirbT ao CBOwcrBaTa Ha K/iaca Book Bene ce 
ki3n"b/iH*iBaT ziOKa/iHO npn K/ineHTa, a He Ha cbpBtpa. ToBa e TaKa, 3aiuoTO 
K/iacbT Book cnefl npoMAHaTa ce MapLua/iki3wpa no ctomhoct m He M3B"bpujBa 
OTAa/ieneHO M3BMKBaHe npn BceKM Aocrbn ao HeroBO cbomctbo. Eto KaK 
M3r/ie>KAa v\ ctpBtptT cnep, ycneujHOTO M3n"b/iHeHMe Ha K/iweHTa: 



"C:\ MS Content and Curriculum\Presentations\Lecture-2 



^jnJ2<J 



Library remoting server is listening on TCP port 
Press [Enter] to exit. 
Library object activated. 
Library .GetBookst ) called. 



628 nporpaMnpaHe 3a .NET Framework (tom 2) 

3a6e/i*i3Ba ce, ne BtnpeKM aKTMBHaTa pa6oTa c o6eKTMTe ot K/iaca Book, 
M3B/ieneHM npe3 MeTOfla GetBooksO, ctpBtptT He OTne^aTBa hmluo npn 
flocTbna flo TexHMTe CBOMCTBa. ToBa e TaKa, 3aiuoTO pa6oTaTa c tax ce 
M3B"bpujBa npn K^neHTa, noHe>Ke Te3M o6eKTM ce Mapuja/ii/i3npaT no ctomhoct. 

Ako c Ae6"brepa Ha VS.NET npoBepuM cbcroflHweTO Ha KHurnTe Ha ctpBtpa, 
me ycTaHOBMM, ne aBTopvr Ha ntpBaTa KHura He e npoMeHeH, BtnpeKM, ne 
K^neHTtT ro npoMeHfl M3pn4HO. ToBa e TaKa, 3aiuoTO K/iweHTbT npoMeHfl caMO 
/lOKa/iHOTO cm Konne Ha to3m o6eKT (3apaflM Mapuja/iw3aui/mTa no ctomhoct). 

npo6/ieMT>T c o6iijMTe TunoBe 

Heiuo, KoeTO He cnoMeHaxMe m3pmhho 3a ropHMTe npuMepHM ctpBtp v\ 
K^neHT, e ne 3a fla ce KOMnn^npaT v\ pa6oT*iT npaBM/iHO, v\ K/iMeHTbT v\ 
cbpB"bp"bT Tpa6Ba fla MMaT Konne ot aceM6/ikiTO etc cno,qe/ieHMTe TunoBe, 
komto ce M3no/i3BaT. C^eflBaiuaTa nacr e nocBeTeHa M3Ufl/io Ha to3m npo6/ieM. 

KaKTO BMflflXMe b ufl^aTa TeMa, a m ot npuMepnTe, 3a fla MO>xe fla pa6oTM 
eflHO npn^OKeHne nocpeflCTBOM Remoting, Tpa6Ba v\ K/iMeHTbT v\ ctpBtptT fla 
pa3no/iaraT c onucaHne Ha o6iunTe 3a tax TunoBe v\ TexHMTe MeTOflM. 

Cnofle/ieHO aceM6/m c TunoBe 

B .NET Framework TunoBeTe ce onucBaT ot MeTaflaHHMTe b aceM6/iMTaTa v\ 
3aTOBa HaM-MHTynTMBHOTO peweHMe Ha npo6/ieMa c o6iunTe TunoBe e fla 
KonnpaMe aceM6/ikiTO c TunoBeTe flaHHM b flwpeKTopi/mTa Ha npn^OKeHneTO 
KaKTO Ha cbpBtpa TaKa v\ Ha K/iMeHTa. To3m noflxofl MMa flo6pn v\ /iolum 

CTpaHM. 

flo6pnTe ca, ne BceKM pa3no/iara c flecpMHuunnTe Ha TunoBeTe v\ e B"b3MO>KHO 
e fla ce opraHM3npa offline pa6oTa c flaHHMTe. 

/loujMTe CTpaHM ca, ne KoraTO MMaMe npo6/ieM c hakom ot TunoBeTe v\ 
HanpaBMM npoMeHM b Hero (KoeTO He e 3afl"b/i>Ki/iTe/iHO fla e npeflM3BMKaHO ot 
npo6/ieM!), Tpa6Ba He caMO fla noflMeHMM aceM6/iMTaTa Ha ctpBtpa, a fla 
HaKapaMe BceKM eflMH ot K/iweHTMTe fla noflMeHM CBOMTe aceM6/ii/iTa, komto ca 
3acerHaTM ot npoM^HaTa. ripaKTMKaTa noKa3Ba, ne TOBa e CKbnocrpyBam, 
HenpuflTeH v\ cnoweH npouec. 

Cnofle/ieHO aceM6/m c MHTepcjDeMCM 

EflHO nacTi/mHO peweHMe Ha ropHna npo6/ieM e npn K/iMeHTa fla He ce pa3npo- 
CTpaHABaT caMMTe K/iacoBe (TunoBe), a caMO MHTepcpewcuTe, komto Te MMn/ie- 

MeHTMpaT. riO T03M HaHMH MMaMe B"b3MO>KHOCT fla CKpneM MMn^eMeHTaunflTa 

Ha K/iacoBeTe cm m bcmukm npoMeHM, komto He 3acaraT MHTepcpeMca Ha K/iaca, 
fla OKaxaT B/iMHHMe caMO Btpxy aceM6/iMTO c TMnoBeTe Ha ctpBtpa. no to3m 
Ha^MH mhoto no-paflKO me ce Ha/iara fla 3acTaBAMe K^MeHTMTe fla o6HOB*iBaT 
CBOMTe aceM6^MTa, ho ry6MM B"b3MO>KHOCTTa Ki\v\euTbT fla MO>Ke fla pa6oTM b 
offline pe>KMM. BtnpeKM TOBa Ta3M npaKTMKa e npenoptuMTe/iHaTa m Haki- 
4ecTO M3no^3BaHaTa. 



HnaBa 22. OTfla/ieneHM n3BMKBaHMn c .NET Remoting 629 



Soapsuds.exe 



flpyr noflxofl 3a ocurypaBaHe Ha K/iMeHTa c MeTaflaHHMTe, ot komto ce 
Hy>KAae, e M3no/i3BaHeTO Ha MHcrpyMeHTa soapsuds.exe. Tom ce HaMupa b 

<flnpeKTopMH Ha VS.NET 2003>\SDK\vl . l\Bin. Hpe3 Hero OT TOTOBOTO 

aceM6/iM c TunoBeTe, komto me nocraBMM Ha ctpBtpa, MO>KeM fla M3B/ieneM 
caMO MeTaAaHHMTe v\ fla vv\ KOMnn^npaTe othobo b flpyro aceM6/iM, KoeTO fla 
ki3no/i3BaMe npn K/iMeHTa. To3m noflxofl He ce pa3/iMnaBa cbiuecTBeHO ot 
noflxofla etc cno,qe/ieHO aceM6/iM, cbfltpaomo o6iunTe TunoBe. 

Xoctmht Ha Remoting TunoBe b IIS 

EflMH Btnpoc, CB"bp3aH c pa3npocTpaHABaHeTO Ha o6lum TunoBe, komto caMO 
6er/io 3acei~HaxMe npn pa3r/ie>KflaHeTO Ha Remoting cueHapnnTe, 6eiue xoc- 
TMHrtT Ha aceM6/iMTa c Remoting TunoBe b IIS. 

Remoting MHCJDpacrpyKTypaTa hm no3BO/i*iBa fla ce B"b3no/i3BaMe ot cJDyHKuno- 
Ha/iHOcrra, koato Internet Information Services npefl/iara 3a xoctmht Ha 
pa3/iMHHM npw/io>KeHkifl. TaKMBa npn^OKeHna MoraT fla 6"bflaT ye6 npM/io- 
>KeHMfl, ye6 yc/iyrw, Remoting npn^OKeHna v\ flp. 

3a fla M3no/i3BaMe IIS 3a xoctmht Ha Remoting ctpBtpHM npn^OKeHna, 
Tpa6Ba fla HanpaBMM 3 Heiua: 

1. J\a cb3flafleM BMpTya/iHa flupeKTopua b IIS. 

2. B Hea fla 3anniueM eflMH Remoting KOHCJDMrypauMOHeH <£aM.n, komto fla 

MMa Cneuna^HO MMe - Web.config. 

3. J\a c"b3flafleM noflflnpeKTopua bin, b koato fla KonnpaMe aceM6/iMTaTa c 
TunoBeTe, komto MCKaMe fla M3no/i3BaMe KaTO OTfla/ieneHM. 

OrpaHi/meHi/isiTa, komto IIS hm Ha/iara, ca fla M3no/i3BaMe HTTP npoTOKO/i. 
XocTBaMKM CBOMTe OTfla/ieneHM TMnoBe no to3m HanMH, HMe HAMaMe Hyxfla fla 
ce rpM>KMM cneuMa/iHO 3a CMrypHOcrra m Maiua6MpyeMOCTTa Ha cbpBtpa m 
ecTecTBeHO HAMaMe Hy>Kfla fla nMiueM npM/ioweHMe, KoeTO fla 6"bfle cbpBtp, 
TtM KaTO 3a TOBa ce tpm>km IIS. 

Remoting npM^o>KeHMflTa b IIS pa6oT*rr KaKTO ye6 npM^oxeHMATa m ye6 
ycnyrMTe - xocTBaT ce m ce ynpaB/iflBaT ot cbpBtpa m CTapTMpaT 3aeflHO c 
Hero. 3a tax MoraT fla ce HacrpoMBaT CMrypHOCTTa, M3no/i3BaHMTe pecypcM m 
mhoto flpyrM Heiua, komto ce npeflocraBHT ot IIS. 

ynpa>KHeHMfl 

1. 06acHeTe ocHOBHMTe KOHuenuMM Ha .NET Remoting MHCJapacrpyKTypaTa - 

KaHa/lM, CJDOpMaTepM, BMflOBe aKTMBaLJMfl, BMflOBe MapLUa/lM3aUMfl M >KM3HeH 

UMK"b/l Ha o6eKTMTe. 

2. Pea^M3MpaMTe K/iMeHT-cbpB"bp npM/io>KeHMe 3a pa3TOBopM b pea/iHO BpeMe 
(chat), 6a3MpaHO Ha .NET Remoting. M3no/i3BaMTe TCP KaHa/i, 6MHapeH 
c|DopMaTep, Mapuja/iM3auMfl no pec|DepeHUMfl m Singleton aKTMBauMa ot 



630 nporpaMnpaHe 3a .NET Framework (tom 2) 

cbpBtpa. CtpBtptT Tpa6Ba fla noflfl"bp>Ka cnwcbK Ha CB"bp3aHMTe kbm Hero 
noTpe6nTe^n v\ fla no3BO/i*iBa hako/iko pa3roBopa (chat cecnn) eflHOBpe- 
MeHHO. K^neHTbT (Windows Forms npi/i/io>KeHi/ie) Tpa6Ba fla MO>Ke fla 
3anonBa chat cecua, fla M3npaiua cbo6meHMfl flo flpyrnTe noTpe6kiTe/in v\ 
fla 3aTBapa chat cecna. 

3. Pea/i M3i/i pa MTe K/ikieHT-cbpB"bp npi/i/io>KeHi/ie, 6a3npaHO Ha .NET Remoting 
TexHO/iorwflTa, 3a o6cny>KBaHe Ha 6w6/inoTeKa c a/i6yMi/i etc chmmkm. 
CtpBtptT Tpa6Ba fla noflfltpxa onepaunnTe: n3B/iwnaHe Ha a/i6yMMTe, 
M3B^M4aHe Ha CHMMKMTe ot BceKM a/i6yM, flo6aBAHe Ha a/i6yM, ,qo6aBflHe 
Ha CHMMKa, M3TpnBaHe Ha a/i6yM, M3TpnBaHe Ha chi/imio, npeMecTBaHe Ha 
CHMMKa b flpyr a/i6yM. A/i6yMkiTe He MoraT fla 6"bflaT B/io>KeHM eflMH b flpyr. 
M3no^3BaMTe cpai/i/iOBaTa cwcreMa 3a ctxpaHeHne Ha a/i6yMMTe etc chmm- 
KMTe. K^neHTbT Tpa6Ba fla e Windows Forms npn^OKeHne v\ fla npeflocraBsi 
MHTepcpewc KtM M36poeHMTe onepaunM. M3no/i3BaMTe HTTP KaHa/i, SOAP 
cpopMaTep, aKTMBaunfl ot K/iweHTa v\ Mapuja/iki3au.mi no ctomhoct. Kohcpm- 
rypupaHeTO Ha K/iweHTa v\ cbpBtpa Tpa6Ba fla craBa c BtHweH XML cpai/i/i. 

M3no/i3BaHa /liuepaTypa 

1. CBeT/iMH HaKOB, .NET Remoting (oTfla/ieneHO M3BMKBaHe) - http://www. 
nakov.com/dotnet/lectures/Lecture-21-Remotinq-vl .O.ppt 

2. MSDN Library, Piet Obermeyer and Jonathan Hawkins, Microsoft .NET 
Remoting: A Technical Overview - http://msdn.microsoft.com/library/en- 
us/dndotnet/html/hawkremotinq.asp 

3. MSDN Library, Paddy Srinivasan, An Introduction to Microsoft .NET 
Remoting Framework - http://msdn.microsoft.com/library/en-us/dndotnet/ 
html/introremotinq.asp 

4. MSDN Magazine (12/2003), Juval Lowy, Managing the Lifetime of Remote 
.NET Objects with Leasing and Sponsorship - http://msdn.microsoft.com/ 
msdnmaq/issues/03/12/LeaseManaqer/default.aspx 

5. MSDN Library, Piet Obermeyer and Jonathan Hawkins, Format for .NET 
Remoting configuration files - http://msdn.microsoft.com/library/en- 
us/dndotnet/html/remotinqconfiq.asp 



T/iaea 23. B3anMOfleMCTBne 
c Heynpae/i5iBaH koa 



ABTOp 

MapTMH Ky/iOB 

Heo6xoflMMM 3HaHMn 

- 5a30BM no3HaHMfl 3a o6iuaTa ci/icreMa ot TunoBe b .NET (Common Type 
System) 

- 5a30BM no3HaHkifl 3a e3MKa C# 

- Ba30BM no3HaHMfl 3a e3MKa C+ + 

- 5a30BM no3HaHMfl 3a TexHO/iorwflTa COM 

- Ba30BM no3HaHMfl 3a nporpaMnpaHe nofl Win32 etc C v\ C+ + 

- no3HaHMfl 3a aTpn6yTMTe b .NET Framework 

Cb/vbpwaHMe 

- 06iua cpeAa v\nv\ BwpTya/iHa MaiunHa 

- n/iaTCJDopMeHO M3BMKBaHe (P/Invoke) 

- npeo6pa3yBaHe Ha ashhm (marshalling) 

- 1/lMn/ieMeHTnpaHe Ha cJDyHKuna 3a o6paTHO M3BMKBaHe (callback) 

- B3anMOAeMCTBne c COM (COM interop) 

- M3BMKBaHe Ha COM o6eKT ot ynpaB/iflBaH koa 

- Runtime Callable Wrapper (RCW) 

- Pa3KpnBaHe Ha .NET KOMnoHeHT KaTO COM o6eKT 

- COM Callable Wrapper (CCW) 

- B3anMOAeMCTBne etc C++ 4pe3 IJW 

B Ta3M TeMa ... 

B HacToamaTa TeMa me pa3r/ieAaMe KaK p,a pa3UJMpnM B"b3MO>KHOCTMTe Ha 
.NET Framework npe3 ynoTpe6aTa Ha npeAOcraBeHMTe ot Windows npM/io>KHM 
nporpaMHM MHTepc|DeMCM (API). IHe ce cnpeM Ha cpeACTBaTa 3a M3BMKBaHe Ha 
<$>yHKU.kiOHa/iHOCT ot AHHaMM^HM Win32 6n6/iMOTeKM v\ Ha npo6/ieMMTe c 
npeo6pa3yBaHeTO (marshalling) Me>KAy Win32 v\ .NET TunoBeTe. 

IHe o6"bpHeM BHMMaHne Ha Bp"b3KaTa Me>KAy .NET Framework v\ COM (KOMno- 
HeHTHMAT MOAe/i Ha Windows). IHe ce cnpeM KaKTO Ha M3BMKBaHeTO Ha COM 
o6eKTM ot .NET koa, TaKa v\ Ha pa3KpnBaHe Ha .NET KOMnoHeHT KaTO COM 



632 nporpaMnpaHe 3a .NET Framework (tom 2) 

o6eKT. HaKpaa 3a n\o6v\jenv\je Ha BenHkifl C++ me pa3r/ieflaMe TexHO/iorwflTa 
IJW 3a M3no^3BaHe Ha HeynpaB/iflBaH koa ot nporpaMM, HanncaHM Ha 
Managed C+ + . 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 633 

KaKBO pa36npaMe nofl B3anMOflePicTBMe c 
HeynpaB/i^BaH koa? 

HacToaiuaTa KHura flaBa bbsmokhoct fla M3ynMM b p,ejav\nv\ AewcTBueTO Ha 
.NET Framework v\ cnep, npouMTaHeTO v\ me 3HaeTe p,a nuiueTe pea/iHM 
npi/i/ic»KeHkifl. BtnpeKM cno>KHOCTTa v\ orpoMHMfl Ha6op ot K/iacoBe, komto 
.NET Framework npeflocraBfl, necro b e>KeflHeBHaTa hm pa6oTa ce Hy>KflaeM ot 
c|DyHKUMOHa^HOCT, KOATO He e BrpaAeHa b .NET Framework. 

HeKa cm npeACTaBMM c/ieAHaTa cuTyauna - nerbK ci\ep,o6ep, e, kpotko cm 
o6nKa^flMe no /iK>6i/iMi/iTe caMTOBe v\ naKaMe KO/ierMTe p,a npMK/uonaT pa6oTa, 
3a Aa MO>Ke p,a HanpaBMM eAHa 6"bp3a nrpa npeAM Kpaa Ha pa6oTHMfl AeH. B 
to3m MOMeHT cnoKOMCTBueTO hm ce HapyiuaBa ot ptKOBOAMTe/ifl Ha npoeKTa, 
komto c zieKO M3HepBeH toh hm cbo6maBa, ne ao Kpaa Ha Rena Tpa6Ba Aa ce 
HanMiue HOBa <£yHKUMOHa/iHOCT. ripM/io>KeHMeTO Tpa6Ba Aa o6xo>KAa m Aa 
B3MMa cbCTOAHMeTO Ha bcm4km cb3AaAeHM npo3opuM. ripMeMaMe 3aAa4aTa 
KaTO ce ycnoKOABaMe, ne me crane 3a 15 MMHyTM noHewe CMe npaBM/iM 
noAo6HO Heiuo oiue npeAM hako/iko toamhm c noMOurra Ha Enumwindows(...) 
cJDyHKUMATa ot Windows API. HflMa HanMH Aa He e HanpaBeH TaKbB 
eKBMBa^eHT m b .NET Framework. Cnep. KpaTKO poBeHe M3 MSDN Library c 
zieKO pa3Apa3HeHMe OTKpMBaMe, ne TaKbB MeTOA H^Ma b hmto eAMH K/iac Ha 
.NET Framework. 

rioAo6HM CMTyauMM ca AOCTa necro cpeiuaHM m npMUMHaTa, ne He bcmukm 
MeTOAM ot Windows API ce npeAOcraBAT ot .NET Framework e mhoto npocTa. 
Ot c"b3AaBaHeTO Ha .NET Framework ca MMHa/iM oko/io 5 toamhm, AOKaTO 
Windows CbiuecTByBa ot 6/1M30 20 toamhm. Ako Tpfl6Bawe Aa naKaMe .NET 
Framework Aa noKpMe ue/iMsi Ha6op ot c|DyHKUMM Ha Windows API MO>Ke 6m 
eABa cera luaxMe Aa M3no/i3BaMe ntpBaTa 6eTa Ha .NET Framework. 

Cb3AaTe/iMTe Ha .NET Framework ca 6m/im AOcraTbUHO npo3op/iMBM, 3a Aa 
pa36epaT, ne TaMHaTa Ha ycnexa Ha .NET Framework me ce A"b/i>KM ao ro/iHMa 

CTeneH Ha B"b3MO>KHOCTMTe 3a B3aMMOAeMCTBMe CbC CblUeCTByBaiUMfl koa. 

CtiuecTByBa orpoMHO KO/iMnecrBO HeynpaB/iaBaH koa, HanMcaH ao MOMeHTa. 
M3no/i3BaHeTO Ha ynpaB/iABaH koa uMa mhoto npeAMMCTBa, ho hmkoa c|DMpMa 
HflMa Aa 3axB"bp^M pa6oTeiuaTa cm nporpaMa, caMO 3a Aa n HanMiue othobo 
npe3 ynpaB^ABaH koa. rio-CKopo c|DMpMaTa 6m MHBecrMpa/ia b pa3pa6oTKaTa 
Ha 6"bAeiuM MOAy/iM HanMcaHM npe3 ynpaB/iHBaH koa. 3a Aa e B"b3MO>KHO 
pa6oTaTa Ha ua/iaTa CMcreMa, o6ane, e Heo6xoAMMO ynpaB/isiBaHMflT koa Aa 
MO>Ke Aa "roBopM" c HeynpaB/iyiBaHMfl koa. B HacToaiuaTa TeMa me pa3r/ie- 
AaMe KaKBM tcxhmkm hm npeAOCTaBfl .NET Framework, 3a Aa HanpaBMM 
B"b3MO>KHO B3aMMOAeMCTBMeTO Ha ynpaB/isiBaH c HeynpaB/iflBaH koa h o6paTHO. 

06114a cpefla mm BMpTya/iHa MawiiHa 

HecTO KaTO onMCBaMe KaKBO npeAcraB/iflBa .NET, Ka3BaMe, ne e cbcraBeH ot 
o6iua cpeAa 3a M3n"b/iHeHMe. KaKBO BCbiuHOCT MaMKpococ|DT MMa npeABMA noA 
o6iua cpeAa m KaK ta ce pa3/iMnaBa ot BMpTya/iHaTa MaujMHa, koato Java 



634 



flporpaMnpaHe 3a .NET Framework (tom 2) 



i/i3no/i3Ba? HeKa aHa/iki3kipaMe flBaTa noflxofla v\ HanpaBMM KpaTKa cbnocraBKa 
Me>Kfly tax. 

Cpefla 3a KOHTpo/mpaHO M3m>/iHeHne .NET CLR (06114a 
cpena) 

ri/iaTCpopMaTa .NET He \\ei\v\ yHMBepca/iHOcr cnp^MO xapAyepa v\ onepaun- 
OHHaTa cucTeMa, Btpxy komto npw/io>KeHkieTO ce ki3n"b/iH*iBa. Ta e HanpaBeHa 
3a fla flafle a6cTpaKu.i/m ot onepaunoHHaTa cwcreMa, ho onepaunoHHaTa 
cucTeMa cm ocTaBa Windows. KofltT HanncaH Ha CLI (Common Language 
Infrastructure) cbBMecrwM e3MK ce KOMnw/inpa ,qo MaiunHHO 3aBMCMM W3n"b/i- 
hmm koa 3a Windows, komto ro npaBM TO/iKOBa 6tp3 ko/ikoto e eflHO C+ + 
npw/io>KeHkie HanncaHO 3a Windows, flopn noBene, KOMnw/iauMflTa flaBa 
B"b3MO>KHOCT fla ce onTMMM3npa KOfltT 3a cbOTBeTHi/ifl npouecop, Ha komto me 
ce M3n"b/iH*iBa npi/i/io>KeHi/ieTO. 

flo-flo/iy e npeflCTaBeHa cxeMaTMUHO apxnTeKTypaTa Ha .NET Framework: 




Windows Kernel 



rioflo6HO Ha CLR, Platform Interop e Hepa3fle/iHa 4acT ot .NET Framework. 
U,fl/iaTa cpyHKunoHa/iHOCT Ha Platform Interop ce flocrbnBa npe3 noMOiflHn 
K/iacoBe ot .NET Framework. HacToaiuaTa TeMa me bm 3ano3Hae c Te3M 
K/iacoBe, KaK Te ce ki3no/i3BaT v\ KaKBM oco6eHOCTM ca xapaKTepHM 3a tax. 

BnpTya/iHa MauiiiHa JVM 

Java n/iaTCpopMaTa, ki3n"b/iHflBa nporpaMHua cm koa b cneu.ua/iHa cpefla 3a 
KOHTpo/iwpaHO ki3n-b/iHeHkie, HapkmaHa Java Virtual Machine (JVM). M npn Hea 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/uiBaH koa 



635 



cope KOfltT Ha nporpaMMTe ce KOMnn^upa ao Me>KflMHeH koa (T.Hap. Java 
bytecode), komto cnefl TOBa ce M3n-b/iH5iBa ot JVM. 

Oiue ot cb3flaBaHeTO Ha Java n^aTCJDopMaTa ocHOBHa ue/i npn flM3aMHa Ha JVM 
e B"b3MO>KHOCTTa 3a i/i3n"b/iHeHkie Ha nporpaMM Ha e3MKa Java Btpxy pa3/iMHHM 
xapAyepHM n/iaTifcopMM v\ onepaunoHHM cucTeMM. ToBa 6ewe aM6nuno3Ha 
Mflea 3a BpeMeTO cm m b ro/iflMa CTeneH Java A"b/i>Kki yenexa cm Ha Hea. 

Pa36Mpa ce, n^aTc|3opMeHaTa He3aBMCMMOCT nocraBM cepM03eH npo6/ieM 3a 
nporpaMMCTMTe, komto MCKaxa fla no/i3BaT cneuMCJDMUHM 3a onepauMOHHaTa 
CMCTeMa yc/iyrM Hanp. DirectX, NTFS, Active Directory m AP- 3a tax e 
npeAOCTaBeH Aocrbn ao HacTM ot Windows (m/im Apyra OC) 4pe3 JNI (Java 
Native Interface). rio/iyneHOTO npM/io>KeHMe, KoeTO M3no/i3Ba JNI TexHO/io- 
rMflTa, ce o6B"bp3Ba c onpeAe/ieHa onepauMOHHa CMCTeMa (OC) m to He MO>xe 
Aa 6"bfle no/i3BaHO Ha APyrM, ocBeH aKO He 6"bfle npenpaBeHO 3a HOBaTa 
onepauMOHHa CMCTeMa. 

3a cpaBHeHMe Ha MHTerpauM^Ta Ha Platform Interop no-AO/iy e noKa3aHO KaK 
JNI cJDyHKUMOHa^HOCTra e MHTerpMpaHa b JVM: 



~\ -r- 



Java 



Jsrvsi iipj/ijio')li^Jris>ia 




Class Libraries 



JNI 



C Old 91 '1 n clow si A J? '1 



Windows Kernel 



AHa/iorMUHO Ha Platform Interop, AOCTbnBaHeTO Ha CMCTeMHM m 3aBMceiuM ot 
onepauMOHHaTa CMCTeMa c|DyHKUMM ce M3B"bpujBa npe3 K/iacoBe, komto JNI 
npeflocTaBfl. 3a vao6ctbo Ha nporpaMMCTa JNI cbiuo npeflocraBfl Ha6op ot 
K/iacoBe, komto no3BO/iHBaT Aa ce npeAaBaT ashhm kbm HeynpaB/isiBaHMfl koa 

KaTO TOBa CTaBa np03pa4HO 3a M3BMKBaLUMfl. 



636 nporpaMnpaHe 3a .NET Framework (tom 2) 

rijiaTcfropMeHO M3BMKBaHe (P/Invoke) 

Eamh ot Ha^MHMTe 3a M3BMKBaHe Ha HeynpaB/isiBaH koa ot .NET Framework e 
ki3no/i3BaHeTO Ha TaKa HapeneHi/ia P/Invoke. HanMeHOBaHneTO MflBa ot 
Platform Invoke v\nv\ b npeBOA - n/iaTCpopMeHO M3BMKBaHe. no cbiuHOCTTa cm 
to3m MeTOA M3MCKBa p,a ce HanpaBHT ABe Heiua. fla ce yKawe b kom DLL 
(Windows 6ki6/ii/iOTei<a) ce HaMupa API cpyHKuwaTa, koato Tpa6Ba p,a ce 
M3BMKa v\ p,a ce onuiue AecpMHuunaTa Ha cpyHKUMHTa b ynpaB/iflBaHMa koa. 

ritpBaTa CTtnKa e Heo6xoAMMO p,a 6"bAe M3B"bpiueHa, 3a p,a ce onpeAe/iM 
T04HMAT aApec Ha M3BMKBaHaTa cpyHKuna, ho 3aiuo e Heo6xoAMMO p,a ce MMHe 
npe3 BTopaTa crbnKa? 3aiuo .NET Framework He reHepupa aBTOMaTMUHO yn- 

paB^flBaH KOA, KOMTO Rd OCMTypM npaBM/lHOTO M3BMKBaHe Ha API CpyHKUMflTa? 

npn4MHMTe ca ABe. ritpBO, 3a pa3/iMKa ot ynpaB/iABaHMfl koa, API cpyHKUMMTe 
He cbAtpwaT MHCpopMaunfl b ce6e cm 3a 6poa Ha napaMeTpnTe v\ TexHua Tun. 
Ta3M MHCpopMaunfl ce cbAtpwa b 6m6/imot6km, komto o6mkhob6ho ce pa3npo- 
CTpaHABaT 3aeAHO etc cpeAaTa 3a pa3pa6oTKa. BTopo, Aopn v\ p,a npeAno- 
/io>kmm, ne MMa Ha^MH p,a ce HaMepn 6poa Ha napaMeTpnTe Ha API cpyHKui/mTa 
m TexHMfl Tun, onpeAe/iflHeTO Ha cbOTBeTCTBaiuna Tun ot CTS 3a BceKM eAMH 
napaMeTtp He e eAH03HanHO. KaKTO me bmamm no-AO/iy, cbmecrByBaT 
pa3^M4HM B"b3MO>KHOCTM 3a npeo6pa3yBaHe Ha eAMH Tun ot HeynpaB/iHBaH koa 
kbm Tun ot Common Type System (CTS). 

OnucBaHeTO Ha API cpyHKunn b ynpaB/iflBaH koa MO>Ke p,a ce OKa>Ke Te>KKa 
3aAa4a, aKO e Heo6xoAMMO p,a ce M3BMKa vonnw Ha6op ot API cpyHKunn. 
3aTOBa P/Invoke ce npenoptuBa, KoraTO e Heo6xoAMMO p,a ce M3BMKa Ma/ibK 
6poM noMOiuHM API cpyHKunn. flo6pa npaKTMKa e AecpMHuunnTe p,a ce M3BeAaT 
b OTAe^eH ynpaB^ABaH K/iac, komto 6m Morb/i p,a ce npeM3no/i3Ba b pa3/iMHHM 
npoeKTM m TaKa p,a ce cnecTM BpeMe 3a nMcaHe m OTcrpaHABaHe Ha npo6/ieMM. 

HaM-Ao6pMAT pecypc 3a TOBa KaK ce onMCBa AaAeHa API cpyHKUMa b ynpaB- 
^ABaH koa MO>Ke Aa HaMepMTe Ha aApec www.pinvoke.net [4]. To3m caMT 
c"bA"bp>Ka 6oraT Ha6op ot no-necro M3no/i3BaHM cpyHKUMM ot Windows API, 
CbOTBeTHMTe mm .NET AecpMHMUMM (Ha C# v\/v\nv\ VB.NET), KaKTO m npMMepeH 
koa, komto noKa3Ba KaK MoraT Aa 6tAaT M3BMKaHM npe3 P/Invoke. 

ATpn6yT DMImport 

KaKTO BMA^xMe no-rope, 3a Aa M3BMKaMe M36paHa ot Hac API cpyHKUMM e 
Heo6xoAMMO Aa yKaweM b kom DLL ce HaMMpa th. OnMCBaHeTO ce M3B"bpujBa 
AeK/iapaTMBHO c noMOLirra Ha aTpM6yTa Diiimport. To3m aTpM6yT ce npM/iara 
caMO Btpxy MeTOAM. C HeroBa noMOiu ce MapKMpa cbOTBeTHMa MeTOA ot 
ynpaB/iHBaHMH K/iac KaTO npoKCM kbm HeynpaB/iHBaHMH koa. MeTOAMTe Tpa6Ba 
3aA"b/i>KMTe.nH0 Aa 6tAaT MapKMpaHM KaTO static extern. YKa3BaHeT0 Ha 
>Ke^aHMfl DLL craBa npM KOHCTpyMpaHeTO Ha aTpM6yTa, KaKTO e noKa3aHO b 
cneABamMfl npMMepeH koa: 



[Dll Import ("user 32 . dll", EntryPoint="LoadIconW" , 
ExactSpelling=true, CharSet=CharSet . Unicode) ] 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 637 



public static extern IntPtr LoadPredef inedlcon ( IntPtr hinst, 
IntPtr icon) ; 



no noflpa36npaHe, aKO He 3afla,qeM ctomhoct Ha cbomctboto Entry-Point, 
aTpn6yrbT M3no/i3Ba MMeTO Ha MeTOAa, 3a fla HaMepn API c|DyHKUMflTa b 
yKa3aHMfl DLL. ATpw6yTbT Dllimport hm flaBa B"b3MO>KHOCT fla M3no/i3BaMe 
MMe Ha API cJDyHKUMATa pa3/ikmHO ot MMeTO Ha MeTOfla b ynpaB/iflBaHkia koa. 
KoraTO M3pn4HO yKa3BaMe MMeTO Ha BXOflHaTa TOUKa b ki3no/i3BaHkisi DLL, 
Tpa6Ba fla ce i/ma npeflBkifl, ne e B"b3MO>KHO TOBa MMe fla ce pa3/iwnaBa b 
Windows 9x v\ b Windows NT. npwukmaTa 3a TOBa e ,qo6aBeHaTa nofl,qp"b>KKa 
Ha Unicode b Windows NT v\ c/ieflBamwTe My Bepcun (Windows 2000, XP, 
2003, ...). 




KoraTO M3no/i3BaTe cbomctboto EntryPoint Tpn6Ba cbBceM 
tohho fla ere yKa3a/in cwmaTypaTa Ha C# MeTOfla. Ako HMa m 
CbBceM Ma/iKO HecbOTBeTCTBMe e Bb3MO)KHO P/Invoke fla He 
yenee aBTOManmHO fla HaMepn 3aflafleHnn MeTOfl m pe3yn- 

TaTTaT OT M3BMKBaHeTO Ha C# MeTOfla Ifle 6~bfle M3K/1IOHeHlie 

ot Tuna system. NuiiReferenceException - "Object reference 
not set to an instance of an object." 



ANSI m Unicode Bepcim Ha API cbyHKijMMTe 

B 3aBMCMMOCT ot BepcwflTa Ha Windows ce w3no/i3Ba pa3/ikmeH Ha6op ot API 
c|DyHKUMM - ANSI m Unicode Bepcua. 3a fla Mowe fla ce o6pa6oT5rr Unicode 
cmmbo/ihm HM30Be e Heo6xoflkiMO BceKM napaMeTbp, yKa3Baiu ci/iMBO/ieH hm3, 
fla 6"bfle fleK^apupaH KaTO TaKbB. B npoTMBeH c/iynai/i npn onuT 3a neTeHe Ha 
ANSI hm3 ot Unicode napaMeTbp v\nv\ o6paTHOTO HaM-necro me flOBefle ao 
npo4MTaHe Ha HeKopeKTHM flaHHM v\nv\ flopn ao rpewKa ot Tun 'page fault'. 

B noconeHkia no-rope npuMep ce Ttpci/i BXOflHaTa TOUKa Loadiconw ot 
6n6/iwoTeKaTa user32.dll. CycJDMKCbT 'w' b c/iynaa 03HanaBa, ne Tpa6Ba fla ce 
3apeflM Unicode Bepcua. Ako ce i/i3no/i3Ba cyc|DMKC 'a', Hanp. LoadiconA, .NET 
Framework me ce o6"bpHe kbm ANSI BepcuaTa Ha Ta3M c|DyHKUMfl. KoraTO 
Tpa6Ba fla ce Hanniue npi/i/io>KeHi/ie, KoeTO Tpa6Ba fla ce KOMni/i/iwpa KaKTO 3a 
Unicode, TaKa v\ 3a ANSI Bepcua, Haw-yflanHO e fla ce ki3no/i3Ba cbomctboto 
ExactSpelling KaTO My npMCBOMM CTOMHOCT false. ToBa cbomctbo onpe,qe/ifl 
aBTOMaTM^HO BepcuflTa Ha API cJDyHKUMATa cnopefl HacTpoMKMTe Ha npoeKTa v\ 
He e Heo6xoflMMO fla ce yKa3Ba cyc|DMKca Ha MMeTO Ha cJDyHKUMATa. no-Haflo/iy 
me pa3r/ieflaMe KaK CTaBa npeo6pa3yBaHeTO Ha cwMBO/iHHTe HM30Be v\ 
taxhoto KOflnpaHe b 3aBMCMMOCT ot w3no/i3BaHaTa n^aTCJDopMa. 

kl3B/iimaHe Ha pe3y/uaT ot API cpyHKLtmi 

M3B^M4aHeTO Ha pe3y/iTaTa ot M3BMKaHaTa cJDyHKuna CTaBa c noMOurra Ha 

MeTOfla Marshal . GetLastWin32Error. 3a ue/lTa e Heo6xOflMMO fla 3aflafleM 
CTOMHOCT true Ha CBOMCTBOTO SetLastError, MHa^e CTOMHOCTTa Ha BtpHaTMfl 



638 nporpaMnpaHe 3a .NET Framework (tom 2) 

pe3y/iTaT me ce 3ary6n nopaflki Me>KflyBpeMeHHO M3BMKaHa API cpyHKuna v\ to 
oiue npeflu ynpaB/ieHkieTO fla 6"bfle BtpHaTO Ha ynpaB/iflBaHkisi KOfl. 

kl3B/iimaHe Ha pe3y/uaT ot API cpyHKLiim - npHMep 

HeKa pa3r/ieflaMe KaK Moxe fla M3BMKaMe cpyHKuwaTa FindFirstFile ot 
6n6/inoTeKaTa kernel. dii. Ta3M cpyHKunfl c/iyww 3a HaMnpaHeTO Ha ntpBkm 
cpai/i/i OTroBapaiu Ha flafleHO TbpceHe. IHe M3no/i3BaMe P/Invoke, 3a fla 
M3BMKaMe HeynpaB/iflBaHaTa cpyHKuna, c noMOurra Ha C# MeTOfl, komto 
npenMeHyBa M3BMKBaHaTa cpyHKuna, v\ me i/i3B/ieneM pe3y/iTaTa ot HewHOTO 
M3n"b^HeHne. 

1. CTapTupaMe VS.NET v\ Cb3flaBaMe hob npoeKT ot Tun Class Library c 
MMe Interop. 

2. M36npaMe cb3flafleHMflT npoeKT ot Solution Explorer v\ c fleceH 6yTOH 
LUpaKaMe Add -> Add Class v\ 3a MMe Ha K/iac M36npaMe 

FileManagement . 

3. K"bM Cb3flafleHOTO VS.NET peiueHne ,qo6aBflMe hobo koh30/iho npw/io- 
xeHkie, KoeTO me M3no/i3BaMe, 3a fla crapTwpaMe K/iaca cb3flafleH b 
npeflHaTa crbnKa. 

4. ETO KaK M3r/ie>Kfla KOfl"bT Ha K/iac FileManagement flO MOMeHTa: 



using System; 

namespace Interop 

{ 

/// <summary> 

/// Summary description for FileManagement. 

/// </summary> 

public class FileManagement 

{ 

public FileManagement ( ) 

{ 
// 

// Add constructor logic here 
// 
} 
} 
} 



5. Cera flo6aBAMe MeTOfla FindFirsto, komto me HanpaBM Bp"b3KaTa c 
HeynpaB/iflBaHi/ia koa. 



public static extern IntPtr FindFirst ( string wildcard, ref 
FindFirstData fileData) ; 



6. TtM KaTO to3m MeTOfl ki3no/i3Ba CTpyKTypa, b koato Bptifla pe3y/iTaT ot 
TtpceHeTO, me flecpMHupaMe eflHa npa3Ha CTpyKTypa, koato fla w3no/i- 
3BaMe npn fleK/iapau.i/mTa Ha MeTOfla. 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 639 



public struct FindFirstData 

{ 

} 



7. flo6aBAMe peifcepeHui/m kbm npocTpaHCTBOTO ot MMeHa system. 

Runtime . InteropServices. 

8. flo6aBAMe aTpn6yTa [Diiimport] kbm MeTOAa ot npeAHaTa touio v\ 
MHMuna^M3MpaMe HeroBMfl KOHcrpyKTop c HM3a "kernel. dii". ToBa e 
MMeTO Ha <£ai/i/ia, b komto ce HaMupa HeynpaB/iflBaHaTa c|DyHKUMfl. 

9. 3aflaBaMe CTOMHOCT FindFirstFile Ha CBOMCTBOTO EntryPoint Ha 

aTpn6yTa Diiimport 3a fla yKa>KeM, KaKBO e MMeTO Ha M3BMKBaHaTa 
HeynpaB^ABaHa c|DyHKUMfl. 

10.3aflaBaMe ctomhoct true Ha cbomctboto setLastError Ha aTpn6yTa 
Diiimport, 3a fla yKaweM Ha P/Invoke, ne MCKaMe fla no/iynwM pe3y/i- 
TaTtT ot M3n"b/iHeHkieTO Ha c|DyHKUMflTa. 

11. rio/iyneHi/mT MeTOfl ao MOMeHTa M3r/ie>Kfla TaKa: 



[Diiimport ("kernel 32 . dll", EntryPoint=" FindFirstFile " , 




SetLastError=true) ] 




public static extern IntPtr FindFirst ( string wildcard, 


ref 


FindFirstData fileData) ; 





12.HeKa cera fla M3BMKaMe ynpaB/iflBaHi/i*i C# MeTOfl v\ fla OTnenaTaMe 
pe3y/iTaTa ot Hero. 

13.IHpaKaMe Btpxy koh30/ihoto npM/io>KeHMe v\ flo6aB*iMe KaTO Bp"b3Ka 

npoeKT"bT Class Library, Cbfl"bp>Kam K/iaca FileManagement. 

14. B MeTOAa Main Ha koh30/ihoto npi/i/io>KeHkie cb3flaBaMe HOBa noMOiflHa 

CTpyKTypa fileData OTTkina Interop. FindFirstData. 

15.flo6aBAMe pecJDepeHunfl kbm npocTpaHCTBOTO ot MMeHa system. 

Runtime . InteropServices. 

16.C/iefl KaTO cb3flafleM CTpyKTypaTa, npaBMM M3BMKBaHe Ha ynpaB/ia- 
BaHMfl MeTOfl m 3anncBaMe pe3y/iTaTa ot M3BMKBaHeTO Ha MeTOfla b 
npoMeH^MBa OTTun intPtr. 

17. CnnenaTBaMe Ha eKpaHa pe3y/iTaTbT ot M3BMKBaHeTO Ha Marshal. 

GetLastWin32Error. 
18. Eto ro pe3y^TaTHMfl koa: 



[STAThread] 

static void Main ( string [ ] args) 

{ 

Interop . FindFirstData fileData = new Interop . FindFirstData 
Interop. FileManagement . FindFirst (@"c: \* . *", ref fileData); 



640 flporpaMnpaHe 3a .NET Framework (tom 2) 



Console .WriteLine ( "Error is Ox{0:x}", 
Marshal . GetLastWin32Error ( ) ) ; 



} 



19.IHpaKBaMe Btpxy koh30/ihoto npn^OKeHne v\ M36npaMe "Set as Startup 
Project". 

20. CrapTwpaMe peujeHneTO no/iynaBaMe pe3y/iTaT 0x7f. ToBa e KOfltT 3a 
rpeujKa, BC/ie,qcTBi/ie ot w3no/i3BaHeTO Ha npa3Ha CTpyKTypa 
FindFirstData, KOATO HanpaBkixMe caMO 3a ue/ikiTe Ha npuMepa. KaTO 
noTtpcuM rpeujKa 0x7f (127 fleceTi/mHO) b MSDN b cnncbKa ot 
pe3y/iTaTMTe Ha GetLastErrorO - HeynpaB/iHBaH koa, me bmahm, ne 
Ta3M rpeujKa r/iacw: "The specified procedure could not be found." 

21.3a p,a OTcrpaHMM rpeujKaTa, e Heo6xoAHMO p,a 3aflaAeM npaBM/iHa 
fleK^apaunfl Ha crpyicrypaTa FindFirstData. TaKOBa onucaHne MO>xe 
fla HaMepuM Ha caMTa www.pinvoke.net . 

KaK pa6oTM P/ Invoke? 

KaK .NET Framework HaMupa aflpeca Ha API cpyHKUkisua, 3a fla npeflafle 
ynpaB/ieHkieTO Ha Hea? BceKM DLL cbfl"bp>Ka cnncbK c MMeHaTa Ha flecpn- 
HupaHMTe b Hero cpyHKunn. riponwTaHeTO Ha Te3M MMeHa MO>Ke fla crane c 
noMOurra Ha MHcrpyMeHT, komto me pa3r/ieAaMe cnep, Ma/iKO. 

KoraTO .NET Framework cpeiflHe MMe Ha DLL 3a ntpBM nvr, 3aflafleHO b 
aTpn6yTa Diiimport, to3m DLL ce 3ape>Kfla b naMerra. no MMeTO Ha 
cpyHKUMATa ce i/i3B/ikma to^hma aflpec Ha KOfla, komto Tpa6Ba fla ce i/i3n"b/iHki. 
Cnep, KaTO aflpecbT Ha cpyHKun^Ta e HaMepeH, ce M3B"bpujBa npeo6pa3yBaHe 
Ha flaHHMTe ot ynpaB/iflBaH kbm HeynpaB/i^BaH koa m KOHTpo/itT ce noflaBa Ha 
HeynpaB^ABaHMfl koa. ripouecbT Ha npeo6pa3yBaHe me pa3MeflaMe Ma/iKO 
no-HaTaTtK. 



& 



M3BMKBaHeTO Ha HeynpaBsiflBaH koa c P/Invoke Mowe fla 

XBlap/IM M3K/IK>HeHMe, 3aTOBa npOBepeTe M3PMHHO KaK pa6oTM 

M3BMKBaHaTa cpyHKMMn npM pa3/nmHM CbCTonHMn Ha rpeuiKa! 



KoMaHflaTa DUMPBIN 

3a fla pa3MeflaMe bcmukm cpyHKu.ni/i, komto flafleH .dll cpaw/i cbfltpxa, MO>Ke 
fla M3no/i3BaMe i/mcrpyMeHTa dumpbin. Tom ce pa3npocrpaHflBa 3aeflHO c MS 
Visual Studio v\ ce crapTi/ipa ot KOMaHAHi/m pefl. To3m MHcrpyMeHT MMa mhoto 
B"b3MO>KHOCTM, ho Hue me ce cnpeM caMO Ha eflHa ot tax - B"b3MO>KHOCTTa 3a 
nper/ieA Ha bcmukm bbhluhi/i (exported) cpyHKUkin 3a noconeHi/m DLL. Crapâ„¢- 
paHeTO Ha dumpbin craBa KaKTO e noKa3aHO b npuMepa: 



DUMPBIN /EXPORTS C : \WINDOWS\system32\user32 . dll 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 



641 



ordinal 


hint RVA name 


446 


1BD OOOOCBBB LoadlconA 


447 


1BE 000188E3 LoadlconW 



OyHKunnTe b flafleH DLL MoraT fla ce AOCTbnBaT ocBeH no MMe v\ no HOMep. 
HoMeptT Ha BCflKa c|DyHKUMfl e noKa3aH b KO/ioinaTa ordinal, a name e MMeTO, 
KoeTO ce 3aflaBa Ha aTpi/i6yTa [Diiimport] . no/ie3Ha MHCJDopMauMfl ce cbfltp- 
>Ka m b Kononaia RVA (Relative Virtual Address). ToBa e OTMecTBaHeTO, Ha 
KoeTO M3BMKBaHaTa c|DyHKUMfl ce HaMupa cnpaMO Hana/iOTO Ha 3aflafleHi/isi DLL. 
Pea/iHi/iflT aflpec, Ha komto ce HaMupa c|DyHKUMflTa cnefl KaTO noconeHwyi DLL 
6"bfle 3apefleH b naMerra, e paBeH Ha OTMecTBaHeTO Ha KoeTO e 3ape,qeH to3m 
DLL n/iioc CTOMHOcrra Ha RVA. 




Bi3mo>kho e M3BMKBaHeTO Ha API cpyHKMMnTa fla CTaHe no 
HOMep, a He no MMe. 3a Lie/ua Ha EntryPoint Tpn6Ba fla ce 
npncBOM HOMepbT ot ordinal xosiOHaTa, npeflxo>KAaH ot 3HaKa 
#. HanpMMep EntryPoint="#447". 



3ape>KflaHe Ha cwcreMHa MKOHa - npuMep 

HacTOfliunfl npuMep fleMOHcrpwpa KaK fla M3BMKaMe HeynpaB/iflBaHa <fcyHKu.km 
m fla npeo6pa3yBaMe pe3y/iTaTa ot HeynpaB/iaBaH kbm ynpaB/iyiBaH pecypc. 
KaTO pe3y/iTaT me npoMeHMM MKOHaTa Ha r/iaBHMJi npo3opeu Ha Windows 
Forms npi/i/ioxeHwe. 

1. C"b3flaBaMe hobo Windows Forms npM/io>KeHMe. 

2. KoMnn^npaMe v\ crapTwpaMe hoboto npw/io>KeHkie. 

3. ripo3opeu"bT Ha npw/io>KeHkieTO H3Me>Kfla noflo6HO Ha noKa3aHOTO no- 
flo/iy: 



Ot MSDN Library HaMnpaMe c|DyHKUMflTa Loadicon, koato c/iy>Kki 3a 
3ape>KflaHe Ha cucTeMHM mkohm. Ta3M c|DyHKUMfl npneMa flBa napaMe- 
Tbpa. ritpBUflT yKa3Ba aflpeca Ha MOfly/ia, ot komto 3ape>KflaMe MKOHaTa 
(b Haujufl c/iynaw ce noflaBa NULL), a BTopua - MMeTO Ha MKOHaTa (3a 
cucTeMHa MKOHa ce noflaBa HOMep pe3epBnpaH 3a BC^Ka eflHa MKOHa). 

C"b3flaBaMe fleK/iapau.klfl Ha MeTOfl LoadPredefinedlcon, KOflTO me 

M3no^3BaMe 3a Bp"b3Ka c HeynpaB/isiBaHaTa c|DyHKUMfl v\ v\ npw/iaraMe 
aTpn6yTa Diiimport, KaTO no to3m Hani/m pea/iHOTO MMe Ha HeynpaB/ia- 
BaHaTa <fcyHKu.i/m me 6"bfle HaMepeHO aBTOMaTMUHo: 



642 flporpaMnpaHe 3a .NET Framework (tom 2) 



[Dll Import ("user 32 . dll", EntryPoint="LoadIcon" ) ] 
public static extern IntPtr LoadPredef inedlcon ( IntPtr hinst, 
IntPtr icon) ; 



6. Ako MCKaMe fla yKaweM touhoto MMe Ha HeynpaB/iHBaHaTa cpyHKuna, 
Tpa6Ba fla npoBepuM MMeHaTa Ha cpyHKUMMTe b 6ki6/ikiOTei<aTa 

user32.dll C nOMOLflTa Ha KOMaHAaTa dumpbin. 

7. OTBap^Me "Visual Studio .NET 2003 Command Prompt" v\ CTapTupaMe 

KO M a HflaTa dumpbin c:\windows\system32\user32.dll /exports. 

8. B no/iyneHMfl cnncbK me OTKpneM flBe MMeHa, LoadiconA v\ Loadiconw, 
ctOTBeTHO 3a ANSI v\ Unicode Bepci/mTa Ha Ta3M cpyHKuna. 

9. l/l3nO/13BaMe CBOMCTBOTO ExactSpelling CbC CTOMHOCT true, 3a fla 

yKaxeM, ne me noflafleM touhoto MMe Ha cpyHKuwaTa: 



[Dll Import ("user 32 .dll", EntryPoint="LoadIconW" , 
ExactSpelling=true, CharSet=CharSet . Unicode) ] 

public static extern IntPtr LoadPredef inedlcon ( IntPtr hinst, 
IntPtr icon) ; 



10. Cb3flaBaMe KOHcraHTa, koato fla yi<a3Ba HOMepa Ha ci/icreMHaTa MKOHa, 
koato MCKaMe fla 3apeflMM. HoMepaTa Ha cucTeMHMTe mkohm ce HaMnpaT 
B-bB cpai/i/ia winuser.h ot Platform SDK. 



static IntPtr IDI ASTERISK = (IntPtr) 32516; 



11. Cnefl KaTO HanpaBMXMe fleK/iapau.i/mTa 3a P/Invoke cpyHKunaTa MOxeM 
fla HanpaBMM pea/iHOTO M3BMKBaHe. 

12. HeKa b c"b6nTneTO Load Ha cpopMaTa flo6aBMM cj\ep,uv\s\ koa, komto 
M3BMKBa 3ape>KflaHeTO Ha MKOHaTa, npeo6pa3yBa MaHwnynaTopa Ha 
MKOHaTa KtM ynpaB^ABaH o6eKT c noMOiflTa Ha craTMUHi/m MeTOfl icon. 

FromHandle ( ) , M npMCBOflBa ynpaB/lflBaHklfl 06eKT Ha CBOMCTBOTO Icon 

Ha r/iaBHMJi npo3opeu. 



private void MainForm_Load (ob j ect sender, System. EventArgs e) 

{ 

try 

{ 

// Get handle of the system icon 
IntPtr hicon = 

LoadPredefinedlcon (IntPtr . Zero, IDI_ASTERISK) ; 

if (hicon != IntPtr. Zero) 

{ 

// Create new object from the retrieved handle 
Icon icon = Icon . FromHandle (hicon) ; 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 643 





// Change the icon of the 


main window 




this. Icon = icon; 
} 






} 

catch (Exception exc) 

{ 

Debug . WriteLine ( "Exception : 

} 




} 


" + exc .Message) ; 



13. OcBo6o>KflaBaHe Ha cucTeMHM mkohm He ce npaBki. llopaAH Ta3M npn- 
4MHa b npuMepa HHMa koa, komto p,a M3BMKBa Dispose () MeTOAa Ha 
npoMeH^MBaTa icon. 

14. KoraTO 3ape>KAaMe MKOHa ot AaAeH c|3aM^, Tpa6Ba p,a MMaMe npeABMA, 
ne cnep, KaTO CBtpiuuM pa6oTaTa etc 3apeAeHaTa MKOHa, Tpa6Ba p,a 
M3BMKaMe MeTOAa Dispose o ki/iki HeynpaB/iflBaHaTa c|DyHKUMfl 
Destroyicon, 3a p,a ocbo6oahm cucTeMHMTe pecypcw. 

15. C/ieA KaTO crapTkipaMe npn^OKeHneTO me bmamm, ne CMe npoMeHki/iw 
ycnewHO MKOHaTa Ha rflaBHMJi npo3opeu: 



©Forml 



^jnjxj 



npeo6pa3yBaHe Ha flaHHM (marshalling) 

KaKTO CTaHa acho no-rope, npn npeMMHaBaHe ot ynpaB/isiBaH kbm HeynpaB- 
nnBan koa ce Ha/iara npeo6pa3yBaHe Ha TunoBeTe. ToBa ce npaBki noHe>Ke 
HeynpaB^ABaHaTa cpeAa He 3Hae hmluo 3a TOBa KaK p,a o6pa6oTM TunoBeTe Ha 
ynpaB^ABaHaTa cpeAa v\ o6paTHO. HanpuMep b eAHO C++ npi/i/io>KeHi/ie, KoeTO 
M3no^3Ba HeynpaB/iflBaH koa, ce Ha/iara p,a ki3no/i3BaMe Array o6eKT BtpHaT 
ot ynpaB/iHBaH koa. OneBkiAHO e, ne to3m Array o6eKT Tpa6Ba p,a ce 3anniue b 
HeynpaB^ABaH MacuB. KaKbB p,a e TuntT Ha to3m MacuB o6ane? fla/iki p,a e 
MacuB ot \\ei\v\ nwcna v\nv\ MacuB ot apo6hm ni/icna? A p,anv\ He cbAtpxa 

CMMBO/1HM HM30Be? A MO>Ke 6m CbA"bp>Ka 06eKTM ot AaAeH K/iac, 3a KOMTO 

HeynpaB^ABaHMfl koa H^Ma onucaHne? KaK ToraBa me no/iynwM v\ o6pa6oTMM 
pe3y/iTaTa? 

3a ocHOBHMTe TunoBe ot CTS ce npaBM aBTOMaTMUHO npeo6pa3yBaHe kbm 
HeynpaB^ABaH Tkin v\ o6paTHO. HacT ot tax ca noKa3aHM b Ta6/i. 1. Pa36npa 
ce, aBTOMaTMUHOTO npeo6pa3yBaHe MO>Ke p,a ce npoMeHa, KoraTO npeo6pa3y- 
BaHMTe ashhh ca no-cno>KHi/i. ToBa 6m ce Ha/io>Kki/io v\ b cnynai/i, KoraTO 
npeo6pa3yBaHeTO no noApa36npaHe 3aeMa mhoto naMeT. 

3a p,a pa36epeTe pa3/ikiKHTe npn npeAaBaHeTO Ha crpyKTypw v\ K/iacoBe e 
Heo6xoAMMO p,a ere HaacHO c TepMMHMTe onaKOBaHe v\ pa3onaKOBaHe (boxing 
m unboxing), komto ca onucaHM b TeMaTa 3a Common Type System (CTS) . 



644 



flporpaMnpaHe 3a .NET Framework (tom 2) 



B HacToamaTa TeMa me pa3r/ieflaMe npaBki/iaTa 3a npeo6pa3yBaHe Ha Tuno- 
BeTe Me>Kfly flBeTe cpeflu v\ me pa3r/ieAaMe hako/iko npuMepa: 



HeynpaB/ifiBaH mri 


YnpaB/ifiBaH Tun 


HANDLE 


System. IntPtr 


BYTE 


System. Byte 


WORD 


System. Ulntl 6 


DWORD 


System. UInt32 


FLOAT 


System. Single 


LPSTR, LPCSTR, LPWSTR, 
LPCWSTR 


System. String mjim 
System. StringBuilder 



npeo6pa3yeaHe Ha CTpyKTypii 

3a CTpyKTypnTe e M3BecTHO, ne ca ctomhocthm TunoBe, iokto e onucaHO b 
TeMaTa b TeMaTa 3a Common Type System (CTS) . KoraTO eflHa CTpyKTypa 
6"bfle onaKOBaHa, AOCTbnvr ao Hea ce ocbmecTBsiBa nocpeflCTBOM yKa3aTe/i, 
TtM KaTO CTpyKTypaTa ce HaMupa b AHHaMkmHaTa naMeT. 

AHa/iorwuHO npn HeynpaB/isiBaH koa CTpyKTypnTe cbiuo ce ctxpaHflBaT b 
CTeKa m ca ctomhocthm TunoBe. AApecvr Ha Ta3M CTpyKTypa MO>xe Aa ce 
nonynw npe3 onepaTop 3a n3B/iwnaHe Ha aApec (reference operator), ho 3a 
pa3/im<a ot CTpyKTypaTa b ynpaB/iABaHkifl koa, ta He ce onaKOBa v\ cbOTBeTHO 
He ce MecTM ot CTeKa b AHHaMkinHaTa naMeT. 

CtxpaHeHneTO v\ AOCTbntT ao crpyKTypwTe, MaKap v\ npuBMAHO Aa ca 
eAHaKBM, ca pea/in3wpaHi/i no pa3/ii/meH Hani/m b ynpaB/iHBaH v\ HeynpaB/isiBaH 
koa. BtnpeKM TOBa e yAo6HO Aa ce pa3r/ie>KAa, ne npn npeo6pa3yBaHe Ha 
croMHOcreH Tun ot eAHaTa cpeAa ce no/iynaBa ctomhoct6h Tun b APyraTa, a 
npi/i npeo6pa3yBaHe Ha yKa3aTe/i kbm CTpyKTypa ce nonynaBa onaKOBaHa 
CTpyKTypa v\ ce npeAaBa c noMOurra Ha ref napaMeTbp. 

Ta6/ii/iuaTa no-Aony noKa3Ba KaK craBa npeo6pa3yBaHeTO Ha CTpyKTypa ot 
HeynpaB/iflBaH koa KtM ynpaB/iflBaH koa h o6paTHO. 



DLLFunc (POINT x) O ManagedFunc (POINT x) 
DLLFunc (POINT* x) <-> ManagedFunc ( ref POINT x) 



OyHKunflTa DLLFunc () npeAcraB/iABa npuMepHa cpyHKuna ot HeynpaB/iaBaH 
KOA, a ManagedFunc ( ) e CbOTBeTHaTa AeK/iapauwfl Ha C#. 



Pa3no/iaraHe Ha no/ieTaTa ot CTpyKTypaTa 

B"b3MO>KHO e, KoraTO npeo6pa3yBaMe CTpyKTypa ot HeynpaB/isiBaH kbm ynpaB- 
nnBan koa, Aa ce ycraHOBM, ne hakom noneTa ziwncBaT b eAHaTa ot crpyKTy- 
puTe, a Apyrn He Tpa6Ba Aa ce npeo6pa3yBaT, 3aiuoTO ca TBtpAe roneMM v\ me 
HaTOBap^T m3^mujho npw/io>KeHi/ieTO. 06iuaTa cpeAa 3a ki3n"b/iHeHwe (CLR) 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 645 

flaBa B"b3MO>KHOCT fla ce yKawe cbOTBeTCTBkieTO Me>Kfly no/ieTaTa Ha i/i3xoflHaTa 
m KpawHaTa CTpyKTypa. ToBa CTaBa npe3 ki3no/i3BaHeTO Ha aTpn6yTa 

StructLayout. 

ATpM6yrbT StructLayout 

npn^araHeTO Ha StructLayout CTaBa Btpxy caMO Btpxy crpyKTypw v\ 
K/iacoBe. ripn KOHCTpynpaHeTO Ha aTpn6yTa ce 3a,qaBa KaK fla ce pa3no/io>KaT 
no/ieTaTa b CTpyKTypaTa b naMeTTa. KoraTO e Heo6xo,qi/iMO fla ce yKa>Ke 
touhoto OTMecTBaHe Ha bcako no/ie ot Hana/iOTO Ha CTpyKTypaTa, ce M3no/i3Ba 
CTOMHOCTTa LayoutKind. Explicit. KoraTO MCKaMe fla 3ana3MM pefla Ha 
OTMecTBaHeTO Ha pa3/ikmHHTe no/ieTa, MO>Ke fla ce i/i3no/i3Ba CTOMHOCTTa 
LayoutKind. sequential n cpeflaTa me noflpeflu no/ieTaTa b naMeTTa no pefla 
Ha AeK/iapwpaHeTO mm. ToBa e crowHOCTTa no noflpa36npaHe, koato ce 
npw/iara Btpxy CTpyKTypnTe, tbm KaTO e no-Bepo*iTHO Te fla ce i/i3no/i3BaT npn 
P/Invoke M3BMKBaHMfl. MMa v\ TpeTa ctomhoct npn KOHcrpywpaHeTO Ha 
aTpn6yTa - LayoutKind. Auto. ToBa e CTOMHOCTTa no no,qpa36kipaHe 3a K/ia- 
coBeTe. KoraTO i/i3no/i3BaTe Ta3M ctomhoct, .NET Framework aBTOMaTMUHO 
M36npa KaK fla noflpeflu no/ieTaTa ot CTpyKTypaTa c or/iefl Ha HaMa/iflBaHeTO 
Ha ro/ieMi/maTa Ha K/iaca v\ onTMMH3npaHe Ha pa6oTaTa Ha cwcreMaTa 3a 
ynpaB/ieHkie Ha naMeTTa. Ta3M ctomhoct o6ane, He no3BO/isiBa npeo6pa3y- 
BaHeTO Ha crpyKTypa kbm HeynpaB/iflBaH koa. 

ATpn6yrbT StructLayout - npMMep 

B c^eflBaiflMfl npuMepeH koa e M/uocTpwpaHO KaK ce ki3no/i3Ba aTpn6yTa 

StructLayout : 



[StructLayout (LayoutKind. Explicit) ] 
public struct SYSTEM_INFO 

{ 

[FieldOffset (0) ] 
public UIntl6 ProcessorArchitecture; 

[FieldOffset (4) ] 
public UInt32 PageSize; 

[FieldOffset (16) ] 
public UInt32 ActiveProcessorMask; 

[FieldOffset (20) ] 

public UInt32 NumberOf Processors; 
} 

[Dll Import ("kernel 32 .dll", EntryPoint="GetNativeSystemInf o" ; 
private static extern void _GetNativeSystemInf o ( 
ref SYSTEM_INFO syslnfo) ; 



B npuMepa ce M3no/i3Ba M3pn4HO noconBaHe Ha OTMecTBaHeTO Ha no/ieTaTa b 
CTpyKTypaTa. KoHKpeTHaTa ctomhoct Ha OTMecTBaHeTO Ha no/ieTO ce noflaBa 



646 nporpaMnpaHe 3a .NET Framework (tom 2) 

npe3 aTpn6yTa Fieidoffset. To3m aTpn6yT ce npM/iara caMO Btpxy no/ieTa v\ 
HflMa flpyrn CBOMCTBa. /JeK/iapMpaHaTa CTpyKTypa system_info ce M3no/i3Ba 

3a M3BMKBaHe Ha Windows API CpyHKUMflTa GetNativeSystemlnfo, koato e 

M3BeAeHa npe3 aTpn6yTa Diiimport ot 6n6/inoTeKaTa kernei32.dll. 

npeo6pa3yBaHe Ha K/iacoBe 

ripm-mmrbT 3a npeo6pa3yBaHe Ha K/iacoBe e aHa/iorwueH Ha to3m npn crpyK- 
TypnTe. 3a pa3/iMKa ot tax o6ane, K/iacoBeTe He ce npeAaBaT no ctomhoct, a 
no aflpec. Ta3M oco6eHOCT no3BO/i*iBa fla ce M3Btpujn npeo6pa3yBaHe Ha 
ABoeH yi<a3aTe/i ot HeynpaB/iflBaH kbm ynpaB/iflBaH koa m o6paTHO. B no- 
ropHaTa Ta6/iMua 6eiue noKa3aHO KaK ce npeAaBa CTpyKTypa npe3 ref napa- 
MeTtp. KaK o6ane me ce M3B"bpwM npeo6pa3yBaHeTO, aKO 3a napaMeTbp b 
HeynpaB^ABaHMfl koa ce noAaAe aApeca Ha aApeca Ha npeo6pa3yBaHaTa 
CTpyKTypa? 




B HeynpaB/iflBaH koa M3no/i3BaHeTO Ha aflpeca Ha aapeca Ha 
flafleHa CTpyKTypa ce Hasiara, KoraTO M3BMKBaii4Mn He 3afle/in 
naMeT 3a Ta3M CTpyKTypa, a TOBa ce npaBM ot M3BMKBaHMn 
MeTOfl. M3BMKBaLLtM5iT noaaBa mactoto, KiafleTO fla ce 3annuje 
aflpeca Ha 3afle/ieHaTa ot M3BHKBaHnn naMeT Ha CTpyKTypaTa. 



Ha np"bB noMefl 6m 6m/io /iotmuho p,a HanniueM cneAHOTo: 



DLLFunc (POINT** x) <-» ManagedFunc ( ref ref POINT x) - TPEIUHO 



TaKaBa KOHCTpyKuna, o6ane, He e no3BO/ieHa b C#. HaM-yqanHO b to3m cny- 
naw e pja ce M3no/i3BaT K/iacoBe. Te ce c"b3AaBaT b AHHaMkmHaTa naMeT v\ 
AaBaT oiue eAHO hmbo Ha aApecupaHe. Hpe3 tax craBa B"b3MO>KHO npeo6pa3y- 
BaHeTO Ha napaMeTpn, komto onucBaT abomhm yKa3aTe/iw. B to3m CMMCb/i, 
KoraTO M3no/i3BaMe K/iacoBe BMecTO CTpyKTypn, Ta6/iMuaTa no-rope ce npeA- 
CTaBfl no cneAHi/m HanMH: 



DLLFunc (Job* x) <-> ManagedFunc ( Job x) 
DLLFunc (Job** x) <-> ManagedFunc ( ref Job x) 



K/iacoBeTe, komto ce v\3uoj\3bsh npn npeo6pa3yBaHeTO ctiuo MMaT n/ieH npo- 
MeH^MBM, 3a komto e Hy>KHO Aa ce yKa>Ke peAa Ha npeo6pa3yBaHeTO mm. 
3aTOBa aTpM6yTa structLayout Moxe Aa ce npM/iara KaKTO Btpxy K/iacoBe, 
TaKa m Btpxy CTpyKTypM. 

npeo6pa3yBaHe Ha HM30Be 

npeo6pa3yBaHeTO Ha npMMMTMBHMTe TMnoBe b .NET kbm HeynpaB/isiBaH koa e 
cpaBHMTe^HO ziecHO nopaAM Ha/iMUMeTO Ha eKBMBa/ieHTHM TMnoBe b ynpaB- 
nnBan m HeynpaB^ABaH koa. npM cmmbo/ihmt6 HM30Be o6ane npeo6pa3yBaHeTO 
MMa hako/iko oco6eHOCTM, komto me pa3r/ieAaMe cera. 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 647 

Hn30BeTe ca Hen3MeHneMM 

ritpBa cbiuecTBeHa oco6eHOCT e, ne HM30BeTe b .NET ca Hen3MeHfleMM 
(immutable). HaKpaTKO TOBa 03HanaBa, ne BeAH"b>K cb3p.ap.eH epwn string 
o6eKT He Mowe fla 6tfle npoMeHHH. noBene MHCJDopMauMfl 3a TOBa Moxe pa 
no/iyni/ue ot TeMaTa 3a cmmbo^hm HM30Be . 

HM30BeTe Hac/ieflaBaT System. Object 

flpyra oco6eHOCT e, ne CMMBO/iHi/mT hm3 ce npeAcraBH npe3 o6eKT HacneAeH 
ot system. object. KaTO ce B3eMe npeABMA, ^e eAHH CMMBO/ieH 3HaK Moxe pa 
e npeACTaBeH b naMerra c eAHH v\nv\ hako/iko 6ai/iTa, b 3aBMCMMOCT ot 
KOAnpoBKaTa Ha ckiMBO/iHi/isi hm3, npeo6pa3yBaHeTO Ha eAMH ci/iMBO/ieH hm3 
CTaBa TpyAoeMKa 3aAana. BtnpeKM TOBa .NET Framework npeAOcraBH TaKOBa 
npeo6pa3yBaHe no noApa36npaHe v\ pasa b"B3mo>khoct pa ce HacrpoMBa KaK 
Aa ce M3B"bpujn npeo6pa3yBaHeTO. /Joirb/iHkiTe/iHaTa HacTpoMKa CTaBa npe3 
M3no^3BaHeTO Ha aTpn6yTa MarshaiAs v\ ce Ha/iara Haw-Hecro b cnynawTe, 
KoraTO KOAnpoBKMTe Ha HM3a b ABeTe cpeAM (ynpaB/isiBaHa v\ HeynpaB/iHBaHa) 
ca pa3^M4HM v\nv\ e Heo6xoAHMO Aa ce yKa>Ke ro/ieMkmaTa Ha npeo6pa3yBaHMfl 

HM3. 

String m/im StringBuilder? 

ripn no/iynaBaHe Ha CMMBO/ieH hm3 KaTO pe3y/iTaT ot M3BMKBaHeTO Ha 
HeynpaB/isiBaH koa ntpBOTO Heiuo, KoeTO MO>Ke 6m me HanpaBMTe e Aa 
AecJDMHupaTe no/ie ot Tkin string, KoeTO Aa no/iyni/i pe3y/iTaTa. Tpa6Ba Aa 
3anoMHMTe, ne nopaAH Hen3MeHfleMOCTTa Ha HM30BeTe, BCHKa npoMHHa Ha 
TeKyiuaTa ctomhoct Ha HM3a e HenpaBki/iHa v\ MO>Ke Aa AOBeAe ao rpeujKa c 
pa6oTaTa etc string o6eKTa (ci/iMBO/ieH hm3 b ynpaB/iflBaH koa ce npoMeHfl 
KaTO ce Konupa HeroBOTO cbAtpwaHkie b hob hm3). 3aTOBa KoraTO e Heo6xo- 
Ammo Aa ce BtpHe ci/iMBO/ieH hm3 ot HeynpaB/isiBaH koa ce i/i3no/i3Ba K/iacbT 
StringBuilder. CpeAaTa M3B"bpujBa aBTOMaTM^HOTO npeo6pa3yBaHe Ha Hey- 

npaB/lflBaHklfl CMMBO/ieH HM3 KbM 06eKTa StringBuilder. 

l~lpeo6pa3yBaHe Ha HH30Be npe3 StringBuilder 

npuMeptT no-pony noKa3Ba KaK ce M3no/i3Ba StringBuilder b eAHa Ma/iKa 
nporpaMa: 



using System 












using System 


Text; 










using System 


Runtime 


InteropServices; 








public class 

{ 

[Dlllmport 


GetComputerNameExample 








("kernel32") ] 








static ext 


ern bool 


GetComputerName (St 


ringBui 


lder 


name, 


ref int 


len) ; 










static voi 


d Main (s 


tring[] args) 









648 



flporpaMnpaHe 3a .NET Framework (tom 2) 



StringBuilder computerName = new StringBuilder (255 ) ; 

int len = computerName . Capacity - 1; 
GetComputerName (computerName, ref len) ; 

Console . WriteLine (computerName) ; 



} 



B npuMepa ce cb3AaBa o6eKT ot Tun StringBuilder MHMuna^M3MpaH c 
ntpBOHana/iHO Macro 3a 255 CMMBO/ia. MeTOAtT GetComputerName ( ) no/iy- 
naBa T03M StringBuilder o6eKT m HeroBaTa ro/ieMi/ma, v\ 3anncBa BptiuaHMfl 
pe3y/iTaT b Hero. Pe3y/iTarbT no/iyneH b StringBuilder o6eKTa ce OTnenaTBa 
Ha eKpaHa. 

ripeflaBaHeTO Ha ci/iMBO/ieH hm3 kbm HeynpaB/i^BaH koa CTaBa no-MHTyMTMBHO 
KaTO ce M3no/i3Ba K/iaca string, Btpxy komto ce npw/iara aTpn6yTa 
MarshaiAs KaKTO e onucaHO b c/ieABaiuaTa nacr. 



ATpn6yT MarshaiAs 

ATpn6yT"bT MarshaiAs wrpae ocHOBHa po/ia npn yKa3BaHeTO Ha >xe/iaHM5i 
cpopMaT Ha npeo6pa3yBaHeTO. ripi/i/iara ce Btpxy napaMeTpn, n/ieH-npoMeH- 
i\v\bv\ v\nv\ pe3y/uaT ot AaAeH MeTOA- HeroBaTa ynoTpe6a He e 3aA"b^>KMTe/iHa. 
Ako He ce yKa>Ke aTpn6yTa MarshaiAs, ce M3no/i3Ba npeo6pa3yBaHeTO no 
noApa36wpaHe 3a cbOTBeTHna Tun. ripn KOHcrpywpaHeTO Ha aTpn6yTa ce 
yKa3Ba kbm KaKtB Tun HeynpaB/isiBaH hm3 me ce M3B"bpujBa npeo6pa3yBaHeTO. 
Ako T03i/i hm3 ce npeAaBa no ctomhoct, T.e. na3M ce b creKa Ha HeynpaB- 
^ABaHMfl koa, e Heo6xoAMMO Aa ce 3aAaAe v\ ro/ieMkmaTa Ha HM3a. 3a Ta3M 
ue/i ce M3no^3Ba KOHCTaHTaTa sizeconst. rio-AO/iy e AaAeH npuMep KaK ce 

M3nO/13Ba aTpn6yTa MarshaiAs: 



HeynpaB/iflBaH koa 


YnpaB/inBaH koa 


struct STOCK 
{ 


[StructLayout (LayoutKind. Sequential , 

CharSet=CharSet . Auto) ] 
struct STOCK 
{ 


TCHAR ID [32] ; 


[MarshaiAs (UnmanagedType . ByValTStr , 

SizeConst=32) ] 
public String ID ; 


Char* Name ; 


[MarshaiAs (UnmanagedType . LPStr) ] 
public String Name ; 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 649 



WCHAR* Location; 
} 


[MarshalAs (UnmanagedType . LPWStr) ] 
public String Location; 
} 



B npuMepa ce noKa3Ba KaK CTpyKTypaTa stock, koato cbfltpwa pa3/ii/mHM no 
bma m KOAnpaHe cmmbo/ihh HM30Be ce onwcBa c noMOurra Ha MarshalAs aTpn- 
6yTa. 06"bpHeTe BHMMaHne KaK ce M3no/i3Ba sizeconst noneTO npn npeo6pa- 
3yBaHe Ha HeynpaB/isiBaH cmmbo/ich hm3 c npeflBapi/iTe/iHO ki3BecreH pa3Mep. 

flpyr Ba>KeH e/ieMeHT ot AafleHMAT npuMep e 3a,qaBaHeTO Ha nonero charset 
Ha aTpn6yTa structLayout. B npuMeptT e ki3no/i3BaHa ctomhoct charset. 
Auto, koato ocurypflBa M3no/i3BaHeTO Ha Heo6xoflkiMaTa KOflkipoBKa b 3aBncn- 
moct ot onepaunoHHaTa ci/icreMa. YnoTpe6aTa Ha Ta3M ctomhoct me OKa>Ke 
B/iwflHkie eflMHCTBeHO Btpxy noneTO id tbm KaTO 3a Hero e noconeHO, ne me 

npeo6pa3yBa Tkin UnmanagedType . ByValTStr, KOMTO nOfl06HO Ha HeynpaB/lfl- 

BaHnsq Tun tchar, e n/iaTifcopMeHO 3aBMCMM (Unicode - 3a Windows NT, 
Windows 2000, Windows XP, v\ Windows Server 2003; ANSI - 3a Windows 98 
M Windows Me). AKO npOMeHMM CTOMHOCTTa Ha CharSet C CharSet.Ansi v\nv\ 
CharSet . Unicode Lfle M3MeHMM KOflkipaHeTO Ha nO/ieTO ID CbOTBeTHO KbM 

ANSI v\nv\ Unicode He3aBMCMMO ot i/i3no/i3BaHaTa n/iaTifcopMa. 

MMn/ieMeHTMpaHe Ha 4>yHKi4i4$i 3a o6paTHO M3BMKBaHe 
(callback) 

OyHKUMATa 3a o6paTHO M3BMKBaHe cny>Kki, KaKTO roBopn MMeTO v\, 3a 
ocbmecTBflBaHe Ha o6paTHa Bp"b3Ka Me>Kfly M3BMKBaiuaTa v\ M3BMKBaHaTa 
c|DyHKUMfl. 3a Haw-npocT npuMep MO>Ke fla noconi/iM API <£yHKUi/mTa 
setwaitabieTimer() , KOATO npweMa 3a napaMeTbp ki>m KOfl c|DyHKUMfl fla ce 
o6"bpHe cnep, KaTO M3Tene 3aflafleHna ot M3BMKBaiunfl MHTepBa/i. OyHKunnTe 
3a o6paTHO M3BMKBaHe He ca hmluo hobo b CBeTa Ha Win32 nporpaMnpaHeTO, 
3aTOBa MaMKpococ|DT ca npeflocraBki/iki zieceH Hani/m 3a TaxHaTa noflflp"b>KKa b 
.NET Framework. noflo6HO Ha Win32 KOfla, b komto Tpa6Ba fla flecJDMHupaMe 
MeTOfl OTroBapaiu fla onpefle/ieHa fleK/iapauw*!, TaKa v\ b .NET Framework e 
Heo6xoflMMO fla MMn/ieMeHTi/ipaMe MeTOfl, komto OTroBapa Ha fleK/iapauwflTa 
onpefle^eHa c noMOurra Ha delegate. TaKa, aKO B3eMeM 3a npuMep cJDyHKun- 
ATa 3a o6paTHa Bpt3Ka EnumwindowsProc, KOATO ce M3no^3Ba ot Windows API 
cJDyHKUMATa Enumwindows m MMa cneflHaTa fleK/iapaui/ia: 



BOOL CALLBACK EnumWindowsProc (HWND hwnd, LPARAM lParam) ; 



B ynpaB^ABaHMfl koa e Heo6xoflMMO fla fleK/iapwpaMe fle/ieraT etc cbOTBeT- 
hoto onucaHne Ha napaMeTpnTe. HanpuMep: 



public delegate bool CallBack(int hWnd, int 1 Par am) ; 



650 nporpaMnpaHe 3a .NET Framework (tom 2) 

no T03i/i Ha^MH npn KOHCTpynpaHeTO Ha TaicbB fle/ieraT ce 3aflaBa MeTOfla ot 
ynpaB^flBaHMfl koa, komto fla ce i/i3n"b/iHki. 3a noBene MHCpopMauna Bkiacre 
TeMaTa 3a fle/ieraâ„¢ v\ Cb6mna . 

npeo6pa3yBaHe Ha namm - npiiMep 

Cera me pa3r/ieflaMe npuMep, komto fleMOHCTpupa pa3/iwnHn BMflOBe Ha 
npeo6pa3yBaHe Ha ashhh. 

1. OTBapflMe peiueHMeTO Demo-2-Marshalling.sln. 

2. OTBapflMe Cpaw/ia MarshallingDemo.es. 

3. HeKa pa3r/ieAaMe cbAtpwaHi/ieTO Ha Main MeTOfla: 



static void Main ( string [ ] args) 

{ 

// Get and print full path to current executable 

string moduleFullPath = Module . GetFullPath () ; 

Console .WriteLine ( "Executable path: {0}\n", moduleFullPath) 

// Get and print hardware configuration 

Machine. SYSTEM_INFO sysinfo = Machine . GetSystemlnfo () ; 

Console .WriteLine ( "Processor architecture: {0}", 

sysinfo . ProcessorArchitecture) ; 
Console .WriteLine ( "Page size and granularity of page " + 

"protection: {0}", sysinfo.PageSize) ; 
Console .WriteLine ( "Processors ' mask: {0}", 

sysinfo . ActiveProcessorMask) ; 
Console .WriteLine ( "Number of processors: {0}", 

sysinfo . NumberOf Processors ) ; 
Console .WriteLine ( "Processor type: {0}", 

sysinfo . ProcessorType) ; 
Console .WriteLine ( "Virtual memory granularity: {0}", 

sysinfo . AllocationGranularity) ; 

// Get and print titles of all windows 
string [] desktopWindowsTitles = 

Window. GetDesktopWindowsCaptions ( ) ; 
Console .WriteLine ( "\nDesktop windows titles:"); 
foreach ( string title in desktopWindowsTitles) 

{ 

Console .WriteLine (title) ; 

} 
} 



4. B n"bpBaTa nacr Ha MeTOfla n3B/iwnaMe v\ crmenaTBaMe irb/iHi/ia nvr Ha 
TeKyiunfl M3n"b^HMM cpaw/i. ToBa craBa KaTO M3BMKBaMe MeTOfltT 

GetFullPath Ha K/iaca Module OT Cpaw/ia Module.cs. 

5. OTBapflMe Cpafi/ia Module.cs. 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 651 
6. fleK/iapwpaMe MeTOfla _GetModuleFileName ( ) : 



[Dll Import ("kernel 32 . dll", EntryPoint="GetModuleFileName" , 

ExactSpelling=f alse, CharSet=CharSet . Auto) ] 
private static extern UInt32 _GetModuleFileName ( IntPtr hModule, 

StringBuilder lpFileName, UInt32 nSize); 



7. HeKa pa3r/ie,qaMe MeTOfla GetFuiiPath ( ) 



public static string GetFuiiPath ( ) 

{ 

StringBuilder modulePath = new StringBuilder (MAXPATH) ; 
UInt32 uiSize = _GetModuleFileName ( IntPtr . Zero, modulePath, 

(uint) modulePath . Capacity + 1 ) ; 
modulePath . Length = (int) uiSize; 

return modulePath . ToString () ; 
} 



8. ritpBO cb3flaBaMe HOBa MHCTaHuna Ha K/iaca StringBuilder c Kana- 

UMTeT MAXPATH. 

9. Cnefl M3BMKBaHeTO Ha MeTOfla _GetModuieFiieName ( ) ioto pe3y/iTaT 
no/iynaBaMe b uisize ko/iko e hd/iam HM3a BtpHaT ot HeynpaB/iHBaHi/m 

KOfl. 

10. TtM KaTO 3a ynpaB/iABaHi/m koa He e M3BecTHO ko/iko to/iam e 
BtpHaTMfl hm3, Tpa6Ba fla 3afla,qeM Ha cbomctboto Length no/iyneHaTa 
ro/ieMkma ot uisize. 

11. B"bB BTOpaTa naCT OT Main M3BMKBaMe Machine. GetSystemlnf o ( ) 3a 

fla no/iynwM MHCJDopMauMfl 3a npouecopa v\ Ha/iwuHaTa naMeT. 

12. OTBapflMe CJDaM^a Machine, cs. 

13. B to3m <\>av\n no aHa/iori/meH HanwH KaKTO b Module. cs M3BMKBaMe 

HeynpaB^flBaHaTa (fcyHKUklfl GetNativeSystemlnfoO : 



public static SYSTEM_INFO GetSystemlnf o ( 

{ 

SYSTEM_INFO syslnfo = new SYSTEM_INFO i 
_GetNativeSystemInf o ( ref syslnfo) ; 

return syslnfo; 
} 



14. OyHKunflTa GetNativeSysteminfo npweMa KaTO napaMeTbp aApeca Ha 
CTpyKTypaTa, b kohto me 3anmue pe3y/iTaTa, 3aTOBa Tpa6Ba fla 
noflafleM CTpyKTypaTa no a,qpec (c MOflnc|DMKaTop ref): 



652 flporpaMnpaHe 3a .NET Framework (tom 2) 



[Dll Import ("kernel 32 . dll", EntryPoint="GetNativeSystemInf o" ; 
private static extern void _GetNativeSystemInf o ( 
ref SYSTEM_INFO syslnfo) ; 



15. f\ony^eHv\9\T pe3y/iTaT 3anncBaMe b CTpyKTypaTa system_info, 3a 
koato CMe yi<a3a/iki, ne ce pa3no/iara nocneAOBaTe/iHO b naMeTTa c 

aTpn6yTa [StructLayout(LayoutKind. Explicit) ] . 

16. ritpBUTe flBe no/ieTa ot Ta3M CTpyKTypa npeAcraB/iflBaT union no 
AecpMHMunflTa Ha HeynpaB/iflBaHaTa CTpyKTypa, 3aTOBa Te ce 
pa3no/iaraT Ha ep,no v\ cbu\o OTMecTBaHe b crpyKTypaTa c aTpn6yTa 

[FieldOffset(O) ] : 



[Struc 


tLayout (Layou 


tKind.E 


xplicit ) ] 


public 

{ 

[Fie 


struct SYSTEM INFO 






IdOffset (0) ] 


public 


UInt32 


Oemld; 


[Fie 


IdOffset (0) ] 


public 


Ulntl6 


ProcessorArchitecture; 


[Fie 


IdOffset (4) ] 


public 


UInt32 


PageSize; 


[Fie 


IdOffset (16) ] 


public 


UInt32 


ActiveProcessorMask; 


[Fie 


IdOffset (20) ] 


public 


UInt32 


NumberOf Processor s; 


[Fie 


IdOffset (24) ] 


public 


UInt32 


ProcessorType; 


[Fie 
} 


IdOffset (28) ] 


public 


UInt32 


AllocationGranularity; 



17. B TpeTaTa nacr Ha MeTOAa Main() M3BMKBaMe MeTOAa window. 

GetDesktopWindowsCaptions ( ) , KOMTO HI/I Bptiua MMeHaTa Ha BCM4KM 

npo3opun ct3AaAeHM Ha TeKyiuna pa6oTeH n/iOT (desktop) KaTO MacuB 

OT HM30Be. 

18. OTBap^Me cpaw^a window. cs. 

19. B Hero MMaMe AecpuHnpaHM ABa P/Invoke MeTOAa: 



[Dll Import ( "user 32 . dll" , EntryPoint="EnumDesktopWindows" , 

ExactSpelling=f alse, CharSet=CharSet . Auto, SetLastError=true) 

private static extern bool _EnumDesktopWindows ( IntPtr hDesktop, 
EnumDelegate IpEnumCallbackFunction, IntPtr lParam) ; 

[Dll Import ("user 32 .dll", EntryPoint="GetWindowText" , 

ExactSpelling=f alse, CharSet=CharSet . Auto, SetLastError=true) 

private static extern int _GetWindowText ( IntPtr hWnd, 
StringBuilder lpWindowText, int nMaxCount); 



20. MeTOA"bT _EnumDesktopWindows ( ) o6xo>KAa BCM4KM Cb3AaAeHM 
npo3opun no noAaAeH pa6oTeH n/iOT v\ M3BMKBa callback cpyHKumi 3a 
o6pa6oTKa Ha pe3y/iTaTa. 

21. MeTOAtT _GetwindowText ( ) Bptiua 3ar/iaBkieTO Ha npo3opeu no 
3aAaAeH MaHwnynaTop. 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 653 
22. 3a flecJDMHupaHe Ha callback c|DyHKUMfl M3no/i3BaMe Ae/ieraTa 

EnumDelegate : 



private delegate bool EnumDelegate ( IntPtr hWnd, int lParam); 



23. HeKa pa3r/ieAaMe cbiunHCKOTO M3BMKBaHe Ha MeTOfla 

_EnumDesktopWindows ( ) : 



/// <summary> 

/// Get titles of all main windows 

/// </summary> 

public static string [] GetDesktopWindowsCaptions ( ) 

{ 

mTitlesList = new ArrayList ( ) ; 

EnumDelegate enumfunc = new EnumDelegate (EnumWindowsProc) ; 
IntPtr hDesktop = IntPtr . Zero; // current desktop 
bool success = _EnumDesktopWindows (hDesktop, 
enumfunc, IntPtr . Zero) ; 

if (success) 

{ 

// copy result to array of strings 

string [] titles = new string [mTitlesList . Count] ; 

mTitlesList. CopyTo (titles) ; 

return titles; 

} 
else 

{ 

// get last error code 

int errorCode = Marshal . GetLastWin32Error () ; 

string errorMessage = String . Format ( 

"EnumDesktopWindows failed with code {0}.", errorCode) 
throw new Exception (errorMessage) ; 
} 
} 



24. Cb3AaBaMe MHCTaHuna Ha Renerara EnumDelegate ot MeTOAa 

EnumWindowsProc ( ) . 

25. MeTOA"bT EnumWindowsProc B3MMa 3ar/iaBkieTO Ha noflaAeHMfl npo3opeu 

KaTO l/l3nO/13Ba nOMOlUHMfl MeTOA GetWindowText ( ) l/l TO A06aBfl K"bM 
06lU cnMC"bK mTitlesList: 



private static bool EnumWindowsProc ( IntPtr hWnd, int lParam) 

{ 

string title = GetWindowText (hWnd) ; 
if (title. Length > 0) 

{ 

mTitlesList .Add (title) ; 



654 



flporpaMnpaHe 3a .NET Framework (tom 2) 



return true; 



} 



/// <summary> 

/// Get window title from HWND . 

/// </summary> 

public static string GetWindowText ( IntPtr hWnd) 

{ 

StringBuilder title = new StringBuilder (MAXTITLE ) ; 
int titleLength = _GetWindowText (hWnd, title, 

title . Capacity + 1 ) ; 
title. Length = titleLength; 



return title . ToString i 



} 



26. M3BMKBaMe MeTOfla _EniomDesktopwindows() KaTO 3a irbpBki napaMerbp 
My noAaBaMe ctomhoct intptr.zero, KoeTO 03HanaBa, ne MCKaMe p,a 
o6xoflMM npo3opunTe Ha TeKymi/m pa6oTeH n/icrr. 3a btopm napaMerbp 

nOflaBaMe MHCTaHUklflTa Ha fle/ieraTa EnumDelegate - enumfunc. 

27. ripn Heycnex M3nO/13BaMe MeTOAa Marshal . GetLastWin32Error 3a Rd 

M3B/ieneM cucTeMHaTa rpeujKa. 

28. ripn ycnex KonnpaMe cbAtpaoHkieTO Ha cnwcbKa b MacuB ot HM30Be v\ 
ro BptiuaMe Ha Merofla Main. 

Eto KaK H3Me>KAaT ntpBMTe hako/iko peAa ot M3n"b/iHeHi/ifl npuMep: 



~ C:\WINDOWS\system32\cmd.exe 



Executable path: D:\Demo-2-Marshalling\bin\Debug\Demo-2-Marshalling.exeB 

Processor architecture: 

Page size and granularity of page protection: 4096 

Processors' mask: 1 

Number of processors: 1 

Processor type: 586 

Virtual memory granularity: 65536 

Desktop windows titles: 

SysFader 

Font 

Mail 

CiceroUIWndFrame 

SysFader 

SysFader 

SysFader 

Lookout 

Babylon 

CiceroUIWndFrame 






T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 655 

B3anMOfleMCTBne c COM (COM interop) 

C/ieA KaTO ce 3ano3HaxMe no KaKbB Hani/m MO>KeM p,a M3BMKBaMe cJDyHKunn ot 
onepaunoHHaTa cwcreMa nocpeflCTBOM P/Invoke v\ KaK p,a MapLua/iw3npaMe 
npexBtp/iflHMTe flaHHM, HeKa cera pa3r/ieAaMe hakom no-c/io>KHM Hani/mi/i 3a 
B3anMOAeMCTBneTO c HeynpaB^ABaH koa, a MMeHHO pa6oTa c COM o6eKTM. 

KaKBO e COM? 

OcHOBHa 3aAa4a Ha .NET Framework e p,a ocurypn npew3no/i3BaeMOCT Ha Cb3- 
AaAeHMTe KOMnoHeHTM ot eAHa cwcreMa b Apyra, He3aBncnMO ot ki3no/i3BaHHH 
e3MK 3a nporpaMnpaHe. ripeAM no^BaTa Ha .NET Framework MaMKpococ|DT 
onuTaxa p,a peiuaT npo6/ieMa c npen3no/i3BaeMOCTTa c noMOurra Ha COM 
(Component Object Model). COM e o6eKTeH MOAe/i 3a cb3AaBaHe v\ M3BMKBaHe 
Ha KOMnoHeHTM. Tom ce i/i3no/i3Ba v\ p,o AHec, ho MMa CBOMTe npeAMMCTBa v\ 
HeAOCTaTbun. COM no3BO/iHBa OTAe/iflHeTO Ha ojp,ei\uv\ wopynw b KOMnoHeHTM, 
komto MoraT p,a ce M3no/i3BaT ot Apyrn npM/io>KeHMfl, He3aBMCMMO ot e3MKa, c 
komto ca cb3AaAeHki. BceKM KOMnoHeHT 3asiBflBa CBO^Ta <£yHKu.kiOHa/iHOCT, 
npe3 AecJDMHupaHeTO Ha MHTepc|DeMC. M3BMKBaiunflT koa MO>Ke p,a pa3no3Hae 
to3m MHTepc|DeMC ome Ha hi/ibo KOMnn^aunfl v\nv\ p,a M3no/i3Ba AHHaMMUHO 
pa3no3HaBaHe MHTepc|DeMca no BpeMe Ha M3n"b/iHeHne Ha nporpaMaTa. 

KaTO bcm4ko xy6aBO, o6ane COM v\wa hakom HeAOcraTbuw. HacT ot tax ca 
M3no/i3BaHeTO Ha HeynpaB/iflBaH koa T.e. /ii/mca Ha MexaHM3"bM 3a cb6wpaHe 
Ha 6oK/iyKa, B"b3MO>KHOCT 3a npent/iBaHe Ha 6y<fcepi/i v\ AP- COM v\wa v\ 
npo6/ieMM c npow3BOAHTe/iHOCTTa npn M3no/i3BaHeTO b ro/ieMM mhotohmiukobm 
cm ere mm, oco6eHO KoraTO ce ocbiuecTBABa M3BMKBaHe Me>KAy KOMnoHeHTM 
ct3AaAeHM b pa3/ii/mHki anapTaMeHTM. 




Ouje npM cb3flaBaHeTO Ha eflMH COM o6eKT ce yKa3Ba KaKbB 
MOfle/i 3a flocTi»n no3BO/inBa o6eKTa. To3m Moqeji 3a flocrbn 
ce HapMna ome "anapTaMeHT". GbiijecTByBaT hhkojiko BMfla 
anapTaMeHTM - STA (single threaded apartment), MTA 
(multithreaded apartment) m TNA (thread neutral 
apartment). M3BMKBaHeTO Ha MeTOfl Ha COM o6eKT, komto e 
cb3flafleH b anapTaMeHT pa3/iMneH ot to3m Ha v\3Bv\KBa\i\v\n , c 
HnKOM M3K/iK>HeHmj, e BpeMeoTHeMauta 3aflana nopaaw Hy>K- 

flaTa OT M3BMKBaHe Ha flOni>/1HMTe/ieH CMHXpOHM3MpaiJ4 KOA- 



Biifloee COM o6eKTM vx perncTpauim 

CnopeA Hankma Ha M3n"b/iHeHkie COM o6eKTMTe ca ABa BMAa - in process v\ out 
of process. KoraTO COM o6eKT"bT ce M3n"b/iH*iBa b aApecHOTO npocTpaHCTBO Ha 
M3BMKBaiunfl npou.ec, to3m COM o6eKT e ot Tun in process. HaM-necro TaKbB 
COM o6eKT ce 3ana3Ba b DLL dpav\n. 3a p.a MO>Ke p.a 6tAe otkpmt T03M DLL 
<\>av\n KaTO cpaii/i cbAtpwam COM o6eKT e Heo6xoAHMO tom p,a 6"bAe perncTpn- 
paH b Windows Registry. Peri/icrpaui/mTa CTaBa no cbBceM zieceH HanwH KaTO 



656 nporpaMnpaHe 3a .NET Framework (tom 2) 

ce M3nO/13Ba MHCTpyMeHTa regsvr32 /i <MMe Ha $afijia>. ripeMaxBaHeTO Ha 
COM o6eKTa ot Registry craBa c napaMeTbpa /u. 

B"b3MO>KHO e fla ce c"b3AaAe COM o6eKT, komto p,a ce M3n"b/iH*iBa b co6cTBeHO 
aflpecHO npocTpaHCTBO T.e. b OTRenen npou.ec. TaKMBa COM o6eKTM ce 
Hapn^aT 'out of process' v\ ce cbxpaHABaT b EXE cpaw/iOBe. 3a tax cbu\o e 
Heo6xoAMMa perncTpauna, ho ta ce M3BtpujBa 6e3 Aont/iHMTe/ieH 
MHCTpyMeHT, a npe3 crapTkipaHe Ha EXE cpaw/ia c napaMeTbp /regserver. 
ripeMaxBaHeTO Ha perncTpaunaTa CTaBa CbOTBeTHO c napaMerbpa 

/unregserver. 

CTpyKTypa Ha COM o6eKTMTe 

Pa6oTaTa Ha COM o6eKTMTe ce 6a3npa Ha floroBopn (KOHTpaKTu). BceKM COM 
o6eKT o6flBABa CBO^Ta cpyHKui/iOHa/iHOcr nocpeACTBOM MHTepcpewc. BeAHtw 
c/ieA KaTO o6abm AaAeH MHTepcpewc COM o6eKTa rapaHTupa, ne H^Ma p,a 
npoMeHfl to3m MHTepcpewc. Ako ce Ha/io>Kki p,a ce Ao6aBM v\nv\ npoMeHM 
AecpMHMunflTa Ha hakom MeTOA, COM o6eKTa Tpa6Ba p,a npeAOcraBM hob 
MHTepcpewc. ripn npoMAHa Ha Bene cbiuecTByBaiu MHTepcpewc 6m Hacrbrm/ia 
pa3/im<a Me>KAy onaKBaHaTa v\ pea/iHO ki3no/i3BaHaTa AecpMHuuna Ha 
MHTepcpewca v\ npw/io>i<eHMeTO, KoeTO M3no/i3Ba to3m MHTepcpewc MO>Ke p,a 
cnpe p,a pa6oTM. ToBa npaBki/io 3a 3ana3BaHe Ha AecpMHuunaTa Ha Bene 
ny6^MKyBaH MHTepcpewc ocurypaBa KOHTpaKT, npe3 komto ce nocTura eAHa 
ocHOBHa ue/i npn COM apxnTeKTypaTa - He3aBMCMMOCT npn o6HOB*iBaHe Ha 
BepcuflTa. 

MHTep<t>eiiCT>T IUnknown 

no CBOATa cbiuHOCT COM o6eKTMTe MoraT p,a 6"bAaT AOCTbnBaHM ot BceKM eAMH 
npouec v\nv\ HMUJKa. KoraTO 6"bAe M3BMKaH, COM o6eKTbT, Haw-o6mo Ka3aHO, 
npeAOCTaBfl yi<a3aTe/i kbm M3no/i3BaHaTa ot Hero naMeT. J\o MOMeHTa b komto 
M3BMKBaiunfl n p w k/i k> n w CBOATa pa6oTa c COM o6eKTa, Ta3M naMeT He Tpa6Ba 
Aa 6"bAe ocBo6o>KAaBaHa. Tbki KaTO eAMHCTBeHO M3BMKBaiunfl 3Hae Kora e 
npwK/uonM/i pa6oTaTa c COM o6eKTa, tom Tpa6Ba no HHKaicbB Hani/m Aa 
c"bo6iun 3a TOBa. riopaAn Ta3M npn^MHa BceKM COM o6eKT MMn/ieMeHTwpa 
3aA"b/i>KMTe.nHO MHTepcpewca iunknown. Hpe3 Hero ce c/ieAH 6poa Ha Bpt3KMTe 
Ha cb3AaAeHMTe Bpt3KM kbm o6eKTMTe (T.Hap. reference counting). MHTep- 
cpewcbT iunknown AecpMHM pa ABa MeTOAa, c komto ce M3B"bpujBa OT6poaBaHeTO 

Ha Bp"b3KMTe. TOBa Ca AddRef M Release MeTOAMTe, CbOTBeTHO 3a OT6e^fl3- 

BaHe m 3a npeMaxBaHe Ha Bp"b3Ka. ripn M3BMKBaHeTO Ha AddRef v\ Release 
COM o6eKTbT e A-ntweH Aa ocurypn noAAP"b>KKaTa Ha BtTpeweH 6poan 3a 
6poa Ha Bpt3KMTe. ripn AOCTuraHe Ha Hy/ia, KoraTO 6"bAe M3BMKaH MeTOAa 
Release, COM o6eKTa MO>Ke Aa ocbo6oah 3aeMaHaTa ot Hero naMeT Tbv\ KaTO 

K"bM HerO HflMa aKTMBHH Bp"b3KM M M3BMKBaHeTO My He e B"b3MO>KHO. 

MHTepcpewcbT iunknown AecpMHupa oiue eAMH Ba>KeH MeTOA 
Query interface. Tom cny>Kki 3a npoBepKa p,anv\ COM o6eKTa noAA"bp>Ka AaAeH 
MHTepcpeMC. ripn Ha/lMUMe Ha TaiCbB MHTepcpeMC Querylnterface Bptiua 

yi<a3aTe/i kbm Hero, b npoTMBeH c^y^aki pe3y^TaTbT e null. 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 657 

llHTepcpeiicbT IDispatch 

noflo6HO Ha C#, COM o6eKTMTe no3BO/iflBaT cm/iho Tnnn3npaH flocrbn flo 
MeTOAMTe, komto npeAOcraBHT. ToBa y/iecHABa pa6oTaTa c tax m HaMa/iflBa 
B"b3MO>KHOCTTa 3a B"b3HMKBaHe Ha rpewKM ot KOCBeHcrro npeo6pa3yBaHe Ha 
eAMH Tun KtM Apyr, KoeTO 6m B"b3HkiKHa/io aKO ce no/i3Ba cna6o Tnnn3npaH 
AOCTbn. 

3a BCM4KM, KOMTO Ma/IKO V\I\V\ MHOTO Ca pa60TM/lkl C KOMniOTbp, e M3BeCTHO, ne 

ctiuecTByBaT ep,uv\ e3nun KaTO Visual Basic, VBScript, JScript, Hapi/maHi/i 
CKpunTOBM (scripting v\nv\ Automation) e3v\\\v\. Te3M Automation e3nun 
pa6oTAT etc cna6o Tnnn3npaH AOCTbn, KoeTO AaBa b"B3mo>khoct no BpeMe Ha 
M3nt^HeHne Ha nporpaMaTa p,a ce onpenennT MeTOAMTe Ha M3BMKBaHMTe 
o6eKTM m TexHMTe napaMeTpn. 3a pa3/im<a ot cm/iho TMnn3npaHMTe e3nun, 
ro/iflMa nacr ot Automation e3MUMTe He ce KOMnw/ikipaT v\ nopaAM Ta3M 
npn4MHa Te no/iynaBaT MHCJDopMauMfl 3a M3BMKBaHMfl o6eKT eABa b MOMeHTa Ha 

M3BMKBaHeTO My. 

3a Aa ce npeoAO/ie^T pa3/iwni/iflTa Me>KAy COM v\ Automation e3MUMTe ce 
B"bBe>KAa eAMH cneuwa/ieH MHTepc|DeMC IDispatch. Tom no3BO/i*iBa AHHaMMUHO 
Aa 6"bAaT otkpmtm MeTOAMTe m cbOTBeTHMTe napaMeTpn Ha COM o6eKTa, komto 
MMn/ieMeHTwpa to3m MHTepc|DeMC. CKpunTOBMTe e3nun npoBep^BaT 3a Ha/iwnn- 
eTO Ha to3m MHTepc|DeMC, npeAM Aa ce o6"bpHaT kbm AaAeHna COM o6eKT, 
npoBepyiBaT p,anw TtpceHna MeTOA cbiuecTByBa v\ p,anv\ e B"b3MO>KHO Aa ce 
npeo6pa3yBaT noAaAeHMTe napaMeTpn KbM napaMeTpnTe Ha M3BMKBaHMfl 

MeTOA- 

OCHOBHMTe MeTOAM, KOMTO IDispatch npeAOCTaBfl Ca GetlDsOfNames ( ) M 

invoked. rioAo6HO Ha TexHMKaTa "0Tpa>KeHi/ie" (reflection) b .NET Framework 
MeTOAtT invoke o no3BO/iflBa AHHaMM^HO, no BpeMe Ha ki3n"b/iHeHkie Ha 
nporpaMaTa, Aa ce M3BMKa MeTOA v\ p,a ce M3B/iene no/iyneHkifl pe3y/iTaT. 

M3BMKBaHe Ha COM o6eKT ot ynpaB/isiBaH koa 

KaKTO cnoMeHaxMe no-rope, eAHa ot r/iaBHi/iTe 3aAanki Ha Mai/iKpoco4)T npn 
cb3AaBaHeTO Ha ynpaB/isiBaHaTa cpeAa e 6w/ia Aa ocurypn zieceH v\ MHTyn- 
TMBeH HanwH 3a AOCTtn ao HeynpaB^ABaH koa. 3a ue/iTa MaMKpococ|DT 
B"bBe>KAaT i/i3no/i3BaHeTO Ha Interop aceM6/iw. ToBa e aceM6/iw, KoeTO cny>Kki 
KaTO moct Me>KAy HeynpaB^ABaHaTa v\ ynpaB/iflBaHaTa cpeAa. C HeroBa noMOiu 
ce ocbmecTBsiBa npeo6pa3yBaHeTO Ha AaHHM v\ AecJDMHupaHeTO Ha noMOiuHM 
TunoBe m K/iacoBe 3a y/iecHeHkie Ha "cpeAHOcraTMCTMnecKaTa KupKa" (6. a. 
KupKa = Konan, nporpaMMCT bmcalu nocroyiHHO npeA KOMniOTbpa v\ M3B"bpiu- 
BaiU MOHOTOHHO eAMH V\ CbU\V\ Tkin 3aAann). 

riOAo6HO Ha .NET aceM6/ikiTaTa, COM o6eKTMTe Cbu\o MMaT co6cTBeHO 
onucaHne Ha TunoBeTe, MeTOAHTe v\ K/iacoBeTe, komto cbAtpwaT. B COM 
o6eKTMTe TOBa onucaHne ce 3anncBa b TaKa HapeneHaTa TunoBa 6n6/ikiOTeKa 
(type library). TunoBaTa 6n6/ikiOTeKa MO>Ke Haw-^ecHO Aa ce pa3r/ieAa c 
MHCTpyMeHTa OLE-COM Object Viewer, komto ce pa3npocrpaHflBa c Microsoft 



658 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Platform SDK. rio-flo/iy e noi<a3aH eKpaH ot MHcrpyMeHTa noi<a3Bam TunoBaTa 
6n6^MOTeKa Ha cpai/i/ia comctri32 . ocx, komto ce pa3npocrpaHflBa c Windows. 



ITypeLib Viewer 



File View 



^jnjxj 



Hj â–¡] 



â– â– â– $* ComctlLib (Microsoft Windows Commorj 
B-^ dispinterface IVBDataObject 
E- ^ interface IVBDataObject 
El -(© coclass DataObject 
El-V dispinterface IVBDataObjectFiles 
S â– â– â–  9 interface IVBDataObjectFiles 
E1-© coclass DataObjectFiles 
S" e um typedef enurn BorderStyleConstan 
E]-*um typedef enurn MousePointerConst; 
E-*um typedef enurn AppearanceConstar 
El-^um typedef enurn VB4AppearanceCon 
E"*um typedef enurn OLEDragConstants 
S- e um typedef enurn OLEDropConstants 
B- e um typedef enurn DragOverConstants 
El-*um typedef enurn ClipBoardConstants 
E]-*um typedef enurn OLEDropEffectCons 
S- e um typedef enurn ErrorConstants 
B-*um typedef enurn TabWidth5tyleConsl 
El-^um typedef enurn TabStyleConstants 
E]-^ dispinterface ITab5trip 
E- *f interface ITabStrip 
El-^ dispinterface ITab5tripEvents 



±]_ 



Ready 




// Generated . IDL file (by the OLE/COM Object Viewer) 

// 

// typelib filename: comet 132 . och 

[ 

uuid(6B7E6392-85QA-lQlB-AFC0-421Q102A8DA7K 

version( 1.3), 

helpstring( "Microsof t Windows Common Controls 5.0 
(SP2)"), 

helpf ile( "comet 11 .hip" ) , 

helpcontestC 0x00033450) 

]. 

library ComctlLib 
{ 

// TLib : // TLib : OLE Automation : 
{00020430-0000-0000-C000-000000000046} 

importlib( "stdole2 . tlb" ) ; 

// Forward declare all types defined in this 
typelib 

interface IVBDataObject ; 
interface I VBDa t aOb j ec t F i 1 es ; 
interface ITabStrip; 
dispinterf ace ITabStripEvents; 
interface ITabs; 
interface ITab; 
dispinterf ace ITabslO ; 
dispinterf ace I Tab 10 ; 



3 



3a fla ce ocbiuecTBM M3BMKBaHeTO Ha flafleH COM o6eKT, ynpaB/iflBaHkisi koa 
Tpa6Ba p,a no/iyni/i MHCpopMaunflTa ot TunoBaTa 6i/i6/ii/iOTeKa v\ p,a pa36epe 
KaKBM MeTOflM m K/iacoBe MMa to3m COM o6eKT. To3M npo6/ieM e peiueH c 
B"bBe>KflaHeTO Ha Interop aceM6/iw. To cbAtpwa BCkmKaTa MHCpopMauna, koato 
MMa b eAHa TunoBa 6i/i6/ii/iOTeKa, npeACTaBeHa KaTO K/iacoBe v\ TunoBe b yn- 
paB/iflBaH koa, TaKa ne nporpaMkicra p,a Moxe cbBceM cbo6oaho p,a ce o6ptiua 
KtM COM o6eKTa, iokto kbm BceKM eAHH o6eKT ot ynpaB/iflBaHkia koa. 

HeKa cera p,a pa3r/ieAaMe KaKBM ca HanwHMTe 3a cb3AaBaHe Ha Ta3M Interop 
aceM6/ikiTa. 



TeHepMpaHe Ha Interop aceM6/in npe3 Visual Studio .NET 

CpeAaTa 3a pa3pa6oTKa Visual Studio .NET npeA.nara mhoto zieceH Ha^MH 3a 
M3BMKBaHe Ha COM o6eKT KaTO ce rpn>KM 3a reHepupaHeTO Ha Interop 
aceM6/ii/iTO. Bci/iuko, KoeTO Tpa6Ba p,a HanpaBMTe e p,a OTMAeTe Ha References 
Ha Baiunfl npoeKT, p,a M36epeTe Add Reference v\ cnep, TOBa ot eTMKeTa COM 
Aa M36epeTe COM o6eKTa, komto >xe/iaeTe. MMaMTe npeABMA, ^e b to3m 
cnncbK ca noKa3aHM caMO perncTpupaHMTe b cwcreMaTa COM o6eKTM. 3a 
cnpaBKa, perncTpupaHeTO Ha COM o6eKTMTe e onucaHO b ceKun^Ta "BnAQBe 
COM o6eKTM m perncTpauna" . OnrypaTa no-AO/iy noKa3Ba KaK M3r/ie>KAa 
npo3opei_rbT 3a M36npaHe Ha COM o6eKT: 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 



659 



Add Reference 



.NET COM | Projects | 


















Component Name | TypeLib Ver., 


I Path M 






IAS RADIUS Protocol 1.0 Typ... 1.0 


C 


\WINDOWS\system32\iasr. . . 




.CyotekProgressBar Control 1.0 1.0 


C 


\WINDOWS\system32\cyo... 






:-) VideoSoft vsFlex3 Controls 3.0 


C 


\WINDOWS\system32\VSF. . . 






Acrobat Access 3 . Type Library 3 . 


C 


\Program Files\Adobe\Acro. . . 






AcroIEHelper 1.0 Type Library 1.0 


C 


\Program Files\Adobe\Acro. . . 






Active DS IIS Extension Dll 1.0 


C 


\WINDOWS\system32\inet. . . 






Active DS IIS Namespace Pro . . . 1.0 


C 


\WINDOWS\systern32\inet. . . 






Active DS Type Library 1.0 


C 


\WINDOWS\system32\acti... 






Active Setup Control Library 1.0 


C 


\WINDOWS\systern32\asct. . . 






ActiveMovie control type library 1.0 


C 


\WINDOWS\system32\qua ... , 
lWINDOWSIsvstem321Arhi... Zl 






artivesnrkets 1 .n Tvne 1 ihrarv 1 .n 


C 













Select 



Selected Components 




C/ieA KaTO M36epeTe COM o6eKTa, b nanKaTa, KtfleTO ce KOMnki/iwpa BaweTO 
npn^OKeHne me ce noyiBi/i Interop aceM6/ii/iTO. B"b3MO>KHO e fla ce noaBu 
noBene ot eflHO aceM6/iw, aKO COM o6eKTa, komto ere M36pa/ii/i e CB"bp3aH c 
Apyr COM o6eKT. ToraBa VS.NET me reHepupa Interop aceM6/ii/i v\ 3a flpyrwa 
COM o6eKT. MMeHaTa Ha reHepupaHMTe ot VS.NET Interop aceM6/iMTa 
3ano4BaT c Interop. cneflBaH ot MMeTO Ha o6eKTa. 

B"b3MO>KHO e VS.NET fla He reHepupa Interop aceM6/iw. ToBa CTaBa, b cnynaw 
4e 3a M36paHM5q COM o6eKT MMa MHcra/iwpaHO Primary Interop Assembly 
(PIA). Primary Interop Assembly ce reHepupa ot npoi/i3BOfli/iTe/i5i Ha cbOTBeT- 
Hkifl COM o6eKT v\ ce i/iHcra/ikipa Ha BaiuaTa MaujMHa o6mkhob6ho ioto nacr ot 
no-ro/iflMO npn^OKeHne. HanpuMep Microsoft Word v\ Microsoft Excel MMaT 
PIA, komto ce kiHcra/ii/ipaT 3aeflHO c Microsoft Office naKeTa cnefl KaTO 6-b.qe 
M36paHa onunflTa ".NET Programmability Support". Te3M PIA ce kmcra/ikipaT b 
GAC (Global Assembly Cache), c KoeTO ce ocurypaBa nofl,qp-b>KiOTa Ha 
pa3^M4HM Bepcun m 3amnTa ot Heynt/iHOMomeHO noflMeHHHe. Ako Bee naK 
peujMTe, ne e Heo6xo,qi/iMO fla KonnpaTe PIA /ioio/iho npn BaiueTO npw/io- 
>xeHi/ie, TOBa MO>Ke fla CTaHe ioto M36epeTe onunaTa "Copy Local" Ha true ot 
CBOMCTBaTa Ha Ao6aBeHi/m COM o6eKT. 

TeHepMpaHe Ha Interop aceM6/in npe3 tlbimp.exe 

B cnynaki, ne He ki3no/i3BaTe cpeflaTa Visual Studio, reHepupaHeTO Ha Interop 
aceM6/iw MO>Ke fla CTaHe c noMOurra Ha MHcrpyMeHTa tlbimp.exe. 3afl"b/i>Kki- 
Te/ieH napaMeTbp npn M3BMKBaHeTO Ha tibimp e ntTAT, KtfleTO ce HaMupa 
onucaHneTO Ha 6w6/ii/iOTeiOTa (tlb onucaHneTo). ToBa MO>xe fla e caMi/m COM 
o6eKT m/im OTfle^eH .tlb <fcai/i/i. no/ie3eH napaMeTtp npn M3BMKBaHeTO Ha 
tibimp e /namespace. C T03M napaMeTbp ce 3aflaBa KaKBO fla e npocTpaH- 



660 nporpaMnpaHe 3a .NET Framework (tom 2) 

ctboto ot MMeHa Ha reinepi/ipaHOTO aceM6/iM. ToBa e noMara noHAKora, KoraTO 
MMaTe kohcp^mkt c aBTOMaTkinHO reHepMpaHOTO npOCTpaHCTBO OT MMeHa M 
npocTpaHCTBaTa M3no/i3BaHM bbb Baujua npoeKT v\nv\ ntK npocTO fla M36epeTe 
no-KpaTKO m no-noflxoA^iuo npocrpaHCTBO ot MMeHa Ha Interop aceM6/iMTO. 
Tibimp MMa oiue flocTa onunn, Ha komto H^Ma fla ce cnnpaMe TyK, ho e flo6pe 
fla ce 3ano3HaeTe c tax, aKO peiunTe fla M3no/i3BaTe to3m MHcrpyMeHT. MMeTO 
My, necro ce 6"bpi<a c npoTMBono/io>KHMfl tibexp, 3aTOBa 3anoMHeTe, ne 
po^ATa Ha tibimp e fla MMnopTupa .tib onucaHne b 3aflafleHOTO aceM6/iM. 

nporpaMHO reHepnpaHe Ha Interop aceM6/in 

Ako HAKora bm ce Ha/io>KM fla reHepupaTe co6cTBeHO Interop aceM6/iM no 
BpeMe Ha M3nt^HeHne Ha nporpaMaTa bm, K/iaca system. Runtime. 

InteropServices . TypeLibConverter Onpefle/ieHO Lfle BM e OT nO/13a. 06lflO 

B3eTO ropHMTe flBa MeTOfla pa6oT*iT touho c to3m K/iac, a M3no/i3BaHeTO My e 
noBe^e ot ziecHO. 3a fla reHepMpaTe eflHO Interop aceM6/iM e Heo6xoflMMO fla 

M3BMKaTe MeTOfla TypeLibConverter. ConvertTypeLibToAssembly (...) KaTO 

My noflafleTe o6eKTa, komto cbfltpwa .tib onMcaHMeTO. 

Pa3npocTpaHeHMe (deployment) Ha Interop aceM6/in 

Pa3npocTpaHeHMeTO Ha Interop aceM6/iM He ce pa3/iMnaBa no hmluo ot pa3- 
npocTpaHeHMeTO Ha bcako flpyro aceM6/iM ot .NET Framework. flocraTbUHO e 
fla KonMpaTe aceM6/iMTO b >Ke/iaHaTa flMpeKTopMa. MMaMTe npeflBMfl o6ane, ne 
aKO MHcra/iMpaTe nporpaMaTa bm Ha flpyr KOMmoTbp, Tpa6Ba fla ce yBepMTe, 
ne COM o6eKTa, komto M3no/i3BaTe e perMCTpMpaH Ha to3m KOMniOTbp. B 
npoTMBeH cnynaM BaiueTO Interop aceM6/iM H^Ma fla HaMepM COM o6eKTa, 3a 
komto ce OTHacfl, m HflMa fla pa6oTM. C flpyrM flyMM, npM noflroTB^HeTO Ha 
MHcra/iauMflTa Ha BaiuaTa nporpaMa, Tpa6Ba fla BK/iK>nMTe m bcmukm M3no/i3- 
BaHM COM o6eKTM m fla vv\ perMCTpMpaTe Ha npMeMHaTa MaujMHa. 

Runtime Callable Wrapper (RCW) 

KaK BCbLflHOCT CTaBa usi/iaTa MarMa c M3BMKBaHeTO Ha COM o6eKTMTe? KaKBO 
ranKOBa MMa b TOBa Interop aceM6/iM? ripeflcraBeHO no-npocT HanMH, Interop 
aceM6/iMTO cbfltpwa MHCpopMauM^Ta, kohto onMCBa eflMH COM o6eKT, ho 
npeflCTaBeHa bbb cpopMaT pa36MpaeM ot .NET Framework. ToBa e ue/iTa Ha 
npeo6pa3yBaHeTO m c"b3flaBaHeTO Ha Interop aceM6/iM. no HaTaTbK, 3a fla 

OCbLfleCTBM M3BMKBaHeTO Ha COM o6eKTa, CLR M3nO/13Ba Ta3M MHCpOpMaUMfl M 

AMHaMM4HO c-b3flaBa Runtime Callable Wrapper (RCW). CLR cb3flaBa touho 
eflMH RCW 3a BceKM COM o6eKT, KaTO no to3m Ha^MH RCW Mrpae po/i5rra Ha 
moct KtM flafleH COM o6eKT. KaKTO cnoMeHaxMe no-rope, MHCppacrpyKTypaTa 
Ha COM M3MCKBa BCAKa eflHa MHCTaHUMa Ha COM o6eKT fla ce OT6poyiBa. RCW 
ce rpM>KM 3a TOBa, KaKTO m 3a M3BMKBaHeTO Ha flpyrM craHflapTHM MHTepcpeMCM 

OT MHCppaCTpyKTypaTa Ha COM KaTO IDispatch, IErrorlnfo M flp. 6e3 

nporpaMMCTa fla ce o6peMeH*iBa c taxhoto cbiuecTByBaHe. M He Ha noc/ieflHO 
MflCTO RCW M3B"bpujBa CTaHflapTHOTO npeo6pa3yBaHe Ha TMnoBeTe ot Hey- 
npaB^ABaHa kbm ynpaB/iHBaHa cpefla. 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/uiBaH koa 



661 



M3BMKBaHe Ha COM o6eKT npe3 RCW 

noKa3aHaTa no-,qo/iy cpwrypa npeflcraBfl cbBceM npocTO KaK ce M3B"bpujBa 
eflHO M3BMKBaHe Ha COM o6eKT: 

IUnknown 
IDispatch 

IErrorlnfo 



COM o6eKT 



I Customer 

— o< 



RCW 



IUnknown 
IDispatch 



COM o6eKT 



IErrorlnfo 

IWarehouse 

— o< 



.NET KJIMeHT 



RCW 



n 



.NET KJIMeHT 



K/iweHTbT, M3no/i3Baiu ynpaB^ABaH koa, ce o6ptiua kbm MHTepcpei/ica 

ICustomer V\J\V\ IWarehouse Ha CbOTBeTHMfl COM 06eKT. M3BMKBaHeTO MMHaBa 

3afl"b^>KMTe^HO npe3 RCW, komto ot cboa crpaHa M3BMKBa MHTepcpei/icbT 
iunknown, 3a fla onpefle/iw fla/iw TbpceHMfl MHTepcpewc ce kiMn/ieMeHTwpa ot 
to3m COM o6eKT m b cnynaw ne ro HaMepn, M3BMKBa MeTOAa AddRef Ha 
iunknown, 3a fla yKa>Ke Ha/ikmweTO Ha HOBa Bp"b3Ka. 

M3HMKBa BtnpocbT KaK RCW pa36npa Kora CbOTBeTHMfl My COM o6eKT e 
CBo6ofleH m HflMa noBene Bp"b3KM kbm Hero. 




riopaflM /mncaTa Ha fleTepMMHMCTMHHM flecrpyKTopii b .NET 
Framework Bp~b3xaTa kt»m COM o6eKTa me 6-bfle ocBo6ofleHa 
eflBa npM M3BMKBaHeTO Ha cwcreMaTa 3a nonncTBaHe Ha 
naMeTTa. 3a fla ycKopwM to3m npoijec Mowe fla M3no/i3BaMe 

MeTOffbT Marshal. ReleaseComObject. T03M MeTOfl HaMaJ15IBa 

6poHna Ha Bp-b3KMTe, komto RCW noflfltpMO 3a noflafleHim 
COM o6eKT. ripn flOCTMraHe Ha 6ponna flo Hyna, bcmhkh 
bpi>3km c HeynpaB/inBaHMn koa ce ocBo6o>«flaBaT v\ o6eKTa ce 

yHMlHOMOBa. riO HaTaTl»IJJHOTO M3BMKBaHe Ha T03M o6eKT me 
flOBefle flO M3K/1K>HeHMe System. NullReferenceException. 



kl3BMKBaHe Ha COM o6eKT ot ynpaB/insaH koa - npwMep 

IHe pa3MeAaMe KaK c noMOurra Ha VS.NET Moxe fla flo6aBi/iM totob COM 
o6eKT KtM ynpaB^ABaH npoeKT, fla flocrbriBaMe HeroBMTe CBOMCTBa i/i fla 
i/i3no/i3BaMe npeflocTaBeHaTa ot Hero cpyHKuwoHa/iHOcr. 

1. CrapTi/ipaMe VS.NET v\ cb3,qaBaMe hob Window Forms npoeKT. 



662 



flporpaMnpaHe 3a .NET Framework (tom 2) 



2. OTBap^Me Toolbox v\ c fleceH 6yTOH M36npaMe Add/Remove Items... 

3. M36npaMe eTMKeTa COM components v\ ot cnwcbKa M36npaMe Microsoft 
Web Browser, MapKupaMe ro KaTO M36paH, cnep, KoeTO HaTMCKaMe OK. 

4. M36paHMAT KOMnoHeHT ce noHBABa b naHe/ia Toolbox nofl MMeTO 
Microsoft Web Browser: 



My User Controls 



1^ Pointer 
A Microsoft Web Browser 



i 



5. OTBapaMe cpopMaTa Ha HOBOCb3AaAeHi/m npoeKT b pe>KMM Ha AH3ai/iH, 
xBaiuaMe KOMnoHeHTa Microsoft Web Browser ot TooIBox m ro aob/im- 
naMe Btpxy cpopMaTa. Ha cbomctboto Name npucBOABaMe ctomhoct 

axWebBrowser. 

6. HaA KOMnoHeHTa Web Browser Ao6aB5iMe TeKCTOBO no/ie c Name - 
textBoxUri m 6yTOH c HaAnnc Go v\ Name - buttonGo, TaKa ne cpopMaTa 
Aa Ao6ne cneRHwn bma. 

D n p 



Web Browser Demo 



7. IHpaKBaMe ABa ntTM Btpxy 6yTOHa v\ npoMeH^Me cpyHKui/mTa 
buttonGo click no cnep,uv\s\ Ha^MH: 



private void buttonGo_Click ( ob j ect sender, System. EventArgs e) 

{ 

string url = textBoxUri . Text; 
axWebBrowser . Navigate (url) ; 



8. CrapTkipaMe npoeicra c [Ctrl + F5]. 

9. ripn Ha6npaHe Ha ye6 aApec b t6kctoboto no/ie v\ HaTMCKaHe Ha 6yTOHa 
Go, CTpaHnuaTa ce 3ape>KAa b ye6 6pay3"bp KOHTpo/iaTa. 

Pa3KpiiBaHe Ha .NET KOMnoHeHT KaTO COM o6eKT 

C/ieA KaTO pa3MeAaxMe KaK eAMH COM o6eKT MO>Ke Aa ce i/i3no/i3Ba ot .NET 
KOMnoHeHT, me pa3r/ieAaMe o6paTHaTa 3aAana. KaK Aa ce npeAcraBki eAMH 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 663 

.NET KOMnoHeHT KaTO COM o6eKT, TaKa ne fla MO>Ke fla 6"bfle M3BMKBaH ot 
Apyrn COM o6eKTM? 

ripeflu bcm4ko Tpa6Ba fla ca ki3n"b/iHeHi/i M3MCKBaHMflTa, komto ce Ha/iaraT 3a 
BceKM eflMH COM o6eKT. ToBa ca Ha/ikmweTO Ha yHMKa/ieH GUID, Ha Progld 
MfleHTnc|DMKaTop m perwcTpauwfl b Windows Registry. 3a Haiue y/iecHeHkie 
BCM4KM Te3M Hema CTaBaT mhoto ziecHO npe3 M3no^3BaHe Ha aTpn6yTM. no- 
flo/iy e noKa3aHO KaK npe3 aTpn6yTa [GuidAttribute] ce M3B"bpujBa onuca- 
HueTO Ha Heo6xoflMMMTe napaMeTpn: 



[Guid("D069E57A-981F-4841-8D68-E2F2342E92A2") , 
Progld ( " SomeApplication . SomeClass" ) ] 

public class SomeClass 

{ 

// ... 

} 



1/lHcrpyMeHTbT regasm 

PerncTpaunflTa Ha TaKa o6o3HaneHi/m K/iac MO>Ke fla ce M3Btpujn ptuHO npe3 
M3no^3BaHeTO Ha MHcrpyMeHTa regasm.exe v\nv\ c VS.NET. 

Ako peujMTe fla M3no/i3BaTe regasm.exe MMawTe npeflBMfl, ne ocBeH 3a 
perncTpaunfl, tom MO>Ke fla ce i/i3no/i3Ba v\ 3a M3TpnBaHe Ha perncTpaunaTa. 
RegAsm npneMa KaTO BxofleH napaMeTbp ntTfl kbm aceM6/ikiTO, KoeTO Tpa6Ba 
fla ce perncTpupa ioto COM o6eKT. C onunaTa /tib Moxe fla yKaxeTe fla ce 
reHepupa v\ perncTpupa TunoBaTa 6w6/ikiOTeKa, koato T03M .NET KOMnoHeHT 
npeflcraB/iflBa. Ako 3aflafleTe onunaTa /unregister, perncTpaunaTa Ha 
Banjul .NET KOMnoHeHT me 6"bfle npeMaxHaTa v\ tom me cnpe fla 6"bfle pa3no3- 
HaBaH KaTO COM o6eKT. /Jont/iHMTe/iHa onui/m e /regfiie. Ta no3BO/iHBa 
reHepupaHeTO Ha <\>av\n c KOMaHflu 3a Windows Registry, Heo6xoflMMM 3a 
perncTpaunflTa Ha .NET KOMnoHeHTa KaTO COM o6eKT. MMawTe npeflBMfl, ne 
onunnTe /tib m /regfiie ca B3anMHO M3K^K)4Baiun ce. M3no^3BaHeTO Ha 
onunflTa /regfiie He M3BtpujBa perncTpaunflTa b Windows Registry. 

OcBeH regasm MMa ome eflMH MHCTpyMeHT 3a reHepupaHe Ha TunoBa 
6n6^MOTeKa. ToBa e tibexp v\ KaKTO caMOTO MMe roBopn, to3m i/mcrpyMeHT 
eKcnopTkipa TunoBaTa 6w6.ni/iOTeKa Ha .NET KOMnoHeHT. CaMa no ce6e cm 
reHepupaHaTa TunoBa 6n6/ikiOTeKa He e flocraTbUHa 3a pa6oTaTa Ha 
B3anMOfleMCTBneTO Ha .NET c COM, 3aTOBa to3m MHcrpyMeHT He ce i/i3no/i3Ba 
necro. EKBkiBa/ieHTHaTa pa6oTa, BK/uouMTe/iHO v\ peri/icrpaukiflTa Ha COM 

06eKTa ce M3B"bpLUBa OT regasm. 

ATpn6yTM 3a perucrpauMfl m fleperncTpaumi 

/Jont/iHkiTe/ieH kohtpo/i Btpxy perncTpaunaTa MO>Ke fla no/iynwTe c noMOurra 

Ha aTpn6yTMTe [ComRegisterFunctionO ] M [ComUnregisterFunction ( ) ] . 

Te ce npw/iaraT Btpxy MeTOflM v\ ce i/i3n"b/iHHBaT cbOTBeTHO b MOMeHTa Ha 
perncTpaunfl v\ fleperncTpauna. C tax nporpaMMCTbT MMa b"B3mo>khoct fla 



664 



flporpaMnpaHe 3a .NET Framework (tom 2) 



HanpaBM flont/iHMTe/iHki MHMuna^M3auMM, ioto HanpuMep fla flo6aBM hobm 
K/iK>noBe b Windows Registry v\nv\ fla Cb3flafle BpeMeHHM pecypcu. 

Pa36npa ce, cbiuecTByBa v\ BapnaHT 3a perncTpauna Ha .NET KOMnoHeHT ot 
VS.NET. To3M BapnaHT, o6ane, e noflxoflaiu caMO 3a ue/ikiTe Ha pa3pa6crn<aTa 
Tbv\ KaTO M3MCKBa Ha/ikmi/ieTO Ha VS.NET. rio-flo/iy e noKa3aHa onunaTa 
Register for COM Interop bbb VS.NET. fl,o Ta3M onuna MO>xe fla cmrHeTe KaTO 
OTBopnTe CBOMCTBaTa Ha Banjul npoeKT v\ M36epeTe HacTpoMKMTe 3a 
Configuration Properties\Build. MMaMTe npeflBMfl, ne Ta3M onui/m He e aKTMBHa 
3a BCM4KM TunoBe npoeKTM KaTO Windows Forms, Console Application v\nv\ flp., 
3a komto perncTpaunflTa KaTO COM o6eKT HsiMa KOHKpeTeH CMi/icb/i. 



testclasslnterface Property Pages 



ConFigi 



luration: JActive(Debug) 



^J Platrorm: |Active(.NET) 



H Configuration Manager... 



C~l Common Properties 
â–  Pa Configuration Properties 
$- Build 

Debugging 

Advanced 




E Code Generation 

Conditn: .m Constant DEBUG; TRACE 

Optimize Code False 

Check for Arithmetic Overflow/Ur False 

Allow Unsafe Code Blocks False 

B Errors and Warnings 

Warning Level 

Treat Warnings As Errors 

Suppress Specific Warnings 
B Outputs 

Output Path 

XML Documentation File 

Generate Debugging Information True 
True 



Warning level 4 
False 



bin\Debug\ 



Register For COM Interop 

Register the project's output file for use with COM components. 



1 



J. 



Applj 



J. 



3a flont/iHHTe/ieH kohtpo/i Btpxy TunoBaTa 6ki6/ikiOTeKa .NET Framework 
npeflOcraBH Ha6op ot aTpn6yTM, komto ce npw/iaraT Btpxy .NET K/iaca. ToBa 
ca CoClassAttribute, ComVisibleAttribute, GuidAttribute M flp. HflMa fla 

ce cnnpaMe Ha tax, tbm KaTO ce M3MCKBaT no-cepno3HM no3HaHMa no COM v\ 
M3^M3aT M3B"bH ue/iTa Ha Ta3M KHura. 

COM Callable Wrapper (CCW) 

AHa/iori/mHO Ha COM o6eKTMTe, .NET KOMnoHeHTMTe Cbiuo ce AOCTbnBaT npe3 
cneuwa/iHO npoKCM, umato rpn>Ka e fla ocbiuecTBM npeo6pa3yBaHeTO Ha 
flaHHMTe. ToBa npoKCM ce Hapi/ma COM Callable Wrapper v\ ce rpuxn oiue 3a 
noflflp"b>KKaTa Ha ci/irypHOcrra v\ aBTOMaTi/mHOTO nonwcTBaHe Ha naMerra, 
komto He cbiuecTByBaT b MHCppacTpyKTypaTa Ha COM v\ He MoraT fla 6"bflaT 
M3no^3BaHM ot COM. TyK Cbiuo Ba>KM npaBki/iOTO, ne 3a BceKM eflMH .NET 

KOMnOHeHT C"bOTBeTCTBa T04HO eflMH CCW. 

ripoKCM K/iactT Tpa6Ba fla ocurypn v\ MMn/ieMeHTauMHTa Ha craHflapTHMTe 
MHTepcpewcn 3a COM - iunknown, IDispatch. CaMO TaKa .NET KOMnoHeHTa 
OTroBapa Ha M3MCKBaHMflTa Ha COM MHCppacrpyKTypaTa v\ MO>Ke fla ce 
npeflCTaBM KaTO COM o6eKT. EflHa npenoptKa, koato me cnoMeHeM no-Ha,qo/iy 
othobo m koato Tpsi6Ba fla 3anoMHMTe, e, ne 3a fla cm ocurypnTe 6e3npo6- 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/uiBaH koa 



665 



zieMHO M3BMKBaHe Ha .NET KOMnoHeHT Tpa6Ba p,a i/i3no/i3BaTe MHTepc|DeMCM, 
komto flecJDMHupaT noBefleHneTO Ha Baujua ynpaB/isiBaH K/iac v\ komto ce 
MMn/ieMeHTwpaT ot Hero. TaKa me ce npi/i6/ii/i>Ki/iTe MaKCkiMa/iHO 6/im30 p,o 
Ha^MHa, no-KOMTO ce npeAcraBsiT COM o6eKTMTe v\ u\e ce cnecTMTe npo6/ieMM 
npn ynpaB/ieHkie Ha BepcunTe v\ reHepupaHe Ha TunoBa 6n6/inoTeKa. 

kl3BMKBaHe Ha .NET KOMnoHeHT npe3 CCW 

Ot cJDnrypaTa no-AO/iy ce BM>KAa cxeMaTi/mHO npoueca Ha M3BMKBaHe Ha eAHH 
.NET KOMnoHeHT: 



COM KJIMeHT 



JL 



CCW 



.NET o6eKT 



COM KJIMeHT 



COM K^neHTMTe ce o6p"biuaT KbM CCW, komto MMn/ieMeHTi/ipa CTaHflapTHMTe 

IUnknown M IDispatch MHTepcJDeMCM M npeo6pa3yBa ASHHklTe K"bM .NET 

KOMnoHeHTa (ABeTe KptrneTa, komto v\3i\v\3aj ot CCW ca o6o3HaneHwe 3a 
MHTepc|DeMC, KoraTO CTaBa B-bnpoc 3a COM o6eKT). 

kl3MCKBaHMn KiaM .NET TMnoBe 3a nosi3BaHe OT COM 

B onucaHneTO Ha CCW cnoMeHaxMe eAHa npenoptKa 3a ocurypaBaHe Ha 
6e3npo6/ieMHO M3BMKBaHe Ha .NET KOMnoHeHT. McTMHaTa e, ne 3a p,a 
M3BMKaTe eAMH .NET KOMnoHeHT ot COM e Hy>KHO p,a ce cna3*iT AOCTa yc/iOBi/ia 
Ttki KaTO TexHO/iori/mTa COM e no-CTapa ot .NET v\ v\wa CBOMTe orpaHwueHMfl. 
no-AO/iy ca M36poeHM yc/iOBi/i^Ta, komto Tpa6Ba p,a 6"bAaT M3n"b/iHeHi/i, 3a p,a 
ce ocurypn AOCTbn ot COM o6eKT: 

- Bcm4km ynpaB/isiBaHki K/iacoBe Tpa6Ba p,a 6"bAaT public. 

- Bci/iukm ynpaB^ABaHM K/iacoBe Tpa6Ba p,a MMaT ny6/iwneH KOHCTpyKTop 
no noApa36i/ipaHe (KOHCTpyKTop 6e3 napaMeTpn). 

- MeTOAM, CBOMCTBa, no/ieTa v\ cb6i/iTMfl Tpa6Ba p,a 6"bAaT public. 

- K/iacoBeTe He MoraT p,a 6"bAaT a6crpaKTHM. 

- npenop"b4Ba ce K/iacoBeTe p,a MMn/ieMeHTkipaT MHTepc|DeMC. 

- M36arBaMTe craTkinHki MeTOAM. 



666 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Pa3KpnBaHe Ha .NET KOMnoHeHT KaTO COM o6eKT - npnMep 

B to3m npnMep me HanpaBMM .NET noTpe6kiTe/ici<a KOHTpo/ia h me 51 
perncTpupaMe KaTO COM KOMnoHeHT. IHe M3no/i3BaMe Internet Explorer 3a p,a 
BM3ya^M3npaMe KOHTpo/iaTa KaTO ActiveX KOMnoHeHT. 

1. OTBap^Me VS.NET. 

2. Cb3AaBaMe hob Class Library npoeKT. 

3. C"b3flaBaMe hob User Control c MMe caiendarcontroi. 

4. Btpxy fleK^apaunflTa Ha cb3flafleHMfl K/iac caiendarcontroi npw/iaraMe 
c^eflHMTe aTpn6yTn: 



[GuidAttribute ( "D069E57A-981F-4841-8D68-E2F2342E92A2 " ) , 
Progld ( "Demo_4_RegisterAsCOM. TimeControl" ) ] 



5. ripeBK/iionBaMe b pe>KMM Ha AH3afiH v\ AOB/iwuaMe Calendar kohtpo/i 

Btpxy Cb3AaAeHMfl Caiendarcontroi. 



^ | WtfililrH>_ 

Sun Mon TueWed Thu Fri Sat 



27 


23 30 1 2 3 


4 


5 6 7 3 9 10 


11 


12 13 14 15 16 17 


18 


19 20 21 22 23 24 


25 


26 27 28 29 @£ 31 


1 


2 3 4 5 8 7 


^ 


> Today: 12/30/2005 



6. Cb3AaBaMe HOB HTML CpaM/l TestCalendarControl.html. 

7. B <body> Tara nocraBsiMe cj\ep,uv\s\ <object> Tar, 3a p,a M3BMKaMe 
noTpe6nTe^CKMfl kohtpo/i: 



<object classid="CLSID:D0 69E57A-9 81F-4 8 41-8D68-E2F2 342E92A2"> 
</ob j ect> 



8. 3a6e/ie>KeTe, ne b <object> Tara 3aAaBaMe cbiuna GUID, komto 
M3no^3BaxMe npn yi<a3BaHeTO Ha aTpn6yTa GuidAttribute Ha K/iaca. 

9. noc^eAHaTa CTbnKa e p,a yKa>KeM Ha VS.NET, ne e Heo6xoAHMO Aa 
perncTpupa Hawkm kohtpo/i KaTO COM o6eKT. 

10. M36npaMe Properties Ha TeKyiuna npoeKT v\ ot Configuration Properties 
/ Build HacrpowBaMe Register for COM Interop Aa uMa ctomhoct True. 



11. KoMnw/ikipaMe npki/io>KeHMeTO. 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 667 

12. IHpaKBaMe C AeceH 6yTOH Btpxy TestCalendarControl.html M 

M36npaMe View in Browser. 

13. B OTBopeHMfl npo3opeu ce Bi/i3ya/iki3kipa, noflo6HO Ha ActiveX kom- 
noHeHT, HawkiflT kohtpo/i c BrpafleH Ka/ieHAap ot ynpaB/iflBaHaTa 
6n6/iMOTeKa. 

B3anMOfleMCTBne ci>c C++ npe3 IJW 

noBe^eTO 3aKopaBe^n (hardcore) C++ nwcanki HaB^pHO Bene ca ce 3annTa/in, 
KaK MO>Ke fla ce M3BMKa .NET K/iac ot C++ cpefla. ToBa BCbiuHOCT B"bo6iue He 
e TpyflHO. M3no^3Ba ce TaKa HapeneHaTa TexHO/iorna IJW (It Just Works), 
koato no3BO/iHBa nonTki MHTyMTMBHO M3BMKBaHeTO Ha eAMH .NET K/iac. 
AHa/iorwnHO Ha RCW v\ CCW npn IJW Cbu\o MMa npoKCM, KoeTO OTroBapa 3a 
npeo6pa3yBaHeTO Ha TunoBeTe ot HeynpaB/iHBaHa kbm ynpaB/isiBaHa cpeAa v\ 
o6paTHO. 3a to3m Ti/m npoKCM e cbmecTBeHO, o6ane, neec BucoKa npon3BO- 
AkiTe/iHOCT. M3MepeHO e, ne IJW npoKCMTO boah ao oko/io 10-30 MaujMHHM 

MHCTpyKUMM 3a BCflKO M3BMKBaHe Ha ynpaB/lflBaH KOA- 

M3no^3BaHeTO Ha 6i/i6/iwoTeKa ot .NET cpeflaTa CTaBa c noMOurra Ha using 
AnpeKTMBaTa. J\a pa3r/ieAaMe cnep,Hwn npuMep. 

IJW M3BMKBaHe ot C++ - npiiMep 

Eto eflMH KpaTbK npuMep, komto i/i/uocrpkipa i/i3no/i3BaHeTO Ha IJW TexHO/io- 
ruflTa ot C+ + : 



#using <mscorlib . dll> 








#include <stdio.h> 








#include <iostream> 








using namespace std; 








void main ( ) 

{ 

// Declare unmanaged pointe 








;r of 


type 


char* 


const char* str = "IJW (It 


Just 


Works ) " ; 


// Call unmanaged function 


"printf" 




printf ( "%s\n" , str) ; 








// Call unmanaged function 


"ostream: 


: operator <<" 


cout << str << endl; 








// Call managed function "Console : :WriteLine" 


System: : Console: :WriteLine 
} 


(str) 







Ha irbpBkifl peA b npuMepa e noKa3aHO KaK ce M3no/i3Ba AnpeKTMBaTa using 3a 
AOCTbn ao .NET cpeAaTa v\ no KOHKpeTHO ao <fcai/i/ia mscoriib.dll, komto e 



668 nporpaMnpaHe 3a .NET Framework (tom 2) 

BxoflHaTa T04Ka npn crapTkipaHeTO Ha bcako eflHO .NET npM/io>KeHMe. CneflBa 
AeK^apupaHeTO Ha CMMBO/ieH hm3 m no,qaBaHeTO My kbm system: : console : : 
writeLineO MeTOfla. Bi/i>KflaTe, ne Hmcbfle He e ce M3BtpujBa ptuHO npeo- 
6pa3yBaHe Ha TunoBeTe v\ BtnpeKM TOBa M3BMKBaHeTO Ha ynpaB/iHBaHi/m 
MeTOfl e ycneujHO. Hy>KflaTa ot i/i3no/i3BaHe Ha aTpn6yTM cbiuo ce e/iMMMHwpa 
3a pa3/im<a ot Platform Invoke. Bee naK MMaMTe npeflBi/ifl, ne KoraTO 
M3no^3BaTe IJW me bm ce Ha/iara mhoto no-necro ptuHO fla yKa3BaTe Hani/ma 
Ha npeo6pa3yBaHeTO Ha npoMeH/ii/iBkiTe c noMOurra Ha K/iaca Marshall, 
riopaflu Ta3M npn^MHa M3no/i3BaHeTO Ha IJW, MO>xe flocra fla yc/io>KHki 
pa3pa6oTKaTa Ha BaweTO npi/i/io>KeHMe v\ M3no/i3BaHeTO Ha IJW ce npenoptuBa 
caMO KoraTO ce Ttpcn 3Hani/iTe/iHO no,ao6peHi/ie b 6tp3MHaTa 3a M3n"b/iHeHMe. 
HaM-noflxoflfliu IJW e cbiuo b npi/i/io>KeHi/ifl, komto no/i3BaT aKTMBHO 
HeynpaB^ABaH koa m icbfleTO e Heo6xo,qi/iMO fla ce OTKpue v\ pa3peujn npo6/ieM 

C npOI/l3BOfll/ITe/lHOCTTa. 

ripenop-bKM 3a M3no/i3BaHe Ha .NET TunoBe ot 
COM 

rio-flo/iy me noco^MM hhkoi/i npenoptKM 3a noflo6p*iBaHe Ha CKopocTTa Ha 
M3n"b/iHeHwe, 3a npeo6pa3yBaHe Ha .NETTunoBe b HeynpaB/iHBaHa cpefla v\ 3a 
M3BMKBaHe Ha MeTOflM Ha HeynpaB^ABaHa ot ynpaB/iABaHa cpefla v\ o6paTHO. 

- M3no/i3BaMTe "chunky" BMecTO "chatty" MHTepcpeMCM. MMeHaTa Ha to3m 
Tun MHTepcpewcn noKa3BaT Hankma Ha npeflaBaHe Ha MHCpopMaunaTa. 3a 
"chunky" MHTepcpeMCMTe e xapaicrepHO, ne Te c noMOurra Ha Ma/ibK 6pow 
MeTOflM ce M3B"bpujBa ro/iHMa nacr ot pa6oTaTa. ToBa 03HanaBa no- 
Ma/itK 6pow npeMMHaBaHMfl ot eflHaTa cpefla kbm flpyraTa v\ ecTecTBeHO 
no-Ma/itK 6poki npeo6pa3yBaHMfl Ha TunoBeTe v\ no-flo6pa 
npon3BOflHTe^HOCT. ripn "chatty" MHTepcpewcuTe pa6oTaTa ce M3BtpujBa 
c noMOiflTa Ha cepua ot M3BMKBaHMfl Ha to/iam 6pow MeTOflM v\ 
Heo6xoflMMaTa MHCpopMauna ce M3BMKBa v\i\v\ npeflaBa Ha nacm. To3m 
Tun KOMyHMKaunfl He ce npenoptuBa, KoraTO e Ha/inue npeMMHaBaHe ot 
eflHa cpefla kbm flpyra nopaflu 3Hani/iTe/iHOTO BpeMe Heo6xoflMMO 3a 
npeo6pa3yBaHe Ha TunoBeTe. 

- 1/lMn/ieMeHTkipaMTe iDisposabie 3a HeynpaB/iflBaHkiTe pecypcu. BceKM 
HeynpaB^ABaH pecypc, komto ki3no/i3BaTe, e flo6pe fla 6"bfle Kancy/ikipaH 
b ynpaB^ABaH K/iac. YnpaB/iflBaHMflT K/iac Tpa6Ba fla MMn/ieMeHTi/ipa 

IDisposabie, B C/iynaM He B"b3HMKHe M3K^K)4eHMe HeynpaB/i5iBaHM5i 

pecypc fla 6"bfle ocBo6ofleH. 

- M36arBaMTe kbcho CB"bp3BaHe. Kbchoto CB"bp3BaHe (late binding) e 
TexHMKa, koato no3BO^ABa eflMH COM o6eKT fla 6tfle M3BMKaH no BpeMe 
Ha M3n"b/iHeHwe Ha nporpaMa, 6e3 fla e i/ma/io MHCpopMauna 3a HeroBMTe 
TunoBe m MeTOflM no BpeMe Ha KOMnw/iaukiflTa Ha nporpaMaTa. ripuMep 
3a TOBa e i/i3no/i3BaHeTO Ha MHTepcpewca IDispatch, ripn kbchoto 
CB"bp3BaHe He e Hy>KHO fla MMa cb3flafleHO Interop aceM6/iw, ho 3a 
CMeTKa Ha TOBa ce i/i3no/i3Ba OTpaxeHne (reflection), KoeTO 3a6aBH 
3HanwTe/iHO M3BMKBaHeTO Ha COM o6eKTa. 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 669 

- YKa3BaMTe MMeTO Ha MeTOfla, komto MCKaTe fla M3BMKaTe M3pn4HO npe3 
Diiimport. KoraTO i/i3no/i3BaTe aTpn6yTa Diiimport ki3no/i3Bai/iTe cbom- 
ctboto My Exactspeiiing etc ctomhoct true, 3a p,a i/i36erHeTe npeTbpc- 
BaHeTO Ha bcm^km mbtoah 3a noAo6HO MMe. 

- 0nTMMM3npaMTe npeo6pa3yBaHeTO Ha ashhu. ripn npeo6pa3yBaHeTO 
Tpa6Ba p,a ce B3eMe npeABMA, ^e M3no/i3BaHeTO Ha T.Hap. "blittable" 
TunoBe (TkinoBe no ctomhoct, MacuBM ot ctomhocthm TunoBe v\ crpyK- 
Typn) Aasa mhoto BucoKa npoi/i3BOAHTe/iHOCT, Tbv\ ioto Te AnpeKTHO ce 
KonnpaT, 6e3 p,a ce M3BtpujBa npeo6pa3yBaHe. 

- Mo>Ke p,a kl3nO/13BaTe SuppressUnmanagedCode aTpn6yTa 3a KpMTM4HM 
no CKOpoCT M3BMKBaHMfl. ATpw6yTbT SuppressUnmanagedCode n03BO/lflBa 

Aa ce e^MMMHupa o6xo>KAaHeTO Ha CTeKa, 3a p,a ce M3B"bpujn Heo6xoAn- 
MaTa npoBepKa 3a npaBa. M3MCKBa ce bcmukm M3BMKBaiun Aa MMaT Aa- 
AeHO npaBO unmanagedcode, 3a Aa Moxe Aa ce M3BMKa HeynpaB/iflBaHMH 
koa. M3no^3BaMTe T03M aTpn6yT caMO 3a kphtm^hm no ckopoct M3BMKBa- 
HMfl, TtM KaTO ynoTpe6aTa My npeAcraB/iflBa pmck 3a curypHOCTra Ha 
BaweTO npn^oxeHne. 

- Cnep,eje 6po*ini/iTe 3a B3anMOAeMCTBne. BrpaAeHMTe b Windows 6po*ini/i 
(performance counters) MoraT Aa bm AaAaT MHCJDopMauMfl 3a 6poa Ha 
npeo6pa3yBaHMATa v\ cb3AaAeHMTe CCW. BpoanwTe 3a B3anMOAeMCTBne 
ce HaMnpaT b KaTeropnaTa .NET CLR Interop. 

- l/l3no/i3BaMTe CLR Spy [6] 3a Aa OTKpneTe eBeHTya/iHki npo6/ieMki. 
MHCTpyMeHTtT CLR Spy e 3aA"b/i>KkiTe/ieH 3a BceKM, komto CMflTa Aa 
npaBM Heiuo no-cepno3HO b M3BMKBaHeTO Ha HeynpaB/iHBaH koa. To3m 
MHCTpyMeHT c"bA"bp>Ka Ha6op ot T.Hap. npo6n, komto MoraT Aa 3acwnaT 
HenpaBi/i/iHO cJDopMaTupaHM P/Invoke M3BMKBaHMfl, HeHaBpeMeHHM m3bmk- 
BaHMfl Ha cucTeMaTa 3a ynpaB/ieHwe Ha 6oK/iyKa v\ AP- 

Immutable /in ca HaMCMHa CMMBO/iHMTe mi30Be? 

IHe pa3MeAaMe Ma^bK npuMep, c komto ce noKa3Ba Hy>KAaTa ot nporpaMa 
KaTO CLR Spy v\ Me>KAyBpeMeHHO me npoBepuM HancTMHa nv\ ca immutable 
cuMBO^HMTe HM30Be b .NET Framework. npuMeptT v\ onucaHneTO ca 6a3npaHM 
Ha ny6/ikiKau.M5Tra Ha Chris Brumme - "Interning Strings & immutability" [7]. 

npuMepHaTa nporpaMa no-AO/iy w3no/i3Ba P/Invoke, 3a Aa M3B/iene MMeTO Ha 
KOMnKDTbpa. 3a "KbCMeT" o6ane, nporpaMwcrbT e M3no/i3Ba/i npoMeH/ii/maTa 

computerName OT TMn string, BMeCTO Aa M3nO/13Ba TMna StringBuilder, 

komto e 3aA"b^>KMTe^eH, KoraTO HeynpaB/isiBaHMfl koa Bptiua hm3 c npoMeH- 

/lMBa A"b^>KMHa: 



using 


System, 






using 


System 


Runtime 


InteropServices; 


public class 
{ 


GetComputerNameDemo 



670 flporpaMnpaHe 3a .NET Framework (tom 2) 



static void Main ( string [ ] args) 

{ 

String computerName = "strings are always immutable"; 
String otherString = "strings are always immutable"; 

int len = computerName . Length; 
GetComputerName (computerName, ref len) ; 



Console . WriteLine (otherString) ; 



} 



[Dll Import ("kernel 32", CharSet=CharSet . Unicode) ] 
static extern bool GetComputerName ( 

[MarshalAs (UnmanagedType . LPWStr ) ] string name, 

ref int len) ; 



} 



3a OLUe nO-rO/lflM "KbCMeT" CMMBO/lHMTe HM30Be computerName M otherString 

ca MHTepHnpaHM nopaflki eAHaKBOTO cm cbfltpwaHwe. M3BMKBaHeTO Ha 

CpyHKUMflTa GetComputerName ( ) BOflkl flO npOMflHa Ha computerName, HO 

3aeflHO c Hero ce npoMeHfl v\ otherString. riopaflu cpaKTa, ne npoM^HaTa Ha 
HM3a CTaBa b HeynpaB/isiBaH koa, .NET Framework H*iMa HkiKaKbB Hani/m fla 
pa36epe, ne hakom e HanpaBM/i Ta3M npoMAHa. B pe3y/iTaTa npoMeHHMe 
cbfl"bp>KaHkieTO He Ha eflMH, a Ha flBa HM3a, 6e3 flopn fla cb3flaBaMe HOBa 
MHCTaHunfl Ha K/iaca, KoeTO e b orpoMHO npoTi/iBopenwe Ha Mfleo/iori/mTa 3a 
Hen3MeHMMMTe (immutable) HM30Be. 

M3no^3BaHeTO Ha i/mcrpyMeHTa CLR Spy HaMa/ia B"b3MO>KHOCTTa ot TaKMBa 
rpeujKM nopaflki Ha/ikmweTO Ha Customer Debug Probes (CDP). ToBa e HOBa 

CpyHKUMOHa^HOCT B CLR, KOflTO HM flaBa B"b3MO>KHOCT fla OTKpMBaMe HeCTO 

cpeiuaHM rpeujKM v\ 3a Haiue macTue Te3M CDP ca HaconeHM npeflMMHO KbM 
OTKpuBaHe Ha rpeujKM npn Interop v\ npeo6pa3yBaHe. 

M3no/i3BaHe Ha 6posmn 3a npon3BOflHTe/iHOCT m 
CLRSpy - npMMep 

B to3m npuMep me pa3r/ieflaMe KaK ce M3no/i3BaT 6poflnwTe 3a npon3BO- 
flMTe^HOCT m KaK fla M3no^3BaMe CLRSpy 3a Ha6/iK)fleHkie Ha npo6/ieMHki Mecra 
npn B3anMOfleMCTBneTO c HeynpaB/iflBaH koa. 

1. CTapTupaMe MHcrpyMeHTa 3a Ha6/iK)fleHkie Ha Windows 6poa4MTe 
"Performance Monitor" (perfmon.exe): 



Start -> Settings -> Control Panel -> Administrative Tools -> Performance 



2. C"b3flaBaMe hob Ha6op ot 6poflni/i (New Counter Set). 

3. flo6aBflMe b Ha6opa 6po9\m\re 3a .NET CLR Interop: 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/uiBaH koa 



671 



Add Counters 



JLJ*] 






(* Usejocal computer counters 
C Select counters from computer: 



|\\NAK0V 

Performance object: 
|.NETCLRInterop ~2J 

f* All counters 
C Select counters from list 



tt of CCWs 
tt of marshalling 
tt of Stubs 



n 



tt of TLB exports 1 sec 
tt of TLB imports / sec 



C All instances 

(• Select instances from list: 

0UTL00K.EXE 
0UTL00K.EXE tt1 
0UTL00K.EXE tt2 




4. 3aAaBaMe noAxoflaiu ubht m CKa/ia 3a BceKM ot 6poflni/iTe, TaKa ne 
rpac|DMKaTa fla ce C"b6npa b no/ieTO, KoeTO e OTfle/iei-io 3a Hea: 




672 



flporpaMnpaHe 3a .NET Framework (tom 2) 



CrapTkipaMe npoeKTa ot fleMOHcrpauwfl #3 (Demo-3- 
caiicoMviaRcw.exe) m npoc/ieflflBaMe npoMAHaTa b rpacpMKaTa Ha 

6pOfl4MTe. 

CTapTupaMe MHcrpyMeHTa CLRSpy. flo6aBAMe kbm cnncbKa Ha Ha6/uofla- 
eMMTe npw/ic»KeHi/m Demo-3-caiicoMviaRcw.exe. CrapTkipaMe npw/io>Ke- 

HMeTO Demo-3-CallCOMviaRCW.exe M Ha6/lK)flaBaMe OTHeTeHMTe OT 

CLRSpy C"b6nTMfl: 



O CLR SPY 




About.. 



Options... 



11 probes are enabled for 1 application. 



Stop Probing 






1^ Break on Error Messages 

■Show Error Messages — 

F Collected Delegate 

F Invalid lUnknown 

F Invalid VARIANT 

F Plnvoke Calling Convention Mismatch 



Monitored Applications 



© 



"Force Non-Deterministic Failures - 

F Buffer Overrun 

F Object Not Kept Alive 



© 



Show Warning Messages — 

F Disconnected Context 

F Query! nterface Failure 

F Thread Changing Apartment State 

F Unmarshalable Interface 



A 



Add... II Remove Selected Items 



Application 



Path 



ODemo-3-CallCOMviaR... | d:\Doc 




rShow Extra Information 




F Marshaling 


V 


(* Everything 


C Filter 





Marshaling Filter- 



Edit 



7. OTBapsMe dpaki/ia c:\cirspy.log v\ pa3r/ie>KAaMe bcmukm OTneTeHM 
C"b6nTMfl: 



[12/30/2005 3:17:40 PM] Marshaling in Demo-3-CallCOMviaRCW.exe 
(PID 2528): Marshaling from Int32 to DWORD in method SetExtent. 

[12/30/2005 3:17:40 PM] Marshaling in Demo-3-CallCOMviaRCW.exe 
(PID 2528): Marshaling from IntPtr to DWORD in method GetWindow. 



T/iaBa 23. B3anM0fleMCTBne c HeynpaB/inBaH koa 673 



[12/30/2005 


3:17:45 PM] Marshaling 


in Demo-3-CallCOMviaRCW.exe 


(PID 2528) 


: Marshaling from In 


t32 to DWORD in method 


OnlnPlaceDeactivate . 




[12/30/2005 


3:17:45 PM] Marshaling 


in Demo-3-CallCOMviaRCW.exe 


(PID 2528) : 


Marshaling from Int32 to 


DWORD in method Unadvise. 


[12/30/2005 


3:17:45 PM] Marshaling 


in Demo-3-CallCOMviaRCW.exe 


(PID 2528) : 


Marshaling from Int32 to 


DWORD in method Unadvise. 



ynpawHeHMfl 

1. 1/lMn/ieMeHTwpaMTe Windows Forms npn^OKeHne, KoeTO noKa3Ba cnncbK c 
aKTMBHMTe b MOMeHTa npouecn. 3a BceKM npou.ec Tpa6Ba fla ce noKawe 
cneflHaTa MHCJDopMauMfl: nfleHTwc|Dm<aTopa My (PID), MMeTO Ha cpafi/ia, ot 
komto e 3apeAeH, npnopnTeTa My, o6eMa Ha MMHMMa/iHaTa v\ MaKCMMa/iHaTa 
My pa6oTHa naMeT (working set). l/l3no/i3BaMTe API c|DyHKUMMTe 

EnumProcesses ( ) , OpenProcess ( ) , GetModuleBaseName ( ) , 
GetPriorityClass () , GetProcessWorkingSetSize ( ) M CloseHandle ( ) , 

KaTO vv\ M3BMKBaTe npe3 P/Invoke. flec|DMHMUMMTe ca b 6ki6/iwoTeKHTe 
kernei32.dll m psapi.dll. l/l3no/i3BaMTe flOKyMeHTaunflTa m npuMepnTe 
ot MSDN 3a fla BMflMTe KaK ce i/i3no/i3BaT noconeHi/iTe cJDyHKunn. 
Bw3ya/iM3kipaMTe no noflxoflaiu Hani/m i/i3B/ieneHaTa i/mifcopMaui/m 3a 
npouecnTe. 

2. MMn^eMeHTupawTe Windows Forms npw/io>KeHi/ie, KoeTO BM3ya/iM3kipa PDF 
AOKyMeHTM c noMOiflTa Ha COM KOMnoHeHTa "Adobe Acrobat Control for 
ActiveX". 

3. Cb3flaMTe Windows Forms kohtpo/i, komto pea/iki3kipa nrpaTa "mopckm 
ujax". HanpaBeTe KOHTpo/i-bT flOCTbneH KaTO COM CbpB-bp. HanpaBeTe HTML 
CTpaHnua, c kohto fla Bi/i3ya/ii/i3wpaTe KOHTpo/ia b Internet Explorer. 

4. Pea^M3npaMTe koh30/iho npM/io>KeHMe, KoeTO no flafleH XML <fcai/i/i, cbfltp- 
xaiu cnncbK ot (fcwpMM m MHCJDopMaunfl 3a tax, reHepupa MS Excel flOKy- 
MeHT, cbfl"bp>Kaiu cbiuaTa MHCJDopMauMfl bbb bma Ha Ta6/ii/iu.a. BcyiKa cJDupMa 
ce onucBa c MMe, aflpec v\ Te/iecJDOH. 3a Bp"b3Ka c MS Excel M3no/i3BaMTe 
COM KOMnoHeHTaTa "Microsoft Office Spreadsheet". 

l/l3no/i3Bai-ia JiiuepaTypa 

1. MapTMH Kv/iob, B3anMOfleMCTBne c HeynpaB/iflBaH koa - http://www. 
nakov.com/dotnet/lectures/Lectu re-22-Interoperability-vl.O.ppt 

2. MSDN Library - http://msdn.microsoft.com 

- Interoperating with Unmanaged Code 

- An Overview of Managed/Unmanaged Code Interoperability 

- Beyond (COM) Add Reference: Has Anyone Seen the Bridge? 

- Using the .NET Framework SDK Interoperability Tools 



674 nporpaMnpaHe 3a .NET Framework (tom 2) 

- Calling a .NET Component from a COM Component 

- Microsoft Office and .NET Interoperability 

- The Myth of .NET Purity, Reloaded 

- Platform Invocation Services 

3. MSDN Magazine - http://msdn.microsoft.com/msdnmaq/ 

- Calling Win32 DLLs in C# with P/Invoke 

- Migrating Native Code to the .NET CLR 

4. Improving .NET Application Performance and Scalability (MS Patterns and 
Practices) - http://msdn.microsoft.com/library/en-us/dnpaq/html/scalenet. 
asp 

- Chapter 7 - Improving Interop Performance 

- Checklist: Interop Performance 

5. P/Invoke .NET: The Interop wiki! - http://www.pinvoke.net/ 

6. Microsoft .NET/COM Migration and Interoperability - http://msdn. 
m icrosoft.com/li bra ry/defau It .asp?url=/li bra ry/en- 

us/dnbda/htm l/com interop.asp 

7. CLR Spy - http://www.qotdotnet.com/Community/UserSamples/Details. 
aspx?SampleGuid=C7B955C7-231A-406C-9FA5-AD09EF3BB37F 

8. Interning Strings & immutability - http://bloqs.msdn.com/cbrumme/ 
archive/2003/04/22/51371.aspx 



T/iaea 24. YnpaB/ieHiie Ha 
naMeTTa 11 pecypciiTe 



ABTOpii 

Ctoah flaMOB 

flklMMTbp BOHeB 

He06X0flMMM 3HaHMfl 

- 5a30BM no3HaHM5q 3a .NET Framework v\ CLR 

- Ba30BM no3HaHMfl 3a o6iuaTa cwcreMa ot TunoBe b .NET (Common Type 
System) 

- Ea30BM no3HaHMfl 3a e3MKa C# 

- He3aA"b^>KMTe^HM 6a30BM no3HaHMfl 3a e3MUMTe C v\ C+ + 

npMK/iiOHeHMe. Xa-xa! Cm/ihm yceuiaHHB. Xa-xa! 
flyKeAazr He KonHee 3a raKUBa Heuja. Nona 

Cb/vbpwaHue 

- ynpaB/ieHMe Ha naMeTTa npn pa3/iwnHkiTe e3nun v\ n^aTCJDopMM 

- YnpaB^eHne Ha naMeTTa b .NET Framework 

- KaK ce 3aAe/i5i naMeT b .NET? 

- KaK pa6oTM cucTeMaTa 3a nonwcrBaHe Ha naMeTTa? 

- rioKO/ieHi/isi naMeT 

- B/iok naMeT 3a ro/ieMi/i o6eKTM 

- OnHa^M3aunflTa Ha o6eKTM b .NET 

- flecTpyKTopnTe b C#. OnaujKaTa Freachable 

- TbMHaTa CTpaHa Ha <fcnHa/iM3auMflTa 

- Cb>KMBflBaHe Ha o6eKTM 

- Pbuho ynpaB/ieHwe Ha pecypcuTe c MHTepcJDewca iDisposabie 

- Ea30B K/iac, o6BMBaiu HeynpaB/iflBaH pecypc 

- Close () M M3pM4Ha MMn^eMeHTaUMfl Ha IDisposabie 

- B3anMOAeMCTBne etc cwcreMaTa 3a nonwcrBaHe Ha naMeira 

- Cna6w pecJDepeHunn 

- EcjDeKTMBHO M3no/i3BaHe Ha naMeTTa 



676 nporpaMnpaHe 3a .NET Framework (tom 2) 

- TexHMKaTa "ny/ikmr Ha pecypcn" 

B Ta3M TeMa... 

B HacToamaTa TeMa me HaynwTe iok fla nmueTe npaBki/ieH v\ ecpeKTMBeH koa 
no OTHOiueHMe M3no/i3BaHeTO Ha naMerra v\ pecypcuTe b .NET Framework. IHe 
3anonHeM etc cpaBHeHne Ha npeAHMCTBaTa i/i HeAOcraTbuwTe Ha ptuHOTO v\ 
aBTOMaTM^HO mm ynpaB/ieHi/ie. Cnep, TOBa me pa3r/ieAaMe no-o6cTOkiHO aBTO- 
MaTM^HOTO ynpaB/ieHwe, cpOKycupawKM ce Haw-Bene Btpxy ckicreMaTa 3a 
no^MCTBaHe Ha naMeTTa b .NET (t. Hap. garbage collector). IHe o6tpHeM no- 
ro/iflMO BHMMaHne Ha B3anMOfleMCTBneTO Ha Banjul koa c Hea v\ npaKTMKMTe, c 
komto MO>xeTe p,a v\ noMorHeTe p,a pa6oTM B"b3MO>KHO Haw-ecpeKTMBHO. 

Ako peujMTe fla npecKOHkue Ta3M TeMa, noHe>Ke Ha nptB nornep, H3Me>Kfla 
CKynHa, HefleMTe! Tn e M3ntCTpeHa c npuMepn 3a TOBa KaKbB koa pja M36ar- 
BaTe p,a nrnueTe v\ KaKbB koa p,a ce CTpeMMTe fla nuiueTe. B Hea me HaMepnTe 
MMn^eMeHTaunfl Ha: 

- Ba30B K/iac 3a MHoroKpaTHa ynoTpe6a, o6BMBaiu HeynpaB/iflBaH pecypc, 
komto MMn^eMeHTupa npaBki/iHO MHTepcpewca iDisposabie v\ MMa 
cpkiHa/ii/i3aTop, a ctiuo TaKa e v\ 6e3onaceH 3a ynoTpe6a b 
MHoroHMiuKOBM nporpaMki (thread-safe) 

- K/iac 3a MHoroKpaTHa ynoTpe6a, MMn/ieMeHTkipam thread-safe nyn ot 
pecypcn 



T/iaBa 24. ynpaBJiemie Ha naMerra v\ pecypcuTe 677 

YnpaB/ieHMe Ha naMerra npw pa3/nmHMTe e3HMM vx 
n/iaTct>opMM 

B noHTM BCM4KM e3nu,n 3a nporpaMkipaHe, 3aAe/iflHeTO Ha AHHaMMUHa naMeT ce 
M3BtpujBa "ptuHo", T.e. ce o6flBABa M3pn4HO ot nporpaMkicra. Pa3/im<aTa e b 
ocBo6o>KflaBaHeTO v\ cbiuecTByBaT Tpn Hani/ma 3a ocBo6o>KflaBaHe Ha naMeT 1 : 

- Ptjhho - naMeTTa ce ocBo6o>KflaBa i/i3pi/mHO ot nporpaMwcra, HanpuMep 

bCm C+ + . 

- ABTOMaTMHHO - naMeTTa ce ocBo6o>KflaBa ot cwcreMa 3a aBTOMaTMUHO 
no4MCTBaHe Ha naMeTTa (necro HapwuaHa cwcreMa 3a nonwcrBaHe Ha 
6oK/iyK, Garbage Collector, GC), koato o6mkhob6ho ce 3aAewcTBa 
aBTOMaTi/inHO npn HeAOcrwr Ha naMeT. TaicbB noflxoA ce M3no/i3Ba 
HanpuMep b e3nun KaTO Java, npn komto koa^t ce ki3n"b/iHflBa ot 
BkipTya/iHa MaujMHa, v\nv\ KaTO npn noBeneTO .NET e3v\u,v\, KbAeTO koa^t 
ce M3n"b/iH*iBa b KOHTpo/iwpaHa cpeAa, ocurypflBaiua KopeKTHO ki3n"b/iHe- 
Hue Ha KOAa (.NETCLR). 

- CMeceHO - naMerra MO>xe p,a ce ocBo6o>KAaBa iokto AnpeKTHO ot 
nporpaMMCTa, TaKa v\ aBTOMaTMUHO ot cwcreMa 3a nonwcrBaHe Ha 
6oK/iyK, HanpuMep Visual Basic (BepcunTe npeAH VB.NET). 

npnAo6nBaHeTO v\ ocBo6o>KAaBaHeTO Ha pecypc, pa3/ii/meH ot naMeT 
(HanpuMep pecypc npeAOCTaBeH ot onepaunoHHaTa ci/icreMa), o6mkhob6ho e 
CB"bp3aHO c p"b4HO ynpaB/ieHkie, BtnpeKM ne e B"b3MO>KHO ocBo6o>KAaBaHeTO p,a 
ce aBTOMaTM3npa. 

ritpBO me pa3MeAaMe ptuHOTO ynpaB/ieHkie Ha naMeT, KaTO noconwM Ha^MHu- 
Te 3a 3ap,ennHe v\ ocBo6o>KAaBaHe Ha naMeT v\ pecypcn b ABa M3BecTHM e3MKa 
ot no-HMCKO hmbo -Cm C+ + . C/ieA TOBa me pa3MeAaMe aBTOMaTi/mHOTO 
ynpaB/ieHkie b .NET v\ me cpaBHMM B"b3MO>KHO Haki-o6eKTMBHO ABaTa Hankma 3a 
ynpaB/ieHwe Ha naMeTTa v\ pecypcuTe 3a p,a MMaTe acHa npeAcraBa KaKBO 
MOxeTe m KaKBO He MOxeTe p,a HanpaBMTe bbb BaiunTe HacToaiun v\ 6"bAemn 
.NET npi/i/io>KeHkifl. 

Pt>hho ynpae/ieHiie Ha naMeTTa m pecypcwTe 

Crpaxtr e ntTfjr KhM rbMHara crpaHa. Crpaxtr 

boam mo M3non3BaHe Ha ynpaB/inBaHH e3MLjM. 

YnpaB/ifiBaHHTe e3nun bombt mo n3no/i3BaHero Ha 

Garbage Collector. Garbage Collector bomh mo 

crpaMaHKin. C/C++ ilo/ta 

B paHHMTe roAMHM Ha KOMntorb photo nporpaMnpaHe naMeTTa v\ pe3ypcnTe ce 
ynpaB/iflBaxa ptuHO, npe3 onepaTopn v\ cpyHKunn 3a 3ap,ens\ue v\ ocbo6o>k- 
AaBaHe Ha naMeT v\ pecypcu. no-KbCHO ce noaBuxa hakom TexHMKM 3a aBTOMa- 



1 KaTO ki3K/iK>nwM Hant/iHO Ba^MAHaTa CTpaTerna Ha 6e3AeMCTBne 



678 nporpaMnpaHe 3a .NET Framework (tom 2) 

TM3aunfl, komto y/iecHkixa pa6crraTa c naMeTTa, a cnep, BpeMe Te3M TexHMKM 
3ano4Haxa fla ce BHeflpsiBaT b e3MUMTe 3a nporpaMkipaine v\ n/iaTCpopMMTe 3a 
pa3pa6oTKa v\ w3n"b/iHeHi/ie Ha cocpTyep. HeKa pa3r/ieAaMe ynpaB/ieHweTO Ha 
naMerra b e3MUMTe C v\ C+ + . 

YnpaB/ieHMe Ha naMeTTa b e3MKa C 

3afle/iyiHeTO v\ ocBo6o>KflaBaHeTO Ha naMeT b e3MKa C ce npaBM ptuHO ot 
nporpaMMCTa nocpeACTBOM 6i/i6/ii/iOTenHi/iTe cpyHKUkin malloc (...), realloc(...) 
m free(...) 2 . OyHKunflTa malloc (...) 3ap,ens\ 6/iok noc/ieAOBaTe/iHki 6awTOBe ot 
AMHaMM^HaTa naMeT (t. Hap. heap) v\ Bptiua yKa3aTe/i kbm ntpBua 6aMT ot 
Ta3M naMeT, free(.„) a ocBo6o>KAaBa, a reaiioc(.„) MO>Ke p,a 3ap,enn, 
ocBo6o>KAaBa, pa3Lui/ip*iBa v\ npeMecTBa 6/iOKOBe naMeT v\ e CBoeo6pa3eH 
MeHaxep Ha naMeTTa (memory manager), npe3 komto MoraT p,a ce 

MMn^eMeHTkipaT malloc (...) V\ free (...). 

ynpaB/ieHiie Ha naMeTTa b e3MKa C+ + 

B e3MKa C+ + , ocBeH ropen36poeHMTe cpyHKunn MO>KeTe (m ce npenoptuBa) p,a 
M3no^3BaTe BrpaAeHMTe b e3MKa ABOMKa onepaTopn new v\ delete 3 (komto b 
noBeneTO cnynai/i ca MMn^eMeHTupaHn nocpeACTBOM malloc (...) v\ free (...)). 
npeAMMCTBOTO Ha onepaTopa new npeA cpyHKunaTa malloc (...) e, ne cnep, KaTO 
3ap,ei\v\ naMeT 3a MHCTaHuna Ha AaAeH Tkin, onepaToptT M3BMKBa koa 3a 
MHMuna/iM3aui/ifl Ha Tuna (HapwuaH KOHcrpyKTop) b Ta3M naMeT. OnepaTopvr 
delete M3BMKBa koa 3a pa3pyiuaBaHe Ha MHCTaHunaTa (HapwuaH AecTpyKTop), 
cnep, KoeTO ocBo6o>KAaBa naMeira, 3aeTa ot onepaTopa new 4 . 

flecTpyKTopwTe b C+ + 

flecTpyKToptT Ha MHCTaHuna Ha onpeAe/ieH Tkin (o6eKT) ce i/i3n"b/iH*iBa, 
KoraTo: 

- Ce M3BMKa P"b4HO b KOAa; 

- o6eKTbT HanycHe o6xBaTa (scope), b komto e c"b3AaAeH; 

- v\nv\ npn B"b3HMKBaHe Ha ki3K/iK>neHkie. 

Cb3AaBaHe Ha o6eKTM b C+ + 

Cb3AaBaHeTO Ha o6eKT b AHHaMkmHaTa naMeT c Ma/iKki ki3K/iioneHkifl 5 CTaBa c 
noMOurra Ha BrpaAeHna onepaTop new. B HaM-o6iun /ihhhm, tom ce onuTBa p,a 



2 CtmecTByBaT v\ /ipyrn 4»yHKunn, KaTO caiioc (...), a cbmo n HecraH/iapTHki, KaTO 
aiioca(... ) , kojito 3afle/iji naMeT ot creKa 

3 npM M3nO/13BaHe Ha MaCklBM Ce M3nO/13BaT OnepaTOpMTe new[] M delete [] 

4 3a npuMMTMBHMTe TunoBe KaTO int He ce M3BMKBa KOHCTpyKTop/flecrpyKTop 

5 C noMomTa Ha onepaTopa "placement new" Mowe fla cb3flafleTe o6eKT Ha npon3BO/ieH 
a/ipec b naMerra, BK/iiOHMTe/iHO v\ b CTeKa 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 679 

3a,qe/iki naMeT, flocraTbUHa 3a fla noMecni MHCTaHuna Ha noflafleHna Tun, cnep, 
KoeTO, aKO ycnee, M3BMKBa KOHCTpyKTopa 3a fla nHMu.ua/iM3kipa o6eKTa b Ta3M 
naMeT. Ako He ycnee, b 3aBMCMMOCT ot hhko/iko yc/iOBi/m, komto H*iMa fla 
pa3Me>KflaMe, v\nv\ M3XB"bp/ifl M3K/iK>neHne v\nv\ 3anncBa Hy/ieBa (null) ctom- 
hoct b yKa3aTe^a. 06eKT, 3afle/ieH b flkmaMMUHaTa naMeT, ce pa3pyiuaBa c 
BrpafleHMfl onepaTop delete, komto M3BMKBa flecTpyKTopa Ha o6eKTa v\ aKO He 
Bt3HMKHe M3K^K)4eHne, ocBo6o>KflaBa 3afle^eHaTa naMeT ot onepaTopa new. 

ABTOMaTHHHO yHMU4C»KaBaHe Ha pecypcM b C+ + 

OaKTtT, ne flecTpyKToptT Ha o6eKT, MHCTaHunpaH b CTeKa, ce M3BMKBa 
aBTOMaTM^HO npw HanycKaHeTO Ha HeroBna o6xBaT v\nv\ npn B"b3HMKBaHe Ha 
M3K^K)4eHne (m b nacmocT TexHMKaTa RAII 6 ), e Moxe 6m Haw-Ba>KHaTa 
npn4MHa C++ fla He ce Hy>Kflae ot K/iay3aTa finally, 6e3 koato He e 
B"b3MO>KHO fla ce nuiue koa, ycrokinkiB Ha ki3K/iK>neHkifl, b e3i/iu.i/i ioto C# m 
Java 7 . Ha/ikmweTO Ha flecrpyKTopw b C++ npaBM B"b3MO>KHO aBTOMaTi/mHOTO 
ocBo6o>KflaBaHe Ha bcmukm BMflOBe pecypcn, HanpuMep: 



// 


cjiefl 


HanycKaHe 


Ha o 


6xBaTa Ha mem natieTTa 


me 


b'bfle 


ocBo6ofleHa 


boost :: shared ptr 


mem ( 


new 


char [20] ) ; 














// 


flopw 


npM Bl3HMKBaHe 


Ha 


MSKJiioyeHMe 


TyK naMeTTa me 


ce 


OCBOfiOflH, 


// 


3amoTO flecTpyKTopM 


Ha 


shared ptr 


me 


6 r bp,e 


H3BMKaH 





OcBo6o>KflaBaHeTO Ha naMeTTa v\ pecypcuTe b C e B"b3MO>KHO fla ce npaBM caMO 
p-b4HO (ocBeH KoraTO ce no/i3Ba Garbage Collector 3a C). 

npeflMMCTBa m HeflOCTarbuiM Ha pi>mhoto ynpaB/ieHue 
Ha naMeTTa m pecypcuTe 

LU,e M36ponM npeflMMCTBaTa v\ HeflocraTbUMTe, Tbv\ KaTO npeflcraBHHeTO mm b 
Ta6/ii/meH bma e Hey,qo6HO 3a neTeHe. 

ripeAHMCTBa Ha pt»HHOTo ynpaB/ieHMe 

ripeflMMCTBaTa ca noBene ot M36poeHMTe no-,qo/iy, ho H^Ma fla flaBaMe nt/ieH 
cnncbK, T"bki KaTO ce cpOKyckipaMe Btpxy .NET: 

- B"b3MO>KHO e ocBo6o>KflaBaHe Ha pecypcuTe b M3BecTeH, >Ke/iaH momcht 

(HanpMMep M3BMKBaHeTO Ha free V\I\V\ delete V\I\V\ aBTOMaTM4HOTO 

M3BMKBaHe Ha flecrpyKTop b C++ ptuHO, npn ki3/iki3aHe Ha o6eKTa M3B"bH 
o6xBaT v\nv\ npn B"b3HMKBaHe Ha ki3K/iK>neHkie). 

- MMaMe nt/ieH kohtpo/i Ha Hankma 3a 3a,qe/iflHe v\ ocBo6o>KflaBaHe Ha 
naMeT, BK/iionkiTe/iHO HanncBaHeTO v\ 3aM*iHaTa Ha MeHMfl>K"bpa Ha 



6 Resource Acquisition Is Initialization 

7 noflpo6HO o6flCHeHne me HaMepnTe b Kpaa Ha Ta3M TeMa 



680 nporpaMnpaHe 3a .NET Framework (tom 2) 

naMerra, KaKTO v\ npeflecpMHupaHeTO Ha 3ap,ens\ue v\ ocBo6o>KflaBaHe Ha 
naMeT 3a >Ke/iaH ot Hac noTpe6i/iTe/iCKki Tun (b C+ + ). 

- B"b3M0>KH0 e KOHCTpynpaHe Ha o6eKT Ha 3aflafleH ot Hac aflpec (no/ie3HO 
b C++ 3a nucaHe Ha yctom^mb Ha w3K/iK>neHkifl koa, KaKTO v\ b C npn 
nucaHe Ha ci/icreMeH koa). 

- B"b3MO>KHO e 3ap,enf\ne Ha 6/iok naMeT ot CTeKa (c noMOurra Ha 
aiioca(...) v\nv\ M3no^3BaHeTO Ha MacuBM c npoMeH/ikiB pa3Mep - C99). 

- /luncaTa Ha naMeT MO>xe p,a ce ycraHOBM no hhko/iko Hani/ma v\ p,a ce 
npeAnpneMe HHKaKBO AewcTBue. 

HeAOCTaTi>uM Ha pt>hhoto ynpaB/ieHue 

HeAOCTaTtuMTe ca noBene ot cnoMeHaTMTe no-AO/iy v\ ce HaAflBaMe, ^e 
M36poeHMTe npo6/ieMM me bm p,ap,aj AOcrarbUHO ocHOBaHne p,a pa36epeTe 
3Ha4MMOCTTa Ha cucTeMaTa 3a aBTOMaTMUHO nonwcrBaHe Ha naMerra (GC) b 
.NET Framework, J\a 3anonHeM c HaM-necro cpeiuaHMTe rpeujKM, komto boa^t 
AO npo6/ieMM v\ ce AonycKaT Aopn ot Haw-onnTHMTe nporpaMMCTn: 

- HectOTBeTCTBue b 6poa Ha 3aAe/isiHkiflTa v\ ocBo6o>KAaBaHkiflTa, KoeTO 
boam ao "M3TM4aHe" Ha naMeT (memory leak). HeAOcrarbKbT oneBMAHO 
e ptuHOTO ocBo6o>KAaBaHe Ha naMeT. KaTO nacreH cnynai/i Tpa6Ba p,a 
noco4MM m M3TM4aHe Ha naMeT, nopoAeHO ot HeAo6pe HanncaH 

KOHCTpyKTOp Ha K/iaC nO OTHOLUeHMe Ha B"b3HklKBaHeTO Ha kl3K/lK>HeHMfl. 

- HectOTBeTCTBue b M3BMKBaHeTO Ha onepaTopnTe 3a TunoBe v\ MacuBM ot 
TunoBe, HanpuMep M3BMKBaHe Ha delete, 3a naMeT, 3ap,ei\eua c new[] . 

- OnuT 3a neTeHe v\nv\ nucaHe Ha Bene ocBo6oAeHa naMeT v\nv\ onuT 3a 
noBTopHO ocBo6o>KAaBaHe Ha naMeT. 

- OnuT 3a nucaHe b He3aAe/ieHa ot nporpaMwcra naMeT Ha Bai\v\p,eu aApec 
b aApecHOTO npocrpaHCTBO Ha BaiuaTa nporpaMa v\i\v\ 3annc Ha noBene 
MHCpopMaunfl ot 3aAe/ieHaTa 3a TOBa naMeT - npo6/ieM, Aonpkmecb/i 3a 
Haw-ro^eMMTe npo6nBM CB"bp3aHM etc curypHOCTTa. 

He MOxeM as He 6tAeM necmi/i KbM C/C++ nporpaMMCTMTe v\ p,a cnoMeHeM, ne 
3a noBeneTO ot ropenoconeHkiTe npo6/ieMki cbmecrByBa peiueHne - BAnraHe 
Ha hmboto Ha npeAynpe>KAeHMfl ot KOMnw/iaTopa, i/i3no/i3BaHeTO Ha assertions, 
t. Hap. yMHM yKa3aTe^n (smart pointers), STL KOHTewHepn, moluhm 6w6/ikiOTe- 
km KaTO boost m TexHMKaTa RAIL 

Eto m hako/iko HeAOCTaTbKa, 3a komto cbmo cbiuecTByBaT peweHi/m, ho b 
noBeneTO c/iynaw Te ca CB"bp3aHM c Aont/iHkiTe/iHki pa3X0An: 

- EaBHO 3ap,ens\ue (m ocBo6o>KAaBaHe) Ha AHHaMMUHa naMeT, oco6eHO c 
MeHMA>K"bpa Ha naMerra no noApa36npaHe. 

- OparMeHTupaHe Ha AHHaMMUHaTa naMeT nopaAM HeonTMMH3npaHa pea- 
^M3aunfl Ha MeHMA>K"bpa Ha naMerra no noApa36npaHe. 



T/iaBa 24. ynpaBJiemie Ha naMerra v\ pecypcuTe 681 

- HeecpeKTMBHO i/i3no/i3BaHe Ha npouecopnTe Ha MaiunHaTa nopaflu 
HeonTMMM3npaHM a^ropnTMM 3a cnHxpoHM3aunfl Ha CTpyKTypnTe ot 
AaHHM Ha MeHMA>K"bpa Ha naMeTTa no noApa36npaHe (t. Hap. false 
sharing, npn komto bcmukm npouecopn 6/iOKMpaT AOKaTO eAMH ot tax 
M3n"b^HABa koa, 3aAe/i*im v\nv\ ocBo6o>KAaBaiu naMeT) 8 . 

- Usi/ia r/iaBa MO>Ke p,a ce nocBeTM Ha eAHa ot Haw-TpyAHMTe v\ noAarriMBM 
Ha rpeujKM 3aAanM b C++ - 6poeHe Ha pecpepeHUMMTe kbm o6eKTMTe, 
Haw-Be^e npn wepapxnn ot o6eKTM, KbAeTO MMa umk/imuhm pecpepeHunn. 
ripn TaKMBa npo6/ieMM, HanncBaHeTO Ha npaBM/ieH koa c 6poeHe Ha 
pecpepeHUMM rpaHMUM c repon3"bM. 

Tpa6Ba p,a OT6e/ie>KMM, ne cbiuecTByBaT cbo6oahm (npn TOBa AOCTa Ao6pn) 
MMn^eMeHTauuM Ha Garbage Collector 3a C v\ C+ + , komto o6ane He ca ujmpoko 
pa3npocTpaHeHM v\ M3no/i3BaHM. 

M36poeHMTe HeAOcrarbUM no-rope ca AOBe/iw ao cb3AaBaHeTO Ha CKtnn 
npoAyKTM KaTO Insure+ + , Rational Purify v\ CompuWare BoundsChecker, 
komto Aa ce cnpaBAT c Kyn npo6/ieMM, komto KaKTO me ce y6eAMTe caMM, 
npocTO He ctiuecTByBaT b .NET. 

YnpaBJieHue Ha naMeTTa b .NET Framework 

Tpn6Ba p,a oryyuLU TOBa, Koero cm Hay-inn. Mojja 

B ceKUMMTe ao Kpaa Ha Ta3M MaBa me pa3r/ieAaMe oco6eHOCTMTe Ha ynpaB- 
nenv\ejo Ha naMerra b .NET Framework. IHe ce cnpeM Ha npouecnTe, npoTM- 
4aiun 3aA cueHaTa Ha aBTOMaTMUHOTO ynpaB/ieHMe Ha naMeTTa. IHe npoc/ie- 
Amm >KM3HeHMfl u.MKb/i Ha o6eKTMTe - ot 3aAe/i*iHeTO Ha naMeT npn taxhoto 
cb3AaBaHe, ao MOMeHTa b komto Te yMnpaT v\ ocBo6o>KAaBaT 3aeTMTe ot tax 
pecypcu. IHe cnoMeHeM 3a MHTepecHna cnynai/i, npn komto eAMH o6eKT MO>Ke 
Aa ce cb>KMBM, B"b3Kp"bCBaMKM ot CBeTa Ha MtpTBMTe, m Aa ce M3nO/13Ba OTHOBO 
ot npn^OKeHneTO. 

KaTO u.fl/io, ynpaB^eHneTO Ha naMerra b .NET e MHTepecHa v\ Bt/iHyBama 
TeMa. B HacToaiuaTa r/iaBa me ce onuTaMe Aa bm AaAeM ufl/iocma npeACTaBa 
3a TOBa KaKBO ce c/iyuBa b CMcreMaTa, AOKaTO ce i/i3n"b/iH*iBa ynpaB/isiBaH koa, 
m me HaB/ie3eM b mhoto ot AeTaki/ii/iTe. 

ToBa etc curypHOCT me bm noMOTHe Aa pa36epeTe no-nt/iHO .NET Framework, 
i/i MO>Ke 6m, Aa nMiueTe no-Ao6"bp koa. 

1/1 TaKa, KaKTO HecbMHeHO Bene CTe pa36pa/iM, ynpaB/ieHMeTO Ha naMeTTa b 
.NET e aBTOMaTMUHO. Ot r/ieAHa TOUKa Ha pa3pa6oT4MUMTe, TOBa 03HanaBa, 
ne Bene He e Heo6xoAMMO Aa ce nMiue cneu.Ma/ieH koa, komto Aa ocBo6o>KAaBa 
3aeTaTa ot o6eKTMTe naMeT. 



MeHMA>Ktp"bT Ha naMeT Hoard, peiuaBa ao ro/iHMa CTeneH ropHMTe tpm 
npo6/ieMa, a cbiuo MMa m cpeACTBa 3a HaMMpaHe Ha yTenKM Ha naMeT, ho 3a 
cb>Ka/ieHMe He e 6e3n/iaTeH. 



682 nporpaMnpaHe 3a .NET Framework (tom 2) 

KoraTO BaiueTO npi/i/io>KeHkie cb3flaBa hob o6eKT, naMeTTa, Heo6xoAHMa 3a 
Hero ce 3ap,enn b pernoH, HapeneH managed heap. 3aAe/iflHeTO Ha naMeTTa v\ 
xnMntT ce pa3r/ie>KAaT Ma/iKO no-HaTarbK. Cnep, KaTO o6eKTbT e cb3AaAeH, 
npn^OKeHneTO M3no/i3Ba HeroBaTa cpyHKuwoHa/iHOCT, v\ KoraTO o6eKTbT crane 
HeHyweH, tom npocTO ce "M30CTaBfl", v\ b no-KtceH eTan ce nonwcTBa aBTOMa- 
tm4ho OTT.Hap. garbage collector - cwcreMaTa 3a nonwcTBaHe Ha naMeTTa. 

BepoflTHO ce floceiuaTe, ne pa6oTaTa no nonwcrBaHeTO BCbiuHOCT e uav\- 
TpyAoeMKaTa v\ Haw-OTroBopHa nacr ot ynpaB/ieHweTO Ha naMeTTa b .NET. 
A^ropnT"bM"bT, no komto pa6oTM garbage collector me pa3r/ieAaMe noApo6HO 
cnep, Ma/iKO. 3acera npocTO npneMeTe, ne BMHarn, KoraTO vw\a uep,ocvv\v ot 
naMeT, ce crapTi/ipa cwcreMaTa 3a nonwcrBaHe Ha naMerra, koato MAeHTMCpn- 
uupa BCM4KM OTnaA^UM - T.e. o6eKTM, komto Bene He ce ki3no/i3BaT ot 
npw/io>KeHkieTO v\ ocBo6o>KAaBa 3aeTaTa ot tax naMeT. KaTO nporpaMMCTM no 
npuHunn H^MaMe kohtpo/i Btpxy TOBa b kom MOMeHT me 3anonHe nonwcTBaHe- 
to, hmto ko/iko BpeMe me OTHeMe. 

EcTecTBeHO, 3a hakom o6eKTM He e AOcrarbUHO caMO p,a ce ocbo6oah naMeTTa. 
Ako HanpuMep AaAeH o6eKT Kancy/iwpa cpai/i/iOB MaHkiny/iaTop, etc curypHOCT 
6nxMe kiCKa/iw p,a ocbo6oahm m to3m pecypc, KoraTO Bene He hm e Hy>xeH. 
ToBa He MO>Ke p,a 6tAe HanpaBeHO aBTOMaTi/mHO ot garbage collector, Tbv\ 
KaTO tom ce rpn>KM caMO 3a naMeTTa v\ He 3Hae KaKBM Apyrn cucTeMHM pecyp- 
cm M3no^3Ba o6eKT"bT. 3a ocBo6o>KAaBaHeTO Ha Te3M pecypcn Bee oiue Tpa6Ba 
Aa ce norpn>KMM ptuHO. 3a ue/iTa b .NET cbiuecTByBaT T.Hap. <f>MHa.nM3aTopi4 
(finalizers) - cneuwa/iHki MeTOAM, komto ce w3n"b/iHflBaT npeAM o6eKT"bT Aa ce 

yHMlUO>KM. 

B ropHMTe a63aun npocTO HaxBtp/uixMe hakom ot no-Ba>KHMTe TeMM, komto me 
6"bAaT pa3MeAaHM noBene v\nv\ no-Ma/iKO p,ejav\i\uo b r/iaBaTa. 

HeKa npeAM Aa npeMMHeM kbm noApo6HOCTMTe, Aa ce cnpeM Ha npeAHMcmaTa 
m HeAOCTaTtunTe Ha Ta3M cxeMa Ha ynpaB/ieHne Ha naMerra. 

npeflMMCTBa vx HeflOCTarbMM Ha aBTOMaTMHHOTO 
ynpaB/ieHiie Ha naMeTTa 

KaKTO BCAKa TexHO/iori/ifl, TaKa v\ aBTOMaTi/mHOTO ynpaB/ieHi/ie Ha naMerra MMa 
CBOMTe n/iiocoBe m MMHycu. B Ta3M ceKunfl HaKpaTKO me pa3r/ieAaMe no- 

Ba>KHMTe OT TAX. 

npeflMMCTBa 

HaM-ro/isiMOTO npeAMMCTBO Ha aBTOMaTMUHOTO ynpaB/ieHi/ie Ha naMerra, 
pa36npa ce e TOBa, He Hue, KaTO pa3pa6oT4nun, CMe ocbo6oa6hm ot rpn>KaTa 
P"b4HO Aa no4MCTBaMe HeHy>KHMTe o6eKTM. ToBa hm no3BO/iHBa b no-ro/iHMa 
CTeneH Aa ce cbcpeAOTOHMM Btpxy 6n3Hec ziori/iKaTa Ha HaiueTO npn^OKeHne 
m Aa OTAe^AMe no-Ma/iKO BpeMe b rpuxn 3a npaBM/iHOTO ynpaB/ieHkie Ha 
naMerra. ToBa ntK, ot cboa CTpaHa boah ao no-6"bp30 nucaHe Ha KOAa v\ KaTO 
\\s\no ao cbKpaTeH uwKb/i Ha pa3pa6oTKa. 



T/iaBa 24. ynpaBJiemie Ha naMerra v\ pecypcuTe 683 

TflCHO CB"bp3aHO c irbpBOTO e m APyroTO ro/iyiMO npeflMMCTBO - npeflOTBpaTfl- 
BaHeTO Ha T.Hap. "memory leaks" v\nv\ M3TimaHe Ha naMeT. ToBa e mhoto 
HenpuflTeH npo6/ieM, komto ce no/iynaBa, KoraTO pa3pa6oT4nu,MTe 3a6paB*iT 
Aa nonwcTBaT HeHy>KHMTe o6eKTM. B pe3y/iTaT, npw/io>KeHi/ieTO 3anonBa fla 
3aeMa Bee noBene naMeT v\ c TeneHwe Ha BpeMeTO ce flecTa6n^M3npa. Ta3M 
CMTyaunfl e oco6eHO KpwTMUHa npn ctpBtpHM npw/io>KeHi/m, komto Tpa6Ba Aa 
pa6oTAT At^ro BpeMe (ceAMnun v\ Meceun) 6e3 Aa ce pecrapTkipaT. OcBeH 
bcm4ko Apyro, TOBa e npo6/ieM, komto mhoto TpyAHO ce OTKpuBa (o6mkhob6ho 
TOBa CTaBa, KoraTO npi/i/io>KeHi/ieTO Bene ce w3no/i3Ba ot K/iweHTkiTe) v\ oiue 
no-TpyAHO ce Ae6trBa. riOHAKora, npn ro/ieMM CMCTeMM ca Hy>KHki ahm m Aopn 
ceAMMun 3a OTKpuBaHeTO m OTCTpaHABaHeTO Ha npkinkiHaTa 3a npo6/ieMa (b 
mhoto cnynaw npwuwHaTa ce OKa3Ba narnep, HeBMHHa rpeujKa, v\ to Ha mactoto 
b KOAa, b KoeTO CTe HaM-curypHM ne pa6oTM npaBki/iHo). 

B .NET MO>KeM Aa CMe curypHM, ne aKO eAMH o6eKT He ce i/i3no/i3Ba ot 
npi/i/io>KeHi/ieTO, tom me 6"bAe ocbo6oa6h. CpaBHkiTe/iHO TpyAHO (ho He 
HeB"b3MO>KHO, KaKTO caMM me ce y6eAMTe no-HaTaTbK) e Aa nocTurHeTe 
M3TM4aHe Ha naMeT. 

flpyr necro cpeiuaH npo6/ieM, e nucaHeTO v\ neTeHeTO no Bene ocBo6oAeHa 
naMeT v\nv\ noBTopHO ocBo6o>KAaBaHe Ha o6eKT. ToBa, b 3aBncnMOCT ot 
CMTyaunflTa MO>Ke Aa AOBeAe ao cpuB Ha ua/ioto npn^OKeHne, v\nv\ p,o 
AecTa6n^M3npaHeTO My c HenpeABMAHMn nocnep,v\\\v\. ripn aBTOMaTMUHOTO 
ynpaB/ieHwe Ha naMerra, o6eKT"bT ce yHMiuoxaBa caMO KoraTO e rapaHTupaHO 
HeAOCTbneH (cneA Ma/iKO me bmamm KaK CTaBa TOBa), TaKa ne H^Ma KaK Aa 
AOCTtnBaMe o6eKTa, aKO tom Bene e 6m/i yHMiuo>KeH. 

Eamh ot HenpuflTHMTe npo6/ieMki npn HeynpaB/iflBaHkiTe npw/io>KeHkifl e /iwn- 
caTa Ha cbr/iacyBaHOcr b CTpaTernnTe 3a OTni/iTaHe Ha HeAOCTur Ha naMeT. 
lionâ„¢ BCM4KM 6n6^noTeKM M3no/i3BaT caMO ABe CTpaTernn, ho cbneTaBaHeTO 
mm bm npnHy>KAaBa Aa B3MMaTe He BMHarn npn^THM peiueHMfl 3a AH3ai/iHa Ha 
npn^o>KeHMeTO bm, a cbiuo TaKa npaBM KOAa bm TpyAeH 3a noAAPt>>KKa. B .NET 
MO>Ke Aa 6"bAeTe curypHM, ne BMHarn me 6"bAe M3XB"bp/ieHO M3K/iK>neHMeTO 

OutOfMemoryException (BtnpeKM, ne B T03M MOMeHT He MO>KeTe Aa 

HanpaBMTe kom 3Hae KaKBo). 

ripn ptuHOTO ynpaB/ieHne Ha naMeTTa eAHH ot Hai/i-6e/ie>KkiTkiTe npo6/ieMi/i e 
to3m c 6poeHe Ha pecpepeHUMMTe kbm o6eKTMTe, KaKTO v\ nacmMfl cnynaw c 
UMK/iMUHM pecpepeHUMM (KoraTO ABa v\nv\ noBene o6eKTa cbAtpwaT pecpepeH- 
\\v\v\ eAMH K"bM Apyr). T03M npo6/ieM He ctiuecTByBa b .NET. 

flpyro, HeMa^OBa>KHO npeAHMcmo Ha aBTOMaTMUHOTO ynpaB/ieHwe Ha naMeTTa, 
e ne naMeTTa b xnwna ce 3aAe/ifl mhoto 6"bp30. B cneABamaTa ceKuna me 
pa36epeM 3aiuo TOBa e TaKa. 

E, pa36npa ce, 6"bp30TO 3aAe/i*iHe Ha naMeT ce KOMneHCupa ot TpyAoeMKOTO v\ 
ocBo6o>KAaBaHe, KoeTO ntK ot cboa CTpaHa e eAMH ot MaBHMTe HeAOCTaTtun 
Ha to3m MOAe^ 3a ynpaB^eHne Ha naMerra. 



684 nporpaMnpaHe 3a .NET Framework (tom 2) 

HeflocTaTbmi 

EcTecTBeHO, ochobhmat HeflocrarbK Ha aBTOMaTi/mHOTO ynpaB/ieHkie Ha 
naMerra e, ne noni/iCTBaHeTO v\ e Te>KKa v\ BpeMeoTHeMaiua onepauna. KoraTO 
e Heo6xoflMMO fla ce ocbo6oam naMeT, bcmukm hmujkm Ha npn/ic»KeHMeTO 
3acnnBaT v\ ocTaBaT b TOBa ctCTOflHue flOKaTO garbage collector 3aB"bpujn 
CBOATa pa6oTa. 1/1 rbfi KaTO cucTeMaTa 3a noni/iCTBaHe Ha naMeTTa ce crapTwpa 
KoraTO MMa HeflocTur Ha naMeT, Hue HJiMaMe kohtpo/i touho b kom MOMeHT 
HaweTO npn^OKeHne me "3acnn", 3a fla ce ocbiuecTBM nonwcTBaHeTO, hmto 
ko/iko BpeMe me Tpae TOBa "3acnnBaHe". 

BtnpeKM, ne e B"b3MO>KHO "ptuHo" fla KOHTpo/iwpaMe pa6oTaTa Ha garbage 
collector npe3 CTaTn^HMTe MeTOflu Ha K/iaca gc, TOBa b orpoMHaTa nacr ot 
cnynawTe e Henpenoptni/iTe/iHO, Tbv\ KaTO CLR o6mkhob6ho MO>xe no-flo6pe fla 
npeueHM Kora Tpa6Ba fla ce octiuecTBn nonwcrBaHe. Bee naK, "aBTOMaTMUHO 
ynpaB/ieHwe" 03HanaBa v\ no-Ma/itK kohtpo/i Btpxy ci/icreMaTa, KoeTO He ce 
xapecBa Ha hakom nporpaMMCTM. 

A^ropnTtMBT, no komto pa6oTM garbage collector e flocTa flo6pe onTMMH3npaH 
m BepoflTHO me ce onTMMH3npa oiue, b 6"bflemnTe Bepcun Ha .NET Framework, 
TaKa ne 3a noBeneTO npn^OKeHna, ki3BecmaTa 3ary6a Ha kohtpo/i e 
npneM^MBa ueHa 3a npeflMMCTBaTa, komto no/iynaBaMe. Ot Microsoft tbbpaht, 
ne npn TecTOBe Ha 200 MHz Pentium Mawi/ma, nonwcTBaHeTO Ha rioKO/ieHkie 0, 
OTHeMa no-Ma/iKO ot eflina MminceKyHfla (iokbo e rioKO/ieHkie me craHe 
flyMa Ma/iKO no-HaTarbK). TaKa ne, KoraTO no-rope Ka3BaM ne npi/i/io>KeHi/ieTO 
me "3acnn", He ocTaBawTe c rpeujHOTO BnenaT/ieHi/ie, ne nporpaMMTe bm me 
6/iOKi/ipaT 3a Heonpe,qe/ieH nepnofl ot BpeMe - o6mkhob6ho garbage collector 
ce M3n"b/iHflBa flocrarbUHO 6"bp30 3a fla He ce 3a6e/i*i3Ba c npocTO oko. 



& 



3anoMHeTe, ne H»Ma rapaHMi/in Kora ce M3ni>/iHnBa garbage 
collector v\ ko/iko BpeMe OTHerta! 



BtnpeKM, <ie e to/iamo npeflMMCTBO, bmcokoto hmbo Ha a6cTpaKu.wfl e v\ orpo- 
MeH HeflocrarbK - HeonnTHMTe nporpaMMCTM, komto He pa36npaT (i/i/im no- 
/loujo - He MCKaT fla pa36npaT) KaK pa6oTM ynpaB/ieHi/ieTO Ha naMerra b .NET 
m b nacTHOcr ci/icreMaTa 3a no^MCTBaHe Ha naMerra, ca cnoco6HM fla HanmuaT 
cm/iho HeecpeKTMBeH no OTHOweHkie Ha ki3no/i3BaHeTO Ha naMeTTa koa, KaKTO 
m KOfl, komto fla npeflM3BMKa "M3TM4aHe" Ha naMeT flopn b .NET. 

Bene cnoMeHaxMe, ne garbage collector ce rpn>KM 3a nonwcTBaHeTO Ha 
naMerra. Bee oiue mhoto cucTeMHM pecypcn, o6ane, Tpa6Ba fla ce ynpaB/isiBaT 
Pbuho. He MO>KeTe fla onaKBaTe ot garbage collector aBTOMaTi/mHO fla 3aTBopn 
Mpe>KOBa Bp"b3Ka v\nv\ cpaw^OB MaHkiny/iaTop. KoraTO nporpaMnpaTe o6eKT, 
Kancy/ikipam HAKaKtB ckicreMeH pecypc, Tpa6Ba fla MMaTe TOBa npeflBMfl v\ fla 
B3eMeTe cneu.i/ia/iHM MepKM 3a npaBi/i/iHOTO My noni/iCTBaHe. KaK CTaBa TOBa me 
pa3r/ieflaMe no-HaTarbK b HacToaiuaTa TeMa. 

HeKa cera HaB/ie3eM b fleTaw/ii/iTe Ha ynpaB/ieHi/ieTO Ha naMeTTa b .NET 
Framework. 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 



685 



KaK ce 3ane/isi naMeT b .NET? 

KoraTO CLR ce kiHkiu,kia/iki3npa, tom 3ap,ens\ pernoH ot nocneAOBaTe/iHi/i aflpecu 
b naMerra. ToBa e T.Hap. flMHaMMHHa naMeT v\nv\ managed heap. 

3a pa3/im<a ot CTOMHOCTHMTe TunoBe, hi/iato naMeT ce 3ap,enn b CTeKa v\ ce 
ocBo6o>KflaBa BeAHara, cnep, ioto npoMeH/iMBaTa M3/ie3e ot o6xBaT, naMerra, 
Hy>KHa 3a pecpepeHTHMTe TunoBe, BMHarn ce 3ap,ens\ b managed heap. 

B Ta3M ceKUMJi me pa3r/ieAaMe KaK ce ocbmecrBflBa 3aAe/i*iHeTO Ha naMeT b 
xnwna. 

B .NET, AHHaMkmHaTa naMeT BMHarn ce 3an"b/iBa nocneAOBaTe/iHO ot/iabo 
HaA^CHO. Mo>KeTe Har/ieAHO p,a cm npeAcraBMTe ynpaB/iflBaHkifl xnwn KaTO 
KOHBewep, npn komto o6eKTMTe ce Ao6aBHT eAMH cnep, Apyr Btpxy zieHTaTa 
(naMerra), KaTO BceKM cneABam e ruivmo AO/ieneH ao npeAniuHMfl. 3a p,a e 

B"b3MO>KHO TOBa, XMMn"bT nOAA"bp>Ka yKa3aTe^, T.Hap. NextObjPtr, KOMTO COHM 

aApeca Ha komto me ce Ao6aBM cneABamkiflT cb3AaAeH o6eKT. OnrypaTa 
M/uocrpi/ipa TOBa onucaHne: 



3aeTa naMeT 



CBodo/nra naMeT 



\ NextObjPtr 

Tosa e 6a30BHHT aapec Ha 
cneaBamna ctwaeH oSeicr. 

KoraTO npouecvr ce crapTkipa, AHHaMkinHaTa naMeT He cbAtpwa HMKaKBM 
o6eKTM m NextObjPtr e ycTaHOBeH p,a conn kbm 6a30Bna aApec ot xnwna. 



CBo6o^Ha naineT 



NextObjPtr 



3a f\a cb3AaAeM o6eKT b managed heap, ki3no/i3BaMe koa, noAo6eH Ha to3m: 



SomeObject x = new SomeOb j ect () ; 



C# KOMnn/iaToptT npeBe>KAa KOAa b IL newobj MHCTpyKuna: 



newobj instance void MyNamespace . SomeOb j ect ::. ctor i 



KoraTO Ta3M MHCTpyKuna ce ki3n"b/iH*iBa, CLR AeMCTBa no cneAHkifl HanwH: 



686 



flporpaMnpaHe 3a .NET Framework (tom 2) 



- M3Hkic/iflBa pa3Mepa, Heo6xoflkiM 3a no/ieTaTa Ha hobma o6eKT v\ 

BCM4KMTe My pOflklTe/lCKM 06eKTM. 

- KtM no/iyneHMfl pa3Mep npn6aBfl pa3Mepa Ha MethodTabiePointer v\ 
syncBlockindex (cneu.ua/iHM cny>Ke6Hki no/ieTa). ripn 32-6nTOBMTe 
cucTeMM, Te3M flBe no/ieTa flo6aBAT 8 6aMTa KbM pa3Mepa Ha BceKM 
o6eKT, a npn 64-6nTOBMTe cucTeMM - 16 6aMTa. 

- npn6aBfl no/iyneHaTa ctomhoct KbM yKa3aTe/ia Nextobjptr. Ako b 
managed heap MMa flocraTbUHO macto, naMeTTa ce 3a,qe/ifl, M3BMKBa ce 
KOHCTpyKToptT Ha o6eKTa, komto n MHMuna^M3Mpa, m aflpecbT Ha o6eKTa 
ce Bptiua ot new onepaTopa. Ako CLR ycraHOBki, ne mhctoto b naMerra e 
HeAOcraTbUHO, ce crapTwpa garbage collector. Cnefl KaTO tom npm</iK>ni/i 
pa6oTa, CLR onuTBa othobo fla Cb3fla,qe o6eKTa. Ako m ToraBa H^Ma 
flocTarb^HO naMeT, xnkintT ce yBe/iwuaBa, a aKO TOBa e HeB"b3MO>KHO, 

new OnepaTOp"bT npeflkl3BMKBa OutOfMemoryException. 
3Ha4eHkieTO Ha no/ieTaTa MethodTabiePointer M SyncBlockindex, KOMTO CLR 

cb3AaBa 3a BceKM o6eKT ot ynpaB/iflBaHi/isi xntin, e M3B"bH TeMaTa Ha Ta3M 

MaBa. HaKpaTKO, MethodTabiePointer, KaKTO l"IOKa3Ba MMeTO My, Cbfl"bp>Ka 

yKa3aTe/i KbM aflpeca Ha Ta6/iMu.aTa c MeTOflMTe Ha p,e>p,euv\s\ Tun, a 
syncBlockindex ce M3no/i3Ba npw CMHxpoHM3aunflTa Ha o6eKTa Me>Kfly hmuj- 
KMTe. 3a ue/iMTe Ha HacToaiuoTO ki3/io>KeHkie, npocro Tpa6Ba fla 3anoMHMTe, ne 
BceKM eAMH o6eKT ot xnMna cbfltpwa Te3M flBe no/ieTa, komto yBe/ii/maBaT 
pa3Mepa My c 8 v\nv\ 16 6aMTa, CbOTBeTHO npn 32 v\ 64 6nTOBMTe cm ere mm. 

Cnep, KaTO o6eKTbT e ycneujHO cb3fla,qeH, CLR ycraHOBABa Nextobjptr Ha 
ntpBMfl CBo6ofleH a,qpec, HenocpeflCTBeHO cnefl Kpaa Ha hobma o6eKT, KaKTO e 
noKa3aHO Ha cneflBamaTa cpurypa. 













X 




-* 


3aeTa nainex 


i 

fc- 


CBo6o^Ha naaiex 


^ 










< 


^ 
V 


w 



BepoflTHO ce flocemaTe, <Ae to3m Ha^MH 3a 3afle/i*iHe Ha naMeT b managed 
heap pa6oTM mhoto 6"bp30, 3aiuoTO cpi/i3i/mecKi/i ce MMn/ieMeHTwpa c npn6aBa- 
HeTO Ha ctomhoct (pa3Mep"bT Ha o6eKTa) KbM yKa3aTe/ia Nextobjptr. Bctiu- 
hoct CKopocTra Ha cb3flaBaHe Ha pecpepeHTeH Tun b managed heap e cbnoc- 
TaBMMa etc 3afle^AHeTO Ha naMeT b creKa. 3a pa3/ikiKa ot .NET, b C+ + 
runtime heap 3afle/i*iHeTO Ha naMeT e 3Hani/iTe/iHO no-Te>KKa onepauna, npn 
koato cnefl M34nc^flBaHeTO Ha pa3Mepa Ha o6eKTa ntpBO ce Ttpcn flocra- 
T"b4HO ro/iflM 6/iok CBo6oflHa naMeT v\ eflBa cnefl TOBa o6eKTbT MO>Ke fla 6"bfle 
cb3flafleH. 

OcBeH TOBa, Tbv\ KaTO naMeTTa ce 3an"b/iBa nocneflOBaTe/iHO, KoraTO Cb3- 
flaBaMe o6eKTM eflMH cnefl flpyr, Te cpki3i/mecKi/i me ce HaMnpaT Ha 6/im3km 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 687 

aflpecu b naMerra. ToBa MO>Ke 3HanMTe/iHO fla noflo6pn npoM3BOAMTe/iHOcrra b 
hakom CMTyauuM, TbM KaTO o6eKTMTe, cb3flafleHM npn6^M3MTe^HO no eflHO M 
cbiuo BpeMe o6nKHOBeHO ca ziorMnecKM CB"bp3aHM v\ npn/io>Kei-ii/ieTO necro vv\ 
M3no^3Ba 3aeAHO (npeAcraBeTe cm HanpuMep /iOKa/iHM npoMeH/iMBM b tajioto 
Ha flafleH MeTOfl). TaKa e B"b3MO>KHO bcmukm o6eKTM, komto flafleHa nacr ot 
KOAa ki3no/i3Ba, p,a ce HaMnpaT b Keiua Ha npouecopa v\ pa6oTaTa c tax me e 
MHoro 6"bp3a. 

Tpa6Ba p,a ce MMa npeABMA, o6ane, ne ocBo6o>KAaBaHeTO Ha naMeT ot xnkina e 
cno>KHa m BpeMeoTHeMaiua onepauna. Ta ce M3B"bpujBa ot CMcreMaTa 3a 
no4MCTBaHe Ha naMerra, KoraTO MMa HeAOCTur Ha naMeT. nonMCTBaHeTO Ha 
naMerra v\ a/iropMTbM"bT, no komto to ce M3BtpujBa, me pa3r/ieAaMe noApo6HO 
b c/ieABaiunTe ceKunn. 

KaK pa6oTM garbage collector? 

B npeAMWHaTa ceKuna onucaxMe KaK ce 3ap,ens\ naMeT, npn cb3AaBaHeTO Ha 
o6eKTM b ynpaB/iflBaHkifl xnwn. BnA^XMe, ne npn AOcrarbUHO CBo6oAHa naMeT 
TOBa e mhoto 6"bp3 npouec, komto npaKTMnecKM ce ocbmecTBsiBa c npeMecr- 
BaHeTO Ha eAMH yKa3aTe/i. KaKBO CTaBa, o6ane, aKO CLR ycraHOBM, ne b 
managed heap H^Ma AOcrarbUHO Macro? Bene 6ewe cnoMeHaTO, ne aKO 
Ao6aBAHeTO Ha hob o6eKT 6m AOBe/io ao npent/iBaHe Ha xnwna, Tpa6Ba p,a ce 
ocbiuecTBM nonwcTBaHe Ha naMeTTa. B to3m momcht, CLR CTapTupa CMcreMaTa 
3a nonwcTBaHe Ha naMerra, T.Hap. garbage collector. 



& 



BcbiiiHOCT TOBa e onpocTeHO o6acHeHne. Garbage collector ce 
crapâ„¢ pa KoraTO noKO/iei-me ce 3arrbsiHii. noKO/iei-imqTa ce 
pa3r/ie>KflaT b cneflBaujaTa ceKLinn. 



Hocm ce cnyx, ne ntpBOHana/iHO Garbage Collector b CLR e 6mji MMn/ieMeH- 
TupaH Ha e3MKa Lisp ot Patrick Dussud, a nocne KOAa e KOHBepTupaH ao C koa 
c noMOurra Ha aBTOMaTMneH KOHBepTop v\ "nonMcreH" ot CTyAeHT, pa6oTeiu b 
Microsoft. 

HnujKMTe Tpn6Ba na ce npMcnuT 

ritpBOTO Heiuo, KoeTO Tpa6Ba Aa ce HanpaBM, 3a p,a MO>Ke CMcreMaTa 3a 
nonncTBaHe Ha naMerra Aa 3anonHe pa6oTa, TOBa e Aa ce npucn^T bcmukm 
hmujkm Ha npn^OKeHneTO, M3nt^HflBaiun ynpaB^ABaH koa. Tbfi KaTO, KaKTO 
cnep, Ma/iKO me bmamm, no BpeMe Ha cb6npaHeTO Ha OTnaAt>uM e TBtpAe 
BepoflTHO o6eKTMTe Aa ce npeMecTAT Ha hobm aApecu b AninaMkmHaTa naMeT, 
HnujKMTe He Tpa6Ba Aa MoraT Aa AOcrbnBaT v\ MOAncpnunpaT o6eKTM AOKaTO 
Tpae no^MCTBaHeTO. 

CLR M3naKBa bcmukm hmujkm Aa AOCTMTHaT b 6e3onacHO CbCTOflHMe, cjieA 
KoeTO tm npMcnMBa. CbmecrByBaT hako/iko MexaHM3Ma, npe3 komto CLR MO>Ke 
Aa npMcnM AaAeHa HMUJKa. npMUMHaTa 3a Te3M pa3JiM4HM MexaHM3MM e 
CTpeMe>KtT Aa ce HaMajiM kojikoto ce Moxe noBene HaTOBapBaHeTO m HMUJKMTe 

Aa OCTaHaT aKTMBHM B"b3MO>KHO HaM"A"bJirO. 



688 nporpaMnpaHe 3a .NET Framework (tom 2) 

OcBo6o>KflaBaHe Ha Hen3no/i3BaHHTe o6eKTM 

C/iefl KaTO BCM4KM ynpaB/iflBaHM hmujkm Ha npn^OKeHneTO ca 6e3onacHO 
"npucnaHn", garbage collector npoBepsiBa p.aj\v\ b managed heap MMa o6eKTM, 
komto Bene He ce M3no/i3BaT ot npn^OKeHneTO. Ako TaKMBa o6eKTM 
cbmecTByBaT, 3aeTaTa ot tax naMeT ce ocBo6o>KflaBa. Cnep, npMK/iionBaHe Ha 
pa6oTaTa no cb6npaHe Ha OTnaA^un ce B"b3o6HOB*iBa pa6oTaTa Ha bcmukm 
hmujkm m npMJio>KeHMeTO npoAt/iwaBa CBoeTO M3n"bJiHeHMe. 

KaKTO BepoflTHO ce AOcemaTe, OTKpMBaHeTO Ha HeHy>KHMTe o6eKTM m 
ocBo6o>KflaBaHeTO Ha pecypcMTe, 3aeTM ot tax, He e npocra 3aAana. B Ta3M 
ceKUMfl HaKpaTKO me onMiueM ajiropMTbMtT, komto .NET garbage collector 
M3noji3Ba 3a HeMHOTO peiuaBaHe. 

3a p,a ycTaHOBM kom o6eKTM noAJiewaT Ha yHMiuo>KeHMe, garbage collector 
nocTpoflBa rpacp Ha bcmukm o6eKTM, flocTtnHM ot HMUJKMTe Ha npMJio>KeHMeTO 
b flafleHMfl MOMeHT. Bcm4km o6eKTM ot flMHaMM^HaTa naMeT, komto He ca nacr 
ot rpacpa ce cuMTaT 3a OTnaA^uM m noAJiewaT Ha yHMiuo>KaBaHe. 

B"b3HMKBa BtnpocbT KaK garbage collector MO>Ke fla 3Hae kom o6eKTM ca 
AOCTbnHM m kom He? Kopemue Ha npn/io>KeHiieTO ca TOUKaTa, ot koato 
CMCTeMaTa 3a nonMcmaHe Ha naMeTTa 3anonBa CBOHTa pa6oTa. 

KopeHM Ha npwjio>KeHMeTO 

Bcako npMJio>KeHMe MMa Ha6op ot KopeHM (application roots). KopeHMTe 
npeACTaBJiflBaT o6jiacTM ot naMeira, komto conaT kbm o6eKTM ot managed 
heap, mjim ca ycTaHOBeHM Ha null. HanpMMep bcmukm rjio6ajiHM m craTMUHM 
npoMeHJiMBM, cbfl"bp>KaiuM pecpepeHUMM kbm o6eKTM ce cuMTaT 3a KopeHM Ha 
npMJio>KeHMeTO. Bcmukm jiOKajiHM npoMeHJiMBM mjim napaMeTpM b CTeKa kbm 
MOMeHTa, b komto ce M3ntJiHABa garbage collector, komto conaT kbm o6eKTM, 
cbmo npMHafljie>KaT kbm KopeHMTe. PerMCTpMTe Ha npouecopa, cbfl"bp>KaiuM 
yKa3aTejiM kbm o6eKTM, ctiuo ca nacr ot KopeHMTe. KtM KopeHMTe Ha 
npMJio>KeHMeTO cnafla m Freachable queue (3a Freachable queue no-noflpo6HO 
me CTaHe AyMa b ceKUM^Ta 3a cpMHajiM3auMa Ha o6eKTM b HacToaiuaTa rjiaBa. 
3acera npocTO npMeMeTe ne Ta3M onaujKa e nacr ot BvrpeujHMTe crpyKTypM, 
noAA"bp>KaHM ot CLR m ce CHMTa 3a eAMH ot KopeHMTe Ha npMJio>KeHMeTo). 

KoraTO JIT KOMnMJiaToptT KOMnMJiMpa IL MHCTpyKUMMTe Ha AaAeH MeTOA b 

npOUeCOpHM MHCTpyKUMM, TOM CbLJJ,0 CbCTaBfl m BtTpewHa Ta6/iMua, CbAtp- 

>Kaiua KopeHMTe 3a cbOTBeTHMa MeTOA- Ta3M Ta6/iMu.a e AOCTbnHa 3a garbage 
collector. Ako ce c/iyuM garbage collector p,a 3anonHe pa6oTa, KoraTO MeTOAtT 
ce M3n"b/iH*iBa, tom me M3noji3Ba Ta3M Ta6/iMu.a, 3a p,a onpeAejiM kom ca 
KopeHMTe Ha npMJio>KeHMeTO kbm to3m MOMeHT. OcBeH TOBa ce o6xo>KAa m 
CTeKtT Ha M3BMKBaHMATa 3a cbOTBeTHaTa HMUJKa m ce onpeAe/iflT KopeHMTe 3a 

BCM4KM M3BMKBaiUM MeTOAM (KaTO Ce M3nOJ13BaT TeXHMTe BtTpeUJHM Ta6jlMUM). 

KtM nojiy^eHMfl Ha6op ot KopeHM, ecTecTBeHO, ce BK/iionBaT m Te3M, HaMMpa- 

U\V\ Ce B M06ajlHM M CTaTM4HM npOMeHJIMBM. 

Tpa6Ba Aa ce noMHM, ne He e 3aA"b/i>KMTe/iHO AaAeH o6eKT Aa M3Jie3e ot 
o6xBaT 3a Aa 6"bAe cuMTaH 3a OTnaAtK. JIT KOMnM/iaTopvr Moxe Aa onpeAe/iM 



T/iaBa 24. ynpaB/ieHne Ha naMerra m pecypcuTe 



689 



Kora to3m o6eKT ce flocrbnBa ot KOfla 3a nocnefleiH nvr v\ BeflHara cnefl TOBa 
ro M3K^K)4Ba ot BtTpewHaTa Ta6/ikiua Ha KopeHMTe, c KoeTO tom CTaBa 
KaHAMAaT 3a nonwcTBaHe ot garbage collector. M3K/iK>neHkie npaBsiT cnynai/iTe, 
KoraTO KOAtT e KOMnw/iwpaH c /debug onuna, koato npeAOTBpaTsiBa nonwcT- 
BaHeTO Ha o6eKTM, komto ca b o6xBaT. ToBa ce npaBM 3a y/iecHeHkie Ha 
npoueca Ha Ae6trBaHe - Bee naK npn TpacupaHe Ha KOAa 6nxMe kiCKa/iki p,a 
MO>KeM p,a cneAMM cbcroflHkieTO Ha bcm^km o6eKTM, komto ca b o6xBaT b 
AaAeHMfl MOMeHT. 

AiiropMTbMiiT 3a noHMCTBaHe Ha naMeira 

KoraTO garbage collector 3anonBa CBO^Ta pa6oTa, tom npeAno/iara ne bcmukm 
o6eKTM b managed heap ca OTnaA^un, T.e. ne hmkom ot KopeHMTe He conn 
KtM o6eKT ot naMeTTa. Cnep, TOBa, ci/icreMaTa 3a nonwcrBaHe Ha naMerra 
3ano4Ba p,a o6xo>KAa KopeHMTe Ha npw/io>KeHi/ieTO v\ p,a crpow rpacp Ha 

06eKTMTe, AOCTbnHM OT TAX. 

HeKa pa3MeAaMe npuMepa, noKa3aH Ha c/ieABamaTa cpurypa. Ako r/io6a/iHa 
npoMeH/iMBa cohi/i kbm o6eKT A ot managed heap, to A me ce Ao6aBM kbm 
rpacpa. Ako A cbAtpwa yKa3aTe/i kbm C, a tom ot cboa crpaHa kbm o6eKTMTe 
DhF, bcm4km Te cbu\o CTaBaT nacr ot rpacpa. TaKa garbage collector o6xo>KAa 
peKypcuBHO b A"b/i6o4MHa BCM4KM o6eKTM, AOCTbnHM ot r/io6a/iHaTa npoMeH- 
ziMBa A: 





\\\ 1 








A 


B 


C 


D 


E 


F 


G 


H 


I 




Managed heap 



^j Kop 



eHH Ha npnjioaceHHero 



KoraTO npkiK/iionki c nocrpoflBaHeTO Ha to3m k/ioh ot rpacpa, garbage collector 
npeMMHaBa kbm cneRBauxwn KopeH v\ o6xo>KAa bcmukm AOCTbnHM ot Hero 
o6eKTM. B HaiuMfl cnynai/i KbM rpacpa me 6"bAe Ao6aBeH o6eKT E. Ako no BpeMe 
Ha pa6oTaTa garbage collector ce onuTa p,a p,o6asv\ KbM rpacpa o6eKT, komto 
Bene e 6m/i Ao6aBeH, tom cnupa o6xo>KAaHeTO Ha Ta3M nacr ot K/iOHa. ToBa ce 
npaBM c ABe \\ei\v\: 

- 3Hani/iTe/iHO ce yBe/iwuaBa npow3BOAHTe/iHOCTTa, rbi/i KaTO He ce npeMM- 
HaBa npe3 AaAeH Ha6op ot o6eKTM noBene ot BeAH"b>K; 

- npeAOTBpaTABa ce nonaAaHeTO b 6e3KpaeH uwKb/i, aKO cbiuecTByBaT 

UMK/1MHHO CB"bp3aHM 06eKTM (HanpMMep A COHM KtM B, B KtM C, C KbM D 

M D o6paTHO KtM A). 

Cnep, o6xo>KAaHeTO Ha bcm^km KopeHM Ha npi/i/io>KeHi/ieTO, rpacpvr cwvbpwa 
BCM4KM o6eKTM, komto no HflKaKtB Hani/m ca AOCTbnHi/i ot npi/i/io>KeHkieTO. B 
noco^eHMfl Ha cpurypaTa npuMep, TOBa ca o6eKTMTe A, C, D, E v\ F. 



690 



flporpaMnpaHe 3a .NET Framework (tom 2) 



BckinKki o6eKTM, komto He ca nacr ot T03M rpacp, He ca flOcrbnHM v\ cneflOBa- 
Te/iHO ce C4MTaT 3a OTna.irbu.ki. B Haujua npuMep TOBa ca o6eKTMTe B, G, H v\ I. 

Cnefl MAeHTMCpnunpaHeTO Ha flocrbrmkiTe ot npi/i/io>KeHi/ieTO o6eKTM, garbage 
collector npeMkmaBa npe3 xnkina, Tbpcei/iKki nocneflOBaTe/iHki 6/iOKOBe ot 
OTnaAtuki, komto Bene ce CMATaT 3a cbo6oaho npocrpaHCTBO. KoraTO TaKaBa 
o6/iacr ce HaMepn, bcmukm o6eKTM, HaMnpaiun ce Hafl Hea ce npnflBw>KBaT 
Ha,qo/iy b naMerra, KaTO ce ki3no/i3Ba craHflapTHaTa cpyHKuna memcpy(...) . 
KpaMHMAT pe3y/iTaT e, ne bcmukm o6eKTM, ou.e/ie/iw npn npeMMHaBaHeTO Ha 
garbage collector, ce pa3no/iaraT b flo/iHaTa nacr Ha xkiwna, a Nextobjptr ce 
ycraHOBABa HenocpeflCTBeHO cnefl noc/ieflHua o6eKT. OnrypaTa noKa3Ba cbc- 
TOAHneTO Ha flMHaMM^HaTa naMeT cnefl npkiK/iionBaHe Ha pa6oTaTa Ha garbage 
collector: 



Managed heap 



V 



A 


C 


D 


E 


F 






NextObjPtr 




OnMcaHMnT asiroptrrbM 3a nonncTBaHe Ha naMeTTa He B3MMa 
npeflBMfl 4>MHa/iii3ai4MflTa. 06eKTMTe, Hy>Kflaeu4n ce ot 4>MHa- 
/iM3ai4Mn He ce yHuujowaBaT BeflHara. Bmccto TOBa Te ocra- 
BaT b naMeTTa v\ yKa3aTe/in kt»m tux ce flo6aB«T bt»b t. Hap. 
Freachable queue. <t>MHa/iM3au|H5iTa me pa3r/ieflaMe noflpo6- 
ho Ma/iKO no-HaTaTi»K. 



EcTecTBeHO, npeMecTBaHeTO Ha o6eKT Ha flpyro macto b naMeTTa npaBM 
HeBa^MAHM BCM4KM yKa3aTe/iw, conemki kbm Hero, TaKa ne nacr ot "3afl"b/i- 
xeHMflTa" Ha garbage collector e fla Kopurupa no noflxoflam HanwH yKa3aTe- 
nme KtM ou.e/ie/iMTe o6eKTM. 

ripeHape>KflaHeTO Ha xi/mna e TpyAoeMKa onepau.i/m - Tpa6Ba fla ce npwfl- 
BM>KBaT ro/ieMki 06/iacâ„¢ ot naMerra v\ fla ce Ba/ikiflkipaT yKa3aTe/ikiTe kbm 
npeMecTeHMTe o6eKTM. 3aTOBa aKO garbage collector cpeiflHe Ma/iKa 06/iacT ot 
He3aeTa naMeT, tom npocTO n nrHopupa v\ npoflt/iwaBa HaTarbK. 

KaTO ufl/io, pa6oTaTa Ha garbage collector MMa 3Hani/iTe/iHO OTpaxeHne Btpxy 
npon3BOflHTe^HOCTTa Ha ufl/iOTO npn^OKeHne. nocrpoyiBaHeTO Ha rpacpa Ha 
flocTbnHMTe o6eKTM, o6xo>KflaHeTO v\ npeHape>KflaHeTO Ha flMHaMMUHaTa naMeT 
OTHeMaT HeMa/iKO npouecopHO BpeMe, npe3 KoeTO HMUJKMTe Ha npw/iOKeHweTO 
cnflT. Tpa6Ba fla ce MMa npeflBMfl, o6ane, ne garbage collector ce crapTwpa 
caMO KoraTO MMa Hy>Kfla ot TOBa (T.e. KoraTO MMa HeflocTur Ha naMeT). ripe3 
ocraHa/iOTO BpeMe managed heap e flocra no-6tp3 ot C/C++ runtime heap. 

B noMOiu Ha npon3BOflHTe^HOCTTa ca v\ hakom onTMMM3au.nn Ha a/iropwrbMa Ha 
garbage collector, Haki-Ba>KHaTa ot komto e KOHuenunaTa 3a noKO/ieHna. 
HeKa pa3MeflaMe noKO/ieHkiyiTa naMeT. 



T/iaBa 24. ynpaBJiemie Ha naMerra v\ pecypcuTe 



691 



noKO/ieHMn naMeT 

rioKO/ieHMnTa (generations) ca MexaHM3"bM b garbage collector, umato 
eAMHCTBeHa ue/i e noflo6p*iBaHeTO Ha npoki3BOfli/iTe/iHOCTTa. OcHOBHaTa v\p,es\ 
e, ne no^MCTBaHeTO Ha nacr ot flkmaMMUHaTa naMeT BMHarn e no-6"bp30 ot 
no^MCTBaHeTO Ha ua/iaTa naMeT. BMecTO fla o6xo>Kfla bcmukm o6eKTM ot 
xnMna, garbage collector o6xo>KAa caMO nacr ot tax, K^acucpnunpaMKn vv\ no 
onpefle^eH npn3HaK. B ocHOBaTa Ha MexaHM3Ma Ha noKO/ieHkisiTa ctoat 
c^eflHMTe npeflno^o>KeHMfl: 

- ko/ikoto no-HOB e eflMH o6eKT, TO/iKOBa no-BepoflTHO e >KMBOTbT My fla e 
KpaTbK. TunM^eH npuMep 3a TaKbB cnynai/i ca ziOKa/iHkiTe npoMeH/ikiBM, 
komto ce ct3flaBaT b Tsi/iOTO Ha flafleH MeTOfl v\ M3/iM3aT ot o6xBaT npn 
HeroBOTO HanycKaHe. 

- ko/ikoto no-CTap e o6eKTbT, TO/iKOBa no-ro/ieMM ca onaKBaHi/iflTa tom fla 
>KMBee fl"b/iro. ripuMep 3a TaKMBa o6eKTM ca r/io6a/iHMTe npoMeH/iMBM. 

- o6eKTMTe, cb3flafleHM no eflHO v\ cbu\o BpeMe o6mkhob6ho MMaT Bp"b3Ka 
noMe>Kfly cm m MMaT npw6/iki3kiTe/iHO eflHaKBa npofl"b/i>KkiTe/iHOCT Ha 

>KMBOTa. 

Mhoto M3c^eflBaHMfl noTBtpwflaBaT Ba/iwflHOCTra Ha M36poeHMTe TBtpfleHna 
3a ro/iHM 6poki cbiuecTByBaiun npn^OKeHna. HeKa pa3r/ieflaMe no-noflpo6HO 
noKO^eHMATa naMeT v\ TOBa KaK Te ce w3no/i3BaT 3a onTMMM3auM5i Ha npon3BO- 
AMTe^HOCTTa Ha .NET garbage collector. 

noKosieHMe 

KoraTO npi/i/io>KeHi/ieTO ce crapTwpa, ntpBOHana/iHO fli/maMi/mHaTa naMeT He 

C"bfl"bp>Ka HMKaKBM 06eKTM. BCM4KM 06eKTM, KOMTO Ce Cb3flaBaT, CTaBaT 4aCT OT 

rioKO^eHne 0. Ka3aHO HaKpaTKO rioKO/ieHkie cbfltpwa HOBOCb3flafleHMTe 
o6eKTM - Te3M, komto HMKora He ca 6wnw npoBepaBaHM ot garbage collector. 

ripn MHkmi/ia/iM3aui/mTa Ha CLR ce onpefle/ia npar 3a pa3Mepa Ha noKO/ieHwe 
0. TonHi/iflT pa3Mep Ha to3m npar He e ot oco6eHO 3HaneHkie, tbm KaTO MO>Ke 
fla ce npoMeHfl ot garbage collector no BpeMe Ha pa6oTa c ue/i noflo6paBaHe 
Ha npoM3BOflMTe^HOCTTa. fla npeflno/io>KMM, ne ntpBOHana/iHO CTOMHOCTTa Ha 
T03M npar e 256KB. 

C^eflBaiuaTa cpurypa noKa3Ba cbcroHHkieTO Ha fli/maMi/mHaTa naMeT cnefl KaTO 
npn^o>KeHMeTO e pa6oTM/io M3BecTHO BpeMe. Bn>KflaMe, ne ca cb3fla,qeHi/i 
M3BecTeH 6poki o6eKTM (bcm4km nacr ot noKO/ieHkie 0), a o6eKTM B m D Bene 
ca CTaHa/iM HeflocTbnHM (T.e. nofl/iewaT Ha nonwcrBaHe). 



A 


B 


C 


D 


E 





IIoKQneHHe 



^R 



lip ar 3a p a3Mep a Ha 
noKOJieme 



692 



flporpaMnpaHe 3a .NET Framework (tom 2) 



f\a npeflno^o>KMM, <~\e npi/i/io>KeHkieTO MCKa fla Cb3flafle hob o6eKT, F. flo6aBfl- 
HeTO Ha to3m o6eKT 6m npeAM3BMKa^o npent/iBaHe Ha rioKO/ieHwe 0. B to3m 
MOMeHT Tpa6Ba p,a 3anonHe cb6npaHe Ha OTnaAtun v\ ce crapTkipa garbage 
collector. 

rioHMCTBaHe Ha noKosiemie 

Garbage collector npoueflupa no onucaHMa no-rope a/iropwTbM v\ ycraHOBABa 
ne o6eKTM B v\ D ca OTnaA^un. Te3M o6eKTM ce yHMiuoxaBaT v\ oue/ie/iMTe 
o6eKTM A, C h E ce npeHape>KflaT b p,onuaja (wnw nnBa) nacr Ha managed 
heap. flnHaMM4HaTa naMeT HenocpeflCTBeHO cnep, npkiK/iionBaHeTO Ha Cb6wpa- 
HeTO Ha OTnaA"bun H3Me>Kfla no cneRHwn Ha^MH: 



A 


C 


E 





^L 



IIoKoneme 1 



IIoKOJieHHe 



^ 



npar sap asaiepa Ha 
noKOJiemie 



Cera oue/ie/ii/iTe npn npeMMHaBaHeTO Ha garbage collector o6eKTM CTaBaT nacr 
ot rioKO/ieHne 1 (3aiuoTO ca oue/ie/iw npn eAHO npeMMHaBaHe Ha garbage 
collector). Hobmat o6eKT F, iokto m bcmukm flpyrn HOBOCb3flafleHi/i o6eKTM me 
6"bflaT nacr ot rioKO/ieHkie 0. 

HeKa cera npeflno/io>Ki/iM, ne e Mi/ma/io oiue M3BecTHO BpeMe, npe3 KoeTO 
npn^OKeHneTO e cb3AaBa/io o6eKTM b AHHaMi/mHaTa naMeT. Managed heap 
cera i/i3r/ie>KAa no cneAHi/m Hani/m: 



A 


C 


E 


F 


G 


H 


I 





IIoKoneHHe 1 




IIoKOJieHHe 



^ 



Ilpar sa pasMepa Ha 
noKoneHHe 



flo6aBAHeTO Ha hob o6eKT J, 6m npeAH3BHKa.no npent/iBaHe Ha rioKO/ieHkie 0, 
TaKa ne othobo Tpa6Ba p,a ce crapTkipa cb6wpaHeTO Ha OTnaA^un. KoraTO 
garbage collector ce crapTi/ipa, tom Tpa6Ba p,a peiun kom o6eKTM ot naMeTTa 
Aa nper/ieAa. KaKTO rioKO/ieHkie 0, TaKa v\ rioKO/ieHi/ie 1 vw\a npar 3a cboa 
pa3Mep, komto ce onpeAe/ia ot CLR npn kiHi/mkia/ii/i3aui/mTa. To3M npar e no- 
ro/iflM ot to3m Ha rioKO^eHne 0. J\a npeAno/io>Ki/iM ne tom e 2MB. 

B c/iynaa rioKO/ieHi/ie 1 He e AOcmrHa/io npara cm, TaKa ne garbage collector 
me nper/ieAa othobo caMO o6eKTMTe ot rioKO/ieHwe 0. ToBa ce AUKTyBa ot 
npaBi/i/iOTO, ne no-crapwTe o6eKTM o6mkhob6ho MMaT no-At/itr >kmbot m cne- 
AOBaTe/iHO no^MCTBaHeTO Ha rioKO/ieHi/ie 1 He e BepoaTHO Aa ocbo6oam mhoto 
naMeT, AOKaTO b rioKO/ieHi/ie e TBtpAe B"b3MO>KHO mhoto ot o6eKTMTe Aa ca 
OTnaA"bun. 1/1 TaKa, garbage collector nonwcTBa othobo rioKO/ieHkie 0, oue/ie- 
nme o6eKTM npeMMHaBaT b rioKO/ieHwe 1, a Te3M, komto npeAM TOBa ca 6m/im b 
rioKO/ieHne 1, npocTO cm ocraBaTTaM. 



T/iaBa 24. ynpaB/ieHne Ha naMerra m pecypcuTe 



693 



3a6e/ie>KeTe, <Ae o6eKT C, komto Me>KflyBpeMeHHO e craHa/i HeflocTtneH v\ cne- 
flOBaTe^HO nofl/ie>Kki Ha yHMmo>KeHMe, b to3m c/iynaw ocTaBa b AHHaMMUHaTa 
naMeT, Tbv\ KaTO e nacr ot noKO/ieHne 1 v\ He e npoBepeH npn TOBa npeMMHa- 
BaHe Ha garbage collector. 

C/ieABamaTa cpurypa noi<a3Ba cbcroHHkieTO Ha AHHaMkinHaTa naMeT cneA TOBa 
no^MCTBaHe Ha riOKO/ieHi/ie 0. 



A 


C 


E 


G 


H 





IIoKOJieHHe 1 





KaKTO BepoflTHO ce AOceiuaTe, c TeneHwe Ha BpeMeTO noKO/ieHne 1 6aBHO me 
pacre. 1/lABa MOMeHT, KoraTO cnep, nopeAHOTO nonwcrBaHe Ha noKO/ieHwe 0, 
riOKO/ieHi/ie 1 AOCTura cboa npar ot 2 MB. B T03M cnynaw npw/io>KeHkieTO 
npocTO me npoA"b^>KM p,a pa6oTM, tbm KaTO rioKO/ieHne TOKy-iuo e 61/1/10 
no^MCTeHO i/i e npa3HO. HoBMTe o6eKTM, KaKTO BMHarn, me ce Ao6aBAT b 
rioKO^eHne 0. 

noHMCTBaHe Ha noKOsiemie 1 m HoKonenne 2 

KoraTO rioKO/ieHkie c/ieABaiunflT nvr AOCTurHe cboa npar v\ garbage collector 
ce crapTkipa, tom me npoBepn pa3Mepa Ha noKO/ieHkie 1. TbM KaTO tom e aoc- 
TwrHa/i CBOfl npar ot 2 MB, garbage collector T03M ntT me nonkicrki KaKTO 
rioKO^eHne 0, TaKa v\ noKO/ieHwe 1. 3a6e/ie>KeTe, ne cnep, KaTO ca MMHa/in 
HAKO/iKO no4MCTBaHMfl Ha noKO/ieHwe 0, c TeneHi/ie Ha BpeMeTO, e TBtpAe 
BepoflTHO rioKO^eHne 1 p,a cbAtpwa mhoto o6eKTM, komto ca craHa/iki HeAOC- 
TtnHM m HeroBOTO nonwcTBaHe 6m 0cB060An.no hd/iamo KO/ii/mecrBO naMeT. 

M TaKa, garbage collector nonwcTBa noKO/ieHna On 1. 06eKTMTe, oue/ie/iw ot 
rioKO^eHne npeMMHaBaT b rioKO/ieHne 1, a Te3M, komto npeAM TOBa ca 6wnw 
b rioKO/ieHkie 1 m ca oue/ie/iw npn nonwcrBaHeTO npeMi/maBaT b noKO/ieHkie 2. 

C/ieABamaTa cpurypa noKa3Ba npuMepHOTO cbcroyiHkie Ha AHHaMkmHaTa naMeT 
cnep, no4MCTBaHeTO Ha noKO/ieHkia On 1 (npeAno/iaraMe, ne o6eKTM G n H c 
TeneHne Ha BpeMeTO ca craHa/in HeAOcrbnHn n ca 6n/in nonncreHki ot garbage 
collector, a o6eKTM P v\ Q ca hobi/i o6eKTM, oue/ie/in ot riOKO/ieHi/ie n 
npeMMHa^n b noKO/ieHkie 1). 



A 


E 


P 


Q 





7CT\ 



7v 



IIoKoneHHe 2 


IIoKDineHHe 1 


IIoKBineHHe 



T 



694 nporpaMnpaHe 3a .NET Framework (tom 2) 

TeKymaTa Bepcua Ha CLR garbage collector noflfltpwa Tpn noKO/ieHMfl -0, In 
2. 06eKTMTe, komto oue/ieyrr npn nonwcTBaHe Ha riOKO/ieHi/ie 2 npocTO en 
ocTaBaT b rioKO/ieHwe 2. 

Pa36npa ce, rioKO/ieHkie 2 chuxo MMa npar 3a cboa pa3Mep n tom e oko/io 10 
MB. 

rioKO/ieHwe ce nonwcTBa Haw-^ecTO - b Hero ce cbfltpwaT hobm o6eKTM n e 
Haw-BepoflTHO Te fla MMaT KparbK >kmbot. 

rioKO^eHkie 2 ce nonkicma Haw-pflflKO. ToBa noKO/ieHwe cbfltpwa caMO CTapn 
o6eKTn, npe>KMBe^n 2 v\nv\ noBene npoBepKM ot garbage collector. 

klMnsieMeHTauMfi Ha noKO/ieHmua b .NET 

KaKTO BMflflXMe, noKO^eHMATa 3HanwTe/iHO noflo6psiBaT npoki3BOflkiTe/iHOCTra 
Ha garbage collector. Ako AOKaTO CTpon rpacpa Ha flocTbrmi/iTe o6eKTM, 
garbage collector cpeiuHe pecpepeHuna kbm o6eKT ot no-ropHO noKO/ieHkie, 
tom npocTO He npofl"b/i>KaBa fla crpoi/i Ta3M nacr ot K/iOHa. ToBa e 6e3onacHO, 
3aiuoTO npn npeMMHaBaHeTO npe3 xnkina, garbage collector nper/ie>KAa caMO 
o6eKTMTe ot noKO/ieHi/ieTO, KoeTO ce nonwcTBa, c/ieflOBaTe/iHO H^Ma onacHOCT 
fla ce yHniflo>KaT o6eKTM ot ropHMTe noKO/ieHi/ifl, flopn n fla He ca nacr ot 
rpacpa. 

KaKBO me ce cnynw, o6ane, aKO o6eKT ot no-crapo noKO/ieHwe fltpxn 
pecpepeHUMfl kbm no-M/iafl o6eKT? Ako pecpepeHunnTe Ha CTapna o6eKT He ce 
npocneflflT, M^aflMAT o6eKT norpeujHO me 6"bfle cueTeH 3a HeflocTbneH, HAMa 
fla 6"bfle flo6aBeH kbm rpacpa n me 6"bfle yHniuo>KeH! 

3a fla ce M36erHaT noflo6HM npo6/ieMki, JIT KOMni/i/iaToptT noflfl"bp>Ka 
MexaHM3tM, komto ycraHOBflBa cp/iar, KoraTO HHKoe ot pecpepeHTHMTe no/ieTa 
Ha flafleH o6eKT ce npoMeHM. TaKa garbage collector Mowe fla ycraHOBM 
pecpepeHUMMTe Ha kom o6eKTM ca npoMeHeHki ot BpeMeTO Ha nocneflHOTO 
ct6npaHe Ha OTnafltun. Te3n crapi/i o6eKTM me 6tflaT MHcneKTnpaHn ot 
garbage collector, 3a fla ce npoBepn fla/iki He cbfltpwaT pecpepeHunn kbm no- 
M/iaflki o6eKTM. 

Bene cnoMeHaxMe, ne garbage collector AkmaMkinHO MO>Ke fla npoMeHfl 
nparoBeTe 3a pa3Mepa Ha OTfle/iHi/iTe noKO/ieHi/ifl. Ako HanpwMep c TeneHkie Ha 
BpeMeTO, cncTeMaTa ycTaHOBM, ne npn nonwcTBaHeTO Ha rioKO/ieHkie 
oue/iflBaT mhoto Ma/iKO o6eKTM, nparbT Ha riOKO/ieHi/ie MO>Ke fla ce HaMa/iw, 
fla peneM Ha 128 KB. TaKa nonwcTBaHkiflTa Ha rioKO/ieHkie me ca no-necm, 
ho me OTHeMaT no-Ma/iKO BpeMe. ripn o6paTHna c/iynaw - aKO nonwcTBaHeTO 
Ha rioKO/ieHkie ocBo6o>KflaBa mhoto Ma/iKO naMeT, a oue/ie/iwTe ca mhoto, 
nparbT me 6"bfle yBe/iwneH HanpwMep Ha 512 KB. TaKa Cb6npaHeTO Ha 
OTnafltun me e no-paflKO n me MMa no-ro/iflMa BepoyrmocT Me>KflyBpeMeHHO 

MHOTO 06eKTM fla CTaHaT HeflOCTtnHM. 

TopHOTO Ba>KM, pa36npa ce n 3a nparoBeTe Ha noKO/ieHna 1 n 2. Te etiuo 
nofl/ie>KaT Ha npoMAHa c ue/i onTHMH3aunfl ot CTpaHa Ha garbage collector. 



T/iaBa 24. ynpaBJiemie Ha naMerra v\ pecypcuTe 695 

Workstation m Server GC 

B CLR BCbmHOCT cbmecTByBaT flBe pa3HOBMflHOCTM Ha garbage collector - 
Server GC v\ Workstation GC. BtB Bepcun 1.0 v\ 1.1 Ha .NET Framework, 

Te3M flBe pa3HOBMflHOCTM Ce Cbfl"bp>KaT B flBeTe 6l/l6/lklOTeKI/l MSCorSvr.dll 

(Server GC) v\ Mscorwks.dll (Workstation GC). B Whidbey - Bepcua 2.0 Ha 
.NET Framework, flBeTe 6ki6/ikiOTeKki ca o6eflMHeHH b eflHa. 

KoH30^HMTe m Windows npw/io>KeHi/iflTa i/i3no/i3BaT Workstation GC, komto e 
onTMMM3npaH 3a MMHMMM3npaHe Ha BpeMeTO, npe3 KoeTO HMUJKMTe Ha npw/io- 
>KeHneTO ca npucnaHM. Tbfi KaTO noTpe6i/iTe/iflT He Tpa6Ba fla BM>Kfla 3a6e- 
^e>KMMa nay3a b pa6oTaTa Ha npw/io>KeHi/ieTO, garbage collector nocrpoABa 
rpacpa Ha flocTtnHMTe o6eKTM flOKaTO HMUJKMTe Ha npw/io>i<eHMeTO oiue 
pa6oTAT. HnujKMTe ce npucnuBaT eflBa, KoraTO garbage collector 3anonHe 
mctmhckoto nonwcrBaHe Ha managed heap. ToBa e T.Hap. KOHKypeHTHO 
nonwcTBaHe Ha naMeTTa. 

Server GC ce i/i3no/i3Ba 3a ctpBtpHM npw/io>KeHMfl npn MHoronpouecopHM 
MaujMHM. B to3m c/iynaw, 3a BceKM OTfle/ieH npouecop ce nocrposiBa OTfle/ieH 
xuMn, 3a nweTO nonwcrBaHe ce rpn>KM OTfle/iHa HMUJKa Ha garbage collector. 
XnMnoBeTe Ha OTfle/iHi/iTe npouecopn ce nonwcTBaT napa/ie/iHO, KaTO npe3 
ua/iOTO BpeMe HMiuKMTe Ha npn^OKeHneTO cnaT. Ta3M TexHMKa noKa3Ba flo6pa 
npon3BOflkiTe^HOCT npn MHoronpouecopHM MaujMHM v\ MMa mhoto no-flo6pa 
CKa^npyeMOCT. 

no noflpa36npaHe, pe>KMM-bT Ha pa6oTa Ha garbage collector e Workstation, 
ripn eflHonpouecopHMTe MaujMHM, TOBa e eflMHCTBeHMfl M36op. B .NET 
Framework 1.1 SP1 v\ 2.0 cbiuecTByBa B"b3MO>KHOCTTa pe>KMM"bT Ha pa6oTa Ha 
garbage collector fla ce noconi/i b KOHCpurypaunoHHUfl cpaw/i Ha npn^OKeHneTO 
no c^eflHMfl Ha^MH: 



<Conf iguration> 

<runtime> 

<gcServer enabled="true" /> 

</runtime> 
</Conf iguration> 



E/iok naMeT 3a rcmeMii o6eKTM 



Pa3MeptT e 6e3 3Ha<-ieHwe. Ploaa 



flpyra Ba>KHa onTMMM3aunfl, CB"bp3aHa c .NET Framework managed heap e t. 
Hap. 6/iok naMeT 3a ro/ieMM o6eKTM (large object heap, LOH). C ue/i 
noflo6paBaHe Ha npoki3BOflkiTe/iHOCTra bcmuki/i ro/ieMki o6eKTM (c pa3Mep Hafl 
20 000 6awTa) ce pa3no/iaraT b ojp,eneu xnwn. Pa3/im<aTa Me>Kfly Hero v\ 
CTaHflapTHMfl managed heap e TOBa, ne xi/mnvr 3a ro/ieMki o6eKTM He ce 
AecppameHTkipa. ripeMecTBaHeTO Ha Te3M ro/ieMi/i 6/iOKOBe ot naMeTTa npocTO 
6m OTHe/io npeKa/ieHO mhoto npouecopHO BpeMe. 



696 nporpaMnpaHe 3a .NET Framework (tom 2) 

Bcmuko TOBa CTaBa npo3pam-io 3a pa3pa6oTnwukiTe. Ot r/ieAHa Torno Ha 
npn^o>KeHMeTO, HeiuaTa M3Me)KflaT TaKa, cflKaw MMa ep,v\H eflMHCTBeH xnkin. 

MMawTe npeflBMfl, ne ro/ieMMTe o6eKTM BMHarn ce cnwTaT 3a nacr ot 
rioKO^eHne 2. ToBa 03HanaBa, ne no-B"b3MO>KHOCT Tpa6Ba fla cb3flaBaMe no- 
Ma/iKO Ha 6pow ro/ieMki o6eKTM v\ p,a vv\ w3no/i3BaMe b c/iynawTe, KoraTO Te me 
>KMBeaT flt^ro BpeMe. 

Ct3AaBaHeTO Ha to/ihm 6pow ro/ieMM o6eKTM c KparbK >kmbot me AOBeAe ro 
TOBa, ne noKO^eHne 2 no-necro me AOCTura npara 3a cboa pa3Mep v\ no-necro 
me ce nonwcTBa, KoeTO ntK 3Hani/iTe/iHO me b/iolui/i npon3BOAMTe/iHOCTTa. 

YBe/iimaBaHe pa3Mepa Ha xuftna 

B c/iynai/i, ne cnep, nonwcTBaHe Ha bcmukm noKO/ieHi/iyi, Bee oiue H^Ma Aocra- 
rbUHO naMeT 3a cb3AaBaHe Ha AaAeH o6eKT, Heo6xoAHM Ha npn^OKeHneTO, 
CLR me yBe/iwuaBa pa3Mepa Ha managed heap v\ cbOTBeTHkmT npouec, b 
komto ce M3n"b/iHflBa CLR, 3anonBa p,a 3aeMa noBene naMeT ot onepaunoHHaTa 
cucTeMa. Ako e Heo6xoAHMO, ce M3no/i3Ba BkipTya/iHaTa naMeT. 

BnpTya^HaTa naMeT ce cbxpaHABa Ha TBtpAna auck. KoraTO onepaunoHHaTa 
cucTeMa MMa Hy>KAa ot naMeT, a cpw3kmecKaTa RAM naMeT Ha KOMmorbpa He e 
AOcraTbUHa, ce M3B"bpujBa npouec, npn komto HeaKTMBHM CTpaHnun ot RAM 
naMerra, ce npexBtp/urr Ha TBtpAna auck. KoraTO Te3M CTpaHnun ot naMerra 
Tpa6Ba as ce Aocrbnyrr othobo, Te ce KonnpaT o6paTHO b RAM. EcTecTBeHO 
AMCKtT e mhoto no-6aBeH ot ncTMHCKaTa RAM naMeT, TaKa, ne uenwnj to3m 
npouec MO>Ke p,a OTHeMe AOCTa BpeMe, npe3 KoeTO npki/io>KeHi/iflTa pa6oTAT 
mhoto 6aBHO (Aopn 3a ki3BecreH nepnoA MoraT p,a cnpaT p,a onpecHHBaT 
MHTepcpewca cm v\ p,a M3r/ie>KAaT "yBMCHa/ii/i"). 

OMHa/iM3auM5iTa Ha o6eKTM b .NET 

KaKTO BMA^xMe, garbage collector hm ocBo6o>KAaBa Hant/iHO ot rpn>KMTe no 
ynpaB^eHneTO v\ nonwcTBaHeTO Ha naMerra. B CBeTa Ha .NET, Bene ca HeB"b3- 
mo>khm M3Ti/maHeTO Ha naMeT v\ o6ptmeHneTO kbm Bene yHnmoxeH o6eKT, ABe 
oco6eHO HenpuflTHM rpeujKM, komto mhoto TpyqHO ce OTKpuBaT v\ npocneAflBaT 
m MoraT p,a npeBtpHaT noAAP"b>KKaTa v\nv\ Ae6"brBaHeTO Ha eAHa cwcreMa b 
KOiuMap 3a nporpaMMCTMTe. 

3a paAOCT, noBeneTO ot o6eKTMTe, c komto HaiunTe npi/i/io>KeHi/m me pa6oT*rr, 
M3MCKBaT caMO naMeT 3a p,a ca cpyHKui/iOHa/iHM. HanpuMep int32, Double, 
string m Hashtabie ca TunoBe, komto ctxpaHflBaT m MaHwny/iwpaT 6ai/iTOBe 
ot naMerra. 3a Te3M v\ 3a mhoto Apyrn o6eKTM, cnoKOWHO MO>KeM p,a ocraBMM 
Aa ce norpn>KM garbage collector. He e Heo6xoAMMO p,a M3BtpujBaMe KaKBMTO 
m Aa 61/1/10 AewcTBUfl no nonwcTBaHeTO Ha pecypcuTe, 3aeTM ot tax. BMecTO 
TOBa, Hue npocTO c"b3AaBaMe o6eKTa, ki3no/i3BaMe HeroBaTa cpyHKUMOHa^HOCT 
m KoraTO Bene He hm Tpn6Ba, MOxeM Aa 6"bAeM curypHM, ne b no-KtceH eTan 
garbage collector me ce norpuxn Aa ocbo6oam 3aeTaTa ot Hero naMeT. 

ripn Apyrn o6eKTM, o6a4e, HemaTa ca Ma/iKO no-c^o>KHM. HanpuMep TuntT 
System. IO. FileStream BBTpeWHO C"bA"bp>Ka CpaM^OB MaHMny^aTOp, komto ce 



T/iaBa 24. ynpaB/ieHne Ha naMerra m pecypcuTe 697 

i/i3no/i3Ba ot MeTOAMTe My Read(...) m write(...). no noflo6eH HanwH, 

System. Data. OleDb . OleDbConnection Kancy/lkipa Bp"b3Ka K"bM 6a3a OT 
flaHHkl, a System. Net. Sockets. Socket - Mpe>KOB COKeT. 

3a BCM4KM noflo6HM o6eKTM, Kancy^npaiun HflKaicbB ueineH cwcreMeH pecypc, 
Tpa6Ba fla ce B3eMaT cneuwa/iHki MepKM, TbM ioto caM no ce6e cm, garbage 
collector He MO>xe fla ocBo6o>KflaBa Te3M pecypcu. ToBa e ottobophoct Ha 
caMMfl o6eKT. MMeHHO b Ta3M cuTyauna Ha noMOiu i/iflBa 4>MHa/iM3ai4MnTa. 

KaKBO e 4>MHa/iM3auiMfi? 

HaKpaTKO, cpMHa^M3aunflTa no3BO/iflBa fla ce nonwcTBaT pecypcn, CB"bp3aHM c 
flafleH o6eKT, npeflu o6eKT"bT fla 6"bfle yHMiuo>KeH ot garbage collector. 
06flCHeHO Haw-npocTO, TOBa e HanwH fla ce Ka>xe Ha CLR "npeflu to3m o6eKT 
fla 6"bfle yHMiflo>KeH, Tpa6Ba fla ce ki3iTb/iHki eTO to3m koa". 

3a fla e B"b3MO>KHO TOBa, K/iacvr Tpa6Ba fla MMn/ieMeHTwpa cneuwa/ieH MeTOfl, 
HapeneH Finalize (). KoraTO garbage collector ycTaHOBM, ne flafleH o6eKT 
Bene He ce M3no/i3Ba ot npi/i/io>KeHkieTO, tom npoBepyiBa p,anv\ o6eKTbT 

flecpMHkipa Finalize () MeTOfl. AKO TOBa e TaKa, Finalize () ce kl3ITb/lHflBa M 

Ha no-K"bceH eTan (Haw-paHO npn c/ieflBamoTO npeMMHaBaHe Ha garbage 
collector), o6eKTbT ce yHMmo>KaBa. To3m npouec me 6"bfle pa3r/ie,aaH p,ejav\n- 
ho cnefl Ma/iKO. 3acera npocTO Tpa6Ba fla 3anoMHMTe flBe Heiua: 

Finalize () He MOWe fla Ce M3BMKBa ilBHO. T03M MeTOfl Ce M3BMKBa 

caMO ot cucTeMaTa 3a nonwcrBaHe Ha naMeTTa, KoraTO ta npeueHM, ne 
flafleHMAT o6eKT e OTnafltK. 

- Haw-Ma^KO flBe npeMMHaBaHna Ha garbage collector ca Heo6xoflMMM 3a 
fla ce yHMiuo>KM o6eKT, flecpMHupaiu Finalize () MeTOfl. ripn ntpBOTO ce 
ycTaHOBABa ne o6eKTbT nofl/ieww Ha yHMiuoKeHne v\ ce i/i3n"b/iHHBa 
cpMHa^M3aTop"bT, a npn btopoto ce ocBo6o>KflaBa v\ 3aeTaTa ot o6eKTa 
naMeT. BcbiflHOCT b pea/iHi/m >kmbot nonâ„¢ BMHarn ca Heo6xoflMMM 
noBene ot flBe cb6kipaHi/i*i Ha garbage collector nopaflu npeMi/maBaHeTO 
Ha o6eKTa b no-ropHO noKO/ieHkie. 

flecTpyKTopiue b C# 

B .NET, K/iaCbT System. Object flecpMHkipa Finalize () MeTOfl. AKO MCKaMe fla 

ocurypuM cpMHa/iki3aTop 3a Haujua K/iac, 6nxMe ki3no/i3Ba/iki cj\ep,uv\s\ koa: 



protected override void Finalize i 

{ 

try 

{ 

// Cleanup code goes here 

} 
finally 

{ 

base . Finalize ( ) ; 



698 



flporpaMnpaHe 3a .NET Framework (tom 2) 



} 



KaKTO BM>KflaTe, TOBa, KoeTO npaBMM, e fla npeflecpm-mpaMe Finalize () 
MeTOfla Ha K/iaca system. object (cnoMHeTe cm, ne bcmukm TunoBe b .NET 

Hac/ieflflBaT System. Object). l/l3nO/13BaMe KOHCTpyKUMflTa try ... finally 3a 

fla ce noflcurypuM, ne He3aBncnMO KaicbB e pe3y/iTaTbT ot M3n"b/iHeHi/ieTO Ha 

n04MCTBaiflMfl KOfl, Lfle 6"bfle M3BklKaH Finalize () MeTOfl"bT Ha pOflMTe^CKMfl 

o6eKT. 




3a6e/ie>KeTe, ne MaKap system, object fla flecpuHiipa 
Finalize o MeTOfl, 3a fla noflfli>p>Ka 4>MHa/iM3ai4nn, BaujMnT 
K/iac, mm hsikom ot poflMTe/iCKMTe My TunoBe Tpn6Ba fla 
npnnoKpnBa Finalize o MeTOfla (npe3 M3no/i3BaHeTO Ha 
flecTpyKTop). T.e. aKO Finalize o MeTOfli>T Ha Bawim K/iac e 
to3m, Hac/iefleH ot system, object, to MHCTaHLtMMTe Ha K/iaca 

HHMa fla nOflfl-bpMOT C|}MHa/IM3aL4Mn. 



BcbiflHOCT, aKO ce onuTaTe fla KOMnw/ikipaTe noKa3aHMfl no-rope koa, me 
no/iynkiTe cneflHOTO c"bo6iueHne 3a rpewKa ot C# KOMnw/iaTopa: 



Do not override obj ect . Finalize . Instead, provide a destructor. 



flecpMHnpaHe Ha flecTpyKTopw b C# 

EKuntT, pa3pa6oTBa/i C# KOMnw/iaTopa, ycraHOBABa, ne mhoto nporpaMMCTM 
He MMn^eMeHTupaT Finalize o npaBM/iHO. rio-cneuwa/iHO, MH03MHa 3a6paB*iT 

fla l/l3nO/13BaT try ... finally 6/10K M fla M3BMKaT base . Finalize () . Ilopaflkl 

Ta3M npn^MHa, b C# He MO>xe FinaiizeO fla ce MMn/ieMeHTwpa abho. BMecTO 
TOBa ce M3no/i3BaT flecrpyKTopw, komto MMaT c/ieflHkifl cneuwa/ieH CMHTaK- 
cmc: 



-MyClass () 

// Cleanup code goes here 



{ 



} 



To3M KOfl ce npeo6pa3yBa ot KOMnw/iaTopa bbb Finalize () MeTOfl, no TaKbB 
Ha^MH, ne CTaBa Hant/iHO eKBMBa/ieHTeH Ha npeflniuHMfl (T.e. aBTOMaTMUHO ce 

fl06aBfl try..finally M ce M3BMKBa base . Finalize ( ) B"bB finally 6/10Ka). 




3a6e/ie>KeTe, ne MaKap flOKyMei-rraiJimiTa Ha C# fla M3no/i3Ba 
TepMHHiT flecTpyKTop, a CMHTaKCMCbT fla e eKBMBa/ieHTeH Ha 
flecTpyKTopMTe b C++, bc-blmhoct npn/inKaTa CB-bpwBa flo TyK. 
B C# flecTpyKTopMTe ce npeo6pa3yBaT bi>b Finalize () MeTO- 
flM, komto ce M3BMKBaT ot cucreMaTa 3a noHMCTBaHe Ha na- 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcirre 699 



MeTTa. yHMLqoKaBaHeTO Ha o6eKTMTe He e fleTepMMHMCTMHHO 
m nporpaMMCTiaT HHMa bi>3mo>khoct fla onpefle/iM Kora v\ b 
xatrbB pen ce M3ni>/iHfiBaT <j)HHa/iM3aTopMTe. ripn HfiKOM cne- 
MMa/iHM o6cTonTe/iCTBa flopn HtiMa rapaHijmi, ne Te M3o6u|o 
me ce M3n~b/iH$iT. 3anoMHeTe: 061140TO Mewfly flecrpyKTopiue 

B C# M Te3M B C + + Ce M3HepnBa CbC CMHTaKCMCa. 



d>MHann3aiJiMq - npMMep 

HeKa o6o6lumm Ka3aH0T0 Aocera b eflMH no-3aBtpiueH npuMep. B KOfla 
noKa3aH no-,qo/iy, flecpMHupaMe K/iac, komto Kancy/iwpa H^KaKbB Windows 
pecypc (MaHnny^aTop kbm komto ce cbxpaHHBa b n/ieH-npoMeH/iMBaTa 

mResourceHandle) : 



using System; 

// Wrapper around Windows resource 
class ResourceWrapper 

{ 

private IntPtr mResourceHandle = IntPtr.Zero; 

public ResourceWrapper ( ) 

{ 

// Allocate the resource here 

} 

~ResourceWrapper ( ) 

{ 

if (mResourceHandle != IntPtr.Zero) 

{ 

// Deallocate the resource here 
// . . . 

mResourceHandle = IntPtr.Zero; 
} 
} 
} 



3a6e/ie>KeTe, ne koavt, noi<a3aH TyK, e npocro npuMep iok Tpa6Ba fla ce 
AecpMHupa AecTpyKTop, ho He e npaBki/iHWAT HanwH 3a ocBo6o>KflaBaHe Ha 

CMCTeMHM peCypCM. riO npM4MHM, KOMTO Lfle M3ACHMM cnefl Ma/IKO, He e 

ecpeKTMBHO fla ce pa3HMTa caMO Ha cpi/iHa/iki3auwflTa, KoraTO Tpa6Ba fla ce 
ocBo6ofln cucTeMeH pecypc. no-HaTarbK, b ceKunaTa " Pbuho ynpaB/ieHkie Ha 
pecypcme c MHTepcpeMca iDisposabie " me flafleM npuMep iok touho Tpa6Ba 
fla ce noflxoflu b TaKbB cnynai/i. 

3a a Ky/incMTe 

HeKa cera pa3r/ieflaMe Ma/iKO no-noflpo6HO KaKBO BCbiflHOCT ce c/iyuBa, 
KoraTO flecpMHupaMe flecTpyKTop b KOfla Ha Hawkm K/iac. B Ta3M ceKuna me 



700 



flporpaMnpaHe 3a .NET Framework (tom 2) 



i/i3/io>KkiM KpaTKO onwcaHwe Ha npoueckue, komto npoTkmaT 3afl Ky/iwcwTe, 
KoraTO CLR M3n"b/iHflBa KOfla. C/iefl TOBa me flafleM hakom npenoptKM, CB"bp3a- 

HM C M3nO/13BaHeTO Ha FinalizeO MeTOAH. 

M TaKa, CLR noAA"bp>Ka flBe CTpyKTypn, komto ca CB"bp3aHM c cpnHa^M3aunflTa. 
ToBa ca T.Hap. Finalization List v\ Freachable Queue. 

KoraTO ce cb3AaBa hob o6eKT, CLR npoBep^Ba p,anv\ Twnvr AecpMHupa 
FinalizeO MeTOfl m aKO TOBa e TaKa, cnep, cb3AaBaHeTO Ha o6eKTa b AHHa- 
MMUHaTa naMeT (ho npeAM M3BMKBaHeTO Ha HeroBna kohctpyktop), yKa3aTe/i 
KtM o6eKTa ce Ao6aBfl kbm Finalization list. TaKa Finalization list cbfltpwa 
yKa3aTe/iw KtM bci/iukm o6eKTM b xnwna, komto Tpa6Ba p,a 6"bAaT cpHHa/iM3M- 
paHM (MMaT FinalizeO MeTOAn), ho Bee ome ce i/i3no/i3BaT ot npn^OKeHneTO 
{v\nv\ Bene He ce i/i3no/i3BaT, ho ome He ca npoBepeHM ot garbage collector). 




Cb3flaBaHeTO Ha o6eKT, noflfl-bpwam (3pv\Hanv\3a\\v\fi M3MCKBa 
eflHa flonia/iHHTe/iHa onepai4nn ot CTpaHa Ha CLR - nocra- 
BAHeTO Ha yKa3aTe/i bi>b Finalization list v\ cneflOBaTe/iHO 
OTHeMa m Ma/iKO noBene BpeMe. 



B3anMOfleMCTBneTO Ha garbage collector c o6eKTMTe, Hy>KAaem.n ce ot cpMHa- 
j\v\3a\\v\n, e TBtpAe MHTepecHO. HeKa pa3r/ieAaMe cj\ep,uv\s\ npuMep. 

OnrypaTa no-AO/iy noKa3Ba onpocTeHa cxeMa Ha cbcroflHweTO Ha AHHaMwn- 
HaTa naMeT touho npeAM Aa 3anonHe nonkicmaHe Ha naMeTTa. Bn>KAaMe ne 
xkifinvr C"bA"bp>Ka Tpn o6eKTa - A, B v\ C. HeKa bcmukm Te ca ot riOKO/ieHkie 0. 
06eKT A Bee oiue ce ki3no/i3Ba ot npn^OKeHneTO, TaKa ne tom me oue/iee npn 
npeMMHaBaHeTO Ha garbage collector. 06eKTM BhC, o6ane, ca HeAOCTbnHM ot 
KopeHMTe m ce onpeAe/iflT ot garbage collector-a KaTO OTnaAt>ui/i. 



A 


B 


C 





B 






Freachable queue 



KoraTO AaAeH o6eKT ce MAeHTucpnuupa KaTO OTnaAtK, garbage collector 
npoBepsiBa p,anv\ bbb Finalization list cbmecrByBa yKa3aTe/i kbm to3m o6eKT. 
KoraTO TaKbB yKa3aTe/i HHMa (KaKbBTO e c/iynasrr c o6eKT C), HeroBaTa naMeT 
npocTO MO>Ke Aa ce ocbo6oah no HanwHa, Bene onucaH b ceKunaTa "KaK 
pa6oTM garbage collector?". 

KoraTO o6ane bbb Finalization list ce HaMepn TaKbB yKa3aTe/i (KaKTO b cnynan 
c o6eKT B), garbage collector He MO>Ke npocTO Aa yHMiuo>KM o6eKTa, TbM KaTO 
npeAM TOBa Tpa6Ba Aa ce M3BHKa HeroBna FinalizeO MeTOA- BMecTO TOBa, 
yKa3aTe^AT kbm o6eKTa me 6"bAe m3tpmt ot Finalization list v\ me 6"bAe 
Ao6aBeH KtM Freachable queue. 



T/iaBa 24. ynpaB/ieHne Ha naMerra m pecypcuTe 



701 



CtCTOAHneTO Ha flkmaMi/mHaTa naMeT HenocpeflCTBeHO cnefl npi/iK/iK>nBaHeTO 
Ha cb6kipaHeTO Ha OTnafltun e cneflHOTo: 



A 



B 



B 




Finalization list 



Freachable queue 



Ha cpurypaTa BnenaT/ieHi/ie npaB^TflBe Hema: 

- 06eKT C e yHwmo>KeH n naMeTTa, 3aeMaHa ot Hero, MO>xe fla ce i/i3no/i- 
3Ba noBTopHO ot npi/i/io>KeHi/ieTO. 

- YKa3aTe^flT kbm o6eKT B e npeMecreH ot Finalization list bbb Freachable 
queue, a caMn^T o6eKT npofl"b/i>KaBa fla ">KMBee" b flkmaMMUHaTa naMeT v\ 
Tbv\ KaTO e oue/ia/i npn npeMi/maBaHeTO Ha garbage collector, Be^e e 
nacT ot rioKO/ieHMe 1. 



OnauiKaTa Freachable 

OnaujKaTa Freachable cbfltpwa yi<a3aTe/iki kbm bcmukm o6eKTM, hmmto 
Finalize o MeTOflu Bene MoraT fla ce M3BMKaT. MMeTO Ha Ta3M onaujKa 
BCbm.HOCT 03Ha4aBa c^eflHOTo: F e cbKpaTeHO ot Finalization - BceKM e/ieMeHT 
ot onaujKaTa e yi<a3aTe/i kbm o6eKT, komto Tpa6Ba fla ce cpkiHa/iki3wpa, a 
reachable (flocTbneH) 03HanaBa, ne o6eKTbT e /jocTbneH ot npwioxeHneTO. 
BceKM o6eKT, 3a komto MMa 3annc bbb Freachable queue e flocTt>neH ot 
npn/io>KeHMeTO m He e OTnafliK, T.e. Freachable queue ce cnwTa 3a hsct 
ot Kopemrre Ha npi/i/io>KeHi/ieTO, KaKTO HanpuMep ca r/io6a/iHkiTe v\ craTMUHM 

npOMeH^MBM. 

HaKpaTKO 3a 4>MHasiM3aLiMfiTa 

M TaKa, garbage collector ntpBO onpefle/isi o6eKT B KaTO HeflocTbneH v\ 
c^eflOBaTe^HO - noA/iewam. Ha nonwcrBaHe. Cnep, TOBa yKa3aTe/i$iT kbm o6eKT 
B ce M3TpnBa ot Finalization list i/i ce flo6aBfl kbm onaujKaTa Freachable. B 
to3m MOMeHT o6eKT"bT ce ci>>KMBfiBa, T.e. tom ce flo6aB*i KtM rpacpa Ha 
flocTbnHMTe o6eKTM m Bene He ce cni/iTa 3a OTnafltK. Garbage collector 
npeHape>Kfla flWHaMi/mHaTa naMeT. ripn TOBa o6eKT B ce TpeTupa KaKTO BceKM 
flpyr flOCTtneH ot npki/io>KeHMeTO o6eKT, b Haujua npuMep - o6eKT A. 

C/iefl TOBa CLR CTapTupa cneuna/iHa HMUJKa c bmcok npnopnTeT, koato 3a 
BceKM 3annc bbb Freachable queue w3n"b/iHflBa Finalize () MeTOfla Ha cbOT- 
BeTHM?i o6eKT v\ c/iefl TOBa M3TpMBa 3annca ot onawxaTa. 

ripn c/ieflBamoTO nonwcrBaHe Ha noKO/ieHwe 1 ot garbage collector, o6eKT B 
me 6"bfle TpeTupaH KaTO HeflocTbneH (3amoTO 3ani/icbT Bene e m3tpmt ot 



702 nporpaMnpaHe 3a .NET Framework (tom 2) 

Freachable queue v\ hmkom ot KopeHMTe Ha npw/io>KeHkieTO He conn kbm 
o6eKTa) m naMerra, 3aeMaHa ot Hero me 6"bfle ocBo6ofleHa. 3a6e/ie>KeTe, ne 
Tbv\ KaTO o6eKT"bT Bene e b no-BMCOKO noKO/ieHi/ie, npeflki TOBa fla ce c/iynn e 
Bt3MO>KHO fla Mi/maT ome hako/iko npeMMHaBaHMfl Ha garbage collector. 

TbMHaTa cTpaHa Ha 4>MHajiM3aLiMflTa 



JIhdk: He CbM ynnaineH. 
fioAa: flo6pe. LMe 6tMeuj. LLje 6tMeuj. 



<t>MHa/iM3aiJiMflTa e Hee4>eKTMBHa 



06eKTMTe, noflfl"bp>KaiuM cpkiHa/iki3au.wyi, npecroABaT b naMeTTa 3Hani/iTe/iHO 
no-flt/iro ot ocraHa/ikiTe o6eKTM. OcBeH TOBa, npeflcraBeTe cm, ne o6eKTbT B 
ot ropHMfl npuMep fltpxn pecpepeHU.nn KtM flpyrw o6eKTi/i. Te3M o6eKTM (m 
o6eKTMTe, pecpepupaHM npyiKO v\nv\ HenpaKO ot tax) cbiuo me ce cbWMBflT v\ 
me ocTaHaT b naMeTTa, flOKaTO >KMBee v\ o6eKT B. ToBa 03HanaBa, ne garbage 
collector He MO>xe fla ocBo6ofln naMeTTa b MOMeHTa, KoraTO ycraHOBM ne 
o6eKTMTe ca OTnafl"bu.i/i. 

HenpaBki/iHO e fla ce pa3ni/iTa (caMo) Ha cpi/iHa/iM3au.MflTa, 3a ocBo6o>KflaBaHe 
Ha cucTeMHM pecypcu. noMHeTe, ne HAMaTe kohtpo/i Btpxy TOBa Kora me ce 
M3n"b^HAT cpkiHa/iki3aTopi/iTe. ToBa MO>Ke fla flOBefle ao HeHy>KHO fl"b/iro 3afl"bp- 
>KaHe Ha pecypcuTe 3aeâ„¢. 

npo6/ieMM C HMUIKMTe 

Finalize o MeTOflMTe ce M3n"b^HABaT ot OT,qe/iHa HMUJKa Ha CLR. CneflOBa- 
Te/iHO, BtB cpMHa^M3aTopnTe He Tpa6Ba fla ce nuiue koa, komto npaBM 
KaKBMTO m fla 61/1/10 npeflno/io>KeHMfl othocho HMUJKaTa b koato ce M3n"b/iH*iBa. 

OcBeH TOBa, Tpa6Ba fla ce M36arBa koa, OTHeMaiu mhoto BpeMe. B uav\-i\ouiv\^\ 
cnynaki, aKO flafleH Finalize o MeTOfl B/ie3e b 6e3KpaeH u.mcb/1, HMUJKaTa, 
M3n"b^HflBaiua cpwHa/iki3aTopkiTe me ce 6/iOKkipa v\ ocraHa/ikiTe Finalize () 
MeTOflM HflMa fla ce i/i3n"b/iHflT. ToBa e mhoto onacHa cuTyauna, 3amoTO flOKaTO 
npn^OKeHneTO pa6oTM, garbage collector HHMa fla MO>Ke fla ocBo6ofln 
3aeMaHaTa ot Te3M o6eKTM naMeT. 

ripn npeKpaTABaHe Ha pa6oTaTa Ha npn^OKeHneTO, KoraTO CLR ce M3K/iK>nBa, 
Ha BceKM Finalize o MeTOfl ce flaBaT npn6/in3MTe/iHO flBe ceKyHflu, 3a fla ce 
M3n"b/iHki. Ako MeTOfltT He 3aB"bpujn M3n"b/iHeHkieTO cm 3a TOBa BpeMe, CLR 
npocTO y6nBa npoueca v\ He M3n"b/iH*iBa noBene cpkiHa/ii/i3aTopi/i. OcBeH TOBa, 
CLR flaBa npi/i6/iM3MTe/iHO neTwpwfleceT ceKyHflu 3a fla ce i/i3n"b/iHHT bcmukm 
FinaiizeO MeTOflM. C/iefl KaTO TOBa BpeMe MMHe, npouecbT ce y6nBa. 

npo6/ieMM c peAa Ha M3ni>siHeHMe Ha cpnHa/in3aTopnTe 

CLR He flaBa HMKaKBM rapaHunn 3a pefla, b komto me ce M3BMKaT OTfle/iHMTe 
cpMHa^M3aTopn. ToBa 03HanaBa, ne He e 6e3onacHO bbb Finalize () MeTOfl fla 
ce o6p"bmaTe kbm flpyr o6eKT, noflfl"bp>Kam cpMHa/iki3au.kifl, 3amoTO HeroBM^T 
cpkiHa/iki3aTop MO>Ke Bene fla e 6m/i M3n"b/iHeH v\ cbcroyiHkieTO Ha o6eKTa b to3m 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 703 

c/iynaw e HenpeflBkiflkiMO. Ctiuo, He e 6e3onacHO fla M3BMKBaTe craTMUHM 
MeTOflM. Te3M MeTOflM BtTpeujHO MoraT fla ki3no/i3BaT o6eKTM, komto Bene ca 
6m/ii/i cpi/iHa/iM3wpaHM m pe3y/iTaTMTe othobo ca HenpeflCKa3yeMM. 

KaKBO fla npaBMM Bee naK? 

Cnep, bcm4ko Ka3aHO flOTyK, MO>Ke 6m Bene ce nyflkiTe, 3a KaKBO MO>KeTe fla 
M3no^3BaTe Finalize o MeTOflMTe. M c/iefl ioto MMa TO/iKOBa mhoto Heiua 
komto He Tpn6Ba v\nv\ He e ecpeKTMBHO fla ce npaBAT bbb cpkiHa/ii/i3au.i/iflTa, 
KaKBO fla npaBMM KoraTO ce Ha/iara fla ocbo6oai/im HAKaKbB pecypc? 

Microsoft npenop"b4Ba ki3no/i3BaHeTO Ha cpkiHa/iki3au,kiflTa fla CTaBa CbBMecTHO 
c MMn/ieMeHTkipaHeTO Ha MHTepcpewca iDisposabie. 



& 



He pa3HMTaMTe caMO Ha t(jMHajiM3ai4miTa 3a fla ocBo6o>Kfla- 
BaTe pecypcM. llMnsieMeHTupaiiTe iDisposabie v\ M3no/i3BaMTe 
Finalize o MeTOflMTe CbBMecTHO c Hero. 



Ci3>KMBfiBaHe Ha o6eKTM 

CMtprra e ecrecTBeHa nacr ot >KHBora. 

PaABame ce 3a 0He3H komto ce npeBptuiaT b 

vacT or CM/iara. He rn onnaKBatire. HeKa He bh 

/inncBar. npnBtp3BaHeT0 bomm mo peBHOcr. To 

e cfjHKa Ha armHOcna. Mona 

KaKTO BMflflXMe, ukiKb/i"bT Ha >kmbot Ha o6eKT, Hy>Kflaeiu ce ot cpi/iHa/iki3au.wfl e 
MHTepeceH. 06eKTbT yMupa, cnefl TOBa pecpepeHuna kbm Hero ce flo6aBH kbm 
eflMH ot KopeHMTe Ha npi/i/io>KeHi/ieTO (Freachable queue) npn KoeTO o6eKTbT 
ce cb>KMBflBa, HeroBMAT Finalize o MeTOfl ce i/i3n"b/iHflBa, yKa3aTe/iflT ce 
M3TpnBa ot Freachable queue v\ o6eKT"bT yMupa 3aBi/mari/i. B no-KbceH eTan, 
garbage collector npocTO me ocbo6oam 3aeTaTa ot to3m "M-bpTbB" o6eKT 
naMeT. 

KaKBO me ce c/iyni/i, o6ane, aKO no BpeMe Ha cpi/iHa/ii/i3au.i/iflTa o6eKTbT ce 
flo6aBM ki>m hakom ot KopeHMTe Ha npw/io>KeHi/ieTO? 

Pa3MeflaMTe cneflHkiyi koa: 



public class ClassThatResurrects 

{ 

~ClassThatResurrects ( ) 

{ 

SomeRootClass .mThisIsARoot = this; 

} 
} 

public class SomeRootClass 

{ 

public static object mThisIsARoot; 



704 flporpaMnpaHe 3a .NET Framework (tom 2) 



} 



B to3m npuMep no BpeMe Ha cpMHa/ii/i3au.MflTa, o6eKT ot Tuna 

ClassThatResurrects Lfle fl06aBkl pecpepeHUMfl K"bM Ce6e CM B eflklH OT 

KopeHMTe Ha npw/io>KeHkieTO - craTMUHaTa n/ieH-npoMeH/ikiBa mThisisARoot. 
TaKa o6eKTbT CTaBa flocrbneH v\ garbage collector H^Ma fla ro yhmiuokm. 
ripn^OKeHneTO MO>Ke fla M3no/i3Ba o6eKTa npe3 npoMeH/iMBaTa mThisisARoot 
AOKaTO t*i C04M KtM Hero. ToBa e MHTepeceH c/iynaw Ha cb>KMBflBaHe Ha 
o6eKT. Bn>KflaMe, ne KaTO .NET nporpaMMCTM MMaMe nonTki "cBptxecrecrBe- 
HaTa" ci/i/ia fla BptiuaMe v\ ki3no/i3BaMe o6eKTM ot CBeTa Ha MtpTBMTe. 

KoraTO b HflKaicbB MOMeHT Ha mTisisARoot ce npucBOM yi<a3aTe/i kbm Apyr 
o6eKT, v\i\v\ npocTO null, CbxuBeHMflT o6eKT othobo yMupa v\ me 6"bfle nonwc- 
TeH (HAKora) ot garbage collector. B to3m c/iynaw o6eKTbT HHMa noBene fla ce 
cpMHa^M3npa, TtM KaTO HeroBMAT Finalize o MeTOfl Bene e 6m/i M3BMKaH 
BeflH"b>K m yi<a3aTe/i kbm o6eKTa Bene He ctiuecTByBa bbb Finalization list. 

Ako Bee naK MCKaMe Finalize () MeTOflvr fla ce ki3iTb/iHki othobo, garbage 

collector npefl/iara CTaTkinHklflT MeTOfl ReRegisterForFinalizeO , KOMTO 

npneMa eflMH eflMHCTBeH napaMeTbp - pecpepeHui/m kbm o6eKT. M3BMKBaHeTO 
Ha to3m MeTOfl flo6aBfl yKa3aTe/i kbm o6eKTa bbb Finalization list. KoraTO 
garbage collector npeueHM, ne o6eKTbT e OTnafltK, yKa3aTe/iyn~ me 6"bfle 
npeMecTeH bbb Freachable queue v\ Finalize () MeTOfla me 6tfle M3BMKaH 
othobo. Eto m npuMep: 



~ClassThatResurrects ( ) 

{ 

SomeRootClass . thisIsARoot = this; 

GC . ReRegister For Finalize (this ) ; 
} 



BcbLflHOCT npn HanncaH no to3m Hani/m flecTpyKTop, o6eKTbT me ce cb>Ki/iBflBa 
BceKM n"bT KoraTO ce M3BMKa HeroBnaT Finalize () MeTOfl v\ flOKaTO npi/i/io>Ke- 
HueTO pa6oTM, tom HMKora HflMa fla yMpe. KoraTO npw/io>KeHi/ieTO npeKpaT^Ba 
pa6oTaTa cm, CLR me M3nai<a onpefle/ieHO BpeMe v\ cnep, TOBa npocTO me y6ne 
npoueca. B eflHO pea/iHO npn/ioxeHne BepoaTHO 6nxTe npaBM/iw HflKaKBa 
npoBepKa, npeflu fla npeperncTpupaTe o6eKTa 3a cpnHa^M3aunfl. 

C"bLUO, HMKOra He M3BI4KBat1Te ReRegisterForFinalizeO nOBene OT 

BeflHbw b flecTpyKTopa, TOBa me flOBefle ao MHoroKpaTHOTO My i/i3n"b/iHeHkie 
npn cneflBamoTO nonwcTBaHe. 

HanpuMep to3m koa me flOBefle ao TOBa ne flecrpyKToptT me ce ki3n"b/iHki flBa 
ntTM npn cneflBamoTO cbwwBflBaHe Ha o6eKTa (neTkipi/i nvri/i npn cneflBamoTO, 
oceM c/iefl TOBa v\ t.h.). HfiKora He npaBeTe TOBa b pea/ma nporpaMa: 



~ClassThatResurrects ( ) 

{ 

SomeRootClass . thisIsARoot = this; 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 705 



GC . ReRegister For Finalize (this ) ; 
GC . ReRegister For Finalize (this ) ; 
} 



ripi/mi/IHaTa 3a TOBa nOBefleHkie Ha KOAa e, ne ReRegisterForFinalize() 

npocro flo6aBfl yKa3aTe/i kbm o6eKTa bbb Finalization list 6e3 fla npoBep^Ba 
fla/iw TaKtB Bene cbiuecTByBa. 

Tpa6Ba fla ce noMHM, ne ki3no/i3BaHeTO Ha cb>KkiBflBaHe He e npenopt>Hn- 
Te/iHa npaKTMKa v\ Tpn6Ba fla ce M36arBa BUHaru, KoraTO HMa bi>3mo>k- 
hoct. BcbiflHOCT MaKap fla 3Bynw MHTepecHO m Bt^HyBaiuo, cnynawTe, b komto 
npw/iaraHeTO Ha cb>KkiBflBaHe e flo6pa v\p,es\, ca flocra Ma/iKO. l/l3no/i3BaHeTO 
Ha Bene cpnHa/iM3npaHM o6eKTM Mowe fla MMa HenpeflCKa3yeMM pe3y/iTaâ„¢. 
Ako HanpuMep ctxuBeHHAT o6eKT BvrpewHO ce o6p"biua kbm flpyrn o6eKTM, 
M3MCKBaiun cpMHa^M3aunfl, Finaiize() MeTOflMTe Ha hakom ot Tax MoraT Bene 
fla ca 6m/im M3n"b/iHeHki. OcBeH TOBa, bcmukm o6eKTM, kbm komto flafleHM^T 
o6eKT MMa pecpepeHUMM, ctiuo me ce cb>KMBflT v\ me 3aeMaT naMeT ot xkiwna. 

Pt»hho ynpaB/ieHiie Ha pecypciue c IDisposable 

JIhdk: Bhfl,eiueTO fin? LLje yMpar /im? 
Mofla: TpyAHO e &a ce bmam. Svjeu/ero BMnarvi e b 

MBM>KeHMe. 

Rd/iam HeflocTarbK Ha cwcreMaTa 3a nonwcTBaHe Ha naMeTTa e, ne H^Ma 
a6co/iK>THO HMKaKBa rapaHui/m Kora me 6"bfle nonwcreHa naMerra, hmto Kora 

Lfle 6tflaT M3BMKaHM CpMHa^M3aTOpMTe Ha HeflOCTM>KMMI/ITe 06eKTM. 

06nKHOBeHO TOBa He 6nBa fla bm npnTecH^Ba, ho aKO Bawi/m o6eKT e o6BMBKa 
oko/io HeynpaB^ABaH pecypc Ha onepaunoHHaTa cwcreMa (HanpuMep cpaw/i, 
coKeT, Bp"b3Ka ki>m 6a3a flaHHM v\ t.h.) b noBeneTO cnynaw me MCKaTe fla 
ocBo6oflMTe pecypca, 3a fla MO>xe fla ro w3no/i3BaT v\ flpyrn npi/i/io>KeHi/m v\nv\ 
flpyra HMUJKa bbb BaiueTO npi/i.no>KeHMe. 

He caMO TOBa, ho m pbuhoto ynpaB/ieHwe Ha pecypcuTe MO>xe fla 6"bfle no- 
ecpeKTMBHO. HanpuMep, aKO nuiueTe koa ki3no/i3Bam rpacpwneH pecypc 
(HanpuMep neTKa v\nv\ ujpucpT) v\ 3HaeTe, ne ot eflMH onpe,qe/ieH MOMeHT 
pecypcbT Bene He bm e Heo6xoflMM, He caMO e flo6pe fla ro ocBo6oflMTe, rbi/i 
KaTO tom KOHcyMupa HeyiBHO naMeT, ho m e nonTi/i 3afl"b/i>KkiTe/iHO fla ro 
ocBo6oflMTe, TbM KaTO nonTki BCM4KM pecypcw Ha onepaunoHHaTa cwcreMa ca 
orpaHM^eHM 9 . 

KaKTO Moxe fla onaKBaTe, b .NET Framework ctmecTByBa peiueHne Ha 
npo6/ieMa. 



9 ToBa ecTecTBeHO 3aBncn ot Ha/iwuweTO Ha naMeT, rbi/i KaTO He pecypcuTe, a 
MaHnny^aTopnTe (handles) 3a pecypcuTe ca orpaHkmeHw 



706 nporpaMnpaHe 3a .NET Framework (tom 2) 

MHTepcfeeMCbT IDisposable 

MHTepcpewcbT IDisposable ce npenop"b4Ba ot Microsoft b Te3M cnynaw, b 
komto MCKaTe fla rapaHTupaTe MOMeHTa/iHO ocBo6o>KAaBaHe Ha pecypcuTe 
(Bene 3HaeTe, ne M3no/i3BaHeTO Ha Finalize () He ro rapaHTupa). 

M3no^3BaHeTO Ha IDisposable ce cbCTOM b MMn/ieMeHTwpaHeTO Ha MHTep- 
cpewca ot K/iaca, komto o6BMBa HHKaKbB HeynpaB/iHBaH pecypc v\ ocBo6o>Kfla- 
BaHeTO Ha pecypca npn M3BMKBaHe Ha MeTOfla Dispose(). Eto iok H3Me>Kfla 
to3m MHTepcpewc: 



public interface IDisposable 

{ 

void Dispose (); 

} 



M3no/i3BaHeTO Ha IDisposable o6eKTM e TpuBna^HO, ho me bm noKaweM 
npaBM^HaTa ynoTpe6a, KoraTO onaKBaTe Bt3HMKBaHe Ha ki3K/iK)neHMe, Tbv\ 
KaTO CMe BM>Kfla^M hako/iko norpewHki npaKTMKM, komto He MCKaMe fla 
HaynwTe: 



// IlpHflofiHBaMe pecypca 

Resource resource = new Resource ( ) ; 

try 

{ 

// M3noji3BaMe pecypca 

} 
finally 

{ 

// yHwmoacaBaMe (ocBo6oxflaBaMe) pecypca. 

// Ilpeo6pa3yBaHeTO Ha o6eKTa jcbm IDisposable e flo6pa npaKTMKa 

// tâ„¢ KaTO o6eKTtT Moxe fla MMnjieMeHTMpa MHTep$ewca 

// eKcnjiwuMTHO KaKTO me BMflHTe no-HaTaTM 

( ( IDisposable) resource) . Dispose ( ) ; 
} 



OnepaTopt»T using 

Ta3M ynoTpe6a ce cpeiua mriKOBa necro, ne Microsoft ca flo6aBi/i/ii/i b e3MKa 
C# onepaTopa using, komto npaBi/i ctiuoTO 6e3 M3pn4HOTO cnoMeHaBaHe Ha 
onepaTopn v\ K/iay3ki 3a pa6oTa c M3K/iK)neHMfl: 



Resource resource = new Resource i 
using (resource) 

{ 

// M3noji3BaMe pecypca 

} 



OnepaToptT ce npeBptiua ot C# KOMnw/iaTopa b c^eflHua koa: 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 707 



Resource resource = new Resource ( ) ; 

try 

{ 

} 

finally 

{ 

if (resource != null) 

{ 

( ( IDisposable) resource) .Dispose i 

} 
} 



EcrecTBeHO, KOMnw/iaToptT e flocrarbUHO MHTe/iwreHTeH, 3a fla npeMaxine 
npoBepKaTa 3a null npeflu fla M3BMKa Dispose () b npocTMTe cnynaw KaTO 

TOpHMfl. 

Hue bm npenop"b4BaMe fla c"b3flafleTe pecypca b M3pa3a, noMecTeH b CKo6nTe 
Ha onepaTopa using, KaTO no to3m Hani/m me HaMa/ikiTe BkiflkiMOora Ha 
npoMeH/iMBaTa resource (KoeTO m me MCKaTe fla HanpaBMTe b noBeneTO ot 
c/iynawTe): 



// IlpHflofiHBaMe pecypca 

using (Resource resource = AcquireResource i 

{ 

// M3noji3BaMe pecypca 

} 

// PecypcBT e ocBofiojeH 



CtiuecTByBa o6ane npo6/ieM"bT fla 3a6paBi/iTe fla M3BMKaTe Dispose () Ha 
o6eKTa (v\nv\ K/iweHT Ha BaiuaTa 6ki6/ikiOTei<a c pecypcn fla 3a6paBM fla ro 
HanpaBu) v\ ToraBa, b HaM-flo6pnfl cnynai/i me M3Tene naMeT. Ha noMOiu MflBaT 
cpMHa^M3aTopnTe, komto MoraT fla bm rapaHTupaT TOBa M3BMKBaHe Ha MeTOfla 
Dispose o (aKO Bene He e M3BMKaH). 



IDisposable n Finalize 



BuHarn ca flBaMa, He noBe^e, He no-Ma/iKo: 
Maticrop w yveHMK. Ptoaa 



Ha npaKTMKa cbiuecTByBaT hhko/iko Btnpoca, Ha komto Tpa6Ba fla cm OTro- 
BopuM npeflu fla npucTtnuM KbM kiMn/ieMeHTaukia Ha IDisposable v\ HanncBa- 
HeTO Ha cpMHa^M3aTop: 

Hy>KAae /in ce K/iaci>T hm ot eKcnsiMLiMTHO ptHHO ynpaB/ieHwe? 

noBe^eTO Ha^MHaeiflu .NET nporpaMMCTM (fla He ce 6"bpKa c HanwHaem 
nporpaMMCT), oco6eHO Te3M komto MMaT npeflniueH onuT c e3nun, npn komto 
naMerra ce ynpaB/i^Ba ptnHO (HanpuMep C v\ C+ + ) TawHO ce Hafl^BaT 



708 nporpaMnpaHe 3a .NET Framework (tom 2) 

OTroBopBT fla e "fla". Ybm, KaKTO npn mhoto flpyrn Btnpocn, CB"bp3aHM c 
nporpaMnpaHeTO, cnroBopa e "3aBncn", ho b noBeneTO cnynaw e "He". 

npaBM^HMflT Btnpoc e "06BMBa nv\ K/iacbT hm HeynpaB/iflBaH pecypc?". 

rio-HanpeAHa^MTe .NET nporpaMMCTM me bm KaxaT, ne aKO K/iacbT bm 
M3no/i3Ba HeynpaB^flBaH pecypc, 3afl"b/i>KkiTe/iHO Tpa6Ba fla MMa cpkiHa/iki3aTop 
m fla MMn^eMeHTupa iDisposabie. ripo6/ieM"bT b noflo6HO M3Ka3BaHe e flyMwn- 
KaTa "M3no/i3Ba". HanpuMep, aKO K/iacbT bm M3no/i3Ba HeynpaB/iHBaH pecypc, 
komto Bene e o6bmt b ynpaB/iABaH K/iac, He caMO He e Heo6xoflMMO fla 
cb3flafleTe noBTopeH K/iac 3a o6BMBaHeTO Ha pecypca, ho TOBa MO>Ke fla 
flOBefle m flo npo6/ieMki, HanpuMep: 



class BadPractice 

{ 

~BadPractice ( ) 

{ 

mEventLog . Close () ; / /vljivl (( IDisposabie) mEventLog) . Dispose 

} 

private EventLog mEventLog; // MHMi4najiM3MpaH HaKije npyrane 
} 



no BpeMe Ha M3BMKBaHe Ha cpkiHa/iki3aTopa Ha BadPractice, o6eKTbT, coneH 
ot no/ieTO mEventLog Bene MO>xe fla e "c"b6paH" ot garbage collector v\ flopn 
MO>Ke fla ce e ki3n"b/iHki/i cpkiHa/iki3aTop"bT My, npn KoeTO me no/iynwTe M3XB"bp- 

/lflHe Ha l/l3K/lK>neHI/ieTO ObjectDisposedException. 

Ako 3aMeHMM "M3no^3Ba" c "o6BMBa", ToraBa Hue cbu\o bm npenoptuBaMe 
MMn^eMeHTupaHeTO v\ Ha cpMHa/iM3aTop v\ Ha MHTepcpewca iDisposabie. 

Mo>Ke sin aa pa3HMTaMe Ha KopeKTHa ynoTpe6a? 

Pa3yMHO nv\ e fla pa3HMTaMe, ne K/iacbT hm me 6"bfle i/i3no/i3BaH KopeKTHO v\ 
aKO He, MO>Ke nv\ fla ro 3aiunTMM ot HenpaBki/iHa ynoTpe6a? KpaTKua ottobop 
e "He m fla". He caMO, ne He MO>KeTe fla pa3ni/iTaTe Ha KopeKTHa ynoTpe6a Ha 
BaujMTe K/iacoBe, a e nonâ„¢ rapaHTupaHO, ne me 6"bflaT i/i3no/i3BaHki Henpa- 
bm/iho, npn TOBa HaxoflUkiBO HenpaBM^HO, ot no-HeonnTHM nporpaMMCTM. 
flo6paTa HOBMHa e, ne MO>xeTe fla 3aiunTMTe K/iacoBeTe cm cpeiuy HenpaBki/iHa 
ynoTpe6a, a /iowaTa e, ne b Ta3M r/iaBa me bm noKaweM KaK fla ro HanpaBMTe, 
ho caMO b KOHTeKCTa Ha MMn/ieMeHTaukiflTa Ha MHTepcpewca iDisposabie v\ 
cpMHa^M3aTopa Ha K/iaca. 

CtiuecTByBaT hako/iko Hani/ma 3a HenpaBi/i/iHa ynoTpe6a Ha Baujua K/iac: 

- noTpe6nTe^flT Ha K/iaca fla 3a6paBM fla M3BMKa Dispose () 

- noTpe6nTe/iflT Ha K/iaca fla M3BMKa Dispose () noBene ot eflMH nvr 

- nOTpe6l/ITe/lflT Ha K/iaca fla M3BMKa V\ Dispose () V\ Finalize () 

(eBeHTya/iHO noBene ot eflMH ntT) 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcirre 709 

Ako ce cbMHABaTe bbb btopma Ha^MH, npocTO cm npeflcraBeTe, ne nporpaMMCT 
e no/i3Ba/i M3pn4HO M3BMKBaHe Ha Dispose ( ) , no-K"bCHO ce e Hayumi Aa 
no/i3Ba onepaTopa using v\ e 3a6paBki/i p,a npeMaxHe M3pn4HOTO M3BMKBaHe. 
Ako ce cbMHABaTe, ne hakom Moxe p,a nocTurHe TpeTaTa HenpaBM/iHa 
ynoTpe6a, ce BtpHeTe Ha TeKCTa 3a cpkiHa/iki3auwfl v\ no-cneuwa/iHO Ha 
TexHMKaTa "cb>KkiBflBaHe Ha o6eKTn". 

Tpn6Ba /in Aa HarmweM koab cm 6e3onaceH 3a ynoTpe6a ot 

MHOrOHMLUKOBM TipMSlOMeHMfl? 

To3M Btnpoc HflMa npaBki/ieH OTroBop. He Mcoxe p,a KOHTpo/iwpaMe no HMKaKtB 
Hani/iH 6poa Ha HMUJKMTe, ki3no/i3Bamw eAHa v\ chuxa MHCTaHuna Ha Haujua 
K/iac. OTroBoptT ce flMKTyBa ot AH3ai/iHa, komto CTe H36pa/in. Ako o6ane CTe 
ki36pa/ii/i p,a noAAtpwaTe M3BMKBaHHfl kbm o6eKTa bm ot mhoto hmujkm, ToraBa 
c^MTaMTe, ne Tpa6Ba p,a noAAtpwaTe TOBa KaKTO ot cpMHa/iM3aTopa, TaKa v\ ot 
MeTOAa Dispose(). OcBeH TOBa MMaMTe npeABMA cpaKTa, ne koa^t b hmlukhtc 
MO>Ke Aa 6"bAe npeKtCHaT b Haw-HenoAxoAflm 3a Bac MOMeHT, a MMeHHO no 
BpeMe Ha ocBo6o>KAaBaHe Ha pecypcuTe. 

npiiMepHa MMrmeMeHTaMMfl Ha 6a30B K/iac, o6BMBai±i 
HeynpaB/inBaH pecypc 

MMn^eMeHTupaHeTO Ha MHTepcpewca iDisposabie M3r/ie>KAa ki3MaM/ikiBO 

ZieCHO, TbV\ KaTO T03M MHTepCpeMC C"bA"bp>Ka eAMH eAMHCTBeH MeTOA, KOMTO He 

npneMa napaMeTpn v\ He Bptiua pe3y/iTaT. CbmoTO ce OTHaca v\ p,o t. Hap. 
cpMHa^M3aTop. 

HanncBaHeTO Ha koa, komto p,a ce ki3no/i3Ba KaTO Lua6/iOH e Ao6pa npaKTMKa, 
ho HanncBaHeTO Ha koa, komto e totob p,a 6"bAa ki3no/i3BaH (m npew3no/i3BaH) 
6e3 MOAMCpMKaunfl e mhoto no-yAo6HO v\ boah AO no-Ma/iKO rpeujKM. Eto 3aiuo 
bm npeA-fiaraMe MMn/ieMeHTauwyi Ha 6a30B K/iac, komto v\wa cnep,uv\je npeAMM- 
CTBa: 

- K/iacbT e 3aB"bpiueH v\ eAMHCTBeHOTO, KoeTO Tpa6Ba Aa HanpaBMTe e Aa 
ro uacnep,v\je (TOBa pa36npa ce e m ochobhmat My HeAOcraTbK) 

- 3aiunTeH e ot bcmukm B"b3MO>KHM rpeujKM ot HenpaBki/iHa ynoTpe6a 

- nOAA"bp>Ka MHOrOHMLUKOBM npw/iOKeHkifl 

- 3aiunTaBa o6eKTa ot HeonaKBaHO npeKtCBaHe Ha HMUJKaTa, b kohto ce 
ki3n"b/iH*iBa yHMiuo>KaBaHeTO Ha pecypca 10 



// BaaoB KJiac 3a ofieKTM, o6BMBamn pecypc 

public abstract class ResourceWrapperBase : IDisposabie 

{ 

// yjieH-npOMeHJIMBM VL KOHCTaHTM 



10 



"HaM-HaxoA^MBMTe" ot Bac MoraT Aa onoponaT 3aiunTaTa (noMkicneTe KaK) 



710 flporpaMnpaHe 3a .NET Framework (tom 2) 



private const int FALSE = 0; 
private const int TRUE = 1; 
private int mDisposed = FALSE; 

~ResourceWrapperBase ( ) 

{ 

Disposelmpl (false) ; 

} 

// MMnjieMeHTauwfl Ha MHTep^ewca IDisposable 
public void Dispose () 

{ 

Disposelmpl (true) ; 

} 

// CtmMHCKaTa HMnneMeHTaiiMfl e CKpMTa b t. Hap. iua6jioHeH 

// MeTOfl 11 

private void Disposelmpl (bool aDisposing) 

{ 

// IlpoBepflBaMe flajiw ofieKTtT Beye He e 6mji ocBofiofleH m 
// BeflHara BflwraMe (JDJiara, 3a fla npeflOTBpaTMM napajiejiHOTO 
// M3n r bJiHeHwe Ha cwsyia koh ot npyra HMiuKa 
if ( Interlocked. CompareExchange ( ref mDisposed, 
TRUE, FALSE) == TRUE) 

{ 

return; 

} 

// OTBapflMe try ... finally 6jiok 3a ga ce npeflna3MM 

// OT BtSMOXHOCTTa BMHHKBaHeTO Ha aCMHXpOHHO M3KJIKyeHMe 

// fla npeKtcHe KOfla 3a ocBo6oacflaBaHeTO Ha pecypcMTe 

// B HenOflXOflfllll MOMeHT 

try 

{ 

if (aDisposing) 

{ 

// EKcnjiMUMTHO ocBofiosflaBaHe: flejierwpaMe k^m HacjieflHMKa 

DisposeManagedResources ( ) ; 
} 

// OTBapflMe try... catch 6jiok 3a fla npeflOTBpaTMM 

// BtSMOXHOCTTa HaiUMflT KOfl na npeflM3BMKa M3KJiioyeHMe 

// no BpeMe Ha $MHajiM3ai_tMfl 

try 

{ 

// flejierwpaMe KtM HacjieflHMKa 
DisposeUnmanagedResources ( ) ; 



11 



Bm>k wa6/iOHa template method b KHuraTa "LUa6/iOHi/i 3a flM3aMH" 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 711 



} 



} 
catch 

{ 

if (aDisposing) 

{ 

// I43XB r bpji;3Me nOBTOpHO MSKJIIOyeHMeTO, aKO 

// o6eKTtT He ce $MHajiM3Mpa b MOMeHTa 
throw; 
} 
} 
} 
finally 

{ 

if (aDisposing) 

{ 

// CtobmaBaMe Ha CMCTeMaTa 3a nomcTBaHe Ha 6oKJiyKa, ye 
// o6eKT"BT Beye He ce Hyacflae ot $HHajiH3aiiMH 
GC . Suppress Finalize (this ) ; 
} 
} 
} 

// OyHKUMfl 3a npoBepKa flajiw o6eKTtT Beye e ocBofiojeH 
// npeflHasHayeHa fla ce nojisBa ot HacneflHWUMTe Ha KJiaca 
protected bool IsDisposed ( ) 

{ 

return Interlocked. CompareExchange ( ref mDisposed, 
FALSE, FALSE) == FALSE; 
} 

// IloMomHa $yHKi4Mfl, npeflHa3HayeHa sa HacneflHWUMTe Ha KJiaca, 
// kohto Tp^6Ba fla b'bfle M3BHKaHa b^b BCHyra He-private MeTOflM 
protected void EnsureNotDisposed ( ) 

{ 

if ( IsDisposed () ) 

{ 

throw new Ob j ectDisposedException (GetType ( ) . FullName) ; 

} 
} 

// HacjieflHMUMTe Ha to3m KJiac npene$MHMpaT cjieflHMTe MeTOflH 
// KaTO no to3m HamH "nontJiBaT" iua6jioHa Ha MeTOfla hm 
// Dispose () . IlpeflocTaBMJiM CMe HMnnejieHTaiiMfl no noflpa36npaHe 
protected virtual void DisposeManagedResources ( ) {} 
protected virtual void DisposeUnmanagedResources ( ) {} 



BtnpeKM, ne koa^t cbAtpwa noApo6HM KOMeHTapn, CMe A-ntwHw p,a HanpaBMM 
hako/iko pa3flCHeHMfl, oco6eHO 3apaAM ^MTaTe/ikiTe, komto HflMaT onuT c 

MHOrOHMUJKOBM M p M /l 0>Ke HM fl . 



712 



flporpaMnpaHe 3a .NET Framework (tom 2) 



YHMiuoKaBaHeTO Ha pecypca e noMecrei-io b eflMH o6iu MeTOfl 

(DisposeImpl(...) ), KOMTO Ce M3BMKBa KaKTO ot cpkiHa/iki3aTopa, TaKa M 

ot MeTOAa Dispose(). MeTOAtT Disposeimpi(...) npweMa KaTO napaMe- 
Ttp cp/iar, yKa3Baiu p,anw ce M3BMKBa no BpeMe Ha cpkiHa/in3aunfl v\nv\ 

M3PM4HO OT nOTpe6l/ITe/lCKklfl KOfl. 



CTaTM4HMflT MeTOfl CompareExchange (... ) 

â–  12 (T.e 



Interlocked e 

e rapaHTupaHO 



Ha K/iaca 
aTOMapHa onepaui/ia" (T.e. TaKaBa, npn koato 
ki3n"b/iHeHkieTO v\ caMO ot eflHa HMUJKa, He3aBMCMMO ot 6poa Ha HMUJKMTe 
m npouecopnTe b flafleHa ci/icreMa), koato M3B"bpujBa cnep,uv\je 
fleMCTBua: 

o ripoBepflBa p,anv\ CTOMHOCTra b ntpBua apryMeHT e paBHa Ha 
TpeTMfl apryMeHT 

o Ako CTOMHOCTra e paBHa, npucBOABa Ha ntpBua apryMeHT 
CTOMHOCTra Ha BTopua apryMeHT 

o Bptifla ntpBOHana/iHaTa ctomhoct Ha ntpBua apryMeHT 

B c/iynaa KOfltT: 



if ( Interlocked. CompareExchange ( ref disposed, 

TRUE, FALSE) == TRUE) 
{ 



return; 



} 



e eKBMBa/ieHTeH Ha c/ieflHi/m koa npn npw/io>i<eHMe 6e3 noAAPt>KKa Ha 
mhoto hmujkm: 



if (disposed) 
{ 



return; 



} 

disposed = true; 



B/iM3aHeTO b ntpBMfl try...finaiiy 6/iok e 3aA"b/i>KMTe^HO 3a j\a ce 
npeAna3MM ot npeicbCBaHe Ha HMUJKaTa ot M3BMKBaHeTO Ha MeTOAMTe 

13 

Thread. Abort M/1M Thread . Interrupt 



12 MMn^eMeHTaUMflTa Ha CompareExchange ( ) M3nO/13Ba Cneukia/IHa MHCTpyK- 

\\v\s\ c npecpMKC Ha npouecopnTe Ha Intel (lock cmpxchg) nopaAM KoeTO 
pa6oTM mhoto 6"bp30 

13 floBene MHCpopMaunfl me HaMepnTe b MaBa 16 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 713 

06BMBaHe Ha ynpaB/ineaH pecypc - npHMep 

3a fla oueHMTe zieKcrraTa Ha ki3no/i3BaHe Ha K/iaca ResourceWrapperBase me 
ro npw/ic»KkiM, 3a fla o6BneM MaHMny/iaTop Ha fli/maMMUHa 6w6/iMOTeKa v\ 
MKOHa b c/ieflBamkifl npuMep: 



class WindowsLibrary : ResourceWrapperBase 

{ 

private IntPtr mLibraryHandle = IntPtr . Zero; 

public WindowsLibrary ( string aFileName) 

{ 

mLibraryHandle = LoadLibrary (aFileName) ; 

Console .WriteLine ( "Library {0} loaded.", aFileName); 
} 

public IntPtr Handle 

{ 

get 

{ 

return mLibraryHandle; 

} 
} 

protected override void DisposeUnmanagedResources ( ) 

{ 

if (mLibraryHandle != IntPtr. Zero) 

{ 

FreeLibrary (mLibraryHandle) ; 

mLibraryHandle = IntPtr. Zero; 

Console .WriteLine ( "Library unloaded. " ) ; 

} 

base . DisposeUnmanagedResources ( ) ; 

} 

[Dll Import ("kernel 32 . dll", SetLastError=true) ] 
static extern IntPtr LoadLibrary ( string lpFileName); 



[Dll Import ("kernel 32 .dll", SetLastError=true) ] 
static extern int FreeLibrary ( IntPtr hModule); 



} 



class Windowslcon : ResourceWrapperBase 

{ 

private Icon mlcon; 

public Windowslcon ( string aFile, int alconld) 

{ 

using (WindowsLibrary lib = new WindowsLibrary (aFile) 

{ 

IntPtr hlcon = Loadlcon (lib . Handle, alconld); 



714 flporpaMnpaHe 3a .NET Framework (tom 2) 



mlcon = Icon . FromHandle (hlcon) ; 

} 

Console .WriteLine ( "Icon {0} loaded from library {1}.", 
alconld, aFileName); 
} 

protected override void DisposeManagedResources ( ) 

{ 

if (mlcon != null) 

{ 

mlcon . Dispose ( ) ; 

Console .WriteLine ( "Icon disposed. " ) ; 
} 
} 

public Icon Icon 

{ 

get 

{ 

return mlcon; 

} 
} 

[Dll Import ("user 32 . dll", SetLastError=true) ] 
public static extern IntPtr Loadlcon ( IntPtr hlnstance, 
int lplconld) ; 



} 



class IDisposableDemo 

{ 

static void Main ( ) 

{ 

const int FIRST_EXPLORER_ICON = 101; 
Windowslcon explorerlcon = 

new Windowslcon ( "explorer . exe " , FIRST_EXPLORER_ICON) 
using (explorerlcon) 

{ 

using (Form form = new Form ( ) ) 

{ 

form. Text = "IDisposable Demo"; 
form. Icon = explorerlcon . Icon; 
form. ShowDialog ( ) ; 
} 
} 
Console .WriteLine ( "End of Main ( ) method."); 

} 
} 



flpn M3n"b/iHeHkie Ha ropi-ma npuMep ce no^y4aBa cneRHwn pe3y^TaT: 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 715 




Bn>Kfla ce, ne npuMeptT 3ape>Kfla m M3no/i3Ba HeynpaB/iflBaHkiTe pecypcn 
"Windows 6ki6/ii/iOTei<a" v\ "Windows MKOHa" v\ vv\ ocBo6o>KflaBa eKcn/iwui/iTHO 
npe3 using KOHCTpyKUMflTa. E/iaroAapeHkie Ha Hac/ieAflBaHeTO Ha K/iaca 
ResourceWrapperBase Aopn aKO Te3M pecypcw He ce OCB06o>KAaBaxa eKcn/iw- 
Umtho, Te m*ixa Aa 6"bAaT ocbo6oa6hm ot cpnHa^M3aTopnTe Ha cbOTBeTHMTe mm 
o6BMBaiun K/iacoBe. 



Close() m eKcnjiiiuiiTHa MMnneMeHTaqMa Ha 
IDisposable 

B HflKOM npn^o>KHM o6/iacâ„¢ eAHM TepMMHM "3BynaT no-Ao6pe" ot no-o6o6iue- 
HMTe TaKMBa. Oaw/iOBeTe, noTOui/ue v\ Bp"b3KMTe kbm 6a3M ashhm vv\ 3aTBap*iMe 
(Close), 3aK^K)4BaHMflTa (lock) vv\ ocBo6o>KAaBaMe (Release) 1/1 t.h. 

B eAHM ot Haki-no^3BaHMTe aceM6/iMTa b .NET Framework 1.1 (system.dll, 
System.Data.dll, System.Drawing.dll, System.WindowsForms.dll M 
system.web.dll) MMa o6mo 242 K/iacoBe v\/v\i\v\ CTpyKTypn, MMn/ieMeHTwpami/i 
IDisposable ot komto 32 ro MMn^eMeHTupaT eKcn/inu.nTHO (craBa Btnpoc 3a 
Bepcufl 1.1 Ha .NET Framework). 

noc/ieAHMTe M3BMKBaT (HeBMAMMMfl ot Visual Studio IntelliSense mctoa) 

Dispose () OT ny6/lMHHMfl CM MeTOA Close (). 
flpuMep: 



public class File : IDisposable 

{ 

// EKcnjiwuMTHa HMnneMeHTaiiMfl Ha MHTep^ewca IDisposable 
void IDisposable .Dispose ( ) 

{ 



// 



} 



// Ilpeo6pa3yBaHeTO jcbm IDisposable e HajioacMTejiHO 

public void Close ( ) 

{ 



716 flporpaMnpaHe 3a .NET Framework (tom 2) 




K/iacoBe KaTO File MoraT p,a 6"bAaT yHMiuo>KeHM HaAe>KAHO no ABa HanwHa - 
KaTO ce o6Bne i/i3no/i3BaHeTO Ha o6eKTa b try. ..finally 6/iok v\i\v\ KaTO ce 
M3no/i3Ba onepaTopa using (b C#). Ha npaKTMKa, 60/ilumhctboto ot C# 
nporpaMMCTMTe npuBMKBaT kbm m npeAnoni/uaT onepaTopa using, eTO 3aiuo 
HanncBaHeTO Ha noAo6eH Ha close o MeTOA ot Baiua CTpaHa /ii/iuho Hue 
cnwTaMe 3a v\3i\v\uiuo. 

Kora fla M3BMKBaMe IDisposable.Dispose()? 

Ha Btnpoca 3a ocBo6o>KAaBaHeTO Ha kom pecypcn Tpa6Ba p,a ce rpn>KMM 

P"b4HO Hpe3 M3BMKBaHe Ha IDisposable. Dispose () HflMa npocT OTrOBOp. 

npaBM^OTO e, ne ptuHO Tpa6Ba p,a ce ocBo6o>KAaBaT bcmukm K/iacoBe, komto 
o6BMBaT HeynpaB^flBaH pecypc v\ MMn/ieMeHTi/ipaT IDisposable. 

HanpMMep K/iaCbT FileStream MMn/ieMeHTkipa IDisposable M o6BMBa Heyn- 

paB^ABaHMfl pecypc "cpaw/T. C/ieAOBaTe/iHO tom Tpa6Ba p,a ce ocBo6o>KAaBa 

P"b4HO 4pe3 using KOHCTpyKUMflTa V\I\V\ npe3 try ... finally 6/lOK. K/iaCbT 
StringReader CbLUO MMn/ieMeHTMpa IDisposable, HO HflMa Hy>KAa Rd 6"bAe 

ocBo6o>KAaBaH ptuHO, 3aiuoTO He A"bp>KM b ce6e cm HeynpaB/iflBaH pecypc. 

KoraTO no/i3BaTe AaAeH K/iac ot .NET Framework v\nv\ ot Apyra 6w6/iMOTeKa, 
Tpa6Ba Aa npoBepnTe p,anw tom kiMn/ieMeHTkipa IDisposable v\ Aa noMkic/iMTe 
Aa/iw tom o6BMBa HeynpaB/iflBaH pecypc. Ako ce cbMHABaTe, ocBo6o>KAaBaMTe 
pecypca ptuHO. ToBa HHMa Aa HaBpeAM. 

B3anMOfleMCTBne ci>c CMCTeMaTa 3a nomicTBaHe Ha 
naMerra 

HaMnpaM /iMncara m Ha Bzpa o6e3noKOMrenHa. 

flapr Beftjrbp 

.NET Framework npeA.nara cpeACTBa 3a B3anMOAeMCTBne etc ci/icreMaTa 3a 
nonwcTBaHe Ha naMeira (garbage collector). B3anMOAeMCTBneTO ce ocbiuecT- 
BflBa c noMOurra Ha craTMUHi/iTe ny6/ii/mHi/i MeTOAM Ha K/iaca gc, hhkoi/i ot 
komto me pa3r/ieAaMe b Ta3M TOUKa. 

noHMCTBaHe Ha naMeTTa 

MoxeM Aa npeAH3BMKaMe crapTwpaHeTO Ha nonwcrBaHeTO Ha naMeira c 

M3BMKBaHeTO Ha MeTOAa GC.Collect() . M3BMKBaHeTO Ha T031/I MeTOA 6e3 

napaMeTpn npeAM3BMKBa irb/iHO nonwcrBaHe Ha bcmukm noKO/ieHkifl naMeT. 
M3BMKBaHeTO Ha overload BapnaHTa Ha cbiuna MeTOA c apryMeHT HOMep Ha 
noKO/ieHne, npeAH3BMKBa nonwcTBaHe Ha bcmukm noKO/ieHMfl, 3ano4BaMKM ot 
ao yKa3aHOTO. 



T/iaBa 24. ynpaBJiemie Ha naMerra v\ pecypcuTe 717 

noMorHeTe Ha GC KaTO He m noMaraTe 

KaTO npaBki/io (KoeTO KaKTO me BMflMTe no-HaTarbK cm MMa i/i3K/iK>neHi/ifl) ce 
crapaMTe fla He noMaraTe Ha cwcreMaTa 3a nonkicmaHe Ha naMerra. Ta e 
"npon3BefleHne Ha M3KycTBOTo", BHMMaTe/iHO npoeKTupaHa TaKa, ne fla rapaH- 
Tupa BucoKa ecpeKTMBHOCT npn pa3/ikmeH pofl npn^o>KeHMfl. OcBeH TOBa, GC 
ce caMOHacTpoMBa KaTO c/ieflw noBefleHweTO Ha 3afle/i*iHe Ha naMeT Ha BaiueTO 
npn^OKeHne. 

Ako rpw>K/ii/iBO npoeKTupaTe npn^OKeHneTO cm, HAMa fla MMa Hy>Kfla fla 
Muc^MTe 3a GC, ho aKO cm Mwc/iMTe, ne ce Hy>KflaeTe fla npeflM3BMKaTe 
no^MCTBaHe, 3Hanw Heiuo ce e o6"bpi<a/io. Tpa6Ba fla ce 3annTaTe KaKBO CTe 
HanpaBM^n, ne e Hy>KHO fla npeflM3BMKaTe nonwcrBaHe v\ ot KaKBO tohho 
no^MCTBaHe ce Hy>KflaeTe - Ha noKO/ieHkie 0, 1 v\nv\ 2? 

Ako tohho cera ce Hy>KAaeTe ot nonncTBaHe Ha noKO/ieHwe 

no4MCTBaHeTO Ha noKO/ieHwe ce cnyHBa flocrarbUHO necro v\ e cpaBHi/iTe/iHO 
"eBTMHo". GC M3no/i3Ba TeMnoTO c Koero 3afle/i*iTe naMeT v\ ro/ieMkmaTa Ha 
Kewa Ha npouecopnTe bm 3a fla onpefle/ii/i ko/iko naMeT fla bm no3BO.ni/i fla 
3afle^MTe npeflu fla CTaHe M3roflHO fla nonkicâ„¢ noKO/ieHkie 0. Ako npuHyflUTe 
GC fla nonkicâ„¢ naMerra npeflu HacrbnBaHeTO Ha to3m MOMeHT e B"b3MO>KHO fla 
My flafleTe npeKa/ieHO Ma/iKO BpeMeBM MHTepBa/i, 3a fla onpefle/ii/i pa3Mepa Ha 
3afle^eHaTa naMeT, Heo6xoflMMa 3a c/ieflBamoTO noni/iCTBaHe v\ b Kpai/ma 
CMeTKa fla ce OKaweTe c noBene nonncTBaHi/m Ha noKO/ieHne ot ko/ikoto ce 
Hy>KflaeTe. Tbfi KaTO pa3Mepi>T Ha naMerra Ha noKO/ieHkie TaKa v\nv\ kiHane 
He CTaBa npeKa/ieHO to/iam, Haw-flo6pe e fla ocraBMTe GC fla M3B"bpujBa 
aBTOMaTM^HO noHkicmaHeTO, KaKTO npeueHM 3a Haw-flo6pe. Ako Ha6/iK>flaBaTe 
cpeflHO 1 nonncTBaHe Ha noKO/ieHi/ie b ceKyHfla, bcmhko e Hapefl. 

Ako tohho cera ce Hy>KAaeTe ot noHMCTBaHe Ha noKO/ieHwe 1 

ntpBMflT npo6/ieM e, He gc. collect o He o6eiuaBa nonwcTBaHe Ha o6eKTM ot 
noKO/ieHne 1. CneflBami/m npo6/ieM e, He 3a fla 3HaeTe pa3Mepa Ha noKO/ieHwe 
1 (i/mane 3a KaKBO bm e fla ro nonwcTBaTe) Tpa6Ba fla Ha6/iK>flaBaTe TeMnoTO 
Ha oue^ABaHe Ha o6eKTMTe ot noKO/ieHi/ie 0, TaKa ne b KpaMHa CMeTKa e flocra 
c/io>kho fla pa36epeTe fla/iw HancTMHa ce Hy>KflaeTe ot noni/iCTBaHe Ha 
noKO/ieHne 1. rioc/ieflHi/iflT npo6/ieM e, ne noKO/ieHkie 1 e cbu\o cpaBHMTe/iHO 
"eBTMHo" 3a nonncTBaHe ot GC (BtnpeKM, ne e no-CKbno ot noKO/ieHkie 0, Tbv\ 
KaTO ro BK^K)4Ba b ce6e cm) m othobo e 6e3CMwc/ieHO b noBeneTO c/iynaw fla 
npeflM3BMKaTe GC fla ro nonHcm. 

Be3 fla ce BnycKaMe b noBene noflpo6HOCTM, aKO ce Hy>KflaeTe ot nonkicmaHe 
Ha noKO/ieHne 1, He ro npeflM3BMKBaMTe. BMecTO TOBa BM>KTe fla/iw He MO>Ke 
fla npoMeHMTe KOfla v\nv\ a/iropwTMkiTe, komto ki3no/i3BaTe, TaKa ne fla Hanpa- 
BMTe o6eKTMTe HeflocTM>KMMM ko/ikoto e B"b3MO>KHO no-6"bp30. BaiuaTa ue/i e 
fla HanpaBMTe no-flt/iro >KMBeeiunTe o6eKTM fla craHaT etc cpeflHa npoflt/iww- 
Te/iHOcr Ha >kmbot, a noc^eflHMTe c KpaTKa, c^efl KoeTO MO>Ke fla cnpeTe fla ce 
TpeBO>KMTe 3a noKO/ieHne 1. C/iefl KaTO o6eKTMTe bm Be^e ca b noKO/ieHi/ie 0, 
KaKTO caMM CTe ce yBepw/iw, H^Ma Hy>Kfla fla npeflM3BMKBaTe GC m3o6luo. Ako 



718 nporpaMnpaHe 3a .NET Framework (tom 2) 

Ha6/iK>flaBaTe eflHO nonwcTBaHe Ha noKO/ieHkie 1 cpeflHO Ha fleceTMHa 
ceKyHflu, bcm4ko e Hapefl. 

Ako tohho cera ce Hy>KAaeTe ot noHMCTBaHe Ha noKO/ieHwe 2 

rionMCTBaHeTO Ha noKO/ieHwe 2 03HanaBa ua/ioctho nonwcTBaHe Ha naMeTTa, 
cneflOBaTe/iHO e 3Hani/iTe/iHO no-CKbno ot TOBa Ha noKO/ieHkia 1 m 2. Othobo, 
MMaMTe npeflBMfl, ne Gc.coiiect(2) He bm o6eiuaBa nonwcTBaHe Ha noKO/ie- 
Hue 2. Ako cm Mwc/ii/iTe, ne MMaTe Hy>Kfla ot nonwcTBaHe Ha noKO/ieHne 2, 
3Ha4M AH3awHa Ha npki/io>KeHMeTO bm ce Hy>Kflae ot maTe/ieH nper/iefl. 

Ako Ha6/iK>AaBaTe nonwcTBaHe Ha noKO/ieHwe 2 Ha 100 ceKyHflki, bci/iuko e 
Hapefl. 

Kora MO>Ke na noMorHeTe Ha GC? 

1/lMa CMkicb/i fla M3BMKaTe gc. collect o aKO HAKoe, HenoBTapaiflo ce necro 
ct6nTne ce e cnynw/io TOKy-iuo v\ TOBa cb6kiTi/ie e flonpi/mec/io 3a CMtprra Ha 
mhoto CTapn o6eKTM. 

K/iacwuecKM npuMep 3a TOBa e aKO nuiueTe desktop npM/io>KeHMe i/i npeflo- 
CTaBMTe Ha noTpe6wTe/ifl ro/isiMa v\ c/io>KHa cpopMa, acounnpaHa c mhoto 
flaHHM b Hea. rioTpe6kiTe/iflT e Cb3fla/i c noMOurra Ha Ta3M cpopMa to/iam XML 
v\nv\ eflMH v\nv\ noBene Dataset o6eKTa. KoraTO cpopMaTa ce 3aTBopn, Te3M 
o6eKTM ca mbptbm m gc collect () me ocBo6ofln naMeira mm. 

BtnpeKM, ne ci/icreMaTa 3a noni/icrBaHe Ha naMeira e caMOHacrpoMBama, ta He 
MO>Ke fla npeflBMflu a6co/iK>THO BceKM Lua6/iOH 3a 3a,qe/iflHe Ha naMeT v\ b 
ropHMfl cnynaw Haw-BepoflTHO H^Ma fla ycnee fla npeflBMflu, ne yMnpaT mhoto 
o6eKTM ot noKO/ieHkie 2 (o6eKTMTe ot noKO/ieHne h 1 me ca c ro/iHMa 
BepoflTHOCT Bene nonwcreHki). CaMO o6eKTMTe, komto ntpBOHana/iHO ca CBtp- 
3aHM c cpopMaTa me npeMi/maT b noKO/ieHkie 2. B to3m momcht e mhoto flo6pe 
ot MeflHa TOUKa Ha npoi/i3BOflMTe/iHOCTTa fla ce M3BMKa nonwcrBaHe Ha 
noKO/ieHne 2. 

TaKa ne, KoraTO HenoBTapaiuo cb6kiTi/ie, BK/uonBamo CMtpira Ha mhoto 
o6eKTM ce cnynw (HanpuMep npn 3aB"bpujBaHe Ha kiHkmi/ia/iw3auwfl Ha 
npn^o>KeHMeTO v\nv\ npn 3aTBapaHeTO Ha to/iam flkia/ioroB npo3opeu) MO>Ke fla 
BMtKHeTe gc collect o 3a fla ocBo6oflMTe naMeTTa. He to npaBeTe, aKO 
o6eKTMTe He ca mhoto. 

MMawTe npeflBMfl, ne Microsoft HacrpowBaT cwcreMaTa 3a nonwcrBaHe Ha 
naMeTTa Bee noBene v\ noBene v\ b cneflBamaTa v\ Bepcua e B"b3MO>KHO BaiunTe 
M3BMKBaHMfl KbM gc . collect ( ) fla nonpenaT Ha GC fla pa6oTM ecpeKTMBHO 
BMecTO fla noMOTHaT. Eto 3aiuo e flo6pa v\p,es\ fla vv\ o6rtpHeTe b yc/iOBeH 
MeTOfl, HanpuMep: 



#define HELP_GC 

public sealed class GCHelper 
{ 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 719 



[Conditional ("HELP_GC") ] 
public static void Collect 

{ 

GC. Collect ( ) ; 

} 

private GCHelper ( ) { } 

} 



B npMMepa ce M3nO/13Ba aTpkl6yTbT System. Diagnostics. Conditional, C 

komto ce yKa3Ba, ne MeTOfltT collect () Ha K/iaca GCHelper e yc/iOBeH MeTOA 
m cbiuecTByBa caMO aKO e AecpMHupaH cmmbo/ibt help_gc no BpeMe Ha KOMnn- 
/iaui/m. B npoTMBeH cnynaw MeTOAtT i/i3ne3Ba 3aeAHO c bcmukm M3BMKBaHMfl 
KtM Hero. 

<t>MHa/iM3aTopnTe yBe/innaBaT >KMBOTa Ha o6eKTMTe 

B C++ e o6iuonpneTO p,a ce ki3no/i3BaT AecTpyKTopn, 3a p,a ce ocBo6o>KAaBa 
naMeT v\nv\ no-o6mo pecypcu. KaKTO Bene 3HaeTe, cpkiHa/iki3aTopwTe He ca 
AecrpyKTopi/i, TaKa ne ioto i/i3k/ikdhi/im o6rp"biuaHeTO Ha HeynpaB/iflBaH 
pecypc, BaujMTe K/iacoBe He ce Hy>KAaflT ot cpkiHa/iki3aTop. GC me nonwcâ„¢ 
6oK/iyKa ot n/ieHOBeTe Ha Bawi/ia "MtpTbB" o6eKT 6e3 p,a e Hy>KHO p,a mm 
3aAaAeTe ctomhoct null. MMa CMkicb/i p,a npucBOMTe null Ha nacr ot 
n/ieHOBeTe Ha Tuna cm, caMO aKO MCKaTe Te p,a 6"bAaT noni/icreHi/i AOKaTO 
o6eKTbT bm e Bee oiue ">kmb". 



& 



flecpMHupaiiTe C|jMHa/lM3aTOp caMO SKO K/iaCbT bm o6rpt>ma 
HeynpaB/inBaH pecypc! 



Ako cnyna*i He e TaicbB, Bue npocTO He ce Hy>KAaeTe ot cpkiHa/iki3aTop. 
flo6aBAHeTO Ha TaicbB etc curypHOCT M3npaiua o6eKTMTe ot Baujua K/iac b no- 
ropHO noKO/ieHwe v\ yBe/iwuaBa pa6oTaTa Ha ci/icreMaTa 3a nonwcrBaHe Ha 
naMeTTa. 

klMn/ieMeHTMpaMTe IDisposable 6e3 cpMHa/iM3aTop 

KoraTO 3HaeTe, ne to3m, komto me no/i3Ba K/iaca ere Bue, v\ ne HflMa p,a 
3a6paBMTe p,a M3BMKaTe Dispose o Ao6aBeTe cpMHa/iM3aTop caMO 3a DEBUG 
KOMnw/iauwfl 3a p,a ere curypHM, ne BrnoTe Dispose () HaBcaicbAe, KtAeTO e 
Heo6xoAMMo: 



class SomeDisposable : IDisposable 

{ 

#if DEBUG // OMHajiM3aTop r bT CBmecTByBa caMO b DEBUG build 
~SomeDisposable ( ) 

{ 

Debug .Assert (mDisposed, "Dispose wasn't called!"); 

} 
#endif 

public void Dispose () 



720 flporpaMnpaHe 3a .NET Framework (tom 2) 





{ 

// ... MMnneMeHTaiiMH 






mDisposed = true; 






GC . SuppressFinalize ( this ) ; // 
} 


bvlx no-flojiy 


} 


private bool mDisposed = false; 





3a cbwa/iem/ie, ropHaTa TexHMKa He hocm MHCpopMauna kom v\ Kbfle e 3a6pa- 
bm/i fla M3BMKa Dispose (). Ako o6ane no/i3BaTe peflOBHO onepaTopa using, 
HflMa fla bm ce Ha/io>Kki fla TtpcuTe bmhobhma koa. 

noTMCKaHe Ha $MHajiM3aLiM$iTa 

KaKTO Bene BMflaxTe b npuMepHaTa MMn/ieMeHTaukifl Ha 6a30B K/iac, npeflocra- 
Bfliu cpMHa/iM3aTop m MMn/ieMeHTauwfl Ha iDisposabie, c/iefl M3BMKBaHeTO Ha 
MeTOfla Dispose o e flo6pe (MaKap v\ He3afl"b/i>KkiTe/iHo) fla noTMCHeTe cpkma- 
/ii/i3aui/mTa KaTO onTi/iMi/i3aui/ifl. noTucKaHeTO Ha cpi/iHa/ii/i3aui/ifl ce M3BtpujBa c 
noMOiflTa Ha MeTOfla gc. SuppressFinalize (...) , komto npweMa KaTO napaMe- 
Ttp MHCTaHunfl Ha Tun. UeHaTa 3a M3BMKBaHe Ha to3m MeTOfl e npocTO npoMfl- 
HaTa Ha 1 6mt b 3ar/iaBHaTa nacr Ha o6eKTa. 

ll3HaKBaHe ao npuK/iiOHBaHe Ha 4>MHasiM3aiJiMflTa 

Ako MMaTe cnynai/i, b komto ere noMorHa/iw Ha GC, KaTO ere M3BHKa/in 
gc. collect () , MOxeTe fla noMorHeTe oiue Ma/iKO, KaTO M3BMKaTe MeTOfla 

GC.WaitForPendingFinalizersO . M3BMKBaHeTO Ha T03M MeTOfl Lfle npMHyflM 

GC fla o6pa6oTM bcmukm cpnHa^M3aTopn Ha MapKupaHMTe 3a cpMHa/in3aunfl 
o6eKTM ot M3BMKBaHeTO Ha Gc.coiiecto . flo6paTa HOBMHa e, ne no to3m 
Ha^MH HeynpaB^flBaHMTe pecypcn, o6bmtm b noni/icreHkiTe o6eKTM me 6tflaT 
yHMiuo>KeHM (pecypcuTe ebiuo 3aeMaT naMeT). /lowaTa e, ne me bm e Heo6- 
xoflMMO noBene BpeMe 3a fla npkiK/iionki cpkiHa/iki3aukiflTa mm. 06luo B3eTO, aKO 
e Haerbni/i/i flo6"bp momcht 3a npeflM3BMKBaHeTO Ha irb/iHO nonwcrBaHe, Bkie 6m 
Tpyi6Ba/io fla CTe ck/iohhi/i fla OTfle/ii/iTe TOBa BpeMe. 

PerHCTpnpaHe Ha o6eKTa 3a 4>MHa/iM3auiMq 

Ako nopaflu H^KaKBa npn^MHa CTe npeMaxHa/iw o6eKTa cm ot onawKaTa 3a 
cpMHa^M3npaHe (M3BMKBaMKM gc. SuppressFinalize (...) ), MO>Ke fla ro flo6a- 

BMTe OTHOBO, KaTO M3BklKaTe GC . ReRegisterForFinalize (...) . EflMHCTBeHaTa 

CMkicneHa ynoTpe6a Ha to3m MeTOfl e fla cb>KMBMTe o6eKTa, komto ce cpMHa/iki- 

3Mpa B MOMeHTa, M3BklKBaMKkl GC. ReRegisterForFinalize (this) . TOBa MO>Ke 

fla ce Ha^o>KM fla HanpaBMTe aKO no BpeMe Ha cpMHa/in3aunfl K/iacbT bm He 
yenee fla ce cpkiHa/iki3kipa ycneujHO v\ MMa Hy>Kfla fla onuTa naK cnep, i/i3Becmo 
BpeMe. 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 721 

Onpefle/inHe noKO/iemieTO Ha o6eKT 

B cnynaw, ne ere pewki/iki fla npeflM3BMKaTe nonwcTBaHe Ha naMerra, MO>Ke fla 
onpeAe/iMTe b Koe noKO/ieHwe ce HaMnpaT o6eKTMTe, komto MCKaTe p,a noni/ic- 
TMTe, 3a fla M3BMKaTe gc. collect o ao TOBa noKO/ieHkie. M3BMKBaHeTO Ha 
GC . GetGeneration (object) BM Bptlfla nOKO/ieHkieTO Ha o6eKTa. Ako Hanpw- 
Mep ere peujw/iki fla nonkicrwTe o6eKT v\ o6eKTMTe ot HeroBOTO noKO/ieHkie (m 
Haflo^y flo noKO/ieHne 0), ki3no/i3BawTe c/ieflHWfl koa: 



public sealed class GCHelper 

{ 

public static void CollectOb j ectGeneration (ob j ect ob j ) 

{ 

if (obj != null) 

{ 

GC. Collect (GC. GetGeneration (obj ) ) ; 

} 
} 
} 



MaKCkiMa/iHOTO noKO/ieHwe b flafleH MOMeHT MO>Ke fla no/iynwTe ioto M3BMKaTe 

CBOMCTBOTO GC .MaxGeneration ( ) . 

Pinning 

Ahmmmckmat r/iaro/i pin 03HanaBa 3a6o>KflaM, npuKOBaBaM, npnTMCKaM (o6mk- 
HOBeHO c Ton/iMMKa/Kapcpkiua). B KOHTeKCTa Ha B3anMOfleMCTBne etc ewere- 
MaTa 3a nonwcTBaHe Ha naMeTTa, 3a6o>KflaHeTO Ha o6eKT 03HanaBa fla He no3- 
BO/iMTe Ha GC 3a i/i3Becmo BpeMe fla MecTM o6eKTa Ha flpyro macto b naMerra 
(KoeTO o6nKHOBeHO ce cnyuBa npn cb6npaHe Ha 6oK/iyKa Ha noKO/ieHneTO, b 
Koero ">KMBee" o6eKTa). B to3m TeKcr me i/i3no/i3BaMe flyMaTa pinning. 

Pinning npw/ikma Ma/iKO Ha cpMHa/iM3aukiflTa no roBa, ne v\ flBeTe cbiuecTByBaT, 
3aiuoTO hm ce Ha/iara fla pa6oTMM c HeynpaB/iflBaH (native) koa. 

Kora e Heo6xoAHM pinning? 

06eKTMTe ce pin-BaT no Tpn npn^MHn: 

- npn Cb3flaBaHe Ha MHCTaHUMfl Ha K/iaca GCHandle C Tkin GCHandleType . 

pinned (KoeTO eflBa nv\ me bm ce Ha/io>Ki/i fla ki3no/i3BaTe); 

- npn M3no^3BaHe Ha K/iK>noBara flyMa fixed b C# {v\i\v\ pin b Managed 

C+ + ); 

- no BpeMe Ha B3anMOfleMCTBne c HeynpaB/iHBaH koa (Interop), hakom 
apryMeHTM ce pin-BaT ot Interop (HanpuMep, 3a p,a ce noAaAe o6eKT 
string KaTO lpwstr, Interop pin-Ba 6ycpepa no BpeMe Ha ki3n"b/iHeHkiero 

M3BMKaHaTa CpyHKUMfl). 

3a o6eKTMTe ot Ma/iKkifl xi/iwn (noKO/ieHi/ia 0, 1 h 2), TexHMKaTa "pinning" e 
eAMHCTBeHMAT HanwH noTpe6MTe/i*iT p,a yenee p,a cppameHTkipa xnkina. 



722 nporpaMnpaHe 3a .NET Framework (tom 2) 

3a 6/iOKa ot naMeT 3a ro/ieMki o6eKTM (LOH), pinning b MOMeHTa e HyneBa 
onepaunfl, tbm KaTO b HacToaiuaTa kiMn/ieMeHTauwfl Ha Garbage Collector, 
o6eKTMTe b LOH He ce npeHape>KAaT, iokto npn noKO/ieHi/m ot ao 2. 
Pa36npa ce, TOBa e i/iMn/ieMeHTauwoHeH fleTaw/i, Ha komto He 6nBa fla 
pa34MTaTe. 

kl3no/i3BaMTe pinning BHMMaTesiHO 

OparMeHTupaHeTO Ha xnwna e /ioluo. To Kapa GC fla pa6oTM no-ycbpflHO, KaTO 
BMecTO npocTO fla "npeue>Kfla" flocrbnHi/iTe o6eKTM, cera Tpa6Ba fla 3anoMHM 
kom ">kmbm" o6eKTM ca pin-HaTM v\ fla ce onuTBa fla BMtKBa o6eKTM b 
CBo6oflHMTe MecTa Me>Kfly pin-HaTMTe o6eKTM. 

KoraTO bm ce Ha/iara fla pin-HeTe o6eKT, MMaMTe npeflBMfl cneflHOTo: 

- Ako ro HanpaBMTe 3a KpaTKO BpeMe, onepaunaTa e "eBTMHa". KaK MO>Ke 
fla npeueHMTe KaKBO e KpaTKO BpeMe? Ako no BpeMe Ha pinning He ce 
c/iyuBa Cb6npaHe Ha 6oK/iyKa, onepaunaTa npocTO Bflura 6mt b 3ar/iaB- 
HaTa nacr Ha o6eKTa v\ cnep, npwK/iionBaHeTO cm ro CBa/ia. Ho aKO no 
TOBa BpeMe ce 3aflewcTBa GC "3a6ofleHMTe" o6eKTM He Tpa6Ba fla ce 
MecrflT. CneflOBaTe/iHO "KpaTKO BpeMe" e BpeMeTO, npe3 KoeTO GC He 
3a6e/isi3Ba, ne o6eKT e pin-HaT. ToBa 03HanaBa, ne flOKaTO pin-BaTe 
o6eKTM He Tpa6Ba fla ce cnynBaT HMKaKBM v\nv\ nonTki HMKaKBM 3afle/i*i- 
HMfl Ha naMeT (komto MHane 6nxa momm fla npeflM3BMKaT HyxflaTa ot 
no4MCTBaHe Ha 6oK/iyK). 

- Ako Bee naK necro bm ce Ha/iara fla pa6oTMTe c 6ycpepn, komto fla pin- 
HeTe, npeflu fla vv\ noflafleTe KaTO napaMeTpn Ha Interop cpyHKunn 
HanpuMep, MO>KeTe fla ct3flafleTe ny/i ot 6ycpepn v\ fla npeflM3BMKaTe GC 
TaKa, ne o6eKTMTe fla Mi/maT b noKO/ieHkie 2. TbM KaTO o6eKTMTe ot 
noKO/ieHkie 2 ce npeHape>KflaT flocTa no-paflKO (a Te3M b LOH m3o6luo He 
ce npeHape>KflaT), me HaHeceTe mhoto no-Ma/iKa "Bpefla" Ha GC. 

Y/Vb/iwaBaiie wiiBOTa Ha npoMei-miiBiiTe npii Interop 

HeKa MMaMe K/iac, komto o6BMBa MaHkinynaTop kbm HeynpaB/iflBaH pecypc v\ 
cbiuo TaKa MeTOfl, komto Bptiua flpyr MaHkinynaTop, i/i3no/i3BaMKM ntpBua: 



class ResourceWrapper : IDisposable 

{ 

IntPtr hRes; 

public IntPtr Method ( ) 

{ 

return SomelnteropFunction (hRes ) ; 

} 

~ResourceWrapper ( ) { ... } 

} 



HeKa cera cm npeflcraBMM, <~\e Tpa6Ba fla M3BMKaMe cpyHKuna npe3 Interop, 
koato npneMa TaKbB MaHkinynaTop KaTO napaMeTbp: 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 723 



public void SomeMethod 

{ 

using (ResourceWrapper rw = new ResourceWrappen 

{ 

PInvokeHelper . I nvokeLib Function ( rw. Method ( ) ) 

} 
} 



Ha np"bB nor/iefl HeiuaTa M3Me)KflaT flo6pe v\ Bue MO>Ke 6m cm MMC/iMTe, <Ae 
npoMeH^MBaTa rw e ">KMBa" ro 3aTBapaiuaTa CKo6a Ha onepaTop using. 
TpeiuKaTa e b TOBa, ne npeAM p,a ce M3BMKa invokeLibFunction ce M34MC- 
nnBaj HeMHMTe napaMeTpM, a mmshho MaHMny/iaTopvr, komto onaKBa. Eto 
3aiuo KOfltT b fleMCTBMTe/iHOcr 6m M3r/ie>Kfla/i TaKa: 



public void SomeMethod 

{ 

using (ResourceWrapper rw = new ResourceWrapper () ) 

{ 

IntPtr h = rw. Method () ; 

PInvokeHelper. InvokeLibFunction (h) ; 
} 
} 



HeKa He 3a6paBAMe, ne BCbiuHOCT onepaToptT using e caMO "cMHTaKTMUHa 
3axap" m KOfltT b AeMCTBMTe/iHOcr e Heiuo TaKOBa: 



public void SomeMethod 

{ 

ResourceWrapper rw = new ResourceWrapper ( ) 
try 

{ 

IntPtr h = rw. Method () ; 
PInvokeHelper. InvokeLibFunction (h) ; 

} 
finally 

{ 

( ( I Disposable ) rw) . Dispose () ; 

} 
} 



EcrecrBeHO KOMnM/iaTop"bT, iokto m JIT KOMnM/iaTop"bT MoraT fla npeueHAT, ne 

T"bM KaTO pe3y^TaT"bT OT M3BMKBaHeTO Ha rw.Method() e npOCT CTOMHOCTeH 

TMn (intPtr npocro o6BMBa eAMH int), pecpepeHUM^Ta kbm rw cnep, 
M3BMKBaHeTO Ha T03M MeTOA e HeHy>KHa, c/ieAOBaTe/iHO roTOBa 3a cb6MpaHe ot 
GC (TOBa HflMawe fla ce cnyuM, aKO npocTO BptiuaxMe hRes ot MeTOfla, ho HMe 

BptmaMe HOB MaHMny/iaTOp, K"bM KOMTO K/iaCbT ResourceWrapper HflMa 

pecpepeHUMfl). Koa^t b to3m cnynai/i 6m Morb/i p,a ce npeHapeAM no cneRHwn 
Ha^MH: 



724 flporpaMnpaHe 3a .NET Framework (tom 2) 



public void SomeMethod 

{ 

ResourceWrapper rw = new ResourceWrapper ( ) ; 

IntPtr h = IntPtr . Zero; 

try 

{ 

h = rw. Method ( ) ; 

} 
finally 

{ 

( ( I Disposable ) rw) . Dispose () ; 

} 

// TyK o6eKT"BT Be^e e yHMmoaceH 
PInvokeHelper . InvokeLibFunction (h) ; 
} 



TtM KaTO rw MO>Ke fla 6"bfle yHMiuo>KeH, MaHMny/iaToptT, BtpinaT ot 
M3BMKBaHeT0 Ha Method e HeBa^MfleH (aKO HanpuMep btopmat MaHkinynaTop 

3aBMCM OT ntpBMfl). 

KaK TaKa e B"b3MO>KHO hakom fla cm noMwc/iw, ne o6eKT"bT e totob 3a nonwcr- 
BaHe? Amm MHoro npocTO - M3BMKBaHeTO Ha Methodo Bptiua MaHnny/iaTop, 

KbM KOMTO HI/IKOM HflMa peCpepeHUMfl. Olfle B T03M MOMeHT 06eKTbT e TOTOB 3a 

GC, TbM KaTO KOfltT no-flo/iy He ro i/i3no/i3Ba, ocBeH, 3a fla ce M3BMKa 
Dispose (). Ako He M3no^3BaxMe onepaToptT using, o6eKTbT 6m Morb/i fla 
6"bfle noni/icreH BeflHara c/iefl HanycKaHeTO Ha MeTOfla Methodo . 

EcTecTBeHO noflo6HM cneKy/iaukiw MO>Ke fla bm HaKapaT fla HacrptxHeTe v\ 
BepoflTHO Bene cm Mwc/ikiTe, ne flopn fla He M3naflHeTe b touho Ta3M cuTyauna, 
MO>Ke HeBO/iHO fla HanniueTe koa, komto fla a npeflM3BMKa. CuTyaunn KaTO 
ropHaTa, o6ane o6mkhob6ho ca CB"bp3aHM c Interop, c komto He ce c6/i"bCKBaTe 
necro, a ocBeH TOBa cbmecrByBa peiueHne Ha npo6/ieMa. 

CTaTM4HMAT MeTOfl gc . KeepAiive (object) npweMa o6eKT KaTO napaMeTbp v\ 
cny>Ki/i KaTO MHflMKaunfl 3a KOMnn/iaTopa, JIT KOMnw/iaTopa v\ Haw-Bene GC fla 
He Cb6i/ipa o6eKTa ao MOMeHTa, b komto ce M3BMKa KeepAiive(). ritpBO- 
Hana/iHkiflT KOfl c BMtKHaT gc. KeepAiive (...) 6m H3Me>Kfla^ TaKa: 



public void SomeMethod 

{ 

using (ResourceWrapper rw = new ResourceWrapper () ) 

{ 

PInvokeHelper . InvokeLibFunction ( rw. Method ( ) ) 

// Moace fla b'BfleM cwrypHM, ye InvokeLibFunction me Btfle 

// M3BMKaHa npeflH rw fla b'bfle noywcTeH 

GC . KeepAiive ( rw) ; 
} 
} 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 725 

C/ia6n pe4>epeHi4iiii 

C/ia6kiTe pecpepeHunn (weak reference) npeAcraB/iHBaT pecpepeHui/m kbm 
o6eKT, koato nofl^e>KM Ha nonwcTBaHe ot cwcreMaTa 3a nonwcTBaHe Ha 6oK/iyK 
cnep, KaTO bcm^km ci/i/ihi/i pecpepeHunn kbm o6eKTa crrnaAHaT. MMawTe npeA- 
bma, ^e npn HeAOCTur Ha naMeT ntpBO ce noni/iCTBaT o6eKTMTe coneHM ot 
cna6ki pecpepeHunn. 

Ci>3AaBaHe Ha en a 6a pecpepeHuufi 

PecpepeHUkia kbm aoctm>kmm o6eKT (o6eKT c KopeH) ce Hapwua cw/iHa 
pecpepeHUkia (strong reference). Cw/iHa pecpepeHuna MO>xe p,a ce npeBtpHe b 

C/ia6a, KaTO ce Cb3AaAe WH era HUM A Ha K/iaca System. WeakReference m ce 

noAaAe cn/iHaTa pecpepeHuna KaTO napaMeTbp Ha KOHCTpyKTopa. 06ane caMO 
KOHCTpynpaHeTO Ha WeakReference o6eKT He npaBM cw/iHaTa pecpepeHunfl 
c/ia6a. 3a ue/iTa, Ha bcmukm KopeHM, conemi/i o6eKTa, Tpa6Ba p,a ce npucBOM 
null. Eto eAMH npuMep: 



// 


CtsflaBaMe hob 


o6eKT vl ro npncB03BaMe Ha 


npoMeHJiMBa . 


// 


ToBa cbSflaBa 


CMJiHa pe$epeHi_tMfl. 






ob~ 


ect obj = new 


obj ect ( ) ; 






// 


CMflaBaMe cjia 


5a pe$epeHi_tMfl k^m o6eKTa 






WeakReference wr 


= new WeakReference (obj ) ; 






// 


TyK Bee ome HMaMe CMJiHa pe^epeHUMH k^m 


o6eKTa . 


IlpeMaxBaMe n. 


obj 


= null; 









no/iynaBaHe Ha cu/iHa pecpepeHUMn ot cna6a 

C/ia6aTa pecpepeHuna cbiuo conn kbm aoctm>kmm o6eKT, HapwuaH ue/i (target) 
m MO>Ke Aa ce npeBtpHe othobo b cw/iHa pecpepeHuna KaTO ce npucBOM 

CTOMHOCTTa OT CBOMCTBOTO Target Ha CbOTBeTHaTa npoMeH/iMBa. Cbomctboto 

isAiive noKa3Ba p,anv\ o6eKTbT Bene He e noni/icreH. 



if (wr.IsAlive) 

{ 

// 06eKTtT ome He e no^MCTeH, cbanaBaMe cmiHa pe^epeHUMfl 
object obj = wr. Target; 

} 
else 

{ 

// 06eKTa Be^e e noywcTeH ot GC, wr. Target e null 

} 



CueHapuM 3a ynoTpe6a Ha cna6n pecpepeHijMM 

C/ia6wTe pecpepeHunn ce ki3no/i3BaT 3a ctxpaHeHne Ha ashhm, komto He ca 
KpnTM4HM 3a npw/io>KeHkieTO. floA HeKpnTM^HM HMaMe npeABMA, ^e npw/io>Ke- 



726 nporpaMnpaHe 3a .NET Framework (tom 2) 

HkieTO He ce Hy>Kflae ot Te3M flaHHM 3a KOHcraHTHO BpeMe v\ MO>Ke fla i/i3nai<a 
Ma/iKO BpeMe 3a taxhoto npecb3flaBaHe. 

HanpuMep eflHO npn^OKeHne MO>Ke fla o6xo>Kfla TBtpflna amck m fla npaBM 

CnMCbK C BCM4KM CpaM/lOBe, OTKpMTM B"bB BCMUKM flkipeKTOpUM M TeXHMTe 

noflflnpeKTopnn. To3m cnnctK 6m Morb/i fla 3aeMa flocTa naMeT. Cb3flaBaHeTO 
Ha to3m cnnctK e 6aBHO, ho aKO tom ziwncBa, BMHarn MO>Ke fla 6"bfle cb3flafleH 
othobo (c ueHaTa Ha iiobtopho o6xo>KflaHe Ha bcmukm flupeKTopnn no flMCKa). 
3a ctxpaHeHneTO Ha cnwcbKa Mowe fla ce M3no/i3Ba cna6a pecpepeHUMM. TaKa 
KoraTO cnncbK"bT noTpa6Ba v\ cna6aTa pecpepeHuna He ro e ocBo6oflM/ia 
nopaflu HeflocTur Ha naMeT, cnMCbKbT me MO>Ke fla ce i/i3no/i3Ba flupeKTHO. B 
npoTMBeH cnynaM me Tpa6Ba fla ce M3rpaflM othobo. 

MMawTe npeflBMfl, ne eflHa c/ia6a pecpepeHUMM MMa ynpaB/isiBaHa v\ 
MaujMHH03aBMCMMa (native) nacr. YnpaB/iflBaHaTa nacr e caMn^T K/iac 

WeakReference. B KOHCTpyKTOpa CM TOM Cb3flaBa GC MaHMny/iaTOp (KOeTO e 

native nacrra) m BMtKBa 3anMC b Ta6/iMuaTa 3a MaHMny/iaTopMTe Ha flOMeMHa 
Ha npM^oxeHMeTO cm (AppDomain). 06eKTbT, kbm komto cohm c/ia6aTa 
pecpepeHUMfl me yMpe, KoraTO H^Ma cm/ihm pecpepeHUMM kbm Hero, a cbiuo m 
caMaTa cna6a pecpepeHUMM, KoraTO H^Ma cm/ihm pecpepeHUMM kbm Hen (Bee 
naKTfl cbiuo e ynpaB/iHBaH o6eKT). 

Cna6aTa pecpepeHUMM c"bfl"bp>Ka MaHMny/iaTop c ro/ieMMHaTa Ha 1 yi<a3aTe/i 
(32 6MTa Ha 32-6mtobm apxMTeKTypM), eflHO 6yneBO no/ie m GC MaHMny- 
ziaTopa, komto cbiuo e c ro/ieMMHaTa Ha 1 yi<a3aTe/i, TaKa ne aKO MMaTe mhoto 
Ma/itK o6eKT, fla Ka>KeM cbfltpwam 1 int no/ie, BaujMflT o6eKT me M3pa3xoflBa 
12 6aMTa naMeT (pa3Mepa Ha MMHMMa/iHMH o6eKT). CtiflMAT o6eKT, BMtKHaT b 
WeakReference, me xapuM noHe ome 9 6aMTa. CneflOBaTe/iHO He cm Cb3fla- 
BaMTe caMM CMTyauMM b komto cb3flaBaTe mhoto cna6M pecpepeHUMM, conemn 

Ma/1KM 06eKTM. 

E4>eKTMBHO M3no/i3BaHe Ha naMeira 

JIhdk: LLje onMraM. 

U\Ofl,a: He. He onuTBatt. HanpaBM ro. M/im He. 

HnMa onMTBaHe. 

EflHO ot ocHOBHMTe pa3/iMKM Me>Kfly ynpaB^ABaHMfl m HeynpaB^ABaHMfl koa e 
aBTOMaTM^HOTO ynpaB/ieHMe Ha naMeira. BMe 3ap,enf\je hobm o6eKTM, ho 
garbage collector aBTOMaTMUHO vv\ ocBo6o>KflaBa 3a Bac KoraTO Bene He ce 
M3no^3BaT. GC ce M3n"b/iH*iBa ot BpeMe Ha BpeMe, necro He3a6e/ie>KMMO, KaTO 
HaM-necro cnMpa BaiueTO npM/ioweHMe caMO 3a MM/iMceKyHfla m/im no-paflKO 
flBe m/im noBene. 

Ako c^eflBaTe ctBeTMTe b Ta3M TeMa, o6iuaTa ueHa Ha M3no/i3BaHeTO Ha 
garbage collector me 6"bfle He3a6e/ie>KMMa, KOHKypeHTHa v\nv\ flopM no-flo6pa 
ot TpaflMUMOHHMTe b C++ new m delete. AMopTM3MpaHaTa ueHa Ha cb3flaBaHe 
m Ha no-KbCHOTO ocBo6o>KflaBaHe Ha o6eKT e flocraTbUHO HMCKa, ne fla e 
B"b3MO>KHO fla cb3flaBaTe fleceTKM mm/imohm Ma/iKM o6eKTM b ceKyHfla. 



T/iaBa 24. ynpaBJiemie Ha naMerra v\ pecypcuTe 727 

CucTeMaTa Ha .NET 3a nonwcTBaHe Ha naMerra npeflocraBfl M3K/uonMTe/iHO 
6"bp30 3afle^AHe Ha naMeT 6e3 A"b/irocponHM npo6/ieMM c cppameHTauMflTa, ho 
e Bt3MO>KHO p,a nrnueTe koa, komto p,a AOBeAe ao no-Ma/iKa ot onTMMa/iHaTa v\ 

npOM3BOAMTe^HOCT. 

3a as nocTurHeTe Haw-Ao6poTO, M3no/i3BaMTe cnep,uv\je yTBtpAeHM npaKTMKn: 

BHMMaBaiiTe c a6cTpaKLtnnTe 

.NET Framework CKpuBa TO/iKOBa mhoto p,e.TdtV\i\v\, ne 6o/ilumhctboto ot 
nporpaMMCTMTe 6e3 npeAMweH onuT c e3kiun ot no-HMCKO hmbo HflMaT nonTM 
HMKaKBa npeACTaBa 3a ueHaTa Ha TexHua koa. 

Mo>Ke Aa 3apeAMTe 1 Mera6aMT XML ot ye6 cawT c hhko/iko peAa koa, Ha/iM? 
To/iKOBa e ziecHo! HancTMHa. To/iKOBa e ziecHO Aa noxapuwTe Mera6aMTM 
naMeT, AOKaTO 3ape>KAaTe XML AaHHMTe caMO 3a Aa M3no/i3BaTe hako/iko 
e/ieMeHTa ot tax. B C m/im C++ e TO/iKOBa "6o/ie3HeHo", ne meiue Aa ce 
no3aMwc/iMTe v\ p,a npoeKTupaTe v\nv\ M3no/i3BaTe API c push (SAX) v\nv\ pull 
(xmiReader) MOAe/i. B .NET Framework npocTO MO>xeTe Aa 3apeAMTe ue/iMfl 
XML Ha eAMH pa3. Mo>Ke 6m ro npaBMTe othobo m othobo. nocne MO>Ke 6m 
BaiueTO npn^oxeHMe He M3r/ie>KAa Bene TO/iKOBa 6"bp30. Mo>xe 6m Tpfl6Bawe 
Aa noMMC^MTe 3a ueHaTa Ha Te3M ziecHM 3a M3no/i3BaHe MeTOAM... 

M36epeTe Haii-Ao6poTO 3a ue/ua API m/im a/iropnTi>M 

HeKa cm npeACTaBMM, ne Tpa6Ba Aa HanMiueM npocTa KOH30/iHa nporpaMa, 
koato OTne^aTBa noc/ieAHMTe N peAa ot AaAeH TeKCTOB cpaM/i, noconeH Ha 
KOMaHAHMfl peA 14 . Mo>Ke Aa HanMiueTe nporpaMaTa no mhoto Ha^MHM: 

- 3aAe/i*iTe MacMB c N e/ieMeHTa m AOKaTO neTeTe cpai/i/ia peA no peA, 
nont/iBaTe MacMBa KaTO umk/imuch 6ycpep (TOBa e Ao6po peiueHMe no 
OTHOiueHMe 3aAe^AHeTO Ha naMeT, ho He TO/iKOBa Ao6po no OTHOiueHMe 
Ha CKopocTTa, aKO cpai/i/i"bT e ro/isiM, a ocBeH TOBa 3a BceKM peA me 
cb3AaAeTe HOBa MHcraHUMfl Ha K/iaca system. string). 

- ripo4MTaTe cpaM^a Ha eAMH Atx (c noMOurra Ha MeTOAa ReadToEndO Ha 

K/iaca StreamReader) M TO CKaHMpaTe OT3aA HanpeA, OT6pOflBaMKM 6poa 
Ha AOCTMTHaTMTe 3Hai4M 3a HOB peA, AOKaTO AOCTMTHeTe ao N (TOBa 

peiueHMe e /ioluo no OTHOiueHMe Ha M3no/i3BaHe Ha naMeTTa, ho AaBa 
MAeyiTa 3a cneABamoTO peiueHMe). 

- OTBapaTe cpaM^a b ABOMneH pe>KMM m neTeTe OT3aA HanpeA AOKaTO 
npe6poMTe N peAa v\nv\ He AOCTMTHeTe Hana/iOTO Ha cpafi/ia, KaTO m/im 

o nocTaBATe peAOBeTe OT3aA HanpeA b npeABapMTe/iHO 3ap,eneu MacMB 
ot N e/ieMeHTa (>KepTBaMKM naMeT 3a CMeTKa Ha CKopocTTa) v\nv\ 

o npenpouMTaTe cpai/i/ia ot AOCTMTHaTaTa no3MUMa ao Kpaa My, OTne- 
^aTBaMKM BceKM peA (>KepTBaMKM ckopoct 3a CMeTKa Ha naMeTTa). 



14 



TaKaBa nporpaMa MMa b Unix (m noAo6HMTe m OC) m ce HapMna tail 



728 nporpaMnpaHe 3a .NET Framework (tom 2) 

Ako 3HaeTe, ne eflkm pep, He HaflMi/maBa HanpuMep 80 ci/iMBO/ia, MO>Ke fla 
nponeTeTe HaBeflH"b>K N * 80 cwMBO/ia b eflMH 6ycpep, fla 3aTBopnTe cpai/i/ia v\ 
fla npeMMHeTe npe3 6ycpepa, OTnenaTBawKM BceKM pefl. 

noyKaTa ot npuMepa e, ne MO>Ke fla peiunTe KOHKpeTHa 3a,qana no mhoto 
pa3^M4HM Hanm-m m o6nKHOBeHO npw BceKM ot Tax ce Ha/iara fla B3eMeTe 
Ba>KHOTO peiueHne fla/iw fla noxepTBaTe noBene naMeT 3a CMeTKa Ha 
CKopocTTa v\nv\ o6paTHO. YHMBepca/iHa peuerua H^Ma v\ peiueHneTO 3aBncn ot 
HyxflMTe Ha BaiueTO npi/i/io>KeHi/ie. 

H$iMa 6e3n/iaTeH o6ha 

rio4MCTBaHeTO Ha o6eKTMTe ot GC, oco6eHO Ha Te3M ot noKO/ieHne e mhoto 
6"bp30, ho He e "6e3n/iaTHo", flopn aKO ro/iflMa nacr ot o6eKTMTe ca "mbptbh". 
3a fla ce otkpmat (m MapKupaT) >KMBMTe o6eKTM ntpBO Tpa6Ba fla ce npucnaT 
HMiuKMTe m fla ce o6xoaat TexHMTe CTeKOBe v\ flpyrn crpyKTypw, 3a fla ce 
cb6epaT KopeHHMTe pecpepeHunn kbm o6eKTM b xnkina. 

3afle^AHeTO Ha naMeT 3a o6eicr cbu\o He e 6e3n/iaTHO. 06eKTMTe 3aeMaT 
MflCTO. HeyMepeHOTO cb3flaBaHe Ha o6eKTM boai/i ao no-necro 3aflewcTBaHe Ha 
GC. flopn no-ziowo, HeHy>KHOTO 3afl"bp>KaHe Ha pecpepeHunn kbm 6e3no/ie3HM 
rpacpn ot o6eKTM vv\ noflfl"bp>Ka ">kmbm". 

Mo>Ke fla cpeiflHeTe ckpomhm nporpaMKH c nena/iHM working sets ot no Hafl 

100 MB, 4MMTO aBTOpM OTpM^aT TflXHaTa BMHa M BMeCTO TOBa npMCBOflBaT 

/loiuaTa npoM3BOflMTe/iHOCT Ha HflKaicbB MMCTepno3eH, Hepa3raflaeM (m cneflo- 
BaTe/iHO HepeujMM) npo6/ieM, CB"bp3aH etc caMna ynpaB/iABaH koa. TparwuHo! 
06nKHOBeHO b TaKMBa cnynaw cnep, nac M3ynaBaHe Ha npo6/ieMa c CLR Profiler 
m npoMAHa Ha hako/iko pefla koa, nporpaMMTe HaMa/iHBaT M3MCKBaHeTO cm 3a 
AMHaMM4Ha naMeT c noBene ot 10 nvri/i. Ako MMaTe npo6/ieM c ro/ieMi/maTa Ha 
Baiunfl working set, ntpBaTa bm CTtnKa Tpa6Ba fla 6"bfle fla nor^eflHeTe 
pa6oTaTa b naMeTTa bbb BaiueTO npM/io>KeHMe. 

He Cb3AaBaiiTe o6eKTM 6e3 na e Heo6xoAMMO 

riporpaMMCTMTe necro nvrw HeBO/iHO cb3flaBaT noBene v\ noBene o6eKTM 
npocTO 3aiuoTO aBTOMaTMUHOTO ynpaB/ieHkie Ha naMeTTa peiuaBa mhoto 3an/ie- 
TeHM npo6/ieMM v\ rpeujKM npn 3afle/iHHe v\ ocBo6o>KflaBaHe Ha o6eKTM v\ 
npocTO 3aiflOTO e 6"bp30 v\ yflo6HO. 

Tunn^eH npuMep 3a 6e3CMwc/ieH pa3xofl Ha naMeT e npoeKTupaHeTO Ha t. Hap. 
one-shot K/iacoBe. TaicbB K/iac MMa eflMH v\nv\ noBene KOHCTpyKTopa, npne- 
Maiflu BCM4KM Heo6xoflMMM apryMeHTM 3a fla ce M3B"bpujn HAKaKBa onepauna v\ 
eflMH MeTOfl, M3nt^HflBaiu onepauna Hyxflaeiua ce ot Te3M apryMeHTM. TaKMBa 
K/iacoBe 3aeMaT M3^niiJHa naMeT BMecTO fla pea/iki3kipaT cpyHKunoHa^HOCTTa 
cm KaTO craTkmeH MeTOfl. noBe^eTO ot Bac me pa3no3Ha*iT iua6^0Ha 3a flM3aMH 
Command. Tom MMa ro^eMM npeflMMCTBa, KoraTO ce M3no^3Ba pa3yMHO v\ npn 
Heo6xoflMMOCT, ho 3a c"b>Ka^eHne, no-HeonnTHMTe nporpaMMCTM ro M3no^3BaT 
no-4ecTO ot Heo6xoflMMOTO. 

ripuMep 3a one-shot K/iac, npoeKTupaH 6e3CMnc^eHO fla 6"bfle MHCTaHunpaH 3a 
fla 6tfle M3no^3BaH: 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 729 



class FileDownloader 

{ 

private readonly string mUrl; 
private readonly string mPath; 

public FileDownloader ( string aFileUrl, string aLocalPath) 

{ 

mUrl = aFileUrl; 

mUath = aLocalPath; 
} 

public void Download () 

{ 

// CBaji^Me $aMJia ot mUrl m ro 3anncBaMe b flMpeKTopua mPath 

// ... 
} 
} 



CbmaTa cpyHKunoHa^HOCT MO>Ke fla 6"bfle npoeKTupaHa KaTO craTkmeH MeTOfl, 

KOMTO He M3MCKBa C"b3AaBaHeTO Ha M3/lMLUeH 06eKT. 

ripuMep: 



class FileDownloadHelper 

{ 

public static void Download ( string aUrl, string aPath) 

{ 

// CBaji^Me $awjia ot aUrl m ro 3anwcBaMe b flMpeKTopua aPath 

// ... 
} 
} 



Ako no-K"bCHO peujMTe, ne ce Hy>KflaeTe ot K/iac, komto Kancy/ii/ipa napaMeT- 
puTe Ha 3aaBKaTa, c ue/i no/i3BaHeTO My b Lua6/iOHa 3a p,v\3av\u Command, 
BMHarn Moxe fla HanmueTe K/iac FiieDownioadcommand, komto Ae/ierupa kbm 

FileDownloadHelper. 

Ako MCKaTe fla nmueTe Hai/iCTi/ma 6"bp3 ynpaB/iflBaH koa, cb3flaBawTe o6eKTMTe 
c MMCb/i m caMO KoraTO e Heo6xo,qi/iMO. ToBa ce OTHaca oiue noBene 3a OHe3M 
ot Bac, komto npoeKTkipaT nporpaMHM MHTepcpewcn (APIs). B"b3MO>KHO e fla 
npoeKTupaTe Tun v\ HeroBMTe MeTOflu TaKa, ne fla M3ncKBa ot K/ikieHTkiTe fla 
c"b3flaBaT m ocBo6o>KflaBaT o6eKTM HenpeicbCHaTO. He ro npaBeTe! 

Ci»3AaBaiiTe o6eKTM kijacto e hco6xoammo 

BtnpeKM, ne KOMnki/iaToptT Ha Banjul e3MK v\ JIT KOMni/i/iaTopvr no BpeMe Ha 
M3nt^HeHne npaBAT onTMMH3aunM, Te He ca nepcpeKTHM 15 . flo/iHi/mT npuMep 



15 JIT KOMnn^aToptT H^Ma flocraTbUHO BpeMe 3a fla npaBM arpecuBHM onTMMM- 
3aunM, KaKBMTO MO>Ke fla HanpaBM KOMnki/iaTopvr 



730 nporpaMnpaHe 3a .NET Framework (tom 2) 

noi<a3Ba KaK MO>Ke fla HanniueTe koa, komto ce i/i3n"b/iHsiBa 5 v\ noBene ntâ„¢ 
no-6aBHO npocTO ot HexawcTBo: 



for (int i = 0; i < 5000; ++i) 

{ 

int buffer [] = new int[65536]; 

// IlpaBMM HHKaKBO H3yHCJieHHe c buffer 
} 



CbLUkiflT KOfl MO>Ke fla ce onTMMH3npa 3HanwTe/iHO, KaTO npocTO ce M3BaflM 
3afle/iflHeTO Ha naMeT npeflu umcb/ia: 



int buffer [] = new int[65536]; 
for (int i = 0; i < 5000; ++i) 

{ 

// IlpaBMM HHKaKBO M3yMCJieHwe c buffer 

} 



He Cb3AaBaiiTe o6eKTM c m3/imujhm no/ieTa 

Tc-Ba, ne Ha nptB novnep, bm H3Me)Kfla HopMa/iHO fla HanpaBkue o6iu K/iac 3a 
B"b3^MTe m zikicraTa Ha eflHO fltpBO, He 03HanaBa, ne Tpa6Ba fla MMn/ieMeH- 
TkipaTe CTpyKTypaTa ot flaHHM fltpBO no to3m HanwH. Eto TkinwuHa MMn/ieMeH- 
Taunfl Ha fltpBO, cpeiuaHa b orpoMeH 6pow npoeKTu: 



public sealed class LameTreeNode : IEnumerable 

{ 

private string mName; 
private ArrayList mChildren; 

public LameTreeNode ( string aName) 

{ 

mName = aName ; 

mChildren = new ArrayList (); 
} 

public string Name 

{ 

get 

{ 

return mName; 

} 
} 

public int Count 

{ 

get 

{ 

return mChildren . Count; 

} 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 731 



public IEnumerator GetEnumerator ( ) 
return mChildren . GetEnumerator ( ) ; 

public void Add (TreeNode aChild) 
mChildren. Add (aChild) ; 



To/ieMMTe npo6/ieMki TyK ca noine flBa: 

- KoHCTpyKToptT 6e3 napaMeTpn Ha ArrayList cb3,qaBa no no,qpa36kipaHe 
MacuB ot 16 e/ieMeHTa - noxa6eHa naMeT 3a cb3,qaBaHeTO Ha MacuBa. 
Ako e^eMeHTtT e croMHOcreH Tun, bcmukm ctomhoctm me 6"bAe onaKO- 
BaHM, KoeTO flont/iHi/iTe/iHO yBe/ikmaBa M3MCKBaHeTO 3a naMeT. 

- He ce 3Hae fla/iw Ha Bt3e/ia me 6"bAaT flo6aBeHM /lwcra, T.e. fla/w tom 
caMMAT HflMa fla ocTaHe /ii/icto, ho naMerra 3a Maci/ma ce xapnw bbb 
bcm4km cnynaw. ToBa, pa36npa ce, onpocryiBa i/iMn/ieMeHTauwsiTa Ha 

Count, GetEnumerator ( ) M Add(...), HO ueHaTa He e Ma/lKa. 

CtiuMflT K/iac MO>Ke fla ce npenpaBM TaKa, ne fla M3pa3xoflBa no-Ma/iKO 
Aont/iHi/iTe/iHa naMeT 3a e/ieMeHTMTe, komto ca /lkicra: 



public sealed class DecentTreeNode : IEnumerable 

{ 

private string mName; 

private ArrayList mChildren; 

private static IEnumerator mNullEnumerator = 

(new TreeNode [ 0] ) . GetEnumerator ( ) ; 
private const int DEFAULT_CAPACITY = 4; 

public DecentTreeNode ( string aName) 

{ 

mName = aName ; 

} 

public string Name 

{ 

get 

{ 

return mName; 

} 

} 

public int Count 
{ 



732 flporpaMnpaHe 3a .NET Framework (tom 2) 



get 

{ 

return mChildren == null ? : mChildren . Count; 

} 
} 

public IEnumerator GetEnumerator ( ) 

{ 

return mChildren == null ? 

mNullEnumerator : 

mChildren . GetEnumerator ( ) ; 
} 

public void Add (TreeNode aChild) 

{ 

if (mChildren == null) 

{ 

mChildren = new ArrayList (DEFAULT_CAPACITY) ; 

} 

mChildren. Add (aChild) ; 

} 



} 



KaKTO BMHarn, K/iacbT MO>xe fla ce no,qo6pki noine no oiue flBa HanwHa: 

- Ako 3HaeTe MUHMMyMtT m/m^m MaKCMMyMtT Ha 6poa Ha zikicraTa Ha 
B"b3e^a, MO>KeTe fla MHMuna^M3MpaTe ArrayList n/ieH-npoMeH/ikiBaTa c 

KanaUMTeT, nOflafleH B KOHCTpyKTOpa Ha DecentTreeNode. 

- Mo>KeTe fla cb3fla,qeTe a6crpaKTeH K/iac Node v\ KOHKpeTHM K/iacoBe 3a 
B"b3/iw m /lkicra. B T03M cnynai/i ce noflpa36npa, ne 3HaeTe Kora me 
ct3flaBaTe o6eKT ot efli/mkm v\i\v\ flpyrna Tkin. 

He MHMuna/iM3MpaMTe no/ieTaTa b KOHCTpyKTopiue 

Cnep, KaTO naMeTTa 3a HOBOCb3fla,qeH o6eKT ce 3a,qe/ii/i, CLR ro i/iHkmwa/iki3kipa 
(KOHCTpyupa). CLR rapaHTupa, ne bcmukm pecpepeHTHM no/ieTa ca npeflBapn- 
Te/iHO MHMuna^M3MpaHM c null m BCM4KM npuMMTMBHM CKa/iapHki no/ieTa ca 
MHMuna^M3MpaHM c o, o.o, false v\i\v\ cbOTBeTHaTa Hy/ieBa ctomhoct. C/ie- 
flOBaTe^HO e HeHy>KHO noBTopHO fla vv\ nHMuna/iki3kipaTe b flecpuHnpaHMTe ot 
Bac KOHCTpyKTopn. fl^t>KHM CMe fla bm npeflynpeflMM, ne b TeKymaTa cm 
MMn^eMeHTaunfl KOMnki/iaTopvr He onTMMH3npa v\ He npeMaxBa noBTopHM mhm- 

UMa^M3aUMM OT KOHCTpyKTOpMTe BM. 

He npoeKTMpaiiTe m3/imluho ai>i6okm ftepapxuu 

BTopuflT npuHunn Ha o6eKTHO-opneHTnpaHMflT flM3aMH r/iacw 16 : 



16 



b>k. "LUa6/iOHki 3a flki3awH", M3fl. SoftPress 



T/iaBa 24. ynpaBJiemie Ha naMerra v\ pecypcuTe 733 

llpe/inowiTafiTe KOMno3MUMftTa Ha o6eKTii npe/j HacneansaHeTO Ha K/iac. 

To/iflMa nacr ot nporpaMMCTUTe o6ane (oco6eHO Te3M c npeAHweH onuT c 
e3nu,M, komto He noflfl"bp>KaT Hac^eflflBaHe), 3/ioynoTpe6$iBaT c HacneAflBaHe- 
to, BeflH"b>K cnep, KaTO npnflo6nflT HflKaicbB onuT c OOn. 

C/iefl KaTO CLR 3ap,env\ naMeT 3a flafleH o6eKT v\ v\uv\\xv\anv\3v\pa no/ieTaTa My, 

Ce M3BMKBa KOHCTpyKTOptT Ha CbOTBeTHI/lfl TMn. KOHCTpyKTOptT Ha BCeKM Tun, 

AecpMHupaH ot nporpaMMCTa v\nv\ KOMnw/iaTopa, ntpBO M3BMKBa KOHCTpyKTopa 
Ha 6a30BMfl cm Tun, noc/ie ki3n"b/iHflBa flecpMHupaHaTa ot nporpaMkicra mhmum- 
a^M3aunfl. 

Ha Teopufl, TOBa MO>Ke fla 6"bfle CKbno KaTO BpeMe Ha w3n"b/iHeHkie, Tbv\ KaTO 
aKO MMaMe K/iac E Hac/ieAflBam D, HacneAflBam C, HacneflflBam B, Hac/ieAfl- 
Baiu A (HacneflflBam system. object), ToraBa KOHcrpywpaHeTO Ha E me npe- 
flM3BMKa neT M3BMKBaHMfl Ha KOHCTpyKTopn. Ha npaKTMKa HeiuaTa He ca toji~ 
KOBa 3/ie, TbM KaTO KOMnn^aToptT c/ikiBa b eAHO (inline) M3BMKBaHMflTa kbm 
npa3HM KOHCTpyKTopn Ha 6a30BMTe K/iacoBe. 

KeujMpaHM m HeKeujMpaHM pecypcn 

Ha Mecra b .NET Framework CTpaTernaTa 3a ynpaB/iflBaHe Ha pecypcn He e 
Ao6pe 3aMnc^eHa. J\a B3eMeM HanpuMep cnep,Hv\je ABa peAa koa: 



Brush brush = Brushes .White; 

Font font = Systemlnf ormation .MenuFont; 



3a ntpBMfl peA He ce M3MCKBa p,a M3BMKaTe brush. Dispose o , Tbki KaTO 
KO^eKunflTa Brushes bm Bptiua KeiunpaHO Konne. Ha BTopua peA, o6ane MMa 

npo6^eM, TbM KaTO font 06eKTbT, BtpHaT OT CBOMCTBOTO MenuFont e HOBOCb3- 

AaAeH m KaTO TaKbB Tpa6Ba p,a My M3BMKaTe MeTOAa Dispose () cnep, KaTO 
npnK^K)4MTe pa6oTaTa cm c Hero. 

OneBMAHO nv\ e TOBa ot KOAa? He. CnoMeHaTO nv\ e HAKbAe b AOKyMeHTa- 
UMATa? He. BHkiMaBakiTe! Ako He CTe curypHM, npoBep^BaMTe c Reflector. 
M3no^3BaMTe cneAHOTO ziecHO 3a 3anoMHAHe npaBki/io, KoraTO npoeKTupaTe 
BaujMTe TunoBe: 




Ako MHCTaHMMATa Ha o6eKTa, komto Bp-t>maTe, e KewnpaHa ot 
Bac, M3no/i3BaiiTe cbomctbo 3a M3B/iimaHeTO ft. Ako cb3flaBa- 
Te m Bp-bLqaTe hobs vxHcranuyxa, M3no/i3BaMTe MeTOfl. MMeHy- 
BaMTe MeTOflMTe v\ CBoftcrBaTa no HanwH, komto He ocraBa 
cbMHeHMe 3a TOBa fla/iM Bi>pHaTiinT o6eKT e HOBOCi3flafleH m 
ce Hy>Kflae ot ocBo6o>KflaBaHe. 



Eto eAMH npuMep: 



class Brushes 

{ 

public static Brush CreateSolidBlackBrush i 



734 flporpaMnpaHe 3a .NET Framework (tom 2) 



{ 

// OTroBopHOCTTa 3a ocBofioxnaBaHe Ha pecypca e Ha 

// M3BHKBamHH T03M MeTOfl 

return new SolidBrush (Color . Black) ; 
} 

public static Brush CachedBlack 

{ 

// OTroBopHOCTTa 3a ocBo6oxflaBaHe Ha pecypca e Ha 
// nporpaMMCTa, npoeKTMpaji KJiaca Brushes 
return mCachedBlackBrush; 

} 
} 



3anenere un/iaTa naMeT, Hy>KHa 3a cb3AaBaHeTO Ha CTpyKTypa 

OT AaHHM, HaBeAH~b>K 

HanniueTe nporpaMa, koato cb3,qaBa MacuB ot 1 mm/imoh int eneMenja v\ 

npOCT CB"bp3aH Cni/ICbK OT 1 MI/I/1MOH B"b3/1M, lOTO BCeKM B"b3e/1 06BMBa eAMH 

int e/ieMeHT. riocne M3MepeTe BpeMeTO, hy>kho fla c"b6epeTe ntpBMTe xw/iflfla, 
10 xi/i/iflflki, 100 xm^aah n 1 MM/ii/iOH eneMenja. noBTopeTe BceKM urncb/i mhoto 
ntTM (BKapaMTe ro bbb BtHweH urncb/i) 3a fla M3MepnTe CKopocTTa. 

YKa3Ba ce, ne ko/ikoto noBene flaHHM o6xo>KflaTe, mnKOBa no-6aBHO ce 
A"bp>KM CBtp3aHMAT cnwcbK. Bepci/mTa c MacuBa e BMHarn no-6tp3a, BtnpeKM, 
ne M3n"b^HABa flBa ntTM noBene mhctpykumm. 3a 100 xi/i/ihah eneMenja, 
BepcuflTa c MacuBa e ,qo 7 irbTki no-6"bp3a. 

3aiuo? ritpBO, MHoro no-Ma/iKO B"b3/iw ce noMecTBaT b komto m fla e Keiu Ha 
npouecopa. Bcmukm 3ar/iaBHH nacm Ha o6eKTMTe (8 6aMTa) v\ Bp"b3KMTe kbm 
c^eflBaiflMfl e/ieMeHT (4 6aMTa Ha 32-6nTOBa MaiunHa) 3aeMaT HeHy>KHO mhcto. 
BapHO, ne c BepcuflTa etc CB"bp3aHna cnncbK 3aeMaTe naMeT, caMO KoraTO bm 
e Hy>KHa, ho: 

- BepcuflTa c MacuBa 3aeMa 4 nvrw no-Ma/iKO naMeT (caMO 4 6aMTa 3a 1 
e/ieMeHT, BMecTO 8 (3ar/iaBHa nacr) + 4 (int hmc/ioto) + 4 (Bp"b3KaTa 
KtM c^eflBaiflMfl e/ieMeHT) = 16 6awTa) v\ cbOTBeTHO no-ro/iflM 6pow 
e^eMeHTM ce noMecTBaT b Keiua Ha npouecopa, a tom e MHoroKpaTHO no- 
6"bp3 ot kosi fla flpyra e naMeT. 

- flHeujHMTe MOflepHM npouecopn MoraT KaKTO fla w3n"b/iHflBaT mhctpyk- 
UMMTe He b pefla KaKTO ca mm noflafleHM, TaKa v\ fla ce onuTBaT fla 
npo4MTaT flaHHM npeflu fla CMe mm vv\ nowcKa/in. B Hawi/m c/iy^aw, 
npouecopvr MO>Ke fla nponeTe oiue flaHHM, npeflu fla CMe vv\ noi/iCKa/iw 3a 
MacuBa CM. 

BepcuflTa etc CB"bp3aHMfl cnncbK e BMHarn no-6aBHa, Tbv\ KaTO npeflu B"b3e/ia 
fla flocTurHe Keiua Ha npouecopa, tom He MO>xe fla nponeTe cneflBami/m B"b3e/i, 
T.e. MMaMe neTeHe caMO Ha 1 B"b3e/i b flafleH momcht. 

KaKBa e noyKaTa TyK? 



T/iaBa 24. ynpaBJiemie Ha naMerra v\ pecypcuTe 735 

klMaMTe npeflBMfl Kern a Ha npouecopa b AM3aiiHa cm 

- EKcnepuMeHTupaMTe v\ npeMepBai/iTe. TpyflHO e, KaKTO fla ce npeflBMflflT 
CTpaHM^HMTe ecpeKTM BtB BCAKa ep.ua nporpaMa, TaKa v\ p,a ce AaAaT 
HAKaKBM cneu,ncpM4HM yKa3aHMfl KaK Aa npoeKTupaTe Haw-ecpeKTMBHO 
CTpyKTypnTe ot ashhh, komto no/i3BaTe. 

- B/iM3KMTe ashhh ce AOCTtnBaT no-6"bp30, npeAnoni/iTai/iTe MacuBM npeA 
CB"bp3aHM cnncbun. 

- KoraTO MacuBMTe He bm BtpwaT pa6oTa, ki3no/i3Bai/iTe xm6pmahm crpyK- 
Typn, HanpuMep cnnctun ot no-Ma/iKM MacuBM, MacuBM ot MacuBM v\ t.h. 

- TtM KaTO garbage collector 3ana3Ba OTHOCMTe/iHMfl peA Ha o6eKTMTe, 
Te3M o6eKTM, komto 3a cb3AaAeHM 3aeAHO no eAHO v\ cbu\o BpeMe (m Ha 
ctiuaTa HMiuKa) o6mkhob6ho ocTaBaT 3aeAHO (m 6/11/130 eAHH ao Apyr) b 
naMerra. l/l3no/i3BaMKki TOBa 3HaHne MO>KeTe BHMMaTe/iHO Aa cb3AaAeTe 
o6eKTM, komto me ce M3no/i3BaT 3aeAHO, TaKa, ne Aa cnoAe/iflT o6iuo 
MflCTO b Kewa Ha npouecopa. 

- MoxeTe Aa pa3Ae/iMTe o6eKTMTe cm Ha "touiwa" v\ "cTyAeHu" nacm, KaTO 
Ton/ikiTe c"bA"bp>KaT necro w3no/i3BaHi/iTe AaHHM, a cryAeHMTe - p^ako 
M3no/i3BaHkiTe - v\ MoraT Aa B/iki3aT v\ M3/iM3aT ot Keiua Ha npouecopa 
6e3 TOBa Aa e oce3aeMO 3a npM/io>KeHMeTO bm. 

l/l3nosi3BaiiTe oieAHMn moac/i 3a LieHaTa Ha npocrpaHCTBOTO 

- Pa3Mep"bT Ha ctomhocthmt6 TunoBe o6nKHOBeHO e o6iunflT pa3Mep Ha 
BCM4KMTe My no/ieTa, KaTO no/ieTaTa, komto ca no-Ma/iKki ot 4 6awTa ce 
noApaBHABaT ao 4 6awTa. 

- MoxeTe Aa wMn/ieMeHTkipaTe o6eAHHeHi/m Ha noc/ieAOBaTe/iHM no/ieTa 

(unions), KaTO M3nO/13BaTe aTpn6yTMTe [StructLayout(LayoutKind. 
Explicit) ] M [FieldOffset(n) ] . 

- Pa3Mep"bT Ha pecpepeHTHMTe TunoBe e 8 6aMTa (pa3Mep"bT Ha 3ar/iaBHaTa 
nacr Ha BceKM pecpepeHTeH o6eKT) + pa3Mepa Ha BCkinKkiTe mm no/ieTa, 
noApaBHeH ao 4-6atiTOBa ctomhoct, KaTO no-Ma/iKMTe ot 4 6awTa no/ieTa 
ce noApaBHABaT. 

- B C# npn AeK/iapaukia Ha M36ponM Tun Moxe Aa yKa>KeTe npoi/i3BO/ieH 
ue/ionwcneH Tun, TaKa ne e B"b3MO>KHO Aa AecpMHupaTe 8, 16, 32 v\ 64- 

6MTOBM M36pOMMM Ti/inoBe. 

- KaKTO m b C/C++ BMHarn MO>Ke Aa w3ueAHTe Ma/iKO pa3Mepa Ha no- 
rd/iam o6eKT, KaTO BHkiMaTe/iHO npeueHMTe v\ npoMeHMTe TunoBeTe Ha 
ue/ioni/ic/ieHMTe My no/ieTa. 

- Moxe Aa M3no/i3BaTe CLR Profiler 3a Aa onpeAe/iMTe pa3Mepa Ha 
pecpepeHTeH Tun. 



736 nporpaMnpaHe 3a .NET Framework (tom 2) 

OTpaweHiie Ha TwnoBeTe 

M36arBaMTe ki3no/i3BaHeTO Ha OTpa>xeHkie Ha TunoBeTe (reflection), KoraTO e 
B"b3MO>KHO. Ako ce nwTaTe KaKBa e ueHaTa Ha reflection, ta e TaKaBa, ne He 
MO>KeTe fla cm a no3BO/ikiTe. Eto 3aiuo v\ K/iacbT objectPool, flafleH KaTO 
npuMep b eflHa ot c/ieflBamwTe toukm, He i/i3no/i3Ba reflection 3a fla cb3flaBa 
o6eKTM. OTpa>KeHneTO Ha TunoBeTe e no/ie3HO v\ moluho cpeflCTBO, ho 
cpaBHeHO KOfl, npeMMHa/i npe3 JIT KOMnw/iaTopa e mhoto ntTki no-6aBHO. 

npeMaxHeTe cb3AaBaHeTO Ha BperieHHM o6cktm, komto MoraT Aa 
6"bAaT M36erHaTH c ueHaTa Ha Ma/iKO noBene koa 

HanpuMep, aKO Tpa6Ba fla copTupaTe CSV cpai/i/i (cpaw/i, b komto flaHHMTe b 
peflOBeTe ca pa3,qe/ieHki etc 3aneTan) v\ ntpBaTa KO/iOHa c"bfl"bp>Ka K/iK>na 3a 
copTupaHe, MO>Ke fla HanniueTe c/ieflHM*i K/iac 3a cpaBHeHne Ha peflOBeTe: 



sealed class SlowComparer : IComparer 

{ 

private readonly char mDelimiter; 

public SlowComparer (char aKeyDelimiter ) 

{ 

mDelimiter = aKeyDelimiter; 

} 

public int Compare (obj ect aObjl, object aObj2) 

{ 

string keyl = (aObjl as string) . Split (mDelimiter ) [0] 
string key2 = (aObj2 as string) . Split (mDelimiter ) [0] 
int len = Math . Min ( keyl . Length, key2 . Length) ; 
return String . Compare ( keyl, 0, key2, 0, len) ; 

} 
} 



MeTOfltT 3a cpaBHeHne compare (...) , noKa3aH b ropHaTa cpurypa ntpBO 
pa3fle^a pefla Ha ko/iohm, M3no^3BaMKM MeTOfla split (...) Ha K/iaca 
system. string, a nocne no/i3Ba ntpBaTa KO/iOHa KaTO k/ikdh. M3BMKBaHeTO Ha 
split (...) c"b3flaBa MacuB cbCToam ce ot HM30Be, KaTO iokto Maci/ma, TaKa v\ 
HM30BeTe ca 3ap,eneuv\ b fli/maMi/mHaTa naMeT. 

C Ma/iKO noBene ycw/ii/m, npn no/io>KeHMe, ne 3HaeTe, ne peflOBeTe ca 
pa3fle/ieHM etc 3aneTan, MO>xe fla ki3B/ieneTe K/iK>noBeTe 3a copTupaHe, 6e3 fla 
c"b3flaBaTe HeHy>KeH pa3xofl Ha naMeT: 



sealed class FastComparer : IComparer 

{ 

private readonly char mDelimiter; 

public FastComparer (char aKeyDelimiter) 
{ 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 737 



} 


mDelimiter = aKeyDelimiter; 


pi 
{ 


iblic int Compare (obj ect aObjl, object a0bj2) 


string strl = aObjl as string; 




string str2 = a0bj2 as string; 




int posl = strl . IndexOf (mDelimiter, 0); 




int pos2 = str2 . IndexOf (mDelimiter, 0); 




int len = Math .Min (posl, pos2) + 1; 


} 
} 


return String . Compare ( strl, 0, str2, 0, len); 



CopTupaHeTO Ha ep,v\u v\ chiu, HenoApeAeH MacuB, cbcroniu, ce ot 100 000 HM3a 
ot no 100 CkiMBO/ia, c k/ikdh Me>Kfly 5 h 10 CMMBO/ia c Fastcomparer e noBene 

OT 20 ITbTM nO-6"bp30 OT TOBa C nOMOLUTa Ha SlowComparer. 

MMHHMM3npaMTe 6pon Ha 3anncnTe Ha yKa3aTe/iw kt»m BauiMTe 
o6eKTM, oco6eHO OHe3M, komto ce npaBUT b no-crapM o6eKTM 

Ma/iKO no-rope o6acHMXMe KaK KewtT Ha npouecopa He Tpa6Ba fla ce 
npeHe6perBa. KoraTO b no/ie, HaMnpaiuo ce b no-crap o6eKT (TaKbB, komto ce 
e npeMecTM/i b no-ropHO noKO/ieHMe) 3anniueTe pecpepeHuna Bue ntpBO 
npeAM3BMKBaTe GC fla o6hobm Ta6/iMuaTa c pecpepeHunn, Henofl/iewamM Ha 
GC m BTopo, ho He no-Ma/iKO Ba>KHO, "AOKOCBaTe" CTap o6eKT, komto e mhoto 
Bepo^THO fla e M3/ifl3"b/i ot Keiua Ha npouecopa. BHMMaTe/iHO nper/ieflawTe 
AM3aMHa cm, TtM KaTO 6m Tpsi6Ba/io no-necro fla bm ce Ha/iara fla 3anMCBaTe 
pecpepeHUMfl kbm CTap o6eKT b no/ie Ha hob, otko/ikoto o6paTHO. 

M3nO/13BaMTe B~b3MO>KHO HaM-Ma/IKO CpMHa/lM3aTOpM 

Ako e Hy>KHO pa36MMTe o6eKTMTe cm Ha noflo6eKTM, 3a fla ro nocTMTHeTe - 
TOBa cbiuo Ba>KM 3a pa3fle/iflHeTO Ha Ton/iM m ctyachm o6eKTM. 

3ano3HaMTe ce c MHcrpyMeHTa CLR Profiler 

riper/ie>KflaMTe KOfla, MMn/ieMeHTMpam necro M3no/i3BaHM CTpyKTypM ot ashhm 
m ro onTMMM3MpaMTe c CLR Profiler 3a fla ere CMrypHM, ne ynoTpe6flBaTe 
naMerra ecpeKTMBHO m 3a fla pa6oTM GC HaM-flo6pe 3a Bac. 

CLR Profiler (6mbwm5tt Allocation Profiler) e no/ie3Ha nporpaMa, HanMcaHa ot 
eKMna Ha Microsoft, kohto M3no/i3Ba nporpaMHMTe MHTepcpeMCM 3a npocpM/iM- 
paHe Ha CLR koa (CLR profiling APIs), Cb6MpaMKM m BM3ya^M3MpaMKM no 

nOflXOflfllfl Ha^MH MHCpOpMaUMfl 3a Cb6MTMfl KaTo: 

- M3BMKBaHe Ha MeTOfl 

- BptlflaHe OT M3BMKaH MeTOfl 

- 3afle^flHe Ha naMeT 3a o6eKT 

- no^MCTBaHe Ha naMerra m flp. 



738 nporpaMnpaHe 3a .NET Framework (tom 2) 

C/iefl KaTO Heo6xoflMMaTa MHCpopMauna ot c"b6nTMflTa e cb6paHa, MO>KeTe fla 
M3no^3BaTe CLR Profiler 3a fla pa3r/ieflaTe 3a,qe/iflHeTO Ha naMeT v\ noBe- 
fleHneTO Ha GC 3a BaweTO npM/io>KeHMe, BK/uonkiTe/iHO B3anMOfleMCTBneTO 
Me>Kfly kiepapxM4HOTO M3BMKBaHe Ha MeTOflkue bm m Lua6/iOHMTe, no komto 
3afle^ATe naMeT. 

M3y4aBaHeTO Ha CLR Profiler cm crpyBa, 3aiflOTO 3a mhoto npi/i/io>KeHkifl, 
MMaiflu npo6/ieMki c npoki3BOflkiTe/iHOCTra, pa36npaHeTO Ha Lua6/iOHa Ha 3a,qe- 
^AHeTO Ha naMeT 3a BaiunTe flaHHM noMara 3a HaMa/iaBaHeTO Ha working set 
naMeTTa v\ 3a c"b3flaBaHeTO Ha 6"bp3M KOMnoHeHTM v\ npn^OKeHnn. 

CLR Profiler (c BK/iK>neHa flOKyMeHTauna) MO>Ke fla ce CBa/iw cbo6oaho ot: 
http: //www, microsoft, com/down loads/details.aspx?FamilyId=86CE6052- 
D7F4-4AEB-9B7A-94635BEEBDDA&displavlanq=en 

npoeKTMpaiiTe, MMC/ieJiKH 3a ecpeKTMBHOcira 

3a HAKOM npoeKTM npoi/i3BOflkiTe/iHOCTTa e c Ma/iKO v\nv\ 6e3 3HaneHkie, a 3a 
flpyrn Tfl e Haw-Ba>KHaTa xapaKTepucTMKa Ha npoflyKTa. ripe>KfleBpeMeHHaTa 
onTMMM3aunfl e KopeHa Ha bcako 3/10, ho m HexaHneTO no OTHOweHi/ie Ha 
ecpeKTMBHOCTTa BOflu flo mhoto npo6/ieMi/i. Bue CTe npocpeci/iOHa/ii/icâ„¢, eTO 
3aiuo Tpa6Ba fla 3HaeTe ueHaTa Ha HeiuaTa. Ako He a 3HaeTe, ntK v\ flopn fla 
cm MMC/iMTe, ne a 3HaeTe - npeMepBaMTe necro. 

TexHMKaTa "ny/iMHr Ha pecypcii" 

ny/ikmr Ha pecypcn (resource pooling) e nporpaMHa TexHMKa 3a noflo6p*iBaHe 
Ha npoM3BOflMTe^HOCTTa npn pa6oTa c pecypcn, komto ce cb3flaBaT v\nv\ 
yHMiflo>KaBaT "cKbno" (6aBHo). 

Ta3M TexHMKa ce w3no/i3Ba ot mhoto paMKM Ha npw/io>KeHkifl (frameworks), 
BK/iK)HMTe/iHO ot COM+ 3a fla He cb3flaBa v\ yHMiuo>KaBa HenpeKbCHaTO 
o6eKTM, a b .NET Framework - npn ynpaB/ieHkieTO Ha Haki-pa3HOo6pa3HM, 
Haw-Bene HeynpaB/isieMki pecypcn KaTo: 

- Bp"b3KM KtM 6a3M flaHHM (connection pooling); 

- HMiuKM (thread pooling); 

- m flP- 

riy/i"bT o6nKHOBeHO npeflcraB/iflBa cnwcbK ot o6eKTM, komto ce cb3flaBaT 
npeflBapnTe^HO (HanpuMep npn HHMU.ua/iki3au.kiyi Ha npi/i/io>KeHkieTO), a nocne 
ce "pa3flaBaT" npw noncKBaHe. K/ii/ieHTMTe B3MMaT o6eKTM ot ny/ia, w3no/i3BaT 
vv\ M3BecTHO BpeMe v\ cnep, KaTO Bene He mm Tp*i6BaT, He rn yHMiuo>KaBaT, a vv\ 
BptiuaT o6paTHO b ny/ia. 

fln3aMH"bT Ha nyna MO>Ke fla 6"bfle pa3/ikineH, cnopefl Hy>KflMTe Ha BaiueTO 
npi/i/io>KeHi/ie: 

- Tnnn3npaH (caMO 3a onpefle/ieH Tun o6eKTn) v\nv\ He; 

- M3MCKBaiu MMn^eMeHTaunfl Ha onpefle/ieH MHTepcpewc ot o6eKTMTe 1/1/11/1 
He; 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 739 

- no3BO^ABaiu v\nv\ He MHCTaHunpaHe Ha ny/ia, T.e. CeK 17 (Singleton) 

KaKTO System. ThreadPool kl/lkl 06klKH0BeH K/iac; 

- no3BO^ABaiu ki/ii/i He 3aflaBaHe Ha 6poa Ha npeflBapwTe/iHO cb3flafleHMTe 
o6eKTM b ny/ia; 

- c orpaHM^eH 6pow e/ieMeHTki (KaTO system. ThreadPool) v\nv\ 6e3KpaeH, 
ioto npn CBtpujBaHe Ha e/ieMeHTkue b ny/ia ce c"b3flaBaT v\ flo6aBAT 
hobm; 

- 6e3onaceH 3a pa6crra b mhotohmlukobo npi/i/io>KeHi/ie (thread-safe) mii/i 
TaKtB, komto Tpsi6Ba fla ce cnHxpoHM3npa ptuHO ot noTpe6nTe^fl; 

- pa3LunpfleM (komto MO>xe p,a ce HacneAflBa) v\nv\ He (sealed class); 

- c"b3flaBaiu o6eKTMTe BtTpewHO (aKO e Tnnn3npaH) v\nv\ nocpeACTBOM 
CTpaTerna 3a taxhoto cb3AaBaHe, HanpuMep Ae/ieraT (delegate). 

npiiMepHa MMn/ieMeHTaunsi Ha ny/i ot pecypcu 

IHe bm AaAeM npuMep 3a pa3Lui/ip*ieM, Heâ„¢ni/i3i/ipaH, thread-safe ny/i ot 
o6eKTM, 4neTO cb3AaBaHe ce ocbiuecTBABa v\nv\ nocpeACTBOM o6eKT-crpa- 
Ternfl 18 v\nv\ nocpeACTBOM npoTOTunHa MHCTaHuna. 

Ako ny/itT e MHMuna^M3MpaH c npoTOTun, ce c"b3AaBa crpaTeri/m no noApa3- 
6npaHe m ny/i"bT ce kiHMUna/iki3kipa c Hea. 06eKTbT-npoTOTnn Tpa6Ba p,a 
MMn^eMeHTupa cneRHwn MHTepcpewc: 



public interface lob j ectPrototype 

{ 

// 06eKT"BT Bp^ma n'bJiHO Konwe Ha ce6e cm 

lob j ectPrototype DeepClone ( ) ; 
} 



06eKTbT-CTpaTeri/m Tpa6Ba p,a i/iMn/ieMeHTwpa MHTepcpewc, no3BO/isiBam AHHa- 
MM4HOTO cb3AaBaHe m yHMiuo>KaBaHe Ha o6eKTM 3a ue/iMTe Ha ny/ia: 



public interface lob j ectPoolStrategy 

{ 

// CMflaBa hob o6eKT 
object Create () ; 

// YHwmojKaBa o6eKT, cbSflajeH ot Create 
void Destroy (obj ect alnstance); 
} 



17 bm>k "LUa6/iOHki 3a AH3ai/iH", wa6/iOH "CeK" 

18 bm>k "LUa6/iOHki 3a AH3ai/iH", wa6/iOH "CrpaTerwfl" 



740 nporpaMnpaHe 3a .NET Framework (tom 2) 

KaKTO cnoMeHaxMe, aKO ny/ivr e MHMuna^M3MpaH c npoTOTun, me i/i3no/i3Ba 
CTpaTernflTa no noflpa36npaHe 3a cb3flaBaHe Ha o6eKTM v\ e/ieMeHTapina 
MMn^eMeHTaunfl Ha yHMiuo>KaBaHeTO mm: 



// IloTpe6MTejiMTe Ha nyjia MoraT fla fle$MHnpaT KJiac, 

// komto Hacjiefl^Ba Def aultOb j ectPoolStrategy 3a fla 

// He MMnjieMeHTMpaT uejiwfl MHTep$eiic 

public class Def aultObj ectPoolStrategy : lob j ectPoolStrategy 

{ 

// Ako HacjieflHMUMTe He M3noji3BaT npoTOTMn, npocTO nojaBaT null 
public Def aultObj ectPoolStrategy ( Iobj ectPrototype aPrototype) 

{ 

mPrototype = aPrototype; 

} 

// Ako HacjieflHMUMTe He npefle$MHnpaT MeTOfla, 
// ce M3noji3Ba npoTOTwna 
public virtual object Create ( ) 

{ 

if (mPrototype == null) 

{ 

// EflHOBpeMeHHOTO Henpefle$MHHpaHe Ha MeTOfla 
// m HenoflaBaHeTO Ha npoTOTwn e rpeuiKa 
string message = String . Format ( 

"{0} instantiated without prototype", 
GetType ( ) .Name) ; 
throw new InvalidOperationException (message) ; 
} 

return mPrototype . DeepClone () ; 
} 

// MMnjieMeHTauwfl no noflpa36npaHe Ha Destroy MeTOfla 
public virtual void Destroy (obj ect instance) 

{ 

if (instance != null) 

{ 

// Ako o6eKT"BT MMnjieMeHTMpa Idisposable ro yHMmoxaBaMe 
Idisposable disp = instance as Idisposable; 
if (disp != null) 

{ 

disp . Dispose ( ) ; 

} 
} 
} 



} 



private lob j ectPrototype mPrototype; 



Eto m MMn/ieMeHTaukifl Ha ny/ia. Ta cbfltpao noflpo6HM KOMeHTapn v\ 3aTOBa 
HflMa fla a o6cb>KflaMe no-HaTarbK. 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 741 



// Cjiefl MHCTaHUMpaHe, c nyjia ce pafioTM ipe3: 

// MeTOfla Draw ( ) 3a M3BJMiaHe Ha o6eKT ot nyjia, HanpMMep : 

// object obj = pool . Draw () ; 

// MeTOfla Return ( ) 3a BptmaHe Ha o6eKT b nyjia, HanpMMep : 

// pool . Return (obj ) ; 

// cbomctboto IsLimlted, KoeTO Bptma flajiw nyji'M e orpaHHieH 

// HacjieflflBaMe ResourceWrapperBase 3a iia M3BHKaMe Destroy () 

// sa bcm^km ofieKTM b nyjia, KoraTO toh ce yHMmoacaBa 

public class ObjectPool : ResourceWrapperBase 

{ 

private const int DEFAULT_MIN_OBJECTS = 4; 
private const int UNLIMITED = -1; 

// ofieKT-CTpaTerafl 3a cbanaBaHe vl yHMmoacaBaHe Ha ofieKTM 
private lob j ectPoolStrategy mStrategy; 

private Stack mltems; // xpaHMJiwme 3a o6eKTHTe b nyjia 
private int mlnitialOb j ects; // ntpBOHaianeH 6pow ofieKTM 
private int mMaxOb j ects; // MaKCHManeH 6pow ofieKTM 

// CtsnaBa ofieKTM ipe3 npoTOTMn. nyji'BT e HeorpaHMyeH, a 

// n'bpBOHayajiHMAT fipow e no noflpa36npaHe 

public Ob j ectPool ( lob j ectPrototype aPrototype) : 

this (aPrototype, DEFAULT_MIN_OBJECTS ) 
{ 
} 

// CtsnaBa alnitialOb j ects ofieKTa npeflBapMTejiHO 

// ypes npoTOTMn. nyji'BT e HeorpaHMyeH 

public Ob j ectPool ( lob j ectPrototype aPrototype, 

int alnitialOb j ects ) : 

this (aPrototype, alnitialOb j ects, UNLIMITED) 
{ 
} 

// CtsnaBa alnitialOb j ects ofieKTa ipe3 npoTOTwn. 
// nyji'BT e orpaHHyeH iio aMaxObjects 
public Ob j ectPool ( lob j ectPrototype aPrototype, 
int alnitialOb j ects, int aMaxObjects) 

{ 

if (aPrototype == null) 

{ 

throw new ArgumentNullException ( "prototype" ) ; 

} 

// flewcTBHTenHaTa MHMUMajTM3ai4Mfl ce cjiy^Ba b Init ( ) 
Init (alnitialOb j ects, aMaxObjects, aPrototype, null); 
} 

// CT>3flaBa ofieKTM ipe3 CTpaTeras. nyji'BT e HeorpaHMyeH. 



742 flporpaMnpaHe 3a .NET Framework (tom 2) 



// n^pBOHayajiHHflT 6pow e no noflpa36npaHe 

public Ob j ectPool ( lob j ectPoolStrategy aStrategy) : 

this (aStrategy, DEFAULT_MIN_OBJECTS ) 
{ 
} 

// CMflaBa alnitialOb j ects o6eKTa ipe3 CTpaTerafl. 

// nyji'BT e HeorpaHMyeH 

public Ob j ectPool ( lob j ectPoolStrategy aStrategy, 

int alnitialOb j ects ) : 

this (aStrategy, alnitialOb j ects, UNLIMITED) 
{ 
} 

// CMflaBa alnitialOb j ects ofieKTH ipe3 CTpaTerafl. 
// nyji'BT e orpaHHyeH ho aMaxObjects 
public Ob j ectPool ( lob j ectPoolStrategy aStrategy, 
int alnitialOb j ects, int aMaxObjects) 

{ 

if (aStrategy == null) 

{ 

throw new ArgumentNullException ( "strategy" ) ; 

} 

Init (alnitialOb j ects, aMaxObjects, null, aStrategy); 
} 

// MeTOfl 3a MHMUMajiM3ai4Mfl . H3BMKBa ce ot KOHCTpyKTopwTe 
private void Init (int alnitialOb j ects, 

int aMaxObjects, lob j ectPrototype aPrototype, 

lob j ectPoolStrategy aStrategy) 



{ 



// Ako aMaxObjects == UNLIMITED, nyjitT e HeorpaHMyeH 
if (alnitialObjects < | | 

(aMaxObjects != UNLIMITED && 
aMaxObjects < alnitialObjects)) 

{ 

throw new ArgumentException ( 

"initialOb j ects < or maxObjects < initialOb j ects" ) 
} 

mlnitialOb j ects = alnitialObjects; 
mMaxObjects = aMaxObjects; 
mStrategy = aStrategy; 
if (mStrategy == null) 

{ 

mStrategy = new DefaultObj ectPoolStrategy (aPrototype) ; 

} 

// CtsflaBaMe MMHMMyMa ofieKTM 



T/iaBa 24. ynpaB/ieHne Ha naMerra v\ pecypcuTe 743 

mltems = new Stack (mMaxObj ects ) ; 

for (int i = 0; i < mlnitialOb j ects; ++i) 

{ 

mltems . Push (CreateOb j ect ( ) ) ; 

} 
} 

// Bp^ma flajiw nyji'BT e orpaHHieH 
public bool IsLimited 

{ 

get 

{ 

return mMaxObjects != UNLIMITED; 

} 
} 

// MsBJiwya CBo6oflHa MHCTaHuwa ot nyjia . Ako nyji'BT e 
// npa3eH, ce pa3inwpflBa, a aKO He Moxe fla ce pa3iuwpM, 
// ce nojiyyaBa MSKJiioyeHMe 
public object Draw ( ) 

{ 

lock (mltems) 

{ 

// TyK CMe cwrypHM, ye ce H3ni>iiHflBa caMO eflHa HMiuKa 
if (mltems . Count > 0) 

{ 

return mltems . Pop () ; 

} 

// TyK CMe nonaflHajiw, aKO ntpBOHaianHO vljivl 

// cjiejj; saKJiioyBaHeTO e H^Majio cbo6ojj;hm ejieMeHTM. 

// IlpoBepflBaMe Moxe jim fla pa3iuwpMM nyjia 

int itemsToAdd; 

if (mMaxObjects == UNLIMITED) 

{ 

itemsToAdd = 1; 

} 
else 

{ 

itemsToAdd = mMaxObjects - mlnitialOb j ects; 
if (itemsToAdd == 0) 

{ 

throw new InvalidOperationException ( 

"The pull is empty and can not grow further."); 
} 
} 

for (int i = 0; i < itemsToAdd; ++i) 

{ 

mltems . Push (CreateOb j ect ( ) ) ; 



744 flporpaMnpaHe 3a .NET Framework (tom 2) 



} 



} 

// TapaHTHpaHO e, ye MMaMe noHe eflMH ejieMeHT b nyjia 
return ml terns . Pop () ; 
} 
} 

// Bp^ma sajeHa MHCTaHUHH o6paTHO b nyjia 
public void Return (obj ect alnstance) 

{ 

if (alnstance == null) 

{ 

throw new ArgumentNullException ( "instance" ) ; 

} 

lock (mltems) 

{ 

mltems .Push (alnstance) ; 

} 
} 

// HacjieflHMUMTe Ha nyjia MoraT fla npefle$MHnpaT 
// cb3flaBaHeTO m yHHiiioxaBaHeTO Ha ofieKTM 
protected virtual object CreateOb j ect ( ) 

{ 

return mStrategy . Create () ; 

} 

protected virtual void DestroyOb j ect (ob j ect alnstance) 

{ 

mStrategy . Destroy (alnstance) ; 

} 

// MeTOfl ot ResourceWrapperBase - yHMmoacaBa o6eKTMTe b nyjia 
protected override void DisposeManagedResources ( ) 

{ 

foreach (object instance in mltems) 

{ 

DestroyOb j ect (instance) ; 

} 

base . DisposeManagedResources ( ) ; 

} 



K/iacbT objectPool Mowe p,a 6"bfle noAo6peH, oco6eHO no OTHOwei-me Ha 
pa6oTaTa My b MHoroHMUJKOBa KOHKypeHTHa cpeAa: 

- MoxeTe p,a Ao6aBMTe cb6nTne (AutoResetEvent), KoeTO ce cnrHa/iM3npa 
npn Ha/ii/mi/ieTO Ha o6eKT b ny/ia v\ p,a npoMeHMTe KOAa Ha Draw, TaKa ne 



T/iaBa 24. ynpaBJiemie Ha naMerra v\ pecypcuTe 745 

fla pa34MTa Ha TOBa c"b6nTne v\ npn npa3eH ny/i fla naKa M3naKBa flOKaTO 
hakom BtpHe o6eKT b ny/ia. 

- Mo>KeTe fla fl06aBMTe MeTOfl object TryDraw(int milliseconds), 

komto fla ce onuTBa fla no/iyuM o6eKT ot ny/ia b paMKMTe Ha MHTepBa/ia, 
noconeH b milliseconds, c/iefl KoeTO fla M3XB"bp^n M3K^K)4eHkie ki/iki fla 
BtpHe null. 

Bcmuko TOBa ocraBAMe KaTO ywacaBamo ynpa>KHeHne 3a nMTaTe/ia. 

ynpa>KHeHM5i 

1. KaKBO 3HaeTe 3a aBTOMaTMUHOTO ynpaB/ieHMe Ha naMerra v\ pecypcuTe b 
.NET Framework? KaKBM ca npeflMMCTBaTa v\ HeflocrarbUMTe Ha aBTOMa- 
tm4hoto ynpaB^eHne Ha naMerra? KaK pa6oTM t. Hap. garbage collector? 

2. KaKBO 3HaeTe 3a cpMHa/iM3au.MflTa v\ MHTepcpewca iDisposabie b .NET 
Framework? Kora ce i/i3no/i3BaT? KaK ce pea/iM3MpaT? 

3. C noMOurra Ha K/iaca ResourceWrapperBase pea^M3npaMTe o6BMBKa Ha 
HeynpaB^ABaHMfl pecypc "Windows ujpucpT". 

4. HanniueTe K/iac Bufferedconsole, komto npeflocTaBfl 6ycpepnpaH M3xofl 
KtM KOH30/iaTa npe3 MeTOfla cm write (string) . KnacbT Tpa6Ba fla 
ctfltpxa b ce6e cm 6ycpep c pa3Mep 50 6aMTa, b komto ce flo6aB*iT 
M3npaTeHMTe HM30Be. npM npent/iBaHe Ha 6ycpepa flaHHMTe ot Hero Tpa6Ba 
fla ce OTnenaTBaT Ha KOH30/iaTa. 1/lMn^eMeHTMpaMTe cpMHa/iM3au.Mfl m 
iDisposabie m npM no^MCTBaHe Ha pecypcMTe OTne^aTBaMTe 6ycpepa Ha 

KOH30^aTa. 

5. Pea^M3MpaMTe npMMepHa nporpaMa, koato M3no/i3Ba K/iaca 
Bufferedconsole 3a fla nenaTa pa3^M4HM c"bo6iueHMfl b KOH30^aTa. 
M3no^3BaMTe KOHcrpyKUMsiTa using b C# 3a fla ocBo6oflMTe npaBM/iHO 

MHCTaHUMflTa Ha K/iaca Bufferedconsole. 

6. Pea/iM3MpaMTe npaBM/iHO ocBo6o>KflaBaHe Ha MHCTaHUM^Ta Ha 
Bufferedconsole ot npeflxoflHaTa 3a,qana 6e3 fla M3no/i3BaTe KOHcrpyK- 

UMflTa using, a npe3 try. . .finally KOHCTpyKUMfl. 

7. Pea/iM3MpaMTe npMMepHa nporpaMa, koato nenaTa no KOH30/iaTa npe3 
K/iaca Bufferedconsole m pa34MTa Ha cpMHa^M3auMATa 3a fla He ce ry6*iT 
flaHHMTe ot 6ycpepa npM nonMcmaHe Ha naMerra. 3aiuo to3m noflxofl 
Tpa6Ba fla ce M36arBa npefl B"b3MO>KHOCTTa pecypcMTe fla ce nonMCTAT 

P"b4HO? 

8. Pea/iM3MpaMTe MeTOfl, komto no flafleHM ue/iM nMC/ia N m K Bptiua 6poa Ha 
KOM6MHauMMTe 6e3 noBTopeHMe ot N e/ieMeHTa, K-tm K/iac. M3no/i3BaMTe 3a 
M34MC^eHMATa TpMtrb^HMKa Ha riacKa/i m cna6M pecpepeHUMM, b komto 
cbxpaHflBafiTe OTfle/iHMTe My peflOBe. 

9. Pea/iM3MpaMTe npocT ny/i ot o6eKTM ot TMn Resource. riy/i"bT Tpa6Ba fla He 
e 3aiflMTeH ot KOHKypeHTeH flocrbn (thread unsafe), fla H^Ma orpaHMneHMe 



746 nporpaMnpaHe 3a .NET Framework (tom 2) 

3a 6poa c"b3flafleHM eflHOBpeMeHHO o6eKTM, fla He cb3,qaBa npeflBapwTe/iHO 

HMKaKBM 06eKTM M fla CbXpaHflBa OCB060fleHMTe MHCTaHUMM B CTeK. 

M3no/i3BaHa /liuepaTypa 

1. CBeT^MH HaKOB, YnpaB/iei-me Ha naMerra v\ pecypcuTe - http://www. 
nakov.com/dotnet/lectures/Lecture- 10-Memory-Manaqement-vl.O.ppt 

2. Teoprn MBaHOB, YnpaB^eHne Ha naMerra v\ pecypcuTe - http://www. 
nakov.com/dotnet/2003/lectures/Memory-manaqement-finalization.doc 

3. Jeffrey Richter, Applied Microsoft .NET Framework Programming, Microsoft 
Press, 2002, ISBN 0735614229 

4. Tushar Agrawal, Memory Management in .NET - http://www.c- 
sharpcorner.com/Code/2003/Nov/MemoryManaqementInNet.asp 

5. MSDN Training, Programming with the Microsoft® .NET Framework (MOC 
2349B), Module 9: Memory and Resource Management 

6. MSDN Library - http://msdn.microsoft.com 

7. MSDN Magazine, Jeffrey Richter, Garbage Collection: Automatic Memory 
Management in the Microsoft .NET Framework - http://msdn.microsoft. 
com/msdn mag/issues/ 1100/GCI/defau It. aspx 

8. MSDN Magazine, Jeffrey Richter, Garbage Collection - Part 2: Automatic 
Memory Management in the Microsoft .NET Framework - http://msdn. 
microsoft. com/msdnmaq/issues/1200/GCI2/ 



r/iaea 25. AceM6/iiiTa 
m pa3npocTpaHeHne 



ABTOp 

ra/ii/m 1/l/iweB 

Heo6xoflMMM 3HaHMn 

- 5a30BM no3HaHM5q 3a .NET Framework v\ CLR (Common Language 
Runtime) 

- 5a30BM no3HaHMfl 3a o6iuaTa cwcreMa ot TunoBe b .NET (Common Type 
System - CTS) 

- no3HaHMfl no e3MKa C# 

- no3HaBaHe Ha MHCTpyMeHTMTe ot .NET Framework SDK 

- 5a30BM no3HaHM5q 3a Windows Installer 

Cb/vbpwaHMe 

- KaKBO e aceM6/iw? MaHmfcecr Ha aceM6/iki 

- KoHCJDMrypauMOHHM <$>aM/iOBe 

- KaK CLR HaMupa aceM6/ikiTaTa? 

- Global Assembly Cache 

- Pa3npocTpaHeHne v\ MHcra/iwpaHe Ha nporpaMHM naKeTM 

- MHCTa^aUMOHHM KOMnOHeHTM 

- COM 6a3npaHM o6eKTM 

- CbpBtpHM KOMnOHeHTM (Serviced Components) 

- HacTpoMKM Ha Internet Information Server (IIS) 

- ripoMAHa Ha perncTpnTe Ha Windows 

- CnoAe/ieHki kiHcra/iaukiOHHki KOMnOHeHTM (Merge Modules) 

- CAB (fcaki/iOBe 

- /loKa^M3npaHe 

- Debug Symbols 

- 1/lHCTa/iau.noHHi/i CTpaTernn 

- Cb3AaBaHe Ha MSI kiHcra/iaukiOHHH naKeTM c VS.NET 



748 nporpaMnpaHe 3a .NET Framework (tom 2) 

B Ta3M TeMa... 

B HacroflLuaTa TeMa me pa3r/ieAaMe Hafi-Ma/iKaTa cbcraBHa nacr Ha .NET 
npki/ic»KeHkiflTa - aceM6/ikiTaTa. IHe pa3r/ieflaMe 3a KaKBO cny>Kaj, ot KaKBO ce 
cbcroflT m KaK MoraT p,a ce KOHCpurypupaT. IHe ce cnpeM Ha pa3/iwnHHTe 
TexHMKM 3a pa3npocrpaHeHkie Ha roTOBna corJrryepeH npoflyKT Ha K/ii/ieHT- 

CKMTe pa60THM CTaHUMM M Ha HflKOM M36paHM TeXHMKM 3a Cb3flaBaHe Ha MHCTa- 

^aunoHHM naKeTM. 



T/iaBa 25. AceM6/iMTa v\ pa3npocTpaHeHne 749 



AceM6/iMTaTa b .NET Framework 

AceM6/iMTaTa ca ocHOBHa cbcraBHa nacr Ha BceKM cocpTyepeH npoAyKT, 
6a3npaH Ha .NET Framework. Te ca Hafi-Ma/iKaTa v\ ocHOBHa nacr npn pa3- 
npocTpaHeHne Ha .NET npn^OKeHMfl. AceM6/ikiTaTa ce cbcrosiT ot komuv\i\v\- 
paHM .NET TunoBe (kiHTepcpekicM, K/iacoBe, crpyKTypw v\ flp.), MeTaflaHHM v\ 
pecypCM (.bmp, . jpeg, . ico CpaM/lOBe, .resource M . resx pecypCM M flpyrn). 

KoMnn^npaHMTe TunoBe npeflcraB/isiBaT i/i3n"b/iHHM nporpaMeH koa bbb bma Ha 
MHCTpyKUMM Ha MexflMHHMfl e3MK IL. MeTaflaHHMTe onucBaT aceM6^MTaTa v\ 
TkinoBeTe b tax. PecypcuTe MoraT fla 6"bflaT BrpafleHM v\nv\ 3anncaHM ioto 
BtHiiJHM cpaw^OBe. 

AceM6^MTaTa MoraT fla 6"bflaT craTMUHM v\ flMHaMM4HM. CraTMUHMTe aceM6/iMTa 
ce ctxpaHflBaT bbb cpaki/i b portable executable (PE) cpopMaT, flOKaTO flMHa- 
MM^HMTe ce M3n"b/iHflBaT flupeKTHO ot naMeTTa v\ He ce 3anncBaT (bbb cpai/i/i) 
npefli/i M3n"b^HeHneTO mm .NET Framework npefl/iara CTaHflapTHM cpeflCTBa v\ 
MHCTpyMeHTM 3a cb3flaBaHe Ha flMHaMM4HM aceM6/iMTa v\ no3BO/iHBa taxhoto 
M3nt^HeHne v\ cbxpaHeHwe c noMOurra Ha K/iacoBeTe ot npocrpaHCTBOTO 

System. Reflection . Emit. 

AceM6/iMTaTa ct>fli>p>KaT IL koa 3a M3ni>siHeHMe 

AceM6^MTaTa CbfltpwaT KOMnM/iMpaHM .NETTunoBe - nporpaMeH koa bbb bma 
Ha MHCTpyKUMM Ha e3MKa Intermediate Language (IL), komto ce M3n"b/iHflBa ot 
CLR npe3 KOMnM^auMfl ,qo MaujMHH03aBMCMM KOfl. Ba>KHO yc/iOBMe 3a M3n"b/i- 
HeHMe Ha IL KOfla e Ha/iMUMeTO Ha MeTaAaHHM 3a aceM6/iMTO m aceM6/iM 

MaHMCpeCT. 

AceM6^MTaTa ce 3anMCBaT bbb cpai/i/iOBe, komto ca bbb cpopMaT PE (portable 
executable). Te3M cpai/i/iOBe HaM-^ecTO hocat pa3UJMpeHMfl .exe v\nv\ .dii. 
BceKM npeHOCMM M3n"b/iHMM cpai/i/i (PE cpai/i/i) MO>Ke fla MMa BxoflHa TOUKa 3a 

M3n"b/lHeHMe - CpyHKUMfl DllMain(...) , WinMain(...) M/1M Main (...), CbOTBeTHO 3a 

AMHaMM4HM 6m6/imot6km, Windows GUI npM/io>KeHMfl m koh30/ihm npM^oxeHMfl. 
BxoflHaTa TOUKa MO>Ke fla e HaM-MHoro eflHa. 

AceM6/iMTaTa 4>opMnpaT rpamma 3a CMrypHOCira 
(security boundary) 

KofltT, komto ce cwvbpwa b flafleHO aceM6/iM, M3MCKBa onpefle/ieHM npaBa 3a 
flocTbn m M3n"b/iHeHMe. AceM6/iMTaTa ca eflMHMua, koato MO>Ke fla M3MCKBa m 
no/iynaBa onpefle/ieHM npaBa (permissions). KoraTO ce cb3flaBa aceM6/iM, 
HeroBMAT pa3pa6oT4MK Moxe fla nocouM MMHMMa/ieH Ha6op ot npaBa, komto 
aceM6/iMTO 3afl"b/i>KMTe/iHO M3MCKBa, 3a fla pa6oTM. 

fla/iM onpefle^eHM npaBa me ce flaflaT Ha flafleHO aceM6/iM 3aBMCM ot 
no^MTMKMTe 3a CMrypHOCT Ha .NET Framework m t. Hap. flOKa3aTe/icrBa, komto 
MMa aceM6/iMTO - uMCppoB noflnMC, cm/iho MMe (strong name), Mecrono.no- 
>KeHMe (URL, UNC) m flp. HanpMMep aKO flafleHO aceM6/iM ce 3apeflM ot 



750 nporpaMnpaHe 3a .NET Framework (tom 2) 

MHTepHeT aflpec, komto He e yi<a3aH KaTO curypeH (trusted) b Internet 
Explorer, to aceM6/ii/iT0 ce crapTkipa c orpaHwueHM npaBa, nacr ot komto e 
orpaHi/meH flocrbn ,qo cpaw/iOBaTa ci/icreMa, KaTO cpaw/iOBe ce 3anncBaT b t. 
Hap. Isolated Storage . 

AceM6/iMTaTa 4>opMnpaT rpaHMua 3a TMnoBeTe (type 
boundary) 

Bcako aceM6/ii/i o6rp"biua TunoBeTe, komto cbfltpwa. MfleHTi/mHOCTra Ha Tuno- 
BeTe e CBtp3aHa c MMeTO Ha aceM6/iMTO, b KoeTO ce HaMnpaT. ToBa 03HanaBa, 
ne TuntT MyType, ,qeK/iapi/ipaH b assembiyi.dll, He e eflHaKtB c Tuna 

MyType, fleK/iapkipaH B assembly2.dll. TOBa n03BO/lflBa nO-TO/lAMa FbBKaBOCT 

m He3aBMCMMOCT Ha MMeHaTa npn Kancy/ikipaHe Ha cpyHKuwoHa/iHOcr b aceM- 
6/iMTaTa. 

AceM6/iMTaTa 4>opMnpaT rpamm.a Ha BMflMMOCTTa 
(reference scope boundary) 

MaHkicpecTbT Ha aceM6/iMTaTa (me ce cnpeM Ha Hero Ma/iKO no-HaTaTbK b 
HacToaiuaTa TeMa) cbfltpwa MeTaflaHHM, komto ce i/i3no/i3BaT 3a HaMnpaHe Ha 
TunoBeTe v\ pecypcuTe, BK/iioneHki b aceM6/iMTO. MaHncpecTbT onpefle/ia Tuno- 
BeTe m pecypcuTe, komto ca bmammm m3bbh rpaHMUMTe Ha aceM6/ii/iTO (ot 
Apyrn aceM6/ii/iTa). B Hero ce onucBaT cbu\o v\ aceM6/ii/iTaTa, komto ce m3mck- 
BaT, 3a fla ce i/i3n"b/iHki ochobhoto aceM6/iw. 

AceM6/iMTaTa 4>opMnpaT rpaHMua Ha BepcMMTe 
(version boundary) 

AceM6/iMTO e Haw-Ma/iKaTa eflHHi/iu.a, koato npnTe>KaBa Bepcua b CLR. Bepcua 
ce 3aflaBa Ha bcmukm TunoBe v\ pecypcn b flafleHO aceM6/iw 3aeflHO KaTO eflkm 
o6eKT. 

B .NET Framework e B"b3MO>KHO pa3/innHw Bepcun Ha eflHO v\ cbu\o aceM6/iw fla 
cbmecTByBaT n fla ce i/i3n"b/iH*iBaT eAHOBpeMeHHO, 6e3 fla cm npenaT. ToBa 
peiuaBa mhoto npo6/ieMM, npeflM3BMKaHM ot kohcp/imktm bbb BepcunTe. 

MaHkicpecTtT onucBa touho BepcuaTa Ha aceM6/ikiTO, KaKTO v\ BepcunTe Ha 
aceM6^MTaTa, komto ce M3MCKBaT, 3a fla ce ki3n"b/iHi/i to. 

AceM6/iHTaTa ca eflMHuua 3a cnoflesifme 

AceM6/iMTaTa ca Haw-Ma/iKaTa eflMHMua, koato MO>Ke fla 6"bfle cnofle/ieHa Me>K- 
fly hako/iko .NET npw/io>KeHkifl. OcHOBeH HanwH Ha cnofle/iflHe e fla ce flafle Ha 
aceM6/ii/iTO cm/iho MMe (bm>k. Cmjiho MMeHVBaHe Ha aceM6;m ) v\ fla ce nocTaBM 
b GAC (Global Assembly Cache), flpyr Ham/m e fla ce MHCTa/ii/ipa KaTO nacTHO 
aceM6/iw KtM flafleHO npi/i/io>KeHkie. rioflpo6HO me pa3r/ie,qaMe Te3M TexHMKM b 
nacrTa " Pa3npocTpaHeHne Ha aceM6^MTa ". 



T/iaBa 25. AceM6/iMTa v\ pa3npocTpaHeHne 



751 



AceM6/iMTaTa ca earn-in mm 3a pa3npocTpaHeHne 
(deployment units) 

AceM6^MTaTa cpopMnpaT ocHOBHa nporpaMHa eflUHnua 3a pa3npocrpaHeHkie. 
KoraTO ce crapTkipa ep.no .NET npn^OKeHne ca My Heo6xoflMMM caMO aceM- 
6/iMTaTa, komto ce M3BMKBaT n"bpBOHana/mo. OcraHa/iMTe aceM6/iMTa (KaTO 
pecypcn 3a /iOKa/iki3auwfl v\nv\ Aont/iHkiTe/iHki Mop,ynv\) ce 3ape>KflaT npn ntp- 
boto mm noncKBaHe (on demand). ToBa no3BO/isiBa npn/iOKeHM^Ta p,a ce 
noAA"bp>KaT Ma/iKM v\ yao6hm npn ntpBOHana/iHO pa3npocrpaHei-me. Ta3M 
B"b3MO>KHOCT e oco6eHO Ba>KHa npn TexHO/iorwflTa .NET Zero Deployment, 
koato me onuiueM no-KtCHO b HacToaiuaTa TeMa. 

MeTaflaHHM v\ MaHMCpecT Ha aceM6/in 

Bcako aceM6/iw, He3aBMCMMO p,anw e cram 4 ho v\nv\ AHHaMMUHO, cbAtpwa b 
ce6e cm MeTaAaHHM (nHCpopMauna, koato ro onucBa). 

MeTaAaHHMTe BK/iK>nBaT onucaHne Ha ctAtpxaHMTe b aceM6/iMTO TunoBe v\ 
MHCpopMaunfl 3a Hero caMOTO. 



MaHiic^ecT Ha aceM6/iu 

l/lHCpopMaunflTa 3a aceM6/ikiTO onucBa KaK ca CB"bp3aHM cbAtpwaHMTe e/ie- 
MeHTM noMe>KAy cm - TOBa e t. Hap. MaHMCpecT. MaHkicpecrbT cbAtpwa bcmh- 
km MeTaAaHHM, Hy>KHM 3a onucaHneTO Ha i/iAeHTMUHOora Ha aceM6/ii/iTO, 
MHCpopMaunfl 3a HeroBaTa Bepcua, Heo6xoAHMMTe My npaBa, aceM6/iMTaTa v\ 

BepCMMTe MM, Hy>KHM 3a M3n"b^HeHMeTO My, KaKTO m Aont/iHi/iTe/iHa MHCpopMa- 

Ukifl, Heo6xoAMMa 3a M3B/ikinaHeTO Ha TunoBeTe v\ pecypcuTe. 

MaHncpecTtT MO>Ke p,a ce cbAtpwa b caMOTO aceM6/ii/i (b HeroBna .exe v\nv\ 
.dii npeHOCMM M3nt^HMM cpaw/i) 3aeAHO c ocraHa/ikiTe pecypcn v\nv\ KaTO 
caMOcroflTe/ieH cpaw/i, komto cbAtpwa caMO MHCpopMaunaTa Ha MaHwcpecra. 

C^eABaiuaTa ki/uocrpaukifl noKa3Ba pa3/iwnHHTe HankiHM, no komto ce cbxpa- 
HflBa MaHncpecTa b aceM6/iMTaTa: 



EfliiOHOflyjiiio aceMUnii 



MHoroHOflynHO aceMbrm 



1 
1 






1 
1 
1 
1 


b, 

Filel.dll 




1 
1 


Manifest 


\ \ 


1 
1 







File2.dll 



Gi'iphic.Jpg 



LCflCbUftp 



Manifest 



L — — — , 



752 



flporpaMnpaHe 3a .NET Framework (tom 2) 



ripn aceM6/iMTa, komto cbfltpaoT eflMH cpai/i/i, MaHMCpecrbT e BMtKHaT b PE 
cpaw/ia m o6pa3yBa aceM6/iM ot eflMH cpai/i/i. B"b3MO>KHO e cb3flaBaHeTO Ha 
MHoroMOAy/iHO aceM6/iw c BtHweH MaHncpecT v\nv\ MaHncpecTbT MO>Ke fla e 
BMtKHaT b eAMH ot cpai/i/iOBeTe. 

CiDfliDp>KaHMe Ha MaHMC^ecTa 

C^eAHaTa Ta6/iMua noKa3Ba cbAtpxaHneTO Ha MaHMCpecra: 



llH4>opMai4iin 


OnMcaHkie 


s 
ro 

s 

â– a 

s 

H 
I 
CD 
d 


MMe 


TeKCT, yKa3Baiu MMe Ha aceM6/iM. 


Bepcusq 


CtA"bp>Ka 4 MAeHTucpMKaTopa pa3p,enenv\ eAMH ot 

APyr C TOUKa B"bB CpopMaT: Major. Minor. 
Build. Revision (Hanp. 3.44.1234.5543). 


Ky/iTypa 


RFC1766 HM3, yKa3Baiu perMOHa/iHM HacrpofiKM 
(locale) Ha aceM6/ii/iTO - HanpuMep "en-us". Ta3M 
MHCpopMaunfl Tpa6Ba Aa ce M3no/i3Ba, KoraTO ce 
cb3AaBa caTe^MTHO aceM6/iw 19 , cbAtpwamo cne- 
UncpM4Ha Ky/iTypHa v\ e3MKOBa MHCpopMauna. 
B"b3MO>KHO e aceM6/ii/iTO aaec HeyTpa/iHa Ky/iTypa. 
(AceM6/iMTa c MHCpopMauna 3a Ky/iTypaTa aBTO- 
MaTi/mHO ce Bt3npneMaT KaTO caTe/iMTHM). 


MHCpopMaunfl 

3a CM/1HO 

MMeHyBaHe 


CbAtpwa ny6^M4HMfl k/ik>h, M3no/i3BaH 3a uncp- 
poBMfl noAnnc Ha aceM6/iMTO, aKO to npnTe>KaBa 

CM/1HO MMe. 


CnncbK Ha 

cpaw^OBeTe, BK/iK>neHM 
b aceM6/iMTO 


Xeiu ctomhoct m MMe Ha cpaki/i, BK/iioneH b aceM- 
6/imto. 3a6e/ie>KKa: Bcmukm cpaM/iOBe Tpa6Ba Aa ca 
b nanKaTa, KtAeTO ce HaMMpa e cpaM^tT, 
c"bA"bp>Kaiu MaHMCpecTa. 


C"bA"bp>KaHM TunoBe 


Ta3M MHCpopMauMfl ce M3no/i3Ba no BpeMe Ha 
M3n"b^HeHMe 3a 3ape>KAaHe Ha TMnoBeTe AeK/ia- 
pMpaHM b aceM6/iMTO. 


BtHiuHM aceM6/iMTa 


CnMCbK c bcm4km BtHiuHM aceM6/iMTa, komto ca 
CTaTM^HO CB"bp3aHM. Bcsiko CBtp3aHO aceM6/iM e 
onMcaHO c MMe m MeTaAaHHM (BepcMfl, Ky/iTypa, m 
t.h.) m ny6/iMneH k/ikdh, aKO e cm/iho MMeHyBaHO. 


M3MCKBaHM npaBa 3a 
Aocrbn 


Heo6xoAMMM npaBa, 3a Aa ce M3n"b/iHM aceM6/iMTO. 



19 CaTe^MTHOTO aceM6/iM npeAcraB/iflBa aceM6/iM, KoeTO cbAtpwa caMO 
pecypcM 6e3 M3n"b/iHMM koa [7]. 



T/iaBa 25. AceM6/inTa v\ pa3npocTpaHeHne 



753 



ntpBMTe 4eTnpn enetAenja (MMe, Bepcua, Ky/iTypa, ny6/iwneH k/ikdh) o6pa- 
3yBaT MfleHTMCJJMKaMMflTa Ha aceM6/iw - HeroBcrro cm/iho MMe. 



ATpn6yTM 3a pa6oTa c MaHMcjDecT 

B .NET Framework v\wa hako/iko aTpn6yTa, npe3 komto MO>KeM p,a B^mieM Ha 
KOMni/i/iauwflTa Ha aceM6/ikiTaTa v\ p,a npoMeHAMe MeTaflaHHMTe b TexHua MaHM- 
cpecT. Te3M aTpn6yTM ce 3anncBaT b cope KOAa Ha aceM6/ii/iTO v\ npn KOMni/i/ia- 
\\v\s\ MOAMCpnunpaT MeTaflaHHMTe. Eto no-Ba>KHMTe ottjix: 



ATpn6yT Ha MaHn4>ecTa 


OnMcaHMe 


As semblyCultureAt tribute 


RFC1766 HM3 yKa3Baiu KbM koa Ky/i- 
Typa npkiHafl/ie>KaT pecypcuTe, ctfltp- 
xaHM ot aceM6/iMTO. OopMaTa e 

"e3MK"-"cTpaHa mjim perwoH" - 

HanpuMep "en-us" 3a US English v\nv\ 
"bg-BG" 3a pecypcn Ha 6-b/irapcKM 
e3MK. Ky/iTypaTa MO>xe p,a 6"bAe chuxo 
HeyTpa/iHa, KoeTO noKa3Ba, ne aceM- 
6/imto cbfl"bp>Ka pecypcn 3a Ky/iTypaTa 
no noflpa36npaHe. 

3a6e/ie>KKa: CLRTpeTupa bcako aceM- 
6/iki c T03M aTpn6yT 3a caTe/ii/iTHO. 


As semblyFlagsAt tribute 


YKa3Ba p,anv\ aceM6/ikiTO noAA"bp>Ka 
eAHOBpeMeHHO pa3/innHw Bepcun B 
eAMH KOMnKDTbp, b eAHH npouec V\I\V\ B 
eAMH AOMeMH Ha npn^OKeHne (t. Hap. 
side-by-side M3n"b/iHeHkie, KoeTO me 
pa3r/ieAaMe no-noApo6HO b ceKunaTa 
3a Global Assembly Cache). 


AssemblyVersionAttribute 


CbAtpwa 4 MAeHTucpMKaTopa pa3Ae- 

/leHkl C TOUKa: Major. Minor. Build. 

Revision (Hanp. 3.44.1234.5543). 


As semblyCompanyAt tribute 


TeKCTOB hm3, yKa3Bam MMe Ha kom- 
naHMATa, npoi/i3BOAHTe/i Ha aceM- 

6/1MTO. 


As semblyCopyrightAt tribute 


TeKCTOB hm3, onwcBam aBTOpCKM 
npaBa. 


AssemblyFileVersionAttribute 


TeKCTOB hm3, yKa3Bam Win32 cpaw- 
nosa Bepcufl. no noApa36npaHe TOBa 
e BepcuflTa Ha aceM6/ii/iTO. 


Assemblylnf ormational- 
VersionAttribute 


TeKCTOB hm3, yKa3Bam Bepcufl, KOflTO 
He ce ki3no/i3Ba ot CLR. ToBa MO>Ke p,a 
6"bAe Bepcufl Ha npoAyKT v\nv\ Apyra, 



754 



flporpaMnpaHe 3a .NET Framework (tom 2) 





koato hocm MHCpopMaunfl 3a pa3pa- 

60T4MUMTe. 


As semblyProductAt tribute 


TeKCTOB Hi/i3, yKa3Baiu MMe Ha cocpTy- 
epeH npoAyKT. 


As semblyTrademarkAt tribute 


TeKCTOB hm3, yKa3Bam TbproBCKa 
MapKa. 


AssemblyConf igurationAttribute 


TeKCTOB HM3, yKa3Bam KOHCpwrypaui/m 
Ha aceM6/ii/iTO (Release v\nv\ Debug). 
CLR He M3no/i3Ba T03M aTpn6yT. 


AssemblyDef aultAli a sAt tribute 


TeKCTOB hm3, yKa3Bam nceBflOHMM no 
noflpa36npaHe, komto me ce M3no/i3Ba 
npn CB"bp3BaHe ot bbhiuhm aceM- 
6/iMTa. Mo>Ke fla 6"bfle ziecHO 3a 
M3no^3BaHe MMe (flOKaTO MMeTO Ha 
aceM6/iMTO Mowe p,a He e). Moxe p,a e 
cbmo ctKpaTeHa cpopMa Ha nt/iHOTO 
MMe Ha aceM6/iMTO. 


AssemblyDescriptionAttribute 


TeKCTOB hm3, cbfltpwam KpaTKO onu- 
caHne Ha cbfltpwaHkieTO v\ ue/iTa Ha 
aceM6/ii/iTO. 


As semblyTitleAt tribute 


TeKCTOB hm3, yKa3Bam ziecHO MMe Ha 
aceM6/iMTO (Hanp. Microsoft Common 
Dialog Control). 



ATpn6yTM 3a pa6oTa c MaHMCpecr - npuMep 

Eto eflMH npuMep, b komto npe3 aTpn6yTM ce 3aflaBaT MeTaflaHHM 3a aceM- 
6/imto: 



Assemblylnf o . cs 


using Syst 


em. Reflection; 




[assembly: 


AssemblyTitle ( "Advanced Toolbar 


Control") ] 


[assembly: 


AssemblyDescription ( 




"Advance 


d Toolbar Windows Forms Control" 


)] 


[assembly: 


AssemblyConf iguration ( "Release" 


] 


[assembly: 


AssemblyCompany ( "Software Abuse 


Corp. ") ] 


[assembly: 


AssemblyProduct ( 




"Software Abuse Windows Controls Library 


")] 


[assembly: 


AssemblyCopyright ( 




"(c) 2005 by Software Abuse Corp.")] 




[assembly: 


AssemblyCulture ( " " ) ] 




[assembly: 


AssemblyVersion ("3.22.*") ] 





T/iaBa 25. AceM6/iMTa v\ pa3npocTpaHeHne 755 

B"bB VS.NET MeTaflaHHMTe 3a aceM6/ikiT0 o6mkhob6ho ce 3anncBaT bbb cpaw/ia 
Assembiyinfo.es, komto ce cb3flaBa aBTOMaTMUHO c BceKM hob npoeKT (OCBeH 
aKO npoeKTtT He e ot Tun "Empty Project"). B npuMepa CMe M3no/i3Ba/in to3m 
cpaw/i, 3a p,a AecpMHupaMe MeTaAaHHM 3a aceM6/ii/iT0, ro KoeTO ce KOMnw/inpa 
TeKyiunfl npoeKT - KOHTpo/iaTa "Advanced Toolbar Control". 

Cb3flaBaHe Ha MHoroMOfly/mo aceM6/m 

Cnep, KaTO o6acHMXMe noHATneTO "aceM6/in", HeKa cera HaB/ie3eM Ma/iKO no- 
A"b/i6oKO. AceM6/iMT0 MO>Ke p,a cbCTOM ot eflMH cpaw/i (v\nv\ moav/i - TOBa e 
HaM-necro cpeiuaHaTa cpopMa) v\nv\ ot hhko/iko TaKMBa. AceM6/ikiTa, komto ce 
cbCTOAT ot noBene to eAHH cpaw/i ce HapwuaT "MHoroMOAynHM aceM6/iMTa". 

npn4MHMTe p,a ce ki3no/i3BaT MHoroMOMOAynHki aceM6/ii/iTa ca [8]: 

1. KoM6i/mi/ipaHe Ha MOAynn, HanncaHM Ha pa3/iwnHn e3nun b eAHO 
aceM6/iw. BceKM MORyn ce KOMnn/iwpa OTAe/iHO c noAxoA^iu KOMnw/iaTop 
m ce CB-bp3BaT 4pe3 Assembly Linker (Ai.exe) . 

2. ripn M3no^3BaHe Ha No-Touch Deployment (.NET Zero Deployment) ce 
CBa/iyi caMO M3MCKBaHMfl MOAy/i, KoeTO HaMa^ABa Mpe>KOBMfl TpacpMK M 
BpeMeTO 3a crapTkipaHe Ha npw/io>KeHkieTO. IHe pa3r/ieAaMe no 
noApo6HO Ta3M TexHO/iorwyi no-HaAO/iy. 

3. ripn M3no/i3BaHe Ha cpaw/i c no/iMTi/iKa Ha v\3p,ajej\s\ (publisher policy file) 
- bm>k C"b3AaBaHe Ha Publisher Policy File - KOHCpurypaunoHHUfl cpaw/i ce 
npneMa 3a ntpBM Mop,yn ot aceM6/ii/iT0 c no/ikiTkiKkiTe Ha v\3p,aTens\ . 

fla pa3MeAaMe CTtnKMTe, npe3 komto MO>KeM p,a cb3AaAeM aceM6/ii/i, KoeTO ce 

CbCTOM OT HflKO/IKO CpaM/ia. 

TbCi KaTO VS.NET He MO>Ke p,a cb3AaBa MHoroMOAy/iHM aceM6/ikiTa, aKO ce 
Ha/io>KM p,a M3no/i3BaMe TaKMBa, MOxeM p,a vv\ cb3AaAeM ot KOMaHAHna peA 
npe3 noAxoA^iun M3BMKBaHMfl Ha C# KOMnw/iaTopa (csc.exe). 

CT"bnKa 1: KoMim/iMpai-ie Ha MOAyv komto me 6i>Ae M3no/i3BaH 
ot APyrM aceM6/iMTa 

C"b3AaBaMe cpaw/i utiiities.es etc cneAHOTO cbAtpwaHwe: 



Utilities . cs 



// Assembly building in the .NET Framework - example 
using System; 

namespace Utilities 

{ 

public class ConsoleFunctions 

{ 

public void ConsoleWrite ( ) 

{ 



756 flporpaMnpaHe 3a .NET Framework (tom 2) 



System. Console .WriteLine ( "A line from Utilities!"); 
} 
} 
} 



KoMni/i/ii/ipaMe ro c KOMaHAaTa: 



esc /target :module Utilities.es 



C/iefl ycneujHOTO KOMnw/ikipaHe e c"b3flafleH cpaw/i utilities. netmoduie b 
ctiuaTa nanKa. 

CrbnKa 2: KoMnmmpaHe Ha aceM6/in, KoeTO M3no/i3Ba Bene 
cb3AaAeHMn MOAyi 

Ct3AaBaMe cpaw/i ciient.es b cbmaTa nanKa: 



Client. cs 



using System; 

using Utilities; // The namespace created in Utilities . netmoduie 

class MainClientApp 

{ 

// Static method Main is the entry point method, 
public static void Main ( ) 

{ 

ConsoleFunctions myFunctions = new ConsoleFunctions ( ) ; 
Console .WriteLine ( "Client code executes") ; 

// Call function from module Utilities . netmoduie 
myFunctions . ConsoleWrite ( ) ; 
} 
} 



MoxeM p,a ro KOMnw/iwpaMe c KOMaHAaTa ioto /addmoduie yKa3Ba Ha kom- 
nn/iaTopa, ne me ce M3no/i3Ba MeTOAH ot MOAy/ia utilities. netmoduie: 



esc /target :module Client.cs /addmoduie : Utilities . netmoduie 



T03M n"bT KOMnkl/iaTOp"bT Cb3AaBa CpaM/ia Client, netmoduie. 

CrbnKa 3: CBi>p3BaHe Ha Monynme b aceM6/in npe3 Assembly 
Linker 

B Ta3M CTtnKa me w3no/i3BaMe MHcrpyMeHTa Assembly Linker (Ai.exe), 3a p,a 
CBtpxeM MOAy/iMTe b eAHO aceM6/iw. CrapTwpaMe KOMaHAaTa ai.exe etc 
cneAHkiTe napaMeTpn ( b eAMH peA ): 



T/iaBa 25. AceM6/iMTa v\ pa3npocTpaHemie 



757 



al Client . netmodule Utilities . netmodule 

/main :MainClientApp .Main /out :myAssembly . exe /target : exe 



Pe3y/iTaTbT ot ki3n"b/mei-ii/ieT0 Ha Ta3M KOMaHfla e cpaw^tT myAssembiy.exe. 
napaMeTpnTe, komto noflafloxMe, MMaT cneflHMTe 3HaneHM*i: 

- ntpBMTe flBa napaMerbpa ca MOfly/iMTe, komto cb3flafloxMe b npeflMw- 

HMTe CTbnKM. 

- /main - yKa3Ba BxoflHaTa TOUKa Ha cb3,qaBaHOTO aceM6/iM (MeTOfla, 
komto me no/iynki ynpaB/ieHMeTO npn CTapTupaHe). 

- /out - yKa3Ba MMeTO Ha cpaw/ia, komto me 6"bfle cb3fla,qeH. 

- /target:exe - yKa3Ba fla Ce Cb3flafle M3n"b/1HMM CpaM/1 3a KOH30/ia. 

HeKa bmamm pe3y/iTaTa ot w3n"b/iHeHkieTO ot cb3fla,qeHOTO aceM6/iM: 



c v Visual Studio .NET 2003 Command Prompt 



D:NPro jects\Book\Mu.ltiflssenbly>nyflssenbly .exe 

Client code executes 

This is a line from ConsoleUrite . 

D:\Pro jects\Book\Multiflssenbly>_ 



-ln|x| 








3a fla ce 3apefln acewGnvno Tpn6Ba fla ca Ha/nmHM bcmhkm 
MOfly/iM. ToBa ce Ha/iara ot cbaxTa, ne aceM6/iMTO ce komiim- 

/IMpa OT IL KOA flO MaUJMHH03aBMCMM KOfl OT JIT KOMnM- 

iiaTopa. 



Pa3r/ie>KflaHe Ha MaHMcjDecTa Ha aceM6/iu c ildasm 

Bene ce 3ano3HaxMe KaKBO npeflcraB/isiBaT MaHncpecTMTe Ha aceM6/iMTaTa v\ 
KaK MOxeM fla npoMeHHMe MeTaflaHHMTe, komto ce 3anncBaT b tax npn KOMnn- 
ziauMH. HeKa cera bmamm KaK MO>KeM fla pa3r/ie,qaMe MaHMCpecra Ha cbiuecTBy- 
Baiuo aceM6/iM. 

MSIL Disassembler (ildasm.exe) e npMflpywaBam MHcrpyMeHT kbm MSIL 
Assembler (iiasm.exe). C to3m MHCTpyMeHT MO>Ke fla ce pa3r/ie>Kfla cbfltp- 
xaHMeTO Ha aceM6/iMTaTa m MOfly/iMTe. MSIL Disassembler e nacr ot .NET 
Framework SDK m ce HaMMpa no noflpa36MpaHe b flMpeKTopM^Ta 

%ProgramFiles%\Microsoft Visual Studio .NET 2003\SDK\vl . l\bin. 

3a fla pa3r/ieflaMe MeTaflaHHMTe m MaHMCpecra Ha aceM6/iMTO ciient.exe, 
no/iyneHO b ropHMa npMMep, me ro otbopmm c MSIL Disassembler npe3 
c^eflHMfl KOMaHfleH pefl, komto e M3n"b/iHeH bbb Visual Studio .NET 2003 
Command Prompt (crapTMpa ce ot 6yTOHa Start-> Prog rams-> Microsoft Visual 



758 flporpaMnpaHe 3a .NET Framework (tom 2) 



Studio .NET 2003->Visual Studio .NET Tools->Visual Studio .NET 2003 
Command Prompt): 



ildasm Client.exe 



1 F Client.exe - IL DASM 


-ln|x| 


File View Help 


B-v Client.exe 




â– HxmanifestH 


B-^ MainClienlApp 

â–º .class private auto ansi beforefieldinit 

â–  .ctor : void() 

EH Main : void() 


.assembly Client 
{ 

u 


t 





flBOMHO lupaKBaHe c neBwn 6yTOH Ha MkiwKaTa Btpxy "MANIFEST" me 
OTBopn npo3opeu etc cbfltpaoHkieTO Ha MaHkicpecra: 



/ MANIFEST 



^Jnjx 



{ 



.nodule extern Utilities. netnodule 
.assembly extern mscorlib 

.publickeytoken = (B7 7fl 5C 56 19 34 E0 89 ) 

.hash = (39 E4 FC 93 06 1fl 5E 87 28 97 OF 5F AC AD B4 21 / 

EF 71 E8 D2 ) / 

.uer 1:8:5888:8 

> 

.assembly Client 

{ 

// The following custon attribute is added automatically 

// .custom instance void [mscorlibJSystem. Diagnostics. Debug 

// 

.hash algorithm 8x80808884 

.uer 8:8:8:8 

> 

.file Utilities. netmodule 

.hash = (99 F6 4E ED B7 ED 77 FC 5E 43 4F E7 F8 C2 85 B4 
57 8F 4B 3B ) 
.class extern public Utilities. ConsoleFunctions 
{ 

.file Utilities. netnodule 
.class 8x82888882 

> 

.module Client.exe 

// MUID: {45381C31-9D3F-4905-9D8E-0F2F26730D79} 

.imagebase 8x00400000 

.subsystem 0x00000003 

J I 



T/iaBa 25. AceM6/inTa v\ pa3npocrpaHeHkie 759 

KaKTO ce Bw>Kfla, MaHwcpecrbT flecpMHupa aceM6/ikiTO client, KoeTO cbfltpwa 

MOfly/ia Client.exe M pecpepupa B"bHLUHI/lfl MOfly/1 Utilities, netmodule OT 
Cpai/i/ia Utilities, netmodule, KaKTO M B"bHUJHOTO aceM6/lM mscorlib M B"bH- 
UJHMfl K/iac Utilities. ConsoleFunctions. 

rioBene MHCpopMaunfl othocho MSIL Disassembler MO>KeTe fla HaMepnTe b 
MSDN b CTaTMATa http://msdn.microsoft.com/librarv/default.asp7urN/library/ 
en-us/cptools/html/cpconMSILDisassemblerlldasmexe.asp . 

Cm/i ho MMeHyeaHe Ha aceM6/in 

C ue/i noBMiuaBaHe Ha ci/irypHOcrra v\ HaMa/iflBaine Ha KOHCp/iMKTMTe c Bep- 
cnnTe b .NET Framework ca BtBefleHM t. Hap. cm/iho MMeHyBaHM aceM6/iMTa. 
Cm/ihoto MMe Ha aceM6/iw ce o6pa3yBa ot HeroBMTe MMe, Bepcua, Ky/iTypa v\ 
ny6/ikmeH k/ik>h. Bcako cm/iho MMeHyBaHO aceM6/ii/i e uncppoBO noflnwcaHO c 
^acTHMfl k/ikdh, cbOTBeTCTBaiu Ha ny6^M4HMfl k/ik>h, komto yuacrBa B CM/1H0T0 
My MMe. flpuMep 3a cm/iho MMe Ha aceM6/iw e cnep,uv\s\T hm3: 



CompanyName space . Controls . Design . v3 . 2 , Version=3 .2.111251.37, 
Culture=neutral, PublicKeyToken=8ty5c317 6f 5cd0 4e 



Cm/iho MMeHyBaHMTe aceM6/ikiTa MMaT hakom npeflMMCTBa npefl o6nKHOBeHMTe 
aceM6/ikiTa: 

- TapaHTupa ce yHMKa/iHOCTra, c noMOurra Ha flBOMKa K/iK>noBe (public / 
private key pair). Hmkom He Moxe fla Cb3flafle aceM6/in etc ctiuoTO MMe, 
6e3 fla npnTe>KaBa nacmi/ifl k/ik>h. AceM6/ii/i, cb3fla,qeH0 c eflMH nacreH 
k/ikdh, ce pa3/iwnaBa ot aceM6/ii/i, cb3flafleH0 c Apyr nacreH k/ik>h. 

3aiunTaBa pofloc/iOBkieTO Ha BepcunTe. HoBa Bepcua, koato e cb3fla,qeHa 6e3 
npnTexaBaHeTO Ha cbmkia HacreH k/ikdh KaTO npeAxoAHaTa, ziecHO MO>Ke fla 
6"bfle MfleHTMCpnunpaHa. 

- 3aiflMTaBa ce ue/iocrra Ha aceM6/iMT0 v\ p,ap,euv\je My npaBa 
(permissions), no to3m HanwH ce rapaHTupa, ne noflMAHa Ha aceM6/iw, c 
ue/i M3no^3BaHe Ha HeroBMTe npaBa (permissions) e HeB"b3M0>KH0. 

CaMO cm/iho MMeHyBaHM aceM6/ikiTa MO>Ke fla ce ,qo6aBflT b o6/iacn"a Global 
Assembly Cache, koato me flucKyTupaMe cnefl Ma/iKO. 

CiD3flaBaHe Ha cm/iho MMeHyBaHO aceM6/iw - npMMep 

B c/ieflBaLUkifl npuMep me c"b3flafleM cm/iho MMeHyBaHO aceM6/iw v\ me noKa>KeM 
oco6eHOCTMTe b HeroBna MaHncpecT. 

ritpBO me cb3flafleM flBOMKa ny6/ikmeH / nacreH k/ikdh (public/private key 
pair). 3a ue/iTa i/i3no/i3BaMe Strong Name i/mcrpyMeHTa (sn.exe), komto e 
4acT ot .NET Framework SDK: 



sn -k keypair.snk 



760 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Ta3M KOMaHfla reHepupa no cnynaeH HanwH flBOMKa ny6/ikmeH/nacreH k/ikdh m 

TM 3anMCBa B"bB CpaM/ia keypair.snk. 

Cnep, KaTO Bene MMaMe flBOMKaTa K/iK>noBe, MO>KeM fla npucTtnuM kbm Cb3fla- 
BaHe Ha ci/i/iho MMeHyBaHO aceM6/ii/i: 

1. CTapTupaMe Visual Studio .NET 2003. 

2. Cb3flaBaMe hob npoeKT ot Tun Class Library: File -> New -> Project -> 
Visual C# Projects -> Class Library. 3aflaBaMe MMe Ha npoeKTa 

MyStrongNamedAssmbly M nOTB"bp>KflaBaMe C 6yTOHa [OK]. 

3. KoMnw/iwpaMe npoeKTa. Cb3flaAOXMe o6mkhob6ho aceM6/iw (to ce 
HaMupa b noAAnpeKTopuflTa bin\Debug\ Ha npoeKTa, bbb cpaw/ia 

MyStrongNamedAssembly.dll). HerOBklflT MaHMCpeCT kl3r/ie>KAa no C/ieA- 
HM5i Hankm: 



f MANIFEST 



^\Dl2<\ 



.assembly extern mscorlib 



.publickeytoken 
.uer 1 :O:5B00:0 



(B7 7A 5C 56 19 34 E0 89 ) 



} 

.assembly MyStrongNamedAssembly 

{ 

.custom instance uoid [mscorlibJSystem. Reflection. flsse 
.custom instance uoid [mscorlibJSystem. Reflection. flsse 

// The following custom attribute is added automat 

// .custom instance uoid [mscorlibJSystem. Diagnostics 

// 

.hash algorithm 0x00008004 

.uer 1:0:2120:41943 

} 

.module MyStrongNamedflssembly .dll 

// MUID: {f6C5A3D0-A79E-4EAf-AB7D-557F2C9016D6> 

.imagebase 0x11000000 

.subsystem 0x00000003 

.file alignment 4096 

.corflags 0x00000001 

// Image base: 0x02c60000 

J 



mblyK 

mblyD 

icall 

Debu 



J 



KonnpaMe c"b3AaAeHna no-rope cpai/i/i keypair.snk b nanKaTa, koato 

C"bA"bp>Ka VS.NET npoeKTa (MyStrongNamedAssembly.csproj). 

Ot Solution Explorer OTBapaMe cpai/i/ia Assembiyinfo.es v\ HaMnpaMe 

peAa [assembly: AssemblyKeyFile ( " " ) ] . TOBa e aTpi/l6yTbT, KOMTO 

me M3no/i3BaMe, 3a p,a noconi/iM ABOMKaTa ny6/iwneH/nacTeH k/ikdh. 
KOHCTpyKTOptT Ha AssemblyKeyFileAttribute npneMa KaTO napaMeTbp 
MMe Ha cpaw/i, cbAtpwam ABOMKaTa K/iK>noBe. Mo>Ke p,a 6"bAe tbi>pa ntT 



T/iaBa 25. AceM6/iMTa v\ paanpocrpaHemie 



761 



(c:\keyfiles\keypair.snk) V\J\V\ OTHOCMTe/ieH n"bT CnpflMO obj\Debug 

noflflnpeKTopuflTa Ha npoeKTa. B Haujua cnynai/i MO>KeM fla 3aflafleM 

OTHOCMTe^eH n"bT: . .\- -\keypair.snk. 



6. npOMeHflMe aTpn6yTa AssemblyKeyFileAttribute Ha 
AssemblyKeyFile (@" . . \ • • \keypair. snk" ) ] : 



[assembly: 







[assembly: AssemblyDelaySign( false) ] 
[assembly: AssemblyKeyFile( @" . .\. . \MyKeyPair 
[assembly: AssemblyKeyNarne( " " ) ] 


,snK">] 


1 


Output 







Ready 




Lnl 



7. KoMni/i/ii/ipaMe npoeKTa othobo. Cera Bene cb3flaAOXMe ci/i/iho iiMe- 
HyBaHO aceM6/ii/i (to ce HaMupa othobo b noflflnpeKTopnaTa bin\Debug\ 

Ha npoeKTa, B"bB Cpafi/ia MyStrongNamedAssembly.dll). HerOBMflT MaHM- 

cpecT ce pa3/iwnaBa ot npeAxoAHna no .pubiickey nacrTa: 



/ MANIFEST 



^M*\ 



.custom instance uoid f nscorliblSgstem.Ref lection .AsserTiblgKegNamefltt^l 
.custom instance uoid [mscorlib]System.Ref lection. AssemblyKeyFileAtt 



.cu 
// 
// 
// 



stom instance uoid [mscorlibJSystem. Reflection. AssemblyDelaySignA 
- The follouing custom attribute is added automatically, do not 
custom instance uoid [mscorlibJSystem. Diagnostics. DebuggableAttl 



// - 
// - 
// ) 
// ' 
// - 
// 1 
// - 
// - 
// . 
// - 



.pubiickey = (00 


24 


00 


00 


on 


80 


00 


00 


94 


00 


00 


00 


06 


02 


00 


00 


00 


24 


00 


00 


52 


53 


41 


31 


00 


04 


00 


00 


01 


00 


01 


00 


29 


B1 


28 


7C 


84 


0E 


11 


E7 


94 


6C 


9F 


9A 


9B 


19 


9D 


21 


22 


4E 


B1 


4E 


5C 


E5 


AF 


E8 


30 


CD 


01 


00 


30 


A4 


1B 


08 


EB 


01 


F7 


07 


35 


64 


0A 


60 


C1 


EA 


61 


D8 


07 


69 


7B 


90 


5E 


7D 


D6 


B4 


42 


05 


CA 


EA 


80 


D5 


45 


44 


88 


E9 


31 


25 


AD 


9A 


30 


39 


3D 


65 


BD 


D7 


42 


28 


83 


0D 


CC 


FA 


DE 


45 


DA 


BA 


F5 


25 


19 


9C 


50 


C2 


B2 


4E 


13 


30 


1A 


DO 


9B 


7C 


94 


5F 


AA 


A0 


FD 


CF 


AB 


77 


00 


23 


9A 


AF 


27 


A6 


23 


6E 


B5 


C5 


A6 


9F 


74 


B0 


46 


C8 


45 


D3 


25 


80 


AE 


54 


08 


BD ) 



.ha 
.ue 

} 

.modu 
// MU 
.imag 



sh algorithm 0x00008004 
r 1:0:1985:31868 

le MyStrongHamedAssnbly.dll 

ID: {6A0B25F0-B75D-4C98-A33E-3B9DD5EA8131} 

ebase 0x11000000 



KoHcjDMrypaiJiMOHHM 4>aM/iOBe b .NET Framework 

KoHCpurypaunoHHMTe cpaw/iOBe b .NET Framework ca TeKCTOBM cpaw/iOBe b 
XML cpopMaT m cnywaT 3a 3aflaBaHe Ha pa3/ikmHM HacrpowKki Ha .NET npw/io- 
>KeHi/i*rra. CbmecTByBaT hako/iko BMAa KOHCpurypaunoHHM cpaw/iOBe: 



762 



flporpaMnpaHe 3a .NET Framework (tom 2) 



1. KoHCpurypaunoHeH cpaw/i 3a HacrpoMKMTe Ha MaiunHaTa 

Machine . config - T03M CpaM/1 ce Ha MM pa B %runtime install path%\ 
Config (HanpMMep C:\WINDOWS\Microsoft.NET\Framework\vl.l.4322\ 

config) m ctfltpxa HacTpowKM OKa3Baiun B^MAHne Btpxy CLR 3a /lOKa/iHwa 

KOMnKDTtp. 

2. KoHCpurypauMOHHM cpaw/iOBe Ha npn^OKeHMATa - cbAtpwaT HacrpoMKM, 
cneuncpM4HM 3a p,ap,eHv\ npM/ioxeHMfl. Te ca ABa BMAa: 3a ye6-6a3npaHM 
npn^o>KeHMfl ce Ka3BaT BMHarn web. config v\ ce HaMnpaT b KopeHHaTa 
AnpeKTopua Ha ye6 npn^OKeHneTO v\nv\ ye6 ycnyraTa b Internet Informa- 
tion Server v\ 3a Windows-6a3npaHM npM/io>KeHMfl - o6pa3yBaT ce ot MMeTO 
Ha npn^OKeHneTO c .config pa3UJnpeHne (HanpuMep: aKO MMaMe npi/i/io- 
>KeHne MyLibrary.dll, KOHCpurypaunoHHMflT My cpaki/i me ce Ka3Ba 

MyLibrary . dll . config) . 

3. Publisher Policy File - yi<a3BaT Ha bcmukm npM/io>KeHMfl p,a M3no/i3BaT no- 
HOBa Bepcufl Ha bbhluho aceM6/iM ot Ta3M, cnpaMO koato ca 6m/im 
KOMnn^npaHM (version redirect). rio-HaTarbK me pa3r/ieAaMe KaK ce 
M3no/i3BaT (b>k. Cb3AaBaHe Ha Publisher Policy File ). 

4. KoHCpurypaunoHHM cpaw/iOBe 3a curypHOCTTa (security policy) - CbAtpwaT 
onucaHne Ha npaBaTa 3a ki3n"b/iHeHkie Ha MHcra/iMpaHMTe aceM6/iMTa. B 
.NET Framework CbiuecTByBaT hako/iko HMBa Ha curypHOCT: 

- hmbo opraHM3aunfl 

- HMBO MailJMHa 

- hmbo noTpe6MTe/i 

C/ieABaiuaTa Ta6/iMu.a noKa3Ba taxhoto MecTono/ioweHMe b 3aBMCMMOCT ot 
onepauMOHHaTa CMCTeMa: 



Enterprise security policy configuration file 


Windows 2000, XP, 2003 


^runtime install path%\Conf ig\ 
Enterprisesec . config 


Windows NT 


^runtime install path%\Conf ig\ 
Enterprisesec . config 


Windows 98 and Windows 
Millennium Edition (Windows Me) 


^runtime install path%\Conf ig\ 
Enterprisesec . config 



Machine security policy configuration file 


Windows 2000, XP, 2003 


^runtime install path%\Conf ig\ 
Security. config 


Windows NT 


^runtime install path%\Conf ig\ 
Security. config 


Windows 98 and Windows Me 


^runtime install path%\Conf ig\ 
Security. config 



T/iaBa 25. AceM6/iwTa v\ pa3npocTpaHeHne 



763 



User security policy configuration file 


Windows 2000, XP, 2003 


%USERPROFILE%\Application Data\ 
Microsof t\CLR security config\ 
vxx . xx\ Security. conf ig 


Windows NT 


%USERPROFILE%\Application Data\ 
Microsof t\CLR security config\ 
vxx . xx\ Security. conf ig 


Windows 98 and Windows Me 


%WINDIR%\username\CLR security 
conf ig\ vxx . xx\ Security. conf ig 



Bcm4km Te3M KOHCpurypaunoHHM cpaw/iOBe ca Ba>KHM 3a pa3npocTpaHeHneTO Ha 
.NET npn^o>KeHMflTa, Ha KoeTO me ce cnpeM cnefl Ma/iKO. 

KaK CLR HaMiipa aceM6/iMTaTa? 

Ba>KHO e 3a pa3pa6oTBaHeTO v\ pa3npocrpaHeHi/ieTO Ha .NET npi/i/io>KeHkm fla 
ce no3HaBa KaK CLR Ttpci/i aceM6/ikiTaTa, komto .qafleHO npn^OKeHne M3MCKBa, 
3a fla ce M3n"b/iHM. no noflpa36wpaHe CLR ce onuTBa fla HaMepn aceM6/iMTaTa 
etc ctiuaTa Bepcua, c kohto npw/iOKeHweTO e 6m/io KOMnn/iwpaHO. KoraTO 
.NET npn^OKeHne n3MCKa bbhluho aceM6/iw, ce i/i3n"b/iHflBaT cneflHi/iTe crbnKki: 

1. Onpefle/iyi ce BapHaTa Bepcua Ha hy>khoto aceM6/iw - npe3 npoBep^BaHe 
Ha KOHCpurypaunoHHMTe cpai/i/iOBe (3a HacrpoMKi/iTe Ha MawkmaTa, Ha 
npn^OKeHneTO v\ publisher policy file). 

2. ripoBepsiBa ce p,anv\ npn^OKeHneTO e ki3no/i3Ba/io aceM6/ii/i etc cbiuoTO 
HMe. B TaKbB cnynaw ce 3ape>Kfla nocneAHOTO ki3no/i3BaHO aceM6/iw. 

3. npoBepsiBa ce Global Assembly Cache. Ako aceM6/ii/i etc cbmoTO MMe ce 
HaMupa TaM, ce ki3no/i3Ba to. 

4. M3n"b/iHflBa ce TtpceHe Ha aceM6/iw (assembly probing) npe3 c/ieflHMTe 
CTbnKw: 

- Ako KOHCpurypaunoHHMTe cpaw/iOBe He npoMeHAT BepcwflTa Ha m3mck- 
BaHOTO aceM6/iw, ToraBa CLR ce onuTBa fla Ha/iynKa Mecrono/iOKeHweTO 
My KaTO ce 6a3npa Ha HeroBOTO MMe. 

- Ako e HaMepeH <codebase> e/ieMeHT b KOHCpurypaunoHHMTe cpaw/iOBe ce 
Tbpcw caMO b ntTfl, noconeH TaM. Ako aceM6/ii/iTO He e HaMepeHO, ce 
perncTpupa rpeujKa v\ ce npeKpaTABa TbpceHeTO. 

- Ttpcn ce b noflflnpeKTopnnTe, noconeHki b <probing> ceKu.i/mTa Ha 
KOHCpurypauMOHHMfl cpaw/i Ha npi/i/io>KeHkieTO. Ako He e HaMepeHO 
aceM6/ikiTO, ce npaBM 3a^BKa kbm Windows Installer fla i/iHcra/ikipa 
M3MCKBaHOTO aceM6/ii/i. Ta3M B"b3MO>KHOCT Ha Windows Installer ce 
Hapwua MHCTa^npaHe npn 3aaBKa (install-on-demand). 



& 



3a aceM6/ii/iTa, komto He ca cm/iho MMeHyBaHM, CLR He npoBep^Ba 
GAC 3a taxhoto Ha/iwnne v\ He npoBepyiBa BepcuaTa. 



764 nporpaMnpaHe 3a .NET Framework (tom 2) 

npiiMep 1: T"bpceHe Ha aceM6/in (probing) 

3a fla noacHMM onucaHMa npouec, me flafleM ep,v\H npuMep. HeKa MMaMe 
Windows-6a3npaHO npw/io>i<eHMe BaseDir\MyApp.exe, KoeTO M3no/i3Ba pecyp- 
cm ot aceM6/in MyLibrary, KoeTO He e cm/iho MMeHyBaHO. KoHCpurypaunoH- 

HMJ1T Cpai/i/1 MyApp . exe . conf ig Cbfl"bp>Ka: 



MyApp . exe . conf ig 



<?xml version="l. 0" encoding="utf-8 " ?> 
<conf iguration> 
<runtime> 

<assemblyBinding xmlns="urn : schemas-microsof t-com: asm. vl"> 

<p robing privatePath="bin; bin2\subdir"/> 
</assemblyBinding> 
</runtime> 
</conf iguration> 



ripn CTapTMpaHe Ha MyApp.exe aceM6/ll/ITO MyLibrary ce TbpCkl B C/ieAHMTe 
AnpeKTopnn: 



BaseDir\MyLibrary . dll 
BaseDir\MyLibrary\MyLibrary . dll 
BaseDir\bin\MyLibrary . dll 
BaseDir\bin\MyLibrary\MyLibrary . dll 
BaseDir\bin2\subdir\MyLibrary . dll 
BaseDir\bin2\subdir\MyLibrary\MyLibrary . dll 
(nocjie cbimrae $awjioBe, ho c pa3iuwpeHMe .exe) 



C noMOurra Ha MHcrpyMeHTa Assembly Binding Log Viewer (Fusiogvw.exe), 
komto e nacr ot .NET Framework SDK, MO>xe p,a ce pa3r/ieAa AeTaw/iHO b kom 
AnpeKTopnn m b KaKtB peA CLR Tbpcn aceM6/ii/iTaTa. 

npMMep 2: T-bpceHe Ha aceM6/iu c Tara <codebase> 

HeKa pa3LunpMM Ma/iKO npeAxoAHna npuMep. flo6aBflMe b KOHCpwrypauwoHHi/m 

Cpaki/1 MyApp . exe . conf ig Tar <codebase> B naCTTa Me>KAy TarOBeTe 
<dependentAssembly> M <dependentAssembly>. 



MyApp . exe . conf ig 



<?xml version="l. 0" encoding="utf-8 " ?> 
<conf iguration> 
<runtime> 

<assemblyBinding xmlns="urn: schemas-microsof t- 
com: asm. vl"> 

<dependentAssembly> 

<assemblyldentity name="MyLibrary"/> 
<codeBase version="2 . . . 0" 



T/iaBa 25. AceM6/iMTa v\ pa3npocTpaHeHne 765 



href="CodeBase\MyLibrary.dll" /> 
</dependentAssembly> 

<p robing privatePath="bin; bin2\subdir; Libl"/> 
</assemblyBinding> 
</runtime> 
</conf iguration> 



ripn CTapTkipaHe Ha MyApp.exe aceM6/ll/ITO MyLibrary ce Bene TbpCM B caMO B 

noconeHaTa AnpeKTopua: 



CodeBase\MyLibrary . dll 



3a6e/ie>KKa: CLR flopn He onuTBa fla HaMepn aceM6/iM MyLibrary.exe. 




npM noconeH Tar <codebase> CLR rbpcu aceM6sm caMO c 
noconeHO MMe v\ caMO b nocoHeinaTa flnpeKTopnn. Ako He 
6i>fle HaMepeHO aceM6/iwro, TbpceineTO ce npexpaTABa v\ ce 
cbo6uj|aBa 3a rpewxa. 



Ci>3flaBaHe Ha Publisher Policy File 

Oaw/iOBeTe c no/iMTMKa Ha v\3p,ajej\s\ (publisher policy file) ca cneuwa/ieH bma 
KOHCpurypaunoHHM cpaw^OBe, komto ce KOMnw/ikipaT v\ MHcra/iMpaT b Global 
Assembly Cache v\ yKa3BaT Ha bcmukm npM/io>KeHMfl fla M3no/i3BaT no-HOBa 
Bepcufl Ha B"bHiuHO aceM6/iM ot Ta3M, cnpaMO koato ca 6m/im KOMnw/ii/ipaHki 
(version redirect). 

M3no^3BaHeTO Ha TaKMBa cpaM/iOBe MO>xeM fla fleMOHCTpupaMe npe3 hhko/iko 
CTbnKn: 

1. C"b3flaBaMe cpaw/i c MMe pubPoiicy.config (c Notepad v\nv\ Visual 
Studio .NET - H^Ma npeflBapMTe/iHO 3aflafleHM Lua6/iOHM c Visual Studio 
.NET). Ue/ua Ha to3m cpafi/i e fla yKawe Ha CLR npn M3BMKBaHe Ha 

aceM6/lklTO C nOCOneHMfl MaHMCpeCT (MMe - myRedirectedAssembly, 
ny6/lMHeH K/1KDH - 32ab4ba45e0a69al, BepCMfl - i.o.o.o)fla ce 3apeflM 
aceM6/iw etc CbiflOTO MMe m ny6/iMneH k/ikdh, ho BepcMfl 2.0.0.0. 
rioHewe to3m cpaM/i yKa3Ba no/iMTMKa Ha 3ape>KflaHe Ha aceM6/iMTa tom 
ce HapM^a publisher policy file. KaTO cbfltpaoHMe B"bBe>KflaMe cneflHOTo: 



pubPolicy . conf ig 



<conf iguration> 
<runtime> 

<assemblyBinding xmlns="urn : schemas-microsof t-com: asm. vl"> 
<dependentAssembly> 

<assemblyldentity name= "myRedirectedAssembly" 

publicKeyToken="32ab4ba45e0a69al" /> 
<!-- Redirecting to version 2.0.0.0 --> 



766 flporpaMnpaHe 3a .NET Framework (tom 2) 



<bindingRedirect oldVersion="l .0.0.0" 
newVersion="2 .0.0. 0"/> 
</dependentAssembly> 
</assemtalyBinding> 
</runtime> 
</conf iguration> 



KoMnn^npaMe Ha publisher policy file ao publisher policy assembly. IHe 
M3no^3BaMe cb3Rap,eHwn cpai/i/i, 3a fla cb3fla,qeM aceM6/iw v\ fla ro 
MMeHyBaMe cm/iho (me M3no/i3BaMe cbiuaTa flBOMKa ny6/ii/meH / nacreH 

K/1KDH, KOflTO C"b3AaAOXMe B TOUIOTa Cb3flaBaHe Ha CM/IHO MMeHVBaHO 

aceM6jin . ToBa CTaBa c noMOurra Ha MHcrpyMeHTa Assembly Linker 

(al . exe) : 



al /link : pubPolicy . conf ig 

/out :policy.l.O .myRedirectedAssembly . dll /keyf ile : keypair . snk 



M3xofl"bT ot Ta3M KOMaHAa e aceM6/iw, 3anncaHO bbb cpai/i/i c MMe 

policy. 1 . .myRedirectedAssembly. dll. 

3. flo6aBflHe b GAC. Heo6xoflMMO e TaKa cb3fla,qeHOTO Publisher Policy 
Assembly fla 6-bfle Ao6aBeHO b Global Assembly Cache . ToBa CTaBa etc 
c/ieflHaTa KOMaHfla: 



gacutil /i policy . 1 . .myRedirectedAssembly . dll 



(3a noBe^e MHCpopMauna b>k. http://msdn.microsoft.com/library/default.asp? 
url=/library/en-us/cpquide/html/cpconcreatinqpublisherpolicyfile.asp ). 

Global Assembly Cache 

Bc*iKa MaujMHa (nepcoHa/ieH KOMniOTbp, mo6m/iho ycTpowcTBO v\ flp.), Ha koato 
e MHCTa^npaH .NET Framework, MMa o6/iacr Hape^eHa Global Assembly Cache 
(GAC). GAC e cneu.ua/iHO npoeKTupaH fla cbfltpwa aceM6/iMTa, komto MoraT 
fla ce no/i3BaT ot hako/iko pa3/ikinHM npn^OKeHna. Ue/ua e o6iunTe KOMno- 
HeHTM ot pa3/ikmHki cocpTyepHM npoflyKTM fla He ce fly6/ikipaT, a fla ce ny6/iw- 
KyBaT KaTO o6lum v\ fla ca flocTbnHM 3a bcmukm npn^OKeHna. ripuMep 3a TaicbB 
o6iu KOMnoHeHT MO>Ke fla 6"bfle 6ki6/ikiOTeKa 3a rpacpi/meH noTpe6wTe/iCKki 

MHTepCpeMC, KOflTO flOCTaBfl CbBKynHOCT OT rpac|DM4HM KOHTpO/ll/l. TaKMBa 

kohtpo^m MoraT fla ce ki3no/i3BaT b mhoto npw/io>i<eHi/m m He e Heo6xoflMMO 
bcako ot tax fla kiHCTa/iwpa 6ki6/ikiOTei<aTa nooT,qe/iHO. 

3a fla ce M3flCH*iT no-flo6pe ue/iTa v\ npeflMMCTBaTa Ha GAC, me onuiueM 
ntpBO flBe flpyrn noHflTna - DLL aflvr (DLL Hell) v\ side-by-side execution. 

DLL afli>T (DLL Hell) 

DLL an ce Hapi/ma CMTyaunaTa, b koato wHcra/iaui/mTa Ha flafleHO npw/io- 
>KeHne 3aMeHfl cbiuecTByBaiu cpai/i/i (.dll, .ocx v\i\v\ .vbx) c no-CTapa Bepcua 



T/iaBa 25. AceM6/iMTa v\ pa3npocrpaHeHkie 



767 



v\nv\ HOBa Bepcufl, koato He e cbBMecri/iMa c flpyrnTe Bepcun. B TaKbB c/iynai/i 
npn^o>KeHMfl, M3no/i3Baiun pecypcn ot BtnpocHMfl cpai/i/i, cnnpaT fla pa6oTAT. 
riocneflHOTO MHCTa^npaHO npi/i/io>KeHi/ie pa6oTM, ho bcm^km ocraHa/iki, komto 
M3no^3BaT pecypcn ot BtnpocHi/m cpaw/i, He pa6oT*iT KopeKTHO. 
noTpe6nTe^flT, komto He e fl/i"b>KeH fla no3HaBa Ta3M cuTyauna, xBtp/ifl 
BMHaTa Btpxy npoki3BOflkiTe/ifl Ha (Bene) Hepa6oTemi/m cocpTyep. 

Side-by-side execution 

Side-by-side execution ce Hapwna B"b3MO>KHOCTTa eflHOBpeMeHHO fla cbiue- 
CTByBaT m fla ce M3no/i3BaT npi/i/io>KeHkifl, KOMnoHeHTM v\ flopn CLR c pa3/innHw 
Bepcuki Ha eflMH KOMmoTbp. OyHKunflTa Ha GAC e fla HaMepn v\ 3apeflM 
aceM6/iMTO etc noconeHaTa Bepcua, flopn v\ aKO ta He e nocneflHa. 

C/ieflBaiuaTa rpacpMKa noKa3Ba KOMmoTbp, Ha komto MMa kmcra/ikipaHki Bepcun 
1.0 m 1.1 Ha .NET Framework, neTwpw npw/io>KeHkifl (A-D), komto i/i3no/i3BaT, 
pa3^M4HM Bepcun Ha KOMnoHeHTa comp. Bepcuki 1.0 m 2.0 Ha comp i/i3no/i3BaT 
.NET Framework 1.0, flOKaTO Bepcua 3.0 M3no/i3Ba .NET Framework 1.1. 




npeflMMCTBa m HeflOCTarbu.ii Ha GAC 

1/lHcra/ikipaHeTO Ha aceM6/iMTa b GAC MMa cneflHMTe npeflMMCTBa: 

- EflMHCTBeHO MflCTO 3a i/iHcra/iwpaHe Ha aceM6/ikiTa, komto ce M3no/i3BaT 
ot MHO>KecTBO npM/io>KeHMfl . Mhoto no-/iecHO e 3a MHcra/iwpaHe Ha HOBa 
Bepcufl Ha flafleH KOMnoHeHT b GAC v\ cb3flaBaHe Ha publisher policy file 
3a npeHaconBaHe bcmukm npn^OKeHMa fla M3no/i3BaT HOBaTa Bepcua, 
otko/ikoto fla ce TtpcflT BCM4KM Koni/m b nacmwTe nanKM Ha pa3/ii/mHMTe 
npn^o>KeHMfl. 

- rio-flo6po 6"bp30fleMCTBne npn uncppoBO noflnncaHMTe aceM6/iMTa - TOBa 
e TaKa, 3aiuoTO npoBepKaTa Ha uncppoBna noflnnc ce npaBM BeflH"b>K - 
npn MHCTa^npaHe b GAC, flOKaTO npn nacmwTe aceM6/ii/iTa ce npaBM Ha 
bcako 3ape>KflaHe. 



768 nporpaMnpaHe 3a .NET Framework (tom 2) 

- no-flo6po 6"bp30fleMCTBne v\ cnecrsiBaHe Ha pecypcn npn 3ape>KflaHe Ha 
hako/iko Konnfl ot eflHO m Cbu\o aceM6/iw - b TaicbB cnynaw CLR npocTO 
npeHacouBa 3aaBKMTe kbm Bene 3apeAeHOTO aceM6/iw, BMecTO p,a 3ap,enn 
naMeT v\ p,a 3ape>KAa aceM6/iw b naMerra othobo. 

- PeiuaBa npo6/ieMa c DLL aAa v\ no3BO/iHBa side-by-side execution. 
M3no/i3BaHeTO Ha GAC v\wa v\ CBOMTe HeAOcraTbuw: 

- AceM6/ikiTaTa, komto ce MHcra/ikipaT b GAC Tpa6Ba 3aA"b/i>KkiTe/iHO p,a ca 

CM/1HO MMeHyBaHM. 

- GAC ce HaMkipa B %systemroot%\assembly M KaTO nOAAHpeKTOpMfl Ha 

Windows ce M3MCKBaT aAMMHMCTpaTopcKM npaBa, 3a p,a ce npoMeHH 
c"bA"bp>KaHMeTO My. 

- flupeKTHO KonnpaHe b GAC He e AonycTMMO - aceM6/iMTaTa Tpa6Ba p,a ce 
MHcra/ikipaT nocpeACTBOM hakom ot c/ieAHMTe HankiHw: 

o Hpe3 Windows Installer 2.0. 

o Hpe3 MHCTpyMeHTa gacutil.exe ot .NET Framework SDK. 

o Hpe3 Windows Shell pa3UJnpeHneTO 3a Windows Explorer, 

CbA"bp>KamO Ce B SHFusion.dll. 

o Hpe3 aAMMHMCTpaTMBHaTa KOH30/ia Ha .NET Framework - 

mscorcf g . msc. 

o Hpe3 API CpyHKUMMTe Ha K/iaca Microsoft . CLRAdmin . Fusion OT 
.NET Framework 6w6/iMOTeKaTa mscorcfg. 

Pa6oTa c GAC - npiiMep 

B c^eABaiunfl npuMep me i/i3no/i3BaMe cm/iho MMeHyBaHOTO aceM6/iw 

MyStrongNamedAssembly.dll OT naCTTa " Cb3AaBaHe Ha CI/IJ1HO MMeHVBaHO 

aceM6^n ", 3a p,a i/i/uocTpwpaMe pa6oTaTa c GAC: 

1. flo6aBAMe aceM6/iMTO b GAC cbc cnep,uaja KOMaHAa: 



gacutil 


/i 


MyS t r ongNamedAs s embl y 






2. 


3a p,a bmamm cbAtpwaHi/ieTO Ha GAC 


M3no^3BaMe 


KOMaHAaTa: 


gacutil 


/I 


MyStrongNamedAssemtaly 







Pe3y^TaT"bT ot Ta3M KOMaHAa Tpa6Ba p,a e noAo6eH Ha cnep,Hv\n: 



T/iaBa 25. AceM6/iMTa v\ pa3npocrpaHeHkie 



769 



c\ C:\WIND0WS\system32\cmd.exe 



^n}><] 



C:Ntemp\MyStrongNamedAssembly\binSDebug>gacutil -1 MyStrongN 
amedAssembly 

Microsoft CR> .NET Global Assembly Cache Utility. Uersion 1 

.1.4318.0 

Copyright <C> Microsoft Corporation 1998-2002. fill rights re 

serued. 

The Global Assembly Cache contains the following assemblies: 

MyStrongNamedAssembly, Uersion=l .0.2120.41985, Cultu 
re=neutral, PublicKeyToken=a7Qf f 5dc5a095ee5, Custom=null 

The cache of ngen files contains the following entries: 

Number of items = 1 

C:\temp\MyStrongNamedAssembly\b in \De bug >_ 



3. 3a fleperncTpaunfl (M3TpMBaHe) Ha aceM6/iw ot GAC ki3no/i3BaMe 
cneflHaTa KOMaHfla: 



gacutil /u MyStrongNamedAssembly 



Pa3npocTpaHeHne m MHCTa/iupai-ie Ha nporpaMHii 
n a Kern 

C/iefl KaTO .NET npi/i/io>KeHi/ieTO e npeMi/ma/io ycneujHO npe3 cpa3MTe Ha pa3pa- 
6oTBaHe m TecTBaHe, Tpa6Ba fla ce Cb3fla,qe i/mcra/iaui/iOHeH naKeT (Windows 
Installer Package, MSI package), komto me ce i/i3no/i3Ba ot noTpe6kiTe/ikiTe Ha 
npw/io>KeHi/ieTO. Mhoto necro to3m eTan ce noflueHABa ot cocpTyepHMTe pa3- 

pa60T4MUM, HO TOM e M3K/lK)HklTe/lHO Ba>KeH OT MeflHa T04Ka Ha K/iweHTa. 

MHCTa^aunoHHMflT naKeT e ntpBu^T .qocer Ha K/ii/ieHTa etc cocpTyepHna 
npoAyKT m 3aTOBa tom cb3AaBa ntpBOTO BnenaT/ieHwe. KtM MHcra/iauMOHHHfl 
naKeT MMa mhoto M3MCKBaHMfl ho Haw-Ba>KHMTe ot tax ca cneflHMTe: 

- fla nocTaBfl Ha K/iweHTCKaTa Mawkma bcmuko Heo6xoflkiMO 3a HopMa/iHaTa 
ynoTpe6a Ha 3aKyneHMa cocpTyep, 6e3 fla ce npenw Ha ki3n"b/iHeHkieTO Ha 
Bene i/iHcra/iwpaHi/m cocpTyep; 

- fla 6"bfle zieceH 3a i/i3no/i3BaHe; 

- fla npeflocraBfl b"B3mo>khoct 3a flekiHcra/ikipaHe KaTO B"b3craHOB$iBa Ma- 
ujMHaTa flo npeflnujHOTO v\ cbCTOAHne. 

floKaTO TpeTOTO M3MCKBaHe e cpaBHMTe^HO ziecHO 3a nocTuraHe etc cbiuecTBy- 
BaiflMTe TexHO/iornn v\ btopoto 3aBkicn ot c/io>KHOCTTa Ha peiueHneTO M 
ayflMTopuflTa, KbM koato e HaconeHO npM/io>KeHMeTO, to 3a ntpBOTO e 
Heo6xoflMMa npeflBapwTe/iHa noflroTOBKa. ToBa ce o6ycnaBfl ot cpaKTa, ne 
pa3^M4HMTe TunoBe npw/io>KeHi/m ce kiHcra/iwpaT no pa3/ii/meH HanwH. 



770 



flporpaMnpaHe 3a .NET Framework (tom 2) 



B 3aBMCMM0CT ot Tuna Ha npn^OKeHneTO kiHcra/iaukiOHHkiflT naKeT BK/iiouBa 
pa3^M4HM KOM6nHaunM ot cbCTaBHMTe 4 a cm Ha npn^OKeHneTo: cpaw/iOBe v\ 
nanKi/i, aceM6/iMTa, i/iHcra/iauwoHHw KOMnoHeHTM, COM o6eKTM, ctpBtpHM kom- 
noHeHTM, 6a3M ashhh, HacTpoMKM Ha Internet Information Server v\ t. h. 



OaM/iOBe m nanKM 

CtiuecTByBaT mhoto pa3/ii/mHM BMAOBe cpaw/iOBe, komto MoraT p,a 6"bAaT 
MHCTa^npaHM 3aeflHO c npn^OKeHneTO. TunoBeTe cpaw/iOBe 3aBMCAT ot ro/ie- 
MMHaTa, ue/iTa, BMfla v\ cno>KHOCTTa Ha npw/io>KeHi/ieTO. C/ieABamaTa Ta6/iwua 
noKa3Ba Haw-necm M3no/i3BaHHTe TunoBe cpaw/iOBe, komto ce pa3npocrpaH*i- 
BaT c .NET 6a3npaHMTe npn^OKeHna: 



Tun Ha cpaftsia 


Windows 

npM/io>Ke- 

HMe/yc/iyra 


Ye6 

npmio>Ke- 

Hne/yc/iyra 


M3n"b/iHkiMki cpai/i/iOBe (.exe) 


X 


X 


AMHaMM4HM 6n6/lMOTeKM (.dll) 


X 


X 


KOHCpurypaunoHHM cpaw/iOBe (.config) 


X 


X 


6a3M OT flaHHM 


X 


X 


ye6 CTpaHMUM (.htm, .html M AP-) 




X 


ye6 CpopMM (.aspx, .ascx M AP-) 




X 


cpaw^OBe 3a ye6 ycnyri/i (.asmx, .disco, ...) 




X 


XML, XSD cpaw/iOBe 


X 


X 


Apyrn Heo6xoAMMM cpaw/iOBe 


X 


X 



KoHCpurypauuoHHM cpaftsiOBe 

KaKTO Bene onucaxMe, KOHCpurypaunoHHMTe cpaw/iOBe cbAtpwaT onpeAe/ieHw 
HacTpoMKM, B^Mfleiun Btpxy ki3n"b/iHeHi/ieTO Ha nporpaMaTa. Haw-ro/ieMi/mT 
npo6/ieM npn pa3npocTpaHeHne Ha KOHCpurypaunoHHMTe cpaw/iOBe e taxhoto 
ynpaB/ieHkie npn i/mcra/ikipaHe b pa3/ii/mHki o6Kp"b>KaBaiun cpeAM. 

HanpuMep, aKO b AaAeH npoeKT ce pa3pa6oTBaT Windows npw/io>KeHi/ie v\ ye6 
yc/iyra, to b KOHCpurypaunoHHMfl cpaw/i Ha Windows npi/i/io>KeHi/ieTO me ce 
CbxpaHflBa URL ao Ta3M ye6 yc/iyra. URL aApecbT o6ane me e pa3/iwneH npn 
pa3^M4HMTe eTann Ha pa3pa6oTBaHe, TecTBaHe, MHTerpupaHe Ha cwcreMaTa v\ 
npn pea/iHO cpyHKunoHnpaiua cpeAa. Heo6xoAHMOCTra ot pa3/innHw KOHCpury- 
paunoHHM cpaw/iOBe ce OTe>KHHBa v\ ot cpaicra, ne 3a OTAa/ieneHOTO M3BMKBaHe 
(.NET Remoting) ca Heo6xoAHMki Aont/iHMTe/iHM HacTpoMKM b KOHCpurypa- 
UMOHHMTe cpaw/iOBe, komto KopeHHO ce pa3/iM4aBaT b pa3/ii/mHi/iTe cpeAM m 
Tpa6Ba Aa ce TecTBaT ua/ioctho npn ki3no/i3BaHe Ha .NET Remoting TexHO/io- 
ruflTa. 



T/iaBa 25. AceM6/iMTa v\ pa3npocTpaHeHne 771 

kl3nosi3BaHe Ha KOHctwrypamioHHM cpausiOBe 

3a fla ce ynpaB/isiBaT no-/iecHO pa3/innkiTe KOHCpurypaunn, MO>Ke fla ce 
ki3no/i3Ba cneflHOTO peiueHne: 

1. flo6aBAMe KOHCpurypaunoHeH cpaw/i, Heo6xoflMM 3a cpeAaTa 3a pa3pa- 
6oTKa K"bM npoeKTa bbb Visual Studio .NET (App.config v\i\v\ web. 
config b 3aBMCMMOCT ot Ti/ina Ha npoeKTa). Visual Studio .NET aBTOMa- 
TM4HO flo6aB5i Web . conf ig npi/i Cb3flaBaHe Ha hobo ASP.NET npw/io- 
>KeHne. 

2. C"b3flaBaMe OT,qe/ieH KOHCpurypaunoHeH cpaw/i 3a BC^Ka cpefla, KbfleTO 
HacTpoMKMTe ce pa3/iwnaBaT. MMeHyBaMe vv\ TaKa, ne ot MMeTO mm fla 
CTaBa flCHO 3a KaKBa cpeAa ca Heo6xofli/iMM (Hanp. Test. web. config, 
Production. Web. config ) H rn fl06aBflMe K"bM npoeKTa. 

3. BK/iK)4BaMe caMO Heo6xoflMMMfl KOHCpurypaunoHeH cpaw/i b 3aBMCMMOCT 
ot cpeflaTa, b koato me ce kiHcra/ikipa, v\ ro npenMeHyBaMe Ha M3MCKBa- 
hoto MMe KaTO nacr ot MHCTa^aunoHHMfl npou.ec. M3MCKBaHMTe MMeHa ca 

<AppName>.exe. config 3a Windows npw/10>KeHI/lfl M/1M Web. config 3a 
ye6 npi/i/io>KeHi/ifl. 

ripouecbT Ha MHCTa^npaHe Ha KOHCpurypaunoHeH cpaw/i b TecTOBa cpeAa e 
noflo6eH Ha to3m 3a pea/iHO cpyHKunoHnpaiua cpefla. Ako, o6ane, ce 
MHcra/ikipaT pa3/ikmHki KOHCpurypaunoHHM cpai/i/iOBe, ToraBa cpai/i/ivr 3a pea/iHO 
cpyHKUMOHnpaiuaTa cpefla HHMa fla npeMMHe Heo6xoflMMM TecTOBe (me ocTaHe 
HeTecTBaH). 

EflMH ot HankiHMTe 3a peiuaBaHe Ha to3m npo6/ieM e fla He ce cb3flaBaT 
pa3^M4HM cpaw^OBe 3a TecTOBaTa v\ pea/iHaTa cpefla. Ako ca Heo6xoflMMM 
flont^HMTe^HM HacTpowKM b KOHCpurypaunoHHMfl cpaw/i 3a TecTBaHe, ToraBa 
TecTBaiflMflT eKnn Moxe fla vv\ npoMeHH npeflu fla 3anonHe TecTOBeTe. 

Oaii/iOBe 3a ye6 yc/iyrn 

Mhoto ot npo6/ieMMTe, 3acflraiun MHcra/ikipaHeTO Ha ye6 npn^OKeHMATa ce 
OTHacflT m 3a ye6 ycnyrwTe - HacTpoMKM Ha IIS, i/iHcra/iwpaHe Ha HTTP MOfly/in 
m o6pa6oT4Mun (HTTP handlers). 

Ma/iKa pa3/ii/iKa Me>Kfly ye6 npn/iOKeHn^Ta v\ ye6 ycnyrwTe npeflcraB/iHBa 
BMfltT Ha cpaw/iOBeTe. 3a ye6 npn^OKeHMATa ce MHcra/ii/ipaT npeflMMHO . aspx 
m . ascx cpaw/iOBe, flOKaTO ye6 yc/iyrwTe M3MCKBaT .asmx v\ .disco cpai/i/iOBe. 

XSD cpaiisiOBe 

XSD cpaw/iOBeTe ca flOKyMeHTM, komto cnywaT 3a flecpMHupaHe v\ npoBepKa Ha 
CbfltpxaHneTO m crpyKTypaTa Ha XML flOKyMeHTM. MHcra/ikipaHe Ha XSD 
cpaw/iOBe e Heo6xoflMMO caMO aKO npn^OKeHneTO MMa Hy>Kfla ot tax no BpeMe 
Ha M3n"b/iHeHkieTO cm. HanpuMep, aKO MeTOfl pa3pa6oTeH b ye6 yc/iyra Bptiua 
KaTO pe3y/iTaT ci/i/iho Tnnn3npaH Dataset, ToraBa XSD cpaw/itT Tpa6Ba fla ce 
kiHcra/ikipa (3aeflHO c ASMX v\ DISCO cpai/i/iOBeTe), Tbv\ KaTO ye6 ycnyraTa me 
cbfl"bp>Ka pecpepeHunfl kbm Hero. KoraTO pa3pa6oT4MUMTe pa3r/ie>KflaT DISCO 



772 nporpaMnpaHe 3a .NET Framework (tom 2) 

cpaw/ia Ha Ta3M ycnyra ot Visual Studio .NET Te me MoraT fla pa3r/ie,qaT v\ 
cxeMaTa 4pe3 Bp-b3KaTa View Schema. 

J# MHCTa/iaLiMOHeH naKeT (J# Redistributable Package) 

l/l h era /i a una Ha Visual J# .NET Redistributable Package (vjredist.exe) e 
Heo6xoAMMa, aKO npi/i/io>KeHi/ieTO M3no/i3Ba KOMnoHeHTM v\nv\ 6i/i6/iMOTeKM 
HanncaHM Ha Visual J#, noHe>Ke J# He e 4acT ot .NET Framework, a e 
Aon"b/iHMTe/iHO pa3LunpeHMe. 

AceM6/iMTa 

1/lHcra/ikipaHeTO Ha MHoroMO,qy/iHi/i aceM6/iMTa M3MCKBa Ha/ikmweTO Ha bcm^km 
MOflynw. B npoTMBeH c/iynai/i M3no/i3BaHeTO Ha aceM6/ii/i c /lwncBam MOfly/i me 
npeAM3BMKa rpewKa. 

Cn/i ho MMeHyBaHM aceM6/iMTa 

KoraTO .NET npw/io>KeHi/ie cb3flaBa pecpepeHuna kbm cm/iho MMeHyBaHO 
aceM6/iw, CLR M3MCKBa fla 6"bAe BK/iioneHa HeroBaTa Bepckm. ripn crapTwpaHe 
Ha npn^OKeHneTO CLR me Tbpcw aceM6/iw c noconeHaTa Bepcua. ToBa 
03Ha4aBa, ne aKO aceM6/iw c no-HOBa Bepcua 6"bfle KonnpaHO Btpxy cpaw/ia 
etc CTapaTa Bepcua, npi/i/io>KeHkieTO me cnpe fla pa6oTM. 

EflHO ot B"b3MO>KHMTe peweHkifl e MHCTa^npaHe Ha cm/iho MMeHyBaHOTO aceM- 
6/iw b GAC. rio-K"bCHO, npn pa3pa6oTBaHe Ha aceM6/ii/i c no-BMCOKa Bepcua ce 
pa3pa6oTBa v\ Publisher Policy File, komto onucaxMe b Tom<aTa 3a KoHcbki- 
rypauMOHHM cbaMJiOBe . Hoboto aceM6/iw v\ Publisher Policy File ctiuo ce 
MHCTa^npaT b GAC. no to3m Ha^MH BCM4KM npi/i/io>KeHi/ifl 3ano4BaT fla M3no/i- 
3BaT HOBaTa Bepcua Ha aceM6/ii/iTO. 

HacTHM aceM6/iMTa 

Ako flaAeHO aceM6/ii/i e npoeKTupaHO fla ce M3no/i3Ba caMO ot eflHO npw/io- 
>KeHne, to Tpa6Ba fla ce kiHCTa/iwpa KaTO nacmo aceM6/ii/i. HacmwTe aceM- 
6/iMTa o6nKHOBeHO ce kmcra/ikipaT b naniOTa Ha npw/io>KeHkieTO. flpyrn 
noflxoflfliun MecTono/io>KeHkifl Ha nacmwTe aceM6/ikiTa ca: 

- flupeKTopuflTa, cbfl"bp>Kaiua i/i3n"b/iHMMkifl cpaw/i v\nv\ HeMHa noflflnpeK- 

TOpMfl. 

- Bin naniOTa, HaMnpaiuaTa ce bbb BkipTya/iHaTa flupeKTopua Ha ye6 
npn^OKeHneTO v\nv\ ye6 ycnyraTa b IIS. 

- MecTono/io>KeHkie onucaHO c <codebase> e/ieMeHT b KOHCpurypaunoHHUfl 
cpai/i/i Ha npi/i/io>KeHkieTO. 

B noBeneTO cnynaw nacmi/iTe aceM6/ii/iTa cneflBa fla ce kmcra/ikipaT b flupeKTO- 
puflTa, cbfltpxama M3n"b/iHi/iMi/m cpaw/i, noHewe TOBa e mhctoto OTKtfleTO CLR 
3ano4Ba TbpceHeTO. 

HacTHMTe aceM6/ii/iTa ce M3no/i3BaT caMO ot npi/i/io>KeHi/ieTO, c KoeTO ca MHcra- 
/lkipaHM. no to3m Ha^MH npn^OKeHneTO e M30/ikipaHO ot ocraHa/ikifl cocpTyep 



T/iaBa 25, AceM6/inTa v\ pa3npocTpaHeHne 773 

Ha MaujMHaTa. ToBa e eflMH ot HanwHkiTe fla ce M36erHaT npo6/ieMWTe c 
pa3^M4HMTe BepcuM - t. Hap. "DLL afl". 

CnoAe/ieHM aceM6/iMTa 

B hakom c/iynaw ep.no v\ cbu\o aceM6/ii/i MO>Ke p,a ce i/i3no/i3Ba ot hhko/iko 
npn/ic»KeHkifl. ToraBa CbiuecTByBaT cnep,uv\je B"b3MO>KHOCTM 3a kiHCTa/iaukia: 

- MHCTa^npaHe Ha aceM6/iMTO c bchko npw/io>KeHi/ie KaTO nacmo aceM6/ii/i 
- no to3m HanwH bcako Konne e a6co/iK>THO He3aBMCMMO ot ocraHa/ikiTe. 
MHCTa^npaHeTO Ha MHO>xecTBO Konna nopa>Kfla onpeAe/ieHw npo6/ieMM, 
komto cneABa p,a ce B3eMaT noA BHMMaHne: B"b3MO>KHO e p,a cbmecTByBaT 

MHO>KeCTBO BepCMM Ha aCeM6^MTO, KOMTO AOpM M3n0^3BaT pa3^M4HM 

BepcuM Ha .NET Framework; npn Ha/ikmweTO Ha onpeAe/ieHi/i npo6/ieMki c 
aceM6/iMTO, komto ca OTcrpaHeHM b cnep,Bauxv\ Bepcun ce cb3AaBaT 
TpyAHOCTM etc 3aMAHaTa Ha bcmukm Konna Ha MawkmaTa. 

- MHCTa^npaHe Ha aceM6/ii/iTO b eAHa o6iua AnpeKTopua - 3a bchko ot 
M3no^3BaiunTe ro npi/i/io>KeHkifl ce nocouBa Ta3M AnpeKTopua c 
<codebase> eneMenja b KOHCpurypaunoHHMfl cpaw/i. Ako ce ki3no/i3Ba 
eAHa AnpeKTopua 3a bcm^km cnoAe/ieHM aceM6/iMTa Ha AaAeHa KOMna- 
HMfl, ce 3ary6Ba B"b3MO>KHOCTTa 3a side-by-side execution, ho ce 
peiuaBaT npo6/ieMi/iTe c BepcnoHM3npaHe Ha aceM6/iMTaTa (3a p,a e 
B"b3MO>KeH "bnrpeMA Ha aceM6/iMTa c npocTO KonnpaHe Te He Tpa6Ba p,a 
6"bAaT cm/iho MMeHyBaHn). Tpa6Ba p,a ce n/iaHkipa BHkiMaTe/iHO M36op Ha 
noAo6Ha CTpaTerna, 3aiuoTO, aKO Ha cneABam eTan B"b3HMKHe M3MCKBaHe 
3a M3no/i3BaHe Ha side-by-side execution, crpaTeri/iflTa Tpa6Ba p,a ce 
CMeHM, KoeTO me AOBeAe ao TpyAHOCTM. 

- MHCTa^npaHe b GAC - npenoptni/iTe/iHO e npn kiHcra/iwpaHe Ha aceM6/ii/i 
b GAC p,a ce i/i3n"b/iH*iBa 6poeHe Ha pecpepeHu.ni/iTe, 3a p,a ce M36erHe 
npeMaxBaHeTO Ha aceM6/iw ot GAC, AOKaTO Bee oiue cbiuecTByBa 
npn^oxeHne Ha Mawi/maTa, KoeTO ro M3no/i3Ba. CbmecrByBaT ABa 
Ha^MHa p,a ce nocTurHe TOBa: 4pe3 Windows Installer v\nv\ npe3 
gacutii.exe (n3no^3BaT ce napaMeTpw /ir 3a kmcra/ikipaHe v\ /ur 3a 
AeMHcra/iwpaHe 4pe3 6poeHe Ha pecpepeHunnTe). 

noTpe6nTe/iCKM kohtpo/im mn Windows Forms (Windows Forms 
User Controls) 

noTpe6wTe/iCKi/iTe kohtpo/im Tun Windows Forms ca aceM6/iMTa, komto MoraT 
Aa ce M3BMKBaT ot ye6 CTpaHnun KaTO ce CBa/iflT Ha K/iweHTCKaTa Mawkma v\ ce 
CTapTupaT ziOKa/iHO Ha Hea. no noApa36npaHe TaKi/ma kohtpo/im pa6oTHT c 
HaMa^eHM npaBa, 3a Aa He 3acrpaujaBaT ci/irypHOcrra Ha noTpe6i/iTe/ifl. 

MHCTa^npaHeTO Ha to3m Tkin kohtpo/im nocraBH M3BecTHn npeAH3BHKaTe/icrBa, 
noHe>Ke Te ce ki3n"b/iHflBaT b KOHTeKcra Ha npaBaTa, p,ap,euv\ mm ot ye6 6pay- 
3"bpa m ot no/ikiTMKkiTe 3a curypHOCT Ha .NET Framework. 

Ot r/ieAHa TOUKa Ha CkirypHOcrra CbmecrByBaT ABa sv\p,a noTpe6kiTe/iCKki 
kohtpo/im Tun Windows Forms - TaKMBa, komto ce crapTkipaT c npaBa no- 
noApa36npaHe, v\ TaKMBa, komto M3MCKBaT no-BMCOKM npaBa. 



774 nporpaMnpaHe 3a .NET Framework (tom 2) 

KoHTpo/ikiTe, komto M3MCKBaT no-BMCOKM npaBa 3a M3n"b^HeHne cneflBa fla 
6"bflaT cm/iho MMeHyBaHM (strong-named) v\nv\ uncppoBO noflnncaHM (digitally 
signed). ToBa no3BO/iHBa Ha aflMMHMcrpaTopMTe fla pa3pewaT no-BMCOKM 
npaBa Ha aceM6/iMTa ot flafleHa KOMnaHna, 6e3 fla KOMnpoMeTupaT curyp- 

HOCTTa. 

M3MCKBaHeTO 3a npoMAHa HacTpoMKMTe Ha CMrypHOora npaBM kohtpo/im ot 
to3m Tun fla 6"bflaT no-/iecHM 3a M3no/i3BaHe b KopnopaTMBHa MHTpaHeT cpefla, 
KtAeTO aAMMHMCTpaTopnTe Ha AOMeMHM ueHTpa^M3npaHO MoraT fla npoMeHAT 
Te3M HacTpoMKM. 3a fla 6"bflaT KOHTpo/iMTe M3no/i3BaeMM npe3 1/lHTepHeT, 
noTpe6kiTe/ikiTe Tpa6Ba fla cneflBaT onpe,qe/ieHM MHCTpyKunn, 3a fla npoMeHAT 
HacTpoMKMTe Ha curypHOCTTa. 




flo6pa npaKTMKa e ci>3flaBaHe Ha MHcrasiaLtMOHeH naKeT c 
Windows Installer, komto npaBH Heo6xoflMMMTe npoMeHM b 
CMrypHOCTTa. ToBa cneaoBa Ha noTpe6MTe/iMTe cneflBaine Ha 

C/10>KHM MHCTpyKMMM, KOMTO Ca HenOHDTHM 3a TAX. (Bi>npeKM 

TOBa npoMeHMTe, komto ce n pa bat ot MHCTa/iai4MOHHMn naKeT 
6m cneflBa.no fla 6t>flaT flo6pe o6ncHeHM.) 



1/lHCTa/iaUMOHHM KOMnOHeHTM 

Pa3npefle^eHMTe .NET npn^OKeHna ce cbcroflT He caMO ot TpaflnunoHHM 
nporpaMHM cpai/i/iOBe v\ aceM6/iMTa, ho m ot flont/iHMTe/iHM pecypcn KaTO 
onaujKM ot c"bo6iueHMfl (message queues), flHeBHMK Ha cb6MTMflTa (event 
logs), MHflMKaTopn 3a npon3BOflMTe^HOCTTa (performance counters) v\ 6a3M 
flaHHM (databases). Te3M pecypcn ca Heo6xoflMMM 3a HopMa/iHOTO cpyHKuno- 
HupaHe Ha npM/io>KeHMflTa v\ KaTO TaKMBa cneflBa fla 6"bflaT cb3fla,qeHM no 
BpeMe Ha kiHCTa/iau.woHHi/m npou.ec. 

.NET Framework npeflOcraBfl KOMnOHeHTM, komto Cb3flaBaT v\ KOHCpurypupaT 
pecypcuTe no BpeMe Ha MHCTa/iau.M*i v\ vv\ M3TpnBaT no BpeMe Ha flei/iHcra- 
na\\v\s\. Te3M KOMnOHeHTM ce MHTerpupaT c MHcra/iau.MOHHMTe MHCTpyMeHTu 
(instaiiutii.exe) Ha Windows Installer v\ Windows Installer Service. Cbme- 
CTByBaT flBa Tuna MHcra/iau.MOHHM KOMnoHeHTu: npeflBapwTe/iHO ct3flafleHM 
MHCTa^aunoHHM KOMnOHeHTM m MHcra/iau.MOHHM K/iacoBe (Installer Classes). 

ripeflBapnTe/iHO cb3flafleHn MHCTasiauMOHHii KOMnOHeHTM 

MaMKpococpT npeflocTaBAT neT npeflBapwTe/iHO flecpuHnpaHM MHcra/iau.MOHHM 
KOMnOHeHTM, komto MoraT fla 6"bflaT M3no/i3BaHM npM cb3flaBaHe Ha MHcra/ia- 
Umm 3a npM/io>KeHMfl: 

- EventLoglnstaller - M3nO/13BaT Ce npM C"b3flaBaHe M HaCTpOMBaHe Ha 

AHeBHMK Ha c"b6MTMATa (event logs). 

- MessageQueuelnstaller - M3nO/13BaT ce npM C"b3flaBaHe M HaCTpOMBaHe 

Ha onaujKM ot ch>o6meHMfl (message queues). 



T/iaBa 25. AceM6/iMTa v\ pa3npocTpaHeHne 



775 



- PerformanceCounterlnstaller - M3nO/13BaT ce npn Cb3flaBaHe M Hac- 

TpoMBaine Ha MHflUKaTopnTe 3a npoi/i3BOfli/iTe/iHOCTTa. 

Servicelnstaller M ServiceProccessInstaller - kl3nO/13BaT ce npn 

c"b3flaBaHe v\ Hacrpoi/iBaHe Ha Windows yc/iyrw. 

BceKM eflMH ot Te3M K/iacoBe ce i/i3no/i3Ba, 3a fla ce i/mcra/ikipaT Heo6xoflM- 
MMTe pecypcn no BpeMe Ha MHcra/iaui/iOHHMfl npouec. Cnep, flo6aB$iHe Ha 
onpeAe/ieH KOMnoHeHT b p,v\3av\u v\3vnep,a Ha Visual Studio .NET i/ma B"b3MO>K- 
hoct 3a reHepupaHe Ha cbOTBeTHi/ia kiHcra/iauwoHeH K/iac npe3 koht6kcthoto 
MeHK) Ha KOMnoHeHTa, KaKTO e noKa3aHO Ha KapTMHKaTa: 




|Hj MyEventLog 



31 View Code 



Add Installer 



& Cut 
1^1 Cop^ 
(I, Paste 



Properties 



ripn Ao6aBAHe Ha kiHcra/iaukiOHHkifl KOMnoHeHT kbm npoeKTa ce cb3,qaBa K/iac, 
HapeneH Projectinstaiier, komto cbfl"bp>Ka MHCTa^aunoHHMTe K/iacoBe Ha 

BCM4KM KOMnOHeHTM M3nO/13BaHM. 

no BpeMe Ha kiHcra/iaukiOHHWfl npouec ce 3aflei/icTBa Projectinstaiier, 

KOMTO l/l3n"b/lHHBa MHCTa/iaUMfl 3a BCeKM OT C"bA"bp>KaiUMTe KOMnOHeHTM. 

MHCTa/iauMOHHM K/iacoBe (Installer Classes) 

B HAKOki c/iynai/i ce Ha/iara fla ce kiHcra/ikipaT pecypcn, 3a komto H^Ma npefl- 
BapwTe/iHO c"b3flafleHM MHcra/iaukiOHHki KOMnOHeHTM. Mo>Ke fla ce Ha/io>KM fla 
ce M3n"b/iH*iT hakom cneukidpwuHki flewcTBUfl no BpeMe Ha i/iHcra/iauwoHHi/m 
npouec. flo6"bp npuMep 3a TOBa e cb3flaBaHe Ha 6a3a flaHHM, nont/iBaHe Ha 
HAKOM Ta6^nun m npeKOMnw/ikipaHe Ha flafleHO aceM6/iw ao MaujnHH03aBMCMM 
(native) koa (npe3 MHcrpyMeHTa NGen.exe) cnefl ycneujHO nprncnionBaHe Ha 
MHCTa^aunflTa. 3a Ta3M ue/i MoraT fla ce M3no/i3BaT K/iacoBeTe ot 

npoCTpaHCTBOTO System. Configuration. Install M Hatf-Bene K/iaca 

installer, komto ce Hac^eflflBa, 3a fla ce i/iMn/ieMeHTkipa noTpe6kiTe/iCKki 
MHCTa/iaTop 3a flafleH KOMnoHeHT. 



COM 6a3npaHM o6eKTn 



B"b3MO>KHO e b 6"bfleiue KOMnoHeHTMTe, M3rpafleHM c noMOurra Ha .NET 
Framework fla 3aMeHHT v\3u,nno KOMnoHeHTMTe 6a3npaHM Ha Component 
Object Model (COM, COM + , DCOM - 3a noBe^e MHCpopMauna bm>k http://www. 
microsoft.com/com '). floKaTO HacTtnn to3m momcht, o6ane, me Tpa6Ba fla 
MMaMe npeflBMfl taxhoto cbiuecTByBaHe v\ fla mm OTfle/iMM noflxoflaiuoTO 

BHMMaHMe. 



776 nporpaMnpaHe 3a .NET Framework (tom 2) 

3a fla 6"bAaT M3no/i3BaeMM bcmukm COM 6a3npaHM KOMnoHeHTM, Tpa6Ba fla 
6"bflaT perncTpupaHM Ha KOMruorbpa v\ fla ca MHcra/iMpaHM b COM+ KaTa/iora. 

T^aBHOTO npeflM3BMKaTe^CTBO b pa3npocTpaHeHkieTO Ha COM 6a3npaHM kom- 
noHeHTM e b TOBa fla 6"bfleM curypHM, ne Te MoraT fla KOMyHMKupaT c aceM6/iM- 
TaTa Ha npn^OKeHneTO, KaKTO v\ aceM6/ikiTaTa fla MoraT fla 6tflaT M3BMKBaHM 
npe3 COM. 

ripn MHCTa^npaHe Ha COM 6a3npaH KOMnoHeHT Tpa6Ba fla 6"bfle M3B"bpiueHa 
perncTpaunfl b COM+ KaTa/iora (^pe3 regsvr32.exe v\nv\ Windows Installer) v\ 
.NET npn^OKeHneTO, KoeTO ro M3no/i3Ba Tpa6Ba fla MMa flocTtn flo Interop 
aceM6/iMTO, cbfltpwamo flecpMHuunn Ha TunoBeTe b COM o6eKTa (reHepupa ce 

4pe3 tlbimp.exe). 

ripn MHCTa^npaHe Ha aceM6/iMTa, komto me ce M3BMKBaT npe3 COM Tpa6Ba fla 
ce M3B"bpujn perncTpaunfl npe3 .NET Framework SDK MHcrpyMeHTa Assembly 
Registration Tool (regasm.exe). 




npM MHCTa/iMpaHeTO Ha aceM6siMTa, komto me ce M3BMKBaT 
npe3 COM MMaiiTe npeflBMfl, ne aKO aceM6/iMTO ha Ma fla ce 
MHCTa/iMpa b GAC, Tpn6Ba fla ce M3no/i3Ba napaMerbpa 

/codebase npM perMCTpaL(Mn C Regasm.exe (m/IM CbOTBeTHOTO 

HacTpoMBaHe npii Windows Installer, KaKTO me bmamm b npw- 
Mepa no-flo/iy). B npoTMBeH cnynaii COM ha Ma fla Mowe fla 
OTKpiie MecTono/io>KeHMeTO Ha aceM6/iMTO. 



C'bpB'bpHM KOMnoHeHTM (Serviced Components) 

CtpBtpHMTe KOMnoHeHTM, c"b3flafleHM c .NET Framework, pa3HMTaT Ha COM 3a 
npeflocraBflHeTO Ha KOMnoHeHTHM ycnyrM KaTO ynpaB/ieHi/ie Ha TpaH3aKunnTe 
(transaction management), ny/iMHr Ha o6eKTM (object pooling) v\ KaTO nano 
npeflOCTaBAHe Ha ycnyrw, komto ce o6yc/iaB*iT ot COM TexHO/iori/mTa. 

CtpBtpHMTe KOMnoHeHTM ce CTapTMpaT KaTO COM 6a3MpaHO npM/io>KeHMe m 
3aTOBa Te Tpa6Ba fla perMCTpMpaT b COM KaTa/iora. ToBa Ha/iara c/ieflHMTe 
MHCTa^auMOHHM m KOHCpMrypauMOHHM M3MCKBaHMfl 3a KOMnoHeHTHMTe yc/iym : 

- AceM6/iMTaTa Tpa6Ba fla ca cm/iho MMeHyBaHM. 

- AceM6^MTaTa Tpa6Ba fla ca perMCTpMpaHM b perMCTpMTe Ha Windows 
(Windows registry). 

- 5M6/iMOTeKaTa c TMnoBeTe (type library) Tpa6Ba fla e perMCTpMpaHa npM 
K/iMeHTa. 

flMHaMHHHa perMCTpauMn Ha cbpe^pHM KOMnoHeHTM 

C"bpB"bpHMTe KOMnOHeHTM HeCTO Ce perMCTpMpaT flMHaMMUHO ntpBMfl n"bT, 

KoraTO npM/ioweHMe ce onMTa fla vv\ M3no/i3Ba. ToraBa CLR perMCTpMpa 
aceM6^MTO, 6M6/iMOTeKaTa c TMnoBeTe m KOHCpMrypMpa COM+ KaTa/iora. 
PerMCTpauMfl ce npaBM caMO BeflH"b>K 3a flafleHa BepcMfl Ha aceM6/iM. ToBa e 



T/iaBa 25. AceM6/inTa v\ paanpocrpaHemie 777 

HaM-/iecHMflT Ha^MH 3a perncTpupaHe Ha ctpBtpHM KOMnoHeHTM, ho 3a fla e 
ycneiueH npouecbT, komto vv\ crapTkipa, Tpa6Ba fla MMa aflMMHMCTpaTMBHM 
npaBa Btpxy MaiunHaTa. /Jont/iHi/iTe/iHO orpaHkmeHwe e cpaKTbT, ne AHHaMwn- 
Ha perncTpaunfl e Bt3MO>KHa caMO aKO aceM6/ikiTO ce M3BMKBa ot ynpaB/isiBaH 
KOfl. Ako M3BMKBaHeTO ce npaBi/i ot HeynpaB/iflBaH koa, AHHaMkinHaTa pern- 
CTpaunfl He e Bt3MO>KHa. 

B mhoto cnynaw npouecbT, komto M3BMKBa aceM6/ikiTO, HAMa M3MCKBaHMTe 
npaBa, 3a p,a M3B"bpujM AHHaMMUHa peri/icrpaui/m. ripuMep 3a TOBa ca KOMno- 
HeHTH, komto ce M3BMKBaT ot ye6 npn^OKeHne. TaKMBa KOMnoHeHTM He MoraT 
Aa 6"bAaT perncTpupaHM, 3aiuoTO ASP.NET npouecvr H^Ma aAMMHMCTpaTMBHM 
npaBa (ocBeH, aKO He e HacTpoeH Aa ce w3n"b/iHflBa b KOHTeKCTa Ha noTpe- 
6v\Tenn system, KoeTO He e Ao6pa v\p,es\ v\ KOMnpoMeTupa curypHOCTTa). B 
TaKtB cnynai/i perncTpaunaTa me ce npoBa/iw me ce npeAH3BHKa rpeujKa 
"0TKa3aH AOCTtn" (access denied). 3aTOBa Tpa6Ba Aa HanpaBMM Heo6xoAn- 
MaTa perncTpaunfl no BpeMe Ha MHcra/iaui/iOHHHfl npou.ec. 

PerMCTpauMn Ha CbpB-bpmi KOMnoHeHTH npw MHCTasiauMn 

noHe>Ke ctpBtpHMTe KOMnoHeHTH M3no^3BaT npeAMMCTBaTa Ha COM+ ycnyrw- 
Te, Te MMaT CblUMTe M3MCKBaHI/m othocho MHCTa^aunflTa: 

- KoMyHMKaunflTa etc ctpBtpHMTe KOMnoHeHTH ce ocbiuecTBABa npe3 
DCOM no noApa36npaHe. riopaAM Ta3M npwuwHa Interop aceM6/iMTaTa 
Tpa6Ba Aa ce perncTpupaT Ha K/iweHTCKaTa Mawkma. 

- B Aont/iHeHwe kbm COM HacTpoMKMTe, komto ce npaBAT AeK/iapaTMBHO 
npn pa3pa6oTKaTa Ha aceM6/ii/iTO c noMOurra Ha aTpn6vTM , Tpa6Ba Aa 
ocurypaT, ne KOHCpurypaunoHHMTe HacTpoMKM (KaTO npucbeAMH^BaHe Ha 
noTpe6kiTe/iw kbm noTpe6wTe/iCKki rpynn, Hacrpoi/iBaHe Ha noAXOA^iun 
npaBa 3a ki3n"b/iHeHkie, 3aAaBaHe b kom kohtckct Ha curypHOCT (security 
context) me ce ki3n"b/iHflBa npouectT) ca noAxoA^iuo cb3AaAeHM v\ kom- 
noHeHTbT e totob 3a M3no/i3BaHe. ToBa Moxe Aa 6"bAe nocTurHaTO npe3 
Ao6aBAHe Ha CKpunT kbm Aont/iHMTe/iHMTe p,ev\CYBv\s\ (custom actions) 
Ha Windows Installer, komto Aa perncTpupa KOMnoHeHTa. 




Bi>3mo)kho e HacrpoMBaHeTO Ha COM npmiOKeHneTO fla 
M3no/i3Ba SOAP BMecTO DCOM. ToBa 3ao6nKa/in M3MCKBaHeTO 
fla ce MHCTa/iMpaT Interop aceM6/iMTa Ha K/weHTCKaTa MauiM- 
Ha. To3n MCTOfl He no3BOJitiBa fla ce M3no/i3Ba ci>3flafleHaTa 
ot DCOM TpaH3aKL(iin KsiueHT-CbpB'bp m Tpn6Ba fla ce flo6aBM 
flonis/iHHTe/ieH koa, komto fla ynpaB/inBa TpaH3aKi4MMTe. 



HacTpoMKM Ha Internet Information Server (IIS) 

ASP.NET npw/io>KeHkiflTa M3MCKBaT Ha/ii/mi/ieTO Ha Internet Information Server 
(IIS), 3a M3n"b/iHeHweTO cm. B hakom cnynai/i e Heo6xoAHMO Aa ce npaBAT 
npoMeHM no HacTpoMKMTe Ha IIS, 3a Aa ce ki3n"b/iHki npki/io>KeHMeTO. ripn 
i/mcra/ikipaHe Ha ASP.NET npn^OKeHnsq Ha Windows Server 2003, Te ce 



778 nporpaMnpaHe 3a .NET Framework (tom 2) 

i/i3n"b/iHflBaT ot IIS 6.0. ripn no-CTapn Bepcun Ha Windows, ce M3no/i3Ba IIS 
5.0 i/i/iki 5.1. 

IIS 6.0 no3BO^ABa flBa pe>KMMa Ha w3onauwn Ha npi/i/io>KeHkiflTa: 

- M3onauv\f\ Ha pa6oTHMfl npouec (no noApa36i/ipaHe) 

- IIS 5.0 pe>KMM Ha monauwn 

IIS 6.0 m M3onaunf\ Ha pa6oTHnn npouec 

KoraTO ASP.NET npw/io>KeHi/iflTa pa6oTHT b pe>KMM Ha v\3onau,wn Ha pa6oTHMH 
npouec, Te pa6oTAT b npoueca W3wp.exe. B to3m cnynai/i MOfle/itT Ha npoue- 
cuTe, komto e BrpafleH b ASP.NET e ki3K/iK>neH v\ ce ki3no/i3Ba apxnTeKTypaTa 
Ha M30/iauwfl Ha pa6oTHMfl npouec ot IIS 6.0. C to3m pe>KMM Ha ki30/iaui/m v\ c 
noMOurra Ha Application pools MO>Ke p,a ce M30/inpa bcmuko (ot AaAeHO ye6 
npw/io>KeHkie ao MHO>KecTBO caMTOBe) b co6cTBeH npouec Ha WWW yc/iyraTa 
(WWW Publishing Service), KaTO no to3m Ha^MH AaAeHO npo6/ieMHO 
npn^OKeHne He Moxe p,a noB/ii/me HeraTMBHO Ha ocraHa/ikiTe. 

npouecMTe, M3n"b/iHflBamki ojp,ei\uv\je npw/io>KeHi/m, ca Hant/iHO pa3Ae/ieHi/i ot 
ocHOBHaTa WWW yc/iyra - inetinfo.exe. ISAPI npi/i/io>KeHi/i5Tra (Internet 
Server Applications) cbmo pa6oT5rr Han-b/iHO OTAe/iHO ot WWW ycnyraTa, 
KoeTO npeAna3Ba bci/iukm caMTOBe Ha cbpBtpa ot rpeujKM b M3n"b/iHeHkieTO mm. 
Ako B"b3HMKHe rpeujKa b ISAPI npi/i/io>KeHi/ie, caMO npouecvr, komto cbAtpwa 
npo6/ieMHOTO ISAPI, e 3acerHaT. 

Pa6oTHMAT npouec MO>xe p,a 6"bAe KOHCpurypupaH p,a n3no/i3Ba onpeAe/ieH 
npouecop, KoeTO no3BO/i*iBa no-ro/iaM kohtpo/i Btpxy pa3npeAe/ieHi/ieTO Ha 
cucTeMHMTe pecypcu. KaTO Aont/iHeHi/ie ye6 npw/ioweHi/mTa ce crapTkipaT b 

KOHTeKCTa Ha Network Service nOTpe6l/ITe/lfl, KOMTO MMa nO-Ma/lKM npMBM^e- 

vvha 3a AOCTbn ot Locaisystem. ToBa boam ao noBMiuaBaHe Ha curypHOCTTa. 

IIS 5.0 m pe>KMM Ha M30/iaijmi 

Ako ce M3no/i3Ba M30/iaukiOHHkiflT MOAe/i Ha IIS 5.0, ASP.NET ce M3n"b/iHflBa b 
co6cTBeHMfl MOAe/i Ha npouecnTe (Aspnet_wp.exe) m M3no/i3Ba co6cTBeHMTe 
KOHCpurypaunoHHM HacTpoMKM. 3aAaAeHMAT M30/iaukiOHeH MOAe/i e Ha hmbo 
ctpBtp m Ba>KM 3a BCM4KM npw/io>KeHkifl, w3no/i3Bamki IIS. 

IIS 5.0 pe>KMM Ha i/130/iaunfl Tpa6Ba p,a ce M3no/i3Ba ot npi/i/io>KeHkifl, komto 
B^M3aT b KOHCp/ii/iKT c pe>KMMa Ha v\3ona\\v\s\ Ha pa6oTHMfl npouec. Cnep,uv\je 
xapaKTepucTMKM c"b3AaBaT noconeHi/m kohcp/imkt: 

- 3aBMCMMOCT ot inetinfo.exe. Ako npM/io>KeHMeTO M3MCKBa p,a ce 
CTapTupa b KOHTeKCTa Ha npoueca inetinfo.exe, ToraBa Tpa6Ba ce 
M3no^3Ba IIS 5.0 pe>KMM Ha n30/iaui/m. 

- M3MCKBa ce i/i3no/i3BaHeTO Ha Read Raw Data Filters. Taxhoto ki3no/i- 
3BaHe M3MCKBa IIS 5.0 pe>KMM Ha v\3ona\\v\s\. 

- M3MCKBa Dllhost.exe. r|pM^O>KeHMflTa, KOMTO Tpfl6Ba P,a Ce M3n"b/lHflBaT 

b o6Kp"b>KeHkieTO Ha Dllhost.exe MoraT p,a 6"bAaT ki3n"b/iHeHi/i caMO b IIS 
5.0 pe>KMM Ha v\3ona\\v\s\. 



T/iaBa 25. AceM6/inTa v\ pa3npocTpaHeHne 



779 



Ako e Heo6xoflMMO M3n"b/iHeHMeTO Ha npn^OKeHne, KoeTO He M3n"b/iH*iBa 
M3MCKBaHMflTa 3a M3n"b^HeHne b pe>KMM Ha ki30/iaukifl Ha pa6oTHMfl npouec, 
Tpa6Ba p,a ce npeMMHe kbm IIS 5.0 pe>KMM Ha monauwn. B TaicbB cnynaM He 
MoraT fla ce M3no/i3BaT npeAMMCTBaTa Ha M30/iauM*iTa Ha pa6oTHMfl npouec ot 
IIS 6.0. 



KoHCpurypupaHe Ha n3o/iaunoHHM$i pokmm 

M30^ai4MOHHMflT pe>KMM MO>Ke Rd Ce KOHCpkirypupa OT aAMMHMCTpaTMBHaTa 

KOH30/ia Ha IIS no cnep,HV\n HanMH (npwMepvr e c Windows 2003 Server): 

1. CrapTkipaMe aAMMHMCTpaTMBHaTa KOH30/ia Ha IIS ot Control Panel -> 
Administrative Tools -> Internet Information Services (IIS) Manager: 



_ Internet Information Services (IIS) Manager 



Jnjxj 



^ File Action View Window Help 



â– 1B]_\ 



O ^ |t] HE 



ff*j Internet Information Services 
Q-ijJ NAKOV (local computer) 

E-JJ Application Pools 

m-O Web Sites 

_J Web Service Extensions 



Name 



Status 



_J Application Pools 

LJ Web Sites 

_J Web Service Extensions 



Service is running 



2. M36MpaMe c AeceH 6yTOH Ha MMiuKaTa Web Sites m ot koht6kcthoto 
MeHK) - Properties: 



E Internet Information Services (IIS) Manager 



â– Anj^l 



Kf File Action View Window Help 



JS]j<| 



is m\^ © b 



a I IL I â–º 



Pj Internet Information Services 

Eh^l NAKOV (local computer) 

H~_J Application Pools 

$'-~jnHBHT New 

i J Web Servi - T 

All Tasks 



Description 

U Default Web Site (Stopped) 
£ Microsoft SharePoint Administrati. 



Identifier 



View â–º 

New Window from Here 



" 



Refresh 
Export List, 



Properties 



Opens the properties die 



Help 



_iJ 



3. noflBHBa ce Ana/ioroBM5i npo3opeu "Web Sites Properties". M36MpaMe 
Ta6a Service: 



780 flporpaMnpaHe 3a .NET Framework (tom 2) 



Web Sites Properties 



Web Site Performance ISAPI Filters Home Directory 

Directory Security HTTP Headers Custom Errors 



HE 



Documents 
Service 



r Isolation mode - 

JRun WWW service in IIS 5.0 isolation mode! 



HTTP compression - 

Compress application files 
Compress static files 



temporary directory: I %windir%\II5 Temporary Compress Browse. 



Maximum temporary directory size: 

(* Unlimited 

C Limited to (in megabytes): 



95 



OK 



Cancel 



Apply 



Help 



4. B 3aBMCMMOCT aa/iM e M36paHa onu.v\9\ja (Run WWW service in IIS 5.0 
isolation mode) ce onpeAe/ia M30/iau.MOHHM*i pe>KMM, b komto ce M3n"b/i- 
HflBa Internet Information Server. 

5. C/ieA npoMAHa Ha M30/iau.MOHHM*i pe>KMM e Heo6xoAMMO pecTapTupaHe 
Ha IIS, 3a fla B/ifl3aT b CM/ia HanpaBeHMTe npoMeHM. 

KoHCpurypauiMfi Ha ASP.NET npmio>KeHMyiTa 

KoHCpurypaunflTa 3a ASP.NET npM/io>KeHMflTa ce CbxpaHflBaT b 
<processModel> e/ieMeHTa OT CpaM/ia machine . config. AKO ce M3nOJ13Ba IIS 

6.0 b pe>KMM Ha v\3onau,v\n Ha pa6oTHMfl npou.ec, ce M3no/i3BaT caMO cneflHMTe 

HaCTpOMKM: 

- maxWorkerThreads - MaKCMMa/ieH 6pOM HMUJKM Ha npouecop, KOMTO 
M3n"b/iHflBaT ASP.NET npM/io>KeHM5iTa 

- maxioThreads - MaKCkiMa/ieH 6poM HMUJKM Ha npouecop, KOMTO 

M3n"bJlHflBaT BXOflHO-M3XOflHM 3aflaHM 



T/iaBa 25, AceM6/iMTa v\ pa3npocTpaHeHne 781 

- responseDeadlocklnterval - 3aflaBa MaKCMMa/lHO BpeMe, 3a KOeTO 

BCAKa 3aaBKa Tpa6Ba fla npMK/iiouM (npouecbT ce pecrapTkipa, aKO 
HAKOfl 3aaBKa ce 3a6aBM noBene) 

Bcmukm ocraHa/iM HacTpoMKM ce nrHopupaT. B hakom cnynaM APyrnTe 
HacTpoMKM ca 6e3 3HaneHi/ie 3a IIS 6.0, ho b Apyrn c/ieABa TexHMTe eKBM- 
Ba/ieHTki b IIS 6.0 MeTa6a3aTa p,a 6"bAaT yKa3aHM. 3a noBene MHCpopMauna 
bm>k "Mapping ASP.NET Process Model Settings to IIS 6.0 Application Pool 
Settings" b MSDN Library. 

npoMsrna Ha perwcTpiiTe Ha Windows 

.NET npn^o>KeHMflTa 6m cneABa/io p,a M3no/i3BaT b no-Ma/iKa CTeneH pernc- 
TpnTe Ha Windows otko/ikoto Win32 npn/iOKeHM^Ta. HanpuMep aceM6/iMTaTa 
He M3MCKBaT cbmecrByBaHeTO Ha K/iionoBe b perncTpnTe 3a pa3/iMKa ot COM 
6a3npaHMTe o6eKTM b MMHa/iOTO. B hakom cnynaM npM/io>KeHMflTa Bee oiue 
pa34MTaT Ha perncTpnTe, HanpuMep KoraTo: 

- ripki/io>KeHMflTa BK^K)4BaT KOMnoHeHTM, komto He ca M3rpaAeHM c .NET 
Framework KaTO COM, COM+ v\nv\ yc/iyrw noA Windows (Windows 
services). 

- AceM6/iMTaTa Tpa6Ba p,a KOMyHMKupaT c COM 6a3npaHM KOMnoHeHTM v\nv\ 
npeAOcraBflT yc/iym, AOCTbnHM npe3 COM. B TaicbB c/iynai/i 3anncnTe b 
perncTpnTe Tpa6Ba p,a ce HanpaBAT no BpeMe Ha MHCTa/iauwoHHi/m 
npouec. 

- Heo6xoAMMO e Ao6aBHHeTO Ha 3anncn othocho /iMueH3MpaHe v\nv\ 
kohtpo/i Ha BepcuflTa. 

Cnofle/ieHM MHCTa/iauiMOHHM KOMnoHeHTM (Merge 
Modules) 

CnoAe/ieHMTe MHcra/iauMOHHM KOMnoHeHTM ca npen3no/i3BaeMw wop,ynv\ 3a 
Windows Installer (o6mkhob6ho ca cpai/i/iOBe c pa3UJnpeHne .msm). Te He 
MoraT Aa ce MHcra/iMpaT AnpeKTHO, a Tpa6Ba p,a ce BK/iionaT b MHcra/iauMOH- 
HM5i naKeT Ha npn^OKeHneTO, KoeTO vv\ M3no/i3Ba. KaKTO AHHaMMUHO CB"bp3a- 
HMTe 6n6^noTeKM no3BO^ABaT npen3no^3BaHeTO Ha koa m pecypcn ot hhko/iko 
npn^o>KeHMfl, TaKa cnoAe/ieHMTe MHcra/iauMOHHM KOMnoHeHTM no3BO/iflBaT 
cnoAe^AHe Ha MHcra/iauMOHeH koa Me>KAy MSI naKeTMTe. no to3m HanMH ce 
ocurypaBaT eAHM v\ cbu\v\ AewcTBua 3a KopeKTHO MHcra/ikipaHe Ha onpeAe/ieH 
KOMnoHeHT c BCM4KM npM/io>KeHMfl, komto ro M3no/i3BaT. CnoAe/ieHMTe MHCTa- 

^aUMOHHM KOMnOHeHTM Ca nOAXOA^LUM 3a MHCTa^MpaHM Ha KOMnOHeHTM Ha 

ApyrM npoM3BOAMTe^M, M3no^3BaHM b HaiueTO npM/ioxeHMe (HanpMMep MSDE 
- Microsoft SQL Server 2000 Desktop Engine). 

CnoAe/ieHMTe MHcra/iauMOHHM KOMnoHeHTM MoraT Aa 6"bAaT M3no/i3BaHM caMO 
b MHcra/iauMOHHM naKeTM Ha Windows Installer m no HMKaKbB Apyr HanMH. 



782 nporpaMnpaHe 3a .NET Framework (tom 2) 

CAB 4>aiiJioBe 

CAB cpai/i/iOBe ce i/i3no/i3BaT, 3a fla ce naKeTupaT 3aeflHO cpaw/iOBe, komto ca 
Heo6xoAMMM 3a AaAeHO npw/io>KeHi/ie, TaKa ne p,a MoraT p,a ce pa3npocrpaHfl- 
BaT no-/iecHO. 

Ct3AaBaHeTO Ha CAB cpaw/iOBe npeAOcraBH cnep,HMTe npeAHMCTBa: 

- no3BO^flBaT CBa^AHe ot MHTepHeT, a cbiuo TaKa KOHTpo/iMTe c 
ynpaB/iflBaH koa, komto ce cbAtpwaT b tax, MoraT p,a ce ki3n"b/iH*iBaT 
npn noncKBaHe (on demand). 

- rio3BO/iflBaT hako/iko HMBa Ha KOMnpecufl, KoeTO HaMa^flBa BpeMeTO 3a 
ki3Ter/i*iHeTO mm no Mpe>KaTa. 

- no3BO/iflBaT M3no^3BaHeTO Ha Microsoft Authenticode® TexHO/iori/i5rra 3a 
noAnncBaHe Ha CAB cpaw/iOBeTe, TaKa ne Mowe p,a ce noKaxe Ha 
noTpe6nTe^MTe kom e npoi/i3BOAHTe/i*iT. 

- CtAtpxaT KOHTpo/iw, komto ziecHO MoraT Aa 6"bAaT noAMeHeHM c no-HOBa 
Bepcufl, npe3 cb3AaBaHe Ha hob CAB cpaw/i v\ nocraBAHeTO My Ha ye6 
ctpBtp. CAB cpaw^OBeTe noAA"bp>KaT BepcnoHM3npaHe, KaTO no to3m 
Ha^MH ce ocwrypflBa M3no/i3BaHeTO Ha Haw-HOBaTa Bepcua ot noTpe6n- 
Tenv\Te. 

Jl0Ka/iM3npaHe 

CLR npeAOCTaBfl noAAPt>KKa 3a M3B/ii/maHe Ha Ky/iTypHO-3aBncnMM pecypcn, 
komto ca naKeTupaHM v\ kiHcra/ikipaHM b caTe/ikiTHi/i aceM6/ii/iTa. CaTe/iMTHMTe 
aceM6/ii/iTa cbAtpwaT caMO pecypcn, komto ce i/i3no/i3BaT ot npw/io>KeHMeTO 
(.resx, .gif, . jpeg M AP-)- Te He CbAtpwaT I/I3n"b/1HMM KOA- 

KoraTO ce ki3no/i3Ba MOAe/itT etc caTe/iMTHMTe aceM6/ikiTa 3a /iOKa/ii/i3kipaHe 
Ha npn^o>KeHMflTa, CTpyKTypaTa e cneAHaTa: cbmecrByBa r/iaBHO aceM6/in 
c"bA"bp>Kaiuo Ky/iTypaTa, koato ce i/i3no/i3Ba no noApa36npaHe v\ MHO>KecTBO 
caTe^MTHM aceM6/ikiTa. B r/iaBHOTO aceM6/iw ce naKeTupaT Ky/iTypHO-He3aBki- 
cuMMTe pecypcn v\ ce cb3AaBa caTe/ii/iTHO aceM6/in 3a BCHKa Ky/iTypa, koato 
me ce noAA"bp>Ka. rioHewe caTe/ikiTHi/iTe aceM6/ii/iTa He ca nacr ot r/iaBHOTO 
aceM6/iw TAXHaTa 3aM*iHa m/im tnrpefiA ca mhoto ziecHM v\ ce ocbiuecTBABaT 
6e3 Aa ce npoMeHfl r/iaBHOTO aceM6/ii/i Ha npn^OKeHneTO. 





Ako r/iaBHOTO aceM6/in Ha npmiOKeHneTO e cm/iho MMeHy- 


f\ 


BaHO, caTe/iMTHMTe aceM6/iMTa Tpn6Ba fla ca cm/iho MMeHy- 


en 


B3HM M nOflnHCaHM CbC Cblflflfl HaCTeH K/1K>H. B npoTMBeH cny- 


1 * 


naii pecypcMTe b caTe/iMTHMTe aceM6/iMTa HAMa fla 6t>flaT 




3apefleHM. 



ripn C"b3AaBaHe Ha .NET npw/io>KeHkifl, noAAtpwamw MHO>KecTBO Ky/iTypw, 
npouecbT no pa3npocrpaHeHkie Moxe Aa ce M3n"b/iHi/i no hako/iko Hani/ma: 



T/iaBa 25. AceM6/inTa v\ pa3npocTpaHeHne 783 

IIoaxoa 1: Language packs 

HaM-/iecHMflT noflxofl npn pa3npocrpaHeHkie Ha /iOKa/iki3kipaHki npn^OKeHMfl e 
cb3AaBaHe Ha ocHOBeH MHcra/iauwoHeH naKeT v\ Ha6op ot wHCTa/iaui/iOHHw 
naKeTM 3a noflfl"bp>KaHMTe Ky/iTypw (no3Haâ„¢ KaTO e3MKOBM naKeTM - language 
packs), no to3m HanwH K^neHTMTe MHCTa^npaT ocHOBHMfl naKeT l/l cnefl TOBa 

Heo6xOAMMMTe e3MKOBM naKeTM. 

IIoaxoa 2: M3no/i3BaHe Ha cnoAe/ieH MHcrasiauMOHeH 

KOMnOHeHT 

- naKeTupaHe Ha ocHOBHMTe, Ky/iTypHO-He3aBkickiMki aceM6/ikiTa b cnofle- 
/ieH MHCTa^aunoHeH KOMnOHeHT (Merge module) npe3 Visual Studio .NET 
setup and deployment project. 

- Cb3flaBaHe Ha wHcra/iaui/iOHeH npoeKT, komto cwvbpwa /iOKa/iki3wpaHHTe 
pecypcu 3a bcmhkm noAAtpwaHM Ky/iTypw. 

- Ct3AaBaHe Ha MSI naKeT 3a BC^Ka Ky/iTypa. ToBa no3BO/iaBa /iOKa/iM3M- 
paHe m Ha kiHcra/iauwoHHHfl npou.ec, a He caMO Ha npi/i/io>KeHi/ieTO. 

- Ct3AaBaHe Ha 6a30B i/mcra/iaui/iOHeH naKeT 3a ocHOBHaTa Ky/iTypa, 
koato me ce noAAtpwa v\ cnep, TOBa ce cb3AaBa TpaHCCpopMauna 
(transform) 3a BC^Ka Aont/iHi/iTe/iHa Ky/iTypa, koato me ce noAA"bp>Ka. 

- flo6aBAHe Ha KOMnw/ikipaHkiTe aceM6/ikiTa ot npoeKTa (project output), 
komto c"bA"bp>Ka ^OKa^M3npaHMTe pecypcu bbb BceKM npoeKT Ha 
Windows Installer. Ba>KHO e BK/iK>nBaHeTO Ha bcmhkm /iOKa/iw3kipaHki 
pecypcu. Cnep, TOBa ce ki3no/i3Ba cpw/iTbp (ExcludeFilter) 3a ki3K/iK>nBaHe 
bcmhkm (ocBeH eAHa) Ky/iTypw ot MHcra/iaukiflTa. 

IIoaxoa 3: 1/lHCTa/inpaHe Ha bcmhkm pecypcu 

KaTO Apyra a/iTepHaTkiBa Ha cpw/iTpwpaHeTO Ha M3/inLiJHMTe pecypcu no BpeMe 
Ha cb3AaBaHe Ha kiHcra/iauwoHHHfl naKeT e pa3npocrpaHeHi/ie Ha bcmhkm 
/iOKa/iki3kipaHki pecypcu. EAMHCTBeHna HeAOCTaTbK e, He 1/iHCTa/iau.kiOHHHflT 
naKeT MO>Ke p,a CTaHe npeKa/ieHO rd/iam nopaAM M3/iMUJHMTe caTe/iwTHM aceM- 
6/iMTa. To^flMOTO npeAMMCTBO Ha to3m noAxoA e, He Mowe p,a ce ki3no/i3BaT 
pa3/ikiHHkiTe Ky/iTypw Ha eAHa v\ cbu\a MaiunHa. Bcmhko, KoeTO Tpa6Ba p,a 
HanpaBM noTpe6i/iTe/i*i, e p,a CMeHM peri/iOHa/iHMTe cm HacTpoMKM v\ npn cnep,- 
Baiuo CTapTupaHe Ha npn^OKeHneTO me ce 3apeAflT noAxoA^iUMTe cajei\v\juv\ 
aceM6/ii/iTa. 

Debug Symbols 

KoraTO ce Cb3AaBa npi/i/io>KeHkie c noMOurra Ha Visual Studio .NET 2003 ce 
cb3AaBaT ABa BMAa KOHCpurypaunn no noApa36npaHe - Release v\ Debug. 
Eaho ot ocHOBHMTe pa3/iMHMfl Me>KAy tax e HannHtT, no komto ce ynpaB^ABaT 
Ae6"br cuMBO^MTe. C Debug KOHCpurypaunaTa ce cb3AaBa cpaw/i c Ae6"br cmm- 
BO/ikiTe 3a nporpaMaTa (.pdb - program database), AOKaTO npn Release TaKbB 
cpaw/i He ce cb3AaBa no noApa36npaHe. 



784 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Oai/i/i"bT c Ae6"br CkiMBO/ikue e Heo6xoflMM Ha CLR, 3a fla CB"bp>Ke KOMnw/iw- 
paHMfl MSIL KOfl etc cope KOfla. ToBa no3BO/iflBa Ha fle6"br MHCTpyMeHTMTe fla 
noi<a3BaT MHCpopMau,i/m KaTO MMeHa Ha npoMeH/iMBw; Ha JIT KOMnn/iaTopa fla 
Cb3flafle npoc^eflflBaiua MHCpopMauna, npe3 koato fla ce CB"bp>Ke MaujMHHO- 
3aBMCMMMfl KOfl (native code) o6paTHO ao MSIL. npoc/ieflflBamaTa MHCpopMa- 
UMfl m cuMBO^HMTe cpaw/iOBe ca Heo6xoflMMM 3a ecpeKTMBHO fle6"brBaHe Ha 
ynpaB/iHBaHi/m koa. 

BK^K)4BaHeTO Ha cuMBO^HMTe cpaw/iOBe b MHcra/iauMOHHi/iTe naKeTM noMara fla 
ce /ioi<a/iki3kipaT rpeujKMTe (JIT KOMni/i/iaToptT noi<a3Ba flopn HOMepa Ha pefla 
b KOfla, KbfleTO e B"b3HkiKHa/ia rpewKaTa), 3aTOBa e npenoptni/iTe/iHO fla ce 
BK/iK>naT b MHCTa^aunoHHMTe naKeTM no BpeMe Ha TecTOBeTe, a npn npwK/iron- 
BaHe Ha TecTBaHeTO fla ce npeMaxHaT. 




BtnpeKM, ne e yflo6HO HaMupaHeTO Ha rpeuiKM c noMomvra Ha 
CMMBO/iHMTe cpaftsiOBe, Te He Tpn6Ba fla ce pa3npocTpaH«BaT 
3aeflHO c npn/io>KeHMeTO, 3aiu|OTO no3BO/inBaT mhoto siecHO 
fla ce HanpaBM reverse engineering v\ fla ce M3B/iene M3xofl- 

HMfl KOfl B nOHTM OpHTMHa/ieH BMfl. 



KoHCpnrypnpaHe reHepnpaHeTO Ha fle6i»r MHCpopMauiin: 

TeHepupaHeTO Ha ci/iMBO/iHMTe cpaw/iOBe ce onpefle/isi c /debug K/iiona Ha 
KOMnn^aTopa ot KOMaHflHi/m pefl (csc.exe) v\nv\ bbb Visual Studio .NET ot 
npo3opeua c xapaKTepucTMKUTe Ha npoeKTa (ot crpaHMLiaTa Build ot rpynaTa 
Configuration Properties): 



GenerateDebugSumbolsProject Property Pages 


*l 




Configuration: Active(Debug) T | Platform: (Active(.NET) T | Configuration Mar 


lager... 








C~\ Common Properties 
P^ Configuration Properties 
$> Build 

Debugging 

Advanced 








Conditional Compilation Constant 


DEBUG; TRACE 


Optimize Code 


False 


Check for Arithmetic Overflow/Ur 


False 


Allow Unsafe Code Blocks 


False 


B 


Errors and Warnings 




Warning Level Warning level 4 


Treat Warnings As Errors False 


Suppress Specific Warnings 


B 


Outputs 




Output Path 


bin\Debug\ 


XML Documentation File 




Generate Debugging Information 


True -r 


Register for COM Interop 


False 




Generate Debugging Information 

Generate debugging information and place it in the output file(s) (/debug). 














Help 




OK Cancel 















T/iaBa 25. AceM6/inTa v\ pa3npocTpaHeHne 785 

l/lHCTa/iauMOHHu CTpaTerMM 

CtiuecTByBaT pa3/innHw kiHcra/iaui/iOHHw CTpaTernn v\ M36optT Ha ep.ua ot tax 
e TflCHO CB"bp3aH etc cneuncpMKaTa Ha npw/io>KeHi/ieTO, Ha opraHM3aunflTa KaTO 
Ufl/io m 6"bAemwTe n/iaHOBe othocho npM/io>KeHMeTO. Tpa6Ba BHkiMaTe/iHO fla 
ce n/iaHupa ue/ii/mT npou.ec no pa3npocrpaHeHwe Ha npki/io>KeHMeTO npeflki fla 
ce npeflnpneMaT CTtnKM no M3rpa>KflaHe Ha kiHCTa/iau.kiOHHMTe naKeTM, 3aiuoTO 
M36op"bT Ha MHCTa^aunoHHa CTpaTerna MO>xe v\3u,nno fla npoMeHM Hani/ma, no 
komto ce M3rpa>KAaT MHcra/iaui/iOHHi/iTe naKeTM. 

Eamh ot ocHOBHMTe cpaKTopw, komto onpefle/iflT CTpaTernflTa, e TuntT Ha 
npw/io>KeHkieTO - Windows Forms 6a3npaHO v\nv\ Web Forms 6a3npaHO. 

CbmecTByBaT Tpn ochobhm Hani/ma 3a pa3npocTpaHeHne Ha .NET npw/io>Ke- 

hma: 

- No-touch deployment 

- 1/lHCTa/iau.i/iOHHki naKeTM Ha Windows Installer 

- KonnpaHe Ha cpaw/iOBe 

HeKa pa3MeflaMe no,qpo6HO BceKM eflMH ot tax. 

No-Touch Deployment (.NET Zero Deployment) 

ripn to3m noflxofl Windows 6a3npaHM npn^OKeHna ce nocraBflT Ha ye6 cbpBtp 
m K^neHTMTe rn MHcra/ikipaT KaTO ce CB"bp3BaT etc cbpBtpa nocpeflCTBOM HTTP 
npoTOKO/ia. ripn ntpBOHana/iHO CB"bp3BaHe Ha K/iweHT ce v\3Tevi\s\T aceM6/iw- 
TaTa, komto ca Heo6xoflMMM 3a ntpBOHana/iHa kiHCTa/iau.kifl. Cnep, TOBa npn 
ntpBO M3no^3BaHe ce CBa/uiT v\ pecpepupaHMTe aceM6/ii/iTa (on demand), no 
to3m Ha^MH K^neHTbT He naKa fla ce CBa/iHT aceM6/iMTa, komto HHMa fla 
no/i3Ba BeflHara v\ TaKa ce pa3npe,qe/ifl Mpe>KOBOTO HaTOBapBaHe. AceM6- 
s\v\iaia ce CBa/i5rr b Assembly Download Cache (<windir>\assembiy\ 

download\) M ce CbxpaHflBaT TaM. 

M3K^K)4MTe^HOTO npeflMMCTBO Ha Ta3M TexHO^orna e, ne ce KOM6nHnpa 
6oraTMAT noTpe6nTe^CKM MHTepcpewc Ha Windows 6a3npaHMTe npi/i/io>KeHkm c 
ziecHaTa MHCTa/iau.Mfl v\ noflflptxKa, xapaKTepHa 3a ye6 npi/i/io>KeHi/iflTa. 
rioHe>Ke aceM6/ikiTaTa ce CBa/iflT caMO KoraTO ca Heo6xoflMMM, ce MMHMMM3npa 
BpeMeTO 3a Hana/iHO 3ape>KflaHe Ha npi/i/io>KeHi/ieTO. Bci/iuko TOBa ce cnyuBa 
aBTOMaTM^HO - KoraTO K/iac ot MaBHOTO aceM6/iw cb3flaBa 1/iHcraHu.km Ha K/iac 
ot aceM6/in, KoeTO ce HaMupa b cbiuaTa nanKa Ha ye6 cbpBtpa, CLR ro CBa/ifl. 

ripn bcako CTapTupaHe Ha npn^OKeHneTO (m ntpBOHana/iHO i/i3no/i3BaHe Ha 
aceM6/iw) CLR npoBep^Ba p,anv\ aceM6/ikiTaTa Ha ye6 cbpBtpa MMaT no-HOBM 
BepcuM ot Te3M b Keiua m npn Heo6xoflMMOCT CBa/ia no-HOBMTe Bepcun. no 

T03M Ha^MH MHCTa^MpaHeTO Ha nO-HOBM BepCMM e l/l3K/lK)HI/ITe/lHO ZieCHO, KaTO 

bcm4ko, KoeTO e Heo6xoflMMO fla ce HanpaBM, e fla ce 3aMeHAT aceM6/ikiTaTa 
Ha ye6 ctpBtpa c no-HOBM Bepcun. 



786 nporpaMnpaHe 3a .NET Framework (tom 2) 

Kora na nosi3BaMe No-Touch Deployment? 

B HAKOki c/iynaw ki3no/i3BaHeTO Ha no-touch deployment He e noflxoflaiuo: 

- ripn Heo6xoflMMOCT fla ce KOHTpo/iwpa CTporo Mpe>KOBMAT TpacpMK v\ p,a 
ce nporH03npa HeroBOTO i/i3no/i3BaHe. Ttw KaTO aceM6/iMTaTa ce CBa/isiT 
caMO KoraTO ca Heo6xoflMMM, cbiuecTByBa noTeHu.ua/iHa bb3mo>khoct 3a 
nuKOBM HaTOBapBaHMfl Ha Mpe>KOBMTe pecypcn, KoraTO mhoto noTpe6n- 
Te/iw M3MCKBaT eflHOBpeMeHHO HAKOM aceM6/ikiTa. 

- ripn Heo6xoflMMOCT ot i/i3no/i3BaHe Ha npn^OKeHneTO offline. CbxpaHfl- 
BaHe Ha aceM6/iMTaTa b Keiua no3BO/iHBa taxhoto crapTwpaHe Aopn 
KoraTO HflMa Bp"b3Ka c ye6 cbpBtpa, ho b TaKbB c/iynaw me ce w3no/i- 
3BaT caMO Bene KeiunpaHMTe aceM6/ii/iTa. ripn ki3no/i3BaHe Ha cpyHKu.no- 
Ha/iHOcr ot aceM6/iMTa, komto He ca CBa/ieHi/i, me B"b3HMKHe rpeujKa, rbki 
KaTO CLR He MO>xe p,a rn M3Ter/iw. 

- KoraTO ce M3MCKBaT Aont/iHkiTe/iHki AewcTBua no BpeMe Ha MHcra/ia- 
UMOHHMfl npou.ec KaTO MHCTa^npaHe Ha COM o6eKT v\nv\ ApawBep 3a 
ycrpoMCTBO. 

- KoraTO ca Heo6xoAHMki bmcokm npaBa. no noApa36npaHe npw/io>Ke- 
HMATa, pa3npocTpaHABaHM c no-touch deployment, ce crapTi/ipaT b orpa- 
HwneH KOHTeKCT Ha curypHOCTTa. He e noAxoA^iuo M3no/i3BaHeTO Ha 
Ta3M TexHO/iori/ia, KoraTO He e npaKTkinHO p,a ce npoMeHa no/ikiTi/iKaTa no 
curypHOCTTa (security policy). 

- KoraTO e Heo6xoAHMO nocraBAHeTO Ha aceM6/iw b Global Assembly 
Cache. 




fla/iM npn/io>KeHMeTO pa6oTM b online v\nv\ offline pe>KMM ce 
onpefle/ia ot pewMMa Ha Internet Explorer. flopti v\ KOMnto- 
TT»p-bT fla MMa Bpi>3Ka c flafleH ye6 cbpBi>p, aKO Internet 
Explorer e b offline pewHM, ToraBa v\ CLR me pa6oTM b offline 
pe>KMM. 



Ako CMATaTe p,a pa3npocrpaHflBaTe npn^OKeHneTO npe3 .NET Zero Deploy- 
ment, e Ao6pe n^aHnpaHeTO p,a 3anonHe oiue ot eTana Ha AH3ai/iHa My. ToBa 
me no3BO/ii/i peiuaBaHeTO Ha hakom npo6/ieMki npn AH3ai/iHa (KaTO HanpuMep 
orpaHM^eHMTe npaBa Ha npw/io>KeHi/ieTo) BMecTO cpeiuaHeTO mm cnep, KaTO 
npn^OKeHneTO e Bene b ynoTpe6a. 

B"b3MO>KHO e M3no^3BaHeTO Ha ycrpoMCTBO b ziOKa/iHaTa Mpe>Ka (network 
share), BMecTO ye6 cbpBtp. no to3m HanwH noTpe6kiTe.ni/iTe ce CB"bp3BaT v\ 
AnpeKTHO CTapTupaT npn^o>KeHMeTO oiraM. Hpe3 to3m noAxoA aceM6/ikiTaTa He 
ce KeiunpaT, a ce 3ape>KAaT AnpeKTHO b naMeTTa. OcHOBeH HeAOCTaTbK e, ne e 
HeB"b3MO>KHO offline i/i3no/i3BaHeTO npn cpuB Ha Mpe>KOBOTO ycrpoMCTBO. 

CnoAe/ieHM aceM6/iMTa 

.NET Zero Deployment He noAA"bp>Ka MHcra/ikipaHe Ha cnoAe/ieHi/i aceM6/iMTa b 
Global Assembly Cache. ToBa 03HanaBa, <Ae aKO e Heo6xoAHMO p.a ce nocraBAT 



T/iaBa 25. AceM6/iMTa v\ pa3npocTpaHeHne 787 

onpefle/iei-iki aceM6/iMTa TaM, Tpa6Ba fla ce M3no/i3Ba flpyr MHcra/iau.MOHeH 
MexaHM3"bM. npeAM fla ce B"b3npneMe Ta3M TexHMKa Tpa6Ba BHMMaTe/iHO fla ce 
peujn Tpa6Ba nv\ fla ce MHcra/ii/ipaT aceM6/iMTa b Global Assembly Cache 
B"bo6me. Tpa6Ba fla ce MMa npeflBMfl a/iTepHaTMBaTa fla ce pa3npocrpai-mBaT 
aceM6^MTaTa KaTO nacmM (bm>k HacTHM aceM6;iMTa ) c bcako npi/i/ic»KeHkie. 
HacTHMTe aceM6/iMTa cb3flaBaT npo6/ieMM c "bnrpeMfla Ha aceM6/iMTaTa, ho 
TOBa ce KOMneHCupa ot zieKOTaTa, c koato ce pa3npocrpaHsiBaT hobm Bepcun 
npn .NET Zero Deployment (npocTO KonnpaHe Ha ye6 cbpBtpa v\ npn c/ieflBa- 
moTO CTapTupaHe BceKM K/iMeHT me M3no/i3Ba HOBaTa Bepcua). 

npM/io>KeHMn, cbCTOflutM ce ot MHOwecrBO aceM6/iMTa 

ripn^o>KeHMfl, komto ce ctCTOflT ot eflHO aceM6/iM ca Haw-ziecHM 3a pa3npocr- 
paHeHne 4pe3 .NET Zero Deployment. Hecro, o6ane, Han-b/iHO cpyHKu.MOHa/i- 
HMTe npn^o>KeHMfl M3no/i3BaT MHOKecmo aceM6/iMTa v\ MHO>KecTBO pecypcu. 
Pa3npocrpaHeHkieTO Ha TaKMBa npn^OKeHna c .NET Zero Deployment e 
B"b3MO>KHO, ho M3MCKBa flont/iHMTe/iHM ycM/iMfl ot pa3pa6oTHMu.MTe, 3a fla ce 
ocurypn onTMMH3aunfl. 

C ue/i M3BMKBaHe Ha aceM6/ikiTa caMO KoraTO ca Heo6xoflMMM MO>xe fla ce 

M3nO/13Ba K/iaCbT Assembly OT npoCTpaHCTBOTO System. Reflection. 
Assembly. B T031/I K/iac MMa MeTOfl LoadFrom( string path, ...), HMMTO napa- 

MeTbp path npneMa KaKTO URL, TaKa v\ nt/iHO MMe Ha /ioi<a/ieH cpai/i/i. KoraTO 
e noflafleH URL KaTO napaMeTbp, CLR npoBep^Ba fla/iw m3mckb3hoto aceM6/iM 
He cbiuecTByBa Bene b download Keiua. ripeflMMCTBOTO Ha Ta3M TexHMKa e, ne 
aceM6/ikiTO ce CBa/ia ot ye6 ctpBtpa, caMO KoraTO e M3BMKaHO ot npn/ioxe- 
HueTO (on demand), BtnpeKM, ne MO>Ke fla flOBefle ao 3a6aBAHe Ha npM/io- 
xeHneTO flOKaTO aceM6/iMTO ce CBa/iM Ha ziOKa/iHaTa MaiunHa. 

PeiueHne Ha npo6/ieMa c orpaHMneHMATa Ha .NET Zero Deployment TexHO- 
/iorM*n~a e M3no/i3BaHe Ha KOM6nHnpaH MeTOfl Ha MHcra/iauMH - KOMnoHeH- 
TMTe, 3a komto Tp*i6Ba fla ce npeflocraBAT necro hobm BepcMM, ce nocraBAT Ha 
ye6 ctpBtp, a no/iMTMKaTa 3a CMrypHOora m ocraHa/iMTe KOMnoHeHTM ce 
MHcra/iMpaT 4pe3 Windows Installer TexHO/iorM5rra. 

T03M noflxofl Ha6pa nony/iapHOCT m MaMKpococpT peiuMxa fla ro flopa3BMAT bbb 
.NET Framework 2.0 m HapeKOxa TexHO/iorMsiTa ClickOnce. BtB Visual Studio 
.NET 2005 m .NET Framework 2.0 ocHOBHMTe b-b3mo>khoctm, komto ca flo6a- 
BeHM, ca c^eflHMTe: 

- YBeflOMflBaHe Ha K/iMeHTMTe npM ny6/iMKyBaHe Ha HOBa BepcMM. 

- M36op Ha noTpe6MTe/iMTe pjai\v\ fla MHcra/iMpaT HOBaTa BepcMfl - pa3pa- 
6oT4MUMTe MoraT fla noconaT HaM-crapaTa BepcMfl, koato e flonycTMMO 
fla 6"bfle CTapTMpaHa. 

- MHCTa^MpaHe/fleMHCTa^MpaHe - cb3flaBaHe/M3TpMBaHe Ha npenpaTKM 
(shortcuts) b noflxoflfliflMTe nanKM. 

- TeHepMpaHe Ha noflxoflaiflM ye6 CTpaHMUM 3a yBeflOMABaHe Ha noTpe- 
6MTe^a. 



788 nporpaMnpaHe 3a .NET Framework (tom 2) 

- Onukifl 3a CTapTupaHe b offline pe>KMM - y/iecHei-io e b cpaBHeHne c .NET 
Framework 1.x. 

Windows Installer 

C/ieflBamaTa CTpaTerna 3a pa3npocrpeHkifl Ha npw/io>Kei-ikiflTa e npe3 MHcra/ia- 
Umohhm naKeTM Ha Windows Installer (.msi cpaw/iOBe). Ta3M CTpaTerna npefl- 
/iara Haw-MHoro B"b3MO>KHOCTi/i cpeA M36poeHMTe v\ npe3 Hea MoraT p,a ce 
MHcra/ikipaT bcmukm BMAOBe .NET npM/io>KeHMfl 3aeAHO etc cnoAe/ieHMTe 
MHCTa^aunoHHM KOMnoHeHTM (merge modules) v\ cab cpai/i/iOBe. 

npeAMMCTBa Ha Windows Installer 

Windows Installer npeA-nara MHO>KecTBO y/iecHeHi/i*i 3a noTpe6MTe.n MTe, ap,wv\- 
HMCTpaTopnTe m pa3pa6oT4MUMTe. OcHOBHMTe ot tax ca: 

- /leceH 3a M3no/i3BaHe noTpe6kiTe/iCKw MHTepcpewc, komto MO>xe p,a ce 
HacTpoMBa ot pa3pa6oT4MUMTe (customizable UI). 

- MHTerpaunfl c MHcrpyMeHTa Add/Remove Programs ot Control Panel 3a 
cneAHi/iTe AeMCTBua: 

o MHcra/iwpaHe. 

o /Jei/iHcra/iwpaHe. 

o flo6aBHHe v\nv\ npeMaxBaHe Ha cpyHKui/iOHa/iHOcr (features) ot 
npw/io>KeHMflTa. 

o rionpaBflHe Ha kiHcra/iwpaHOTO npn^oxeHne KaTO ce 3ana3BaT 
HanpaBeHMTe npoMeHM v\ ce B"b3craHOBsiBaT noBpeAeHMTe cpaw/iOBe. 

- M3n"b^HeHne b ti/ix pe>KMM (silent mode) - 6e3 HaMecaTa Ha noTpe6n- 
Te/isi. 

- B"b3CTaHOBABaHe Ha cwcreMaTa ao cbCTOAHneTO npeAM 3anonBaHe Ha 
1/iHcra/iau.kiflTa b cnynai/i Ha: 

o B"b3HMKBaHe Ha rpeujKa. 

o ripeKtCBaHe ot noTpe6i/iTe/isi. 

- ripoBepflBaHe 3a Ha/ii/mweTO Ha onpeAe/ieH cocpTyep v\ xapAyep npeAM 
3ano4BaHe Ha MHcra/iauMflTa. 

- Cb3AaBaHe Ha noAxoA^iun npenpaTKM (shortcuts). 

- YnpaB/ieHne Ha MecTono/ioxeHi/ieTO Ha cpaw/iOBeTe v\ nanKMTe. 

- YnpaB/ieHkie Ha perncTpnTe Ha Windows (Windows registry). 

- MHcra/ii/ipaHe Ha COM 6a3npaHM KOMnoHeHTM. 

- MHCTa^npaHe Ha aceM6/ii/iTa b Global Assembly Cache. 

- l/l3n"b/iHeHkie Ha Aont/iHkiTe/iHki AewcTBua cnep, MHcra/iaukiflTa (custom 
actions). 



T/iaBa 25. AceM6/inTa v\ pa3npocTpaHeHne 



789 



- YnpaB/iei-ikie Ha MHCpopMaunaTa 3a BepcunTe, KaTO no to3m HanwH ce 
ocurypaBa i/iHcra/ikipaHe Ha HaflcrpoMKkiTe (upgrades) v\ KptnKMTe 
(patches) b npaBM/ieH pefl. 

KaKTO ce BM>Kfla ot noconeHi/iyi cnwcbK c npeflMMCTBaTa Ha M3no/i3BaHeTO Ha 
Windows Installer, TOBa e mhoto MOiuHa TexHO/iorna v\ ki3no/i3BaHeTO v\ 
no3BO^ABa peiuaBaHe Ha npo6/ieMHTe, cbntTCTBaiun c/io>KHkiTe Windows v\ ye6 
6a3npaHM npn^o>KeHMfl. Eto m hakom ot tax: 



3aflana 


Pewei-me npe3 MSI naKeT 


Cnofle/ieHM 
aceM6/ii/iTa - 
nocTaBAHe Ha 
aceM6/ikiTa b GAC 


Windows Installer npeflocraBfl zieceH HanwH 3a MHcra- 
/lwpaHe Ha cnoae/ieHki aceM6/ikiTa b Global Assembly 
Cache. 


l/lHcra/iwpaHe Ha 
COM 6a3npaHM 

KOMnOHeHTM 


KaKTO o6flCHkixMe b TOHKa COM 6a3npaHM o6eKTM, 
COM o6eKTMTe Tpa6Ba fla ce perncTpupaT npeflu fla ce 
M3no/i3BaT. Windows Installer npeflocraBfl Ha,qe>KfleH 
MexaHM3"bM 3a MHcra/ikipaHe i/i peri/icrpwpaHe Ha COM 
o6eKTM. ripn Hy>Kfla MO>xe fla ce w3no/i3Ba v\ MHcrpy- 
MeHTa Regsvr32.exe 3a p"b4HO perkicrpwpaHe Ha COM 
o6eKTMTe. 


HacTpoMKM Ha IIS 


B T04Ka HacTpoMKM Ha Internet Information Server 


(IIS) 06flCHMXMe OCHOBHMTe HaCTpOMKM, KOMTO Tpfl6Ba 

fla 6"bflaT HanpaBeHM, 3a fla ce crapTkipaT ye6 npi/i/io- 
>KeHMfl. Windows Installer no3BO/i*iBa 3aflaBaHeTO Ha 
Te3M HacTpoMKM no BpeMe Ha cb3,qaBaHe Ha i/iHcra/ia- 
UMOHHMfl naKeT. 


Pecypcn Ha 
npn^OKeHneTO 


npn^OKeHMflTa M3MCKBaT pa3/iwnHki pecypcw KaTO 
onaujKM ot c"bo6iueHMfl (message queues), zioroBe Ha 
c"b6nTMflTa (event logs), MHflUKaTopn 3a npon3BOfln- 
Te/iHOCTTa (performance counters) v\ 6a3M flaHHM 
(databases) (bm>k MHcra/iauwoHHi/i KOMnOHeHTM), caTe- 
/imthm aceM6/iMTa 3a /iOKa/iki3kipaHe Ha npn^OKeHneTO 
(bm>k. /loKa^M3npaHe). Windows Installer noflfl"bp>Ka 
M3nt^HeHneTO Ha flont/iHkiTe/iHki flewcTBi/m (custom 
actions) npeflu npwK/iionBaHe Ha MHcra/iaukiOHHi/ifl 
npou.ec, npe3 komto MoraT fla ce w3n"b/iHflT nonTM 

BCM4KM Heo6xOflMMM fleMCTBMfl. 



Windows Installer 3a MHcrasmpaHe Ha mhotocjiomhh 
npn/io>KeHM5i 

ripn KOMn^eKCHM cucTeMM, M3rpafleHM ot HAKO/iKO c/iofl, Tpa6Ba fla ce M3no/i- 
3Ba OTfle^eH kmcra/iaukiOHeH naKeT 3a BceKM ojp,eneu cpi/i3kmecKki cnov\ (BC^Ka 
OTfle^Ha MaujMHa). ToBa e noflxoflaiuo npn noBeneTO cueHapnn, 3aiuoTO e 
M3K/iK)ni/iTe/iHO TpyflHO (b hakom cnynaw flopn HeBt3MO>KHo) fla ce CTapTupa 
eflMH MHCTa^aunoHeH npouec Ha flafleH cpM3M4ecKM cnov\ m fla ce kiHcra/iwpaT 



790 nporpaMnpaHe 3a .NET Framework (tom 2) 

KOMnoHeHTM Ha flpyrn cpM3M4ecKM cnoeBe KaTO nacr ot Hero. HanpuMep aKO 
ce CTapTupa MHcra/iaukiOHeH naKeT 3a ye6 npn^OKeHne, e TpyqHO fla ce 
MHCTa^npaT KOMnoHeHTMTe, komto c"bA"bp>KaT 6n3Hec ziorwKaTa, Ha OTAe/ieH 
KOMnKDTtp. B HAKOM c/iynaw 3a BceKM OTAe/ieH cpM3M4ecKM enow MO>Ke p,a 6tAe 
M36paHa pa3/ikmHa MHcra/iaui/iOHHa CTpaTerna. HanpuMep c/ioat, komto 
cbAtpwa ye6-6a3npaHMflT noTpe6wTe/iCKki MHTepcpewc Moxe p,a 6"bAe pa3npo- 
CTpaHeH KaTO KO.neKu.ua ot <j>av\noBe cneA KOMrm/iauMaTa , AOKaTO c/ioat c 
6n3Hec ziorwKaTa v\ ctpBtptT 3a 6a3aTa ashhh MoraT p,a 6"bAaT nocraBeHM b 
MSI naKeT. 

Ci>o6pa>KeHMfl 3a CMrypHOCira 

Eamh ot npo6/ieMi/iTe, komto 3acaraT pa3npocrpaHeHkieTO Ha Windows 6a3M- 
paHM npn^o>KeHMfl npe3 MSI naKeTM e p,anv\ noTpe6kiTe/iflT, komto e crapTwpa/i 
MHCTa^aunoHHMfl npou.ec, v\wa Heo6xoAHMMTe npaBa, 3a p,a npoBeAe v\ npn- 
k/ik>hi/i MHCTa^aunflTa. Te3M npaBa 3aBMCAT ot AewcTBuaTa, komto ce M3B"bp- 
ujBaT no BpeMe Ha MHcra/iaukiOHHkifl npouec v\ n/iaTCpopMaTa, Btpxy koato ce 
octiuecTBABaT. HanpuMep He ce M3MCKBaT cneu.ua/iHki npaBa, 3a p,a ce 
WHcra/ikipaT npn^o>KeHM5q Btpxy Windows 95, Windows 98, Windows Me, 
AOKaTO b Windows NT/2000/XP/2003 caMO Cb3AaBaHeTO Ha noAAnpeKTopua 
Ha cucTeMHaTa nanKa Program Files M3MCKBa noTpe6kiTe/i*iT p,a e b rpyna etc 

Cneu.ua/1HM npaBa (KaTO Administrators kl/lkl Power Users). 

HanwH Aa ce noACurypuM, ne 1/iHcra/iau.kiflTa H^Ma p,a ce npoBa/iw 3apaAn 
HeAOCTaTt^HM npaBa Ha aKTMBHua noTpe6wTe/i, e pa3npocrpaHeHne Ha 
kiHcra/iaukiOHHkifl naKeT npe3 MS SMS v\nv\ Active Directory Group Policy. 

Pa3npocrpaHeHne Ha naKeTM Ha Windows Installer 

CtiuecTByBaT pa3/innHw HanwHM 3a pa3npocrpaHeHwe Ha MSI naKeTn: 

- Active Directory Group Policy. 

- MS System Management Server (SMS). 

- flpyrn Hani/iHi/i - nocraBflHe Ha cpaw/iOB ctpBtp, Ha ye6 cbpBtp v\nv\ 
pa3npocTpaHeHne Ha HOCkiTe/i (CD/DVD). 

HeKa pa3r/ieAaMe BceKM eAMH ot tax. 

TpynoBM no/iMTMKM Ha aKTMBHMTe AnpeKTopMM (Active Directory 
Group Policy) 

ripn pa6oTa b ro/ieMw opraHM3aunn pa6oTHMTe CTaHunn ce opraHM3npaT b 
AOMeMHM, ynpaB^ABaHM ot t. Hap. aKTMBHa AnpeKTopua (Active Directory). Tn 
e 4acT ot ctpB-bpHMTe Windows n/iaTCpopMki (Windows 2000 Server, Windows 
2003 Server v\ t. h.) m ce M3no/i3Ba 3a u.eHTpa/iki3i/ipaHO ynpaB/ieHkie Ha 
Windows 6a3npaHM KopnopaTMBHM MHCppacTpyKTypn. 

AKTMBHaTa AnpeKTopua no3BO^ABa pa3npocrpaHeHkieTO Ha npi/i/io>KeHkie ao 
noTpe6nTe^MTe v\nv\ MaujMHMTe aBTOMaTMUHO, npe3 i/i3no/i3BaHeTO Ha rpyno- 
BMTe no^MTMKM (Group Policy). TpynoBUTe no/ikiTkiKki MoraT Aa ce 3aAaBaT Ha 
hmbo AOMewH, opraHM3aunoHHa eAMHuua, noTpe6i/iTe/i v\nv\ KOMniOTbp. ToBa 



T/iaBa 25. AceM6/inTa v\ paanpocrpaHemie 791 

3aBncn ot CTpyKTypaTa Ha AafleinaTa opraHM3aun5i. Hpe3 rpynoBMTe no/ikiTMKM 
MO>Ke fla ce ocurypn aBTOMaTi/mHO i/iHcra/ii/ipaHe Ha npi/i/io>KeHi/ieTO, KoraTO 
AaAeH noTpe6i/iTe/i ce bk/ik>hi/i b cwcreMaTa (v\nv\ p,ap,eu KOMniOTbp ce crap- 
Tupa). 

TpynoBUTe no^MTHKn no3BO/isiBaT pa3npocrpaHeHwe Ha npi/i/io>KeHi/m no ABa 
Ha^MHa: 

- Ha3HaneHwe (assign) - aAMUHMCTpaToptT Mowe p,a Ha3Hani/i AaAeHO 
npn^OKeHne 3a noTpe6kiTe/ii/i v\nv\ MawkiHki. 

o 3a noTpe6i/iTe/iki - npw/io>KeHkieTO ce kiHcra/ikipa, KoraTO AaAeHMflT 
noTpe6i/iTe/i ce bk/ikdum b cwcreMaTa. KoraTO noTpe6kiTe/iflT 
crapTkipa HflKoa nporpaMa 3a ntpBM ntT, ToraBa 1/iHcra/iau.i/iflTa ce 
cpMHa^M3npa. 

o 3a MaujMHM - KoraTO MaiunHaTa ce crapTkipa, npM/io>KeHMeTO ce 
i/iHcra/ikipa m to e cbo6oaho 3a M3no/i3BaHe ot bcmukm noTpe6n- 
Te/iw Ha Ta3M MaiunHa. 1/lHCTa/iau.nflTa ce cpkiHa/iki3kipa, KoraTO 
noTpe6nTe^flT crapTkipa HflKoa nporpaMa. 

- riy6/iMKyBaHe (publishing) - npn^oxeHneTO MO>xe p,a ce ny6/iMKyBa 3a 
onpeAe/ieHi/i noTpe6nTe/in. KoraTO Te ce BK/iK>naT ny6/ikiKyBaHaTa npo- 
rpaMa ce noyiBflBa b Add/Remove Programs v\ MO>xe p,a 6"bAe i/iHcra/iki- 
paHa ot TaM. KaTO a/iTepHaTMBa Moxe p,a ce noconi/i npM/io>KeHMeTO p,a 
ce i/iHcra/iwpa npn crapTwpaHe Ha cpaw/i, hmmto Tun e acounnpaH c Hero. 

Pa3npocrpaHeHne Ha MSI naKeT npe3 rpynoBa nosiMTMKa Ha 
aKTMBHaTa AnpeKTopnH - npHMep 

3a Aa HacTpouM MHcra/iaukiOHeH naKeT 3a kmcra/ikipaHe npe3 rpynoBaTa 
no/iMTMKa Ha aKTMBHaTa AnpeKTopua (Active Directory Group Policy), motom 
Aa M3nt^HMM c^eAHMTe CTbnKM (npuMeptT e c Windows 2003 Server): 

1. Cb3AaBaMe AnpeKTopua, koato me cbAtpwa MSI naKeTa Ha cpaw/iOB 
ctpBtp. HacTpowBaMe AnpeKTopi/m 3a cbBMecmo no/i3BaHe (shared 
directory) v\ 3aAaBaMe Heo6xoAHMi/iTe npaBa. 

2. CrapTkipaMe KOH30/iaTa "Active Directory Users and Computers". 

3. Ot CTpyKTypaTa b/iabo M36npaMe KOHTeMHepa, komto cbAtpwa KOMmoT- 
puTe, 3a komto me Ha3HanaBaMe kiHcra.nau.kifl Ha npw/io>KeHi/ie. IHpaK- 
BaMe c AecHMfl 6yTOH Ha MMUJKaTa Btpxy Hero v\ M36npaMe Properties v\ 
noc/ie Group Policy Ta6a. 

4. C"b3AaBaMe HOBa rpynoBa no/ikiTkiKa (Group Policy Object), npe3 6yTOHa 
[Add] m 3aAaBaMe noAxoAJiiuo MMe. HanpuMep "MSI Install Test": 



792 



flporpaMnpaHe 3a .NET Framework (tom 2) 



& Active Directory Users and Computers 



File Action View 



galcho.com Properties 



HHB 



BE 



<p 4 lii] | 



General | Managed By Group Policy 



â– 0 Active Directory Users 
1+1 Pi Saved Queries 
B 6^ galcho.com 
CD Builtin 
f~^l Computers 
[^1 Domain Contrc 
ED-CD ForeignSecurit 
â–¡ Users 



Current Group Policy Object Links for galcho 



Group Policy Object Links 



No Uverride Disabled 



i Default Domain Policy 

i Default Domain Controllers Policy 



Group Policy Objects higher in the list have the highest priority. 
This list obtained from: ns.galcho.com 



New 



Add.. 



Edit 



Up 



Options.. 



Delete.. 



Properties 



Down 



Block Policy inheritance 



Close 



Cancel 



Apply 



5. YBepflBaMe ce, ne HOBaTa rpyna e M36paHa v\ HaTMCKaMe 6yT0Ha [Edit], 
me ce OTBopn K0H30/iaTa Group Policy Object Editor. 



jm Group Policy Object Editor 



H00 



File Action View Help 



«- -► S 13 



Version | Deployment state | Source 



2$ MSI Install Test [ns, galcho, corn] Po 
zl- ^fl Computer Configuration 
B-d Software Settings 



Software installation 



Name 



B-Q] Windows Settings 
B-CJ Administrative Tempi 
B-^P User Configuration 
B-CJ Software Settings 
B-CJ Windows Settings 
B-d| Administrative Tempi 



There are no items to show in this view. 



â–º I Package. 



View 



Paste 
Refresh 
Export List. 



Properties 



Help 



li 



J 2]\A 



2] 



Adds a package, 



T/iaBa 25. AceM6/inTa v\ pa3npocTpaHeHne 



793 



6. Ot fltpBOTO b/iabo OTBapyiMe Computer Configuration, pa3n"bBaMe nan- 
KaTa Software Settings v\ M36npaMe MKOHaTa Software Installation. Ot 
HeMHOTO KOHTeKCTHO MeHK) 1/1361/ipaMe New... | Package. 

7. OTBapa ce flkia/ior, npe3 komto Tpa6Ba fla M36epeM .msi dpai/i/ia 3a to3m 
naKeT. HaMnpaMe cnofle/ieHaTa nanKa Ha dpai/i/iOBi/ifl ctpBtp, koato 
c"b3flafloxMe b CTtnKa 1. M36npaMe dpaw/ia v\ noTB"bp>KflaBaMe c 6yTOHa 
[open]. Ako dpaM^tT ce HaMupa Ha /iOKa/iHki*i amck, He Tpa6Ba fla 
M3no^3BaMe /lOKa/iHkifl nvr (npuMepHO c:\PathToMsi), 3aiuoTO K/iweH- 
TMTe HflMa fla MMaT flocrbn ao naKeTa. BMecTO TOBa Tpa6Ba fla M3no/i- 
3BaMe UNC nvr - \\MMe-Ha-cbpB"bpa\MMe-Ha-nanKaTa\cpaM.n.msi . 

8. Ot c^eflBaiflMfl flwa/ioroB npo3opeu M36npaMe [Assigned] v\ noTB"bp>Kfla- 
BaMe c [ok] : 



1 Deploy Software HE3| 


Select deployment method: 
C Published 




(* Assigned 
C Advanced 




Select this option to Assign the application without modifications. 




OK Cancel 







Ako M36epeM BMecTO TOBa [Advanced], me ce otbopm hob npo3opeu, b 
komto MO>KeM fla npaBMM flont^HMTe^HM HacTpoMKM 3a pa3npocTpaHe- 
HueTO Ha naKeTa. ToBa MO>Ke fla craHe v\ no-K"bCHO npe3 M36npaHe Ha 
Properties ot koht6kcthoto MeHK) Ha cb3flafleHMH naKeT. 



jil Group Policy Object Editor 



ma* 



File Action View Help 



© 13 if E] Hi 



_§£ MSI Install Test [ns.galcho.com] 

- j^ Computer Configuration 
S- CH Software Settings 

mjj Software installation 
l+l-Q] Windows Settings 
[+]â–  CH Administrative Template: 

- gi$ User Configuration 

1+1- CH Software Settings 
1+1- CH Windows Settings 
[+]â–  CH Administrative Template: 

«J I 2} 



Name 



Version Deployment state | Source 



j Microsoft Smartphone 2003 SDK 4,20 Assigned 



\\ns\g$\Micrc 



iL 



9. Bn>KflaMe HOBOC"b3flafleHMfl naKeT b KOH30/iaTa Group Policy Object 
Editor. B Haujua cnynaw tom me 6"bfle kmcra/ikipaH npn c/ieflBamoTO 



794 



flporpaMnpaHe 3a .NET Framework (tom 2) 



B/iM3aHe Ha noTpe6MTe/iMTe b CMcreMaTa v\nv\ npn CTapTupaHe Ha 
KOMnKupnTe, komto ca 4aCT OT flOMeMHa. 

MS System Management Server (SMS) 

System Management Server v2.0 c/iy>KM 3a ziecHO ueHTpa/iM3MpaHO ynpaB- 
zieHkie Ha MHcra/iauMM Ha cocpTyepHM naKeTM b KopnopaTMBHa Mpe>Ka. Ochob- 
HMTe npeAMMCTBa Ha SMS ca: 

- Pa3npocrpaHeHi/ie Ha npn^OKeHna Ha MHOKecrBO k/im6htckm n/iaTCpop- 
mm. Bcmukm Bepcun Ha Windows ce noflfltpwaT ot SMS. 

- KoHTpo/i Hafl HaTOBapBaHeTO Ha Mpe>KaTa. SMS no3BO/i*iBa Ha6/iK>fleHkie 
Ha MpexoBMfl KaHa/i v\ HeroBOTO HaTOBapBaHe KaTO no3BO/iflBa Hacrpoi/i- 
BaHe m M36arBa flont/iHMTe/iHOTO HaTOBapBaHe b Henoflxofl*imo BpeMe ot 
fleHOHOiuneTO. 

- Pa6oTa c onpe,qe/ieHM noTpe6MTe/iM v\ MaiunHM. ripM/ioweHMATa MO>Ke fla 
ce pa3npocrpaHflBaT Ha 6a3a noTpe6MTe/iCKO MMe, MMe Ha rpyna, MMe Ha 
KOMniOTbp, MMe Ha flOMefiH m MpexoB aApec. 

- M3no^3BaHe Ha rpacpMK 3a pa3npocTpaHeHne Ha cocpTyep. Pa3npocr- 
paHeHneTO ce M3BtpujBa no npeflBapMTe/iHO yKa3aH rpacpMK. ToBa e 
no/ie3HO 3a M36arBaHe Ha HaTOBapBaHeTO no onpe,qe/ieHO BpeMe Ha 
fleHOHOiuneTO. 

- CtCTOflHue Ha pa3npocTpaHeHneTO. SMS noKa3Ba ctCTOflHueTO Ha 
MHCTa^aunflTa v\ no3BO/iHBa HaBpeMeHHO pearnpaHe b c/iynaw Ha 
rpeujKM. 

- KpaeH pe3y/iTaT Ha pa3npocTpaHeHneTO. Ako npn^OKeHneTO e 6m/io 
ycneujHO MHcra/iMpaHO Ha flafleH K/iMeHT, TOBa He 03HanaBa, ne ue/iMAT 
npouec e 6m/i ycneiueH. SMS npeflocraBfl fleTafi/iHa MHCpopMauna 3a 
KpaMHMfl pe3y/iTaT. 

SMS MMa cbom MexaHM3"bM 3a pa3npocTpaHeHne Ha npn^OKeHMATa v\ He 
M3MCKBa 3aA"b^>KMTe^HOTO M3no/i3BaHe Ha naKeTM Ha Windows Installer, ho 
noflfl"bp>Ka MSI naKeTM. 

ApyrM MeTOflM 3a pa3npocTpaHeHMe Ha MSI naKeTM 

CtiuecTByBaT v\ hako/iko Apyrn MeTOAa 3a pa3npocTpaHeHne Ha MSI naKeTM : 



MeTOA 


OniicaHiie 


ripeflMMCTBa/HeflocTaT-bMM 


Ye6/FTP 

CbpBtp 


riaKeTMTe ca 
nocTaBeHM Ha 

CbpBtp OT 

ziOKa/iHaTa 
Mpe>Ka M/1M B 
1/lHTepHeT M 

Bp"b3Ka K"bM TAX 

e M3npaTeHa Ha 


flo6"bp HanMH 3a npeflocraBAHe Ha npM/io>Ke- 
HMe Ha LUMpoKa ayflMTopMa. 

riaKeTMTe MoraT fla 6tflaT apxMBMpaHM (Ha- 
npMMep b .ZIP apxMB), 3a fla ce M36erHe 
AMpeKTHO CTapTMpaHe. 

HflMa kohtpo/i Btpxy CBa^AHeTO Ha naKeTMTe. 

M3MCKBaT ce aflMMHMCTpaTMBHM npaBa 3a yc- 



T/iaBa 25. AceM6/iMTa v\ pa3npocTpaHemie 



795 





noTpe6i/iTe/ikiTe. 


neujHa MHcra/iauMsi. 


MpexoB 

CtpBtp 


riaKeTMTe ca 
nocTaBeHM Ha 

CbpBtp M 
Bpt3Ka K"bM TAX 

e M3npaTeHa Ha 
noTpe6nTe^MTe. 


flo6"bp Ha^MH 3a pa3npocTpaHeHMe b .qafleHa 
opraHM3auMfl. 

riaKeTMTe MoraT fla 6"bflaT apxMBMpaHM (Ha- 
npMMep b .ZIP apxMB), 3a fla ce M36erHe 
AMpeKTHO CTapTMpaHe. 

HflMa kohtpo/i Btpxy CBa^AHeTO Ha naKeTMTe. 

M3MCKBaT ce aflMMHMCTpaTMBHM npaBa 3a yc- 
neujHa MHcra.nau.Mfl. 


E-mail 


riaKeTMTe ce 
M3npaiuaT npe3 
e^eKTpoHHaTa 
noma 


/lecHM ca 3a HaMMpaHe. 

He MoraT fla ce CTapTMpaT flMpeKTHO, 3apaflM 
6^0KMpaHeTO mm ot Kj\v\emv\Te 3a e/ieKTpoH- 
Ha noma. MoraT fla 6"bflaT cpM/iTpMpaHM ot 
CMCTeMM 3a 3aiflMTa ot cnaM m BMpycM. 

Mowe fla flOBefle ao 3HanMTe/iHO HaTOBap- 
BaHe Ha cbpBtpMTe. 

M3MCKBaT ce aflMMHMCTpaTMBHM npaBa 3a yc- 
neujHa MHcra.nau.Mfl. 


CD/DVD 


riaKeTMTe ca 
3anMcaHM Ha 
onTM^eH 

HOCMTe/l. 


/lecHO npeHOCMMM. 

noflxoflfliflM, KtfleTO MpexoBMflT KaHa/i He e 
AOcrarbUHO ujmpok v\nv\ naKeTMTe ca mhoto 

06eMHM. 

M3MCKBaT ce aflMMHMCTpaTMBHM npaBa 3a yc- 
neujHa MHcra/iau.Mfl. 



MHCTpyMeHTM 3a ci>3AaBaHe Ha MSI naKeTM 

Visual Studio .NET 2003 noflfl"bp>Ka cb3flaBaHeTO Ha MHcra/iau.MOHHM naKeTM, 
BtnpeKM ne He M3no/i3Ba nt/iHMTe bb3mo>khoctm Ha TexHO/iorMATa Windows 
Installer. 3aTOBa me noconMM HaM-necro M3no/i3BaHMTe MHCTpyMeHTM 3a 
pa6oTa c MSI naKeTM. Ochobho MO>Ke fla pa3fle/iMM MHCTpyMeHTMTe Ha flBe 
rpynM: 

1. flocTaBAHM ot MaMKpococpT: 

- Visual Studio .NET 2003 - noflfl"bp>Ka cb3flaBaHeTO Ha ochobhm MHcra/ia- 
Umohhm naKeTM m npefl/iara cpaBHMTe/iHO flo6"bp MHTepcpekic 3a M3rpa>K- 
flaHe Ha MHcra/iau.MOHHMfl npou.ec. noflxoflflm e 3a cpeflHM no c/io>khoct 
npM^o>KeHMfl. 

- Orca - cbfl-bpwa ce b Platform SDK. npefl/iara cpefla 3a peflaKTMpaHe Ha 
cpai/i/iOBe Ha Windows Installer (.msp, .msi, .msm). l/l3K/iK>nMTe/iHO 
MOiueH, ho c^o>KeH - noflxoflfliu 3a eKcnepTM b TexHO/iorMATa Windows 
Installer. 



796 nporpaMnpaHe 3a .NET Framework (tom 2) 

- Windows Installer XML (WiX) - TOBa e npoeKT no MHnunaTUBa Ha 
MawKpococpT Shared Source Licensing (bm>k http://www.microsoft.com/ 
resources/sharedsource/licensinq/WiX.mspx i/i http://sourceforqe.net/ 
projects/wix/ ). rio3BO/iflBa 3a onucaHneTO Ha MSI naKeTMTe fla ce v\3- 
no/i3Ba XML cope koa, komto ce KOMnw/ikipa ,qo .msi cpaw/i. noflxoflsim 
3a HanpeAHa/iw pa3pa6oTni/iu.n. 

2. Ot Apyrn npon3BOAMTe^n: 

- InstallShield - npoflyKT Ha Macrovision (6nBiuaTa InstallShield). M3K/1K)- 
nwTe/iHO MHTynTMBeH m zieceH 3a M3no^3BaHe MHTepcpewc. Pa6oTaTa e 
ynecHeHa ot Ha/iwuweTO Ha cbBeTHnun (wizards). MHTerpupa ce ot/imuho 
B"bB Visual Studio .NET 2003. flOKyMeHTaunflTa e mhoto no,qpo6Ha v\ 3a 
HaM-necro M3no^3BaHMTe 3aflanki ca .qafleHM npuMepn. npeflocraBfl cbom 
co6cTBeH CKpunTOB e3MK (InstallScript), komto no3BO/isiBa KOHTpo/iwpaHe 
Ha MHCTa^aunoHHMfl npou.ee bbb BCkinKkiTe My acneKTM. Ocpkiu.kia/iHMflT 
ye6 cawT Ha InstallShield e http://www.installshield.com/products/ 
installshield/ . 

- Wise for Windows Installer - npoAyKT Ha Wise, komto ce MHTerpupa c 
Visual Studio .NET 2003. MoiueH npoAyKT v\ zieceH 3a ynoTpe6a. Cbmo 
npeflocTaBfl cbom CKpunTOB e3MK 3a KOHTpo/iwpaHe Ha MHCTa/iau.i/iOHHM5i 
npou.ee. Ocpnuna^HMflT ye6 caMT Ha Wise for Windows Installer e 
http://www.wise.com/wfwi.asp . 

KosieKLiiifl ot 4>aM/iOBe cnea KOMniiJiauusi 

3a mhoto ye6 npn^OKeHna v\ hakom onpocreHki Windows npw/ioweHkifl e no- 
noflxoAfliuo pa3npocTpaHeHneTO npe3 npocTO KonnpaHe Ha cpaw/iOBe Ha 
cbpBtpa, BMecTO M3rpa>KflaHeT0 Ha c/io>khm MSI naKeTM. nofl KO^eKuna ot 
cpaw/iOBe MMaMe npeflBkifl bcm^km cpai/i/iOBe, komto ce w3no/i3BaT ot npw/io- 
>KeHi/ieTO - .apsx, .dii, .exe, . conf ig, rpacpi/inHki cpaw/iOBe m Apyrn pecypcu. 

ripeAMMCTBaTa Ha Ta3M 1/iHcra/iau.i/iOHHa crpaTeri/ifl ca: 

- JlecHOTa 3a kmcra/ikipaHe - cpaw/iOBeTe ce kmcra/ikipaT Ha MaiunHaTa 
npe3 npocTO KonnpaHe. 

- /lecHOTa 3a "bnrpewfl - HOBMTe cpaw/iOBe ce KonnpaT Btpxy crapwTe. 

3a pa3/ikiKa ot Windows 6a3npaHMTe npn^OKeHna, ye6 npn^OKeHMATa ce 
MHcra/iwpaT ot aflMi/mi/icrpaTop v\nv\ onuTeH IT cneu.ua/iwcT. B mhoto c/iynaw 
TaKMBa npw/io>KeHkm He ce kiHcra/iwpaT, fleMHcra/iwpaT v\ nonpaBAT npe3 
Add/Remove Programs ot Control Panel. B-b3craHOB5iBaHe Ha npefli/iwHOTO 
cbCTOAHne Ha Mawi/maTa npn rpeujKa cbu\o He e Heo6xofli/iMO ycnoBkie - no- 
ziecHO e 3a aflMMHwcrpaTopa fla npoMeHM HacrpoMKkiTe Ha IIS v\nv\ fla OTcrpaHki 
Ape6HM npo6/ieMki BMecTO fla pecrapTkipa ue/ikifl MHcra/iaukiOHeH npou.ee. 

BtnpeKM, ne Ta3M CTpaTerna pa6oTM flo6pe c no-npocm npn^o>KeHM5i, ta He e 
noflxoflfliua npn cneflHi/iTe CMTyau.nn: 

- npoMAHa b Windows Registry 



T/iaBa 25. AceM6/iMTa v\ pa3npocTpaHeHne 



797 



- flo6aBAHe, M3TpnBaHe v\nv\ npoMsma Ha Windows ycnyrki 

- npoMHHa no no/iMTMKMTe Ha curypHOCTTa (security policy) 

- Ao6aBHHe, M3TpnBaHe v\i\v\ npoMHHa Ha COM 6a3npaHM o6eKTM 

- pa6oTa c Global Assembly Cache 

ripn pa6oTa c no-c/io>KHki npw/io>KeHkifl e npenoptuwTe/iHO i/i3no/i3BaHeTO Ha 
Windows Installer. 



HaniiHH Ha pa3npocrpaHeHne 

CaMOTO pa3npocTpaHeHne Ha cpaw^OBeTe MO>xe fla ce M3B"bpujn no cneflHMTe 
Ha^MHn: 

- Hpe3 Microsoft Application Center - i/i3K/iionkiTe/iHO noflxoflyimo npn t. 
Hap. ye6 cpepMM (Web farms). Te npeflcraB/isiBaT K/itcrep ot hako/iko 
MaiuMHM, komto npeflOcraBAT ye6 yc/iyra v\nv\ ye6 npn^oxeHne. ripn 
MHCTa^npaHe Ha ye6 npn^OKeHne Btpxy ye6 cpepMa e Heo6xoflMMO 
BCsiKa eflHa ot MaiunHMTe fla MMa eflHM v\ cbu\v\ dpai/i/iOBe, i/iHcra/iwpaHM 
KOMnoHeHTM, HacTpoMKM Ha IIS m flp. M3no^3BaHeTO Ha Microsoft 
Application Center ocurypaBa cbfltpaoHkieTO Ha MaiunHMTe b ye6 cpep- 
MaTa fla 6"bfle eflHaKBO. Microsoft Application Center He e noflxoflam 3a 
pa3npocTpaHeHne Ha MSI naKeTM, Windows 6a3npaHM npi/i/io>KeHi/ifl, 
Windows yc/iyrw v\ 6a3M flaHHM. 

- Hpe3 Copy Project KOMaHflaTa ot Visual Studio .NET 2003 (caMO 3a ye6 
npw/io>KeHkifl). C"b3flaBa BkipTya/iHa flupeKTopua Ha noconeHkifl cbpBtp v\ 
Konupa cpaw/iOBeTe b Hea: 



Copy Project 



Source project folder: http://iAia.galcho.com 

Destination project folder: 







Web access method 

L(* FrontPage 
C~ File share 
Path: 



\\Copy_of_T5CG\wwwoot$\ 



Copy: 




i* Only files needed to run this application 

C All project files 

C" All files in the source project folder 



OK 



Cancel 



Help 



MMa c/ieflHMTe onu.nn 3a KonwpaHe: 



798 



flporpaMnpaHe 3a .NET Framework (tom 2) 



CaMO cpaw^OBeTe, Heo6xoflMMM 3a ki3n"b/mei-ikie Ha npw/io>KeHkieTO - 
BK/iiouBa: cpaw^OBeTe c"b3flafleHM no BpeMe Ha KOMnki/iauwa, 
pecpepupaHMTe aceM6/ii/iTa, KaKTO v\ bcm^km (fcaw/iOBe, komto ca 
Ao6aBeHM b npoeKTa Ha Visual Studio .NET v\ 3a komto e 3aflafleHO 

BuildAction=true. 



Bcm4km cpaw^OBe ot npeflxoflHaTa TOUKa 
cpaw^OBe. 



M BCM4KM npOeKTHM 



o Bcm4km cpaw^OBe ot npoeKTHaTa flupeKTopua v\ bcmukm iioaah- 
peKTopnn. 

flupeKTHO KonnpaHe Ha cpaw/iOBe - noflxoflaiuo e caMO, aKO He Tpa6Ba 
Aa ce npoMeHAT perncTpnTe Ha Windows (Windows registry) v\nv\ p,a ce 
M3n"b^HABaT Aon"b/iHMTe/iHM 3aAa4M (KaTO HacTpowKM m pecrapTkipaHe Ha 
IIS, npoMAHa Ha HacrpoMKi/iTe 3a ckirypHOcrra v\ t.h.). 



Cb3AaBatie Ha MSI MHCTa/iauMOHeH naKeT 

C/ieA KaTO onucaxMe pa3/iwnHHTe MHcra/iaukiOHHM CTpaTernn e BpeMe Aa 
npeMMHeM kbm npaKTwuecxaTa nacr. 3a cbwa/ieHkie H*iMa Aa MOxeM Aa 
o6xBaHeM bcmukm onucaHM BapnaHTM 3a pa3npocrpaHeHi/ie, ho me AeMOHcrpw- 
paMe Haw-Ba>KHMTe ot tax. IHe ce cnpeM Ha ABa BMAa MSI naKeTM - 3a 
Windows 6a3npaHO npi/i/io>KeHi/ie v\ 3a ye6 6a3npaHO npi/i/io>KeHi/ie. 



| .| M! ^, !,..â– . WB .,-. ;mJI ,, l3 j^H^-ff, 



al2£l 



File Edit View Project Build Debug lools Window Help 

n, % ^ a*. I * * I â– - 2 1 a % % % , 



" \3 



* ^ 






a 



Start Page frmMain.cs ResourceReader.es | Messages. resx | AssermblyInfo.es | Assemblylnfc <1 â–º X 

^| U^btnValidate_Click(object senderjSysteni.Even ^| 



fCreditCardVc idatorC ient.frmMain 



Q using System; 

using System. Drawing; 

using System. Collections; 

using System. ComponentModel; 

using System. Windows . Forms; 

using System. Data; 

using System. Reflection; 

using US = Credit Car dValidat or Client . HyService; 



H namespace Credit Car dValidat or Client 
{ 

/// <summary> 

/// Summary description for Forml. 

/// </summary> 

public class f rmHain : System. windows . Forms .Form 

{ 

private System. Windows . Forms .Label labell; 

private System. Windows . Forms . ComboBox cmbType; 

protected WS . CreditCardValidator cardValidator ; 

private System. Windows . Forms . TextBox textCardNumber; 

private System. Windows . Forms . Label labels ; 

private System. Windows . Forms . Button btnValidate; 

private System. Windows . Forms . Button btnClose; 

J I ±n 



| Solution Explorer - CreditCardVal ida... â– ? 



Bi |# B 



[^ Solution 'CreditCardValidator' (3 projects) 
3- [p CreditCardValidatorClient 

B- (♦£] References 
ED- t^ Web References 

®^ MyService 

^ App.config 

HI] App.ico 

^ AssemblyInfo.es 

[zi] Messages. resx 
B- CreditCardValidatorWS 
El'" Gal References 
Pi. AssemblyInfo.es 
â– S] CreditCardValidator. asmx 
£t] Global. asax 
[^ Web.config 
B- {p MyLibrary 
B- ^ References 
â– â– â– â–  ^} AssemblyInfo.es 

11 keypair.snk 

â– â– â– â–  Pi ResourceReader.es 



± 



Jj 



t Solution,,, | Hfproperti... | Index | 



H Output 



|^|S|1|0| 



Ready 



Col 14 



Ch5 



Jll^U 



T/iaBa 25. AceM6/inTa v\ pa3npocTpaHeHne 



799 



ripuMeptT, komto me pa3MeflaMe, BK/iiouBa c/ieflHMTe npoeKTu: 

- CreditCardValidatorWS - ye6 yc/iyra, KOflTO npOBepflBa Ba/lklAHOCTTa 

Ha KpeflMTHa KapTa. 

- CreditCardValidatorClient - Windows 6a3kipaHO npi/l/10>KeHI/ie, KOeTO 
l/l3nO/13Ba MeTOflMTe Ha CreditCardValidatorWS. 

- MyLibrary - 6n6/inoTeKa ot K/iacoBe, cbAtpwama K/iac 3a neTeHe Ha 
pecypcHM cpaw^OBe, komto ca KOMrm/iwpaHM b aceM6/ikiTaTa. Cm/iho MMe- 
HyBaHOTO aceM6/ii/i MyLibrary.dll me 6"bfle flo6aBeHO b GAC. 

no-rope e noi<a3aHO KaK H3Me>Kfla bbb VS.NET peiueHneTO, KoeTO BK/iK>nBa 
TpnTe npoeKTa. 

HflMa fla HaB^M3aMe b onucaHne Ha Te3M npoeicrw, noHe>Ke ue/iTa e flpyra - Aa 
noKa>KeM npoueca Ha cb3£aBaHe Ha kiHcra/iaukiOHHki naKeTM 3a BceKM ot tax. 

Ci>3flaBaHe Ha MHCTajiauuoi-ieH naKeT Ha Windows 
6a3npaHO npnno>KeHMe 

HeKa ntpBO cb3flafleM kmcra/iaui/iOHeH naKeT 3a Windows Forms 6a3npaHOTO 

npn^OKeHkie CreditCardValidatorClient. 



New Project 



Project Types: 



Templates: 



+ 



+ 



V~\ Visual Basic Projects 

O Visual C# Projects 

O Install5hield X Projects 

~H Microsoft Office System Projects 



l Setup and Deployment Projects 



Q Other Projects 

C~\ Visual 5tudio Solutions 



I Setup Project 



Web Setup Merge Module 
Project Project 



Setup Wizard Cab Project 



Create a Windows Installer project to which files can be added. 
Name: | Installment 

Location: I D:\Projects\Book\CreditCardValidator 

(* Add to Solution C" Close Solution 

Project will be created at D:\Projects\Book\CreditCardValidator\InstallClient. 



"3 



Browse. 



^More 



OK 



Cancel 



Help 



Ot 3apefleHOTO peiueHne creditcardvaiidator.sin bbb Visual Studio .NET 
2003, M36npaMe File -> New -> Project v\ M36npaMe Setup Project ot 



800 



flporpaMnpaHe 3a .NET Framework (tom 2) 



KaTeropuflTa Setup and Deployment Projects. 3a MMe B"bBe>KflaMe 
instaiiciient m M36npaMe onunflTa Add to solution (b>k. cpwrypaTa no- 
rope). rioTB"bp>KflaBaMe c 6yTOHa [ok] . 



Hobmat npoeKT ce cb3AaBa 

CreditCardValidator . sin. 



ce flo6aBfl kbm peiueHneTO 



XapaKTepMCTMKM Ha MHCTa/iauMOHHMn npoeKT 

Tpa6Ba p,a 3aAaAeM CBOMCTBaTa Ha npoeKTa - p,a 3aAafleM MMe Ha npoAyKTa, 
KOfl, npon3BOflHTe^ m flp. 3a ue/iTa M36npaMe npoeKTa instaiiciient v\ 
OTBap^Me npo3opeua Properties Ha Visual Studio .NET 2003. 3aflaBaMe 
ctomhoctm Ha CBOMCTBaTa Title m ProductName "Credit Card Validator". 
3aflaBaMe v\ aBTop v\ npoki3BOAHTe/i Ha npoAyKTa, aKO e Heo6xoAHMo: 



| Properties 1 X 


Instaiiciient Deployment Project Properties _^J 


i 


A i 


HI 


M 


B 


Misc 


Manufacturer 


Galin Iliev 


ManufacturerUrl 




ProductCode 


-[A3E3AA3C-3D63-4A5B-8F0A-B3; 


ProductName 


Credit Card Validator 


RemovePreviousVersioi False 


Title 


Credit Card Validator 


UpgradeCode 


-[0F50677 1 -69E2-4C 1 A-8F77-70 A 


Version 


1.0.0 



flo6aBHHe Ha cpaftsiOBe kt»m MHCTasiaijMOHHMfl npoeKT 

C^eABaiuaTa crbnKa e Ao6aB*iHe Ha npoeKTHMTe cpaw/iOBe kbm cb3AaAeHMH 
MHCTa^aunoHeH npoeKT. Ot koht6kcthoto MeHK> Ha npoeKTa instaiiciient 
M36npaMe Add -> Project Output... 



f* Instaiiciient - Microsoft Development Environment [design] - File System (Instaiiciient] 



File Edit View Project Build Debug Tools ReSharper Window Help 
j ftp - f & fa T ||^ ^ Debug â–¼ I Qg bg 






* 






File System (Instaiiciient) 



<1 > x 



File System on Target Machine 

■£D Application Folder 

Cl User's Desktop 

G User's Programs Menu 



Name 



Iffie. 



]Application Folder Folder 

lUser's Desktop Folder 

] User's Programs Menu Folder 



S Solution 'CreditCardValidator' (3 
H- ijp CreditCardValidatorClient 

| - P CreditCardValidatorWS 

&â– â– â–  M_ 

C3 Di ffl Build es 

J Rebuild -J 



â– o-i Solution 



Project Output. 
File... 



View 



Add 



Install 



T/iaBa 25. AceM6/iMTa v\ pa3npocTpaHeHne 



801 



OTBapa ce flkia/ioroB npo3opeu, ot komto ce M36npa kom nacm Ha npoeKTa (m 
KOHKpeTHMfl npoeKT) fla ce BK/iionaT b kiHcra/iaukiflTa. M36npaMe npoeKTa 

CreditCardValidatorClient, M36kipaMe Primary Output. (Ta3M OnUMfl fl06a- 

Bfl caMO cpafi/iOBeTe, komto ce cb3AaBaT no BpeMe Ha KOMni/i/iau.i/m. Bcmukm 
flpyrn cpaw^OBe Tpa6Ba fla ce Ao6aBsiT flont/iHi/iTe/iHO.) 



Add Project Output Group 



*l 



Project: 



CreditCardValidatorClient 



i 



Documentation Files 



iPrimarv output 



Localized resources 
Debug Symbols 
Content Files 
Source Files 
J I 



Configuration: 
Description: 



(Active) 



1 



Contains the DLL or EXE built by the project. 




~3 



OK 



Cancel 



Help 



rioTB"bp>KflaBaMe c 6yT0Ha [ok] m kbm i/iHcra/iaukiOHHi/m npoeKT e flo6aBeH 
Primary Output. 06"bpHeTe BHMMaHne, ne Visual Studio .NET 2003 e flo6a- 
Bkl/lO pecpepupaHOTO aceM6/lM MyLibrary.dll B KaTeropklflTa Detected 
Dependencies . 

no noflpa36npaHe nanKaTa, b koato me 6"bfle kmcra/ikipaHO MyLibrary.dll, e 
MHCTa^aunoHHaTa nanKa Ha npn^OKeHneTO, koato noTpe6MTe/i*iT M36npa no 
BpeMe Ha MHcra/iauMfl. 

3a fla kiHcra/ikipaMe MyLibrary.dll b Global Assembly Cache Tpa6Ba fla 
HanpaBMM flont/iHMTe/iHw HacrpowKM. Eto CTbnKMTe, komto Tpa6Ba fla 

M3B"bpilJMM: 

B M3r/iefla File system Ha kiHcra/iauwoHHi/m npoeKT (oTBapa ce ot KOHTeKcr- 
hoto MeHK) Ha MHCTa^aunoHHMfl npoeKT instaiiciient -> View -> File 
System) OTBapaMe koht6kcthoto MeHK) Ha File System on Target Machine -> 
Add Special Folder -> Global Assembly Cache Folder: 



802 



flporpaMnpaHe 3a .NET Framework (tom 2) 



1 *'» InstallClient - Microsoft Development Environment [design] - File System (Ins 


talldient) | 


File Edit View Project Build Debug Tools 


Action Window Help 




ie-fei^ a m\ & % e| • 


T <JE T H^ Debug 


| op @® - 1 S i^ * 




r.cs | Messages. resx | AssemblyInfo.es | Assembl' 


File System (InstallClient) | ^ 


> X 


\ Solution Explorer - InstallClient ^ X | 


^HSSKfEB 








%#iP %m% 


o 


I---Q Application Fol 


Add Special Folder â–º 


Common Files Folder 




\f£ Solution 'CreditCardValidator' (4 pn ^ 
6- [p CreditCardValidatorClient 


!■-■£] User's Desktop 




m 
â– ft. 


"-â– Q User's Programs Menu 








FR- fo| References 




Program Files Folder 






B- C3 Web References 


1 




System Folder 










§ App.config 

[jj] App.ico 

^J AssemblyInfo.es 






User 


s Application Data Folder 










^ 




User 


s Desktop 










"^1 frmMain.cs 






User 












13] Messages. resx 












B- 






User 


s Personal Data Folder 






EI- Gel References 






User 


s Programs Menu 








â– â– â–  2_] AssemblyInfo.es 

â– â– â– â–  -S] CreditCardValidator, asmx 






User 


s Send To Menu 








■-■■ ££] Global. asax 






User 


s Start Menu 








- [l$ Web.config 












B - |H MyLibrary 






User 


s Startup Folder 






B- Cial References 






User's Template Folder 








^J AssemblyInfo.es 














â– -â– â–  M keypair.snk 














Fl ResourceReader.es 


Global Assembly Cache Folder 


B- Sp ^ 

B- ^ Detected Dependencies 

1. rt.nl. n,ntfw 1 r nr 4.Vt- -.,0£ m« 


Custom Folder 








<i f >r 


<l 1 


Jj 


S Solution,., | [iffproperti., | Index | 


B output la&i^i^iai 


| Ready 




\/, 



CneA KaTO Bene MMaMe flo6aBeH GAC kbm kiHCTa/iauwoHHHTe nanKM Ha 
npoeicra MO>xe Aa 3aAaAeM MecTono/ioxeHi/ieTO Ha MyLibrary.dll. OTBapaMe 
KOHTeKCTHOTO MeHK) Ha MyLibrary.dll ot Solution Explorer (ot KaTeropn^Ta 
Detected Dependencies Ha npoeKTa InstallClient) v\ M36npaMe Properties. 
Ot npo3opeua Properties M36npaMe cbomctboto Folder. HeroBaTa ctomhoct no 

noApa36npaHe e Application Folder. M36npaMe 6yT0Ha J n ot Ana/ioroBMfl 
npo3opeu Select Folder M36npaMe Global Assembly Cache v\ noTBtpwAaBaMe c 
6yT0Ha [ok] . 



Select Folder 



*l 



i File System on Target Machine 
■■£] Application Folder 



\ssernbly Cache Folder 



User's Desktop 
User's Programs Menu 






OK 



Cancel 



Help 



T/iaBa 25. AceM6/inTa v\ pa3npocrpaHeHkie 



803 



Cb3flaBaHe Ha mkohm 3a MHcra/iMpaHOTO npmio>KeHMe 

3a fla e 3aB"bpiueH kiHCTa/iaukiOHHkifl npou.ec Tpa6Ba fla flo6aBMM npenpaTKM 
(shortcuts) 3a 6tp30 crapTwpaHe Ha npn^OKeHneTO. 3a nporpaMHM npoflyKTM, 
Haco^eHM ki>m o6nKHOBeHMTe noTpe6nTe^n (He aflMUHMCTpaTopn) e 3afl"b/i>Kki- 
Te/iHO flo6aBflHeTO Ha npenpaTKM (shortcuts) b Start Menu Ha Windows. 
flo6aBAHeTO Ha npenpaTKM (shortcuts) Ha pa6oTHaTa n/iom (desktop) v\ 
zieHTaTa 3a 6tp30 crapTkipaHe (Quick Launch) He e 3afl"b/i>KMTe.nHO, ho Moxe 
fla ce M3B"bpujn 3a yflo6cTBO Ha noTpe6kiTe/ifl. 

flo6aBfiHe Ha npenpaTKM b Start Menu Ha Windows 

Ot M3r/iefla File System M36kipaMe User's Programs Menu C fleceH 6yTOH Ha 

MMiuKaTa m ot KOHTeKCTHOTO MeHK> w36wpaMe Add -> Folder. 3a MMe Ha nan- 

KaTa B"bBe>KflaMe "Credit Card Validator". M36kipaMe Jl H OT KOHTeKCTHOTO 

MeHK) Ha AeTaw/iHaTa o6/iacr (b cpeflaTa) M36npaMe create New shortcut. 



f* InstallClient - Microsoft Development Environment [design] - File System (InstallCli 



File Edit View Project Build Debug Tools ReSharper Action Window Help 
HP'I^HSU^il^^'l 1^1 â–º Debug - I r# 






File System (InstallClient) 



File System on Target Machine 
■£] Application Folder 
â– Q Global Assembly Cache Folde 
â– G User's Desktop 
B"£l User's Programs Menu 
Q Credit Card Validator 



Name 



T VP e 



Add â–º 1 


Create New Shortcut 




View â–º 


* 


Cut 


m 


Paste 



Ot OTBopw/ikifl ce flkia/ioroB npo3opeu M36npaMe Application Folder -> Primary 

Output for CreditCardValidatorClient (Release .NET) M nOTB-bp>KflaBaMe c 
[ok] 6yTOHa: 



Select Item in Project 



x] 



Look in: 



Application Folder 



"3 



i^ Primary output From CreditCardValidatorClient (Release .NET) 



Source path: 
Files of type: 



Add File,, 



Add Output., 



Add Assembly, 



| All Files (*.*) 



OK 



3 

Cancel 



Help 



804 



flporpaMnpaHe 3a .NET Framework (tom 2) 



B AeTaM/maTa o6/iacr ce flo6aB$i npenpaTKa kbm ochobhma dpawn Ha npw/io- 
>KeHneTO. MMeTO e b pe>KMM Ha peflaKTupaHe v\ MO>KeM fla BtBefleM noflxoflaiuo 

MMe, Hanp. "Credit Card Validation": 



? * InstallClient - Microsoft Development Environment [design] - File System (Inst 



File Edit View Project Build Debug Tools ReSharper Window Help 
||'i^yeU%g|«^'| %\ ► Debug 



File System (InstallClient) 



File System on Target Machine 
■£] Application Folder 
■£] Global Assembly Cache Folde 
£] User's Desktop 
H-£] User's Programs Menu 
^ Credit Card Validator 



Name 



Credit Card Validation 



T VP e 



Shortcut 



o 
g_ 
cr 
o 

no noApa36kipaHe /lkincBa MKOHa 3a Ta3M npenpaTKa. Ot npo3opeu.a Properties 
M36npaMe cbomctboto Icon m ce OTBapa npo3opeu 3a M36op Ha MKOHa. Oaw/itT 
Tpa6Ba fla e BK/iK>neH b kiHcra/iaui/mTa. flo6pa npaKTMKa e fla ce M36npa 
MKOHaTa ot M3n"b/iHkiMMfl cpaw/i, KtM komto C04M npenpaTKaTa. Ako M36epeM 

.exe OT npoeKTa CreditCardValidatorClient, ce nOKa3BaT BCM4KM MKOHM, 

komto ce cbfl"bp>KaT b Hero: 



*l 



File name: 



Primary output from CreditCardValidatorClient (Release Browse. 



Current icon: 





OK 



Cancel 



Help 



M36npaMe noflxoflaiua kiKOHa v\ noTB"bp>KflaBaMe c 6yTOHa [ok] . 

flo6aBJiHe Ha npenpaTKa Ha pa6oTHMn n/iOT (Desktop) 

flo6aBAHeTO Ha npenpaTKa Ha pa6oTHMfl n/iOT TexHkmecKw He ce pa3/ikmaBa 
mhoto ot Zlo6aB5iHe Ha npenpaTKM b Start Menu Ha Windows . 



T/iaBa 25. AceM6/inTa v\ pa3npocTpaHeHne 



805 



B yKa3aHMATa Ha Mai/iKpococpT 3a Windows 6a3npaHMTe npw/io>KeHkifl 
("Designed for Microsoft Windows XP" Application Specification 
http://www.microsoft.com/ win loqo/softwa re/down loads .mspx ) e noco^eHO, 
ne nopaAM npeTpynBaHe Ha pa6oTHMfl n/iOT c/ieABa nocraBflHeTO Ha mkohm p,a 
ce M3B"bpujBa caMO no M3pn4H0 yKa3aHne Ha noTpe6wTe/ifl. TexHkinecKki TOBa 
03HanaBa Ao6aBHHe Ha Ana/ioroB npo3opeu, b komto noTpe6kiTe/ifl p,a yKaxe 
npeAno4MTaHMATa cm. KaTO cneABaMe yKa3aHMATa ot TOUKaTa ,Ao6aBaHe Ha 
npenpaTKM b Start Menu Ha Windows , Ao6aB*iMe MKOHa b nanKaTa user's 

Desktop. 

noKa3BaMe v\3rnep,a user interface - ot KOHTeKCTHOTO MeHK) Ha kiHcra/ia- 
UMOHHMfl npoeKT instaiiciient, M36npaMe View -> User Interface. B Hero e 
noKa3aHa noc/ieAOBaTe/iHOcrra Ha Ana/1031/iTe, komto ce noKa3BaT no BpeMe 
Ha HopMa/iHa wHCTa/iaui/ifl v\ aAMUHMCTpaTHBHa kiHCTa/iauwfl. 

Ot KOHTeKCTHOTO MeHK) Ha Ana/iora start M36npaMe Add Dialog: 



Ti InstallClient - Microsoft Development Environment [design] - User I~ 



Jnjxj 



File Edit View Project Build Debug 
Help 

@ H^ Release â–¼ | ^ bg 



Tools ReSharper Action Window 



'Ma 



User Interface (InstallClient) 



4 l> x 



In stall 

SHE 



Add Dialog 



3 
â– IH1 

1 Jt Cut 

■■§ Pro^ H, Paste 

Properties Window 



End 



|s| Finished 
Administrative Install 

§1 Start 

1=1 Welcome 

1=1 Installation Folder 

3 Confirm Installation 

Progress 

1=1 Progress 

End 

1=1 Finished 



Solution Explorer - InstallClient 



? X 



%m ^ 



i Solution 'CreditCardValidator' (4 projects ] 
!Jp CreditCardValidatorClient 

lp CreditCardValidatorWS 

[jp MyLibrary 

ID InstallClient 

S- S Detected Dependencies 

â–  ^ dotnetfxredist_xS6.msm 

â–  -o MyLibrary.dll 
1 Primary output from CreditCardVal 



1 



i Solution Explorer ^J Class View 



1 Output © 



Ready 



A 



noKa3Ba ce Ana/ioroBwa npo3opeu Add Dialog, ot komto MOxeM Aa M36epeM 
nja6/iOH, c"bA"bp>Kaiu KOHTpo/ikiTe, ot komto HMaMe Hy>KAa: 



806 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Add Dialog 



2<l 



J 



RadioButt... RadtoButt.., RadioButt., 
(2butto... pbutto... (4butto, 



Checkboxes Checkboxes Customer 
(B) (C) Information 



Textboxes Textboxes Textboxes License Read Me Register Splash 

(A) (B) (C) Agreement User 






Provides CheckBoxes that can be customized to control the installation. 

Cancel 





M36npaMe Lua6/iOHa CheckBoxes (a) m noTB"bp>KflaBaMe c 6yTOHa [ok] . Hobo- 
cb3p,ap,eHv\f\j Ana/ior ce Ao6aB*i KaTO nocnep,en b nopeAnu,aTa, ho e Heo6- 
xoammo as 6"bAe npeMecTeH npeAH Ana/iora installation Folder. C neBwn 
6yTOH Ha MMiuKaTa MO>Ke Aa ro B/ianwM v\ nycHeM Btpxy Ana/iora welcome v\nv\ 
ot KOHTeKCTHOTO MeHK) Ha CheckBoxes (a) Aa M36npaMe no3nu,MflTa My npe3 
KOMaHAMTe Move up m Move Down. Cnep, TOBa AewcTBue noc/ieAOBaTe^HOCTTa 
Ha Ana^oroBMTe npo3opu,n Tpa6Ba Aa e noAo6Ha Ha Ta3n: 



7H Install 


B-^fL Start 






-1^1 Welcome 






m iJH3BHP3rl 






â– 1^1 Installation Folder 






"3 Confirm Installation 


H-lj^D Progress 






~3 Progress 


B-^fL End 




â– 1^1 Finished 


7^1 Administrative Install 


H-Jj§] Start 






|s] Welcome 






â– IHl Installation Folder 






â– â– â– IH1 Confirm Installation 


El-^1 Progress 






|s] Progress 


H-Jj§] End 


: [s] Finished 





Cnep, KaTO Bene MMaMe nop,xop,9\u\v\9\ Ana/ior b nopeAnu,aTa, Tpa6Ba Aa ro 
HacTpouM, 3a Aa noKa3Ba noAxoAflmn cbo6meHkifl. Ot npo3opeu,a c HeroBMTe 
CBOMCTBa B"bBe>KAaMe KaKTO c/ieABa: 



T/iaBa 25. AceM6/iMTa v\ pa3npocTpaHeHne 



807 



Cbomctbo 


Ctomhoct 


Banner Text 


Credit Card Validation 


Body Text 


Select which shortuts to be placed 
during installtion 


CheckBoxlLabel 


Create shortcut on Desktop 


CheckBoxl Property 


CHE CKBOX_DE SKTOP 


CheckBox2Label 


Create shortcut in Quick Launch 


CheckBox2 Property 


CHE CKBOX_QUI CKLAUNCH 


CheckBox2 Value 


Checked 


CheckBox3Visible 


false 


CheckBox4 Visible 


false 



Eto KaK M3Me>Kfla to3m Ai/ia/ioroB npo3opeu b AewcTBue: 



i'3 Credit Card Validator 



Credit Card Validation 




Select which shortuts to be placed during installtion 

|~~ Create shortcut on Desktop 
W Create shortcut in Quick Launch 



Cancel 



< Back 



Next> 



Bene MMaMe cpyHKunoHnpaiu Ana/ioroB npo3opeu b nopeAHuaTa Ha Hawi/m MSI 
naKeT. MMaMe v\ 3aAafleHM npoMeH/ii/iBki, komto na3AT M36opa Ha noTpe6kiTe/i*i 
([ che ckbox_de sktop] m [checkbox_quicklaunch] ). Cera Tpa6Ba aa vv\ ao6a- 
bmm KaTO yc/iOBwe 3a MHcra/ii/ipaHe. 



808 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Ot H3Mefla File System M36kipaMe User's Desktop OTBapflMe npo3opeu.a C 
xapaKTepucTMKMTe (KOMaHflaTa Properties ot koht6kcthoto MeHK)). 3a cbom- 

CTBOTO Condition 3aAaBaMe CTOMHOCT " [CHECKBOX_DESKTOP]=l". 

flo6aBHHe Ha npenpaTKM b Quick Launch 

Quick Launch e bbsmokhoct Ha Internet Explorer fla noKa3Ba /ieHTa c 
npenpaTKM Ha pa6oTHna n/iOT Ha Windows. ritTflT ao Ta3M flupeKTopua no 

nOflpa36kipaHe e C:\Documents and Settings\ [UserName] \Application 
Data\Microsoft\ Internet Explorer\Quick Launch KaTO Ha MflCTOTO Ha 

[UserName] ctom MMeTO Ha TeKyiunfl noTpe6kiTe/i . 3a macTue b npoMeH/iMBMTe 

Ha Windows Installer CbLfleCTByBa User's Application Data Folder, KOflTO 
M3B^M4a ntTfl flO C:\Documents and Settings\ [UserName] \Application 

Data Ha TeKymnfl noTpe6kiTe/i. Mo>KeM fla flo6aBMM flupeKTopnaTa user's 
Application Data Folder ot KOHTeKCTHOTO MeHK) File System on Target 
Machine -> Add Special Folder -> User's Application Data Folder. 

C/iefl TOBa OT l/l3r/iefla File System M36npaMe User's Application Data 

Folder c fleceH 6yTOH Ha MMUJKaTa v\ ot koht6kcthoto MeHK) M36npaMe Add -> 
Folder. 3a MMe B"bBe>KflaMe Microsoft. Ot koht6kcthoto MeHK) Ha HOBOCb3- 
flafleHaTa nanKa noBTap^Me ropHOTO flewcTBue v\ cb3flaBaMe noflflnpeKTopua 

Internet Explorer. B Hefl C"b3flaBaMe nOflflkipeKTOpklfl Quick Launch. 

Ot KOHTeKCTHOTO MeHK) Ha AeTaw/iHaTa o6/iacr M36npaMe Create New Shortcut 
m noBTap^Me flewcTBHATa OTTOHKa " Zlo6aBaHe Ha npenpaTKM b Start Menu Ha 
Windows ". KaTO pe3y/iTaT eKpaHtT Tpa6Ba fla M3r/ie>Kfla noflo6HO Ha to3m: 



InstallClient - Microsoft Development Environment [design] - File System (InstallClient) 



isJjsJ 



File Edit View Project Build Debug lools Window 
|ffi]-Ei]-GSHfl|*|o-r*-^| ^le a5 e 



Help 



Form 



®m 



File System (InstallClient) 



4 > x 



File System on Target Machine 
Q Application Folder 
£D Global Assembly Cache Folder 
&■£] User's Application Data Folder 
r=1-j~~l Microsoft 

E-Q Internet Explorer 
-â– â– â– f^i Quick Launch 
■£] User's Desktop 
E3-£] User's Programs Menu 
Q Credit Card Validator 



Name 



Credit Card * 



'1 



J -LJ 



Properties 



* x 



Credit Card Validation File Install; â–¼] 






HI IS 



H Misc 

(Name) 

Arguments 

Description 

Folder 

Icon 

ShowCmd 

Target 

Transitive 

WorkingFolder 



Credit Card Validation 



Quick Launch 
(Icon) 

vsdscNormal 
Primary output 
False 
Application Folder 



IJJsoluti... [ffPrope,,, [^ Index 



I] Output 



^iiB 



Ready 



A 



T/iaBa 25. AceM6/iMTa v\ pa3npocrpaHeHkie 809 

3a fla MO>Ke noTpe6i/iTe/iflT fla M36npa fla/iw fla ce Cb3fla,qe npenpaTKa b Quick 
Launch (npe3 flwa/ioroBkifl npo3opeu, komto cb3fla,qoxMe b TOUKa " Zlo6aBaHe 
Ha npenpaTKa Ha pa6oTHaTa n^om (Desktop) ") Tpa6Ba fla 3aflafleM i/iHcra/ia- 

UMOHHO yC/lOBMe: M36npaMe nanKaTa User's Application Data Folder M OT 

npo3opeua c xapaKTepucTMKUTe B"bBe>KflaMe 3a cbomctboto condition 

CTOMHOCT " [CHECKBOX_QUICKLAUNCH]=l". 

npenpaTKa 3a AenHCTa/inpaHe Ha npmio>KeHMeTO 

KaTO \\s\no cb3flaBaHeTO Ha npenpaTKa 3a flewHcra/ikipaHe Ha npn^oxeHneTO 
He ce npenop"b4Ba ot MawKpococpT v\ e 3a/ierHa/io b yKa3aHMfl 3a npn^OKeHna 
3a Windows ("Designed for Microsoft Windows XP" Application Specification - 
http://www.microsoft.com/winloqo/software/downloads.mspx ). nopaflu cne- 
UncpMKaTa Ha flo6aB*iHe Ha noflo6Ha cpyHKUMOHa/iHOCT v\ necrwTe npaKTMKM Ha 
cocpTyepHMTe KOMnaHnn fla nocraBflT noflo6Ha npenpaTKa b CTapTOBOTO MeHK) 
me ro onuiueM. ToBa c/ieflBa fla ce pa3r/ie>Kfla KaTO npuMep 3a cb3flaBaHe Ha 
mkohm kbm npM/io>KeHMfl, komto He ce kiHcra/iwpaT ot TeKyiflMfl MSI naKeT. 

3a fla ce 3ana3i/i ue/iocrra Ha MSI naKeTa, Windows Installer He no3BO/iHBa 
nocTaBAHe Ha npenpaTKM kbm cpaw/iOBe, komto He ce pa3npocrpaHflBaT c 
flafleHMfl MSI naKeT. no to3m HanwH ce npeflOTBpaTABa 3aBMCMM0CTTa Ha MSI 
naKeTMTe kbm bbhiuhm cpaw/iOBe. KaKTO me noKa>KeM b TOUKaTa " l/lHcra/iM- 
paHe/flenHCTa^npaHe Ha MSI naKeTMTe ", ochobhmat KOMaHfleH cpai/i/i Ha 
Windows Installer e msiexec.exe. ToBa e KOMaHflaTa, kbm koato Windows 
HacouBa o6pa6oTKaTa Ha MSI naKeTMTe He3aBMCMM0 ot mactoto, ot KoeTO ca 
MHMUMnpaHM (Control Panel, Windows Explorer v\nv\ npe3 KOMaHfla). 

Ct3flaBaMe cpaw/i uninstaii.bat b flupeKTopuflTa Ha npoeKTa 

CreditCardValidatorClient CbC C/ieflHOTO C"bfl"bp>KaHMe: 



Uninstall . bat 



msiexec /x { A3E3AA3C-3D63-4A5B-8F0A-B32BDEDCD4D8 } 



nocneflHkifl napaMerbp e ot cbomctboto Productcode Ha 1/iHcra/iau.i/iOHHHfl 
npoeKT (b>k. XapaKTepucTMKM Ha MHCTa^aunoHHua npoeKT ). 

Ot KOHTeKCTHOTO MeHK) Ha npoeKTa instaiiciient M36npaMe Add -> File... v\ 
M36npaMe uninstaii.bat. Cnefl KaTO Bene MMaMe noflxoflaiu cpaw/i Mowe fla 
cb3flafleM npenpaTKa b CTapTOBOTO MeHK) kbm uninstaii.bat. 

Cb3flaBaiie Ha liHCTajiauuoHeH naKeT Ha ye6 yc/iyra 

Cnefl KaTO cb3flafloxMe 1/iHcra/iau.i/iOHeH naKeT 3a Windows npi/i/io>KeHkieTO, 
ocTaBa fla flo6aBMM v\ MHcra/iaukiOHeH naKeT 3a ye6 ycnyraTa. 

Ot 3apefleH0T0 peiueHne creditcardvaiidator.sin bbb Visual Studio .NET 
2003, M36npaMe Add -> New Project v\ M36npaMe Web Setup Project ot 
KaTeropuflTa Setup and Deployment Projects. 3a MMe B"bBe>KflaMe 



810 



flporpaMnpaHe 3a .NET Framework (tom 2) 



InstallWebService M M36kipaMe OnUklflTa Add to Solution. riOTB"bp>KflaBaMe 
c 6yTOHa [ok] . 

Hobmat npoeicr ce cb3AaBa v\ ce Ao6aBH kbm peiueHneTO 

CreditCardValidator . sin. 

3aAaBaMe ctomhoctm Ha CBOMCTBaTa Title v\ ProductName "Credit Card Web 
Service" ot npo3opeu.a c xapaKTepucTMKUTe Ha kiHCTa/iaukiOHHWfl npoeKT, 
KaKTO HanpaBMXMe b TOUKa XapaKTepucTMKn Ha kiHcrajiauMOHHi/ia npoeKT . 

KaKTO m b noflTOHKa Zlo6aBaHe Ha ct)ai/i.noBe kbm MHCTa^aunoHHua npoeKT kbm 
C"b3flaBaHe Ha MHcra/iauMOHeH naKeT Ha Windows 6a3npaHO npn^oxeHne me 
Ao6aBMM npoeKTHMTe cpaw/iOBe kbm Cb3p,ap,euv\s\ wHCTa/iau.kiOHeH npoeKT. Ot 
KOHTeKCTHOTO MeHK) Ha npoeKTa instaiiciient M36npaMe Add -> Project 
Output... 

KaKTO Bene cnoMeHaxMe, Project Output BK/iK>nBa cb3flaBaHi/iTe no BpeMe Ha 
KOMnw/iauMfl cpaw/iOBe - . exe, .dii v\ .config. 3a p,a e cpyHKuwoHa/iHa ye6 
ycnyraTa, Tpa6Ba fla flo6aBMM oiue cpa/iOBe - web. config, Global. asax i/i 

CreditCardValidator. asmx. 3a ue/lTa OTBapflMe M3r^efla File System Ha 
klHCTa/iau.klOHHMfl npoeKT InstallWebService (OT KOHTeKCTHOTO MeHK) Ha 

InstallWebService M36npaMe View -> File System). Ot KOHTeKCTHOTO MeHK) 
Ha web Application Folder M36npaMe Add -> File... OTBapa ce CTaHAapTeH 
File open Dialog. OTBapsiMe npoeKTHaTa AnpeKTopufl Ha npoeKTa 

CreditCardValidatorWS M M36npaMe Cpafi/lOBeTe Web. config, Global . asax M 
CreditCardValidator . asmx: 



â–  InstallWebService - Microsoft Development Environment [design] - File System (InstallWebService) 



File Edit View Project 

iff- ^0S 



Build Debug Tools Window 
K, ho t r« • ^ Release 



Help 



form 



# 



m 

m 



m (Instaiiciient) | User Interface (Instaiiciient) File System (InstallWebServii i â–º x 



1 File System on Target Machine 



_| bin 



lL 



B Output 



Ready 



JjJUl 



Name 

\=\ Web. config 



.='. Primary output from CreditCardValidatorWS (Relea? 

1 Global, asax 

1 CreditCardValidator. asmx 
â–¡ bin 



2i 



mi^|l|0| 




.,;,£, Solution 'CreditCardValidator' (5 pre 
m- ijp CreditCardValidatorClient 

Si # CreditCardValidatorWS 
B3 [j|*l MyLibrary 
ED- |p Instaiiciient 

- agSJEBB 

IS- CH Detected Dependencies 
1 ^1 Primary output from Creditf 
g CreditCardValidator, asmx 
f| Global. asax 
=) Web. config 




[H Index 



T/iaBa 25. AceM6/inTa v\ paanpocrpaHemie 



811 



Ot np030peua CbC CBOMCTBaTa Ha Web Application Folder 3aflaBaMe Ha 
VirtualDirectory CTOMHOCT "CreditCardValidatorWS". TOBa e BCM4KO. 

flOniD/lHMTe/lHM HaCTpOMKM Ha MHCTaSiaLLMOHHMTe 

npoeKTM bi>b VS.NET 2003 

3a BceKM ot ABaTa kiHcra/iaLiMOHHki npoeKTa ce cb3AaBaT no Tpn cpaw/ia cnep, 

KOMnkl/iaLlMfl Ha peiueHMeTO: Setup. Exe, Setup. Ini V\ [mie Ha npoeKTa] 
. msi (installWebService . msi M InstallClient .msi). 

OcBeH TOBa no noApa36npaHe cpaw/iOBeTe ce naKeTupaT c hmcko hmbo Ha 
KOMnpecufl. 3a p,a npoMeHMM TOBa, ot xapaKTepucTMKUTe Ha kiHcra/iaukiOHHWfl 
npoeKT (ot MeHKDTO Ha Visual Studio .NET 2003 Project -> Properties) 
3aAaBaMe cnep,Hv\je xapaKTepucTMKn: 

- Bootstraper - None 

- compression - Optimize for size 



InstallWebService Property Pages 



Configuration: |Active(Release) _^J Platform: |n/A 

Output file name: 



Configuration Manager ... I 



(^ Configuration Properties 
iff Build 



Browse., 



Package files: 

Bootstrapper: 

Compression: 

CAB size: 

P Unlimited 
C" Custom: 

V Authenticode signature 
Certificate file: 
Private key file: 
Timestamp server URL: 



In setup file 



None 



~3 

T | Settings, 



Optimized for size 



~3 



Kb 



Browse,.. 



Browse. 



OK 



]. 



Cancel 



Apply 



Help 



B pe3y/iTaT c/ieA KOMnw/iaui/ifl me ce reHepupaT no eAHH .msi cpaw/i 3a BceKM 
ot npoeKTMTe, komto me 6"bAe onTMMa/iHO KOMnpecupaH. 

1/lHCTa/iMpaHe/fleMHCTa/iMpaHe Ha MSI naKeTMTe 

C/ieA KaTO c"b3AaAOXMe ABaTa i/iHcra/iaui/iOHHH nanceTa, e BpeMe p,a vv\ Tecma- 
Me. KoMnn^npaMe vv\ v\ HaMnpaMe .msi cpaw/iOBeTe. npenoptni/iTe/iHO e p,a 
M3no^3BaMe Virtual PC 3a TecTOBeTe, 3a p,a HflMa kohcp/ihktm c Bene MHcra- 
^upaHMTe npn^o>KeHMfl v\ 3a p,a npoBepuM p,anv\ bcmuko pa6oTM Btpxy nwcra 



812 



flporpaMnpaHe 3a .NET Framework (tom 2) 



kiHcra/iaukifl Ha Windows v\ IIS. Ako TecTBaMe /ioio/iho, me ce no/iynw 

KOHCp/lklKT C CreditCardValidatorWS, TbM KaTO InstallWebService .msi Cb3- 
AaBa BMpTya/IHa AHpeKTOpklfl B IIS C klMe CreditCardValidatorWS. 

MHCTa^aunflTa Ha MSI naKeT MO>Ke fla ce crapTkipa npe3 abomho mpaKBaHe Ha 
MMiuKaTa Btpxy .msi dpai/i/ia v\nv\ npe3 KOMaHflaTa: 



msiexec.exe /I InstallClient .msi 



ritpBO MHCTa^npaMe instaiiciient.msi. MHcra/iaui/mTa npoTi/ma no HanwH, 
komto e flo6pe no3HaT Ha noTpe6kiTe/ikiTe. 06"bpHeTe BHMMaHne, ne npenpaT- 

KMTe OT InstallClient.msi Ca C"b3AaAeHM B 3aBMCMMOCT OT M36paHMTe 

HacTpowKM b Ana/ioroBi/m npo3opeu, komto Ao6aBkixMe b Torno Zlo6aBaHe Ha 
npenpaTKa Ha pa6oTHaTa n^om (Desktop) . 

CrapTwpaMe v\ MHcra/iaui/mTa Ha ye6 yc/iyraTa ot instaiiwebservice.msi. Ot 
BTopufl Ana^oroB npo3opeu MMaMe b"B3mo>khoct p,a 3aAaAeM HacTpoMKMTe Ha 
BnpTya^HaTa AnpeKTopua, koato me 6"bAe cb3AaAeHa b IIS. 



j "j? Credit Card Web Service 



Select Installation Address 



^jnjxj 




The installer will install Credit Card Web Service to the following virtual directory. 

To install to this virtual directory, click "Next". To install to a different virtual directory, enter it below. 



Virtual directory: 



fc 



CreditCardValidatorWS 
Port: 



Disk Cost.. 



Cancel 



< Back 



Next> 



He npaBMM npoMeHM no Te3M HacTpoMKM v\ 3aB"bpwBaMe kiHcra/iaukiOHHMfl 
npouec. 

Ako CTe HanpaBM/iw npoMeHM b HacTpoMKMTe Ha BwpTya/iHaTa AnpeKTopua b 
IIS ot npo3opeua no-rope (wnw ye6 yc/iyraTa e kmcra/ikipaHa Ha OTRenen 



T/iaBa 25. AceM6/iMTa v\ pa3npocTpaHeHne 813 

KOMniOTbp) Tpa6Ba fla ce npoMeHM KOHCpurypaunoHHMflT cpai/i/i Ha K/iweHTCKOTO 
npn/ic»Kei-ii/ie, 3a fla MO>Ke fla ce flocrbni/i ye6 ycnyraTa. 

Eto ro c"bfl"bp>KaHMeTO Ha KOHCpurypaunoHHUfl cpaw/i Ha 

CreditCardValidatorClient: 



CreditCardValidatorClient . exe . conf ig 



<?xml version="l. 0" encoding="utf-8 " ?> 
<conf iguration> 

<appSettings> 

<add key="webServiceURL" 
value="http : //localhost/creditcardvalidatorws/CreditCardValidator 
. asmx"/> 

</appSettings> 
</conf iguration> 



Ha no-KtceH eTan npw/io>KeHi/iflTa MoraT fla ce flewHcra/ikipaT npe3 Control 
Panel -> Add/Remove Programs v\nv\ 4pe3 KOMaHflaTa: 



msiexec.exe /x InstallClient .msi 



Ynpa>KHeHM5i 

1. Ct3flaMTe MHoroMOfly^HO aceM6/iw. MMeHyBawTe ro cm/iho. Pa3r/ieflaMTe 
MaHncpecTa My. 

2. Cb3flaMTe npoeKT TestLibrary ot Tun Class Library. flawTe cm/iho MMe Ha 
pe3y/iTaTHOTO aceM6/iw TestLibrary.dll. flo6aBeTe b npoeKTa npuMepeH 
K/iac m craTkmeH MeTOfl, komto Bptiua b pe3y/iTaT TeKCTa "MyAssembly 
v. 1.0.0.1". M3no^3BaMTe aTpn6yTMTe b Assembiyinfo.es, 3a fla 3aflafleTe 
3a aceM6/iMTO Bepci/m l.o.o.i. 

3. Cb3flaMTe Windows 6a3npaHO npn^OKeHne TestwinApp v\ pecpepupawTe ot 
Hero aceM6/iMTO ot npeflxoflHOTO ynpa>KHeHne (TestLibrary.dll) ioto 
nacmo aceM6/ii/i. MoxeTe fla HanpaBMTe TOBa KaTO ot VS.NET flo6aBMTe 
pecpepeHunfl kbm npoeKTa TestLibrary. ripn CTapTupaHe Ha npoeKTa 
TestwinApp noKa>KeTe fli/ia/ioroBa KyTna etc cbfltpwaHkie BtpHaTna ot 
CTaTM4HMfl OT MeTOfl TestLibrary TeKCT. Cnep, KOMnn^aunfl 6m Tp*i6Ba/io B 
M3xoflHaTa flupeKTopua fla MMaTe cpaw/iOBeTe TestwinApp.exe v\ 

TestLibrary. dll. 

4. Ct3flaMTe noflflnpeKTopua assemblies b flupeKTopuflTa c KOMnw/ikipaHOTO 
npn^OKeHne ot npeflxoflHOTO ynpa>KHeHne (TestwinApp.exe) v\ npeMe- 
CTeTe b Hea aceM6/ii/iTO TestLibrary.dll. flo6aBeTe KOHCpkirypaunoHeH 
cpaw/i v\ 3aflaMTe nacmw ntTMiua 3a TbpceHe Ha nacmkiTe aceM6/ii/iTa c Tara 

<probing>. llOCOneTe flMpeKTOpMflTa assemblies. ripi/l/10>KeHI/ieTO pa60TM 

npaBM^HO, Ha/in? ripeMaxHeTe Tara <probing> ot KOHCpurypaunoHHUfl 
cpaw/i m M3no/i3BaMTe BMecTO Hero Tara <codebase>. TecTBawTe othobo. 



814 nporpaMnpaHe 3a .NET Framework (tom 2) 

5. flo6aBeTe aceM6/iMTO ot TestLibrary.dll b GAC. M3TpnMTe noflflkipeK- 
TOpklfl assemblies. ripkl/10>KeHI/ieTO TestWinApp.exe pa60TM HOpMa/lHO, 

Ha/iw? flenHCTa^npaMTe TestLibrary.dll ot GAC. ripn^OKeHneTO cnpa fla 
pa6oTM, Ha/in? 

6. npoMeHeTe TeKCTa, BptiuaH ot craTMUHkifl MeTOfl ot npoeKTa TestLibrary, 
Ha "MyAssembly vl.0.0.2" v\ npoMeHeTe Bepci/i5rra Ha 1.0.0.2. flo6aBeTe 

HOBaTa BepCMfl Ha aceM6/lMTO TestLibrary.dll B GAC. ripi/l/10>KeHI/ieTO 
TestWinApp.exe Bee ome He pa60TM, Ha/lkl? 

7. Cb3AaMTe Publisher Policy File, 3a fla npeHacom/iTe TestLibrary.dll 

1.0.0.1 K"bM TestLibrary.dll 1.0.0.2. ripM^O>KeHMeTO TestWinApp.exe 

Tpa6Ba othobo fla pa6oTM HopMa/iHO. 

8. Cb3flaMTe npocTa ci/icreMa 3a cb6wpaHe Ha ni/icna, pea/iki3kipaHa KaTO ye6 
ycnyra c Windows 6a3npaH v\ ye6 6a3npaH K/iweHT. C"b3flaMTe MHcra/ia- 
Umohhm naKeTM 3a ye6 yc/iyraTa v\ 3a K/iweHTCKMTe npi/i/io>KeHi/m. MHCTa/iw- 
paMTe vv\ Btpxy flpyra Mawi/ma v\ vv\ TecTBawTe. Pa6oT*iT i\v\ npaBM/iHO? 
flenHCTa^npaMTe rn 4pe3 Control Panel -> Add/Remove Programs. Pa6oTM 
nv\ npaBM/iHO flenHCTa^aunflTa? 

M3no/i3BaHa /liuepaTypa 

1. Mkixaw/i Ctomhob, AceM6/iMTa v\ Deployment - http://www.nakov.com/ 
dotnet/lectures/Lecture-23-Assemblies-vl.O.ppt 

2. Paul Slater, Deploying .NET Applications Lifecycle Guide, Microsoft Press, 
2003, ISBN 0735618461 

3. "Designed for Microsoft Windows XP" Application Specification - http://qo. 
microsoft.com/fwlink/7Lin kid =9775 

4. Microvision Corporation's Website - http://www.InstallShield.com/ 

5. Wise Solutions's Website - http://www.wise.com 

6. MSDN Library - http://msdn.microsoft.com 

7. GotDotNet Website - http://samples.qotdotnet.com/quickstart/aspplus/ 

- Working with Resource Files 

8. Junfeng Zhang's Blog - http://bloqs.msdn.com/junfenq 

- MultiModule Assemblies 



T/iaea 26. CiirypHOCT 
b .NET Framework 



ABTOpii 

Toflop Ko/ieB 
Bacw/i 5aKa/iOB 

He06X0flMMM 3HaHMfl 

- Ba30BM no3HaHMfl 3a .NET Framework 

- Ba30BM no3HaHMfl 3a e3MKa C# 

- Ba30BM no3HaHMfl 3a pa6oTaTa Ha CLR, aceM6/ikiTa v\ aTpn6yTM 

Cb/vbpwaHMe 

CnrypHOCTTa b .NET Framework 

- Be3onacHOCT Ha TunoBeTe v\ 3aiunTa Ha naMeTTa 

- XBaiuaHe Ha apuTMeTM^Hn rpeujKM 

- Application Domains 

- CuMeTpn^HO m acMMeTpn^HO KOAnpaHe. I4mc|dpob noflnnc 

- Cn^HO-MMeHyBaHM aceM6/iMTa 

- TexHO^ornflTa Isolated Storage 

Code Access Security 

- rio/iMTkiKMTe 3a curypHOCT b .NET Framework. 

- .NET Security Policy Editor 

- ripaBa (Permissions) 

- fleK/iapaTMBHO v\ nporpaMHO MCKaHe Ha npaBa 

- "Stack Walk" v\ kohtpo/i HaA npaBaTa 

Role-Based Security 

- ABTeHTMKaUMfl M OTOpM3ai4Mfl 

- Identity v\ Principal o6eKTM. Windowsldentity v\ WindowsPrincipal 

- OTopn3aunfl no Principal - AeK/iapaTMBHa v\ nporpaMHa 

KpunTorpacpmi b .NET Framework 

- M34nc^flBaHe Ha xew ctomhoct 

- M3no^3BaHe Ha CMMeTpi/inHM KpunTupaiun a/iropwTMM 

- M3no/i3BaHe Ha aci/iMeTpwuHM KpunTupaiun a/iropwTMM 



816 nporpaMnpaHe 3a .NET Framework (tom 2) 

- l/l3no/i3BaHe Ha uncppoBM noAnncn 

- noAnncBaHe Ha XML (XMLDSIG) 

B Ta3M TeMa ... 

B HacToamaTa TeMa me pa3r/ieAaMe acneKTkue, b komto .NET Framework 
noflnoMara ci/irypHOcrra Ha c"b3flaBaHMTe npw/io>KeHkifl. ToBa BK/iiouBa KaKTO 
6e3onacHOCT Ha TunoBeTe v\ 3aiunTa Ha naMerra, TaKa v\ cpeflCTBaTa 3a 
3aiunTa ot M3nt^HeHne Ha Hexe/iaH koa, aBTeHTm<au.i/m v\ OTopn3aunfl, 
e/ieicrpoHeH noflnnc v\ KpunTorpacpna. IHe 6"bflaT pa3r/ieflaHi/i TexHO/iorm/iTe Ha 
.NET Framework 3a 3aiunTa Ha KOfla (Code Access Security, Role-Based 
Security, cw/iHO-kiMeHyBaHM aceM6/iMTa), KaKTO v\ 6ki6/ii/iOTeKkiTe 3a pa6oTa c 
KpunTorpacpufl (cuMeTpn^HM v\ HecuMeTpn^HM KpunTupaiun a/iropi/iTMi/i, xeuju- 
paiun a/iropwTMw) v\ uncppoBM noflnncn. HaKpaa me 6"bfle pa3r/ieflaH craH- 
AapTtT 3a uncppoBO noAnncBaHe Ha XML AOKyMeHTki (XML-Signature) v\ uop,- 
AP"b>KKaTa My b .NET Framework. 



HnaBa 26. CurypHOCT b .NET Framework 817 



CiirypHOCTTa b .NET Framework 

C"b3AaBaHeTO Ha curypHa v\ HaAe>KAHa n/iaTcfjopMa e 6m/io ocHOBHaTa ue/i npn 
npoeKTupaHeTO Ha .NET Framework. ToBa, KoeTO a OT/iwuaBa ioto TaKaBa, e 
c|DaKT"bT, ne nporpaMHMAT koa He pa3no/iara AnpeKTHO c pecypcuTe Ha Mauju- 
HaTa, a 6nBa ynpaB/isiBaH ot Common Language Runtime (CLR). ToBa e npn- 
4MHaTa .NET M3n"b^HMMMflT koa Aa ce Hapi/ma ynpaB/iflBaH koa (managed 
code). 

no BpeMe Ha w3n"b/iHeHkie ynpaB/iABaHkiyiT koa HenpeKbCHaTO ce KOHTpo/iwpa 
ot CLR m no T03i/i Ha^MH ce ocurypaBa MaKCMMa/iHa 3aiunTa ot Bt3HMKBaHe Ha 
rpeujKM npn4MHeHM ot HenpaBki/iHO ynpaB/ieHkie Ha naMerra, HenpaBM/iHa 
pa6oTa c TunoBe v\ yKa3aTe/ii/i v\ Apyrn necro cpeiuaHM npo6/ieMw. 

3a ocurypaBaHe Ha CkirypHOcrra Ha .NET KOAa CLR CbAtpwa cneu.ua/iM3npaHki 
KOMnoHeHTM, komto npeAOcraBAT npoBepKa Ha TunoBeTe (Type checker), 
ynpaB/ieHkie Ha M3K/iK)neHi/iflTa (Exception manager) v\ ynpaB/ieHwe Ha 
curypHOCTTa Ha KOAa (Code Access v\ Role-Based Security). 

Ee3onacHOCT Ha TwnoBeTe 

ynpaB/iflBaHMAT koa e 3aiunTeH ot HenpaBki/iHa pa6oTa c TunoBeTe. Ha ntpBO 
Macro TOBa 03Ha4aBa ne koa^t Ha .NET Framework npn^OKeHMATa He 
M3no/i3Ba yKa3aTe^n kbm naMeTTa. BMecTO tax ce w3no/i3BaT TaKa HapeneHMTe 
pec|DepeHUMM kbm o6eKTM. Te npeAcraB/iflBaT eAHO mhoto no-BMCOKO hmbo Ha 
a6cTpaKunfl b cpaBHeHne c yKa3aTe/ii/iTe v\ no to3m HanwH no3BO/iflBaT no- 
ro/iflM kohtpo/i ot CTpaHa Ha CLR. Pec|DepeHUMMTe ca cm/iho TMnn3npaHM. ToBa 
03Ha4aBa, ne He MO>KeM Aa npucBOMM pecJDepeHUMa ot AaAeH Tkin kbm HecbB- 
MecTMM c Hero o6eKT. Ako ce onuTaMe Aa ro HanpaBMM, CLR me reHepupa 

M3K/lK)neHkie System. InvalidCastException. ETO eAHH npMMep: 



object bytes = new byte [5]; 

char[] chars = (char[]) bytes; 

// System. InvalidCastException is thrown 



flocTbnvr ao hv>kah o6eKTM m o6/iacrki ot naMeTTa e orpaHi/meH. no to3m 
Ha^MH ce ocwrypflBa KaKTO ue/iocrra Ha AaHHMTe, TaKa v\ 6e3npo6/ieMHaTa 
pa6oTa Ha ua/ioto npn^oxeHne. 

npo6/ieMi>T "Buffer overrun" 

npo6/ieM-bT "buffer overrun" (v\j\v\ KaKTO e M3BecTeH oiue "buffer overflow") 
B"b3HkiKBa npn npent/iBaHeTO Ha MacuBM v\ ci/imbo/ihm HM30Be. ToBa boah ao 
ocbiuecTBABaHe Ha Aocrtn ao onepaTMBHa naMeT M3B"bH OTAe/ieHaTa 3a AaAeH 
MacuB v\nv\ CMMBO^eH hm3 m cbOTBeTHO ao HenpeABMAHMO noBeAeHne Ha 
nporpaMHMfl koa. 

npo6^eM"bT "buffer overrun" MO>Ke Aa AOBeAe ao cepno3HO KOMnpoMeTupaHe 
Ha curypHOCTTa, 3aiuoTO b hakom c/iynaw no3BO/iHBa "MHxeKTMpaHe" v\ 



818 nporpaMnpaHe 3a .NET Framework (tom 2) 

ki3n"b/mei-ii/ie Ha ny>KA koa b KOHTeKCTa Ha npw/io>KeHi/ieTO. TaKaBa aTaKa ce 
ocbiuecTBABa KaTO nocpeflCTBOM npent/iBaHe Ha MacuB ce npe3anniue aflpe- 
chj 3a BptiuaHe ot nocneAHi/isi M3BMKaH MeTOA b creKa 3a M3n"b/iHeHne Ha 
npn^OKeHneTO v\ ce npeHaconw kbm koa, noAaAeH ot aTaKyBami/m. Ako 
aTaKaTa e ycnewHa, HanaAaTe/iflT MO>Ke p,a no/iynw npaBaTa, c komto ce 
M3n"b/iHflBa npn^OKeHneTO. 

B .NET Framework to3m npo6/ieM e peiueH npe3 BrpaAeHa b CLR 3aiunTa Ha 
MacuBMTe m cuMBO^HMTe HM30Be ot npeiTb/iBaHe. ripi/i onuT 3a AOCTtn ao 
e/ieMeHT ot MacuB v\nv\ hm3, komto e cnep, HeroBna Kpaw v\nv\ npeAH HeroBOTO 
Hana/io, B"b3HMKBa M3K^K)4eHne (exception), KoeTO npeKbCBa ki3iTb/iHeHkieTO 
Ha nporpaMaTa v\ e B"b3MO>KHO p,a 6tAe npuxBaHaTO v\ o6pa6oTeHO. 

C^eABaiunflT nporpaMeH cppameHT AeMOHcrpi/ipa B"b3HMKBaHe Ha M3K/iK)neHMe 

System. IndexOutOfRangeException, nopOAeHO OT OnMT 3a AOCTbn AO e/ie- 
MeHT, KOMTO e M3B"bH o6pa6oTBaHMfl MacuB: 



private static void CopyArray (byte [ ] aSrc, byte [ ] aDest, 
int aSize) 

{ 

for (int i=0; i< aSize; i++) 
aDest [i] = aSrc[i] ; 
} 

static void Main ( ) 

{ 

byte [ ] arrl = new byte [10]; 

byte [ ] arr2 = new byte [5]; 

CopyArray (arrl, arr2, 10); 

// System. IndexOutOfRangeException is thrown 
} 



3auiMTa Ha naMeTTa 

ripn c"b3AaBaHe o6eKTM b .NET Framework Te ce pa3no/iaraT b AHHaMMUHaTa 
naMeT, t. Hap. managed heap, komto ce ynpaB/iHBa ot CLR. no to3m HanwH 
ua/iaTa OTroBopHOCT no 3ap,ej\s\ue Ha HOBa naMeT v\ ocBo6o>KAaBaHeTO v\ ce 
noeMa ot CLR. 

Hen3no/i3BaHkiTe o6eKTM ce nonwcTBaT aBTOMaTMUHO ot t. Hap. Garbage 
Collector. ripe3 onpeAe/ieH MHTepBa/i ot BpeMe v\nv\ cnep, M3pn4HO M3BMKBaHe 
tom no^MCTBa naMeira ot bcmukm o6eKTM, KbM komto H^Ma pecpepeHunn v\ 
ctOTBeTHO He ca Heo6xoAMMM noBene 3a pa6oTa Ha npn^OKeHneTO. 

BCMUKO TOBa npaBM n04TM HeB"b3MO>KHO Bt3HMKBaHeTO Ha HflKOM OT UdtV\- 

HenpuflTHMTe npo6/ieMM b nporpaMnpaHeTO, CB"bp3aHM etc 3ary6aTa Ha naMeT 
(memory leaks). ripo6/ieM"bT c ki3no/i3BaHeTO Ha HenHMuna^M3MpaHa naMeT 
cbuxo e peweH 6/iaroAapeHne Ha CLR, komto ce rpn>KM HOBOCb3AaAeHkiTe 
npoMeH^MBM b .NET Framework BMHarn ca kiHkmkia/iM3kipaHki v\ 3aHyneHki. 



HnaBa 26. CurypHOCT b .NET Framework 819 



npiiXBautaHe Ha apuTMeTimi-iii rpeuiKii 

ripn pa6oTa c apuTMeTM^Hn onepaunn ca B"b3MO>KHM npeirb/iBaHWfl Ha Tuno- 
BeTe. ToBa CTaBa npn no/iynaBaine Ha pe3y/iTaT, komto He ce Cb6wpa b Tuna, 
komto e i/i3no/i3BaH v\nv\ npn npeo6pa3yBaHe Ha Tun c no-ro/iAMa pa3MepHOCT 
KtM Tun c no-Ma/iKa pa3MepHOCT. HanpuMep aKO MMaMe flBe nwc/ia ot Tun 
sbyte (200 m 150) m vv\ yMHO>KMM eAHO c Apyro, pe3y/iTaTbT He Moxe p,a ce 
no6epe b sbyte, BtnpeKM, ne caMkiTe nwc/ia 200 v\ 150 ce Cb6kipaT. B T03M 
c/iynaw ce no/iynaBa npeirb/iBaHe Ha Tuna sbyte. 

B .NET Framework i/ma BrpaAeH MexaHM3tM 3a npuxBaiuaHe Ha apuTMeTM^Hn 
npent^BaHMfl 3a ue/ioni/ic/ieHMTe TunoBe. Ako ce cnynw npeirb/iBaHe Ha Tun b 
npoBepyiBaHa (checked) nacr ot KOAa B"b3HMKBa ki3K/iioneHkie, KoeTO npeicbCBa 
M3nt^HeHneTO Ha nporpaMaTa v\ e B"b3MO>KHO p,a 6"bAe npuxBaHaTO v\ o6pa- 
6oTeHO. 

ripoBepuBaH m HenpoBepnBaH koa 

Bt3MO>KHO e nporpaMkiCTbT p,a onpeAe/ia p,anv\ AaAeH koa Aa 6tAe npoBep^BaH 
(checked) v\nv\ cbOTBeTHO HenpoBep^BaH (unchecked), no noApa36npaHe 
KOMnn^aToptT Ha C# He npoBepaBa KOAa. MMa ABa Hankma TOBa Aa 6"bAe 
npoMeHeHO. Eamhmat e npe3 npoMAHa Ha HacrpoMKi/iTe Ha KOMnw/iaTopa, a 
ApyrnflT e npe3 M3pn4HO onpeAe/iflHe Ha c|3parMeHTM ot KOAa, komto Aa ce 
npoBepsiBaT v\nv\ ctOTBeTHO Aa He ce npoBepsiBaT. 

OnuMM Ha KOMnmiaTopa 3a npoBepKa Ha apMTMeTMKaTa 

M3no^3BaHeTO Ha C# KOMnw/iaTopa ot KOMaHAHna peA b pe>KMM Ha npoBepa- 
BaHe 3a api/iTMeâ„¢nHM npeirb/iBaHi/ifl ce M3BtpujBa npe3 onunaTa /checked+, a 
pe>KMM Ha HenpoBepaBaHe ce yi<a3Ba c /checked-: 



esc /checked+ SomeFile . cs 
esc /checked- SomeFile . cs 



Ta3M HacTpowKa MO>xe Aa ce 3aAaBa v\ ot Visual Studio .NET 2003 ot c|DopMaTa 
3a HacTpoMKM Ha cbOTBeTHi/m npoeKT, KaTO ce npoMeHM CTOMHOcrra Ha no/ieTO 

Check for Arithmetic Overflow/Underflow Ha True V\J\V\ False CbOTBeTHO 

3a npoBepaBaHe v\nv\ HenpoBepaBaHe Ha KOAa. 



Windows Application! Property Pages 



*l 



Configuration: | Active (Debug) _J Platform: |Active(,NET) 



1 



Configuration Manager., 






CJ Common Properties 
£3 Configuration Properties 
$> Build 

Debugging 

Advanced 



B Code Generation 

Conditional Compilation Constants DEBUG;TRACE 

Optimize Code False 

BE—— F^e 
Allow Unsafe Code Blocks 
B Errors and Warnings 

Warning Level 




820 nporpaMnpaHe 3a .NET Framework (tom 2) 

K/noHOBMTe aymm checked m unchecked 

flpyrnflT BapnaHT 3a onpefle/iyme p,anw koa^t fla ce npoBepaBa v\nv\ He 3a 

apMTMeTM4HM npen"b/lBaHI/m e npe3 K/lKDHOBklTe AYMM checked V\ unchecked B 

C#. Te 3aAaBaT 06/iacT (6/iok) ot koa b komto as ce M3B"bpujBa v\nv\ cbOTBeTHO 
Aa He ce M3B"bpujBa npoBepKa. YKa3aHOTO c Te3M k/ikdhobm aymm He ce B/ikiae 
ot HacTpoMKMTe Ha KOMnn^aTopa. C/ieABamkiflT nporpaMeH cppameHT AeMOH- 
CTpupa onpeAe/iHHeTO Ha koa komto p,a 6tAe npoBepaBaH 3a apuTMeTM^Hn 
npent^BaHMfl: 



checked 

{ 

int a = 250000; 

int square = a*a; 

// System. Overf lowException is thrown 
} 



M3n"b/iHeHweTO Ha to3m koa npeAH3BMKBa B"b3HMKBaHeTO Ha ki3K/iK>neHi/ie 
System. Overf lowException nopaAH npent/iBaHe Ha Tuna int. 

Application Domains 

OnepaunoHHMTe cucTeMM o6mkhob6ho npeA-naraT MexaHM3MM 3a M30/ii/ipaHe Ha 
npi/i/io>KeHi/iflTa eAHO ot Apyro. ToBa M30/ii/ipaHe e hy>kho, 3a Aa ce npeAna3*iT 
KOAtT m AaHHMTe Ha AaAeHO npn^OKeHne ot TOBa Aa 6"bAaT HenpaBOMepHO 
noB^MflBaHM ot pa6oTaTa Ha Apyro npn^OKeHne. 

M30^npaHeTO Ha npw/io>KeHkiyiTa b onepaunoHHaTa cwcreMa Windows ce pea- 
/in3wpa nocpeACTBOM crapTkipaHeTO Ha bcako OTAe/iHO npw/io>KeHi/ie b OTRenen 
npouec m 3aiunTa Ha naMerra Ha hmbo npouecop. ToBa ocurypaBa Hy>KHOTO 
M30^npaHe, ho 3aTpyAHABa KOMyHMKaunaTa Me>KAy npn^OKeHMa. AApecnTe ot 
naMerra ca OTHOCkiTe/iHki 3a BceKM npouec v\ nopaAM Ta3M npwuwHa yKa3aTe/i 
ot eAHO npw/io>KeHi/ie (npouec) He MO>Ke Aa ce ki3no/i3Ba b Apyro. ToBa Ha/iara 
o6MAHaTa Ha AaHHM Me>KAy npn^OKeHMATa (inter-process communication) Aa 
ce ki3B"bpujBa npe3 nocpeAHMK v\ cneuna/ii/i3npaH npoTOKO/i 3a KOMyHMKauna, 
KoeTO noHnxaBa npoi/i3BOAHTe/iHOCTTa. 

Application domains npeAOcraBHT no-ecpeKTMBeH v\ cbmeBpeMeHHO HaAe>KAeH 
Ha^MH 3a M30/ikipaHe Ha .NET npw/io>KeHkiyiTa eAHO ot Apyro. Bcako .NET 
npw/io>KeHkie pa6oTM b eAMH application domain, a hako/iko application 
domains MoraT Aa pa6oT*iT b eAMH v\ cbu\ npouec Ha onepaunoHHaTa cwcreMa. 
no to3m Ha^MH ce nocTura >Ke/iaHaTa i/i30/iaui/i*i no naMeT, AaHHM v\ koa h b 
ctiuoTO BpeMe ce npeAOcraBAT mhoto no-rbBKaBM v\ 6"bp3M cpeACTBa 3a 
KOMyHMKaunfl Me>KAy .NET npw/io>KeHi/mTa 3aiuoTO He ce Ha/iara cno>KHa 
KOMyHMKaunfl Me>KAy npouecn. KoraTO hako/iko .NET npw/io>KeHkifl ce crapâ„¢- 
paT b eAMH npouec, ce cnecryiBaT mhoto pecypcn, 3aiuoTO CLR ce 3ape>KAa v\ 
MHMuna^M3Mpa caMO BeAHt>K, a He mriKOBa nvni, ko/ikoto ca npi/i/io>KeHi/mTa. 

OaKTtT, ne Application domains ce ynpaB/iflBaT ot CLR AaBa b"B3mo>khoct Aa 
ce HacrpowBaT npaBaTa, c komto pa3no/iara BceKM eAHH Application domain. 



HnaBa 26. CurypHOCT b .NET Framework 821 



TaKa ce nocTura noBMiueHa curypHOCT npn M3n"b^HeHne Ha flafleHO aceM6/iM v\ 
ce flaBa bbsmcokhoct eflHO npn^OKeHne fla 3apeflM v\ v\3nbi\uv\ flafleHO .NET 
npn^OKeHne c orpaHMneHM npaBa. 

OCHOBHM KpMnTOrpacjDCKM nOHflTMH 

ripeflu fla npeMMHeM kbm noflnncBaHeTO Ha aceM6/iMTa, me m3achmm hakom 
o6lum KpnnTorpac|DCKM noHflTna, komto me M3no/i3BaMe no-HaTaT"bK b Hacro*i- 
maTa TeMa. 

XeiiJMpaHe 

XeiunpaHeTO ce M3no/i3Ba, 3a fla ce cbnocraBM Ha flaHHM c npoM3BO/iHa flt/i- 
>KMHa, hmc/io (xeiu, xeiu-CTOMHOCT, xeiu-KOfl), KoeTO e TflXHa yHMKa^Ha Heo- 
6paTMMa penpe3eHTaunfl. ToBa 03HanaBa, ne MMawKn xew-CTOMHOCTTa He 

MO>KeM fla B"b3CTaHOBMM ntpBOHana/lHMTe flaHHM M XeilJMpaMKM eflHM M CblflM 

flaHHM BceKM irbT me no/iynaBaMe eflMH v\ cbu\v\ xeiu. 



AnropuTtM 
3a xeujupaHe 

(MD5.SHA1,... 



floKyMeHT 



XeilJ-CTOMHOCT 



YHMKa^HOCTTa Ha xew-CTOMHOCTTa 03Ha4aBa, ne 3a pa3/iMHHM flaHHM me no/iy- 
naBaMe pa3/iMHHM xew ctomhoctm. Ta3M yHMKa/iHOcr o6ane He e a6co/iK>THa, 
Tbv\ KaTO b o6luhh cnynai/i BxoflHMTe flaHHM MMaT no-ro/iHMa fl"b/i>KMHa ot xeiu 
CTOMHOCTTa m c/ieflOBaTe/iHO noHe flBa pa3/iMHHM Ha6opa ot bxoahm flaHHM me 
MMaT eflMH m ctmH xeiu (cnopefl npMHUMna Ha fl,v\pv\xne 3a neKMe,q>KeTaTa). 
KoraTO TOBa ce cnyuM, Ka3BaMe, ne MMa ko/im3ma. 

Hakom ot HaM-M3BecTHMTe a/iropMTMM 3a xeujMpaHe ca MD5, SHA1, SHA256, 
SHA384 m SHA512. ripM tax e flOKa3aHO, ne ko/im3mm CbmecTByBaT, ho e 
mhoto TpyflHO fla ce nocTMTHaT Ha npaKTMKa. Te3M a/iropMTMM ce HapMnaT 
KpMnTorpac|DCKM cm/ihm xeujMpamn a^ropMTMM. Te MMaT cbomctboto, ne no 
flafleHa xeiu ctomhoct e M3K/iK>nMTe/iHO TpyflHO fla ce HaMep^T flaHHM, ot 
komto Tfl ce no/iynaBa. 

CnMeTpMHHo KpMnTMpaHe 

CMMeTpM^HOTO KpMnTMpaHe ce HapMna ome KpMnTMpaHe etc ceKpeTeH k/ikdh. 
ripM Hero KpMnTMpaHeTO m fleKpMnTMpaHeTO ce M3B"bpujBaT c eflMH m cbu\v\ 
k/ikdh, komto He Tp*i6Ba fla 6"bfle M3BecreH Ha hmkom ocBeH Ha crpaHMTe, 
BK^KD^eHM b o6MeHa Ha MHc|DopMauM5i. ToBa Ha/iara Te fla ce cnopa3yMe*iT 3a 
M3no^3BaHMfl K/iK)4 npeflM fla 3ano4He o6MeHa Ha MHCJDopMauMfl, 6e3 B"b3MO>K- 
hoct flpyra crpaHa fla ro pa36epe. Ha cxeMaTa e noKa3aH TMnMUHMHT cueHa- 
Pmm 3a KpMnTMpaHe m fleKpMnTMpaHe etc CMMeTpMneH k/ikdh: 



822 



flporpaMnpaHe 3a .NET Framework (tom 2) 






KniOH 








[\_ 


Hgg 


r Kjikjh 1 


} 

IleKOflMpaHe 



KoflkipaHe 

CuMeTpn^HOTO KpwnTwpaHe e noflxoflamo fla ce ki3no/i3Ba b cpeflw c eflkm 
noTpe6kiTe/i, HanpuMep 3a fla 3aiunTMM c TaeH k/ikdh flocrbna ,qo onpe,qe/ieHa 
flupeKTopua Ha flMCKa. no to3m HanwH zikincBa onacHOCTTa K/iK>n"bT fla 6"bfle 
npi/ixBainaT no BpeMe Ha cnopa3yMeHneTO Me>Kfly flBe KOMyHMKupaiun crpaHM. 
To3M Tkin KpunTupaHe pa6oTM c BucoKa ckopoct v\ MMa b"B3mo>khoct 3a pa6crra 

C nOTOUM OT flaHHM. 

Hakom ot HaM-M3BecTHMTe a/iropwTMki 3a ckiMeTpi/mHO KpunTupaHe ca DES, 
3DES, RC2, RC4, RC5, Blowfish v\ IDEA, KaTO b .NET Framework ca i/iMn/ie- 
MeHTkipaHM DES, 3DES, RC2 v\ Rijndael/AES (Advanced Encryption Standard). 



AcMMeTpiimio KpnnTnpaHe 

AcMMeTpn^HOTO KpwnTkipaHe, HapwuaHO oiue KpnnTnpaHe c o6iuecTBeH (ny6- 
/lwneH) k/ikdh, pa6oTM He c eflMH, a c flBOMKa cbOTBeTHi/i ny6/iMHeH v\ /ihhch 
(nacreH) k/ik>h (public/private K/iK>noBe). ny6/iwnHHflT k/ikdh ce i/i3no/i3Ba 3a 
KpnnTnpaHe Ha ch>o6meHkieTO, a fleKpunTupaHeTO e B"b3MO>KHO eflMHCTBeHO 

CbC C"bOTBeTHMfl /11/IHeH K/1KDH. TOM He MO>Ke fla 6"bfle l/l3B/ieneH OT ny6^M4HMfl 
K/1KDH. 

AcMMeTpn^HOTO KpwnTwpaHe MMa eflHO ochobho npeflMMCTBO npefl CMMeTpwn- 
hoto KpnnTnpaHe - npn Hero He ce Ha/iara npeflaBaHe Ha K/iK>na npeflu 
3ano4BaHe npeflaBaHeTO Ha MHCpopMauna v\ cbOTBeTHO OTnafla B"b3MO>KHOCTTa 
tom fla 6"bfle pa36paH ot TpeTa CTpaHa. ToBa npeflMMCTBO He MflBa 6e3Hai<a- 
3aHO, Tbv\ KaTO 3a fla cpyHKunoHupa npaBki/iHO cxeMaTa Tpa6Ba fla MMa 
M3rpafleHa ckiCTeMa-xpaHM/iwme, b koato fla ce na3AT flBOMKMTe K/iionoBe v\ 
ny6/ii/mHMTe K/iK>noBe fla ce npeflocraBAT Ha bcm^km crpaHM. CaMO TaKa 
MO>KeM fla MMaMe curypHOCT, ne kjhohvt e HancTMHa Ha /lwueTO, KoeTO TBtpflM, 
ne e HeroB npnTe>i<aTe/i, v\ yflo6eH Hani/m fla HaMepuM ny6/ikmHkiflT k/ikdh Ha 
hakom, Ha kototo MCKaMe fla M3npaTMM TaMHa MHCpopMauna. Ee3 rapaHuna 3a 
npi/iHafl/ie>KHOCTTa Ha eflMH ny6/ikmeH k/ik>h, tom ry6n CBoeTO 3HaneHkie. 






*Lrf 



^ 




KoflnpaHe 



&$*£& 



, w 



^ 



^JlklHeH 



/^eKOflMpaHe 









AckiMeTpwuHOTO KpnnTnpaHe e no-curypHO ot CkiMeTpwuHOTO, ot MeflHa touio 
ne He ce Ha/iara fla ce npeflaBa napo/ia (k/ik>h), ho 3a CMeTKa Ha TOBa e mhoto 
no-6aBHO v\ M3MCKBa noBene ki3Hkic/ii/iTe/iHn pecypcu. ripn Hero cbiuecTByBa v\ 
orpaHkmeHi/ie Ha MaKCMMa/iHaTa fl"b/i>KkiHa Ha KpunTupaHOTO c"bo6iueHne b 



HnaBa 26. CurypHOCT b .NET Framework 823 

3aBMCMMOCT ot fl"b/i>KkiHaTa Ha ki3no/i3BaHkifl k/ikdh. ToBa ro npaBM Henoflxo- 
flfliuo 3a o6pa6oTBaHe Ha noTOun ot flaHHM, ho mhoto noflxoflyimo 3a pa3M*iHa 

Ha CMMeTpM4HM K/lKDHOBe V\I\V\ flpyTM CnOfle/ieHM TaMHM. 

HecTO ntTM b npaKTMKaTa ce no/i3Ba KOM6nHaunfl ot HecuMeTpn^HM v\ 
CMMeTpn^HM a/iropwTMki 3a KpwnTwpaHe. HanpuMep npi/i SSL (Secure Socket 
Layer) npoTOKO/ia ce w3no/i3Ba KpnnTorpac|Dkifl c ny6/ikmeH k/ikdh, 3a fla ce 
o6MeHM no curypeH HanwH t. Hap. cecneH k/ikdh, komto ce i/i3no/i3Ba cnep, TOBa 
3a CMMeTpn^HO KpunTupaHe v\ AeKpunTupaHe Ha o6MeHAHMTe ashhu. 

Pa3npocTpaHeHM a/iropi/iTMM 3a acuMeTpn^HO KpunTupaHe ca RSA, DSA, Diffie- 
Hellman, ECDSA (Elliptic-Curves DSA). 

HecTO ntTM b npaKTMKaTa ce no/i3Ba KOM6nHaunfl ot Heci/iMeTpwuHM v\ 
CMMeTpn^HM a/iropwTMki 3a KOflkipaHe. HanpuMep npn SSL (Secure Socket 
Layer) npoTOKO/ia ce w3no/i3Ba KpnnTorpac|Di/ifl c ny6/ikmeH k/ikdh, 3a fla ce 
o6MeHM no curypeH Hani/m t. Hap. cecneH k/ik>h, komto ce M3no/i3Ba c/iefl TOBa 
3a CMMeTpn^HO KOflnpaHe m fleKOflnpaHe Ha o6MeHAHMTe flaHHMTe. 

Public-Key Infrastructure (PKI) 

Public-key infrastructure (PKI) e KOM6nHaunflTa ot coc|DTyep, TexHO/iori/m 3a 
KpunTupaHe v\ ycnyrw, koato no3BO/iHBa ocbmecTBHBaHeTO Ha curypHaTa 
KOMyHMKaunfl 6a3npaHa Ha u.nc|DpoBki noflnncn v\ ny6/ikmHki K/iK>noBe. Ta 
no3BO/i*iBa fla ce M3rpaflM flOBepue Me>Kfly Heno3HaTM KOMyHMKupaiun cm 

CTpaHM nOCpeflCTBOM T. Hap. "UMCJDpOBM CepTMCJDMKaTM". 

UmfcpoBMTe cepTMCJDMKaTM ca e/ieicrpoHHw flOKyMeHTM, rapaHTupaiun caMO/iwn- 
HOCTTa Ha flafleHO j\vu\e v\ yflocTOBepaBaiun, ne to e co6ctb6hmk Ha flafleH 
ny6/ikmeH k/ikdh. Te ce M3flaBaT npn CTporn MepKM 3a curypHOCT ot cneu.ua/iHki 
opraHM3aunM, Ha komto ce MMa flOBepue (cepTnc|DMKauMOHHM opraHM3aunn) v\ 
TaKa ce rapaHTupa THXHaTa flocTOBepHOCT. B npaKTwiOTa 3a ue/iMTe Ha e/ieK- 
TpoHHMfl noflnnc Haw-MacoBO ce ki3no/i3BaT X.509 cepTnc|DMKaTM. 

MiicbpoB noflniic 

UmfcpoBOTO noflnncBaHe npeflcraB/iflBa MexaHM3"bM 3a yflocTOBepaBaHe Ha 
npon3xofla m ue/iocrra Ha MHCJDopMauMflTa, npeflaBaHa no e/ieKTpoHeH ntT. To 
e eflHO ot npi/i/io>KeHi/iyiTa Ha acwMeTpi/mHOTO KpunTupaHe, ho 3a pa3/im<a ot 
Hero, npn umc|dpoboto noflnncBaHe ntpBOHana/iHOTO KpunTupaHe ce M3B"bpujBa 
c /ii/mHi/m k/ikdh, a fleKpwnTkipaHeTO c ny6^M4HMfl. /1m4hmat k/ikdh ce 3Hae caMO 
ot noflnncBaiflMfl v\ He MO>Ke fla 6"bfle M3B/ieneH ot ctOTBeTHMfl My ny6/ikmeH 
k/ik>h. ToBa rapaHTupa caMO/iwuHOCTra Ha M3npamana Ha noflnncaHMAT flOKy- 
MeHT v\nv\ c"bo6iueHne. 

no/iaraHe Ha UMCppoB noArmc 

ripn npoueca Ha uw^poBO noflnncBaHe Ha flafleH flOKyMeHT kbm Hero ce 
Ao6aBfl flont^HMTe/iHa MHCJDopMaunfl, HapeneHa umc|dpob noflnnc. Tom Tpa6Ba 
fla ocurypn, 4e flOKyMeHTbT e noflnncaH ot to^ho onpefle/ieHO j\v\\\e. 3aTOBa 
UncJDpoBMflT noflnnc npeflCTaB^ABa xeiu CTOMHOcrra (yHMKa^Ha penpe3eHTa- 



824 



flporpaMnpaHe 3a .NET Framework (tom 2) 



una) Ha noflnncBaHMfl AOKyMeHT, KpunTupaHa c /imuhma k/ikdh Ha noAnnc- 
Baiunfl. 



AjirOpMTTaM 

3a xeujMpaHe 
(MD5, SHA1,...) 



AjiropnTi>M 3a 

MMCppoB noflnMC 

(DSA, RSA, ...) 



XeilJ-CTOMHOCT 



JlMHeH 
KJ1IOH 



L|MCppOB 

noflnnc 



BxOflHO 

cto6meHne 

Bepnc|)MKaL4Mfl Ha limcppob noAnuc 

ripoBepKaTa ce M3B"bpujBa npe3 ny6/iMHHM*i k/ik>h, komto cbOTBeTcma Ha 
BceKM /lkmeH k/ikdh. To3m ny6/iMneH k/ikdh ce npeflaBa 3aeflHO c noflnncaHMa 
AOKyMeHT v\nv\ ce M3B/iMna ot ueHTpa/iHO xpaHM/iMme, KaTO caMO/iMUHOcrra Ha 
npwTe>KaTe/ifl My ce rapaHTupa nocpeflCTBOM uncppoB cepTucpMKaT v\nv\ no Apyr 
HanwH. npoBepflBaiuMflT reHepupa xeiu ctomhoct Ha no/iyneHkia AOKyMeHT v\ 
nocpeACTBOM ny6/innHi/m k/ik>h AeKpunTupa e/ieKTpoHHMfl noflnnc, 3a fla 
no/iyuM opurnHa^HaTa xeiu ctomhoct Ha noAnncaHMa AOKyMeHT. Ako flBeTe 
xeiu ctomhoctm cbBnaAHaT, to uncppoBMflT noflnnc 3a flafleHMfl AOKyMeHT e 
Ba/iMAeH. 



rioflnwcaHO 
cboGuteHiie 



A/iropirrbM 
3a xemiipaHe 

(MD5, SHA1, ...) 



fleuiiKppiipaHe 
(DSA, RSA, ...) 



Xeiil-CTOMHOCT 

(TeKyma) 



CpaBHnBaHe 



LjMCppOB 

noflniic 




= mjim t 




Xeiil-CTOMHOCT 

ny6/iMHeH (opwrMHa/iHa) 

KJ1IOH 



CMJiHO-MMeHyBaHii aceM6/iMTa 

Cm/ihoto MMe Ha eAHO aceM6/iM ro MAeHTucpnuupa no yHMKa/ieH HanwH v\ 
rapaHTupa, ne to He e npoMeHHHO cnep, KOMnM/iauMHTa cm. Cm/ihoto MMe 
BK^K)4Ba caMOTO MMe Ha aceM6/iMTO, BepcMfl, Ky/iTypa, uMCppoB noAnMC m 
CbOTBeTHMfl My ny6/iMneH k/ikdh. Cmmbo/ihmat cpopMaT Ha cm/ihoto MMe 
M3T/ie>KAa T3Ka: <HHe Ha aceM6jiJiTO>, <Bepcnsi - major .minor .build. 
revision>, <KyjiTypa>, <ny6jinieH kjik>h>. TOB3 MMe 33 System.dll B"bB 



HnaBa 26. CurypHOCT b .NET Framework 825 
Bepcufl 1.1 Ha .NET Framework HanpuMep e system, version=i.o.5000.o, 

Culture=neutral, PublicKeyToken=b77a5c561934e089. 

Cn^HOTO-MMeHyBaHMTe aceM6/iMTa ca noAnncaHM. ToBa ocurypaBa, ne Te He 
ca npoMeHAHM cnep, TaxHaTa KOMnw/iaukifl. 3a npoBepKaTa Ha noflnnca ot CLR 
ce no/i3Ba ny6/ikmHki*iT k/ikdh ot cm/ihoto MMe. Tom o6ane He rapaHTupa caMO- 
/li/mHOCTTa Ha npoi/i3BOAHTe/i*i Ha aceM6/iMTO. ToBa MO>xe fla CTaHe npe3 

UMCJDpOB CepTMC|DMKaT, KOMTO Ce npeflOCTaBfl OTfle/lHO. 

Cm/ihoto MMe yKa3Ba no yHmo/ieH HanwH BepcuaTa Ha aceM6/ikiTO. YHkiKa/i- 
HOCTTa My ce onpeAe/ia ot BceKM eAHH ot HeroBMTe KOMnoHeHTM. flopn flBe 
aceM6/ikiTa p,a MMaT eAHaKBO MMe, Bepcua v\ Ky/iTypa Te naK HsiMa p,a i/maT 

eAHaKBM CM/1HM MMeHa, T"bM KaTO ABOMKaTa OT ny6^M4eH M ZlMHeH K/1KDH 

M3no^3BaHM 3a noAnncBaHeTO mm me ca pa3/innHw. 

yHMKa^HOCTTa Ha BepcuMTe Ha cw/iHO-kiMeHyBaHkiTe aceM6/ikiTa AaBa B"b3MO>K- 
hoct hako/iko Bepcun Ha aceM6/iw c eAHO m cbmo 6a30BO MMe Aa ce kiHcra/iw- 
paT m M3no/i3BaT He3aBMCMMO. Ta3M yHMKa^HOCT no3BO/iHBa ctiuo eAHO .NET 
npn^OKeHne Aa pa6oTM touho c Bepcu^Ta Ha KOMnoHeHTMTe cm, koato 
onaKBa, a He c no-CTapn m/im no-HOBM Bepcun. 3a Aa ce ocurypn TOBa v\ 3a 
BCM4KM noAKOMnoHeHTM Ha AaAeH KOMnoHeHT, bcako cm/iho MMeHyBaHO aceM- 
6/iw MO>Ke Aa MMa pecJDepeHunn caMO kbm Apyrn cm/iho MMeHyBaHn aceM6/iMTa. 

ripi/i Ao6aBHHe Ha peifcepeHui/m ot HAKoe aceM6/ii/i A.dii kbm cm/iho- 
MMeHyBaHO aceM6/ii/i s.dii, ny6/ikmHkiflT k/ikdh Ha s.dii ce 3anncBa b KOMnn- 
/lwpaHOTO aceM6/iw A.dii. TaKa A.dii ce CB"bp3Ba caMO c KOHKpeTHaTa Bep- 
cv\s\ Ha aceM6/ikiTO s.dii v\ caMO Ta3M Bepcua e B"b3MO>KHO Aa 6"bAe 3apeAeHa 
m M3n"b/iHeHa. Bcako aceM6/ii/i, KoeTO ki3no/i3Ba AaAeHO cw/iHO-MMeHyBaHO 
aceM6/ii/i, ce CAo6nBa c HeroBi/m ny6/ikmeH k/ik>4 no BpeMe Ha KOMnw/iauwflTa 
cm m TaKa HflMa Hy>KAa Aa ce ki3no/i3Ba umc|dpob cepTnc|DMKaT. 

C"b3flaBaHe Ha cmsiho MMeHyBaHO aceM6/in 

3a Aa ce cb3AaAe cm/iho MMe Ha eAHO aceM6/iw e Hy>KHO to Aa MMa 3aAaAeHa 
Bepcufl m Ky/iTypa v\ cnep, TOBa Aa 6"bAe umc|dpobo noAnncaHO. 3a Aa ce 
M3B"bpujn noAnncBaHeTO e Hy>KHa abomio ny6/ikmeH v\ /lkmeH k/ikdh. TaKaBa 
ABOMKa Moxe Aa ce reHepupa c noMomHi/m MHcrpyMeHT sn.exe ot .NET 
Framework SDK. Eto iok ot KOMaHAHna peA c Hero ce reHepupa .snk cfja m/i 
c"bA"bp>Kaiu Hy>KHaTa ABOMKa K/iK>noBe: 



sn -k MyKeyPair . snk 



CaMOTO noAnncBaHe ce M3BtpujBa ot KOMnw/iaTopa Ha C#. Hy>KHO e 

eAMHCTBeHO Aa yKa>Ke b CTaHAapTHO reHepupaHna ot VS.NET (pawn 

Asembiyinfo.es n"bT*i ao <£ai/i/ia cbAtpaom ABOMKaTa ny6/ikmeH v\ /lwneH 
kjwoh: 



[assembly: AssemblyKeyFile (@" . . \ . . \MyKeyPair . snk" ) ] 



826 nporpaMnpaHe 3a .NET Framework (tom 2) 

Global Assembly Cache 

BceKM KOMniOTbp, komto MMa i/mcra/ikipaH CLR pa3no/iara c o6moAOCTbnHO Ha 
hmbo MaujMHa MflCTO 3a cbxpaHeHne Ha aceM6/iMTa, HapeneHO Global Assembly 
Cache (GAC). TaM ce cbxpaHABaT aceM6/ii/iTa, komto ce Ha/iara fla ce 
i/i3no/i3BaT ot noBene ot eflHO .NET npn^OKeHne. nopaflu TOBa, ne bcmukm 
aceM6/ii/iTa b GAC ca o6iuoAOcrbnHM e hy>kho Te p,a ca cm/iho MMeHyBaHM, 3a 
Aa Moxe bcako npM/io>KeHMe p,a pa6oTM caMO c >Ke/iaHaTa ot Hero Bepcua. 

3a Aa 6tAe eAHO aceM6/ii/i cbxpaHHBaHO b GAC to Tpa6Ba Aa 6tAe M3pn4HO 
MHcra/ikipaHO (Ao6aBeHO) b GAC. ToBa craBa c noMOiuTa Ha MHcrpyMeHTa 
Gacutil.exe, komto e nacr ot .NET Framework SDK. Eto KaK ot KOMaHAHMflT 
peA ce MHCTa^upa aceM6/ii/i b GAC: 



gacutil -i MyAssembly.dll 



ripeMaxBaHeTO (AewHcra/ikipaHeTo) Ha aceM6/iw ot GAC craBa npe3: 



gacutil -u MyAssembly 



TexHO/iornsiTa Isolated Storage 

Isolated Storage xpaHM/iniuaTa npeAcraB/iflBaT macto Ha tbbpamh auck, KoeTO 
e npeAOcraBeHO caMO Ha AaAeHO npM/io>KeHMe. To ce onpeAe/in 1/1 ynpaB/i^Ba 
ot CRL, KaTO o6eM"bT Ha AOCTbrmoTO ahckobo npocTpaHCTBO e orpaHkmeH. 
M3no/i3BaHeTO Ha Isolated Storage xpaHki/iwma e Bt3MO>KHO v\ ot .NET 
KOHTpo/ii/i b ye6 CTpaHnun b MHTepHeT v\ Apyrn npi/i/io>KeHi/m c orpaHi/meHi/i 
npaBa. 

Haw-necraTa ynoTpe6a Ha Isolated Storage xpaHki/iwmaTa e 3a ctxpaHeHne Ha 
noTpe6nTe^CKM HacTpoMKM v\ KeiunpaHe Ha AaHHM. BtnpeKM ne npeAOcraBa 
MflCTO Ha AncKa, KoeTO He e Aocrbrmo 3a HMKoe Apyro npi/i/io>KeHi/ie, Isolated 
Storage He ocbmecTBsiBa KpunTupaHe Ha MHCpopMaunaTa m He e noAxoA^iu 3a 
cbxpaHeHne Ha nyBcmi/iTe/iHa MHCpopMauna. 

Isolated Storage xpaHi/i/ii/imaTa 3a AaHHM MoraT Aa MMaT o6xBaT, komto 
onpeAe/ia 3a koto Te ca Aocrbrmi/i. 06xBaT"bT MO>Ke Aa ce onpeAe/ia en pa mo 
noTpe6wTe/i, aceM6/iw v\ AOMeMH, KaTO e B"b3MO>KHa KOM6kiHaui/m Me>KAy KpnTe- 
pnnTe. noA AOMewH ce pa36npa mactoto (URL v\nv\ ziOKa/iHa AnpeKTopua), ot 
KoeTO e 3apeAeHO aceM6/ikiTO. Eto KaK ce pea/iki3kipa AOCTbn ao xpaHw/iwme 
Aocrbrmo 3a TeKymnfl noTpe6wTe/i v\ TeKymoTO aceM6/iw: 



IsolatedStorageFile store = 

I sol a tedS to rage File . Gets tore ( 
IsolatedStorageScope . User | 
IsolatedStorageScope .Assembly, 
null, null ) ; 



CneA KaTO no/iyni/iM o6eKTa Ha xpaHki/ii/imeTO MO>KeM Aa pa6oTMM c cpaw/iOBeTe 
m AnpeKTopnnTe b xpaHM^niueTO no Hani/iH, noAo6eH Ha CTaHAapTHaTa pa6oTa 



HnaBa 26. CurypHOCT b .NET Framework 827 

c <£aM/iOBaTa cwcreMa. OTBapsmeTO Ha cjDaM/i 3a neTeHe ce M3B"bpujBa etc 
c^eflHMfl KOfl: 



IsolatedStorageFileStream stream 
new IsolatedStorageFileStream ( 
"notes.txt", FileMode.Open, 
FileAccess . Read, store); 



Pea/iHOTO pa3no^o>KeHMe Ha Isolated Storage xpaHki/ikimaTa e b: 



C:\Documents and Settings \<username>\Local Settings \Application 
Data\lsolatedStorage\ . . . 



CuryptiocT Ha KOfla (Code Access Security) 

CurypHOCTTa Ha KOfla (Code Access Security - CAS) e <£yHAaMeHTa/ieH e/ie- 
MeHT Ha .NET Framework. Ta HaArpa>Kfla ci/icreMaTa 3a curypHOCT Ha onepa- 
UMOHHaTa cucTeMa, KaTO npe3 Hea ce AaBa bbsmokhoct p,a ce ynpaB/iHBaT v\ 
orpaHM^aBaT npaBaTa, c komto pa3no/iara flafleHO .NET npw/io>KeHkie. npaBaTa 
AaAeHM npe3 MHCTpyMeHTMTe Ha Code Access Security ca BMHarn no-Ma/iKM 
v\nv\ paBHM Ha npaBaTa Ha TeKyiuna noTpe6kiTe/i Ha onepaunoHHaTa cwcreMa, 
komto M3no^3Ba flafleHOTO .NET npw/io>KeHkie. CLR He MO>Ke fla flafle Ha eflHO 
npn^OKeHne npaBa no-ro/ieMki ot Te3M Ha TeKyiuna noTpe6wTe/i. 

riojiMTiiKiiTe 3a cnrypHOCT b .NET Framework 

CurypHOCTTa Ha KOAa (Code Access Security) ce ynpaB/isiBa ot no^MTHKn 3a 
curypHOCT (Security Policy). rio^MTHKUTe 3a curypHOCT onpeAe/iflT rpynn koa 
(Code Groups) Ha 6a3aTa Ha AOKa3aTe/icrBa (Evidences) 3a TexHua npon3xoA 
m 3aAaBaT Ha6opa npaBa, c komto pa3no/iaraT aceM6/ikiTaTa, nonaAaiun b 
ctOTBeTHaTa rpyna. /JOKasaTe/icmaTa 3a npon3xoA MoraT p,a 6"bAaT: 

- Cm/iho MMe Ha aceM6/ikiTO 

- URL, ot KbAeTO MABa aceM6/iMTO 

- MHTepHeT 30Ha, ot KbAeTO MABa aceM6/iMTO 

- Xeiu-CTOMHOCT Ha aceM6/iMTO 

rpynu npaBa (Permission sets) 

3a v/iecHABaHe npoueca Ha 3aAaBaHe Ha npaBa Te ce o6eAHH*iBaT b npeABa- 
pwTe/iHO AecJDMHupaHM Ha6opn ot npaBa, HapeneHki MMeHyBaHUTe cnncbun c 
npaBa (Permission Sets). CraHAapTHO b .NET Framework cbmecrByBaT 
HAKO/iKO cucTeMHM cnwcbuki c npaBa, komto He MoraT Aa 6"bAaT npoMeH^HM v\ 
M3TpnBaHM. TaKMBa ca: FuliTrust - nt/iHM npaBa, Nothing - HMKaKBn 
npaBa, Execution - npaBa caMO 3a M3n"b^HeHne v\ t.h. OcBeH Te3M npeABa- 
pwTe/iHO 3aAaAeHM cni/icbuw MO>Ke Aa ce cb3AaBaT v\ hobm. B"b3MO>KHi/iTe npaBa 
komto MoraT Aa 6"bAaT o6eAMHflBaHM b tax me 6"bAaT pa3r/ieAaHki no-AO/iy. 



828 



flporpaMnpaHe 3a .NET Framework (tom 2) 



HMBa Ha no/iMTMKMTe 3a cwrypHocT 

no^MTMKMTe 3a cwrypHOcr MoraT fla 6"bflaT onpefle/iAHki Ha Tpn HMBa. ToBa ca 
hmbo Enterprise 3a ue/ii/ia Windows Domain, hmbo Machine 3a TeKymaTa 
MaujMHa m hmbo User 3a TeKyiuna noTpe6kiTe/i. npaBaTa, c komto pa3no/iara 
flafleHO aceM6/iw ce onpefle/uiT KaTO ceneHi/ie Ha npaBaTa onpefle/ieHM ot 
TpnTe HMBa Ha no/iwTMKi/iTe. ToBa 03HanaBa, ne aceM6/ii/iTO me no/iynw caMO 
npaBaTa, komto My ce npeflocraBHT v\ ot TpnTe HMBa eAHOBpeMeHHo: 




Enterprise policy 





3aAaBaHe Ha nosiMTMKa 3a cwrypHOCT 

no^MTMKMTe 3a cwrypHOcr m TexHMTe KOMnoHeHTM ce aAMMHMCTpupaT c 
noMomra Ha MHcrpyMeHTa 3a KOHCpurypupaHe Ha .NET Framework: 



^j .NET Configuration 1,1 



File Action View Help 



HHC 



S-Ql Runtime Security Policy ^] 

B^ Enterprise 
fi-Ql Code Groups 
<â–º AII_Code 
+: -$1 Permission Sets 

-fll Policy Assemblies 
Ej Machine 
-Cp Code Groups 
B ^ All.Code 

W ^ My_Computer_Zone 
i*! ^ LocalIntranet_Zone 
i+i ^ Internet_Zone 

^ Restricted _Zone 
i+i $ Trusted_Zone 
1-1 C$1 Permission Sets 
[|£] Noting 
® FullTrust 
\$} Locallntranet 

.Si Internet 

^ SkipVerification 

,£] Execution 

[[f) Everything 
Si Policy Assemblies 
C User 
B-C#l Code Groups 

All_Code 
\±\Q)L Permission Sets 
L -Qi Policy Assemblies 



"Zl 



All Code Code Group 



Description: 

Code group grants no permissions and forms the root of the 

code group tree. 

Assembly evidence must match this membership condition to 
belong to the code group: All code. 

Assemblies matching the membership condition ere granted 
this permission set at the current policy level: Nothing, 

Permission Set Description: 

Denies all resources, including the right to execute 



Tasks 

Edit Code Crou Properties : 

The Code Group Properties dialog beat allows you to edit this code 
group's name, descrpnon, membership condition, and permission 
â– set. 

Add a Child Code Group 

Use the Create Code Group wizard to add a new code group as a 
child to this code group. You will be able to choose its name, 
description, membership condition, and permission set, 



3a Windows XP/2000/2003, tom ce HaMupa b control Panel | 
Administrative Tools | Microsoft .NET Framework Configuration 1.1. 



HnaBa 26. CurypHOCT b .NET Framework 829 



npaBa (Permissions) 

M3no^3BaMKM TexHO/iorwsiTa Code Access Security, bcako eflHO aceM6/iw MO>Ke 
fla M3MCKBa v\nv\ OTKa3Ba npaBa. M3MCKBaHeTO Ha npaBa ot cboa CTpaHa Mowe 
fla 6"bfle M3MCKBaHe Ha 3afli>/i>KMTe/iHM npaBa v\nv\ M3MCKBaHe Ha He3a- 
A~b/i>KMTe/iHM npaBa. 

3aA"b-nx<MTe/iHM npaBa 

Ako HAKoe ot M3MCKaHMTe 3aA"b^>KMTe^HM npaBa He MO>xe fla 6"bfle npeflocra- 
BeHO Ha aceM6/ii/iTO, to He 6nBa 3apefleHO v\ B"b3HMKBa ki3K/iK>neHkie system. 

Security. SecurityException. TOBa e nO-npweM/lklBO OT a/lTepHaTMBaTa 

aceM6/ii/iTO fla 6tfle 3apefleHO, ho fla He Mowe fla M3n"b/iHABa <fcyHKu.kiOHa/i- 
HOCTTa cm i/i noTpe6wTe/ifl fla He e yBeflOMeH 3a TOBa. ripn yKa3BaHeTO Ha 
3afl"b/i>KkiTe/iHki M3MCKBaHMfl noTpe6nTe^fl 6nBa yBeflOMeH 3a TOBa, ne flafle- 
hoto npw/io>KeHi/ie He no/iynaBa bcmukm Heo6xoflMMM My npaBa. TaKa aflMMHM- 
CTpaTopa Ha cwcreMaTa Mowe CBoeBpeMeHHO fla B3eMM MepKM 3a ocurypaBaHe 
Ha Hy>KHMTe npaBa. 

He3aAT>^i>KMTe/iHM npaBa 

/luncaTa Ha npaBaTa, M3MCKaHM KaTO He3afl"b/i>Ki/iTe/iHM, He cnupa aceM6/ii/iTO 
fla 6"bfle 3apefleHO v\ He npeflM3BMKBa Bt3HMKBaHe Ha M3K/iK>neHMe. He3afl"b/i- 
>KMTe^HMTe npaBa, ca npaBa, komto He ce Hy>KHM 3a ocbmecTBABaHeTO Ha 
ocHOBHMTe cJDyHKunn Ha n p w /i owe h w eTO (aceM6/ii/iTo). AceM6/iMTaTa caMM ca 
OTroBopHM fla npeflBMflflT CMTyaunnTe, b komto HHMaT o6flBeHkiTe ot tax KaTO 
He3afl"b^>KMTe^HM npaBa v\ fla yBeflOMAT noTpe6i/iTe/ifl 3a TOBa. 

OTKa3aHM npaBa 

0TKa3aHMTe npaBa, ca npaBa, komto aceM6/iMTO M3pn4HO nocouBa, ne He MCKa 
fla My 6"bflaT npeflocTaBeHM, He3aBMCMMO ot aKTMBHaTa no/ikiTi/iKa 3a curyp- 
hoct (security Policy). ToBa ce ki3no/i3Ba, 3a fla MO>Ke aceM6/ikiTaTa fla cm 
ocurypaT, ne H^Ma fla MMaT noBene ot Hy>KHMTe mm 3a HopMa/iHa pa6oTa 
npaBa. no to3m Hani/m ce i/i36arBa Bt3MO>KHOCTTa flafleHOTO aceM6/ii/i fla 6tfle 
M3no/i3BaHO HenpaBM/iHO v\nv\ He,qo6po>Ke/iaTe/iHO. 

no-Ba>KHM K/iacoBe npaBa b .NET Framework 

Eto hakom ot ocHOBHMTe K/iacoBe pea/iM3i/ipamki npaBa, komto ca nacr ot 
n/iaTc)DopMaTa Code Access Security: 



ripaso 


OnucaHue 


FilelOPermission 


HeTeHe / nucaHe no <fcai/i/iOBaTa ci/icreMa 


IsolatedStorageFilePermission 


flocTbn flo M30^npaHa BwpTya/iHa 
<fcai/i/iOBa ci/icreMa Tun "IsolatedStorage" 


UlPermission 


M3no/i3BaHe Ha Windows Forms GUI 


FileDialogPermission 


flocTbn flo flkia/iora 3a M36op Ha fyawn 



830 



flporpaMnpaHe 3a .NET Framework (tom 2) 



PrintingPermission 


rie^aTaHe Ha npuHTep 


WebPermission 


flocTbn ao ye6 pecypcn 


SocketPermission 


Pa6oTa etc coKeTM 


OleDbPermission , 
SqlClientPermission 


flocTbn flo 6a3a flaHHM npe3 OleDb v\nv\ 
SqICIient AOcraBUMUMTe 


Regis try Permission 


flocrbn flo Windows Registry 


Ref lectionPermission 


flocTbn ao Reflection 



"Stack Walk" m kohtpo/i Han npaBaTa 

npaBaTa b Code Access Security ce onpeAe/isiT nooTAe/iHO 3a bchko aceM6/iM. 
ToBa Aasa B"b3MO>KHOCT MeTOAMTe ot aceM6/iM, MMaiuo npaBa 3a Aocrbn ao 
AaAeH pecypc, p,a 6"bAaT BMKaHn ot mctoam Ha Apyro aceM6/iM, KoeTO HAMa 
Te3M npaBa. no to3m Hani/m e B"b3MO>KeH HenpaBOMepeH Aocrbn ao pecypcn, 
KaTO ce M3no^3BaT npaBaTa Ha Apyro aceM6/iM. 

nopaAM Ta3M npn^MHa Code Access Security npeAOcraBfl b"B3mo>khoct BceKM 
MeTOA Aa npoBep^Ba p,anv\ M3BMKBaiunTe ro MeTOAM MMaT Hy>KHMTe npaBa. Tbm 
KaTO npaBa MoraT Aa ce onpeAe/iflT caMO ao hmbo aceM6/iM, bcmukm MeTOAM, 
HaMnpaiun ce b eAHO aceM6/in, MMaT npaBaTa AaAeHM Ha TOBa aceM6/iM. 

Ha cxeMaTa no-AO/iy e noKa3aHa pa6oTaTa Ha Stack Walk. 3a Aa ce npoBepsiT 
npaBaTa Ha bcmukm MeTOAM, komto bi/iiot AaAeH MeTOA, e Hy>KHO Aa ce o6xoam 
CTeKtT Ha M3BMKBaHMflTa (call stack) - OTTaM MABa v\ MMeTO Stack Walk. 
06xo>KAaHeTO v\ cbOTBeTHO npoBepKaTa 3anonBaT ot MeTOAa, komto HenocpeA- 
CTBeHO M3BMKBa MeTOAa, npeAM3BMKa^ Ta3M npoBepKa. CaMn^T tom He 6nBa 
npoBepyiBaH. 

06xo>KAaHeTO Ha CTeKa (Stack Walk) Mowe Aa 6"bAe KOHTpo/iMpaHO ot BceKM 

eAMH OT MeTOAMTe, KOMTO 6MB8T 06xO>KAaHM. TOBa e B"b3MO>KHO, caMO aKO Te 

caMMTe npMTe>KaBaT m3mckb3hoto npaBO. MeTOAMTe MoraT Aa yKaxaT, ne 
AaAeHOTO npaBO, KoeTO ce M3MCKBa, Tpa6Ba Aa ce npMTexaBa ot bcmukm 
ocraHa/iM MeTOAM Harope b CTeKa m CbOTBeTHO Tpa6Ba Aa 6"bAe noTBtpAeHO 
v\nv\ hakom ot MeTOAMTe Aa yKawe, ne to He ce npMTe>KaBa m npoBepKaTa Aa 
3aB"bpujM c OTpMu.aTe/ieH pe3y/iTaT. M npM ABaTa BapMaHTa npoBepKaTa ce 
npeKtCBa. 



HnaBa 26. CurypHOCT b .NET Framework 831 



CTeK Ha M3BMKBaHM5)Ta 



SomeAssembly 



v_ 



Grant: Execute 



l/l3BMKBa ce ReadFile() 



I 



YourAssembly 



I 



Grant: ReadFile 



H3BMKBa ce ReadFile() 



1 . HflKoe aceivi6riM MCKa flocrbn 
flo MeTOfl b HanieTO aceivi6nn 

2. HaujeTO aceivi6j~M npenpama 
3aaBKaTa flo H^Koe cucieiviHO 
aceivi6riM ot .NET Framework 

3. CucTeiviaTa 3a curypHOd 
npoBep^Ba flann bcmhkm 
aceivi6j~MTa b CTeKa niviaT 
HeoGxoflMMMTe npaBa m 
cbOTBeTHO flaBa flocTbn 

4. I~lpi/i Heycnex cucieiviaTa 3a 
curypHOCT XBbpna M3KnK)HeHi/ie 



I 



Permission Demand 



.NET Framework 
Assembly 



Grant: ReadFile 



Security System 

fla ce gage A 

JIM flOCT"bn? ) 



~ 



KoHTpo/itT Ha o6xo>KflaHeTO Ha CTeKa MO>Ke fla ce M3B"bpujM npe3 M3BMKBaHe 
Ha c/ieflHMTe MeTOflu Ha o6eKT ot K/iac, pea/iki3kipam npaBa: Assert, Deny, 

PermitOnly. 

- Assert - yKa3Ba, ne M3MCKBaHOTO npaBO Tpa6Ba fla 6"bfle noTBtpfleHO. 

- Deny - yi<a3Ba npaBOTO fla 6tfle OTKa3aHO. 

- PermitOnly - yi<a3Ba, ne BCM4KM ocTaHa/in npaBa ocBeH flafleHOTO 
Tpa6Ba fla 6"bflaT OTKa3aHM. 

fleK/iapaTMBHO m nporpaMHO MCKaHe Ha npaBa 

ynpaB/iflBaHMAT koa MO>xe fla MCKa onpefle/ieHM npaBa 3a CBoeTO M3n"b/iHeHne 
no flBa Hani/ma: fleK/iapaTMBHO (craTMUHo) v\ nporpaMHO (flMHaMMUHo). 

fleK/iapaTMBHo MCKaHe Ha npaBa 

fleK^apaTMBHOTO MCKaHe Ha npaBa ce M3B"bpujBa npe3 aTpn6yTM Ha hmbo 
aceM6/in. C tax ce yi<a3Ba iokbi/i 3afl"b/i>KMTe/iHM v\ He3afl"b/i>KMTe/iHM npaBa 
M3MCKBa aceM6/ikiTO v\ kom npaBa Tpa6Ba fla 6"bflaT OTHeTM (KoraTO vv\ MMa). 

Bt3MO>KHMTe flewcTBUfl Ha aTpn6yTMTe 3a fleK/iapaTMBHO MCKaHe Ha npaBa 

CbOTBeTCTBaT Ha CTOMHOCTM OT M36pOeHMfl TMn SecurityAction. Te MoraT fla 

6"bflaT: 



832 nporpaMnpaHe 3a .NET Framework (tom 2) 

- RequestMinimum - yKa3Ba, ne aceM6/ikiTO He MO>Ke fla pa6oTM 6e3 
ctOTBeTHOTO npaBO. 

- RequestRefuse - yKa3Ba, ne aceM6/ikiTO MCKa 3aflafleHOTO npaBO fla My 
6"bfle OTHeTO. 

- Demand - yi<a3Ba, ne BCM4KM aceM6/ikiTa ot creKa Ha M3BMKBaHe Tpa6Ba 
fla MMaT 3aflafleHOTO npaBO. 

- Assert, Deny, PermitOnly - ynpaB/lflBaT pa6oTaTa Ha "Stack Walk". 

HanpuMep cneRHwnj aTpn6yT yKa3Ba, ne flafleHOTO aceM6/iw M3MCKBa 3afl"b/i- 
>KMTe^HO npaBa 3a flocrbn ao bcmukm cpai/i/iOBe Ha amckoboto ycTpowcTBO c: 



[assembly: FilelOPermission ( 

SecurityAction. RequestMinimum, A11="C: \\") ] 



B"b3MO>KHO e m fla ce yKa>KaT orpaHkmeHkisi Btpxy TOBa kom aceM6/ikiTa MoraT 
fla flecpMHupaT K/iacoBe HacneflflBamw onpe,qe/ieH K/iac. C/ieflHkiyrr aTpn6yT Ha 
K/iac yKa3Ba ne K/iacbT MO>xe fla 6tfle Hac/ieflflBaH caMO b aceM6/ii/iTa noflnn- 

caHM C K/1KDH yflOCTOBepeH CbC cepTMCpMKaTa certificate, cer: 



[ Publisher IdentityPermission (SecurityAction . InheritanceDemand, 

CertFile = "certificate . cer" ) ] 
public class SomeClass 
{ 

//. . . 
} 



nporpaMHO MCKaHe Ha npaBa 

riporpaMHOTO MCKaHe Ha npaBa no3BO/i*iBa Ha KOfla fla MCKa npaBa no BpeMe 
Ha M3n"b/iHeHneTO cm. ToBa ce ocbiuecTBABa npe3 M3BMKBaHe Ha MeTOfla 
Demando Ha o6eKT ot K/iac pea/in3npam npaBa. Tom npoBep^Ba fla/iw TeKy- 
moTO aceM6/iw v\ bcmukm M3BMKBaiun ro aceM6/iMTa no CTeKa MMaT noncKaHOTO 
npaBO. ToBa npeflM3BMKBa o6xo>KflaHeTO Ha crei<a (Stack Walk) v\ aKO npaBOTO 
6"bfle OTKa3aHO ce npeflM3BMKBa ki3K/iioneHMe. 

C^eflHMAT KOfl npoBepyiBa fla/iw ki3n"b/iHflBaHki*iT koa npwTe>i<aBa npaBa 3a 
noKa3BaHe Ha flkia/ior 3a M36op Ha cpaw/i: 



FileDialogPermission fdPerm = new FileDialogPermission i 

PermissionState . Unrestricted) ; 
fdPerm. Demand ( ) ; 



Ako Heo6xoflMMMTe npaBa He ca Ha/iwuHki, CLR XBtp/isi securityException no 
BpeMe Ha M3n"b/iHeHMe Ha npn^OKeHneTO. 



HnaBa 26. CurypHOCT b .NET Framework 833 

CuryptiocT 6a3npaHa Ha po/iu (Role-Based 
Security) 

B npeAMUJHaTa ceKuna pa3r/ie,qaxMe KaK npe3 Code Access Security MCoxeM ,qa 
ynpaB^ABaMe npaBaTa Ha pa3/ikmHHTe aceM6/iMTa 3a flocrbn ao M3BMKBaHMTe 
ot tax Apyrn aceM6/ikiTa. Cera me pa3r/ie,qaMe cxeMaTa, koato .NET Frame- 
work npefl/iara 3a ynpaB/ieHkie Ha npaBaTa Ha ki3n"b/iHeHkie Ha 6a3aTa Ha TOBa 
b KaKBM po/iu yuacma TeKymwflT noTpe6MTe.n. Po/ih HapwuaMe cmmbo/iho 
03HaneHkie Ha KaTeropua noTpe6kiTe/in, komto MMaT eflHM v\ cbu\v\ npuBM^ernn, 
HanpuMep: Guest, Administrator, Manager v\ t.h. 

Role-Based Security e cxeMa, npe3 koato MO>KeM fla 3ana3BaMe MHCJDopMauMfl 
3a caMO^M4HOCTTa Ha noTpe6nTe^fl v\ acounnpaHMTe c Hero po/iu v\ b uocnep,- 
CTBue fla npoBep^BaMe KaKBM npaBa MMa tom (oTopw3au.i/m). Ue/iTa e npe3 
napo/ia, cepâ„¢c|DkiKaT, CMapT-KapTa v\nv\ flpyr MeTOfl fla ycraHOBMM p,anw no- 
Tpe6nTe^flT e to3m, 3a kototo ce npeflcraBfl. Cnefl KaTO 3HaeM kom e TeKy- 
iflMflT noTpe6kiTe/i, MOxeM npn BceKM onuT 3a flocrbn flo flafleH K/iac fla 
M3B"bpujBaMe npoBepKa b npeflBapwTe/iHO flecJDMHupaH Ha6op ot npaBki/ia .qa/ii/i 
noTpe6nTe^flT MMa npaBO Ha to3m flocrbn. 

ABTeHTHKaMMJl II OTOpM3ai4Mfl 

ripeflu fla npeMMHeM no-HaTaT"bK, HeKa o6achmm b p,ejdtv\j\v\ KaKBO 03HanaBaT 

TepMMHMTe "aBTeHTMKaUMfl" M "OTOpM3ai4Mfl". 

ABTeHTMKaMMfl (authentication) e npouecbT Ha npoBepKa fla/iw flafleH 
noTpe6wTe/i e to3m, 3a komto ce npeflcraBfl. Moxe fla ce M3B"bpujBa c napo/ia, 
c uncJDpoB cepTMCJDMKaT, cbc CMapT-KapTa v\nv\ no flpyr HanwH. 

OTopM3ai4Mn (authorization) e npouecbT Ha npoBepKa fla/iw flafleH noTpe- 
6i/iTe/i MMa npaBO fla M3B"bpujn flafleHO flewcTBue (npe,qno/iara ce, ne noTpe6n- 
Te/isiT e ycneujHO aBTeHTMKupaH). Role-Based Security ocurypaBa MexaHM3MM 
3a OTopn3aunfl b .NET npn/io>KeHkiflTa. 

K/iacoBeTe Identity n Principal 

3a M3B"bpujBaHe Ha OTopn3aunfl npe3 Role-Based Security ce ki3no/i3BaT 

K/iacOBeTe Identity M Principal. K/iaCbT Identity HOCM MHCJDOpMaUMfl 3a 

noTpe6i/iTe/ifl, b hmmto kohtckct ce i/i3n"b/iHflBa KOfla. B Hero ce cbxpaHABa 
noTpe6nTe^CKO MMe v\ b 3aBMCMMOCT ot Tuna Identity MO>xe fla ce na3M MMe Ha 
flOMeMH, fla/ii/i noTpe6nTe^flT e aBTeHTMKupaH v\ flp. K/iacvr Principal npefl- 
craB/iflBa KO/ieKUkia ot po/iu. Hpe3 M36poeHMTe po/iu b eflMH o6eKT Principal 
MO>KeM fla npoBep^BaMe KaKBM npaBa ca OTpefleHM Ha noTpe6kiTe/ifl. 

B .NET Framework MMa flBa Tuna identity v\ Principal K/iacoBe: 

- Windows Identity M WindowsPrincipal 

Genericldentity M GenericPrincipal 



834 nporpaMnpaHe 3a .NET Framework (tom 2) 

Pa6oTa c Windowsldentity n WindowsPrincipal 

Windows Identity M WindowsPrincipal npeflCTaB/lflBaT nOTpe6klTe/lklTe M Tex- 

HMTe po/iw b KOHTeKCTa Ha Microsoft Windows. Te cbAtpwaT cneui/icpkinHa 3a 
Ta3M onepaunoHHa cwcreMa MHCpopMauna v\ ynoTpe6aTa mm e yMecTHa, aKO 
Ha6op"bT ot po/ii/i b Windows e noflxoflaiu 3a ue/ikiTe Ha npw/io>KeHi/ieTO. 

ETO flBa npMMepa 3a Cb3flaBaHe Ha Windowsldentity V\ WindowsPrincipal 
o6eKTn: 



Windowsldentity winldentity = Windowsldentity . GetCurrent i 
Console .WriteLine ( "Windows login: {0}", winldentity . Name) 

WindowsPrincipal winPrincipal = 

new WindowsPrincipal (winldentity) ; 



C ropHMfl 6/iok MHMUna/iki3kipaMe hob o6eKT ot Tun windowsldentity etc 
CTaTM4HMfl MeTOfl Windowsldentity . GetCurrent ( ) M nOKa3BaMe MMeTO Ha 

noTpe6nTe^fl Ha eKpaHa. 

MHcjDoptviaMMq 3a TeKyinNH noTpe6nTe/i - npiiMep 

C HacTOfliunfl npuMep me ki/uocrpkipaMe KaK ot .NET Framework MO>xe fla ce 
M3B/iene MHCpopMaunfl 3a TeKyiunfl Windows noTpe6nTe/i, noA komto e crap- 
TupaHO npw/io>KeHkieTo: 



Windowsldentity winldentity = Windowsldentity . GetCurrent () ; 
Console .WriteLine ( "Windows user name: {0}", winldentity . Name) ; 

WindowsPrincipal winPrincipal = new 
WindowsPrincipal (winldentity) ; 

bool isAdmin = 

winPrincipal . IsInRole (WindowsBuiltlnRole .Administrator) ; 
Console .WriteLine ( "Is in Administrators group: {0}", isAdmin) ; 

bool isGuest = winPrincipal . IsInRole (WindowsBuiltlnRole . Guest ) 
Console .WriteLine ( "Is in Guests group: {0}", isGuest); 

bool isUser = winPrincipal . IsInRole (WindowsBuiltlnRole . User ) ; 
Console .WriteLine ( "Is in Users group: {0}", isUser); 



ripn ki3n"b/iHeHwe Ha npuMepa ce no/iynaBa cneRHwnj pe3y/iTaT: 



HnaBa 26. CurypHOCT b .NET Framework 835 



c\ "C:\MS Content and Curriculum\PPT\Lecture-24-Security 



Windows user name: NRKOVXfldministrator 
Is in Administrators group: True 
Is in Guests group: False 
Is in Users group: True 
Press any key to continue^ 



^Dl*] 



Pa6oTa c Genericldentity n GenericPrincipal 

KoraTO M3nO/13BaMe GenericPrincipal, 3a fla M3rpaflMM co6cTBeHa cxeMa 3a 
aBTeHTMKaunfl m OTopn3aunfl, Tpa6Ba fla ce npwfl"bp>KaMe kbm cnep,Hwn n/iai-i: 

1. ABTeHTMKaunfl Ha noTpe6nTe^fl 

ripn CTapTupaHeTO Ha npki/io>KeHMeTO v\nv\ npn o6ptiueHne KbM flafleH 
pecypc, npeflHa3HaneH caMO 3a noTpe6i/iTe/iw c onpefle/ieHki npaBa, m3mck- 
BaMe ot noTpe6kiTe/i*i fla BtBefle noTpe6i/iTe/iCKO MMe v\ napo/ia. M3B"bp- 
ujBaMe npoBepKa fla/iw noTpe6kiTe/iCKOTO vw\e v\ napo/iaTa ca Ba/iwflHM. 



if (ValidLogin (user, pass) 

{ 

// User authenticated 



2. Cb3flaBaHe Ha Genericldentity M GenericPrincipal 06eKTM 

C/iefl KaTO 3HaeM, ne MMaMe Ba/ikifleH noTpe6wTe/i, cb3flaBaMe 3a Hero 

Genericldentity M GenericPrincipal 06eKTM. Genericldentity klHklUkia- 
^M3kipaMe C nOTpe6klTe^CKOTO MMe, a GenericPrincipal C HOBOC"b3flafleHO- 
TO Genericldentity M CriMCbK OT po/ll/ITe, B KOMTO yuaCTBa nOTpe6MTe/lflT. 



Genericldentity id = new Genericldentity ( "some user"); 
string [] roles = {"Manager", "Developer", "QA" } ; 
GenericPrincipal prin = new GenericPrincipal (id, roles); 



3. AcounnpaHe Ha Principal o6eKTa c TeKymaTa HMUJKa 

3a fla y/iecHMM nocneflBami/i npoBepKM, 3aflaBaMe nHMuna/iM3MpaHi/m TOKy- 

LflO GenericPrincipal KaTO TeKyifl Principal Ha HMUJKaTa. 



System. Threading . Thread. CurrentPrincipal = prin; 



OTopn3aMnq no Principal o6eKT 

C/iefl KaTO CMe ki3rpaflki/ii/i cxeMa 3a acounnpaHe Ha noTpe6kiTe/ifl c Principal 
o6eKT, MOxeM fla no/i3BaMe Ta3M MHCJDopMauMfl, 3a fla npoBepsiBaMe fla/iki tom 



836 nporpaMnpaHe 3a .NET Framework (tom 2) 

MMa npaBO p,a w3n"b/iHki flafleHa nacr ot KOfla. Ta3M npoBepKa MO>KeM p,a 
npaBMM no flBa Hankma - AeK/iapaTkiBHO v\ nporpaMHO. 

fleK/iapaTMBHa OTopn3aunn 

fleK^apaTMBHa OTopn3aunfl npaBMM npe3 aTpn6yTM. MoweM p,a rn 3aflaBaMe Ha 
flBe HMBa - Ha hmbo MeTOfl v\ Ha hmbo K/iac. ripn 3aAaBaHeTO mm Ha MeTOfl, 
npoBepKaTa ce M3B"bpujBa npn M3BMKBaHe Ha MeTOfla, a aKO ca 3aflafleHM Ha 
K/iac - npn ct3AaBaHeTO Ha o6eKT ot to3m K/iac. npunoMHeTe cm, ne eAMHM- 
uaTa 3a 3aflaBaHe Ha npaBa b Code Access Security 6ewe aceM6/ikiTO. 

C/ieAHi/iTe ABa npuMepa w/iiocTpkipaT 3aAaBaHe Ha Role-Based Security aTpn- 
6yTM Ha MeTOA- B ntpBMflT npuMep 3aAaBaMe M3MCKBaHe noTpe6wTe/iflT p,a 
yuacrBa b po/iflTa "Developer", a bbb btopma - MMeTO My p,a e "MBaHOB". M b 
ABaTa c/iynaa, aKO yc/iOBweTO He e M3n"b/iHeHO, npn M3BMKBaHeTO Ha MeTOAa 
ce reHepupa M3K/iK>neHkie OTTun securityException. 



Principal Permission (SecurityAction . Demand, 
Role="Developer" , Authenticated=true) ] 
public void DoSomething ( ) 

// Perform some action 



Principal Permission (SecurityAction . Demand, Name="MBaHOB' 
public void DoSomethingElse ( ) 

// Perform some action 



B MMeHaTa Ha noTpe6wTe/inTe v\ po/ikue He ce npaBM pa3/ikiKa Me>KAy Ma/iKki v\ 
MaBHM 6yKBM - "developer" v\ "DevelopeR" ca paBH03Ha4HM. 

Ako MMaMe hako/iko noTpe6nTe^fl b pa3/ikmHi/i po/iw, Ha komto Tpa6Ba p,a 6"bAe 
no3BO^eH AOCTbn, MO>KeM p,a 3aAaAeM noBene ot eAMH aTpn6yT. Ako TeKyiunaT 
noTpe6kiTe/i M3n"b/iH*iBa yc/iOBi/ieTO, 3aAaAeHO b noHe eAMH ot aTpn6yTMTe, Ha 
Hero me My 6"bAe no3BO/ieH AOCTbn. 



[ PrincipalPermission (SecurityAction . Demand, Role="Teller" ) ] 
[ PrincipalPermission (SecurityAction . Demand, Role= "Manager" ) 
public class Statement 

{ 

// Class for account statement 

} 



Ako noTpe6kiTe/iHT MMa po/iHTa "Teller" v\/v\nv\ po/i^Ta "Manager" tom Moxe p,a 
cb3AaBa o6eKTM ot to3m K/iac. B npoTMBeH cnynaw npn onuT 3a cb3AaBaHe Ha 

06eKT me ce reHepupa kl3K/lK>neHkie OTTkin SecurityException. 



HnaBa 26. CurypHOCT b .NET Framework 837 

3a fla npaBMM pa3/im<a b paMKMTe Ha eflMH MeTOfl KaKBM npaBa MMaT noTpe- 
6kiTe/ikiTe ot pa3/ikmHHTe po/ii/i, Tpa6Ba fla npn6erHeM flo nporpaMHa OTopn- 
3aunfl. 

nporpaMHa OTopn3ai4nn 

OcBeH npe3 aTpn6yTM, MO>KeM fla npoBepyiBaMe npaBaTa Ha noTpe6nTe/ifl h 
nporpaMHO. BtnpeKM ne aTpn6yTa PrincipalPermission e mhoto yflo6eH, b 
hakom cnynai/i Moxe fla ce Ha/io>Ki/i fla no/i3BaMe nporpaMHa npoBepKa. 
ripuMep 3a TaKtB cnynaw e aKO peiueHne fla/ii/i fla 6"bfle no3BO/ieH flocrtn 
3aBncn ocBeH ot po/iflTa Ha noTpe6nTe^fl v\ ot flpyra ctomhoct, koato He e 
M3BecTHa npeflu M3n"b/iHeHMeTO Ha nporpaMaTa. 

Eto npuMep 3a nporpaMHa npoBepKa no po/ia: 



if (principal . IsInRole ( "Administrators" ) 

{ 

// Perform some action 

} 



flpoBepKa no noTpe6wTe/iCKO MMe: 



if (principal . Identity . Name == "nemo"; 

{ 

// Perform some action 

} 



flpOBepKa 4pe3 C"b3flaBaHe Ha HOB PrincipalPermission 06eKT: 



PrincipalPermission prinPerm = new 

PrincipalPermission ( "nemo" , "Tester") ; 
prinPerm. Demand ( ) ; 
// Throws SecurityException if the check fails 



B ropHMfl npMMep Cb3flaBaMe 1/IHCTaHUMfl Ha PrincipalPermission M B 

KOHCTpyKTopa My 3aflaBaMe yc/iOBkiyiTa, komto ce M3MCKBaT ot noTpe6kiTe/ifl. 

ripn M3BMKBaHe Ha MeTOfla DemandO 06eKTa OT TMn PrincipalPermission 

M3B"bpujBa cpaBHeHne Ha noflafleHMTe My noTpe6i/iTe/iCKO MMe v\ po/ia c TeKy- 
iflMTe 3a HMiuKaTa. Ako cpaBHeHneTO e HeycneujHO ce reHepupa M3K/iK>neHkie 

OT Tkin SecurityException. 

Mo>xeM fla npoBepyiBaMe caMO po/iaTa Ha noTpe6i/iTe/ifl, KaTO 3a ue/iTa 
noflaBaMe null KaTO napaMeTtp 3a noTpe6kiTe/iCKO MMe. 

OTopn3aMnq c noTpe6nTejin vx po/m - npiiMep 

Ctc c^eflBaiflMfl npuMep me w/uocrpi/ipaMe B"b3MO>KHOCTMTe, komto .NET 
Framework npefl/iara, 3a OTopi/i3aui/m, 6a3npaHa Ha noTpe6kiTe/ii/i v\ po/iw: 



using System; 



838 flporpaMnpaHe 3a .NET Framework (tom 2) 



using System. Security. Principal; 
using System. Security. Permissions; 

class RoleBasedSecurityDemo 

{ 

static void Main ( ) 

{ 

Console .Write ( "Username : "); 
string user = Console . ReadLine () ; 
Console .Write ( "Password: "); 
string pass = Console . ReadLine () ; 

if (ValidLogin (user, pass)) 

{ 

// Create generic identity and principal objects 
Genericldentity identity = new Genericldentity (user ) ; 
string [] roles = {"Manager", "Developer", "QA" } ; 
GenericPrincipal principal = 

new GenericPrincipal (identity, roles); 

// Attach the principal to the current thread 
System. Threading . Thread. CurrentPrincipal = principal; 

DoSecuredOpearation ( ) ; 

} 
else 

{ 

Console . WriteLine ( "Invalid login . " ) ; 

} 
} 

static bool ValidLogin ( string aUsername, string aPassword) 

{ 

bool valid = (aUsername == aPassword); 

return valid; 
} 

[ PrincipalPermission (SecurityAction . Demand, Name="Admin" ) ] 
static void DoSecuredOpearation ( ) 

{ 

Console .WriteLine ( "Secure opration invoked."); 
IPrincipal principal = 

System. Threading . Thread. CurrentPrincipal; 
Console .WriteLine ( "User : {0}", principal . Identity . Name) 

bool isManager = principal . IsInRole ( "Manager" ) ; 
Console .WriteLine ( "Is Manager: {0}", isManager); 

bool isGod = principal . IsInRole ( "God" ) ; 
Console. WriteLine ("Is God: {0}", isGod) ; 



HnaBa 26. CurypHOCT b .NET Framework 839 



KaK pa6oTM npnMep"t>T? 

ripi/i CTapTupaHe npn^OKeHneTO MCKa ot noTpe6i/iTe/isi fla BtBefle MMe v\ 
napo/ia, cnep, KoeTO vv\ npoBepaBa (M3B"bpujBa aBTeHTHKauna). ABTeHTMKa- 
UMATa Moxe fla ce M3B"bpujn no MHO>KecTBO Ha^MHM (HanpuMep npe3 npoBepKa 
b 6a3a flaHHM v\i\v\ b LDAP flkipeicropi/m), ho 3a ue/iMTe Ha npuMepa npocTO ce 
npoBepaBa p,anw noTpe6kiTe/iCKOTO MMe cbBnafla c napo/iaTa. 

ripn ycneujHa aBTeHTHKauna ce cb3,qaBa o6eKT Genericidentity, b komto ce 
3anncBa MMeTO Ha noTpe6kiTe/i$i. Cnep, TOBa Ha noTpe6kiTe/ifl ce 3a,qaBaT po/iw 

M ce Cb3flaBa GenericPrincipal 06eKT. T03M GenericPrincipal 06eKT ce 

acounupa c TeKymaTa HMUJKa, KoeTO no3BO/iHBa cnefl TOBa no Hero fla ce 
M3B"bpujBaT fleK^apaTMBHM m nporpaMHM npoBepKM Ha noTpe6kiTe/ifl v\ po/isiTa. 

B npuMepa e pea/in3wpaH MeTOfl Dosecuredopearation ( ) , Ha komto fleK/iapa- 
tmbho e yKa3aHO, ne M3MCKBa noTpe6kiTe/iyn~, acounnpaH c TeKymaTa HMUJKa, 
fla e c MMe "Admin". Ako npn M3BMKBaHe Ha MeTOfla noTpe6kiTe/i*iT e flpyr, CLR 

Lfle reHepupa M3K/lK>neHI/ie OTTkin SecurityException. 
npMMep"bT B AeMCTBMe 

3a fla n^KDCTpupaMe npw/io>i<eHMeTO, me ro crapTkipaMe v\ me M3n"b/iHMM 
c^eflHMTe CTbnKn: 

1. B"bBe>KflaMe noTpe6kiTe/i v\ napo/ia, komto He cbBnaflaT, v\ BM>KflaMe, ne 
aBTeHTMKaunflTa Ha noTpe6kiTe/ifl He ycn^Ba. 

2. B-bBe>KflaMe noTpe6i/iTe/i "admin" v\ napo/ia "admin" v\ BM>KflaMe, <Ae 

aBTeHTMKauklflTa ycnflBa V\ MeTOfl"bT DoSecuredOperation ( ) ce M3BMKBa 
ycneiuHO. 

3. BtBexflaMe noTpe6nTe/i "test" v\ napo/ia "test" v\ BM>KflaMe, ne 
aBTeHTMKaunflTa ycn^Ba, ho npn onuT 3a M3BMKBaHe Ha MeTOfla 

DoSecuredOperation () , CLR reHepupa l/l3K/lK>neHI/ie OT TMn 

SecurityException, 3aiflOTO TeKyiflMflT noTpe6kiTe/i He e "Admin". 
Pe3y/iTaTbT M3r/ie>Kfla no cj\ep,uv\s\ HanwH: 



840 



flporpaMnpaHe 3a .NET Framework (tom 2) 



-|D| x] 



>Demo-9-Role-Based-Security. exe 
Username: test 
Password : 123 
Invalid login. 

>Demo-9-Role-Based-Security. exe 
Username: admin 
Password: admin 
Secure operation invoked. 
lUser : admin 
Is Manager: True 
Is God: False 

>Demo-9-Role-Based-Securi ty. exe 
Username: test 
Password : test 

Unhandled Exception: System. Security. SecurityExcepti on : Request for principal pe 
rmission failed. 

at System. Security. Permissions. Principal Permission. Demand Q 

at System. Security. PermissionSet. Demand Q 

at Ro 1 eB as ed Security Demo. DoSecuredOperationQ in d:\moite raboti\kniga dot ne 
t\security\lecture-24-security-v0. 27\demo-9-role-based-5ecurity\rolebasedsecurit 
ydemo. cs :line 42 

at Ro 1 eB as ed Security Demo. MainQ in d:\moite raboti\kniga dot net\security\lec 



ture-24-security-vO. 27'\ demo -9- role- based- si 
25D 



rolebased security demo. cs :line 



KpnnTorpa4>Mfl b .NET Framework 

.NET Framework npeA/iara 6oraT Ha6op ot cpeflCTBa 3a pa6oTa c 
KpunTorpadpcKM a/iropwTMki. K/iacoBeTe b npocrpaHCTBOTO system. security, 
cryptography no3BO^ABaT pa6oTa c a/iropwTMM 3a M3B^M4aHe Ha xeuj ctom- 
hoct, CMMeTpn^HM KpkinTkipamki a/iropwTMki, acMMeTpn^HM KpkinTkipamki a/iro- 

PMTMM, UMCppOBM nOAnMCM M CepTMCpMKaTM . 



M3BJiiiHaHe Ha xeiu ctomhoct 

B Hana/iOTO Ha HacToaiuaTa TeMa o6acHMXMe, ne xemnpaHeTO e npou.ec Ha 
"cMki/iaHe" Ha AaAeH AOKyMeHT, npn komto ot Hero ce ki3B/iwna KpaTKa 
noc/ieAOBaTe/iHOcr ot 6atiT0Be, HapeneHa xeuj -ctomhoct. Cera me ce cnpeM 
Ha cpeACTBaTa, komto .NET Framework hm Aasa, 3a pa6oTa c xeujupaiun 
a/iropwTMM. 

B .NET Framework MMa MMn^eMeHTupaHn K/iacoBe 3a ki3B/iwnaHe Ha xeuj 
ctomhoctm no craHAapTMTe MD5, SHA1, SHA256, SHA384 v\ SHA512. 3a 
M3B/ikmaHe Ha xeuj c k/ikdh ca MMn^eMeHTupaHn K/iacoBeTe hmacsha m 
MACTripleDES, komto no/i3BaT CbOTBeTHO a/iropwTMkiTe SHA-1 m 3DES. 

M34nc^flBaHeT0 Ha xeuj ctomhoct 3a AaAeHa nopeAnu,a ot 6a£iT0Be CTaBa c 
eAHO o6p"biueHne kbm MeTOAa computeHash ( ) Ha cbOTBeTHna K/iac. 



HnaBa 26. CurypHOCT b .NET Framework 841 



l/l3BsiimaHe Ha xeiu - npiiMep 

Ctc cneRBauxwn npuMep me ki/uocrpkipaMe KaK MO>KeM fla i/i3hmc/imm SHA-1 
xeiu ot AaAeHO TeKCTOBO cbo6meHi/ie: 



using System; 

using System. Security. Cryptography; 

using System. Text; 

class HashSample 

{ 

static void Main ( ) 

{ 

Console .Write ( "Enter some text: "); 

string s = Console . ReadLine () ; 

byte[] data = Encoding .ASCII . GetBytes ( s ) ; 

SHAlCryptoServiceProvider shal = 
new SHAlCryptoServiceProvider ( ) ; 

byte [ ] shalhash = shal . ComputeHash (data) ; 

Console. WriteLine ("SHA1 Hash: {0}", 
BitConverter . ToString ( shalhash) ) ; 

MD5CryptoServiceProvider md5 = 
new MD5CryptoServiceProvider ( ) ; 

byte [ ] md5hash = md5 . ComputeHash (data) ; 

Console. WriteLine ("MD5 Hash: {0}", 
BitConverter . ToString (md5hash) ) ; 

SHA512 sha512 = new SHA512Managed ( ) ; 
byte [ ] sha512hash = sha512 . ComputeHash (data) 
Console. WriteLine ("SHA512 Hash: {0}", 
BitConverter . ToString ( sha512hash) ) ; 



} 



3a p,a M34MC/1MM xeiu CTOMHOcrra Ha eAHa 6awTOBa nopeAnua ct3AaBaMe 
o6eKT, ctOTBeTCTBaiu Ha >Ke/iaHi/mT Tun xeiu, v\ n noAaBaMe KaTO napaMerbp 

Ha MeTOAa My ComputeHash ( ) . 

Pe3y/iTarbT ot M3nt^HeHneTO Ha npuMepa e c^eAHMAT: 




842 nporpaMnpaHe 3a .NET Framework (tom 2) 

CuMeTpuHHii KpiinTiipauiM cxeMM 

B Hana/iOTO Ha TeMaTa Bene pa3r/ie,qaxMe CMMeTPM'HHme Koanpamn cxeMM v\ 
o6flcm/ixMe, ne npn tax ce ki3no/i3Ba ep,v\u v\ cbu\ k/ikdh 3a KpunTupaHe v\ 
AeKpunTupaHe Ha MHCpopMaunaTa. HeKa cera pa3r/ie,qaMe KaKBM cpeflCTBa hm 
npeflocTaBfl .NET Framework 3a M3B"bpujBaHe Ha KpunTupaHe v\ AeKpunTupaHe 
etc CMMeTpn^HM KpwriTorpacpCKi/i a^ropnTMM. 

KpiinTMpaHe m AeKpunTupaHe c CryptoStream 

3a noTOHHO CkiMeTpwuHO KpunTupaHe v\ fleKprniTkipaHe b .NET Framework e 
MMn/ieMeHTwpaH K/iacvr CryptoStream. HeKa pa3r/ie,qaMe cxeMaTa Ha pa6oTa. 

3a fla KpunTupaMe v\nv\ AeKpunTupaMe flafleH TeKCT ntpBO cb3,qaBaMe o6eKT ot 
Tuna Ha M36paHMfl a/iropwTbM. HanpuMep 3a Rijndael/AES K/iacbT e 

Ri jndaelManaged, a 3a 3DES - TripleDESCryptoServiceProvider. 3aflaBa- 

Me KaTO napaMeTpn K/iK>na v\ Hana/n-ma BeKTop. Hana/iHMAT BeKTop e 
Heo6xoflMM 3a bcmukm a/iropwTMki, komto pa3fle/iyn~ TeKCTa Ha 6/iOKOBe v\ 
M3no^3BaT pe3y/iTaTa ot KpunTupaHe Ha npeflxoflHi/m 6/iok npn KpunTupaHeTO 
Ha TeKymkia. Hana/iHWAT BeKTop ce M3no/i3Ba npn KpunTupaHeTO Ha rrbpBkm 
6/iok, TbM KaTO 3a Hero HsiMa npeflxofleH. ripn fleKpunTupaHeTO Tpa6Ba fla ce 
M3no^3Ba ocBeH ctiuaTa napo/ia v\ cbiuna Hana/ieH BeKTop. 

C/ieflBaiuaTa CTbnKa e fla cb3fla,qeM CryptoStream o6eKT. ripn MHMuna^M3M- 
paHeTO My 3aflaBaMe o6eKTa c M36paHMfl a/iropi/iTbM, v\ o6eKT ot Tkin stream, 
KbfleTO fla ce cbxpaHHBa pe3y/iTaTa. 

KpunTupaHeTO ce ocbmecTBABa KaTO nmueM b CryptoStream noTOKa v\ neTeM 
b noflafleHMAT My KaTO napaMeTbp v\3xop,eu noTOK, komto Moxe fla e cpaw/i, 

HM3, Mpe>Ka M T.H. 

KpiinTMpaHe c CryptoStream - npuMep 

C^eflHMAT npuMep noKa3Ba KaK MOxeM fla KpunTupaMe Unicode TeKCT: 



using System. Security. Cryptography; 
using System. 10; 
using System. Text; 

// Instantiate cryptographic scheme 
Rijndael cryptoAlg = new Ri jndaelManaged () ; 

// Get random bytes (salt) to help generate secure password 
RandomNumberGenerator randNum = new RNGCryptoServiceProvider ( ' 
byte [ ] salt = new byte [32]; 
randNum. GetBytes ( salt) ; 

// Generate the password 
PasswordDeriveBytes passProvider = new 

PasswordDeriveBytes ( "MOHTa napojia 213", salt); 
byte [ ] password = passProvider . GetBytes ( 32 ) ; 



HnaBa 26. CurypHOCT b .NET Framework 843 



// Initialize the algorithm object with the password and IV 
cryptoAlg . Key = password; 
cryptoAlg . GeneratelV ( ) ; 

// Create a stream destination for the encryption 
MemoryStream msDestination = new MemoryStream () ; 

// Create the CryptoStream and set the msDestination 

// memory stream as its target 

CryptoStream csEncryptor = new CryptoStream ( 

msDestination, cryptoAlg . CreateEncryptor ( ) , 

CryptoStreamMode .Write) ; 

// Transform the input text as byte sequence and 
// write it to the stream 
byte [ ] bytelnput = 

Encoding . Unicode . GetBytes ( "MOHTa TaiiHa wH^opMauwH" ) ; 
csEncryptor .Write (bytelnput, 0, bytelnput . Length) ; 
csEncryptor. FlushFinalBlock ( ) ; 

// CryptoStream csEncryptor has encrypted the data 

// into the stream. Retrieve it: 

encrypted = msDestination . ToArray () ; 

// Result: encrypted [] byte array has the encrypted text 



B noKa3aHMfl npuMep M3no/i3BaMe Rijndael/AES 3a KpunTupaHe Ha TeKcra. 3a 
no/iynaBaHe Ha K/iK>na 3a KpunTupaHe M3no/i3BaMe iokto noTpe6kiTe/iCKaTa 
napo/ia TaKa v\ cnynai/iHa ctomhoct, HapeneHa "co/i". Co/ua e ctomhoct, kohto 
ce M3no/i3Ba o6mkhob6ho npn a/iropwTMkiTe 3a xeiunpaHe, 3a fla ce no/iynaBaT 
pa3/ikmHi/i xeiu ctomhoctm 3a eflHa v\ ctiua BxoflHa ctomhoct (HanpuMep 
napo/ia). B 3aBMCMMOCT ot KOHKpeTHOTO peiueHne, Ta3M ctomhoct Moxe v\nv\ 
fla 6"bfle na3eHa b TaMHa v\nv\ fla e ny6/ikmHO ki3Becma. flopn fla e ny6/innHO 
M3BecTHa, tsi 3aTpyflHABa TaKa HapeneHkiTe penHMKOBi/i aTaKM, Tbfi KaTO Ha 
aTaKyBaiunfl napo/iaTa ce Ha/iara fla npew3Hkic/iflBa xew CTOMHOCTMTe c 
flafleHaTa co/i (He MO>Ke fla rn MMa Ha totobo). 

3a fla e HancTMHa npon3BO/iHa co/ua, M3no/i3BaMe npeflocraBeHkifl ot .NET 
Framework reHepaTop Ha c/iynafiHM nwc/ia RandomNumberGenerator. Tom e 
KpnnTorpac|DCKM cn/ieH reHepaTop Ha c/iynawHM nwcna. 

3a no/iynaBaHe Ha npow3BO/ieH Hana/ieH BeKTop i/i3no/i3BaMe MeTOfla Ha 

RijndaelManaged GenerateIV() . flopn fla He M3BMKaMe T03M MeTOfl, npn MHM- 

Una^M3aunflTa Ha BceKM ci/iMeTpi/meH a/iropwTbM 3a KpunTupaHe ce reHepupaT 
npoi/i3BO/ieH k/ikdh m Hana/ieH BeKTop. Heo6xoflMMO e fla 3ana3MM Hana/iHMAT 
BeKTop, TbM KaTO fleKprniTkipaHeTO Tpa6Ba fla ce M3B"bpujn etc cbiuna BeKTop. 

C"b3flaBaMe MemoryStream 06eKT, B KOMTO CryptoStream Lfle nOflaBa Bene 

KpunTupaHMfl TeKCT. Ha CryptoStream 3aflaBa Me npe3 ntpBMflT napaMeTbp, ne 
me pa6oTM c HOBOCb3flafleHki*i MemoryStream o6eKT m npe3 TpeTMAT napaMe- 



844 nporpaMnpaHe 3a .NET Framework (tom 2) 

Tbp, ne cryptostream me nmue b Hero. ToBa e Heo6xo,qi/iMO, tbm KaTO KaKTO 
me bmamm no-HaTarbK, npn fleKpunTupaHeTO cryptostream me neTe ot 
noflafleHMfl My ioto napaMeTbp noTOK. C BTopua napaMeTbp Hue cb3,qaBaMe 
caMMfl o6eKT, komto me M3B"bpujBa KpunTupaHeTO. TaKa cryptostream me 
TpaHCCpopMupa BCHKa ctomhoct, koato HanniueM b Hero npe3 to3m o6eKT, v\ 
me M3npama w3xo,qa b 3aflafleHna ot Hac noTOK. 

KaKTO ce BM>Kfla ot npuMepa, KpunTupamn^T o6eKT onaKBa bxoabt fla e b 
6aMTOBa nopeflnua. 3a fla no/iyni/iM Ta3M 6aMTOBa nopeflnua M3no/i3BaMe 
MeTOfla GetBytesO, komto pa3r/ie,aaxMe b TeMaTa 3a HM30BeTe. 

TtM KaTO Rijndael/AES a/iropkiTbMvr pa6oTM c 6/iOKOBe, Heo6xoflMMO e cnep, 
KaTO CMe Hannca^n nocneflHaTa nacr ot BxoflHi/m TeKCT fla HaKapaMe 
cryptostream fla noflafle ocTaBamnTe cmmbo^m, flopn fla He ca c pa3Mep 
AOcraTbueH 3a eflMH 6/iok, m cnefl KaTO ce flont/iHAT etc cmmbo^m ao 
A"b^>KMHaTa Ha 6/iOKa fla ce KpunTupaT v\ pe3y/iTaTbT fla ce OTpa3M Ha 

M3XOflHMfl nOTOK. TOBa npaBMM C MeTOfla FlushFinalBlock ( ) . 

no/iyneHi/i*iT pe3y/iTaT e 6awTOBaTa nopeflnua encrypted, koato cbfltpxa 
KpnnTnpaHaTa Bepci/m Ha HM3a. 

AeKpunTupaHe c Cryptostream - npMMep 

Eto KaK MO>KeM fla fleKpunTupaMe cbo6meHneTO no/iyneHO npn pa6oTaTa Ha 
npeflxoflHMfl npuMep: 



using System. Security. Cryptography; 
using System. 10; 
using System. Text; 

// Instantiate cryptographic scheme 
Rijndael cryptoAlg = new Ri jndaelManaged ( ) ; 

// Load the encrypted data in byte array encrypted [] 
// . . . 

// Load the password and initialization vector 
// . . . 

// Create the stream used as source for decryption 
MemoryStream msSource = new MemoryStream (encrypted) ; 

// Set cryptoAlg with password and IV used during encryption 
cryptoAlg . Key = password; 
cryptoAlg. IV = IV; 

// Create a cryptographic stream 

Cryptostream csDecryptor = new Cryptostream (msSource, 

cryptoAlg . CreateDecryptor ( ) , CryptoStreamMode . Read) ; 
// Create buffer to store the decrypted data 
byte [ ] result = new byte [encrypted. Length] ; 



HnaBa 26. CurypHOCT b .NET Framework 845 



// 


Read the 


decrypted 


data 












cs 


Decryptor 


. Read ( resu 


It, 0, 


result . 


Length) ; 








// 


Get the 


resulting 


string 












St 


ring resu 


ItString = 


ASCIIE 


ncoding 


. Unicode 


GetSt 


ring 


result) ; 



Cb3AaBaMe o6eKTa KpnnTorpac|DCKM a/iropwrbM Rijndael v\ My 3aflaBaMe napo- 
ziaTa m Ha^a^HMfl BeKTop, komto ki3no/i3BaxMe npn KpunTupaHeTO. C"b3flaBaMe 
Memory-stream ncrroK, npe3 komto fla ce ocbiuecTBABa flocTtn flo KpunTupa- 
hoto c"bo6iueHne. 3aAaBaMe ro Ha cryptostream noTOKa, KaTO npe3 napaMe- 
Tbpa CryptoStreamMode . Read My yKa3BaMe Aa neTe OT Hero. 

TaKa KoraTO neTeM ot cryptostream noTOKa tom B3MMa bxoahoto c"bo6iueHne 
m npe3 cryptoAig o6eKTa ro AeKpwnTwpa. riponeTeHaTa 6ai/iTOBa nopeAHua 
result npeo6pa3yBaMe b Unicode hm3, komto cbAtpwa opi/iri/ma/iHOTO cbo6- 
lueHne. 

ACMMeTpMHHM KpMnTlipaiJJ|M CXCMM 

B Hana/iOTO Ha HacToaiuaTa TeMa pa3r/ieAaxMe KaKBO npeAcraB/iHBaT acuMeT- 
pn'HHMTe KpunTupamn cxeMM v\ o6acHMXMe, ne Te i/i3no/i3BaT ABOMKa KpunTO- 
rpac|DCKM CB"bp3aHM K/iK>noBe (ny6/ikmeH v\ /lwneH) m, ne KOAnpaHMTe c eAMHua 
k/ik>h AaHHM MoraT Aa ce AeKOAnpaT caMO c Apyrna. Cera me pa3r/ieAaMe b 
AeTaw/ii/i KaK MO>KeM Aa w3no/i3BaMe acuMeTpn^HM KOAnpaiun a/iropwTMM. 

B .NET Framework ca i/iMn/ieMeHTwpaHM a/iropwTMMTe RSA v\ DSA npe3 K/iaco- 
BeTe RSACryptoServiceProvider M DSACryptoServiceProvider. Tbki KaTO 

a^ropnTMMTe 3a acwMeTpwuHO KpunTupaHe ca mhoto no-6aBHM ot Te3M 3a 
CMMeTpn^HO, He e npeABMAeHO Te Aa pa6oTHT c cryptostream. 

MHCTaHLiMpaHe Ha AOcraBHMK3a acnMeTpnHHO KpunTupaHe 

HeKa bmamm KaK ce i/mcraHUkipa AOcraBni/iK 3a ackiMeTpwuHO KpunTupaHe v\ 
AeKpunTupaHe: 



// Instantiate asymmetric encryption provider 
RSACryptoServiceProvider rsaProvider = new 
RSACryptoServiceProvider ( ) ; 



CbC Cb3AaBaHeTO Ha RSACryptoServiceProvider aBTOMaTMUHO ce reHepupaT 

ABOMKa K/iionoBe m Hana/ieH BeKTop. B KOHCTpyKTopa He CMe 3aAa/iw A"b/i>Kki- 
HaTa Ha K/iK>na v\ 3aTOBa ce reHepupa k/ikdh c At/iwi/maTa no noApa36npaHe - 
1024 6nTa. 

3a RSA K/iiOHOBeTe 

MuHMMa^Ha A"b^>KMHa Ha RSA k/ikdh, komto MO>KeM Aa 3aAaAeM, e 384 6nTa, a 
MaKCkiMa/iHaTa - 16384. CrbnKaTa Me>KAy no3BO/ieHi/iTe ctomhoctm e 8 6kiTa. 



846 nporpaMnpaHe 3a .NET Framework (tom 2) 

/l"b/i>KkiHaTa Ha K/iK>na onpe,qe/ifl MaKCMMa/iHWfl pa3Mep Ha 6ai/iTOBaTa nope- 
fluua, koato MO>Ke fla 6"bfle KpunTupaHa. 3a fla onpefle/ii/iM to3m pa3Mep 
Tpa6Ba fla M3BaAMM hmc/ioto 11 ot pa3Mepa Ha K/iK>na b 6awTOBe. 

TaKa HanpuMep c k/ikdh c fl"b/i>KkiHa ot 128 6awTa (1024 6nTa) MO>KeM fla 
KpunTkipaMe 128 - 11 = 117 6aMTa, a aKO flt/iwkmaTa Ha K/iK>na e 256 6aMTa 
(2048 6nTa) MaKCMMyM-bT e 256 - 11 = 245 6aMTa. 

CnopeA cneuncpMKauMMTe Ha RSA Labs, 3a fla e curypeH K/iK>n"bT noHe ao 
2010 roflMHa, tom Tpa6Ba fla e c MkiHkiMa/iHa fl"b/i>Ki/iHa ot 1024 6nTa, noHe 
2048 6nTa flaBaT curypHOCT flo 2030 rofli/ma, a 3072 6nTa flt/iwkma e 
MMHUMyMtT 3a K/iion, komto fla e cwrypeH cnefl 2030 roflMHa. Te3M ctomhoctm 
ca npn6^M3MTe^HM v\ Ba>KaT eflMHCTBeHO, aKO KOMniOTbpHaTa npon3BOflkiTe/i- 
hoct npoflt/iwaBa fla ce yBe/iwuaBa no 3aKOHa Ha Myp. 

ripaBki/iOTO "no-fl"b^rnflT k/ikdh e no-flo6"bp" He BMHarn e flo6"bp BOflan, Tbv\ 
KaTO 6e3pa3C"bflHO ro/ieMMTe K/iK>noBe 3a6aB*iT b ro/iflMa creneH o6pa6oTKaTa 
Ha flaHHMTe 1/1 M3MCKBaT npeKOMepHO ro/ieMki pecypcu. ripn M3rpa>KflaHeTO Ha 
BCAKa cucTeMa Tpa6Ba fla ce HanpaBM aHa/iki3 KaicbB BapnaHT e Haki-flo6"bp. 

kl3B/iimaHe Ha K/iiOHOBe 

3a fla no/iyni/iM CTOMHOCTMTe Ha reHepupaHMTe K/iK>noBe MOxeM fla no/i3BaMe 
MeTOfla ExportParameters(booi) . Hpe3 6yneB napaMeTbp 3aflaBaMe fla/iw fla 
ce M3B/iene v\ /imuhmat k/ikdh v\j\v\ caMO ny6/innHMflT. 



RSACryptoServiceProvider rsaProviderl = 
new RSACryptoServiceProvider ( ) ; 

// Export keys and store them in RSAParameters 
RSAParameters bothKeys = rsaProvider . ExportParameters ( true) ; 
RSAParameters publicKey = rsaProvider . ExportParameters ( false) 

RSACryptoServiceProvider rsaProvider2 = 

new RSACryptoServiceProvider ( ) ; 
// Import keys to another RSACryptoServiceProvider 
rsaProvider2 . ImportParameters (publicKey) ; 



B ropHMfl npuMep i/i3B/ii/maMe ny6/ikmHi/i*i k/ikdh m ro 3aflaBaMe Ha flpyr 
KpunTupaiu o6eKT. 3a ctxpaHflBaHe Ha CTOMHOcrra Ha K/iK>na M3no/i3BaMe 

06eKT OT Tkin RSAParameters. 

flpyro no/ie3HO cpeflCTBO e B"b3MO>KHOCTTa fla ce ki3B/ikmaT ny6/iwnHkifl k/ikdh/ 
ABOMKaTa K/iionoBe b XML hm3, 3a B3anMOfleMCTBne c flpyrn npw/io>KeHkifl. Eto 
KaK M3Me>Kfla no/iyneHi/isiT XML hm3 3a Hai/i-K"bCi/m B"b3MO>xeH RSA k/ikdh - 384 
6nTa: 



// Export keys to XML 
RSACryptoServiceProvider rsaEncoder = new 

RSACryptoServiceProvider (384) ; 
string keys = rsaEncoder . ToXmlString (true) 



HnaBa 26. CurypHOCT b .NET Framework 847 
Eto m cbfl"bp>KaHMeTO Ha npoMeH/ikiBaTa keys: 



<RSAKeyValue> 

<Modulus>4odc9GTIkSlWlX94pE/ythvB6ASZsU2f5z 

8xOLxhoOzjaJZPgG+LrRzoxIrjV0NP</Modulus> 

<Exponent>AQAB</Exponent> 

<P>8 6S118 4iiIxqW8pilGlJtJnVszKVPeEL</P> 

<Q>7gRzHNNiKtQvvb619I9Z7tR9RzLHkZlN</Q> 

<DP>uvuVQcO5TQI2Peu8nTqibjABiV0wnCSx</DP> 

<DQ>INTcTA2cbOv3 6eR01NdxQFBvN3L5tEvB</DQ> 

<InverseQ>tFfBlzDmvIdgT6BDavVTLkwZb8bZvOHE</lnverseQ> 

<D>RKq3uLWcPrW5rroXPeemMSG047oRRLe8gQD7z9+8 

vJlb04Sz42QHhnfPnBlH8H0x</D> 

</RSAKeyValue> 



M3B/ikmaMe CTOMHOCTTa Ha Haw-icbci/ifl B"b3MO>KeH K/iion c ue/i nper/ieflHOcr. 
npeflCTaBflHeTO e BMHarn b cbiuna <£opMaT, npoMeHsi ce eflMHCTBeHO A"b/i>Kki- 
HaTa. 

KpMnTMpaHe m AexpHnTHpai-ie Ha cbo6uj|eHiie 

HeKa BMflMM npuMep 3a KpunTupaHe Ha cbo6meHi/ie v\ fleKpunTupaHeTO My. 
HeKa KptCTMM M3npaiua4a AceH a no/iynaTe/iflT - Bopuc. AceH MMa XML <\>av\n 

borisPBK.xml, C"bA"bp>KaiU ny6/lklHHI/lfl K/1KDH Ha BopMC. BopMC MMa CBOflTa 
ABOMKa ny6/lMHeH//lMHeH K/1KDH B"bB (fcaki/ia borisKeyPair.xml. 

Eto KaK AceH Moxe p,a Cb3p,ap,e TawHO cbo6meHne 3a Eopnc: 



// Instantiate asymmetric encryption provider 
RSACryptoServiceProvider rsaProvider = new 
RSACryptoServiceProvider ( ) ; 

// Convert input to byte array 

byte [ ] toEncrypt = Encoding . Unicode . GetBytes ( "TaiiHO cBo6meHne") ; 

// Load Boris' public key 

XmlDocument xmlPBKey = new XmlDocument () ; 

xmlPBKey. Load ( "borisPBK.xml") ; 

rsaProvider . FromXmlString (xmlPBKey. InnerXml ) ; 

// Call Encrypt ( ) method to do actual encryption 

byte [ ] encrypted = rsaProvider . Encrypt (toEncrypt, false); 

// Save the encrypted message 

FileStream fs = new FileStream ( "encrypted_message . txt" , 

FileMode. Create) ; 
using (BinaryWriter bw = new BinaryWriter ( f s ) ) 

{ 

bw. Write (encrypted. Length) ; 

bw. Write (encrypted) ; 
} 



848 flporpaMnpaHe 3a .NET Framework (tom 2) 



// Result: encrypted_message.txt contains encrypted message 



TbM ioto c"bo6iueHneTO e 3a Bopnc, Tpa6Ba fla M3no/i3BaMe HeroBna ny6/iwneH 
k/ikdh. 3a fla nponeTeM K/iK>na ot XML cpaw/ia cb3,qaBaMe XmlDocument v\ 
3ape>KflaMe b Hero XML npeflcraBAHeTO Ha ny6/iwnHkifl k/ikdh. Cnep, TOBa ro 
3aAaBaMe Ha RSA flocraBUMKa rsaProvider m KpunTupaMe cto6iueHneTO. 
rio/iyneHaTa 6awTOBa nopefli/iua cbxpaHABaMe bbb cpaw/ia encrypted_ 
message.txt, KaTO ntpBO 3anncBaMe HeMHaTa fl"b/i>KMHa. 

Cnefl KaTO no/iynw Cbo6meHi/ieTO, Bopnc 6m Morb/i fla ro npoBepn no c/ieflHwa 
Ha^MH: 



// Instantiate new asymmetric encryption provider 
RSACryptoServiceProvider rsaProvider = new 
RSACryptoServiceProvider ( ) ; 

// Load Boris' private key (key pair) 
XmlDocument xmlPKey = new XmlDocument () ; 
xmlPKey . Load ( "borisKeyPair . xml" ) ; 
rsaProvider . FromXmlString (xmlPKey. InnerXml ) ; 

// Load the encrypted message 

byte [ ] encrypted; 

FileStream fs = new FileStream ( "encrypted_message . txt" , 

FileMode.Open) ; 
using (BinaryReader br = new BinaryReader ( f s ) ) 

{ 

int msgLenght = br . Readlnt32 ( ) ; 

encrypted = new byte [msgLenght] ; 

encrypted = br . ReadBytes (msgLenght ) ; 
} 

// Call Decrypt ( ) to get the decrypted byte array 

byte [ ] decrypted = rsaProvider . Decrypt (encrypted, false) 

// Convert byte array to Unicode character array 
string sMessage = Encoding . Unicode . GetString (decrypted, 

0, decrypted. Length) ; 
// Result: sMessage contains "TaiiHO cBo6meHMe" 



Bopnc 3aflaBa flBOMKaTa cm K/iK>noBe Ha RSA flocraBUMKa rsaProvider, 3a fla 
6"bfle M3B"bpiueHO fleKpunTupaHeTO c HeroBna /lkmeH k/ikdh. Cnep, TOBa B"b3cra- 
HOBABa M3npaTeHaTa 6awTOBa nopeflnua v\ M3BMKBa MeTOfla Decrypto, 3a fla 
no/iynw opwrwHa/iHOTO Cbo6meHkie. 

Pa6oTa c mmc|dpobm noflnncn 

B .NET Framework ca MMn/ieMeHTwpaHki flBa a/iropi/irbMa 3a uncppoB noflnnc: 
RSA m DSA. 3a uncppoBO noflnncBaHe MOxeM fla M3no/i3BaMe v\ XML noflnncn, 
komto me pa3r/ieflaMe b cneflBamaTa ceKuna. 



HnaBa 26. CurypHOCT b .NET Framework 849 

RSA a/iropkiTbMvr ce npi/i/iara KaKTO 3a acuMeTpn^HO KpunTupaHe Ha ashhh, 
TaKa m 3a cb3flaBaiHe Ha umc|dpobm noflnncn. DSA (Digital Signature Algorithm) 
ce M3no/i3Ba caMO 3a cb3AaBaHe Ha umfcpoBki noAnncn v\ e cb3flaAeH c v\p,es\Ta 
Aa CTaHe CTaHAapT 3a noAnncBaHe. 

K/iacoBeTe, komto MMn/ieMeHTi/ipaT Te3M ABa a/iropwrbMa, ca cbOTBeTHO 

RSACryptoServiceProvider M DSACryptoServiceProvider. 1/1 ABaTa K/iaca 

npeAOCTaBAT 3a cb3AaBaHe Ha noAnwc MeTOAM signDataO v\ signHashO v\ 3a 

npOBepKa Ha nOAnMC MeTOAH VerifyData() V\ Verif yHash ( ) . 

noAnucBai-ie Ha aokymcht - npMMep 

Eto KaK MO>KeM Aa noAnniueM TaMHO cbo6meHi/ie npe3 a/iropwTbMa RSA: 



using System. Security. Cryptography; 
using System. Text; 

// Instantiate provider and generate random key pair 
RSACryptoServiceProvider rsaProvider = new 

RSACryptoServiceProvider ( ) ; 
byte [ ] dataToSign = 

Encoding . Unicode . GetBytes ( "cbobmeHMe 3a noflnwcBaHe 

HashAlgorithm hashAlg = HashAlgorithm. Create ( "MD5" ) ; 
byte [ ] result = rsaProvider . SignData ( 

dataToSign, 0, dataToSign . Length, hashAlg); 
// Result: result [] contains the signature 



B npMMepa Cb3AaBaMe 06eKT OT Tkin RSACryptoServiceProvider, no CbLUMfl 

Ha^MH KaTO b npuMepa 3a acwMeTpwuHa KpnnTorpac|DMfl b npeAHWHaTa ceKuna. 
ripeo6pa3yBaMe cbo6meHi/ieTO, KoeTO me noAnncBaMe, b 6ai/iTOBa nopeAHua, v\ 
cb3AaBaMe o6eKT 3a xeiu a/iropwTbMa. To3m o6eKT me 6"bAe M3no/i3BaH ot 
rsaProvider 3a cb3AaBaHe Ha xeiu CTOMHOCTTa, koato nocne me 6"bAe 
KpunTupaHa c /ii/mHi/ifl k/ik>h. MeTOAtT SignDataO Bptiua unc|DpoBMflT noAnnc 
KaTO 6atiTOBa nopeAnua. 

OTHOBO npn l/IHMU.wa/ll/l3au.l/mTa Ha 06eKTa OT Tkin RSACryptoServiceProvider 

ce reHepupa ABOMKa K/iionoBe. B pea/iHO npn^OKeHne Tpa6Ba Aa 3aAaAeM 
HaujuflT /lkmeH k/ikdh, 3a Aa 6"bAe sai\v\p,eu noAnwcbT. 

noflnMCBaHe Ha xeiu ctomhoct Ha aokymcht - npMMep 

BMecTO Aa 3aAaBaMe AOKyMeHTa v\ a/iropwTbM 3a xeiunpaHe, MOxeM caMM Aa 
no/iynwM xeiu KOAa Ha c"bo6iueHneTO v\ Aa ro noAnniueM. Eto KaK MO>KeM Aa 
noAni/iujeM xeiu CTOMHOCTTa Ha eAHO cbo6meHkie (HanpuMep AoroBop) npe3 
DSA a/iropi/iTbMa: 



using System. Security. Cryptography; 
using System. Text; 



850 flporpaMnpaHe 3a .NET Framework (tom 2) 



// Instantiate provider and generate random key pair 
DSACryptoServiceProvider dsaProvider = new 
DSACryptoServiceProvider ( ) ; 

byte [ ] msgBytes = Encoding . Unicode . GetBytes ( 
"floroBop 3a noflnwcBaHe" ) ; 

// Extract SHA1 hash 

SHA1 shaHasher = new SHAlCryptoServiceProvider ( ) ; 

byte [ ] hashToSign = shaHasher . ComputeHash (msgBytes ) ; 

// Sign it 

string hashName = CryptoConf ig .MapNameToOID ( "SHA1" ) ; 

byte [ ] digSig = dsaProvider . SignHash (hashToSign, hashName) 

// Verify signature 

bool isValid = dsaProvider .VerifyHash ( 

hashToSign, hashName, digSig) ; 
// Result: isValid is true 



ritpBO cb3AaBaMe dsaProvider m aBTOMaTMUHO 3a Hac ce reHepupa flBOMKa 

K/lKDHOBe C yKa3aHaTa fl"b/l>KI/IHa. DSACryptoServiceProvider pa60TM C K/1K>- 
40Be c pa3Mep Me>Kfly 512 v\ 1024 6nTa v\ crbnKa 64 6kua. 

C/ieA TOBa B3eMaMe xeiu CTOWHOCTTa Ha cbo6meHkieTO. DSA BMHarn pa6oTM c 
SHA1 xeiu ctomhoctm. BtnpeKM ne ce onaKBa fla noflafleM SHA1 xew 
ctomhoct, Tpa6Ba fla 3aflafleM mmcto Ha xewwpawHfl a/iropi/iTbM. Hpe-3 MeTOfla 

MapNameToOID (string) OT KpaTKOTO MMe B3MMaMe T04HOTO 0603HaneHkie Ha 

a/iropwTbMa. HanpuMep aKO ro M3BMKaMe c "SHA512", "SHA-512" v\nv\ 
"System. Security. Cryptography. SHA512", BMHarM nonynaBaMe KOHKpeTHaTa 
ctomhoct, o6o3Ha4aBaiua a/iropwTbMa - "2.16.840.1.101.3.4.3". 

Ha SignHash () noflaBaMe KaTO napaMeTpn xeiu crofiHOCTTa Ha cbo6iueHneTO 
m to4hoto o6o3Ha4eHne Ha xew a/iropi/iTbMa. BtpHaTMAT pe3y/iTaT e nope- 
fluua ot 6aMTOBe, cbfltpwawa uncppoBna noflnnc. 

Cbc cbOTBeTHMfl MeTOfl VerifyHash o npoBep^BaMe fla/iki noflnwcbT e Ba/iw- 
fleH. T"bki KaTO M3no/i3BaMe othobo dsaProvider, komto Bene kiMa reHepupaHa 
ABOMKa K/iK>noBe, HflMa Hy>Kfla fla vv\ 3aflaBaMe M3pn4HO. Ako ki3no/i3BaMe 
flpyr o6eKT 3a npoBepiOTa, Tpa6Ba fla My 3aflafleM ny6/ikmHkisi k/ikdh Ha 
ZlMUeTO, nOflnwca/10 Cb06weHkieTO npe3 ImportParameters(DSAParameters) 
M/1M FromXMLString ( string) . 

XML noflriMCM 

.NET Framework MMn/ieMeHTkipa TexHO/iorki5rra XML-Signature (XMLDSIG) Ha 
W3C (World Wide Web Consortium) 3a noflnncBaHe Ha XML flOKyMeHTM. XML- 
Signature no3BO^ABa noflnncBaHe Ha XML flOKyMeHTM v\ pecypcn b MHTepHeT, 
KaTO noflnncbT e v\nv\ OTfle/ieH XML flOKyMeHT v\nv\ ce o6eflMHABa c noflnnc- 
BaHMfl o6eKT b eflMH XMLflOKyMeHT. 



HnaBa 26. CurypHOCT b .NET Framework 851 

noflo6HO Ha cnoco6nTe 3a noflnncBaHe, komto Bene pa3r/ie,qaxMe, XML 
noflnncnTe flOKa3BaT npon3xofla v\ MHTerpnTeTa (ziMnca Ha npoMeHu) Ha eflHO 
C"bo6iueHne. Cneu.MC|3MHHOTO 3a tax e ne ca npMrofleHM 3a pa6crra c XML 
cJDaki^OBe m MMaT cneuna^HM cJDyHKunn 3a pa6oTa c MHTepHeT pecypcu. 

EflHO ot ocHOBHMTe mm Kanecma e B"b3MO>KHOCTTa 3a noflnncBaHe Ha nacr ot 
XML flOKyMeHT. Mo>KeM fla noflnniueM caMO nacr ot pecypcuTe b flOKyMeHTa, 
He3aBMCMMO ot TMna mm. EflMH noflnnc MO>Ke fla yflocroBepyiBa nopeflnua ot 
cmmbo/im, nopeflnua ot 6aMTOBe v\ onpefle/ieHM e/ieMeHTM OTflOKyMeHTa. 

ToBa KanecrBO Ha XML noflnncnTe e mhoto noflxoflaiuo, KoraTO HanpuMep b 
flafleH 6n3Hec npou.ec ce npeflaBa no Bepura XML flOKyMeHT, v\ Ha BceKM eTan 
ot HeroBOTO AOiTb/iBaHe, nvwxejo v\nv\ OT,qe/ia noflnncBa caMO CBOMTe npoMeHM. 

CTpyKTypa Ha XML noflnnca 

CTpyKTypaTa Ha XML-Signature noflnnca e KOMn/ieKCHa v\ H^Ma fla ce cnnpaMe 
noflpo6HO Ha Hea. IHe pa3r/ieflaMe HaM-o6iunfl v\ bi/ia, komto e noKa3aH Ha 
cJDnrypaTa. 3HaK"bT "?" 03HanaBa Hy/ia v\nv\ eflMH e/ieMeHT, "+" eflMH v\nv\ 
noBene, a "*" - Hy/ia v\nv\ noBene. 



<Signature ID?> 
<SignedInf o> 

<CanonicalizationMethod/> 
<SignatureMethod/> 
(<Reference URI?> 
(<Transf orms>) ? 
<DigestMethod> 
<DigestValue> 
</Ref erence>) + 
</SignedInf o> 
<SignatureValue> 
(<KeyInfo>) ? 
(<Object ID?>)* 
</Signature> 



E^eMeHTbT signedinfo yi<a3Ba KaKBO e noflnncaHO v\ c kom a/iropnTMM. B 
Hero ce cbA"bp>Ka yKa3aTe/i kbm pecypca/pecypcuTe, komto ca noflnncaHM, v\ 
MHCJDopMauMfl 3a M3no^3BaHMfl a^ropnTbM 3a xeiunpaHe. signaturevalue e 
caMMAT noflnnc b Base64 KOflnpaiua cxeMa. Keyinfo e He3afl"b/i>KMTe/ieH e/ie- 
MeHT, komto npeflocraBH ny6^M4HMAT k/ikdh, npe3 komto fla ce npoBepM nofl- 
nMca.AKO tom /lMncBa, Tpa6Ba ot KOHTeKCTa fla e acho KaKbB k/ikdh fla ce 
M3no/i3Ba. ripM cxeMaTa, b koato noflnMCbT cbfltpwa noflnMcaHMa o6eKT, Ha 
mactoto Ha <object id> ce HaMMpa CTOMHOCTTa Ha o6eKTa. KaKTO me bmamm 
no-HaTaT"bK, b .NET Framework MMa K/iacoBe, ctOTBeTCTBaiuM Ha noBeneTO ot 
e^eMeHTMTe b noflnMca. Hpe3 CBOMCTBaTa Ha Te3M K/iacoBe MO>KeM fla kohtpo- 
ziMpaMe flMpeKTHO c"bfl"bp>KaHMeTO Ha noflnMcaHMa flOKyMeHT. 



852 nporpaMnpaHe 3a .NET Framework (tom 2) 

BnflOBe XML-Signature noflnncn 

flecpMHupaHMTe b craHAapTa noflnncn ca Tpn Bwp,a. KoraTO ue/ikiAT noflnncBaH 
o6eKT ce HaMupa b paMKMTe Ha XML noAnnca, HapwuaMe noAnnca onaxoBauji 
(enveloping signature). KoraTO noflnncbT e nofle/ieMeHT b XML flOKyMeHTa, ro 
Hapn^aMe onaKOBaH (enveloped signature). Mo>xeM fla i/i3no/i3BaMe onaKO- 
BaH XML noAnnc, 3a p,a noAnmueM nacr ot v\i\v\ unn XML AOKyMeHT. Ako 
noflnncbT e OTRenen XML AOKyMeHT TOBa e TaKa HapeneHMAT o6oco6eH 
noflnnc (detached signature). KaTO TaKMBa MO>KeM p,a cnwTaMe v\ noAnncnTe, 
komto pa3MeAaxMe b npeAHWHaTa ceKu.i/m - RSA v\ DSA. ripn tax CTOMHOOTa 
Ha noAnnca e ojp,ei\eua ot cto6iueHneTO. 

3a Aa noAnniueM XML AOKyMeHT Tpa6Ba p,a MHCTaHunpaMe o6eKT ot Tun 
signedxmi. To3M o6eKT npeAcraB/iABa eAMH noAnncaH AOKyMeHT v\ OTroBapa 
Ha cxeMaTa noKa3aHa no-rope. Hpe3 CBOMCTBaTa v\ MeTOAHTe cm signedxtni hm 
no3BO^ABa Aa pa6oTMM c noAe/ieMeHTMTe My, KaKTO me bmamm b npuMepnTe. 

noAnMCBaHe m npoBepKa Ha XML c onaxoBaui noAnnc - npHMep 

ritpBO me pa3MeAaMe noAnncBaHe Ha XML cpaw/i c onaKOBaiu noAnnc. Pe3yn- 
TaTtT me 6"bAe hob XML cpai/i/i, c r/iaBeH e/ieMeHT signature, komto me 
cbAtpwa u^i/iaTa onwcaTe/iHa MHCpopMauna 3a i/i3no/i3BaHHTe a/iropkiTMw 3a 
xeiunpaHe v\ noAnncBaHe v\ KaTO cbom noAe/ieMeHT me CbAtpwa opi/iri/iHa/iHi/m 
XML cpaw/i: 



using System. Security. Cryptography; 
using System. Security. Cryptography. Xml; 
using Xml = System. Security . Cryptography . Xml; 
using System. Xml; 

// Load XML file to sign 

XmlDocument xmlDoc = new XmlDocument ( ) ; 

xmlDoc . Load ( "report . xml" ) ; 

// Create name for the signed element and place it 
// in a System. Security . Cryptography . Xml . DataObj ect 
Xml . DataOb j ect dataObj = new Xml . DataObj ect () ; 
dataObj.Data = xmlDoc . ChildNodes ; 
dataObj. Id = "report"; 

// Identify what is to be signed 
Reference reportRef = new Referenced ; 
reportRef . Uri = "#report"; 

// Assign the object to sign and its 
// identifier to the SignedXml object 
SignedXml signedXml = new SignedXml ( ) ; 
signedXml . AddRef erence ( reportRef) ; 
signedXml .AddObj ect (dataObj ) ; 

// Create the signing algorithm and generate keys 



HnaBa 26. CurypHOCT b .NET Framework 853 



DSA dsaProvider = new DSACryptoServiceProvider ( ) ; 

// Export key to XML file 

// 'false' means export only the public key 

string publicKey = dsaProvider . ToXmlString ( false) 

XmlDocument xmlKey = new XmlDocument ( ) ; 

xmlKey . LoadXml (publicKey) ; 

xmlKey . Save ( "key. xml" ) ; 

// Assign the algorithm and keys to be used 
signedXml . SigningKey = dsaProvider; 

// The SignedXml object does the signing 
signedXml . ComputeSignature ( ) ; 

// Save the signature to file 

XmlDocument signedXmlDoc = new XmlDocument ( ) ; 
signedXmlDoc . LoadXml ( signedXml . GetXml ( ) . OuterXml ) 
signedXmlDoc . Save ( "xmlsig . xml" ) ; 



KaK pa6oTM npnMepi>T? 

B flafleHMfl npuMep ntpBO cb3flaBaMe o6eKT ot Tun signedXml. C/iefl TOBa 
3ape>KflaMe XML flOKyMeHTa, komto MCKaMe fla noflnniueM, b o6eKT ot Tun 
XmlDocument. ToBa hm no3BO/isiBa Ha c/ieflBaiuaTa crtnKa fla B3eMeM cnwcbK c 
HeroBMTe e/ieMeHTM v\ fla ro 3aflafleM Ha dataobj - o6eKT ot Tun system. 

Security. Cryptography. Xml. DataObject, KOMTO npeflCTaB/lflBa naCTTa OT 

XML noflnnca, KtfleTO ce HaMupa noflnncBaHMAT AOKyMeHT. ToBa Ba>KM 
eflMHCTBeHO 3a onaKOBaiuna noflnnc, tbm KaTO caMO npn Hero noflnMCBaHMAT 
AOKyMeHT ce HaMupa b paMKMTe Ha Signature e/ieMeHTa. Ha cbomctboto id Ha 
dataobject 3aflaBaMe MMe, KoeTO fla xapaKTepn3npa noflnncBaHMAT flOKy- 

MeHT. 

Cb3flaBaMe Reference o6eKT, komto hm flaBa flocTtn flo Reference ceKun^Ta b 
noflnnca. 3aflaBaMe Bene M36paHOTO b dataob j . id MMe, KaTO npn6aBAMe "#" 
OTnpefl, 3a fla o6o3HanMM, ne HanMeHOBaHneTO ce OTHaca ao e/ieMeHT b 
paMKMTe Ha b cbo6iueHneTO, a He e BtHweH MfleHTMCJDMKaTop. 

C/iefl KaTO CMe yKa3a/iM KaKBO me noflnncBaMe, 3aflaBaMe a/iropMTbMvr v\ 
K/itoutT, komto me ce M3no/i3BaT. MHCTaHunpaMe o6eKT ot Tun 

DSACryptoServiceProvider () , KOMTO npn Cb3flaBaHeTO CM aBTOMaTMUHO 

reHepupa flBOMKa ny6/iMneH//iMneH k/ikdh. riy6/iMHHMflT k/ikdh me hm Tpa6Ba 3a 
fla npoBepuM b nocneflCTBMe noflnnca v\ 3aTOBa ro 3ana3BaMe b XML <fcaM/i. 
TtM KaTO TOBa e pyTMHHa onepauna, K/iacvr dsa MMa MeTOfl, komto hm flaBa 

HM3 B"bB CJDOpMaT XML C MHCJDOpMaUMfl 3a K/lKDHa. MeTOfl"bT e ToXmlString( 

bool) m npe3 eflMHCTBeHMfl My napaMeTbp KOHTpo/iMpaMe fla/iM b HM3a ce 
BK/iK>nBa m /1M4HMA k/ikdh (napaMeTbp true) m/im caMO ny6^M4HMAT (napaMe- 
Tbp false). 



854 nporpaMnpaHe 3a .NET Framework (tom 2) 

Cbomctboto Ha SignedXml, Ha KoeTO Tpa6Ba fla 3afla,qeM a/iropwrbMa v\ 

K/lKDna, e SignedXml . SigningKey. 

C/ieA KaTO CMe 3afla/iw KaKBO v\ KaK me noflnwcBaMe M3BMKBaMe MeTOfltT Ha 

SignedXml ComputeHash ( ) , KOMTO M3B"bpilJBa CaMOTO nOflnMCBaHe. Pe3y/lTaTbT 

e b XML cpopMaT v\ MO>KeM fla ro i/i3B/ieneM npe3 MeTOfla Getxmio Ha 

SignedXml. 

KaK M3r/ie>Kfla noAnucaHunT XML? 

HeKa M3nt^HMM npuMepa, 3a fla bmamm KaK M3r/ie>Kfla noflnncaHMAT XML 
AOKyMeHT. Eto npuMepeH BXOfleH XML flOKyMeHT, c komto me M3B"bpujMM 
npo6HO noflnncBaHe: 



report . xml 



<report> 

<title>Report</title> 

<details>This is an important report</details> 
</report> 



Eto KaK 6m Morb/i fla M3r/ie>Kfla ropHMAT XMLflOKyMeHT cnefl noflnncBaHeTo: 



xmlsig. xml 



<Signature xmlns="http: //www. w3 . org/2 0/0 9/xmldsig#"> 
<SignedInf o> 

<CanonicalizationMethod 
Algorithm="http: //www. w3 . org/TR/2 001/REC-xml-cl4n-2 0010315" /> 

<SignatureMethod 
Algorithm="http: //www. w3 . org/2 0/0 9/xmldsig#dsa-shal" /> 
<Reference URI="#report"> 
<DigestMethod 
Algorithm="http: //www. w3 . org/2 0/0 9/xmldsig#shal" /> 

<DigestValue>iqlfiCvzg4 9hrUIiyy8ToAOsWE8=</DigestValue> 
</Ref erence> 
</SignedInf o> 

<SignatureValue>t7a9TUfN7N7uyFmriXsYPMNdhV0NTREXNc6thBu+9B7Jz 
7z54mVckw==</SignatureValue> 
<Object Id="report"> 
<report xmlns=""> 

<title>Report</title> 

<details>This is an important report</details> 
</report> 
</Object> 
</Signature> 



ripn noflnncBaHeTO ce reHepupaT v\ cnynai/iHa flBOMKa DSA ny6/iwneH v\ /lwneH 
k/ikdh, KaTO ny6/ikmHkiflT ce 3anncBa bbb cpaw/ia key. xml. Eto KaK 6m Morb/i fla 
M3Me>Kfla T03M ny6/ikmeH k/ikdh: 



HnaBa 26. CurypHOCT b .NET Framework 855 



key. xml 



<DSAKeyValue> 

<P>nbGhksQHc5XvaCFtRpRGYoJNZevu5UE41gkYVAjC5HlNedp714fpfxRPApg 
L+ko7yOV9t52BjReJMqSlDmt+U7xQC8 3SmRiRby9yN7W2ngct/Z6Ut8Phi2 67RkT 
kwjHkRUjxaoNuuX5sdc/L/AhlSWuklvlPzN3SAwARojhqqD0=</P> 

<Q>y6qq3MzI07DY3q5+S2DNTpbZ2aE=</Q> 

<G>DaeLxKxnEli+ZID9V+7/Fk5 8ne3kSBkThA/klo7AOSSLn90iuMaf jL9jk6L 
rlFov8evFF0JetIRWUf9JKi6azK9JdvJ97L0soPQilfakuLyzdtjXD9xHJ9RWkmd 
8Lb2EogaLaiOgGYMXYjafIMGbxYlXWc9moUV+IKb8E68QaOQ=</G> 

<Y>QVLDSdSnDyyevvSZNJdr+fZF3IDPtlQJwzWPBdzA0 9pRp3VZeoRfLELWJYN 
c0js+sM9BzMIjEiKuOovTZVsbhguSSulJQTOyhjhpdwlwq0duxq+RuoQB4DTlu7v 
Mli2WWMb01QzfkB7x5y4/eWL7 4 8L+lkb7 5GmpYXayi/8i4vg=</Y> 

<J>xjbXeC8 4pQs57anel0CIN92 8jr+ffDXEQGz9kUo+csLB69DRCb5PAmm7prk 
Xb2Qvu+Lah+yyXK/kh0Ov6BHS0MsrwqDFo7fLFJXzg4XMQjLtV/skeoTwDRO/plR 
2vCwDcpuE/leESZmr2xa8</J> 

<Seed>Deui/8/vwZflDF9vnQ0 0Q8suJ5k=</Seed> 

<PgenCounter>AVw=</PgenCounter> 
</DSAKeyValue> 



npoBepKa Ha XML noflnnc - npMMep 

HeKa cera bmamm iok MO>KeM fla npoBepuM curHaTypaTa Ha c"b3flafleHMfl no- 
rope noflnncaH XML flOKyMeHT. 3a ue/ua hm Tpa6BaT noflnncaHMfl flOKyMeHT 
(tom ctA"bp>Ka opi/iri/iHa/iHMfl KaTO nacr ot ce6e cm) m ny6/ikinHMfl k/ikdh, 
M3no^3BaH npn noflnncBaHeTO. fla pa3r/ieflaMe cnep,Hv\n npuMepeH koa 3a 
npoBepKa Ha XML noflnnca: 



using System. Security. Cryptography; 
using System. Security. Cryptography. Xml; 
using System. Xml; 

// Create object representing signed document 
SignedXml signedXml = new SignedXml ( ) ; 

// Load the signature we saved in the previous example 
XmlDocument xmlDoc = new XmlDocument ( ) ; 
xmlDoc . PreserveWhitespace = false; 
xmlDoc . Load ( "xmlsig . xml" ) ; 

// Extract the signature as node collection 
XmlNodeList sigNodeList = 

xmlDoc . GetElementsByTagName ( "Signature" ) ; 
signedXml . LoadXml ( (XmlElement ) sigNodeList [ 0] ) ; 

// Create instance of algorithm to verify signature 
DSA dsaProvider = new DSACryptoServiceProvider ( ) ; 

// Load the public key we stored during signing 
XmlDocument xmlKey = new XmlDocument ( ) ; 



856 flporpaMnpaHe 3a .NET Framework (tom 2) 



xmlKey . Load ( " key . xml " ) ; 

// Assign the original key to new instance of DSA 
ds a Provider . FromXmlString (xmlKey . OuterXml ) ; 

// Create Keylnfo to store public key info 

Keylnf o myKI = new Keylnfo ( ) ; 

// Get the public key value to use for verification 

myKI . AddClause (new DSAKeyValue (dsaProvider ) ) ; 

signedXml . Keylnf o = myKI; 

// Check the signature 

bool isValid = signedXml . CheckSignature () ; 

Console . WriteLine (isValid) ; 



KaK pa6oTM npnMepi>T? 

3a fla M3B"bpujMM npoBepiOTa othobo cb3flaBaMe o6eKT ot Tun signedXml. 
nocpeflCTBOM xmiDocument 3ape>KflaMe b Hero nacrra Signature (koato 
BK/iiouBa uenwnj AOKyMeHT, tbm KaTO i/i3no/i3BaMe onaKOBaiu noflnwc). Ha 

CBOMCTBOTO PreserveWhitespace Ha XmiDocument 06eKTa yKa3BaMe false, 

3a fla 6"bflaT nrHopupaHM npa3HMTe MecTa b flOKyMeHTa. TaKa flopn Me>Kfly 
noflnncBaHeTO v\ npoBepKaTa fla 6"bflaT BMtKHaTM floirb/iHWTe/iHki npa3HM 
MecTa, TOBa HAMa fla nonpenw npoBepiOTa fla 6tfle ycneujHa. Bc^Ka flpyra 
npoMAHa Ha noflnncaHMa AOKyMeHT me HaKapa npoBepKaTa fla He ycnee. 

MHCTaHUkipaMe OTHOBO DSACryptoServiceProvider 06eKT M My 3aflaBaMe 

ny6^M4HMflT k/ikdh ot flBOMKaTa K/iK>noBe, c 4mmto /lkmeH k/ikdh noflnwcaxMe 

C"b06lfleHMeTO. TOBa npaBMM C MeTOfla Ha DSA FromXmlString ( string) , KOMTO 
MHMUMa^M3Mpa DSACryptoServiceProvider C napaMeTpMTe, CbfltpaOLflM ce B 

noflafleHMfl hm3. 

3a fla 3aflafleM K/iK>na Ha signedXml, c"b3flaBaMe o6eKT ot Tun Keylnfo. 
Ct3flaBaMe DSAKeyValue o6eKT, komto npeflcraB/iflBa nofle/ieMeHT Ha dsa m 
ctfltp>Ka ny6^M4HMfl k/ikdh. 3aflaBaMe HOBono/iyneHMAT DSAKeyValue Ha myKi 
o6eKTa. Cera myKi c"bfl"bp>Ka ny6/ikmHkiflT k/ikdh v\ CMe totobm fla ro 3aflafleM 

Ha sXmlDoc. 

M3BMKaMe MeTOfltT CheckSignature ( ) Ha SignedXml, 3a fla ce M3B-bpilJM 

npoBepKa Ha Ba/ikiflHOcrra Ha noflnnca. 

rioflnncBaHe m npoeepKa Ha XML c onaxoBaH noAnnc - npMMep 

HeKa pa3MeflaMe noflnncBaHeTO Ha XML cpaw/i c onaKOBaH noflnnc: 



using System 


Security 


Cryptography; 


using System 


Security 


Cryptography . Xml ; 


using System 


Xml; 




// Load file 


to sign 





HnaBa 26. CurypHOCT b .NET Framework 857 



XmlDocument xmlDoc = new XmlDocument ( ) ; 
xmlDoc . PreserveWhitespace = false; 
xmlDoc . Load ( "report . xml " ) ; 

// Create SignedXml and pass it the XML to sign 
SignedXml sXmlDoc = new SignedXml (xmlDoc) ; 

// Create Reference to set signing options 
Reference reportRef = new Referenced ; 
reportRef . Uri = ""; 

// Specify canonical XML transformation without comments 
Transform xmlTransf orm = new XmlDsigC14NTransf orm ( ) ; 
reportRef . AddTransf orm (xmlTransf orm) ; 

// Specify transformation for enveloped signature 
XmlDsigEnvelopedSignatureTransf orm env = new 

XmlDsigEnvelopedSignatureTransf orm ( ) ; 
reportRef .AddTransf orm (env) ; 

// Pass the settings to SignedXml object 
sXmlDoc . AddRef erence ( reportRef) ; 

// Create DSA asymmetric provider 

DSA dsaProvider = new DSACryptoServiceProvider ( ) ; 

// Store the auto-generated key for later verification 
XmlDocument xmlKey = new XmlDocument ( ) ; 
xmlKey . InnerXml = dsaProvider . ToXmlString ( false) ; 
xmlKey . Save ( "key. xml" ) ; 

// Set signing options to signature object 
sXmlDoc . SigningKey = dsaProvider; 

// Perform signing 

sXmlDoc . ComputeSignature ( ) ; 

// Get resulting signature 

XmlElement xmlDigSig = sXmlDoc . GetXml ( ) ; 

// Add the signature to the original XML file 
xmlDoc . DocumentElement . AppendChild (xmlDoc . ImportNode ( 
xmlDigSig, true) ) ; 

// Remove XML declaration, if any 

if (xmlDoc . FirstChild is XmlDeclaration) 

{ 

xmlDoc . RemoveChild (xmlDoc . FirstChild) ; 

} 



858 flporpaMnpaHe 3a .NET Framework (tom 2) 



// Store the resulting document 
xmlDoc . Save ( "signed_report . xml" ) 



Pa3/im<aTa cnpyiMO npeflnujHMfl npuMep e, ne TyK yKa3BaMe fla ce flo6aBAT flBa 
eneMenja b ceKunaTa TpaHCCpopMaunn Ha XML AOKyMeHTa. Hpe3 Ao6aBHHeTO 

Ha 06eKT OT Tkin XmlDsigC14NTransform 3aAaBaMe TpaHCCpOpMaUMfl Ha XML 

AOKyMeHTa kbm KaHOHkmHa cpopMa v\ 3aAaBaMe TpaHCCpopMauna 3a onaKOBaH 

nOAnMC npe3 06eKTa XmlDsigEnvelopedSignatureTransform. Te3M TpaHC- 

cpopMaunn me ce M3n"b/iHflT npeAH Aa ce M3Btpujn xeiunpaHeTO. 

Othobo 3ani/iCBaMe ny6/ikinHMfl k/ikdh, 3a Aa MOxeM Aa npoBepuM noAnnca, v\ 
M3BMKaMe MeTOAa 3a npecMATaHe Ha noAnnca. flo6aBAMe HOBono/iyneHMAT 
noAnnc, komto e XML e/ieMeHT, b opurnHa^HMfl AOKyMeHT, v\ 3anncBaMe hobma 
AOKyMeHT b XML cpaw/i. Tbi/i KaTO cb3AaBaMe onaKOBaH noAnnc, noAnwcbT ce 
HaMupa b paMKMTe Ha opwrwHa/iHi/mT XML AOKyMeHT. 

Eto KaK MO>KeM Aa npoBepuM p,ai\v\ onaKOBaHna noAnnc, komto cb3AaAOXMe, e 
Ba/iMAeH. 



using System. Security. Cryptography; 
using System. Security. Cryptography. Xml; 
using System. Xml; 

// Load XML document 

XmlDocument xmlDoc = new XmlDocument ( ) ; 
xmlDoc . PreserveWhitespace = false; 
xmlDoc . Load ( "signed_report . xml" ) ; 

// Load the signature element 

SignedXml sXmlDoc = new SignedXml (xmlDoc) ; 

XmlNodeList nodeList = xmlDoc . GetElementsByTagName ( "Signature" ) 

sXmlDoc . LoadXml ( (XmlElement ) nodeList [ 0] ) ; 

// Create DSA asymmetric provider 

DSA dsaProvider = new DSACryptoServiceProvider ( ) ; 

// Load the public key we stored during signing 
XmlDocument xmlKey = new XmlDocument ( ) ; 
xmlKey . Load ( " key . xml " ) ; 
dsaProvider . FromXmlString (xmlKey. OuterXml ) ; 

// Create Keylnfo to store public key info 

Keylnf o myKI = new Keylnfo ( ) ; 

// Get the public key value to use for verification 

myKI . AddClause (new DSAKeyValue (dsaProvider) ) ; 

sXmlDoc . Keylnf o = myKI; 

// Verify signature 

bool isValid = sXmlDoc . CheckSignature ( ) ; 



HnaBa 26. CurypHOCT b .NET Framework 859 

Hpe3 xmiDocioment 3ape>KflaMe noflnncaHMfl AOKyMeHT, komto no/iynwxMe no- 
rope. Hacira Signature ot XML <£aM/ia (koato o6xBaiua uenwn AOKyMeHT) 
3ape>KAaMe b o6eKTa sXmiDoc, c komto npecb3AaBaMe noAnncaHMa AOKyMeHT. 

C"b3AaBaMe AOcraBUkiK Ha ackiMeTpwuHO KpunTupaHe DSA v\ My 3aAaBaMe 
ny6/ikmHi/i*i k/ikdh, KaTO ro npo^MTaMe ot XML cJDaw^a key. xml. Hpe3 o6eKTa 
myKi ot K/iac Keyinfo npecb3AaBaMe ceKUMATa etc croMHOCTTa Ha noAnnca b 
noAnncaHMfl AOKyMeHT, v\ Ha Hen 3aAaBaMe K/iK>na, ki3no/i3BaH ot DSA npn 
noAnncBaHeTO. 

M3BMKBaMe MeTOAa CheckSignature ( ) Ha nOAnncaHMfl AOKyMeHT sXmiDoc, M 

no/iynaBaMe KaTO pe3y/iTaT true. 

rioflnncBaHe m npoeepKa Ha XML c o6oco6eH noflnnc - npnMep 

Cera HeKa pa3r/ieAaMe KaK MO>xeM p,a noAnmueM pecypc b MHTepHeT. IHe 
HanpaBMM o6oco6eH noAnnc, KaTO XML AOKyMeHTa, komto me no/iynwM, me 
c"bA"bp>Ka URI MAeHTnc|DMKaTop, noKa3Baiu kom o6eKT CMe noAnwca/iki, v\ 
CTOMHOCTTa Ha noAnnca. CTOMHOCTTa Ha noAni/iCBam/ifl pecypc HAMa p,a ce 
CbAtpwa b XML AOKyMeHTa. 

HeKa T03i/i n"bT bk/ikdhmm ny6/innHMfl k/ikdh Ha noAnkiCBami/m b noAnnca. TaKa 
npn npoBepKaTa HflMa pja ce Ha/iara K/iK>na p,a ce 3ape>KAa M3pn4HO, ho 
ocTaBa npo6/ieMa p,a ce rapaHTupa, ne ny6/iwnHkiflT k/ikdh e Ha i/i3npaman, Ha 
kototo MMaMe AOBepne. 

Eto KaK noAnncBaMe pecypc no MAeHTMC|DMKaTop (URI): 



using System. Security. Cryptography; 
using System. Security. Cryptography. Xml; 
using System. Xml; 

// Create object to hold XML signature 
SignedXml xml Signed = new SignedXml ( ) ; 

// Identify what is to be signed 
Reference myUriRef = new Referenced ; 
myUriRef.Uri = "http : //localhost/my_page . html" ; 

// Add the URI to the signature object 
xmlSigned. AddRef erence (myUriRef) ; 

// Create the signing algorithm and generate keys 
DSA dsaProvider = new DSACryptoServiceProvider ( ) ; 

// Configure Keyinfo to store the public key 
Keyinfo myKI = new Keyinfo ( ) ; 

myKI . AddClause (new DSAKeyValue (dsaProvider) ) ; 
xmlSigned. Keyinfo = myKI; 

// Configure key 



860 flporpaMnpaHe 3a .NET Framework (tom 2) 



xmlSigned. SigningKey = dsaProvider; 

// Calculate signature 
xmlSigned. ComputeSignature ( ) ; 

XmlDocument xmlSignature = new XmlDocument ( ) ; 
xmlSignature . LoadXml (xmlSigned. GetXml ( ) . OuterXml ) 
xmlSignature . Save ( "uri_signature . xml " ) ; 



To3M irbT Ha o6eKTa Reference 3aAaBaMe MHTepHeT aApec b no/ieTO Uri. 
Othobo MHCTaHunpaMe DSA o6eKT 3a noflnncBaHeTO, ho T03M ntT npaBMM 
eAHa Aon"b/iHMTe/iHa CTtnKa - Ao6aBHMe ny6/iwnHHfl k/ik>h b XML noAnnca. 3a 
ue/ua cb3AaBaMe Keylnfo o6eKT, KaKTO npaBMXMe Aocera npn npoBepKMTe, v\ 
My 3aAaBaMe ny6/ikmHki*iT k/ikdh reHepupaH ot dsaProvider. flo6aBAMe ro kbm 

xmlSigned 3a Rd TO BK/1KDHI/IM lOTO HaCT OT nOAnMCa. M3BMKBaMe MeTOAa 
ComputeSignature ( ) 3a Ra ce M3HMC/lkl nOAnnca M TO CbxpaHflBaMe b XML 
cpaw/i. 

HeKa npoBepuM Ranv\ noAnwcbT e Banv\Reu: 



using System. Xml; 

using System. Security. Cryptography. Xml; 

// Load the document containing signature 
XmlDocument signatureDoc = new XmlDocument ( ) ; 
signatureDoc . Load ( "uri_signature . xml " ) ; 

// Set up an object to represent XML signature 

SignedXml sXml = new SignedXml ( ) ; 

XmlNodeList signNodeList = 

signatureDoc . GetElementsByTagName ( "Signature" ) ; 

sXml . LoadXml ( (XmlElement ) signNodeList [ 0] ) ; 

// No need to specify key, since we included it 
bool isValid = sXml . CheckSignature () ; 



B Ta3M npoBepKa M3B"bpujBaMe caMO Tpn crbnKM - 3ape>KAaMe XML noAnnca b 
o6eKT XmlDocument, OTTaM B3MMaMe e/ieMeHTa Signature v\ ro 3ape>KAaMe b 
o6eKT SignedXml. B cnynayi He ce Ha/iara p,a 3ape>KAaMe ny6/ikmHwyi k/ikdh, 
TtM KaTO ro BK^K)4MXMe b paMKMTe Ha XML noAnnca. KoraTO M3BMKaMe 

CheckSignature ( ) nORnv\CbJ ce kl3B/lkma OT Keylnfo M ce M3nO/13Ba 3a 

npoBepKaTa. 

Ynpa>KHeHii5i 

1. OnmueTe K/iK>noBkiTe xapaKTepucTMKn Ha curypHOCTTa b .NET Framework - 
6e3onacHOCT Ha TunoBeTe, 3aiunTa Ha naMeTTa, 3aiunTa ot apuTMeTM^Hn 
rpeujKM, noAnncBaHe Ha aceM6/iMTaTa, IsolatedStorage, Code Access 
Security, Role Based Security v\ AP- 



HnaBa 26. CurypHOCT b .NET Framework 861 

2. HanwujeTe 6n6^MOTeKa (Class Library npoeKT bbb VS.NET), koato Cbfltpwa 
K/iac etc CTaTM^eH MeTOfl PrintVersion(), komto OTnenaTBa Ha KOH30/iaTa 
BepcuflTa Ha aceM6/iMTO, ot KoeTO e 3apeAeH K/iaca. KoMnn^npawTe aceM- 
6/imto b 2 pa3/iMHHM Bepcun (1.0 m 2.0), noAnniueTe rn, HanpaBeTe rn etc 
cm/ihm MMeHa v\ vv\ MHcra/iMpaMTe b GAC. Pea/iM3wpaMTe 2 koh30/ihm npM/io- 
>xeHi/m, komto no/i3BaT cbOTBeTHO Bepcufl 1.0 m 2.0 Ha aceM6/iMTO. 

3. HanwujeTe Windows Forms KOHTpo/ia 3a IE, koato no3BO/iflBa cb3,qaBaHe Ha 
a/i6yMki etc chmmkm, komto ce cbxpaHABaT b IsolatedStorage 3a TeKyiuna 
noTpe6nTe^. KoHTpo/iaTa Tpa6Ba fla no3BO/i*iBa pa3r/ie>KflaHe Ha a/i6yMa, 
Ao6aBflHe m M3TpnBaHe Ha chmmkm, komto ce cbxpaHABaT b 
IsolatedStorage. 

4. C"b3AaMTe Windows Forms KOHTpo/ia 3a IE, koato MO>Ke fla OTBapa, 
peAaKTMpa m 3anMCBa TeKCTOBM <fcaM/iOBe Ha noKannwn amok Ha noTpe6M- 
Te/ifl. no noflpa36MpaHe OTBapaHeTO Ha ziOKa/ieH (pawn H^Ma fla pa6oTM. 
HanpaBeTe aceM6/iMTO Ha KOHTpo/iaTa fla MMa cm/iho MMe. Hpe3 Security 
Policy Editor flaMTe npaBa 3a neTeHe m nMcaHe Ha aceM6/iMTO Ha kohtpo- 
naja, KaTO c"b3flafleTe Code Group no cm/ihoto My MMe. 

5. HanMiueTe Windows Forms npM/ioweHMe, KoeTO no3BO/iaBa cb3flaBaHe m 
3anMCBaHe Ha TeKCTOBM 6e/ie>KKM. ripM/io>KeHMeTO Tpa6Ba fla cbxpaH^Ba 
6e/ie>KKMTe bbb (pawn b npoc|DM^a Ha TeKyiflMa noTpe6MTe/i, aKO MMa npaBa 
3a TOBa v\nv\ b IsolatedStorage aKO HHMa npaBa. npaBaTa Tpa6Ba fla ce 
npoBepyiBaT nporpaMHO. 

6. HanMiueTe 6M6/iMOTeKa (DLL), koato noflfl"bp>Ka <£yHKU.MOHa/iHOCT 3a 
perMCTpMpaHe Ha noTpe6MTe/i no username m password m npoBepKa Ha 
Ba/iMflHOcrra Ha flBOMKa username/password. 5M6/iMOTeKaTa Tpa6Ba ctxpa- 
HflBa flaHHMTe cm b XML <£aM/i m fla M3no/i3Ba co6cTBeHMTe cm npaBa 3a 
Aocrbn flo fyawna. K/iMeHTM c hmckm npaBa, komto He MoraT fla neTaT 
cpatijia, Tpa6Ba fla MoraT fla no/i3BaT (fcyHKUMOHa/iHOCira Ha 6M6/iMOTeKaTa. 

7. C noMOiflTa Ha Role Based Security HanpaBeTe npM/io>KeHMe, KoeTO 
ynpaB/iABa noTpe6MTe/iMTe b flafleHa CMCTeMa. rioTpe6MTe/iMTe, TexHMTe 
napo/iM m po/iMTe Ha BceKM noTpe6MTe/i Tpa6Ba fla ce cbxpaH^BaT b XML 
<fcaM/i. B"b3MO>KHMTe po/iM 3a BceKM noTpe6MTe^ ca Guest, User m Admin. 
TocTMTe b CMCTeMaTa MMaT npaBO fla ce perMCTpMpaT m hmluo flpyro. 
rioTpe6MTe^MTe b CMcreMaTa MMaT npaBO fla M3B/iMnaT cnMCtKa ot bcmukm 
perMCTpMpaHM noTpe6MTe/iM. AflMMHMCTpaTopMTe MMaT npaBO fla peflaKTM- 
paT flaHHMTe m po/iMTe Ha bcmukm noTpe6MTe/iM. npM Hana/iHO CTapTMpaHe 
CMCTeMaTa Tpa6Ba fla npefl/iara <£opMa 3a aBTeHTMKauMa, koato no3BO/iflBa 
B^M3aHe KaTO HAKaKtB noTpe6MTe^ v\nv\ Bnv\3ane KaTO toct 6e3 napo/ia. 
ripoBepKaTa Ha po/iMTe fla ce pea/iM3Mpa npe3 GenericPrincipal. 

8. Pea^M3MpaMTe npM/io>KeHMeTO ot npeflxoflHaTa 3a,qana, KaTO cbxpaH^BaTe 
napo/iMTe Ha noTpe6MTe/iMTe He KaTO hmct TeKCT, a KaTO SHA1 xew 
ctomhoct. flaBa nv\ TOBa no-ro/iflMa CMrypHOCT 3a CMCTeMaTa? 



862 nporpaMnpaHe 3a .NET Framework (tom 2) 

l/l3no/i3Bai-ia JiiuepaTypa 

1. CBeT^MH HaKOB, CurypHOCT b .NET Framework - http://www.nakov.com/ 
dotnet/lectures/Lecture-24-Security-vl.O.ppt 

2. MSDN Lectures, Implementing Application Security Using the Microsoft 
.NET Framework - http://downloads.microsoft.co.za/MSDNEssentials/ 
20040402/AppSecurity.ppt 

3. 5n3Hec b MHTepHeT, T/iaBa 7, CurypHOCT b MHTepHeT - http://www-it.fmi. 
uni-sofia.bg/courses/BonI/chapter7.html 

4. Derek Simon, Strong-Named Assemblies - http://www.incandesoft.com/ 
development/stronq-named%20assem blies.pdf 

5. Chris Tavares, Understanding Isolated Storage - http://www.dotnetdevs. 
com/a rticles/IsolatedStoraqe.aspx 

6. Adam Freeman & Allen Jones, Programming .NET Security, O'Reilly, 2003, 
ISBN 0-596-00442-7 



T/iaea 27. Mono - CBo6oflHa 

MMn/ieMeHTduii^i Ha .NET 

Framework 



ABTOpii 

Ahtoh AHApeeB 
UBeTe^MH AHflpeeB 

He06X0flMMM 3HaHM51 

- Ba30BM no3HaHM5q 3a .NET Framework v\ CLR (Common Language 
Runtime) 

- Ba30BM no3HaHMfl 3a UNIX 

Cb/vbpwaHue 

- npoeKTbT Mono 

- MHCTa^npaHe v\ KOHCJDMrypwpaHe Ha Mono 

- CpeAM 3a pa3pa6oTKa 

- KaKBO BK^K)4Ba Mono? 

- 'Hello Mono' c Mono 

- ADO.NET m Mono 

- Ye6 TexHO^ornnTe b Mono 

- Tpac|DM4HM MHTepc|DeMCM b Mono 

- KaK fla nuiueM npeHOCMM koa? 

- nporpaMnpaHe Ha nrpn v\ Tao Framework 

- Java, Python, PHP v\ Mono 

- Ynpa>KHeHMfl 

- Mono pecypcn 

- M3no^3BaHa /lMTepaTypa 



864 flporpaMnpaHe 3a .NET Framework (tom 2) 



B Ta3M TeMa... 

B HacTOsimaTa TeMa me pa3r/ieAaMe eAHa ot a/uepHaTMBUTe Ha Microsoft .NET 
Framework - npoeKTbT c OTBopeH koa Mono. IHe o6achmm HaKpaTKO Ha^MHUTe 
3a MHCTa^npaHe v\ pa6oTa c Mono. IHe ce 3ano3HaeM c HeroBMTe KOMnoHeHTu: 
KOMnn^aTopn, BwpTya/iHki MaiunHM, Ae6"brep, AH3aceM6/iep v\ AP- U-le o6tpHeM 
BHMMaHne Ha oco6eHOCTMTe npn M3no/i3BaHe Ha ASP.NET ye6 npn^OKeHna v\ 
ye6 yc/iyrw Btpxy ctpB-bpnTe Apache c mod_mono v\ XSP. IHe pa3r/ieAaMe 
oiue AOCTbn-bT npe3 ADO.NET ao MySQL, PostgreSQL v\ Apyrn ctpBtpn 3a 
6a3M ot ashhu. IHe HanpaBMM nper/ieA Ha cpeACTBaTa 3a cb3AaBaHe Ha 
rpacpi/mHM npn^OKeHna: Windows Forms, Glade#, Gtk# v\ AP- U-le AaAeM v\ 
HAKO/iKO ctBeTa othocho nwcaHeTO Ha npeHOCMM koa (TaicbB, komto MO>xeTe 
Aa KOMnn^npaTe Ha pa3/ikmHHTe onepaunoHHM cucTeMM 6e3 npoMeHu). IHe bm 
3ano3HaeM HaKpaTKO v\ c pa6oTa c rpacpmo noA Mono. 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 865 



npoeKTbT Mono 

npoeKTtT Mono ( www.mono-proiect.com ') e MHnunaTUBa, kohto MMa 3a ue/i 
fla pea/iki3kipa CBo6oflHa Bepcua Ha .NET Framework 3a Linux, Solaris, 
Mac OS X, Windows v\ flpyrw UNIX-6a3npaHM onepaunoHHM CMCTeMM. CnoHCO- 
pupaH e ot Novell, ro/isiMa MT KOMnaHi/m, BOfleiu flocraBUMK Ha onepaunoHHM 
cm ere mm, Mpe>KOB m cwcreMeH coc|DTyep. Mono e npoflyKT c H3u.fl.no OTBopeH 
koa, 6a3npaH Ha ECMA/ISO craHflapTkiTe. Pa3npocrpaH*iBa ce cbo6oaho no,q 
/ikiueH3M GNU/GPL v\ MIT Xll. 



3HaneHne Ha npoeKTa 

npw/io>KeHMflTa b .NET Framework ce KOMnw/ii/ipaT ,qo e3MK ot no-HMCKO hmbo 
(CIL). To3M e3MK e CTaHflapTki3wpaH ot Microsoft. ToBa no3BO/iHBa fla ce nuiue 
Ha pa3^M4HM e3Mun 3a eflHa n^aTCJDopMa. Mono flonpuHaca c TOBa, ne npaBM 
B"b3M0>KH0 M3nt^HeHneT0 Ha HaujMTe npw/io>KeHi/m Btpxy HaM-UJMpOKO ki3no/i3- 
BaHMTe onepaunoHHM cucTeMM v\ apxnTeKTypn. 

CTaTyc Ha npoeKTa 

TeKymaTa cra6i/i/iHa Bepci/m (HoeMBpn, 2006) e 1.1.13.8. Ta e ot cepnnTe 
1.1.x, komto ce onaKBa fla flOBeflaT ao i/i3/ii/i3aHeT0 Ha Bepci/mTa Mono 1.2, 

KOflTO Lfle BK/lKDUBa HflKOM KOMnOHeHTM, nOHaCTOfllfleM He flOCTaTbUHO cra6n/i- 

hm 3a cepuflTa Mono 1.0. Bepcu^Ta 1.2 e n/iaHwpaHa fla M3/ie3e Kpasq Ha 2006 
roflMHa m eflMHCTBeHOTO, b KoeTO ce pa3/iwnaBa ot TeKymaTa Bepcua e 
nt/iHaTa noflflp"b>KKa Ha Windows Forms. IHe 6"bflaT BK/iioneHki v\ aceM6/ikiTa 3a 
ot .NET Framework 2.0 3a XML 2.0, ASP.NET 2.0, ADO.NET 2.0 v\ flpyrn. MMa 
n/iaHOBe v\ 3a noflflp"b>KKa v\ Ha .NET 3.0. 

OcJDMuna^HMflT caMT Ha npoeKTa npefl/iara noflpo6Ha v\ aKTya/iHa MHCJDopMaunfl 
othocho CTaTyca Ha Mono. Hpe3 cwcreMaTa 3a TbpceHe no k/ik>hobi/i flyMM, 
ziecHO MO>KeTe fla HaMepnTe bcmuko, ot KoeTO ce MHTepecyBaTe. flocTtnHM ca 
MHOxecTBO ptKOBOflCTBa 3a no/i3BaHe Ha 6i/i6/ii/iOTeKM CBtp3aHM c Mono. 
noc/ieflHkiTe Bepcun Ha npoeKTa MoraT fla 6tflaT CBa/ieHki ot aflpec http:// 
www.mono-proiect.com/Downloads . 

noflfli>p>KaHH onepaMMOHHM cucTeMM m apxuTeKTypu 

Mono noflfl"bp>Ka mhoto onepaunoHHM CkicreMM - Linux, Mac OS X, Sun Solaris, 
Free/Open BSD, Microsoft Windows. KoMnw/ikipa ce KaKTO Ha 32-6mtobm, TaKa 
m Ha 64-6mtobm apxnTeKTypn. Mono e pa3pa6oTBaH npeflMMHO Ha Linux, 
3aTOBa Linux e Haw-flo6pe noflfltpwaHaTa onepaunoHHa cwcreMa. CbmecrBy- 
BaT totobm, KOMnw/ikipaHki naKeTM 3a flMCTpn6yunMTe Suse, Red Hat 9.0, 
Fedora Core 3, Debian/GNU v\ Mac OS X. ripn BSD onepaunoHHMTe cucTeMM 
Mono e BK/iK>neH b ports cwcreMaTa o6mkhob6ho KaTO lang/mono. 

rioflfltpxaHMTe apxnTeKTypn ca x86, SPARC, s390, PowerPC, IA64. Mono 
pa6oTM i/i Ha ycrpoMCTBa c ARM npouecopn: 



866 



flporpaMnpaHe 3a .NET Framework (tom 2) 







%i -J 


Ct 


J 


k 1 




| - t uname -a 

1 7 2 . 6 . 1 2 . 3-ci â–  


: 




















s -s 












MyBocs 16"?4 Mono 

appa .b.dll 












3 console, fixe 1 .p-dat 












Q il oaso sketch.dat 

- 5 HOMO PATk=. ./mono console. i 
Me can now writ* tc the console 

- $ 

- > 1 






















*S qwertyuiop 


@ 

â–  j 

7 


1 

4 
7 


5 
8 








ABt a s d f g h j k 1 ; 
t zxcvbnm,./ 






» 


' - 





Mono Ha Nokia-770 

Ha KapTMHKaTa e noKa3aHO koh30/iho Mono npw/io>KeHi/ie, KoeTO M3nncBa 
"Now you can write to the console", i/i3n-b/mei-io Btpxy Nokia-770, koato e 
6a3npaHa Ha Linux. 

Monoppix 

OnepaunoHHaTa cwcreMa Monoppix ( www.monoppix.com '), 6a3npaHa Ha 
Knoppix, BK/iiouBa b ce6e cm Mono BkipTya/iHa MaiunHa, KOMnw/iaTop v\ 
CTaHflapTHM 6n6^noTeKM, cpefla 3a pa3pa6oTKa MonoDevelop, ASP.NET ye6 
ctpBtp, 6n6^noTeKaTa Gtk# 3a nocrpoyiBaHe Ha rpacpwuHM npn^OKeHna, 
CbpBtptT 3a pa6oTa c 6a3M ot ashhh MySQL v\ flOKyMeHTau.km 3a Mono. ToBa 
e eflMH zieceH HanwH 3a M3npo6BaHe Ha Mono, Tbv\ KaTO Monoppix ce crapTkipa 
caMO ot CD m He M3MCKBa HMKaKBM flont^HMTe^HM kiHcra/iaui/m. riocneflHaTa 
Bepcufl Ha Monoppix e CBo6oflHa 3a i/i3Ter/i*iHe ot http://www.monoppix.com/ 
download.php . 

Mono Live 

noflo6Ha Ha Monoppix flncTpn6yunfl e Mono Live. Ta e 6a3npaHa Ha onepaun- 
OHHaTa cucTeMa Ubuntu, koato npow3xo>Kfla ot Debian/GNU Linux. Cai/iTbT Ha 
npoeKTa e www.mono-live.com . /^mckbt, komto MO>KeTe fla M3Ter/ii/iTe ot TaM, 
BK/iK>nBa Mono, MHCTpyMeHTtT 3a pa3pa6oTKa MonoDevelop v\ hako/iko naKeTa 
codrryep, pa6oTeiu b cpeAaTa Ha Mono. 

l/lHCTa/iupai-ie m KOHcfrnrypupaHe Ha Mono 

MMa flBa Ha^MHa 3a i/iHcra/iwpaHe Ha Mono: npe3 nHCTa/iau.nfl Ha roTOBMTe 
KOMnn^npaHM naKeTM v\nv\ npe3 KOMnw/iwpaHe Ha cope KOfla Ha Mono. 



1/lHCTa/mpaHe Ha Mono Bi>pxy Linux flncTpn6yiJiMM 

MMa hako/iko Hankma fla ce MHCTa/ikipa Mono nofl Linux. 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 867 



rpac|3MHeH MHCTa/iaTop 

CtiuecTByBa rpac|DkmeH kmcra/iaTop 3a Linux, c komto mhoto ziecHO v\ 6"bp30 
MO>Ke fla ce i/iHCTa/ii/ipa Mono. MHCTa/iaToptT e flocrbnein ot http://www. 
mono-proiect.com/Downloads i/i ce crapâ„¢ pa etc c/ieflHMTe KOMaHflw: 



% chmod +x mono-1 . 1 . 12 . l_0-installer.bin 
% . /mono-1 . 1 . 12 . 1 -installer .bin 



Tpac|DM4HMflT MHcra/iaTop ce npenoptuBa 3a HankiHaemw noTpe6kiTe/in, iokto m 
3a Windows/. NET nporpaMMCTH, komto hciot fla M3npo6BaT Mono nofl Linux c 
MMHMMa^HM ycn/iwfl. TeKymaTa Bepcua BK/iK>nBa v\ cpeAaTa 3a pa3pa6oTKa 
MonoDevelop. 



3 Setup 




Setup - Mono 
Welcome to the Mono Setup Wizard 



l^: 



^ Forward 



Cancel 



kl3nosi3BaHe Ha totobm AncTpn6yTHBHn naKeTM 

Mono ce mHCTa/iwpa v\ npe3 roTOBkue KOMnn^npaHM naKeTM 3a pa3/ikmHMTe 
Linux AHCTpn6yu,MM. 3a RPM 6a3npaHMTe cucTeMM KaTO Fedora v\ Suse Linux e 
npenop"bni/iTe/mo fla ce ki3no/i3BaT cucTeMMTe 3a i/iHcra/ikipaiHe v\ o6HOBflBaHe 
yum v\i\v\ yast2. 3a Debian/GNU ce M3no/i3Ba apt-get. Hpe3 Te3M cucTeMM ce 
ki36flrBaT npo6/ieMWTe etc 3aBncnM0CTMTe, 3aiuoTO ocBeH caMaTa nporpaMa ce 
kiHcra/ii/ipa v\ bcmuko Heo6xoflMMO 3a HopMa/maTa v\ pa6oTa. 



868 nporpaMnpaHe 3a .NET Framework (tom 2) 

KoMnMsmpaHe Ha cope KO/ja ot AncTpn6yTHBa Ha Mono 

Ako KOMnn^npaHM naKeTM He ca flocTtnHM 3a flafleHa n/iaTCpopMa, anjepna- 
TkiBaTa e Mono p,a ce i/iHcra/ii/ipa npe3 KOMnw/iwpaHe Ha cope KOAa. 3a ue/iTa 
Tpa6Ba fla M3Ter/ikiTe apxuBMTe ot Download crpaHkiuaTa v\ p,a ki3n"b/iHi/iTe 
c^eflHMTe KOMaHflM 3a pa3apxnBnpaHe v\ KOMnw/iwpaHe Ha Mono: 



# 


tar xzf mono 


-1 


1 


12 


tar 


gz 


# 


cd mono-1 . 1 . 


12 










# 


. /configure 












# 


make 












# 


make install 













kl3Tersi$iHe Ha cope KOfla ot SVN xpaHM/iniijeTO 

yKa3aHMfl othocho w 3Te r/i a h eTO Ha Haw-HOBUfl cope koa Ha Mono MO>xe p,a 
6"bfle HaMepeH Ha crpaHi/iuaTa svn.myrealbox.com . TaM ce HaMupa v\ SVN xpa- 
HM^niueTO (repository) Ha Mono, KoeTO MO>KeTe fla pa3r/ieflaTe c Bawi/m ye6 
6pay3"bp. 

SVN/Subversion e cwcreMa c OTBopeH koa 3a kohtpo/i Ha BepcunTe npn 
ctBMecTHa pa6oTa b eKnn, noAo6Ha Ha CVS. SVN xpaHM/iwmeTO npeAcraB/iflBa 
Heiuo KaTO cpaw^OB cbpBtp 3a o6M*iHa Ha cpaw/iOBe, c Ta3M pa3/ikiKa, ne to 
3anoMH*i BCAKa npoMAHa Ha AaAeH cpaw/i v\nv\ AnpeKTopi/m. ToBa no3BO/iHBa 
npocneAflBaHeTO Ha MCTopnaTa Ha AaAeH cpaw/i, KaKTO v\ HeroBOTO B"b3craH0- 
BABaHe ot no-CTapn Bepcun npn Heo6xoAHMOcr. 

Eto npuMepHM KOMaHAM, c komto MO>KeTe p,a ki3Ter/ikiTe Mono ot HeroBOTO SVN 
xpaHM^niue (c4MTa ce, ne MMaTe ziOKa/iHO kiHcra/iwpaH svn K/iweHT): 



# svn co svn: //mono .myrealbox. com/ source /trunk /mono 

# svn co svn: //mono .myrealbox. com/source/trunk/mes 

# svn co svn: //mono .myrealbox. com/source/trunk/libgdiplus 



3a6e/ie>KeTe, ne KpasiT Ha BceKM peA e AnpeKTopn^Ta, koato me 6"bAe v\3iev- 
neua. Mo>xe p,a noconwTe v\ Apyrn AnpeKTopnn {v\nv\ no-TOHHO K/iOHOBe). 

KoMnn/inpaHe Ha cope KOAa ot SVN xpaHM/iMujeTO 

KoMnn^npaHeTO Ha M3Ter/ieHMfl cope koa ot SVN xpaHM/imueTO CTaBa no 
c/ieAHMfl Ha^MH: 



# cd mono 

# ./autogen.sh --pref ix=/usr/local 

# make 



napaMeTbpvr — prefix 3aAaBa icbAe p,a ce KOMnn/iwpa KOAa (KbAe p,a ce 
nocTaBAT cpaw/iOBeTe cnep, i/mcra/iaukiflTa). Ako MCKaTe p,a o6HOBMTe KOAa 
Tpa6Ba caMO p,a B/ie3eTe b cbOTBeTHaTa AnpeKTopua v\ p,a HanniueTe: 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 869 



svn update 



l/lHcra/mpaHe Ha Mono nofl Windows 

3a Windows npoeKTbT Mono npeAOcraBH MHcra/iaTop, o6mkhob6h Windows 
Setup, c BK/iK>neHM Gtk# 3a pa3pa6oTBaHe Ha rpadpwuHM npn^OKeHna v\ ctp- 
Btpa XSP3a ASP.NET. 



1\ Setup - Mono 1.1.12.1 with GTK# 2.4.0 



jnlxl 




mono 



Welcome to the Mono 1.1.12.1 
with GTK# 2.4.0 Setup Wizard 

This will install Mono for Windows 1 .1 .1 2.1 on your computer. 

It is recommended that you close all other applications before 
continuing. 

Click Next to continue, or Cancel to exit Setup. 




ripn >xe/iaHkie MO>xeTe v\ caMM fla KOMnw/iwpaTe Mono, ki3no/i3BaMKki cygwin, 
Linux eMy^aunfl 3a Windows, ho 3a TOBa ce M3MCKBaT no-3aAt>/i6oneHi/i 
no3HaHMfl. 

1/lHCTa/inpaHe Ha Mono non Mac OS X 

3a MAC OS X MMa totob kmcra/iaTop. B Hero e BK/iK>neHa n/iaTdpopMaTa 

Cocoa*, no nOApa36npaHe Mono ce MHCTa/lMpa ce B /Library/Frameworks. 



l/lHCTa/inpaHe Ha Mono non FreeBSD 

MHCTa^aunflTa CTaBa ki3K/iK>nkiTe/iHO ziecHO, Tbv\ KaTO Mono e BK/iK>neH b ports 
cucTeMaTa Ha onepaunoHHaTa cwcreMa. CrapTi/ipaT ce ci\ep,uv\je KOMaHAH KaTO 
noTpe6i/iTe/i root: 



870 flporpaMnpaHe 3a .NET Framework (tom 2) 



cd /usr/ports/lang/mono 
make install clean 



TaKa Mono e i/iHcra/ikipaiH m totob 3a no/i3BaHe. 

BSD# 

BSD# ( http://www.mono-proiect.eom/Mono:FreeBSD ') e npoeKT, komto npe- 
Hacfl Mono Btpxy FreeBSD onepaunoHHaTa CMcreMa. ripoeKTbT pa6oTM Btpxy 
noflflp"b>KKaTa Ha cbiuecTByBaiunTe Mono ports bbb FreeBSD, Btpxy npeHaca- 
HeTO Ha hobm Mono npn^OKeHna, iokto m Btpxy cneu.MCpMHHM npo6/ieMM 
CB"bp3aHM c MHTerpaunflTa Ha Mono v\ FreeBSD. 

Hakom ot ports, komto ce noAA"bp>KaT BSD#, He ca BK/uoneHki b ocpMUMa/iHaTa 
FreeBSD ports KO/ieKuwfl. no Ta3M npn^MHa ce Ha/iara o6eflMHeHne Ha flBeTe 
KO/ieKUMM. ToBa CTaBa npe3 M3no/i3BaHeTO Ha CKpunT, noAA^pwaH ot BSD#. 
CKpunTa MO>Ke p,a 6"bAe CBa/ieH ot ocpnuna/iHaTa crpaHMua Ha npoeKTa v\ ce 
CTapTupa etc c/ieflHaTa KOMaHfla: 



# mono -merge 



BSD# npeAOCTaBfl lang/mono-svn ot ports KO/ieKUMfrra cm, npe3 komto MO>Ke 
Aa 6"bAe MHcra/iMpaHa TeKymaTa BepcMfl Ha Mono ot SVN xpaHM/iMmeTO. 

ripenop"b4MTe^HO e npM MHcra/iMpaHe Aa ce no/i3Ba BSD#, 3aiuoTO cbAtpwa 
BMHarM HaM-HOBaTa BepcMfl Ha Mono m Ha bcmukm Heo6xoAMMM MHCTpyMeHTM m 

6m6/1MOT6KM. 



CpeflM 3a pa3pa6oTKa 



Mono He npeAOcraBH AnpeKTHO cpeAa 3a pa3pa6oTKa. 3aT0Ba pa3pa6oT4MUMTe 
Tpa6Ba caMM Aa HanpaBsiT cboa M36op. BtnpeKM, ne 3a Linux 6a3MpaHM one- 
pauMOHHM CMCTeMM ziMncBa TaKOBa MOiuHO cpeACTBO 3a pa3pa6oTKa Ha .NET 
npM^o>KeHMfl KaTO Microsoft Visual Studio 3a Windows, Ha/iMue ca hhko/iko 
a^TepHaTMBM. 

MonoDevelop 

MonoDevelop ( www.monodevelop.com ) e cpeAa 3a pa3pa6oTKa c OTBopeH 
koa, koato ce pa3pa6oTBa ot eKMna Ha Mono. 3anonHaTa e KaTO nopT Ha 
SharpDevelop (cpeAa 3a pa3pa6oTKa Ha .NET npM/io>KeHM5i noA Windows), a b 
MOMeHTa ce pa3pa6oTBa KaTO Gnome npM/io>KeHMe. HacroflmaTa BepcMfl e 0.9 
(AeKeMBpM 2005). B noc/ieAHMTe cm BepcMM MonoDevelop noAA^pwa n/itrMHM 
- KOMnoHeHTM, Ao6aBfliuM cpyHKUMOHa/iHOcr, 6e3 Aa ce Ha/iara npeKOMnM- 
ziauMH. 

MonoDevelop MMa BrpaAeHa AOKyMeHTauMa - Monodoc m Ae6"h>rep, aBTOMa- 
tm4ho Aont^BaHe Ha koa (code completion), noApo6eH n3r^eA Ha K/iacoBeTe, 
MMa m onuMfl 3a KOHBepTMpaHe Ha Visual Studio npoeKTM. OcBeH C# ce 
noAA"bp>KaT m APyrM e3MUM KaTO Java m Boo. Mo>KeTe ziecHO Aa cb3AaBaTe 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 871 



Gtk# m Gnome* npoeKTM. Pa6oTM ce no m-uerpaukiflTa Ha GUI flM3aMHep - b 
MOMeHTa Glade3, a b 6"bfleme ce onaKBa fla 6"bfle 3aMecTeH ot Stetic. Ha 
pa3no/io>KeHkie e v\ Data Browser c komto MO>KeTe fla nper/ieAaTe 
ctAtpxaHneTO Ha 6a3aTa ashhh c koato pa6oTMTe. fle6"brep"bT 3a MOMeHTa 
Bee oiue He e totob. 3a Bepcua 1.0 e n/iaHkipaHa nofl,qp"b>KKaTa Ha gmcs v\ 
.NET 2.0, ASP.NET, KaKTO v\ CMCTeMM 3a kohtpo/i Ha BepcunTe (CVS v\ SVN). 

ripn OTBapaHeTO Ha VS.NET npoeKTM MO>Ke fla ce c6/i"bCKaTe c hakom 
tpyahoctm. BepoflTHO me Tpa6Ba fla noflMeHMTe bcm^km pecJDepeHunn kbm 
aceM6/ikiTa, Tbv\ KaTO VS.NET vv\ 3anncBa KaTO a6co/iK>THki ntTMiua flo 
Windows flkipeKTOpi/IMTe. TOBa CTaBa ZieCHO OT Project Explorer -> 
References Ha MonoDevelop. 

MonoDevelop ce flncTpn6yTnpa c hakom ot roTOBMTe MHCTa/iaTopw 3a Mono, 
KaKTO m c onepaunoHHaTa cwcreMa Monopix. flocrbneH e m 3a FreeBSD npe3 
BSD# ports KO/ieKUMHTa. M3MCKBaT ce MHCTa/iwpaHM GNOME 6ki6/ikiOTeKki. 



- MonoDc^lop 



File Edit View Run Search Tools Window Help 



D & 

New File Open 



a 



* m a © 

Copy Paste Delete Find.. 



Find Next Replace.. 



GJ Solution 



m 



1 |]j Solution Gtk (1 entry) 
^ 5pGtk 

^ lEoi References 
F^ Resources 
f=\ Assernblylnfo.es 
J] Main.cs 
, ^| MyWindow.cs 



1 Main.cs* X 



MyWindow.cs >t 



// project created on 20.7.2005 r. at 01:51 
using System; 
using Gtk; 

class MainClass 
( 

public static void Main (stringN args) 



{ 



10 
11 

12 

13 } 



Application . Init ( ) j 
new MyWindow ( ) ; 
Application , 



static bool Gtk.Application.lnitCheck (string progname, string args) 
Initializes Gtk#for operation, probes window system. 



Files Classes Solution Help 



HfCurrentEvent 
'^Equals 
â– ^EventsPending 
♦ init 

"'Quit 

â– ^ReferenceEquals 

^Run 

-* Run Iteration 



"!] Task List 



Line Description File Path 



Ready 



In 11 col20 ch 13 INS 



Eclipse 



Eclispe e MOiflHa v\ cki/iHO-pa3LUkipfleMa cpefla 3a pa3pa6oTKa, cb3fla,qeHa ot 
IBM. Ochobho ce i/i3no/i3Ba 3a pa3pa6oTBaHe Ha npi/i/io>KeHi/m c Java, ho 
nopaflu rbBKaBaTa v\ apxnTeKTypa e B"b3MO>KHO i/i3no/i3BaHeTO Ha mhoto e3nun 
3a nporpaMnpaHe c noMOurra Ha n/itrwHki. 3a fla ki3no/i3BaTe Mono v\ Eclispe 



872 nporpaMnpaHe 3a .NET Framework (tom 2) 

Tpfl6Ba fla MHCTa^npaTe n/i-brkma "Improve C# Plugin for Eclipse". 1/lHCpop- 
Maunfl 3a Hero MO>xe fla 6"bfle HaMepeHa Ha http://www.improve-technoloqies. 
com/a Ipha/esharp . n/i"brnH"bT noflfl"bp>Ka cb3flaBaHe Ha C# cpaw/iOBe c ochob- 
Ha CTpyKTypa, noflnepTaBaHe Ha k/ik>hobm avmm, KaKTO v\ acwcreHT 3a C# 

K/IKDHOBM flyMM. ripeflOCTaBfl Ce M B"b3MO>KHOCT 3a KOMnM/iaU.Mfl Ha C# 

cpaw/iOBe. Ot 2004 rofli/ma HHMa HOBa Bepcua Ha n/itri/ma. 

Emacs m Vim 

Emacs v\ Vim ca TeKCTOBM peflaKTopn c o6iuo npeflHa3HaneHi/ie, ho MoraT fla 
ce M3no/i3BaT v\ 3a cope koa peflaKTopn. C Emacs ce M3no/i3Ba C# editing 
mode, KoeTO MO>xe fla 6tfle CBa/ieHO ot http://www.cybercom.net/~zbrad/ 
DotNet/Emacs/ . noflfltpwa ouBeTABaHe v\ noflxoflaiuo noflpaBH^BaHe. Vim 
noflfl"bp>Ka cbiuo ouBeTABaHe Ha k/ik>hobm flyMM. 

X-Develop 

npeflcraB/iflBa KOMepcwa/ieH npoflyKT, cpefla 3a pa3pa6oTKa, HanncaHa Ha 
Java. Ochobho ce w3no/i3Ba 3a npn^OKeHna, nucaHM Ha Java, ho noflfl"bp>Ka v\ 
.NET. 

KDevelop 

Cpefla 3a pa3pa6oTKa kbm npoeKTa KDE, noflfltpxaiua mhoto e3nun, bk/ikdhm- 

Te/IHO m C#. 

KaKBO BK/iK>HBa Mono? 

Mono npefl/iara M3rpafleHa i/mcppacrpyKTypa, Hy>KHa 3a crapTkipaHeTO Ha .NET 
npw/io>KeHi/m. Mono BK/iK>nBa KOMni/i/iaTopw, BnpTya/iHa Mawi/ma (CLR), cbBMe- 
CTMMa etc CTaHflapTMTe Ha ECMA ( www.ecma-international.org ) v\ MHO>KecTBO 
6n6^noTeKM, KaKTO CTaHflapTHMTe ot Microsoft .NET Framework, TaKa v\ 
flont^HMTe^HM (Novell, Mono 6i/i6/ii/iOTeKki v\ flp.). npoeKTbT npefl/iara v\ 
6pay3tp 3a flOKyMeHTauna (Monodoc). 

BnpTya/iHa MauiMHa 

Mono BK/iK)4Ba flBa MHcrpyMeHTa 3a M3n"b/iHeHne Ha .NET aceM6/iMTa: mono v\ 
mint. Te kiMn/ieMeHTwpaT ECMA CTaHflapTMTe 3a Common Language 
Infrastructure (CLI) v\ BK/iK)4BaT Just-in-Time KOMnw/iaTop (JIT), Ahead-of- 
Time KOMnw/iaTop (AOT), KOMnoHeHT 3a 3ape>KflaHe Ha 6ki6/ikiOTeKki (library/ 
class loader), ci/icreMa 3a no^MCTBaHe Ha naMeTTa (garbage collector), 
cucTeMa 3a ynpaB/ieHkie Ha HMUJKMTe (threading system) v\ 6n6^noTeKM 3a 
flocTbn flo MeTaflaHHM (metadata access libraries). 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 873 

llHTepnpeTaTop"bT mint 

Mint e MHTepnpeTaTop 3a CIL 6ai/iT koa. 1/lHTepnpeTaTopvr ki3n"b/iH*iBa 
aceM6/ii/iTa, cbAtpwamw b ce6e cm Common Intermediate Language koa. Hpe3 
cneAHaTa KOMaHAa ce crapTwpa .NET npw/io>KeHi/ieTO program.exe: 



mint program.exe 



BnpTya/iHaTa Ma him Ha mono 

BnpTya^HaTa Mawi/ma mono BK/iiouBa reHepaTop Ha native koa. To3m reHe- 
paTop TpaHCCJDopMupa Common Intermediate Language b MaujnHH03aBMCMM 
(native) koa, KoeTO npaBM ki3n"b/iHeHkieTO Ha nporpaMkue 6"bp30 v\ ec|DeKTMBHO. 
TeHepaToptT pa6oTM b ABa pe>KMMa Just-in-Time v\ Ahead-of-Time, KaTO npn 
pe>KMMa Ahead-of-Time ce npaBM npeABapwTe/iHa KOMnw/iaukifl ao native koa, 
komto ce reHepupa eAHOKpaTHO v\ ce ki3no/i3Ba BMHarn, KoraTO ce crapTwpa 
cbOTBeTHOTO aceM6/iw. 

BnpTya^HaTa MaiunHa mono npeA-nara onu.nn, npe3 komto ce HacrpoMBa 
M3nt^HeHneTO Ha nporpaMM. EAHa ot Te3M onunn no3BO/i*iBa peAnu.a onTMMM- 
3aunM. Ctc cneAHaTa KOMaHAa ce KOMnw/ikipa bxoahma cjDaM/i ao MaujMHHO- 

3aBMCMM KOA C BK/lKDHeHM BCM4KM OnTMMM3aUMM. 



% mono -0=all ~aot program.exe 



rioBene MHCJDopMauMfl othocho M3no/i3BaHeTO Ha MHTepnpeTaTopa MO>Ke p,a 
6"bAe HaMepeHa b noMOiuHaTa crpaHi/iu.a (man page) Ha Mono. Hpe3 cneAHaTa 
KOMaHAa ce M3nncBaT Ha eKpaHa KpaTKO onucaHne Ha Bt3MO>KHMTe onu.nn. 



man mono 



Pe3y^TaT"bT npw M3n"b/iHeHi/ie Ha eAHa m cbiua nporpaMa c mono m c mint e 
eAMH m cbiu. Pa3/ikiKaTa e b TOBa, ne mint nponwTa noAaAeHna My cjDaM/i v\ ro 
MHTepnpeTupa b MHCTpyKunn ao npouecopa, AOKaTO npn mono ce i/i3no/i3Ba JIT 
KOMnn^aTopa. Cnep, nponwTaHe Ha MHCTpyKunnTe ot bxoahma (fcaw/i mono 
M3BMKBa JIT KOMnn/iaTopa, 3a p,a KOMnw/iwpa Te3M MHCTpyKunn ao koa Ha 
MaujMHHO hmbo, c/ieA KoeTO T03M koa ce ki3n"b/iH*iBa . 3a6aBAHeTO npn ntpBO 
M3no^3BaHe Ha mono, ce At/iww Ha TOBa, ne JIT KOMnM/iaTopvr ce Hy>KAae ot 
BpeMe, 3a p,a KOMnw/iwpa cbOTBeTHaTa nporpaMa v\ p,a 3apeAn reHepupaHna 
MaujMHH03aBMCMM koa b naMeTTa. 

P/Invoke 

P/Invoke, cbKpaTeHO ot "Platform Invocation Facility", no3BO/isiBa Aocrbn ao 
HeynpaB/iflBaH koa. Hpe3 to3m MexaHM3"bM, MHTerpupaHeTO Ha C/C++ koa ebb 
BaiueTO Mono npw/io>KeHkie CTaBa ki3K/iK)nkiTe/iH0 ziecHO. ToBa p,asa B"b3M0>K- 
hoct 3a o6BMBaHe Ha Bene totobm KOMnw/ikipaHM 6w6/ikiOTeKki nucaHM Ha 

C/C+ + . 



874 nporpaMnpaHe 3a .NET Framework (tom 2) 

KoMnn/iaTop 3a C# - mcs 

KoMnki/iaTop"bT Ha Mono - mcs e MMn/ieMeHTaukisi Ha ECMA-334 cneuncpMKa- 
UMATa 3a e3MKa C#. Tom e Hant/iHO cbBMecri/iM c C# 1.0. B MOMeHTa ce 
pa6oTM m no BTopaTa Bepcua Ha cneuncpuKaunaTa Ha e3MKa C# 2.0, ho oiue 
He ca MMn/ieMeHTwpaHM cnep,Hv\je cpyHKu.kiOHa/iHOcri/i: extern flupeKTMBaTa v\ 
noAAP"b>KKa Ha npi/mTe/iCKM aceM6/iMTa (friend assemblies). KoMnn/iaToptT Ha 
Mono 3a C# npneMa cbiunTe onunn KaTO KOMnw/iaTopa Ha Microsoft 3a C#. 
OnuuMTe MoraT p,a 3anonBaT KaKTO c HaK/iOHeHa nepTa "/" , TaKa v\ c Tupe "-". 
Bcm4km cneuMCpM4HM 3a Mono onuMM, komto ziwncBaT npn Microsoft KOMnw/ia- 
Topa, 3ano4BaT c " — ". KoMnn/iau.nflTa ce M3B"bpujBa ot KOMaHflHua peA: 



% mcs program. cs 



Cbc c^eflHaTa KOMaHfla ce KOMnw/ikipaT peKypcuBHO bcm^km C# cpaw/iOBe, 
3ano4BaMKM ot TeKymaTa AnpeKTopi/m: 



% mcs -recurse : ' * . cs ' 



Mono KOMnn^aToptT e nucaH ki3u.fl.no Ha C#. TaKa tom MO>xe caM na 
KOMnn^upa co6cTBeHMfl cm cope koa. KoMnn^aToptT MO>Ke fla 6"bfle crapTwpaH 
noA Linux c Mono BwpTya/iHaTa MaiunHa, KaKTO v\ nop, Windows c .NET v\ Mono 
BnpTya^HMTe MaiunHM. 

Mono KOMnn/iaToptT 3a C# noAAtpwa v\ hakom onTHMM3aunM, KaTO pa3r"bBaHe 
Ha KOHCTaHTMTe (constant folding) v\ ej\vw\v\Ha\\v\s\ Ha Hew3no/i3BaH koa. 

KaKTO KOMnn^aToptT, TaKa v\ BwpTya/iHaTa Mawi/ma Ha Mono MMn/ieMeHTi/ipaT 
ECMA CTaHAapTMTe, KoeTO vv\ npaBM Hant/iHO CbBMecTMMM c Microsoft .NET 
Framework. ToBa no3BO/isiBa npw/io>KeHi/m, KOMnw/iwpaHM c mcs noA Linux p,a 
ce M3n"b/iHABaT noA Windows v\ npw.no>KeHi/m KOMni/i/ikipaHi/i c csc.exe p,a ce 
M3n"b^HABaT 4pe3 BkipTya/iHaTa Mawkma Ha Mono 6e3 p,a ce Ha/iara npeKOMnn- 
na\\v\s\. 




3a fla nocTMrHeTe TaKaBa cbBMecTMMoa Mewfly Linux v\ 
Windows e Hy>KHO npmioKeHMHTa, komto KOMnminpaTe fla He 

M3nO/13BaT 06p~blfleHM5l KT»M n/iaTCpOpMeHO 3aBMCHMH CpyHK- 

\\v\v\ npe3 Win32 API v\nv\ npe3 P/Invoke. 



Mono gmes 

ripoeKTBT Mono BK/iK>nBa m KOMnw/iaTopa gmes, komto me 3aMecTM mcs cneA 
Bepcufl 1.2 Ha Mono. B MOMeHTa gmes noAA^pwa Hant/iHO noc/ieAHaTa ECMA 
cneuncpMKauMfl (TpeTO M3AaHne) v\ npw/io>KeHi/iflTa, pa3pa6oTeHM c Hero 
i/i3no/i3BaT .NET 2.0 6w6/iMOTeKMTe. riOAA'bpwaT ce generics v\ APyrnTe hobo- 
BtBeAeHMfl ot .NET Framework 2.0. 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 875 

Visual Basic .NET KOMnmiaTop - mbas 

MonoBASIC (mbas) e CIL KOMnw/iaTop 3a e3MKa Visual Basic .NET. Ba3npaH e 
Ha CTapa Bepcun Ha mcs v\ b MOMeHTa e 6eTa Bepcua. ripi/i/io>KeHi/m, nucaHM 
noA Windows v\ KOMnw/ikipaHi/i c Windows KOMni/i/iaToptT 3a VB.NET, MoraT p,a 
ce CTapTupaT c BkipTya/iHaTa MaiunHa Ha Mono, KaKTO v\ npn^OKeHna KOMnn- 
/lwpaHki c mbas MoraT fla ce crapTwpaT nofl Windows. Novell Bene He nofl- 
Atpxa pa3pa6oTKaTa Ha mbas. 

Mono aceM6/iep n flM3aceM6/iep - ilasm m monodis 

ripoeKT"bT Mono BK/iionBa m flBa MHCTpyMeHTa 3a pa6oTa c Intermediate 
Language - aceM6/iep"bT ilasm v\ AH3aceM6/iep"bT monodis. AceM6/iep"bT 
npneMa KaTO BxoAeH napaMeTbp <£ai/i/i, cbAtpwam Common Intermediate 
Language v\ reHepupa cjDaM/i (HaM-necro c pa3UJnpeHne .exe v\ .dii), komto 
cbfl"bp>Ka CIL 6aMT koa. fln3aceM6^ep"bT Ha Mono reHepupa TeKCTOB <\>av\n c 
CIL MHCTpyKUMM ot Apyr (fcaM/i, cwvb p>xa lu CIL 6aMT koa. To3m <\>av\n Mowe p,a 
6"bAe noAaAeH Ha aceM6/iepa ilasm 3a reHepupaHe Ha aceM6/iw, KoeTO Mowe 
Aa ce CTapTupa c BkipTya/iHaTa Mawkma. Mono AH3aceM6/iep"bT ce crapTwpa 
etc c^eAHaTa KOMaHAa: 



% monodis --output=program. il program.exe 



TeHepupaHMflT dpawn c MMe program. il MO>KeTe Aa noAaAeTe Ha aceM6/iepa. 
ToBa CTaBa c KOMaHAaTa: 



% ilasm program.il 



Mono fle6i>rept»T - mdb 

Mono npeAOCTaBfl v\ Ae6trep 3a .NET npM/io>KeHMfl. Tom MO>xe Aa 6"bAe 
M3no^3BaH 3a Ae6"brBaHe Ha ynpaB/iABaHM v\ HeynpaB/iflBaHw npw/io>KeHkifl. J\o 
MOMeHTa Ae6"brep"bT e <£yHKu.kiOHa/ieH, ho e HecTa6w/ieH v\ M3MCKBa TecTBaHe. 

M3rpaAeH Btpxy 6ki6/ikiOTeKa, npnTe>KaBaiua Heo6xoAHMi/iTe MHCTpyMeHTM, 
Mono Ae6"h>rep"bT npeA-nara ABa Hankma Ha no/i3BaHe: npe3 K0H30/iHaTa 
KOMaHAa mdb m MHTerpaunfl c MonoDevelop. Ha crpaHi/iuaTa http://deobald. 
qlcn.com/wiki/index.php/Enablinq the Debugger Add-In MO>xeTe Aa pa36epe- 
Te KaKAa w3no/i3BaTe Mono Ae6-brepa c MonoDevelop. 

Mdb e Mono Ae6-brep-bT 3a pa6oTa ot KOMaHAHna peA- no Ha^MHa cm Ha 
M3no^3BaHe HanoAo6*iBa Ae6"brepa 3a C/C++ npn^OKeHna gdb. 

3a Aa ce ki3no/i3Ba nt/iHOueHHO mdb, nporpaMaTa Tpa6Ba Aa e KOMnw/ikipaHa 
etc cneu.ua/iHa MHCJDopMauMfl, y/iecHABama npoueca Ha Ae6"brBaHe. 3a Aa 
nocTurHeTe TOBa, KOMnn^npawTe BaiuaTa nporpaMa no cj\ep,uv\s\ HanwH: 



% mcs -debug program. cs 



876 



flporpaMnpaHe 3a .NET Framework (tom 2) 



MoweTe fla crapTkipaTe mdb, 3a fla fle6"brBaTe Bene KOMnw/iwpaHaTa nporpaMa, 
M3no^3BaMKM cneAHaTa KOMaHfla: 



% mdb program.exe 



Hpe3 KOMaHflMTe continue, step, next, finish MO>KeTe R3 npoc/ieAHTe 

M3nt^HeHneT0 Ha BaiuaTa nporpaMa pep, no pep,. 

AoKyMeHTauiMfiTa Monodoc 

Mono AOKyMeHTaunflTa MO>Ke p,a 6"bAe pa3r/ieAaHa no Tpi/i Hani/ma: Ha crpa- 
HnuaTa http://www.qo-mono.com/docs , npe3 rpacpwuHOTO npw/io>KeHi/ie 

monodoc V\J\V\ npe3 K0H30/1H0T0 npkl/10>KeHI/ie mod. 



rpa4>MHHMnT 6pay3i>p Monodoc 

Monodoc e rpacpi/meH 6pay3"bp 3a AOKyMeHTaui/m Ha 6n6/inoTeKM. CbAtpwa 
onucaHne Ha craHAapTHkiTe 6i/i6/iwoTeKki, Aont/iHMTe/iHWTe Mono K/iacoBe v\ 
K/iacoBeTe 3a rpacpi/mHki npn^OKeHna, cbAtpwa cneuncpuKaunaTa Ha e3MKa 
C# M HflKO/IKO P"bKOBOACTBa. no3BO/iHBa Aont/iBaHe Ha MHCpopMaunflTa. 



E Mi-ii-in l)H-iriimirnit*Ur>n Llfcr*rr 



File Edit View Bookmarks Help 



i > sj Glade 



"^ Mono Documentation 
t- Mano Handbook 
I Class Library 

> Mono Libraries 

^ Gnome Libraries 
t> Art 

b Atk 
b GConf 

I â– â– â– â–  I- "i â–  \ .. : i â–  i 

> GLib 

> Gda 

[:â–  Gdk 

> Gnome 

b GnomeDb 

b Gtk 

> Pango 

> Rsva 

t> Vte 

b Gtk sour eeVte-N 

> Moalla Libraries 
[> Novell Libraries 

I C# _, hi .1.1..:°. . \ |. v.l'l. ,'.'.■'' 






jlL 



±1 



zl 



Jgj Concents Q Index Q Search 



21 sub-pages 



Wqvq Cfoss Library : Narpes paces 
Glade Namespace 

User interface l-oa ding at runtime. I Edit! 

Remarks 

The Glade- classes -give applications the Ability to load user Interfaces from. XML 

files at runtime. These interface files can be created with the Glade user interface 

builder. The Glade classes are also capable of automatically connecting handlers 
to trie signals defined in trie interface file. 

fEdrtl 



Type 



Global 



HandlenWctFoundExceptlon 



Parser 



Standard 



WidqetAttributE 



Summary 



Global API elements for Glade 



Exception thrown when signal autoconnection 
falls. 



Glade's parser used to turn XML into its internal 
format. 



Some standard methods used by glade to build 
widgets. 



Harks a widget for auto -binding 



Allows dynamic loading of user mCerf aces from 
XML descriptions 



r 



* 



zi 



ripn FreeBSD onepaunoHHaTa cwcreMa, 6pay3"bp"bT Monodoc e BK/uoneH b 
ports cucTeMaTa v\ ce kiHcra/ikipa Aont/iHi/ue/iHO. 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 877 
Monodoc ce crapTkipa etc c/ieflHaTa KOMaHAa: 



% monodoc 



Mod 

CtiuecTByBa HanwH 3a nper/ie/i Ha flOKyMeHTaukisrra, 6e3 fla ce Ha/iara 
CTapTupaHeTO Ha rpac|DkmHki npn^o>KeHMfl. 3a ue/ua ce i/i3no/i3Ba KOH30/iHaTa 
KOMaHAa mod. MHCJDopMauMflTa, koato MO>Ke fla 6"bAe no/iyneHa ot Ta3M KOMaH- 
Aa, e CbmaTa, KaKTO npn M3no/i3BaHeTO Ha rpac|DkmHkifl 6pay3"bp monodoc, c 
pa3/im<aTa, ne e npeflocraBeHa b TeKcrc-B <£opMaT. 

3a fla no/iynwTe MHCJDopMauMfl othocho bci/iukm TunoBe b npocrpaHCTBOTO ot 
MMeHa system, M3n"b^HeTe c/ieflHaTa KOMaHfla: 



% mod N: System 



Mono K/iacoBeTe 

OcBeH ocHOBHaTa 6i/i6/iwoTeKa c K/iacoBe Ha Microsoft .NET Framework, Mono 
flo6aBfl m flont/iHHTe/iHi/i npocrpaHCTBa c K/iacoBe. Eto no-Ba>KHMTe ot: 

- B npocrpaHCTBOTO Mono. security ce MMn/ieMeHTkipaT c|DyHKUMOHa^HOCTM 
CB"bp3aHM etc curypHOCTTa, KaTO hakom KpnnTorpac|DCKM a/iropwTMki, 
noAnncBaHe Ha koa m X.509 cepTMCJDMKaTM. 

- Mono. Cairo e rpac|DkmHa 6n6/ikiOTei<a 3a Bp"b3Ka c 6n6/ikiOTeKaTa ot 
hmcko hmbo 3a BeKTopHa rpac|Di/iKa cairo. 

- Mono. Math flo6aBfl flont/iHHTe/iHa c|DyHKUkiOHa/iHOCT 3a pa6oTa c 
MaTeMaTi/mecKki onepaunn, HanpuMep reHepupaHe Ha npocTM nwcna. 

- Mono. Unix npeflocTaBfl MHTepc|DeMC 3a pa6oTa c POSIX CTaHflapTM3npaHn 
onepaunoHHM cm ere mm. POSIX e Ha6op ot craHflapâ„¢ 3a nucaHe Ha 
nporpaMM. Hpe3 Ta3M 6n6/ikiOTeKa, Mono oci/irypaBa Ha6op ot yenyrw, 
npeflocTaBeHM ot POSIX craHflapTMTe KaTO cucTeMHM M3BMKBaHM5i v\ 

CVWUaiWA. ripOCTpaHCTBOTO Ce M3n0^3Ba M 3a /10Ka/lkl3ai4l/lfl Ha KOH30/1HM 

m rpac|DM4HM npi/i/io>KeHi/m. C/ieflHkisiT npuMep noKa3Ba KaK MOweM fla 

B3eMeM CB060flHOTO fll/ICKOBO npOCTpaHCTBO nOfl UNIX. T03M KOfl MO>Ke 

fla ce i/i3n"b/iHki caMO KoraTO onepaunoHHaTa cwcreMa e UNIX noflo6Ha, 
KaK fla HanpaBMTe TOBa MOweTe fla pa36epeTe KaTO nor^eAHeie b "KaK 
fla m/iujeM npeHOCMM koa?". 



Mono . Unix . UnixDrivelnfo info = new UnixDrivelnf o ( "/ " ) ; 

Console .WriteLine ( "Disk Size: " + inf o . TotalSize) ; 

Console .WriteLine ( "Free Space: " + inf o . AvailableFreeSpace) 



Mono.Mozilla 6kl6^MOTeKMTe n03BO/lflBaT fla Ce BM"bKHaT CJDyHKUMOHa^- 

hoctm ot 6pay3"bpa Mozilla b Gtk npn/iOKeHM^Ta hm. 



878 nporpaMnpaHe 3a .NET Framework (tom 2) 

- Mono. Gnome Hi/i no3BO/isiBa fla M3no/i3BaMe B"b3MO>KHOCTMTe Ha Gnome 3a 
cb3flaBaHe Ha noTpe6MTe/iCKM MHTepcpeMCM, pa6oTa c TeKCT v\ pa3/iMHHM 

BkipTya^HM CpaM/lOBM CMCTeMM. 

- ripOCTpaHCTBOTO Mono. Data npeflOCTaBfl Bp"b3Ka C MHO>KeCTBO 6a3M 

AaHHM KaTo: PostgreSQL, MySQL, SQLite, Tds v\ Oracle. 

- 5w6/ikiOTeKaTa icsharpcode . sharpzipLib npefl/iara cpeflCTBa 3a pa6oTa 
c KOMnpecupaHM cpaw^OBM v\ apxuBM. 

B Mono, npn MMn/ieMeHTau.MflTa Ha craHAapTHMTe 6m6/imot6km ot .NET 
Framework noHAKora ce Ao6aBHT v\ Aont/iHMTe/iHM MeTOAM h CBOMCTBa, 
pa3UJnpflBaiun TAXHaTa cpyHKUMOHa/iHOcr. 

ll0/ie3HI1 MHCTpyMeHTM 

3aeAHO c Mono, noA Linux 6a3npaHM onepaunoHHM CMcreMM MoraT p,a ce 

M3nO/13BaT M HflKOM M3K/lK>HMTe/lHO nO/ie3HM MHCTpyMeHTM, KOMTO Ca AOCTbnHM 

m noA Windows Btpxy Microsoft .NET Framework. 

NAnt 

NAnt ( nant.sourceforqe.net ') e CBo6oAeH MHCTpyMeHT 3a nocrpoABaHe 3a .NET 
npM^o>KeHMfl (build tool). Tom y/iecHABa M3K/iionMTe/iHO npoueAypaTa no 
KOMnM^auMfl m M3rpa>KAaHe Ha nporpaMeH naKeT (package build) m npeAOC- 
TaBfl peAMua Aont/iHMTe/iHM KOMaHAM 3a Bpt3Ka c onepauMOHHaTa CMcreMa, 
CVS m NUnit. MHCTpyMeHTbT e aHa/ior Ha nony/i5ipHM5i b Java cpeAMTe Ant 
( ant.apache.org ). ripoAyKTbT e 6a3MpaH Ha .NET m pa6oTM m noA Windows. 

MHCpopMauMfl othocho MHcra/iMpaHeTO Ha NAnt 3a Mono e AOCTbnHa ot crpa- 
HMuaTa http://www.mono-project.com/NAnt Installation . 

NUnit 

NUnit ( www.nunit.org ) e MHcrpyMeHT 3a cb3AaBaHe Ha unit TecTOBe 3a bcmukm 
.NET e3MUM. BepcMfl 2.2 Ha NUnit ce pa3npocrpaHflBa 3aeAH0 c Mono. 

TpacpMUHOTO npM^o>KeHMe Gnunit ce M3no/i3Ba 3a CTapTMpaHe Ha NUnit 
TecTOBe b rpacpM^Ha cpeAa. 

rioBene MHCpopMauMfl 3a MHCTpyMeHTMTe, CB"bp3aHM c npoueca Ha pa3pa6oTKa 
Ha .NET npM/io>KeHMfl, Moxe p,a ce HaMepM b TeMaTa " FIomoluhm MHCTpyMeHTM 
3a .NET pa3pa6oTHMU.M ". 

'Hello Mono' c Mono 

riMcaHeTO m M3n"b^HABaHeT0 Ha npM/io>KeHMfl c Mono e TO/iKOBa ziecHO, 
ko/ikoto m c Microsoft .NET Framework. LU,e noKa>KeM CTbnKa no CTbnKa KaK 
ce KOMnM^Mpa m CTapTMpa npMMepHa nporpaMa m KaK ce M3no/i3BaT AH3aceM- 
6/iep"bT m Mono Ae6"h>rep"bT. 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 879 

COPC KOflt»T 

C"b3flaBaMe cjDaM/i c MMe HeiioMono.es etc cneflHOTO c"bfl"bp>KaHMe: 



HelloMono . cs 



using System; 

class HelloMono 

{ 

static void Main ( ) 

{ 

string hello = "Hello Mono!"; 
Console . WriteLine (hello) ; 
} 
} 



KoMnn/inpaHe 

TaKa c"b3flafleHMAT <\>av\n MO>KeM fla KOMnw/ikipaMe npe3 cneflHaTa KOMaHfla: 



% mes -debug HelloMono . cs 



Oaw/i"bT HeiioMono.es e Bene KOMni/i/iwpai-i. Pe3y/iTaTHM*iT <$av\n e c MMe 
HelloMono . exe m cbfl"bp>Ka CIL KOfl. /Jont/iHHTe/iHaTa onunfl -debug reHepwpa 
cneuwa/iHa i/mc|DopMaui/ifl, koato me noc/iy>Kki npn fle6"brBaHe. 

CrapTupaHe 

IHe M3no/i3BaMe BkipTya/iHaTa Mawkma mono, 3a fla ki3n"b/iHHM KOMnw/ikipaHaTa 
nporpaMa. C/iefl ycneujHO i/i3n"b/iHeHi/ie Ha K0H30/iaTa me ce M3nMiue "Hello 
Mono!". 



% mono HelloMono . exe 
Hello Mono ! 



ripn irbpBOTO ki3n"b/iHeHkie Ha nporpaMaTa 3a6e/iH3BaMe /iei<o 3a6aBHHe. To e b 
pe3y/iTaT ot pa6oTaTa Ha JIT KOMnw/iaTopa, komto KOMnw/ikipa v\ 3ape>Kfla 
native KOfla b naMerra. ripn noBTopHO M3BMKBaHe He ce KOMnw/inpa btopm 
nvr, nopaflu KoeTO v\ i/i3n"b/iHeHweT0 e Ma/iKO no-6tp30. 

flM3aceM6nnpaHe 

M3no^3BaMe flki3aceM6/iepa Ha Mono monodis, 3a fla pa3r/ie,qaMe MHCTpyKun- 
MTe KtM BnpTya^HaTa Mawi/ma, komto KOMni/i/iaToptT e reHepi/ipa/i. 



monodis --output=HelloMono . il HelloMono . exe 



880 nporpaMnpaHe 3a .NET Framework (tom 2) 

B pe3y/iTaT ot ropinaTa KOMaHfla no/iynaBaMe cpaw/ia HeiioMono.il, komto 
cbfl"bp>Ka IL KOfla Ha AH3aceM6/ii/ipaHOTO aceM6/iw: 



HelloMono . il 



.assembly extern mscorlib 

{ 

.ver 1:0: 5000: 

.publickeytoken = (B7 7A 5C 56 19 34 EO 89 ) // . z\V.4. 

} 

.assembly 'HelloMono' 

{ 

.hash algorithm 0x00008004 
.ver 0:0:0:0 

} 

.module HelloMono.exe // GUID = { 3722559E-A214-4275-B057- 

EF0E58CD4393} 

.class private auto ansi bef oref ieldinit HelloMono 

extends [mscorlib] System. Ob j ect 

{ 



Ae6i>rBaHe c mdb - Hello Mono pen no pen 

3a fla i/i/iKDcrpkipaMe pa6crraTa c fle6"brepa mdb, me M3no/i3BaMe KOMrm/inpa- 
HaTa Bene nporpaMKa HelloMono.exe. 3anonBaMe Ae6"brBaHeTO etc c/ieflHaTa 
KOMaHAa: 



% mdb HelloMono . exe 
Mono Debugger 



CrapTwpaMe nporpaMaTa c KOMaHflaTa run: 



(mdb) run 

Starting program: HelloMono.exe 

Process @4 stopped at #0: 0x003876be in HelloMono .Main () +0xe at 
/home/ceco/Pro jects/dotnet/hello/HelloMono . cs : 7 . 
7 string hello = "Hello Mono!"; 



Ha nocneAHi/m pep, ce ot M3X0Aa Ha Ae6"brepa ce M3nncBa peA^T, komto 
npeACTOM p,a 6"bAe M3n"b/iHeH. C KOMaHAaTa next npucrbnBaMe kbm M3n"b/iHe- 
HueTO Ha TeKyiunfl peA: 



(mdb) next 

Process @4 stopped at #0: 0x003876d2 in HelloMono .Main () +0x22 at 
/home/ceco/Pro jects/dotnet/hello/HelloMono . cs : 8 . 
8 Console .WriteLine (hello) ; 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 881 

Ha noc/ieflHkifl pefl othobo Bki>KflaMe TeKymaTa KOMaHfla 3a ki3n"b/iHeHi/ie. Cnep, 
ki3n"b/mei-ikieTO Ha pefl 7, c noMOurra Ha KOMaHflaTa print MO>KeM fla npocne- 
flMM ctCTOAHneTO Ha npoMeH/ikiBaTa hello: 



(mdb) print hello 

(System. String) "Hello Mono!" 



M3nncBaT ce Ti/invr Ha npoMeH/iMBaTa hello v\ HeMHaTa ctomhoct. 

Othobo c KOMaHflaTa next ki3n"b/iH*iBaMe TeKymnfl pefl ot nporpaMaTa v\ Ha 
eKpaHa ce OTnenaTBa pe3y/iTaTbT ot ki3n"b/iHeHkieTO My. npoflt/iaoBaMe M3- 
nt^HeHneTO Ha nporpaMaTa pefl no pefl v\ M3/iM3aMe ot fle6trepa c KOMaHflaTa 

quit: 



(mdb) next 
Hello Mono ! 

Process @4 stopped at #0: 0x003876d9 in HelloMono .Main () +0x29 at 
/home/ceco/Pro jects/dotnet/hello/HelloMono . cs : 9 . 

9 } 
(mdb) next 

Process @4 terminated normally, 
(mdb) quit 



ADO.NET m Mono 

Mono MMa mhoto ADO.NET Data Providers KaKTO 3a KOMepcua/iHM ctpB-bpn 3a 
6a3M ot flaHHM (Microsoft SQL Server, Oracle, IBM DB2 Universal Database), 
TaKa m 3a cbo6oahm TaKMBa (MySQL, PostgreSQL, SQLite). Hakoi/i ot tax 
M3MCKBaT flont^HMTe^HM 6 w 6/1 ki OTe k w , flpyrw ca HanncaHM v\3\\s\j\o Ha C#. 

Npgsql - Data Provider 3a PostgreSQL 

Npgsql ( http://qborq.postqresql.org/proiect/npqsql/proidisplav.php ') no3BO/i5i- 
Ba .NET npw/iOKeHkifl fla ce CB"bp3BaT v\ fla o6MeH*iT flaHHM c PostgreSQL 
( www.postqresql.org ) ctpBtp 3a 6a3M ot flaHHM. 

PostgreSQL e eflHa ot HaM-flo6pnTe open-source 6a3M flaHHM v\ npnTe>KaBa 
mhoto ot B"b3M0>KH0CTMTe Ha no-ro/ieMMTe CM KOMepCMa^HM Cb6paTfl. BCbLfl- 
hoct PostgreSQL Konupa mhoto ot apxnTeKTypHMTe v\ TexHO/iorwuHki noflxoflu 
Ha Oracle (HanpuMep e3MKa PL/SQL), 3apaflM KoeTO noHHKora ro Hapi/maT 
"k^ohmht Ha Oracle". 

Npgsql Data Provider e WMn/ieMeHTkipaH ki3u.fl.no Ha C# v\ He n3MCKBa 
flont^HMTe^HM 6n6^noTeKM. C Hero MO>KeTe fla ycraHOBMTe Bp"b3Ka c 
PostgreSQL ctpBtp Bepcua 7.x v\ no-HOBM, KaKTO v\ fla cb3flaBaTe, npoMeHATe 
n M3TpnBaTe flaHHM. K/iacoBeTe, Hy>KHM 3a pa6oTa c Npgsql, ce HaMnpaT b 

npocrpaHCTBaTa System. Data M Npgsql. 

Eto npuMep 3a i/i3no/i3BaHeTO Ha Npgsql 3a Bp-b3Ka c PostgreSQL: 



882 flporpaMnpaHe 3a .NET Framework (tom 2) 



PostgreExample . cs 



using System; 
using System. Data; 
using Npgsql; 

public class PostgreExample 

{ 

public static void Main ( ) 

{ 

string connectionString = 
@"Database=mydb; 
Server=localhost; 
User ID=myusername; 
Password=mypassword" ; 

NpgsqlConnection dbcon = 

new NpgsqlConnection (connectionString) ; 
dbcon . Open ( ) ; 

try 

{ 

string sql = "SELECT name FROM Employee"; 
NpgsqlCommand cmd = new NpgsqlCommand ( sql, dbcon); 

// Reader example 

NpgsqlDataReader reader = cmd. ExecuteReader ( ) ; 

using (reader) 

{ 

while ( reader . Read () ) 

{ 

string name = (string) reader [ "name" ] ; 

Console . WriteLine (name) ; 
} 
} 

// Data Adapter example 

NpgsqlDataAdapter adapter = new NpgsqlDataAdapter ( ) ; 

adapter . SelectCommand = new NpgsqlCommand ( sql, dbcon) 

DataSet resultDS = new DataSet ( ) ; 

adapter . Fill ( resultDS ) ; 

DataTable tableEmployee = resultDS . Tables [ 0] ; 

foreach (DataRow row in tableEmployee . Rows ) 

{ 

Console .WriteLine ( row [ "name" ] . ToString ( ) ) ; 

} 
} 
catch (NpgsqlException sqlEx) 

{ 

Console .Err .WriteLine ( sqlEx) ; 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 883 



// Log the error 

} 
finally 

{ 

// Clean up 
dbcon . Close ( ) ; 
dbcon = null; 
} 
} 
} 



B npuMepa ce onaKBa b 6a3aTa ashhh Aa uMa Ta6/ikiua Empieyee c KO/iOHa 

name OT TMn CMMBO/ieH HM3 (npMMepHO varchar(50) ). AKO MCKaTe fla 1/13110/13- 

BaTe ycneujHO v\ Knpi/i/inua, npn cb3AaBaHeTO Ha 6a3aTa ashhh Tpa6Ba p,a 
3aAaAeTe KOAnpaHeTO p.a 6wie "win" v\nv\ "Unicode". 

ripuMeptT Mowe Aa ce KOMnn/inpa v\ crapTkipa etc cnep,uv\je KOMaHAn: 



% mes TestExample.es -r: System. Data. dll -r :Npgsql . dll 
% mono PostgreExample.exe 



MySQL Data Provider 

B MOMeHTa I/ma ABa MySQL Data Providers: ByteFX.Data.MySqlciient v\ 
MySQL Connector/Net. /JocraBm/iK-bT Ha ashhh ByteFX.Data.MySqlciient He 
ce pa3pa6oTBa aKTMBHO, ho e BK/iK>neH b AncTpn6yunnTe Ha Mono, ripeno- 
p-b4Ba ce M3no^3BaHeTO Ha MySQL Connector/Net. Tom ce pa3pa6oTBa v\ noA- 
Atpxa ot MySQL AB ( www.mysql.com '), cJDupMaTa, koato pa3pa6oTBa ctpBtpa 
MySQL, m Tpa6Ba Aa 6"bAe Ao6aBeH Aont/iHMTe/iHO kbm BaujMTe 6n6/iMOTeKM. 

3a Aa M3no/i3BaTe MySQL Connector / Net Data Provider Tpa6Ba Aa CBa/iMTe 
c-bOTBeTHaTa 6ki6/ikiOTei<a ot crpaHi/iuaTa http://dev.mysql.com/downloads/ 
con nector/net/1.0. html . 

C^eABaiunflT npuMep noKa3Ba Hankma Ha pa6oTa c MySQL Connector/Net: 



MySQLExample . cs 



using System; 

using System. Data; 

using MySql . Data .MySqlClient; 

public class MySQLExample 

{ 

public static void Main ( ) 

{ 

string connectionString = 
"Data Source=MyServer; " 
"Database=MyDatabase; " - 



884 flporpaMnpaHe 3a .NET Framework (tom 2) 



"User ID=MyUser; " + 
"Password=MyPassword; " ; 

MySqlConnection dbcon = 

new MySqlConnection (connectionString) ; 
dbcon . Open ( ) ; 

try 

{ 

string sql = "INSERT INTO Test (id, text) " + 

"VALUES (1001, test)"; 
MySqlCommand dbcmd = new MyS ql Command ( sql, dbcon); 
dbcmd . ExecuteNonQuery ( ) ; 

} 

catch (MySqlException sqlEx) 

{ 

Console . WriteLine ( sqlEx .Message) ; 
// Log the error . . . 

} 
finally 

{ 

// Clean up 
dbcon . Close ( ) ; 
dbcon = null; 
} 
} 



KoMni/i/iwpaMe v\ crapTi/ipaMe cbc cnefxnwje KOMaHflu: 



% mcs MySQLExample.es -r: System. Data. dll -r :MySql .Data. dll 
% mono MySQLExample . exe 



noBe^e MHCpopMaunsq othocho MySQL Connector/Net e AOCTbrma ot CTpaHM- 
uaTa http://dev.mysql.eom/downloads/connector/net/l.0.html . 

OracleClient - The Oracle Data Provider 

B npocrpaHCTBOTO OT 1/IMeHa System. Data. OracleClient ce HaMupa Data 
Provider 3a Bpt3Ka etc ctpBtpa 3a 6a3M ot ashhh Oracle ( www.oracle.com ). 
fl,o MOMeHTa ce noflfl"bp>KaT Oracle 8i, 9i v\ lOg. 3a fla i/i3no/i3BaTe Oracle 
Provider ce M3MCKBa 6ki6/ii/iOTei<aTa "Oracle OCI". system. Data. OracleClient 
MO>Ke p,a 6"bfle M3no^3BaH KaKTO noA Linux, TaKa v\ nop, Windows. 

SqICIient - Data Provider 3a Microsoft SQL Server 

AD0.NET Data Provider 3a pa6oTa c Microsoft SQL Server ce HaMupa b 
npocrpaHCTBOTO system. Data. sqiciient. rioAfl'bp>KaT ce BepcuMTe Microsoft 
SQL Server 7, 2000 v\ 2005. Data Provider 3a Microsoft SQL Server e MMn/ie- 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 885 

MeHTupaH v\3u,nno Ha C# v\ no3BO/i*iBa v\ flBaTa Hankma Ha aBTeHTHKauna: SQL 
Server Authentication v\ Integrated Authentication. 



SqlClientExample . cs 



using System; 

using System. Data; 

using System. Data . SqlClient; 

public class SqlClientExample 

{ 

public static void Main ( ) 

{ 

string connectionString = 
" Server =My Server; " + 
"Database=pubs; " + 
"User ID=MySqlServerUserId; " + 
"Password=MySqlServerPassword; " ; 

IDbConnection dbcon = new SqlConnection (connectionString) ; 
dbcon . Open ( ) ; 

try 

{ 

IDbCommand dbcmd = dbcon . CreateCommand () ; 

dbcmd. CommandText = "SELECT fname, lname FROM Employee"; 

IDataReader reader = dbcmd. ExecuteReader () ; 

using (reader) 

{ 

while ( reader . Read ( ) ) 

{ 

string firstName = (string) reader [ "fname" ] ; 
string lastName = (string) reader [ "lname" ] ; 
Console .WriteLine ( "Name : {0} {1}", firstName, 
lastName) ; 
} 
} 
} 
finally 

{ 

// Clean up 

dbcon . Close ( ) ; 

dbcon = null; 
} 



ripuMeptT MO>Ke fla ce KOMnw/ikipa m ce crapTkipa etc c/ieflHMTe KOMaHAn: 



% mes SqlClientExample.es -r: System. Data. dll 



886 flporpaMnpaHe 3a .NET Framework (tom 2) 



mono SqlClientExample . exe 



Ye6 TexHO/iorwiiTe b Mono 

HeKa cera pa3r/ie,qaMe TexHO/iorwkiTe 3a M3n"b/iHeHkie Ha ASP.NET ye6 npw/io- 
>KeHi/m m ye6 yc/iyrw nofl Mono. 

ASP.NET nofl Mono 

MoAyitT mod_mono 

ApxnTeKTypaTa Ha ye6 ctpBtpa Apache no3BO/iHBa i/i3no/i3BaHeTO Ha MOflynw. 
Eamh MOflyn OTroBapa 3a M3n"b/iHeHkieTO Ha Perl CKpunTOBe, Apyr Ha PHP v\ 
t.h. B Haiunfl c/iynaw MOfly/ivr, o6pa6oTBaiu ASP.NET 3a5iBKkiTe, ce Hapwua 
modjoono . 

1/lHCTa/inpaHe m KOHCpnrypnpaHe Ha mod_mono 

Haw-flo6pe e fla HaMepnTe totob naKeT 3a BawaTa flncTpn6yunfl. Cnep, KaTO ro 
MHCTa^npaTe Tpa6Ba fla flo6aBMTe bbb Baujua Apache KOHCpurypaunoHeH cpaw/i 

(httpd.conf) HflKOM HaCTpOMKM, aKO He Ca fl06aBeHM aBTOMaTM4HO. MMa flBa 

Hankma 3a KOHCpurypauna Ha mod_mono. 

n~bpBM HaHHH 

Ot Bepcufl 1.1.10 Ha Mono b mod_mono e BK/iK>neHa cwcreMa 3a aBTOMaTkmHa 
KOHCpurypaunfl, koato no3BO/iflBa 6"bp30 v\ ziecHO ynpaB/ieHkie Ha ASP.NET 
npn^o>KeHMflTa, M3MCKBa ce Mi/mwMa/iHa npoMHHa Ha KOHCpurypaunoHHUfl 
cpaki/i Ha Apache. Bci/iuko, KoeTO e Heo6xoflMMO, e fla BK/uonwTe MOfly/ia v\ tom 
aBTOMaTM^HO me o6c/iy>KBa ASP.NET npw/io>KeHkiflTa, komto ce HaMnpaT b ye6 
AnpeKTopuflTa Ha Bawi/m ye6 cbpBtp. ToBa CTaBa KaTO B3eMeTe cpaw/ia 

mod_mono . conf OT xsp V\J\V\ OT mod_mono naKeTMTe M nOCOHMTe B httpd.conf 

ntTfl flo Hero. ToBa CTaBa no cnep,uv\s\ Hankm: 



httpd. conf 



Include /etc/apache2/mod_mono . conf 



B npuMepa ce npeflno/iara, ne mod._mono.conf ce HaMupa b /etc/apache2/ 
flupeKTopuflTa. Mhoto Bepo^THO e Tfl fla e pa3/ikmHa Ha BaiuaTa cwcreMa. Ako 
Bene MMaTe MHcra/ikipaH MOfly/i"bT, ToraBa Tpa6Ba fla npn6aBMTe caMo: 



httpd. conf 



MonoAutoApplicationEnabled 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 887 
BTOPM HaHMH 

BTopuflT Ha^MH e no-cno>KeH. Cnep, i/iHcra/iaui/iyi KOHc|DkirypaukiOHHMflT cjDaM/i Ha 
Apache (httpd.conf) Tpa6Ba p,a 6"bAe peAaKTupaH v\ b Hero p,a ce Ao6aB*iT 
c^eAHMTe Heiua (aKO He ca 6i/i/im Ao6aBeHM aBTOMaTi/mHo): 

httpd . conf 



LoadModule mono_module modules /mod_mono . so 
Alias /test "/usr/share/doc/xsp/test" 

# TyK ce fle$MHnpa CBipsBaHe Ha BMpTyajiHaTa flHpeKTopMfl test c 

# jioKajiHaTa /usr/share/doc/xsp/test. Ta3M KOMaHfla e jcbm Apache 

MonoAppli cat ions "/test: /usr/share/doc/xsp/test" 

# TyK 3anaBaMe cbihoto KaTO no-rope, ho Beye Ha mod_mono 

<Location /test> 

SetHandler mono 
</Location> 

# SetHandler yKa3Ba, ye BCHyra $awjioBe ot /test Tpa6Ba fla btflaT 

# obcjiyaceHM ot mod_mono . Ako raviaTe flpyrw $awjioBe b ctmaTa 

# flHpeKTopMfl, komto Tp^6Ba fla btflaT o6cjiyaceHM ot flpyrw MOflyjiM, 

# 3aMeHeTe SetHandler etc cjieflHOTo: 

# AddHandler mono . aspx .ascx .asax .ashx .config .cs .asmx . axd 



/usr/share/doc/xsp/test e AHpeKTOpMflTa, ICbAeTO xsp MHCTa/lkipa npwMep- 
hm xsp <£aM/iOBe, ho Moxe Aa 6"bAe BC^Ka Apyra b kohto MMa ASP.NET 
cJDaki^OBe. 

Ako MCKaTe mod_mono Aa o6c/iy>KBa noBene ot eAMH caMT, me Tpa6Ba Aa 
HanmueTe Heiuo, noAo6HO Ha c/ieAHOTo: 



LoadModule mono_module modules /mod_mono . so 

Alias /test "/usr/share/doc/xsp/test" 

Alias /personal "/home/user/mypages" 

AddMonoApplications default (+ HaimcauoTO ua cjieABanpia: pen) 

"/test: /usr/share/doc/xsp/test, /personal : /home/user/mypages" 

<Location /test> 

SetHandler mono 
</Location> 
<Location /personal> 

SetHandler mono 
</Location> 



HacTTa AddMonoApplications m AnpeKTopnnTe Tpa6Ba Aa ca Ha eAHH peA- 
06"bpHeTe BHMMaHne Ha 3aneTawKaTa b "/test: /usr/share/doc/xsp/test, 

/personal: /home/user/mypages", KOflTO pa3Ae/lfl AHpeKTOpMMTe Ha ABaTa 

caMTa. OcBeH TOBa ca Heo6xoAMMM v\ ABeTe HacTpoMKM <Location>. B"b3MO>K- 

HO e Aa MMa V\ HflKO/IKO mod_mono CbpBtpa. 



888 nporpaMnpaHe 3a .NET Framework (tom 2) 

PecrapTiipaHe Ha mod_mono 

CbmecTByBa npocT ye6 MHTepcpewc 3a pecrapTkipaHe Ha mod_mono. 3a fla ro 

BK/lKDHklTe, MO>KeTe fla fl06aBMTe C/ieAHMTe HaCTpOMKM B httpd.conf : 



<Location /mono> 






SetHandler 


mono-ctrl 


Order deny, 


allow 






Deny from all 






Allow from 


127.0 





1 


</Location> 









PecTapTupaHeTO ce Ha/iara, 3aiuoTO KoraTO CMeHMTe hakom dii cpai/i/i, Tpa6Ba 
fla pecrapTkipaTe Mono npoueca, komto ro o6cny>KBa. flpyr HanwH 3a TOBa e 
fla pecTapTupaTe ue/ikm httpd fleMOH (Apache): 



% service httpd restart 



flpn Debian/GNU Linux TOBa craBa no cneflHkifl Hani/m: 



/etc/init. d/ apache restart 



TecTBaHe Ha mod_mono 

Cera ocraBa fla HanniueTe b 6pay3"bpa cm http://localhost/test m fla npoBepnTe 
Aa/iki ce M3n"b^HflBaT npuMepHMTe ASP.NET cpaw/iOBe v\nv\ Te3M komto Bue ere 
yi<a3a/iM. 

Cl>pB-bp-bT XSP 

BTopuflT HanwH 3a xoctmht Ha ASP.NET e npe3 CbpBtp, nucaH Ha C#. Ako 

M3no^3BaTe Linux, me Tpa6Ba fla cm KOMni/i/ikipaTe v\/v\i\v\ MHcra/ikipaTe xsp 

flont/iHi/ue/iHO. nofl Debian/GNU ce kiHcra/ikipa naKerbT mono-xsp, a nofl 
Fedora Linux - naKerbT xsp. 

CbpB"bp"bT XSP ce CTapTupa no cj\ep,uv\s\ HanwH: 



% mono /usr/local/bin/xsp. exe — root 
/usr/local/share/doc/xsp/test/ — applications 
/ : /usr/local/share/doc/xsp/test/ 



Onui/mTa — root 3aflaBa flupeKTopnaTa, kohto me craHe HacToaiua 3a 

xsp. 

Hpe3 — applications ce 3aflaBaT flBe flupeKTopnn, pa3fle/ieHM c flBe 
to4km. ritpBaTa e BkipTya/iHa ye6 flupeKTopua, a BTopaTa e cbOTBeTCTBa- 
maTa v\ MCTMHCKa flupeKTopna. 

3a noBene MHCpopMauna noMeflHeie man crpaHkiuaTa Ha xsp. 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 889 

Cera, b no/ieTO 3a aApec Ha 6pay3-bpa, B-bBe>KflaMe http: //hostname: 8080/ 
index.aspx , KtfleTO hostname e MMeTO Ha KOMmorbpa, komto no/i3BaMe. 
Tpa6Ba p,a ce 3apeA^T npuMepHMTe aspx CTpaHnun, komto ce pa3npocrpa- 
HABaT c Mono. 

xsp noAA"bp>Ka Han-b/iHO ASP.NET 1.0 v\ ASP.NET 1.1. 3a ASP.NET 2.0 MO>xe p.a 
ce M3no/i3Ba Xsp2, komto M3no/i3Ba .NET 2.0 aceM6/ii/iTaTa. noAA"bp>KaT ce 
"r/iaBHki CTpaHnun" (master pages), K/iweHTCKi/i o6paTHM M3BMKBaHMfl (client 
callbacks), iokto m mhoto ASP.NET 2.0 kohtpo/im - MeHKua, A^pBeTa, 
rpnAOBe (gridviews) etc copTupaHe Ha ctpBtpa v\ npn K/iweHTa. 

HecTO cpeujiaHM npo6sieMM 

Ako MMaTe npo6/ieMki, cj\ep,sav\Te c/ieAHkue CTtnKM, 3a p,a vv\ AnarHOCTi/i- 
UnpaTe m OTCTpaHMTe: 

- ripoBepeTe p,anv\ ye6 ctpBtptT vw\a Aocrbn p,o AnpeKTopnnTe, KtAeTO ce 
HaMnpaT BaujMTe <\>av\i\OBe. 

- C/io>KeTe BaweTO ASP.NET npn^OKeHne, KoeTO MCKaTe p,a npo6BaTe b 
/usr/share/doc/xsp/test, TtM KaTO TaM npaBaTa 3a AOCTtn ca Bene 
Har/iaceHM. 

- npOBepeTe /var/log/apache2/error_log 3a HflKaKBM npo6/ieMkl CbC 

cbpB-bpa Apache. 

- ripoBepeTe p,anv\ 8080, He e 6/iOKi/ipaH etc 3aiunTHa CTeHa, v\nv\ Bene He 
ce no/i3Ba ot Apyro npki/io>KeHkie (aKO no/i3BaTe cbpBtpa XSP). 

- 3HaneHwe MMaT ro/ieMi/ue v\ Ma/iKMTe 6yKBM (HanpuMep "Index" v\ "index" 
ca pa3/ikmHki MAeHTMC|DMKaTopM). 

- 3anncBaMTe cpaM/ia c Baujua cope koa b UTF8 KOAnpaHe v\ ki3no/i3BawTe 
cneA TOBa onunflTa: -codepage : utf 8 Ha KOMnw/iaTopa msc. B Hana/iOTO 
Ha ASP.NET c|Daki^OBeTe c pa3UJnpeHne .aspx Ao6aBAMTe c/ieAHOTo: 



<%@Page language="C#" compilerOptions=" /codepage : utf 8" %> 



nponeTeTe "AewypHkue B-bnpocn" (FAQ) 3a ASP.NET v\ Mono: http://mono- 
proiect.com/FAQ: ASP.NET . 

MonoDevelop m ASP.NET 

3acera zikincBa BrpaAeHa noAAPt>KKa Ha ASP.NET npoeKTM b MonoDevelop, ho 
ce pa6oTM no Btnpoca. ri/iaHkipaHO b MonoDevelop Aa 6"bAe MHTerpupaH 
AspNetEdit - Bki3ya/ieH AH3aMHep b paHHa <£a3a Ha pa3pa6oTKa, 6a3npaH Ha 
Mozilla peAaKTopa. 

3acera H^Ma KOMni/i/iwpaHM Bepcun Ha AspNetEdit v\ me Tpa6Ba Aa v\3jevi\v\je 
KOAa m Aa ro KOMnw/iwpaTe caMki. M3Ter/iflHeTO CTaBa etc cnep,uaja KOMaHAa: 



svn co svn: //mono .myrealbox. com/source/trunk/aspedi tor 



890 



flporpaMnpaHe 3a .NET Framework (tom 2) 



AtpHpll die Hail Sample 






a 






# 

=«;; 



?j 3"i 

C4py Pl5tl 



[; iiiTii>r.<l 
f: v.ili-l.ili-.n 




KJPASP.HEiTWortd 
â– v v, ,i â–  â–  - - n! r--i * iftomj^ 



un-flurci iTiria 

DyapDHfniisc 
Tit « 
DjriC'id'ibI*! '' i 

IJJTJv.'iJ. fka^Ii'i 

flU*Ci 
Ljbvl 

â– â– â– â– :'-..: ,'..â–  
Dit-i Centre'li 



^i^i^i^Bi^i^i^^SiQi^i^i^i^ifli^D 


1 !l 

2 A 

3 UltSw 


* 


— Mill 

â–  â–  -.. : ML.* 
T#* Thll 


•J 


1 +Add | -Bhikm 












|xt«nc*|' #» ' 




I V|„|„„. 

A?ffIT"*J 

e>**(Vir»^i:*; Trar 

: ''.iL< •■•: TTU* 

"â–  tip True 



tUtiUp-by 

.' ii.i- â– > Fan ,i 
•..,•...,■ .. ■:.--!-! 

L^ruui 
â– Mtftl 

UMtoMI 

JlcmirtlDfo!" U 









â–  



Ye6 yc/iyrM 

Ye6 yenyrkue ca HanwH 3a OTfla/ieneHO M3BMKBaHe Ha MeTOflu, noflo6HO Ha 
RMI m RPC TexHO/iornnTe, ho 3a pa3/ii/iKa ot tax, ce M3no/i3Ba n/iaTCpopMeHO 
He3aBMCMMM cpeACTBa KaTO SOAP npoTOKO/ia, npaBewKM Bt3MO>KHO npw/io- 
>KeHMfl, nucaHM Ha pa3/ikmHki e3nun fla cm CbTpyaHkmaT. ToBa no3BO/iflBa 
c/iokhm m Te>KKM M3ni/ic/ieHi/m p,a ce npaBAT Ha APyra MailJMHa, 06^eK4aBaMKM 
Ta3M, Ha koato e crapTwpaHO npw/io>KeHi/ieTO, M3no/i3Baiuo cbOTBeTHaTa ye6 
yenyra. Mono npeflocraBfl bcmukm MHCTpyMeHTM Heo6xoflMMn 3a ziecHOTO 
M3no^3BaHe v\ cb3£aBaHe Ha ye6 yenyrw. 

fleMOHCTpaunflTa e HanpaBeHa Ha onepaunoHHaTa cwcreMa FreeBSD 5.4- 
STABLE, c noMOLUTa Ha XSP CbpB-bp-bT Bepckm 1.1.10.0, Mono Bepcua 1.1.10 v\ 
ye6 6pay3tptT Opera 8.51. 

Cb3flaBaHe Ha ye6 yc/iyra 

C HacTOfliunfl npuMep me noKa>KeM cb3£aBaHeTO, pa3rp"biuaHeTO (deployment) 
m TecTBaHeTO Ha npuMepHa ye6 yenyra. 

3a ue/ua cb3£aBaMe cpaw/i"bT MonoWebservice.es etc cneflHOTO cbA"bp>KaHkie: 



MonoWebService . cs 



using System; 
using System. Web; 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 891 



using System. Web . Services; 

[WebService (Description="Sample Web service with Mono")] 
public class MonoWebService : System. Web . Services .WebService 

{ 

[WebMethod (Description="Says hello")] 
public string Hello (string name) 

{ 

return "Hello " + name+ ", from Mono Web Service"; 

} 
} 



3a6e/lfl3BaMe M03HaTklTe aTpn6yTM [WebService] V\ [WebMethod], KOMTO 

onpeAe/iflT ye6 ycnyraTa v\ MeTOAHTe, komto th npeAOcraBH. 
KoMnn^npaMe etc cnep,uaja KOMaHAa: 



% mes -r : System, System. Web , System. Web . Services \ 
MonoWebService.es -t: library 



Pe3y/iTarbT ot K0v\nv\j\a\\v\5\ia e c|3aki/i"bT MonoWebservice.dll. 

Cb3AaBaMe AnpeKTopi/mTa bin b TeKymaTa Anpeicropi/m v\ npeMecTBaMe b Hea 

CpaMJia MonoWebService.dll CbC CneRHWTe KOMaHAM: 



% mkdir bin 

% mv MonoWebService . dll bin/ 



Cera ce Hy>KAaeM ot TecTOBa CTpaHnua 3a Bki3ya/iki3i/ipaHe Ha ye6 ycnyraTa. 
Cb3AaBaMe ASP.NET CTpaHnuaTa c MMe index. asmx v\ etc c/ieAHOTO cbAtp- 
>KaHne: 



index . asmx 



<%@ WebService Class="MonoWebService' 



OcTaBa hm na crapTkipaMe xsp ctpBtptT v\ p,a pa3r/ieAaMe HaiuaTa ye6 
yenyra: 



% xsp — port 8080 

xsp 

Listening on port: 8080 (non-secure) 

Listening on address : 0.0.0.0 

Root directory: /usr/home/ceco/pro jeets/dotnet/book/sre/web 

Hit Return to stop the server. 



BtBe>KAaMe http://localhost:8080/index.asmx b no/ieTO 3a aApecu Ha Haiunsq 
ye6 6pay3"bp v\ cnep, HaBurnpaHe ro TecTOBaTa <£opMa M0>KeM p,a bmamm 
M3X0Aa ot ki3n"b/iHeHweT0 Ha MeTOAa Hello (...) : 



892 



flporpaMnpaHe 3a .NET Framework (tom 2) 



â–¡ |E | Mono' 
File Edit View Bookmarks Mail Tools 



- Opera S.51 




D http://localhost:8O8O/indeK,asmx?page0 |G| Google search 



MonoWebService 



Hello 

Overview | Test Form | Message Layout 



Enter values for the parameters and click the 
'Invoke' button to test this method: 



Invoke Clear 



The web service returned the following result 



^?Kml veraion= " 1. " encoding = "utf - S "? > 
<atring Kmlna= "http : //tempuri .org/ 
">Hello Cvetelin, from Mono Web Service </ 
a t r ing > 




Cnep, M3nt^HeHneTO Ha MeTOAa, K/iweHTbT (b c/iyna*i ye6 6pay3"bp"bT) no/iy- 
naBa SOAP c"bo6iueHne c flecpuHnpaHM ctomhoct m Tun Ha BtpHaTna pe3y/iTaT: 



<?xml version="l. 0" encoding="utf-8 "?> 

<string xmlns="http : //tempuri . org/ ">Hello test, from Mono Web 

Service</string> 



BHeApnBaHe Ha ye6 yenyra 

Cnep, KaTO CMe crapTHpa/iki HaiuaTa ye6 yenyra, me noKaweM KaK motom fla a 
M3no/i3BaMe b OTAe/iHO npM/io>KeHMe. 

3a ue/ua, Tpa6Ba p,a reHepupaMe cneuwa/ieH Me>KAHHeH K/iac (proxy), komto 
me ce no/i3Ba ot HaiueTO npi/i/io>KeHi/ie 3a Bp"b3Ka c ye6 ycnyraTa. ToBa CTaBa 
c KOMaHflaTa: 



% wsdl http: //localhost : 8080/index. asmx -out :MonoProxy . cs 



Heo6xoAMMO e xsp ctpBtptT p,a e crapTwpaH no BpeMe Ha reHepupaHeTO Ha 

Me>KflMHHM51 K/iaC. 

Ako pa3MeAaMe cpai/i/ivr MonoProxy.es me 3a6e/ie>Ki/iM flBa Tuna MeTOAn: 

CMHXpOHHMfl Hello (...) M flBaTa aCMHXpOHHkl BeginHello (...) M EndHello (...) . 

Pa3/im<aTa e, ne npn cmhxpohhoto M3BMKBaHe Ha MeTOfl Ha ye6 ycnyraTa, 
xoAa Ha nporpaMaTa cnupa ro 3aB"bpujBaHeT0 Ha MeTOAa, AOKaTO npn 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 893 
acuHxpoHHOTO M3BMKBaHe, pe3y/iTaTa ce no/iynaBa b noflafleHna o6eKT ot Ti/m 

Sy s tern . AsyncCallback . 

flpyr Ha^MH 3a reHepupaHe Ha Mewfli/meH K/iac e cnep, crapTkipaHe Ha xsp 
ctpBtpa, B"bBe>KflaMe aflpeca Ha ye6 ycnyraTa b ye6 6pay3"bpa v\ HaTMCKaMe c 

MMUJKaTa Client proxy. 

C/iefl KaTO HMaMe Me>KflMHHMfl K/iac (MonoProxy.es) MO>KeM fla ki3no/i3BaMe 
MeTOfla Hello (...) Ha ye6 ycnyraTa. 3a ue/iTa cb3,qaBaMe c|DaM^"bT 

MonoWebClient.es CbC C/ieflHOTO Cbfl"b p>Ka H M e : 



MonoWebService . cs 



using System; 

class MonoWebClient 

{ 

static void Main ( ) 

{ 

MonoWebService ws = new MonoWebService ( ] 
string hello = ws . Hello ( "test" ) ; 
Console . WriteLine (hello) ; 
} 
} 



KoMnw/iwpaMe ch>c cneflHaTa KOMaHfla: 



% mes -r : System. Web , System. Web . Services MonoProxy . cs \ 
MonoWebClient . cs -out : MonoWebClient . exe 



C/iefl ki3n"b/iHeHweT0 Ha nporpaMaTa, no/iynaBaMe v\ o^aKBaHMfl pe3y/iTaT: 



% mono MonoWebClient . exe 

Hello test, from Mono Web Service 



Ako pa3no/iaraMe c WSDL (Web Service Description Language) (fcaw/i-bT 
/iOKa/iHO, MoxeM fla M3no/i3BaMe MHcrpyMeHTa wsdi no c/ieflHua Hani/m: 



wsdl MonoWebService . wsdi -out : MonoProxy . cs 



Pe3y/iTarbT e Me>KflMHHMflT k/i a c MonoProxy.es, komto MO>KeM fla i/i3no/i3BaMe 
npn KOMnn^npaHe Ha npn^OKeHna, M3no/i3Baiun HaiuaTa ye6 yenyra. WSDL 
<fcaki/i"bT Moxe fla 6tfle CBa/ieH ot cbOTBeTHna aflpec Ha ye6 ycnyraTa (npe3 

HaTMCKaHe C MklLlJKaTa Ha Service Description -> Download B ye6 

6pay3"bp"bT, bm>k screenshot-a). 



894 nporpaMnpaHe 3a .NET Framework (tom 2) 

rpa4>MHHM MHTep4>eMcn b Mono 

3a pa3/im<a ot Microsoft .NET Framework, Mono npeAOcraBfl to/iam M36op npn 
pa3pa6oTKaTa Ha rpacpwuHki npi/i/ioweHkifl. C zieKOTa MO>KeTe fla nmueTe 
npw/io>KeHi/m 3a KDE v\ Gnome, 3a Mac OS v\ Windows. 

BckinKi/i fleMOHCTpauuM ca HanpaBeHM Ha onepaunoHHaTa cwcreMa FreeBSD 
5.4-STABLE. BepcunTe Ha MHCTpyMeHTMTe ca: Mono - 1.1.10, Glade Interface 
Builder- 2.12.1, Gtk# 2.4.0. 

Windows Forms 

Windows Forms e nacr ot craHAapTHaTa AncTpn6yun5q Ha Mono. U,e/iTa e p.a ce 
MMn^eMeHTupa Hant/iHO cpyHKUkiOHa/iHOcrra Ha npocTpaHCTBOTO system, 
windows . Forms b Microsoft .NET Framework. 

TbCi ioto MMn^eMeHTaunflTa Ha Microsoft ki3no/i3Ba n/iaTCpopMeHO 3aBMCMMM 
M3BMKBaHMfl 3a flocTtn flo MaHkiny/iaTopw Ha npo3opun, ujpucpTOBe v\ t.h., ce 
Ha/iara i/i3no/i3BaHeTO Ha Wine 3a crapTkipaHe Ha rpacpwuHki npw/io>KeHi/m 
M3no^3Baiun npocTpaHCTBOTO ot MMeHa system, windows. Forms (Wine 
( www.winehq.org ') e eMy/iaTop, npe3 komto ce crapTwpaT Windows 
npi/i/io>KeHMfl Btpxy UNIX). To3m noAxoA, o6ane, e HeyaaneH, 3aiuoTO 
B"b3HMKBaT peAHua npo6/ieMM, CB"bp3aHM c ynoTpe6aTa Ha eMy/iaTopa. 

riopaAM onucaHaTa npwuwHa 3anonBa M3rpa>KAaHeTO windows. Forms, caMO ot 

ynpaB/lflBaH KOA Ha 6a3aTa Ha System. Drawing. 

IHe w/iKDcrpkipaMe KaK npuMeptT, pa3vnep.au b TeMaTa 3a Windows Forms , ce 
KOMnn/inpa m M3n"b/iH*iBa noA Mono. HeKa cm npunoMHMM KaK M3r/ie>KAa tom: 

MonoWindowsForms . cs 



using System; 

using System. Windows . Forms; 

public class MonoWindowsForms: System. Windows . Forms . Form 

{ 

static void Main ( ) 

{ 

MonoWindowsForms sampleForm = new MonoWindowsForms () ; 

sampleForm. Text = "Mono Windows Forms"; 

Button button = new Button ( ) ; 

button. Text = "Close"; 

button . Click += 

new EventHandler ( sampleForm. button_Click) ; 

sampleForm. Controls .Add (button) ; 

sampleForm. ShowDialog ( ) ; 
} 

private void button_Click (ob j ect aSender, EventArgs aArgs) 
{ 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 895 




KoMnw/iwpaMe v\ M3n"b/iH*iBaMe etc c/ieflHi/ue KOMaHfli- 



% mes MonoWindowsForms.es -r: System. Windows . Forms . dll \ 

-r : System. Drawing. dll 

% mono MonoWindowsForms . exe 



Ha eKpaina me ce noaBu no3HaTMfl npo3opeu, v\ npn HaTMCKaHe Ha 6yT0Ha c 
TeKCT "Close", npo3opeu,a ce 3aTBapa. 

Ako MCKaTe BaiueTO rpaifci/mHO npi/i/ioweHi/ie fla ce M3n"b/iHflBa Ha nc-Bene one- 
paunoHHM cm ere mm, Tpyi6Ba fla TecTBaTe p,anw pa6oTM no,q tax. rit/iHa (100%) 
noflflp"b>KKa Ha windows . Forms ce onaKBa BtB Bepcufl Mono 1.2 b Hana/iOTO 
Ha 2006 r. 

Gtk# 

Gtk# ( qtk-sharp.sourceforqe.net ') e eflMH ot necro ki3no/i3BaHHTe mh- 
CTpyMeHTM 3a nocrpo*iBaHe Ha rpac|DkmHM npM/io>KeHMfl c Mono. Eki6/ikiOTei<aTa 
npeflcraB/iflBa .NET o6BMBKa Ha 6ki6/ii/iOTeKaTa GTK+ v\ Ha hakom Gnome 
6w6/ikiOTeKki (gdk, atk, pango v\ t.h.). npn^OKeHMfl, nucaHM c Gtk#, MoraT fla 
pa6oTAT Btpxy Linux, Windows v\ Mac OS v\ mhoto flpyrw. 

Gtk# - npMMep 

HeKa fla pa3r/ie,qaMe c/ieflHkiyi npuMep 3a i/i3no/i3BaHe Ha Gtk#. 1/lMaMe npocTO 
C# npn^OKeHne, 6a3npaHO Ha Gtk#: 



MonoGtkSharp . cs 



using Gtk; 
using System; 

public class MonoGtkSharp 

{ 

static void Main ( ) 

{ 

Application . Init ( ) ; 

Button button = new Button ( "Close" ) ; 
button . Clicked += new EventHandler (close) ; 

Window window = new Window ( "MonoGtk#" ) ; 
window. Add (button) ; 
window. ShowAll ( ) ; 

Application . Run ( ) ; 



896 



flporpaMnpaHe 3a .NET Framework (tom 2) 



static void close (object aSender, EventArgs aArgs) 

{ 

Application . Quit ( ) ; 



OaM/i"bT ce KOMnn^upa m crapTkipa c KOMaHAMTe: 



% mcs MonoGtkSharp.es -pkg: gtk- sharp 
% mono MonoGtkSharp . exe 



Ha eKpaina ce noABABa npo3opeu c eflMHCTBeH 6yT0H c TeKcr "Close", npn 
HaTMCKaHeTO Ha komto me ce npeKpaTM M3n"b/iHeHkieT0 Ha nporpaMaTa. 



n E MbnoGtk* 



Close 



nporpaMeH mo Ren Ha Gtk# 

riporpaMHMflT MOfle/i Ha Gtk# e 6a3npaH Ha cb6v\Twn. MeTOfltT Application. 
Run() 3acraBfl npn^OKeHneTO fla naKa ao B"b3HMKBaHeT0 Ha c"b6nTne. ripn 
B"b3HMKBaHe Ha onpeAe/ieHO cb6i/iTi/ie, ce M3BMKBa cpyHKunaTa acounnpaHa c 
Hero. 

B Haiunfl npuMep acou.ni/ipaMe c"b6nTneT0, Bt3HMKBaiuo npn HaTMCKaHe Ha 
6yT0Ha c TeKCT "Close", c o6pa6oTni/iK Ha Cb6v\jv\f\, komto M3BMKBa MeTOfla 
close (...) . ToBa CTaBa npe3 KOfla: 



button . Clicked 



new EventHandler (close) 



Glade# 

Glade# e 6n6/inoTeKa, npeAOcraBsiLua CBpt3KM (bindings) c 6w6.ni/iOTeKaTa ot 
hmcko hmbo libglade, v\ BK/iK>nBa MHCTpyMeHTM 3a 3ape>KflaHe Ha rpacpi/mHki 
KOMnoHeHTM, c"b3AafleHM c Glade Interface Builder. riocrpoeHi/iTe rpacpwuHM 
KOMnoHeHTM c Glade ( qlade.qnonie.org ) ce 3ana3BaT b XML cpopMaT, cnep. 
KoeTO MoraT fla 6"bflaT 3apeAeHM b cope koa h noKa3aHM Ha eKpaHa. 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 897 



1/lHcrpyMeHTbT Glade Interface Builder e BK/iK>neH b hakom ot roTOBMTe 
kiHcra/iaukiki Ha Mono. 

B c/ieflBaiunfl npuMep me ki/uocrpkipaMe ynoTpe6aTa Ha Glade#, Gtk# v\ Glade 
3a nocrpoyiBaHe Ha npocTO rpac|DkmHO npn^OKeHne. 

kl3nosi3BaHe Ha Glade 

HeKa pa3MeAaMe crbnKMTe, komto ca Heo6xoflMMM 3a cb3AaBaHe Ha Glade 
6a3npaHO npn^OKeHne c Mono. 

CrapTiipaHe 

CTapTupaMe Glade Interface Builder. Ako tom e 4acT ot Mono i/iHCTa/iau.n5Tra, 
Tpa6Ba p,a ce HaMupa b HeroBaTa bin AnpeKTopua: 



% glade-2 



Eto KaK M3Me>Kfla Glade Interface Builder: 



ML 



HETT 



triad e: cun.titled> 



E 



^ Selector 



GTK+ Basic 
GTK+ Additional 



Gnome 



Gnome DB 



Deprecated 



W % 



m • 

EH Pi 



aa^a & 



Project Penan mpahe flamea HacrpoEiKM Qomoli 



q & o s 4 

New Open Save Options Build 



n I E I Properties: <none> 



Vidget Packing 



H* 



Common 



Signals 



Name: 

Class: 
Source File: 
Public: 



r 



No 



Tom ce Cbcroi/i ot Tpn npo3opeu.a: 

- OcHOBeH - to3m npo3opeu cny>Kki 3a HacTpoMBaHe Ha Glade npoeicru i/i e 

BMHarM BMAMM. 

- ria/ikiTpa - ctAtpxa bcmukm BM3ya/iHki KOMnoHeHTM, komto 6nxa momm 
Aa ce M3no/i3BaT npn nocrpoaBaHeTO Ha rpaifci/mHi/m MHTepc|DeMC. 



898 



flporpaMnpaHe 3a .NET Framework (tom 2) 



- AKcecoapn - cbfltpwa MHCpopMauna othocho TeKyiuna KOMnoHeHT 
(pa3no/ic»KeHi/ie, TeKCT, cwrHa/iki, komto me ce npuxBaiuaT v\ t.h.). 

noc^eflHMTe flBa npo3opeua ca bmammm, caMO aKO ca ce/ieKTkipaHi/i MeHKuaTa 

View | Show Palette M View | Show Property Editor. 

ripeflu 3a 3anonHeM pa6oTa, cb3,qaBaMe hob GTK+ npoeicr npe3 New | New 

GTK+ Project: 



Project Options 



General C Options LibGlade Options 



Basic Options: 




Project Directory: 
Project Name: 


/usr/home/ceco/projects/dotnet/glade Browse... 


Mono Program Name: 


mono 






Project File: 


mono.gladej 







Subdirectories: 



Source Directory: 



Pixmaps Directory: 



pixmaps 



Language: 

© C O C++ O Ada 95 



Gnome: 



|7 Enable Gnome Support 



Enable Gnome DB Support 



)( OTKasBaHe 



<^Aa 



PwcyBaHe c nanynpaja 

Ot na/ikiTpaTa HaTMCKaMe 6yTOHa 3a cb3flaBaHe Ha npo3opeu. 

HIHIESBSMIE5 



^ Selector 

r 



GTK+ Basic 
GTK+ Additional 



Gnome 



Deprecated 



u 



Window â–  ^g | 



HaujuflT ocHOBeH npo3opeu e cb3fla,qeH. flo6aBAMe BepTmo/iHa kytma c flBa 
pefla npe3 M36npaHe Ha vertical Box ot na/iMTpaTa v\ mpaKBaHe c MMUJKaTa 
Btpxy ct3flafleHMfl npo3opeu. B noi<a3aHkm flwa/ior BtBe>KflaMe uncppaTa 2 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 899 
(cb3flaBaMe flBa pefla) v\ noTB"bp>KflaBaMe c 'fla'. flo6aBAMe no cbiuna HanwH 

eTMKeT (Label) B ntpBMfl pefl V\ 6yTOH (Button) B"bB BTOpi/lfl pefl Ha KyTMflTa. 

ripo3opeu,tT ki3r/ie>KAa TaKa: 



â–¡ E window 1 



Iflbell 
buttonl 



npoMAHa Ha aKcecoapwTe 

HeKa npoMeHMM hakom ot aKcecoapnTe Ha npcoopeua, 6yTOHa v\ eTMKeTa. 
IHpaKBaMe c MMUJKaTa Btpxy Cb3p,ap,euv\s\ 6yTOH. Cera b peflaKTopa ca 
3apeAeHM TeKymnTe aKcecoapn Ha 6yTOHa. PeAaKTupaMe no/ieTaTa Name: v\ 
Label: cbOTBeTHO cbc ctomhoctm "SampleButton" m "Press Me!". 

Cera M36npaMe MeHKrro signals. B no/ieTO signal: me noco^MM c"b6nTneTO, 
3a KoeTO 6nxMe wcKa/iki p,a c/iywaMe. HaTMCKaMe 6yTOHa 03HaneH c ... (Tpn 
to4km) m M36npaMe clicked. HaTMCKaMe 6yTOH"bT Add m cnrHa^"bT e flo6aBeH 
ki>m cnwcbKa etc cwrHa/iki, 3a komto 6m momo fla ce c/iywa. 



HE Properties: SampleButton 



Widget Packing Common Signals ^ 



Signal Handler 



After 



clicked on SampleButton clickei 



B KO/iOHaTa c MMe "Handler" e M3nncaHO MMeTO Ha abyHKuwsiTa, acounnpaHa c 
o6pa6oT4MKa Ha cbOTBeTHOTO c"b6nTne. 

no aHa/iorwueH Hani/m npoMeHHMe aKcecoapi/ue Ha npo3opeua v\ eTMKeTa. 

riont/lBaMe nO/ieTaTa Name: V\ Label: CbOTBeTHO etc CTOMHOCTM 

"GladeWindow" v\ "Glade#" 3a npo3opeua v\ "SampleLabel" v\ "Before" 3a 
eTMKeTa. 

3ana3BaHe Ha npoeKTa 

3ana3BaMe npoeKTa npe3 MeHKrro Project | 3ana3BaHe, KaTO M36npaMe MMe 
Ha npoeKTa "Mono" v\ npon3BO/iHa M36paHa AnpeKTopna. 

Glade XML cpopMarbT 

HeKa pa3MeflaMe KaK Glade 3ana3Ba nocrpoeHMTe rpac|DkmHki KOMnoHeHTM. 
CneABa nacr ot abai/i/ia mono. glade, HaMnpaiu ce b AnpeKTopi/mTa, KtAeTO e 
cb3AaAeH npoeKTa: 



mono . glade 



900 flporpaMnpaHe 3a .NET Framework (tom 2) 



<?xml version="l . 0" standalone="no"?> <!--*- mode: xml -*--> 
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade- 
2.0.dtd"> 

<glade-interf ace> 
<requires lib="gnome"/> 

<child> 

<widget class="GtkButton" id="SampleButton"> 
<property name="visible">True</property> 
<property name="can_f ocus">True< /proper ty> 
<property name="label" translatable="yes"> 

Press Me ! </property> 
<property name="use_underline">True</property> 
<property name=" relief ">GTK_RELIEF_NORMAL</property> 
<property name="f ocus_on_click ">True< /proper ty> 
<signal name="clicked" handler="on_SampleButton_clicked" 
last_modification_time="Wed, 20 Jul 2005 19:51:04 GMT"/> 

</widget> 

<packing> 

<property name= "padding ">0</pr ope rty> 
<property name= " expand ">False</pr ope rty> 
<property name="f ill">False</property> 

</packing> 
</child> 



3a6e/iH3Ba ce wepapxn^HO i/i3rpa,qeHaTa CTpyKTypa Ha KOMnoHeHTMTe. BceKM 
KOMnoHeHT ce xapaKTepn3npa c aKcecoapn, onucaHM b XML cpai/i/i. Te3M 
aKcecoapn MoraT fla 6"bAaT npoMeHAHM npe3 peflaKuna Ha caMna cpaw/i, KaKTO 
m npe3 MHCTpyMeHTa Glade Interface Builder. Bbb cpaw/ia 3a6e/iH3BaMe v\ KaK 
ce 3anncBa acou.ni/i pa HeTO Ha c"b6nTne c MeTOfl: <signai name=" clicked" 

handler=" on_SampleButton_clicked" last_modif ication_time="Wed, 20 
Jul 2005 19:51:04 GMT"/>. 

KaK Aa noKa>KeM npo3opeua? 

IHe noKaweM KaK fla 3apeflMM XML cpaw/ia npe3 C# cope koa h KaK fla 
BM3ya^M3npaMe npo3opeu.a c Mono. 

1. Cb3flaBaMe cpaw/ia GiadeDemo.es b flupeKTopuflTa Ha Glade npoeKTa etc 
c^eflHOTO cbfl"bp>KaHMe: 



GladeDemo . cs 


using 


Gtk; 




using 


Glade; 




using 


System; 




class 


SampleGladeWindow 





T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 901 



private Glade. XML mGui; 
[Widget] 
private Gtk. Label SampleLabel; 

void on_SampleButton_clicked (ob j ect aSender, EventArgs aArgs) 

{ 

SampleLabel .Text = "After"; 



public SampleGladeWindow ( ) 

{ 

mGui = new Glade . XML (". /mono . glade" , "GladeWindow" , ""); 
mGui . Autoconnect (this ) ; 



public class GladeDemo 

{ 

static void Main ( ) 

{ 

Gtk .Application . Init ( ) ; 

SampleGladeWindow window = new SampleGladeWindow () ; 

Gtk .Application . Run ( ) ; 



2. KoMnw/ikipaMe v\ crapTkipaMe c KOMaHAHTe: 



% mcs GladeDemo.es -pkg: gtk -sharp -pkg: glade -sharp 
% mono GladeDemo . exe 



Ha eKpaina ce noi<a3Ba npcoopeu, etc 3ar/iaBkie "Glade#". ripn HaTMCKaHeTO Ha 
6yT0Ha c Haflnnc "Press Me!" TeKCTbT Ha eTMKeTa ce npoMeHfl ot "Before" Ha 
"After". 



HE Glade* 



After 
Press Me! 



KaK pa6oTM npnMepi>T? 

ripMMepHMflT <£aM/l CbAtpxa ABa K/iaca: GladeDemo l/l SampleGladeWindow. 

riporpaMaTa 3anonBa M3n"b/iHeHMeT0 cm ot Main() MeTOAa Ha K/iaca 
GladeDemo, KtAeTO 3a6e/ifl3BaMe CTaHAapTHMTe 3a eAHO Gtk# npi/i/io>KeHkie 

Gtk . Application . Init ( ) M Gtk . Application . Run ( ) . 



902 



flporpaMnpaHe 3a .NET Framework (tom 2) 



K/iacbT sampieGiadewindow npeflCTaBfl npo3opeu.a GladeWindow, cbcraBeH c 
noMOiuTa Ha Glade Interface Builder. H/ieH-npoMeH/ii/iBaTa mGui ce MHMu.ua/iM- 

3kipa 4pe3 new Glade .XML (". /mono . glade" , "GladeWindow", ""), ICbAeTO 

irbpBMflT apryMeHT e a6co/i kith mat ntT Ha XML cpaw/ia, komto MCKaMe p,a 3ape- 
Ahm. BTopuflT napaMerbp e MfleHTucpuKaToptT Ha KOMnoHeHTaTa, ot kohto 
3ano4Ba M3rpa>KflaHeTO Ha naoTa ot XML cpaw/ia, koato me ce noKawe Ha 
eKpaHa (b Hawi/ia cnynaw 3ape>KAaMe ue/ii/m npo3opeu v\ bcmukm KOMnoHeHTM 
b Hero). Hpe3 TpeTna apryMeHT MO>Ke fla ce 3aAaBa o6/iacr Ha npeBOfl npn 
3ape>KflaHe Ha XML cpai/i/ia (npeBe>KflaT ce 3ar/iaBmi v\ TeKCT). 

Hpe3 M3BMKBaHeTO Ha mGui. Autoconnect( this) CB"bp3BaMe BCM4KM Cb6klTklfl 
CbC CbOTBeTHMTe MM 06pa60T4MUM. MeTOfl"bT Autoconnect(...) CB"bp3Ba M 

no/ieTO sampieLabel cbc cbOTBeTHMfl KOMnoHeHT, flecpMHupaH b XML cpai/i/ia 
(3a6e/ie>KeTe, ne TOBa no/ie e AecpMHupaHO c aTpn6yTa [widget] v\ ne MMeTO 
My e cbiuoTO KaTO Ha cbOTBeTHkm MAeHTucpuKaTop b XML cpaw/ia). 

MeTOA"bT on_SampleButton_clicked(...) e acounnpaH CbC CMTHa/ia clicked, 

komto Ao6aBMXMe KtM 6yTOHa npn pa6oTaTa c Glade Interface Builder. 

Gnome# 

Mono npeflocTaBfl npocTpaHCTBOTO Gnome, c noMOLirra Ha KoeTO rpacpwuHMTe 
npw/io>KeHi/m npneMaT o6/imk (look-and-feel) Ha craHAapTHki Gnome rpacpn^Hn 
npn^o>KeHMfl. ripuMep 3a TOBa e Gnome About Ana/iorbT, komto crapTkipaH c 
Mono M3Me>KAa TaKa: 



n E Oihochd GnomtAboutlcbt 




Gnome AboutTest 0.1 



Comments 
Copyright 



ft 3acnjTH 



X SaTBapnHe 



QT# 

Qt# ( qtcsharp.sourceforqe.net ') ca K/iacoBe 3a pa6oTa c 6i/i6/ikiOTei<aTa Qt, 
koato e b ocHOBaTa Ha rpacpi/mHaTa cpeAa KDE. KoMni/i/ikipaHeTO Ha Qt# 
6a3npaHa nporpaMa craBa no cneRHwn Hani/m: 



% mcs -r /complete_path/Qt . dll myprogram.es 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 903 

TbCi KaTO Qt noflfl"bp>Ka mo6m^hm ycrpoMCTBa (KaKTO v\ Mono), B"b3M0>KH0 e 
eAMH fleH fla bmamm m Qt# npM/io>KeHMfl 3a Te3M ycrpoMCTBa v\ fla MMaMe Heiuo 
KaTO eKBMBa/ieHT Ha Microsoft Compact Framework. 

Cocoa# 3a Mac OS 

Cocoa* ( www.cocoasharp.org ') e 6n6/ikiOTeKa 3a M3rpa>KflaHe Ha rpac|DM4HM 
npi/i/io>KeHi/m 3a Mac OS X. ripi/i/io>KeHi/mTa, ki3rpafleHM c Cocoa* ca etc 
cneunc|DM4HMfl 06/iMK Ha Mac OS X. HeflOcrarbK Ha Ta3M 6ki6/ii/iOTeKa e, ne He 
MO>Ke fla ce no/i3Ba 3a flpyrn onepaunoHHM cucTeMM. 

KaK fla nuuieM npetiocMM koa? 

C Mono nucaHeTO Ha n/iaTifcopMeHO He3aBMCMM koa e Hant/iHO B"b3M0>KH0, 
crura fla cna3BaTe hakom npaBM/ia: 

- M3no/i3BaMTe BMHarn pe/iaTMBHw ntTMiua, KoraTO yKa3BaTe ntT to <\>av\n 
v\nv\ AnpeKTopna. M36arBaMTe n^aTCJDopMeHO 3aBMCMMMTe "c:\Program 

Files" M "/usr/local/". 

- Mono He MO>xe fla OTBapa (fcaw/iOBe ot Bkifla \\server\mywork.txt . Cbo6- 
pa3ABaMTe ce c TOBa. 

- ripoBepeTe fla/iw He ki3no/i3BaTe obfuscated aceM6/ikiTa. Te npn/iaraT 
cneunc|DM4HM TpuKOBe 3a 3aiunTa, komto MoraT fla o6"bpi<aT Mono v\ fla 
flOBeflaT flo Heo^aKBaHM npo6/ieMw. 

- M36flrBaMTe M3no/i3BaHeTO Ha Windows perncTpnTe (m K/iacoBeTe ot 

npoCTpaHCTBOTO Microsoft. Win32. Registry). 

- Ako M3no^3BaTe n^aTCJDopMeHO 3aBMCMMM pecypcn, BMHarn npoBepa- 
BaMTe fla/iw cbmecrByBaT. B cnynaM, ne He ca flocTtnHM, o6pa6oTBaMTe 
afleKBaTHO B"b3HMKHa/iaTa rpeujKa. 

- ripn pa60Ta C TeKCT 3a HOB pefl M3nO/13BaMTe CBOMCTBOTO Environment. 
NewLine, a He "\r\n" M/1M "\n". 

- ripenop"b4MTe^HO e fla KOMnw/iwpaTe b Release pe>KMM nofl Visual Studio 
.NET, TbM KaTO VS.NET flo6aBfl mhoto flont/iHMTe/iHa Debug mhc|dop- 
Maunfl, koato MO>Ke fla nonpenw Ha w3n"b/iHeHi/ieT0 Ha nporpaMaTa nofl 
Mono. 

- 3anncBaMTe cpaM/ia c Baujua cope koa b UTF8 KOflnpaHe v\ ki3no/i3BawTe 
onunflTa: -codepage : utf 8 Ha msc. 3a ASP.NET CTpaHMUMTe ((fcaw/iOBeTe 
c pa3LunpeHMe aspx) i/i3no/i3Bai/iTe Tara: 



<%@Page language="C#" compilerOptions= "/codepage : utf 8" %> 



M3no/i3BaMTe P/Invoke v\nv\ flpyrn n^aTCJDopMeHO 3aBMCMMM pecypcn caMO 
b KpaeH cnynai/i. Ako Bee naK HAMa a/iTepHaTMBa, ki3no/i3Bai/iTe h^ko^ 
6n6^MOTeKa, flocTbnHa 3a noBene n^aTCJDopMM. C/ieflHWAT koa ycraHO- 
BflBa onepaunoHHaTa cwcreMa, Ha koato ce M3n"b/iHflBa npi/i/io>KeHkieTo: 



904 flporpaMnpaHe 3a .NET Framework (tom 2) 



Type platf ormldEnumType = typeof ( Platf ormID) ; 
if (Enum. IsDefined (platf ormldEnumType, "Unix")) 
{ 

if (Environment . OSVersion . Platf orm == 

( Platf ormID) Enum. Parse (platf ormldEnumType, "Unix") 

{ 

Console .WriteLine ( "Platf orm: Mono on Unix"); 

} 
else 

{ 

Console .WriteLine ( "Platf orm: Mono on Win32"); 

} 
} 
else 

{ 

Console. WriteLine ( "Platform: Microsoft .NET"); 

} 



Mo>KeTe fla ki3no/i3BaTe npuMepa, 3a fla M3B"bpujBaTe pa3/innHw fleMCTBua b 
3aBMCMMOCT ot onepauwoHHaTa cwcreMa v\ CLR MMn/ieMeHTaukiflTa, b koato 
pa6oTM BaweTO npn^OKeHne. 

nporpaMiipaHe Ha iirpii u Tao Framework 

KoraTO CTaBa flyMa 3a rpacpwuHki cpeflu, e peflHO fla cnoMeHeM v\ cpeflCTBaTa 
3a pa6oTa c rpacpMKa b .NET v\ Mono. IHe ce cnpeM Ha C#, DirectX, Mono, 
Tao, SDL.NET v\ Axiom. 

Ako ce 3aHMMaBaTe c rpacpMKa v\nv\ MMaTe B/ieneHwe kbm pa3pa6oTBaHeTO Ha 
nrpn, MO>KeTe fla npaBMTe TOBa v\ c .NET, flopn mhoto no-/iecHO, otko/ikoto c 
C+ + . Microsoft npeflocraBAT DirectX SDK, KoeTO MO>Ke fla 6-bfle M3Ter/ieHO 
CBo6oflHO ot cawTa Ha Microsoft. To BK/iK>nBa 6ki6/ii/iOTei<a ot .NET K/iacoBe 3a 
pa6oTa c DirectX. 

Pa6oTaTa c DirectX c C# e flocra no-yflo6Ha ot ko/iko c C+ + . flo6pn npuMepn 
3a DirectX Managed Code MO>xe fla HaMepnTe Ha www.codeproject.com . 

Ako MCKaTe fla nuiueTe kirpa 3a .NET, Haw-BepoflTHO 6nxTe wcKa/iki th fla 
pa6oTM Btpxy bcmukm .NET kiMn/ieMeHTauww (Linux, MacOS X, BSD v\ 
Windows). Ako MMa M3MCKBaHMfl 3a npeHOCMMOCT, Haw-flo6pe e fla M36epeTe 
OpenGL npefl DirectX. Ha cneflHi/m aflpec me OTKpneTe pa3/innHw npoeKTM 3a 
pa3pa6oTKa Ha .NET nrpn, npeHOCMMH Btpxy pa3/innHM n/iaTCpopMi/i: 
http://realmforqewiki.castleqobs.nl/index.php/Open- 
source .NET Game Development Collaboration . 

Tao Framework 

C Mono e CBtp3aH npoeKTbT Tao Framework ( http: //www, mono-project. 
com/Tao ). Tao bm no3BO/iaBa fla pa3pa6oTBaTe 2D v\ 3D rpacpkinHki npw/io- 
>KeHMfl Ha C#. 3acera Tao, He e CTaHflapTHa nacr ot Mono, ho to3m Btnpoc e b 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 905 

npou.ec Ha o6cb>KAaHe. MMa KOMnn^npaHM naKeTM 3a Mono v\ Microsoft .NET 
Framework 1.1, 3a komto MMa v\ MHcra/iaTop. 

Ako CMe 3ana/iki/iki MHTepecvr bm, MO>KeTe npocTO fla M3Ter/iMTe Tao, fla ro 

1/IHCTa/lkipaTe M fla npo6BaTe npMMepMTe OT \ProgramFiles\Tao\Examples, 

6e3 fla MHCTa^npaTe hmluo Aont/iHMTe/iHO. nofl Linux MO>xe fla v\3Tevi\v\je o<\>v\- 
Una^HaTa flncTpn6yunfl v\nv\ fla KOMnn^npaTe ot SVN. M3Ter/iflHeT0 Ha KOfla 
CTaBa etc cneflHaTa KOMaHfla nofl Linux: 



% svn co svn: //svn.myrealbox. com/ source /trunk /tao 



C/iefl KOMnn^aunfl (fcai/i/iOBe TbpceTe b dist nanKaTa. Mo>Ke fla ce Ha/io>KM 3a 
HAKOM ot npuMepnTe fla i/iHcra/ii/ipaTe GLFW ( qlfw.sourceforqe.net ), KoeTO e 
CBo6ofleH OpenGL Framework. 

ripuMepnTe ocBeH c M3n"b/iHMM <fcaM/i, ce flocraBflT v\ KaTO cope koa. ripeflu fla 
3ano4HeTe c npuMepnTe, 3ana3eTe bcmuko, Btpxy KoeTO pa6oTMTe. B"b3M0>KH0 
e KOMnK)Ttp"bT bm fla ce pecrapTkipa v\i\v\ mohmtopvt bm fla yracHe (b peflKM 
cnynaM). 

HeKa cera fla CTapTMpaMe m eflMH ot npMMepMTe. nofl Linux c Mono Tpa6Ba fla 
M3n"b^HMM KOMaHflaTa: 



% mono NateRobins.Starfield.exe 



riOfl Windows npoCTO OTBOpeTe C:\Program Files\Tao\examples M LflpaK- 
HeTe flBa n"bTM Btpxy <£aM/ia NateRobbins.Starfield.exe. 

SDL.NET 

SDL.NET ( cs-sd I .sou rceforge.net ) e o6eKTHO-opMeHTMpaHa .NET 6M6/iMOTeKa 
3a pa3pa6oTKa Ha MrpM, 6a3MpaHa Ha 6M6/iMOTei<aTa SDL (Simple DirectMedia 
Layer - www.libsdl.org ). Ta npeflocTaBa <£yHKu,MOHa/iHOCT ot bmcoko hmbo 3a 
pa6oTa c ayflMO, K/iaBMaTypa, a>komctmk, ujpMCJDTOBe, pa3/iMHHM rpa<$>MHHM 
c|DopMaTM, MPEG-1 cJdm/imm, 3D OpenGL m flpyrM. 

AXIOM 

MMa hhko/iko MHCTpyMeHTa (3D engines) 3a cb3flaBaHe Ha TpMMepHa rpac|DMKa 
c C#. EflMH ot BOfleiflMTe npoeKTM b Ta3M o6/iacr e Axiom ( www.axiom3d.org ). 
Axiom e 3D MHcrpyMeHT (engine) c OTBopeH koa, 6a3MpaH Ha Tao. Tom e 

BCbLflHOCT npeBOfl OT C++ Ha C# Ha eflMH OT HaM-fl06pMTe rpac|DM4HM eHfl>KMHM 

c OTBopeH KOfl - OGRE ( www.ogre3d.org ). 

Eto KaK M3Me>Kfla eflMH cueHa, BM3ya/iM3MpaHa etc cpeAcmaTa Ha Axiom: 



906 



flporpaMnpaHe 3a .NET Framework (tom 2) 




flpyr npoeKT CBtpsaH c Axiom e RealmForge GDK ( www.realmforqe.com ') 

Java, Python, PHP u Mono 

no Mflea .NET Framework m-uerpkipa pa3pa6oTKaTa Ha mhoto e3nun 3a npor- 
paMnpaHe b eAHHHa n/iaTCpopMa c eAHHeH nporpaMeH MOAe/i v\ eAMHHM 6m6/im- 
OTeKM 3a pa3pa6oTKa. Mono OTMBa Aopn no-Aa/iene - no3BO/i*iBa MHTerpupaHe 
Ha pa3^M4HM n/iaTCpopMM m e3Mun 3a nporpaMnpaHe b CLR. 

Java 3a .NET CLR 

CaMTbT Ha npoeKTa e www.ikvm.net . l/lAesua Ha npoeKTa e pa3pa6oT4MUMTe 
Aa MoraT pja M3no/i3BaT CbBMecmo .NET v\ Java npi/i/io>KeHkifl, KaTO vv\ W3n"b/i- 
HflBaT noA Mono v\nv\ Microsoft .NET Framework. 

ToBa MO>Ke Aa ce uocvvwue no ABa Hani/ma: 

- Java K/iacoBe Aa MoraT Aa ce ki3n"b/iH*iBaT ot .NET BwpTya/iHaTa MaiunHa 
(CLR). ToBa ce nocTura npe3 KOHBepTupaHe Ha Java bytecode kbm CIL b 
pea/iHO BpeMe. 

- Java K/iacoBeTe ce o6rp-biuaT ot .NET aceM6/ikiTa (DLL cpaw/iOBe) v\ 
noc/ie Te Aa 6tAaT pecpepupaHM ot .NET npoeicrw. 



T/iaBa 27. Mono - CBo6oflHa MMnjieMei-rraumi Ha .NET Framework 907 

Python m PHP nofl Mono 

riofl Mono MO>Ke fla KOMnw/iwpaTe oiue Python ( www.ironpython.com ') cope 
koa m PHP CKpunTOBe ( php4mono.sourceforqe.net '). 3a PHP MMa v\ oiue eAHa 
.NET kiMn/ieMeHTau,kifl - www.php-compiler.net . 

Ynpa>KHeHM5i 

1. 1/lHcra/ikipaMTe Mono Btpxy Linux, FreeBSD v\nv\ Windows. 

2. OnuTaMTe fla crapTkipaTe nofl Mono HAKoe .NET aceM6/iw, nucaHO v\ KOMnn- 
/lkipai-io ot Bac npeflu TOBa c Visual Studio .NET b Windows cpefla. 

3. OnuTaMTe fla KOMnw/ikipaTe c Mono cope KOfla ot npeflxoflHOTO aceM6/in v\ 
c/iefl TOBa fla ro ki3n"b/iHi/iTe. 

4. MHCTa/ikipaMTe v\ CTapTupawTe cpeflaTa 3a pa3pa6oTKa MonoDevelop. Onu- 
TawTe fla HanmueTe c Hea HAKoe npocTO .NET npM/io>KeHMe. CrapTwpaMTe v\ 
TecTBawTe. 

5. Pea/i M3ki pa MTe npocTO npw/iOKeHwe, KoeTO ki3B/ii/ma flaHHM ot MySQL 6a3a 
flaHHM. KoMnn^npaMTe v\ ro i/i3n"b/iHeTe c Mono. 

6. MiHCTa/ikipaMTe v\ kohc|d wry pupate mod_mono. HanmueTe npocTO ASP.NET 
ye6 npw/io>KeHi/ie c VS.NET v\ ro CTapTupaMTe nofl Apache c mod_mono. 
Pa6oTM nv\ bcmuko HopMa/iHO? OnMTaMTe v\ c npocTa ye6 yenyra. 

7. CTapTupaMTe ye6 npn^OKeHneTO v\ ye6 ycnyraTa ot npeflxoflHaTa 3a,qana 
nofl ctpBtpa XSP. 

8. Pa3r/ieflaMTe flOKyMeHTaunaTa Monodoc. HaMepeTe b Hea noMOiflHa 
MHc|DopMau,Mfl 3a pa3pa6oTKa Ha Glade# npi/i/io>KeHi/m. 

9. OnuTawTe fla HanpaBMTe GUI npi/i/io>KeHi/ie c Gtk#, Gnome* v\ Glade*. 

no/ie3HM Mono pecypcii 

1. www.mono-project.com - oc|Di/iu,i/ia.nHi/mT cawT Ha npoeKTa Mono. 

2. www.qotmono.com - oiue eflMH cafiT, nocBeTeH Ha Mono. 

3. www.qnomefiles.org - peflnua nporpaMM, nucaHM 3a Mono v\ Gnome. 

4. www.monodevelop.com - ocJDMuna^eH caMT Ha npoeKTa MonoDevelop. 

5. qlade.qnome.org - caMTbT Ha npoeKTa Glade. 

6. http://explore.openfmi.net/computers/proqramminq/dotNET/Mono - crpa- 
Hnua, nocBeTeHa Ha Mono, noflfl"bp>KaHa ot Ahtoh AHflpeeB. 

l/l3no/i3BaHa /liuepaTypa 

1. Ahtoh AHflpeeB, Mono - CBo6oflHa kiMn/ieMeHTau.kifl Ha .NET - http://www. 
nakov.com/dotnet/lectures/Lecture-25-Mono-vl .O.ppt 



908 nporpaMnpaHe 3a .NET Framework (tom 2) 

2. Brian Delahunty, Introduction to Mono - Your first Mono app - http://www. 
codeproiect.com/cpnet/introtomonol.asp 

3. Brian Delahunty, Introduction to Mono - ASP.NET with XSP and Apache - 
http://www.codeproiect.com/cpnet/introtomono2.asp 

4. The Mono Handbook - http://www.qotmono.com/docs 



T/iaea 28. IIomoiiihii 

MHCTpyMeHTii 3a .NET 

pa3pa6oTHML4ii 



ABTOpii 

MBaH MuTeB 
Xpmcto fleiueB 

He06X0flMMM 3HaHM51 

- Ba30BMTe no3HaHMfl 3a .NET Framework 

- /Joirb/iHMTe/iHki no3HaHMfl, cneunc|DM4HM 3a cc|DepaTa Ha ynoTpe6a Ha 

OTAe^HMTe MHCTpyMeHTM 

ClafllapMOHMe 

- rioMOiuHM MHCTpyMeHTM 3a pa3pa6oTKa 

- M3C^eflBaHe Ha .NET aceM6/iMTa c .NET Reflector 

- AHa/iM3 Ha .NET aceM6/iMTa c FxCop 

- TeHepMpaHe Ha koa c CodeSmith 

- riMcaHe Ha unit TecroBe c NUnit 

- TeHepMpaHe Ha /ior cbo6meHMfl c log4net 

- Pa6oTa c pe/iau.MOHHM 6a3M otashhm c NHibernate 

- ABTOMaTM3MpaHe Ha build npoueca c NAnt 

- flpyrM noMOiuHM cpeACTBa 

B Ta3M TeMa ... 

B HacToamaTa TeMa me pa3r/ieAaMe peAMua MHCTpyMeHTM, M3no/i3BaHM b 
pa3pa6oTKaTa Ha .NET npM/io>KeHMfl. C T^xHa noMOiu MOxeM 3HanMTe/iHO p,a 
y^ecHMM M3iTb/iHeHMeTO Ha hakom necro cpeiuaHM nporpaMMCTKM 3aAa4M. 
M36poeHMTe MHCTpyMeHTM hm noMaraTAa pa3pa6oTBaMe no-KanecTBeHM peiue- 
HMfl no-6"bp30, KaTO MoraT 3HanMTe/iHO p,a hm ynecHAT b nMcaHeTO Ha koa h b 
noAAP"b>KKaTa My. Bcmukm cpeACTBa, komto me pa3r/ieAaMe, ca ot/imuho 
Aont^HeHMe kbm MHTerpMpaHMTe cpeAM 3a .NET pa3pa6oTKa. 



910 flporpaMnpaHe 3a .NET Framework (tom 2) 



noMOiiiHii MHCTpyMeHTM 3a pa3pa6oTKa 

K"bM T03M MOMeHT {M3V\ 2006 T.) CbLUeCTByBaT CTOTMUM nOMOLUHM MHCTpy- 
MeHTM, HaconeHM KtM nporpaMMpaHeTO 3a .NET Framework. Te y/iecHABaT 
pa3/iMHHM acneKTM ot pa3pa6oTKaTa, noflnoMaraMKM peiuaBaHeTO Ha necro 
cpeiuaHM TMnoBe npo6/ieMM. VonnMa nacr ot Te3M cpeACTBa ce M3no/i3BaT c 
ycnex b pea/iHM npoeKTM. 

B Ta3M TeMa H^Ma KaK fla onMiueM b Rejawnw npeAcraBMTe/iM Ha BCMUKMTe 

fleCeTKM KaTerOpMM, B KOMTO TpaflMUMOHHO 6MBaT K^aCMCpMUMpaHM TaKMBa 

noMOiuHM MHCTpyMeHTM. 3a TOBa me ce cnpeM caMO Ha HaM-Ba>KHMTe 06/iacrM 
ot pa3pa6oTKaTa, KaTO npeflCTaBMM BOfleiuM, Bene yTBtpAM/iM ce MHCTpyMeH- 
TM. IHe pa3r/ieflaMe caMO 6e3n/iaTHM peiueHMfl, no b"B3mo>khoct npoeKTM c 

OTBOpeH KOA- 

3a npaKTMKMTe m TexHO/iorMMTe, komto me 3acerHeM, ca ny6/iMKyBaHM 
MHOxecTBO CTaTMM m khmtm. 3a ro/iflMa nacr ot .NET MHCTpyMeHTMTe, npeACTa- 
BMTe/iM Ha ctOTBeTHMTe 06/iacrM ot pa3pa6oTKaTa, ca HanMcaHM AeceTKM m 

AOpM CTOTMUM CTpaHMUM P"bKOBOACTBa M CTaTMM. B Ta3M mdEd [U,e 06XBaHeM 

caMO Haki-Ba>KHMTe cpyHKUMM Ha pa3r/ie>KAaHMTe noMOiuHM cpeACTBa. IHe 
M3c^eABaMe cueHapMMTe 3a ynoTpe6aTa mm m no b"B3mo>khoct me AaAeM 

npMMepM M KOA- 

.NET Reflector 

Reflector e 6pay3tp Ha .NET KOMnoHeHTM m AeKOMnM/iaTop. C HeroBa noMOiu 
MoraT p,a 6"bAaT pa3r/ie>KAaHM m npeTtpcBaHM bcmukm nacm Ha .NET aceM6/iM- 
TaTa: TexHMTe MeTaAaHHM, IL MHCTpyKUMMTe, pecypcMTe m XML AOKyMeH- 
TauMATa. .NET Reflector (TeKymo BepcMfl 4.1.85.0) MO>xe p,a 6tAe H3TeMeH 
6e3n/iaTHO ot http://www.aisto.com/roeder/dotnet - ye6caMTa Ha aBTopa My 
Lutz Roeder. 

OyHKMMM 

OcHOBHMTe cpyHKUMM, komto Reflector npeA/iara, ca: 

- MepapxM^eH v\3rnep, no aceM6/iMTa m npocTpaHCTBa ot MMeHa 

- TtpceHe no MMe Ha TMnoBe 

- TtpceHe no MMe Ha n/ieH-npoMeH/iMBM m n/ieH-cpyHKUMM 

- ripeMeA Ha XML AOKyMeHTauMfl 

- TpaCp Ha M3BMKBaHMflTa 

- fleKOMnM/iauMsq b IL, C#, Visual Basic m Delphi 

- fltpBO Ha 3aBMCMMOCTMTe 

- MepapxMfl Ha 6a30BM m Hacnep,eHv\ TMnoBe 

- flper/ieA Ha pecypcM 



HnaBa 28. riOMomHM MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 



911 



- 5-bp30 TbpceHe b Google v\ b MSDN 
Eto KaK H3me>Kfla r/iaBHWAT eKpaH Ha npn.no>KeHkieTo: 



* Lutz Roeder's .NET Reflector 



File View loo Is Help 



OO E^E kit? P 2\S# 



- 



^$ SqlConnection 
S) *} Base Types 
=• .ctorQ 

ffi ,ctor(5qlConnection) 

V ,ctor(5tring) 
^ AddPreparedComrnand(SqlCornmand) : Void 

V BeginTransactionQ ! SqlTransaction 
^ BeginTransaction(IsolationLevel) : SqlTransat 

V BeginTransaction(String) : SqlTransaction 
~-fy BeginTransaction(IsolationLevelj String) : Sql' 
jfy ChangeDatabase(String) : Void 
^ CheckSQLDebugG : Void 
ift Check5QLDebug(5qlDebijgContext) : Void 
gfi Check5QLDebugOnConnect() : Void 



^ CloseDeadReaderQ : Void 
^9 CloseReaderQ : Void 

'•% Great eCommandO : SqlComrnand 

jf Dispose(Boolean) : Void 
V EnlistDistributedTransaction^Transac 



< 



public void CloseQ; 

Declaring Type: System. Data. SqlClient. SqlConnection 

Assembly: System. Data, Version=l. 0.5000.0 



Closes the connection to the database. This is the 
preferred method of closing any open connection. 

Exceptions 



Exception 


Condition 


SalExceotion 


The connection-level error that occurred 
while opening the connection, 



Q Back 
tj[} Forward 



Alt+Left 
Alt+Right 



^ Toggle Bookmark Ctrl+K 



[£] Copy 



Ctrl+C 



[^â– 7 Documentation Fl 



|3 Disassembler 

Ca|l Graph Ctrl+L 

Callee Graph Ctrl+E 






HaBMrauMn m rbpceine 

Ochobhoto npeAHa3Hanem/ie Ha Reflector e pa3r/ie>KflaHe Ha .NET aceM6/iMTa 
m TtpceHe b tax. no noflpa36npaHe npn crapTkipaHeTO ce 3ape>KflaT ochob- 
HMTe aceM6/iMTa Ha .NET Framework (MO>KeM fla M36npaMe Me>Kfly 1.0, 1.1, 
Compact Framework, ...). npefl/iara ce v\ weu\o 3a 6"bp3 M36op Ha perncTpn- 
paHMTe b GAC aceM6/ii/iTa. Reflector, pa36npa ce, MO>Ke fla 3ape>Kfla v\ npon3- 
bo/ihm flpyrn aceM6/ikiTa, BK/iionkiTe/iHO TaKMBa pa3pa6oTBaHM ot Hac. 

fleKOMnn/iaL|Hii Ha MSIL KOAa 

Bt3MO>KHOCTTa 3a fleKOMnn^aunfl e cpefl Haw-MomHi/iTe v\ necro i/i3no/i3BaHM 
cpyHKunn Ha Reflector. Ta e He3aMeHMM noMOiuHMK TaM, KtfleTO flOKyMeHTa- 
UMATa Ha HAKoe aceM6/iw e Herrb/iHa, HeacHa v\i\v\ npocTO zikincBa. Ako i/iCKaMe 
fla pa36epeM KaKBO touho npaBM onpefle/ieH MeTOfl, Tpa6Ba fla no3nunoHM- 
paMe Btpxy Hero v\ fla crapTkipaMe Disassembler. IHe 6"bfle reHepupaH koa Ha 
e3MK no Hawe npeflnonwTaHkie: IL, C#, Visual Basic v\nv\ Delphi. Ha cpurypaTa 
no-flo/iy e noKa3aH M3xofl b C# 3a cpyHKun^Ta Dispose() Ha System. Data. 
SqICIient. B npo3opeu.a c pe3y/iTaTa pecpepupaHMTe cpyHKu.nn v\ CBOMCTBa ce 
npeflCTaBAT c xnnepBp"b3KM. TaKa MO>KeM fla ce npexBtp/ikiM 6"bp30 b TexHMTe 
fleTaw^M ot pea/i M3au.kiflTa. 



912 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Lutz Roeder's .NET Reflector 



File View Tools Help 



OQ|E?lltjHPa <:# 



v 



tJ SqIConnection 

E ") Base Types 
'V .ctorQ 

^ .ctor(SqlConnection) 
=* .ctor(String) 

^ AddPreparedCornrnand(SqlCornrnand) : Void 
^ BeginTransactionQ : SqlTransaction 
^ BeginTransaction(IsolationLevel) : SqlTransad 
=♦ BeginTransaction(String) : SqlTransaction 
"-^ BeginTransaction(IsolationLevel, String) : SqlT 
-ijf ChangeDatabase(String) : Void 
=♦ CheckSQLDebugQ : Void 
J* CheckSQLDebug(SqlDebugContext) : Void 
^ Check5QLDebugOnConnect() : Void 
£ CloseQ : Void 
^ CloseDeadReader() : Void 
J* CloseReaderQ : Void 
'♦ CreateCommandO : SqlCommand 



A 



protected override void Disposefbriul disposing) 
{ 

if (disposing) 

{ 

switch (this._objectState) 



{ 



--^ EnlistDistributedTransaction(ITransaction) : V( 
J& ExecuteTransactionfStrina, Strina) : Void -—I 



case ConnectionState.Open: 

i 

this.CloseQ; 
break: 



} 



r 

this. 



constr = null; 



r 

base , Dispose(disposing); 



protected override void Dispose(bool disposing); 
Declaring Type: System, Data . SqICIient , SqIConnection 
Assembly: System, Data, Version=l, 0,5000.0 






rpa$ Ha M3BMKBaHM$ITa 

flpyra MHTepecHa cpyHKuna Ha Reflector ca rpacpkue Ha M3BMKBaHMflTa. Te 
AewcTBaT b ABe nocoKM, T.e MoxeM p,a bmahm KaKTO OTicbAe ce M3BMKBa AaAeH 
MeTOA, TaKa v\ kom cpyHKunn M3BMKBa caMMAT tom. Pe3y/iTaTMTe ot aHa/iM3a ce 
BM3ya/iM3npaT bbb cpopMa Ha rpacp, b komto yAo6HO MoraT p,a ce npoc/ieA^T 

3aBMCMMOCTMTe. 



Pa3uinpqeMOCT 

Reflector no3BO/iflBa ziecHO pa3LunpflBaHe npe3 MexaHM3Ma Ha Ao6aBKMTe 
(add-ins). ripoeKTbT .NET Reflector Add-Ins, noAAtpwaH b GotDotNet 
( http://www.qotdotnet.com/workspaces/workspace.aspx?id = 0f5846c3-c7aa- 
4879-8043-e0f4fc233ade ') npeAOcraBfl HamoTCTBUfl b HacoKa Cb3AaBaHeTO Ha 
Ao6aBKM, AeMOHCTpupaHM npe3 HAKO/iKO npuMepa c Bapupaiua c/io>khoct. 

OcBeH cnoMeHaTMfl npoeKT, peAHua pa3pa6oT4nun He3aBMCMMO ca cb3p,aBanw 
pa3UJnpeHMfl 3a .NET Reflector. rioApo6eH cnwcbK Ha Ao6aBKM ce noAAtpwa 
Ha http://www.aisto.com/incominq/Reflector/AddIns/ . Hakom ot no-/iro6onnT- 

HMTe BKJIrOHBaT: 



HnaBa 28. riOMommi MHCTpyMeHTM 3a .NET pa3pa6oTHHun 913 

- Reflector.CodeMetrics - aHa/iki3kipaHe Ha .NET aceM6/ii/iTa v\ noi<a3BaHe 
MeTpuKM 3a Ka^ecTBOTO Ha KOfla. 

- Reflector.Graph - M34epTaBaHe Ha rpacpn Ha 3aBMCMMOCTM 3a .NET 
aceM6/iMTa v\ IL rpacpn. 

- Reflector. Diff - Bki3ya/iki3kipaHe Ha pa3/iHKM Me>Kfly flBe Bepcun Ha eflHO 
m Cbiuo .NET aceM6/iw. 

- Reflector. VisualStudio - Brpa>KflaHe Ha caMna .NET Reflector bbb Visual 
Studio .NET 2003. 

- Reflector. FileDisassembler - 3annc bbb cpaw/i Ha pe3y/iTaTa ot 
AeKOMnn^aunflTa. 

- Reflector. VSDisassembler - 3ani/ic bbb cpaw/iOBe Ha pe3y/iTaTa ot 
AeKOMnw/iaukiflTa v\ Cb3AaBaHe Ha Visual Studio .NET 2003 npoeKT. 

FxCop 

FxCop e 6e3n/iaTeH i/mcrpyMeHT, pa3pa6oTBaH ot Microsoft, 3a craTkmeH 
aHa/iki3 Ha KOMnw/iwpaH ynpaB/i^BaH koa. ritpBOHana/iHO FxCop e 6m/i cb3Aa- 
AeH 3a BtTpeujHMTe Hy>KAn Ha KOMnaHMATa. Tom e AonpwHecb/i mhoto 3a ocm- 
rypaBaHeTO Ha yHncpnunpaH bma Ha .NET Framework API. KoraTO CTaBa acho, 
ne FxCop MO>xe p,a 6"bAe no/ie3eH v\ b no-iunpoKa o6/iacr ot npw/io>KeHi/ifl, 
Microsoft OTBapa KOAa My. TeKymaTa Bepcua Ha FxCop e 1.32 i/i Moxe p,a 6"bAe 
M3Ter/ieHa ot http://www.qotdotnet.com/team/fxcop/ . 

FxCop aHa/iki3kipa .NET aceM6/ikiTa v\ AOK/iaABa 3a BepoflTHM npo6/ieMM, 
CB"bp3aHM c MHO>KecTBO acneKTw Ha KanecrBOTO Ha KOAa - npoeKTupaHeTO, 
MHTepHaunoHa^M3auMflTa, npoi/i3BOAHTe/iHOCTTa, ci/irypHOora. ro/iflMa nacr ot 
npeA/ioxeHMATa 3a noAo6peHki*i, komto FxCop Aasa, aApecupaT HapywaBa- 
HeTO Ha hakom ot npenoptKMTe 3a nporpaMnpaHe v\ AH3ai/iH, ny6/ikiKyBaHki b 
"Hani>TCTBMfiTa npw npoeKTfipai-ie 3a .NET Framework ot Microsoft®" 
( http://msdn.microsoft.com/library/en-us/cpqenref/html/ 
cpconnetframeworkdesiqnquidelines.asp ). To3m AOKyMeHT cwvbpwa 6oraT 
cnncbK ot HacoKM m npaBM/ia Ha Microsoft 3a nucaHe Ha HaAe>KAeH v\ zieceH 3a 
noAA"bp>KaHe koa 3a .NET Framework. 

FxCop e npeAHa3HaneH Hai/i-Bene 3a pa3pa6oTni/iu.M Ha 6ki6/ikiOTeKM ot 
K/iacoBe 3a .NET Framework, ho ro/iflMa nacr ot npaBki/iaTa My ca npn^OKMMn 
3a pa3/iMHHM TunoBe npw/io>KeHkifl. noAnoMarawKM M3ynaBaHeTO Ha yTBtpAeHM 
npaKTMKM b .NET Framework, npoAyKTbT MMa v\ cepno3Ha o6pa30BaTe/iHa 

CTOMHOCT. 

FxCop Moxe Aa 6"bAe MHTerpupaH b npoueca Ha pa3pa6oTKa Ha cocpTyep no 
HAKO/iKO Hani/ma. 3a MHTepaKTMBHa pa6oTa tom npeA.nara npn^OKeHne c 
rpacpwueH noTpe6kiTe/iCKki MHTepcpewc (FxCop.exe). MHcrpyMeHTbT 3a KOMaHA- 
HMfl peA (FxCopCmd.exe) e noAxoAHLU 3a aBTOMaTM3npaHe Ha build npoueca v\ 
3a MHTerpaunfl c Apyrn MHCTpyMeHTM. 



914 nporpaMnpaHe 3a .NET Framework (tom 2) 

npaBM/ia b FxCop 

ripaBki/iaTa, MflBaiun c FxCop, nonaflaT b cnep,Hv\je KaTeropnn: 

- npoeKTupaHe - OTKpuBaHe Ha BepoaTHn HeflocTarbun v\ npo6/ieMw npn 
npoeKTkipaHeTO. 

- MMeHyBaHe - OTKpuBaHe Ha HenpaBki/iHO i/i3no/i3BaHe Ha Ma/iKki v\ 
ro/ieMki 6yKBM, koi\v\3\av\ c k/ikdhobm aymm ot pa3/ii/mHMTe e3Mun m Apyrn 
Btnpocn, CB"bp3aHM c MMeHaTa Ha TunoBe, n/ieH npoMeH/ikiBki, napa- 
MeTpn, npocrpaHCTBa ot MMeHa v\ aceM6/ii/iTa. 

- ripoki3BOAMTe/iHOCT - OTKpuBaHe Ha e/ieMeHTM ot aceM6/ikiTaTa, komto 
BOflflT ao HaMa/ieHa npoi/i3BOAHTe/iHOcr. 

- CurypHOCT - OTKpuBaHe Ha nporpaMHM e/ieMeHTki, komto npaBflT 
aceM6^MTaTa ya3BMMM kbm 3/iOHaMepeHM noTpe6nTe/in / koa. 

- YnoTpe6a - OTKpuBaHe Ha BepoaTHn HeAOcraTbUki b aceM6/ikiTaTa, 
CBtp3aHM c Ha^MHa Ha ki3iTb/iHeHkieTO Ha KOfla. 

- l/lHTepHaui/iOHa/iki3auki*i - OTKpuBaHe Ha ^uncBaiun v\nv\ HenpaBki/iHO 
M3no/i3BaHM ^OKa^M3aunoHHM e/ieMeHTM b aceM6/iMTaTa. 

- COM - OTKpuBaHe Ha npo6/ieMi/i, CBtp3aHM c B3anMOAeMCTBneTO c COM 

06eKTM. 

Ha bcako npaBM/io ce onpenenn hmbo, noKa3Baiuo Ba>KHOCTTa Ha otkpmtma 
npo6/ieM. flpyra Ba>KHa xapaKTepucTMKa Ha npaBi/i/iOTO e creneHTa Ha yBepe- 
hoct, ne KopeKTHO e onpeAe/iw/io CMTyaunaTa ioto npo6/ieM. 

FxCop - rpa4>MHHO npujioweHiie 

B npo3opeua Ha FxCop ce noKa3BaT aceM6/ikiTaTa v\ npaBki/iaTa, y^acTBaiun b 
aHa/iki3a, KaKTO v\ reHepupaHMTe cbo6meHi/m ot npoBepKaTa. rio-flo/iy Ha 
cpurypaTa e noKa3aH Bv\p,a Ha rpacpi/mHOTO npM/io>KeHMe, 4mmto KOMnoHeHTM 
me pa3r/ieflaMe. 

KoMnoHeHTM Ha npmio>KeHMeTO 

Pa6oTHaTa n/iom e pa3Ae/ieHa Ha Tpn ochobhm pernoHa: 3a KOHCpwrypaui/mTa, 
c"bo6iueHMflTa v\ CBOMCTBaTa. 

PernoHtT 3a KOHCpurypaunaTa, b ziHBaTa nacr Ha npo3opeua, noKa3Ba b 
i/iepapxkmeH v\3vnep, aceM6/ikiTaTa v\ npaBki/iaTa. Te3M flBa KOMnoHeHTa flecpn- 
HupaT FxCop npoeKT. Cnefl KaTO 6"bfle KOHCpurypupaH, npoeKTbT MO>xe fla 
6"bAa 3anncaH bbb cpaw/i c pa3UJnpeHMfl (*.FxCop) v\ BnocneACTBwe 3apeAeH 
ot npn^OKeHneTO. 

PernoHtT 3a cbo6meHi/iflTa b A^CHaTa nacr Ha npo3opeua noKa3Ba AOK/iaA etc 
cbo6meHkiflTa, reHepupaHM npn aHa/iki3a. Mo>KeM p,a cpw/iTpwpaMe e/ieMeHTMTe 
no aceM6/iMTa v\ no npaBki/ia. 



HnaBa 28. noMOuUHki MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 



915 



npo3opeu"bT 3a CBOMCTBaTa noKa3Ba b "Output" MHCpopMauna 3a npe,qynpe>K- 
AeHMfl m rpeujKM, a b "Properties" BH3ya/iM3npa no,qpo6Hki flaHHM 3a M36paHO 
aceM6/iw, npaBki/io v\nv\ cbo6meHwe. 



Microsoft FxCop - My FxCop Project* 



File Edit Project Tools Help 



- n x 



D H^B 1 H% â–º *ra^e 



Targets 



Rules 



B 0jp My FxCop Project 
fi-0© Abstract Type.dll 
E) 0g abstracttype.dll 
S-0{} DesignLibrary 
H-0*tf BadAbstractC 

: 0' : -* ctorO 

H-H*? Good.JSbstrac 
0-^ .ctorl) 

1 >i 



Active 


Excluded In Project 


Absent 




Level 


Fix Category 1 Certainty 


Rule 


Item 


© 


Non Breaking 


95% 


Mark assemblies wi.. 


abstra 




Non Breaking 


sax 


Mark assemblies wi 


abstrd 


T© 


Non Breaking 


99% 


Mark assemblies wi.. 


abstra 


TO 


Non Breaking 


95% 


Assemblies should 


abstra 


TO 


Breaking 


33% 


Assemblies should 


abstra 


A 


Breaking 


50% 


Avoid namespaces . 


Desigi 


fdk 


Non Breaking 


99% 


Abstract types sho . . . 


Desigi 


< 


III! 




J 


â– >J 



1 message;?; selected 



Error, Certainty 93, for "MarkAssembliesWithClsCompliarit" 



A 



Target 
Resolution 

Help 

Category 
Checkld 
RnleFile 



"abstracttype. dll" (IntrcspectionTargetModule) 

" 'AbstractType' should be marked with CLSCompliantj 

and its valne shonld be trne. " 

" l-.ttp : / '/www . gotdotnet â–  com/team/f xcop/doc3/rules/De; 

"Microsoft . Design" (String) 

"CA1014" (String) 

"Design Rules" [String) 



v 



III! 



> 



C.::_: 



kl3Bi>piiJBaHe Ha aHa/iM3M c FxCop 

3a fla M3no^3BaMe FxCop, Tpa6Ba fla yKaxeM eAHO v\j\v\ noBene aceM6/ii/iTa 3a 
aHa/ii/i3, KaKTO v\ ep.no v\nv\ noBene npaBki/ia. no noflpa36wpaHe b hobmh 
npoeKT ca M36paHM bcmukm Ha/iwuHki npaBki/ia. C/iefl HaTMCKaHe Ha "Analyze" 
ce cb3AaBa v\ noi<a3Ba flOK/iafl etc cbo6meHkm. 

B pernoHa Ha c"bo6iueHMflTa MO>KeM fla bmamm pe3y/iTaTMTe ot aHa/iki3a. Ot 
KOHTeKCTHOTO MeHK) b perwoHa 3a cbo6meHkiflTa, no/iynaBaMe Aocrbn flo 
c^eflHMTe onepaunn Btpxy ch>o6meHkiflTa: 

- nper/iefl Ha no-fleTaw/iHki CBOMCTBa 

- KonnpaHe Ha flaHHMTe b pa3/innHw cpopMaâ„¢ (.csv, .xmi) 

- M3K^KD4BaHe OT 6"bfleLfll/l flOK/iaflkl 

M3BMKBaHeTO Ha npo3opeu c no-fleTaw/iHa MHCpopMauna MO>Ke fla CTaHe v\ npe3 
flBOMHO lupaKBaHe v\nv\ c HaTMCKaHe Ha Enter. Bi/i3ya/ii/i3wpa ce u,*i/iaTa 
Ha/iwuHa MHCpopMaunfl 3a npaBki/iOTO v\ 3a npo6/ieMHi/i*i yuacrbK ot aceM6/iMTO, 



916 nporpaMnpaHe 3a .NET Framework (tom 2) 

cbnpoBOfleiHa c npenoptuMTe/iHO flewcTBue. Eto KaK H3Me>Kfla npuMepeH 
npo3opeu c fleTaw^MTe: 



Message Details 



Issues! | Rule Details || Message || Rule Support [ Notes | 



Item: FxCopExample.badlyNamedQass.get_nniJValue(]:SiJstem.String 



Level Certainty Resolution 



/j^ Warning 75 'badlvNamedClass.get_rnvValue(]:String' appears to have no upstream public or protected callers. 



Source: d:\Droiects\dotnetbook\r , KCODeKample\r , xcoDeKample\badl^namedclass.cs [131 

Resolution 
'badljjNamedClass.get_myValue():String' appears to have no upstream public or protected callers. 



OK Exclude Previous Next 



l/l3KsiK>HBaHe Ha c"bo6meHMH 

B onpefle/ieHM cnynaM e B"b3MO>KHO fla hm ce Ha/io>KM fla i/in-iopi/ipaMe hakom 
c"bo6iueHMfl. Moxe npn npoeKTupaHeTO Ha KOAa fla CMe HanpaBi/i/ii/i cb3Ha- 
Te/ieH M36op, komto B/ii/i3a b npoTMBope^ne c HHKoe npaBi/i/io. B"b3MO>KHO e v\ 
HAKoe npaBi/i/io fla e MfleHTucpnunpa^o norpeujHO flafleHa cuTyauna KaTO 
npo6/ieMHa. 3a fla He ce noHBABa b 6tfleiun flOK/iaflM, m3/imluhoto c"bo6iueHne 
MO>Ke fla 6"bfle M3KnioneHO. ripn bcako M3K/iK>nBaHe ce 3ana3BaT MMeTO Ha 

M3B"bpLUl/ITe/lfl M He3afl"b/l>KMTe/ieH TeKCT C npM4MHMTe. 

3ana3BaHe Ha npoeKT m AOK/iaA 

HanpaBeHMTe Hacrpoi/iKM no npoeKTa MoraT fla ce 3ana3*iT, TaKa ne fla ce 
no/i3BaT noBTopHO B"bB FxCop v\nv\ fla ce MMnopTupaT bbb FxCopCmd. Oafi/io- 
BeTe 3a flOK/iafl, komto no flecpMHuuna cbfltpaoT Ha6op ot c"bo6iueHMfl, MoraT 
cbmo fla ce MMnopTupaT bbb FxCopCmd v\i\v\ b flpyr FxCop npoeKT. M flBaTa 
cpopMaTa ca XML-6a3npaHM. 

FxCopCmd - npusioweHue 3a KOMaHflHMsi pen 

FxCopCmd e noflxoflaiu 3a aHa/ii/i3i/ipaHe Ha aceM6/iMTa b aBTOMaTM3npaHa 
cpefla. OnuuMTe 3a KOMaHflHua pefl c/iy>KaT 3a yKa3BaHe Ha aceM6/ii/iTaTa, 
npaBM/iaTa v\ M3xoflHMfl cpai/i/i. FxCopCmd He noflfl"bp>Ka cb3flaBaHe v\ kohc|dm- 
rypupaHe Ha npoeKTM, hmto i/i3K/iK>nBaHe Ha cbo6meHM*i. 3a Te3M onepaunn, 
KaKTO m 3a no-fleTaw^eH kohtpo/i, ce M3no/i3Ba FxCop. 

no/i3M ot ynoTpe6aTa Ha FxCop 

FxCop e eflMH ot MHCTpyMeHTMTe, komto hm noMaraT fla cb3flaBaMe no-flo6pM 
npM/io>KeHMfl. Tom MflBa c Ha6op ot yTBtpfleHM b Microsoft npaBM/ia, ho MMaMe 



HnaBa 28. noMommi MHCTpyMeHTM 3a .NET pa3pa6oTHkiun 917 

B"b3MO>KHOCTTa fla cb3flaBaMe v\ flo6aBAMe co6cTBeHM. Pa3pa6oTeHM ca 
MHOKecTBO Aont/iHi/iTe/iHi/i npaBki/ia, komto ziecHO MoraT fla 6"bflaT HaMepeHM b 
MHTepHeT. M3no/i3BaHeTO Ha FxCop hm flaBa noBMiueHa curypHOCT, ne koabt 
hm ce npnfl"bp>Ka KbM yTBtpfleHM npaKTMKM 3a .NET pa3pa6oTKaTa v\ npaKTMKM, 
cneuncpM4HM 3a npoeKTa hm. 

C noMomTa Ha FxCop MO>KeM no-/iecHO fla nocTurHeM BucoKa CTeneH Ha 
noc/ieflOBaTe/iHOcr v\ yHncpnunpaHOCT Ha KOfla, flopn v\ b npoeKTM c ro/ieMki 

eKMnM. ABTOMaTM4HOTO OTKpMBaHe Ha MHO>KeCTBO TMnH4HM rpeujKM M 

nponycKM me hm ocbo6oah noBene BpeMe, KoeTO fla ki3no/i3BaMe 3a no-Ba>KHi/i 
Btnpocn ot pa3pa6oTKaTa. fla He 3a6paB*iMe, ne FxCop He Mowe fla hm 
npeflna3M ot /ioluo npoeKTupaHe v\ nporpaMnpaHe, KaKTO v\ He MO>Ke fla 
3aMecTM flpyrn no/ie3Hi/i npaKTMKM, KaTO B3anMHMa nper/iefl Ha KOfla. 

M3no/i3BaHa JiMTepaTypa 

- FxCop Documentation 1.312.0 - http://www.qotdotnet.com/team/fxcop/ 
qotdotnetstyle.aspx7urNFxCop.html 

- Anand Rao, Best Practices of Coding - http://www.c-sharpcorner.com/ 
Code/2005/April/Codinq Practices .asp 

CodeSmith 

CodeSmith ( http://www.codesmithtools.com ') e nony/iapeH reHepaTop Ha koa 
3a BCflKaKBM nporpaMHM e3v\u,v\: C#, VB.NET, T-SQL v\ t.h. Tom pa6oTM c 
Lua6/iOHki, 4mmto CMHTaKCuc Hanoflo6flBa ASP.NET koa. TeKymaTa My Bepcua e 
3.1, a noc^eflHaTa My Hant/iHO 6e3n/iaTHa Bepcua e 2.6. Ta MO>Ke fla 6"bfle 
CBa/ieHa ot http://www.codesmithtools.com/download/codesmith 26.zip . 

ripeflMMCTBOTO Ha KOMepcwa/iHaTa Bepcua e Haw-Bene b Ha/iwui/ieTO Ha 
cpeflaTa CodeSmith Studio 3a 6"bp30 nucaHe v\ TecTBaHe Ha Lua6/iOHki, ho Tbv\ 
KaTO Te ca TeKCTOBM cpaw/iOBe, MO>xeM fla vv\ cb3flaBaMe v\ c noMOurra Ha o6mk- 
HOBeH TeKCTOB peflaKTop. 

TeHepnpaHe Ha koa 

HeKa npeflu fla pa3MeflaMe B"b3M0>KH0CTMTe Ha i/mcrpyMeHTa CodeSmith pa3- 
r/ieflaMe reHepupaHeTO Ha koa KaTO KOHu.enu.wfl: iokbo npeAcraB/iHBa, Kora 
ce no/i3Ba, c iokbo e no/ie3HO v\ t. h. 

KaKBO npeACTaB/inea reHepwpaHeTo Ha koa? 

TeHepupaHeTO Ha koa npeAcraB/iflBa ki3no/i3BaHe Ha nporpaMa 3a aBTOMa- 
tm4ho cb3AaBaHe Ha koa, komto nocne p,a 6tAe BK/iioneH b cope KOAa Ha 
Apyro npi/i/io>KeHi/ie. CbmaTa TexHMKa, ocBeH 3a reHepupaHe Ha cope koa Ha 
nporpaMHM e3nun, MMa npn^OKeHne v\ b Apyrn o6/iacri/i, HanpuMep b cb3Aa- 
BaHeTO Ha AOKyMeHTauna. 

TeHepaTopnTe Ha koa no/iynaBaT KaTO bxoa M3MCKBaHMfl, komto necro ce 
onucBaT b XML HOTau.i/m. 06pa6oTKaTa Ha AaHHMTe boah ao cb3AaBaHeT0 Ha 



918 nporpaMnpaHe 3a .NET Framework (tom 2) 

eAMH v\nv\ hako/iko M3xoflHM cpai/i/ia. TeHepaTopnTe c o6iuo npeflHa3Hanei-me 
(KaKtBTO e CodeSmith) Haw-necTO M3no/i3BaT Lua6/iOHki 3a onucBaHe ziorwKaTa 
Ha pa6oTaTa, koato M3B"bpujBaT. 

B npaKTMKaTa ujmpoko ce i/i3no/i3BaT v\ p"b4HO-cb3flafleHM reHepaTopn. TaKMBa 
noMOiuHM nporpaMKM ce nosiBflBaT, KoraTO pa3pa6oT4MUMTe npeAnoneTaT p,a 
no/i3BaT ^K)6nMMfl cm CKpunTOB e3MK 3a peiuaBaHeTO Ha KOHKpeTHMa npo6/ieM, 
c komto ca ce c6/i"bCKa/in. 3a npocTM 3afla4M, to3m noflxofl pa6oTM flo6pe, ho 
cneuna^M3npaHMTe MHCTpyMeHTM KaTO CodeSmith MMaT CBOMTe npeAHMcmaTa. 
Te yHMCpnunpaT Hankma Ha npeflcraBflHe Ha ziorwKaTa v\ TaKa y/iecHflBaT 
cb3flaBaHeTO, noAAPt>>KKaTa v\ cnoAe/iflHeTO Ha Lua6/iOHM. 

nacMBHM h aKTHBHH reHepaTopn Ha KOA 

riacMBHMTe reHepaTopn c/iywaT 3a eAHOKpaTHO cb3AaBaHe Ha koa, komto 
Bnoc^eACTBue MO>Ke cbo6oaho p,a 6"bAe npoMeHflH v\ HacTpowBaH ot 
nporpaMMCTa, b cnynai/i ne He OTroBapa Hairb/iHO Ha M3MCKBaHMflTa Ha 
npw/io>KeHi/ieTO. To3m Tun reHepaTopn p,asaj "/leT^m CTapT" Ha pa3pa6oTKaTa, 
ho He MO>xeM Aa pa3HMTaMe Ha tax b no-HaTarbiuHMfl xoa Ha npoeicra. 

AKTMBHMTe reHepaTopw He caMO cb3AaBaT eAHOKpaTHO KOAa, a noeMaT 
OTroBopHOCT Aa ro noAAtpwaT. ripn BC^Ka npoMAHa Ha M3MCKBaHMflTa v\nv\ 
BxoAHMTe AaHHM ce CTapTupa irb/iHO npereHepupaHe Ha KOAa. Pa6oTaTa c 
aKTMBHMTe reHepaTopw e Ao6pe Aa 6"bAe Hairb/iHO aBTOMaTM3npaHa. He ce 
npenoptuBa ynoTpe6aTa mm b KOM6nHaunfl c ptuHki MOAncpuKaunn Ha 
M3XOAHMA koa, ocBeH aKO HflMa yAo6eH m HaAe>KAeH MexaHM3"bM, npe3 komto 
P"b4HMTe npoMeHM Aa 6"bAaT 3ana3BaHM npn npereHepupaHeTO. 

npeAHMCTBa Ha reHepwpaHeTO Ha koa 

TeHepupaHeTO Ha koa hm hocm mhoto no/i3w. HeKa pa3r/ieAaMe no-cbmecr- 
BeHMTe ot tax: 

- ripoflyKTMBHOCT: TeHepaTopnTe Ha koa MoraT Aa cnecryiT nacoBe v\ ahm 
M3nt^HABaHe Ha pyTMHHM, noBTopaeMM onepaunn. B c/iynaw Ha 
npoMeHfliun ce M3MCKBaHMfl kbm aBTOMaTi/mHO reHepupaHa nacr ot cmc- 
TeMaTa, c MkiHkiMa/iHa npoMflHa b Lua6/iOHa v\ npereHepupaHe, MoraT Aa 

Ce MOAMCpMUMpaT aBTOMaTM4HO TO/ieMM KO/ll/IHeCTBa koa. 

- nocneflOBaTe/iHOCT: K/iacoBeTe, MeTOAMTe v\ npoMeH/iMBkiTe b m3xoa- 
HM5i koa ca MMeHyBaHM yHMCpnunpaHO, KoeTO vv\ npaBi/i ziecHi/i 3a 
no/i3BaHe. /lornKaTa Ha pea/iki3aukiflTa Ha eAHOTuneH koa e nocneAOBa- 
Te/iHa HaBCflKtAe b reHepupaHna m3xoa. 

- E/iMMMHMpaHe Ha p,y/6nv\Kai\v\n: EAHa ot xapaKTepwcTMKMTe Ha 
KanecrBeHaTa pea/iki3aukifl e HaMa/iflBaHeTO Ha Ay6/inKaukisiTa Ha 
MHCpopMaunflTa b paMKMTe Ha eAHa cwcreMa. noBTopeHHATa necro boaat 
AO CKtno CTpyBaiun MOAncpuKaunn v\ 3aTpyAHeHa noAAPtwKa. EAHa v\p,en 
v\nv\ npaBki/io necro Hen36e>KHO npucbCTBaT no hako/iko ntTM b pa3^M4- 
hm 4acTM ot KOAa, 6a3aTa ot AaHHM, AOKyMeHTaunaTa. Cm^ho npenopt- 
ni/iTe/iHO e bcako 3HaHne b cwcreMaTa Aa MMa eAMHCTBeHO, HeABycMnc- 



HnaBa 28. riOMommi MHCTpyMeHTM 3a .NET pa3pa6oTHHun 919 

/ieHO, flecpMHMTMBHO npeAcraBAHe. C/ieABaHeTO Ha Ta3M npaKTMKa no3- 
BO/iflBa npoMeHMTe v\ noflo6peHMATa fla 6"bflaT M3B"bpiueHM Ha eflHO macto 
m aBTOMaTM^HO p,a ce pa3npocrpaHflBaT HaBCHicbAe. TeHepaTopnTe Ha 
koa noHAKora ca Haw-npaKTMUHOTO v\ Aopn eAMHCTBeHOTO cpeACTBO 3a 
cnpaBAHe c TaKMBa npo6/ieMM. Hpe3 tax MO>KeM p,a cb3AaBaMe v\ o6ho- 
BABaMe aBTOMaTM^HO nacri/i ot KOAa v\ AOKyMeHTaunaTa Ha 6a3aTa Ha 
npeACTaBMTe^HMTe ashhu. 

- A6cTpaKL(iin: TeHepaTopnTe Ha koa hm AaBaT bbsmokhoct p,a pa6oTMM 
no-6/ii/i30 ao npeAMeTHaTa o6/iacr, KaTO cb3AaBaMe a6cTpaKunn, tpyahm 
3a onucBaHe npe3 e3MK c o6iuo npeAHa3HaneHi/ie ioto C# m nocne p,a 
reHepupaMe ot tax KOAa. TeHepaTopnTe no3BO/iHBaT npeAcraBHHe Ha 
6n3Hec npaBki/iaTa v\ CTpyKTypaTa Ha npw/io>KeHkieTO bbb cpopMa, yAo6Ha 
3a nper/ieA h auai\v\3 ot xopa, komto He ca nporpaMMCTM. flo6aBAHeTO 
Ha AOirb/iHMTe/iHi/i Hi/ma Ha a6crpaKunfl boah ao noBMiueHa rbBKaBOcr v\ 
b Apyrn HanpaB/ieHkifl. HanpuMep caMO c npoMsiHa Ha Lua6/iOHa 3a reHe- 
pupaHe, AHec MO>KeM p,a npon3Be>KAaMe C# koa, a yTpe Aa npeMkmeM 
cpaBHMTe/iHO ziecHO kbm VB.NET pea/iM3aui/ifl. 

npo6/ieMM c reHepwpaHeTO Ha koa 

TeHepupaHeTO Ha koa, KaKTO BC^Ka Apyra TexHMKa, ocBeH no/io>KkiTe/iHi/i 
CTpaHM MMa m hakom HeAOcraTbuw . HeKa pa3r/ieAaMe hakom otthx: 

- 3a Aa ce npi/i/iara ecpeKTMBHO Tpa6Ba Aa ce MHBecTupaT BpeMe v\ ycv\nv\s\ 
3a AOKyMeHTupaHe, o6yneHkie v\ noAAP"b>KKa. 

- TeHepaTopnTe MoraT Aa ce OKa>KaT HeAOcraTbUHO rbBKaBM 3a pacTaiunTe 
Hy>KAM Ha npoeKTa KaTO Aa ce ycno>KHflT ao CTeneH, npn koato 
noAAP"b>KKaTa mm CTaBa TpyAHa. 

- TeHepaTopnTe MoraT Aa BHecaT M3BecTHa Hewe/iaHa c/io>khoct b npoueca 
Ha pa3pa6oTKa. 

- CtiuecTByBa onacHOCT npeKOMepHaTa mm ynoTpe6a Aa 3aMecTM npw/iara- 
HeTO Ha co^maho o6eKTHO-opneHTnpaHO MOAe/ii/ipaHe. 

npM/io>KeHMn Ha reHepaTopwTe Ha koa 

BtnpeKM M36poeHMTe HeAOcraTbui/i, reHepupaHeTO Ha koa ocraBa MOiuHa 
TexHMKa c lunpoKO npn^OKeHne. Ta cnene/iBa nonynapHOCT ntpBO npn Java 
pa3pa6oTKMTe. Kbm MOMeHTa 6poaT Ha reHepaTopnTe Ha Java koa e no-ro/iflM 
ot to3m 3a BCM4KM ocraHa/iki e3v\u,v\ , ho .NET 6"bp30 HaBaKCBa, KaTO ce npeA- 
ziaraT Haw-Bene reHepaTopn Ha C# koa. M3no/i3BaT ce Haw-Bene 3a Aocrbn ao 
6a3M ot AaHHM, 3a AecpMHupaHe Ha noTpe6kiTe/iCKM MHTepcpewc v\ Aopn 3a 
Cb3AaBaHe Ha \\ei\v\ GUI v\ ye6 npM/io>KeHMfl. B .NET Framework 1.x ca 
nony/iapHi/i v\ reHepaTopnTe Ha cm/iho TnnM3npaHM KoneK\xv\v\. 

BisBefleHMe b uja6/iOHHTe Ha CodeSmith 

CnHTaKCMCbT Ha CodeSmith Lua6/iOHkiTe mhoto HanoMHa Ha ASP.NET, KtAeTO 
ce M3no^3BaT pa3Ae/inTe/iw 3a OTp,ej\s\ue Ha KOAa, M3n"b/iH*iBaH Ha ctpBtpa, ot 



920 nporpaMnpaHe 3a .NET Framework (tom 2) 

HTML m JavaScript KOfla, M3npaiuaH Ha 6pay3-bpa. CodeSmith i/i3no/i3Ba 
cbiuaTa TexHMKa 3a OTfle/iyiHe Ha i/i3n"b/iHMMMfl koa Ha Lua6/iOHa ot KOfla, komto 
me 6"bAe M3BeAeH KaTO m3xoa. 

M3no/i3BaHe Ha CodeSmith uia6/iOHn - npuMep 

LU,e pa3r/ieflaMe npuMepeH Lua6/iOH 3a M3Be>KflaHe Ha MMeHaTa Ha bcmukm 
cpaw/iOBe b flafleHa flupeKTopua, OTroBapaiun Ha 3aflafleHa cpai/i/iOBa MacKa. B 
npuMepa me reHepupaMe He nporpaMeH koa, a o6mkhob6h TeKCT. 



FileSearchTemplate . est 



<%@ CodeTemplate Language="C#" TargetLanguage="Text" 
Description="Simple template to show main syntax" %> 

<%@ Property Name="Filter" Def ault="* . est" 
Type="System. string" Category="Masks" 
Description="Mask for files in the directory" %> 

<%@ Assembly Name="SchemaExplorer" %> 

<%@ Assembly Name="System. Design" %> 

<%@ Import Namespace="SchemaExplorer" %> 

<%@ Import Namespace="System. 10" %> 

FileSearchTemplate used to show syntax and 

structure of template. 

<%= DateTime.Now.ToLongDateString ( ) %> 

// Comments within code delimiters or script blocks 
// are made using the Language syntax (e.g. C#) 
Response . WriteLine 

("List of files in template directory (using mask " 
+ Filter + ") ") ; 
DisplayDirectoryContents (Filter) ; 
Response .WriteLine ( ">> Code Generation Complete."); 

<%-- Codesmith style comment --%> 

<script runat="template"> 

// Iterates through the current directory and displays 

// a list of the files that conform to the supplied 

/ / ma s k . 

public void DisplayDirectoryContents ( string sFilter) 

{ 

string [] dirFiles = Directory . GetFiles 

( this . CodeTemplatelnf o . DirectoryName, sFilter) ; 

for (int i = 0; i < dirFiles . Length; i++) 

{ 

Response .WriteLine (dirFiles [i] ) ; 

} 



HnaBa 28. riOMomHM MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 921 



</script> 



M3XOfl"bT Ha FileSearchTemplate.cst e C/ieflHMflT: 



FileSearchTemplate used to show syntax and 

structure of template. 18 July 2005 

List of files in template directory (using mask * . est) 

C : \Program Files\Codesmith\Samples\FileSearchTemplate . est 

C : \Program Files\Codesmith\Samples\StoredProcDB . est 

C : \Program Files\Codesmith\Samples\StoredProcsl01 . est 

» Code Generation Complete . 



KaK pa6oTM npnMepi>T? 

M3xoflHMAT TeKCT cbfltpwa 3ar/iaBMeTO Ha wa6/iOHa, flaTaTa Ha reHepupaHeTO 
m MMeHaTa Ha cpafi/iOBeTe, otkpmtm no yKa3aHa MacKa. CnMCbKbT c v\3- 
6poeHMTe cpai/i/iOBe no/iynaBaMe KaTO pe3y/iTaT ot M3BMKBaHe Ha MeTOfla 

DisplayDirectoryContents(...) , KOMTO CMe pea/1 M3kl pa/1 kl Ha e3MKa C#. 
HM3"bT, reHepupaH OT DisplayDirectoryContents(...) ce fl06aBfl B M3XOflHMfl 
TeKCT npe3 MeTOAa Response. WriteLine (...) . 

3a Lua6/iOHi/iTe CBOMCTBaTa ca TOBa, KoeTO ca BxoflHMTe napaMeTpn 3a cpyHK- 

UMMTe. FileSearchTemplate.cst flecpMHMpa eflMHCTBeHO CBOMCTBO Filter, B 

KoeTO ce yi<a3Ba MacKa 3a cpaw/ia (npuMepHO *.doc). no noflpa36npaHe CMe 
3a/io>KM/in CTOMHOCTTa * . est (* . est e pa3LunpeHMeTO 3a CodeSmith 
iua6/iOHMTe). 

B npuMepa BUflaxMe KaK b wa6/iOHMTe MoraT fla ce no/i3BaT B"b3MO>KHOCTMTe 

Ha npOM3BO/ieH .NET K/iac, B C/iynafl System. IO. Directory. CbLflO TaKa 

AeMOHCTpupaxMe KaK Mowe fla ce M3B/iene i/mcpopMaui/m 3a TeKyiuna iua6/iOH 

(06eKT OT Tkin CodeTemplate) npe3 M3nO/13BaHe Ha CBOMCTBOTO this. 
CodeTemplatelnfo. K/iaCbT CodeTemplatelnf o npeflOCTaBfl CBOMCTBa 3a 
DateCreated, DateModif ied, Description, DirectoryName, FileName, 
FullPath, Language M Targe tLanguage. 

flMpeKTMBH 

E/ieMeHTMTe <%@ %> ce M3no/i3BaT 3a yKa3BaHe Ha CBOMCTBa v\ AnpeKTMBM Ha 

HMBO LUa6/10H. 

- CodeTemplate AnpeKTMBMTe ce M3no/i3BaT 3a yKa3BaHe Ha CKpunTOB 
e3MK (b npuMepa TOBa e C#), ue/ieBna e3MK v\ onucaHneTO. 

- Hpe3 AnpeKTMBaTa Property ce AecpMHupaT CBOMCTBaTa Ha wa6/iOHa. Te 
MoraT fla 6"bflaT pecpepupaHM b CKpunTa, KaTO ce M3no/i3Ba MMeTO mm 
(aTpn6yTa Name). Mo>Ke fla mm ce 3aflaBaT m TMn, ctomhoct no noflpa3- 
6MpaHe, onMcaHMe m KaTeropMa. 

- /^MpeKTMBaTa Assembly no3BO/iflBa pecpepMpaHeTO Ha bbhluhm .NET 
aceM6/iMTa. 



922 nporpaMnpaHe 3a .NET Framework (tom 2) 

- flupeKTMBaTa import e eKBMBa/ieHTHa Ha KOMaHflMTe: using b C# m 
Imports BtB VB.NET. 

EsieMeHTM 3a koa 

M3no^3BaHeTO Ha e/ieMeHTki 3a koa e noAo6HO Ha ynoTpe6aTa mm b ASP.NET: 

- <% %> ce M3no/i3Ba 3a koa, komto HAMa p,a ce noyiBflBa AnpeKTHO b 
M3X0Aa ot iua6/iOHa 

- <%= %> ce M3no/i3Ba 3a koa, komto Bptiua ctomhoct 3a Lua6/iOHa. Ta3M 

CTOMHOCT Tpfl6Ba Rd e OT TeKCTOB TMn. 

- <script runat=" Template" > </script> e 3a BK/lKDHBaHe Ha MeTOAH, 
kl3nO/13BaHM OT LUa6/10Ha (KaTO DisplayDirectoryContents(...) OT 

npuMepa). TaKa ce HaMa/iHBa KO/ii/mecTBO koa b <% %> e/ieMeHTMTe i/i 
ce noAo6p*iBa neTkiBHOdra Ha KOAa. 

KoMeHTapn 

- KoMeHTapnTe, HaMnpaiun ce b e/ieMeHTMTe 3a koa, w3no/i3BaT CMHTaK- 
cuca Ha e3MKa, yKa3aH b AnpeKTMBaTa codeTempiate (T.e 3a C# 6nxTe 
i/i3no/i3Ba/ii/i //, a 3a VB.NET anocrpocpki '). 

- 3a KOMeHTapn, komto ca BvrpeujHki 3a Lua6/iOHa v\ He ca npeAHa3HaneHM 
3a M3XOAHMA koa ce M3no^3BaT <% — — %> e/ieMeHTi/i. 

CodeSmith npusiomeHMfi 

J\a pa3MeAaMe ABeTe ochobhm npi/i/io>KeHi/m, komto ce AOcraBAT c MHcrpy- 
MeHTa CodeSmith - rpacpwuHkisiT noTpe6kiTe/iCKkifl MHTepcpewc v\ koh30/ihm*it 
BapnaHT. 

CodeSmith Explorer 

CodeSmith Explorer (codeSmith.exe) e npn^OKeHneTO, c KoeTO MOweM 
MHTepaKTMBHO p,a crapTkipaMe reHepupaHeTO Ha koa ot M36paH Lua6/iOH. Ako 
6"bAe crapTkipaHO 6e3 napaMeTpn, to noKa3Ba Ha/iwuHkiTe Lua6/iOHki, opraHM3M- 
paHM v\nv\ no AnpeKTopnn v\i\v\ no u.e/ieBM e3MK. Cnep, KaTO M36epeM we/iaHWH 
uja6/iOH (MO>KeM m Aa ro 3aAaAeM AnpeKTHO KaTO KOMaHAeH apryMeHT npn 
CTapTupaHe Ha npw/io>KeHkieTo) ce noflBflBa npo3opeu.a ot cpurypaTa no-AO/iy. 

ripeAM Aa nycHeM Lua6/iOHa Aa ce ki3n"b/iH*iBa, MO>KeM Aa ro KOMni/i/ii/ipaMe, 3a 
Aa npoBepuM CMHTaKTwuHaTa My KopeKTHOCT. B /lflBaTa nacr Ha npo3opeu.a ca 
napaMeTpnTe Ha Lua6/iOHa. YKa3BaHeTO Ha CTOMHOCTMTe mm Moxe Aa ce 
M3B"bpujn v\nv\ Ha ptKa v\nv\ npe3 3ape>KAaHe ot XML cpaw/i. Cnep, HaTMCKaHe Ha 
"Generate" Lua6/iOH"bT ce npw/iara Btpxy yKa3aHMTe napaMeTpn v\ b "Template 
Output" ce noHBABa pe3y/iTaTa. MoxeM Aa KonnpaMe m3xoahma koa v\i\v\ p,a ro 
3ana3MM KaTO cpaw/i. 



HnaBa 28. riOMomHM MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 



923 



§ CodeSmith - Sim pleFileTem plate. est 



- iiniix 



B M 

Filter 



Filter 

Mask for files in the directory 



g£ H % ^ % k? & 

Template Output 



j Compiler Output 



<< I Generate Cancel 



Compile started 

Build complete — errors, warnings 

Done 

Build succeeded 






<i 



>i 



CodeSmith Console 

KOH30/1HOTO npM/10>KeHMe CodeSmithConsole.exe e yfl06HO 3a aBTOMaTM3au,Mfl 

- npuMepHO BK^K)4BaHe Ha reHepupaHeTO Ha koa KaTO nacr ot build npoueca. 
Mo>Ke fla My noflafleM ntT ,qo Lua6/iOH, rrbT ,qo XML cpaw/i etc CBOMCTBa v\ fla 
yKa>KeM Ktfle fla ce 3anniue pe3y/iTaTbT. Eto KaK M3r/ie>Kfla eflMH npuMepeH 
XML cpai/i/i etc CBOMCTBa: 



FileSearchTemplateParams . xml 



<?xml version="l . 0" encoding="us-ascii"?> 
<codeSmith> 

<propertySet> 

<property name="Filter">* . doc</property> 

</propertySet> 
</codeSmith> 



M3BMKBaHeTO Ha npn^OKeHneTO MO>xe fla crane etc c/ieflHaTa KOMaHfla: 



C : \Program Files\CodeSmith\v2 . 6>CodeSmithConsole 
/template : Samples\FileSearchTemplate . est 
/properties : FileSearchTemplateParams . xml 
/out: result.txt 



flpyra Ba>KHa xapaKTepucTMKa Ha koh30/ihoto npw.no>KeHkie e B"b3MO>KHOCTTa 
3a BMtKBaHe Ha pe3y/iTaTa ot reHepaunaTa b yKa3aH pernoH Ha M3xoflHMfl 
Cpai/i/1. Hy>KHO e caMO fla fl06aBMM apryMeHTa /merge : regionName m fla ocury- 
PMM, ne B M3XOflHMfl Cpafi/1 npMCbCTBa ceKU,klflTa OT BMfla ttregion regionName 
ttendregion. I~l0 T03M HaHklH CTaBa B"b3MO>KHO C"b>KMTe/lCTBaHeTO b paMKMTe Ha 

eflMH cpaki/i Ha aBTOMaTMUHO reHepupaH koa m TaicbB nucaH Ha ptKa. 



924 nporpaMnpaHe 3a .NET Framework (tom 2) 

fl3no/i3BaHa /mTepaTypa 

- Code Generation: The One Page Guide - http://www.codeqeneration.net 
/files/JavaOne OnePaqeGuide vl.pdf 

- Dave Thomas Interview on Code Generation - http://www. 
codegeneration.net/tiki-read_article.php?articleId=9 

- Code Generation with CodeSmith, Brian Boyce - http://msdn. 
microsoft.com/vstudio/default.aspx?pu II =/library/en-us/dnhcvs04/html/ 
vs04e5.asp 

- CodeSmith Tutorial - http://www.codesmithtools.com/features/tutorial. 
aspx 

NUnit 

NUnit e cpeAa 3a nucaHe v\ M3n"b/iHeHMe Ha unit TecroBe 3a .NET. Ta MMa ABa 
KOMnoHeHTa: 6n6^noTeKa, koato M3no/i3BaMe npn nucaHeTO Ha TecTOBeTe v\ 

MHCTpyMeHTM 3a M3n"b^HeHMeT0 MM. TaKMBa MHCTpyMeHTM, M3BeCTHM CbC 

ct6npaTe^H0T0 MMe xUnit, MMa npeHeceHM 3a pa3/iMHHM cpe^n v\ e3nun 3a 
nporpaMnpaHe. Bcmukm Te MMaT noflo6eH py\3av\u, MMHTupaiu to3m Ha 
n-bpBOo6pa3MTe: sUnit 3a Smalltalk v\ JUnit 3a Java. ntpBaTa Bepcua Ha NUnit 
e nonTM AnpeKTHO npeHeceHa ot Java BapnaHTa, AOKaTO BTopaTa M3no/i3Ba 
MAM0MaTM4HMTe 3a .NET aTpn6yTM npn MapKupaHeTO Ha TecTOBeTe. BtnpeKM 
ne cbmecTByBaT Apyrn 6m6/imot6km 3a nucaHe Ha unit TecTOBe 3a C# v\ .NET 
M3o6iuo, NUnit e HaM-pa3npocrpaHeHa. Ta ce e npeBtpHa/ia p,e cpaKTO b 
CTaHAapT m mhoto MHCTpyMeHTM npeA/iaraT MHTerpauMa c Hea. AApecbT Ha 
npoeKTa, ot KbAeTO MO>Ke p,a ce CBa/iM nocneAHaTa BepcMfl Ha 6M6/iMOTeKaTa 
(TeKymo 2.2) e http://www.nunit.org . 

KaKBO e aBTOMaTM3npaH unit TecT? 

Unit TecTtT e koa, komto ce tpm>km p,a nocTaBM o6eKTMTe, komto TecTBaMe, b 
onpeAe/ieHO cbcrosiHMe m p,a npoBepM p,anv\ HaujMTe onaKBaHMH cbBnaAaT c 
pea/iHOcrra. TecrbT MMa tpm ochobhm nacm: 

- noAroTOBKa - cb3AaBaHe m MHMUMa^M3MpaHe Ha TecTBaHMTe o6eKTM. 

- fleMCTBMe - M3BMKBaHe Ha MeTOAMTe, 4MeT0 AeMCTBMe TecTBaMe. 

- npoBepKa - noTB"bp>KAeHMe, ne o6eKTMTe ca b npaBM/iHOTO cbcroyiHMe. 

Unit TecTOBeTe ce nMiuaT ot nporpaMMCTMTe KaTO HeAe/iMMa nacr ot npoueca 
no pa3pa6oTKaTa Ha KOAa. no cbmecTBO, Te ca TecTOBe ot TMn "6si/ia KyTMfl", 
3aiuoTO M3no/i3BaT 3HaHMeT0 3a KOHKpeTHaTa MMn^eMeHTauMfl. TaKa ce noc- 
TMra MaKCMMa^Ha ecpeKTMBHOCT npM npoBepKMTe. 

riMcaHeTO Ha unit TecTOBe pjaea hako/iko cbiuecTBeHM npeAMMcma npM pa3pa- 
6oTKaTa. TecTOBeTe AasaT zieceH HanMH p,a ce ynpa>KHM ro/iflMa nacr ot KOAa 
Ha npM/io>KeHMeTO 3a KpaTKO BpeMe. TaKa, c/ieA BC^Ka npoMHHa Moxe 6"bp30 
Aa ce ycTaHOBM p,anv\ tom pa6oTM KaKTO onaKBaMe. flopM e/ieMeHTapHM m 
MMHMMa^HM TecTOBe necro pa3KpMBaT npo6/ieMM, komto He 6MXMe npeAno/io- 



HnaBa 28. riOMommi MHCTpyMeHTM 3a .NET pa3pa6oTHHun 925 

>km/im, ne CbmecTByBaT flo noc^eflHMfl MOMeHT npeflu n/iaHkipaHOTO ny6/iw- 
KyBaHe Ha npoflyKTa. Unit TecTOBeTe cnywaT KaTO flOKyMeHTauna, KoraTO 
no/i3BaMe v\ MOAncpnunpaMe ny>KA koa, AeMOHCTpupawKM onaKBaHi/m Hani/m Ha 
yncrrpe6aTa Ha K/iacoBeTe v\ MeTOAHTe. KaTO btopm K/iweHT Ha KOAa, TecTOBeTe 
nrpa^T po/i^Ta v\ Ha AH3ai/iH MHcrpyMeHT, KapaMKM hm p,a orpaHkmaBaMe 3aBM- 

CMMOCTMTe Me>KAy KOMnOHeHTMTe M AS OCpOpMflMe nO-T04HM a6CTpaKUMM. 

niicaHe Ha TecTOBe c Nunit 

J\a pa3r/ieAaMe b Rejawnw npoueca Ha nucaHe Ha unit TecTOBe. Tom BK/iiouBa 

HflKOM OCHOBHM CTbnKM: Cb3AaBaHe Ha TeCTOBM K/iaCOBe M TeCTOBM MeTOAM, 

MHMuna^M3auMfl m nonwcTBaHe Ha TecroBkifl npou.ec, M3BtpujBaHe Ha cepi/m 
npoBepKM m AP- 

CTpyKTypMpaHe Ha KOAa 

npenop"b4MTe^HO e 3a BceKM K/iac ot wMn/ieMeHTaui/isiTa p,a MMaMe noHe eAMH 
OTAe^eH K/iac, komto p,a cbAtpwa TecTOBeTe. Mo>KeM p,a A"bp>KMM K/iacoBeTe b 
ojp,enua AnpeKTopua v\nv\ b OTAe/ieH npoeKT, TaKa ne p,a vv\ pa3Ae/ikiM ziecHO, 
KoraTO ny6^MKyBaMe release Bepcua Ha npki/io>KeHMeTO hm. HaM-AnpeKTHnaT 
Ha^MH Aa OTAe^MM TecTOBeTe e Aa rn c/iokmm b TexeH co6cTBeH npoeKT. Ot 
Apyra CTpaHa cbxpaHABaHeTO b cbiuna npoeKT, MMa npeAHMCTBOTO, ne MO>KeM 
Aa M3no^3BaMe v\ TecTBaMe internal K/iacoBe v\ MeTOAH, komto He MCKaMe Aa 
ca ny6^M4HO AOCTtnHM. 

npoBepKM 

npoBepflBaHeTO 3a cbcroflHi/ieTO Ha o6eKTMTe ce M3B"bpujBa npe3 craTMUHMTe 
MeTOAM Ha K/iaca Assert. Hpe3 tax ce M3BtpiuaT craHAapTHki npoBepKM 3a 

MCTMHHOCT, paBeHCTBO, MAeHTM4HOCT M AP- 



Assert. AreEqual (2, 1 + 1 ) ; 

Assert .AreEqual ( "hello", "hello world" . Substring ( 0, 5) 
"Substring failed!"); 

Assert . IsTrue (2 > 1 ) ; 

Assert . IsNotNull (users [ "Jason" ] , "User not found."); 



BceKM MeTOA MO>Ke Aa no/iynw KaTO Aont/iHi/iTe/ieH napaMeTbp hm3 etc 
c"bo6iueHne, KoeTO ce noKa3Ba, aKO npoBepKaTa nponaAHe. ToBa e oco6eHO 
no/ie3HO npn eAHOTunHM npoBepKM, KbAeTO He e oneBMAHO koa touho e npo- 
uap,uana. 

TeCTOBM K/iacoBe m mctoam 

NUnit M3MCKBa Aa MapKupaMe K/iacoBeTe c TecTOBe c aTpn6yTa TestFixture. 
Cnep, KaTO 6"bAe otkpmt TecTOBna K/iac b aceM6/ii/iTO, ce M3AnpBaT MeTOAHTe 
My MapKupaHM c aTpn6yTa Test v\ je noA/ie>KaT Ha ki3n"b/iHeHkie. J\a pa3r/ie- 
AaMe eAMH MMHWMa/ieH TecTOB K/iac: 



926 flporpaMnpaHe 3a .NET Framework (tom 2) 



using System; 

using NUnit . Framework; 

namespace OrderSample . Tests 

{ 

[TestFixture] 
public class OrderTest 

{ 

public OrderTest ( ) 

{ 

} 

[Test] 
public void EmptyOrder ( ) 

{ 

Order empty = new Order ( ) ; 
Assert . AreEqual ( 0, empty. Total ) ; 
} 
} 
} 



klHHL4Ma/1M3aL4Mfl M nOHMCTBaHe 

TecTOBMTe K/iacoBe b NUnit /iori/mecKi/i npeflcraB/isiBaT nocraHOBKM. C/iefl KaTO 
ce noflroTBM flafleHO cbcroyiHkie Ha rpyna o6eKTM MoraT fla 6"bflaT M3n"b/iHeHM 
fleMCTBMATa v\ npoBepKi/ue. Mo>KeM fla flecpMHupaMe kiHkmkia/iki3kipamaTa 
/lorrno b MeTOfl, MapKupaH c aTpn6yTa setup, KaKTO v\ noni/iCTBamaTa b flpyr 
TaKtB, MapKupaH c TearDown. M3n"b/iHflBaMKM TecTOBMTe MeTOflM, NUnit ce 
rpn>KM fla M3BMKa ntpBO m-muna/in3kipamkifl MeTOfl npeflu BceKM TecT. CbLflOTO 
ce npaBM v\ 3a no^MCTBaiunflT MeTOfl cnep, KaTO TecTa 3aB"bpujn. no to3m HanwH 
MO>KeM fla OTfle/ikiM o6iunfl 3a nocTaHOBKaTa koa m fla M36erHeM fly6/im<aui/mTa 
b TecroBeTe. KaTO pa3BMTne Ha ropHna npuMep MO>KeM fla onuiueM MeTOfl, 
komto fla cb3flaBa noptnio m fla a 3anncBa npeflu TecTa. KaTO nonwcTBama 
/iori/iKa BMtKBaMe M3TpnBaHeTO Ha TecroBaTa noptnio. 



using System; 

using NUnit . Framework; 

namespace OrderSample . Tests 

{ 

[TestFixture] 
public class OrderTest 

{ 

private Order currentOrder; 

public OrderTest ( ) 

{ 

} 



HnaBa 28. riOMomHM MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 



927 



} 



Setup] 
public void Setup ( ) 

currentOrder = new Order ( ) 
currentOrder . Save ( ) ; 



TearDown] 
public void TearDown ( ) 

currentOrder . Delete i 



Test] 
public void EmptyOrder ( ) 



Assert .AreEqual (0, currentOrder . Total ) ; 



Test] 
public void Oneltemj) 

Orderltem item = new Orderltem ( "Bread" , 

currentOrder . Items .Add (item) ; 

Assert .AreEqual (1.5, currentOrder .Total ) 



1.5) 



NUnit me Cb3flafle v\ 3ana3ki flBe OTfle/iHki i/iHcrai-mm/i Ha Order 3a ABaTa Tecra. 
AHa/iorwuHO, Te me 6"bflaT m3tpmtm c/iefl M3n"b/iHeHkieTO Ha TecTa. ToBa 
cb3AaBaHe Ha nocTaHOBKaTa BceKM nvr ocurypaBa He3aBMCMMOCTTa Ha BceKM 
TecT ot ocTaHa^MTe. 

NUnit npefl/iara bbsmokhoct fla flecpi/mwpaMe rjio6ajiHO MHi/mi/ia/iM3kipaHe v\ 
no^MCTBaHe 3a ua/iaTa nocTaHOBKa. ToBa MO>KeM fla HanpaBMM, aKO MapKM- 

paMe MeTOflM C TestFixtureSetUp M TestFixtureTearDown aTpn6yTMTe. Te3M 

MeTOflM me 6"bflaT M3n"b/iHeHM caMO BeflH"b>K 3a flafleH K/iac v\ ca yflo6HM 3a 
pa6oTa c pecypcn, komto ce M3no/i3BaT ot bcm^km TecTOBM MeTOflM. 

npoBepKM 3a M3K/iK>neHMn 

HecTO npn TecTBaHe Ha o6pa6oTKaTa Ha rpeujKM ce Ha/iara fla npoBepuM p,anw 
flafleH MeTOfl xBtp/ifl M3K/iK>neHi/ie npn noflafleHM HeBa/iwflHki flaHHM. B noBe- 
neTO 6n6^MOTeKM TOBa ce npaBM c npuxBaiuaHe Ha M3K/iK>neHi/ieTO, KaTO b 
Kpaa Ha try 6/io Ka npoBa/iflMe Tecra c Assert. Fail o M3BMKBaHe: 



928 



flporpaMnpaHe 3a .NET Framework (tom 2) 



try 

{ 

currentOrder . Customer = null; 

Assert . Fail ( "Null customer should not be allowed"; 

} 

catch (ArgumentNullException) 

{ 



} 



NUnit hm y/iecHABa b to3m Tun TecTOBe c aTpn6yTa 3a onaKBaHO w3K/iK)neHi/ie 
- ExpectedException. Tom npweMa KaTO napaMeTpw Tun Ha ki3K/iioneHkieTO i/i 
eBeHTya/ieH hm3 etc cbo6iueHneTO 3a rpewKa, KoeTO Tpa6Ba fla ce cbfltpwa b 

Message CBOMCTBOTO. 



[Test] 

[ExpectedException (typeof (ArgumentNullException) 
public void ExceptionCheck ( ) 
{ 



currentOrder . Customer 



null; 



l/l3rrbsiHeHMe Ha TecToeeTe 

TecTOBeTe ca o6mkhob6h .NET koa h ce KOMnw/iwpaT b i-mKoe aceM6/iw. NUnit 
npefl/iara flBa MHcrpyMeHTa 3a ki3n"b/iHeHkie, komto npe3 OTpaweHkie HaMnpaT 

BCM4KM TeCTOBM K/iaCOBe V\ VV\ M3n"b/lHflBaT. 



53NUmtSample.exe - NUnit 



File View Project Tools Help 
Tests | Categories | 



B-# D:\tmp\NUmtSamplelbin\DebuglNUnitSi 
B-^ OrderSample 
S-0 Tests 

B-^ AssertionTest 



Run 



Stop 



OrderTest 



Errors and Failures | Tests Not Run j Console.Error | Console.Out ) 




Ready 



Test Cases : 2 



HaM-/ieceH 3a yncrrpe6a e i/mcrpyMeHTbT c rpacpwueH MHTepcpewc (b>k. 
cpurypaTa no-rope). Tom noflfltpwa npoeKTM ot TecTOBe, c komto MO>xeM fla 
yKa>KeM hako/iko aceM6/iMTa c TecTOBe. TecTOBeTe ce noKa3BaT b fltpBOBMflHa 
CTpyKTypa, 6a3npaHa Ha npocrpaHCTBaTa ot MMeHa, b komto Te ce HaMnpaT. 
Mo>KeM fla M3n"b/iHHBaMe TecTOBeTe KaTO vv\ M36epeM v\ mpaKHeM Btpxy 6yTOHa 



HnaBa 28. riOMomHM MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 



929 



"Run". Pe3y^TarbT ce Bi/i3ya/iki3kipa BeflHara cnefl M3n"b/iHeHkieTO. B cnynaa 
zieHTaTa 3a nporpeca e 3e/ieHa. Ta CTaBa nepBeHa KoraTO hakom TecT 
nponaAHe. 

rpacpM4HM5iT MHTepcpewc e yflo6eH, flOKaTO pa3pa6oTBaMe KOfla v\ TecTOBeTe, 
ho He e AOcrarbUHO rbBKaB 3a aBTOMaTM3npaHe Ha ki3n"b/iHeHkieTO. 3a Ta3M 
ue/i b NUnit flncTpn6yun5iTa e BK/iK>neHO koh30/iho npn^OKeHne, KoeTO 
MO>KeM p,a M3no/i3BaMe KaTO My npeAaBaMe napaMeTpn Ha KOMaHAHna pefl: 



C : \W IND0WS\sy5tem 3 2\cm d . exe 



Directory of D:\tmp\NUnitSample\bin\Debug 



HBD 



07/24/2005 06:12 PM 

07/24/2005 06:12 PH 

07/24/2005 06:12 PM 

07/24/2005 06:12 PM 



2 File(s> 
2 Dir<s> 



<DIR> 
<DIR> 

16,384 NUnitSample.exe 
24,064 NUnitSanple.pdb 
40,448 bytes 
7,880,773,632 bytes free 



D:\tmp\NUnitSample\bin\Debug>nunit— console NUnitSample .exe 

NUnit version 2.2.0 

Copyright <C> 2002-2003 Janes U. Neukirk, Michael C. Two, fllexei A. Uorontsou, C 

harlie Poole. 

Copyright <C> 2000-2003 Philip Craig. 

All Rights Reserved. 



OS Uersion: Microsoft windows NT 5.1.2600.0 



.NET Uersion: 1.1.4322.2032 



Tests run: 3, Failures: 0, Not run: 0, Time: 0.046875 seconds 



D : St mpSNU n it S amp le \b in \Debug >_ 



nporpaMMCTMTe, komto ca CBkiKHa/ii/i fla He HanycKaT Microsoft Visual 
Studio.NET MoraT p.a M3no/i3BaT flo6aBKaTa TestDriven.NET ( http://www. 
testdriven.net ): 



Output | Object Browser | 5tart Page | Order, cs Tests\OrderTest.cs OrderItern.es 
mj OrderSannple. Tests. OrderTest 



g$ currentOrder 



using System; 

using NUnit . Framework:; 

namespace OrderSample . Tests 
{ 



[TestFixture] 
public class Order 


Tpsr. 




{ 

private Order 




Build 

Run Test(s) 




public OrderTe 


Test With... â–º 




Debugger 
In-Proc 
Output.., â–º 


{ 
} 




Cut 

Copi 

Paste 


[Setup] 







public VOid Sej Jffi, Wrh Rr^lmninh 



930 nporpaMnpaHe 3a .NET Framework (tom 2) 

Tfl n03B0/lflBa flMpeKTHO fla M3n"b/1HMM HflKOM TeCTOB MeTOfl, BCMUKM MeTOflM b 

K/iac, v\nv\ BCM4KM TecTOBe b npoeKT. Mhoto yflo6Ha e v\ B"b3MO>KHOCTTa fla 
M3n"b/iHMM TecT c fle6"brepa. 

XapaKTepMCTMKM Ha ao6pnTe TecTOBe 

flo6pnTe TecTOBe MoraT fla npeflOTBpaTAT mhoto flecpeKTM v\ fla hm flaflaT 
curypHOCT, c koato fla npoMeH^Me v\ pa3BMBaMe MMn/ieMeHTau.M*iTa c no- 
ro/iflMa ckopoct. HeKanecmeHMTe TecTOBe MoraT fla noi<a3BaT cpa/iwMBM 
TpeBorn, fla ca TBtpfle 6aBHM v\nv\ HecurypHM - TaKa MoraT fla 3a6aB*n~ 
npoeKTa. MMa hhko/iko KpnTepua, komto MoraT fla hm noMorinaT fla nocTurHeM 
no/io>KMTe/ii-iMTe ecpeKTM v\ fla M36erHeM OTpwuaTe/iHWTe. flo6pnflT TecT e: 

- ABTOMaTMneH - Moxe fla ce M3n"b/iHM c eflHa KOMaHfla v\ BeflHara fla 
pa36epeM p,anv\ e ycneweH v\nv\ He. H^Ma Hy>Kfla ot pbuhm npoBepKM v\nv\ 
MHcneKUMM, 3a fla ce ycraHOBM Ha/iMUMeTO Ha npo6/ieM. 

- ri'b/ieH - noKpuBa bcmuko, KoeTO MO>Ke fla ce npoBa/iM. BcyiKa nacr ot 
1/iMn/ieMeHTaui/mTa, 3a kohto ce onacsiBaMe, ne MO>Ke fla ce npoBa/in, 
Tpa6Ba fla 6"bfle noKpnTa ot noHe eflMH TecT. 

- rioBTopneM - flBe ojp,ei\uv\ M3n"b/iHeHMH Tpa6Ba fla flaflaT eflHaKBM 
pe3y^TaTM. He Tpa6Ba fla MMa HeHy>KHM 3aBMCMMOCTM ot bbhluhm 

KOMnOHeHTM, KOMTO He KOHTpO/lkipaMe flMpeKTHO. 

- He3aBMCMM - eflkiH TecT He Tpa6Ba fla e 3aBMCMM ot fleMHOCTM, komto 
ce M3B"bpujBaT ot flpyr TecT. BceKM TecT ce rpuxn 3a MHi/mkia/ii/i3aui/iflTa 
m no^MCTBaHeTO cm, KaTO ocraBfl cpeflaTa b TaKOBa cbCTO^Hne, ne fla He 
npeuM Ha flpyrnTe v\nv\ Ha caMna ce6e cm. 3aBMCMMOCTM ot pefla Ha 
ki3n"b/iHeHkieTO Ha TecTOBeTe o6mkhob6ho 03HanaBaT npo6/ieM c 
MHMuna^M3auMflTa, komto Tpa6Ba fla e/iMMMHkipaMe. B HOBaTa Bepcua Ha 
NUnit MO>Ke fla MMa b"B3mo>khoct TecTOBeTe fla ce M3n"b/iH$iBaT b cnynaeH 
pefl, 3a fla ce M36erHaT TaKMBa 3aBMCMMOCTM. 

- ripo4>eciiOHa/ieH - TecTOBMAT koa He e "btopo KanecrBo". 06mkhob6ho 
m b Hero M3pacTBaT a6crpaKu.MM, komto hm ynecHABaT b npoBepKMTe v\nv\ 
HacTpoMKaTa Ha cpeflaTa. nocroaHHaTa rpMxa 3a flM3aMHa m nonMCTBa- 
HeTO Ha Te3M a6cTpaKUMM npe3 npaKTMKM KaTO npepa6oTKa Ha KOfla 
(refactoring) hm rapaHTMpa, ne me MO>KeM fla npoMeHHMe TecTOBeTe etc 
ctiuaTa ckopoct KaKTO m TecTBaHaTa MMn/ieMeHTau.M*i. 

KaKBO fla TecTBaMe KaTO nporpaMMCTw? 

HecTO ce c6/i"bCKBaMe c npo6/ieMa ko/iko BpeMe fla OTfle/iMM 3a TecTBaHe Ha 
flafleH K/iac. TecTBaHeTO Ha bcmukm bbsmokhm HanMHM fla ce cnyrm eflMH K/iac 
m flOKa3BaHeTO, ne koabt e Henpo6MBaeM, necro He e npaKTMUHO. TaKOBa 
nt/iHO ocMryp^BaHe CTaBa m3/imluho, aKO npMeMeM, ne unit TecTOBeTe ca 

npOCTO BTOpM K/lMeHT Ha KOfla. Te M3nO/13BaT KOMnOHeHTMTe nO CbLflMfl Ha^MH 

KaKTO m flpyrMTe nacm ot KOfla hm. ToBa orpaHMnaBa 3a,qanaTa hm ao 
TecTBaHeTO caMO Ha fleMCTBMTe/iHMTe cueHapMM 3a ynoTpe6a. He e Hy>KHO fla 
AOKa3BaMe, ne koabt pa6oTM bbb bcmukm B"b3MO>KHM c/iynaM, a caMO b Te3M, b 



HnaBa 28. riOMommi MHCTpyMeHTM 3a .NET pa3pa6oTHkiun 931 

komto ro M3no^3BaMe. rincaHeTO Ha flo6pnyi TecT 3anonBa c M3MCKBaHMflTa, 
komto HMaMe. Ako Tpa6Ba fla HanniueM K/iac, komto o6pa6oTBa pefl ot log 
cpaM/i c MHCpopMaunfl 6nxMe 3anonHa/iM c Tecr, komto noKpuBa ochobhmh 
ycneiueH cueHapnw: 



[Test] 




public void ParseLine ( ) 

{ 

LogLine line = new LogLine ( "INFO : Process 




Started") ; 


Assert . AreEqual (LineType .Info, line . Type) , 




Assert .Is False (line. IsError) ; 
} 





C^eflBaiuoTO M3MCKBaHe e fla pa36epeM, j\anv\ cpaw^tT cbfltpwa HeBa/iMflHM 
peflOBe. TecTbT 3a npoBepKa p,anv\ o6pa6oTBaMe flo6pe HeBa/iMflHMTe npecpMK- 
cm 3a Tun Ha log cbo6meHne 6m M3r/ie>Kfla/i TaKa: 



[Test] 

[ExpectedException ( typeof ( IllegalLogFileException) , "Illegal 
message type prefix.")] 
public void IllegalLine ( ) 

{ 

LogLine line = new LogLine ( "ASDFGH : Process Started"); 

} 



Haki-Ba>KHOTO e fla noKpneM M3MCKBaHHflTa kbm KOfla KaTO cpyHKUMOHa/iHOCT. 
OnuTBaMe ce c TecroBeTe fla fleMOHCTpupaMe, ne koabt npaBM TOBa, KoeTO 
Tpa6Ba. He ce crpeMMM cpopMa/iHO fla flOKa3BaMe, ne He npaBMM TOBa, KoeTO 
He Tpa6Ba. KoraTO B"b3HMKHe hobo M3MCKBaHe kbm KOfla v\ hob HanMH Ha 
ynoTpe6aTa My, Tpa6Ba fla flo6aBMM hob TecT. EcrecrBeHO, KOHueHTpaunaTa 
Ha no/io>KMTe^HaTa nacr ot noBefleHneTO Ha KOfla He Tpa6Ba fla ce Bt3npneMa 
KaTO "po30BM onM/ia npefl ouMTe hm". Tpa6Ba fla npoBepaBaMe c TecTOBe v\ 
Hafle>KflHaTa o6pa6oTKa 3a rpeujKM v\ CMrypHOora, KoraTO Te ca nacr ot 
M3MCKBaHMflTa KtM npM/io>KeHMeTO HM. 

KaKBO fla HanpaBMM, KoraTO OTKpneM flecpeKT b nporpaMaTa? flecpeKTMTe ca 
Hepa36paHM M3MCKBaHMfl v\nv\ HeflocraTbUHO flo6pa MMn/ieMeHTauMfl. M b flBaTa 
cnynafl HaM-flo6pnflT noflxofl 6m 6m/i fla flo6aBMM TecT, komto 6m nponaflHa/i b 
flafleHMfl cnynai/i Ha HenpaBM/iHO noBefleHMe. TaKa, He caMO npoMeHAMe KOfla 
m nonpaBAMe rpeujKaTa, ho m rapaHTMpaMe, ne to3m TMn flecpeKT HMKora HHMa 
fla ce noflBM othobo. C pa3pacTBaHeTO Ha npoeKTa, to3m bma noflCMrypaBaHe 
CTaBa Bee no-Ba>KHO. flo6poTO noKpMTMe Ha MMn/ieMeHTauMATa c KanecrBeHM 
aBTOMaTM3MpaHM TecTOBe hm cnacflBa ot nonaflaHe b nena/iHO M3BecTHaTa 
CMTyauMfl, KtfleTO e/iMMMHMpaHeTO Ha eflMH 6"br boam ao cb3flaBaHeTO Ha flBa 
hobm m/im "cb6y>Kfla" hakom npeflMiueH. 

Y/iecHfiBaHe Ha TecreaHeTO 

KaK fla ct3flafleM MHcraHUMH Ha K/iac a, KaTO th M3no/i3Ba K/iacoBe b m c, a Te 
ot CBOfl CTpaHa M3no^3BaT flpyrM? KaK fla M3BMKaMe MeTOfl, komto ce CB"bp3Ba 



932 nporpaMnpaHe 3a .NET Framework (tom 2) 

c 6a3a flaHHM v\ pa3HMTa Ha npeABapwTe/iHO BtBefleHM flaHHM b hako/iko 
Ta6/ikiun? He BMHarn MMa ziecHu v\ eAH03HanHki OTroBopn. ripeKa/ieHO ro/ie- 
MMTe 3aBMCMMOCTM Ha eAHH KOMnoHeHT ot Apyrn ca 6e/ier 3a /iolu o6eKTHO- 
opueHTupaH AH3ai/iH. Ako TOBa ce c/iynw b KOHTpo/iwpaH ot Hac koa, MOxeM p,a 
ro npoMeHMM, ioto c y/iecHABaHeTO Ha TecTBaHeTO noAo6p*iBaMe v\ AH3afiHa. 
Ochobhmat npuHunn e, ne aKO o6eKTMTe ca tpyahm 3a cb3AaBaHe nooTAe/iHO 
m cbOTBeTHO tpyahm 3a TecTBaHe, to AH3aMH"bT Ha KOAa MMa Hy>KAa ot 
noAo6peHne. KoraTO koa^t e b hakoa 6n6/ikiOTeKa, koato He KOHTpo/iwpaMe, 
eAMHCTBeHMAT m3xoa e Aa yKaxeM ctpmktho rpaHnunTe npn pa6oTaTa c to3m 
koa m Aa AecpMHupaMe MHTepcpeMCn 3a ynoTpe6a, hhhto MMn/ieMeHTaui/m 
MO>KeM Aa noAMeHAMe npn TecroBeTe. 

KaK 6nxMe Hanwca/iki K/iac, nueTO noBeAeHne ce KOHTpo/iwpa ot KOHCpurypa- 
UMOHeH cpai/i/i? HeKa pa3r/ieAaMe cnwcbK c npoAyKTM v\ Hankma 3a CMATaHeTO 
Ha o6iuaTa mm ueHa. CnwcbKbT ce cbxpaHABa b XML cpaki/i, KaTO aTpn6yTMTe 
Ha 3aKyneHMTe npoAyKTM ca ueHa, OTCTbnKa npn npoMOui/m v\ KO/iwuecTBO. 
Eamh n"bpBOHana/ieH noAxoA kbm i/iMn/ieMeHTaukisiTa 6m 6m/i Aa nponeTeM 
MHCpopMaunflTa ot cpaw/ia v\ p,a CMeTHeM o6iuaTa ueHa b eAHH uwKb/i. ToBa, 
o6ane 6m 3aTpyAHi/i/io TecTBaHeTO Ha o6eKTMTe, Tbv\ KaTO me M3MCKBa ot Hac 
Aa noAroTBMM KOHCpurypaunoHHMfl cpaw/i npeAH TecTOBeTe v\ Aa nonkicrwM 
npoMeHMTe. TBtpAe necmflT Aocrbn ao cpaw/iOBaTa cwcreMa Moxe Aa 3a6aBM 
TecTOBeTe v\ p,a HaMa/iw >Ke/iaHneTO hm Aa rn nycKaMe. 3aTOBa MOxeM Aa 

CKpneM neTeHeTO Ha npOAyKTMTe 3aA MHTepcpeMCa IOrderltemReader, KOeTO 

hm no3BO^ABa Aa TecTBaMe /iorm<aTa 3a OTCTbnKMTe v\ cyMMTe OTAe/iHO b 

Orderltem M Order K/iacOBeTe. 3a yA06CTBO 1/IMn/ieMeHTkipaMe 
IOrderltemReader B caMMfl TeCTOB K/iac. flecpMHkipaMe Read() MeTOAa, KOMTO 

Bptiua npeABapnTe^HO noAroTBeHM orderltem o6eKTM. B Haujua c/iynaw TOBa 
e eAMH npoAyKT c OTCTbnKa ot 20%. TecrbT npoBepaBa Aa/in KpaMHaTa ueHa e 
M3nwc/ieHa npaBM/iHO c OTCTbnKaTa: 



[TestFixture] 
public class DiscountedOrderTest : IOrderltemReader 

{ 

public DiscountedOrderTest ( ) 

{ 
} 

[Test] 
public void OneDiscountedltem ( ) 

{ 

Order testOrder = new Order (this ) ; 
Assert .AreEqual (4.0, testOrder . Total ) ; 

} 

#region IOrderltemReader Members 

public OrderItem[] Read ( ) 

{ 

Orderltem item = new Orderltem ( "cheese" , 5.0); 
item. Discount = 0.20; 



HnaBa 28. riOMomHM MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 933 



return new OrderItem[ ] { item} ; 
} 

#endregion 
} 



C Ta3M TexHMKa MO>KeM fla pa3,qe/ikiM OTroBopHOCTMTe Me>Kfly hako/iko o6eKTa 
m fla ri/i TecTBaMe nooT,qe/iHO. TecTBaHeTO Ha MCTMHCKaTa i/iMn/ieMeHTauwyi Ha 

IOrderltemReader CbLflO He ce Hy>Kflae OT MCTMHCKM flOCTbn flO Cpaki/lOBe. TaM 

MO>KeM fla ce flOBepuM Ha 6a30BMTe K/iacoBe ot .NET cpeflaTa v\ fla ct3flafleM 
TecTOB stream o6eKT b naMeTTa v\nv\ fla 3apeflMM xmiDocument o6eKT ot hm3 

npe3 LoadXml MeTOfla. 

Mock o6eKTM (Mock objects) 

HaMa/iyiBaHeTO Ha 3aBMCMMOCTMTe Me>Kfly o6eKTMTe v\ pa3,qe/iyiHeTO Ha cnro- 
BopHOCTMTe c MHTepcpeMCM y/iecHABa 3HankiTe/iHO TecTBaHeTO Ha noBefleHneTO 
mm. rioHAKora HAKOM o6eKTM He ce KOHTpo/ikipaT flupeKTHO ot Hac v\nv\ ce 
MHMuna^M3MpaT TpyflHO. TpyflHaTa nHMu.ua/iM3au.Mfl MO>xe fla 3aBncn ot Bp"b3- 
km KtM 6a3a flaHHM m/im fla pa34MTa Ha noKa3BaHe Ha HflKaKBa cpopMa Ha 
rpacpMneH noTpe6MTe/iCKM MHTepcpewc. B"b3MO>KHO e TOBa fla ca KOMnoHeHTM, 
komto ce MMn^eMeHTupaT ot flpyr nporpaMMCT v\ oiue He ca 3aB"bpweHM. 
TecTBaHeTO Ha o6eKTM, komto pa6oTAT c TaKMBa KOMnoHeHTM MO>Ke fla ce 
ocbiuecTBM npe3 cb3flaBaHeTO Ha cpa/iwMBM MMn/ieMeHTau.MM Ha MHTepcpeM- 
cuTe. Te MoraT fla BptiuaT npeflec|DMHMpaHM ctomhoctm m/im fla cneflHT ko/iko 
ntTM m c KaKBM napaMeTpM e M3BMKaH flafleH MeTOfl. Pbuhoto cb3flaBaHe Ha 
TaKMBa MMn^eMeHTauuM Mowe fla CTaHe flocaflHO v\ TpyfloeMKO. Ot TyK 

B"b3HMKBa M Heo6xOflMMOCTTa OT 6n6/lMOTeKM, KOMTO fla HM V/ieCHflBaT B TOBa. 

MMa flBa nony^apHM noflxofla 3a cb3flaBaHeTO Ha mock o6eKTn: reHepauna Ha 
KOfl, komto KOMnn^npaMe c TecTOBeTe v\nv\ flMHaMMUHO cb3flaBaHe no BpeMe Ha 
M3nt^HeHne c noMOurra Ha K/iacoBeTe ot npocTpaHCTBOTO ot MMeHa 
Reflection. Emit. BTopuflT noflxofl e 3a npeflnouMTaHe, 3aiuoTO npaBM Tecro- 
BeTe no-^ecHM 3a noflflp"b>KKa. 

Pa6oTa c NMock 

NMock e no4TM flupeKTeH npeHOC 3a .NET Ha Java 6n6/ikiOTeKaTa 3a mock 
o6eKTM jMock. Tn hm flaBa b"B3mo>khoct fla cb3fla,qeM MMn/ieMeHTau.M*i Ha 
MHTepcpewc v\nv\ fla npeflecpMHupaMe BMpTya/ieH MeTOfl Ha hhkom K/iac no 
BpeMe Ha i/i3n"b/iHeHwe. flont^HMTe^HO MO>KeM fla cpMKCupaMe BptiuaHaTa ot 
MeTOfla ctomhoct v\nv\ fla onuiueM npaBM/iaTa 3a B"b3MO>KHi/iTe apryMeHTM, 
komto fla no/iynaBa. 

Haki-4ecTO o6eKTMTe M3no/i3BaT flpyrn o6eKTM, 3a fla no/iynaT ot tax HHKaKBa 
MHCpopMaunfl. MoxeM fla TecTBaMe MMn/ieMeHTau.MHTa Ha hhkom cueHapnw, 
KaTO noflafleM o6eKT, komto BMHarn fla Bptiua M36paHa ot Hac ctomhoct - 
TaKaBa, kohto me npeflM3BMKa M3n"b/iHeHMeTO Ha cueHapna. To3m Tun TecTOBM 
o6eKTM ca M3BecTHM nofl MMeTO "cTb6" (stub). NMock hm no3BO/iHBa fla 



934 nporpaMnpaHe 3a .NET Framework (tom 2) 

cb3flaBaMe TaKMBa o6eKTM npe3 npeABapwTe/iHO KOHCpurypupaHe Ha Bptiua- 
HMTe ot MeTOflMTe ctomhoctm. HeKa pa3r/ieflaMe TecT 3a K/iac, komto ynpaB- 
nnBa npaBa 3a Aocrbn Ha noTpe6i/iTe/iki. B TecTa i/i3no/i3BaMe MMn/ieMeHTauwH 

Ha CTaHflapTHMfl System. Security. Principal. IPrincipal MHTepcpekic: 



[Test] 
public void AllowAdministrators ( ) 

{ 

DynamicMock principalMock = 

new DynamicMock (typeof ( IPrincipal ) ) ; 
principalMock . SetupResult ( "IsInRole" , true, typeof ( string) ) ; 

IPrincipal principal = ( IPrincipal ) principalMock .Mocklnstance; 
SecurityManager manager = new SecurityManager (principal ) ; 
Assert . IsTrue (manager . AllowResource ( "Administrator Area" ) ) ; 
} 



CBOMCTBaTa Ha kiMn/ieMeHTauwyiTa ce KOHTpo/iwpaT ot DynamicMock o6eKTa. 
C/ieA KaTO ro KOHCpurypupaMe, ot cbomctboto My Mocklnstance MO>KeM fla 
no/iyni/iM o6eKT, MMn/ieMeHTkipam >xe/iaHMfl MHTepcpewc. McKaMe p,a npoBepuM, 

ne 06eKT"bT OT TMn SecurityManager me flafle flOCTtn Ha aflMMHMCTpaTOpMTe 

flo pecypca "Administrator Area". 3a ue/iTa KOHCpurypupaMe cpa/iwkiBaTa 
MMn^eMeHTaunfl p,a Bptiua true 3a MeTOAa isinRoie. 

flpyr Ha^MH Ha ynoTpe6a Ha mock o6eKTMTe e KaTO cpeflCTBO fla cneAHM 
B3anMOAekicTBMfl. MoxeM p,a KOHCpurypupaMe mock o6eKTa p,a cnep,v\ ko/iko 
ntTM e 6m/i M3BMKaH hakom MeTOA h c KaKBM napaMeTpn. flecpkiHi/iui/mTa Ha 
o^aKBaHMTe M3BMKBaHMfl ce npaBM c Expect MeTOflMTe. ripaBki/iaTa 3a ao- 
nycTMMMTe napaMeTpn ce AecpMHupaT npe3 K/iacoBeTe, i/iMn/ieMeHTkipamki 

IConstraint: IsEqual (...) , IsNull(), Isln(...) M AP- fla pa3r/ieAaMe TeCT, B 

komto SecurityManager npoBepyiBa p,anv\ noTpe6wTe/iflT e b rpynaTa 
"Administrators" v\ cnep. TOBa i\as\v\ e b eAHa ot ABeTe rpynn "Backup 
operators" v\ "Developers": 



[Test] 
public void BackupPermissions ( ) 

{ 

DynamicMock principalMock = 

new DynamicMock (typeof ( IPrincipal ) ) ; 
principalMock . ExpectAndReturn ( "IsInRole" , true, 

"Administrators") ; 
principalMock . ExpectAndReturn ( "IsInRole" , true, 

new IsIn("Backup operators", "Developers")); 

IPrincipal principal = ( IPrincipal ) principalMock .Mocklnstance; 
SecurityManager manager = new SecurityManager (principal ) ; 
Assert . IsTrue (manager .AllowResource ( "Backup" ) ) ; 

principalMock .Verify ( ) ; 



HnaBa 28. riOMomHM MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 935 



} 



B Tecra M3BMKBaMe MeTOAa AiiowResource)...) , ioto npeAH TOBa AecpMHupaMe 
o^aKBaHMflTa tom p,a M3BMKa ABa ntTM isinRole Ha iPrincipal o6eKTa. 
ntpBMflT irbT orpaHM^aBaMe B"b3MO>KHMTe napaMeTpn ao HM3a "Administra- 
tors", a BTopuflT no3BO/iflBaMe KaTO apryMeHT "Backup operators" v\nv\ 
"Developers". M3BMKBaHeTO Ha verifyo MeTOAa cnrHa/iM3npa npi/iK/iionBaHe 
Ha M3BMKBaHeTO Ha MeTOAM Btpxy cpa^ujMBaTa 1/iMn/ieMeHTau.kifl. Ako ao to3m 
MOMeHT MeTOAtT isinRole (...) e M3BMKaH caMO BeAH"b>K, TecTbT me nponaAHe 
c noAo6HO C"bo6iueHne: 



TestCase ' OrderSample . Tests . PrincipalTest . BackupPermissions ' 
failed: NMock . Verif yException : MocklPrincipal . IsinRole ( ) not 
called enough times 
expected: 2 
but was:<l> 

at NMock .Assertion . AssertEquals (String message, Object 
expected, Object actual) 

at NMock. Method. Verify ( ) 

at NMock. Mock. Verify ( ) 

d: \tmp\nunitsample\tests\principaltest . cs ( 41, ) : at 
OrderSample . Tests . PrincipalTest . BackupPermissions ( ) 



Pa3UJnpeHMH Ha NUnit 

NUnit 6ki6/ikiOTeKaTa npeA-fiara 6a30BaTa cpyHKUMOHa/iHOCT 3a M3n"b.n HeHkie Ha 
nporpaMMCTKM TecTOBe. noHAKora ce Ha/iara p,a pa6oTMM etc cneuncpn^HM 
6n6/inoTeKM c no-cno>KeH npoTOKO/i 3a AOCTbn ao AaHHi/ue Ha TexHMTe 
o6eKTM. B TaKMBa cnynaw necTO eBO/iioi/ipaT Ha6op ot K/iacoBe, komto y/iec- 
HABaT nucaHeTO Ha TecTOBe. 3a hakom CTaHAapTHM cuTyaunn v\ 6w6/ii/iOTeKi/i 
TOBa Bene e HanpaBeHO v\ Moxe p,a hm cnecTM cepno3HM ycwnwn. 

NUnitAsp 3a ASP.NET npnsio>KeHMfl 

NUnitAsp e pa3UJnpeHne 3a NUnit, KoeTO cwMy/ii/ipa noTpe6kiTe/iCKMTe 
AewcTBUfl, M3B"bpujBaHM Ha eAHa ye6 crpaHkiua. Ew6/ikiOTeKaTa M3rpa>KAa 
a6cTpai<u.i/mTa 3a CTpaHnua, OTBopeHa c ye6 6pay3"bp v\ npeA/iara AOCTbn ao 
KOHTpo/ikiTe BtTpe. 3a noBeneTO CbpBtpHM kohtpo/ii/i Ha ASP.NET MMaMe Bene 
npeAecpMHupaHM noMOiuHM K/iacoBe, npe3 komto MO>xeM p,a KOHTpo/iwpaMe 
npn^OKeHneTO. K/iacoBeTe ki3no/i3BaT KOHBeHuna 3a MMeHyBaHe o6pa3yBaHa 

OT MMeTO Ha CbpBtpHMfl KOHTpo/1 M CyCpMKCa Tester: ButtonTester, 
TextBoxTester, LabelTester M AP- BCklUKkl NUnitAsp TeCTOBe Tpfl6Ba p,a 
Hac^eA^BaT K/iaca NUnit . Extensions . Asp . WebFormTestCase. 3apaAH Hac/ie- 

AflBaHeTO He MOxeM p,a MapKupaMe setup v\ TearDown MeTOAM c o6i/maMHMTe 
NUnit aTpn6yTM v\ 3a MHnu.ua/iM3au.Mfl v\ nonwcTBaHe Tpa6Ba p,a npeAecpMHM- 
paMe BkipTya^HMTe mbtoah setup o v\ TearDown o Ha 6a30BMfl K/iac. Ea30BkiflT 
K/iac cbiuo TaKa HacneAflBa webAssertion K/iaca v\ npeA.nara Aont/iHkiTe/iHi/i 



936 nporpaMnpaHe 3a .NET Framework (tom 2) 

MeTOflM 3a npOBepKa Ha CbCTOflHkieTO (KaTO AssertEqualsO M 

AssertvisibiiityO ), komto e npenoptni/iTe/iHO fla i/i3no/i3BaMe. 

KaK 6nxMe TecrBa/iw eflHa crpaHkiua, kohto 3anncBa MHCpopMauna 3a ncrrpe- 
6nTe^a? CTpaHnuaTa MO>Ke fla MMa no/ie 3a MMe v\ 6yTOH 3a 3annc, komto 
M3Be>Kfla TeKCT c pe3y/iTaTa ot onepaunaTa b eflMH ctpBtpeH Label kohtpo/i. 
flecpMHupaMe flBa TecTa: ntpBMAT (saveDetails) noKpuBa HopMa/iHi/m cueHa- 

PMM, a B"bB BTOpMfl (DontSavelnvalidNames) OnMTBaMe fla npeflOTBpaTMM 

B"bBe>KflaHeTO Ha HeBa/ikiflHki flaHHn: 



using System; 

using NUnit . Framework; 

using NUnit . Extensions .Asp; 

using NUnit . Extensions .Asp . AspTester; 

namespace PetStore . Tests 

{ 

[TestFixture] 
public class DetailsTest : WebFormTestCase 

{ 

private TextBoxTester nameBox; 

private ButtonTester saveButton; 

private LabelTester messageLabel; 

public DetailsTest ( ) 

{ 

} 

protected override void Setup ( ) 

{ 

Browser . GetPage 

( "http: //localhost/PetStore/UserDetails . aspx") 
nameBox = new TextBoxTester ( 

"nameBox", CurrentWebForm); 
saveButton = new ButtonTester ( 

"saveButton", CurrentWebForm) ; 
messageLabel = new LabelTester ( 

"messageLabel", CurrentWebForm) ; 
} 

[Test] 
public void SaveDetails ( ) 

{ 

nameBox. Text = "John Smith"; 
saveButton . Click ( ) ; 

AssertEquals ( "User details saved successfully.", 
messageLabel . Text ) ; 
} 



HnaBa 28. riOMomHM MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 937 



[Test] 
public void DontSavelnvalidNames ( ) 

{ 

nameBox.Text = ""; 
saveButton . Click ( ) ; 

AssertEquals ( "Please enter a valid name.", 
messageLabel . Text ) ; 
} 



} 
} 



B setup () MeTOAa i/iHMuna/ii/i3MpaMe crpaHwuaTa v\ noAroTBHMe Tester 
o6eKTMTe. 3a p,a OTKpneM KOHTpo/ia Ha cpopMaTa i/i3no/i3BaMe ctpBtpHOTO My 
cbomctbo ID, KoeTO e CTaHflapTeH MexaHM3"bM b ASP.NET nporpaMi/ipaineTO. 

NUnitForms 3a WinForms npnsio>KeHMfl 

NUnitForms e no-M/iafl npoeKT ot NUnitAsp i/i e b ro/i^Ma creneH BAtxHOBeH 
ot Hero. ApxnTeKTypaTa e noflo6Ha Ha Ta3M Ha NUnitAsp. Othobo MMaMe 
Ha6op ot Tester K/iacoBe 3a CTaHflapTHMTe kohtpo/im. HflMa Hy>Kfla fla Hacne- 
A^BaMe Apyrn K/iacoBe, tbm KaTO npn WinForms MMaMe no-ro/iflM kohtpo/i HaA 
npn^OKeHneTO. EAHHcmeHaTa oco6eHOCT e, ne TecroBeTe "HaMnpaT" kohtpo- 
j\v\je no Name cbomctboto mm m MMeTO Ha cpopMaTa. Ako MMaMe caMO eAHa 
cpopMa MO>KeM Aa M3nycHeM MMeTO - TaKa onpocryiBaMe KOAa. 3a Aa ocTaHe 
cpopMaTa caMO eAHa, MOxeM Aa n kiHkmna/iM3npaMe b setup o MeTOAa m Aa a 
3aTBapaMe b TearDown(). Eto m TecT 3a npw/io>i<eHMe, 3ana3Baiuo MHCpopMa- 
\\v\s\ 3a noTpe6kiTe/i*i, noAo6HO Ha npeAMiiJHMfl npuMep: 



using System; 

using NUnit . Framework; 

using NUnit . Extensions . Forms; 

using PetStore; 

namespace Petstore . Tests 

{ 

[TestFixture] 
public class DetailsTest 

{ 

private DetailsForm form; 

private LabelTester messageLabel; 

private TextBoxTester customerName; 

private ButtonTester saveButton; 

public DetailsTest ( ) 
{ 

} 

[Setup] 



938 flporpaMnpaHe 3a .NET Framework (tom 2) 



public void Setup ( ) 

{ 

form = new DetailsForm ( ) ; 
form. Show ( ) ; 

messageLabel = new LabelTester ( "messageLabel" ) 

customerName = new TextBoxTester ( "nameBox" ) ; 

saveButton = new ButtonTester ( "saveButton" ) ; 
} 

[TearDown] 
public void TearDown ( ) 

{ 

form. Close () ; 

} 

[Test] 
public void SaveUserlnf o ( ) 

{ 

customerName . Enter ( "John Smith" ) ; 
saveButton . Click ( ) ; 

Assert .AreEqual ( "Details saved successfully.", 
messageLabel . Text ) ; 
} 

[Test] 
public void DontAllowEmptyNames ( ) 

{ 

customerName . Enter ( string . Empty) ; 
saveButton . Click ( ) ; 

Assert .AreEqual ( "Please enter a valid name.", 
messageLabel . Text ) ; 
} 



M3no/i3BaHa /mTepaTypa 

- Andrew Hunt, David Thomas, Pragmatic Unit Testing In C# with NUnit 

- Kent Beck, Test Driven Development: By Example 

- Ronald E. Jeffries - Extreme Programming Adventures in C# 

- NUnit Documentation - http://nunit.org/documentation.html 

- NMock overview - http://www.nmock.org 

- Mock Objects Web site - http://www.mockobjects.com 



HnaBa 28. riOMommi MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 939 

- Martin Fowler, Mocks Aren't Stubs - http://www.martinfowler.com/ 
articles/mocksArentStubs.html 

- NUnitAsp Documentation - http://nunitasp.sourceforqe.net/ 
documentation.html 

- NUnitAsp API Reference - http://nunitasp.sourceforqe.net/api.html 

- NUnitForms Documentation - http://nunitforms.sourceforqe.net/docs. 
html 

- NUnitForms API Reference - http://nunitforms.sourceforqe.net/MSDN/ 
index.html 

Log4net 

Log4net e 6n6/iwoTeKa c OTBopeH koa 3a i/i3Be>KflaHe Ha /ior (log) cbo6meHkifl. 
T*i e Hac^eflHMK Ha ki3K/iK>nkiTe/iH0 ycneujHaTa pa3pa6oTKa 3a Java log4j. Ta3M 
nony^apHa, flOKa3aHa apxwTeicrypa MMa pea/iki3au.nn Ha noBene ot fleceT 
nporpaMHM e3MKa. Log4net (TeKymo Bepci/m 1.2) e 1/iMn/ieMeHTau.nflTa 3a .NET 
i/i MO>Ke fla 6-bfle HaMepeHa Ha a,qpec: http://loqqinq.apache.org/loq4net/ . 

3a TexHMKaTa "/iornHr" 

TeHepupaHeTO Ha /ior cbo6meHi/m b KOAa, M3BecTH0 KaTO ziorwHr (logging), 
npeflcraB/iflBa npocTa TexHMKa 3a i/i3c/ieflBaHe BtTpewHOTO noBefleHne Ha 
KOfla. Ta3M npaKTMKa ce no/i3Ba 3a pa3pa6oTKaTa Ha BCflKaKBM npki/io>KeHMfl, 
ho no/ie3HOCTra v\ npo/iwuaBa b Hai/i-ro/iflMa creneH npn mhotohmiukobm v\s\v\ 
pa3npefle^eHM cm ere mm. noHAKora ki3no/i3BaHeTO Ha /lorwHr MO>xe fla e 
eflMHCTBeHOTO Ha/iwuHO cpeflCTBO 3a M3c^eflBaHe Ha npo6/ieMki, npuMepHO, 
KoraTO c/iefl BHeflpaBaHe Ha npi/i/io>KeHkieTO HsiMaMe flocrbn ao fle6"brep. 

OnwrbT noKa3Ba, ne 3anncBaHeT0 Ha /ior c"bo6iueHMfl e Ba>KeH e/ieMeHT b 
pa3pa6oTKaTa. Eaho ot HeiuaTa, KoeTO ro OT/iwuaBa ot TexHMKaTa Ha fle6tr- 
BaHe, e TOBa, ne M3xofl"bT My MO>Ke fla 6"bfle cbxpaHflBaH v\ no-K"bCHO aHa/iM3M- 
paH. BeflHtx 3a/io>KeHO b KOfla, reHepupaHeTO Ha ziorkmr c"bo6iueHMfl ce 
M3B"bpujBa noBTopaeMO 6e3 noBewKa HaMeca. KaKTO no BpeMe Ha pa3pa6oTKa, 
TaKa m cnep, BHeflpaBaHe, ki3no/i3BaHeTO Ha /lori/mr MO>Ke fla hm cnecTM mhoto 
BpeMe b fluarHOCTMunpaHeTO Ha npo6/ieMki v\ cnpaBHHeTO c tax. 

npeAM3Bi4KaTejiCTBaTa npea log4net 

M3no^3BaHeTO Ha /lori/mr, ocBeH M36poeHMTe no/i3w, hocm m hakom pucKOBe: 

- YcBOflBaHeTO Ha flo6pnTe npaKTMKn 3a ziorwHr M3MCKBa M3BecTHM 
ycv\nv\s\. EflHa HeBHkiMaTe/iHa pea/iki3au.ki$i MO>Ke fla flOBefle ao HeonaK- 
BaHM CTpaHM4HM ecpeKTM. 

- /lor cbo6meHkiHTa MoraT fla HaMa/iaT 6"bp30fleMCTBneTO Ha npn/ioxe- 

HMeTO. 

- Ako ce reHepupa TBtpfle mhoto ziorwHr MHCpopMauna, nper/ie>KflamkiflT 
Moxe fla ce 3ary6n b Hea. 



940 nporpaMnpaHe 3a .NET Framework (tom 2) 

3a fla 6"bflaT M36erHaTM Te3M onacHOCTM, log4net e npoeKTupaHa fla 6"bfle 
ziecHO pa36npaeMa, Ha,qe>KflHa, 6"bp3a v\ KOHCpurypupyeMa. OcHOBHMTe xapaK- 
TepucTMKM Ha apxnTeKTypaTa v\ bkiwoubst: 

- /lor c"bo6iueHMflTa, komto ce reHepupaT b KOfla, bj\v\s\s\t Mm-mMa/mo 
Btpxy 6"bp30AeMCTBkieTO Ha npn^OKeHneTO. 

- MoxeM ce^eKTMBHO fla KOHTpo/iwpaMe kom /ior cbo6meHi/m fla 6"bflaT 

M3Be>KflaHM, B KaK"bB BMfl M K"bfle. 

- /lecHO MoxeM fla M3Be>KflaMe /ior c"bo6iueHMfl kbm MHO>KecTBO pa3/iwnHw 
uenw. cpai/i/i, 6a3a OTflaHHM, KOH30/ia v\ flpyrn. 

- Hpe3 ki3no/i3BaHeTO Ha KOHCpurypaunoHHM cpaw/iOBe motom flkmaMMUHO 
fla HacTpoMBaMe /iori/mr npouec no BpeMe Ha i/i3iTb/iHeHi/ie Ha npw/io>Ke- 

HMeTO. 

KoMnoHeHTii Ha log4net 

Log4net MMa Tpn ochobhm KOMnoHeHTu: ziorepw (loggers), aneHflepn 
(appenders) v\ ocpopM/ieHi/m (layouts). C TsixHa noMOiu pa3pa6oT4MUMTe 
MoraT fla ziorBaT c"bo6meHi/m b 3aBMCMMOCT ot Tkina v\ hmboto mm, KaKTO v\ fla 
KOHTpo/iwpaT b KaKtB cpopMaT m Ktfle fla 6"bflaT 3anncaHM. Te3M KOMnoHeHTM 
MoraT fla 6"bflaT flecpuHnpaHM flupeKTHO b KOfla, v\nv\ nop, cpopMaTa Ha XML 
cpaw/i. B fleMOHcrpaukiOHHi/m npuMep no-flo/iy me ki3no/i3BaMe rbBKaB noflxofl, 
pa34MTaiu Ha XML KOHCpurypauna. 

MepapxMn Ha jiorepwTe 

OT/iwui/iTe/iHa xapaKTepucTMKa Ha bci/iukm cepno3HM /lorkmr 6ki6/ii/iOTeKM e 
Bt3MO>KHOCTTa 3a i/i36wpaTe/iHO aKTMBupaHe Ha TOBa kom /ior M3pa3M fla 6"bflaT 
o6pa6oTeHM. 3a ue/ua log4net npefl/iara moluhm MexaHM3MM 3a KaTeropn3a- 
UMfl Ha c"b6nTMflTa, komto pa3pa6oTni/iukiTe fla M3no^3BaT cbmacHO Hy>KflMTe 
Ha npn^OKeHneTO. 

3a fla no3BO/in rbBKaBO KOHTpo/iwpaHe Ha pa3/iwnHkiTe acneKTM Ha ziorwHr 
npoueca, log4net B"bBe>Kfla KOHuenunaTa 3a ziorepi/i. ToBa ca o6eKTM, komto ce 
opraHM3npaT b wepapxna, ki3no/i3BawKki cxeMa Ha MMeHyBaHe, noflo6Ha Ha 
npocTpaHCTBaTa ot MMeHa b .NET. ripuMepHO ziorep c MMe "Foo.Bar" ce cnwTa 
3a poflkiTe/i Ha ziorep "Foo.Bar.Baz". Ha Btpxa Bi/mari/i ctom eflMH 6a30B 
(root) ziorep. noflo6HO Ha wepapxnnTe Ha K/iacoBe b OOn, /iorepi/iTe Hac/ie- 
flflBaT xapaKTepucTMKMTe Ha npefliuecTBeHMUMTe cm, KaTO MoraT fla flo6aB*iT 
hobm ki/ii/i fla npeflecpMHupaT hakom ot tax. 

HecTO M3no^3BaHa CTpaTerna 3a MOfle/ii/ipaHeTO Ha /iorepi/iTe b eflHO npw/io- 
>KeHne e flecpMHupaHeTO Ha ziorep 3a BceKM ot K/iacoBeTe v\ MMeHyBaHeTO My c 
irb/iHOTO MMe Ha K/iaca. no to3m Ha^MH CTaBa acho OTKtfle npon3/iki3a bcako 
c"b6nTne, a v\ npn cb3flaBaHe Ha wepapxn^Ta Ha ziorepw ce i/i3no/i3Ba HaroTOBO 
AM3aMHa Ha KOMnoHeHTMTe. 



HnaBa 28. riOMommi MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 941 

HMBa Ha jiorepwTe 

Ha BceKM ziorep MO>Ke fla My 6"bfle 3aflafleHO hmbo. Ako He My e yi<a3ai-io 
M3pn4HO, tom M3no/i3Ba hmboto Ha HaM-6^M3KMfl cm npeAwecrBeHMK. Log4net 
flecpMHMpa cneflHMTe HMBa Ha ziorMHr (Hapefl6aTa e no kpmtmuhoct): all < 

DEBUG < INFO < WARN < ERROR < FATAL < OFF. BCflKa 3aflBKa 3a J\OVV\HV Ce 

aKTMBMpa caMO, aKO hmboto m e no-ro/iHMO m/im paBHO Ha hmboto Ha HeMHMa 
ziorep. B npoTMBeH c/iynai/i th 6MBa MrHopMpaHa. 

Pa6oTa c /iorepn 

flocrbnvr flo MHCTaHUMfl Ha ziorep CTaBa npe3 craTMUHMfl MeTOfl iog4net. 

LogManager.GetLogger(...) , Bptiuaiu MHTepcpeMC OT TMn log4net . ILog. 

OyHKUMATa npMeMa KaTO eAMHCTBeH apryMeHT m/im hm3 (mmsto Ha ziorepa) m/im 
system. Type (KoeTO e noflxoA^iuo b c/iynaMTe, KoraTO MMeTO Ha ziorepa 
cbBnafla c TOBa Ha K/iaca): 



ILog log = LogManager . GetLogger ( "LoggingExample . User" ) 



MHTepcpeMCbT ILog npeAOCTaBfl cnep,Hv\je mstoam m CBOMCTBa (3a KpaTKOCT ca 

M36poeHM CaMO Te3M C DEBUG, KaTO Te3M 3a INFO, WARN, ERROR M FATAL Ca 

aHa/iorMUHM): 



// DEBUG properties and methods 
bool IsDebugEnabled { get; } 
void Debug(object message); 
void Debug(object message, Exception t); 
void DebugFormat ( string format, params object [] args); 
void DebugFormat ( IFormatProvider provider, string format, 
params object [] args); 



3aaBKMTe 3a /iotmht ce npaBsiT c M3BMKBaHe Ha MeTOAMTe Debug(...), info (...), 

Warn (...), Error (...) M Fatal(...) Btpxy MHCTaHUMfl Ha log4net . ILog: 



log . Info ( "Database connection established successfully. 



MMeHaTa Ha ropHMTe cpyHKUMM onpeAe/isiT hmboto Ha norwnr cb6MTMeTO, t. e. 
log. info ("...") e 3ayiBKa 3a j\ovv\hv c hmbo info. 

AneHAepu (Appender) 

Log4net no3BO/iflBa zieceH ziorMHr kbm MHO>KecTBO ue/iM npe3 KOHuenuM^Ta 3a 
aneHAepM, komto npeAcraB/iHBaT KOMnoHeHTM 3a noKa3BaHe m/im cbxpaHABaHe 
Ha cbo6iueHMfl. Kbm eAMH ziorep MoraT p,a 6"bAaT npMKaneHM eAMH v\nv\ noBene 
aneHAepM. Bcako cb6MTMe 3a AaAeH ziorep 6MBa npaiuaHO kbm BCMUKMTe My 
AecpMHMpaHM aneHAepM m kbm Te3M, acouMMpaHM c no-BMCOKO CToaiuMTe b 
MepapxMATa ziorepM. Log4net MABa etc c/ieAHMTe npeABapMTe/iHO AecpMHMpa- 
HM CTaHAapTHM aneHAepM: 



942 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Tun 


OnkicaHkie 


AdoNetAppender 


3anncBa /lorkmr Cb6nTMfl b 6a3a ot flaHHM, 
M3nO/13BaMKM nOflTOTBeHM SQL M3pa3M v\nv\ 

ctxpaHeHM npoueAypn. 


AnsiColorTerminalAppender 


3anncBa ouBeTeHM /lorkmr Cb6MTMfl b ANSI 
TepMi/ma/ieH npo3opeu. 


AspNetTraceAppender 


3anncBa ziorwHr Cb6nTMfl b ASP Tpacupaiu 
KOHTeKCT. Te MoraT fla 6"bflaT noKa3aHM KaTO 
nacr ot ASP CTpaHMUMTe v\nv\ b ASP Tpacn- 
paiua CTpaHnua. 


ColoredConsoleAppender 


3anncBa ouBeTeHM /lori/mr Cb6kiTi/m b 
Windows KOH30/iaTa Ha npw/io>KeHkiflTa. 


ConsoleAppender 


3anncBa /iorm-ir Cb6nTMfl b KOH30/iaTa Ha 
npi/i/io>KeHi/ieTO, b craHAapTHi/m m3xoa v\nv\ b 
CTaHflapTHMfl M3xofl 3a rpeujKM. 


EventLogAppender 


3anncBa /lorkmr Cb6nTM5i b Windows Event 
Log. 


FileAppender 


3anncBa zioruHr Cb6i/iTi/m bbb cpaw/i. 


Local SyslogAppender 


3anncBa /lorkmr Cb6nTMfl b /lOKa/iHMfl syslog 
cepBM3 (caMO 3a UNIX / Linux). 


Memo ryAppende r 


3ana3Ba /lori/mr Cb6kiTi/m b 6ycpep b 
naMerra. 


NetSendAppender 


3anncBa /ion/mr Cb6MTMfl b Windows 
Messenger cepBM3. Te3M cbo6meHi/m ce 
noKa3BaT b Ana/ioroB npo3opeu. 


OutputDebugStringAppender 


3anncBa /lorkmr Cb6nTMfl b Ae6"brepa. Ako 
npn^OKeHneTO H^Ma cbom fle6"brep, ho e 
aKTMBeH cucTeMHMflT Ae6"brep, tom noKa3Ba 
TeKCTa. 


Remo te Sy s 1 ogAppender 


3anncBa /lorkmr Cb6MTMfl kbm OTAa/ieneH 
syslog cepBM3 4pe3 UDP naKeTM. 


RemotingAppender 


3anncBa /lorwHr Cb6wTkifl kbm OTAa/ieneHa 
ue/i M3no^3BaMKM .NET remoting. 


RollingFileAppender 


3anncBa /iori/mr Cb6MTMfl bbb cpai/i/iOBaTa 
cucTeMa. Moxe p,a 6"bfle KOHCpurypupaH p,a 

M3n0^3Ba HflKO/IKO CpaM/ia B 3aBMCMMOCT OT 

orpaHM4eHMfl 3a flaTa v\ pa3Mep Ha cpaw/ia. 


SmtpAppender 


M3npaiua /iori/mr Cb6nTi/ifl kbm 3aAaAeH 
MMew/i aApec. 



HnaBa 28. riOMomHM MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 



943 



TelnetAppender 


K/ikieHTkiTe ce CB"bp3BaT c Telnet, 3a fla 
no/iynaT /iori/mr Cb6v\jv\n. 


TraceAppender 


3anncBa /iori/mr Cb6nTkifl b craHAapTHaTa 
TpacnpoB"b4Ha cucTeMa Ha .NET. 


UdpAppender 


M3npaiua /lorkmr Cb6nTMfl KaTO UDP naKeTM 
KtM OTfla/ieneHa TOUKa v\nv\ multicast rpyna, 

M3n0^3BaMKM UdpClient. 



Om/itpm 

B log4net MoraT fla 6"bflaT yi<a3ai-m cpw/iTpw 3a no-fleTaw/ieH kohtpo/i Ha TOBa 
kom c"bo6iueHMfl fla npeMi/maBaT npe3 pa3/ikmHHTe aneHflepn. Hecro no/i3BaHki 
ca cjju/iTpn ot Tun npar (npefle/iHO hmbo). ripn tax caMO cb6wTi/iflTa c hmbo, 
paBHO v\i\v\ no-ro/iflMO Ha yKa3aHaTa ctomhoct, me 6"bflaT ziorBaHn npe3 cbOT- 
BeTHMfl aneHflep. MoraT fla 6"bflaT flecpuHnpaHM v\ no-cno>KHki onepau.ni/i npe3 
nocneflOBaTe/iHOCTM ot cpw/iTpw. BrpafleHMTe b log4net cpw/iTpw ca: 



Tun 


OrmcaHkie 


DenyAllFilter 


MrHopupa bcmukm ziorwHr Cb6kiTi/m. 


LevelMatchFilter 


Tohho ctBnafleHne c hmboto Ha cb6i/iâ„¢eTO. 


LevelRangeFilter 


rionaflaHe Ha hmboto Ha c"b6nTneTO b onpe,qe/ieH 
flnana30H. 


LoggerMatchFilter 


CtBnaflaiuo Hana/io Ha MMeTO Ha ziorep. 


PropertyFilter 


CbBnafleHwe c noflHM3 Ha ctomhoct Ha cbomctbo. 


StringMatchFilter 


C"bfl"bp>KaHe Ha noflHM3 b TeKCTa Ha c"b6nTneTO. 



OcpopMsieHun (Layouts) 

KoraTO MCKaMe fla Hacrpoi/iM He caMO ue/iMTe Ha /iori/mr, a v\ M3xoflHi/m c|DopMaT 
Ha c"bo6iueHMflTa, Tpa6Ba fla acou.ni/ipaMe ocpopM/ieHwe kbm flafleH aneHflep. 
TaKa MO>KeM fla cpopMaTupaMe reHepupaHna TeKCT cnp^MO Hy>Kfli/iTe hm, npeflu 
tom fla 6"bfle 3anncaH. HanpuMep npe3 PatternLayout MOxeM fla yKaxeM 
M3xofleH cpopMaT no Hani/m noflo6eH Ha no3HaTaTa ot C cpyHKuna printf (...). 
KaTO M3no/i3BaMe KOM6nHau.i/i*iTa ot cneuncpMKaTopn KaTO %timestamp, 

%thread, %level, %logger, %message, %newline M flpyrn Lfle nO/iyHMM KaTO 

M3xofl TeKCTa, ocpopMeH b >Ke/iaHki*i ot Hac bma. B log4net ca BK/iioneHki 
c^eflHMTe ocpopM/ieHi/m: 



Tun 


Ormcai-me 


ExceptionLayout 


rioKa3BaHe Ha TeKCTa Ha M3K/iK)neHkieTO b ziorwHr 
c"b6nTneTO. 


PatternLayout 


OopMaTupaHe Ha /lorkmr c"b6nTneTO cnp^MO 
Ha6op ot cneuMCJDMKaTopM. 



944 



flporpaMnpaHe 3a .NET Framework (tom 2) 



RawTimeStampLayout 


M3B^M4aHe Ha BpeMeTO ot /iori/mr c"b6nTneTO. 


RawUtcTimeStampLayout 


M3B/ikmaHe Ha BpeMeTO ot ziorwHr C"b6nTneTO b 
Universal Time cpopMaT. 


SimpleLayout 


OnpocreHO cpopMaTupaHe Ha zioruHr cb6kiTi/ieTo: 

[level] - [message]. 


Xml Layout 


XML cpopMaTupaHe Ha /lorkmr C"b6nTneTO. 


XmlLayoutSchemaLog4 j 


XML CpopMaTupaHe Ha ziorkmr C"b6nTneTO no 
ctOTBeTHa Ha log4j DTD cxeMa. 



flpyrM xa pa KTepM cm km Ha log4net 

HeKa pa3r/ieAaMe hakom onu.ni/i, komto hm npeA/iara log4net b Aont/iHeHwe 

KbM OCHOBHaTa CpVHKUklOHa/lHOCT. 

noAAP'b>KKa Ha MHO>KecTBo nsiaTcpopMM 

Log4net noAA"bp>Ka cnep,Hv\je n/iaTCpopMw: 

- Microsoft .NET Framework 1.0 (1.0.3705) 

- Microsoft .NET Framework 1.1 (1.1.4322) 

- Microsoft .NET Compact Framework 1.0 (1.0.5000) 

- Mono 1.0 

- Microsoft Shared Source CLI 1.0 

- CLI 1.0 Compatible 

flMHaMHHHa XML KOHCpurypauufl 

Log4net ki3no/i3Ba XML KOHCpurypaunoHHM cpaw/iOBe. flaHHMTe MoraT p,a 6"bAaT 
cbxpaHABaHM KaTO OTAe/ieH cpaw/i v\i\v\ p,a 6"bAaT BMtKHaTM KaTO ceKunn b 
Apyrn XML cpaw/iOBe (npuMepHO b .config cpaw/ia Ha npw/io>KeHkieTO). B XML 
KOHCpurypaunflTa MoraT fla ce flecpMHupaT aneHflepn, ocpopM/ieHi/ifl, HMBa Ha 
/iori/mr m Apyrn napaMeTpn. 

noBe^eTO HacTpoMKM noA/iexaT Ha AHHaMMUHa KOHCpkirypau.i/m, T.e log4net 
MO>Ke p,a Ha6^K>AaBa cpaw/ia 3a M3BtpiueHM npoMeHM v\ p,a vv\ npw/iara no 
BpeMe Ha w3n"b/iHeHkie Ha nporpaMaTa. TaKa CTaBa B"b3MO>KHO AnarHOCTnun- 
paHe Ha npo6/ieMM, 6e3 p,a 6tAe cnnpaHO npn/iOKeHneTO. 3a cucTeMM, komto 
Bene ca 61/1/11/1 BHeApeHM v\ ca pa6oTeiun, TOBa noHAKora e Ba>KHO M3MCKBaHe. 

KaTO a/iTepHaTi/meH BapnaHT, log4net Moxe p,a 6tAe KOHCpurypupaHa v\ p,v\- 
peKTHO b KOAa, ho TaKa ce M3ry6Ba Bt3MO>KHOCTTa 3a AHHaMwnHki HacrpoMKM. 

KoHTeKCTHa MHCpopMauMn npw sioruHr 

rio/ie3Ha npaKTMKa e Ao6aBAHeTO Ha Aont/iHkiTe/iHa, KOHTeKCTHO-3aBMCMMa 
MHCpopMaunfl npn /loruHr Ha cbo6meHki*i. 3a ue/iTa log4net npeA-nara o6eK- 



HnaBa 28. riOMommi MHCTpyMeHTM 3a .NET pa3pa6oTHHun 945 

TMTe GlobalContext (3a r/106a/ieH KOHTeKCT) V\ ThreadContext (KOHTeKCT Ha 
HMUJKa). Hpe3 tax npn/ic»Kei-ikieTO MO>Ke y,qo6HO fla CbxpaHflBa v\ Bnoc/iefl- 
CTBue fla npuKa^Ba kbm /iori/mr cbo6meHi/mTa ashhh 3a KOHTeKcra Ha 
M3nt^HeHne. npuMepHO, b eAHa ye6 yc/iyra, c/iefl KaTO BUKaiunaT ce 
aBTeHTMKupa c noTpe6i/iTe/iCKOTO cm MMe, to MO>Ke fla 6"bfle 3anoMHeHO KaTO 

CBOMCTBO B ThreadContext M C/iefl TOBa aBTOMaTM4HO fla 6"bfle M3Be>KflaHO 
KaTO 4aCT OT BCM4KM /lOTMHr C"b06lfleHMfl. 

log4net - npiiMep 

3a fla n^KDCTpupaMe B"b3MO>KHOCTMTe Ha log4net CMe noflroTBi/i/ii/i c/ieflHMfl 
fleMOHCTpaunoHeH npuMep. B Hero w/uocrpkipaMe KaK ce M3no/i3BaT 6a30BMTe 
cpyHKunn 3a /lorkmr b eflHO koh30/iho npw/io>KeHi/ie consoieAppLog4Net, 
M3no^3Baiuo XML KOHCpkirypaukia: 



using System; 
using log4net; 

// Configure log4net using the .config file 
[assembly : log4net . Config . XmlConf igurator () ] 

namespace ConsoleAppLog4Net 

{ 

internal class LoggingExample 

{ 

private static ILog log = LogManager . GetLogger ( 
typeof (LoggingExample)); 

private static void Main ( ) 

{ 

// Log an info level message 
if (log . Islnf oEnabled) 

{ 

log. Info ( "Application [ConsoleAppLog4Net] Start"); 

} 

// Log a debug message. Test if debug is enabled before 
// attempting to log the message. This is not required 
// but can make running without logging faster, 
if (log . IsDebugEnabled) 

{ 

log . Debug ( "This is a debug message") ; 

} 

try 

{ 

Bar ( ) ; 

} 

catch (Exception ex) 

{ 



946 flporpaMnpaHe 3a .NET Framework (tom 2) 



} 



} 



// Log an error with an exception 

log . Error ( "Exception thrown from method Bar", ex) ; 
} 

log . Error ( "Hey this is an error!"); 

if (log . Islnf oEnabled) 

{ 

log. Info ( "Application [ConsoleAppLog4Net] End"); 

} 

Console .Write ( "Press Enter to exit..."); 
Console . ReadLine ( ) ; 



} 



private static void Bar ( ) 

{ 

Goo ( ) ; 

} 

private static void Foo ( ) 

{ 

throw new Exception ( "This is an Exception"); 

} 

private static void Goo ( ) 

{ 

try 

{ 

Foo ( ) ; 

} 

catch (Exception ex) 

{ 

throw new ArithmeticException ( "Failed in Goo. " 
"Calling Foo. Inner Exception provided", ex) ; 
} 
} 



PeA"bT [assembly : log4net . Conf ig.XmlConf igurator ( ) ] nOKa3Ba KaK M0- 

>KeM p,a 3apeAMM KOHCpurypaunflTa Ha log4net, aKO ce cbxpaHsiBa b .config 
cpaw/ia Ha npi/i/io>KeHi/ieTO. KoHCpurypaunoHHMflT cpaw/i M3Me>KAa TaKa: 



<?xml version="l. 0" encoding="utf-8 " ?> 




<conf iguration> 




<!-- Register a section handler for the log4net section - 


-> 


<conf igSections> 




<section name="log4net" 




type=" System. Configuration . IgnoreSectionHandler" /> 





HnaBa 28. riOMomHM MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 947 



</conf igSections> 

<!-- This section contains the log4net config settings --> 

<log4net> 

<!-- Define some output appenders --> 
<appender name="RollingLogFileAppender" 

type="log4net . Appender . RollingFileAppender"> 
<file value="rolling-log . txt" /> 
<appendToFile value="true" /> 
<maxSizeRollBackups value="10" /> 
<maximumFileSize value="100" /> 
<rollingStyle value="Size" /> 
<staticLogFileName value="true" /> 
<layout type="log4net . Layout . PatternLayout"> 
<header value=" [Header] 
 
 " /> 
<footer value=" [Footer] 
 
 " /> 
<conversionPattern value="%date [%thread] %-51evel 
^logger [%ndc] - %message%newline" /> 
</layout> 
</appender> 
<appender name="LogFileAppender" 

type="log4net .Appender . FileAppender"> 
<file value="log-file. txt" /> 
<appendToFile value="true" /> 

<layout type="log4net . Layout . PatternLayout"> 
<header value=" [Header] 
 
 " /> 
<footer value=" [Footer] 
 
 " /> 
<conversionPattern value="%date [%thread] %-51evel 
^logger [%ndc] < %property { auth } > - %message%newline" /> 
</layout> 
</appender> 
<appender name="ConsoleAppender" 

type="log4net .Appender . ConsoleAppender"> 
<mapping> 

<level value="ERROR" /> 
<foreColor value="White" /> 
<backColor value="Red, Highlntensity" /> 
</mapping> 
<mapping> 

<level value="DEBUG" /> 
<backColor value="Green" /> 
</mapping> 
<layout type="log4net . Layout . PatternLayout"> 

<conversionPattern value="%date [%thread] %-51evel 
^logger [%ndc] < %property { auth } > - %message%newline" /> 
</layout> 
</appender> 
<!-- Setup the root category, add the appenders and set the 

default level --> 
<root> 

<level value="WARN" /> 



948 



flporpaMnpaHe 3a .NET Framework (tom 2) 



<appender-ref ref="LogFileAppender" /> 




<appender-ref ref="ConsoleAppender" /> 




</root> 




<!-- Specify the level for some specific categories - 


--> 


<logger name="ConsoleAppLog4Net . LoggingExample"> 




<level value="ALL" /> 




<appender-ref ref="RollingLogFileAppender" /> 




</logger> 




</log4net> 




</conf iguration> 





B to3m XML dpav\j\ CMe flecpMHupa^n 3 Tuna aneHflepn, komto i/i3no/i3BaT 

pa3^M4HM OCpOpM^eHMfl, M CMe MM 3afla/lkl pa3^M4HM HMBa Ha /lOTklHr. C/iefl 

KaTO CTapTupaMe npM/io>KeHMeTO b koh30/ihma npo3opeu ce BH3ya/iM3npa 
o^aKBaHMfl M3xofl. /lecHO cnvii/maBaMe MHCpopMaunoHHUTe c"bo6iueHMfl, komto 
ca etc 3e/ieH c|doh, ot Te3M c hmbo error, komto ca c nepBei-i: 



"D:\Projects\DotNetBook\ConsoleAppLog4Net\CoiisoleAppLog4Net\bi n We bug\ConsoleAppLog4Net.exe" 



â– a 



11)> - Application [ConsoleAppLog4Net] Start! 



2005-07-19 11:18:20,180 [4040] ERROR ConsoleflppLog4Net.LoggingExanple [(null)] «null)> - Exception thrown from netliod Bar 
System. AritlimeticException: Failed in Goo. Calling Foo. Inner Exception provided — > System. Exception: This is an Exception 

at ConsoleAppLog4Net.Loggin<jEKainple.FooO in d:\projects\dotnetbook\consoleapplog4net\consoleapplog4net\loggingexanple.cs: line 58 
at ConsoleAppLog4Net.LoggingExample.GooO in d:\projects\dotnetbook\consoleapplog4net\consoleapplog4net\loggingexample.cs: line 65 
— End of inner exception stack trace — ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ 

at ConsoleAppLog4Net.LoggingExample.GooO in d:\projects\dotnetbook\consoleapplog4net\consoleapplog4net\loggingexample.cs: line 69 
at ConsoleAppLog4Net.LoggingExample.BarO in d:\pro jects\dotnetbook\consoleapplog4net\consoleapplog4net\loggingexample.cs: line 53 
at ConsoleAppLog4Net.LoggingExample.Main(String[] args) in d:\projectsNdotnetbook\consoleapplog4net\consoleapplog4net\loggingexample. cs:line 32 
2005-07-19 11:18 



1:20.227 [4040] INFO ConsoleflDnLoa' 



nle [(null)] (<null)> - Anulication [ConsoleAonLocr4Net] End! 



Press Enter to exit. 



A eTO KaKBO e cwvbpwaHi/ieTO Ha nor cpaw/ia: 



log-file . txt 



<(null)> - Application 



[Header] 

2005-07-19 11:22:04,364 [2496] INFO 

ConsoleAppLog4Net . LoggingExample [ (null) 

[ConsoleAppLog4Net] Start 

2005-07-19 11:22:04,410 [2496] DEBUG 

ConsoleAppLog4Net . LoggingExample [(null)] <(null)> - This is a 

debug message 

2005-07-19 11:22:04,426 [2496] ERROR 

ConsoleAppLog4Net . LoggingExample [(null)] <(null)> - Exception 

thrown from method Bar 

System. ArithmeticException : Failed in Goo. Calling Foo. Inner 

Exception provided > System. Exception : This is an Exception 

at ConsoleAppLog4Net . LoggingExample . Foo ( ) in 
d: \pro j ects\dotnetbook\consoleapplog4net\consoleapplog4net\loggi 
ngexample . cs : line 58 

at ConsoleAppLog4Net . LoggingExample . Goo ( ) in 
d: \pro j ects\dotnetbook\consoleapplog4net\consoleapplog4net\loggi 
ngexample . cs : line 65 

End of inner exception stack trace 

at ConsoleAppLog4Net . LoggingExample . Goo ( ) in 



HnaBa 28. riOMomHM MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 949 



d: \pro j ects\dotnetbook\consoleapplog4net\consoleapplog4net\loggi 
ngexample . cs : line 69 

at ConsoleAppLog4Net . LoggingExample . Bar ( ) in 
d: \pro j ects\dotnetbook\consoleapplog4net\consoleapplog4net\loggi 
ngexample . cs : line 53 

at ConsoleAppLog4Net . LoggingExample .Main (String [ ] args) in 
d: \pro j ects\dotnetbook\consoleapplog4net\consoleapplog4net\loggi 
ngexample . cs : line 32 

2005-07-19 11:22:04,457 [2496] ERROR 

ConsoleAppLog4Net . LoggingExample [(null)] <(null)> - Hey this is 
an error! 

2005-07-19 11:22:04,473 [2496] INFO 

ConsoleAppLog4Net . LoggingExample [(null)] <(null)> - Application 
[ConsoleAppLog4Net] End 



KaKTO BM>KAaMe v\ npn TaicbB Ma^bK npuMep ce reHepupa 3HankiTe/ma no o6eM 
ziorwHr MHCpopMaunfl. B ep.no pea/iHO npn^OKeHne 6nxMe ce opweHTwpa/iki 
mhoto TpyflHO b /ior cpaw/iOBeTe, aKO He i/i3no/i3BaMe B"b3MO>KHOCTMTe 3a 
ce^eKTMBeH m3xoa 4pe3 HacTpoMKM Ha ziorepwTe. 

M3noji3BaHa /mTepaTypa 

- Log4net Features - http://logging.apache.org/log4net/release/features. 
html 

- Log4net Manual Introduction - http://loqqinq.apache.org/loq4net/ 
release/manual/introduction .htm I 

NHibernate 

NHibernate e 6n6/ii/iOTeKa 3a i/i3B/iwnaHe v\ 3anncBaHe Ha p,auuv\je Ha o6eKTM b 
pe^aunoHHM 6a3M ot flaHHM (object persistence). Ta e .NET MMn/ieMeHTau.M5iTa 
Ha M3K^K)4MTe^HO nony/iflpHMfl MHCTpyMeHT b Java nporpaMnpaHeTO Hibernate 
( http://www.hibernate.org/ '). 

TeKymaTa Bepcua Ha NHibernate e 1.0, ho npoflyKTbT e cra6i/i/ieH v\ ce no/i3Ba 

B MHO>KeCTBO pea/lHH npOeKTM. B"b3MO>KHOCTklTe Ha Ta3M BepCMfl Ca CblUMTe 

KaTO Ha Hibernate 2.1. NHibernate e npoeKT c OTBopeH koa m MO>Ke aa 6-bfle 
HaMepeH Ha http://www.nhibernate.org/ . 

B3anMOfleMCTBne MOKfly o6eKTM vx pejiauiiOHHii CYBfl 

ripn pa3pa6oTKaTa Ha cbBpeMeHHM npn^OKeHna b ro/isiMa CTeneH ce e 
Ha/io>Ki/i/io M3no^3BaHeTO Ha o6eKTHO-opneHTnpaHM noflxoAM. Mhoto npw/io- 
>KeHMfl ce Hy>KflaflT ot Ha^MH fla 3ana3BaT v\ cbOTBeTHO fla ki3B/ikmaT flaHHM 3a 
o6eKTMTe, c komto onepupaT. Pe/iau.kiOHHkiTe CYBfl ca nony/i*ipHO cpeflCTBO 3a 
ue/ua, 3aiuoTO npeAOcraBflT HaAe>KflHOCT, ecpeKTMBHOCT v\ Apyrw >xe/iaHki 
xapaKTepucTMKM npn flocrbna v\ MaHwny/iwpaHeTO Ha ashhu. 



950 nporpaMnpaHe 3a .NET Framework (tom 2) 

ripn cpeiuaTa Ha o6eKTHO-opneHTnpaHaTa napaflkima c Ta3M Ha pe/iauwoHHHTe 

6a3M OT flaHHM, B"b3HMKBaT M3BeCTHM TeXHHUeCKM npeflkl3BMKaTe/lCTBa. 3Ha- 

HMATa Ha pa3pa6oT4MUMTe no OOn He ca npn^OKMMn b pea/ii/i3aui/i*iTa Ha 
cbxpaHABaHeTO v\ o6HOB*iBaHeTO Ha flaHHMTe npe3 TpaAnunoHHMTe onepaunn 
3a M36op, flo6aBAHe, npoMAHa v\ M3TpnBaHe b 6a3aTa ot flaHHM. Te Tpa6Ba fla 

MMC/lflT B TepMMHMTe Ha Ta6/1MUM, KO/10HM M pe/iaUMM. Ot TAX Ce M3MCKBa 

Ao6po no3HaBaHe Ha e3MKa 3a MaHwny/iwpaHe Ha pe/iauwoHHi/i ashhh SQL, 
komto npn TOBa ce cpeiua b MHO>KecTBO cpopMM (fli/ia/ieicm) npn pa3/iwnHHTe 
CYBfl. 

Mofle^npaHeTO Ha npo6/ieMHaTa o6/iacr npe3 o6eKTM BK/iK>nBa KaKTO flaHHMTe, 
TaKa m /lorrno 3a o6pa6oTKaTa mm. ripn npoeKTupaHeTO Ha pe/iauwoHHki Bfl 
cpOKyctT e eflMHCTBeHO Btpxy flaHHMTe. B pe3y/iTaT Ha Te3M pa3/ikmHki rjieflHn 
to4km Ha mhoto npi/i/io>KeHkifl ce Ha/iara fla pa6oTAT eflHOBpeMeHHO c flBa 
MO,qe/ia, pa3^M4aBaifln ce noMe>Kfly cm b peflnua acneKTM. B OOn 6opaBMM c 
K/iacoBe, CBOMCTBa, MeTOflu, a b 6a3MTe ot flaHHM pa6oTMM c noHHTi/m KaTO 
Ta6/ikiuki, ko/iohm, pe/iauwn. /Jont/iHi/iTe/iHO, Tnnn3aunflTa Ha flaHHMTe e 
pa3/iwnHa m HHMa eflH03HanHO ctOTBeTCTBue Me>Kfly TunoBeTe, n3no/i3BaHki b 
nporpaMHMTe e3nun (m b nacmocT flecpuHnpaHMTe b Common Type System), v\ 
TunoBeTe ot 6a3MTe ot flaHHM. 

ADO.NET m cm/iho TnnM3npaHM DataSets 

ADO.NET npeflOCTaBfl Ha .NET nporpaMMCTUTe 6oraT Ha B"b3M0>KH0CTi/i 
MHTepcpewc 3a pa6oTa c pe/iauwoHHki 6a3M ot flaHHM. K/iacoBeTe Dataset, 

DataTable, DataRow M T.H. flaBaT 06eKTH0-0pneHTMpaH HaHklH 3a flOCTbn flO 

flaHHMTe. TtM KaTO Te3M TunoBe npeflcraBAT pe^aunoHHua MOfle/i, to B"b3M0>K- 
HOCTMTe mm ca orpaHM^eHM ao eKcnpecuBHMTe xapaKTepucTMKn Ha MO,qe/ia. 
TexHMTe cpyHKunn ce CBe>KflaT ao HaBurauna, M36op v\ o6HOBABaHe Ha 
flaHHMTe. B DataSets He MO>Ke ziecHO fla 6"bfle eHKancynwpaHO noBefleHne v\ 
/iorm<a 3a no-cno>KHi/i o6pa6oTKi/i. 

Cm/iho TMnn3npaHMTe (strongly-typed) DataSets ca oiue eflHa CTtnKa b 
nocoKa o6eKTHO-opneHTnpaH flocTbn ao flaHHMTe. TaxHaTa crpyKTypa ce 
onucBa 4pe3 XML, ot komto aBTOMaTMUHO ce reHepupa koa (npe3 i/mcrpyMeHTa 
xsd.exe). C"b3flafleHMTe K/iacoBe ca Hac/ieflHMuw Ha Dataset, ho b tax 
flocTbntT flo flaHHMTe MO>Ke fla ce M3BtpujBa flupeKTHO npe3 CBOMCTBa, a He 
npe3 MMeHa Ha ko/iohm. J\o ro/iaMa CTeneH, TOBa peiuaBa v\ npo6/ieMi/iTe c 
pa3^M4MATa b Tnnn3aunflTa Ha flaHHMTe, KaKTO v\ ce aflpecupaT TpaflnunoH- 
HMTe TpyflHOCTM npw npeflcraBAHe Ha NULL CTOMHOCTMTe. Cm/iho Tnnn3npa- 

HMTe DataSets, npeflCTaBfllflM HflKO/IKO CB"bp3aHM Ta6^MUM, npeflOCTaBflT 

Aont/iHHTe/iHO yflo6HM MexaHM3MM 3a HaBurauna no pe/iauwHTe. 

riporpaMnpaHeTO etc cm/iho TMnn3npaHM DataSets npMTewaBa mhoto ot 
xapaKTepucTMKMTe Ha o6eKTHO-opneHTnpaHMfl koa, ho o6mkhob6ho Te ca 
npoflyKT Ha 4mcto pe^aunoHHO MwcneHe v\ MOfle^npaHe. Cm^ho TMnn3npaHMTe 
DataSets npeflocraBHT yflo6eH Ha^MH 3a pa6oTa c M3BaflKM ot 6a3aTa ot 
flaHHM, ho paflKO OTroBap^T Ha BCM4KM >Ke^aHM xapaKTepucTMKM Ha 06eKTH0- 

OpueHTMpaHMfl flM3aMH. 



HnaBa 28. riOMommi MHCTpyMeHTM 3a .NET pa3pa6oTHHun 951 

06eKTHO-pejiaunoHeH npexofl 

B npaKTMKaTa ce no/i3BaT hako/iko pa3/iwnHki noflxofla, no3BO/iflBamki npe- 
xBtp/iflHeTO Ha flaHHM Me>Kfly o6eKTMTe v\ 6a3aTa ot ashhh no Hani/m, 
M36flrBaiu npeKOMepinaTa o6B"bp3aHOCT Me>Kfly tax. NHibernate e npeflcra- 
BkiTe/i Ha nony^apHMTe peiueHMfl ot Tun Object/Relational Mappers (HaKpaTKO 
ORM). noflxoAtT 3a MOfle/inpaHe, no3HaT nofl MMeTO Data Mapper, npefloc- 
TaBfl He3aBMCMMaTa ycnyra 3a cbxpaH^BaHe Ha o6eKTMTe. TaM ce M3no/i3Ba 
npeBOfl Ha KOHuenunnTe Ha pe/iauwoHHOTO MOAe/iwpaHe b TepMMHMTe Ha OOn 

4pe3 CtOTBeTCTBMfl OT BMAa K/iaC <-» Ta6^MUa M CBOMCTBO O- KO/lOHa. 
06eKTHO-pe/iai4MOHHM CbOTBeTCTBMfl 

B ocHOBaTa Ha ORM TexHO/iorwyiTa e flecpMHupaHeTO Ha cbOTBeTCTBua 
(mappings) Me>Kfly K/iacoBe v\ Ta6/inun. flaHHMTe, ki3no/i3BaHi/i b eAHH K/iac 
MoraT p,a 6"bflaT cbxpaH^BaHM b eAHa v\nv\ noBene Ta6/inun. NHibernate 
noflfl"bp>Ka BCM4KM necro cpeiuaHM cueHapnn 3a Bp"b3KM Me>Kfly K/iacoBe v\ 
Ta6i\v\u,v\. 

Cnep, KaTO ca flecpuHnpaHM cbOTBeTCTBMATa, ORM 6ki6/inoTei<aTa noeMa OTro- 
BopHOCTTa p,a CMHxpoHM3npa o6eKTMTe ot naMerra v\ 6a3aTa ot ashhu. 
Pa3^M4HMTe MMn^eMeHTauuM M3no/i3BaT pa3/ikmHki MeTOflM 3a flecpMHupaHe Ha 
cbOTBeTCTBkisi. B NHibernate Te ce 3aflaBaT npe3 yTBtpfleHaTa TexHO/iorwyi Ha 
XML cpaw/iOBe. TaicbB HanwH Ha KOHCpurypauna MMa peAHua npeAHMCTBa npeA 
3aAaBaHe Ha cbOTBeTCTBMHTa AnpeKTHO b KOAa, 61/1/10 to AeK/iapaTi/iBHO (npe3 
.NET aTpn6yTn) v\nv\ MMnepaTHBHO. 

TpaH3aKUMH 

ripM/io>KeHi/mTa necro M3no/i3BaT 6n3Hec TpaH3aKunn 3a ocbmecTBABaHeTO Ha 
HAKaKBa pa6oTa. B paMKMTe Ha eAHa TpaH3aKunfl luom 6"bAe npoMeHeHO 
cbCTOAHneTO Ha o6eKTMTe TOBa Tpa6Ba p,a ce OTpa3M b 6a3aTa ot ashhu. 
Hakoi/i ORM MHCTpyMeHTM, KaTO NHibernate, noAAtpwaT cnwcbK Ha o6eKTMTe c 
npoMeHeHO ctCTOflHue b paMKMTe Ha eAHa TpaH3aKunfl. ToBa npaBM B"b3MO>KeH 
ecpeKTMBHMfl 3annc b 6a3aTa ot ashhh, KaKTO v\ cnpaBAHeTO c npo6/ieMki 
CBtp3aHM c KOHKypeHTeH AOCTtn. EAMHuuaTa 3a pa6oTa npn NHibernate e 
cecufl m ce npeACTaBfl c o6eKT ot Tun session. 

CnHxpoHH3npaHe Ha npoMeHHTe 

Cnep, M3no^3BaHe Ha o6eKTMTe v\ npoM^Ha Ha TexHMTe ashhh, B"b3HMKBa 
BtnpocbT KaK Aa ce pa36epe kom ashhh Tpa6Ba p,a 6"bAaT o6hob6hm b 6a3aTa 
ot ashhu. ORM peiueHMflTa MMaT pa3/iM4HM noAxoAM 3a to3m npo6/ieM. Eahh 
BapnaHT e pa3pa6oTnm<"bT M3pn4HO Aa OT6e/ifl3Ba Kora o6eKTMTe ca npoMe- 
HeHM. A^TepHaTMBeH HanwH e HenocpeACTBeHO npeAM o6HOB*iBaHe Aa ce 
cpaBHAT c Aont/iHMTe^HO o6p"biueHne TeKymnTe AaHHM c Te3M, ctxpaHeHM b 
6a3aTa OTAaHHM. NHibernate ki3no/i3Ba no-Ao6pa CTpaTerna, noAA^p^awKM 3a 
BCAKa TpaH3aKunfl Keiu Ha ctCTOAHUflTa Ha o6eKTMTe, y^acTBaiun b Hea. TaKa 
6n6/iwoTeKaTa Moxe aBTOMaTM^HO Aa pa36epe p,anv\ ca 6v\nw M3BtpiueHM 
npoMeHM, M3MCKBaiun o6HOBABaHe b 6a3aTa OTAaHHM. 



952 nporpaMnpaHe 3a .NET Framework (tom 2) 

OT/ioweHO 3ape>KflaHe (lazy loading) 

06kiKHOBeHO eflMH Data Mapper M3B/ikma HaBeAH"b>K bcmukm flaHHM 3a o6eK- 
TMTe, 3a komto OTroBapa. rioHAKora o6eKTM ot flafleH Tun cbfltpwaT ro/iHMa 
kiepapxufl ot o6eKTM, komto He 6nxMe kiCKa/iw fla 3ape>KflaMe npn bcako 
M3B^M4aHe Ha flaHHM. 3a ue/iTa NHibernate noflfltpwa OT/io>KeHO 3ape>KflaHe 
(lazy loading). C to3m noflxofl flaHHkiTe ce M3B/ii/maT ToraBa, KoraTO CTaHaT 

HaMCTMHa Hy>KHM. 

KemiipaHe 

B HaTOBapeHa cpefla, npuMepHO npn ye6 npw/io>KeHkifl, e npenoptuwTe/iHO fla 
ce npw/iara KeiunpaHe Ha o6eKTMTe. MMa pa3/innHw HanwHi/i 3a TOBa, hakom ca 
Ha hmbo cecwfl, flpyrn Ha hmbo npn^OKeHne. NHibernate noflfl"bp>Ka KeiunpaHe 
b paMKMTe Ha eflMH session o6eKT. 

E3MK 3a 3a JIB KM 

HecTO ce Ha/iara ki3B/iwnaHe Ha o6eKTM no KpnTepnn, CB"bp3aHM etc ctomhoctm 
Ha eflHO v\nv\ hako/iko TexHM CBOMCTBa. 06nKHOBeHO flocTbntT no yHMKa^eH 
MfleHTucpMKaTop He e flocraTbueH. ripuMepHO, aKO TtpcwM o6eKTM ot Tun 
aBTOMo6ki/i, me MCKaMe fla 3aflafleM yc^OBna 3a MOfle/i v\ \\eua. 3a ue/iTa 
NHibernate ki3no/i3Ba e3MK noflo6eH Ha SQL - Hibernate Query Language 
(HQL). Tom e flocra flo6pe pa3BMT v\ noflfl"bp>Ka noBeneTO ot KOHU.enu.nwTe, 
M3no/i3BaHki b CbBpeMeHHMTe CYBfl. 

flpyrM cpyHKuiMM 

ORM MHCTpyMeHTMTe npefl/iaraT MHO>KecTBO flpyrw B"b3M0>KH0CTki, ho o6mkho- 
BeHO Hy>KflMTe Ha npoeKTMTe M3MCKBaT no/i3BaHeTO Ha Ma/iKa nacr ot tax. 
NHibernate e cpefl Te3M peiueHMfl, komto npeflocraBAT 6oraTa cpyHKu.i/iOHa/i- 

HOCT M MaKCMMa^Ha rbBKaBOCT. LilkipOKHflT 06XBaT Ha Bt3M0>KH0CTMTe Ha 6m6- 

zikiOTeKaTa ce npeflocraBfl b Ha nptB novnep, orpoMeH nporpaMeH MHTepcpewc, 
ho b noBeneTO npw/io>KeHi/m ce Ha/iara fla M3no/i3BaMe HeroBO Ma/iKO 
noflMHO>KecTBO. B npuMepa no-,qo/iy me ce cnpeM caMO Ha Haki-6a30BMTe 
no3HaHMfl, komto ca Hy>KHM, 3a 3ano4BaHe Ha pa6oTa c NHibernate. 

fleMOHCTpauiMOHeH npMMep c NHibernate 

B npuMepa me fleMOHcrpi/ipaMe eflMH npocT cueHapnw Ha M3no/i3BaHe Ha 
Nhibernate, KaTO MkmeM npe3 c/ieflHMTe CTbnKn: 

1. Cb3flaBaMe Ta6/ikiu.a, b koato me 6"bflaT cbxpaHABaHM flaHHMTe 3a eflMH 
.NET K/iac. 

2. C-b3flaBaMe .NET K/iaca. 

3. C"b3flaBaMe cpai/i/i etc cbOTBeTCTBkisiTa, yKa3Baiu KaK NHibernate fla 
M3B/ikma m 3anncBa b Ta6/ikiu.aTa CTOMHOCTMTe Ha CBOMCTBaTa Ha K/iaca. 

4. C"b3flaBaMe KOHCpurypaunoHeH cpai/i/i, yKa3Baiu KaK NHibernate fla ce 
CB"bp3Ba c 6a3aTa ot flaHHM. 



HnaBa 28. noMommi MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 953 

5. M3no^3BaMe cpyHKunnTe, komto npeflocTaBa NHibernate. 

CrbnKa 1: Cb3AaBaHe Ha Ta6/iimaTa npe3 SQL 

J\a cm npeflCTaBMM, ne pa3pa6oTBaMe npocTa noflcucTeMa 3a pa6oTa c 
noTpe6kiTe/ikiTe Ha ye6caMT. HeKa cb3p,ap,eM Ta6/iwua users, koato MMa 
cneAHMfl bma: 



CREATE TABLE Users ( 

LogonID nvarchar (20) NOT NULL default '0' 
Name nvarchar (40) default NULL, 
Password nvarchar (20) default NULL, 
EmailAddress nvarchar (40) default NULL, 
LastLogon datetime default NULL, 
PRIMARY KEY (LogonID) 



ripuMeptT e Btpxy MS SQL Server 2000, ho HHMa npenKM p,a M3no/i3BaMe 
BCAKa flpyra CYBfl. NHibernate noAA"bp>Ka bcmukm 6a3M ot flaHHM, 3a komto 
c-biuecTByBa .NET Data Provider. 

Ta6/ikiuaTa 3a noTpe6kiTe/ikiTe me Cbfl"bp>Ka CTaHflapTHM flaHHn: noTpe6n- 
Te/iCKO MMe, MMe, napo/ia, e-mail aApec v\ p,aja Ha nocneflHO noceiueHne. Cera 
Aa HanniueM .NET K/iac etc obOTBeTHMTe CBOMCTBa. 

CrbnKa 2: Ci>3AaBaHe Ha .NET K/iac 

Hy>KeH hm e HanwH Aa npeAcraBMM noTpe6kiTe/ikiTe b naMeTTa v\ p,a MO>KeM Aa 
M3B^M4aMe, npoMeHHMe v\ o6HOB*iBaMe AaHHMTe mm. IHe AecJDMHupaMe K/iac, 
komto Aa cbOTBeTCTBa Ha Ta6^nuaTa users ot 6a3aTa AaHHM. IHe Ao6aBMM 
CBOMCTBa 3a no/ieTaTa Ha to3m K/iac. NHibernate BtTpewHO me pa6oTM c 
Haujufl K/iac npe3 TexHMKaTa Ha OTpaweHkie. Eto KaK i/i3r/ie>KAa K/iacvr user: 



namespace NHibernate . Examples . QuickStart 

{ 

public class User 

{ 

private string mid; 

private string mUserName; 

private string mPassword; 

private string mEmailAddress; 

private DateTime mLastLogon; 

public User ( ) 

{ 

) 

public string Id 

{ 

get { return mid; } 
set { mid = value; } 



954 



flporpaMnpaHe 3a .NET Framework (tom 2) 



public string UserName 

{ 

get { return mUserName; } 
set { mUserName = value; } 



public string Password 

{ 

get { return mPassword; } 
set { mPassword = value; } 



public string EmailAddress 

{ 

get { return mEmailAddress; } 
set { mEmailAddress = value; } 



public DateTime LastLogon 

{ 

get { return mLastLogon; } 
set { mLastLogon = value; } 



} 



B npuMepa CMe flecpm-ikipa/ii/i CBOMCTBaTa v\ KOHcrpyKTopa Ha K/iaca c ny6- 
/lwneH AOCTbn, ho NHibernate MO>Ke fla pa6oTM KaKTO c public, TaKa v\ c 

protected, internal M flOpkl C private CBOMCTBa. 

CrbnKa 3: Cb3AaBaiie Ha 4>aii/i ci>c cbOTBeTCTBMUTa 

Cera me HanpaBMM Bp"b3KaTa Me>Kfly SQL Ta6/ikiu.aTa v\ .NET K/iaca hm. 3a 
ue/ua Tpa6Ba fla noflroTBMM cpaw/i etc ctOTBeTCTBUflTa (mappings), ripenopt- 
ukue/iHOTO e fla noflfltpaoMe no eflMH cpaw/i 3a BceKM K/iac, fla ro MMeHyBaMe 
no cxeMaTa ciassName.hbm.xmi m fla ro cbxpaHABaMe b cbiuaTa flupeKTopua 
KaTO K/iaca. Ako ki3no/i3BaMe Visual Studio.NET npoeicr Tpa6Ba fla flo6aBMM b 
Hero cpafi/ia KaTO BrpafleH pecypc (embedded resource), 3a fla 6-bfle 4acT ot 
aceM6/ikiT0. Eto KaK MO>xe fla H3Me)Kfla user.hbm.xmi: 



<?xml version="l. 0" encoding="utf-8 " ?> 

<hibernate-mapping xmlns="urn : nhibernate-mapping-2 . 0"> 
<class name= "NHibernate . Examples . Quicks tart .User, 
NHibernate . Examples" table="Users"> 
<id name="Id" column="LogonId" type="String" length="20"> 

<generator class="assigned" /> 
</id> 
<property name="UserName" column="Name" type="String" 



HnaBa 28. riOMomHM MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 955 



length="40"/> 
<property name=" Pas sword" type="String" length="20"/> 
<property name="EmailAddress" type="String" length="40"/> 
<property name="LastLogon" type="DateTime"/> 
</class> 
</hibernate-mapping> 



ripn AecpMHupaHe Ha cbOTBeTCTBi/m Me>Kfly Ta6/iwua v\ K/iac ocBeH irb/moTO MMe 
Ha K/iaca, Tpa6Ba fla yKa>KeM v\ b Koe aceM6/iw ce HaMupa, 3a fla Mcoxe 
NHibernate fla ro OTKpue v\ 3apeflM. B c/iyna*i aceM6/ikiTO e c MMe NHibernate. 
Examples m flopn fla He yKaxeM fla/iw e .exe v\nv\ .dii, to me 6"bfle otkpmto. 

TaroBeTe property BtpiuaT ocHOBHaTa pa6oTa 3a yi<a3BaHe Ha cbOTBeT- 
CTBMATa Ha hmbo ko/iohm. ATpn6yT"bT name e 3a cbomctboto Ha K/iaca. nocne 
c/ieflBa MMeTO Ha KO/iOHaTa b 6a3aTa ot flaHHM, koato flopi/i Mcoxe fla ce 
nponycHe, b cnynaw ne MMeTO v\ CbBnafla c TOBa Ha cbomctboto. ATpw6yTbT 
type cbmo He e 3afl"b^>KMTe^eH - NHibernate me M3no/i3Ba OTpaweHkie, 3a fla 
ce onuTa fla ro no3Hae. 

Tarvr id e 3a ntpBHUHMfl k/ikdh Ha Ta6/ikiuaTa. no aTpn6yTM npw/ikma mhoto 
Ha Tara property. B/io>KeHi/mT Tar generator Ka3Ba Ha NHibernate KaK fla 
reHepupa ntpBHUHwa k/ikdh. noflfltpxaT ce MHOKecmo TunoBe reHepaTopn Ha 
MfleHTucpMKaTop, ho b Haujufl c/iynai/i, o6eKTbT me no/i3Ba k/ikdh, reHepupaH 
ot 6a3aTa ot flaHHM. 

CT"bnKa 4: Cb3AaBaHe Ha KOHC^MrypamiOHeH $ art si 3a 6a3aTa ot 
AaHHM 

Bee oiue He CMe yKa3a/ii/i koa e 6a3aTa ot flaHHM. Haw-/iecHi/mT HanwH 3a TOBa 
e fla npeflocTaBMM Ha NHibernate KOHCpurypaunoHHa ceKuna b . config cpaw/ia 
Ha npw/io>KeHkieTO. Eto KaK MO>Ke fla i/i3r/ie>Kfla ta: 



<?xml version="l. 0" encoding="utf-8 " ?> 
<conf iguration> 
<conf igSections> 
<section 

name="nhibernate" 

type="System. Configuration . NameValueSectionHandler , 
System, Version=l .0.5000.0, Culture=neutral, 
PublicKeyToken=b77a5c561934e08 9" 
/> 
</conf igSections> 

<nhibernate> 
<add 

key="hibernate . connection . provider" 

value="NHibernate . Connection . DriverConnectionProvider " 
/> 
<add 

key="hibernate . dialect" 



956 flporpaMnpaHe 3a .NET Framework (tom 2) 



value="NHibernate. Dialect. MsSql2 0Dialect" 
/> 
<add 

key=" hibernate . connection . driver_class" 

value="NHibernate . Driver . SqlClientDriver " 
/> 
<add 

key="hibernate . connection . connection_string" 

value="Server=localhost; initial 
catalog=nhibernate; Integrated Security=SSPI " 
/> 
</nhibernate> 



npuMeptT i/i3no/i3Ba sqiciient flpaMBep 3a CB"bp3BaHe c 6a3a ot ashhm c MMe 

nhibernate Ha localhost. ripeA-HaraT ce M Oiue HflKO/IKO xapaKTepMCTMKM, c 

komto p,a HacTpouM c|dmho KaK p,a ce ocbmecTBHBa Aocrbna ao 6a3aTa. 

CT-bnKa 5: CbinMHCKaTa pa6oTa c NHibernate 

Cera ocTaBa p,a pea^M3npaMe cbiunHCKaTa cpyHKUMOHa^HOCT, M3no^3Baiua 
B"b3MO>KHOCTMTe Ha NHibernate. 3a ue/ua Ao6aBAMe pecpepeHuna kbm 
NHibernate.dll b npoeKTa hm m pea^M3npaMe cneAHMfl koa: 



Configuration cfg = new Conf iguration ( ) ; 
cf g . AddAssembly ( "NHibernate . Examples" ) ; 

// Open DB session and start a transaction 
ISessionFactory factory = cf g . BuildSessionFactory ( ) ; 
ISession session = f actory . OpenSession ( ) ; 
ITransaction transaction = session . BeginTransaction () ; 

// Create new user 

User newUser = new User ( ) ; 

newUser.Id = "joe_cool"; 

newUser . UserName = "Joseph Cool"; 

newUser . Password = "abcl23"; 

newUser . EmailAddress = "joe@cool.com"; 

newUser . LastLogon = DateTime . Now; 

// Tell NHibernate that this object should be saved 
session . Save (newUser) ; 

// Commit all of the changes to the DB and close the ISession 
transaction . Commit ( ) ; 
session . Close ( ) ; 

// Open another session to retrieve the just inserted user 
session = factory . OpenSession () ; 

User joeCool = (User ) session . Load (typeof (User ) , "joe_cool"); 



HnaBa 28. riOMomHM MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 957 



// Set Joe Cool's Last Login property 
j oeCool . LastLogon = DateTime . Now; 

// Flush the changes from the Session to the Database 
session . Flush ( ) ; 

// Query all users 

IList userList = session . CreateCriteria (typeof (User )). List ( 

foreach (User user in userList) 

{ 

System. Diagnostics . Debug . WriteLine ( 

"{0} last logged in at {1}", user. Id, user . LastLogon) ; 
} 

// Query users who logged-on after a specified date 
ICriteria criteria = session . CreateCriteria (typeof (User )) ; 
criteria .Add (Expression . Expression . Gt ( 

"LastLogon", new DateTime (2005, 06, 14))); 
IList recentUsers = criteria . List () ; 

foreach (User user in recentUsers) 

{ 

System. Diagnostics . Debug .WriteLine ( 

"{0} last logged in at {1}", user. Id, user . LastLogon) ; 
} 

// Tell NHibernate to close this Session 
session . Close ( ) ; 



Eto npe3 KaKBM crbriKM MMHaxMe: 

1. C"b3flafloxMe configuration o6eKT, OTroBopHMK 3a cbOTBeTCTBkiflTa 
Me>KAy .NET K/iacoBeTe v\ 6a3aTa ot ashhh. B c/iynaa tom no yi<a3aHO 
MMe Ha aceM6/iw OTKpuBa v\ o6pa6oTBa bci/iukm cpaw/iOBe, 3aB"bpujBaiun c 

. hbm . xml . 

2. C"b3AafloxMe ceci/ia kbm 6a3aTa ot flaHHM. isession o6eKTbT npeAcraBH 
Bp"b3Ka KtM 6a3aTa ot flaHHM, a iTransaction e TpaH3aKunfl, ynpaB/isi- 
BaHa ot NHibernate. 

3. 3anncaxMe o6eKT b 6a3aTa ot ashhh v\ ki3B/iflKOXMe Ha6op ot o6eKTM. 
BuflflXMe ko/iko npo3pani-io pa6oTAT onepaunnTe no cbxpaHABaHe v\ 
ko/iko ziecHO e KOHcrpywpaHeTO Ha 3aaBKM. 

4. Cnep, npnK^K)4BaHe 3aTBopnxMe cecn^Ta, 3a p,a 6tAe ocBo6oAeHa 
ADO.NET Bp-b3KaTa, M3no/i3BaHa ot NHibernate. 



958 nporpaMnpaHe 3a .NET Framework (tom 2) 

noMom,HM MHCTpyMeHTM 3a NHibernate 

ro/iflMa nacr ot ptuHaTa pa6crra, koato M3B"bpujnxMe b npuMepa, ce noflflaBa 
Ha aBTOMaTM3aunfl v\ MoxeM fla onaKBaMe nosiBflBaHeTO Ha peflMua npMflpy- 
>KaBaiun MHCTpyMeHTM 3a reHepMpaHeTO Ha cxeMa Ha 6a3aTa ot flaHHM, 
reHepMpaHe Ha K/iacoBe ot mapping cpaM/iOBe m o6HOBABaHe Ha cxeMaTa. 
Bene ca pa3pa6oTeHM hako/iko He3aBMCMMM cpeACTBa, komto fla hm noMaraT 
npM M3no^3BaHeTO Ha NHibernate. Cpefl tax ca CodeSmith Lua6/iOHM 3a 
pa3^M4HM BMflOBe reHepauMM ( http://www.intesoft.net/nhibernate/ '), iokto m 
aHa^M3aTop 3a HQL 3asiBKM ( http://developer.berlios.de/proiects/nqa/ ). Tpa6- 
Ba fla ce 0T6e/ie>KM m noflflptwKaTa Ha NHibernate b MHCTpyMeHTa Codus 
( http://www.adapdev.com/codus/index.aspx '). 

Apyrii B~b3MO>KHOCTI4 

NHibernate npefl/iara oiue MHO>KecTBO MHTepecHM b"B3mo>khoctm, komto He 
ycnaxMe fla o6xBaHeM. Cpefl tax ca: no-cno>KHM cbOTBeTCTBMfl ot BMfla eflMH- 

KtM-MHOTO, pa60Ta CtC COpTMpaHM M B/10>KeHM KO^eKUMM, HaCTpOMKM 3a 

noBMiuaBaHe Ha npoM3BOflMTe/iHOCTra m t.h. Mo>xeTe fla OTKpMeTe flont/i- 
HMTe/iHa MHCpopMauMfl b flOKyMeHTauMATa Ha NHibernate m b Ta3M Ha no- 
3pe^Mfl My npefliuecTBeHMK 3a Java - Hibernate. 

fl3no/i3BaHa /mTepaTypa 

- Fredrik Normen, Persistence - http://fredrik.nsquared2.com/viewpost. 
aspx?PostID=209&showfeedback=true 

- Scott Ambler, The Object-Relational Impedance Mismatch - http://www. 
aqiledata.org/essays/impedanceMismatch.html 

- Dino Esposito, DataSets vs. Collections - http://msdn.microsoft.com/ 
msdnmaq/issues/05/08/CuttinqEdqe/default.aspx 

- NHibernate Quick Start Guide - http://wiki.nhibernate.org/display/NH/ 
Quick+Start+Guide 

- Tobins' NHibernate FAQ - http://www.tobinharris.com/nhibernatefaq. 
aspx 

NAnt 

NAnt e MHCTpyMeHT 3a aBT0MaTM3MpaHe Ha build npoueca 3a eflHO npM/iowe- 
HMe. Tom npefl/iara moluhm bbsmokhoctm 3a ynpaB/ieHMe Ha KOMnM/iauMATa, 
KOHCpMrypauMATa m MHcra/iauMATa Ha cocpTyepHM KOMnoHeHTM. Pa3pa6oTHM- 
UMTe o6MKHOBeHO ce CTpeMAT fla aBT0MaTM3MpaT MaKCMMa/iHO Te3M npouecM, 

TbM KaTO P"bHHOTO MM M3B"bpilJBaHe HOCM M3/1ML1JHM pMCKOBe OT rpeilJKM. Hpe3 

NAnt MO>KeM fla onMiueM CTtnKMTe ot npoueca npe3 yflo6eH, XML 6a3MpaH 
CMHTaKCMC m fla ro HanpaBMM Hant/iHO noBTopaeM. ripoeKTbT e onMT fla ce 
M3rpaflM .NET aHa/ior Ha Jakarta Ant build CMcreMaTa. Jakarta Ant e craHflapT 
b aBT0MaTM3MpaHeT0 Ha build npoueca b Java cpeflMTe, a NAnt ce Ha/iara no 



HnaBa 28. riOMommi MHCTpyMeHTM 3a .NET pa3pa6oTHkiun 959 

noflo6eH HanwH b .NETcBeTa. Mo>KeTe fla ki3Ter/ikiTe MHCTpyMeHTa v\ flOKyMeH- 
TaunflTa My ot CTpaHnuaTa Ha npoeKTa http://nant.sourceforqe.net . 

3 a mo Hii e Hy>KeH NAnt? 

3aiuo hm e Hy>KeH MHcrpyMeHT 3a aBT0MaTM3npaHe Ha KOMnw/ikipaHeTO? HuMa 
Microsoft Visual Studio .NET He ce cnpaBfl flOcraTbUHO ,qo6pe? 06mkhob6ho 
npouecbT Ha pa3pa6oTKa Ha flafleHO npn^oxeHne BK/iK>nBa mhoto noBene 
3afla4M ot KOMni/i/iau.i/iflTa. NAnt noKpuBa bcm^km crbnKM no BepuraTa ot 
pa3pa6oT4MKa ,qo noTpe6i/iTe/ifl. CKpunTOBeTe My MoraT fla KOHTpo/iwpaT 
M3fltpnBaHeT0 Ha KOfla ot cwcreMa 3a kohtpo/i Ha BepcunTe, KOMnw/iwpaHeTO, 
M3rpa>KflaHeT0 Ha MSI MHcra/iauwoHeH naKeT, nycKaHeTO Ha aBT0MaTM3npaHn 
TecTOBe, KonnpaHeTO Ha cpai/i/iOBeTe Ha onpefle/ieH 3a ue/iTa cbpBtp v\ 
M3BtpujBaHe Ha i/iHCTa/iau.wflTa. Bc^Ka ot Te3M onepaunn e npocTa caMa no 
ce6e cm v\ o6mkhob6ho He OTHeMa mhoto BpeMe. ToBa, o6ane He e npwui/iHa fla 
He vv\ aBT0MaTM3npaMe. 3a,qankiTe ce HaTpynBaT, ry6nM mhoto BpeMe v\ necro 
npaBMM rpeujKM v\nv\ 3a6paBAMe Heiuo. npwuwHeHOTO Heyflo6cTBO Moxe fla 
Hapyujn nepnoflM4HOCTTa Ha flocTaBKa Ha hobm Bepcun Ha npoflyKTa 3a 
TecTBaHe v\ ynoTpe6a. Paakoto ny6/iMKyBaHe Ha hobm Bepcun hocm pucKOBe 
3a npoeKTa, KaTO CKpuBa eBeHTya/iHM npo6/ieMM v\ HaMa/iHBa ujaHca 3a 
HaBpeMeHHa HaMeca. 

3aiuo to4ho NAnt, a He hhko*i flpyra ci/icreMa v\nv\ K0M6nHaunfl ot /uo6MMMfl 
hm CKpunTOB e3MK c .BAT cpaw^OBe? NAnt e mhoto flo6pe MHTerpupaH Cbc 
c"biuecTByBaiuaTa .NET MHCppacTpyKTypa v\ pa6oTM ot/imuho c BrpafleHMTe 
MHCTpyMeHTM. NAnt e My/iTwn/iaTc|DopMeH i/mcrpyMeHT v\ noflfltpwa KaKTO 
Microsoft .NET, TaKa v\ Mono. Bt3M0>KH0CTMTe Ha NAnt MoraT fla 6tflaT ziecHO 
pa3LunpflBaHM. Tom MO>xe fla ki3n"b/iH$iBa CKpunTOBe v\ nporpaMM, HanncaHM Ha 
flpyrn e3Mun, KaTO no to3m Hani/m nrpae po/iHTa Ha /lenw/io Me>Kfly pa3/innHw 
Bene ctiuecTByBaiflu MHCTpyMeHTM. 

OCHOBHM CjDVHKMMM 

- Pa3fle^AHe Ha npoeKTa Ha \\ei\v\ (targets) v\ 3aflanw (tasks). noflfltpxaT 
ce noflnpoeKTM v\ pa3/ii/mHki KOHCpurypaunn. 

- OnucaHne Ha 3aBMCMM0CTMTe Me>Kfly pa3/iwnHi/iTe \\ei\v\. M3n"b/iHeHi/ie Ha 
ue/ikiTe b pefla Ha 3aBMCMM0CTMTe. 

- Yflo6Ha pa6oTa c cpaw/iOBe - ziecHO KonnpaHe, MecTeHe, apxuBupaHe, 
o6HOBABaHe. 

- MHTerpaunfl c nony/iapHMTe KOMnw/iaTopw, CMCTeMM 3a kohtpo/i Ha 
BepcuMTe m flpyrn MHCTpyMeHTM. 

- Pa3/innHM HOTMCpMKauuM v\ /ior c"bo6iueHMfl npw eBeHTya^eH Heycnex Ha 
CKpunTa. rit/iHaTa noflflptxKa Ha XML 6a3npaHM /ior cpaw/iOBe v\ 
HOTMCpMKaunfl no e/ieKTpoHHa noma ro npaBAT zieceH 3a MHTerpupaHe b 
cbiuecTByBaiflM cucTeMM. 



960 nporpaMnpaHe 3a .NET Framework (tom 2) 

- Pa3LunpfleM0CT - flo6aBAHe Ha Aont/iHkiTe/iHi/i cpyHKunn v\ 3ap,cMv\, 
MMn^eMeHTupaHM Ha npow3BO/ieH .NETe3MK. 

OCHOBHM nOHflTMfl 

BceKM NAnt npoeKT ce cbcroki ot Ha6op ot ue/iw, komto ce M3n"b/iHflBaT, 3a fla 
ce nocTurHe KpaMHMflT pe3y/iTaT. Hpe3 yKa3BaHe Ha 3aBMCMMOCTM Me>Kfly 
ue/iMTe ce onpeAe/ifl npaBM/iHWAT mm pep, Ha i/i3n"b/iHeHkie. Ue/ikiTe ce onucBaT 
npe3 Ha6op ot KOMaHflu, ome M3BecTHM KaTO 3afla4M. fla pa3r/ieflaMe eAMH 
MMHMMa^eH CKpunT, komto AecpwHkipa npocT NAnt npoeKT c Tpn ue/iw: 



default . build 



<project def ault="compile"> 

<target name="compile"> 

<csc target="library" output="bin\MyWeb . dll"> 
<sources> 

<include name="**\* . cs"/> 
</sources> 
</csc> 
</target> 

<target name="clean"> 

<delete f ile="bin\MyWeb . dll"/> 
</target> 

<target name="rebuild" depends="clean, compile"> 
</target> 

</pro j ect> 



fleK^apaunflTa Ha <project> eneMenra onucBa nenra, kohto ce ki3n"b/iH*iBa 
no noflpa36npaHe. NAnt no3BO/i*iBa ki3n"b/iHeHweTO Ha npow3BO/iHa ue/i, nweTO 
MMe ce noflaBa ot KOMaHflHua pefl. Ako TaKOBa He e noflafleHO, ce i/i3n"b/iH*iBa 
ue/iTa no noApa36i/ipaHe (c BCi/mKMTe v\ 3aBMCMMOCTM npeAH TOBa). 

OcHOBHaTa ue/i b npoeKTa hi/i e compile. Ta ce rpn>KM p,a M3BMKa C# KOMnn- 
ziaTopa v\ p,a KOMnn/iwpa bcmukm cpaw^OBe c pa3UJnpeHne *.cs b TeKymaTa 

AMpeKTOpHfl M BCM4KM HeMHM nOAAHpeKTOpMM . NAnt C/ieAH ASTMTe Ha MOAMCpM- 

Kaunfl Ha cpaw/iOBeTe v\ He KOMnw/inpa v\3i\v\uiuo, aKO H^Ma npoMeHeHM 
cpaw/iOBe cnep, nocneAHaTa KOMnw/iaui/ifl. 

Ako MCKaMe p,a m34mctmm npoeKTa ot Me>KAHHHkiTe cpai/i/iOBe, reHepupaHM ot 
KOMnn^aunflTa, MOxeM p,a bk/ik>hi/im cbOTBeTHaTa ue/i clean, koato p,a M3Tpne 
reHepupaHOTO ot KOMnw/iaTopa aceM6/iw. 

ripuMep 3a 3aBMCMMOCTMTe Me>KAy ue/iMTe MOxeM p,a bmamm b AecpMHuunaTa Ha 
rebuild ue/iTa - Tfl npocTO npeAM3BMKBa nonwcrBaHe, nocneABaHO ot HOBa 
KOMnn^aunfl. 



HnaBa 28. noMommi MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 961 

H3m>/iHeHne Ha NAnt CKpunToee 

NAnt CKpunTOBeTe ce w3n"b/iHflBaT ot koh30/ihoto npw/io>KeHi/ie nant.exe. 
Haki-Ba>KHMTe napaMeTpn, komto to npneMa, ca MMeTO Ha CKpunTOBna cpaw/i v\ 
MMeTO Ha ue/iTa 3a ki3n"b/iHeHi/ie: 



"" C:\WINDOWS\system32\cmd.exe 



D:Ntmp\nyUeb>nant /f :default .build rebuild 
NAnt 0.85 (Build 0.85.1932.0; rc3; 4/16/2005) 
Copyright <C> 2001-2005 Gerry Shau 
http://nant . sourcef orge .net 

Buildfile: f i le : ///D : /t mp/MyUe b/de f au It . bu i Id 
Target framework: Microsoft -NET Framework 1.1 
Target(s) specified: rebuild 



[delete] Deleting file D:\tmp\MyUeb\bin\MyUeb.dll. 



compile : 



[esc] Compiling 3 files to ' D:\tmp\MyUeb\bin\MiFUeb.dll' 



BUILD SUCCEEDED 

Total time: 0.3 seconds. 



D:Stmp\MyUeb> 



CKpunTOBeTe ce MMeHyBaT c pa3UJnpeHne .build v\ aKO He e noAafleHO MMe Ha 
cpaw/i TeKymaTa AHpeicropi/m ce nperbpcBa 3a <£aM/iOBe c TOBa pa3uji/ipeHkie. B 
cnynaw, ne OTKpue caMO eflMH cpai/i/i, to NAnt me ki3iTb/iHki Hero. Ako MMa 
hhko/iko, no noApa36npaHe ce ki3n"b/iHHBa cpaw/ia c MMe default. build. 



MyWeb Microsoft Visual (= .MET [design] default. build 



File 



a 



Edit View Project Build Debug XML Tab[e lools 



Window Help 
y Debug 



L# 



« 



Y. 



9 V 



*: Builds 

B-^l D:\trnp\MjjWeb\default.build 
B- b private 

â–º clean 

â–º compile 



private 



EH^5 D:\tmp\M 
E- &â–  privab 

E-^g MyWeb 
S- private 



Edit Properties 



Output | Object Browser | Start Page | Classl.cs default.build pr 



<project default= "compile" xmlns="http : / 
<property name= "output-file" value=" 
<property name="deloug-kiuild" value=" 
<property name = " p r o gr am- f i 1 e 3 " va 1 ue 



< tar get name="compile"> 

<csc target=" library" output="5 { 
<ceferences> 

<include name = "loin\ nunit 
</ueferences> 
<sources> 

< include name="**\ * . cs"/ 
</sources> 
</csc> 



MoxeM j\a M3iTb/ii-mBaMe CKpuriTOBeTe m ot Microsoft Visual Studio.NET, aKO 
CMe MHCTa/ii/ipa/ii/i pa3LunpeHneTO NantRunner (b>k. <J>i/irypaTa no-rope). Ot 



962 nporpaMnpaHe 3a .NET Framework (tom 2) 

HeroBMfl MHTepcpewc MO>KeM fla M36epeM c Mi/iwKaTa CKpunTa v\ ue/iTa, koato 

Aa M3n"b/1HMM. 

NAntRunner MO>Ke fla 6-bfle i/i3Ter/ieH ot http://nantrunner.sourceforqe.net . 
flpyr yflo6eH kmcrpyMeHT 3a M3n"b/iHeHkie Ha CKpunTOBeTe e NAntMenu 
( http://taschenorakel.de/mathias/nantmenu.en.html ), komto ce MHTerpupa b 
KOHTeKCTHMTe MeHKrra Ha Windows Explorer. 

KoHcjDMrypauiMfl Ha cKpwriTOBeTe 

CKpunTOBeTe MoraT fla 6"bflaT KOHCpurypupaHM npe3 bbhiuhm cpaw/iOBe, 
npoMeH^MBM ot cpeflaTa v\nv\ napaMeTpn Ha KOMaHflHua pefl. Ochobhmat 
e/ieMeHT b KOHCpurypaunaTa v\ yc/iOBHOTO w3n"b/iHeHkie ca t. Hap. CBOMCTBa 
(properties) v\ cpyHKu.nn. CBOMCTBaTa ce fleK/iapi/ipaT c enewema <property>: 



<prop 


erty 


name 


="output- 


file" 


value 


="bin\MyWeb 


.dll" 


/> 




<prop 


erty 


name 


="debug-t 


uild" 


value 


="true" overwrit 


e="false' 


/> 


<prop 


erty 


name 


="program-f iles" val 


ae="$ { environmen 


t : : get-f c 


lder- 


path ( 


' Proc 


ramF 


lies' ) }" 


/> 












<dele 


te fi 


le=" 


$ { output- 


file} 


"/> 










<copy 


file 


= "${ 


output- fl 


le}" 


todir= 


'$ {program- 


files 


}\NAntTes 


t"/> 



M3n0^3BaHeT0 Ha CTOMHOCTTa Ha flafleHO CBOMCTBO CTaBa C $ {property-name} 

CMHTaKCuca. Mo>KeM fla ki3no/i3BaMe BrpafleHM v\nv\ bbhiuhm cpyHKunn npn 
flecpMHMunflTa Ha CBOMCTBaTa, KaKTO m fla cb3flaBaMe co6cTBeHM ctomhoctm 

4pe3 BrpafleHaTa MHTepnO/iau.km Ha HM30BeTe - $ {program-files }\MyFolder. 

Ctomhoct Ha HAKoe cbomctbo MO>Ke fla 6"bfle 3aflafleHa ot KOMaHflHua pefl: 



nant compile -D : debug-build=f alse 



Ako MCKaMe fla npeflocraBMM ctomhoct no noflpa36npaHe, Tpa6Ba fla 
flecpMHupaMe cbomctbo etc ctiuoTO MMe b CKpunTa v\ fla ro MapKupaMe c 
aTpn6yTa overwrite=" false". ToBa me rapaHTkipa, ne croi/iHOCTTa, noflafleHa 
Ha KOMaHflHMfl pefl, HflMa fla 6"bfle npe3anncaHa c Ta3M, koato e flecpMHupaHa 
b CKpunTa. TaKa HanpuMep MO>xeM fla flecpMHupaMe ue/i 3a KOMnw/iwpaHe, 
koato fla KOMnn^upa debug v\nv\ release Bepcufl cnopefl noflafleHMTe 
KOMaHflHM napaMeTpn: 



<target name="compile 


â– > 










<csc target="librar 


y" 


output=" 


${ 


output- 


-file}" 


debug="$ { debug 


-build} "> 








<sources> 












<include name= 


"** 


\*.cs"/> 








</sources> 












</csc> 












</target> 













HnaBa 28. noMommi MHCTpyMeHTM 3a .NET pa3pa6oTHHun 963 

Mo>KeM fla AeK/iapwpaMe o6lum CBOMCTBa 3a npoeKTa b OTRenen cpaw/i v\ fla rn 
M3no^3BaMe HaBCAKbfle, KbfleTO ca hm Heo6xoflMMM. noflxoflaiun KaHflkiflaâ„¢ 
3a OTAe/iHHe ca: 6a30BM MMeHa Ha cpaw/iOBe, ntTMiua KbM M3BecTHM 
MHCTpyMeHTM v\i\v\ BepcuM. TaKa npn Hy>KAa ot KopeKu.nn v\ pa3LuwpeHi/m 
noflflp"b>KKaTa Ha CKpunTOBeTe me 6"bfle 3HanwTe/iHO y/iecHeHa. Eto ep,v\u 
npuMep: 



conf ig . build 



<project name="MyWeb" def ault="all"> 

<property name="version" value="l . 3"/> 

<property name="staging-server" value="LocalTest"/> 

</pro j ect> 



TopHMflT KOHCpurypaunoHeH NAnt CKpunT MO>Ke fla ce M3no/i3Ba ot flpyrn NAnt 

CKpunTOBe Hpe3 B"b3MO>KHOCTTa 3a BK^K)4BaHe: 



deploy . build 



<project name="MyWeb" def ault="deploy"> 
<target name="deploy"> 

<include buildf ile="conf ig . build" /> 
<copy file="MyWeb_$ {version } .msi" 

todir="\\$ { staging- server }\MyWeb"/> 
</target> 
</pro j ect> 



OpraHM3auiMq Ha c/iokhm cKpuriTOBe 

Bm 6m/io HeecpeKTMBHO fla onuTBaMe fla onmueM \\ej\v\s\T build npou.ec Ha 
ro/iflM npoeKT b eflMH CKpunT. NAnt MMa BrpafleHM b"B3mo>khoctm 3a pa3fle/i*iHe 
Ha CKpunTOBeTe Ha KOMnoHeHTM v\ MHoroKpaTHO i/i3no/i3BaHe Ha Bene flecpMHM- 
paHM CTbnKM ot npoueca. TexHkinecKki, BceKM npoeKT Moxe fla 6"bfle pa3fle/ieH 
Ha noflnpoeKTM, umi/ito build npouec MO>Ke fla 6"bfle onucaH b OTfle/iHM 
CKpunTOBe. 06iuaTa npaKTMKa e BceKM noflnpoeKT fla ce noMeiuaBa b OT,qe/iHa 
AwpeKTopi/m, koato fla cbfltpwa CKpunT, ynpaB/iHBam 6w/ifla. HnaBHi/iflT 
npoeKT 3Hae 3a cbcraBHkiTe cm nacn/i v\ ce rpuxn fla M3BMKa b npaBi/i/iHi/m 
MOMeHT CKpunTOBeTe Ha noflnpoeKTMTe. HeKa pa3r/ie,qaMe npuMepHO ASP.NET 
npn^OKeHne etc cneflHaTa CTpyKTypa Ha flupeKTopnnTe: 

- KofltT ce HaMupa b noflflnpeKTopua "code". 

- McKaMe fla o6cpycKnpaMe (obfuscate), t. e. yMmu/ieHO fla HanpaBMM 
He^eT/iMBM MeTaflaHHMTe b aceM6/ii/iTaTa, 3a fla 3aiunTMM i/iHTe/ieKTya/i- 
HaTa cm co6cTBeHOCT. M3no^3BaMe 3a ue/iTa o6cpycKaTop (HanpuMep 
Dotfuscator) v\ fl"bp>KMM HeroBMTe cpai/i/iOBe b noflflnpeKTopua 

"obf uscation" . 

- McKaMe fla npeflocraBMM MSI naKeT. npoeKTbT v\ flont/iHi/iTe/iHMTe 

Cpafi/lOBe fl"bp>KMM B flkipeKTOpMfl "installation". 



964 nporpaMnpaHe 3a .NET Framework (tom 2) 

BcsiKa flupeKTopua cbfltpwa no eflMH CKpunT c MMe "default. build", komto 
"3Hae" KaKBO fla HanpaBM 3a flafleHna noflnpoeKT. Mo>KeM fla ki3no/i3BaMe 
<nant> 3aflanaTa, 3a fla M3BMKaMe Te3M CKpunTOBe ot r/iaBHwa CKpunT 3a 
npoeKTa: 



pro ject . build 



<project name="MyWeb" def ault="all"> 
<target name="all"> 

<nant buildf ile="Code\de fault . build" > 
<properties> 

<property name="debug-build" value="f alse"/> 
</properties> 
</nant> 

<nant buildf ile= "Ob f us cat ion\de fault . build" /> 
<nant buildf ile=" Ins tallation\de fault . build" /> 
</target> 
</pro j ect> 



3aflanaTa 3a KOMnw/ikipaHeTO Ha KOfla npneMa KaTO napaMeTbp cp/iar, fla/iw fla 
HanpaBM debug v\nv\ release build. MoxeM fla npeflafleM to3m napaMeTbp c 
<properties> e/ieMeHTa Ha <nant>. 3aflanaTa MO>Ke fla 6"bfle KOHCpurypupaHa 
TaKa, ne fltiuepHMAT CKpunT fla Hacneflki bcmukm CBOMCTBa Ha npeflLuecr- 
BeHMKa cm, ho TOBa He e npenoptni/iTe/iHa npaicri/iKa, Tbv\ KaTO MO>xe fla 
npn4MHM TpyflHO npocneflkiMki npo6/ieMi/i b cnynaw Ha CbBnaflaiun MMeHa Ha 

CBOMCTBa. 

1/lHTerpau.nsi c Microsoft Visual Studio.NET 

EflMH ot Haki-necTO 3aflaBaHMTe Btnpocn ot pa3pa6oT4MUMTe e "KaK fla 
MHTerpupaM to3m MHcrpyMeHT b MOfl npoeKT, c MoeTO Konne Ha Visual 
Studio.NET". NAnt Bene noflfl"bp>Ka no-nony/i*ipHMTe KOMnw/iaTopi/i 3a .NET 
e3MUMTe. CtiuecTByBa AOirb/iHkiTe/ieH npoeKT NAntContrib ( http://nantcontrib. 
sourceforqe.net ') c to/isim Ha6op ot 3a,qanki, komto He ca nacr ot 6a30BaTa 
NAnt flMCTpn6yunfl. noflfltpwaT ce pa3npocrpaHeHkiTe cucTeMM 3a kohtpo/i Ha 
BepcuMTe: Visual Source Safe, CVS, Subversion, Perforce, ClearCase. 
Pa3/iwnHki nony^apHM ctpBtpn KaTO IIS Ha Microsoft cbiuo MoraT ziecHO fla 
6"bflaT KOHTpo/ii/ipaHki v\ KOHCpurypupaHM. <sqi> 3a,qanaTa no3BO/i*iBa ziecHaTa 
pa6oTa c OLEDB ctBMecTMMM 6a3M flaHHM, a 3aflanwTe <xmipeek> v\ 
<xmipoke> no3BO/iflBaT neTeHeTO v\ MaHkiny/iau.i/mTa Ha XMLflaHHM. 

MHTerpaunflTa c Visual Studio.NET ctiuo e Ha flo6po hmbo. XML CMHTaKCuctT 
Ha NAnt npoeKTMTe v\wa flecpMHupaHa XSD cxeMa, kohto MO>KeM fla ki3no/i3- 
BaMe, 3a fla MMaMe IntelliSense noflCKa3BaHe flOKaTO nuiueM CKpunTOBeTe: 



T/iaBa 28. riOMomHM MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 965 



c 


assl.cs default. build* | project, build* | 




<project def ault="conipile" xnilns="littp : //tempuri . org/nant-donotuse . xsd"> 




<property narcie= "output-file" value="bin\ MyWeb . dll" /> 




â– (property name="debug-build" value="true" overwr ite="f alse"/> 




<property name= "program- f iles" value="S ( environment : : get-folder-path ( ' Pre 




<cop 




(Hid 


r 


)utput-f lie} "/> 




GUI codestats 


;put-f ile} " todir="S ( program-files} \NAntTest"/> 




(HI comregister 
(HI concat 

(Hi credential 
ED esc 




ripile"> 

:="Debug build in progress..." if ="$ { debug-build} "/> 

'library" output="S { output-file} " debug="$ { debug-build} "5 




(HI cvs 

(HI cvs-changelog 

[Hi cvs-checkjout 


H 


Lude name="**\ * . cs"/> 

â– www. 

5> 


</target> 







l/lHTerpaunn c NUnit 

npenop"bni/iTe/iHO e aBTOMaTM3npaHHTe TecroBe 3a npoeKTa p,a ce M3n"b/iH*iBaT 
npn BceKM build. TaKa ce noflcurypyiBaMe, ne npi/i/ic»KeHi/ieTO pa6oTM KaKTO 
o^aKBaMe v\ pa36npaMe 3a eBeHTya/iHki AecpeK - â„¢ Bt3MO>KHO Haw-paHO. NAnt 
noAA"bp>Ka HaM-nony^apHaTa .NET 6w6.ni/iOTeKa 3a ni/icaHe Ha unit TecTOBe - 
NUnit. OcBeH 3aAanaTa <nunit2>, e Aocrbnina v\ opwrwHa/iHaTa <nunit>, 
cnywema 3a o6paTHa cbBMecTMMOCT c no-crapwTe Bepcun NUnit 1.x. 

1/lAea/iHOTO BpeMe 3a M3n"b/iHeHkie Ha TecTOBeTe o6mkhob6ho e cnep, KOMnn- 
nauwnja Ha aceM6/ii/iTaTa. Ha <nunit2> ce noAaBaT ioto napaMeTpn MMeHaTa 
Ha aceM6^MTaTa c TecTOBe, MMeHaTa Ha TecTOBeTe (K/iacoBeTe, MapKupaHM c 
TestFixture aTpn6yTa) m KaTeropnnTe ot TecTOBe, komto Tpa6Ba p,a ce 
M3n"b^HAT. Ako He ce nc-AaAaT KaTeropnn v\nv\ MMeHa Ha K/iacoBe, ce i/i3n"b/i- 
HHBaT BCM4KM TecTOBe b aceM6/ii/iTo: 



test .build 



<project def ault="test"> 
<target name="test"> 
<nunit2> 
<test> 

<assemblies> 

<include name="bin\MyWeb . dll"/> 
</assemblies> 
<categories> 

<include name="Smoke tests"/> 
<exclude name="Perf ormance tests"/> 
</categories> 
</test> 

<formatter type="Plain"/> 
</nunit2> 



966 flporpaMnpaHe 3a .NET Framework (tom 2) 



</target> 
</pro j ect> 



B npuMepa CMe v\3kjuo<av\j\v\ TecTOBeTe 3a npoi/i3BOAHTe/iHOcr, Tbv\ KaTO o6mk- 
HOBeHO Te OTHeMaT noBene BpeMe. 

fl3no/i3BaHa /mTepaTypa 

- NAnt Manual - http://nant.sourceforqe.net/release/latest/help/ 

- NAntWiki - http://nant.sourceforqe.net/wiki/index.php/HomePaqe 

- Giuseppe Greco, Building Projects with NAnt - http://developer. 
aqamura.com/technotes/buildinq-proiects-with-nant/index.html 

- Nant-users mailing list - http://nant.sourceforqe.net/mailinqlists.html 

- NAntContrib Manual - http://nantcontrib.sourceforqe.net/release/latest/ 
help/ 

flpyrM noMOLMHM cpeflCTBa 

B HacToaiuaTa TeMa npeflCTaBMXMe 6i/i6/ii/iOTeKM v\ MHCTpyMeHTM, komto MoraT 
Aa HanpaBflT pa3pa6oTKaTa Ha .NET npn/io>KeHkifl no-npoAyKTMBHO v\ no- 
npuflTHO 3aHMMaHne. CbmecrByBaT v\ mhoto Apyrn noMOiuHM cpeACTBa, komto 
6nxa hm 6m/ii/i no/ie3Hki b onpeAe/ieHM CMTyau.nn. rio-AO/iy me cnoMeHeM v\ 
onuiueM cbBceM HaKpaTKO ceAeM ot tax. Othobo H^Ma Aa BK/iionBaMe 
KOMepcua^HM npoAyKTM, MaKap b hakom Ba>KHM o6/iacTki Ha .NET pa3pa6oT- 
KaTa (npuMepHO npn pecpaKTopuHr v\ o6cpycKaunfl), 3a MOMeHTa Aa zinncBaT 
6e3n^aTHM a/uepHaTkiBki. 

NDoc 

NDoc ( http://ndoc.sourceforqe.net/ ) e reHepaTop Ha AOKyMeHTauna ot .NET 
aceM6/iMTa v\ C# XML KOMeHTapn. Pa3pa6oTeHM ca v\ Ao6aBKM (add-ins), 
noAA"bp>KaiuM XML AOKyMeHTaunoHHM KOMeHTapn KaKTO 3a VB.NET, TaKa v\ 3a 
ynpaB/iHBaH C++ koa. M3X0AHMTe cpopMaTM 3a AOKyMeHTaunaTa BK/iionBaT 
MSDN-noAo6eH HTML Help (.dm), Visual Studio .NET Help (HTML Help 2) v\ 
Apyrn. B cnynaw, ne ce Ha/iara Aa AOKyMeHTkipaTe ny6/ikmeH API Ha 6n6/ikio- 
TeKM ot K/iacoBe, NDoc 3HanwTe/iH0 me aBT0MaTM3npa v\ ynecHki pa6oTaTa bm. 

GhostDoc 

GhostDoc ( http://www.roland-weiqelt.de/qhostdoc/ ) e Ao6aBKa kbm Visual 
Studio .NET 3a aBTOMaTi/mHO reHepupaHe Ha Te3M nacm ot AOKyMeHTa- 
UMOHHMTe KOMeHTapn b C#, komto MoraT Aa 6tAaT AeAyunpaHM ot MMeTO v\ 
Tuna Ha cbOTBeTHMTe MeTOAM, CBOMCTBa, napaMeTpn v\ t.h. Ako 3aAaBaTe 
flCHM, noApo6HM m KopeKTHM MMeHa Ha ^acTMTe ot KOAa, T03M MHCTpyMeHT me 
bm cnecTM yew/IMA m BpeMe npn cb3AaBaHeT0 Ha KanecrBeHM XML KOMeHTapn. 



HnaBa 28. noMommi MHCTpyMeHTM 3a .NET pa3pa6oTHMUM 967 

Snippet Compiler 

Snippet Compiler ( http://www.sliver.com/dotnet/SnippetCompiler/ ') e npw/io- 
>KeHi/ie, c KoeTO fla nuiueM, KOMnw/iwpaMe v\ M3n"b/iHHBaMe C# v\ VB.NET koa. 
3a Ma/iKM 3afla4M MO>xe fla 6"bfle OT/iMneH 3aMecTHMK Ha Visual Studio .NET. 
rioflfl"bp>Ka He Ma/iKa nacr ot B"b3M0>KH0CTMTe, xapaKTepHM 3a MHTerpupaHUTe 
cpeflu 3a nporpaMnpaHe, KaTO e fla/ien no-o/ieKOTeH ot ro/ieMkue KOMep- 
CMa/iHM npoflyKTM. Ako HflMaTe flocrbn flo Visual Studio .NET v\nv\ MCKaTe 
6"bp30 fla npo6BaTe HflKaicbB koa, Snippet Compiler MO>xe fla bm 6"bfle OT/iMneH 

nOMOlflHMK. 

ASP.NET Web Matrix 

ASP.NET Web Matrix ( http://www.asp.net/webmatrix/ ') e 6e3n/iaTeH MHcrpy- 
MeHT 3a pa3pa6oTKa Ha ASP.NET npn^OKeHna. BK/iK>nBa flM3aMHep 3a 
ASP.NET m HTML CTpaHnun, MHTerpupaH e etc SQL Server v\ MS Access, 
y/iecHABa reHepupaHeTO Ha MHTepepeMCHM KOMnoHeHTM, CB"bp3aHM c flaHHM, 
MflBa etc co6cTBeH ye6 ctpBtp v\ npefl/iara oiue mhoto flpyrn bbsmokhoctm. 
ASP.NET Web Matrix e OT/ikmHa a/iTepHaTMBa Ha Visual Studio .NET npn 
pa3pa6oTKa Ha ASP.NET npM/ioweHkifl. 

Tree Surgeon 

Tree Surgeon ( http://confluence.public.thouqhtworks.org/display/TREE/ ) e 
npw/io>KeHkie, c KoeTO MO>KeM 3a 6poeHM ceKyHflu fla noflroTBMM nt/iHO-cpyHK- 
UMOHa^Ha cpefla 3a pa3pa6oTKa Ha hob .NET npoeKT. Cnefl KaTO 3aflafleM MMe 
Ha npoeKTa, 3a Hac me 6"bfle cb3fla,qeHa CTpyKTypa ot flupeKTopnn, bk/ik>h- 
Baiflu cope cpaw^OBe, noMOiflHn MHCTpyMeHTM, pecpepeHunn v\ 3aBMCMM0CTM, 
ocpopMeHM no nocneflOBaTe/ieH v\ zieceH 3a MHTerpupaHe v\ noflfltpaoHe 
Ha^MH. Ako 3ano4BaTe pa3pa6oTKa c Visual Studio .NET, NAnt v\ NUnit, to 
Tree Surgeon me bm acucTupa b npM/iaraHeTO Ha MHO>KecTBO flo6pn npaKTMKM 
3a ecpeKTMBHaTa mm cbBMecma ynoTpe6a. 

N Depend 

NDepend ( http://smacchia.chez.tiscali.fr/NDepend.html ') e MHcrpyMeHT 3a 
B3eMaHe Ha MeTpuKM. Tom aHa/iki3wpa .NET aceM6/iMTa v\ reHepupa MeTpuKM, 
CBtp3aHM c Ka^ecTBOTO Ha flM3aMHa: bbsmokhoct 3a pa3LunpfleM0CT, creneH 
Ha npen3no^3BaHe, ziecHOTa Ha noflflp"b>KKa. NDepend npeflocraBfl yflo6eH 
npemefl Ha Tono/iori/isiTa Ha npn^OKeHneTO Ha hmbo KOMnoHeHTM, TunoBe v\ 
n/ieHOBe. To3M MHCTpyMeHT Moxe fla bm noMorHe BtB cpopMa/iHaTa oueHKa Ha 
KanecrBO Ha KOfla v\ fla bm noflCKa>Ke kom nacm ot npM/io>KeHMeTO bm ca HaM- 

yfl3BMMM. 

CruiseControl.NET 

CruiseControl.NET ( http://ccnet.thouqhtworks.com/ ') e MHcrpyMeHT 3a Henpe- 
KtCHaTa MHTerpauMfl (continuous integration) no BpeMe Ha pa3pa6oTKaTa. Tom 
cneflM 3a npoMeHM b xpaHM/iMmeTO etc cope KOfla m luom OTKpMe TaKMBa, 



968 nporpaMnpaHe 3a .NET Framework (tom 2) 

aBTOMaTkmHO M3B"bpujBa MHTerpaunoHeH build v\ Ba/iMflMpa npoMeHMTe. 
Pa3pa6oT4MUMTe MoraT fla 6"bflaT He3a6aBHO M3BecTflBaHM no pa3/iMHHM 
Ha^MHM 3a TeKymnfl craTyc Ha CMcreMaTa. CruiseControl.NET e MHTerpupaH c 
mhoto ot nony/iapHMTe MHCTpyMeHTM 3a kohtpo/i Ha BepcunTe, build, TecmaHe 
m MeTpuKM. Hpe3 npaKTMKaTa Ha HenpeKbCHaTa MHTerpauna, MO>KeTe fla 
M36erHeTe mhoto ot npo6/ieMMTe, xapaicrepHi/i 3a eKunHaTa pa3pa6oTKa. 

riopTajiM 3a MHcrpyMeHTii 

3a OTnpaBHa TOUKa npn TbpceHe Ha flpyrn noMOiflHn .NET cpeflCTBa MO>KeTe fla 
M3no^3BaTe nopTa/iM KaTO SharpToolbox ( http://sharptoolbox.com/ ). 
SharpToolbox e Cb6pa/i M3K/iK>nMTe/iH0 6oraTa KO.neKu.Mfl c MHcrpyMeHTM, 
KaTeropn3npaHM no HanMH yqo6eH 3a npeTtpcBaHe. TaM MO>KeTe fla OTKpneTe 
noflxoflfliflu peiueHMfl 3a ro/iHMa nacr ot npeflM3BMKaTe/icrBaTa, c komto me ce 
c6/i"bCKaTe. IHe MO>xeTe v\ 3HanMTe/iH0 fla o6oraTMTe cni/icbKa cm ot cpeflCTBa, 
komto me bm acMCTMpaT b pa3pa6oTKaTa Ha .NET npM/io>KeHMfl. C no3HaHM*rra 
bm 3a pa3/iMHHMTe MHCTpyMeHTM me MOxeTe fla peiuaBaTe npo6/ieMMTe no 
ecpeKTMBHM Ha^MHM m me M36erHeTe onacHOcrra, M3Ka3aHa b CTapaTa 
noroBopKa "Ako MMaTe caMO nyK b ptKa, bcmuko ocraHa/io Bm ce BM>Kfla KaTO 
nMpoH". 

Ynpa>KHeHM5i 

1. KaKBO e .NET Reflector? 3a iokbo c/iy>KM? 

2. C .NET Reflector fleKOMnM/lMpaMTe K/iaca System. Collections. Hashtable 
m npoBepeTe KaKBO e yc/iOBMeTO 3a npeopa3Mep*iBaHe (resize) Ha xew- 
Ta6/iMu.a. Mo>KeTe nv\ fla v\3^v\ci\v\je no^3BaMKM .qeKOMnM/iMpaHMfl koa ko/iko 
ntTM me ce M3B"bpujM npeopa3MepsiBaHe npM ,qo6aBflHeTO Ha 10 000 e/ie- 
MeHTa nocneflOBaTe/iHO? 

3. 3a KaKBO cny>KM MHcrpyMeHTa FxCop? Kora Tpa6Ba fla ce M3no/i3Ba? 

4. C noMomTa Ha FxCop aHa/iM3MpaMTe aceM6/iMTaTa ot npaKTMnecKMsi npoeKT 
ot noc^eflHaTa r/iaBa Ha HacTO^maTa KHMra. HaMMpaTe nv\ npo6/ieMM? (IHe 
ce y^yflMM mhoto, aKO HflMa HMKaKBM!) 

5. 3a KaKBO cny>KM MHcrpyMeHTbT CodeSmith? Kora ce no/i3Ba? rioconeTe 
hako/iko npMMepa, b komto e yqanHO fla ce no/i3Ba CodeSmith. 

6. HanMiueTe Lua6/iOHM 3a CodeSmith, komto no 3aflafleH connection string 3a 
flocTtn flo SQL Server 6a3a flaHHM reHepMpa 3a BC^Ka Ta6/iMu.a ot 6a3aTa 
flaHHM MeTOfl 3a M3B/iMnaHe Ha bcm4km HeMHM 3anMCM, koato tm Bptma KaTO 
ADO.NET DataTable o6eKT. 

7. KaKBO npeflCTaB^ABaT unit TecroBeTe b cocpTyepHOTO MHxeHepcTBO? Kora 
ce no/i3BaT m KaKBO ce nocTMra npe3 tax? 

8. 3a KaKBO cny>KM MHcrpyMeHTbT NUnit? Kora ce no/i3Ba? KaK ce cb3flaBaT 
unit TecTOBe? 



HnaBa 28. riOMommi MHCTpyMeHTM 3a .NET pa3pa6oTHHun 969 

9. HanniueTe MeTOfl, komto no flafleH TeKCT HaMupa HaM-necro cpeiuaHaTa b 
Hero flyMa, a aKO ca hako/iko - ntpBaTa ot tax no a36yneH pefl. HanniueTe 
cepufl unit TecroBe, komto npoBepsiBaT fla/iM MeTOfltT pa6oTM KopeKTHO b 
pa3/iMHHM cnynaM CkiTyau.nn. 

10. KaKBO npeACTaB/iflBa TexHMKaTa "ziorMHr" b cocpTyepHOTO MHxeHepcTBO? 
Kora ce i/i3no/i3Ba? 

11.3a KaKBO cny>KM MHcrpyMeHTbT log4net? Kora ce M3no/i3Ba? KaKBM HMBa 
Ha novv\uv noflfltpwa? 

12. HanniueTe nporpaMa, koato rbpcn flafleH cpai/i/i Ha TBtpflna amck. flo6a- 
BeTe kbm Hea ziorep, komto 3ana3Ba bcmukm flupeKTopnn, komto ca 
HaMepeHM npn TbpceHeTO. 

13. KaKBO npeflCTaB^ABa KOHu.enu.M5Tra "object relational mapping"? Kora ce 
M3no/i3Ba? KaKBO ce nene/iM ot Hea? 

14.3a KaKBO cny>KM MHcrpyMeHTbT NHibernate? Kora ce M3no/i3Ba? 

15.C"b3flaMTe 6a3a ot flaHHM b SQL Server 3a onucaHne Ha fleMHOCTTa Ha 
Mara3MH 3a xpaHMTe/iHM ctokm. OcHOBHMTe Ta6/iMu.M b MO,qe/ia Ha flaHHMTe 
ca npoM3BOflMTe^n, npoflyKTM, K/iMeHTM v\ npofla>K6n. flecpMHupawTe C# 
K/iacoBe, komto cbOTBeTcmaT Ha Ta6^nuMTe ot 6a3aTa flaHHM. flecpMHM- 
paMTe XML mapping cpaw/iOBe, komto 3aflaBaT cbOTBeTCTBua Me>Kfly 6a3aTa 
flaHHM m C# K/iacoBeTe. KoHCpurypupawTe Nhibernate 3a flocrbn ao 6a3aTa 
flaHHM npe3 flecpMHupaHMTe C# K/iacoBe v\ cbOTBeTCTBMATa mm c 6a3aTa 
flaHHM. Pea^M3MpaMTe npe3 craHflapTHMTe K/iacoBe ot NHibernate ochob- 
HMTe onepauMM c flaHHMTe: M3B/iMnaHe Ha cnMCbK, ,qo6aBflHe, npoMAHa m 

M3TpMBaHe Ha npOM3BOflMTe^M, npOflyKTM, K^MeHTM m npofla>K6M. 

16. KaKBO npeflCTaB^ABaT cpeflCTBaTa 3a nocrpoyiBaHe (build) Ha npM/io>Ke- 

HMfl? KaKBM fleMCTBMfl BK/lKDUBa nOCTpOHBaHeTO Ha eflMH npoflyKT? 

17.3a KaKBO cny>KM MHcrpyMeHTbT NAnt? Kora ce M3no/i3Ba m c KaKBa ue/i? 

18. Pea/iM3MpaMTe NAnt CKpMnT, komto M3B"bpujBa KOMnM/iau.M*i m deployment 
Ha ye6 ycnyra m ye6 npM/io>KeHMe Btpxy OTfla/ieneH IIS CbpBtp, flOCTbneH 
no FTP. 



Eth 



HPC 



% % L nO PH3PHEQ TUB HB CO (Ty£P 



fr^ 



HAMMOHA/1HA AKAflEMIIfl no PA3PAEOTKA HA COOTYEP 



JleKTopiiTe 

» CBeTflHH HaKOB e 

aBTop Ha fleceTKM TexHi/mecKi/i 

ny6/lMKai4MM M HflKO/lKO KHMTM, 

CBtp3aHM c pa3pa6oTKaTa Ha 
cocfrryep, 3apaflM KoeTO e Tbp- 

CeH rieKTOp l/l KOHCy/lTaHT. 

Tom e pa3pa60TMMK c flt/iroro- 
fluiueH onMT, pa6oTnri no pa3- 
HOo6pa3HM npoeKTM, pea/in3M- 

paHM C pa3/lMMHM TeXHO/10n/|l/l 

(.NET, Java, Oracle, PKI m pp.) 
m npenoflaBaTeri no cbBpeMeH- 
hm cocf)TyepHM TexHO^oruM b CY 

"CB. KjlMMeHT OxpMflCKM". 

npe3 2004 r. e HOCMTe/i Ha 
HarpaaaTa "fliKOH ATaHacoB" 
Ha npe3MfleHTa Ha Et/irapi/ia 
Teopru ritpBaHOB. 

CBeT/iMH HaKOB ptKOBOflu o6y- 
MeHneTO no Java TexHO/iornn b 
AKaaeMMflTa. 

» MaprHH KynoB e 

cocfrryepeH MHweHep n kohcv/i- 
TaHT c flt/iroroflniueH onuT b 
M3rpa>KflaHeTO Ha peweHi/isi c 
n/ia-rrJpopMi/iTe Ha Microsoft. 

MapTMH e onuTeH MHCrpyKTop m 
cepTM0MunpaH ot MaMKpoco0T 
pa3pa6oTMMK no nporpaMi/ue 
MCSD, MCSD.NET, MCPD m 
MVP m MexflyHapofleH /leicrop b 
CBeTOBHaTa opraHki3aui/i5i Ha 
.NET noTpe6nTe^CKMTe rpynw 
IN ETA. 

MapTMH KynoB ptKOBOflki o6y- 
HeHkieTO no .NET TexHO/iorm/i b 
AKafleMMsua. 



AKafleMMATa 

» Hai4MOHa/iHa aKaAeMim no pa3pa- 
6oTKa Ha cocpTyep (HAPC) e ueHTbp 
3a npo0ecnoHa/iHO o6yHeHi/ie Ha co0- 
TyepHM cneui/ia/ii/icn/i. 

» HAPC npoBewfla BE3n/lATHO Kyp- 
coBe no pa3pa6oTKa Ha co0Tyep 1/1 CbB- 
peMeHHM co0TyepHM TexHO/iornn b Co- 
0i/ia 1/1 flpyrn rpaflOBe. 

» npefl/iaraHM cneu,i/ia/iHOCTi/i: 

â–  BiaBeAeHMe b nporparmpaHeTO 
(c e3Mu,MTe C# m Java) 

â–  Core .NET Developer 

â–  Core Java Developer 

» KanecTBeHO o6yneHiie c mhoto 

npaKTMHecKM npoeKTM 1/1 i/mfli/iBi/ifly- 
a/iHO BHMMaHne 3a BceKi/i. 

» TapaHTMpaHa pa6oTa! TpyaoB ao- 
roBop npi/i nocTbnBaHe b AKafleMi/iflTa. 

» EE3n/1ATHO! 

Ym/iTe 6e3njiaTHO BtB BtBefli/iTe/iHi/iTe 
KypcoBe m no cn/ineHfli/ii/i ot pa6oTOfla- 
Te/iMTe b c/ieflBam,MTe Hi/ma. 



http://academy.devbg.org 



T/iaea 29. npaKTimecKii 

npoeKT 



ABTOpii 

l/lBafi/lO XpMCTOB 

Toaop Ko/ieB 
BpaHMMnp AHre/iOB 

l/lBaM/10 flMMOB 

He06X0flMMM 3HaHM51 

- no3HaHMfl 3a apxnTeKTypaTa Ha .NET Framework 

- no3HaHMfl 3a e3MKa C# 

- no3HaBaHe Ha o6eKTHO-opneHTnpaHOTO nporpaMnpaHe b .NET 
Framework 

- no3HaHMfl 3a ynpaB/ieHkie Ha ki3K/iioneHMflTa b .NET Framework 

- no3HaHMfl 3a fle^eraTMTe v\ cb6nTHflTa b .NET Framework 

- no3HaHMfl 3a MacuBMTe m KO^eKUMMTe b .NET Framework 

- no3HaHMfl 3a CMMBO/iHMTe HM30Be b .NET Framework 

- no3HaHMfl 3a bxoa m m3xoa b .NET Framework 

- Ochobhm no3HaHM5q 3a pa6oTa c XML 

- no3HaHMfl 3a pa6oTa c pe/iaukiOHHM 6a3ki ot ashhm m MS SQL Server 

- no3HaHM5q 3a Aocrbn ao ashhh c ADO.NET 

- no3HaHi/i*i 3a M3rpa>KAaHe Ha rpacJDwueH noTpe6kiTe/iCKM MHTepc|DeMC c 
Windows Forms 

- ri03HaHMfl 3a M3rpa>KAaHe Ha ye6 yc/iyrkue c ASP.NET 

- ri03HaHMfl m yMeHMfl 3a M3rpa>KAaHe Ha ye6 npn/io>KeHkifl c ASP.NET 

Cb/vbpwaHMe 

- CucTeMa 3a 3ano3HaHCTBa b MHTepHeT - bm3ma 

- OyHKunoHa^Ha cneum$>kiKauwfl 

- OyHKUklOHa/lHM B"b3M0>KH0Câ„¢ Ha CMCTeMaTa 

- CuTeMHa apxnTeKTypa 

- C/ioi/i 3a ashhh 

- En3Hec cnov\ - ASP.NET ye6 yc/iyraTa 



972 nporpaMnpaHe 3a .NET Framework (tom 2) 

- K/ikieHTCKki enow - Windows Forms GUI ripi/i/iowei-meTO 

- K/iweiHTCKki enow - ASP.NET ye6 npi/i/io>KeHi/ieTO 

- BHeAP^BaHe Ha cwcreMaTa 

B Ta3M TeMa ... 

B HacToaiuaTa TeMa me pa3r/ie,qaMe iok MO>KeM fla npn^OKMM Ha npaKTMKa 
TexHO/iornnTe, c komto ce 3ano3HaxMe b npeflxoflHkiTe TeMM. IHe cm nocraBMM 
3a 3a,qana fla pa3pa6oTMM eflMH cepno3eH npaKTwuecxki npoeKT - cwcreMa 3a 
3ano3HaHCTBa b MHTepHeT c bbsmokhoct 3a ye6 v\ GUI flocrbn. Ochobhoto e, 
<-ie TOBa He e npuMep, KaicbBTO 6nxTe Bv\p,env\ b noBeneTO khmtm. 

ripn pea^M3aunflTa Ha cwcreMaTa me npeMi/meM npe3 bcmukm cpa3M ot pa3pa- 
6oTKaTa Ha cocpTyepHM npoeKTu: aHa/iki3kipaHe v\ flecpMHupaHe Ha M3MCKBa- 
HMATa, M3roTBAHe Ha cucTeMHa apxnTeKTypa, npoeKTupaHe Ha 6a3a ot flaHHM, 
MMn^eMeHTaunfl v\ BHeflpaBaHe Ha cwcreMaTa. 

ripn M3roTBAHe Ha apxnTeKTypaTa me pa3fle/ikiM npn^OKeHneTO Ha Tpn c/ioa - 
6a3a ot flaHHM (koato me pea/ii/i3kipaMe c MS SQL Server 2000), 6n3Hec cnov\ 
(komto me pea/i M3kipaMe KaTO ASP.NET ye6 yc/iyra) v\ K/iweHTCKM c/iom (komto 
me pea/ii/i3kipaMe b flBe pa3HOBkiflHOCTki: ASP.NET ye6 npi/i/io>KeHkie v\ Windows 
Forms GUI npw/io>KeHi/ie). 



T/iaBa 29. npaKTunecKM npoeKT 973 



CucreMa 3a 3ano3HaHCTBa b 1/lHTepHeT - bm3m$i 

Ochobhmat motmb Ha noTpe6kiTe/iwTe fla ce peri/icrpi/ipaT b cawT 3a 3ano3- 
HaHCTBa e BepoflTHOcrra fla cpeiflHaT cpoflHa flyiua. noTpe6kiTe/ikiTe B^pBaT, 
ne luaHCbT fla HaMepsiT noflxoflami/ifl noBeK e 3HanwTe/iHO no-ro/iaM b cawTO- 
BeTe, b koi/ito MMa noBene perncTpupaHM noTpe6nTe/iw. B MOMeHTa MHTepHeT 

npOCTpaHCTBOTO Ce CbCTOM OT MHO>KeCTBO Ma/IKM CaMTOBe (C Ma/l"bK 6poki 

noTpe6nTe^n) v\ hako/iko caMTa etc 3Hani/iTe/iHO KO/ii/mecrBO perncTpupaHM 
noTpe6nTe^n. Ta3M cuTyauna MOTMBupa cb3flaBaHeTO Ha eflMHHa cwcreMa 3a 
3ano3HaHCTBa, o6eflMHflBaiua noTpe6kiTe/ikiTe Ha mhototo no-Ma/iKki caMTOBe. 

EflHa TaKaBa ci/icreMa He 6m Tp*i6Ba/io fla orpaHi/maBa BceKM, komto MCKa fla 
ce bk/ikdum fla pea/iki3kipa no onpe,qe/ieH HanwH caMTa cm. Hy>KHO e fla ce 
npeflocTaBM bbsmokhoct Ha bcm^km K/iweHTCKki ye6caMTOBe fla MoraT fla M3- 
no/i3BaT ycnyrwTe Ha ci/icreMaTa, He3aBMCMMO ot nporpaMHi/m e3MK, Ha komto 
ca pea^M3npaHM v\ n^aTCJDopMaTa, Btpxy koato ce ki3n"b/iH*iBaT. 

Ochobho cucTeMaTa Tpa6Ba fla npeflocraBfl b"B3mo>khoct 3a: 

- perncTpaunfl Ha hobm noTpe6i/iTe/iki; 

- TtpceHe Ha noTpe6i/iTe/ii/i no pa3/innHw KpnTepnn; 

- opraHM3npaHe Ha nacr ot noTpe6kiTe/iMTe Ha cwcreMaTa b KaTeropnn; 

- o6MAHa Ha c"bo6iueHMfl Me>Kfly noTpe6kiTe/iMTe; 

- 3ana3BaHe Ha bcm^km pa3MeHeHM cbo6meHMfl; 

- CTaTMCTMKa 3a noTpe6nTe^MTe. 

3a oiue no-/iecHO BK/iK>nBaHe b cwcreMaTa Tpa6Ba fla MMa v\ pea/iw3wpaHO 
K^neHTCKO npn^OKeHne, cbCToaiuo ce ot ye6 npw/io>KeHi/ie v\ GUI (flecKTon) 
npn^OKeHne. Ye6 npn^o>KeHneTO Tpa6Ba fla npeflocraBsi ocHOBHaTa cJDyHKuno- 
Ha/iHOCT, a GUI npn^OKeHneTO fla npeflocraBH ynecHeH flocTbn ao Haw-ki3no/i- 

3BaHMTe CJDyHKUMM Ha cucTeMaTa. 

Hakom cucTeMM 3a o6MHHa Ha c"bo6iueHMfl cbxpaHHBaT bci/iukm pa3MeHeHM 
c"bo6iueHMfl /ioio/iho Ha KOMniOTbpa Ha noTpe6kiTe/ifl v\ cbOTBeTHO npn bk/ik>h- 
BaHe b cucTeMaTa ot flpyr KOMniOTbp, noBeicbT HHMa flocTbn ao flwa/i03HTe, 
komto e npoBe/i. CwcreMaTa Tpa6Ba fla peiuaBa v\ to3m npo6/ieM. 

KaKBO e 4>yHKi4MOHa/iHa cnei4M4>MKai4ii5i? 

OyHKunoHa^HaTa cneunc|DMKauMfl e flOKyMeHT, komto onucBa b p,ejdtv\j\v\ 
c|DyHKUMOHa^HMTe M3MCKBaHMfl KtM ci/icreMaTa (Software Requirements 
Specification - SRS). HanncBaHeTO Ha (fcyHKui/iOHa/iHa cneu.mfcm<au.km noflno- 
Mara M3rpa>KflaHe Ha o6iua bm3ma 3a coc|DTyepHkifl npoflyKT Me>Kfly K/iweHTkiTe v\ 
pa3pa6oT4MUMTe. Ta noMara v\ 3a no-fleTaw/iHO M3flCHABaHe Ha TOBa KaKBO 
MO>Ke m 6m Tpsi6Ba/io fla npaBM npoflyKTbT. 



974 nporpaMnpaHe 3a .NET Framework (tom 2) 

C/iefl npofl"b^>KMTe^HM pa3roBopn v\ yTOHHABaHe Ha M3MCKBaHMflTa, o6cb>KflaHe 
Ha pa3/ikmHki BapnaHTM v\ n peA.fi o>xe huh flocTurHaxMe ao cpyHKuwoHa/iHa cne- 

UMCpMKaUMfl. 

QyHKLJMOHa/lHM Bl>3MO>KHOCTM Ha CMCTCMaTa 3a 

3ano3HaHCTBa 

fla ce pea/iki3kipa cwcreMa 3a 3ano3HaHCTBa no 1/lHTepHeT. CwcreMaTa Tpa6Ba 
p.a ce c-bCTOM ot ASP.NET-6a3npaH ye6cai/iT 3a 3ano3HaHCTBa v\ Windows 
Forms-6a3i/ipaHO K/iweHTCKO npi/i/io>KeHkie. Tpa6Ba fla ce pea/iki3kipa cpyHKu.no- 
Ha/iHOcr 3a perncTpaunfl Ha noTpe6kiTe/iw, TbpceHe Ha noTpe6wTe/ii/i v\ o6M*iHa 
Ha c"bo6iueHMfl Me>Kfly noTpe6MTe/ii/iTe. 

OyHKLtiiOHa/iHii bid3mo>khoctm Ha ASP.NET ye6 
npn/io>KeHHeTO 

1. YnpaB/ieHMe Ha noTpe6nTe/iMTe h TexHMTe npocpmiM: 

1.1. MAeHTMCpMKaunfl Ha noTpe6wTe/i (login, logout): 

- rioceTMTe^MTe Ha cawTa (6e3 aBTeHTHKauna) i/maT Aocrbn caMO ao 
cpopMaTa 3a perncTpauna. 

- MAeHTMCpnunpaHMTe (B/ie3/iMTe ycneujHO b cwcreMaTa) noTpe6i/iTe/in 

MMaT flOCTtn flO BCM4KM CpyHKU.klOHa/lHkl B"b3MO>KHOCTM 6e3 B"b3MO>K- 

HOCTMTe 3a aAMMHMCTpaunfl Ha cucTeMaTa. 

2. noTpe6MTesiCKM npocpM/i 

2.1.3a BceKM noTpe6i/iTe/i ce na3i/i npocpi/i/i, komto cbAtpwa c/ieAHaTa i/ih- 
cpopMaunfl: 

- noTpe6kiTe/iCKO MMe (no3BO/ieHki ca bcmukm noTpe6kiTe/iCKki MMeHa 

C-bCTaBeHM OT 6yKBM, UMCppM M CMMBO^MTe "-", ".", "_", 6e3 

3ana3eHOTO noTpe6wTe/iCKO MMe "Administrator"); 

- napo/ia; 

- e-mail aApec (Heo6xoAHMO e B"bBe>KAaHeTO Ha Ba/ikiAeH e-mail 
aApec); 

- MMe i/i cpaMM/iwfl, rpaA, no/i, po>KAeHa AaTa; 

- CHMMKa - He e 3aA"b/i>KkiTe/iHa. 

2.2. CwcreMaTa no3BO/iflBa Ha BceKM noTpe6i/iTe/i p,a peAaKTupa co6cTBeHMfl 
cm npocpw/i. 

3. PerMCTpauMii Ha hob noTpe6nTe/i 

3.1. ripn perncTpaunfl Ha hob noTpe6i/iTe/i tom B"bBe>KAa u.*i/iaTa MHCpop- 
Maunfl 3a npocpw/ia cm. 



T/iaBa 29. npaKTunecKM npoeKT 975 

3.2. BtBefleHMAT e-mail aflpec ce yqocTOBepyiBa npe3 M3npaiuaHe Ha 
npon3BO^HO reHepupaHa napo/ia (Ha noTpe6kiTe/ifl He ce npeflocraBfl 
Bt3MO>KHOCTTa caM p,a M36epe napo/ia). 

3.3. 3a 3aiunTa ot aBTOMaTkmHa perncTpauna npn perwcrpaukiflTa Ha 
noTpe6kiTe/i flUHaMM^HO ce reHepupa KapTMHKa, cbAtpwama TpyAHa 3a 
neTeHe noc/ieflOBaTe/iHOcr ot hako/iko umc|dpm, komto noTpe6i/iTe/iyrr 
Tpa6Ba fla BtBefle (m TaKa flOKa3Ba, ne He e 6ot). 

4. C/ieAeHe Ha aKTMBHOCT 

CwcreMaTa cnep,w aKTMBHOcrra Ha BceKM noTpe6kiTe/i, KaTO 3anncBa AaTaTa v\ 
naca Ha nocneAHOTO My AewcTBue. 

5. TbpceHe Ha noTpe6nTe/i no pa3/iMHHM KpMTepMM 

5.1. TtpceHeTO ce M3B"bpujBa no ci\ep,uv\je KpnTepnn: rpaA, no/i, Bt3pacT. 
npeAOCTaBfl ce bbsmokhoct 3a TbpceHe caMO no eAHH ot KpnTepnnTe 
v\nv\ no npon3BO^Ha KOM6nHaunfl ot tax. 

5.2. ripn bcako TbpceHe pe3y/iTaTMTe ce copTupaT no 6pow pa3r/ie>KAaHkifl 
Ha npoc|DM^a. 

5.3. Ako pe3y/iTaTi/iTe ot TtpceHeTO ca noBene ot 10, ce Aasa bbsmokhoct 
3a crpaHkipaHe v\ HaBurauna Me>KAy CTpaHnunTe (BM3ya/iM3kipaT ce no 
10 pe3y/iTaTa Ha crpaHwua). 

5.4. noTpe6nTe^flT MO>xe p,a pa3r/ie>KAa npoc|Di/i.na Ha BceKM noTpe6i/iTe.n 
no/iyneH KaTO pe3y/iTaT ot TtpceHeTO v\ no we/iaHwe p,a Ao6aBH to3m 
noTpe6i/iTe/i b "cnncbK c npkiflTe/iw". 

6. noAAP"b>KKa Ha "cnMCbK c npMJue/iM" 3a bcckm noTpe6wTe/i 

6.1.3a BceKM noTpe6wTe.fi ce noAA^pxa cnwcbK ot /ik)6mmm noTpe6kiTe/in, 
HapeneH "cnwcbK c npkiflTe/iw". CnwcbicbT e opraHM3npaH b KaTeropnn 
caMO Ha eAHO hmbo. 

6.2. ripn cb3AaBaHe Ha hob npoc|Di/i/i b "cnncbK c npi/iflTe/iw" ce cb3AaBa 
aBTOMaTM^HO KaTeropi/iflTa "Hobm npMflTe/iw". 

6.3. noTpe6kiTe/i*iT MO>Ke p,a peAaKTupa KaTeropnnTe ot cboa "cnwcbK c 
npi/mTe/iw". no3BO/ieHi/i ca cnep,Hv\je AeMCTBua: 

- Ao6aBAHe Ha KaTeropnn; 

- M3TpnBaHe Ha KaTeropnn, npn KoeTo: 

- BCM4KM 3anncn b KaTeropwyiTa ce M3TpnBaT; 

- He ce no3BO/iflBa M3TpnBaHeTO Ha KaTeropn^Ta "hobm koh- 
TaKTu"; 

- npoMAHa Ha MMeTO Ha KaTeropna. 

6.4. noTpe6nTe^flT MO>xe p,a peAaKTupa cboh "cnwcbK c npkiflTe/ii/T npe3 
c^eAHMTe AeMCTBua: 



976 nporpaMnpaHe 3a .NET Framework (tom 2) 

- Ao6aBflHe m M3TpnBaHe Ha noTpe6i/iTe/iw ot "cnwcbK c npv\f\jenv\" ; 

- Ao6aBflHeTO Ha "npkiflTe/iw" CTaBa caMO b hakoh ot Bene 
cbiuecTByBaiunTe KaTeropnn (eflkmcTBeHO npe3 cpyHKUkiOHa/iHOcrra 
3a TtpceHe Ha noTpe6i/iTe/i); 

- M3TpnBaHeTO Ha noTpe6kiTe/i craBa c noTB"bp>KfleHkie; 

- npeMecTBaHe Ha noTpe6kiTe/iki ot eflHa KaTeropua b flpyra. 

7. Pa3r/ie>KflaHe Ha npocpMsm 

BceKM noTpe6i/iTe/i Moxe fla pa3r/ie>Kfla npocpw/ikiTe Ha noTpe6nTe/iMTe ot cboh 
"cnncbK c npi/mTe/iki", KaKTO v\ npocpw/iMTe Ha noTpe6kiTe/ikiTe, komto e HaMe- 
pn/i 4pe3 TbpceHe. 

8. 06M$iHa Ha cbo6meHMfl mokay noTpe6MTesiMTe 

8.1. BceKM MAeHTMCpnunpaH noTpe6kiTe/i MO>xe fla B/iM3a b pe>KMM Ha 
Awa/ior c BceKM noTpe6nTe/i ot cboh "cnwcbK c npwflTe/iki" (MO>xe v\ c 

HflKO/IKO eflHOBpeMeHHO). 

8.2. B pe>KMM Ha flkia/ior noTpe6kiTe/i*iT MO>Ke fla M3npaiua Ha flpyrna Ch>o6- 
meHMfl m eflHOBpeMeHHO c TOBa fla Ha6/iK)flaBa cnwcbKa c nocneflHMTe 
50 c"bo6iueHMfl, o6MeHeHM Me>Kfly flBaMaTa. To3m cnwcbK ce o6HOBHBa 
Ha BceKM 5 ceKyHfln. 

8.3. He e 3afl"b/i>KkiTe/iHO aKO eflMH noTpe6kiTe/i e b pe>KMM Ha flkia/ior c 
flpyr, flpyrnflT Cbu\o fla e b pe>KMM Ha flkia/ior c ntpBMfl. 

8.4. M3npaiuaHeTO Ha cbo6meHkifl e no3BO/ieHO flopn aKO no/iynaTe/isiT He e 

B/lfl3"b/l B CMCTeMaTa B flafleHMfl MOMeHT. 

8.5. 3a bcako c"bo6iueHne ocBeH TeKCTa My ce na3M flaTa v\ nac Ha 
M3npaiuaHe. 

8.6. Ako ce no/iyni/i Cbo6meHkie ot noTpe6i/iTe/i, komto He e ot "cnwcbKa c 
npi/mTe/ii/T, to3m noTpe6i/iTe/i ce flo6aBH aBTOMaTMUHO b KaTeropi/mTa 
"hobm npwflTe/iki". 

8.7. ripn no/iynaBaHe Ha hobo cbo6meHwe, M3npaTeHO ot flpyr noTpe6wTe/i, 
aKO MMa OTBopeH flua^or Me>Kfly flBaMaTa, c"bo6iueHneTO ce BM3ya- 
/ii/i3npa b Hero, a b npoTMBeH c/iynaw b "cnwcbKa c npuflTe^n" 3a 
cbOTBeTHkia noTpe6kiTe/i ce noflBABa cneuwa/iHa nHflMKauna 3a naKamki 
c"bo6iueHMfl. 

9. AAMMHMCTpauHn Ha cwcreMaTa 

9.1. AflMMHMCTpaTMBHaTa noflcucTeMa no3BO/iflBa flocTbn caMO Ha aflMMHM- 
CTpaTopa Ha cwcreMaTa npe3 noTpe6wTe/iCKO MMe v\ napo/ia. 

9.2. 3a MfleHTMCpMKaunfl ce no/i3Ba 3ana3eHOTO noTpe6wTe/iCKO MMe 
"Administrator". 



T/iaBa 29. npaKTunecKM npoeKT 977 

9.3. AflMMHUCTpaToptT MO>Ke fla M3TpnBa noTpe6kiTe/iki ot cwcreMaTa - npn 
M3TpnBaHe Ha noTpe6i/iTe/i ce M3TpnBaT bcmukm HeroBM flaHHM (npo- 

CpM/l, Cb06meHMfl H KOHTaKTM). 

9.4. AAMUHMCTpaToptT Mowe fla peflaKTupa npoc|DM/ikiTe Ha noTpe6kiTe/ikiTe. 

9.5. AflMMHUCTpaToptT MO>Ke fla M3B/ikma bcmukm pa3MeHeHM Cbo6meHi/ifl 
Me>Kfly npow3BO/iHki flBa noTpe6kiTe/ifl. 

10. CTaTMCTMKa 

10.1. 3a BceKM noTpe6kiTe/i ce na3M 6poa pa3r/ie>KflaHkifl Ha npoc|DM^a My 

flO MOMeHTa. 

10.2. BpoflT perncTpupaHM noTpe6kiTe/in e hy>kho fla ce noi<a3Ba Ha 
Hana/iHaTa crpaHkiua. 

OyHKLiiiOHasiHii bid3mo>khoctm Ha Windows Forms 
K/iiieHTCKOTO npiiJio>KeHiie 

1. l/lAeHTn4>iiKaL4Mfl Ha noTpe6nTe/i 

CucTeMaTa noflfltpwa kifleHTmfcm<au.kifl Ha noTpe6nTe/iwTe (login, logout) v\ 
no3BO^ABa AOCTbn caMO cnep, ycneujHa aBTeHTHKauna. 

2. TbpceHe Ha noTpe6nTe/i no pa3siMHHM KpMTepnM 

TtpceHeTO KaTO c|DyHKUMOHa^HOCT e eflHaKBO c TbpceHeTO b ye6-npw/io>KeHi/i- 
eTO, ho Bptifla caMO ntpBMTe 200 pe3y/iTaTa. 

3. YnpaB/ieHMe Ha "cnwcbK c npMJiTe/iM" 

noTpe6nTe^flT MMa flocrbn ao cboa "cnwcbK c npkiflTe/iw" v\ MO>Ke fla M3B"bpujBa 
c Hero BCM4KM fleMCTBMfl, komto MoraT fla ce M3B"bpujBaT ot ye6 npw/io>Ke- 

HkieTO. 

4. CMCTeMa 3a o6mch Ha Cbo6meHMfl 

noTpe6kiTe/ii/iTe MoraT fla B/iki3aT b pe>KMM Ha flkia/ior c noTpe6kiTe/ii/i ot cboa 
"cnnctK c npwflTe/ii/i" v\ fla o6MeHAT C"bo6iueHMfl c tax, iokto npn ye6- 
npn^OKeHneTO. 

HecbyHKMMOHaJlHM M3MCKBaHMfl KT»M CMCTeMaTa 3a 

3ano3HaHCTBa no 1/lHTepHeT 

1. l/l3MCKBaHM$i 3a ASP.NET ye6 npw/iOKeHMeTO 

ripn pea/iM3au.kifl Ha ASP.NET ye6 npn^OKeHneTO 3a cnynawTe, b komto ce 
M3MCKBa aBTeHTMKaunfl Ha noTpe6nTe^MTe Tpa6Ba fla ce no/i3Ba BrpafleHaTa b 
ASP.NET TexHO/iorwfl "Forms Authentication". 



978 



flporpaMnpaHe 3a .NET Framework (tom 2) 



2. kl3MCKBaHMfl 3a ABHHMTe 

Bcm4km flaHHM Ha cwcreMaTa Tpa6Ba fla ce cbxpaHABaT b 6a3aTa ot flaHHM. He 
ce AonycKa M3no/i3BaHe Ha flpyrw MexaHM3MM 3a cbxpaHeHkie Ha ashhh, KaTO 
HanpuMep cpai/i/iOBaTa cwcreMa. 

3. kl3MCKBaHMn 3a cwrypHocT Ha AaHHMTe 

Bcm4km napo/iw Tpa6Ba fla ce npeflaBaT bbb bma, b komto He MoraT fla 6"bflaT 
flupeKTHO npo^eTeHM (KOflnpaHn). 

4. XapflyepHM M3MCKBaHnn 

CucTeMaTa Tpa6Ba fla pa6oTM Ha CTaHflapTeH KOMmoTtp c 1GHz CPU, 256 
RAM, 1GB amckobo npocTpaHCTBO, Btpxy Windows OC. Ye6 npi/i/io>KeHkieTO 
Tpfl6Ba fla noflfltpxa Internet Explorer 5.0/6.0/7.0 v\ Mozilla Firefox 1.x. 

ApxMTeKTypa Ha ciicreMaTa 

IHe pea^M3npaMe ci/icreMaTa, M3no^3BaMKM K/iacwuecKa Enterprise apxn- 
TeKTypa, 6a3npaHa Ha MHorocnoeH MO,qe/i 3a pa3npefle/ieHw npw/io>i<eHkifl 
(MOfle/itT Ha .NET Enterprise npn/iOKeHMATa). To3m MOfle/i ce cbcrow ot: 

1. ripe3eHTauMOHeH c/iom (Front End) - noTpe6i/iTe/iCKi/i MHTepcpewc 
(Windows Forms v\ ASP.NET ye6 npn^OKeHna). 

2. Bn3Hec c/iom (Business Tier) - 6n3Hec /iori/iKaTa Ha cwcreMaTa (ASP.NET 
ye6 yc/iyra). 

3. C/iom 3a flaHHMTe (Back End) - flaHHkue Ha cwcreMaTa (6a3a flaHHM SQL 
Server). 






Web KnMeHT— 



Web 6pay3bp 



[1pe3eHTaqMOHeH enow 
/^"(Presentation Tier) 




Cnow 3a flaHHM 
/'(Back End) 



Ba3a ot flaHHM 



B M3no/i3BaHkifl TpwcnoeH MO,qe/i KOMyHUKaunaTa Me>Kfly OTfle/iHi/ue cnoeBe ce 
M3BtpujBa no npaBki/iOTO, ne BceKM cnov\ KOMyHMKupa caMO etc cbceflHi/m cm, 
KaKTO e yKa3aHO Ha cxeMaTa, T.e.: 



T/iaBa 29. npaKTunecKM npoeKT 979 

1. npe3eHTauMOHHMflT c/iom ynpaB/isiBa B3anMOAeMCTBneTO c noTpe6kiTe/ifl 
m M3npaiua 3aaBKM kbm 6n3Hec cnon. 3a6paHeHa e flupeKTHa komyhm- 
Kaunfl c 6a3aTa flaHHM, KaKTO v\ c flpym KOMnoHeHTM Ha npe3eHTa- 

UMOHHMfl C/IOM. 

2. 5n3Hec c/ioflT pea^M3npa pa6oTHMTe npouecu v\ onepaunnTe nap, 
flaHHMTe. Tom npeflocraBsi cbBKynHOcr ot 6n3Hec onepaunn Hafl flaHHMTe 
b cucTeMaTa v\ cm KOMyHMKupa c 6a3aTa ot flaHHM. 5n3Hec c/ioat 
KOMyHMKupa c 6a3aTa flaHHM m npe3eHTaunoHHMfl c/iom. 

3. C/ioat 3a flaHHM ce pea/iw3wpa ot pe/iau.MOHHa 6a3a ot flaHHM, b kohto 
AaHHMTe ce cbxpai-mBaT b Ta6/iMu.M c Bpt3KM Me>Kfly tax. C/ioat 3a flaHHM 
KOMyHMKupa caMO c 6n3Hec c/ioa. 

IHe M3no^3BaMe TpMC/ioi/iHaTa apxnTeKTypa 3apaflM Hei/maTa rbBKaBOCT v\ pa3- 
npefle/iei-iocT. rtBKaBOCTra Ha Ta3M apxMTeicrypa ce M3pa3flBa b TOBa, ne 
BceKM c/iom e MaKCMMa^HO caMOCTOATe^eH. ToBa flaBa b"B3mo>khoct BceKM c/iom 
ziecHO m cpaBHMTe/iHO He3aBMCMMO ot ocraHa/ikiTe fla 6"bAe pa3LunpflBaH v\ 
flopn noflMeHAH. OnaKBa ce ocBeH ye6 v\ GUI (flecKTon) fla MMa v\ Apyrn 
K^neHTM KtM ci/icreMaTa KaTO Flash npn^OKeHMa v\ Java an/ieâ„¢. MMeHHO 
MOiuTa Ha Tpwc/iOMHaTa apxnTeKTypa v\ M3no/i3BaHeTO Ha SOAP 6a3npaHa ye6 
ycnyra no3BO/iflBa TOBa fla 6"bfle ziecHO pea/iM3MpaHO b 6"bfleiue 6e3 npoM^Ha b 
6n3Hec c/ioa v\ c/ioa 3a flaHHM. 

Pa3npefle/ieHOCTra Ha TpMC/ioi/iHaTa apxnTeKTypa ot cboa CTpaHa no3BO/iflBa 
BceKM c/iom fla 6"bfle pa3no/io>KeH <$>M3MnecKM Ha OTfle/ieH KOMniOTbp v\ flopn fla 
ce M3rpaflM K/itcrep ot MHO>xecTBO KOMniOTpM 3a flafleH c/iom. no to3m HanMH 
npon3BOflHTe^HOCTTa Ha cucTeMaTa MO>Ke Ha npaKTMKa fla 6"bfle pa3LunpflBaHa 
HeorpaHM^eHO v\ fla noeMa Bee no-ro/ieMM HaTOBapBaHna. TaKa ce noKpuBaT 
M3MCKBaHMflTa Ha o^aKBaHOTO ro/iyiMO HaTOBapBaHe Ha CMcreMa OTTaicbB Tun. 

MMn/ieMeHTai4M5i Ha cucTeMaTa 

ripn Ha^MHaeiflMTe nporpaMMCTM ce Ha6/iK>flaBa TeHfleHunaTa fla 3anonBaT 
pa6oTaTa ot noTpe6MTe/iCKMH MHTepc|DeMC v\ M3rpa>KflaMKM noTpe6MTe/iCKM 
MHTepc|DeMC fla i/iMn/ieMeHTkipaT Hy>KHaTa mm <fcyHKu.MOHa/iHOCT. B o6lum*i c/iy- 
<~\av\ TOBa e norpeweH noflxofl. LU,e 3anonHeM M3rpa>KflaHeTO Ha CMcreMaTa ot 
6a3aTa flaHHM. C/iefl TOBa me M3rpaflMM ye6 yc/iyraTa. C/iefl KaTO MMaMe 
Hairb/iHO M3rpafleHa ye6 yc/iyraTa MO>xe fla ce pa6oTM napa/ie/iHO no Windows 
Forms v\ ASP.NET KJWAemme . 

Cjiom 3a flaHHM 

C/ioat 3a flaHHM e mactoto, KtfleTO ce cbxpaH^BaT flaHHMTe, Heo6xoflMMM Ha 
CMCTeMaTa fla c|DyHKUMOHMpa. ToBa MO>Ke fla 6"bfle TeKCTOB c|DaM^ KaTO XML 
(Extensible Markup Language) dpawn, CSV (Comma Separated Value) <fcaM/i m 

flp. npM nO-TO^eMM npM/10>KeHMfl M CMCTeMM, KOMTO M3MCKBaT Hafle>KflHO 

ctxpaHflBaHe Ha to/iamo KO^M^ecTBO MHCJDopMauMa e Heo6xoflMMO M3no^3Ba- 
HeTO Ha 6a3M ot flaHHM. Te ocMryp^BaT no-yflo6eH m onTMMM3MpaH Ha^MH 3a 



980 



flporpaMnpaHe 3a .NET Framework (tom 2) 



cbxpainei-ikie Ha flaHHMTe v\ no-6"bp3 flocrbn ao tax. 3a Hy>KAHTe Ha cwcreMaTa 
e M36paHa MS SQL Server 6a3a flaHHM. ripn^MHUTe 3a TOBa ca hako/iko: 

- SQL Server e cbpBtp 3a ynpaB/ieHi/ie Ha pe/iauwoHHki 6a3M ot flaHHM Ha 
Microsoft, komto MMa mhoto flo6pa noflflp"b>KKa b .NET Framework v\ e 
Haw-necTi/mT M36op Ha pa3pa6oT4MUMTe npn cb3AaBaHeTO Ha .NET 
peiueHMfl. 

- OnaKBa ce ci/icreMaTa 3a 3ano3HaHCTBa fla MMa mhoto noTpe6kiTe/iw v\ 
cneflOBaTe/iHO BucoKa HaTOBapeHOCT. Heo6xoflMMO e moluho cpeflCTBO, 
KoeTO p,a ctxpaHflBa to/iamo KO/iwuecTBO MHCpopMauna v\ p,a ocurypaBa 
HeMHaTa 6tp3a o6pa6oTKa. Ee3cnopHO TaKOBa e MS SQL Server m 3a 
TOBa e M36paH npn M3rpa>KflaHe apxnTeKTypaTa Ha cwcreMaTa. 

npoeKTMpaHe Ha 6a3aTa a^hhh 

Ea3aTa AaHHM ce CbCTOM OT cefleM Ta6/lkmn: Users, AdminCredentials, 
Messages, Categories, Friends, Pictures, ExceptionsLog. ETO K3K kl3nne>K- 

fla MOfle^tT Ha p,aHHv\je: 



Friends 



ID 

CategorylD 

FriendUserlD 



Categories 

ID 

UserlD 

CategoryName 

IsNewFriendsCategory 



Users 


[7 


ID 




UserName 




MdSPassword 


— 


FullName 
Email 
BirthDate 
Town 


— 


Gender 

VisitorsCount 

LastActivity 



Messages 


_i 


ID 
UserlDFrom 




UserlDTo 




TimeSent 




MessageText 




IsNew 



ID 

UserlD 

PictureBytes 



ExceptionsLog 


_! 


ID 
ExceptionType 




Message 




InnerExceptions 




StackTrace 




SourceObject 




SourceMethod 




Additionallnformation 




[Date] 



AdminCredentials 



ID 

UserName 

MdSPassword 



Eto KpaTKOTO onucaHne Ha BC^Ka ot tax: 

- users - cbfl"bp>Ka MHCpopMaunfl 3a noTpe6nTe/iMTe Ha cwcreMaTa. B Hen 
ce ctxpaHflBaT iokto noTpe6kiTe/iCKOTO MMe v\ MD5 xeiua Ha napo/iaTa 
My, TaKa v\ /lwnHMTe ashhh Ha 6a3aTa, Ha komto ce ocbmecTBHBa 
TtpceHeTO Ha noTpe6kiTe/iw b cucTeMaTa. 

- AdminCredentials - nOTpe6klTe/lklTe Ha CMCTeMaTa, KOMTO ca aAMM- 

HMCTpaTopn ca OTae/ieHki b OTfle/iHa Ta6/ii/iua, 3aiuoTO 3a tax He e Heo6- 
xoflMMa AOirb/iHkiTe/iHa ziwuHa MHCpopMauna, KaKTO 3a ocraHa/iMTe 
noTpe6kiTe/iw. 

- Messages - cwvbpwa c"bo6iueHMflTa, komto ce pa3MeHAT Me>Kay noTpe6n- 
Tei\v\Te KaTO ce na3M ot koto m 3a koto e cbo6meHkieTO, a ctiuo TaKa 
p,anv\ e hobo. 

- categories - cwvbpwa KaTeropnnTe c npwflTe/iw Ha noTpe6nTe^MTe Ha 

CMCTeMaTa. MHTepeCHO no/ie B Ta3kl Ta6/lMUa e IsNewFriendCategory. 

To e cp/iar, komto noKa3Ba fla/ii/i KaTeropnaTa e HopMa/iHa v\nv\ e TaKaBa, 
b koato ce 3anncBaT bcmuki/i hobm npwflTe/iki Ha noTpe6kiTe/i*i. 



T/iaBa 29. npaKTunecKM npoeKT 981 

- Friends - cbfl"bp>Ka npuflTe^MTe Ha noTpe6kiTe/iMTe b cwcreMaTa. Ta6- 
/lwuaTa ce cbcroki ot Tpn no/ieTa: MfleHTnc|DMKaTop (id) Ha 3annca b 
Ta6/inuaTa, id Ha KaTeropn^Ta, kbm kohto npi/mafl/iewi/i to3m npi/mTe/i v\ 
noTpe6nTe^CKOTO id Ha npwflTe/ifl. 

- Pictures - cbfltpwa CHMMKMTe Ha noTpe6kiTe/ikiTe KaTO MacuB ot 
6awTOBe. 

- ExceptionsLog - npeflcraB/iflBa log c BCM4KM M3K^K)4eHMfl b ye6 ycny- 
raTa. 

MMn/ieMeHTMpaHe Ha sioriiKaTa Ha hhbo 6a3a aaHHM 

OcHOBeH noflxofl npn MMn/ieMeHTaui/iJiTa Ha jioniKaTa Ha hmbo 6a3a ot flaHHM 
e, ne AOCTtntT ,qo flaHHMTe CTaBa caMO npe3 3ana3eHM npoueflypw. TaKa ce 
nocTura yeflHaKBABaHe v\ ce o6oco6siBa oiue efli/m c/iom Ha hmbo 6a3a ot 
AaHHM, komto noBmuaBa hmboto Ha a6cTpaKunfl m y/iecHABa flo6aBAHeTO Ha 
HOBa c|DyHKUMOHa^HOCT m/im npoMeHAHeTO Ha CTapa TaKaBa b K/iweHTCKOTO 
npn^OKeHne (ye6 ycnyraTa). 

BcflKa 3ana3eHa npoueflypa M3n"b/iH*iBa eAHa npocTa 3aaBKa. 3aTOBa MO>xe fla 
ce pa3rpaHM4aT HaM-o6mo neTwpw Tuna 3ana3eHM npoueflypn: 3a select, 

Insert, Update M Delete. riOHTkl BMHarM flafleHa 3aflBKa ce l/l3ITb/lHflBa Btpxy 

eflHa Ta6/ikiua, KaTO ue/iTa e ua/iaTa 6n3Hec /iorm<a fla ce M3B"bpujBa ot ye6 
yc/iyraTa, a 3ana3eHMTe npoueflypw fla pea/iki3wpaT caMO ocHOBHMTe onepa- 
Umm. TaKa 3ana3eHMTe npoueflypn no Hi/iKaicbB HanwH He 3HaaT KaKBa cneun- 
c|DkmHa /iorm<a me ce pea/iki3kipa b ye6 ycnyraTa. CbmeBpeMeHHO Te npefloc- 
TaBAT eAHa Ao6pa a6cTpaKunyi, npe3 koato ye6 ycnyraTa MO>xe ziecHO fla 
M3B"bpujBa 6a30BMTe onepaunn cflaHHM, komto ca v\ Heo6xoflMMM. 

Eto m KOfla Ha eflHa ot mhototo 3ana3eHM npoueflypn: 



ALTER PROCEDURE spU_ChangeCategoryName 

( 

@ID int , 

@CategoryName varchar (50) 



AS 



UPDATE [Categories] 
SET 

[Categories] . [CategoryName] = SCategoryName 
WHERE 

[Categories] . [ID] = @ID 



RETURN @@ROWCOUNT 



Tfl npneMa flBa napaMeTbpa: 

- @id - id Ha KaTeropuflTa, Ha koato MCKaMe fla npoMeHMM MMeTo; 

- SCategoryName - HOBOTO MMe Ha KaTeropMflTa. 



982 nporpaMnpaHe 3a .NET Framework (tom 2) 

C/iefl KaTO 3aB"bpujn update 3aaBKaTa Btpxy Ta6/iwuaTa, 3ana3eHaTa npoue- 
Aypa Bptiua npoMeH/ikiBaTa @@rowcount, koato noKa3Ba 6poa peflOBe, komto 
ca ce npoMeHki/iki b pe3y/iTaT Ha 3asiBKaTa. Ako tom e Hy/ia, TOBa noKa3Ba, ne 
He cbmecTByBa KaTeropua c TaKOBa id v\ no to3m Hani/m 3acwnaMe, ne 
3ana3eHaTa npoueAypa e M3BMKaHa c rpeujHM apryMeHTM. To3m MexaHM3tM 3a 
Ba/iMAauwfl Ha apryMeHTMTe ce i/i3no/i3Ba b nonTki bcmukm 3ana3eHM 
npoueAypn ot Tun update v\ Delete, ripi/i 3ana3eHMTe npoueAypw ot Tun 
insert ce Bptiua scope_identity ( ) , KoeTO npeAcraB/isiBa MAeHTucpMKaTopa 
(ID) Ha HOBOAo6aBeHi/m 3annc. ToBa ce M3no/i3Ba, 3a p,a He ce npaBM 
Aon"b/iHi/iTe/iHa 3asiBKa 3a ki3B/ikmaHeTO My. 

OcraHa/ikiTe 3ana3eHM npoueAypn pa6oTAT Ha noAo6eH npuHunn KaTO rope 
M^KDCTpupaHaTa npoueAypa v\ umajennT MO>Ke caM p,a vv\ pa3r/ieAa v\ pa3ynw. 

CbxpaineHa npoueAypa 3a TbpceHe Ha noTpe6nTe/in 

TtpceHeTO Ha noTpe6i/iTe/iw b cwcreMaTa ce pea/ii/i3i/ipa ot ctxpaHeHaTa 
npoueAypa sps_searchusers, KOATO e Ma/iKO no-cno>KHa ot ocraHa/ikiTe: 



ALTER PROCEDURE spS_SearchUsers 
( 

SPagelndex int = 0, 
SPageSize int = 10, 
@Town varchar(50) = NULL, 
@Gender char(l) = NULL, 
SAgeFrom int = NULL, 
SAgeTo int = NULL, 
@GetAllResultsCount bit = 

) 

AS 

SET NOCOUNT ON 

DECLARE 

STownFilter varchar (50) , 
SAgeFilter varchar ( 100 ) , 
SGenderFilter varchar (50) , 
SConcatinator varchar (5) 

SET SConcatinator = ' ' ; 

SET STownFilter = ' ' ; 

SET @GenderFilter = ' ' ; 

SET SAgeFilter = ' ' ; 

IF( @Town IS NOT NULL ) 

BEGIN 

SET STownFilter = ' Town = @Town 
SET SConcatinator = ' AND ' ; 

END 



T/iaBa 29. npaKTunecKM npoeKT 983 



IF( SGender IS NOT NULL ) 
BEGIN 

SET @GenderFilter = @Concatinator + ' Gender = @Gender ' ; 

SET @Concatinator = ' AND ' ; 
END 

IF( (SAgeFrom IS NOT NULL) AND ( @AgeTo IS NOT NULL) AND SAgeTo > 

@AgeFrom ) 

BEGIN 

SET SAgeFilter = @Concatinator + ' DATEDIFF ( Year, BirthDate, 
getdate ( ) ) BETWEEN @AgeFrom AND @AgeTo ' ; 
END 

DECLARE SSql nvarchar ( 512 ) 
DECLARE @Where varchar(255) 

SET SWhere = ' ' 

IF ( @TownFilter <> ' ' OR SGenderFilter <> ' ' OR SAgeFilter <> 

' ' ) BEGIN 

SET SWhere = ' WHERE ' + @TownFilter + SGenderFilter + 
SAgeFilter + ' ' 
END 

IF ( SGetAllResultsCount = 1 ) BEGIN 

SET SSql = 'SELECT COUNT (ID) FROM Users ' + SWhere 
END ELSE BEGIN 

DECLARE SWhereConcatinator varchar(lO) 

IF (SWhere <> ' ') BEGIN 

SET SWhereConcatinator = ' AND ' ; 
END ELSE BEGIN 

SET SWhereConcatinator = ' WHERE ' ; 
END 

SET SSql = 'SELECT TOP ' + CAST ( SPageSize as varchar ) + 
' * FROM Users ' 

+ SWhere + SWhereConcatinator + ' ID NOT IN ( SELECT TOP ' 
+ CAST ( (SPageSize * SPagelndex) as varchar ) 
+ ' ID FROM Users ' + SWhere 

+ ' ORDER BY VisitorsCount DESC, ID ) ORDER BY 
VisitorsCount DESC, ID' 
END 

DECLARE SParametersList nvarchar (255 ) 

SET SParametersList = ' STown varchar (50), SGender char (1) , 
SAgeFrom int, SAgeTo int ' 

EXECUTE sp_executesql SSql, SParametersList, STown=STown, 
SGender=SGender, SAgeFrom=SAgeFrom, SAgeTo=SAgeTo; 



984 flporpaMnpaHe 3a .NET Framework (tom 2) 



RETURN @@ROWCOUNT 



OcBeH TbpceHeTO Ha noTpe6i/iTe/in, Ta3M npoueflypa MMa 3a 3a,qana v\ crpaHM- 
paHeTO Ha pe3y/iTaTi/iTe. To Tpa6Ba fla CTaHe Ha B"b3MO>KHO Haw-HMCKO hmbo b 
apxnTeKTypaTa, 3a fla 6"bfle M36erHaTa 3ary6aTa Ha cucTeMHM pecypcn, nopo- 
fleHa ot npeHacflHeTO Ha to/iam 6pow flaHHM Me>Kfly OTfle/iHMTe cnoeBe. 

OyHKunoHa^HOCTTa Ha Ta3M 3ana3eHa npoueflypa e pea/iki3kipaHa nocpefl- 
ctbom cbcraBAHeTO Ha flkmaMkinHa 3asiBKa. 3a fla 6"bflaT M36erHaTM aTaKM ot 
Tkina "SQL injection" Ta3M 3a*iBKa 6nBa M3n"b/iH*iBaHa c napaMeTpn npe3 
cpM3M4ecKO KOHKaTeHnpaHe Ha napaMeTpn3npaHM ctomhoctm b TeKCTa Ha 
3aaBKaTa. ToBa CTaBa etc SQL KOMaHflaTa execute, koato ki3n"b/iH5iBa 
BrpafleHaTa b MS SQL Server 3ana3eHa npoueflypa sp_executesql. Ta3M 
npoueflypa npneMa hm3 Ha 3aaBKaTa, koato fla M3n"b/iHi/i, hm3 c onucaHne Ha 
napaMeTpnTe Ha Ta3M 3aaBKa v\ caMMTe napaMeTpn, c komto ta fla 6"bfle 
M3n"b^HeHa. 

Bn3Hec en on - ASP.NET ye6 yc/iyraTa 

5n3Hec c/ioat Ha cwcreMaTa pea/iki3kipa ocHOBHaTa cpyHKui/iOHa/iHOcr Ha ewere- 
MaTa, t. Hap. "6n3Hec ziornKa", T.e. pa6oTHMTe npouecu v\ npaBki/iaTa 3a 
o6pa6oTKa Ha flaHHM, komto ctpBtptT M3B"bpujBa, 3a fla o6cny>Ki/i OTfle/iHMTe 

K/lkieHTM. 

flM3aMH cbo6pa>KeHM$i, CBi>p3aHM c ye6 ycnyraTa 

fln3aMH"bT Ha ye6 ycnyraTa e HanpaBeH c ue/i fla ocurypn MaKCMMa/iHa 

CtBMeCTMMOCT C K/lkieHTM pea/1 M3I/I pa HM Hpe3 pa3^M4HM e3MUM, M3n0^3BaiflM 

pa3^M4HM n/iaTCpopMM. ripuMep 3a TaKMBa n/iaTCpopMki, komto c ro/iaMa Bepo- 
athoct 6nxa ce M3no/i3Ba/ii/i b eflMH pea/ieH caMT 3a 3ano3HaHCTBa ca Java 
an/ieTMTe v\ Macromedia Flash npi/i/io>KeHkiflTa. 

3a fla ce noKpi/mT Te3M M3MCKBaHi/m npn npoeKTupaHeTO Ha cwcreMaTa ca 
B3eTM peflnua peiueHMfl, CB"bp3aHM c i/i36arBaHeTO Ha TexHO/iorww v\ npaKTMKn, 
komto ca cneuncpM4HM 3a .NET Framework v\nv\ He ce nofl"bp>KaT ot no-c/ia6w 
K^neHTM KaTO Macromedia Flash. Te3M peweHi/m ca c/ieflHMTe: 

- 3a BptiuaHe Ha pe3y/iTaTa ce ki3no/i3BaT ziecHkiTe 3a o6pa6oTKa Data 
Transport Object (DTO) o6eKTM BMecTO DataSet o6eKTM. 

- Pe3y/iTaTbT BtpHaT ot BceKM MeTOfl cbfltpwa MHCpopMauna 3a CTaTyca Ha 
M3n"b/iHeHwe Ha cbOTBeTHna MeTOfl, T.e. fla/ii/i tom e 6m/i M3n"b/iHeH 
ycneujHO v\nv\ e B"b3HMKHa/io M3K/iK)neHkie. ToBa 3aMecTBa npeflM3BMK- 

BaHeTO Ha M3K/lK)HeHI/lfl (SoapException) OT MeTOfla, TbM KaTO He 

BCM4KM n^aTCpopMM 6wxa rn o6pa6oTki/ii/i npaBi/i/iHO. 

- Pea/iki3kipaH e co6cTBeH MexaHM3"bM 3a ynpaB/ieHwe Ha cecnnTe. MfleH- 
TucpMKaToptT Ha cecwflTa ce npeflaBa KaTO o6mkhob6h apryMeHT Ha ye6 
MeTOflMTe, komto ro M3MCKBaT. ToBa ce Ha/iara nopaflu cpaKTa, ne 
ASP.NET cecuflTa e 6a3npaHa Ha 6mckbmtkm (Cookies), a Te He ce 



T/iaBa 29. npaKTunecKM npoeKT 985 



nofl"bp>KaT ot BCM4KM n/iaTcbopMki, komto ce npeflBM>Kfla fla 6"bflaT K/iweH- 
tm Ha ye6 ycnyraTa. 

- riopaflu ro^eMMfl o6eM ashhh, cbfltpwamw ce b CHMMKMTe, ce Ha/iara Te 
fla 6"bflaT npeflaBaHM KaTO noTOK. TexHMKMTe 3a pea/iki3i/ipaHe ca cneun- 
cbi/mHM 3a .NET Framework v\nv\ ca nacT ot Web Service Enhancements, 
komto He ce nofl"bp>KaT ot bcmukm Hy>KHM n/iaTcbopMi/i. ToBa Ha/iara 
pea^M3npaHeTO Ha . aspx crpaHkiua, koato fla Bptiua CHMMKMTe ioto 
noTOK m fla 6"bfle M3BMKBaHa KaTO o6mkhob6h pecypc npe3 HTTP 3a*iBKa. 

ApxMTeKTypa Ha ye6 ycnyraTa 

Eto KaK M3Me>Kfla fluarpaMaTa, koato BM3ya/iM3kipa OTfle/iHkiTe cnoeBe Ha ye6 
ycnyraTa v\ B3anMOfleMCTBneTO Me>Kfly tax: 

Web MeTOflM - cbacafla 



Web MeTOflM 



-Bn3Hec non/iKa- 




CTaTyc eHyiviepaL(MM 
us enumerations) 



Pe3ynTaTHM o6eKTM 
(Result objects) 



DTO o6eKTM 



KnacoBe 

MMnneMeHTMpaii^M 

6n3Hec norMKaTa 

(Managers) 



-CnoM 3a flocTtn flo flaHHM- 



06eKTM 3a npeHacflHe Ha flaHHM 
(Data Transfer Objects - DTO) 



riOMOll^HM 

KnacoBe 



KnacoBe 3a flocrtn flo 6a3aTa flaHHM 
(Data Access Layer (DAL) classes) 



J 



KaKTO ce BM>Kfla ot fluarpaMaTa, ye6 ycnyraTa e M3rpafleHa ot Tpn noflcnoyi: 
- cnov\ 3a Aocrbn ao flaHHn; 



986 nporpaMnpaHe 3a .NET Framework (tom 2) 

- 6n3Hec ziornKa; 

- cpacaAHM ye6 MeTOAM. 

CtiuecTByBaT v\ noMOiuHM (utility) K/iacoBe, komto npeAOcraBAT cpyHKu.MOHa/i- 
hoct 3a M3npaiuaHe Ha e-mail, xewi/ipaHe v\ t.h. Ta3M apxnTeKTypa e Hapy- 
ujeHa eAMHCTBeHO npn pea/iM3MpaHeTO Ha cpyHKUMOHa/iHOcrra 3a no/iynaBaHe 
CHMMKaTa Ha noTpe6MTe/i. B to3m cnynai/i 6n3Hec ziorMKaTa e eHKancy/iwpaHa b 
K/iaca Ha ASP.NET crpaHkiua, koato ce M3BMKBa AnpeKTHO, BMecTO b Manager 
K/iac, komto Aa 6"bAe BMKaH npe3 ye6 MeTOA- 

flM3aMH peiueHMn b ye6 yoiyraTa 

flocTbnvr ao AaHHMTe ce M3B"bpujBa ot c/ioh 3a Aocrbn ao ashhm. Tom ce 
escrow ot HAKO/iKO K/iaca, BceKM ot komto e OTroBopeH 3a Aocrbna ao eAMH 
TMn o6eKTM (eAHa Ta6/iMu.a) ot 6a3aTa ashhm. Te3M K/iacoBe npeAOcraBsiT 
MeTOAM, BceKM ot komto c/iy>KM 3a BMKaHe Ha ctxpaHeHa npoueAypa (stored 
procedure) ot 6a3aTa ashhm. Hakom ot Te3M MeTOAM npMeMaT KaTO apryMeHT 
MHCTaHUMfl Ha TpaH3aKUMfl b 6a3aTa ashhm. Ako 6"bAe noAaAeHa TpaH3aKUMa, 
to 3ana3eHaTa npoueAypa me 6"bAe M3irb/iHeHa b KOHTeKCTa Ha Ta3M 
TpaH3aKUMfl. C"b3AaBaHeTO m ynpaB/ieHMeTO Ha TpaH3aKUMMTe CTaBa ot MeTO- 
AMTe b c/ioyi 3a 6M3Hec ziorMKa. Ako He 6"bAe noAaAeHa TpaH3aKUMa, umato 
Bp"b3Ka KtM 6a3aTa ashhm p,a 6"bAe M3no/i3BaHa, MeTOAMTe 3a Aocrbn ao 

AaHHM CaMM C"b3AaBaT Bpt3Ka. 

MeTOAMTe 3a AOCTbn ao ashhm, ce/ieKTMpamM 3anMCM ot 6a3aTa ashhm Bpt- 
maT KaTO pe3y/iTaT T.Hap. o6eKTM 3a npeHOC Ha ashhm. Te3M o6eKTM MMaT 3a 
ue/i eAMHCTBeHO Aa c/iy>KaT 3a TMnM3MpaH KOHTeMHep Ha ashhm. Pe3y/iTaTHMTe 
o6eKTM ot CBOfl CTpaHa npeACTaB^ABaT crpyKTypM ot ashhm, cbAtpwamM 
o6eKTM 3a npeHOC m MHCpopMauMa 3a craTyca Ha pe3y/iTaTa KaTO ctomhoct ot 
cbOTBeTHMfl M36poeH TMn (enumeration). To3m CTaTyc noKa3Ba, ne MeTOAt>T e 
6m/i M3n"b^HeH ycneujHO v\nv\ yKa3Ba TMna M3K/iK)neHMe, KoeTO e B"b3HMKHa/io. 

ripM M3roTBAHe AH3aMHa Ha ye6 ycnyraTa e o6"bpHaTO BHMMaHMe Ha ynpaB- 

^eHMeTO Ha M3K/lK>HeHMflTa M rpeilJKMTe. ripM B"b3HMKBaHe Ha M3K/lK>HeHMe B 
HflKOM OT MeTOAMTe OT C/lOfl 3a AOCTbn AO ASHHM M/1M nOMOLUHMTe K/iacoBe 
TOBa M3K/lK)HeHMe 6MBa 06BMTO B Cnei4MCpM4HO M3K/lK)HeHMe, CbOTBeTCTBaiUO 
Ha a6CTpaKUMflTa Ha CbOTBeTHMfl MeTOA (DalException, SendMailException 
m t.h.), cneA KoeTO 6MBa xBtp/ieHO othobo. BceKM ot Te3M MeTOAM ce rpM>KM 
npM B"b3HMKBaHe Ha M3K/iK>neHMe Aa ocbo6oam 3aeMaHMTe ot Hero kpmtm^hm 
pecypcM KaTO Bp"b3KM KbM 6a3aTa ashhm m UI o6eKTM. 

MeTOAMTe Ha Manager K/iacoBeTe ot CBOfl CTpaHa cnep, xBaiuaHe Ha m3k/ikd- 
4eHMfl tm 3anMCBaT b /iora Ha M3K/iioneHMflTa m BptiuaT ctOTBeTHMfl pe3y/iTaT, 
npeACTaB^ABaiu ctomhoct ot M36poeHM TMn 3a CTaTyc, Ha K/iMeHTa Ha ye6 
ycnyraTa. 

llMrmeMeHTaMMfl Ha ASP.NET ye6 yc/iyraTa 

fla pa3MeAaMe hakom no-Ba>KHM MOMeHTM ot MMn/ieMeHTauMHTa Ha ye6 ycny- 
raTa, koato pea/iM3Mpa pa6oTHaTa ziorMKa (6M3Hec ziorMKaTa) Ha CMCTeMaTa 3a 



T/iaBa 29. npaKTunecKM npoeKT 987 

3ano3HaHCTBa b 1/lHTepHeT. OcHOBHaTa 3aAana Ha ye6 ycnyraTa e fla npaBM 
Bp"b3Ka c 6a3aTa ashhh v\ p,a M3n"b/iHflBa o6pa6oTKa Ha flaHHkue. 

K/iacoBe 3a Aocrbn ao AaHHMTe (DAL) 

flocTbirbT ao AaHHMTe ce pea/ii/i3i/ipa 4pe3 Data Access Layer (DAL) - 
cbBKynHOCT ot K/iacoBe, komto pea/iki3kipaT /iorm<aTa 3a Aocrbn ao AaHHMTe, 
HaMnpaiuM ce b SQL Server, npe3 ADO.NET v\ M3BMKBaHe Ha CbxpaHeHi/i 
npoueAypn. 

npi/i MMn^eMeHTupaHeTO Ha c/ioa 3a ashhm e cb3AaAeH 6a30B K/iac 
(BaseDAL.cs), komto p,a 6"bAe Hacnep,en ot ocraHa/iMTe K/iacoBe 3a Aocrbn ao 
AaHHM. HeroBa ocHOBHa po/ia e p,a eHKancyni/ipa noMOiuHMTe MeTOAM, M3no/i3- 
BaHM b pa6oTaTa Ha Hac/ieAflBamwTe r ° K/iacoBe. TaKMBa ca HanpuMep MeTO- 
AMTe 3a ct3AaBaHe Ha Bp"b3Ka kbm 6a3aTa ashhm m o6eKT 3a KOMaHAa kbm 
6a3aTa ashhm (sqlCommand). Eto KOAa Ha BTopufl MeTOA: 



private static SqlCommand GetSqlCommand ( 

string aStoredProcedureName, SqlTransaction aTransaction, 
SqlConnection aSqlConnection) 

{ 

SqlCommand sqlCommand = null; 
try 

{ 

if (aTransaction != null) 

{ 

sqlCommand = new SqlCommand (aStoredProcedureName, 
aTransaction . Connection) ; 

} 
else 

{ 

sqlCommand = new SqlCommand (aStoredProcedureName, 
aSqlConnection) ; 

} 

sqlCommand. CommandType = CommandType . StoredProcedure; 

if ( sqlCommand. Connection . State == ConnectionState . Closed) 

{ 

sqlCommand . Connection . Open ( ) ; 

} 

if (aTransaction != null) 

{ 

sqlCommand. Transaction = aTransaction; 

} 

return sqlCommand; 

} 

catch (Exception ex) 

{ 

throw new DalException (ex .Message, ex) ; 

} 
} 



988 nporpaMnpaHe 3a .NET Framework (tom 2) 

npMMep 3a K/iac ot DAL cnon 

J\a pa3MeflaMe K/iacoBeTe ot DAL cnon Ha cwcreMaTa. 3a bcako entity 
Ta6/inua ot 6a3aTa ashhm e pea/iM3kipaH no ep,v\n cbOTBeTeH DAL K/iac b cnon 
3a flocTtn flo flaHHMTe. 

ETO M eflMH OT TMnH4HMTe MeTOAM 3a AOCTtn AO ASHHH, M3B^M4aiU MHCpop- 

MaunflTa 3a noTpe6kiTe/i no HeroBna MAeHTucpuKaTop (ID) b Ta6/ikiuaTa ot 
6a3aTa ashhh: 



public static UserDTO SelectUser (Sqllnt32 alD) 

{ 

SqlCommand sqlCommand = null; 
SqlDataReader reader = null; 
try 

{ 

sqlCommand = GetSqlCommand ( "spS_User" ) ; 
sqlCommand. Parameters .Add ( "@ID", SqlDbType. Int) 

.Value = alD; 
reader = sqlCommand. ExecuteReader () ; 
if ( reader . HasRows ) 

{ 

reader . Read ( ) ; 

return GetUserFromReader ( reader ) ; 

} 
else 

{ 

return new UserDTO ( ) ; 

} 
} 
catch (Exception ex) 

{ 

throw new DalException (ex .Message, ex) ; 

} 
finally 

{ 

if (reader != null) 

{ 

reader . Close ( ) ; 

} 

if ( sqlCommand != null) 

{ 

sqlCommand. Connection . Close ( ) ; 

} 
} 
} 



3a npeHOC Ha AaHHkiTe ce i/i3no/i3BaT Data Transfer Object (DTO) o6eKTM. Te 
npeAcraB/iflBaT npocTM crpyKTypw ot ashhh, cbOTBeTCTBaiun Ha no/ieTaTa ot 
6a3aTa ashhh. 



T/iaBa 29. npaKTunecKM npoeKT 989 

Ochobhm npo6/ieMM npw pea/iM3auiinTa Ha 6n3Hec c/ion 

MMn^eMeHTupaHeTO Ha MeTOflMTe ot cnon 3a 6n3Hec /iorm<a e CB"bp3aHO c 
HAKO/iKO ochobhm 3aAann. 3a cnpaBAHeTO c tax e Heo6xoAHM eAHHeH noAxoA, 
komto Aa 6"bAe M3no/i3BaH kohcmct6htho. Mo>KeM p,a MAeHTnc|DMUMpaMe cnep,- 
HMTe npo6/ieMHki CMTyaunn: 

- npoBepKa Ha Ba/ikiAHOCTra Ha cecnaTa; 

- ocurypaBaHe npaBki/iHOTO M3n"b/iHeHneTO Ha cbOTBeTHaTa 6n3Hec <fcyHK- 
Ui/iOHa/iHOCT npe3 npoBepKa Ha BxoAHMTe ashhm m noAtpwaHe Ha cecua; 

- cbLUMHCKO M3n"b^HeHne Ha cJDyHKUkiOHa/iHOcrra npe3 BMKaHe Ha MeTOAM 
ot c/iofl 3a AOCTtn ao ashhm (DAL); 

- npoBepKa 3a npaBki/iHOTO ki3iTb/iHeHi/ie Ha MeTOAHTe ot c/ioa 3a Aocrbn 
ao ashhh; 

- 3anncBaHe b ziora Ha B"b3HkiKHa/ikiTe ki3K/iioneHkifl; 

- BptiuaHe Ha pe3y/iTaT v\j\v\ Tun Ha B"b3HkiKHa/iOTO ki3K/iioneHi/ie, aKO MMa 
TaKOBa. 

npMMep 3a 6n3Hec mctoa ot pa6oTHaTa /lorwKa Ha cucreMaTa 

Eto KOAa Ha eAHH TwnwueH MeTOA, MMn/ieMeHTwpam 6n3Hec /iori/iKaTa 3a 
CMAHa Ha MMeTO Ha KaTeropua c npwflTe/iki: 



public AddRenameCategoryStatus RenameCategory (int aCategorylD, 
string aNewName, string aSessionID ) 

{ 

SqlTransaction sqlTransaction = null; 
SqlConnection sqlConnection = null; 
try 

{ 

sqlConnection = BaseDAL . GetSqlConnection ( ) ; 

sqlConnection . Open ( ) ; 

sqlTransaction = sqlConnection . BeginTransaction ( 

IsolationLevel . Serializable) ; 
int categoryOwnerUserlD = 

CategoriesDAL . GetCategoryOwnerUserlD (aCategorylD) ; 
bool isSessionValid = SessionManager . Instance 

. IsSessionForUser (aSessionID, categoryOwnerUserlD) ; 
if ( ! isSessionValid) 

{ 

sqlTransaction . Rollback ( ) ; 

return AddRenameCategoryStatus . InvalidSession; 

} 

bool categoryNameExist = CategoriesDAL 

. CheckCategoryNameExist (categoryOwnerUserlD, aNewName) ; 
if (categoryNameExist) 

{ 

sqlTransaction . Rollback ( ) ; 



990 flporpaMnpaHe 3a .NET Framework (tom 2) 



return AddRenameCategoryStatus . CategoryNameExist; 

} 

int rowsAf f ected=CategoriesDAL . ChangeName (aCategorylD, 

aNewName, null); 
if ( rowsAf f ected != 1) 

{ 

sqlTransaction . Rollback ( ) ; 

return AddRenameCategoryStatus . OperationNotPerf ormed; 

} 

sqlTransaction . Commit ( ) ; 

return AddRenameCategoryStatus . Success; 

} 

catch (Exception ex) 

{ 

if ( sqlTransaction != null) 

{ 

sqlTransaction . Rollback ( ) ; 

} 

Except ionHandler . HandleException (ex) ; 

return AddRenameCategoryStatus . InternalServerError; 

} 
finally 

{ 

sqlConnection . Close ( ) ; 

} 



} 



ynpaB/ieHiie Ha cecMMTe 

Pa3pa6oTBaHeTO Ha co6cTBeH MexaHM3"bM 3a nofltpaoHe Ha noTpe6kiTe/iCKa 
cecufl M3MCKBa pea^M3npaHeT0 Ha K/iac, ynpaB/iHBam cecnnTe 

SessionManager. T03M K/iac M3nO/13Ba Hashtable 06eKTM, B KOklTO CbxpaHflBa 

MHCpopMaunflTa 3a cecnnTe (BpeMe ao M3TMnaHe Ha cecnaTa v\ noTpe6kiTe/i, 
npnTexaBaiu cecwflTa). 

K/iacbT SessionManager e pea/iki3kipaH KaTO singleton (K/iac, 3a komto cbiue- 
CTByBa eAMHCTBeHa MHCTaHuna), 3aiuoTO Ha npaKTMKa Ha npn^OKeHneTO e 

HyxeH eAMH eAMHCTBeH SessionManager. MHCTaHUMflTa Ha T03M K/iac ce 

cbxpaHABa b HeroBa craTi/mHa n/ieH-npoMeH/ii/iBa, ioto no to3m HanwH ce 
ocurypaBa eflUHCTBeHOCTTa Ha MHCTaHunaTa. 

T"bM KaTO ce npeflBM>Kfla MeTOAHTe Ha MHCraHUklflTa Ha K/iaca SessionManager 
fla 6"bflaT BMKaHM OT MHO>KeCTBO HMUJKM eflHOBpeMeHHO, nOpaflM HD/IAMO HaTO- 

BapBaHe Ha cawTa, cbiuecTByBa onacHOCT p,auuv\je b HeroBMTe Hashtable 
4/ieH-npoMeH^MBM p,a 6"bAaT HenpaBM/iHO nponeTeHki v\nv\ 3anncaHM. 3a p,a ce 
M36erHe TOBa BC^Ka onepauna c Hashtable o6eKTMTe 6nBa nocTaBeHa b lock 

6/lOK. T03M 6/lOK 3aK/lK>HBa CTaTM4HaTa 4^eH-npOMeH^MBa mSyncRoot, KaTO 

AOKaTO Tfl e 3aK/iK>neHa hmto eAHa Apyra HMUJKa He Moxe p,a n 3aK/iK>nw v\nv\ 
Aa M3nt^HM 6/iok c onepaunfl c Hashtable o6eKTM. TaKa bcmukm hmujkm me 
M34aKaT 3aK/iK>nki/iaTa mSyncRoot HMiuKa Aa M3/ie3e ot lock 6/iOKa. 



T/iaBa 29. npaKTunecKM npoeKT 991 
ETO KOfla Ha eflMH OT MeTOAMTe Ha K/iaca SessionManager, KOMTO l/l3nO/13Ba 

lock 6/iok, 3a fla ce noflcurypn, ne hmkom H^Ma fla Cb3flafle HOBa cecua, 
flOKaTO ce npoBepyiBa p,anw reHepupaHMAT MAeHTMCJDMKaTop Ha cecua e 
yHMKa^eH: 



public string StartUserSession (int aUserlD) 

{ 

string sessionID = ""; 
lock (mSyncRoot) 

{ 

do 

{ 

sessionID = GenerateSessionID ( ) ; 
} while (mSessionTimeouts . ContainsKey ( sessionID) ) 

mUserSessions .Add ( sessionID, aUserlD) ; 
mSessionTimeouts .Add (sessionID, mSessionTimeout ) 
} 

return sessionID; 



kl3B/iimaHe Ha chmmkhtc Ha noTpe6MTe/iMTe 

flpyr MHTepeceH momsht ot MMn/ieMeHTauMHTa Ha ye6 yc/iyraTa e M3B/iMnaHeTO 
m BptiuaHeTO Ha CHMMKMTe Ha noTpe6MTe/iMTe oto noTOK. npeflaBaHeTO Ha 
AaHHM KaTO noTOK 03Ha4aBa, ne He ce 3ape>KflaT bcmukm ashhm eAHOBpeMeHHO 
b naMerra v\ cnep, TOBa p,a ce npeAaBaT KaTO ro/iHM 6/iok naMeT, a BMecTO TOBa 
Te 6nBaT HaKtCBaHM Ha mhoto Ma/iKM napneTa, komto 6nBaT npeflaBaHM 
nocneflOBaTe/iHO. He ce npeflaBa c/ieABamMAT naKeT, aooto He 6"bfle no/iyneH 
npeAMUJHMflT m naMerra, 3aeMaHa ot Hero, He 6tAe ocBo6oAeHa. TaKa ce 
no/iynaBa Heiuo KaTO noTOK ot Ma/iKM no o6eM naKeTM ot ashhm, KoeTO 
HaMa^ABa 3HanMTe/iHO 3aeMaHaTa naMeT. 

npeAaBaHeTO Ha chmmkhtc ioto noTOK cbAtpwa b ce6e cm ABe noA3aAa4M - 
neTeHe Ha chmmkhtc ot 6a3aTa ashhm ioto noTOK v\ npamaHeTO mm kbm 
K^neHTa KaTO noTOK. IIotohhoto neTeHeTO ot 6a3aTa ashhm e pea/iki3wpaHO c 

MeTOAa GetBytesO Ha K/iaca SqlDataReader. TOBa e MeTOAt>T OT C/lOfl 3a 
AOCTtn AO ASHHH, KOMTO pea/lM3Mpa nOTOHHOTO 4eTeHe Ha CHMMKMTe, KOMTO 

npMeMa 3a napaMeTbp m noTOKa, b komto nMiue: 



public static bool GetUserPictureAsStream (Sqllnt32 aUserlD, 
Stream aOutputStream) 

{ 

SqlCommand sqlCommand = null; 
SqlDataReader reader = null; 

try 

{ 

sqlCommand = BaseDAL . GetSqlCommand ( "spS_PictureBytes" ) ; 



992 flporpaMnpaHe 3a .NET Framework (tom 2) 



} 



sqlCommand. Parameters .Add ( "SUserlD", SqlDbType. Int) 

.Value = aUserlD; 
reader = sqlCommand. ExecuteReader () ; 

if ( reader . HasRows ) 

{ 

reader . Read ( ) ; 

Int 6 4 bytesRead; 
Int64 datalndex = 0; 
byte [ ] buffer; 

buffer = new byte [ PICTURE_BUFFER_LENGTH] ; 
do 

{ 

bytesRead = reader . GetBytes ( 0, datalndex, buffer, 0, 

PICTURE_BUFFER_LENGTH) ; 
datalndex += bytesRead; 

aOutputStream. Write (buff er, 0, (int) bytesRead); 

} 

while (bytesRead > 0); 

return true; 

} 
else 

{ 

return false; 

} 
} 
catch (Exception ex) 

{ 

throw new DalException (ex .Message, ex) ; 

} 
finally 

{ 

if (reader != null) 

{ 

reader . Close ( ) ; 

} 

if ( sqlCommand != null) 

{ 

sqlCommand. Connection . Close ( ) ; 

} 
} 



3a p,a 6"bflaT npeAafleHM AaHHMTe ioto iiotok npe3 HTTP ot . aspx CTpaHnuaTa 
e Hy>KHO fla ce yKaxe ta fla He 6tAe 6ycpepnpaHa v\ aKO MMa 6ycpepnpaHO 
c"bfl"bp>KaHMe, to fla 6"bfle m3tpmto. Tbm KaTO npeflaBaMe chmmkm e Hy>KHO fla 



T/iaBa 29. npaKTunecKM npoeKT 993 

ce yKawe, ne Tuna Ha npeflaBaHOTO cbAtpwaHMe e JPEG. Bcmuko TOBa CTaBa 
etc c^eflHMTe peflOBe: 



Response . Buff erOutput = false; 

Response . Clear ( ) ; 

Response . ContentType = "image/ jpeg" ; 



MeTOfl"bT GetUserPictureAsStream ( ) 6MBa M3BMKaH B CTpaHMUaTa 
get_j>icture . aspx, KaTO 3a CTOMHOCT Ha napaMerbpa aOutputStream 6MBa 

npeflafleH m3xoahmat noTOK Ha crpaHMuaTa: 



bool getUserPictureResult = PicturesDAL . GetUserPictureAsStream ( 
userlD, Response . OutputStream) ; 



K/meHTCKM c/iom - Windows Forms GUI npii/ioweHue 

OcHOBHaTa 3aAa4a Ha Windows Forms npn^OKeHneTO e p,a npeAOcraBM 
yflo6eH m zieceH 3a ki3no/i3BaHe MHTepc|DeMC 3a pa6oTa c HaM-necro M3no/i3Ba- 
HMTe cJDyHKUMOHa^HM B"b3MO>KHOCTM Ha caMTa 3a 3an03HaHCTBa. 

flM3aMH ci>o6pa>KeHMn, CBi>p3aHM c Windows Forms Knnema 

npeAM Aa 3ano4HeM p,a pa3r/ie>KflaMe KaK e MMn/ieMeHTMpaHa CMcreMaTa 
Tpa6Ba p,a o6tpHeM BHMMaHne Ha hakom AH3awH peiueHMfl. 

PeiueHMn 3a Aocrbn ao ye6 yc/iyraTa 

ripo6/ieM"bT npn M3n"b/iH*iBaHe Ha MeTOfl ot ye6 yc/iyraTa e, ne 6/iOKkipa 
HMiuKaTa, ot koato ce M3n"b/iHflBa. M3BMKBaHeTO Ha MeTOAMTe Ha ye6 yc/iyraTa 
ot HMiuKaTa Ha noTpe6nTe/iCKHfl MHTepc|DeMC 6m nonpenM.no Ha o6HOBHBaHeTO 
Ha noTpe6nTe^CKMfl MHTepc|DeMC v\ noTpe6kiTe/i*iT 6m bmahji 6nn eKpaH. 

KoraTO flo6aBAMe ye6 yc/iyraTa b Haujua npoeKT, Visual Studio npeflocTaBa 
CMHxpoHHM m acuHxpoHHM MeTOflu b aBTOMaTMUHO reHepMpaHMfl npoKCM K/iac. 
Ako ye6 yc/iyraTa npeAOcraBH MeTOA ourMethodO, ocBeH cmhxpohhma MeTOA 

OurMethodO B npOKCM KJiaca me MMa M ABa APyrM MeTOAa BeginOurMethodO 
M EndOurMethod ( ) . 

M3BMKBaMKM BeginOurMethodO, Tpa6Ba p,a noAaAeM KaTO napaMeTbp MeTO- 
Aa, komto MCKaMe Aa 6"bAe M3n"b/iHeH cnep, KaTO npkiK/iionki M3n"b^HeHneTO Ha 

My. M3BMKBaMKM BeginOurMethodO B HMUJKa OT ny/ia 3a HMUJKM me ce 
M3n"b/1HM MeTOA"bT OurMethodO H C/ieA KaTO npMK/lKDHM LUe M3n"b/1HM MeTOAa, 

noAaAeH KaTO napaMeTbp. 3a Aa nojiyHMM pe3y/iTaTa ot MeTOAa OurMethodO 
e Hy>KHO Aa M3n"b/iHMM EndOurMethod () . Bene no/iyni/i/iM AaHHMTe ot ye6 
yc/iyraTa, HopMa/iHOTO Heiuo, KoeTO 6nxMe MCKa/iM Aa HanpaBMM, e Aa M3non- 
3BaMe Te3M AaHHM 3a o6HOBHBaHeTO Ha hhko*i KOHTpo/ia ot noTpe6kiTe/iCKMfl 
MHTepc|DeMC. ToBa o6ane e HenpaBM/iHO, 3am.OTO Bee oiue ce HaMnpaMe b 
HMiuKaTa ot ny/ia 3a hmujkm. 06HOBABaMKM noTpe6MTe/iCKM*i MHTepc|DeMC ot 
HMUJKa, pa3JiM4Ha ot HMiuKaTa, koato ro ynpaBJiflBa 6m motjio Aa npeAM3BMKa 
HenpMATHM nocjieACTBMfl. HaMMpaMKM ce b HMiuKaTa ot nyjia 3a hmujkm, MOxeM 



994 nporpaMnpaHe 3a .NET Framework (tom 2) 

fla M3n"b^HMM MeTOfl b HMiuKaTa Ha noTpe6nTe^CKM5i MHTepcpewc npe3 

Control . Invoke ( ) . 

ToBa Ha/iara cnep,Hwn p,v\3av\H - 3a BCflKa eflHa cpopMa, koato i/i3n"b/iH$iBa 
MeTOflM ot ye6 yc/iyraTa me cb3fla,qeM K/iac, komto ce rpn>KM 3a M3BMKBaHeTO 
Ha MeTOAMTe ot ye6 yc/iyraTa. 

ABTeHTHxauLMfl m ynpaB/ieHMe Ha cecHMTe 

noTpe6nTe^MTe Ha Windows Forms npw/io>KeHkieTO ce aBTeHTMKupaT, npefloc- 
TaBAMKM noTpe6nTe^CKO MMe v\ napo/ia. ripn ycneujHa aBTeHTHKauna ye6 yc- 
ziyraTa hm npeflocraBH hm3, npeflcraB/iflBam cecna. BcflKa onepauna, M3B"bpiu- 
BaHa ot npn^OKeHneTO, i/i3no/i3Ba Ta3M cecua, 3a fla flOKa3Ba caMO/ikmHOcrra 
Ha noTpe6nTe^fl. ripn ki3TkmaHe Ha cecnaTa noTpe6i/iTe/ifl e noMO/ieH fla 
BtBefle othobo napo/iaTa cm. ripn npaBM/iHO B"bBe>KflaHe npn/io>i<eHMeTO 
npofl"b/i>KaBa pa6oTaTa cm. 

YnpaB/ieHMe Ha M3K/noneHMnTa m rpeujKMTe 

ripn bcako flecKTon npw/io>KeHi/ie Haw-Ba>KHOTO e ki3K/iK>neHkiflTa fla 6"bflaT 
npuxBaHaTM, o6pa6oTeHM v\ fla 6"bfle noKa3aHO noflxoflaiuo cto6iueHne Ha 
noTpe6i/iTe/i*i. Ako npn^OKeHneTO He MO>xe fla ce B"b3craHOBi/i ot rpewKaTa e 
Hy>KHO fla ce OT6e/ie>Kki TOBa c noflxoflaiuo cbo6iueHne v\ fla ce i/i3/ie3e ot 
npi/i/io>KeHMeTO "Ky/iTypHo", onuTBawKM ce fla ce 3ana3M BCflKaKBa MHCpop- 
Maunfl, koato He e 6i/i/ia 3ana3eHa. B npw/io>KeHi/ieTO, KoeTO pa3pa6oTBaMe, 
no4TM bcm4ko ce na3M ot ye6 yc/iyraTa v\ cneflOBaTe/iHO Tpa6Ba caMO fla ce 
norpn>KMM fla M3BefleM noflxoflaiuo cbo6iueHne. B npn^OKeHneTO bcmukm 
Heo6pa6oTeHM v\3Ki\\oneuv\s\ me o6pa6oTBaMe ot eflMH r/io6a/ieH try catch 
6/iok. ToBa o6ane He e flocraTbUHO. 3a fla npuxBaHeM bcmukm ki3K/iK>neHMfl e 

Hy>KHO fla 06pa60TMM Cb6wTklflTa System. Windows. Forms. Application. 
ThreadException M AppDomain. CurrentDomain.UnhandledException. 

MMnneMeHTauMq Ha Windows Forms K/meHTa 

GUI npw/io>KeHkieTO Tpa6Ba fla npeflocraBfl flocTtn caMO ao perncTpupaHM 
noTpe6nTe^n v\ cbOTBeTHO BceKM noTpe6kiTe/i, komto MCKa fla B/ie3e b cwcre- 
MaTa Tpa6Ba fla flOKa>Ke caMO/ii/mHOOTa cm. CbOTBeTHO ntpBOTO Heiuo, KoeTO 
Tpa6Ba fla ce noKawe, e cpopMa, b koato ce M3MCKBa B"bBe>KflaHe Ha noTpe6n- 
Te/iCKO MMe m napo/ia. 

OcHOBHaTa cpopMa, koato me cb3flafleM me cbfl"bp>Ka cnncbKa c KaTeropnnTe v\ 
npuflTe^MTe bbb BC^Ka KaTeropi/m. Ot Ta3M cpopMa me MOxeM fla otbopmm 
flpyra cpopMa, no3BO/iflBama pa3MAHaTa Ha cbo6iueHMfl Me>Kfly noTpe6i/iTe/ikiTe. 
Ot ocHOBHaTa cpopMa me flo6aBMM b"B3mo>khoct 3a OTBap^He Ha cpopMa, 
npeflocraBflLua cpyHKui/iOHa/iHOcrra 3a TbpceHe. 3a BceKM eflMH noTpe6wTe/i, 
HaMepeH ioto pe3y/iTaT ot TbpceHeTO, me npeflocraBMM B"b3MO>KHOCTTa 3a 
M3B^M4aHe m noi<a3BaHe Ha noflpo6Ha MHCpopMauna. ToBa me pea/iki3kipaMe, 
npe3 flo6aBAHeTO Ha eflHa cpopMa cbfltpxaiua MHCpopMaunaTa 3a noTpe6n- 
jenn, KaKTO v\ yMa/ieHa chmmio Ha noTpe6i/iTe/ifl. Bm 6m/io flo6pe Bt3MO>K- 



T/iaBa 29. npaKTunecKM npoeKT 995 

HOCTra 3a pa3Me>KflaHe Ha npoc|DM^a fla e flocrbrma v\ 3a BceKM ot npwflTe/iMTe 
b cnncbKa c npkisrre/iM. 

Eto eflHa fluarpaMa, koato noKa3Ba eKpaHMTe Ha npw/io>KeHkieTO v\ npexoflkiTe 
Me>Kfly tax (screen flow diagram): 



cni/ictK c npii^Tejiii P a3MJiHa Ha ci,o6ineHwi 



aBTeHTMKauiin 



WBBmmmi^^^ms 


™« [Bongo 








1 c "'""' 


| llWM | 





flg 


.:_j HODHEOHM 












• H] i J.'-! r. 




• H] -t-LF.VJI 




- ,@ n03HSILH 










Ttpcene 


Hskcu 






B20C5r 20.51.tD- 

11,&20Q5r,20:SO:tf<hwn 

.8.2005 r. 2ft 60:C 7 <bangc» 



II B2005i H149.4B (bongo* c sna^c<tHif« 

ii ;j.ji, .:fi«=i;,hr.-, n ,-,.,- ;!! r, 
11 8.2005r.M43;3S(Eafigo} 3npacrii 



OrKfl*n HsnoaTH I 



TtpceHe 



Lfiltok 


PpuKop: 


lubka 


>v 


"~ 


KoitoNoi.Bqlo 


-**&? 


PowaeHHaa-ara: 


03/30/1982 






Plovdv 




rioiL 


r 




roriinapnocT: 


fiO 




flocneaHa ^.thehdct 


23.10. 200!> r. 2£i£W 


| H3«M | 







r„ 












^ 




















r 




































i i_„™ 















































noKa3BaHe Ha npocpmi 

OopMa 3a aBTeHTMKauHn 

HeKa ntpBO cb3fla,qeM c|DopMaTa 3a aBTeHTHKauna Ha noTpe6kiTe/ikiTe - 

LoglnForm. V\Md flBa C/iynafl, B KOMTO MO>KeM fla M3no^3BaMe Ta3M c|DopMa. 

ritpBUflT cnynaw e KoraTO noTpe6MTe/i B/iki3a b npn^OKeHneTO v\ >xe/iae fla 
flOKa>Ke caMO/ikmHOcrra cm. ripn BTopufl c/iynaw, noTpe6wTe/iflT Bene e pa6o- 
tm/1 c npn^OKeHneTO v\ cecnaTa My e M3TeK/ia v\ cbOTBeTHO ce Hy>Kflae fla 
no/iyni/i HOBa ceci/m. Pa3/im<MTe Me>Kfly flBaTa c/iyna*i ca, ne b ntpBua me 
HaKapBaMe noTpe6kiTe/ifl fla BtBefle noTpe6kiTe/iCKOTO cm MMe v\ napo/ia, a bbb 
BTopufl caMO fla BtBefle napo/iaTa cm. 3a ue/iTa me i/iMn/ieMeHTkipaMe flBa 
KOHCTpyKTopa Ha to3m K/iac. EflMHMAT KOHCTpyKTop me npneMa noTpe6wTe/i- 
ckoto MMe KaTO napaMeTtp v\ me ro i/i3no/i3Ba 3a aBTeHTHKauna c BtBefleHaTa 
ot noTpe6nTe^fl napo/ia. 



Eto KaK M3r/ie>Kfla c|DopMaTa 3a aBTeHTHKauna: 



996 



flporpaMnpaHe 3a .NET Framework (tom 2) 



Eh>Be,neTe hmc h napo/ia 



Ao6pefl( 



Hwe: |E ongo 

flapona: 




Cebp3BaHe 



M3K0fl 



noTpe6nTe^flT Tpa6Ba v\nv\ fla ce aBTeHTMKupa ycneujHO v\nv\ fla HaTMCHe 
6yTOHa "M3xoa", KaTO v\ b ABaTa cnynafl Tpa6Ba fla ce 3aTBopn cpopMaTa, ho b 
pa3/ikmHMTe cuTyaunn Tpa6Ba fla npeflnpweMeM pa3/ikmHki fleMCTBua. Hy>KHO e 
c/iefl 3aTBapaHe Ha cpopMaTa fla 3HaeM KaKtB e 6m/i pe3y/iTaTbT ot aBTeHTM- 
KaunflTa. 3a ue/iTa me ki3no/i3BaMe M36poeHMfl Tun DiaiogResuit. Hy>KHO e 
fla OT6e^e>KMM, ne c/iefl 3aTBapaHeTO Ha cpopMaTa, th He e yHwmoKeHa, KoeTO 

HM n03BO/lflBa fla l/l3nO/13BaMe DiaiogResuit C/iefl 3aTBap*lHeTO M, HO HM 

3afl"b^>KaBa c/iefl TOBa fla M3BMKaMe MeTOfla Dispose o, 3a fla MO>xe cpopMaTa 

M BCM4KM M3n0^3BaHM OT Hefl peCypCM fla 6"bflaT OCB060fleHM. 

ripn HaTMCKaHe Ha 6yTOHa "CB"bp3BaHe", me HanpaBMM Hen3no/i3BaeMki 
6yTOHa "CBtp3BaHe" v\ TeKCTOBMTe no/ieTa 3a B"bBe>KflaHe Ha noTpe6kiTe/iCKO 
MMe m napo/ia. ToBa me noKawe Ha noTpe6kiTe/ifl, ne Tpa6Ba fla M3naKa 
flOKaTO npw/io>KeHi/ieTO CBtpiun c TOBa flewcTBue. 

Cnep, TOBa Tpa6Ba fla M3Hkic/ikiM MD5 xeiu CTOMHOcrra Ha napo/iaTa. IHe M3- 
no/i3BaMe CbiflUTe MeTOflki, komto 6axa M3no/i3BaHM b ye6 yc/iyraTa. 3a ue/iTa 
me cb3flafleM OTfle/ieH noMOiueH K/iac utils, b komto m 3a b 6tfleiue me 
Ao6aBflMe MeTOflM, no/ie3Hki Ha npw/io>KeHkieTO, ho MMaiun cpyHKuna, pa3/innHa 
ot cpyHKUMMTe Ha npn^OKeHneTO. 



LoglnForm loglnForm 

DiaiogResuit result 

loglnForm. Dispose ( ) ; 

if (result == DiaiogResuit . OK 

{ . . . } 

else 

{ . . . } 



new LoglnForm () ; 
loglnForm. ShowDialog 



l/l3BMKBaHe Ha MeTOAM ot ye6 ycnyraTa 

Cera Bene CMe totobm 3a M3BMKBaHeTO Ha MeTOfla ot ye6 yc/iyraTa 3a 
aBTeHTMKaunfl Ha noTpe6kiTe/ifl. Ye6 yc/iyraTa hm npeflocraBfl MeTOfl 

AuthenticateUser ( ) , KOMTO BptLfla pe3y/lTaT, nOKa3Baifl fla/lM flaHHMTe, 

BtBefleHM ot noTpe6nTe^fl ca npaBM/iHM. Ako ce BtpHeM Ma/iKO Ha3afl v\ 
noMeflHeM p,v\3av\u cbo6pa>KeHMflTa, to me bmamm, ne hm e Hy>KeH v\ eflMH 
noMomeH K/iac, b komto me ca bcmukm M3BMKBaHMfl kbm ye6 yc/iyraTa ot 
flafleHa cpopMa. To3m K/iac me ce Ka3Ba LoginProxy v\ b Hero me MMn/ieMeH- 
TupaMe c^eflHMfl MeTOfl: 



T/iaBa 29. npaKTunecKM npoeKT 997 



public void AuthenticateUser ( string aUserName, string 
aPasswordHash) 

{ 

mProxy . BeginAuthenticateUser (aUserName, aPasswordHash, 
new AsyncCallback (AuthenticateUserCallback) , null); 
} 



B to3m MeTOfl mProxy e MHCTaHunfl Ha K/iaca, komto e aBTOMaTMUHO reHepupaH 
npi/i Ao6aBflHe Ha ye6 ycnyraTa. Ye6 ycnyraTa npeflOcraBfl MeTOA 
AuthenticateUser () , a npOKCM K/iaCbT npeflOCTaBfl aCMHXpOHHMfl MeTOfl 
BeginAuthenticateUser. Ha T03M MeTOfl Tpfl6Ba fla nOflafleM KaTO napaMeTpw 
He caMO Hy>KHMTe Ha AuthenticateUser napaMeTpMTe, HO M flBa flOITb/lHM- 

Te/iHM napaMeTbpa. ntpBHAT ot floirb/iHi/iTe/iHMTe napaMeTpn e fle/ieraT, 
yKa3Baiu c|DyHKUMflTa, koato me ce M3n"b/iHi/i cnefl KaTO npi/iK/iionki ki3n"b/iHe- 
Hi/ieTO Ha MeTOfla ot ye6 ycnyraTa, a BTopua napaMeTbp me pa3r/ieflaMe 
noflpo6HO Ma/iKO no-HaflO/iy. 



private void AuthenticateUserCallback ( IAsyncResult aAsyncResult ) 

{ 

try 

{ 

AuthenticateUserResult result = mProxy . EndAuthenticateUser ( 

aAsyncResult ) ; 
mTargetForm. Invoke ( new AuthenticateUserCompleteCallback 
(mTargetForm. AuthenticateUserComplete) , new object [] 
{ result } ) ; 

} 

catch (System. Net . WebException) 

{ 

mTargetForm. Invoke (new WSNotFoundCallback 
(mTargetForm. WSNotFound) ) ; 

} 

catch (System. Web . Services .Protocols. SoapException) 

{ 

Core . WebServiceException ( ) ; 

} 
} 



Ako B"b3HMKHe M3K/uoneHne npn flocTtna v\nv\ M3n"b/iHeHweTO Ha MeTOfla ot ye6 
ycnyraTa, to TOBa ki3K/iK)neHkie me ce no/iynw b flecKTon npn^OKeHneTO npn 

M3BMKBaHeTO Ha MeTOfla EndAuthenticateUser () . 3a TOBa e Hy>KHO fla 
OrpaflMM M3BMKBaHeTO My B try catch 6/lOK. AKO B"b3HklKHe M3K^K)4eHMe OT 

Tkin WebException, 3Ha4M MMaMe npo6/ieM c flocrbna flo ye6 ycnyraTa v\ 
cbOTBeTHO Tpa6Ba fla npeflnpneMeM Hy>KHOTO flewcTBue. B cnynasi me m3bm- 
KaMe MeTOfl ot LoginForm, komto noKa3Ba noflxoflfliuo cbo6iueHne. ripn B"b3- 
HMKBaHe Ha SoapException i/i3K.nK>neHi/ie 03HanaBa, ne MMa M3K^K)4eHne b 
ye6 ycnyraTa. ripn HopMa/iHO npoTwuaHe Ha MeTOfla CMe totobm fla M3n"b/iHMM 

MeTOfla AuthenticateUserComplete ( ) OT LoginForm. KaKTO OT6e/lfl3aXMe 



998 



flporpaMnpaHe 3a .NET Framework (tom 2) 




HOBH KOHTaKTH 

o^> Ivan 
A. Mar a 

S-Q3 C-bceflM 

B"S riosHaTM 

<ft Gosheto 
^ Bango 



npeflu, M3n"b^HeHneTO Ha onepaunn no MHTepcpewca e hy>kho fla ce npaBM 
caMO ot HMiuKaTa Ha noTpe6i/iTe/iCKkifl MHTepcpeMC. 3a TOBa M3n"b/iHflBaMe 
MeTOAa nocpeACTBOM invoke (). 

kl3rpa>KAaHe Ha ocHOBHaTa cpopria 

Cera HeKa M3rpaAHM ocHOBHaTa cpopMa, koato me 
Bki3ya/iki3wpa npwnjenwje, pa3Ae/ieHi/i b KaTeropnn 
m me npeAOCTaBM ocHOBHaTa cpyHKui/iOHa/iHOcr Ha 
npn^OKeHkieTO. IHe BM3ya/iM3npaMe npwnjenwTe, 

M3n0^3BaMKM TreeView KOHTpO/ia. OTAe/lflHeTO Ha 

M3BMKBaHMATa Ha MeTOAHTe KtM ye6 yc/iyraTa b 
OTAe^eH K/iac e aHa/iorwuHO Ha TOBa, pa3r/ieAaHO 
npeAM Ma/iKO. 3a TOBa cera H^Ma p,a ce cnnpaMe 
noApo6HO. 

EAHa ot ocHOBHMTe cpyHKUMM Ha npw/io>KeHMe OT 
to3m Tun e Aa MO>xe ziecHO p,a noKa3Ba Ha noTpe- 
6nTe^MTe, aKO hakom mm e ki3npaTi/i/i c"bo6iueHne. 
Hue me MMn/ieMeHTi/ipaMe noKa3BaHeTO npe3 cma- 
Ha Ha MKOHKaTa. TaKa, KoraTO noTpe6kiTe/i*iT nor- 
zieAHe, me MO>xe 6"bp30 v\ ziecHO Aa 3a6e/ie>Ki/i kom 
My e M3npaTM^ cbo6meHkie. 

06HOBflBaHe Ha cnwcbKa c npMHTe/iM 

rioHexe cnnctKa c npkmTe/iw Moxe Aa 6"bAe npo- 
MeHAH, He e AonycTMMO Aa ro 3apeAHM caMO b 
Hana/iOTO m Aa ocraHe TaKa ao Kpaa. MMawKM 
npeABMA, ^e noTpe6kiTe/i, komto He e b cnwcbKa c 
npuflTe^MTe hm, MO>Ke Aa hm M3npaTM c"bo6iueHne 
m ToraBa tom Tpa6Ba Aa ce noaBu b cnwcbKa, to 
6m Tpsi6Ba/io Aa o6HOBABaMe nocroyiHHO to3m 
cnwcbK. 06HOBABaHe Ha 10 ceKyHAM 6m 61/1/10 b paMKMTe Ha HopMa/iHOTO, ho 
cnncbKa c npi/iflTe/ikiTe MO>xe Aa 3HanwTe/iHO rd/iam v\ cbOTBeTHO M3Ter/i*iHeTO 
My Ha BceKM 10 ceKyHAM 6m 3aTpyAHM/io cwcreMaTa. 3a Aa ce M36erHe TOBa 
me ki3Ter/iflMe cbAtpwaHi/ieTO caMO Ha KaTeropnaTa "hobm npnaTe/in" - TOBa e 
eAMHCTBeHOTO MflCTO, KtAeTO MO>Ke Aa ce Ao6aBM hob npwyiTe/i 6e3 Haiue 
3HaHne. 

KoraTO ce no/iynw hobo Cbo6meHne e Hy>KHO noTpe6kiTe/i*iT Aa 6"bAe 
yBeAOMeH. Eahh Ao6"bp Hani/m Aa HanpaBMM TOBa e Aa cmchmm MKOHKaTa b 
TreeView KOHTpo/iaTa Ha npwflTe/iMTe, komto ca M3npaTn/in cbo6meHMe. CbOT- 
BeTHO 6m Tp*i6Ba/io nocTOAHHO Aa npoBepaBaMe p,anv\ MMa hobm cbo6meHi/ifl ot 
bcm4km b cnncbKa c npnyiTe/ii/1 m npn Hy>KAa Aa CMeHAMe MKOHKaTa. 

M3no/i3BaHe Ha Tag no/ieTO 

ripi/i nocTpoflBaHeTO Ha a^pboto me M3no/i3BaMe Tag no/ieTO Ha TreeNode 
K/iaca 3a cbxpaHsiBaHe Ha AOirb/iHkiTe/iHa kmcpopMaui/m. 3a BC^Ka KaTeropi/m 
me Ao6aBAMe categoryDTO o6eKT, npeACTaBam cbOTBeTHaTa KaTeropua, a 3a 



TtpceHe 



Msxpfl 



T/iaBa 29. npaKTunecKM npoeKT 999 

npwflTe/ikiTe me flo6aBAMe FriendDTO. Ta3M MHCJDopMauMfl me hm e Hy>KHa npn 
6"bfleiua pa6oTa c e/ieMeHTMTe Ha Treeview KOHTpo/iaTa v\ npeflkiMHO b cny- 
nawTe, b komto me ce Ha/iara fla onpe,qe/ikiM cbOTBeTHna e/ieMeHT KaKBM 
AaHHM ot 6a3aTa npeflcraB/iflBa. 

C"b3AaBaHe Ha MeHioTa 

npn^OKeHneTO Tpa6Ba fla npeflocraBfl pa3/ikmHi/i <£yHKUkiOHa/iHki B"b3MO>K- 
hoctm 3a KaTeropnnTe v\ npwflTe/ikiTe. 3a ue/iTa me c"b3flafleM flBe pa3/innHw 
KOHTeKCTHM MeHKrra. 3a pa6oTaTa c KaTeropnnTe b npM/io>KeHMeTO me ki3no/i- 

3BaMe KOHTeKCTHOTO MeHK) ContextMenuCategory, a 3a pa60Ta C npi/lflTe/lMTe 

- MeHKuo contextMenuFriend. npi/i HaTMCKaHe Ha fleceH 6yTOH Ha MMiuKaTa 
me ce noKa3Ba eflHO ot flBeTe MeHKrra - aKO KypcoptT e Btpxy npi/mTe/i me ce 
nOKa3Ba ContextMenuFriend, a aKO e Btpxy KaTeropufl - me ce l"IOKa3Ba 
MeHKDTO ContextMenuCategory. TOBa me pea/lkl3kipaMe C"bC C/ieflHklfl KOfl: 



private void TreeViewFriends_MouseDown (ob j ect sender, 
System. Windows . Forms .MouseEventArgs e) 

{ 

if (e. Button == MouseButtons . Right ) 

{ 

TreeView senderControl = ( TreeView ) sender; 

TreeNode mouseNode = senderControl . GetNodeAt ( e.X, e.Y 

if ( mouseNode != null ) 

{ 

senderControl . SelectedNode = mouseNode; 
if ( mouseNode . Tag is FriendDTO ) 

{ 

ContextMenuFriend. Show ( senderControl, 
new Point ( e.X, e.Y )); 

} 

if ( mouseNode . Tag is CategoryDTO ) 

{ 

ContextMenuCategory. Show ( senderControl, 
new Point ( e.X, e.Y )); 
} 
} 
} 
} 



3a fla MOxeM fla onpefle/ikiM Koe MeHK) fla noKaweM me M3no/i3BaMe, o6eKTa b 

Tag nO/ieTO, KaTO npOBepflBaMe fla/lM e CategoryDTO kl/ll/l FriendDTO. 

Ci>3AaBaHe Ha AHHaMMHHO MeHio 

Cera me MMn/ieMeHTkipaMe cJDyHKUkiOHa/iHOora 3a npeMecTBaHe Ha npi/iyiTe/i ot 
eflHa KaTeropua b flpyra. Tpa6Ba hm Hani/m, no3BO/iflBam Ha noTpe6i/iTe/i*i fla 
M36epe b KOfl KaTeropua >Ke/iae fla npeMecTM cbOTBeTHna npn^Te/i. B"b3MO>KHO 
e fla pea/iki3wpaMe Ta3M <£yHKui/iOHa/iHOCT npe3 OTBapaHeTO Ha HOBa <£opMa, 
no3BO/iflBama M36opa Ha eflHa ot cbmecTByBamnTe KaTeropnn, ho TOBa 6m 



1000 flporpaMnpaHe 3a .NET Framework (tom 2) 



HanpaBki/io noTpe6kiTe/iCKkifl hm m-uepcpeMC no-He/iorwueH h no - TpyAeH 3a 
pa6oTa. 3a TOBa me ce cnpeM Ha BapnaHTa fla flo6aBMM eflHO noflMeHK), KoeTO 
cbfl"bp>Ka MMeHaTa Ha bcmukm KaTeropnn: 



3aTBopn bchmkh KaTeropnn 




OTBOpH ECHMKH KaTeropMH 




3ana3H bchhkh c"bo6meHHs 




rioKajKH npo<t>njia 




CtoGmeHHe 




M3TPMH 




flpeMecTH â–º 1 


HOEH KOHTaKTM 




Ci.ce/in 




ri03HaTM 



He e B"b3MO>KHO cb3AaBaHeTO Ha TOBa MeHK) fla CTaHe b Hana/icrro KaKTO 
c"b3flafloxMe npeflHMTe flBe, 3aiuoTO noTpe6kiTe/iflT MO>Ke fla M3TpnBa KaTe- 
ropnn v\nv\ fla flo6aBfl hobm. CbOTBeTHO npn bcako noKa3BaHe Ha MeHKrro 

ContextMenuFriend flMHaMMUHO Lfle C"b3flaBaMe HOBO noflMeHK). 

BuxMe >xe/ia/iki, KoraTO ce HaTMCHe hakom ot e/ieMeHTkue Ha noflMeHKrro fla ce 
M3BMKa MeTOfl, komto fla 3Hae KOfl KaTeropua ot MeHKrro CMe M36pa/ii/i. To3m 
MeTOfl me no/iynw KaTO napaMerbp o6eKTa, komto e npeflki3Bm<a/i TOBa 
c"b6nTne, a MMeHHO Menuitem o6eKT. ToBa c"b6nTne me Tpa6Ba fla npeMecTM 
noTpe6i/iTe/ifl b KaTeropnaTa, koato CMe ki36pa/iki, a 3a fla HanpaBM TOBa 6m 
Tpfl6Ba/io fla I/ma i/mcpopMaui/m koa e KaTeropi/iyua. 5m 6m/io kiflea/iHO npn 
cb3flaBaHe Ha flMHaMMUHOTO MeHK) fla 3ana3MM b Tag no/ieTO Ha Menuitem 
MHCpopMaunfl 3a KaTeropuflTa v\ npn M3BMKBaHe Ha MeTOfla, o6pa6oTBaiu 
flafleHOTO c"b6nTne fla MMaMe Hy>KHaTa hm MHCpopMauna. 3a cbwa/ieHwe 
Menuitem K/iaca HflMa Tag no/ie. Mo>KeM fla ce cnpaBMM c to3m npo6/ieM KaTO 
cb3flafleM K/iac HacneflHkiK Ha K/iaca Menuitem, komto fla MMa Tag no/ie: 



public class CustomMenuItem : Menuitem 

{ 

private Object mTag; 
public Object Tag 

{ 

get 

{ 

return mTag; 

} 
set 

{ 

mTag = value; 

} 



T/iaBa 29. npaKTunecKM npoeKT 1001 
me MMn/ieMeHTkipaMe cb3flaBaHeT0 Ha flWHaMMHHOTO MeHK> no cnep,Hwn Ha^MH: 



private void CreateDynamicMenu ( ) 

{ 

FriendsMoveMenu .Menultems . Clear ( ) ; 

ContextMenuFri end. Menul terns . Remove ( FriendsMoveMenu) ; 

FriendsMoveMenu = new Menultem ( ) ; 

FriendsMoveMenu. Text = MOVE_MENU_TEXT; 

f oreach (TreeNode categoryNode in TreeViewFriends . Nodes ) 

{ 

CustomMenuItem newMenuItem = new CustomMenuItem () ; 

CategoryDTO category = (CategoryDTO) categoryNode . Tag; 

newMenuItem. Text = category . Name; 

newMenuItem. Tag = categoryNode . Index; 

newMenuItem. Click += new EventHandler ( this .MoveFriend) 

FriendsMoveMenu .Menultems .Add (newMenuItem) ; 

} 

ContextMenuFri end. Menul terns .Add ( FriendsMoveMenu) ; 

} 



06xo>KflaT ce bcmhkm KaTeropnn v\ 3a BC^Ka KaTeropua ce cb3,qaBa 
CustomMenuItem. B Tag no/ieTO 3ana3BaMe MHfleKca Ha KaTeropuflTa b 
A^pboto. ToBa hm e Hy>KH0, 3aiuoTO npn npeMecTBaHeTO Ha ep,v\u npi/mTe/i b 
flpyra KaTeropua Tpa6Ba He caMO fla M3BMKaMe MeTOfla Ha ye6 ycnyraTa, a v\ 
fla o6hobmm noTpe6nTe^CKMfl MHTepcpewc. 3ana3BaMKM MHfleKca Ha e/ieMeHTa 
ot a^pboto, MOxeM fla o6hobmm noTpe6i/iTe/iCKi/m MHTepcpewc M MMaMe B"b3~ 
mo>khoct fla ki3B/ieneM MHCpopMaunfl 3a KaTeropuflTa ot Tag no/ieTO Ha 
eneMenja otabpboto: 



private void MoveFriend (obj ect sender, System. EventArgs e) 

{ 

CustomMenuItem menultem = (CustomMenuItem) sender; 

int categoryTreelndex = (int) menultem. Tag; 

TreeNode categoryNode = 

TreeViewFriends . Nodes [categoryTreelndex] ; 

CategoryDTO category = (CategoryDTO) categoryNode . Tag; 

TreeNode friendNode = TreeViewFriends . SelectedNode; 

FriendDTO friend = (FriendDTO) friendNode . Tag; 

mFormProxy .MoveFriend ( friend. ID, category. ID, 

Core . SessionID, friendNode, categoryTreelndex ); 
} 



npeAasaHe Ha AaHHMTe 

Cneuwa/iHO BHMMaHne me o6tpHeM Ha MMn/ieMeHTwpaHeTO Ha cpyHKuwoHa/i- 
HOCTTa 3a M3TpnBaHe Ha KaTeropna. Hy>KHO e fla M3BMKaMe MeTOfla 
Deietecategory ( ) Ha ye6 ycnyraTa m e Hy>KHO fla M3TpneM eneMenja ot 
fltpBOTO. M36npaMKM ot MeHKDTO KOMaHflaTa 3a M3TpnBaHe He hm rapaHTupa, 
ne Ta3M KaTeropua me 6"bfle M3TpnTa. B"b3MO>KHO e KaTeropn^Ta fla He MO>xe 
fla 6"bfle M3TpnTa v\ b TaicbB cnynai/i He 6m Tpsi6Ba/io fla a npeMaxBaMe ot 



1002 nporpaMnpaHe 3a .NET Framework (tom 2) 

fltpBOTO. CtOTBeTHO npeMaxBaHeTO Ha e/ieMeHTa, npeflcraB/iflBam Ta3M 
KaTeropua ot fltpBOTO, Tpa6Ba fla CTaHe eflBa cnep, KaTO MeTOflvr Ha ye6 
ycnyraTa BtpHe pe3y/iTaT noKa3Bam, ne M3TpnBaHeTO e ycneujHO. 3a fla 
HanpaBMM TOBa Ha Hac Hue e Hy>KHO fla npeAaBaMe ashhh, c komto fla 

pa3n0^araMe B MeTOfla DeleteCategoryComplete ( ) . TOBa MO>Ke fla CTaHe, 

KaTO npeflafleM >Ke/iaHaTa MHCpopMauna npe3 Asyncstate napaMeTbpa Ha 

MeTOfla BeginDeleteCategory ( ) : 



public void DeleteCategory (int aCategorylD, 

int aCategoryTreelndex, string aSessionID ) 

{ 

mProxy . BeginDeleteCategory (aCategorylD, aSessionID, new 

AsyncCallback (DeleteCategoryComplete) , aCategoryTreelndex) ; 
} 



BnocneflCTBkie MO>xeM fla no/iynkiM Ta3M ctomhoct no cneRHwn HanwH: 



private void DeleteCategoryComplete ( IAsyncResult aAsyncResult ) 

{ 

try 

{ 

int aCategoryTreelndex = (int) aAsyncResult . AsyncState; 

MethodStatus status=mProxy. EndDeleteCategory (aAsyncResult ) ; 
mTargetForm. Invoke (new DeleteCategoryCompleteCallback 

(mTargetForm. DeleteCategoryComplete) , new object[] 

{status, aCategoryTreelndex}); 

catch (System. Net . WebException) 

mTargetForm. ConnectionLost ( ) ; 
catch (System. Web . Services .Protocols. SoapException) 
Core . WebServiceException ( ) ; 
} 



Cera me Cb3flafleM MeTOfla DeleteCategoryComplete () . TOBa e MeTOfl"bT, 

komto me 6"bfle M3BMKaH, 3a fla o6hobm noTpe6i/iTe/iCKi/i*i MHTepcpewc: 



public void DeleteCategoryComplete (MethodStatus aStatus,int 
aCategoryTreelndex) 

{ 

Core . ProceedMethodStatus (aStatus ) ; 
if (aStatus == MethodStatus . Success ) 

{ 

TreeViewFr lends . Nodes [aCategoryTreelndex] . Remove ( ) ; 

} 
} 



T/iaBa 29. npaKTunecKM npoeKT 1003 



me M3no/i3BaMe MeTOfla ProceedMethodstatus ( ) 3a o6pa6oTBaHe Ha cra- 
Tyca, BtpHaT ot ye6 ycnyraTa. To3m MeTOfl MMa 3a ue/i fla noKa>Ke noflxoflaiuo 
c"bo6iueHne 3a rpewKa, aKO M3n"b/iHeHi/ieT0 He e 6m/io ycneujHO v\nv\ fla M3BMKa 
MeTOAa updateLastActivityO , aKO bcm4ko e npeMMHa/io ycneujHO. Ako m 
M3n"b^HeHneTO e Mi/ma/io ycneujHO, MCKaMe fla npeMaxHeM ot fltpBOTO KaTero- 
puflTa. 

OopMa 3a M3npau4aHe Ha cbo6uieHMfl 

HeKa cera M3rpaflMM cpopMaTa 3a M3npaiuaHe Ha cbo6meHkm: 




1 1 .8.2005 r. 20:51 :00 <l van> h H3Ma fla nqflueHflBaw SKEHwre 

1 1 .8.2005 r. 20:50:49 <l van> th caMO HHMa aa ce npwrecHSBaiiJ 

11.8.2005 r. 20:50:07 <bongo> fleuara, KaKso craHa c oha MHKpodyc flero ro 

6m=.CHaxre 

1 1 .8.2005 r. 20:49:48 < bongo ko craEa c SKeHara 

1 1 .8.2005 r. 20:49:43 < bongo KaK e 

1 1 .8.2005 r. 20:49:36 <bongo> 3flpacâ„¢ 



v 




3a Bi/i3ya/iki3kipaHe v\ B"bBe>KflaHe Ha c"bo6iueHMfl me M3no/i3BaMe TextBox 
KOHTpo/ia. B cnynaa ce Hy>KflaeM TextBox KOHTpo/iaTa fla e Ha mhoto peflOBe. 

3a TOBa Lfle npOMeHMM CBOMCTBOTO Multiline Ha true. 

ripn BOfleHeTO Ha pa3ropeiueH pa3roBop Me>Kfly flBaMa noTpe6kiTe/iki 6m 61/1/10 
yflo6HO fla i/ma K/iaBmuHa KOM6nHaunfl 3a M3npaiuaHe Ha BtBefleHO cbo6- 
ifleHne - HeKa c"bo6iueHneTO fla ce M3npaiua npn HaTMCKaHe Ha K/iaBmua 
[Enter]. 3a ue/ua e Heo6xoflMMO fla ce "a6oHnpaMe" 3a c"b6nTneTO 

KeyPressed Ha KOHTpo/iaTa TextBoxSend: 



private void TextBoxSend_KeyPress (ob j ect sender, 

System. Windows . Forms . KeyPressEventArgs e) 
{ 



if ( e.KeyChar == 

{ 

SendMessage ( ) ; 



(char) Keys. Return) 



1004 nporpaMnpaHe 3a .NET Framework (tom 2) 

OopMa 3a TbpceHe 

ripn M3rpa>KflaHe Ha cpopMaTa 3a TbpceHe Tpa6Ba p,a o6"bpHeM BHMMaHne Ha 
hako/iko ochobhm MOMeHTa. Tpa6Ba p,a npeAOCTaBMM MHTepcpeMC, noKa3Baiu 
HeflBycMnc^eHO p,anv\ TbpceHeTO BK/iiouBa AafleH KpnTepnw 3a TbpceHe v\nv\ 
He. 3a ue/ua me M3no/i3BaMe checkBox 6yTOHM. 



Tii pee He 



- n x 




-roAMHw 

TtpceHe no roawHH 

foflMHH: 



S I^T^l 




llpflKop | rio/i | Tpqfl | Pa3r/iejKflaHMfl 







































































































































npwe/iw CMe Haw-ro/iflMaTa B"b3pacT 3a TbpceHe p,a e 122 toamhh (cnopeA 
peKopAMTe Ha TnHec, He e MMa/io no-B"b3pacreH noBeK). 

Hy>KAaeM ce p,a MMn/ieMeHTi/ipaMe cpyHKUMOHa/iHOCT 3a Ao6aB*iHe Ha ncrrpe- 
6v\jen b "cnncbK c npwnjenw" . U\e i/i3no/i3BaMe Cbiuna iioaxoa KaKTO npn 
npeMecTBaHeTO Ha npwyiTe/ii/i ot eAHa KaTeropua b Apyra. IHe cb3AaAeM eAHO 

AMHaMM4HO MeHK). 



K/ineHTCKM c/iom - ASP.NET ye6 npiisioweHMeTO 

Ue/iTa Ha ye6 npi/i/io>KeHkieTO e p,a npeAOcraBM ziecHO AOCTbneH ot 1/lHTepHeT 
noTpe6nTe^CKM MHTepcpewc 3a pa6oTa c ocHOBHaTa cpyHKui/iOHa/iHOcr Ha cmc- 
TeMaTa, KaKTO e onucaHa b HeMHaTa cneuncpMKaunfl. IHe M3rpaAHM to3m ye6 
6a3npaH noTpe6nTe^CKM MHTepcpewc etc craHAapTHMTe cpeACTBa Ha ASP.NET 
m npe3 M3no/i3BaHe Ha 6n3Hec cnon ot ye6 ycnyri/i, komto Bene AUCKyTkipaxMe. 

flM3aMH ci>o6pa>KeHMfl, CBi>p3aHM c ye6 npn.nc»KeHMeTO 

ripn pea/i ki3auki*iTa Ha ue/ikiTe Ha npw/io>KeHkieTO ce M3no/i3BaT ochobho 
MAenTe Ha Lua6/iOHa 3a AH3afiH Model-View-Controller (MVC), npenyneH npe3 
xapaKTepucTMKMTe Ha eAHO ye6 npn^OKeHne. 



T/iaBa 29. npaKTunecKM npoeKT 1005 

HaKpaTKO Ka3aH0, Lua6/iOHMTe 3a p,v\3av\n onucBaT cbiunHaTa Ha peiueHneTO 
Ha necro cpeiuaHM npo6/ieMM, B"b3HMKHa/iM npn pea/ii/i3kipaHeT0 Ha eflHO npn- 
zioxeHMe. no to3m Ha^MH He hm ce Ha/iara BceKM ntT, KaTO ce noaBi/i noAo6eH 
npo6/ieM fla npeoTKpuBaMe peujeHneTO My, a e hy>kho npocTO fla M36epeM v\ 
npn/ic»KMM noflxoflfliu Lua6/iOH b KOHTeKCTa Ha KOHKpeTHaTa 3a,qana. 

Cera me pa3r/ie,qaMe Lua6/iOHa 3a flM3aMH MVC, komto cnoMeHaxMe no-rope. 
Tom e M3K/iK)HMTe/iHO necro M3no/i3BaH npn pea/iM3auMflTa Ha noTpe6kiTe/iCKkifl 
MHTepcpewc Ha eAHO npM/io>KeHMe. nopaflM TOBa, HeroBMTe KOHuenunn me hm 
noMorHaT fla MOfle/iMpaMe cpyHKui/iOHa/iHOcrra Ha HaiueTO ye6 npn^OKeHne, 
KaTO cbmeBpeMeHHO c TOBa noBnujMM rbBKaBOcrra v\ npeM3no/i3BaeMOCTra Ha 
no/iyneHaTa pea/iM3aukm. 

LLIa6/iOH 3a AM3aMH Model-View-Controller (MVC) 

MVC ce Cbcroki ot Tpn ochobhm KOMnoHeHTa: 

1. Model - OTroBapa 3a a6cTpaKunflTa Ha flaHHMTe b npn^OKeHneTo; 

2. View - OTroBapa 3a BM3ya/iHaTa npe3eHTaunfl Ha npn^OKeHneTo; 

3. Controller - OTroBapa 3a peaKunaTa Ha noTpe6MTe/iCKMH MHTepcpewc kbm 
noTpe6nTe^CKMTe KOMaHflM. 

Pa3fle^eHneTO Ha /iori/iKkiTe hm flaBa bbsmokhoct fla npoMeHHMe BC^Ka eflHa 
ot tax, He3aBMCMMO ot ocraHa/iMTe, KoeTO hm ocMrypaBa no-ro/iyiMa rbB- 
KaBOCT. HanpMMep, aKO CMeHMM KOHKpeTHaTa BM3ya/iHa npe3eHTauMa Ha 
flaHHMTe, me ce Ha/io>KM fla npoMeHMM caMO View KOMnoHeHTa, a ocraHa/iMTe 
4 a cm me ocTaHaT ctmnTe. 

nopaflM TOBa, ne Model m View KOMnoHeHTMTe H^MaT flMpeKTHa Bp"b3Ka, MMaMe 

B"b3MO>KHOCT nO eflHO M CbLflO BpeMe fla nOflfl"bp>KaMe pa3/lMHHM BM3MM Ha eflMH 

m ctmn MOfle/i, T.e. eflHM m ctmn flaHHM MO>KeM fla vv\ noKa3BaMe no pa3/iMHHM 
Ha^MHM Ha noTpe6MTe^a. 

flpyro npeflMMCTBO Ha to3m Lua6/iOH e TOBa, ne TpMTe KOMnoHeHTa MoraT ao 
M3BecTHa CTeneH fla ctmecTByBaT He3aBMCMMO eflMH ot flpyr, KoeTO noBMiuaBa 
TAXHaTa npeM3no^3BaeMOCT. 

MVC e cpyHflaMeHTa/ieH Lua6/iOH 3a p,v\3av\u, nopaflM TOBa tom e b ocHOBaTa Ha 

flPyTM Llja6/10HM M MMa MHO>KeCTBO pa3/lMHHM BapMaHTM M MOflMCpMKaUMM. 

M3rpa>KAaHe Ha crpaHMLiMTe 

LUa6/iOH"bT 3a flM3aMH, komto HaM-flo6pe ctneTaBa MVC noflxofla m cbiue- 
BpeMeHHO c TOBa e ziecHO npM/io>KMM b M3rpa>KflaHeTO Ha ye6 npM/io>KeHM5i e 
Page Controller. HeroBaTa ocHOBHa Mflea e fla no/iyuM HTTP 3asiBKaTa, fla 
M3B/iene Heo6xoflMMaTa My MHCpopMauMa ot Hea, fla M3BMKa flafleHM MeTOflM ot 
6M3Hec ^orMKaTa, m b 33bmcmmoct ot pe3y^TaTMTe fla onpefle/iM BMfla Ha 
M3xoflHaTa CTpaHMua. MMeHHO to3m noflxofl ce M3no/i3Ba npM M3rpa>KflaHeTO 
Ha CTpaHMUMTe Ha npM/io>KeHMeTO, KaTO pea/iM3auM*iTa My npe3 ASP.NET e 
M3K^K)4MTe/iHO npocTa nopaflM Ha/iMUMeTO Ha a6cTpaKUMATa system. web. 
ui.Page. Tfl hm npeflocTaBfl v\3\\s\no 6a3MpaH Ha cb6MTMfl HanMH 3a ocbmecr- 



1006 nporpaMnpaHe 3a .NET Framework (tom 2) 

Blaine Ha cnoMeHaTMTe v\p,ev\ a6crpaxnpaMKM ce ot KOHKpeTHOTO mm npefla- 
BaHe b HTTP cpeaaTa. 

flpyrn ochobhm npaBi/i/ia, cna3BaHM npn M3rpa>KflaHeTO Ha CTpaHnunTe, ca: 

1. riwiHO pa3fle/ieHwe Ha /iorm<aTa, cnroBapsima 3a ynpaB/ieHwe Ha crpa- 
HnuaTa ot Ta3M, OTroBapaiua 3a Hei/maTa bm3ma npe3 i/i3no/i3BaHeTO Ha 
code behind. 

2. CaMOcroflTe/iHaTa cpyHKuwoHa/iHOcr v\ bv\3\as\, koato MO>Ke fla 6"bfle 
npen3no^3BaHa b paMKMTe Ha pa3/iwnHki CTpaHnun, ce eHKancynwpa b 
noTpe6i/iTe/iCKi/i kohtpo/ii/i. 

PeiueHMe 3a AOCTi>na ao ye6 yc/iyraTa 

TeHepupaHeTO Ha npoKCM K/iaca 3a flocrbn ,qo ye6 yc/iyraTa v\ npoKCM K/iaco- 

BeTe Ha DTO M Status Enum, M3nO/13BaHM OT HeMHMTe MeTOAM, Ce OCbLUeCTBflBa 

aBTOMaTM^HO ot cpeflaTa 3a pa3pa6oTKa npn flo6aB$iHe Ha ycnyraTa. 

flocTbn"bT ao ycnyraTa me pea/iw3wpaMe npe3 K/iac, komto o6rptiua HeMHOTO 
npoKCM, npeflocTaBflMKM cbiuna MHTepcpewc (no,qo6HO Ha Decorator Lua6/iOHa, 
komto pea/iki3kipa flo6aBAHe Ha flont/iHHTe/iHa cpyHKuwoHa/iHOcr kbm K/iac 
npe3 o6rptiuaHe Ha KOHKpeTeH HeroB eioeMn/iap, a He HacneflHBaHe). Ue/iTa 
My e fla no/iyni/i pe3y/iTaTa ot ki3n"b/iHeHkieTO Ha flafleH MeTOfl, fla o6pa6oTM 
CTaTyca v\ aKO tom a6crpaxkipa ki3K/iionkiTe/iHa cuTyauna, B"b3HkiKHa/ia b ye6 
ycnyraTa, fla npeflM3BMKa cbOTBeTHOTO M3K/iK>neHne, KoeTO fla ce pa3npocrpa- 
HflBa b npe3eHTaunoHHMfl cnov\. no to3m Ha^MH Page Controller K/iacoBeTe ce 
a6cTpaxnpaT ot KOHKpeTHaTa pea/iki3au.kifl Ha npeflaBaHe Ha ki3K/iK>ni/iTe/iHMTe 
CMTyauuM npe3 ye6 yc/iyraTa v\ no/iynaBaT no-yflo6eH MexaHM3tM 3a o6pa6oT- 

BaHeTO MM. 

ABTeHTMKauMn Ha noTpe6nTe/iMTe 

3a aBTeHTMKaunfl Ha noTpe6wTe/ikiTe me w3no/i3BaMe BrpafleHaTa b ASP.NET 
TexHO/iorna "Forms Authentication". 

3a fla noBMUJMM curypHOCTTa, bcmukm napo/ii/i me npeflaBaMe b xeiunpaH bma 
(no a/iropi/iTbM MD5), KaTO xeiunpaHeTO me M3BtpujBaMe oiue npn K/ikieHTa. 

3a pea/iM3kipaHe Ha pa3/iwni/iflTa Me>Kfly rpynnTe noTpe6kiTe/iki b cwcreMaTa me 
i/i3no/i3BaMe Role Based Security. Hpe3 Hero Ha BceKM aBTeHTMKupaH noceTM- 
Te/i me cbnocraBAMe po/ia Ha aflMMHMCTpaTop v\nv\ noTpe6kiTe/i. 

YcTaHOBflBaHeTO Ha kifleHTi/mHOCTra Ha noceTMTe/isi v\ HeroBaTa po/ia me 
octmecTBABaMe b ye6 yc/iyraTa. Ta3M MHCpopMauna ce cbxpaHHBa b cookie 
npi/i K^neHTa, KoeTO e craHflapTeH noflxofl npn ki3no/i3BaHe Ha TaicbB bma 

aBTeHTMKaUMfl. 

YnpaB/ieHMe Ha cecwwTe 

ripi/i yc/iOBi/ie, ne M3no/i3BaMe TexHO/iornaTa "Forms Authentication", koato e 
6a3npaHa Ha cookie, ocurypaBamo aBTeHTi/mHOcrra Ha noceTi/iTe/ikiTe, to 
MO>KeM cnoKOMHO fla ctxpaHflBaMe v\ cecv\v\uv\s\ MfleHTucpuKaTop b in-memory 



T/iaBa 29. npaKTunecKM npoeKT 1007 

cookie npn Knv\enja. Ctiuo TaKa npn^OKeHneTO ki3no/i3Ba CTaHflapTHna 
MexaHM3"bM 3a ynpaB/ieHkie Ha session o6eKTa - inProc. 

KaKTO Bene 6e cnoMeHaTO, ye6 ycnyraTa pea/iki3i/ipa co6cTBeH MexaHM3"bM 3a 
ynpaB/ieHkie Ha cecnnTe, 6a3npaH Ha TaeH hm3, komto ta npeflocraBfl npn 
aBTeHTMKaunfl, a Hue noAaBaMe to3m hm3 Ha BceKM Hei/m MeTOA, komto ro 
M3MCKBa. CbxpaHeHkieTO Ha to3m hm3 e b cecuMHua o6eKT ot ch>o6pa>KeHkifl 3a 
curypHOCT. 

noflflp"b>KKaTa Ha co6cTBeHa ceci/ia ot ycnyraTa Ha/iara pa3pa6oTBaHeTO Ha 
HanwH 3a CMHxpoHM3aunfl Ha ABeTe cecnn. To3m npou.ec Tpa6Ba p,a ce 
M3BtpujBa npn BCAKa aBTeHTMKupaHa 3a*iBKa, 3a kohto Hflae crpaHi/iua. 

YnpaB/ieHMe Ha M3K/iiOHMTe/iHMTe CMTyauiMM m rpeujKMTe 

Bcm4km rpeujKM, B"b3HMKHa^n b npi/i/io>KeHkieTO me a6cTpaxnpaMe npe3 i/i3k/ik>- 
neHi/m. KoraTO B"b3HMKHe M3K/iK)4MTe^Ha CMTyaunfl, aKO MO>Ke Tfl ce o6pa6oTBa 
ot MeTOAa. Heo6pa6oTeHMTe ot MeTOAa ki3K/iK>neHi/m me ce ocraBAT p,a ce 
pa3npocTpaHAT no CTeKa 6e3 p,a ce o6rp"biuaT. ripwukiHaTa 3a TOBa e b Ma/iKaTa 
no o6eM v\ pa3c/ioeHOcr npe3eHTau.i/iOHHa ziorwKa, KoeTO HaMa/iflBa no/i3aTa ot 
o6rp"bmaHeTO Ha i/i3K/iK)neHkiflTa b TaKMBa, komto p,a ca no-CMwc/ieHM 3a 

M3BMKBaiUMTe MeTOAH. 

Bcm4km Heo6pa6oTeHM M3K/iK)neHMfl me ce o6pa6oTBaT npe3 MexaHM3Ma 3a 
r/io6a/iHa o6pa6oTKa Ha ki3K/iK>neHkiflTa. 

me pea/iki3i/ipaMe 3anncBaHeTO Ha bcmukm M3K/iK)nkiTe/iHM CMTyau.nn b 
exception log cpaw/i, komto ce HaMupa b temp AnpeKTopn^Ta Ha noTpe6kiTe/ifl 
(user account), c komto pa6oTM ASP.NET npi/i/io>KeHkieTO. ripi/mi/maTa 3a TOBa 
peiueHkie e, ne temp AHpeKTOpwflTa 3aeAHO C AHpeKTOpwflTa temporary files 

ca eAMHCTBeHMTe MecTa no cpaw/iOBaTa ci/icreMa, 3a komto craHAapTHMAT 
noTpe6i/iTe/i, c komto pa6oTM ASP.NET, MMa npaBa p,a nuiue. flpyroTO yAo6HO 
MflCTO 3a 3anncBaHe Ha i/i3K/iK>neHMfl e Event Log, 3a komto craHAapTHMAT 
noTpe6i/iTe/i cbiuo H^Ma npaBa 3a nucaHe. 

nopaAM Tpuc^OMHaTa apxnTeKTypa Ha cwcreMaTa AOCTbnvr ao 6a3aTa ashhh 
MO>Ke p,a MMHe caMO npe3 ye6 ycnyraTa, KoeTO He e Ao6pa npaKTMKa 3a 3annc- 
BaHe Ha M3K/iK>neHi/m. Ako MCKaMe p,a M36erHeM orpaHkmeHWflTa Ha craHAapT- 
HMfl noTpe6kiTe/i, MO>Ke p,a ce MMnepcoHnpaMe BpeMeHHO (b paMKMTe Ha 
MeTOAa, b komto M3B"bpujBaMe npoueAypaTa no 3anncBaHe Ha ki3K/iK>neHkiflTa) 
c noTpe6kiTe/i, komto MMa Heo6xoAHMkiTe npaBa, ho 3a M3MCKBaHMflTa Ha TOBa 
npn^OKeHne noAo6HO peiueHne He e Hy>KHO. 

llMn/ieMeHTaMMH Ha ASP.NET ye6 npusioweHueTO 

HeKa cera pa3r/ieAaMe ocHOBHMTe MOMeHTM ot pea/ii/i3au.i/iflTa Ha ASP.NET ye6 
npw/io>KeHkieTO. 

flMarpaMa Ha ye6 npMJio>KeHMeTO 

Eto KaK M3Me>KAa AnarpaMaTa Ha CTpaHnunTe b ye6 npw.no>KeHkieTO v\ npexo- 
AMTe Me>KAy tax (screen flow diagram): 



1008 flporpaMnpaHe 3a .NET Framework (tom 2) 



HananHa CTpaHnqa 



-HeperncTpupaHM noTpe6nTenn- 



dpaHMLia 3a pemcTpupaHe 



PerncTpupaHM 
noTpe6nTenn 



TnaBHa 
HaBuraqnn 



CnMCbK c 

npkisrrenki 

















1 




1 






L_ ZJ 




fluanor 











CTpaHnqa 3a 
aBTeHTHKaqMa 



TbpceHe Ha 
noTpe6nTenn 



PeflaKL(Mfl Ha 
npocpun 



flo6aBflHe 
Ha npusrren 



Pa3me>KflaHe Ha npodpi/in 



PeflaKL|na Ha cnkictKa c 
npkisrreni/i 



CiwaHa Ha napona 



— /admin-^ AflMMHMCTpaTHBHa CTpaHMqa 



Ye6 npn^OKeHneTO o6c/iy>KBa Tpn rpynn noceTHTe/iw: HeperncTpupaHM ncrrpe- 
6v\jenv\, perncTpupaHM noTpe6kiTe/ii/i v\ aflMMHMCTpaTop. nopaflu Ta3M npwuwHa 
b cawTa ce o6pa3yBaT neTkipw ochobhm sv\p,a CTpaHnun b 3aBMCMMOCT ot rpy- 
nuTe, komto MMaT flOCTtn flo tax: 

1. CTpaHnun, AOCTbnHM caMO 3a perncTpupaHMTe noTpe6wTe/in. 

2. CTpaHnun, AOCTbnHM caMO 3a aAMMHwcrpaTopa Ha cwcreMaTa. 

3. CTpaHnun, ao komto MMa Aocrbn KaKTO aAMMHMCTpaTopa, TaKa m noTpe- 
6nTe^MTe. 

4. CTpaHMun, AOCT"bnHM 3a BCM4KM noceTkiTe/iw Ha caMTa. 

kl3rpa>KAaHe Ha CTpammMTe 

Cera me ce cnpeM Ha ocHOBHMTe KOHuenunn, CB"bp3aHM c pea/iki3kipaHeTO Ha 
BCflKa eAHa crpaHi/iua ot npw/io>KeHkieTO. 

Bcm4km KOHTpo^epn Ha crpaHkiukiTe me HacneAflBaT K/iaca 

BaseDatingSitePage, KOMTO U\e UMa 3a ue/1 Rd AecpMHkipa 6a30Bkm KOHTpo/iep 

3a TeKymoTO npw/io>KeHi/ie. HeroBaTa pea/iM3aui/i*i me e Aocra a6cTpaKTHa, 
KaTO ochobhoto Hemo, KoeTO me AecpMHupa e eAHH Template Method - 

InitializeComponent, KOMTO me ce npeAecpMHkipa OT KOHKpeTHMfl KOHTpo/iep 

m b Hero me 6"bAe pea/iw3npaHa ziori/iKaTa 3a MHMuna^M3auMfl Ha KOMnoHeH- 
TMTe (Haki-4ecTO a6oHnpaHe 3a Cb6kiTi/m). 



protected override void Onlnit (EventArgs e) 

{ 

InitializeComponent ( ) ; 



T/iaBa 29. npaKTunecKM npoeKT 1009 



base . Onlnit (e) ; 
} 

protected virtual void InitializeComponent ( ] 

{ 

} 



no OTHOiueHMe Ha BM3kmTa Ha CTpaHnunTe bbb bcmukm tax me ce BK/iK>nBa 
eflHa noTpe6kiTe/ici<a KOHTpo/ia, koato me flecpMHupa cbfltpaoHkieTO Ha 
<head> ceKUMATa Ha html, a MMeHHO MeTa MHCpopMaunaTa, ess cpaw/ia etc 
cm/iOBe, popup, js cpaw/ia v\ me ce napaMeTpn3npa 3ar/iaBkieTO 1/1. OcBeH TOBa 
m b CTpaHnunTe c r/iaBHa HaBuraukifl me ce BK/iK>nBa noTpe6i/iTe/iCKa koh- 
Tpo/ia, koato pea/iki3wpa Hei/maTa bm3ma. 

3a KOHKpeTeH npuMep me npoc/ieflkiM M3rpa>KflaHeTO Ha crpaHwuaTa 

edit_f riends_list . aspx. 

HeMHaTa ue/i e fla npeflocraBi/i Ha noTpe6i/iTe/ifl bbsmokhoct fla peflaKTwpa 
CBOfl cnncbK c npuflTe^n. 3a TOBa ntpBO Tpa6Ba fla HaMepuM HanwH 3a 
BM3ya^M3aunfl Ha cnwcbKa c npwflTe/iw. ripn TtpceHe Ha npaBki/iHi/m noflxofl e 
xy6aBO fla MMaMe npeflBMfl, ne MflenTe My MoraT fla 6"bflaT npei/i3no/i3BaHM v\ b 
CTpaHnuaTa 3a npemefl Ha cnwcbKa. 

M3rpa>KAaHe Ha crmcbKa c npMfue/iM 

CnnctKBT c npuflTe^n npeflcraB/iHBa kiepapxi/mHa CTpyKTypa c eflHO hmbo Ha 
B^o>KeHOCT. ToBa hm HaBe>Kfla Ha MMCb/iTa, ne e yflo6HO i/i3no/i3BaHeTO Ha 
B^o>KeHM kohtpo^m 3a pea/iki3aukiflTa My. nopaflu CBoyua zieKcrra v\ bbsmok- 
hoct 3a no-irb/ieH kohtpo/i Btpxy html, komto ce npoflyuupa, Repeater 
KOHTpo^aTa e noflxoflaiu KaHflMflaT 3a Ta3M ue/i. Cera ocraBa fla pea/in3wpaMe 
noirb/iBaHeTO v\ c flaHHM. ToBa ce cnyuBa b MeTOfla Page_Load, KaTO aKO 
CTpaHnuaTa He e b cbcroflHkie Ha PostBack ce M3BMKBa MeTOfla 
PopuiateFriendsListo , komto noirb/iBa cnncbKa. ToBa CTaBa, KaTO Ha 

BtHUJHMfl Repeater ce nOflafle 3a DataSource MaCMB C 06eKTM OT TMn 
CategorizedFriendsDTO. C/iefl TOBa B MeTOfla "a60HkipaH" 3a HerOBOTO 
C"b6MTMe ItemDataBound, Ha CbOTBeTHklfl BBTpeweH Repeater nOflaBaMe 3a 

DataSource MacuBa c npwflTe/ikiTe b TeKymaTa KaTeropna. 



private void PopulateFriendsList ( ) 

{ 

GetCategorizedFriendsResult result = 

Da tingSiteService Provider . GetCategorizedFriendsList (User ID, 
WebServiceSessionID) ; 
RepeaterCategories . DataSource = result . CategorizedFriends; 
RepeaterCategories . DataBind ( ) ; 
} 

private void RepeaterCategories_ItemDataBound (ob j ect sender, 
RepeaterltemEventArgs e) 



1010 flporpaMnpaHe 3a .NET Framework (tom 2) 



CategorizedFriendsDTO categorizedFriends = 
(CategorizedFriendsDTO) e . Item. Dataltem; 



Repeater RepeaterFriends = 

e . Item. FindControl ( "RepeaterFriends" ) as Repeater; 
if (RepeaterFriends != null) 



{ 



RepeaterFriends . DataSource = categorizedFriends . Friends; 
RepeaterFriends . DataBind ( ) ; 



Eto KaK M3Me>Kfla crpaHi/iuaTa, koato noi<a3Ba cnwcbKa c npwflTe/iw: 



npusTe/iki TbpceHe Ha noTpeGkiTe/in PeflaKuiMa Ha npocfikisia 



I HOBM KOHTaKTH 

Penka npeMecTH b apyra KaTeropna l/l3TpHH 

bond flpeMecTH b apyra KaTeropna H3TpHH 

I KojierM npeHMeHVBaM H3TpHH 

Mara flpeMecTH b apyra KaTeropna H3TpHH 

lubka flpeMecTH b apyra KaTeropua M3TpnM 

I New Category npeHMeHVBaM l/l3TpHH 

floSaBH KaTeropna 



Cera, HeKa pa3r/ieAaMe pea/iki3wpaHeTO Ha onepaunnTe, CBtp3aHM c peAaK- 
UMATa Ha cnwcbKa c noTpe6kiTe/ikiTe. 

OnepauMM 3a peaaKuna Ha cnucbKa 

ToBa ca AewcTBWflTa 3a Ao6aBHHe, npenMeHyBaHe, M3TpnBaHe Ha KaTeropua, 
npeMecTBaHe v\ M3TpnBaHe Ha npwflTe/i ot AaAeHa KaTeropi/m. B 3aBMCMMOCT ot 
Hy>KAMTe Ha noTpe6kiTe/ifl MO>KeM p,a pa3Ae/ikiM AewcTBUflTa Ha ABa Tuna: 

- AeMCTBMfl, M3MCKBaiUM caMO nOTB"bp>KAeHkie (M3TpnBaHe); 

- AeMCTBMfl, M3MCKBaiUM AOITb/lHHTe/lHa MHCpOpMaUMfl CB"bp3aHa c ocbme- 

CTBABaHeTO cm (Ao6aBAHe, npenMeHyBaHe v\ npeMecTBaHe). 

riopaAM TOBa pa3Ae^eHne me M3no/i3BaMe pa3/ikmHki iioaxoah 3a pea/iw3auw5i 
Ha pa3^M4HMTe rpynn p,ev\CTBV\n. A6crpaKTHkiflT KpnTepnw, M3no/i3BaH 3a OTAe- 
/i*iHe hm Kapa v\ b ABaTa c/iyna*i p,a TbpcuM noAxoA, yao6eH 3a npew3no/i3BaHe 
Ha cpyHKunoHa^HOCTTa m b Apyrn CTpaHMUM. 



T/iaBa 29. flpaKTMHecKH npoeKT 1011 



fleMCTBMfl, M3MCKBail4M caMo noTBi>p>KAeHHe 

Eto KaK M3Me>KflaT fleMCTBMATa, komto noTpe6kiTe/i$iT Tpa6Ba fla noTBtpflu 
npeAM M3n"b^HeHkieTO mm: 

3 HOBM KOHTaKTM 

Penka npeMecTH b jpyra KaTeropna H3TpHH 

bond npeMecTH b apvra KaTeropna M3TpHH 

a Ko/iern npeHMeHVBafi l/l3TpHH 

Mara 
lubka 



Microsoft Internet Explorer 



2£] 



fi New Category J J CHrypeH sw cie ne MciraTe aa H3TpneTe KaTeropâ„¢ KcmerH? 

HoSaBH KaTeropna 



_ 



OK 



Cancel 



l/l3K/iK>nkiTe/mo yflo6eH v\ zieceH Hani/m 3a pea/iki3aukifl Ha to3m bv\r B3an- 
MOflewcTBUfl e npe3 M3no^3BaHeTO Ha JavaScript 3a M3BMKBaHe Ha Ana/iora 33 
noTB"bp>KAeHMe Ha cbOTBeTHkm 6pay3tp npn c"b6nTneTO onclick Ha 
LinkButton, OTroBapaiu 3a M3TpnBaHeTO. riopaflu cbo6pa>KeHi/ifl 3a npei/i3no/i- 
3BaHe me pea/iki3kipaMe KOHTpo/ia, koato Hac/ieflflBa LinkButton v\ ocbmecr- 
BflBa ctOTBeTHaTa cpyHKuwoHa/iHOcr: 



public class Conf irmationLinkButton : LinkButton 

{ 

public string Conf irmationMessage 

{ 



set 
{ 



this .Attributes [ "onclick" ] = String . Format 
"return conf irm ( ' { } ' ) ; " , value); 



} 



no T031/1 HanwH caMO npn no/icoKMTe/ieH cnroBop Ha noTpe6i/iTe/ifl, me ce 
npeflM3BMKa cbOTBeTHOTO PostBack c"b6nTne, OTpa3ABaiuo HaTMCKaHeTO Ha 
6yTOHa, KoeTO me ce o6pa6oTM ot cbOTBeTHna a6oHnpaH MeTOA b KOHTpo/iepa 
Ha CTpaHnuaTa. 

KoHKpeTHO b CTpaHnuaTa 3a pep,aKu,wn TOBa me CTaBa npe3 npuxBaiuaHe Ha 

Cb6MTMeTO ItemCommand Ha CbOTBeTHklfl Repeater, K"bfleTO B 3aBMCMMOCT OT 

MMeTO Ha KOMaHflaTa Ha cbOTBeTHna 6yTOH ce M3BMKBa MeTOflvr 3a ocbmecT- 

BflBaHeTO v\. 



private void RepeaterCategories_ItemCommand (ob j ect source, 

RepeaterCommandEventArgs e) 
{ 



1012 flporpaMnpaHe 3a .NET Framework (tom 2) 



if (e . CommandName . Equals ( "DeleteCategory" ) ) 

{ 

int categorylD = Convert . ToInt32 (e . CommandArgument ) ; 
DeleteCategory (categorylD) ; 



fleilCTBMfl, M3MCKBail4M AOn~b/1HMTe/1Ha MHC|30pMaLJMfl 

flpyraTa KaTeropua p,ev\CTBv\s\ , komto ye6 npi/i/io>KeHkieTO no3BO/iflBa Ha 
noTpe6nTe^MTe p,a M3B"bpujBaT ca p,ev\CYBv\s\ , M3MCKBaiun AOirb/iHi/ue/iHa hh- 
cpopMaunfl 3a ocbmecTBflBaHeTO cm. Eto npuMep: 



B HOBM KOHTaKTU 

Penka npeMecTH b apvra KaTeropna H3TpnPi 

bond npeMecTM b apyra KaTeropna M3Tpnki 

B Kcmern E!j | 

Mara Hi 

lubka nj 

B New Category £T| 
Jlo6aBH KaTeropna 



p flooaBsme Ha KaTeropun - Microsoft Internet Explorer 



.Jn|x| 



IAmb Ha KaTeropkiaTa: 





flooaen 



Ta3M rpyna flewcTBUfl yqo6HO ce pea/iki3kipa npe3 M3HacaHe Ha cb6npaHeTO Ha 
AOirb/iHMTe/iHa MHCpopMauna M3BtH ocHOBHaTa CTpaHnua npe3 popup npo30- 

peu, KOMTO Tfl KOHTpO^Mpa. 

3a pa6oTa c popup npo3opun HHMa craHAapTHa cpyHKuwoHa/iHOcr b ASP.NET m 
3aTOBa me ce Ha/io>Ki/i Aa m3mmc^mm co6cTBeH MexaHM3"bM 3a noKa3BaHe Ha 
popup Ana/i03ki npe3 JavaScript v\ 3a npeAaBaHe Ha AaHHkue kbm ocHOBHaTa 
CTpaHnua, koato Aa m o6pa6oTM. 

riopaAM Heo6xoAMMOCTTa ocHOBHaTa crpaHkiua Aa pa36epe Kora AaAeHOTO 
AewcTBue ce e ocbmecrBM/io, Tpa6Ba Aa pea/ii/i3i/ipaMe b"B3mo>khoct popup 
npo3opeu"bT Aa npeAH3BMKBa PostBack cb6nTne b OTBapaiuaTa ro CTpaHnua 
cnep, KaTO 3aB"bpujn pa6oTaTa cm. 

KaKTO ce BM>KAa ot cxeMaTa no-AO/iy, 3a Aa ocbiuecTBMM Ta3M KOMyHMKauna, 
Tpa6Ba Aa npeMMHeM npe3 Tpn eTana: 

1. OTBap^He Ha popup npo3opeu.a. 

2. npeAM3BMKBaHe Ha PostBack cb6nTne b OTBapaiuaTa crpaHkiua. 

3. 06pa6oTBaHe Ha PostBack Cb6nTneTO. 



C^eABaiuaTa cxeMa i/i/uocrpwpa Te3M eTann: 



T/iaBa 29. npaKTunecKM npoeKT 1013 




Popup 



2. ripeflM3BMKBa PostBack b 

poflMTencKaTa CTpaHMU,a c napawieTpn 

noflafleHOTO My wvie Ha KOHTpona - 

(KaTO eventTarget) \a cboa 

MfleHTMCpMKaTop (KaTO eventArgument). 




1. OTBapan/ie popup, 

KaTO My noflaBaMe MfleHTMCpMKaTop c 

komto fla ce npeflCTaBH n MMeTO Ha KOHTponaTa 

koato me o6pa6oTM PostBack ct6MTneTO 

b poflMTencKaTa CTpaHi<ma. 



PopupFinishedHandlerControl 



3. ripeflM3BMKBa ci.6MTMeT0 PopupFinishedEvent, 

KoeTO b apryMeHTMTe cm npirrewaBa 

MfleHTudpuKaTopa Ha popup-a. 



EditFriendsListPage 



HeKa pa3r/ieflaMe onucaHMTe 3 eTana 3a pa6crraTa c popup npo3opun b no- 
ro/ieMM AeTaM/in: 

1. OTBapyme Ha popup npo3opeu.a. 

KoraTO OTBap^Me popup npo3opeu.a npe3 Query-string nacrra ot HeroBna URL 
aflpec My noflaBaMe MMeTO Ha KOHTpo/iaTa (handiercontroi), koato me 

06pa60TM PostBack Cb6l/ITkieTO M MfleHTMCpMIOTOp (popup_name), C KOMTO TOM 

me ce MAeHTMCpMUMpa npeA OTBapaiuaTa ro crpaHMua. 



var popup = 

window. open ( " . . /f riendslist/rename_category . aspx?category_id=" 
+ categorylD + "&f inished_handler=" + handlerControl + 
"&popup_name=" + popupName, "renameCategoryWindow" , features) ; 



2. npeflM3BMKBaHe Ha PostBack cb6MTMe b OTBapaiuaTa crpaHMua. 

Othobo c or/iefl Ha npeM3no/i3BaHe Ha Ta3M cpyHKUMOHa/iHOCT, me 
Kancy/iMpaMe TOBa fleMCTBMe b OTae/ma noTpe6MTe/iCKa KOHTpo/ia 

PopupFinishedDispatcherControl. Tfl U\e B3eMa CbOTBeTHaTa MHCpopMaUMfl 
OT QueryString M U\e npeAM3BMKBa PostBack B OTBapamaTa CTpaHMua C 

napaMeTpM MMeTO Ha cbOTBeTHMa handler m MMeTO Ha popup Ana/iora. 



window. opener . do PostBack ( ' <%= FinishedHandlerControl%> ' , 

'<%= PopupName %>') ; 



3. 06pa6oTBaHe Ha PostBack cb6MTMeTO. 



1014 nporpaMnpaHe 3a .NET Framework (tom 2) 

AHa/iorkmHO Ha npeAM3BMKBaHeTO, o6pa6oTKaTa Ha PostBack c"b6nTneTO me 
pea/iki3kipaMe npe3 noTpe6kiTe/ici<a KOHTpo/ia. Ta me wMn/ieMeHTkipa MHTep- 

Cpekica IPostBackEventHandler M B AecpHHkipaHklfl OT Hero MeTOA me npeAM3- 
BMKBa HopMa^HOTO Cb6kiTkie PopupFinished etc ctOTBeTHMTe apryMeHTu: 



public class PopupFinishedHandlerControl : UserControl, 
IPostBackEventHandler 

{ 

public event PopupFinishedHandler PopupFinished; 

protected PlaceHolder PlaceHolderPostbackEventRef erence; 

public void RaisePostBackEvent ( string eventArgument ) 

{ 

if (PopupFinished != null) 

{ 

PopupFinished (this, 

new PopupFinishedEventArgs (eventArgument) ) ; 
} 
} 

protected override void Render (HtmlTextWriter writer) 

{ 

HtmlAnchor htmlAnchorPostBackRef erence = 

new HtmlAnchor ( ) ; 
htmlAnchorPostBackRef erence . ID = this . UniquelD; 
htmlAnchorPostBackRef erence . HRef = 
String . Concat ( " j avascript : " , 

Page . Get PostBackEventRef erence (this ) ) ; 
htmlAnchorPostBackRef erence . InnerHtml = this . UniquelD; 
PlaceHolderPostbackEventRef erence . Controls .Add ( 
htmlAnchorPostBackRef erence) ; 



base . Render (writer) ; 
} 



} 



public class PopupFinishedEventArgs : EventArgs 

{ 

private string mPopupName; 

public string PopupName 

{ 

get 

{ 

return mPopupName; 

} 
} 

public PopupFinishedEventArgs ( string aPopupName) 



T/iaBa 29. npaKTunecKM npoeKT 1015 



{ 

mPopupName = aPopupName; 

} 
} 

public delegate void PopupFinishedHandler (ob j ect sender, 
PopupFinishedEventArgs e); 



Pea^M3aunflTa Ha to3m K/iac e craHflapTHa, c ki3K/iK)neHkie Ha MeTOfla 
Render o . Ue/iTa Ha npeflecpMHi/ipaHeTO My e fla 3aflewcTBaMe BK/iionBaHeTO Ha 
client-side e/ieMeHTi/ue, pea/iki3kipamw cpyHKuwoHa/iHOCTra 3a PostBack b 
pe3y^TaTHMfl HTML Ha cbfltpwamaTa KOHTpo/iaTa crpaHwua. 

Cera ocTaBa caMO ocHOBHaTa crpaHwua fla KOHcyMupa cb6kiTi/ieTO, OTpa3HBamo 
ycneujHOTO nprncnionBaHe Ha flewcTBueTO v\ fla M3B"bpujn Heo6xoflkiMaTa b to3m 
c/iynaw o6pa6oTKa. KoHKpeTHO npn crpaHwuaTa 3a peflai<ui/m TOBa e o6hoba- 
BaHeTO Ha cni/icbKa. 



private void IncludePopupFinishedHandler_PopupFinished i 
object sender, PopupFinishedEventArgs e) 

{ 

PopulateFriendsList ( ) ; 

} 



Bn3ya/iM3auMn Ha pe3ysiTaTMTe ot rbpceHeTO 

3a BM3ya^M3npaHe Ha HaMepeHkue noTpe6kiTe/ii/i ot .qafleHO TbpceHe i/i3no/i3- 
BaMe DataGrid etc crpaHwpaHe. Pea^M3aunflTa Ha crpaHkipaHeTO M3B"bpiu- 
BaMe KaTO ntpBO ot ycnyraTa B3eMaMe 6poa Ha HaMepeHMTe noTpe6nTe^n, 3a 
fla M3HMC/1MM 6poa Ha CTpaHnunTe, a cnep, TOBa B3eMaMe flaHHMTe caMO Ha 
Te3M noTpe6nTe^n, komto ca b paMKMTe Ha TeKymo M36paHaTa crpaHi/iua. 

KaKTO 6e cnoMeHaTO, 3a TpaHcnopT Ha flaHHMTe Me>Kfly ye6 yc/iyraTa v\ 
ASP.NET npw/io>KeHkieTO ce ki3no/i3BaT Data Transport Objects. ripoKCM K/iaco- 
BeTe Ha Te3M o6eKTM, KaKTO v\ caMMTe Te, ca K/iacoBe c ny6/ikmHki no/ieTa, 

KOeTO npaBM HeB"b3MO>KHO M3n0^3BaHeTO Ha MeTOfla DataBinder . Eval ( ) 3a 

M3B/iMnaHe Ha CTOMHOCTMTe Ha Te3M no/ieTa. Boundcoiumn M3no/i3Ba MMeHHO 
to3m Ha^MH. ToBa 3aeflHO c /lkincaTa Ha HtmiEncoding Ha flaHHMTe b Hea hm 
Kapa fla n 3aMeHMM c Tempiatecoiumn. Pea^M3npaHeTO Ha TOBa peiueHne 
CTaHa, KaTO ki3no/i3BaMe itemTempiate Lua6/iOHa Ha KO/iOHaTa v\ b Hero 
npocTO BK^K)4BaMe ctOTBeTHaTa MHCpopMauna b >xe/iaHkiyi ot Hac bma: 



<asp : tempiatecoiumn headertext="rpafl"> 
<itemtemplate> 
<%# 

Server .HtmlEncode ( ( (UserProf ileDTO) Container . Dataltem) .Town) 

</itemtemplate> 
</asp : templatecolumn> 



1016 flporpaMnpaHe 3a .NET Framework (tom 2) 



Peann3aunn Ha A^a/iora mokay noTpe6nTe/in 

flwa/iorbT Me>Kfly noTpe6nTe/in me pea/ii/i3kipaMe b popup crpaHkiua, koato 
M3Me>Kfla no c/ieflHi/m Hani/m: 



jlflnajior :: lubka - Microsoft Internet Explorer 



[29.10.2005 r. 01: 25:22]<bongo — > lubka> KaK cm? 
[29.10.2005 r. 01: 25:09]<bongo — > lubka> zdravei 



__inj_xj 



H3npaTki 



riopaflu cpyHKu.kiOHa/iHOTO M3MCKBaHe eflMH noTpe6kiTe/i fla MMa bbsmokhoct 
Aa 6"bAe b pe>KMM Ha flwa/ior c hako/iko cbom npi/mTe/iw eAHOBpeMeHHO, ce 
Ha/iara npn o6pa3yBaHeTO Ha MMeTO Ha npo3opeu.a 3a flwa/ior fla y^acTBa v\ 
noTpe6nTe^CKMflT MfleHTucpuKaTop Ha cbOTBeTHna npwflTe/i. Eto KaK pea/iM3M- 
paMe TOBa: 



function openDialogPopup (userlD, userName) { 

var popup = window. open (".. /messages/dialog . aspx?user_id=" 
userlD + "&user_name=" + userName, 
"dialogWindow" + userlD, features); 
if (window. focus ) {popup . focus () } 
} 



flpyroTO npeflMMCTBO Ha to3m MeTOfl e cbomctboto, ne KoraTO noTpe6kiTe/iHT ce 
onuTa flBa nvrii fla B/ie3e b pe>KMM Ha flkia/ior c eflMH v\ cbu\ cbom npwflTe/i 
cbOTBeTHMfl npo3opeu me ce npei/i3no/i3Ba T.e. H^Ma fla ce otbopat flBa 
OTfle^HM npo3opeua. 

CaMaTa CTpaHnua 3a flua/ior me pea/ii/i3i/ipaMe KaTO cbBKyrmocr ot flBe 
CTpaHnun, komto ca pa3no^o>KeHM b OTfle/iHi/i paMKM (frames). EflHaTa crpa- 
Hnua message_input.aspx me cbfl"bp>Ka MHTepcpewca 3a nucaHe Ha c"bo6- 



T/iaBa 29. npaKTunecKM npoeKT 1017 

meHne, a flpyraTa messages_dispiay.aspx me OTroBapyi 3a BM3ya^M3npaHeT0 
Ha noc^eAHMTe 50 Cbo6meHkifl, pa3MeHeHM Me>KAy ABaMaTa noTpe6kiTe/iki. 
To3M noAxoA hm Aasa bbsmokhoct p,a o6HOBABaMe ABeTe CTpaHMun no 
OTAe/mo. TaKa crpaHwuaTa messages_dispiay.aspx ce npe3ape>KAa He3aBM- 
cmmo Ha BceKM 5 ceKyHAM, KaKTO m npn ycneujHO M3npaiuaHe Ha cbo6meHkie 
ot noTpe6kiTe/i*i. 3a HeroBO yAo6cTBO ce Ha/iara npn bcako o6HOBABaHe p,a ce 
3ana3Ba TeKymaTa no3nunfl Ha n/i"b3rana Ha crpaHkiuaTa. ToBa me pea/iM3M- 
paMe KaTO npn npe3ape>KAaHeTO Ha crpaHkiuaTa npe3 JavaScript 3anncBaMe 
TeKyiunTe no3nunn v\ vv\ M3npaiuaMe kbm cbpBtpa. Cnep, KoeTO npn 3ape>K- 
AaHe Ha o6HOBeHaTa crpaHwua vv\ npw/iaraMe othobo Btpxy Hea. 



function ref reshPage ( ) { 

persistScrollPositions ( ) ; 

document . forms [ ' FormMessages ' ] . submit ( ) ; 
} 

function applyScrollPosition ( ) { 

window. scrollTo (<%= ScrollXPosition%>, <%= ScrollYPosition%>) 
} 

window. onload = applyScrollPosition; 
window. setTimeout ( "ref reshPage ()" , 5000 ) ; 



B nOCOneHklfl KOA ScrollXPosition M ScrollYPosition ca CBOMCTBa Ha 
K/iaca MessagesDisplayPage. ETO TeXHMTe AecpMHMUMM: 



protected string ScrollXPosition 

{ 

get 

{ 

string result; 

if ( ! HtmllnputHiddenScrollXPosition .Value . Equals ( 
String . Empty) ) 

{ 

result = HtmllnputHiddenScrollXPosition .Value; 

} 
else 

{ 

result = "0"; 

} 

return result; 

} 
} 

protected string ScrollYPosition 

{ 

get 

{ 

string result; 



1018 flporpaMnpaHe 3a .NET Framework (tom 2) 



if ( ! HtmllnputHiddenScrollYPosition .Value . Equals 
(String . Empty) ) 

{ 

result = HtmllnputHiddenScrollYPosition .Value; 

} 
else 

{ 

result = "0"; 

} 

return result; 

} 
} 



JavaScript MeTOflvr persistscroiiPositionsO B3eMa TeKymnTe no3nunn Ha 
n/i"b3rana v\ vv\ 3anncBa b ckpmtm no/ieTaTa Ha cpopMaTa FormMessages. 

Bn3ya^M3npaHO Ha cbo6meHkiflTa pea/iw3npaMe npe3 Repeater KOHTpo/ia. 

Pea/iM3auMn Ha Aocrbna ao ye6 yc/iyraTa 

KaKTO cnoMeHaxMe b npeAHaTa nacr, AOCTbirbT ao ye6 yc/iyraTa me ocbiue- 

CTBMM 4pe3 K/iac DatingSiteServiceProvider, KOMTO fl 06rp"biua M npaBM 

npoBepKa 3a BMfla Ha craTyca. nopaflu TOBa, ne yc/iyraTa He ce npoMeHJi b 
paMKMTe Ha eflHO crapTkipaHe Ha npn/ic»KeHkieTO, e xy6aBO fla cnecTMM 6e3- 
CMnc^eHOTO ct3AaBaHe Ha hob eK3eMn/i*ip ot Hea npn bcako BMKaHe Ha HenH 
MeTOfl. ToBa me nocmrHeM KaTO HanpaBMM bcmuki/i MeTOflu Ha K/iaca craTMUHM 
m M3no/i3BaMe craTkinHa n/ieH-npoMeH/ikiBa, koato cohm kbm eioeMn/iflp Ha 
yc/iyraTa, cb3flaAeH b craTkinHMfl KOHCTpyKTop. 



public class DatingSiteServiceProvider 

{ 

private static DatingSiteWebService mService 
new DatingSiteWebService ( ) ; 



MeTOfltT, komto me M3BtpujBa cbOTBeTHaTa npoBepKa, e 
Throwif Exception o . Tom me M3no/i3Ba cpaKTa, ne BCM4KM CTaTycn, komto 
a6cTpaxnpaT ki3K/iK)neHkifl b KOHTeKcra Ha noBeneTO MeTOflu ca onucaHM b 

MethodStatus . 



private static void Throwif Exception (String aStatus) 

{ 

Exception exception = null; 

if (aStatus. Equals (MethodStatus . InvalidSession . ToString ( ) ) ) 

{ 

exception = new InvalidSessionException ( ) ; 

} 
else 

if (aStatus. Equals (MethodStatus . InvalidParameters . ToString ( ) ) ) 



T/iaBa 29. npaKTunecKM npoeKT 1019 



{ 

exception = new InvalidParametersException ( ) ; 

} 
else 

if (aStatus . Equals 

(MethodStatus . InternalServerError . ToString ( ) ) ) 

{ 

exception = new InternalServerErrorException ( ) ; 

} 
else 

if (aStatus . Equals 

(MethodStatus . OperationNotPerf ormed. ToString ( ) 

{ 

exception = new OperationNotPerf ormedException ( ) ; 

} 

if (exception != null) 

{ 

throw exception; 

} 
} 



M3K/iK>neHkie ot TOBa npaBki/io npaBsu caMO MeTOflMTe updateLastActivityO 

M RefreshAdminSessionO , B 4MMTO KOHTeKCT CTaTyC"bT InvalidSession He e 

M3K/iK>neHi/ie, a CTaTyc Ha pe3y/iTaT. llopaAH TOBa o6pa6oTKaTa Ha TexHua 
craTyc me M3HeceM b Apyr MeTOfl. 

Pea/iM3auMn Ha K/iaca SiteUtility 

ripn pea^M3aunflTa Ha AH3ai/iH cbo6pa>KeHMflTa, CB"bp3aHM c aBTeHTHKaunaTa 
Ha noTpe6MTe/ii/iTe v\ ynpaB/ieHkieTO Ha cecnnTe, ce Ha/iara b npi/i/io>KeHi/ieTO 
Aa pea^M3npaMe /iori/iKa, koato He e CBtp3aHa AnpeKTHO c KOHKpeTHO M3n"b/i- 
HeHne Ha cpyHKui/iOHa/iHMTe M3MCKBaHMfl Ha npw/io>KeHkieTO. Ta3M /iori/iKa e 
Ao6pe Aa 6"bAe eHKancy/iwpaHa b eAMH K/iac c ue/i Aa a6crpaxwpaMe kohtpo- 
ziepwTe Ha CTpaHnunTe v\ KOHTpo/iepa Ha npi/i/io>KeHi/ieTO ot HeMHaTa koh- 
KpeTHa pea^M3aunfl. 3a Ta3M ue/i me cb3AaAeM K/iaca siteutiiity. 

3a Aa ocbmecTBkiM /iorm<aTa, CB"bp3aHa c ynpaB/ieHkieTO Ha i/iAeHTMUHOCTra Ha 
aBTeHTMKupaHMfl noTpe6i/iTe/i, HeroBaTa po/ia v\ HM3a My 3a aBTeHTHKauna 
npeA ycnyraTa me pea/ii/i3i/ipaMe Tpn MeTOAa: 

1. MeTOAtT Login () 

Tom me ce M3BMKBa npn aBTeHTHKauna Ha noTpe6kiTe/ifl ot cpopMaTa 3a bxoa b 
cucTeMaTa v\ me OTroBapa 3a cbxpaHeHneTO Ha kiAeHTkinHOcrra Ha aBTeHTMKM- 
paHMfl noTpe6wTe/i, HeroBaTa po/ia v\ hm3 Me>KAy ojp,ei\uv\je HTTP 3aaBKM. 
Ta3M cpyHKUkiOHa/iHOcr me pea/iw3npaMe npe3 3anncBaHe Ha cbOTBeTHaTa 
MHCpopMaunfl b cookie, KoeTO nocne ot cbo6pa>KeHMfl 3a curypHOCT me 
KpunTupaMe. 



public static void Login (int aUserlD, string aRole, 



1020 flporpaMnpaHe 3a .NET Framework (tom 2) 



string aWebServiceSessionID) 

DatingSiteSessionUtility . WebServiceSessionID = 
aWebServiceSessionID; 

FormsAuthentication . Initialize ( ) ; 

FormsAuthenticationTicket ticket = 
new FormsAuthenticationTicket ( 1, 
Convert . ToString (aUserlD) , 
DateTime .Now, 

DateTime.Now.AddMinutes (20) , 
false, 
aRole, 
FormsAuthentication . FormsCookiePath) ; 

string encryptedTicket = FormsAuthentication . Encrypt (ticket ) ; 

HttpCookie cookie = new 

HttpCookie ( FormsAuthentication . FormsCookieName, 

encryptedTicket) ; 
cookie . Expires = ticket . Expiration; 
HttpContext . Current . Response . Cookies .Add (cookie) ; 



2. MeTOfl"bT CreatePrinciple ( ) 

riopaflu npupoflaTa Ha HTTP npcrroKO/ia ce Ha/iara cnefl bcako ycneujHO 
aBTeHTMKupaHe Ha 3a*iBKa fla n3B/iwnaMe po/ii/iTe ot 6ncKBMTKaTa v\ fla c"b3Aa- 
BaMe HaHOBO Principle o6eKTa Ha TeKymnfl KOHTeKcr. MMeHHO Ta3M cpyHK- 
UMOHa^HOCT me pea/ii/i3kipaMe 4pe3 MeTOfla createPrincipal ( ) : 



public static IPrincipal CreatePrincipal ( ) 

{ 

Formsldentity identity = 

( Formsldentity) HttpContext . Current . User . Identity; 
FormsAuthenticationTicket ticket = identity . Ticket; 
string role = ticket . UserData; 
GenericPrincipal result = 

new GenericPrincipal (identity, new string [] (role)) ; 
return result; 
} 



To3M MeTOA me ce M3BMKBa b Global, asax cpaki/ia ot MeTOfla 

Application_AuthenticateRequest ( ) . 



p 


rotected void 


Application 


Auth 


enticate 


Reques 


t (Obj 


ect 


sender, 


{ 


EventArgs 


e) 














if (HttpCont 


ext . Current . 


User 


!= null 


&& 









T/iaBa 29. npaKTunecKM npoeKT 1021 



HttpContext . Current . User . Identity. IsAuthenticated) 

{ 

HttpContext . Current . User = SiteUtility . CreatePrincipal ( ) ; 

} 
} 



3. MeTOfl-bT Logout () 

Ue/ua My e p,a pea/iki3kipa M3/iM3aHeTO ot cwcreMaTa (logout). Eto KaK e 
pea^M3npaHa Ta3M cpyHKui/iOHa/mocr: 



public static void Logout ( ) 

{ 

if (DatingSiteSessionUtility . WebServiceSessionID != null) 

{ 

Da tingSiteService Provider . Logout ( 

DatingSiteSessionUtility .WebServiceSessionID) ; 

} 

DatingSiteSessionUtility. ClearWebServiceSessionID ( ) ; 
FormsAuthentication . SignOut ( ) ; 
} 



CbOTBeTHO /lori/iKaTa, CB"bp3aHa etc cnHxpoHM3aunflTa Ha cecnnTe me pea/iw- 

3MpaMe B MeTOfla SynchronizeSessions ( ) . TOM CblUO Uje ce l/l3n"b/lHflBa npn 

BCAKa aBTeHTMKupaHa 3a*iBKa v\ me ce M3BHKBa b Global. asax cpaw/ia ot 

MeTOAa Application_AcquireRequestState() . ripM4MHaTa Ra Ce C/iyUBa 

ToraBa e b TOBa, ne HM3"bT 3a aBTeHTHKauna npefl ycnyraTa ce cbxpaH^Ba b 
session o6eKTa, a TOBa e ntpBHAT MeTOfl, npn komto tom e flocrbneH. Eto KaK 
M3Me>Kfla pea^M3aunflTa My: 



public static void SynchronizeSessions ( ) 

{ 

MethodStatus result; 

if (DatingSiteSessionUtility .WebServiceSessionID != null) 

{ 

if (HttpContext . Current . User . IsInRole ( 
DatingSiteRoles. ADMIN) ) 

{ 

result = DatingSiteServiceProvider . Ref reshAdminSession ( 
Convert . ToInt32 (HttpContext . Current . User . Identity. Name) , 
DatingSiteSessionUtility .WebServiceSessionID) ; 

} 
else 

if (HttpContext . Current . User . IsInRole ( 
DatingSiteRoles. USER) ) 

{ 

result = DatingSiteServiceProvider . UpdateLastActivity ( 

Convert . ToInt32 (HttpContext . Current . User . Identity. Name) , 
DatingSiteSessionUtility .WebServiceSessionID) ; 



1022 flporpaMnpaHe 3a .NET Framework (tom 2) 



} 
else 

{ 

result = MethodStatus . InvalidSession; 

} 
} 
else 

{ 

result = MethodStatus . InvalidSession; 

} 

if (result == MethodStatus . InvalidSession) 

{ 

SiteUtility . RedirectToLoginPage ( ) ; 

} 



} 



Ta3M CMHxpoHM3aunfl me ce ocbmecTBABa 4pe3 i/i3BMKBaHeTO Ha rbb MeTOfla 
ot ycnyraTa b 3aBMCMMOCT ot po/iflTa Ha a BTe htm km pa huh noceTi/iTe/i. Ako e 

aAMMHMCTpaTOp, me ce M3BklKBa MeTOA"bT RefreshAdminSessionO, a aKO e 
nOTpe6klTe/l - MeTOA"bT UpdateLastActivityO , KOMTO OCBeH Rd 06H0BflBa 

cecuflTa MMa 3a ue/i v\ p,a 3anncBa AaTaTa v\ naca Ha TeKyiuaTa aKTMBHOCT c 
ue/i pea^M3npaHe Ha cpyHKUkiOHa/iHOcrra 3a cneAeHe Ha aKTMBHOCT. Bbb 
bcm4km ocraHa/iw cnynaw ce npneMa, ne cecnaTa e ueBanv\p,ua v\ cbOTBeTHO 
3aaBKaTa ce npexBtp/ia kbm crpaHi/iuaTa 3a aBTeHTHKauna. 

Ta3M pea/iM3aukm Ha ynpaB/ieHneTO Ha cecnnTe MMa v\ Apyro Ba>KHO npeAHM- 
ctbo. Tfl ce HBsiBa KaTO cpw/iTbp Ha BCHKa aBTeHTMKupaHa 3aaBKa KaTO 
rapaHTupa, ne a BTe htm km pa huh noTpe6kiTe/i Ha TeKyiuna KOHTeKcr npwTewaBa 
Ba^MAHa cecufl. 5/iaroAapeHkie Ha TOBa, ne cbOTBeTHi/m MAeHTucpuKaTop Ha 
cecuflTa ce cbxpaHABa Ha ctpBtpa b session o6eKTa (komto ot cboa CTpaHa 
ce HaMupa caMO b naMeira Ha npw/io>KeHkieTo), ce ocurypaBa v\ 3amnTa ot 
eBeHTya/iHa noAMAHa Ha MHCpopMaunaTa b cookie o6eKTa, CB"bp3aH c i/iAeHTwn- 
HOCTTa Ha noTpe6nTe^fl. npn^MHaTa e b TOBa, ne Ta3M kmcpopMaui/m me ce 
Bepucpnuupa npn BC^Ka aBTeHTMKupaHa 3aaBKa ot ycnyraTa, b 3aBMCMMOCT ot 
MAeHTucpMKaTopa Ha cecnaTa. 

Pea/iM3ai4Mfl Ha M3B/iMHaHeTO Ha CHMMKa Ha noTpe6MTe/i 

Ta3M cpyHKunoHa^HOCT me octiuecTBMM npe3 o6pa6oTBaHe Ha 3aaBKaTa ot 
HttpHandier. npwukiHaTa 3a TOBa e, ne pe3y^TaTbT ot Ta3M 3a*iBKa He e HTML 
CTpaHnua, a pecypc ot Tun image, v\ M3no/i3BaHeTO Ha Page Controller b to3m 
c/iynaw e HeyqanHO. no cbiuna HanwH me nocrbni/iM v\ c ocraHa/ii/iTe i"ioao6hi/i 
CTpaHnun: CTpaHnuaTa 3a ki3B/iwnaHe Ha XML OTneT v\ CTpaHnuaTa 3a i/i3b/im- 
naHe Ha 3amnTHaTa KapTMHKa. 

Pea^M3npaHeTO Ha handler-a CTaBa npe3 K/iac, i/iMn/ieMeHTwpam MHTepcpewca 

IHttpHandler, KOMTO AecpMHkipa MeTOA ProcessRequest C napaMeTbp TeKy- 

mufl KOHTeKCT. flopaAM Heo6xoAMMOCTTa 3a AOCTbn ao session o6eKTa ot 



T/iaBa 29. npaKTunecKM npoeKT 1023 
TeKymaTa 3aaBKa, Tpa6Ba fla pea/iki3kipaMe v\ MapKupaiuna MHTepcpewc 

IRequiresSessionState. 



public class GetPictureHttpHandler : IHttpHandler, 
IRequiresSessionState 

{ 

public const int BUFFER_SIZE = 10240; 

public void ProcessRequest (HttpContext context) 

{ 

Stream data = null; 
try 

{ 

HttpRequest request = context . Request; 
HttpResponse response = context . Response; 

response . Buff erOutput = false; 



WebClient client = new WebClient ( ) ; 

data = client . OpenRead (WebServiceUserPictureUrl ) ; 

response . Clear ( ) ; 

if (client . ResponseHeaders [ "Content-Type" ] == null | | 

client . ResponseHeaders [ "Content-Type" ] . Equals ( 

String . Empty) ) 

{ 

response . ContentType = "image/ jpeg" ; 

} 
else 

{ 

response . ContentType = 

client . ResponseHeaders [ "Content-Type" ] ; 
} 

byte[] buffer = new byte [BUFFER_SIZE] ; 

int bytesRecieved = 0; 

do 

{ 

bytesRecieved = data . Read (buff er, 0, BUFFER_SIZE ) ; 

response . Outputs t ream. Write (buffer, 0, 
bytesRecieved) ; 
} while (bytesRecieved > 0); 

} 

catch (Exception ex) 

{ 

LoggingExceptionHandler . HandleException (ex) ; 

} 
finally 

{ 



1024 flporpaMnpaHe 3a .NET Framework (tom 2) 




KaKTO 6e o6acHeHO b nacrra 3a ye6 ycnyraTa, ki3B/ikmaHeTO Ha CHMMKaTa Ha 
AaAeH noTpe6nTe/i Tpa6Ba p,a CTaBa 6e3 th fla ce 6ycpepnpa b naMerra. 3a 
TOBa yKa3BaMe OTroBoptT Ha 3a*iBKaTa p,a He ce 6ycpepnpa v\ npe3 K/iaca 
webciient OTBapyiMe noTOK ki>m aspx CTpaHnuaTa ot ye6 ycnyraTa, OTroBa- 
paiua 3a npeAOCTaBAHeTO Ha CHMMKaTa v\ Ha Ma/iKM nopu.ni/i ot 1024 6aMTa 
npeAaBaMe MHCpopMaunaTa ot to3m i"iotok b noTOKa Ha OTroBopa. 

riopaAM cneukicpM4HMfl Tun Ha cbAtpwaHkieTO, KoeTO ce Bptiua npn 3aaBKa 
kbm Ta3M CTpaHnua, o6pa6oTKaTa Ha M3K/iK)nkiTe/iHkiTe ckiTyau.ni/i He Moxe p,a 
ce M3B"bpujn no cbiunfl Ha^MH, KaKTO npi/i ocraHa/ikiTe CTpaHnun. no KOHKpeT- 
ho, npi/i o^aKBaH Tun image Ha OTroBopa e HenpkieM/ikiBO npn Bt3HMKBaHe Ha 
M3K/iK)ni/iTe/iHa cuTyaunfl Aa BtpHeM html crpaHkiua 3a rpeujKa. 3a Ta3M ue/i 
me npuxBaiuaMe 6a30BMfl K/iac ki3K/iK>neHkie Exception, KoeTO, BtnpeKM ne 
He e Ao6pa npaKTMKa, b Ta3M cuTyauna e npweM/ii/iBO. Cnep, TOBa npuxBaHa- 
toto i/i3K/iK>neHkie caMO me 3anncBaMe b /iora i/i HAMa Aa ro npexBtp/i^Me 
Harope no CTeKa, 3aiuoTO b npoTi/meH cnynai/i me nonaAHe b r/io6a/iHi/ifl Mexa- 
HM3"bM 3a o6pa6oTKa Ha ki3K/iK>neHi/ifl, a KaKTO Ka3axMe, b to3i/i cnynai/i TOBa e 
HenpneM^MBO. 

npeHacoHBaHe Ha oiroBopa kt»m Apyra CTpamma 

TyK me ce cnpeM Btpxy eAHO no-pa3/ikinHO peiueHne CB"bp3aHO etc cne- 

UklCpklUHOTO nOBeAeHkie Ha MeTOAHTe Response . Redirect ( ) M Server. 
Transfer!). KaKTO e oni/icaHO b http://support.microsoft.com/kb/312629/ 

EN-US , Te3M MeTOAM B"bTpeWHO B Ce6e CM l/l3BMKBaT MeTOAa Response. End( ) , 

komto npeAM3BMKBa ThreadAbortException. HecTO peweHi/ie Ha T03M npo6- 
/ieM e npuxBaiuaHeTO Ha i/i3K/iK>neHi/ieT0 b npa3eH catch 6/iok, ho Hue me 
M3no/i3BaMe no-pa3/ikinHO peiueHne, npenoptnaHO ot Microsoft, KoeTO me hm 
Btpujn cbmaTa pa6oTa. V\p,es\Ta e HaBCHKbAe Aa ki3no/i3BaMe Response. 
Redirect (string, bool), KaTO BTOpi/lflT napaMeTbp yKa3Ba Aa/1M Aa 6"bAe 
"c/10>KeH KpaM Ha OTrOBOpa". BMeCTO Server . Transfer ( ) me l/l3nO/13BaMe 
Server . Execute ( ) . 

l/lHcra/iiipaHe m BHeapflBaHe Ha cwcreMaTa 

Cnep, KaTO pa3MeAaxMe no-Ba>KHMTe MOMeHTM ot cb3AaBaHeT0 Ha cwcreMaTa 
3a 3ano3HaHCTBa b MHTepHeT, me AaAeM KpaTKO onucaHne Ha npoueca Ha 
MHcra/iaukiflTa v\. npenoptuBaMe Ha nkiTaTe/ifl Aa oni/iTa Aa kiHcra/ii/ipa cwcre- 
MaTa Ha co6cTBeHMfl cm KOMniOTbp, Aa pa3r/ieAa HeMHua cope koa h Aa ce 
onuTa Aa pa36epe KaK pa6oTi/i tom. CwcreMaTa npeAcraB/iHBa cepi/i03eH npo- 



T/iaBa 29. npaKTunecKM npoeKT 1025 

eKT, ot komto MO>Ke fla 3anMCTBaTe v\p,ev\ v\ peiueHMfl Ha TexHkmecKki npo6/ieMki 
npn M3rpa>KflaHeT0 Ha noflo6Hw cm ere mm. Pa36npa ce, He Tpa6Ba bcmuko fla 
KonnpaTe, a caMO TOBa, KoeTO bm Btpwi/i pa6crra b KOHKpeTHna c/iynafi. 

CMCTeMHM M3MCKBaHMfl 

3a fla MHCTa^npaTe ycneujHO ckicreMaTa, e Heo6xoflMMO fla MMaTe KOMniOTbp c 
Windows 2000/XP/2003, IIS 5.0/6.0, SQL Server 2000, .NET Framework 1.1 
m VS.NET 2003. B"b3MO>KHO e ci/icreMaTa fla pa6oTM v\ c flpyrn Bepcun Ha 
noconeHi/ia cocpTyep, ho H^Ma rapaHuna 3a TOBa. 

3a fla MHCTa^npaTe cwcreMaTa ca bm Heo6xoflMMM aflMMHMCTpaTopcKM npaBa 
Btpxy MaujMHaTa, koato me M3no/i3BaTe. 

Ot Ki>ae fla M3Ter/iMM cucreMaTa n cope KOfla m? 

Totoboto npn^OKeHne 3aeflHO c nt/iHWfl M3xofleH koa MO>KeTe fla MHcra/ikipaTe 
npe3 MHCTa^aunoHHMfl naKeT, flocrbneH ot ye6 cawTa Ha HacToaiuaTa KHura: 
http://www.devbq.org/dotnetbook/ . 

KaTO a^TepHaTMBa MOweTe fla kiHcra/iwpaTe BceKM KOMnoHeHT OTfle/iHO, M3Ter- 
ziflMKki ot cbiflMfl caMT efli/meH apxuBeH cpaw/i, cbfltpwam 4 apxuBa Ha pa3/ikm- 
HMTe KOMnoHeHTu: 

- Konne Ha SQL Server 6a3aTa flaHHM (backup); 

- npoeKT c ASP.NET ye6 yc/iyraTa; 

- npoeKT c Windows Forms npn^OKeHneTo; 

- npoeKT c ASP.NET ye6 npw/io>KeHi/ieTO. 

fla pa3r/ieflaMe KaK ce kiHCTa/iwpa v\ KOHCpurypupa BceKM eflMH ot Te3M 

KOMnOHeHTH. 

Bi>3CTaHOBsiBaHe Ha 6a3aTa namm b SQL Server 

3a MHcra/ikipaHe Ha 6a3aTa flaHHM bbb Baujua SQL Server bm e Heo6xoflMM 
cpaw/ia DatingsiteDB_backup, komto npeflcraB/iflBa HenH apxnB (backup). 
Eto m KaK ce M3B"bpujBa npouecbT Ha B"b3craHOBflBaHe (restore) Ha 6a3aTa 
flaHHM : 

1. OTBopeTe Enterprise Manager v\ cb3flaMTe 6a3a ot flaHHM c MMe 

DatingSite. 

2. HaTMCHeTe c flecHna K/iaBmu Ha MMUJKaTa Btpxy Hea v\ ot popup MeHKrro 
M36epeTe All Tasks -> Restore Database... 



1026 flporpaMnpaHe 3a .NET Framework (tom 2) 



C~\ Console Root 

E3- 10J Microsoft SQL Servers 



- 



_J SQL Server Group 
- Eb ( |oca| ) (Windows NT) 
3-Q Databases 

iMEHiaaaHa 



+ 
+ 
+ 
+ 
+ 
+ 
+ 



DatingSite 10 Items 



Diagrams 



Tables 



6V 



Views 



master 
model 
msdb 
North 
pubs 
tempdt 
Ltl-O Data Trans 
Ltl-Q Managemej 
Ltl-Q Replication 
Ltl-Q Security 
[+1-Pl Support Se 
S-CJ Meta Data 
&■§> 169.0.0.1 (Wii 



New Database. 



New 



View â–º 

New Window from Here 



Delete 
Refresh 
Export List. 



Import Data... 
Export Data,,, 



Maintenance Plan,,, 
Generate SQL Script, 



Backup Database, 



Restore Database, 



Properties 



Help 



[+1-Pl Databases 

[+1-Pl Data Transformation Services 

[+1-Pl Management 

[+1-Pl Replication 



Shrink Database,. 
Detach Database, 
Take Offline 



Copy Subscription Database, 
View Replication Conflicts, , , 



3. Ot flwa/ioroBkifl npo3opeu M36epeTe [Restore: From Device] v\ HaTuc- 
HeTe 6yTOHa [Select Devices...]: 



Restore database 



General ] Options 1 

Restore as database: I DatingSite 



~B 



Restore: 

• Parameters - 
Devices: 



C Database 



C Filegroups or files 



(* From device 



Select Devices.. 



4. noyiBflBa ce hob Akia/ioroB npo3opeu, b komto Tpa6Ba fla HaTMCHeTe 
6yTOHa [Add]. B hobma npo3opeu Tpa6Ba p,a M36epeTe irbTH ro cpaw/ia, 
cbfl"bp>Kaiu backup Ha 6a3aTa ashhu. B Haujua cnynai/i TOBa e cpaM/ivr 

DatingSiteDB_backup : 



T/iaBa 29. npaKTunecKM npoeKT 1027 



Choose Restore Devices 



When the backup is restored, SQL Server will attempt to restore from the 
devices listed below. 



Backup set: 
Restore from: 



(Unknown) 



nkif 



Choose Restore Destination 



j Select the file name or backup device to use for the restore 

i^=J operation. Backup devices can be created for files that you 

use frequently. 



P Filer 



F:\DatingSiteDB_backup 



J 



Backup device: 

I 



"3 



OK 



Cancel 



Add... 



Edit 



Remove 



Remove All 



Cancel 



5. ripn HaTMCKaHe Ha 6yT0Ha [OK] 3anonBa npouecvr Ha B"b3craH0BflBaHe 
Ha 6a3aTa ashhh m cnep, KaTO tom 3aB"bpwi/i ycneujHO, BHeAPflBaHeTO Ha 
6a3aTa flaHHM nprncnionBa. 

l/lHcra/mpaHe n BHeflpsiBaHe Ha ASP.NET ye6 yc/iyraTa 

Ye6 yc/iyraTa Moxe p,a 6"bAe kiHcra/ikipaHa Btpxy bcmukm n/iaTCpopMki, nofltp- 
>Kaiun ASP.NET. B HacToaiunTe MHCTpyKunn me noKa>KeM eAHHCTBeHO BHeflpa- 
BaHeTO v\ Btpxy Microsoft Internet Information Server 5.0. 

klHcrasmpaHe Ha ye6 yc/iyraTa b IIS 

1. Pa3apxnBnpaMTe cwvbpwaHi/ieTO Ha ye6 yc/iyraTa b AnpeKTopi/mTa 
wwwroot Ha IIS, koato no noflpa36npaHe ce HaMupa Ha 

C : \lnetpub\wwwroot. 

2. CrapTkipaMTe KOH30/iaTa 3a ynpaB/ieHi/ie Ha IIS v\ HaTMCHeTe aacho 
Konne Btpxy noyiBki/iaTa ce nanKa Datingsitews. 



3. M36epeTe Properties. 



1028 flporpaMnpaHe 3a .NET Framework (tom 2) 



": Internet Information Services 



File Action View Help 



(5 HE 



a â–º 



Jj Internet Information Services 
B-JJ TODOR flocal computer) 
3-Q Web Sites 

Bâ„¢i$ Default Web Site 
&0 DatingSite 

&â– â– & WebApplicati 
B-^ Default SMTP Virtual 



Description 



State 



He 



â– # Default Web Site 



Explore 

Open 

Browse 



New 
All Tasks 



Delete 

Rename 

Refresh 



Running 



Properties 



4. HaTMCHeTe 6yTOHa [Create] b 30HaTa Application Settings Ha noflBM- 
nv\s\ ce npo3opeu. HaKpaa tom Tpa6Ba fla M3r/ie>Kfla TaKa: 



DatingSiteWS Properties 



Director/ | Documents j Directory Security | HTTP Headers j Custom Errors | 

LWhen connecting to this resource, the content should come from: 
(* The designated directory 
C A share located on another computer 
C A redirection to a URL 



Jd2<j 



Local Path: 

V Script source access 
P Read 
r Write 

Directory browsing 



W Log visits 

W Indexthis resource 



Application Settings 
.Application name: 
Starting point: 
Execute Permissions: 



DatingSiteWS 
=:Def...\DatingSrteWS 
Scripts only 



Remove 



Application Protection: Medium (Pooled) 



Configuration. 



Unload 



OK 



Cancel 



Apply 



Help 



T/iaBa 29. npaKTunecKM npoeKT 1029 

5. HaTMCHeTe [OK]. 

KoHCpnrypnpaHe Ha ye6 yoiyraTa 

1. OTBopeTe KOHCpurypaunoHHMfl cpaw/i web.config. 

2. npOMeHeTe CTOMHOCTTa Ha nO/ieTO siteDatabaseConnectionString, 

TaKa ne fla ce OKa3BaT Ba/iwflHM ctomhoctm 3a Bp"b3Ka kbm 6a3aTa ashhh, 
koato npeflki Ma/iKO kiHcra/iwpaxTe. 

3. npoMeineTe CTOMHOCTTa Ha no/ieTO siteSMTPServer, TaKa ne fla OKa3Ba 
Ba/iwfleH SMTP CbpBtp. BuxTe MorjiH fla M3no/i3BaTe SMTP CbpBtpa Ha 
BaiuMfl 1/lHTepHeT flOcraBUMK. Ako SMTP CbpBtpa M3no/i3Ba noTpe- 
6wTe/iCKO MMe v\ napo/ia 3a aBTeHTMKupaHe Ha noTpe6kiTe/in 6nxTe MorjiH 

fla OKaxeTe TaKklBa npe3 nO/ieTaTa siteSMTPServerUserName M 

siteSMTPServerPassword. 

1/lHCTa/mpaHe Ha Windows Forms K/iweHTa 

CrbnKi/iTe 3a kmcra/ikipaHe Ha Windows Forms 6a3npaHMfl GUI K/iweHT ca 
c/ieflHMTe: 

1. Pa3apxnBkipaMTe apxuBa, cbfltpwam Windows Forms npw/io>KeHi/ieTO. 

2. OTBopeTe KOHCpurypaunoHHUfl cpai/i/i App.config v\ npOMeHeTe cbfltpwa- 
HueTO Ha no/ieTO Path, TaKa ne fla cbfltpwa Ba/ikifleH aflpec Ha ye6 
yc/iyraTa, koato npeflu Ma/iKO kiHcra/iwpaxTe. 

1/lHCTa/inpaHe Ha ASP.NET ye6 npu/iomeHMeTO 

MHCTa^npaHeTO Ha ASP. NET ye6 npn^oxeHneTO e noflo6HO Ha kiHcra/ii/ipa- 
HeTO Ha ye6 yc/iyraTa v\ 3a TOBa HHMa fla ro pa3r/ie>KflaMe b p,ejav\i\v\. W\e 
pa3r/ie,qaMe caMO KOHCpurypupaHeTO My: 

1. C/iefl KaTO MHCTa^npaTe ye6 npn^OKeHneTO Ha cwcreMaTa 3a 3ano3HaH- 
CTBa b MHTepHeT, OTBopeTe KOHCpurypaunoHHMflT cpai/i/i web.config. 

2. npOMeHeTe B Hero CTOMHOCTTa Ha no/ieTO WebServiceGetPicturePage M 
no/ieTO DatingSiteASPNETClient . DatingSiteService . 

Datingsitewebservice, TaKa ne fla conaT i/iHcra/ikipaHaTa npeflu TOBa 
ye6 yc/iyra. 

M3no/i3BaHa /liuepaTypa 

1. Role-based Security with Forms Authentication By Heath Stewart - 
http://www.codeproiect.com/aspnet/formsroleauth.asp 

2. Maintaining Scroll Position on Postback By Steve Stchur - http://aspnet. 
4quysfromrolla.com/articles/111704-l.aspx 

3. Enterprise Solution Patterns Using Microsoft .NET - http://msdn. microsoft, 
com/li bra ry/defau It .asp?url=/li bra ry/en-us/dn patterns/htm l/Esp.asp 



1030 nporpaMnpaHe 3a .NET Framework (tom 2) 

4. CAPTCHA Image - http://www.brainjar.com/dotNet/CaptchaImaqe/ 

5. How to serve binary resources from a database in ASP.NET - 
http://webloqs.asp.net/cazzu/archive/2003/08/27/25568.aspx 

6. Paging of Large Resultsets in ASP.NET By Jasmin Muharemovic - 
http://www.codeproiect.com/aspnet/PaqinqLarqe.asp 

7. Unexpected Errors in Managed Applications - http://msdn.microsoft.com/ 
msdnmaq/issues/04/06/NET/default.aspx 



3aK/iK)MeHiie k"bm btopmsi tom 



ABTOpCKMflT KO/ieKTMB, V\3VOTBV\n HaCTOflLUaTa KHMTa, Ckl/IHO Ce HaAABa, 4e Tfl 

bm e fla/ia no/ie3Hki 3HaHna v\ yv\euv\s\ 3a nporpaMnpaHe c .NET TexHO/iorwMTe 
n bm e noMorHa/ia Ha npoc|Deci/iOHa/iHOTO pa3BMTne. HaflflBaMe ce, ne He CMe 
bm M3ry6n^n BpeMeTO c ro/ieMi/m o6eM MHCJDopMauMfl. 

3a cbwa/ieHwe He MoxaxMe p,a noKpneM (fcyHKui/iOHa/iHOCTra Ha .NET 2.0 n/iaT- 
c|DopMaTa BtnpeKM cm/ihoto cm >Ke/iaHne v\ KHuraTa cm ocTaHa eAHO Ao6po 
ptKOBOflCTBO 3a .NET Framework 1.1. M3BMHflBaMe ce Ha bci/iukm nwTaTe/ii/i 3a 
3a6aBHHeTO Ha BTopua tom c nonTki eAHa roAHHa. HaAflBaMe ce Bee naK p,a He 
e TBtpAe KtCHO tom p,a 6"bAe cbiuo TaKa no/ie3eH, KaKTO v\ ntpBua. 

Ako MMaTe Btnpocn v\nv\ KOMeHTapn, CB"bp3aHM c HacToaiuaTa KHura, OTnpa- 
BflMTe rn b Hawi/ifl ifcopyM: 

http://www.devbq.org/forum/index.php7showforum = 30 



r^aBHMAT aBTop m ptKOBOAHTe/i Ha npoeKTa, CBejnv\u HaKOB, OTnpaBfl noKaHa 
KtM BCM4KM, komto >Ke/iaflT p,a M3npo6BaT b npaKTkiiOTa onucaHMTe B Ta3M 
KHura TexHO/iorm/i v\ p,a ce HaynaT p,a vv\ npw/iaraT b pea/iHki npoeKTM, p,a ce 
3anniuaT 3a EE3I1/1ATHO o6yneHi/ie b "Hau.i/iOHa/iHa aKaAeMna no pa3pa6oTKa 
Ha coc|DTyep": 

http://academy.devbq.org/ 

AKaAeMMATa p,aea b"B3mo>khoct 3a KpaTKO BpeMe p,a OB/iaAeeTe cbBpeMeHHMTe 
coc|DTyepHM TexHO/iorww, p,a npnAo6neTe npaKTi/mecKki yMeHi/m 3a pa3pa6oTKa 
Ha coc|DTyep v\ p,a 3anonHeTe ycneujHO KapnepaTa cm Ha coc|DTyepeH MHxeHep. 



HaA^BaMe ce aBTopcKi/mT KO/ieKTi/iB p,a HaMepn cv\nv\ 3a o6HOBHBaHeTO Ha 
KHuraTa 3a .NET Framework 2.0 v\ cnep,Bau\v\ Bepcun Ha n/iaTifcopMaTa. OnaK- 
BaMe noAKpenaTa Ha nwTaTe/ikiTe. 



CBeT/lMH HaKOB, 

HoeMBpn, 2006 



„HporpaM»paHe 3a .NET Framework" e ynmanno phKOBOjicrso 
33 nnaj<popM3Ta , NET. GbrrpeKW, we we e yne&HMK no nporpsHMpsne, 
KHurara e HSKroowMTe/Jwo no/txoaauta Kaiao 3a nawHaetuMt 
nporpaMKCT, cd/ibCKSsw ce 3a npvs nhT c .NET, ram a 33 ormTHMti 
paapadoTwtc »a ,NET npnnoxcentia, ue/ifnu Aa cucreHaTusupa n 

nonitflHH 3H3HHXTa CM. 



Ciohh flcpaaHOB, 
Software Design Engineer, 
Microsoft Corp. 



^nporpaHMpane 33 .NET Framework" 
& ntpaara wcto 6\>nrap£K3 KHwra 3a 
Microsoft .NET rexnonortotore. 
Th npGRCraBR na ^torare/jH a 
nocnenosarenen, crpyKryptopaH, 
AQCThneH it p336topaen atiyq 

OCHQBHHTG KOHljCniitM 33 pa3pa60TK3 

na npnnoxeHHR c .NET Framework w 
aatoKa C#. KHtorara oOxsama a 
Aeration BCtwKto ochqbhh .NET 
rexHOfiartiH xaro nadrmra ebpxy 
Han-B3MHi<tTe or rax: ADO.NET, 
ASP.NET, Windows Forms to 
XML ye6 yc/iym. 

Teoflop MuneB, 
ynpae/maam awpetcnop Ha 
^MaflKptXJO^T BwirapHa" 



ye6 cam: 

www, d evbg . org / dotn et boo k / 

ISBN: 954-775-672-9 
ISBN: 978-954-775-672-4 



ABTOPMTE: 

AneKcaHAbp Pycea 
AfieKcan/ihp 

XamtiKpbcre* 
Ahtqh AHfipeeB 
BpaMtoMtop Atore/toa 
Bdcua EatojJOB 
BtoKTOP Mhbkob 
fStlltoH MflMGB 

Feopm Hemes 

/jtoMMThp Bones 
fltoMtoThp Kauea 
WsaMO Ammos 
PfaaiifiQ XptocroB 

Wfl3H MtoTGB 

/Jasap KupveB 
Mbhoa AoHeB 
Mapmn Ky/K& 
Mnxatin Ctohhob 
MoHMKaAfleKOieBa 

HtoKQ/J3to HeflRfJKQB 

Fiana^or /Jo6p wkob 
Ftpec/iBB FfaxoB 
PaAQC/ia& Weawoe 
Pocjian BopticoB 
CaerntoH Haxoa 
Cr&pan Mo6peB 
Cretan Baxapnes 
Oe^J^w KtopsBpB 
Cronn flanoB 
To&op Kones 
Xptocro RemeB 

X&toCTQ P3AK0B 

UBerentoH AH&peea 
flBop Ta-tuea