You are on page 1of 706

1

tng hp v bin dch

Nguyn Ngc Bnh Phng - Thi Thanh Phong


cng s cng tc ca Nguyn Thanh Nhn - Trn L Vnh Phong Nguyn Quang Nam - inh Phan Ch Tm Bi Minh Khoa - L Ngc Sn Thi Kim Phng - L Trn Nht Qunh

Chu trch nhim xut bn: TS. Nguyn Xun Thy Bin tp: H Nguyn Th Thanh Thy Trnh by ba: Nguyn Th Thanh Thy Ch bn & Sa bn in: Nguyn Ngc Bnh Phng

Nh sch t Vit
a ch: 225 Nguyn Tri Phng, Q.5, TP. H Ch Minh in thoi: (08) 2 652 039 E-mail: datviet@dvpub.com.vn

Website: www.dvpub.com.vn

 
Nguyn Ngc Bnh Phng - Thi Thanh Phong
tng hp & bin dch http://www.dvpub.com.vn/dv/details.aspx?itemid=243

NH XUT BN GIAO THNG VN TI

LI NI U

LI NI U

c gii php lp trnh C# kho st chiu rng ca th vin lp .NET Framework v cung cp gii php c th cho cc vn thng gp. Mi gii php c trnh by theo dng vn /gii php mt cch ngn gn v km theo l cc v d mu. Cc gii php lp trnh C# khng nhm mc ch hng dn bn cch lp trnh C#. Tuy vy, ngay c khi mi lm quen vi lp trnh ng dng c xy dng trn .NET Framework vi C#, bn cng s nhn thy quyn sch ny l mt ti nguyn v gi. mc l tng, khi bn i mt vi mt vn , quyn sch ny s cung cp mt gii phphay t nht n s gi cho bn hng i ng. Ngay c nu bn ch mun m rng kin thc ca mnh v th vin lp .NET, Cc gii php lp trnh C# cng l mt ti liu rt hu ch. Bn khng th tr nn thnh tho C# v cc lp trong th vin lp .NET nu ch n thun c v chng, bn phi s dng v th nghim chng bng cch vit tht nhiu chng trnh. Cu trc v ni dung ca quyn sch ny cng nh tnh kh thi trong th gii thc ca cc gii php c a ra s cung cp im khi u hon ho, t lm bn p cho vic th nghim ca chnh bn. Phn m lnh trong quyn sch ny c vit v chy th nghim trn phin bn 1.1 ca .NET Framework. Trong nhiu trng hp, bn s nhn thy v d mu ny cng s chy trn phin bn 1.0 hay 2.0 ca .NET Framework, tuy nhin iu ny cha c th nghim. Chng ti xin chn thnh cm n cc bn Nguyn Thanh Nhn, Trn L Vnh Phong, Nguyn Quang Nam, inh Phan Ch Tm, Bi Minh Khoa, L Ngc Sn, Thi Kim Phng, v L Trn Nht Qunh c nhng ng gp

qu bu cho quyn sch; cm n Nh xut bn Giao thng Vn ti v Nh sch t Vit to iu kin cho quyn sch ny n vi bn c. Do ln u tin xut bn nn quyn sch ny kh trnh khi nhng thiu st. Rt mong nhn c kin ng gp v nhn xt ca cc bn ln ti bn sau c hon thin hn. Trn trng cm n

10

CU TRC CA SCH

CU TRC CA SCH

Quyn sch ny c chia thnh 17 chng, mi chng tp trung vo mt ch c th trong qu trnh to cc gii php C#.

Chng 1: PHT TRIN NG DNG Chng 2: THAO TC D LIU Chng 3: MIN NG DNG, C CH PHN CHIU, V SIU D LIU Chng 4: TIU TRNH, TIN TRNH, V S NG B Chng 5: XML Chng 6: WINDOWS FORM Chng 7: ASP.NET V WEB FORM Chng 8: HA, A PHNG TIN, V IN N Chng 9: FILE, TH MC, V I/O Chng 10: C S D LIU Chng 11: LP TRNH MNG Chng 12: DCH V WEB XML V REMOTING Chng 13: BO MT Chng 14: MT M Chng 15: KH NNG LIN TC KHNG-C-QUN-L M LNH

Chng 16: CC GIAO DIN V MU THNG DNG Chng 17: S HA HP VI MI TRNG WINDOWS

11

12

QUY C

QUY C

Quyn sch ny s dng cc quy c nh sau:


V font ch

Ch in nghingDng cho tn ring, tn file v th


mc, v i khi nhn mnh.

Ch vi b rng c nh (font Courie New)Dng cho


cc on chng trnh, v cho cc phn t m lnh nh cu lnh, ty chn, bin, c tnh, kha, hm, kiu, lp, khng gian tn, phng thc, module, thuc tnh, thng s, gi tr, i tng, s kin, phng thc th l s kin, th XML, th HTML, ni dung file, v kt xut t cc cu lnh.

Ch in m vi b rng c nhDng trong cc on


chng trnh nu bt mt phn quan trng ca m lnh hoc dng cho cc dng lnh, cu lnh SQL.
V k hiu
Vn Th thut

13

Gii php

Ghi ch

14

15

YU CU V H THNG

YU CU V H THNG

chy c nhng v d mu i km quyn sch ny, bn s cn nhng phn mm sau y:

Microsoft .NET Framework SDK version 1.1 Microsoft Visual Studio .NET 2003 Microsoft Windows 2000, Windows XP,
hoc Microsoft Windows Server 2003

Microsoft SQL Server 2000 hoc MSDE


i vi cc mc trong chng 10

Microsoft Internet Information Services (IIS)


i vi mt s mc trong chng 7 v chng 12 Yu cu ti thiu v phn cng l b vi x l Pentium II 450 MHz, vi dung lng RAM ti thiu l 128 MB nu bn ang s dng Microsoft Windows 2000, v l 256 MB nu bn ang s dng Windows XP, Windows 2000 Server, hay Windows Server 2003. Bn cn khong 5 GB dung lng a cng cn trng ci t Visual Studio .NET 2003. Nhng gi tr ny l mc ti thiu, qu trnh pht trin s d dng hn trn mt h thng vi dung lng RAM ln v a cng cn trng nhiu. Mc d bn hin thc .NET Framework cho Windows ca Microsoft l tiu im ca quyn sch ny, mt mc tiu quan trng l cp mt

16

ti nguyn hu ch cho nhng lp trnh vin C# khng quan tm n nn m h ang lm vic hoc cng c m h truy xut. Ngoi nhng ch c bit khng c h tr trn tt c nn .NET (nh Windows Form, ADO.NET, v ASP.NET), nhiu v d mu trong quyn sch ny u hp l trn tt c bn hin thc .NET.

17

18

CCH S DNG A CD

CCH S DNG A CD

lnh c cp dng tp cc gii php v d n Visual Studio .NET 2003, c t chc theo chng v s mc. Mi chng l mt gii php c lp, v mi mc l mt d n c lp bn trong gii php ca chng. Mt vi mc trong chng 11 v chng 12 trnh by v lp trnh mng gm nhng d n c lp c cha cc phn client v server trong gii php ca mc. Mc d tt c nhng v d mu c cp dng d n Visual Studio .NET, nhng hu ht u bao gm mt file ngun n m bn c th bin dch v chy c lp vi Visual Studio .NET. Nu khng s dng Visual Studio .NET 2003, bn c th nh v m ngun cho mt mc c th bng cch duyt cu trc th mc ca v d mu. V d, tm m ngun cho mc 4.3, bn s tm n trong th mc Chuong04\04-03. Nu s dng trnh bin dch dng lnh th phi bo m rng bn thm tham chiu n tt c cc assembly cn thit. Mt s ng dng mu yu cu cc i s dng lnh (s c m t trong phn vn bn ca mc). Nu s dng Visual Studio .NET, bn c th nhp cc i s ny trong Project Properties (mc Debugging ca phn Configuration Properties). Nh rng, nu cn nhp tn th mc hay file c cha khong trng th bn cn t tn y trong du nhy kp. Tt c v d truy xut d liu ADO.NET c to vi SQL Server 2000. Chng cng c th c s dng vi SQL Server 7 v MSDE.

19

Visual Studio .NET c cha cc kch bn SQL ci t cc c s d liu mu Northwind v Pubs nu chng cha hin din (cc file instnwnd.sql v instpubs.sql trong th mc C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\ v1.1\Samples\Setup). Bn c th chy cc kch bn ny bng Query Analyzer (vi SQL Server) hay OSQL.exe (vi MSDE). s dng cc mc trong chng 7 v chng 12, bn cn chp chng vo th mc I:\CSharp\ (ng dn ny l m cng trong cc file d n Visual Studio .NET). Bn cng s cn to mt th mc o c tn l CSharp nh x n I:\CSharp. Bn c th ci t php nh x ny bng IIS Manager. Thc hin theo cc bc di y: 1. 2. Khi chy IIS Manager (chn Start | Control Panel | Administrative Tools | Internet Information Services). Khi chy Virtual Directory Wizard trong IIS Manager bng cch nhp phi vo Default Web Site v chn New | Virtual Directory t menu ng cnh. Nhp Next bt u. Mu thng tin u tin l b danh CSharp. Nhp Next tip tc. Mu thng tin th hai l th mc vt l I:\CSharp. Nhp Next tip tc. Ca s thut s cui cng cho php bn iu chnh quyn cho th mc o. Bn nn s dng cc thit lp mc nh. Nhp Next. Nhp Finish kt thc trnh thut s. Bn s thy th mc o ny trong phn cy ca IIS Manager. Khai trin th mc o CSharp trong IIS thnh th mc nm trong CSharp\Chuong07\07-01. Nhp phi vo th mc ny, chn Properties, ri nhp vo nt Create trong th Directory chuyn th mc ny thnh th mc ng dng Web. Lp li bc 8 cho mi mc trong chng 7.

3. 4. 5.

6. 7. 8.

9.

10. Theo trnh t c trnh by trong cc bc 7-9, to th mc ng dng Web cho cc mc 12.2, 12.3, 12.4, v 12.6 trong chng 12.

20

MC LC

MC LC

LI NI U................................................................................................................................ 7 CU TRC CA SCH..............................................................................................................10 QUY C................................................................................................................................... 12 YU CU V H THNG.......................................................................................................... 15 CCH S DNG A CD...........................................................................................................18 MC LC.................................................................................................................................... 20 Chng 1: PHT TRIN NG DNG 1. To ng dng Console........................................................................................... 31 2. To ng dng da-trn-Windows........................................................................... 33 3. To v s dng module.......................................................................................... 37 4. To v s dng th vin......................................................................................... 39 5. Truy xut cc i s dng lnh............................................................................... 40 6. Chn bin dch mt khi m vo file thc thi.......................................................... 42 7. Truy xut mt phn t chng trnh c tn trng vi mt t kha........................................................................................ 45 29

21

8. To v qun l cp kha tn mnh......................................................................... 45 9. To tn mnh cho assembly................................................................................... 47 10. Xc minh mt assembly tn mnh khng b sa i............................................ 49 11. Hon vic k assembly......................................................................................... 50 12. K assembly vi ch k s Authenticode............................................................. 52 13. To v thit lp tin tng mt SPC th nghim................................................... 54 14. Qun l Global Assembly Cache.......................................................................... 56 15. Ngn ngi khc dch ngc m ngun ca bn................................................ 56 Chng 2: THAO TC D LIU 1. Thao tc chui mt cch hiu qu.......................................................................... 61 2. M ha chui bng cc kiu m ha k t............................................................. 62 3. Chuyn cc kiu gi tr c bn thnh mng kiu byte............................................ 65 4. M ha d liu nh phn thnh vn bn................................................................. 67 5. S dng biu thc chnh quy kim tra d liu nhp.......................................... 70 6. S dng biu thc chnh quy c bin dch....................................................72 7. To ngy v gi t chui........................................................................................ 75 8. Cng, tr, so snh ngy gi................................................................................... 76 9. Sp xp mt mng hoc mt ArrayList................................................................... 78 10. Chp mt tp hp vo mt mng......................................................................... 79 11. To mt tp hp kiu mnh.................................................................................. 80 12. Lu mt i tng kh-tun-t-ha vo file......................................................... 81 Chng 3: MIN NG DNG, C CH PHN CHIU, V SIU D LIU 1. To min ng dng.................................................................................................88 2. Chuyn cc i tng qua li cc min ng dng................................................. 90 3. Trnh np cc assembly khng cn thit vo min ng dng............................... 91 4. To kiu khng th vt qua bin min ng dng................................................. 92 5. Np assembly vo min ng dng hin hnh........................................................ 92 6. Thc thi assembly min ng dng khc............................................................. 94 7. Th hin ha mt kiu trong min ng dng khc................................................. 95 8. Truyn d liu gia cc min ng dng............................................................... 101 9. Gii phng assembly v min ng dng.............................................................. 103 10. Truy xut thng tin Type..................................................................................... 104 11. Kim tra kiu ca mt i tng.........................................................................106 12. To mt i tng bng c ch phn chiu.......................................................107 13. To mt c tnh ty bin....................................................................................110 14. S dng c ch phn chiu kim tra cc c tnh ca mt phn t chng trnh...............................................................113 Chng 4: TIU TRNH, TIN TRNH, V S NG B 1. Thc thi phng thc vi thread-pool..................................................................117 2. Thc thi phng thc mt cch bt ng b....................................................... 121 3. Thc thi phng thc bng Timer........................................................................129 4. Thc thi phng thc bng cch ra hiu i tng WaitHandle......................... 132 5. Thc thi phng thc bng tiu trnh mi............................................................135 6. iu khin qu trnh thc thi ca mt tiu trnh.................................................... 137 115 86 59

22

7. Nhn bit khi no mt tiu trnh kt thc.............................................................. 142 8. ng b ha qu trnh thc thi ca nhiu tiu trnh..............................................143 9. To mt i tng tp hp c tnh cht an-ton-v-tiu-trnh..............................148 10. Khi chy mt tin trnh mi............................................................................... 149 11. Kt thc mt tin trnh......................................................................................... 152 12. Bo m ch c th chy mt th hin ca ng dng ti mt thi im............................................................ 154 Chng 5: XML 1. Hin th cu trc ca mt ti liu XML trong TreeView......................................... 159 2. Chn thm nt vo ti liu XML............................................................................ 164 3. Chn thm nt vo ti liu XML mt cch nhanh chng...................................... 166 4. Tm mt nt khi bit tn ca n.............................................................................169 5. Thu ly cc nt XML trong mt khng gian tn XML c th................................. 170 6. Tm cc phn t vi biu thc XPath................................................................... 172 7. c v ghi XML m khng phi np ton b ti liu vo b nh......................... 175 8. Xc nhn tnh hp l ca mt ti liu XML da trn mt Schema....................... 178 9. S dng XML Serialization vi cc i tng ty bin........................................ 184 10. To XML Schema cho mt lp .NET.................................................................. 188 11. To lp t mt XML Schema..............................................................................188 12. Thc hin php bin i XSL..............................................................................189 Chng 6: WINDOWS FORM 1. Thm iu kim vo form lc thc thi................................................................... 195 2. Lin kt d liu vo iu kim.............................................................................. 197 3. X l tt c cc iu kim trn form..................................................................... 199 4. Theo vt cc form kh kin trong mt ng dng.................................................. 200 5. Tm tt c cc form trong ng dng MDI.............................................................. 201 6. Lu tr kch thc v v tr ca form.................................................................... 203 7. Buc ListBox cun xung......................................................................................205 8. Ch cho php nhp s vo TextBox...................................................................... 206 9. S dng ComboBox c tnh nng auto-complete................................................. 207 10. Sp xp ListView theo ct bt k........................................................................ 211 11. Lin kt menu ng cnh vo iu kim.............................................................. 213 12. S dng mt phn menu chnh cho menu ng cnh......................................... 214 13. To form a ngn ng........................................................................................ 217 14. To form khng th di chuyn c................................................................... 219 15. Lm cho form khng ng vin c th di chuyn c................................... 220 16. To mt icon ng trong khay h thng............................................................. 222 17. Xc nhn tnh hp l ca u vo cho mt iu kim........................................ 223 18. Thc hin thao tc ko-v-th............................................................................ 226 19. S dng tr gip cm-ng-cnh.........................................................................228 20. p dng phong cch Windows XP......................................................................229 21. Thay i c ca form....................................................................................231 Chng 7: ASP.NET V WEB FORM 234 193 157

23

1. Chuyn hng ngi dng sang trang khc........................................................236 2. Duy tr trng thi gia cc yu cu ca trang....................................................... 237 3. To cc bin thnh vin c trng thi cho trang................................................... 243 4. p ng cc s kin pha client vi JavaScript................................................... 244 5. Hin th ca s pop-up vi JavaScript.................................................................. 247 6. Thit lp focus cho iu kim................................................................................249 7. Cho php ngi dng upload file..........................................................................250 8. S dng IIS authentication....................................................................................253 9. S dng Forms authentication..............................................................................257 10. Thc hin xc nhn tnh hp l c-chn-la...................................................... 260 11. Thm ng iu kim vo Web Form................................................................. 263 12. Tr v ng mt bc hnh...................................................................................266 13. Np iu kim ngi dng bng m lnh...........................................................270 14. S dng page-caching v fragment-caching...................................................... 275 15. Dng li d liu vi ASP.NET Cache................................................................. 276 16. Kch hot vic g ri ng dng Web.................................................................. 280 17. Thay i quyn cp cho m ASP.NET.......................................................... 284 Chng 8: HA, A PHNG TIN, V IN N 1. Tm tt c cc font c ci t...................................................................... 289 2. Thc hin hit testing vi shape.......................................................................... 291 3. To form c hnh dng ty bin............................................................................ 295 4. To iu kim c hnh dng ty bin.................................................................... 297 5. Thm tnh nng cun cho mt bc hnh............................................................... 301 6. Thc hin chp mn hnh Desktop....................................................................... 303 7. S dng double buffering tng tc v li.................................................. 305 8. Hin th hnh dng thumbnail............................................................................. 308 9. Pht ting beep ca h thng.............................................................................310 10. Chi file audio..................................................................................................... 311 11. Chi file video..................................................................................................... 313 12. Ly thng tin v cc my in c ci t...................................................... 317 13. In vn bn n gin............................................................................................ 321 14. In vn bn c nhiu trang....................................................................................324 15. In text dng wrapping.......................................................................................... 328 16. Hin th print-preview.......................................................................................... 330 17. Qun l tc v in................................................................................................. 333 18. S dng Microsoft Agent.................................................................................... 338 Chng 9: FILE, TH MC, V I/O 1. Truy xut cc thng tin v file hay th mc.......................................................... 348 2. Thit lp cc thuc tnh ca file v th mc......................................................... 353 3. Chp, chuyn, xa file hay th mc..................................................................... 354 4. Tnh kch thc ca th mc................................................................................357 5. Truy xut thng tin phin bn ca file................................................................... 359 6. S dng TreeView hin th cy th mc just-in-time ...................................... 360 7. c v ghi file vn bn.......................................................................................... 363 8. c v ghi file nh phn.........................................................................................365 346 287

24

9. c file mt cch bt ng b...............................................................................367 10. Tm file ph hp mt biu thc wildcard.............................................................370 11. Kim tra hai file c trng nhau hay khng...........................................................371 12. Thao tc trn ng dn file...............................................................................373 13. Xc nh ng dn tng ng vi mt file hay th mc................................. 374 14. Lm vic vi ng dn tng i.................................................................... 375 15. To file tm......................................................................................................... 376 16. Ly dung lng a cn trng.............................................................................377 17. Hin th cc hp thoi file.................................................................................... 379 18. S dng khng gian lu tr ring....................................................................... 382 19. Theo di h thng file pht hin thay i....................................................... 384 20. Truy xut cng COM........................................................................................... 386 Chng 10: C S D LIU 1. Kt ni c s d liu.............................................................................................392 2. S dng connection-pooling................................................................................. 394 3. Thc thi cu lnh SQL hoc th tc tn tr.......................................................... 397 4. S dng thng s trong cu lnh SQL hoc th tc tn tr................................. 400 5. X l kt qu ca truy vn SQL bng data-reader............................................... 403 6. Thu ly ti liu XML t truy vn SQL Server........................................................ 407 7. Nhn bit tt c cc th hin SQL Server 2000 trn mng.................................. 411 8. c file Excel vi ADO.NET................................................................................. 413 9. S dng Data Form Wizard.................................................................................. 415 10. S dng Crystal Report Wizard.......................................................................... 424 Chng 11: LP TRNH MNG 1. Download file thng qua HTTP............................................................................. 437 2. Download v x l file bng stream...................................................................... 438 3. Ly trang HTML t mt website c yu cu xc thc.......................................... 440 4. Hin th trang web trong ng dng da-trn-Windows......................................... 442 5. Ly a ch IP ca my tnh hin hnh.................................................................. 446 6. Phn gii tn min thnh a ch IP...................................................................... 447 7. Ping mt a ch IP.............................................................................................. 448 8. Giao tip bng TCP...............................................................................................452 9. Ly a ch IP ca client t kt ni socket............................................................. 457 10. Thit lp cc ty chn socket..............................................................................459 11. To mt TCP-server h-tr-a-tiu-trnh............................................................ 460 12. S dng TCP mt cch bt ng b.................................................................. 463 13. Giao tip bng UDP............................................................................................ 467 14. Gi e-mail thng qua SMTP............................................................................... 470 15. Gi v nhn e-mail vi MAPI .............................................................................471 Chng 12: DCH V WEB XML V REMOTING 1. Trnh vit m cng cho a ch URL ca dch v Web XML................................ 477 2. S dng k thut response-caching trong dch v Web XML............................... 478 3. S dng k thut data-caching trong dch v Web XML.......................................479 474 435 389

25

4. To phng thc web h tr giao dch ............................................................... 482 5. Thit lp thng tin xc thc cho dch v Web XML...............................................485 6. Gi bt ng b mt phng thc web................................................................ 486 7. To lp kh-truy-xut-t-xa.................................................................................. 488 8. ng k tt c cc lp kh-truy-xut-t-xa trong mt assembly.......................... 494 9. Qun l cc i tng xa trong IIS.................................................................... 496 10. Pht sinh s kin trn knh truy xut t xa ....................................................... 497 11. Kim sot thi gian sng ca mt i tng xa .............................................502 12. Kim sot phin bn ca cc i tng xa..................................................... 504 13. To phng thc mt chiu vi dch v Web XML hay Remoting.......................................................................... 506 Chng 13: BO MT 1. Cho php m lnh c--tin-cy-mt-phn s dng assembly tn mnh ca bn........................................................................ 512 2. V hiu bo mt truy xut m lnh....................................................................... 514 3. V hiu vic kim tra quyn thc thi..................................................................... 516 4. Bo m b thc thi cp cho assembly mt s quyn no ............................. 517 5. Gii hn cc quyn c cp cho assembly....................................................... 519 6. Xem cc yu cu quyn c to bi mt assembly...........................................520 7. Xc nh m lnh c quyn no lc thc thi hay khng.................................. 522 8. Hn ch ai tha k cc lp ca bn v chp cc thnh vin lp................................................................................... 523 9. Kim tra chng c ca mt assembly.................................................................. 525 10. X l chng c khi np mt assembly .............................................................. 527 11. X l bo mt b thc thi bng chng c ca min ng dng ......................... 529 12. X l bo mt b thc thi bng chnh sch bo mt ca min ng dng...........................................................531 13. Xc nh ngi dng hin hnh c l thnh vin ca mt nhm Windows no hay khng............................................................... 535 14. Hn ch nhng ngi dng no thc thi m lnh ca bn........................... 538 15. Gi nhn ngi dng Windows.......................................................................... 543 Chng 14: MT M 1. To s ngu nhin................................................................................................ 550 2. Tnh m bm ca password..................................................................................552 3. Tnh m bm ca file.............................................................................................554 4. Kim tra m bm................................................................................................... 555 5. Bo m tnh ton vn d liu bng m bm c kha......................................... 558 6. Bo v file bng php mt ha i xng.............................................................. 560 7. Truy li kha i xng t password .....................................................................566 8. Gi mt b mt bng php mt ha bt i xng................................................. 568 9. Lu tr kha bt i xng mt cch an ton .......................................................574 10. Trao i kha phin i xng mt cch an ton.................................................577 Chng 15: KH NNG LIN TC M LNH KHNG-C-QUN-L 1. Gi mt hm trong mt DLL khng-c-qun-l................................................ 586 2. Ly handle ca mt iu kim, ca s, hoc file.................................................. 590 584 548 509

26

3. Gi mt hm khng-c-qun-l c s dng cu trc....................................... 591 4. Gi mt hm khng-c-qun-l c s dng callback....................................... 594 5. Ly thng tin li khng-c-qun-l................................................................... 595 6. S dng thnh phn COM trong .NET-client........................................................ 597 7. Gii phng nhanh thnh phn COM..................................................................... 600 8. S dng thng s ty chn................................................................................... 600 9. S dng iu kim ActiveX trong .NET-client.......................................................602 10. To thnh phn .NET dng cho COM-client....................................................... 603 Chng 16: CC GIAO DIN V MU THNG DNG 1. Hin thc kiu kh-tun-t-ha (serializable type)............................................... 607 2. Hin thc kiu kh-sao-chp (cloneable type)..................................................... 614 3. Hin thc kiu kh-so-snh (comparable type).................................................... 617 4. Hin thc kiu kh-lit-k (enumerable type)....................................................... 622 5. Hin thc lp kh-hy (disposable class).............................................................629 6. Hin thc kiu kh-nh-dng (formattable type)..................................................633 7. Hin thc lp ngoi l ty bin............................................................................. 636 8. Hin thc i s s kin ty bin......................................................................... 640 9. Hin thc mu Singleton.......................................................................................642 10. Hin thc mu Observer.....................................................................................643 Chng 17: S HA HP VI MI TRNG WINDOWS 1. Truy xut thng tin mi trng..............................................................................653 2. Ly gi tr ca mt bin mi trng...................................................................... 657 3. Ghi mt s kin vo nht k s kin Windows..................................................... 658 4. Truy xut Windows Registry................................................................................. 659 5. To mt dch v Windows..................................................................................... 663 6. To mt b ci t dch v Windows.................................................................... 668 7. To shortcut trn Desktop hay trong Start menu.................................................. 671 PH LC A: GII THIU MT S CNG C .NET ............................................................. 676 A.1 Bin dch cc on m ngn vi Snippet Compiler ............................................676 A.2 Xy dng biu thc chnh quy vi Regulator ..................................................... 678 A.3 Sinh m vi CodeSmith....................................................................................... 679 A.4 Vit kim th n v vi NUnit ............................................................................681 A.5 Kim sot m lnh vi FxCop ............................................................................ 683 A.6 Kho st assembly vi .NET Reflector ...............................................................684 A.7 Lp ti liu m lnh vi NDoc..............................................................................686 A.8 To dng gii php vi NAnt...............................................................................689 A.9 Chuyn i phin bn ASP.NET vi ASP.NET Version Switcher....................... 691 A.10 Chuyn i phin bn d n vi Visual Studio .NET Project Converter........... 692 A.11 Chuyn m ngun VB.NET sang C# vi VB.NET to C# Converter.................. 693 A.12 Chuyn m ngun C# sang VB.NET vi Convert C# to VB.NET..................... 693 A.13 Xy dng website qun tr c s d liu vi ASP.NET Maker 1.1................... 694 PH LC B: THUT NG ANH - VIT................................................................................... 697 651 605

27

TI LIU THAM KHO............................................................................................................ 705

28

29

Chng 1:PHT TRIN NG DNG

30

31 Chng 1: Pht trin ng dng

hng ny trnh by mt s kin thc nn tng, cn thit trong qu trnh pht trin mt ng dng C#. Cc mc trong chng s trnh by chi tit cc vn sau y: Xy dng cc ng dng Console v Windows Form (mc 1.1 v 1.2). To v s dng n th m lnh v th vin m lnh (mc 1.3 v 1.4). Truy xut i s dng lnh t bn trong ng dng (mc 1.5). S dng cc ch th bin dch ty bin vic bin dch m ngun (mc 1.6). Truy xut cc phn t chng trnh (c xy dng trong ngn ng khc) c tn xung t vi cc t kha C# (mc 1.7).

To v xc minh tn mnh cho assembly (mc 1.8, 1.9, 1.10, v 1.11). K mt assembly bng ch k s Microsoft Authenticode (mc 1.12 v 1.13). Qun l nhng assembly chia s c lu tr trong Global Assembly Cache (mc
1.14).

Ngn ngi dng dch ngc assembly ca bn (mc 1.15).

Tt c cc cng c c tho lun trong chng ny u c trong Microsoft .NET Framework hoc .NET Framework SDK. Cc cng c thuc Framework nm trong th mc chnh ca phin bn Framework m bn ang s dng (mc nh l \WINDOWS\Microsoft.NET\ Framework\v1.1.4322 nu bn s dng .NET Framework version 1.1). Qu trnh ci t .NET s t ng thm th mc ny vo ng dn mi trng ca h thng. Cc cng c c cung cp cng vi SDK nm trong th mc Bin ca th mc ci t SDK (mc nh l \Program Files\Microsoft Visual Studio .NET 2003\ SDK\v1.1\Bin). Th mc ny khng c thm vo ng dn mt cch t ng, v vy bn phi t thm n vo d dng truy xut cc cng c ny. Hu ht cc cng c trn u h tr hai dng i s dng lnh: ngn v di. Chng ny lun trnh by dng di v d hiu hn (nhng b li bn phi g nhiu hn). i vi dng ngn, bn hy tham kho ti liu tng ng trong .NET Framework SDK.

1.

To ng dng Console
Bn mun xy dng mt ng dng khng cn giao din ngi dng ha (GUI), thay vo hin th kt qu v c d liu nhp t dng lnh. Hin thc mt phng thc tnh c tn l Main di cc dng sau trong t nht mt file m ngun:
public static void Main(); public static void Main(string[] args); public static int Main();

32 Chng 1: Pht trin ng dng

public static int Main(string[] args);

S dng i s /target:exe khi bin dch assembly ca bn bng trnh bin dch C# (csc.exe). Mc nh trnh bin dch C# s xy dng mt ng dng Console tr khi bn ch nh loi khc. V l do ny, khng cn ch nh /target.exe, nhng thm n vo s r rng hn, hu ch khi to cc kch bn bin dch s c s dng bi cc ng dng khc hoc s c s dng lp i lp li trong mt thi gian. V d sau minh ha mt lp c tn l ConsoleUtils (c nh ngha trong file ConsoleUtils.cs):
using System; public class ConsoleUtils {

// Phng thc hin th li nhc v c p ng t console. public static string ReadString(string msg) {

Console.Write(msg); return System.Console.ReadLine(); }

// Phng thc hin th thng ip. public static void WriteString(string msg) {

System.Console.WriteLine(msg); }

// Phng thc Main dng th nghim lp ConsoleUtils. public static void Main() {

// Yu cu ngi dng nhp tn. string name = ReadString("Please enter your name : ");

// Hin th thng ip cho mng. WriteString("Welcome to Microsoft .NET Framework, " + name); } }

33 Chng 1: Pht trin ng dng

xy dng lp ConsoleUtils thnh mt ng dng Console c tn l ConsoleUtils.exe, s dng lnh:


csc /target:exe ConsoleUtils.cs

Bn c th chy file thc thi trc tip t dng lnh. Khi chy, phng thc Main ca ng dng ConsoleUtils.exe yu cu bn nhp tn v sau hin th thng ip cho mng nh sau:
Please enter your name : Binh Phuong Welcome to Microsoft .NET Framework, Binh Phuong

Thc t, ng dng him khi ch gm mt file m ngun. V d, lp HelloWorld di y s dng lp ConsoleUtils hin th thng ip Hello, world ln mn hnh (HelloWorld nm trong file HelloWorld.cs).
public class HelloWorld { public static void Main() { ConsoleUtils.WriteString("Hello, world"); } }

xy dng mt ng dng Console gm nhiu file m ngun, bn phi ch nh tt c cc file m ngun ny trong i s dng lnh. V d, lnh sau y xy dng ng dng MyFirstApp.exe t cc file m ngun HelloWorld.cs v ConsoleUtils.cs:
csc /target:exe /main:HelloWorld /out:MyFirstApp.exe HelloWorld.cs ConsoleUtils.cs

i s /out ch nh tn ca file thc thi s c to ra. Nu khng c ch nh, tn ca file thc thi s l tn ca file m ngun u tintrong v d trn l HelloWorld.cs. V c hai lp HelloWorld v ConsoleUtils u c phng thc Main, trnh bin dch khng th t ng quyt nh u l im nhp cho file thc thi. Bn phi s dng i s /main ch nh tn ca lp cha im nhp cho ng dng ca bn.

2.

To ng dng da-trn-Windows
Bn cn xy dng mt ng dng cung cp giao din ngi dng ha (GUI) da-trn-Windows Form. Hin thc mt phng thc tnh Main trong t nht mt file m ngun. Trong Main, to mt th hin ca mt lp tha k t lp System.Windows.Forms.Form (y l form chnh ca ng dng). Truyn i tng ny cho phng thc tnh Run ca lp System.Windows.Forms.Application. S dng i s /target:winexe khi bin dch assembly ca bn bng trnh bin dch C# (csc.exe).

Vic xy dng mt ng dng c giao din ngi dng ha Windows n gin hon ton khc xa vic pht trin mt ng dng da-trn-Windows hon chnh. Tuy nhin, bt k vit

34 Chng 1: Pht trin ng dng

mt ng dng n gin nh Hello World hay vit phin bn k tip cho Microsoft Word, bn cng phi thc hin nhng vic sau: To mt lp tha k t lp System.Windows.Forms.Form cho mi form cn cho ng dng. Trong mi lp form, khai bo cc thnh vin m t cc iu kim trn form, v d Button, Label, ListBox, TextBox. Cc thnh vin ny nn c khai bo l private hoc t nht cng l protected cc phn t khc ca chng trnh khng truy xut trc tip chng c. Nu mun cho php truy xut cc iu kim ny, hin thc cc thnh vin cn thit trong lp form cung cp vic truy xut gin tip (kim sot c) n cc iu kim nm trong. Trong lp form, khai bo cc phng thc th l cc s kin do cc iu kim trn form sinh ra, chng hn vic nhp vo Button, vic nhn phm khi mt TextBox ang tch cc. Cc phng thc ny nn c khai bo l private hoc protected v tun theo mu s kin .NET chun (s c m t trong mc 16.10). Trong cc phng thc ny (hoc trong cc phng thc c gi bi cc cc phng thc ny), bn s nh ngha cc chc nng ca ng dng. Khai bo mt phng thc khi dng cho lp form to cc iu kim trn form v cu hnh trng thi ban u ca chng (kch thc, mu, ni dung). Phng thc khi dng ny cng nn lin kt cc phng thc th l s kin ca lp vi cc s kin tng ng ca mi iu kim. Khai bo phng thc tnh Mainthng l mt phng thc ca lp tng ng vi form chnh ca ng dng. Phng thc ny l im bt u ca ng dng v c cc dng nh c cp mc 1.1. Trong phng thc Main, to mt th hin ca form chnh v truyn n cho phng thc tnh Application.Run. Phng thc Run hin th form chnh v khi chy mt vng lp thng ip chun trong tiu trnh hin hnh, chuyn cc tc ng t ngi dng (nhn phm, nhp chut) thnh cc s kin gi n ng dng.

Lp WelcomeForm trong v d di y minh ha cc k thut trn. Khi chy, n yu cu ngi dng nhp vo tn ri hin th mt MessageBox cho mng.
using System.Windows.Forms;

public class WelcomeForm : Form {

// Cc thnh vin private gi tham chiu n cc iu kim. private Label label1; private TextBox textBox1; private Button button1;

// Phng thc khi dng (to mt th hin form

35 Chng 1: Pht trin ng dng // v cu hnh cc iu kim trn form). public WelcomeForm() {

// To cc iu kim trn form. this.label1 = new Label(); this.textBox1 = new TextBox(); this.button1 = new Button();

// Tm hon layout logic ca form trong khi // chng ta cu hnh v b tr cc iu kim. this.SuspendLayout(); // Cu hnh cc Label (hin th yu cu). this.label1.Location = new System.Drawing.Point(16, 36); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(128, 16); this.label1.TabIndex = 0; this.label1.Text = "Please enter your name:"; // Cu hnh TextBox (nhn thng tin t ngi dng). this.textBox1.Location = new System.Drawing.Point(152, 32); this.textBox1.Name = "textBox1"; this.textBox1.TabIndex = 1; this.textBox1.Text = ""; // Cu hnh Buton (ngi dng nhn vo sau khi nhp tn). this.button1.Location = new System.Drawing.Point(109, 80); this.button1.Name = "button1"; this.button1.TabIndex = 2; this.button1.Text = "Enter"; this.button1.Click += new System.EventHandler(this.button1_Click); // Cu hnh WelcomeForm v thm cc iu kim. this.ClientSize = new System.Drawing.Size(292, 126); this.Controls.Add(this.button1); this.Controls.Add(this.textBox1); this.Controls.Add(this.label1); this.Name = "form1";

36 Chng 1: Pht trin ng dng

this.Text = "Microsoft .NET Framework"; // Phc hi layout logic ca form ngay khi // tt c cc iu kim c cu hnh. this.ResumeLayout(false); } // im nhp ca ng dng (to mt th hin form, chy vng lp // thng ip chun trong tiu trnh hin hnh - vng lp chuyn // cc tc ng t ngi dng thnh cc s kin n ng dng). public static void Main() {

Application.Run(new WelcomeForm()); } // Phng thc th l s kin // (c gi khi ngi dng nhp vo nt Enter). private void button1_Click(object sender, System.EventArgs e) { // Ghi ra Console. System.Console.WriteLine("User entered: " + textBox1.Text); // Hin th li cho trong MessageBox. MessageBox.Show("Welcome to Microsoft .NET Framework, " + textBox1.Text, "Microsoft .NET Framework"); } }

37 Chng 1: Pht trin ng dng

Hnh 1.1 Mt ng dng Windows Form n gin

xy dng lp WelcomeForm (trong file WelcomeForm.cs) thnh mt ng dng, s dng lnh:


csc /target:winexe WelcomeForm.cs

i s /target:winexe bo cho trnh bin dch bit y l ng dng da-trn-Windows. Do , trnh bin dch s xy dng file thc thi sao cho khng c ca s Console no c to ra khi bn chy ng dng. Nu bn s dng /target:exe khi xy dng mt ng dng Windows Form thay cho /target:winexe th ng dng vn lm vic tt, nhng s to ra mt ca s Console khi chy. Mc d iu ny khng c a chung trong mt ng dng hon chnh, ca s Console vn hu ch nu bn cn ghi ra cc thng tin g ri hoc ng nhp khi ang pht trin v th nghim mt ng dng Windows Form. Bn c th ghi ra Console bng phng thc Write v WriteLine ca lp System.Console. ng dng WelcomeForm.exe trong hnh 1.1 hin th li cho ngi dng c tn l Binh Phuong. Phin bn ny ca ng dng c xy dng bng i s /target:exe, nn c ca s Console hin th kt qu ca dng lnh Console.WriteLine trong phng thc th l s kin button1_Click .

Vic xy dng mt ng dng GUI s thng tn nhiu thi gian do phi to i tng, cu hnh v lin kt nhiu form v iu kim. Nhng may mn l Microsoft Visual Studio .NET t ng ha hu ht cc hot ng ny. Nu khng c cng c nh Microsoft Visual Studio .NET th vic xy dng mt ng dng ha s s rt lu, nhm chn v d sinh ra li.

3.

Bn cn thc hin cc cng vic sau:

To v s dng module
Tng hiu qu thc thi v s dng b nh ca ng dng bng cch bo m rng b thc thi np cc kiu t c s dng ch khi no cn thit.

38 Chng 1: Pht trin ng dng

Bin dch cc kiu c vit trong C# thnh mt dng c th s dng li c trong cc ngn ng .NET khc. S dng cc kiu c pht trin bng mt ngn ng khc bn trong ng dng C# ca bn.

S dng i s /target:module (ca trnh bin dch C#) xy dng m ngun C# ca bn thnh mt module. S dng i s /addmodule kt hp cc module hin c vo assembly ca bn.

Module l cc khi c bn to dng nn cc assembly .NET. Module bao gm mt file n cha: M ngn ng trung gian (Microsoft Intermediate LanguageMSIL): c to t m ngun C# trong qu trnh bin dch. Siu d liu (metadata): M t cc kiu nm trong module. Cc ti nguyn (resource): Chng hn icon v string table, c s dng bi cc kiu trong module.

Assembly gm mt hay nhiu module v mt manifest. Khi ch c mt module, module v manifest thng c xy dng thnh mt file cho thun tin. Khi c nhiu module, assembly l mt nhm lun l ca nhiu file c trin khai nh mt th thng nht. Trong trng hp ny, manifest c th nm trong mt file ring hay chung vi mt trong cc module. Vic xy dng mt assembly t nhiu module gy kh khn cho vic qun l v trin khai assembly; nhng trong mt s trng hp, cch ny c nhiu li ch, bao gm: B thc thi s ch np mt module khi cc kiu nh ngha trong module ny c yu cu. Do , khi c mt tp cc kiu m ng dng t khi dng, bn c th t chng trong mt module ring m b thc thi ch np khi cn. Vic ny c cc li ch sau: Tng hiu qu thc thi, c bit khi ng dng c np qua mng. Gim thiu nhu cu s dng b nh.

Kh nng s dng nhiu ngn ng khc nhau vit cc ng dng chy trn b thc thi ngn ng chung (Common Language RuntimeCLR) l mt th mnh ca .NET Framework. Tuy nhin, trnh bin dch C# khng th bin dch m ngun c vit bng Microsoft Visual Basic .NET hay COBOL .NET trong assembly ca bn. Bn phi s dng trnh bin dch ca ngn ng bin dch m ngun thnh MSIL theo mt cu trc m trnh bin dch C# c th hiu c l module. Tng t, nu mun lp trnh vin ca cc ngn ng khc s dng cc kiu c pht trin bng C#, bn phi xy dng chng thnh mt module.

bin dch file ngun ConsoleUtils.cs thnh mt module, s dng lnh:


csc /target:module ConsoleUtils.cs

Lnh ny s cho kt qu l mt file c tn l ConsoleUtils.netmodule. Phn m rng netmodule l phn m rng mc nh cho module, v tn file trng vi tn file ngun C#.

39 Chng 1: Pht trin ng dng

Bn cng c th xy dng mt module t nhiu file ngun, cho kt qu l mt file (module) cha MSIL v siu d liu cho cc kiu cha trong tt c file ngun. V d, lnh:
csc /target:module ConsoleUtils.cs WindowsUtils.cs

bin dch hai file ngun ConsoleUtils.cs v WindowsUtils.cs thnh mt module c tn l ConsoleUtils.netmodule. Tn ca module c t theo tn file ngun u tin tr khi bn ch nh c th bng i s /out. V d, lnh:
csc /target:module /out:Utilities.netmodule ConsoleUtils.cs WindowsUtils.cs

s cho kt qu l file Utilities.netmodule. xy dng mt assembly gm nhiu module, s dng i s /addmodule. V d, xy dng file thc thi MyFirstApp.exe t hai module: WindowsUtils.netmodule v ConsoleUtils.netmodule v hai file ngun: SourceOne.cs v SourceTwo.cs, s dng lnh:
csc /out:MyFirstApp.exe /target:exe /addmodule:WindowsUtils.netmodule,ConsoleUtils.netmodule SourceOne.cs SourceTwo.cs

Lnh ny s cho kt qu l mt assembly gm cc file sau: MyFirstApp.exe: Cha manifest cng nh MSIL cho cc kiu c khai bo trong hai file ngun SourceOne.cs v SourceTwo.cs. ConsoleUtils.netmodule v WindowsUtils.netmodule: Gi y l mt phn ca assembly nhng khng thay i sau khi bin dch. (Nu bn chy MyFirstApp.exe m khng c cc file netmodule, ngoi l System.IO.FileNotFoundException s b nm).

4.

To v s dng th vin
Bn cn xy dng mt tp cc chc nng thnh mt th vin n c th c tham chiu v ti s dng bi nhiu ng dng. to th vin, s dng i s /target:library khi bin dch assembly ca bn bng trnh bin dch C# (csc.exe). tham chiu th vin, s dng i s /reference v ch nh tn ca th vin khi bin dch ng dng.

Mc 1.1 minh ha cch xy dng ng dng MyFirstApp.exe t hai file m ngun ConsoleUtils.cs v HelloWorld.cs. File ConsoleUtils.cs cha lp ConsoleUtils, cung cp cc phng thc n gin ha s tng tc vi Console. Cc chc nng ny ca lp ConsoleUtils cng c th hu ch cho cc ng dng khc. s dng li lp ny, thay v gp c m ngun ca n vo mi ng dng, bn c th xy dng n thnh mt th vin, khin cc chc nng ny c th truy xut c bi nhiu ng dng. xy dng file ConsoleUtils.cs thnh mt th vin, s dng lnh:
csc /target:library ConsoleUtils.cs

Lnh ny sinh ra mt file th vin c tn l ConsoleUtils.dll.

40 Chng 1: Pht trin ng dng

to mt th vin t nhiu file m ngun, lit k tn cc file ny cui dng lnh. Bn c th s dng i s /out ch nh tn th vin, nu khng, tn th vin c t theo tn ca file m ngun u tin. V d, to th vin MyFirstLibrary.dll t hai file m ngun ConsoleUtils.cs v WindowsUtils.cs, s dng lnh:
csc /out:MyFirstLibrary.dll /target:library ConsoleUtils.cs WindowsUtils.cs

Trc khi phn phi th vin cho ngi khc s dng, bn nn to tn mnh (strong-name) khng ai c th chnh sa assembly ca bn. Vic t tn mnh cho th vin cn cho php ngi khc ci t n vo Global Assembly Cache, gip vic ti s dng d dng hn (xem mc 1.9 v cch t tn mnh cho th vin ca bn v mc 1.14 v cch ci t mt th vin c tn mnh vo Global Assembly Cache). Ngoi ra, bn c th nh du th vin ca bn vi ch k Authenticode ngi dng bit bn l tc gi ca th vin (xem mc 1.12 v cch nh du th vin vi Authenticode). bin dch mt assembly c s dng cc kiu c khai bo trong cc th vin khc, bn phi bo cho trnh bin dch bit cn tham chiu n th vin no bng i s /reference. V d, bin dch file HelloWorld.cs (trong mc 1.1) trong trng hp lp ConsoleUtils nm trong th vin ConsoleUtils.dll, s dng lnh:
csc /reference:ConsoleUtils.dll HelloWorld.cs

Bn cn ch ba im sau: Nu tham chiu nhiu hn mt th vin, bn cn phn cch tn cc th vin bng du phy hoc chm phy, nhng khng s dng khong trng. V d:
/reference:ConsoleUtils.dll,WindowsUtils.dll

Nu th vin khng nm cng th mc vi file m ngun, bn cn s dng i s /lib ch nh th mc cha th vin. V d:


/lib:c:\CommonLibraries,c:\Dev\ThirdPartyLibs

Nu th vin cn tham chiu l mt assembly gm nhiu file, bn cn tham chiu file c cha manifest (xem thng tin v assembly gm nhiu file trong mc 1.3).

5.

Truy xut cc i s dng lnh


Bn cn truy xut cc i s c ch nh trn dng lnh khi thc thi ng dng. S dng mt dng ca phng thc Main, trong nhn i s dng lnh di dng mt mng chui. Ngoi ra, c th truy xut i s dng lnh t bt c u trong m ngun ca bn bng cc thnh vin tnh ca lp System.Environment.

Khai bo phng thc Main thuc mt trong cc dng sau truy xut i s dng lnh di dng mt mng chui:
public static void Main(string[] args) {}

41 Chng 1: Pht trin ng dng

public static int Main(string[] args) {}

Khi chy, i s args s cha mt chui cho mi gi tr c nhp trn dng lnh v nm sau tn ng dng. Phng thc Main trong v d di y s duyt qua mi i s dng lnh c truyn cho n v hin th chng ra ca s Console:
public class CmdLineArgExample {

public static void Main(string[] args) {

// Duyt qua cc i s dng lnh. foreach (string s in args) { System.Console.WriteLine(s); } } }

Khi thc thi CmdLineArgExample vi lnh:


CmdLineArgExample "one \"two\" three" four 'five six'

ng dng s to ra kt xut nh sau:


one "two" four 'five six' three

Ch rng, khc vi C v C++, tn ca ng dng khng nm trong mng cha cc i s. Tt c k t nm trong du nhy kp () c xem nh mt i s, nhng du nhy n ( ') ch c xem nh k t bnh thng. Nu mun s dng du nhy kp trong i s, t k t vch ngc (\) trc n. Tt c cc khong trng u b b qua tr khi chng nm trong du nhy kp. Nu mun truy xut i s dng lnh ni khc (khng phi trong phng thc Main), bn cn x l cc i s dng lnh trong phng thc Main v lu tr chng s dng sau ny. Ngoi ra, bn c th s dng lp System.Environment, lp ny cung cp hai thnh vin tnh tr v thng tin dng lnh: CommandLine v GetCommandLineArgs. Thuc tnh CommandLine tr v mt chui cha ton b dng lnh. Ty thuc vo h iu hnh ng dng ang chy m thng tin ng dn c ng trc tn ng dng hay khng. Cc h iu hnh Windows NT 4.0, Windows 2000, v Windows XP khng cha thng tin ng dn, trong khi Windows 98 v Windows ME th li cha. Phng thc GetCommandLineArgs tr v mt mng chui cha cc i s dng lnh. Mng ny c th c x l ging nh mng c truyn cho phng thc Main, tuy nhin phn t u tin ca mng ny l tn ng dng.

42 Chng 1: Pht trin ng dng

6.

Chn bin dch mt khi m vo file thc thi


Bn cn chn mt s phn m ngun s c bin dch trong file thc thi. S dng cc ch th tin x l #if, #elif, #else, v #endif ch nh khi m no s c bin dch trong file thc thi. S dng c tnh System.Diagnostics. ConditionalAttribute ch nh cc phng thc m s ch c gi ty theo iu kin. iu khin vic chn cc khi m bng cc ch th #define v #undef trong m ngun, hoc s dng i s /define khi chy trnh bin dch C#.

Nu mun ng dng ca bn hot ng khc nhau ty vo cc yu t nh nn hoc mi trng m ng dng chy, bn c th kim tra iu kin khi chy bn trong m ngun v kch hot cc hot ng cn thit. Tuy nhin, cch ny lm m ngun ln ln v nh hng n hiu nng. Mt cch tip cn khc l xy dng nhiu phin bn ca ng dng h tr cc nn v mi trng khc nhau. Mc d cch ny khc phc c cc vn v ln ca m ngun v vic gim hiu nng, nhng n khng phi l gii php tt khi phi gi m ngun khc nhau cho mi phin bn. V vy, C# cung cp cc tnh nng cho php bn xy dng cc phin bn ty bin ca ng dng ch t mt m ngun. Cc ch th tin x l cho php bn ch nh cc khi m s c bin dch vo file thc thi ch nu cc k hiu c th c nh ngha lc bin dch. Cc k hiu hot ng nh cc cng tc on/off, chng khng c gi tr m ch l c nh ngha hay cha c nh ngha. nh ngha mt k hiu, bn c th s dng ch th #define trong m ngun hoc s dng i s trnh bin dch /define. K hiu c nh ngha bng #define c tc dng n cui file nh ngha n. K hiu c nh ngha bng /define c tc dng trong tt c cc file ang c bin dch. b mt k hiu nh ngha bng /define, C# cung cp ch th #undef, hu ch khi bn mun bo m mt k hiu khng c nh ngha trong cc file ngun c th. Cc ch th #define v #undef phi nm ngay u file m ngun, trn c cc ch th using. Cc k hiu c phn bit ch hoa-thng. Trong v d sau, bin platformName c gn gi tr ty vo cc k hiu winXP, win2000, winNT, hoc win98 c c nh ngha hay khng. Phn u ca m ngun nh ngha cc k hiu win2000 v released (khng c s dng trong v d ny), v b k hiu win98 trong trng hp n c nh ngha trn dng lnh trnh bin dch.
#define win2000 #define release #undef win98

using System;

public class ConditionalExample {

public static void Main() {

43 Chng 1: Pht trin ng dng

// Khai bo chui cha tn ca nn. string platformName;

#if winXP

// Bin dch cho Windows XP

platformName = "Microsoft Windows XP"; #elif win2000 // Bin dch cho Windows 2000

platformName = "Microsoft Windows 2000"; #elif winNT // Bin dch cho Windows NT

platformName = "Microsoft Windows NT"; #elif win98 // Bin dch cho Windows 98

platformName = "Microsoft Windows 98"; #else // Nn khng c nhn bit

platformName = "Unknown"; #endif

Console.WriteLine(platformName); } }

xy dng lp ConditionalExample (cha trong file ConditionalExample.cs) v nh ngha cc k hiu winXP v DEBUG (khng c s dng trong v d ny), s dng lnh:
csc /define:winXP;DEBUG ConditionalExample.cs

Cu trc #if .. #endif nh gi cc mnh #if v #elif ch n khi tm thy mt mnh ng, ngha l nu c nhiu k hiu c nh ngha (chng hn, winXP v win2000), th t cc mnh l quan trng. Trnh bin dch ch bin dch on m nm trong mnh ng. Nu khng c mnh no ng, trnh bin dch s bin dch on m nm trong mnh #else. Bn cng c th s dng cc ton t lun l bin dch c iu kin da trn nhiu k hiu. Bng 1.1 tm tt cc ton t c h tr.
Bng 1.1 Cc ton t lun l c h tr bi ch th #if .. #endif Ton t == V d #if winXP == true M t

Bng. ng nu winXP c nh ngha. Tng ng vi #if winXP. Khng bng. ng nu winXP khng c nh ngha. Tng ng vi #if !winXP. Php AND lun l. ng nu winXP v release c nh ngha.

!=

#if winXP != true

&&

#if winXP && release

44 Chng 1: Pht trin ng dng

||

#if winXP || release

Php OR lun l. ng nu winXP hoc release c nh ngha. Du ngoc n cho php nhm cc biu thc. ng nu winXP hoc win2000 c nh ngha, ng thi release cng c nh ngha.

()

#if (winXP || win2000) && release

Bn khng nn lm dng cc ch th bin dch c iu kin v khng nn vit cc biu thc iu kin qu phc tp; nu khng, m ngun ca bn s tr nn d nhm ln v kh qun lc bit khi d n ca bn cng ln.

Mt cch khc khng linh hot nhng hay hn ch th tin x l #if l s dng c tnh System.Diagnostics.ConditionalAttribute. Nu bn p dng ConditionalAttribute cho mt phng thc, trnh bin dch s b qua mi li gi phng thc nu k hiu do ConditionalAttribute ch nh khng c nh ngha ti im gi. Trong on m sau, ConditionalAttribute xc nh rng phng thc DumpState ch c bin dch vo file thc thi nu k hiu DEBUG c nh ngha khi bin dch.
[System.Diagnostics.Conditional("DEBUG")] public static void DumpState() {//...}

Vic s dng ConditionalAttribute gip t cc iu kin gi mt phng thc ti ni khai bo n m khng cn cc ch th #if. Tuy nhin, bi v trnh bin dch tht s b qua cc li gi phng thc, nn m ca bn khng th ph thuc vo cc gi tr tr v t phng thc. iu ny c ngha l bn c th p dng ConditionalAttribute ch vi cc phng thc tr v void. Bn c th p dng nhiu th hin ConditionalAttribute cho mt phng thc, tng ng vi php OR lun l. Cc li gi phng thc DumpState di y ch c bin dch nu DEBUG hoc TEST c nh ngha.
[System.Diagnostics.Conditional("DEBUG")] [System.Diagnostics.Conditional("TEST")] public static void DumpState() {//...}

Vic thc hin php AND lun l cn s dng phng thc iu kin trung gian, khin cho m tr nn qu phc tp, kh hiu v kh bo tr. V d di y cn phng thc trung gian DumpState2 nh ngha c hai k hiu DEBUG v TEST.
[System.Diagnostics.Conditional("DEBUG")] public static void DumpState() { DumpState2(); } [System.Diagnostics.Conditional("TEST")] public static void DumpState2() {//...}

45 Chng 1: Pht trin ng dng

Cc lp Debug v Trace thuc khng gian tn System.Diagnostics s dng c tnh ConditionalAttribute trong nhiu phng thc ca chng. Cc phng thc ca lp Debug ty thuc vo vic nh ngha k hiu DEBUG, cn cc phng thc ca lp Trace ty thuc vo vic nh ngha k hiu TRACE.

7.

Truy xut mt phn t chng trnh c tn trng vi mt t kha


Bn cn truy xut mt thnh vin ca mt kiu, nhng tn kiu hoc tn thnh vin ny trng vi mt t kha ca C#. t k hiu @ vo trc cc tn trng vi t kha.

.NET Framework cho php bn s dng cc thnh phn phn mm (software component) c pht trin bng cc ngn ng .NET khc bn trong ng dng C# ca bn. Mi ngn ng u c mt tp t kha (hoc t dnh ring) cho n v c cc hn ch khc nhau i vi cc tn m lp trnh vin c th gn cho cc phn t chng trnh nh kiu, thnh vin, v bin. Do , c kh nng mt thnh phn c pht trin trong mt ngn ng khc tnh c s dng mt t kha ca C# t tn cho mt phn t no . K hiu @ cho php bn s dng mt t kha ca C# lm nh danh v khc phc vic ng tn. on m sau to mt i tng kiu operator v thit lp thuc tnh volatile ca n l true (c operator v volatile u l t kha ca C#):
// To i tng operator. @operator Operator1 = new @operator(); // Thit lp thuc tnh volatile ca operator. Operator1.@volatile = true;

8.

To v qun l cp kha tn mnh


Bn cn to mt cp kha cng khai v kha ring (public key v private key) gn tn mnh cho assembly. S dng cng c Strong Name (sn.exe) to cp kha v lu tr chng trong mt file hoc trong mt kho cha kha Cryptographic Service Provider. Cryptographic Service Provider (CSP) l mt phn t ca Win32 CryptoAPI, cung cp cc dch v nh mt ha, gii mt ha v to ch k s. CSP cn cung cp cc tin ch cho kho cha kha (key container) nh s dng gii thut mt ha mnh v cc bin php bo mt ca h iu hnh bo v ni dung ca kho cha kha. CSP v CryptoAPI khng c cp y trong quyn sch ny, bn hy tham kho thm trong ti liu SDK.

to mt cp kha mi v lu tr chng trong file c tn l MyKey.snk, thc thi lnh sn k MyKey.snk (phn m rng .snk thng c s dng cho cc file cha kha tn mnh). File

46 Chng 1: Pht trin ng dng

c to ra cha c kha cng khai v kha ring. Bn c th s dng lnh sn tp MyKey.snk xem kha cng khai, lnh ny cho kt xut nh sau:
Microsoft (R) .NET Framework Strong Name Utility Version 1.1.4322.573 Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.

Public key is 07020000002400005253413200040000010001008bb302ef9180bf717ace00d570dd649821f24ed578 fdccf1bc4017308659c126570204bc4010fdd1907577df1c2292349d9c2de33e49bd991a0a5bc9b69e 5fd95bafad658a57b8236c5bd9a43be022a20a52c2bd8145448332d5f85e9ca641c26a4036165f2f35 3942b643b10db46c82d6d77bbc210d5a7c5aca84d7acb52cc1654759c62aa34988...

Public key token is f7241505b81b5ddc

Token ca kha cng khai l 8 byte cui ca m bm c tnh ra t kha cng khai. V kha cng khai qu di nn .NET s dng token cho mc ch hin th, v l mt c ch ngn gn cho cc assembly khc tham chiu kha cng khai (chng 14 s tho lun tng qut v m bm). Nh tn gi ca n, kha cng khai (hoc token ca kha cng khai) khng cn c gi b mt. Khi bn to tn mnh cho assembly (c tho lun trong mc 1.9), trnh bin dch s s dng kha ring to mt ch k s (mt m bm -c-mt-ha) ca assembly manifest. Trnh bin dch nhng ch k s v kha cng khai vo assembly ngi dng c th kim tra ch k s. Vic gi b mt kha ring l cn thit v ngi truy xut vo kha ring ca bn c th thay i assembly v to mt tn mnh mikhin cho khch hng ca bn khng bit m ngun b sa i. Khng c c ch no loi b cc kha tn mnh b tn hi. Nu kha ring b tn hi, bn phi to kha mi v phn phi phin bn mi ca assembly (c t tn mnh bng cc kha mi). Bn cng cn thng bo cho khch hng bit l kha b tn hi v h nn s dng phin bn notrong trng hp ny, bn b mt c tin bc v uy tn. C nhiu cch bo v kha ring ca bn; s dng cch no l ty vo cc yu t nh: Cu trc v tm c ca t chc. Qu trnh pht trin v phn phi ng dng. Phn mm v phn cng hin c. Yu cu ca khch hng. Thng thng, mt nhm nh cc c nhn ng tin cy (c gi l signing authority) s c trch nhim m bo an ton cho cc kha tn mnh ca cng ty v k mi assembly trc khi chng c phn phi. Kh nng tr hon k assembly (s c tho lun mc 1.11) to iu kin thun li cho vic ng dng m hnh ny v trnh c vic bn phi phn phi kha ring cho mi thnh vin ca nhm pht trin.

47 Chng 1: Pht trin ng dng

Cng c Strong Name cn cung cp tnh nng s dng kho cha kha CSP n gin ha vic bo mt cc kha tn mnh. Mt khi to mt cp kha trong mt file, bn c th ci t cc kha ny vo kho cha kha CSP v xa file i. V d, lu tr cp kha nm trong file MyKey.snk vo mt kho cha kha CSP c tn l StrongNameKeys, s dng lnh sn -i MyKeys.snk StrongNameKeys (mc 1.9 s gii thch cch s dng cc kha tn mnh c lu tr trong mt kho cha kha CSP). Mt kha cnh quan trng ca kho cha kha CSP l c cc kho cha kha da-theo ngidng v c cc kho cha kha da-theo-my. C ch bo mt ca Windows bo m ngi dng ch truy xut c kho cha kha da-theo-ngi-dng ca chnh h. Tuy nhin, bt k ngi dng no ca my u c th truy xut kho cha kha da-theo-my. Theo mc nh, cng c Strong Name s dng kho cha kha da-theo-my, ngha l mi ngi ng nhp vo my v bit tn ca kho cha kha u c th k mt assembly bng cc kha tn mnh ca bn. cng c Strong Name s dng kho cha kha da-theo-ngidng, s dng lnh sn m n; khi mun tr li kho cha kha da-theo-my, s dng lnh sn m y. Lnh sn m s cho bit cng c Strong Name hin c cu hnh l s dng kho cha kha da-theo-ngi-dng hay da-theo-my. xa cc kha tn mnh t kho StrongNameKeys (cng nh xa c kho ny), s dng lnh sn d StrongNameKeys.

9.

To tn mnh cho assembly


Bn cn to tn mnh cho mt assembly n: C mt nh danh duy nht, cho php gn cc quyn c th vo assembly khi cu hnh Code Access Security Policy (chnh sch bo mt cho vic truy xut m lnh). Khng th b sa i v sau mo nhn l nguyn bn. H tr vic nh s phin bn v cc chnh sch v phin bn (version policy). C th c chia s trong nhiu ng dng, v c ci t trong Global Assembly Cache (GAC).

S dng cc c tnh (attribute) mc-assembly ch nh ni cha cp kha tn mnh, v c th ch nh thm s phin bn v thng tin bn a cho assembly. Trnh bin dch s to tn mnh cho assembly trong qu trnh xy dng. Mt cp kha tn mnh nm trong mt file hoc mt kho cha kha CSP (xem mc 1.8 v cch to cp kha tn mnh). S dng cc c tnh mc-assembly ch nh ni trnh bin dch c th tm thy cp kha tn mnh . Nu cp kha nm trong mt file, p dng c tnh System.Reflection. AssemblyKeyFileAttribute cho assembly v ch nh tn file cha cc kha.

to tn mnh cho mt assembly bng trnh bin dch C#, bn cn cc yu t sau:

48 Chng 1: Pht trin ng dng

Nu cp kha nm trong mt kho cha kha CSP, p dng c tnh System.Reflection.AssemblyKeyNameAttribute cho assembly v ch nh tn ca kho cha kha.

Ngoi ra, bn c th ty chn: p dng c tnh System.Reflection.AssemblyCultureAttribute cho assembly ch nh thng tin bn a m assembly h tr (Bn khng th ch nh bn a cho cc assembly thc thi v assembly thc thi ch h tr bn a trung lp). p dng c tnh System.Reflection.AssemblyVersionAttribute cho assembly ch nh phin bn ca assembly.

on m di y (trong file HelloWorld.cs) minh ha cch s dng cc c tnh (phn in m) ch nh kha, bn a, v phin bn cho assembly:
using System; using System.Reflection; [assembly:AssemblyKeyName("MyKeys")] [assembly:AssemblyCulture("")] [assembly:AssemblyVersion("1.0.0.0")] public class HelloWorld { public static void Main() { Console.WriteLine("Hello, world"); } }

to mt assembly tn mnh t on m trn, to cc kha tn mnh v lu tr chng trong file MyKeyFile bng lnh sn -k MyKeyFile.snk. Sau , s dng lnh sn -i MyKeyFile.snk MyKeys ci t cc kha vo mt kho cha kha CSP c tn l MyKeys. Cui cng, s dng lnh csc HelloWorld.cs bin dch file HelloWorld.cs thnh mt assembly tn mnh.

Bn cng c th s dng cng c Assembly Linker (al.exe) to assembly tn mnh, cch ny cho php ch nh cc thng tin tn mnh trn dng lnh thay v s dng cc c tnh trong m ngun. Cch ny hu ch khi bn khng mun nhng cc c tnh tn mnh vo file ngun v khi bn s dng kch bn xy dng nhng cy m ngun s. Xem thm thng tin v Assembly Linker trong ti liu .NET Framework SDK.

49 Chng 1: Pht trin ng dng

10.

Xc minh mt assembly tn mnh khng b sa i


Bn cn xc minh rng mt assembly tn mnh cha h b sa i sau khi n c bin dch. S dng cng c Strong Name (sn.exe) xc minh tn mnh ca assembly.

Mi khi np mt assembly tn mnh, b thc thi .NET ly m bm -c-mt-ha (c nhng trong assembly) v gii mt ha vi kha cng khai (cng c nhng trong assembly). Sau , b thc thi tnh m bm ca assembly manifest v so snh n vi m bm va-c-gii-mt-ha. Qu trnh xc minh ny s nhn bit assembly c b thay i sau khi bin dch hay khng. Nu mt qu trnh xc minh tn mnh tht bi vi mt assembly thc thi, b thc thi s hin th hp thoi nh hnh 1.2. Nu c np mt assembly tht bi trong qu trnh xc minh, b thc thi s nm ngoi l System.IO.FileLoadException vi thng ip Strong name validation failed.

Hnh 1.2 Li khi c thc thi mt assembly tn mnh b sa i

Ngoi vic to v qun l cc kha tn mnh ( c tho lun trong mc 1.8), cng c Strong Name cn cho php xc minh cc assembly tn mnh. xc minh assembly tn mnh HelloWorld.exe khng b sa i, s dng lnh sn -vf HelloWorld.exe. i s -v yu cu cng c Strong Name xc minh tn mnh ca mt assembly xc nh, i s -f buc thc hin vic xc minh tn mnh ngay c n b v hiu trc cho mt assembly no . (Bn c th s dng i s -Vr v hiu vic xc minh tn mnh i vi mt assembly, v d sn -Vr HelloWorld.exe; mc 1.11 s trnh by l do ti sao cn v hiu vic xc minh tn mnh). Nu assembly ny c xc minh l khng i, bn s thy kt xut nh sau:
Microsoft (R) .NET Framework Strong Name Utility Version 1.1.4322.573 Copyright (C) Microsoft Corporation 1998-2002. All rights reserved. Assembly 'HelloWorld.exe' is valid

Tuy nhin, nu assembly ny b sa i, bn s thy kt xut nh sau:


Microsoft (R) .NET Framework Strong Name Utility Version 1.1.4322.573 Copyright (C) Microsoft Corporation 1998-2002. All rights reserved. Failed to verify assembly -- Unable to format error message 8013141A

50 Chng 1: Pht trin ng dng

11.

Hon vic k assembly


Bn cn to mt assembly tn mnh, nhng khng mun mi thnh vin trong nhm pht trin truy xut kha ring ca cp kha tn mnh. Trch xut v phn phi kha cng khai ca cp kha tn mnh. Lm theo hng dn trong mc 1.9 to tn mnh cho assembly. p dng c tnh System.Reflection.AssemblyDelaySignAttribute cho assembly ch nh n l assembly s c k sau. S dng i s -Vr ca cng c Strong Name (sn.exe) v hiu vic xc minh tn mnh cho assembly ny.

Cc assembly tham chiu n assembly tn mnh s cha token ca assembly c tham chiu, ngha l assembly c tham chiu phi c to tn mnh trc khi c tham chiu. Trong mt mi trng pht trin m assembly thng xuyn c xy dng li, mi ngi pht trin v kim th u cn c quyn truy xut cp kha tn mnh ca bny l mt nguy c bo mt ch yu. Thay v phn phi kha ring cho mi thnh vin ca nhm pht trin, .NET Framework cung cp c ch hon vic k mt assembly (c gi l delay signing), theo bn c th to tn mnh khng hon chnh cho assembly (tm gi l tn mnh bn phn). Tn mnh bn phn ny ch cha kha cng khai v token ca kha cng khai (cn thit tham chiu assembly), nhng cha ch cho ch k s c to ra t kha ring sau ny. Khi qu trnh pht trin hon tt, signing authority (ngi chu trch nhim v vic bo mt v vic s dng cp kha tn mnh) s k li assembly b hon trc hon thnh tn mnh cho n. Ch k c tnh ton da trn kha ring v c nhng vo assembly, v gi y bn c th phn phi assembly. Khi hon vic k mt assembly, bn ch cn truy xut kha cng khai ca cp kha tn mnh. Khng c nguy c bo mt no t vic phn phi kha cng khai, v signing authority phi phn phi kha cng khai n mi thnh vin ca nhm pht trin. trch xut kha cng khai t file MyKeys.snk v ghi n vo file MyPublicKey.snk, s dng lnh sn -p MyKeys.snk MyPublicKey.snk. Nu bn lu tr cp kha tn mnh trong mt kho cha kha CSP c tn l MyKeys, s dng lnh sn -pc MyKeys MyPublicKey.snk trch xut kha cng khai ra ri lu tr n vo file MyPublicKey.snk. V d di y p dng cc c tnh c tho lun trong mc 1.9 khai bo phin bn, bn a, v ni cha kha cng khai. ng thi p dng c tnh AssemblyDelaySign(true) cho assembly bo cho trnh bin dch bit bn mun tr hon vic k assembly.
using System; using System.Reflection; [assembly:AssemblyKeyFile("MyPublicKey.snk")] [assembly:AssemblyCulture("")] [assembly:AssemblyVersion("1.0.0.0")]

51 Chng 1: Pht trin ng dng [assembly:AssemblyDelaySign(true)] public class HelloWorld { public static void Main() { Console.WriteLine("Hello, world"); } }

Khi c np mt assembly b hon k, b thc thi s nhn ra assembly ny c tn mnh v c xc minh assembly (nh c tho lun trong mc 1.10). Nhng v khng c ch k s nn bn phi v hiu chc nng xc minh ny bng lnh sn -Vr HelloWorld.exe. Khi qu trnh pht trin hon tt, bn cn k li assembly hon thnh tn mnh cho assembly. Cng c Strong Name cho php thc hin iu ny m khng cn thay i m ngun hoc bin dch li assembly, tuy nhin, bn phi c quyn truy xut kha ring ca cp kha tn mnh. k li assembly c tn l HelloWorld.exe vi cp kha nm trong file MyKeys.snk, s dng lnh sn -R HelloWorld.exe MyKeys.snk. Nu cp kha c lu tr trong mt kho cha kha CSP c tn l MyKeys, s dng lnh sn -Rc HelloWorld.exe MyKeys. Sau khi k li assembly, bn phi m chc nng xc minh tn mnh cho assembly bng i s -Vu ca cng c Strong Name, v d sn -Vu HelloWorld.exe. kch hot li vic xc minh tn mnh cho tt c cc assembly b bn v hiu trc , s dng lnh sn Vx. S dng lnh sn -Vl xem danh sch cc assembly b v hiu chc nng ny.

Khi s dng assembly k sau, bn nn so snh cc ln xy dng khc nhau ca assembly bo m chng ch khc nhau ch k. iu ny ch c th thc hin c nu assembly c k li bng i s -R ca cng c Strong Name. S dng lnh sn -D assembly1 assembly2 so snh hai assembly.

Hnh 1.3 Tm hon vic k assembly

52 Chng 1: Pht trin ng dng

Hnh 1.4 K li assembly

12.

K assembly vi ch k s Authenticode
Bn cn k mt assembly bng Authenticode ngi dng bit bn chnh l ngi pht hnh (publisher) v assembly khng b sa i sau khi k. S dng cng c File Signing (signcode.exe) k assembly vi Software Publisher Certificate (SPC) ca bn.

Tn mnh cung cp mt nh danh duy nht cng nh chng minh tnh ton vn ca mt assembly, nhng n khng xc minh ai l ngi pht hnh assembly ny. Do , .NET Framework cung cp k thut Authenticode k assembly. iu ny cho php ngi dng bit bn l ngi pht hnh v xc nhn tnh ton vn ca assembly. Ch k Authenticode cn c s dng lm chng c (evidence) cho assembly khi cu hnh chnh sch bo mt truy xut m lnh (Code Access Security Policyxem mc 13.9 v 13.10). k mt assembly vi ch k Authenticode, bn cn mt SPC do mt Certificate Authority ( CA) cp. CA c trao quyn cp SPC (cng vi nhiu kiu chng ch khc) cho cc c nhn hoc cng ty s dng. Trc khi cp mt chng ch, CA c trch nhim xc nhn nhng ngi yu cu v bo m h k kt khng s dng sai cc chng ch do CA cp. c c mt SPC, bn nn xem Microsoft Root Certificate Program Members ti [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsecure/html/rootcertprog.asp]. y, bn c th tm thy danh sch cc CA, nhiu CA trong s c th cp cho bn mt SPC. Vi mc ch th nghim, bn c th to mt SPC th nghim theo qu trnh s c m t trong mc 1.13. Tuy nhin, bn khng th phn phi phn mm c k vi chng ch th nghim ny. V mt SPC th nghim khng do mt CA ng tin cy cp, nn hu ht ngi dng s khng tin tng assembly c k bng SPC th nghim ny. Khi c mt SPC, s dng cng c File Signing k assembly ca bn. Cng c File Signing s dng kha ring ca SPC to mt ch k s v nhng ch k ny cng phn

53 Chng 1: Pht trin ng dng

cng khai ca SPC vo assembly (bao gm kha cng khai). Khi xc minh mt assembly, ngi dng s dng kha cng khai gii mt ha m bm -c-mt-ha, tnh ton li m bm ca assembly, v so snh hai m bm ny bo m chng l nh nhau. Khi hai m bm ny trng nhau, ngi dng c th chc chn rng bn k assembly, v n khng b thay i t khi bn k. V d, k mt assembly c tn l MyAssembly.exe vi mt SPC nm trong file MyCert.spc v kha ring nm trong file MyPrivateKey.pvk, s dng lnh:
signcode -spc MyCert.spc -v MyPrivateKey.pvk MyAssembly.exe

Trong v d ny, cng c File Signing s hin th mt hp thoi nh hnh 1.5, yu cu bn nhp mt khu (c s dng bo v kha ring trong file MyPrivateKey.pvk).

Hnh 1.5 Cng c File Signing yu cu nhp mt khu khi truy xut file cha kha ring

Bn cng c th truy xut kha v chng ch trong cc kho cha. Bng 1.2 lit k cc i s thng dng nht ca cng c File Signing. Bn hy tham kho ti liu .NET Framework SDK xem tt c cc i s.
Bng 1.2 Cc i s thng dng ca cng c File Signing i s -k -s -spc -v M t

Ch nh tn ca kho cha kha ring SPC Ch nh tn ca kho cha SPC Ch nh tn file cha SPC Ch nh tn file cha kha ring SPC

k mt assembly gm nhiu file, bn cn ch nh tn file cha assembly manifest. Nu mun s dng c tn mnh v Authenticode cho assembly, bn phi to tn mnh cho assembly trc (xem cch to tn mnh cho assembly trong mc 1.9). kim tra tnh hp l ca mt file c k vi ch k Authenticode, s dng cng c Certificate Verification (chktrust.exe). V d, s dng lnh chktrust MyAssembly.exe kim tra file MyAssembly.exe. Nu cha cu hnh cho h thng n tin tng SPC dng k assembly, bn s thy hp thoi tng t nh hnh 1.6, hin th thng tin v ngi pht hnh v cho bn chn l c tin tng ngi pht hnh hay khng (chng ch trong hnh 1.6 l mt chng ch th nghim c to theo qu trnh c m t trong mc 1.13).

54 Chng 1: Pht trin ng dng

Nu bn nhp Yes, hoc trc chn l lun tin tng SPC, cng c Certificate Verification xc nhn tnh hp l ca ch k v assembly.

Hnh 1.6 Cng c Certificate Verification

13.

To v thit lp tin tng mt SPC th nghim


Bn cn to mt SPC th nghim. S dng cng c Certificate Creation (makecert.exe) to mt chng ch X.509 v s dng cng c Software Publisher Certificate (cert2spc.exe) to mt SPC t chng ch X.509 ny. Thit lp tin tng chng ch th nghim bng cng c Set Registry (setreg.exe).

to mt SPC th nghim cho mt nh pht hnh phn mm c tn l Square Nguyen, trc ht s dng cng c Certificate Creation to mt chng ch X.509. Lnh:
makecert -n "CN=Square Nguyen" -sk MyKeys TestCertificate.cer

s to mt file c tn l TestCertificate.cer cha mt chng ch X.509, v lu tr kha ring tng ng trong mt kho cha kha CSP c tn l MyKeys (c to t ng nu cha tn ti). Bn cng c th ghi kha ring vo file bng cch thay -sk bng -sv. V d, ghi kha ring vo mt file c tn l PrivateKeys.pvk, s dng lnh:
makecert -n "CN=Square Nguyen" -sv PrivateKey.pvk TestCertificate.cer

55 Chng 1: Pht trin ng dng

Hnh 1.7 Cng c Certificate Creation nhc nhp mt khu bo v file cha kha ring

Nu bn ghi kha ring vo file, cng c Certificate Creation s nhc bn nhp mt khu bo v file ny (xem hnh 1.7). Cng c Certificate Creation h tr nhiu i s, bng 1.3 lit k mt vi i s thng dng. Xem thm ti liu .NET Framework SDK v cng c Certificate Creation.
Bng 1.3 Cc i s thng dng ca cng c Certificate Creation i s -e -m M t

Ch nh ngy chng ch khng cn hiu lc. Ch nh khong thi gian (tnh bng thng) m chng ch cn hiu lc. Ch nh mt tn X.500 tng ng vi chng ch. y l tn ca ngi pht hnh phn mm m ngi dng thy khi h xem chi tit ca SPC to ra. Ch nh tn CSP gi kha ring. Ch nh tn kho chng ch (cng c Certificate Creation s lu chng ch X.509 trong ). Ch nh tn file gi kha ring.

-n

-sk -ss -sv

Khi to mt chng ch X.509 bng cng c Certificate Creation, cn chuyn chng ch ny thnh mt SPC bng cng c Software Publisher Certificate Test (cert2spc.exe). chuyn TestCertificate.cer thnh mt SPC, s dng lnh:
cert2spc TestCertificate.cer TestCertificate.spc

Cng c Software Publisher Certificate Test khng c i s ty chn no. Bc cui cng s dng SPC th nghim l thit lp tin tng CA th nghim gc (root test CA); y l ngi pht hnh mc nh cc chng ch th nghim. Bc ny ch cn lnh setreg 1 true ca cng c Set Registry (setreg.exe). Khi kt thc th nghim SPC, b thit lp tin tng i vi CA th nghim bng lnh setreg 1 false. By gi, bn c th s dng SPC th nghim k assembly vi Authenticode nh qu trnh m t mc 1.12.

56 Chng 1: Pht trin ng dng

14.

Qun l Global Assembly Cache


Bn cn thm hoc loi b assembly t Global Assembly Cache (GAC). S dng cng c Global Assembly Cache (gacutil.exe) t dng lnh xem ni dung ca GAC, cng nh thm hoc loi b assembly.

Trc khi c ci t vo GAC, assembly phi c tn mnh (xem mc 1.9 v cch to tn mnh cho assembly). ci t assembly c tn l SomeAssembly.dll vo GAC, s dng lnh gacutil /i SomeAssembly.dll. loi b SomeAssembly.dll ra khi GAC, s dng lnh gacutil /u SomeAssembly. Ch khng s dng phn m rng .dll ni n assembly mt khi n c ci t vo GAC. xem cc assembly c ci t vo GAC, s dng lnh gacutil /l. Lnh ny s lit k tt c cc assembly c ci t trong GAC, cng nh danh sch cc assembly c bin dch trc sang dng nh phn v ci t trong NGEN cache. S dng lnh gacutil /l SomeAssembly trnh phi tm ht danh sch xem mt assembly c ci t cha.

.NET Framework s dng GAC ch khi thc thi, trnh bin dch C# s khng tm trong GAC bt k tham chiu ngoi no m assembly ca bn tham chiu n. Trong qu trnh pht trin, trnh bin dch C# phi truy xut c mt bn sao cc b ca bt k assembly chia s no c tham chiu n. Bn c th chp assembly chia s vo th mc m ngun ca bn, hoc s dng i s /lib ca trnh bin dch C# ch nh th mc m trnh bin dch c th tm thy cc assembly cn thit trong .

15.

Ngn ngi khc dch ngc m ngun ca bn


Bn mun bo m assembly .NET ca bn khng b dch ngc. Xy dng cc gii php da-trn-server nu c th ngi dng khng truy xut assembly c. Nu bn phi phn phi assembly th khng c cch no ngn ngi dng dch ngc chng. Cch tt nht c th lm l s dng k thut obfuscation v cc thnh phn c bin dch thnh m lnh nguyn sinh (native code) assembly kh b dch ngc hn.

V assembly .NET bao gm mt tp cc m lnh v siu d liu c chun ha, c lp nn tng m t cc kiu nm trong assembly, nn chng tng i d b dch ngc. iu ny cho php cc trnh dch ngc d dng to c m ngun rt ging vi m gc, y s l vn kh gii quyt nu m ca bn c cha cc thng tin hoc thut ton cn gi b mt. Cch duy nht m bo ngi dng khng th dch ngc assembly l khng cho h ly c assembly. Nu c th, hin thc cc gii php da-trn-server nh cc ng dng Microsoft ASP.NET v dch v Web XML. Vi mt chnh sch bo mt tt server, khng ai c th truy xut assembly, do khng th dch ngc chng.

57 Chng 1: Pht trin ng dng

Nu vic xy dng cc gii php da-trn-server l khng ph hp, bn c hai ty chn sau y: S dng mt obfuscator khin cho assembly ca bn kh b dch ngc (Visual Studio .NET 2003 c cha phin bn Community ca mt obfuscator, c tn l Dotfuscator). Obfuscator s dng nhiu k thut khc nhau khin cho assembly kh b dch ngc; nguyn l ca cc k thut ny l: i tn cc trng v cc phng thc private nhm gy kh khn cho vic c v hiu mc ch ca m lnh. Chn cc lnh dng iu khin khin cho ngi khc kh c th ln theo logic ca ng dng.

Chuyn nhng phn ca ng dng m bn mun gi b mt thnh cc i tng COM hay cc DLL nguyn sinh, sau s dng P/Invoke hoc COM Interop gi chng t ng dng c-qun-l ca bn (xem chng 15 v cch gi m lnh khng-cqun-l).

Khng c cch tip cn no ngn c nhng ngi c k nng v quyt tm dch ngc m ngun ca bn, nhng chng s lm cho cng vic ny tr nn kh khn ng k v ngn c hu ht nhng k t m thng thng. Nguy c mt ng dng b dch ngc khng ch ring cho C# hay .NET. Mt ngi quyt tm c th dch ngc bt k phn mm no nu anh ta c k nng v thi gian.

58 Chng 1: Pht trin ng dng

59

Chng 2:THAO TC D LIU

60

61 Chng 2: Thao tc d liu

H
1.

u ht cc ng dng u cn thao tc trn mt loi d liu no . Microsoft .NET Framework cung cp nhiu k thut n gin ha hay nng cao hiu qu cc thao tc d liu thng dng. Chng ny s cp cc k thut sau:

Thao tc chui mt cch hiu qu (mc 2.1). M t cc kiu d liu c s bng cc kiu m ha khc nhau (mc 2.2, 2.3, v 2.4). S dng biu thc chnh quy xc nhn tnh hp l v thao tc chui (mc 2.5 v
2.6).

Lm vic vi ngy v gi (mc 2.7 v 2.8). Lm vic vi mng v tp hp (mc 2.9, 2.10, v 2.11). Tun t ha trng thi i tng v lu n vo file (mc 2.12).

Thao tc chui mt cch hiu qu


Bn cn thao tc trn ni dung ca mt i tng String v trnh chi ph ca vic t ng to cc i tng String mi do tnh khng i ca i tng String. S dng lp System.Text.StringBuilder thc hin cc thao tc, sau chuyn kt qu thnh String bng phng thc StringBuilder.ToString.

Cc i tng String trong .NET l khng i, ngha l mt khi c to th chng khng th b thay i. V d, nu bn to mt String bng cch ni mt s k t hoc chui, th khi thm mt phn t mi vo cui String hin c, b thc thi s to ra mt String mi cha kt qu (ch khng phi String c b thay i). Do s ny sinh chi ph ng k nu ng dng ca bn thng xuyn thao tc trn String. Lp StringBuilder khc phc vn ny bng cch cung cp mt b m k t, v cho php thao tc trn ni dung ca n m b thc thi khng phi to i tng mi cha kt qu sau mi ln thay i. Bn c th to mt i tng StringBuilder rng hoc c khi to l ni dung ca mt String hin c. Sau , thao tc trn ni dung ca StringBuilder ny bng cc phng thc np chng (cho php bn chn, thm dng chui ca cc kiu d liu khc nhau). Cui cng, gi StringBuilder.ToString chuyn ni dung hin ti ca StringBuilder thnh mt String. Khi bn thm d liu mi vo chui, c hai thuc tnh quan trng nh hng n hot ng ca StringBuilder l Capacity v Length. Capacity m t kch thc ca b m StringBuilder, cn Length m t kch thc ca chui k t trong b m. Nu vic thm d liu mi vo StringBuilder lm kch thc chui (Length) vt qu kch thc b m (Capacity) th StringBuilder s cp pht b m mi cha chui. Nu thiu cn thn, vic cp pht b m ny c th ph nh li ch ca vic s dng StringBuilder. Do , nu bit chnh xc kch thc ca chui, hoc bit kch thc ti a ca chui, bn c th trnh vic cp pht b m qu mc cn thit bng cch thit lp thuc tnh Capacity hoc ch nh kch thc b m lc to StringBuilder. Khi thit lp cc thuc tnh Capacity v Length, cn ch cc im sau:

62 Chng 2: Thao tc d liu

Nu bn thit lp gi tr Capacity nh hn gi tr Length, thuc tnh Capacity s nm ngoi l System.ArgumentOutOfRangeException. Nu bn thit lp gi tr Length nh hn kch thc ca chui hin c trong b m, chui s b ct bt phn ln hn. Nu bn thit lp gi tr Length ln hn kch thc ca chui, b m s c "lp" thm cc khong trng cho bng vi Length. Vic thit lp gi tr Length ln hn gi tr Capacity s t ng iu chnh Capacity cho bng vi Length.

Phng thc ReverseString di y minh ha cch s dng lp StringBuilder o mt chui. Nu khng s dng lp StringBuilder thc hin thao tc ny th s tn chi ph ng k, c bit khi chui ngun di. Vic khi to StringBuilder vi kch thc bng chui ngun bo m khng cn phi cp pht li b m trong qu trnh o chui.
public static string ReverseString(string str) { // Kim tra cc trng hp khng cn o chui. if (str == null || str.Length == 1) { return str; } // To mt StringBuilder vi sc cha cn thit. System.Text.StringBuilder revStr = new System.Text.StringBuilder(str.Length); // Duyt ngc chui ngun tng k t mt // v thm tng k t c c vo StringBuilder. for (int count = str.Length-1; count > -1; count--) { revStr.Append(str[count]); } // Tr v chui c o. return revStr.ToString(); }

2.

M ha chui bng cc kiu m ha k t


Bn cn trao i d liu dng k t vi cc h thng s dng kiu m ha khc vi UTF-16 (kiu m ha ny c s dng bi CRL).

63 Chng 2: Thao tc d liu

S dng lp System.Text.Encoding v cc lp con ca n chuyn i k t gia cc kiu m ha khc nhau.

Unicode khng phi l kiu m ha duy nht, cng nh UTF-16 khng phi cch duy nht biu din k t Unicode. Khi ng dng cn trao i d liu k t vi cc h thng bn ngoi (c bit l cc h thng c), d liu cn phi c chuyn i gia UTF-16 v kiu m ha m h thng h tr. Lp tru tng Encoding, v cc lp con ca n cung cp cc chc nng chuyn k t qua li gia nhiu kiu m ha khc nhau. Mi th hin ca lp con h tr vic chuyn i gia UTF-16 v mt kiu m ha khc. Phng thc tnh Encoding.GetEncoding nhn vo tn hoc s hiu trang m (code page number) ca mt kiu m ha v tr v th hin ca lp m ha tng ng. Bng 2.1 lit k mt vi kiu m k t v s hiu trang m m bn phi truyn cho phng thc GetEncoding to ra th hin ca lp m ha tng ng. Bng ny cng cung cp cc thuc tnh tnh ca lp Encoding i din cho phng thc GetEncoding tng ng.
Bng 2.1 Cc lp m ha k t Kiu m ha Lp ASCIIEncoding Encoding UTF7Encoding UTF8Encoding UnicodeEncoding UnicodeEncoding Encoding S dng GetEncoding(20127)

ASCII Mc nh (kiu m ha hin hnh trn h thng) UTF-7 UTF-8 UTF-16 (Big Endian) UTF-16 (Little Endian) Windows OS

hay thuc tnh ASCII


GetEncoding(0)

hay thuc tnh Default


GetEncoding(65000)

hay thuc tnh UTF7


GetEncoding(65001)

hay thuc tnh UTF8


GetEncoding(1201)

hay thuc tnh BigEndianUnicode


GetEncoding(1200)

hay thuc tnh Unicode


GetEncoding(1252)

Sau khi ly c i tng lp Encoding h tr kiu m ha thch hp, s dng phng thc GetBytes chuyn chui ngun (c m ha theo UTF-16) thnh mng kiu byte cha cc k t c m ha theo kiu cn chuyn, v s dng GetString chuyn mng byte thnh chui ch. V d di y trnh by cch s dng mt vi lp m ha:
using System; using System.IO; using System.Text;

public class CharacterEncodingExample {

64 Chng 2: Thao tc d liu

public static void Main() {

// To file gi cc kt qu. using (StreamWriter output = new StreamWriter("output.txt")) {

// To v ghi ra file mt chui cha k hiu ca s PI. string srcString = "Area = \u03A0r^2"; output.WriteLine("Source Text : " + srcString);

// Ghi cc byte c m ha theo UTF-16 // ca chui ngun ra file. byte[] utf16String = Encoding.Unicode.GetBytes(srcString); output.WriteLine("UTF-16 Bytes: {0}", BitConverter.ToString(utf16String));

// Chuyn chui ngun c m ha theo UTF-16 // thnh UTF-8 v ASCII byte[] utf8String = Encoding.UTF8.GetBytes(srcString); byte[] asciiString = Encoding.ASCII.GetBytes(srcString);

// Ghi mng cc byte c m ha theo UTF-8 v ASCII ra file. output.WriteLine("UTF-8 Bytes: {0}",

BitConverter.ToString(utf8String)); output.WriteLine("ASCII Bytes: {0}",

BitConverter.ToString(asciiString));

// Chuyn cc byte c m ha theo UTF-8 v ASCII // thnh chui c m ha theo UTF-16 v ghi ra file. output.WriteLine("UTF-8 Text : {0}",

Encoding.UTF8.GetString(utf8String)); output.WriteLine("ASCII Text : {0}",

Encoding.ASCII.GetString(asciiString));

// Ghi d liu xung file v ng file. output.Flush();

65 Chng 2: Thao tc d liu output.Close(); } } }

Chy CharacterEncodingExample s to ra file output.txt. M file ny trong mt trnh son tho c h tr Unicode, bn s thy kt qu nh sau:
Source Text : Area = r^2 UTF-16 Bytes: 41-00-72-00-65-00-61-00-20-00-3D-00-20-00-A0-03-72-00-5E-00-32-00 UTF-8 ASCII UTF-8 ASCII Bytes: 41-72-65-61-20-3D-20-CE-A0-72-5E-32 Bytes: 41-72-65-61-20-3D-20-3F-72-5E-32 Text : Area = r^2 Text : Area = ?r^2

Ch rng, nu s dng UTF-16 th mi k t c m ha bi 2 byte, nhng v hu ht cc k t u l k t chun nn byte cao l 0 (nu s dng little-endian th byte thp vit trc). Do , hu ht cc k t u c m ha bi nhng s ging nhau trong ba kiu m ha, ngoi tr k hiu PI c m ha khc (c in m trong kt qu trn). m ha PI cn 2 byte, i hi ny c UTF-8 h tr nn th hin c , trong khi ASCII ch s dng mt byte nn thay PI bng m 3F, y l m ca du hi (?).

Nu chuyn cc k t Unicode sang ASCII hoc mt kiu m ha khc th c th mt d liu. Bt k k t Unicode no c m k t khng biu din c trong kiu m ha ch s b b qua khi chuyn i.

Lp Encoding cng cung cp phng thc tnh Covert n gin ha vic chuyn mt mng byte t kiu m ha ny sang kiu m ha khc khng phi qua trung gian UTF-16. V d, dng m sau chuyn trc tip cc byte trong mng asciiString t ASCII sang UTF-8:
byte[] utf8String = Encoding.Convert(Encoding.ASCII, Encoding.UTF8, asciiString);

3.

Chuyn cc kiu gi tr c bn thnh mng kiu byte


Bn cn chuyn cc kiu gi tr c bn thnh mng kiu byte. Lp System.BitConverter cung cp cc phng thc tnh rt tin li cho vic chuyn i qua li gia cc mng kiu byte v hu ht cc kiu gi tr c bn tr kiu decimal. chuyn mt gi tr kiu decimal sang mng kiu byte, bn cn s dng i tng System.IO.BinaryWriter ghi gi tr vo mt th hin System.IO.MemoryStream, sau gi phng thc Memorystream.ToArray. c mt gi tr decimal t mt mng kiu byte, bn cn to mt i tng MemoryStream t mng kiu byte, sau s dng th hin System.IO.BinaryReader c gi tr ny t MemoryStream.

66 Chng 2: Thao tc d liu

Phng thc tnh GetBytes ca lp BitConverter cung cp nhiu phin bn np chng cho php chuyn hu ht cc kiu gi tr c bn sang mng kiu byte. Cc kiu c h tr l bool, char, double, short, int, long, float, ushort, uint, v ulong. Lp BitConverter cng cung cp cc phng thc tnh cho php chuyn cc mng kiu byte thnh cc kiu gi tr chun nh ToBoolean, ToUInt32, ToDouble,... V d sau minh ha cch chuyn cc gi tr bool v int thnh mng kiu byte, v ngc li. i s th hai trong ToBoolean v ToUInt32 cho bit v tr (tnh t 0) trong mng byte m BitConverter s ly cc byte k t to gi tr d liu.
byte[] b = null;

// Chuyn mt gi tr bool thnh mng kiu byte v hin th. b = BitConverter.GetBytes(true); Console.WriteLine(BitConverter.ToString(b));

// Chuyn mt mng kiu byte thnh gi tr bool v hin th. Console.WriteLine(BitConverter.ToBoolean(b,0));

// Chuyn mt gi tr int thnh mng kiu byte v hin th. b = BitConverter.GetBytes(3678); Console.WriteLine(BitConverter.ToString(b));

// Chuyn mt mng kiu byte thnh gi tr int v hin th. Console.WriteLine(BitConverter.ToInt32(b,0));

i vi kiu decimal, lp BitConverter khng h tr, nn bn phi s dng thm MemoryStream v BinaryWriter.
// To mng kiu byte t gi tr decimal. public static byte[] DecimalToByteArray (decimal src) {

// To mt MemoryStream lm b m cha d liu nh phn. using (MemoryStream stream = new MemoryStream()) {

// To mt BinaryWriter ghi d liu nh phn vo stream. using (BinaryWriter writer = new BinaryWriter(stream)) {

// Ghi gi tr decimal vo BinaryWriter/MemoryStream. writer.Write(src);

67 Chng 2: Thao tc d liu

// Tr v mng kiu byte. return stream.ToArray(); } } }

chuyn mt mng kiu byte thnh mt gi tr decimal, s dng BinaryReader c t MemoryStream.


// To gi tr decimal t mng kiu byte. public static decimal ByteArrayToDecimal (byte[] src) {

// To mt MemoryStream cha mng. using (MemoryStream stream = new MemoryStream(src)) {

// To mt BinaryReader c t stream. using (BinaryReader reader = new BinaryReader(stream)) {

// c v tr v gi tr decimal t // BinaryReader/MemoryStream. return reader.ReadDecimal(); } } }

Lp BitConverter cng cung cp phng thc ToString to mt String cha gi tr mng. Gi ToString v truyn i s l mt mng byte s tr v mt String cha gi tr thp lc phn ca cc byte trong mng, cc gi tr ny cch nhau bi du gch ni, v d 34-A7-2C. Tuy nhin, khng c phng thc no to mt mng kiu byte t mt chui theo nh dng ny.

4.

M ha d liu nh phn thnh vn bn


Bn cn chuyn d liu nh phn sang mt dng sao cho c th c lu tr trong mt file vn bn ASCII (chng hn file XML), hoc c gi i trong email. S dng cc phng thc tnh ToBase64String v FromBase64String ca lp System.Converter chuyn i qua li gia d liu nh phn v chui c m ha theo Base64.

68 Chng 2: Thao tc d liu

Base64 l mt kiu m ha cho php bn m t d liu nh phn nh mt dy cc k t ASCII n c th c chn vo mt file vn bn hoc mt e-mail, m d liu nh phn khng c cho php. Base64 lm vic trn nguyn tc s dng 4 byte cha 3 byte d liu ngun v m bo mi byte ch s dng 7 bit thp cha d liu. iu ny c ngha l mi byte d liu c m ha theo Base64 c dng ging nh mt k t ASCII, nn c th c lu tr hoc truyn i bt c ni u cho php k t ASCII. Lp Convert cung cp hai phng thc ToBase64String v FromBase64String m ha v gii m Base64. Tuy nhin, trc khi m ha Base64, bn phi chuyn d liu thnh mng kiu byte; v sau khi gii m, bn phi chuyn mng kiu byte tr v kiu d liu thch hp (xem li mc 2.2 v 2.3). V d sau minh ha cch s dng lp Convert m ha v gii m Base64 vi chui Unicode, gi tr int, gi tr decimal. i vi gi tr decimal, bn phi s dng li cc phng thc ByteArrayToDecimal v DecimalToByteArray trong mc 2.3.
// M ha Base64 vi chui Unicode. public static string StringToBase64 (string src) {

// Chuyn chui thnh mng kiu byte. byte[] b = Encoding.Unicode.GetBytes(src);

// Tr v chui c m ha theo Base64. return Convert.ToBase64String(b); }

// Gii m mt chui Unicode c m ha theo Base64. public static string Base64ToString (string src) {

// Gii m vo mng kiu byte. byte[] b = Convert.FromBase64String(src);

// Tr v chui Unicode. return Encoding.Unicode.GetString(b); }

// M ha Base64 vi gi tr decimal. public static string DecimalToBase64 (decimal src) {

// Chuyn gi tr decimal thnh mng kiu byte.

69 Chng 2: Thao tc d liu byte[] b = DecimalToByteArray(src);

// Tr v gi tr decimal c m ha theo Base64. return Convert.ToBase64String(b); }

// Gii m mt gi tr decimal c m ha theo Base64. public static decimal Base64ToDecimal (string src) {

// Gii m vo mng kiu byte. byte[] b = Convert.FromBase64String(src);

// Tr v gi tr decimal. return ByteArrayToDecimal(b); }

// M ha Base64 vi gi tr int. public static string IntToBase64 (int src) {

// Chuyn gi tr int thnh mng kiu byte. byte[] b = BitConverter.GetBytes(src); // Tr v gi tr int c m ha theo Base64. return Convert.ToBase64String(b); } // Gii m mt gi tr int c m ha theo Base64. public static int Base64ToInt (string src) { // Gii m vo mng kiu byte. byte[] b = Convert.FromBase64String(src); // Tr v gi tr int. return BitConverter.ToInt32(b,0); }

70 Chng 2: Thao tc d liu

5.

S dng biu thc chnh quy kim tra d liu nhp


Bn cn kim tra d liu nhp vo c ng vi cu trc v ni dung c quy nh trc hay khng. V d, bn mun bo m ngi dng nhp a ch IP, s in thoi, hay a ch e-mail hp l. S dng biu thc chnh quy bo m d liu nhp ng cu trc v ch cha cc k t c quy nh trc i vi tng dng thng tin.

Khi ng dng nhn d liu t ngi dng hoc c d liu t file, bn nn gi nh d liu ny l cha chnh xc v cn c kim tra li. Mt nhu cu kim tra kh ph bin l xc nh cc s in thoi, s th tn dng, a ch e-mail c ng dng hay khng. Vic kim tra cu trc v ni dung ca d liu khng m bo d liu l chnh xc nhng gip loi b nhiu d liu sai v n gin ha vic kim tra sau ny. Biu thc chnh quy (regular expression) cung cp mt c ch rt tt kim tra mt chui c ng vi cu trc quy nh trc hay khng, do bn c th li dng tnh nng ny cho mc ch kim tra d liu nhp. Trc tin, bn phi xc nh c php ca biu thc chnh quy cho ph hp vi cu trc v ni dung ca d liu cn kim tra, y l phn kh nht khi s dng biu thc chnh quy. Biu thc chnh quy c xy dng trn hai yu t: trc kin (literal) v siu k t (metacharacter). Trc kin m t cc k t c th xut hin trong mu m bn mun so trng; siu k t h tr vic so trng cc k t i din (wildcard), tm tr, nhm, lp, iu kin, v cc c ch iu khin khc. y khng tho lun y v c php biu thc chnh quy (tham kho ti liu .NET SDK hiu thm v biu thc chnh quy), nhng bng 2.2 s m t cc siu k t thng dng.
Bng 2.2 Cc siu k t thng dng Siu k t . \d \D \s \S \w \W ^ \A $ \z M t

Mi k t tr k t xung dng (\n). K t ch s thp phn (digit). K t khng phi ch s (non-digit). K t whitespace (nh khong trng, tab...). K t non-whitespace. K t word (gm mu t, ch s, v du gch di). K t non-word. Bt u mt chui hoc dng. Bt u mt chui. Kt thc mt chui hoc dng. Kt thc mt chui.

71 Chng 2: Thao tc d liu

| [abc] [^abc] [a-z] ( ) ? * + {n} {n,} {n, m}

Ngn cch cc biu thc c th so trng, v d AAA|ABA|ABB s so trng vi AAA, ABA, hoc ABB (cc biu thc c so trng t tri sang). So trng vi mt trong cc k t trong nhm, v d [AbC] s so trng vi A, b, hoc C. So trng vi bt c k t no khng thuc cc k t trong nhm, v d [^AbC] s khng so trng vi A, b, or C nhng so trng vi B, F, So trng vi bt k k t no thuc khong ny, v d [A-C] s so trng vi A, B, hoc C. Xc nh mt biu thc con sao cho n c xem nh mt yu t n l i vi cc yu t c trnh by trong bng ny. Xc nh c mt hoc khng c k t hoc biu thc con ng trc n, v d A?B so trng vi B, AB, nhng khng so trng vi AAB. Xc nh khng c hoc c nhiu k t hoc biu thc con ng trc n, v d A*B so trng vi B, AB, AAB, AAAB, Xc nh c mt hoc c nhiu k t hoc biu thc con ng trc n, v d A+B so trng vi AB, AAB, AAAB, nhng khng so trng vi B. Xc nh c ng n k t hoc biu thc con ng trc n, v d A{2} ch so trng vi AA. Xc nh c t nht n k t hoc biu thc con ng trc n, v d A{2,} so trng vi AA, AAA, AAAA, nhng khng so trng vi A. Xc nh c t n n m k t ng trc n, v d A{2,4} so trng vi AA, AAA, v AAAA nhng khng so trng vi A hoc AAAAA.

Khi d liu cn kim tra cng phc tp th c php ca biu thc chnh quy cng cng phc tp. V d, d dng kim tra d liu nhp ch cha s hay c chiu di ti thiu, nhng kim tra mt URL kh phc tp. Bng 2.3 lit k mt s biu thc chnh quy dng kim tra cc kiu d liu thng dng.
Bng 2.3 Mt s biu thc chnh quy thng dng Kiu d liu nhp M t Biu thc chnh quy ^\d+$ ^\d{4}$ ^\w{6,8}$

S PIN Mt khu n gin

Ch cha cc ch s thp phn; v d 5, hoc 5683874674. Cha 4 ch s thp phn, v d 1234. Cha t 6 n 8 k t; v d ghtd6f hoc b8c7hogh. Cha d liu ph hp vi cu trc ca hu ht cc loi s th tn dng, v d 4921835221552042 hoc 49218352-2155-2042.

S th tn dng

^\d{4}-?\d{4}-?\d{4}- ? \d{4}$

72 Chng 2: Thao tc d liu

[\w-]+ ngha l cha mt

a ch e-mail

hoc nhiu k t word hoc du gch ngang, v d


some-body@adatum.com

^[\w-]+@([\w- ] +\.)+[\w-]+$

HTTP hoc HTTPS URL

D liu l mt URL da-trn-HTTP hay da-trn-HTTPS, v d


http://www.microsoft.com

^https?://([\w- ] +\.)+[\w-]+(/[\w- ./ ? %=]*)?$

Mt khi bit c php ca biu thc chnh quy, bn to mt i tng System.Text.RegularExpression.Regex bng cch truyn cho phng thc khi dng ca n chui cha biu thc chnh quy. Sau , gi phng thc IsMatch ca i tng Regex v truyn chui cn kim tra, phng thc ny tr v mt gi tr lun l cho bit chui c hp l khng. C php ca biu thc chnh quy s ch nh Regex so trng ton b chui hay ch so trng mt phn ca chui (xem ^, \A, $, v \z trong bng 2.2) Phng thc ValidateInput di y minh ha cch kim tra chui nhp bng biu thc chnh quy:
public static bool ValidateInput(string regex, string input) {

// To i tng Regex da trn biu thc chnh quy. Regex r = new Regex(regex);

// Kim tra d liu nhp c trng vi biu thc chnh quy hay khng. return r.IsMatch(input); }

Bn c th s dng i tng Regex kim tra nhiu chui, nhng khng th thay i biu thc chnh quy c gn cho n; bn phi to mt i tng Regex mi tng ng vi mt cu trc mi. Phng thc ValidateInput trn to ra mt i tng Regex mi mi ln c gi, thay vo bn c th s dng phng thc tnh np chng IsMatch.
public static bool ValidateInput(string regex, string input) {

// Kim tra d liu nhp c trng vi biu thc chnh quy hay khng. return Regex.IsMatch(input, regex); }

6.

S dng biu thc chnh quy c bin dch


Bn cn gim thiu cc tc ng ln hiu nng ca ng dng khi cc biu thc chnh quy phc tp c s dng thng xuyn.

73 Chng 2: Thao tc d liu

Khi khi to i tng System.Text.RegularExpressions.Regex, hy truyn thm ty chn Compiled thuc kiu lit k System.Text.RegularExpressions. RegexOptions bin dch biu thc chnh quy thnh Microsoft Intermediate Language (MSIL).

Theo mc nh, khi bn to i tng Regex, mu biu thc chnh quy do bn xc nh trong phng thc khi dng c bin dch thnh mt dng trung gian (khng phi MSIL). Mi ln bn s dng i tng Regex, b thc thi phin dch dng trung gian ny v p dng n kim tra chui. Vi cc biu thc chnh quy phc tp c s dng thng xuyn, vic phin dch lp lp i li c th gy tc ng xu ln hiu nng ca ng dng. Khi ty chn RegexOptions.Compiled c ch nh, b thc thi s bin dch biu thc chnh quy thnh MSIL. MSIL ny c gi l m just-in-time (JIT), c bin dch thnh m my nguyn sinh trong ln thc thi u tin, ging nh m assembly thng thng. Biu thc chnh quy c bin dch cng c s dng ging nh i tng Regex, vic bin dch ch gip thc thi nhanh hn. Tuy nhin, vic bin dch biu thc chnh quy cng c vi nhc im. Trc tin, trnh bin dch JIT phi lm vic nhiu hn, dn n chm qu trnh bin dch, c bit khi to biu thc chnh quy c bin dch khi ng dng khi ng. Th hai, biu thc chnh quy c bin dch vn tn ti trong b nh khi khng cn c s dng na, n khng b b thu gom rc (Garbage Collector) xa i nh cc biu thc chnh quy thng thng. Vng nh b chim ch c gii phng khi chng trnh kt thc, hoc khi bn gii phng min ng dng. Dng m sau minh ha cch to mt i tng Regex c bin dch thnh MSIL:
Regex reg = new Regex(@"[\w-]+@([\w-]+\.)+[\w-]+", RegexOptions.Compiled);

Ngoi ra, phng thc tnh Regex.CompileToAssembly cho php bn to mt biu thc chnh quy c bin dch v ghi n vo mt assembly khc. Ngha l bn c th to mt assembly cha cc biu thc chnh quy s dng cho nhiu ng dng sau ny. bin dch mt biu thc chnh quy v lu n vo mt assembly, thc hin cc bc sau: 1. To mt mng System.Text.RegularExpressions.RegexCompilationInfo ln cha cc i tng RegexCompilationInfo, mi i tng ng vi mt biu thc chnh quy cn c bin dch. To mt i tng RegexCompilationInfo cho mi biu thc chnh quy v truyn i s cho phng thc khi dng xc nh cc thuc tnh ca biu thc chnh quy ny. Cc thuc tnh thng dng l:
IsPublic gi tr bool xc nh lp biu thc chnh quy c to ra c tm vc

2.

l cng khai hay khng.


Name mt String xc nh tn ca lp. Namespace mt String xc nh khng gian tn ca lp. Pattern mt String xc nh mu m biu thc chnh quy s so trng (xem chi

tit mc 2.5).
Options mt gi tr thuc kiu lit k System.Text.RegularExpressions. RegexOptions xc nh cc ty chn cho biu thc chnh quy.

74 Chng 2: Thao tc d liu

3. 4.

To mt i tng System.Reflection.AssemblyName xc nh tn ca assembly m phng thc Regex.CompileToAssembly s to ra. Gi phng thc


Regex.CompileToAssembly,

truyn

cc

mng

RegexCompilationInfo v i tng AssemblyName.

Qu trnh trn to ra mt assembly cha cc khai bo lp cho tng biu thc chnh quy c bin dch, mi lp dn xut t Regex. s dng mt biu thc chnh quy c bin dch trong assembly, bn cn to i tng biu thc chnh quy ny v gi cc phng thc ca n ging nh khi to n vi phng thc khi dng Regex bnh thng. Bn nh thm tham chiu ti assembly khi s dng cc lp biu thc chnh quy nm trong n. on m sau minh ha cch to mt assembly c tn l MyRegex.dll, cha hai biu thc chnh quy c tn l PinRegex v CreditCardRegex:
using System.Text.RegularExpressions; using System.Reflection;

public class CompiledRegexExample {

public static void Main() {

// To mng cha cc i tng RegexCompilationInfo. RegexCompilationInfo[] regexInfo = new RegexCompilationInfo[2];

// To i tng RegexCompilationInfo cho PinRegex. regexInfo[0] = new RegexCompilationInfo(@"^\d{4}$", RegexOptions.Compiled, "PinRegex", "", true);

// To i tng RegexCompilationInfo cho CreditCardRegex. regexInfo[1] = new RegexCompilationInfo( @"^\d{4}-?\d{4}-?\d{4}-?\d{4}$", RegexOptions.Compiled, "CreditCardRegex", "", true);

// To i tng AssemblyName nh ngha assembly. AssemblyName assembly = new AssemblyName(); assembly.Name = "MyRegEx";

// To cc biu thc chnh quy c bin dch. Regex.CompileToAssembly(regexInfo, assembly);

75 Chng 2: Thao tc d liu } }

7.

To ngy v gi t chui
Bn cn to mt th hin System.DateTime m t gi, ngy c ch nh trong mt chui. S dng phng thc Parse hoc ParseExact ca lp DateTime.

C nhiu cch m t ngy, gi; v d 1st June 2004, 1/6/2004, 6/1/2004, 1-Jun-2004 cng ch mt ngy; 16:43 v 4:43 PM cng ch mt gi. Lp DateTime cung cp phng thc tnh Parse rt linh hot, cho php to th hin DateTime t nhiu cch m t khc nhau trong chui. Phng thc Parse rt mnh trong vic to i tng DateTime t mt chui cho trc. N c th x l mt chui ch cha mt phn thng tin hay cha thng tin sai, v thay th cc gi tr thiu bng cc gi tr mc nh. Ngy mc nh l ngy hin ti, gi mc nh l 12:00:00 AM. Nu sau mi c gng, Parse khng th to i tng DateTime, n s nm ngoi l System.FormatException. V d sau minh ha tnh linh hot ca Parse:
// 01/09/2004 12:00:00 AM DateTime dt1 = DateTime.Parse("Sep 2004"); // 05/09/2004 02:15:33 PM DateTime dt2 = DateTime.Parse("Sun 5 September 2004 14:15:33"); // 05/09/2004 12:00:00 AM DateTime dt3 = DateTime.Parse("5,9,04"); // 05/09/2004 02:15:33 PM DateTime dt4 = DateTime.Parse("5/9/2004 14:15:33"); // 07/10/2004 02:15:00 PM (gi s ngy hin ti l 07/10/2004) DateTime dt5 = DateTime.Parse("2:15 PM");

Phng thc Parse linh hot v c th t sa li. Tuy nhin, mc linh hot ny khng cn thit trong trng hp bn mun bo m cc chui phi theo mt nh dng nht nh. Khi , s dng phng thc ParseExact thay cho Parse. Dng n gin nht ca ParseExact nhn ba i s: chui cha ngy gi, chui nh dng xc nh cu trc m chui cha ngy gi phi tun theo, v mt tham chiu IFormatProvider cung cp thng tin c th v bn a. Nu IFormatProvider l null, thng tin v bn a ca tiu trnh (thread) hin hnh s c s dng. Nu ngy gi trong chui ang xt khng ng vi nh dng quy nh, ParseExact s nm ngoi l System.FormatException. Chui nh dng c s dng tng t nh khi bn ch

76 Chng 2: Thao tc d liu

nh chui i din cho mt i tng DateTime. iu ny c ngha l bn c th s dng c nh dng chun ln nh dng ty bin. Tham kho phn ti liu cho lp System.Globalization.DateTimeFormatInfo trong ti liu .NET Framework SDK c thng tin y v tt c cc kiu nh dng.
// Ch phn tch cc chui cha LongTimePattern. DateTime dt6 = DateTime.ParseExact("2:13:30 PM", "h:mm:ss tt", null);

// Ch phn tch cc chui cha RFC1123Pattern. DateTime dt7 = DateTime.ParseExact( "Sun, 05 Sep 2004 14:13:30 GMT", "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'", null);

// Ch phn tch cc chui cha MonthDayPattern. DateTime dt8 = DateTime.ParseExact("September 03", "MMMM dd", null);

8.

Cng, tr, so snh ngy gi


Bn cn thc hin cc php tnh s hc c bn hay php so snh trn ngy, gi. S dng cc cu trc DateTime v TimeSpan (h tr cc ton t s hc v so snh).

Mt i tng DateTime m t mt thi im xc nh (chng hn 4:15 AM, ngy 21 thng 04 nm 1980), trong khi i tng TimeSpan m t mt khong thi gian (chng hn 2 gi, 35 pht). Bn c th cng, tr, so snh cc i tng TimeSpan v DateTime. Thc cht, c DateTime v TimeSpan u s dng tick m t thi gian1 tick bng 100 nano-giy (mt nano-giy bng mt phn t (10-9) giy). TimeSpan lu khong thi gian ca n l s tick bng khong thi gian , DateTime lu s tick tri qua k t 12:00:00 khuya ngy 1 thng 1 nm 0001 sau cng nguyn. Cch tip cn ny v vic s dng ton t np chng gip DateTime v TimeSpan d dng h tr cc php tnh s hc v so snh. Bng 2.4 tm tt cc ton t m hai cu trc ny h tr.
Bng 2.4 Cc ton t c cung cp bi DateTime v TimeSpan Ton t TimeSpan DateTime

Gn (=)

V TimeSpan l mt cu trc nn php gn tr v mt bn sao, khng phi mt tham chiu.

V DateTime l mt cu trc nn php gn tr v mt bn sao, khng phi mt tham chiu.

77 Chng 2: Thao tc d liu

Cng (+) Tr (-) Bng (==) Khng bng (!=) Ln hn (>)

Cng hai i tng TimeSpan. Tr hai i tng TimeSpan. So snh hai i tng TimeSpan v tr v true nu bng nhau. So snh hai i tng TimeSpan v tr v true nu khng bng nhau. Xc nh mt i tng TimeSpan c ln hn mt i tng TimeSpan khc hay khng. Xc nh mt i tng TimeSpan c ln hn hoc bng mt i tng TimeSpan khc hay khng. Xc nh mt i tng TimeSpan c nh hn mt i tng TimeSpan khc hay khng. Xc nh mt i tng TimeSpan c nh hn hoc bng mt i tng TimeSpan khc hay khng. Tr v mt gi tr o du ca mt TimeSpan. Tr v chnh TimeSpan.

Cng Tr

mt DateTime. mt

TimeSpan

vo cho

mt mt

DateTime

DateTime hoc mt TimeSpan.

So snh hai i tng DateTime v tr v true nu bng nhau. So snh hai i tng DateTime v tr v true nu khng bng nhau. Xc nh mt i tng DateTime c ln hn mt i tng DateTime khc hay khng. Xc nh mt i tng DateTime c ln hn hoc bng mt i tng DateTime khc hay khng. Xc nh mt i tng DateTime c nh hn mt i tng DateTime khc hay khng. Xc nh mt i tng DateTime c nh hn hoc bng mt i tng DateTime khc hay khng. Khng h tr. Khng h tr.

Ln hoc bng (>=)

Nh hn (<)

Nh hoc bng (<=) m (-) Dng (+)

Cu trc DateTime cng hin thc cc phng thc AddTicks, AddMilliseconds, AddSeconds, AddMinutes, AddHours, AddDays, AddMonths, v AddYears. Mi phng thc ny cho php bn cng (hoc tr bng cc gi tr m) phn t thi gian thch hp vi i tng DateTime. Cc phng thc ny v cc ton t c lit k trong bng 2.4 khng lm thay i DateTime gc thay vo chng s to mt i tng mi vi gi tr c thay i. on m di y trnh by cch s dng cc ton t thao tc cc cu trc DateTime v TimeSpan:
// To mt TimeSpan m t 2.5 ngy. TimeSpan timespan1 = new TimeSpan(2,12,0,0); // To mt TimeSpan m t 4.5 ngy. TimeSpan timespan2 = new TimeSpan(4,12,0,0); // To mt TimeSpan m t 1 tun. TimeSpan oneWeek = timespan1 + timespan2;

// To mt DateTime vi ngy gi hin ti. DateTime now = DateTime.Now;

78 Chng 2: Thao tc d liu

// To mt DateTime m t 1 tun trc y. DateTime past = now - oneWeek; // To mt DateTime m t 1 tun trong tng lai. DateTime future = now + oneWeek;

9.

Sp xp mt mng hoc mt ArrayList


Bn cn sp xp cc phn t trong mt mng hoc mt ArrayList. S dng phng thc ArrayList.Sort sp xp ArrayList v phng thc tnh Array.Sort sp xp mng.

Dng n gin nht ca Sort l sp xp cc i tng nm trong mt mng hoc ArrayList khi cc i tng ny c hin thc giao din System.Icomparable v c kiu ging nhautt c cc kiu d liu c bn u hin thc Icomparable. on m di y minh ha cch s dng phng thc Sort:
// To mt mng mi v thm phn t vo. int[] array = {4, 2, 9, 3};

// Sp xp mng. Array.Sort(array);

// Hin th ni dung ca mng c sp xp. foreach (int i in array) { Console.WriteLine(i);}

// To mt ArrayList mi v thm phn t vo. ArrayList list = new ArrayList(4); list.Add("Phong"); list.Add("Phuong"); list.Add("Khoa"); list.Add("Tam");

// Sp xp ArrayList. list.Sort();

// Hin th ni dung ca ArrayList c sp xp. foreach (string s in list) { Console.WriteLine(s);}

79 Chng 2: Thao tc d liu

sp xp cc i tng khng hin thc IComparable, bn cn truyn cho phng thc Sort mt i tng hin thc giao din System.Collections.IComparer. Hin thc ca IComparer phi c kh nng so snh cc i tng nm trong mng hoc ArrayList (xem mc 16.3 bit cch hin thc IComparable v IComparer).

10.

Chp mt tp hp vo mt mng
Bn cn chp ni dung ca mt tp hp vo mt mng. S dng phng thc ICollection.CopyTo (c hin thc bi tt c cc lp tp hp), hoc s dng phng thc ToArray (c hin thc bi cc tp hp ArrayList, Stack, Queue).

Cc phng thc ICollection.CopyTo v ToArray c cng chc nng, chng chp cc phn t trong mt tp hp vo mt mng. S khc bit nm ch CopyTo chp vo mt mng c, trong khi ToArray to ra mt mng mi ri chp vo .
CopyTo nhn hai i s: mt mng v mt ch s. Mng ny l ch ca qu trnh sao chp v

phi c kiu tng thch vi cc phn t ca tp hp. Nu kiu khng tng thch hay khng c s chuyn i ngm t kiu phn t ca tp hp sang kiu phn t ca mng th ngoi l System.InvalidCastException s b nm. Ch s l mt v tr trong mng m bt u t cc phn t ca tp hp s c chp vo. Nu ch s ny ln hn hoc bng chiu di ca mng, hoc s phn t ca tp hp vt qu sc cha ca mng th ngoi l System.ArgumentException s b nm. on m sau minh ha cch s dng CopyTo chp ni dung ca mt ArrayList vo mt mng:
// To mt ArrayList mi v thm phn t vo. ArrayList list = new ArrayList(5); list.Add("Phuong"); list.Add("Phong"); list.Add("Nam"); list.Add("Tam"); list.Add("Nhan");

// To mt string[] v s dng ICollection.CopyTo // chp ni dung ca ArrayList. string[] array1 = new string[5]; list.CopyTo(array1,0);

Cc lp ArrayList, Stack, v Queue cng hin thc phng thc ToArray, phng thc ny t ng to mt mng vi kch thc cha cc phn t ca ca tp hp. Nu bn khng truyn i s cho ToArray, n s tr v mt object[] bt chp kiu ca cc i tng trong tp hp. Tuy nhin, bn c th truyn mt i tng System.Type ch nh kiu ca mng (Bn phi p mng kiu mnh v ng kiu). V d sau minh ha cch s dng ToArray cho ArrayList trn:

80 Chng 2: Thao tc d liu

// S dng ArrayList.ToArray to mt object[] // t ni dung ca tp hp. object[] array2 = list.ToArray();

// S dng ArrayList.ToArray to mt string[] kiu mnh // t ni dung ca tp hp. string[] array3 = (string[])list.ToArray(System.Type.GetType("System.String"));

11.

To mt tp hp kiu mnh
Bn cn to mt tp hp ch cha cc phn t thuc mt kiu nht nh. To mt lp dn xut t lp System.Collections.CollectionBase hay System.Collections.DictionaryBase, v hin thc cc phng thc an-ton-vkiu-d-liu (type-safe) thao tc trn tp hp.

Cc lp CollectionBase v DictionaryBase c th ng vai tr cc lp c s dn xut ra cc lp tp hp an-ton-kiu m khng phi hin thc li cc giao din chun: IDictionary, IList, ICollection, v IEnumerable.
CollectionBase dng cho cc tp hp da-trn-Ilist (nh ArrayList). Thc cht, CollectionBase duy tr tp hp bng mt i tng ArrayList chun, c th c truy

xut thng qua thuc tnh bo v List.


DictionaryBase dng cho cc tp hp da-trn-IDictionary (nh Hashtable). Thc

cht, DictionaryBase duy tr tp hp bng mt i tng Hashtable chun, c th c truy xut thng qua thuc tnh bo v Dictionary. on m sau hin thc mt tp hp tn mnh (da trn lp CollectionBase) th hin mt danh sch cc i tng System.Reflection.AssemblyName.
using System.Reflection; using System.Collections; public class AssemblyNameList : CollectionBase { public int Add(AssemblyName value) {

return this.List.Add(value); }

public void Remove(AssemblyName value) {

81 Chng 2: Thao tc d liu

this.List.Remove(value); }

public AssemblyName this[int index] {

get { return (AssemblyName)this.List[index]; }

set { this.List[index] = value; } }

public bool Contains(AssemblyName value) {

return this.List.Contains(value); }

public void Insert(int index, AssemblyName value) {

this.List.Insert(index, value); } }

C hai lp CollectionBase v DictionaryBase u hin thc mt tp cc phng thc cbo-v c tip u ng On*. Cc phng thc ny (chng hn OnClear, OnClearComplete, OnGet, OnGetComplete,) thng c chp cc lp dn xut nhm cho php bn hin thc cc chc nng ty bin cn thit qun l tp hp kiu mnh. Cc lp CollectionBase v DictionaryBase s gi phng thc ph hp trc v sau khi vic chnh sa c thc hin trn tp hp nm di thng qua thuc tnh List hay Dictionary.

12.

Lu mt i tng kh-tun-t-ha vo file


Bn cn lu mt i tng kh-tun-t-ha v cc trng thi ca n vo file, sau gii tun t ha khi cn. S dng mt formatter tun t ha i tng v ghi n vo mt System.IO.FileStream. Khi cn truy xut i tng, s dng formatter cng kiu c d liu c-tun-t-ha t file v gii tun t ha i tng. Th vin

82 Chng 2: Thao tc d liu

lp .NET Framework cung cp cc hin thc formatter sau y tun t ha i tng theo dng nh phn hay SOAP:
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter System.Runtime.Serialization.Formatters.Soap.SoapFormatter

Lp BinaryFormatter v SoapFormatter c th c s dng tun t ha mt i tng ca bt k kiu no c gn vi c tnh System.SerializableAttribute. BinaryFormatter sinh ra mt stream d liu nh phn m t i tng v trng thi ca n, trong khi SoapFormatter sinh ra mt ti liu SOAP. C hai lp BinaryFormatter v SoapFormatter u hin thc giao din System.Runtime. Serialization.IFormatter, giao din ny nh ngha hai phng thc: Serialize v Deserialize.
Serialize nhn mt tham chiu System.Object v mt tham chiu System.IO.Stream

lm i s, tun t ha Object v ghi n vo Stream.


Deserialize nhn mt tham chiu Stream lm i s, c d liu ca i tng c-

tun-t-ha t Stream, v tr v mt tham chiu Object n i tng c-gii-tunt-ha. Bn phi p tham chiu Object ny v kiu thch hp. gi cc phng thc Serialize v Deserialize ca lp BinaryFormatter, m lnh ca bn phi c cp phn t SerializationFormatter ca lp System.Security.Permissions. SecurityPermission. gi cc phng thc Serialize v Deserialize ca lp SoapFormatter, m lnh ca bn phi c cp quyn tin tng tuyt i (full trust) v assembly System.Runtime. Serialization.Formatters.Soap.dll (lp SoapFormatter c khai bo bn trong assembly ny) khng cho php cc m lnh ch c-tin-cy-mt-phn (partially trusted caller) s dng n. Tham kho mc 13.1 c thm thng tin v m lnh c-tin-cy-mt-phn. Lp BinarySerializationExample di y minh ha cch s dng lp BinaryFormatter tun t ha mt System.Collections.ArrayList cha danh sch tn ngi vo mt file. Sau , ArrayList c gii tun t ha t file v ni dung ca n s c hin th trong ca s Console.
using System.IO; using System.Collections; using System.Runtime.Serialization.Formatters.Binary; public class BinarySerializationExample { public static void Main() { // To v cu hnh ArrayList tun t ha. ArrayList people = new ArrayList(); people.Add("Phuong");

83 Chng 2: Thao tc d liu people.Add("Phong"); people.Add("Nam"); // Tun t ha i tng ArrayList. FileStream str = File.Create("people.bin"); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(str, people); str.Close(); // Gii tun t ha i tng ArrayList. str = File.OpenRead("people.bin"); bf = new BinaryFormatter(); people = (ArrayList)bf.Deserialize(str); str.Close(); // Hin th ni dung ca i tng ArrayList // -c-gii-tun-t-ha. foreach (string s in people) { System.Console.WriteLine(s); } } }

Bn c th s dng lp SoapFormatter theo cch nh c trnh by trong lp BinarySerializationExample trn, ch cn thay mi th hin ca lp BinaryFormatter bng th hin ca lp SoapFormatter v thay i ch th using nhp khng gian tn System.Runtime.Serialization.Formatters.Soap. Ngoi ra, bn cn thm mt tham chiu n System.Runtime.Serialization.Formatters.Soap.dll khi bin dch m. File SoapSerializationExample.cs trong a CD nh km s trnh by cch s dng lp SoapFormatter. Hnh 2.1 v 2.2 di y minh ha hai kt qu khc nhau khi s dng lp BinaryFormatter v SoapFormatter. Hnh 2.1 trnh by ni dung ca file people.bin c to ra khi s dng BinaryFormatter, hnh 2.2 trnh by ni dung ca file people.xml c to ra khi s dng SoapFormatter.

84 Chng 2: Thao tc d liu

Hnh 2.1 Ni dung file people.bin

Hnh 2.2 Ni dung file people.xml

85 Chng 2: Thao tc d liu

86

Chng 3:MIN NG DNG, C CH PHN CHIU, V SIU D LIU

87

88 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

c mnh v tnh linh hot ca Microsoft .NET Framework c nng cao bi kh nng kim tra v thao tc cc kiu v siu d liu lc thc thi. Cc mc trong chng ny s trnh by cc kha cnh thng dng ca min ng dng (application domain), c ch phn chiu (reflection), v siu d liu (metadata), bao gm:

To v hy cc min ng dng (mc 3.1 v 3.9). Lm vic vi cc kiu v cc i tng khi s dng nhiu min ng dng (mc 3.2,
3.3, 3.4, v 3.8).

Lm vic vi thng tin Type (mc 3.10 v 3.11). To ng cc i tng v np ng cc assembly lc thc thi (mc 3.5, 3.6, 3.7, v
3.12).

To v kim tra cc c tnh ty bin (cc mc 3.13 v 3.14).

1.

Bn cn to mt min ng dng mi.

To min ng dng
S dng phng thc tnh CreateDomain ca lp System.AppDomain.

Dng thc n gin nht ca phng thc CreateDomain nhn mt i s kiu string ch nh tn thn thin cho min ng dng mi. Cc dng thc khc cho php bn ch nh chng c (evidence) v cc thit lp cu hnh cho min ng dng mi. Chng c c ch nh bng i tng System.Security.Policy.Evidence; mc 13.11 trnh by cc tc ng ca chng c khi bn to mt min ng dng. Cc thit lp cu hnh c ch nh bng i tng System.AppDomainSetup. Lp AppDomainSetup cha cc thng tin cu hnh cho mt min ng dng. Bng 3.1 kit k cc thuc tnh thng c s dng nht ca lp AppDomainSetup khi to cc min ng dng. Cc thuc tnh ny c th c truy xut sau khi to thng qua cc thnh vin ca i tng AppDomain, v mt s c th thay i lc thc thi; bn hy tham kho ti liu .NET Framework SDK v lp AppDomain hiu chi tit hn.
Bng 3.1 Cc thuc tnh thng dng ca lp AppDomainSetup Thuc tnh M t

ApplicationBase

Th mc m CRL s xt trong qu trnh d tm cc assembly ring. K thut d tm (probing) s c tho lun trong mc 3.5. Thc t, ApplicationBase l th mc gc cho ng dng ang thc thi. Theo mc nh, y l th mc cha assembly. C th c c thuc tnh ny sau khi to min ng dng bng thuc tnh AppDomain.BaseDirectory.

89 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

ConfigurationFile

Tn ca file cu hnh, c s dng bi m c np vo min ng dng. C th c c thuc tnh ny sau khi to min ng dng bng phng thc AppDomain.GetData vi kha APP_CONFIG_FILE. Quy nh phn publisher policy ca file cu hnh ng dng c c xt n hay khng khi xc nh phin bn ca mt assembly tn mnh ni kt. Publisher policy s c tho lun trong mc 3.5. Danh sch cc th mc cch nhau bi du chm phy m b thc thi s s dng khi d tm cc assembly ring. Cc th mc ny c v tr tng i so vi th mc c ch nh trong ApplicationBase. C th c c thuc tnh ny sau khi to min ng dng bng thuc tnh AppDomain.RelativeSearchPath. C th thay i thuc tnh ny lc thc thi bng phng thc AppendPrivatePath v ClearPrivatePath.

DisallowPublisherPolicy

PrivateBinPath

V d di y trnh by cch to v cu hnh mt min ng dng:


// Khi to mt i tng ca lp AppDomainSetup. AppDomainSetup setupInfo = new AppDomainSetup();

// Cu hnh cc thng tin ci t cho min ng dng. setupInfo.ApplicationBase = @"C:\MyRootDirectory"; setupInfo.ConfigurationFile = "MyApp.config"; setupInfo.PrivateBinPath = "bin;plugins;external";

// To mt min ng dng mi (truyn null lm i s chng c). // Nh lu mt tham chiu n AppDomain mi v n // khng th c thu ly theo bt k cch no khc. AppDomain newDomain = AppDomain.CreateDomain( "My New AppDomain", new System.Security.Policy.Evidence(), setupInfo);

Bn phi duy tr mt tham chiu n i tng AppDomain va to bi v khng c c ch no lit k cc min ng dng hin c t bn trong m c-qunl.

90 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

2.

Chuyn cc i tng qua li cc min ng dng


Bn cn chuyn cc i tng qua li gia cc min ng dng nh cc i s hay cc gi tr tr v. S dng cc i tng marshal-by-value hay marshal-by-reference.

H thng .NET Remoting (s c tho lun trong chng 12) gip vic gi cc i tng qua li cc min ng dng tr nn d dng. Tuy nhin, nu bn cha quen vi .NET Remoting, kt qu c th rt khc so vi mong i. Thc ra, vn gy kh khn khi dng nhiu min ng dng l s tng tc vi .NET Remoting v cch thc lun chuyn i tng qua cc min ng dng. Tt c cc kiu d liu c th chia thnh ba loi: nonremotable, marshal-by-value (MBV), v marshal-by-reference (MBR). Kiu nonremotable khng th vt qua bin min ng dng v khng th dng lm cc i s hay cc gi tr tr v ca cc li gi trong mi trng lin min ng dng. Kiu nonremotable s c tho lun trong mc 3.4. Kiu MBV l kiu kh-tun-t-ha. Khi mt i tng kiu MBV c chuyn qua mt min ng dng khc nh l i s hay gi tr tr v, h thng .NET Remoting s tun t ha trng thi hin ti ca i tng, chuyn d liu sang min ng dng ch, v to mt bn sao ca i tng vi cng trng thi nh i tng gc. Kt qu l tn ti bn sao ca i tng c hai min ng dng. Hai i tng ny ban u ging nhau hon ton, nhng c lp nhau, nn vic thay i i tng ny khng nh hng n i tng kia. Di y l v d mt kiu kh-tun-t-ha c tn l Employee, c chuyn qua mt min ng dng khc bng tr (xem mc 16.1 bit cch to kiu kh-tun-t-ha).
[System.Serializable] public class Employee { // Hin thc cc thnh vin y. }

Kiu MBR l lp dn xut t lp System.MarshalByRefObject. Khi mt i tng kiu MBR c chuyn qua mt min ng dng khc nh i s hay gi tr tr v, h thng .NET Remoting s to mt i tng proxy cho i tng MBV cn chuyn trong min ng dng ch. i tng i din thc hin cc hnh vi hon ton ging vi i tng MBR m n i din. Thc ra, khi thc hin mt hnh vi trn i tng i din, h thng .NET Remoting thc hin ngm vic chuyn li gi v cc i s cn thit n min ng dng ngun, v ti thc hin li gi hm trn i tng MBR gc. Kt qu c tr v thng qua i tng i din. Di y l mt phin bn khc ca lp Employee, c chuyn qua mt min ng dng khc bng tham chiu thay v bng tr (xem mc 12.7 bit chi tit v cch to kiu MBR).
public class Employee : System.MarshalByRefObject {

91 Chng 3: Min ng dng, c ch phn chiu, v siu d liu // Hin thc cc thnh vin y. }

3.

Trnh np cc assembly khng cn thit vo min ng dng


Bn cn chuyn mt tham chiu i tng qua li gia cc min ng dng khc nhau; tuy nhin, bn khng mun CLR np siu d liu m t kiu ca i tng vo cc min ng dng trung gian. ng gi tham chiu i tng trong mt System.Runtime.Remoting.ObjectHandle v khi cn truy xut i tng th khi phc li.

Khi bn truyn mt i tng marshal-by-value (MBV) qua cc min ng dng, b thc thi s to mt th hin mi ca i tng ny trong min ng dng ch. iu ny c ngha l b thc thi phi np assembly cha siu d liu m t kiu ca i tng vo cc min ng dng. Do , vic truyn cc tham chiu MBV qua cc min ng dng trung gian s dn n vic b thc thi np cc assembly khng cn thit vo cc min ng dng ny. Mt khi c np th cc assembly tha ny s khng c gii phng khi min ng dng nu khng gii phng c min ng dng cha chng (xem mc 3.9). Lp ObjectHandle cho php bn ng gi tham chiu i tng truyn qua cc min ng dng m b thc thi khng phi np thm assembly. Khi i tng ny n min ng dng ch, bn c th khi phc tham chiu i tng, b thc thi s np cc assembly cn thit v cho php bn truy xut n i tng nh bnh thng. ng gi mt i tng (v d System.Data.DataSet), bn c th thc hin nh sau:
// To mt DataSet mi. System.Data.DataSet data1 = new System.Data.DataSet();

// Cu hnh/thm d liu cho DataSet.

// ng gi DataSet. System.Runtime.Remoting.ObjectHandle objHandle = new System.Runtime.Remoting.ObjectHandle(data1);

khi phc mt i tng, s dng phng thc ObjectHandle.Unwrap v p kiu tr v cho ph hp, v d:
// Khi phc DataSet t ObjectHandle. System.Data.DataSet data2 = (System.Data.DataSet)objHandle.Unwrap();

92 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

4.

To kiu khng th vt qua bin min ng dng


Bn cn to mt kiu d liu sao cho cc th hin ca kiu ny khng th c truy xut t m lnh cc min ng dng khc. Phi chc chn kiu d liu thuc dng nonremotable, tc l khng th tun t ha cng nh khng dn xut t lp MarshalByRefObject.

i khi bn mun kiu d liu no ch c gii hn truy xut trong phm vi ca min ng dng. to kiu d liu dng nonremotable, phi chc rng kiu ny khng phi l khtun-t-ha v cng khng dn xut (trc tip hay gin tip) t lp MarshalByRefObject. Nhng iu kin ny s m bo rng trng thi ca i tng khng th c truy xut t cc min ng dng khc (cc i tng ny khng th c s dng lm i s hay gi tr tr v trong cc li gi phng thc lin min ng dng). iu kin kiu d liu khng phi l kh-tun-t-ha c thc hin d dng do mt lp khng tha k kh nng tun t ha t lp cha ca n. bo m mt kiu khng phi l kh-tun-t-ha, bn phi chc chn rng c tnh System.SerializableAttribute khng c p dng khi khai bo kiu. Bn cn lu khi m bo mt lp khng c truyn bng tham chiu. Nhiu lp trong th vin lp .NET dn xut trc tip hay gin tip t MarshalByRefObject; bn phi cn thn khng dn xut lp ca bn t cc lp ny. Nhng lp c s thng dng dn xut t MarshalByRefObject bao gm: System.ComponentModel.Component, System.IO.Stream, System.IO.TextReader, System.IO.TextWriter, System.NET.WebRequest, v System.Net. WebResponse (xem ti liu .NET Framework SDK c danh sch y u cc lp dn xut t MarshalByRefObject).

5.

S dng

Np assembly vo min ng dng hin hnh


Bn cn np mt assembly vo min ng dng lc thc thi. thc System.Reflection.Assembly. phng tnh
Load

hay

LoadFrom

ca

lp

B thc thi t ng np cc assembly m assembly ca bn tham chiu n lc bin dch. Tuy nhin, bn cng c th ch th cho b thc thi np assembly. Cc phng thc Load v LoadFrom u thc hin mt cng vic l np mt assembly vo min ng dng hin hnh, v c hai u tr v mt i tng Assembly m t assembly va c np. S khc bit gia hai phng thc l danh sch cc i s c cung cp nhn dng assembly cn np, v cch thc b thc thi nh v assembly ny. Phng thc Load cung cp nhiu dng thc cho php ch nh assembly cn np, bn c th s dng mt trong nhng dng sau: Mt string cha tn y hay tn ring phn nhn dng assembly.

93 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

Mt System.Reflection.AssemblyName m t chi tit v assembly. Mt mng byte cha d liu cu thnh assembly.

Thng thng, tn ca assembly c s dng np assembly. Tn y ca mt assembly bao gm: tn, phin bn, ban ia, v token kha cng khai, c phn cch bi du phy (v d: System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken= b77a5c561934e089). ch nh mt assembly khng c tn mnh, s dng PublicKeyToken=null. Bn cng c th s dng tn ngn nhn dng mt assembly nhng t nht phi cung cp tn ca assembly (khng c phn m rng). on m di y trnh by cc cch s dng phng thc Load:
// Np assembly System.Data dng tn y . string name1 = "System.Data,Version=1.0.5000.0," + "Culture=neutral,PublicKeyToken=b77a5c561934e089"; Assembly a1 = Assembly.Load(name1);

// Np assembly System.Xml dng AssemblyName. AssemblyName name2 = new AssemblyName(); name2.Name = "System.Xml"; name2.Version = new Version(1,0,5000,0); name2.CultureInfo = new CultureInfo(""); name2.SetPublicKeyToken( new byte[] {0xb7,0x7a,0x5c,0x56,0x19,0x34,0xe0,0x89}); Assembly a2 = Assembly.Load(name2);

// Np assembly SomeAssembly dng tn ngn. Assembly a3 = Assembly.Load("SomeAssembly");

Khi phng thc Load c gi, b thc thi thc hin qu trnh nh v v np assembly. Di y s tm tt qu trnh ny; bn tham kho ti liu .NET Framework SDK bit thm chi tit. 1. Nu bn ch nh assembly tn mnh, phng thc Load s p dng version policy (chnh sch phin bn) v publisher policy (chnh sch nh pht hnh) cho phep kha nng chuyn tip (redirect) n mt phin ban assembly khc. Version policy c ch nh trong file cu hnh my tnh hay ng dng ca bn bng phn t <bindingRedirect>. Publisher policy c ch nh trong cc assembly c bit c ci t bn trong GAC (Global Assembly Cache). Mt khi xc nh ng phin bn ca assembly cn s dng, b thc thi s c gng np cc assembly tn mnh t GAC. Nu assembly khng c tn mnh hoc khng c tm thy trong GAC, b thc thi s tm phn t <codeBase> trong cc file cu hnh my tnh v ng dng. Phn t <codeBase> nh x tn ca assembly thnh mt file hay mt URL. Nu assembly c tn mnh, <codeBase> c th ch n bt k v tr no k c cc URL da-trn-Internet; nu

2. 3.

94 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

khng, <codeBase> phi ch n mt th mc co vi tri tng i so vi th mc ng dng. Nu assembly khng tn ti trong v tr c ch nh, phng thc Load s nm ngoi l System.IO.FileNotFoundException. 4. Nu khng c phn t <codeBase> tng ng vi assembly, b thc thi s tm assembly bng k thut probing. Qu trnh probing s tm file u tin c tn ca assembly (vi phn m rng l .dll hay .exe) trong cc v tr: Th mc gc ca ng dng. Cc th mc con cua th mc gc ph hp vi tn v ban ia ca assembly. Cc th mc con (cua th mc gc) do ngi dung chi inh.

Phng thc Load l cch d nht tm v np cc assembly, nhng cng c th tn nhiu chi ph cho vic d trong nhiu th mc tm cc assembly c tn yu. Phng thc LoadFrom cho php bn np assembly t mt v tr xc nh, nu khng tm thy n s nm ngoi l FileNotFoundException. B thc thi s khng c tm assembly nh phng thc Load phng thc LoadFrom khng h tr GAC, policy, phn t <codeBase> hay probing. Di y l on m trnh by cch s dng LoadFrom np c:\shared\MySharedAssembly.dll. Lu rng, khc vi Load, LoadFrom yu cu bn ch nh phn m rng ca file assembly.
// Np assembly c tn l c:\shared\MySharedAssembly.dll Assembly a4 = Assembly.LoadFrom(@"c:\shared\MySharedAssembly.dll");

6.

Thc thi assembly min ng dng khc


Bn cn thc thi mt assembly mt min ng dng khc vi min ng dng hin hnh. Gi phng thc ExecuteAssembly ca i tng AppDomain ai din cho min ng dng, v ch nh tn ca assembly cn thc thi.

Nu bn c mt assembly kh-thc-thi v mun np thc thi n trong mt min ng dng, phng thc ExecuteAssembly s gip bn. Phng thc ExecuteAssembly c bn dng thc khc nhau. Dng thc n gin nht ch nhn vo mt kiu string cha tn ca assembly cn thc thi; bn c th ch nh mt file cc b hay mt URL. Mt dng thc khc cho php bn ch nh chng c (evidence) cho assembly (xem mc 13.10) v cc i s truyn n im nhp ca assembly (tng ng vi cc i s dng lnh). Phng thc ExecuteAssembly np assembly c ch nh v thc thi phng thc c nh ngha trong siu d liu l im nhp ca assembly (thng l phng thc Main). Nu assembly c ch nh khng c kh nng thc thi, ExecuteAssembly s nm ngoi l System.Runtime.InteropServices.COMException. B thc thi khng thc thi assembly trong mt tiu trnh mi, v th quyn kim sot s khng tr v cho n khi qu trnh thc thi ca assembly kt thc. Do ExecuteAssembly np mt assembly bng tn ring phn (ch c tn file), CLR s khng dng GAC hay probing tm assembly (xem mc 3.5 bit thm chi tit).

95 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

V d di y trnh by cch s dng phng thc ExecuteAssembly np v thc thi mt assembly. Lp ExecuteAssemblyExample to mt AppDomain v thc thi chnh n trong AppDomain bng phng thc ExecuteAssembly. Kt qu l c hai bn sao ca ExecuteAssemblyExample c np vo hai min ng dng khc nhau.
using System; public class ExecuteAssemblyExample { public static void Main(string[] args) { // Nu assembly ang thc thi trong mt AppDomain // c tn thn thin l "NewAppDomain" // th khng to AppDomain mi. iu ny s // trnh mt vng lp v tn to AppDomain. if (AppDomain.CurrentDomain.FriendlyName != "NewAppDomain") {

// To min ng dng mi c tn l "NewAppDomain". AppDomain domain = AppDomain.CreateDomain("NewAppDomain");

// Thc thi assembly ny trong AppDomain mi v // truyn mng cc i s dng lnh. domain.ExecuteAssembly("ExecuteAssemblyExample.exe", null, args); } // Hin th cc i s dng lnh ln mn hnh // cng vi tn thn thin ca AppDomain. foreach (string s in args) {

Console.WriteLine(AppDomain.CurrentDomain.FriendlyName + " : " + s); } } }

7.

Th hin ha mt kiu trong min ng dng khc


Bn cn th hin ha mt kiu trong mt min ng dng khc vi min ng dng hin hnh.

96 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

Gi phng thc CreateInstance hay CreateInstanceFrom ca i tng AppDomain ai din cho min ng dng ch.

Vic s dng phng thc ExecuteAssembly ( c tho lun trong mc 3.6) khng my kh khn; nhng khi pht trin cc ng dng phc tp c s dng nhiu min ng dng, chc chn bn mun kim sot qu trnh np cc assembly, to cc kiu d liu, v triu gi cc thnh vin ca i tng bn trong min ng dng. Cc phng thc CreateInstance v CreateInstanceFrom cung cp nhiu phin bn np chng gip bn kim sot qu trnh to i tng. Cc phin bn n gin nht s dng phng thc khi dng mc nh ca kiu, nhng c hai phng thc ny u thit t cc phin bn cho php bn cung cp i s s dng bt k phng thc khi dng no. Phng thc CreateInstance np mt assembly c tn xc nh vo min ng dng bng qu trnh c m t cho phng thc Assembly.Load trong mc 3.5. Sau , CreateInstance to i tng cho kiu v tr v mt tham chiu n i tng mi c ng gi trong ObjectHandle (c m t trong mc 3.3). Tng t nh th i vi phng thc CreateInstanceFrom; tuy nhin, CreateInstanceFrom np assembly vo min ng dng bng qu trnh c m t cho phng thc Assembly.LoadFrom trong mc 3.5.

AppDomain

cng cung cp hai phng thc rt tin li c tn l

CreateInstanceAndUnwrap v CreateInstanceFromAndUnwrap, chng s t ng khi

phc tham chiu n i tng c to t i tng ObjectHandle; bn phi p i tng tr v cho ng kiu trc khi s dng. Nu bn s dng CreateInstance hay CreateInstanceFrom to i tng kiu MBV trong mt min ng dng khc, i tng s c to nhng tham chiu tr v s khng ch n i tng . Do cch thc i tng MBV vt qua bin min ng dng, tham chiu ny s ch n mt bn sao ca i tng c to t ng trong min ng dng cc b. Ch khi bn to mt kiu MBR th tham chiu tr v mi ch n i tng trong min ng dng khc (xem mc 3.2 bit thm chi tit v kiu MBV v MBR). K thut chung n gin ha vic qun l cc min ng dng l s dng lp iu khin (controller class). Mt lp iu khin l mt kiu MBR ty bin. Bn hy to mt min ng dng ri to i tng lp iu khin trong min ng dng ny bng phng thc CreateInstance. Lp iu khin hin thc cc chc nng cn thit cho ng dng thao tc min ng dng v cc ni dung ca n. Cc chc nng ny c th bao gm: np assembly, to thm min ng dng, dn dp trc khi xa min ng dng, hay lit k cc phn t chng trnh (bn khng th thc hin bn ngoi min ng dng). V d di y trnh by cch s dng mt lp iu khin c tn l PluginManager. Khi c to trong mt min ng dng, PluginManager cho php bn to i tng ca cc lp c hin thc giao din IPlugin, chy v dng cc plug-in , v tr v danh sch cc plug-in hin c np.
using System; using System.Reflection;

97 Chng 3: Min ng dng, c ch phn chiu, v siu d liu using System.Collections; using System.Collections.Specialized;

// Giao din chung cho tt c cc plug-in. public interface IPlugin { void Start(); void Stop(); }

// Mt hin thc n gin cho giao din Iplugin // minh ha lp iu khin PluginManager. public class SimplePlugin : IPlugin {

public void Start() { Console.WriteLine(AppDomain.CurrentDomain.FriendlyName + ": SimplePlugin starting..."); }

public void Stop() {

98 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

Console.WriteLine(AppDomain.CurrentDomain.FriendlyName + ": SimplePlugin stopping..."); } }

// Lp iu khin, qun l vic np v thao tc // cc plug-in trong min ng dng ca n. public class PluginManager : MarshalByRefObject {

// ListDictionary gi tham chiu n cc plug-in. private ListDictionary plugins = new ListDictionary();

// Phng thc khi dng mc nh. public PluginManager() {}

// Phng thc khi dng nhn danh sch cc plug-in. public PluginManager(ListDictionary pluginList) {

// Np cc plug-in c ch nh. foreach (string plugin in pluginList.Keys) {

this.LoadPlugin((string)pluginList[plugin], plugin); } }

// Np assembly v to plug-in c ch nh. public bool LoadPlugin(string assemblyName, string pluginName) {

try {

// Np assembly. Assembly assembly = Assembly.Load(assemblyName);

// To plug-in mi. IPlugin plugin =

99 Chng 3: Min ng dng, c ch phn chiu, v siu d liu (IPlugin)assembly.CreateInstance(pluginName, true);

if (plugin != null) {

// Thm plug-in mi vo ListDictionary. plugins[pluginName] = plugin;

return true;

} else { return false; } } catch { return false; } }

public void StartPlugin(string plugin) {

// Ly mt plug-in t ListDictionary v // gi phng thc Start. ((IPlugin)plugins[plugin]).Start(); }

100 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

public void StopPlugin(string plugin) {

// Ly mt plug-in t ListDictionary v // gi phng thc Stop. ((IPlugin)plugins[plugin]).Stop(); }

public ArrayList GetPluginList() {

// Tr v danh sch cc plug-in. return new ArrayList(plugins.Keys); } } public class CreateInstanceExample { public static void Main() { // To mt min ng dng mi. AppDomain domain1 = AppDomain.CreateDomain("NewAppDomain1");

// To mt PluginManager trong min ng dng mi // bng phng thc khi dng mc nh. PluginManager manager1 = (PluginManager)domain1.CreateInstanceAndUnwrap( "CreateInstanceExample", "PluginManager");

// Np mt plug-in mi vo NewAppDomain1. manager1.LoadPlugin("CreateInstanceExample", "SimplePlugin");

// Chy v dng plug-in trong NewAppDomain1. manager1.StartPlugin("SimplePlugin"); manager1.StopPlugin("SimplePlugin");

// To mt min ng dng mi. AppDomain domain2 = AppDomain.CreateDomain("NewAppDomain2");

101 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

// To mt ListDictionary cha cc plug-in. ListDictionary pluginList = new ListDictionary(); pluginList["SimplePlugin"] = "CreateInstanceExample";

// To mt PluginManager trong min ng dng mi // v ch nh danh sch cc plug-in. PluginManager manager2 = (PluginManager)domain1.CreateInstanceAndUnwrap( "CreateInstanceExample", "PluginManager", true, 0, null, new object[] {pluginList}, null, null, null); // Hin th cc plug-in c np vo NewAppDomain2. Console.WriteLine("Plugins in NewAppDomain2:"); foreach (string s in manager2.GetPluginList()) { Console.WriteLine(" - " + s); } // Nhn Enter thot. Console.ReadLine(); } }

8.

Truyn d liu gia cc min ng dng


Bn cn mt c ch n gin truyn d liu trng thi hay cu hnh gia cc min ng dng. Dng cc phng thc SetData v GetData ca lp AppDomain.

D liu c th c truyn qua cc min ng dng nh i s hay tr tr v khi bn cho gi cc thnh vin ca cc i tng hin c trong cc min ng dng. Vic truyn d liu qua cc min ng dng c thc hin d dng ging nh truyn d liu trong cng mt min ng dng. Mi min ng dng u duy tr mt vung m d liu (data cache) cha mt tp cc cp tn/gi tr. Hu ht ni dung ca vung m d liu phn nh cc thit lp cu hnh ca min ng dng, nh cc gi tr t i tng AppDomainSetup c cung cp trong qu trnh to min ng dng (xem mc 3.1). Vung m d liu ny c th c s dng trao i d liu gia cc min ng dng hay lu tr cc gi tr tm thi dng trong cng mt min ng dng. Phng thc SetData thc hin vic kt hp mt kha dng chui vi mt i tng v lu tr n vo vng m d liu ca min ng dng. Phng thc GetData thc hin cng vic ngc li l ly li i tng t vng m d liu thng qua kha. Nu m lnh trong mt

102 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

min ng dng gi phng thc SetData hay GetData truy xut vung m d liu ca min ng dng khc, th i tng d liu phi h tr ng ngha marshal-by-value hay marshal-byreference, nu khng th ngoi l System.Runtime.Serialization.SerializationException s b nm (xem mc 3.3 bit thm chi tit v cch truyn i tng qua cc min ng dng). on m sau trnh by cch s dng phng thc SetData v GetData truyn mt System.Collections.ArrayList gia hai min ng dng.
using System; using System.Reflection; using System.Collections; public class ListModifier { public ListModifier () { // Nhn danh sch t m d liu. ArrayList list = (ArrayList)AppDomain.CurrentDomain.GetData("People"); // Thay i danh sch. list.Add("Tam"); } } public class PassDataExample { public static void Main() { // To mt min ng dng mi. AppDomain domain = AppDomain.CreateDomain("Test"); // To mt ArrayList v thm thng tin vo. ArrayList list = new ArrayList(); list.Add("Phuong"); list.Add("Phong"); list.Add("Nam"); // t danh sch vo vng m d liu ca min ng dng mi. domain.SetData("People", list);

103 Chng 3: Min ng dng, c ch phn chiu, v siu d liu // To mt ListModifier trong min ng dng mi // s thay i ni dung ca list trong vng m d liu. domain.CreateInstance("03-08", "ListModifier"); // Nhn li danh sch v hin th ni dung ca n. foreach (string s in (ArrayList)domain.GetData("People")) { Console.WriteLine(s); } // Nhn Enter thot. Console.ReadLine(); } }

9.

Gii phng assembly v min ng dng


Bn cn gii phng cc assembly hay cc min ng dng lc thc thi. Khng c cch no gii phng cc assembly ring l. Bn c th gii phng ton b mt min ng dng bng phng thc tnh AppDomain.Unload, ng thi vi vic gii phng min ng dng l tt c cc assembly c np vo min ng dng cng c gii phng.

Cch duy nht gii phng mt assembly l gii phng c min ng dng m n c np vo. ng tic, vic gii phng mt min ng dng cng s gii phng lun tt c cc assembly c np vo . y l mt gii hn yu cu bn phi t chc v qun l tt cu trc min ng dng v assembly. Khi gii phng mt min ng dng bng phng thc tnh AppDomain.Unload, bn cn truyn cho n mt tham chiu AppDomain n min ng dng cn gii phng. Bn khng th gii phng min ng dng mc nh do CLR to lc startup. on m di y trnh by cch s dng phng thc Unload.
// To mt min ng dng mi. AppDomain newDomain = AppDomain.CreateDomain("New Domain"); // Np assembly vo min ng dng my. // Gii phng min ng dng. AppDomain.Unload(newDomain);

Phng thc Unload chn cc tiu trnh mi i vo min ng dng c ch nh v gi phng thc Thread.Abort trn tt c cc tiu trnh hin ang chy trong min ng dng ny. Nu tiu trnh gi phng thc Unload hin ang chy trong min ng dng cn gii phng th mt tiu trnh khc s c khi chy thc hin qu trnh gii phng. Nu c vn trong

104 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

vic gii phng min ng dng, ngoi l System.CannotUnloadAppDomainException s b nm bi tiu trnh thc hin qu trnh gii phng. Trong khi min ng dng ang c gii phng, CLR gi thc thi cc phng thc gii phng ca tt c cc i tng trong min ng dng. Ty thuc vo s lng i tng v bn cht ca cc phng thc gii phng m qu trnh ny c th mt mt khong thi gian no . Phng thc AppDomain.IsFinalizingForUnload tr v true nu min ng dng ang c gii phng v CLR bt u gii phng cc i tng trong ; ngc li, tr v false.

10.

S dng mt trong cc cch sau:

Truy xut thng tin Type


Bn mun thu ly i tng System.Type m t mt kiu d liu nht nh. Ton t typeof Phng thc tnh GetType ca lp System.Type Phng thc GetType thuc mt th hin ca kiu Phng thc GetNestedType hay GetNestedTypes ca lp Type Phng thc GetType hay GetTypes ca lp Assembly Phng thc GetType, GetTypes, hay FindTypes ca lp System.Reflection.
Module

i tng Type cung cp mt im khi u lm vic vi cc kiu d liu bng c ch phn chiu. Mt i tng Type cho php bn kim tra siu d liu ca kiu, thu ly cc thnh vin ca kiu, v to cc i tng ca kiu. Do tm quan trng ca n, .NET Framework cung cp nhiu c ch ly tham chiu n cc i tng Type. Phng php hiu qu nht thu ly i tng Type cho mt kiu c th l s dng ton t typeof:
System.Type t1 = typeof(System.Text.StringBuilder);

Tn kiu khng c t trong du nhy kp v phai kha phn giai i vi trnh bin dch. V tham chiu c phn gii lc bin dch nn assembly cha kiu ny tr thnh phn ph thuc tnh cua assembly v s c lit k nh th trong assembly manifest ca bn. Mt cch khc l s dng phng thc tnh Type.GetType, nhn vo mt chui cha tn kiu. V s dng chui ch nh kiu nn bn c th thay i n lc thc thi, iu ny m ra cnh ca n vi th gii lp trnh ng bng c ch phn chiu (xem mc 3.12). Nu bn ch nh tn kiu, b thc thi phi tm kiu ny trong mt assembly c np. Bn cng c th ch nh mt tn kiu theo tiu chun assembly (tham kho ti liu .NET Framework SDK v phng thc Type.GetType bit cch kt cu tn kiu theo tiu chun assembly). Cc lnh sau trnh by cch s dng phng thc GetType:
// C phn bit ch hoa-thng, tr v null nu khng tm thy. Type t2 = Type.GetType("System.String");

105 Chng 3: Min ng dng, c ch phn chiu, v siu d liu // C phn bit ch hoa-thng, // nm ngoi l TypeLoadException nu khng tm thy. Type t3 = Type.GetType("System.String", true); // Khng phn bit ch hoa-thng, // nm ngoi l TypeLoadException nu khng tm thy. Type t4 = Type.GetType("system.string", true, true);

// Tn kiu theo tiu chun assembly. Type t5 = Type.GetType("System.Data.DataSet,System.Data," + "Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089");

thu ly i tng Type m t kiu ca mt i tng hin c, hy s dng phng thc GetType, c hin thc bi Object v c tha k bi tt c cc kiu d liu. Di y l mt v d:
System.Text.StringBuilder sb = new System.Text.StringBuilder(); Type t6 = sb.GetType();

Bng 3.2 tm tt cc phng thc khc cng cung cp kh nng truy xut i tng Type.
Bng 3.2 Cc phng thc tr v i tng Type Phng thc Type.GetNestedType Type.GetNestedTypes Assembly.GetType Assembly.GetTypes Module.GetType Module.GetTypes M t

Ly i tng Type m t mt kiu lng bn trong i tng Type hin c Ly mt mng cc i tng Type m t cc kiu lng bn trong i tng Type hin c Ly i tng Type m t mt kiu c khai bo bn trong assembly Ly mt mng cc i tng Type m t cc kiu c khai bo bn trong assembly Ly i tng Type m t mt kiu c khai bo bn trong module Ly mt mng cc i tng Type m t cc kiu c khai bo bn trong module Ly mt mng c lc, cha cc i tng Type m t cc kiu c khai bo bn trong modulecc kiu ny c lc bng mt delegate (xc nh xem mi Type c xut hin trong mng ch hay khng)

Module.FindTypes

106 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

11.

Kim tra kiu ca mt i tng


Bn mun kim tra kiu ca mt i tng. S dng phng thc tha k Object.GetType thu ly Type cho i tng ny. Trong vi trng hp, bn cng c th s dng ton t is v as kim tra kiu ca mt i tng.

Tt c cc kiu d liu u tha k phng thc GetType t lp c s Object. Nh c tho lun trong mc 3.10, phng thc ny tr v mt tham chiu Type m t kiu ca i tng. B thc thi duy tr mt i tng Type cho mi kiu c np v tt c cc tham chiu cho kiu ny cng ch n i tng ny. iu ny ngha l bn c th so snh hai tham chiu kiu mt cch hiu qu. V d di y trnh by cch kim tra mt i tng c phi l System.IO.StringReader hay khng:
// To mt StringReader th nghim. Object someObject = new StringReader("This is a StringReader"); // Kim tra xem someObject c phi l mt StringReader hay khng // bng cch thu ly v so snh tham chiu Type (s dng ton t typeof). if (typeof(System.IO.StringReader) == someObject.GetType()) { // Lm g . }

C# cung cp ton t is thc hin nhanh vic kim tra nh trn. Ngoi ra, is s tr v true nu i tng cn kim tra dn xut t lp c ch nh. on m di y kim tra xem someObject l mt th hin ca System.IO.TextReader, hay mt lp dn xut t TextReader (nh StringReader):
// Kim tra xem someObject l TextReader, // hay dn xut t TextReader bng ton t is. if (someObject is System.IO.TextReader) { // Lm g . }

C hai cch ny u i hi kiu dng vi ton t typeof v is phi l kiu bit v kh phn gii lc bin dch. Mt cch khc linh hot hn (nhng chm hn) l s dng phng thc Type.GetType tr v mt tham chiu Type cho kiu c ch nh. Tham chiu Type khng c phn gii cho n khi thc thi, vic ny nh hng n hiu nng, nhng cho php bn thay i php so snh kiu lc thc thi da trn gi tr ca mt chui. Phng thc IsType di y s tr v true nu i tng thuc kiu c ch nh v s dng phng

107 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

thc Type.IsSubclassOf kim tra i tng ny c phi l mt lp con ca kiu c ch nh hay khng.
public static bool IsType(object obj, string type) { Type t = Type.GetType(type, true, true); return t == obj.GetType() || obj.GetType().IsSubclassOf(t); }

Cui cng, bn c th s dng ton t as p bt k i tng no sang kiu c ch nh. Nu i tng khng th b p sang kiu c ch nh, ton t as s tr v null. iu ny cho php bn thc hin cc php p kiu an ton (safe cast), nhng kiu c so snh phi l kh phn gii lc thc thi. Di y l mt v d:
// S dng ton t as thc hin mt php p kiu an ton. StringReader reader = someObject as System.IO.StringReader; if (reader != null) { // Lm g . }

Phng thc tnh GetUnderlyingType ca lp System.Enum cho php bn thu ly kiu thc s ca mt kiu lit k.

12.

To mt i tng bng c ch phn chiu


Bn cn to mt i tng bng c ch phn chiu. Thu ly i tng Type m t kiu ca i tng cn to, gi phng thc GetConstructor ca n c c i tng System.Reflection.ConstructorInfo m t phng thc khi dng cn dng, sau thc thi phng thc ConstructorInfo.Invoke.

Bc u tin trong vic to mt i tng bng c ch phn chiu l thu ly i tng Type m t kiu ca i tng cn to (xem mc 3.10 bit thm chi tit). Khi c c i tng Type, hy gi phng thc GetConstructor thu ly i tng ConstructorInfo m t mt trong cc phng thc khi dng ca kiu ny. Dng thc thng dng nht ca phng thc GetConstructor l nhn mt mng Type lm i s, v tr v i tng ConstructorInfo m t phng thc khi dng nhn cc i s c ch nh trong mng Type. thu ly i tng ConstructorInfo m t phng thc khi dng mc nh (khng c i s), bn hy truyn cho phng thc GetConstructor mt mng Type rng (s dng trng tnh Type.EmptyTypes); ng s dng null, nu khng GetConstructor s nm ngoi l System.ArgumentNullException. Nu GetConstructor khng tm thy phng thc khi dng no c ch k ph hp vi cc i s c ch nh th n s tr v null.

108 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

Mt khi c i tng ConstructorInfo nh mong mun, hy gi phng thc Invoke ca n. Bn phi cung cp mt mng cha cc i s m bn mun truyn cho phng thc khi dng. Phng thc Invoke s to i tng mi v tr v mt tham chiu n i tng (bn phi p v kiu ph hp). Di y l on m trnh by cch to mt i tng System.Text.StringBuilder, ch nh ni dung ban u cho StringBuilder v sc cha ca n.
// Thu ly i tng Type cho lp StringBuilder. Type type = typeof(System.Text.StringBuilder); // To Type[] cha cc i tng Type cho mi i s // ca phng thc khi dng (mt chui v mt s nguyn). Type[] argTypes = new Type[] {typeof(System.String), typeof(System.Int32)}; // Thu ly i tng ConstructorInfo. ConstructorInfo cInfo = type.GetConstructor(argTypes); // To object[] cha cc i s cho phng thc khi dng. object[] argVals = new object[] {"Some string", 30}; // To i tng v p n v kiu StringBuilder. StringBuilder sb = (StringBuilder)cInfo.Invoke(argVals);

Chc nng phn chiu thng c s dng hin thc cc factory. Trong , bn s dng c ch phn chiu th hin ha cc lp tha k mt lp c s ph bin hay hin thc mt giao din ph bin. Thng thng, c lp c s chung v giao din chung u c s dng. Lp c s tru tng s hin thc giao din v bt k chc nng chung no, sau mi hin thc c th s tha k lp c s. Khng c c ch no khai bo rng mi lp c th phi hin thc cc phng thc khi dng vi cc ch k c th. Nu mun ngi khc (hng th ba) hin thc cc lp c th th bn phi ch r (trong ti liu hng dn) ch k ca phng thc khi dng m factory ca bn gi. Cch thng thng trnh vn ny l s dng phng thc khi dng mc nh (khng c i s), sau cu hnh i tng bng phng thc v thuc tnh. V d di y s hin thc mt factory dng to cc i tng c hin thc giao din IPlugin.
using System; using System.Reflection; // Giao din chung m tt c cc plug-in phi hin thc. public interface IPlugin { string Description { get; set; }

109 Chng 3: Min ng dng, c ch phn chiu, v siu d liu void Start(); void Stop(); } // Lp c s tru tng m tt c cc plug-in phi dn xut t y. public abstract class AbstractPlugin : IPlugin { // Chui cha li m t plug-in. private string description = ""; // Thuc tnh dng ly li m t plug-in. public string Description { get { return description; } set { description = value; } } // Khai bo cc thnh vin ca giao din IPlugin. public abstract void Start(); public abstract void Stop(); } // Mt hin thc n gin cho giao din IPlugin // minh ha lp PluginFactory. public class SimplePlugin : AbstractPlugin { // Hin thc phng thc Start. public override void Start() { Console.WriteLine(Description } // Hin thc phng thc Stop. public override void Stop() { Console.WriteLine(Description + ": Stopping..."); } } // Factory dng to cc i tng ca IPlugin. public sealed class PluginFactory { public static IPlugin CreatePlugin(string assembly, + ": Starting...");

110 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

string pluginName, string description) { // Thu ly i tng Type cho plug-in c ch nh. Type type = Type.GetType(pluginName + ", " + assembly); // Thu ly i tng ConstructorInfo. ConstructorInfo cInfo = type.GetConstructor(Type.EmptyTypes); // To i tng v p n v kiu StringBuilder. IPlugin plugin = (IPlugin)cInfo.Invoke(null); // Cu hnh IPlugin mi. plugin.Description = description; return plugin; } }

Cu lnh sau y s to i tng SimplePlugin bng lp PluginFactory:


IPlugin plugin = PluginFactory.CreatePlugin( "CreateObjectExample", "SimplePlugin", "A Simple Plugin" ); // Tn assembly // Tn lp plug-in // Li m t plug-in

Lp System.Activator cung cp hai phng thc tnh CreateInstance v CreateInstanceFrom dng to cc i tng da trn i tng Type hay chui cha tn kiu. Xem ti liu .NET Framework SDK bit thm chi tit.

13.

Bn cn to ra mt c tnh theo bn.

To mt c tnh ty bin
To mt lp dn xut t lp c s tru tng System.Attribute. Hin thc cc phng thc khi dng, cc trng, v cc thuc tnh cho php ngi dng cu hnh c tnh. S dng System.AttributeUsageAttribute nh ngha: Nhng phn t chng trnh no l ch ca c tnh Bn c th p dng nhiu th hin ca c tnh cho mt phn t chng trnh hay khng

111 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

c tnh c c tha k bi cc kiu dn xut hay khng

c tnh cung cp mt c ch tng qut cho vic kt hp thng tin khai bo (siu d liu) vi cc phn t chng trnh. Siu d liu ny nm trong assembly c bin dch, cho php cc chng trnh thu ly n thng qua c ch phn chiu lc thc thi (xem mc 3.14.) Cc chng trnh khc, c bit l CLR, s dng thng tin ny xc nh cch thc tng tc v qun l cc phn t chng trnh. to mt c tnh ty bin th hy dn xut mt lp t lp c s tru tng System.Attribute. Cc lp c tnh ty bin phi l public v c tn kt thc bng Attribute. Mt c tnh ty bin phi c t nht mt phng thc khi dng cng khai. Cc i s ca phng thc khi dng s tr thnh cc i s v tr (positional parameter) ca c tnh. Nh vi bt k lp no khc, bn c th khai bo nhiu phng thc khi dng, cho php ngi dng ty chn s dng cc tp khc nhau ca cc i s v tr khi p dng c tnh. Bt k thuc tnh v trng c/ghi cng khai no do c tnh khai bo u tr thnh i s c nu tn (named parameter). iu khin cch thc ngi dng p dng c tnh, hay p dng c tnh AttributeUsageAttribute cho c tnh ty bin ca bn. c tnh AttributeUsageAttribute h tr mt i s v tr v hai i s c nu tn, c m t trong bng 3.3. Cc gi tr mc nh ch nh gi tr s c p dng cho c tnh ty bin ca bn nu bn khng p dng AttributeUsageAttribute hoc khng ch nh gi tr cho mt thng s.
Bng 3.3 Cc thnh vin thuc kiu lit k AttributeUsage Thng s Kiu M t Mc nh

ValidOn

v tr

Mt thnh vin thuc kiu lit k System.AttributeTargets, ch nh phn t chng trnh m c tnh s c hiu lc trn . c tnh c th c ch nh nhiu ln cho mt phn t hay khng. c tnh c c tha k bi cc lp dn xut hay cc thnh vin c chp hay khng.

AttributeTargets.All

AllowMultiple

c nu tn c nu tn

false

Inherited

true

V d di y trnh by cch to mt c tnh ty bin c tn l AuthorAttribute, cho php bn xc nh tn v cng ty ca ngi to ra lp hay assembly. AuthorAttribute khai bo mt phng thc khi dng cng khai, nhn mt chui cha tn tc gi. iu ny yu cu ngi s dng AuthorAttribute phi lun cung cp mt i s v tr cha tn tc gi. Company l thuc tnh cng khai (c th dng lm i s c nu tn), Name l thuc tnh ch-c (khng th dng lm i s c nu tn).
using System;

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)] public class AuthorAttribute : System.Attribute {

112 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

private string company; // Cng ty ca tc gi private string name; // Tn tc gi

// Khai bo phng thc khi dng cng khai. public AuthorAttribute(string name) { this.name = name; company = ""; }

// Khai bo thuc tnh Company c quyn set/get. public string Company { get { return company; } set { company = value; } }

// Khai bo thuc tnh Name ch-c. public string Name{ get { return name;} } }

Di y l cch s dng AuthorAttribute:


// Khai bo Square Nguyen l tc gi ca assembly. [assembly:Author("Square Nguyen", Company = "Goldsoft Ltd.")]

// Khai bo Square Nguyen l tc gi ca lp. [Author("Square Nguyen", Company = "Goldsoft Ltd.")] public class SomeClass { }

// Khai bo Stephen Chow l tc gi ca lp. [Author("Stephen Chow")] public class SomeOtherClass {

113 Chng 3: Min ng dng, c ch phn chiu, v siu d liu }

14.

S dng c ch phn chiu kim tra cc c tnh ca mt phn t chng trnh


Bn mun s dng c ch phn chiu kim tra cc c tnh ty bin c p dng cho mt phn t chng trnh. Gi phng thc GetCustomAttributes ca i tng dn xut t lp System.Reflection.MemberInfo (i tng ny m t phn t chng trnh cn kim tra).

Tt c cc lp m t cc phn t chng trnh u dn xut t lp MemberInfo. Lp ny bao gm Type, EventInfo, FieldInfo, PropertyInfo, v MethodBase. MethodBase c thm hai lp con: ConstructorInfo v MethodInfo. Bn c th gi phng thc GetCustomAttributes nu c c bt k i tng no ca cc lp ny. Phng thc ny s tr v mng cha cc c tnh ty bin c p dng cho phn t chng trnh. Ch l mng ny ch cha cc c tnh ty bin ch khng cha cc c tnh c sn trong th vin cc lp c s ca .NET Framework. Phng thc GetCustomAttributes c hai dng thc. Dng u tin nhn mt i s bool xc nh phng thc ny c tr v cc c tnh c tha k t cc lp cha hay khng. Dng th hai nhn thm mt i s Type c vai tr nh mt b lc, kt qu tr v l cc c tnh thuc kiu c ch nh bi Type. V d sau s dng c tnh ty bin AuthorAttribute c khai bo trong mc 3.13 v p dng n vo lp GetCustomAttributesExample. Phng thc Main s gi phng thc GetCustomAttributes, lc cc c tnh kt qu tr v ch c cc th hin ca AuthorAttribute. Bn c th thc hin p kiu an ton cc c tnh ny v tham chiu AuthorAttribute v truy xut cc thnh vin ca chng m khng cn s dng c ch phn chiu.
using System;

[Author("Stephen Chau")] [Author("Square Nguyen", Company = "Goldsoft Ltd.")] public class GetCustomAttributesExample {

public static void Main() {

// Ly i tng Type cho chnh lp ny. Type type = typeof(GetCustomAttributesExample);

// Ly cc c tnh cho kiu ny. S dng b lc // kt qu tr v ch c cc th hin ca AuthorAttribute.

114 Chng 3: Min ng dng, c ch phn chiu, v siu d liu

object[] attrs = type.GetCustomAttributes(typeof(AuthorAttribute), true);

// Lit k cc c tnh. foreach (AuthorAttribute a in attrs) { Console.WriteLine(a.Name + ", " + a.Company); }

// Nhn Enter kt thc. Console.ReadLine(); } }

115

Chng 4:TIU TRNH, TIN TRNH, V S NG B

116

117 Chng 4: Tiu trnh, tin trnh, v s ng b

t trong nhng im mnh ca h iu hnh Microsoft Windows l cho php nhiu chng trnh (tin trnhprocess) chy ng thi v cho php mi tin trnh thc hin nhiu tc v ng thi (bng nhiu tiu trnhthread). Chng ny s trnh by cch kim sot cc tin trnh v cc tiu trnh trong cc ng dng da vo cc tnh nng do th vin lp .NET Framework cung cp. Cc mc trong chng ny s trnh by cch thc hin cc vn sau:

S dng cc k thut v cc tnh nng khc nhau ca .NET Framework to cc tiu


trnh mi (mc 4.1 n 4.5).

Kim sot qu trnh thc thi ca mt tiu trnh bit c khi no n kt thc (mc
4.6 v 4.7).

ng b ha qu trnh thc thi ca nhiu tiu trnh (mc 4.8 v 4.9). Chy v dng cc tin trnh mi (mc 4.10 v 4.11). Bo m rng ti mt thi im ch c th chy mt th hin ca ng dng (mc 4.12).

1.

Thc thi phng thc vi thread-pool


Bn cn thc thi mt phng thc bng mt tiu trnh trong thread-pool ca b thc thi. Khai bo mt phng thc cha m lnh cn thc thi; phng thc ny phi tr v void v ch nhn mt i s. Sau , to mt th hin ca y nhim System.Threading.WaitCallback tham chiu n phng thc ny. Tip tc, gi phng thc tnh QueueUserWorkItem ca lp System.Threading.ThreadPool, v truyn th hin y nhim to lm i s. B thc thi s xp th hin y nhim ny vo hng i v thc thi n khi mt tiu trnh trong thread-pool sn sng.

Nu ng dng s dng nhiu tiu trnh c thi gian sng ngn hay duy tr mt s lng ln cc tiu trnh ng thi th hiu nng c th gim st bi cc chi ph cho vic to, vn hnh v hy cc tiu trnh. Ngoi ra, trong mt h thng h-tr-a-tiu-trnh, cc tiu trnh thng trng thi ri sut mt khong thi gian di ch iu kin thc thi ph hp. Vic s dng thread-pool s cung cp mt gii php chung nhm ci thin tnh quy m v hiu nng ca cc h thng h-tr-a-tiu-trnh. .NET Framework cung cp mt hin thc n gin cho thread-pool m chng ta c th truy xut thng qua cc thnh vin tnh ca lp ThreadPool. Phng thc QueueUserWorkItem cho php bn thc thi mt phng thc bng mt tiu trnh trong thread-pool (t cng vic vo hng i). Mi cng vic c m t bi mt th hin ca y nhim WaitCallback (tham chiu n phng thc cn thc thi). Khi mt tiu trnh trong thread-pool sn sng, n nhn cng vic k tip t hng i v thc thi cng vic ny. Khi hon tt cng vic, thay v kt thc, tiu trnh ny quay v thread-pool v nhn cng vic k tip t hng i. Vic s dng thread-pool ca b thc thi gip n gin ha vic lp trnh h-tr-a-tiu-trnh. Tuy nhin, cn lu y l thread-pool c hin thc n gin, ch nhm mc ch s dng chung. Trc khi quyt nh s dng thread-pool ny, cn xem xt cc im sau:

118 Chng 4: Tiu trnh, tin trnh, v s ng b

B thc thi quy nh s tiu trnh ti a c cp cho thread-pool; bn khng th thay i s ti a ny bng cc tham s cu hnh hay t bn trong m c-qun-l. Gii hn mc nh l 25 tiu trnh cho mi CPU trong h thng. S tiu trnh ti a trong thread-pool khng gii hn s cc cng vic ang ch trong hng i. Cng nh vic cho php bn s dng thread-pool thc thi m lnh mt cch trc tip, b thc thi cn s dng thread-pool cho nhiu mc ch bn trong, bao gm vic thc thi phng thc mt cch bt ng b (xem mc 4.2) v thc thi cc s kin nh thi (xem mc 4.3). Tt c cc cng vic ny c th dn n s tranh chp gia cc tiu trnh trong thread-pool; ngha l hng i c th tr nn rt di. Mc d di ti a ca hng i ch b gii hn bi s lng b nh cn li cho tin trnh ca b thc thi, nhng hng i qu di s lm ko di qu trnh thc thi ca cc cng vic trong hng i. Bn khng nn s dng thread-pool thc thi cc tin trnh chy trong mt thi gian di. V s tiu trnh trong thread-pool l c gii hn, nn ch mt s t tiu trnh thuc cc tin trnh loi ny cng s nh hng ng k n ton b hiu nng ca threadpool. c bit, bn nn trnh t cc tiu trnh trong thread-pool vo trng thi i trong mt thi gian qu di. Bn khng th iu khin lch trnh ca cc tiu trnh trong thread-pool, cng nh khng th thay i u tin ca cc cng vic. Thread-pool x l cc cng vic theo th t nh khi bn thm chng vo hng i. Mt khi cng vic c t vo hng i th bn khng th hy hay dng n.

V d di y trnh by cch s dng lp ThreadPool thc thi mt phng thc c tn l DisplayMessage. V d ny s truyn DisplayMessage n thread-pool hai ln, ln u khng c i s, ln sau c i s l i tng MessageInfo (cho php kim sot thng tin m tiu trnh s hin th).
using System; using System.Threading;

// Lp dng truyn d liu cho phng thc DisplayMessage // khi n c thc thi bng thread-pool. public class MessageInfo {

private int iterations; private string message;

// Phng thc khi dng nhn cc thit lp cu hnh cho tiu trnh. public MessageInfo(int iterations, string message) {

this.iterations = iterations;

119 Chng 4: Tiu trnh, tin trnh, v s ng b this.message = message; }

// Cc thuc tnh dng ly cc thit lp cu hnh. public int Iterations { get { return iterations; } } public string Message { get { return message; } } }

public class ThreadPoolExample {

// Hin th thng tin ra ca s Console. public static void DisplayMessage(object state) {

// p i s state sang MessageInfo. MessageInfo config = state as MessageInfo;

// Nu i s config l null, khng c i s no c // truyn cho phng thc ThreadPool.QueueUserWorkItem; // s dng cc gi tr mc nh. if (config == null) {

// Hin th mt thng bo ra ca s Console ba ln. for (int count = 0; count < 3; count++) {

Console.WriteLine("A thread-pool example.");

// Vo trng thi ch, dng cho mc ch minh ha. // Trnh a cc tiu trnh ca thread-pool // vo trng thi ch trong cc ng dng thc t. Thread.Sleep(1000); }

} else {

// Hin th mt thng bo c ch nh trc // vi s ln cng c ch nh trc. for (int count = 0; count < config.Iterations; count++) {

120 Chng 4: Tiu trnh, tin trnh, v s ng b

Console.WriteLine(config.Message);

// Vo trng thi ch, dng cho mc ch minh ha. // Trnh a cc tiu trnh ca thread-pool // vo trng thi ch trong cc ng dng thc t. Thread.Sleep(1000); } } }

public static void Main() {

// To mt i tng y nhim, cho php chng ta // truyn phng thc DisplayMessage cho thread-pool. WaitCallback workMethod = new WaitCallback(ThreadPoolExample.DisplayMessage);

// Thc thi DisplayMessage bng thread-pool (khng c i s). ThreadPool.QueueUserWorkItem(workMethod);

// Thc thi DisplayMessage bng thread-pool (truyn mt // i tng MessageInfo cho phng thc DisplayMessage). MessageInfo info = new MessageInfo(5, "A thread-pool example with arguments.");

ThreadPool.QueueUserWorkItem(workMethod, info);

// Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

121 Chng 4: Tiu trnh, tin trnh, v s ng b

2.

Thc thi phng thc mt cch bt ng b


Bn cn thc thi mt phng thc v tip tc thc hin cc cng vic khc trong khi phng thc ny vn chy trong mt tiu trnh ring bit. Sau khi phng thc hon tt, bn cn ly tr tr v ca n. Khai bo mt y nhim c ch k ging nh phng thc cn thc thi. Sau , to mt th hin ca y nhim tham chiu n phng thc ny. Tip theo, gi phng thc BeginInvoke ca th hin y nhim thc thi phng thc ca bn. K n, s dng phng thc EndInvoke kim tra trng thi ca phng thc cng nh thu ly tr tr v ca n nu hon tt.

Khi cho gi mt phng thc, chng ta thng thc hin mt cch ng b; ngha l m lnh thc hin li gi phi i vo trng thi dng (block) cho n khi phng thc c thc hin xong. y l cch cn thit khi m lnh yu cu qu trnh thc thi phng thc phi hon tt trc khi n c th tip tc. Tuy nhin, trong mt s trng hp, bn li cn thc thi phng thc mt cch bt ng b; ngha l bn cho thc thi phng thc ny trong mt tiu trnh ring trong khi vn tip tc thc hin cc cng vic khc. .NET Framework h tr ch thc thi bt ng b, cho php bn thc thi bt k phng thc no mt cch bt ng b bng mt y nhim. Khi khai bo v bin dch mt y nhim, trnh bin dch s t ng sinh ra hai phng thc h tr ch thc thi bt ng b: BeginInvoke v EndInvoke. Khi bn gi phng thc BeginInvoke ca mt th hin y nhim, phng thc c tham chiu bi y nhim ny c xp vo hng i thc thi bt ng b. Quyn kim sot qu trnh thc thi c tr v cho m gi BeginInvoke ngay sau , v phng thc c tham chiu s thc thi trong ng cnh ca tiu trnh sn sng trc tin trong thread-pool. Cc i s ca phng thc BeginInvoke gm cc i s c ch nh bi y nhim, cng vi hai i s dng khi phng thc thc thi bt ng b kt thc. Hai i s ny l: Mt th hin ca y nhim System.AsyncCallback tham chiu n phng thc m b thc thi s gi khi phng thc thc thi bt ng b kt thc. Phng thc ny s c thc thi trong ng cnh ca mt tiu trnh trong thread-pool. Truyn gi tr null cho i s ny ngha l khng c phng thc no c gi v bn phi s dng mt c ch khc xc nh khi no phng thc thc thi bt b kt thc (s c tho lun bn di). Mt tham chiu i tng m b thc thi s lin kt vi qu trnh thc thi bt ng b. Phng thc thc thi bt ng b khng th s dng hay truy xut n i tng ny, nhng m lnh ca bn c th s dng n khi phng thc ny kt thc, cho php bn lin kt thng tin trng thi vi qu trnh thc thi bt ng b. V d, i tng ny cho php bn nh x cc kt qu vi cc thao tc bt ng b c khi to trong trng hp bn khi to nhiu thao tc bt ng b nhng s dng chung mt phng thc callback x l vic kt thc.

Phng thc EndInvoke cho php bn ly tr tr v ca phng thc thc thi bt ng b, nhng trc ht bn phi xc nh khi no n kt thc. Di y l bn k thut dng xc nh mt phng thc thc thi bt ng b kt thc hay cha:

122 Chng 4: Tiu trnh, tin trnh, v s ng b

Blockingdng qu trnh thc thi ca tiu trnh hin hnh cho n khi phng thc thc thi bt ng b kt thc. iu ny rt ging vi s thc thi ng b. Tuy nhin, nu linh hot chn thi im chnh xc a m lnh ca bn vo trng thi dng (block) th bn vn cn c hi thc hin thm mt s vic trc khi m lnh i vo trng thi ny. Pollinglp i lp li vic kim tra trng thi ca phng thc thc thi bt ng b xc nh n kt thc hay cha. y l mt k thut rt n gin, nhng nu xet v mt x ly thi khng c hiu qua. Bn nn trnh cc vng lp cht lm lng ph thi gian ca b x l; tt nht l nn t tiu trnh thc hin polling vo trng thi ngh (sleep) trong mt khong thi gian bng cch s dng Thread.Sleep gia cc ln kim tra trng thi. Bi ky thut polling oi hoi bn phai duy tri mt vong lp nn hot ng cua tiu trnh ch se bi gii hn, tuy nhin bn co th d dng cp nht tin cng vic. Waitings dng mt i tng dn xut t lp System.Threading.WaitHandle bo hiu khi phng thc thc thi bt ng b kt thc. Waiting l mt ci tin ca k thut polling, n cho php bn ch nhiu phng thc thc thi bt ng b kt thc. Bn cng c th ch nh cc gi tr time-out cho php tiu trnh thc hin waiting dng li nu phng thc thc thi bt ng b din ra qu lu, hoc bn mun cp nht nh k b ch trng thi. CallbacksCallback l mt phng thc m b thc thi s gi khi phng thc thc thi bt ng b kt thc. M lnh thc hin li gi khng cn thc hin bt k thao tc kim tra no, nhng vn c th tip tc thc hin cc cng vic khc. Callback rt linh hot nhng cng rt phc tp, c bit khi c nhiu phng thc thc thi bt ng b chy ng thi nhng s dng cng mt callback. Trong nhng trng hp nh th, bn phi s dng cc i tng trng thi thch hp so trng cc phng thc hon tt vi cc phng thc khi to.

Lp AsyncExecutionExample trong v d di y m t c ch thc thi bt ng b. N s dng mt y nhim c tn l AsyncExampleDelegate thc thi bt ng b mt phng thc c tn l LongRunningMethod. Phng thc LongRunningMethod s dng Thread.Sleep m phng mt phng thc c thi gian thc thi di.
// y nhim cho php bn thc hin vic thc thi bt ng b // ca AsyncExecutionExample.LongRunningMethod. public delegate DateTime AsyncExampleDelegate(int delay, string name);

// Phng thc c thi gian thc thi di. public static DateTime LongRunningMethod(int delay, string name) {

Console.WriteLine("{0} : {1} example - thread starting.", DateTime.Now.ToString("HH:mm:ss.ffff"), name);

123 Chng 4: Tiu trnh, tin trnh, v s ng b // M phng vic x l tn nhiu thi gian. Thread.Sleep(delay);

Console.WriteLine("{0} : {1} example - thread finishing.", DateTime.Now.ToString("HH:mm:ss.ffff"), name);

// Tr v thi gian hon tt phng thc. return DateTime.Now; } AsyncExecutionExample cha nm phng thc din t cc cch tip cn khc nhau v vic

kt thc phng thc thc thi bt ng b. Di y s m t v cung cp m lnh cho cc phng thc .

1. Phng thc BlockingExample


Phng thc BlockingExample thc thi bt ng b phng thc LongRunningMethod v tip tc thc hin cng vic ca n trong mt khong thi gian. Khi x l xong cng vic ny, BlockingExample chuyn sang trang thi dng (block) cho n khi phng thc LongRunningMethod kt thc. vo trng thi dng, BlockingExample thc thi phng thc EndInvoke ca th hin y nhim AnsyncExampleDelegate. Nu phng thc LongRunningMethod kt thc, EndInvoke tr v ngay lp tc, nu khng, BlockingExample chuyn sang trng thi dng cho n khi phng thc LongRunningMethod kt thc.
public static void BlockingExample() {

Console.WriteLine(Environment.NewLine + "*** Running Blocking Example ***");

// Gi LongRunningMethod mt cch bt ng b. Truyn null cho // c y nhim callback v i tng trng thi bt ng b. AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod);

IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000, "Blocking", null, null);

// Thc hin cng vic khc cho n khi // sn sng i vo trng thi dng. for (int count = 0; count < 3; count++) { Console.WriteLine("{0} : Continue processing until " + "ready to block...",

124 Chng 4: Tiu trnh, tin trnh, v s ng b

DateTime.Now.ToString("HH:mm:ss.ffff")); Thread.Sleep(200); }

// i vo trng thi dng cho n khi phng thc // thc thi bt ng b kt thc v thu ly kt qu. Console.WriteLine("{0} : Blocking until method is " + "complete...", DateTime.Now.ToString("HH:mm:ss.ffff")); DateTime completion = longRunningMethod.EndInvoke(asyncResult);

// Hin th thng tin kt thc. Console.WriteLine("{0} : Blocking example complete.", completion.ToString("HH:mm:ss.ffff")); }

2. Phng thc PollingExample


Phng thc PollingExample thc thi bt ng b phng thc LongRunningMethod v sau thc hin vng lp polling cho n khi LongRunningMethod kt thc. PollingExample kim tra thuc tnh IsComplete ca th hin IAsyncResult (c tr v bi BeginInvoke) xc nh phng thc LongRunningMethod kt thc hay cha, nu cha, PollingExample s gi Thread.Sleep.
public static void PollingExample() {

Console.WriteLine(Environment.NewLine + "*** Running Polling Example ***");

// Gi LongRunningMethod mt cch bt ng b. Truyn null cho // c y nhim callback v i tng trng thi bt ng b. AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod);

IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000, "Polling", null, null);

// Thc hin polling kim tra phng thc thc thi // bt ng b kt thc hay cha. Nu cha kt thc

125 Chng 4: Tiu trnh, tin trnh, v s ng b // th i vo trng thi ch trong 300 mini-giy // trc khi thc hin polling ln na. Console.WriteLine("{0} : Poll repeatedly until method is " + "complete...", DateTime.Now.ToString("HH:mm:ss.ffff")); while(!asyncResult.IsCompleted) { Console.WriteLine("{0} : Polling...", DateTime.Now.ToString("HH:mm:ss.ffff")); Thread.Sleep(300); }

// Thu ly kt qu ca phng thc thc thi bt ng b. DateTime completion = longRunningMethod.EndInvoke(asyncResult);

// Hin th thng tin kt thc. Console.WriteLine("{0} : Polling example complete.", completion.ToString("HH:mm:ss.ffff")); }

3. Phng thc WaitingExample


Phng thc WaitingExample thc thi bt ng b phng thc LongRunningExample v sau ch cho n khi LongRunningMethod kt thc. WaitingExample s dng thuc tnh AsyncWaitHandle ca th hin IAsyncResult (c tr v bi BeginInvoke) c c mt WaitHandle v sau gi phng thc WaitOne ca WaitHandle. Vic s dng gi tr time-out cho php WaitingExample dng qu trnh i thc hin cng vic khc hoc dng hon ton nu phng thc thc thi bt ng b din ra qu lu.
public static void WaitingExample() {

Console.WriteLine(Environment.NewLine + "*** Running Waiting Example ***");

// Gi LongRunningMethod mt cch bt ng b. Truyn null cho // c y nhim callback v i tng trng thi bt ng b. AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod);

IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000, "Waiting", null, null);

126 Chng 4: Tiu trnh, tin trnh, v s ng b

// i phng thc thc thi bt ng b kt thc. // Time-out sau 300 mili-giy v hin th trng thi ra // ca s Console trc khi tip tc i. Console.WriteLine("{0} : Waiting until method is complete...", DateTime.Now.ToString("HH:mm:ss.ffff")); while(!asyncResult.AsyncWaitHandle.WaitOne(300, false)) { Console.WriteLine("{0} : Wait timeout...", DateTime.Now.ToString("HH:mm:ss.ffff")); }

// Thu ly kt qu ca phng thc thc thi bt ng b. DateTime completion = longRunningMethod.EndInvoke(asyncResult);

// Hin th thng tin kt thc. Console.WriteLine("{0} : Waiting example complete.", completion.ToString("HH:mm:ss.ffff")); }

4. Phng thc WaitAllExample


Phng thc WaitAllExample thc thi bt ng b phng thc LongRunningMethod nhiu ln v sau s dng mng cc i tng WaitHandle i cho n khi tt c cc phng thc kt thc.
public static void WaitAllExample() {

Console.WriteLine(Environment.NewLine + "*** Running WaitAll Example ***");

// Mt ArrayList cha cc th hin IAsyncResult // cho cc phng thc thc thi bt ng b. ArrayList asyncResults = new ArrayList(3);

// Gi ba ln LongRunningMethod mt cch bt ng b. // Truyn null cho c y nhim callback v i tng // trng thi bt ng b. Thm th hin IAsyncResult // cho mi phng thc vo ArrayList. AsyncExampleDelegate longRunningMethod =

127 Chng 4: Tiu trnh, tin trnh, v s ng b new AsyncExampleDelegate(LongRunningMethod);

asyncResults.Add(longRunningMethod.BeginInvoke(3000, "WaitAll 1", null, null));

asyncResults.Add(longRunningMethod.BeginInvoke(2500, "WaitAll 2", null, null));

asyncResults.Add(longRunningMethod.BeginInvoke(1500, "WaitAll 3", null, null));

// To mt mng cc i tng WaitHandle, // s c s dng i tt c cc phng thc // thc thi bt ng b kt thc. WaitHandle[] waitHandles = new WaitHandle[3];

for (int count = 0; count < 3; count++) { waitHandles[count] = ((IAsyncResult)asyncResults[count]).AsyncWaitHandle; } // i c ba phng thc thc thi bt ng b kt thc. // Time-out sau 300 mili-giy v hin th trng thi ra // ca s Console trc khi tip tc i. Console.WriteLine("{0} : Waiting until all 3 methods are " + "complete...", DateTime.Now.ToString("HH:mm:ss.ffff")); while(!WaitHandle.WaitAll(waitHandles, 300, false)) { Console.WriteLine("{0} : WaitAll timeout...", DateTime.Now.ToString("HH:mm:ss.ffff")); }

// Kim tra kt qu ca mi phng thc v xc nh // thi gian phng thc cui cng kt thc. DateTime completion = DateTime.MinValue;

foreach (IAsyncResult result in asyncResults) {

128 Chng 4: Tiu trnh, tin trnh, v s ng b

DateTime time = longRunningMethod.EndInvoke(result); if ( time > completion) completion = time; }

// Hin th thng tin kt thc. Console.WriteLine("{0} : WaitAll example complete.", completion.ToString("HH:mm:ss.ffff")); }

5. Phng thc CallbackExample


Phng thc CallbackExample thc thi bt ng b phng thc LongRunningMethod v truyn mt th hin y nhim AsyncCallback (tham chiu n phng thc CallbackHandler) cho phng thc BeginInvoke. Phng thc CallbackHandler s c gi mt cch t ng khi phng thc LongRunningMethod kt thc, kt qu l phng thc CallbackExample vn tip tc thc hin cng vic.
public static void CallbackExample() {

Console.WriteLine(Environment.NewLine + "*** Running Callback Example ***");

// Gi LongRunningMethod mt cch bt ng b. Truyn mt // th hin y nhim AsyncCallback tham chiu n // phng thc CallbackHandler. CallbackHandler s // t ng c gi khi phng thc thc thi bt ng b // kt thc. Truyn mt tham chiu n th hin y nhim // AsyncExampleDelegate nh mt trng thi bt ng b; // nu khng, phng thc callback khng th truy xut // th hin y nhim gi EndInvoke. AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod);

IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000, "Callback", new AsyncCallback(CallbackHandler), longRunningMethod); // Tip tc vi cng vic khc. for (int count = 0; count < 15; count++) {

129 Chng 4: Tiu trnh, tin trnh, v s ng b Console.WriteLine("{0} : Continue processing...", DateTime.Now.ToString("HH:mm:ss.ffff")); Thread.Sleep(200); } } // Phng thc x l vic kt thc bt ng b bng callbacks. public static void CallbackHandler(IAsyncResult result) { // Trch tham chiu n th hin AsyncExampleDelegate // t th hin IAsyncResult. AsyncExampleDelegate longRunningMethod = (AsyncExampleDelegate)result.AsyncState;

// Thu ly kt qu ca phng thc thc thi bt ng b. DateTime completion = longRunningMethod.EndInvoke(result);

// Hin th thng tin kt thc. Console.WriteLine("{0} : Callback example complete.", completion.ToString("HH:mm:ss.ffff")); }

3.

Thc thi phng thc bng Timer


Bn cn thc thi mt phng thc trong mt tiu trnh ring theo chu k hay mt thi im xc nh. Khai bo mt phng thc tr v void v ch nhn mt i tng lm i s. Sau , to mt th hin y nhim System.Threading.TimerCallback tham chiu n phng thc ny. Tip theo, to mt i tng System.Threading.Timer v truyn n cho th hin y nhim TimerCallback cng vi mt i tng trng thi m Timer s truyn cho phng thc ca bn khi Timer ht hiu lc. B thc thi s ch cho n khi Timer ht hiu lc v sau gi phng thc ca bn bng mt tiu trnh trong thread-pool.

Thng thng, rt hu ch khi thc thi mt phng thc mt thi im xc nh hay nhng thi khong xc nh. V d, bn cn sao lu d liu lc 1:00 AM mi ngy hay xa vng m d liu mi 20 pht. Lp Timer gip vic nh thi thc thi mt phng thc tr nn d dng, cho php bn thc thi mt phng thc c tham chiu bi y nhim TimerCallback nhng thi khong nht nh. Phng thc c tham chiu s thc thi trong ng cnh ca mt tiu trnh trong thread-pool.

130 Chng 4: Tiu trnh, tin trnh, v s ng b

Khi to mt i tng Timer, bn cn ch nh hai thi khong (thi khong c th c ch nh l cc gi tr kiu int, long, uint, hay System.TimeSpan): Gi tr u tin l thi gian tr (tnh bng mili-giy) phng thc ca bn c thc thi ln u tin. Ch nh gi tr 0 thc thi phng thc ngay lp tc, v ch nh System.Threading.Timeout.Infinite to Timer trng thi cha bt u (unstarted). Gi tr th hai l khong thi gian m Timer s lp li vic gi phng thc ca bn sau ln thc thi u tin. Nu bn ch nh gi tr 0 hay Timeout.Infinite th Timer ch thc thi phng thc mt ln duy nht (vi iu kin thi gian tr ban u khng phi l Timeout.Infinite). i s th hai c th cung cp bng cc tr kiu int, long, uint, hay System.TimeSpan.

Sau khi to i tng Timer, bn cng c th thay i cc thi khong c s dng bi Timer bng phng thc Change, nhng bn khng th thay i phng thc s c gi. Khi dng xong Timer, bn nn gi phng thc Timer.Depose gii phng ti nguyn h thng b chim gi bi Timer. Vic hy Timer cng hy lun phng thc c nh thi thc thi. Lp TimerExample di y trnh by cch s dng Timer gi mt phng thc c tn l TimerHandler. Ban u, Timer c cu hnh gi TimerHandler sau hai giy v lp li sau mt giy. V d ny cng trnh by cch s dng phng thc Timer.Change thay i cc thi khong.
using System; using System.Threading;

public class TimerExample {

// Phng thc s c thc khi Timer ht hiu lc. // Hin th mt thng bo ra ca s Console. private static void TimerHandler(object state) {

Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), state); }

public static void Main() {

// To mt th hin y nhim TimerCallback mi // tham chiu n phng thc tnh TimerHandler. // TimerHandler s c gi khi Timer ht hiu lc.

131 Chng 4: Tiu trnh, tin trnh, v s ng b TimerCallback handler = new TimerCallback(TimerHandler);

// To mt i tng trng thi, i tng ny s c // truyn cho phng thc TimerHandler. // Trong trng hp ny, mt thng bo s c hin th. string state = "Timer expired.";

Console.WriteLine("{0} : Creating Timer.", DateTime.Now.ToString("HH:mm:ss.ffff")); // To mt Timer, pht sinh ln u tin sau hai giy // v sau l mi giy. using (Timer timer = new Timer(handler, state, 2000, 1000)) { int period; // c thi khong mi t Console cho n khi // ngi dng nhp 0. Cc gi tr khng hp l // s s dng gi tr mc nh l 0 (dng v d). do {

try { period = Int32.Parse(Console.ReadLine()); } catch { period = 0; }

// Thay i Timer vi thi khong mi. if (period > 0) timer.Change(0, period); } while (period > 0); } // Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

132 Chng 4: Tiu trnh, tin trnh, v s ng b

Mc d Timer thng c s dng gi thc thi cc phng thc nhng thi khong, nhng n cng cung cp cch thc thc thi mt phng thc mt thi im xc nh. Bn cn phi tnh ton khong thi gian t thi im hin ti n thi im cn thc thi. V d di y s thc hin iu ny:
public static void RunAt(DateTime execTime) { // Tnh khong thi gian t thi im hin ti // n thi im cn thc thi. TimeSpan waitTime = execTime - DateTime.Now; if (waitTime < new TimeSpan(0)) waitTime = new TimeSpan(0); // To mt th hin y nhim TimerCallback mi // tham chiu n phng thc tnh TimerHandler. // TimerHandler s c gi khi Timer ht hiu lc. TimerCallback handler = new TimerCallback(TimerHandler); // To mt Timer ch pht sinh mt ln ti thi im // c ch nh. Ch nh thi khong th hai l -1 // ngn Timer thc thi lp li phng thc. new Timer(handler, null, waitTime, new TimeSpan(-1)); }

4. Thc thi phng thc bng cch ra hiu i tng WaitHandle



Bn mun thc thi mt hay nhiu phng thc mt cch t ng khi mt i tng dn xut t lp System.Threading.WaitHandle i vo trng thi signaled. To mt th hin y nhim System.Threading.WaitOrTimerCallback tham chiu n phng thc cn thc thi. Sau , ng k th hin y nhim v i tng WaitHandle vi thread-pool bng phng thc tnh ThreadPool. RegisterWaitForSingleObject.

Bn c th s dng cc lp dn xut t WaitHandle ( c tho lun trong mc 4.2) gi thc thi mt phng thc. Bng phng thc RegisterWaitForSingleObject ca lp ThreadPool, bn c th ng k th hin y nhim WaitOrTimerCallback vi thread-pool khi mt i tng dn xut t WaitHandle i vo trng thi signaled. Bn c th cu hnh threadpool thc thi phng thc ch mt ln hay t ng ng k li phng thc mi khi WaitHandle i vo trng thi signaled. Nu WaitHandle trng thi signaled khi bn gi RegisterWaitForSingleObject, phng thc s thc thi ngay lp tc. Phng thc

133 Chng 4: Tiu trnh, tin trnh, v s ng b Unregister ca i tng System.Threading.RegisteredWaitHandle (c tr v bi phng

thc RegisterWaitForSingleObject) c s dng hy b vic ng k. Lp thng c dng lm b kch hot l AutoResetEvent, n s t ng chuyn sang trng thi unsignaled sau khi trng thi signaled. Tuy nhin, bn cng c th thay i trng thi signaled theo mun bng lp ManualResetEvent hay Mutex. V d di y trnh by cch s dng mt AutoResetEvent kch hot thc thi mt phng thc c tn l EventHandler.
using System; using System.Threading;

public class EventExecutionExample {

// Phng thc s c thc thi khi AutoResetEvent i vo trng // thi signaled hoc qu trnh i ht thi gian (time-out). private static void EventHandler(object state, bool timedout) {

// Hin th thng bo thch hp ra ca s Console // ty vo qu trnh i ht thi gian hay // AutoResetEvent trng thi signaled. if (timedout) {

Console.WriteLine("{0} : Wait timed out.", DateTime.Now.ToString("HH:mm:ss.ffff")); } else {

Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), state); } }

public static void Main() {

// To mt AutoResetEvent trng thi unsignaled. AutoResetEvent autoEvent = new AutoResetEvent(false);

// To mt th hin y nhim WaitOrTimerCallback // tham chiu n phng thc tnh EventHandler. // EventHandler s c gi khi AutoResetEvent i vo // trng thi signaled hay qu trnh i ht thi gian.

134 Chng 4: Tiu trnh, tin trnh, v s ng b

WaitOrTimerCallback handler = new WaitOrTimerCallback(EventHandler);

// To i tng trng thi (c truyn cho phng thc // th l s kin khi n c kch hot). Trong trng hp // ny, mt thng bo s c hin th. string state = "AutoResetEvent signaled.";

// ng k th hin y nhim i AutoResetEvent i vo // trng thi signaled. Thit lp gi tr time-out l 3 giy. RegisteredWaitHandle handle = ThreadPool.RegisterWaitForSingleObject(autoEvent, handler, state, 3000, false);

Console.WriteLine("Press ENTER to signal the AutoResetEvent" + " or enter \"Cancel\" to unregister the wait operation."); while (Console.ReadLine().ToUpper() != "CANCEL") { // Nu "Cancel" khng c nhp vo Console, // AutoResetEvent s i vo trng thi signal, // v phng thc EventHandler c thc thi. // AutoResetEvent s t ng tr v trng thi unsignaled. autoEvent.Set(); } // Hy b vic ng k qu trnh i. Console.WriteLine("Unregistering wait operation."); handle.Unregister(null); // Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

135 Chng 4: Tiu trnh, tin trnh, v s ng b

5.

Thc thi phng thc bng tiu trnh mi


Bn mun thc thi m lnh trong mt tiu trnh ring, v mun kim sot hon ton qu trnh thc thi v trng thi ca tiu trnh . Khai bo mt phng thc tr v void v khng c i s. Sau , to mt th hin y nhim System.Threading.ThreadStart tham chiu n phng thc ny. Tip theo, to mt i tng System.Threading.Thread mi, v truyn th hin y nhim cho phng thc khi dng ca n. K n, gi phng thc Thread.Start bt u thc thi phng thc ca bn.

tng linh hot v mc kim sot khi hin thc cc ng dng h-tr-a-tiu-trnh, bn phi trc tip to v qun l cc tiu trnh. y l cch tip cn phc tp nht trong vic lp trnh h-tr-a-tiu-trnh, nhng cng l cch duy nht vt qua nhng hn ch c hu trong cc cch tip cn s dng cc tiu trnh trong thread-pool, nh c tho lun trong bn mc trc. Lp Thread cung cp mt c ch m qua bn c th to v kim sot cc tiu trnh. to v chy mt tiu trnh mi, bn hy tin hnh theo cc bc sau: 1. To mt i tng y nhim ThreadStart tham chiu n phng thc cha m lnh m bn mun dng mt tiu trnh mi chy n. Ging nh cc y nhim khc, ThreadStart c th tham chiu n mt phng thc tnh hay phng thc ca mt i tng. Phng thc c tham chiu phi tr v void v khng c i s. To mt i tng Thread, v truyn th hin y nhim ThreadStart cho phng thc khi dng ca n. Tiu trnh mi c trng thi ban u l Unstarted (mt thnh vin thuc kiu lit k System.Threading.ThreadState). Gi thc thi phng thc Start ca i tng Thread chuyn trng thi ca n sang ThreadState.Running v bt u thc thi phng thc c tham chiu bi th hin y nhim ThreadStart (nu bn gi phng thc Start qu mt ln, n s nm ngoi l System.Threading.ThreadStateException).

2.

3.

V y nhim ThreadStart khai bo khng c i s, bn khng th truyn d liu trc tip cho phng thc c tham chiu. truyn d liu cho tiu trnh mi, bn phi cu hnh d liu l kh truy xut i vi m lnh ang chy trong tiu trnh mi. Cch tip cn thng thng l to mt lp ng gi c d liu cn cho tiu trnh v phng thc c thc thi bi tiu trnh. Khi mun chy mt tiu trnh mi, bn hy to mt i tng ca lp ny, cu hnh trng thi cho n, v ri chy tiu trnh. Di y l mt v d:
using System; using System.Threading; public class ThreadExample { // Cc bin gi thng tin trng thi. private int iterations; private string message; private int delay;

136 Chng 4: Tiu trnh, tin trnh, v s ng b

public ThreadExample(int iterations, string message, int delay) { this.iterations = iterations; this.message = message; this.delay = delay; } public void Start() { // To mt th hin y nhim ThreadStart // tham chiu n DisplayMessage. ThreadStart method = new ThreadStart(this.DisplayMessage); // To mt i tng Thread v truyn th hin y nhim // ThreadStart cho phng thc khi dng ca n. Thread thread = new Thread(method); Console.WriteLine("{0} : Starting new thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); // Khi chy tiu trnh mi. thread.Start(); }

private void DisplayMessage() { // Hin th thng bo ra ca s Console vi s ln // c ch nh (iterations), ngh gia mi thng bo // mt khong thi gian c ch nh (delay). for (int count = 0; count < iterations; count++) {

Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), message);

Thread.Sleep(delay); } }

137 Chng 4: Tiu trnh, tin trnh, v s ng b

public static void Main() { // To mt i tng ThreadExample. ThreadExample example = new ThreadExample(5, "A thread example.", 500);

// Khi chy i tng ThreadExample. example.Start(); // Tip tc thc hin cng vic khc. for (int count = 0; count < 13; count++) { Console.WriteLine("{0} : Continue processing...", DateTime.Now.ToString("HH:mm:ss.ffff")); Thread.Sleep(200); } // Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

6.

iu khin qu trnh thc thi ca mt tiu trnh


Bn cn nm quyn iu khin khi mt tiu trnh chy v dng, v c th tm dng qu trnh thc thi ca mt tiu trnh. S dng cc phng thc Abort, Interrupt, Resume, Start, v Suspend ca Thread m bn cn iu khin.

Cc phng thc ca lp Thread c tm tt trong bng 4.1 cung cp mt c ch iu khin mc cao ln qu trnh thc thi ca mt tiu trnh. Mi phng thc ny tr v tiu trnh ang gi ngay lp tc. Tuy nhin, trng thi ca tiu trnh hin hnh ng vai tr quan trng trong kt qu ca li gi phng thc, v trng thi ca mt tiu trnh c th thay i nhanh chng. Kt qu l, bn phi vit m bt v th l cc ngoi l c th b nm khi bn c iu khin qu trnh thc thi ca mt Thread. Lp ThreadControlExample di y trnh by cch s dng cc phng thc c lit k trong bng 4.1. V d ny khi chy mt tiu trnh th hai, hin th nh k mt thng bo ra ca s Console v ri i vo trng thi ngh (sleep). Bng cch nhp cc lnh ti du nhc lnh, bn c th gin on, tm hon, phc hi, v hy b tiu trnh th hai.

138 Chng 4: Tiu trnh, tin trnh, v s ng b

Bng 4.1 iu khin qu trnh thc thi ca mt tiu trnh Phng thc M t

Abort

Kt thc mt tiu trnh bng cch nm ngoi l System.Threading. ThreadAbortException trong m lnh ang c chy. M lnh ca tiu trnh b hy c th bt ngoi l ThreadAbortException thc hin vic dn dp, nhng b thc thi s t ng nm ngoi l ny ln na bo m tiu trnh kt thc, tr khi ResetAbort c gi. Abort tr v ngay lp lc, nhng b thc thi xc nh chnh xc khi no ngoi l b nm, do bn khng th cho rng tiu trnh kt thc bi Abort tr v. Bn nn s dng cc k thut c m t trong mc 4.7 nu cn xc nh khi no tiu trnh ny tht s kt thc. Mt khi hy mt tiu trnh, bn khng th khi chy li n. Nm ngoi l System.Threading.ThreadInterruptedException (trong m lnh ang c chy) lc tiu trnh ang trng thi WaitSleepJoin. iu ny ngha l tiu trnh ny gi Sleep, Join (mc 4.7); hoc ang i WaitHandle ra hiu ( i vo trng thi signaled) hay ang i mt i tng dng cho s ng b tiu trnh (mc 4.8). Nu tiu trnh ny khng trng thi WaitSleepJoin, ThreadInterruptedException s b nm sau khi tiu trnh i vo trng thi WaitSleepJoin. Phc hi qu trnh thc thi ca mt tiu trnh b tm hon (xem phng thc Suspend). Vic gi Resume trn mt tiu trnh cha b tm hon s sinh ra ngoi l System.Threading.ThreadStateException trong tiu trnh ang gi. Khi chy tiu trnh mi; xem mc 4.5 bit cch s dng phng thc Start. Tm hon qu trnh thc thi ca mt tiu trnh cho n khi phng thc Resume c gi. Vic tm hon mt tiu trnh b tm hon s khng c hiu lc, nhng vic gi Suspend trn mt tiu trnh cha khi chy hoc kt thc s sinh ra ngoi l ThreadStateException trong tiu trnh ang gi.

Interrupt

Resume

Start

Suspend

using System; using System.Threading; public class ThreadControlExample { private static void DisplayMessage() { // Lp i lp li vic hin th mt thng bo ra ca s Console.

139 Chng 4: Tiu trnh, tin trnh, v s ng b while (true) { try { Console.WriteLine("{0} : Second thread running. Enter" + " (S)uspend, (R)esume, (I)nterrupt, or (E)xit.", DateTime.Now.ToString("HH:mm:ss.ffff"));

// Ngh 2 giy. Thread.Sleep(2000);

} catch (ThreadInterruptedException) {

// Tiu trnh b gin on. Vic bt ngoi l // ThreadInterruptedException cho php v d ny // thc hin hnh ng ph hp v tip tc thc thi. Console.WriteLine("{0} : Second thread interrupted.", DateTime.Now.ToString("HH:mm:ss.ffff"));

} catch (ThreadAbortException abortEx) {

// i tng trong thuc tnh // ThreadAbortException.ExceptionState c cung cp // bi tiu trnh gi Thread.Abort. // Trong trng hp ny, n cha mt chui // m t l do ca vic hy b. Console.WriteLine("{0} : Second thread aborted ({1})", DateTime.Now.ToString("HH:mm:ss.ffff"), abortEx.ExceptionState);

// Mc d ThreadAbortException c th l, // b thc thi s nm n ln na bo m // tiu trnh kt thc. } } }

public static void Main() {

140 Chng 4: Tiu trnh, tin trnh, v s ng b

// To mt i tng Thread v truyn cho n mt th hin // y nhim ThreadStart tham chiu n DisplayMessage. Thread thread = new Thread(new ThreadStart(DisplayMessage));

Console.WriteLine("{0} : Starting second thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); // Khi chy tiu trnh th hai. thread.Start(); // Lp v x l lnh do ngi dng nhp. char command = ' '; do {

string input = Console.ReadLine(); if (input.Length > 0) command = input.ToUpper()[0]; else command = ' ';

switch (command) { case 'S': // Tm hon tiu trnh th hai. Console.WriteLine("{0} : Suspending second thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); thread.Suspend(); break; case 'R': // Phc hi tiu trnh th hai. try { Console.WriteLine("{0} : Resuming second " + "thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); thread.Resume();

141 Chng 4: Tiu trnh, tin trnh, v s ng b } catch (ThreadStateException) { Console.WriteLine("{0} : Thread wasn't " + "suspended.", DateTime.Now.ToString("HH:mm:ss.ffff")); } break; case 'I': // Gin on tiu trnh th hai. Console.WriteLine("{0} : Interrupting second " + "thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); thread.Interrupt(); break; case 'E': // Hy b tiu trnh th hai v truyn mt i tng // trng thi cho tiu trnh ang b hy, // trong trng hp ny l mt thng bo. Console.WriteLine("{0} : Aborting second thread.", DateTime.Now.ToString("HH:mm:ss.ffff"));

thread.Abort("Terminating example.");

// i tiu trnh th hai kt thc. thread.Join(); break; } } while (command != 'E');

// Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

142 Chng 4: Tiu trnh, tin trnh, v s ng b

7.

Nhn bit khi no mt tiu trnh kt thc


Bn mun bit khi no mt tiu trnh kt thc. S dng thuc tnh IsAlive hay phng thc Join ca lp Thread.

Cch d nht kim tra mt tiu trnh kt thc hay cha l kim tra thuc tnh Thread.IsAlive. Thuc tnh ny tr v true nu tiu trnh c khi chy nhng cha kt thc hay b hy. Thng thng, bn s cn mt tiu trnh i mt tiu trnh khc hon tt vic x l ca n. Thay v kim tra thuc tnh IsAlive trong mt vng lp, bn c th s dng phng thc Thread.Join. Phng thc ny khin tiu trnh ang gi dng li (block) cho n khi tiu trnh c tham chiu kt thc. Bn c th ty chn ch nh mt khong thi gian (gi tr int hay TimeSpan) m sau khong thi gian ny, Join s ht hiu lc v qu trnh thc thi ca tiu trnh ang gi s phc hi li. Nu bn ch nh mt gi tr time-out, Join tr v true nu tiu trnh kt thc, v false nu Join ht hiu lc. V d di y thc thi mt tiu trnh th hai v ri gi Join i tiu trnh th hai kt thc. V tiu trnh th hai mt 5 giy thc thi, nhng phng thc Join ch nh gi tr time-out l 3 giy, nn Join s lun ht hiu lc v v d ny s hin th mt thng bo ra ca s Console.
using System; using System.Threading;

public class ThreadFinishExample {

private static void DisplayMessage() {

// Hin th mt thng bo ra ca s Console 5 ln. for (int count = 0; count < 5; count++) {

Console.WriteLine("{0} : Second thread", DateTime.Now.ToString("HH:mm:ss.ffff"));

// Ngh 1 giy. Thread.Sleep(1000); } }

143 Chng 4: Tiu trnh, tin trnh, v s ng b public static void Main() {

// To mt th hin y nhim ThreadStart // tham chiu n DisplayMessage. ThreadStart method = new ThreadStart(DisplayMessage);

// To mt i tng Thread v truyn th hin y nhim // ThreadStart cho phng thc khi dng ca n. Thread thread = new Thread(method); Console.WriteLine("{0} : Starting second thread.", DateTime.Now.ToString("HH:mm:ss.ffff"));

// Khi chy tiu trnh th hai. thread.Start();

// Dng cho n khi tiu trnh th hai kt thc, // hoc Join ht hiu lc sau 3 giy. if (!thread.Join(3000)) {

Console.WriteLine("{0} : Join timed out !!", DateTime.Now.ToString("HH:mm:ss.ffff")); } // Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

8.

ng b ha qu trnh thc thi ca nhiu tiu trnh


Bn cn phi hp cc hot ng ca nhiu tiu trnh bo m s dng hiu qu cc ti nguyn dng chung, v bn khng lm sai lc d liu dng chung khi mt php chuyn ng cnh tiu trnh (thread context switch) xy ra trong qu trnh thay i d liu. S dng cc lp Monitor, AutoResetEvent, ManualResetEvent, v Mutex (thuc khng gian tn System.Threading).

144 Chng 4: Tiu trnh, tin trnh, v s ng b

Thch thc ln nht trong vic vit mt ng dng h-tr-a-tiu-trnh l bo m cc tiu trnh lm vic trong s ha hp. Vic ny thng c gi l ng b ha tiu trnh v bao gm: Bo m cc tiu trnh truy xut cc i tng v d liu dng chung mt cch ph hp khng gy ra sai lc. Bo m cc tiu trnh ch thc thi khi tht s cn thit v phi m bo rng chng ch c thc thi vi chi ph ti thiu khi chng ri.

C ch ng b ha thng dng nht l lp Monitor. Lp ny cho php mt tiu trnh n thu ly cht (lock) trn mt i tng bng cch gi phng thc tnh Monitor.Enter. Bng cch thu ly cht trc khi truy xut mt ti nguyn hay d liu dng chung, ta chc chn rng ch c mt tiu trnh c th truy xut ti nguyn cng lc. Mt khi hon tt vi ti nguyn, tiu trnh ny s gii phng cht tiu trnh khc c th truy xut n. Khi m thc hin cng vic ny thng c gi l vng hnh cng (critical section). Bn c th s dng bt k i tng no ng vai tr lm cht, v s dng t kha this thu ly cht trn i tng hin ti. im chnh l tt c cc tiu trnh khi truy xut mt ti nguyn dng chung phi thu ly cng mt cht. Cc tiu trnh khc khi thu ly cht trn cng mt i tng s block (i vo trng thi WaitSleepJoin) v c thm vo hng sn sng (ready queue) ca cht ny cho n khi tiu trnh ch gii phng n bng phng thc tnh Monitor.Exit. Khi tiu trnh ch gi Exit, mt trong cc tiu trnh t hng sn sng s thu ly cht. Nu tiu trnh ch khng gii phng cht bng Exit, tt c cc tiu trnh khc s block v hn nh. V vy, cn t li gi Exit bn trong khi finally bo m n c gi c khi ngoi l xy ra. V Monitor thng xuyn c s dng trong cc ng dng h-tr-a-tiu-trnh nn C# cung cp h tr mc-ngn-ng thng qua lnh lock. Khi m c gi trong lnh lock tng ng vi gi Monitor.Enter khi i vo khi m ny, v gi Monitor.Exit khi i ra khi m ny. Ngoi ra, trnh bin dch t ng t li gi Monitor.Exit trong khi finally bo m cht c gii phng khi mt ngoi l b nm. Tiu trnh ch (s hu cht) c th gi Monitor.Wait gii phng cht v t tiu trnh ny vo hng ch (wait queue). Cc tiu trnh trong hng ch cng c trng thi l WaitSleepJoin v s tip tc block cho n khi tiu trnh ch gi phng thc Pulse hay PulseAll ca lp Monitor. Phng thc Pulse di chuyn mt trong cc tiu trnh t hng ch vo hng sn sng, cn phng thc PulseAll th di chuyn tt c cc tiu trnh. Khi mt tiu trnh c di chuyn t hng ch vo hng sn sng, n c th thu ly cht trong ln gii phng k tip. Cn hiu rng cc tiu trnh thuc hng ch s khng thu c cht, chng s i v hn nh cho n khi bn gi Pulse hay PulseAll di chuyn chng vo hng sn sng. S dng Wait v Pulse l cch ph bin khi thread-pool c s dng x l cc item t mt hng i dng chung. Lp ThreadSyncExample di y trnh by cch s dng lp Monitor v lnh lock. V d ny khi chy ba tiu trnh, mi tiu trnh (ln lt) thu ly cht ca mt i tng c tn l consoleGate. K , mi tiu trnh gi phng thc Monitor.Wait. Khi ngi dng nhn Enter ln u tin, Monitor.Pulse s c gi gii phng mt tiu trnh ang ch. Ln th

145 Chng 4: Tiu trnh, tin trnh, v s ng b

hai ngi dng nhn Enter, Monitor.PulseAll s c gi gii phng tt c cc tiu trnh ang ch cn li.
using System; using System.Threading;

public class ThreadSyncExample {

private static object consoleGate = new Object();

private static void DisplayMessage() {

Console.WriteLine("{0} : Thread started, acquiring lock...", DateTime.Now.ToString("HH:mm:ss.ffff"));

// Thu ly cht trn i tng consoleGate. try {

Monitor.Enter(consoleGate);

Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), "Acquired consoleGate lock, waiting...");

// i cho n khi Pulse c gi trn i tng consoleGate. Monitor.Wait(consoleGate);

Console.WriteLine("{0} : Thread pulsed, terminating.", DateTime.Now.ToString("HH:mm:ss.ffff"));

} finally {

Monitor.Exit(consoleGate); } }

public static void Main() {

146 Chng 4: Tiu trnh, tin trnh, v s ng b

// Thu ly cht trn i tng consoleGate. lock (consoleGate) {

// To v khi chy ba tiu trnh mi // (chy phng thc DisplayMesssage). for (int count = 0; count < 3; count++) {

(new Thread(new ThreadStart(DisplayMessage))).Start(); } }

Thread.Sleep(1000);

// nh thc mt tiu trnh ang ch. Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), "Press Enter to pulse one waiting thread.");

Console.ReadLine();

// Thu ly cht trn i tng consoleGate. lock (consoleGate) {

// Pulse mt tiu trnh ang ch. Monitor.Pulse(consoleGate); }

// nh thc tt c cc tiu trnh ang ch. Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), "Press Enter to pulse all waiting threads.");

Console.ReadLine();

// Thu ly cht trn i tng consoleGate.

147 Chng 4: Tiu trnh, tin trnh, v s ng b lock (consoleGate) {

// Pulse tt c cc tiu trnh ang ch. Monitor.PulseAll(consoleGate); }

// Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

Cc lp thng dng khc dng ng b ha tiu trnh l cc lp con ca lp System.Threading.WaitHandle, bao gm AutoResetEvent, ManualResetEvent, v Mutex. Th hin ca cc lp ny c th trng thi signaled hay unsignaled. Cc tiu trnh c th s dng cc phng thc ca cc lp c lit k trong bng 4.2 (c tha k t lp WaitHandle) i vo trng thi WaitSleepJoin v i trng thi ca mt hay nhiu i tng dn xut t WaitHandle bin thnh signaled.
Bng 4.2 Cc phng thc ca WaitHandle dng ng b ha qu trnh thc thi ca cc tiu trnh Phng thc M t

WaitAny

Tiu trnh gi phng thc tnh ny s i vo trng thi WaitSleepJoin v i bt k mt trong cc i tng WaitHandle thuc mt mng WaitHandle bin thnh signaled. Bn cng c th ch nh gi tr timeout. Tiu trnh gi phng thc tnh ny s i vo trng thi WaitSleepJoin v i tt c cc i tng WaitHandle trong mt mng WaitHandle bin thnh signaled. Bn cng c th ch nh gi tr time-out. Phng thc WaitAllExample trong mc 4.2 trnh by cch s dng phng thc WaitAll. Tiu trnh gi phng thc ny s i vo trng thi WaitSleepJoin v i mt i tng WaitHandle c th bin thnh signaled. Phng thc WaitingExample trong mc 4.2 trnh by cch s dng phng thc WaitOne.

WaitAll

WaitOne

im khc bit chnh gia cc lp AutoResetEvent, ManualResetEvent, v Mutex l cch thc chng chuyn trng thi t signaled thnh unsignaled, v tnh kh kin (visibility) ca chng. Lp AutoResetEvent v ManualResetEvent l cc b i vi mt tin trnh. ra hiu mt AutoResetEvent, bn hy gi phng thc Set ca n, phng thc ny ch gii phng mt tiu trnh ang i s kin. AutoResetEvent s t ng tr v trng thi unsignaled. V d trong mc 4.4 trnh by cch s dng lp AutoResetEvent.

148 Chng 4: Tiu trnh, tin trnh, v s ng b

Lp ManualResetEvent phi c chuyn i qua li gia signaled v unsignaled bng phng thc Set v Reset ca n. Gi Set trn mt ManualResetEvent s t trng thi ca n l signaled, gii phng tt c cc tiu trnh ang i s kin. Ch khi gi Reset mi lm cho ManualResetEvent tr thnh unsignaled. Mt Mutex l signaled khi n khng thuc s hu ca bt k tiu trnh no. Mt tiu trnh ginh quyn s hu Mutex lc khi dng hoc s dng mt trong cc phng thc c lit k trong bng 4.2. Quyn s hu Mutex c gii phng bng cch gi phng thc Mutex.ReleaseMutex (ra hiu Mutex v cho php mt tiu trnh khc thu ly quyn s hu ny). Thun li chnh ca Mutex l bn c th s dng chng ng b ha cc tiu trnh qua cc bin tin trnh. Mc 4.12 trnh by cch s dng Mutex. Ngoi cc chc nng va c m t, im khc bit chnh gia cc lp WaitHandle v lp Monitor l lp Monitor c hin thc hon ton bng m lnh c-qun-l, trong khi cc lp WaitHandle cung cp v bc cho cc chc nng bn di ca ca h iu hnh. iu ny dn n h qu l: S dng lp Monitor ng ngha vi vic m lnh ca bn s kh chuyn hn v khng b l thuc vo kh nng ca h iu hnh bn di. Bn c th s dng cc lp dn xut t WaitHandle ng b ha vic thc thi ca cc tiu trnh c-qun-l v khng-c-qun-l, trong khi lp Monitor ch c th ng b ha cc tiu trnh c-qun-l.

9. To mt i tng tp hp c tnh cht an-ton-v-tiu-trnh



Bn mun nhiu tiu trnh c th ng thi truy xut ni dung ca mt tp hp mt cch an ton. S dng lnh lock ng b ha cc tiu trnh truy xut n tp hp, hoc truy xut tp hp thng qua mt v bc c tnh cht an-ton-v-tiu-trnh (threadsafe).

Theo mc nh, cc lp tp hp chun thuc khng gian tn System.Collections v System.Collections.Specialized s h tr vic nhiu tiu trnh ng thi c ni dung ca tp hp. Tuy nhin, nu mt hay nhiu tiu trnh ny sa i tp hp, nht nh bn s gp rc ri. l v h iu hnh c th lm t qung cc hnh ng ca tiu trnh trong khi tp hp ch mi c sa i mt phn. iu ny s a tp hp vo mt trng thi v nh, chc chn khin cho mt tiu trnh khc truy xut tp hp tht bi, tr v d liu sai, hoc lm hng tp hp.

S dng ng b ha tiu trnh s sinh ra mt chi ph hiu nng. C tp hp l khng-an-ton-v-tiu-trnh (non-thread-safe) nh mc nh s cho hiu nng tt hn i vi cc trng hp c nhiu tiu trnh khng c dng n.

Tt c cc tp hp thng dng nht u hin thc mt phng thc tnh c tn l Synchronized; bao gm cc lp: ArrayList, Hashtable, Queue, SortedList, v Stack (thuc khng gian tn System.Collections). Phng thc Synchronized nhn mt i tng tp hp

149 Chng 4: Tiu trnh, tin trnh, v s ng b

(vi kiu ph hp) lm i s v tr v mt i tng cung cp mt v bc c-ng-b-ha (synchronized wrapper) bao ly i tng tp hp c ch nh. i tng v bc ny c cng kiu vi tp hp gc, nhng tt c cc phng thc v thuc tnh dng c v ghi tp hp bo m rng ch mt tiu trnh c kh nng truy xut ni dung ca tp hp cng lc. on m di y trnh by cch to mt Hashtable c tnh cht an-ton-v-tiu-trnh (bn c th kim tra mt tp hp c phi l an-ton-v-tiu-trnh hay khng bng thuc tnh IsSynchronized).
// To mt Hashtable chun. Hashtable hUnsync = new Hashtable(); // To mt v bc c-ng-b-ha. Hashtable hSync = Hashtable.Synchronized(hUnsync);

Cc lp tp hp nh HybridDictionary, ListDictionary, v StringCollection (thuc khng gian tn System.Collections.Specialized) khng hin thc phng thc Synchronized. cung cp kh nng truy xut an-ton-v-tiu-trnh n th hin ca cc lp ny, bn phi hin thc qu trnh ng b ha (s dng i tng c tr v t thuc tnh SyncRoot) nh c trnh by trong on m di y:
// To mt NameValueCollection. NameValueCollection nvCollection = new NameValueCollection(); // Thu ly cht trn NameValueCollection trc khi thc hin sa i. lock (((ICollection)nvCollection).SyncRoot) { // Sa i NameValueCollection... }

Ch rng lp NameValueCollection dn xut t lp NameObjectCollectionBase, lp c s ny s dng c ch hin thc giao din tng minh hin thc thuc tnh ICollection.SyncRoot. Nh c trnh by, bn phi p NameValueCollection v ICollection trc khi truy xut thuc tnh SyncRoot. Vic p kiu l khng cn thit i vi cc lp tp hp chuyn bit nh HybridDictionary, ListDictionary, v StringCollection (cc lp ny khng s dng c ch hin thc giao din tng minh hin thc SyncRoot). Nu cn s dng rng khp lp tp hp c ng b ha, bn c th n gin ha m lnh bng cch to mt lp mi dn xut t lp tp hp cn s dng. K tip, chp cc thnh vin ca lp c s cung cp kh nng truy xut ni dung ca tp hp v thc hin ng b ha trc khi gi thnh vin lp c s tng ng. Bn c th s dng lnh lock mt cch bnh thng ng b ha i tng c tr v bi thuc tnh SyncRoot ca lp c s nh c tho lun trn. Tuy nhin, bng cch to lp dn xut, bn c th hin thc cc k thut ng b ha cao cp hn, chng hn s dng System.Threading.ReaderWriterLock cho php nhiu tiu trnh c nhng ch mt tiu trnh ghi.

10.

Khi chy mt tin trnh mi


Bn cn thc thi mt ng dng trong mt tin trnh mi.

150 Chng 4: Tiu trnh, tin trnh, v s ng b

S dng i tng System.Diagnostics.ProcessStartInfo ch nh cc chi tit cho ng dng cn chy. Sau , to i tng System.Diagnostics.Process m t tin trnh mi, gn i tng ProcessStartInfo cho thuc tnh StartInfo ca i tng Process, v ri khi chy ng dng bng cch gi Process.Start.

Lp Process cung cp mt dng biu din c-qun-l cho mt tin trnh ca h iu hnh v cung cp mt c ch n gin m thng qua , bn c th thc thi c ng dng cqun-l ln khng-c-qun-l. Lp Process hin thc bn phin bn np chng cho phng thc Start (bn c th s dng phng thc ny khi chy mt tin trnh mi). Hai trong s ny l cc phng thc tnh, cho php bn ch nh tn v cc i s cho tin trnh mi. V d, hai lnh di y u thc thi Notepad trong mt tin trnh mi:
// Thc thi notepad.exe, khng c i s. Process.Start("notepad.exe"); // Thc thi notepad.exe, tn file cn m l i s. Process.Start("notepad.exe", "SomeFile.txt");

Hai dng khc ca phng thc Start yu cu bn to i tng ProcessStartInfo c cu hnh vi cc chi tit ca tin trnh cn chy; vic s dng i tng ProcessStartInfo cung cp mt c ch iu khin tt hn trn cc hnh vi v cu hnh ca tin trnh mi. Bng 4.3 tm tt mt vi thuc tnh thng dng ca lp ProcessStartInfo.
[

Bng 4.3 Cc thuc tnh ca lp ProcessStartInfo Thuc tnh Arguments M t

Cc i s dng truyn cho tin trnh mi. Nu Process.Start khng th khi chy tin trnh c ch nh, n s nm ngoi l System.ComponentModel.Win32Exception. Nu ErrorDialog l true, Start s hin th mt thng bo li trc khi nm ngoi l. Tn ca ng dng. Bn cng c th ch nh bt k kiu file no m bn cu hnh ng dng kt giao vi n. V d, nu bn ch nh mt file vi phn m rng l .doc hay .xls, Microsoft Word hay Microsoft Excel s chy. Mt thnh vin thuc kiu lit k
System.Diagnostics. ProcessWindowStyle, iu khin cch thc hin th ca ca s. Cc

ErrorDialog

FileName

WindowStyle

gi tr hp l bao gm: Hidden, Maximized, Minimized, v Normal.


WorkingDirectory

Tn y ca th mc lm vic.

Khi hon tt vi mt i tng Process, bn nn hy n gii phng cc ti nguyn h thnggi Close, Dispose, hoc to i tng Process bn trong tm vc ca lnh using. Vic hy mt i tng Process khng nh hng ln tin trnh h thng nm di, tin trnh ny vn s tip tc chy.

151 Chng 4: Tiu trnh, tin trnh, v s ng b

V d di y s dng Process thc thi Notepad trong mt ca s trng thi phng to v m mt file c tn l C:\Temp\file.txt. Sau khi to, v d ny s gi phng thc Process.WaitForExit dng tiu trnh ang chy cho n khi tin trnh kt thc hoc gi tr time-out (c ch nh trong phng thc ny) ht hiu lc.
using System; using System.Diagnostics; public class StartProcessExample { public static void Main () { // To mt i tng ProcessStartInfo v cu hnh cho n // vi cc thng tin cn thit chy tin trnh mi. ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "notepad.exe"; startInfo.Arguments = "file.txt"; startInfo.WorkingDirectory = @"C:\Temp"; startInfo.WindowStyle = ProcessWindowStyle.Maximized; startInfo.ErrorDialog = true; // To mt i tng Process mi. using (Process process = new Process()) { // Gn ProcessStartInfo vo Process. process.StartInfo = startInfo; try { // Khi chy tin trnh mi. process.Start(); // i tin trnh mi kt thc trc khi thot. Console.WriteLine("Waiting 30 seconds for process to" + " finish."); process.WaitForExit(30000); } catch (Exception ex) {

152 Chng 4: Tiu trnh, tin trnh, v s ng b

Console.WriteLine("Could not start process."); Console.WriteLine(ex); } }

// Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

11.

Kt thc mt tin trnh


Bn mun kt thc mt tin trnh (mt ng dng hay mt dch v). Thu ly i tng Process m t tin trnh h iu hnh cn kt thc. i vi cc ng dng da-trn-Windows, hy gi phng thc Process.CloseMainWindow gi mt thng ip n ca s chnh ca ng dng. i vi cc ng dng datrn-Windows b qua CloseMainWindow, hay i vi cc ng dng khng-datrn-Windows, gi phng thc Process.Kill.

Nu khi chy mt tin trnh mi t m lnh c-qun-l bng lp Process ( c tho lun trong mc 4.10), bn c th kt thc tin trnh mi bng i tng Process m t tin trnh ny. Bn cng c th thu ly cc i tng Process ch n cc tin trnh khc hin ang chy bng cc phng thc tnh ca lp Process (c tm tt trong bng 4.4).
Bng 4.4 Cc phng thc dng thu ly cc tham chiu Process Phng thc GetCurrentProcess GetProcessById GetProcesses M t

Tr v i tng Process m t tin trnh hin ang tch cc. Tr v i tng Process m t tin trnh vi ID c ch nh. Tr v mng cc i tng Process m t tt c cc tin trnh hin ang tch cc. Tr v mng cc i tng Process m t tt c cc tin trnh hin ang tch cc vi tn thn thin c ch nh. Tn thn thin l tn ca file thc thi khng tnh phn m rng v ng dn; v d, notepad hay calc.

GetProcessesByName

Mt khi c i tng Process m t tin trnh cn kt thc, bn cn gi phng thc CloseMainWindow hay phng thc Kill. Phng thc CloseMainWindow gi mt thng ip n ca s chnh ca ng dng da-trn-Windows. Phng thc ny c cng tc dng nh th

153 Chng 4: Tiu trnh, tin trnh, v s ng b

ngi dng ng ca s chnh bng trnh n h thng, v n cho c hi ng dng thc hin vic tt mt cch bnh thng. CloseMainWindow s khng kt thc cc ng dng khng c ca s chnh hoc cc ng dng c ca s chnh b v hiu (c th v mt hp thoi hin ang c m). Vi nhng tnh hung nh th, CloseMainWindow s tr v false.
CloseMainWindow tr v true nu thng ip c gi thnh cng, nhng khng bo m tin

trnh tht s kt thc. V d, cc ng dng dng son tho d liu thng s cho c hi ngi dng lu li cc d liu cha c lu nu nhn c thng ip ny. Ngi dng thng c c hi hy b vic ng ca s vi nhng tnh hung nh th. iu ny ngha l CloseMainWindow s tr v true, nhng ng dng vn c chy khi ngi dng hy b. Bn c th s dng phng thc Process.WaitForExit bo hiu vic kt thc tin trnh v thuc tnh Process.HasExited kim tra tin trnh kt thc hay cha. V bn cng c th s dng phng thc Kill. Phng thc Kill kt thc mt tin trnh ngay lp tc; ngi dng khng c c hi dng vic kt thc, v tt c cc d liu cha c lu s b mt. Kill l ty chn duy nht kt thc cc ng dng da-trn-Windows khng p li CloseMainWindow v kt thc cc ng dng khng-da-trn-Windows. V d di y khi chy mt th hin mi ca Notepad, i 5 giy, sau kt thc tin trnh Notepad. Trc tin, v d ny kt thc tin trnh bng CloseMainWindow. Nu CloseMainWindow tr v false, hoc tin trnh Notepad vn c chy sau khi CloseMainWindow c gi, v d ny s gi Kill v buc tin trnh Notepad kt thc; bn c th buc CloseMainWindow tr v false bng cch b mc hp thoi File Open m.
using System; using System.Threading; using System.Diagnostics;

public class TerminateProcessExample { public static void Main () { // To mt Process mi v chy notepad.exe. using (Process process = Process.Start("notepad.exe")) {

// i 5 giy v kt thc tin trnh Notepad. Console.WriteLine("Waiting 5 seconds before terminating" + " notepad.exe."); Thread.Sleep(5000);

// Kt thc tin trnh Notepad. Console.WriteLine("Terminating Notepad with " + "CloseMainWindow."); // Gi mt thng ip n ca s chnh.

154 Chng 4: Tiu trnh, tin trnh, v s ng b

if (!process.CloseMainWindow()) {

// Khng gi c thng ip. Kt thc Notepad bng Kill. Console.WriteLine("CloseMainWindow returned false - " + " terminating Notepad with Kill."); process.Kill(); } else {

// Thng ip c gi thnh cng; i 2 giy // chng thc vic kt thc trc khi vin n Kill. if (!process.WaitForExit(2000)) {

Console.WriteLine("CloseMainWindow failed to" + " terminate - terminating Notepad with Kill."); process.Kill(); } } }

// Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

12.

Bo m ch c th chy mt th hin ca ng dng ti mt thi im


Bn cn bo m rng, ti mt thi im ch c th chy mt th hin ca ng dng. To mt i tng System.Threading.Mutex v bo ng dng thu ly quyn s hu i tng ny lc khi ng.

Mutex cung cp mt c ch ng b ha qu trnh thc thi ca cc tiu trnh vt qua bin

tin trnh v cn cung cp mt c ch tin li bo rng ch mt th hin ca ng dng ang chy. Bng cch c thu ly quyn s hu mt i tng Mutex lc khi ng v thot nu

155 Chng 4: Tiu trnh, tin trnh, v s ng b

khng th thu c Mutex, bn c th bo m rng ch mt th hin ca ng dng ang chy. V d di y s dng mt Mutex c tn l MutexExample bo m ch mt th hin ca v d c th thc thi.
using System; using System.Threading;

public class MutexExample {

public static void Main() {

// Gi tr lun l cho bit ng dng ny // c quyn s hu Mutex hay khng. bool ownsMutex;

// To v ly quyn s hu mt Mutex c tn l MutexExample. using (Mutex mutex = new Mutex(true, "MutexExample", out ownsMutex)) {

// Nu ng dng s hu Mutex, n c th tip tc thc thi; // nu khng, ng dng s thot. if (ownsMutex) {

Console.WriteLine("This application currently owns the" + " mutex named MutexExample. Additional instances" + " of this application will not run until you" + " release the mutex by pressing Enter.");

Console.ReadLine();

// Gii phng Mutex. mutex.ReleaseMutex();

} else {

Console.WriteLine("Another instance of this" + " application already owns the mutex named" + " MutexExample. This instance of the" + " application will terminate.");

156 Chng 4: Tiu trnh, tin trnh, v s ng b

} }

// Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

157

Chng 5:XML

158

159 Chng 5: XML

M
5.7).

t trong nhng kha cnh ng ch nht ca Microsoft .NET Framework l s tch hp su sc vi XML. Trong nhiu ng dng .NET, bn s khng nhn thy rng mnh ang s dng cc k thut XMLchng s c s dng pha hu trng khi bn tun t ha mt Microsoft ADO.NET DataSet, gi mt dch v Web XML, hoc c cc thit lp ng dng trong mt file cu hnh Web.config. Trong cc trng hp khc, bn s mun lm vic trc tip vi khng gian tn System.Xml thao tc d liu XML. Cc tc v XML thng thng khng ch phn tch mt file XML m cn xc nhn tnh hp l ca n da trn mt XML Schema, p dng php bin i XSL to mt ti liu hay trang HTML mi, v tm kim mt cch thng minh vi XPath. Cc mc trong chng ny trnh by cc vn sau:

Cc k thut dng c, phn tch, v thao tc d liu XML (mc 5.1, 5.2, 5.3, v Duyt mt ti liu XML tm cc nt c th theo tn (mc 5.4), theo khng gian tn
(mc 5.5), hay theo biu thc XPath (mc 5.6).

Xc nhn tnh hp l ca mt ti liu XML da trn mt XML Schema (mc 5.8). Tun t ha mt i tng thnh XML (mc 5.9), to XML Schema cho mt lp (mc
5.10), v to m ngun cho lp da trn mt XML Schema (mc 5.11).

Bin i mt ti liu XML thnh mt ti liu khc bng XSLT stylesheet (mc 5.12).

1.

Hin th cu trc ca mt ti liu XML trong TreeView


Bn cn hin th cu trc v ni dung ca mt ti liu XML trong mt ng dng da-trn-Windows. Np ti liu XML bng lp System.Xml.XmlDocument. Sau , vit mt phng thc chuyn mt XmlNode thnh mt System.Windows.Forms.TreeNode, ri gi n mt cch quy duyt qua ton b ti liu.

.NET Framework cung cp nhiu cch khc nhau x l cc ti liu XML. Cch m bn s dng ty thuc vo tc v cn lp trnh. Mt trong s l lp XmlDocument. Lp ny cung cp mt dng biu din trong-b-nh cho mt ti liu XML, tun theo W3C Document Object Model (DOM); cho php bn duyt qua cc nt theo bt k hng no, chn v loi b nt, v thay i ng cu trc lc chy. Bn hy vo [http://www.w3c.org] bit thm chi tit v DOM. s dng lp XmlDocument, bn ch vic to mt th hin ca lp ny ri gi phng thc Load cng vi mt tn file, mt Stream, mt TextReader, hay mt XmlReader (bn cng c th cung cp mt URL ch n mt ti liu XML). Th hin XmlDocument s cha tt c cc nt (dng cy) c trong ti liu ngun. im nhp (entry point) dng truy xut cc nt ny l phn t gc, c cp thng qua thuc tnh XmlDocument.DocumentElement. y l mt i tng XmlElement, c th cha nhiu i tng XmlNode lng bn trong, cc i tng ny c th cha nhiu i tng XmlNode na, v c tip tc nh th. Mt XmlNode l phn cu thnh c bn ca mt file XML. Mt nt XML c th l mt phn t (element), mt c tnh (attribute), li ch thch, hay text.

160 Chng 5: XML

Khi lm vic vi XmlNode hay mt lp dn xut t (nh XmlElement hay XmlAttribute), bn c th s dng cc thuc tnh c bn sau y:
ChildNodes l tp hp cc nt lng bn trong mc u tin. Name l tn ca nt. NodeType l mt thnh vin thuc kiu lit k System.Xml.XmlNodeType, cho bit kiu

ca nt (phn t, c tnh, text...).


Value l ni dung ca nt, nu l nt text hay nt CDATA. Attributes l tp hp cc nt m t cc c tnh c p dng cho phn t. InnerText l chui cha gi tr (text) ca nt hin hnh v tt c cc nt lng bn trong. InnerXml l chui cha th nh du XML cho tt c cc nt lng bn trong. OuterXml l chui cha th nh du XML cho nt hin hnh v tt c cc nt lng bn

trong. V d di y duyt qua tt c cc nt ca mt XmlDocument (bng thuc tnh ChildNodes v mt phng thc quy) ri hin th chng trong mt TreeView.
using System; using System.Windows.Forms; using System.Xml; public class XmlTreeDisplay : System.Windows.Forms.Form{ private System.Windows.Forms.Button cmdLoad; private System.Windows.Forms.Label lblFile; private System.Windows.Forms.TextBox txtXmlFile; private System.Windows.Forms.TreeView treeXml; // (B qua phn m designer.) private void cmdLoad_Click(object sender, System.EventArgs e) { // Xa cy. treeXml.Nodes.Clear();

// Np ti liu XML. XmlDocument doc = new XmlDocument(); try { doc.Load(txtXmlFile.Text); }catch (Exception err) {

161 Chng 5: XML MessageBox.Show(err.Message); return; }

// d liu vo TreeView. ConvertXmlNodeToTreeNode(doc, treeXml.Nodes);

// M rng tt c cc nt. treeXml.Nodes[0].ExpandAll(); } private void ConvertXmlNodeToTreeNode(XmlNode xmlNode, TreeNodeCollection treeNodes) { // Thm mt TreeNode m t XmlNode ny. TreeNode newTreeNode = treeNodes.Add(xmlNode.Name);

// Ty bin phn text cho TreeNode da vo // kiu v ni dung ca XmlNode. switch (xmlNode.NodeType) { case XmlNodeType.ProcessingInstruction: case XmlNodeType.XmlDeclaration: newTreeNode.Text = "<?" + xmlNode.Name + " " + xmlNode.Value + "?>"; break; case XmlNodeType.Element: newTreeNode.Text = "<" + xmlNode.Name + ">"; break; case XmlNodeType.Attribute: newTreeNode.Text = "ATTRIBUTE: " + xmlNode.Name; break; case XmlNodeType.Text: case XmlNodeType.CDATA: newTreeNode.Text = xmlNode.Value; break; case XmlNodeType.Comment: newTreeNode.Text = "<!--" + xmlNode.Value + "-->";

162 Chng 5: XML

break; } // Gi phng thc ny mt cch quy cho mi c tnh // (XmlAttribute l mt lp con ca XmlNode). if (xmlNode.Attributes != null) {

foreach (XmlAttribute attribute in xmlNode.Attributes) { ConvertXmlNodeToTreeNode(attribute, newTreeNode.Nodes); } } // Gi phng thc ny mt cch quy cho mi nt con. foreach (XmlNode childNode in xmlNode.ChildNodes) { ConvertXmlNodeToTreeNode(childNode, newTreeNode.Nodes); } } }

Xt file XML di y (ProductCatalog.xml):


<?xml version="1.0" ?> <productCatalog> <catalogName>Jones and Jones Unique Catalog 2004</catalogName> <expiryDate>2005-01-01</expiryDate> <products> <product id="1001"> <productName>Gourmet Coffee</productName> <description>The finest beans from rare Chilean plantations.</description> <productPrice>0.99</productPrice> <inStock>true</inStock> </product> <product id="1002"> <productName>Blue China Tea Pot</productName> <description>A trendy update for tea drinkers.</description> <productPrice>102.99</productPrice> <inStock>true</inStock>

163 Chng 5: XML </product> </products> </productCatalog>

Hnh 5.1 Cu trc ca mt ti liu XML


[

Hnh 5.2 InnerText ca phn t gc

Hnh 5.3 InnerXml ca phn t gc

164 Chng 5: XML

Hnh 5.4 OuterXml ca phn t gc

2.

Chn thm nt vo ti liu XML


Bn cn iu chnh mt ti liu XML bng cch chn vo d liu mi, hoc bn mun to mt ti liu hon ton mi trong b nh. To nt bng mt phng thc ca XmlDocument (nh CreateElement, CreateAttribute, CreateNode...). K tip, chn n vo bng mt phng thc ca XmlNode (nh InsertAfter, InsertBefore, hay AppendChild).

Chn mt nt vo XmlDocument bao gm hai bc: to nt ri chn n vo v tr thch hp. Sau , bn c th gi XmlDocument.Save lu li nhng thay i. to mt nt, bn s dng mt trong cc phng thc ca XmlDocument bt u bng t Create, ty thuc vo kiu ca nt. Vic ny bo m nt s c cng khng gian tn nh phn cn li ca ti liu (bn cng c th cung cp mt khng gian tn lm i s). K tip, bn phi tm mt nt ph hp v s dng mt trong cc phng thc chn ca n thm nt mi vo. V d di y trnh by k thut ny bng cch to mt ti liu XML mi:
using System; using System.Xml;

public class GenerateXml {

private static void Main() {

// To mt ti liu mi rng. XmlDocument doc = new XmlDocument(); XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null); doc.AppendChild(docNode);

// To v chn mt phn t mi.

165 Chng 5: XML XmlNode productsNode = doc.CreateElement("products"); doc.AppendChild(productsNode);

// To mt phn t lng bn trong (cng vi mt c tnh). XmlNode productNode = doc.CreateElement("product"); XmlAttribute productAttribute = doc.CreateAttribute("id"); productAttribute.Value = "1001"; productNode.Attributes.Append(productAttribute); productsNode.AppendChild(productNode);

// To v thm cc phn t con cho nt product ny // (cng vi d liu text). XmlNode nameNode = doc.CreateElement("productName"); nameNode.AppendChild(doc.CreateTextNode("Gourmet Coffee")); productNode.AppendChild(nameNode); XmlNode priceNode = doc.CreateElement("productPrice"); priceNode.AppendChild(doc.CreateTextNode("0.99")); productNode.AppendChild(priceNode);

// To v thm mt nt product khc. productNode = doc.CreateElement("product"); productAttribute = doc.CreateAttribute("id"); productAttribute.Value = "1002"; productNode.Attributes.Append(productAttribute); productsNode.AppendChild(productNode); nameNode = doc.CreateElement("productName"); nameNode.AppendChild(doc.CreateTextNode("Blue China Tea Pot")); productNode.AppendChild(nameNode); priceNode = doc.CreateElement("productPrice"); priceNode.AppendChild(doc.CreateTextNode("102.99")); productNode.AppendChild(priceNode);

// Lu ti liu. doc.Save(Console.Out); Console.ReadLine(); } }

166 Chng 5: XML

Ti liu c to ra trng ging nh sau:


<?xml version="1.0" encoding="UTF-8"?> <products> <product id="1001"> <productName>Gourmet Coffee</productName> <productPrice>0.99</productPrice> </product> <product id="1002"> <productName>Blue China Tea Pot</productName> <productPrice>102.99</productPrice> </product> </products>

3.

Chn thm nt vo ti liu XML mt cch nhanh chng


Bn cn chn thm nt vo mt ti liu XML m khng phi dng n m lnh di dng. Vit cc phng thc tr gip (nhn vo tn th v ni dung ca nt) chn nt vo ti liu XML. Cch khc, s dng phng thc XmlDocument.CloneNode sao li cc nhnh ca mt XmlDocument.

Chn mt nt vo XmlDocument cn nhiu m lnh. C nhiu cch thu ngn m lnh ny. Mt cch l to mt lp tr gip (helper) gm cc phng thc mc-cao chn nt vo ti liu. V d, bn c th vit phng thc AddElement to mt phn t mi, chn n vo, v thm text (y l ba thao tc cn thit khi chn phn t). V d di y l mt lp tr gip nh th:
using System; using System.Xml;

public class XmlHelper {

public static XmlNode AddElement(string tagName, string textContent, XmlNode parent) {

XmlNode node = parent.OwnerDocument.CreateElement(tagName); parent.AppendChild(node);

167 Chng 5: XML if (textContent != null) {

XmlNode content; content = parent.OwnerDocument.CreateTextNode(textContent); node.AppendChild(content); } return node; } public static XmlNode AddAttribute(string attributeName, string textContent, XmlNode parent) {

XmlAttribute attribute; attribute = parent.OwnerDocument.CreateAttribute(attributeName); attribute.Value = textContent; parent.Attributes.Append(attribute);

return attribute; } }

By gi bn c th vit m lnh to mt ti liu XML (ging mc 5.2) vi c php n gin hn nh sau:


public class GenerateXml { private static void Main() { // To ti liu. XmlDocument doc = new XmlDocument(); XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null); doc.AppendChild(docNode); XmlNode products = doc.CreateElement("products"); doc.AppendChild(products); // Thm hai product. XmlNode product = XmlHelper.AddElement("product", null, products); XmlHelper.AddAttribute("id", "1001", product); XmlHelper.AddElement("productName", "Gourmet Coffee", product);

168 Chng 5: XML

XmlHelper.AddElement("productPrice", "0.99", product);

product = XmlHelper.AddElement("product", null, products); XmlHelper.AddAttribute("id", "1002", product); XmlHelper.AddElement("productName", "Blue China Tea Pot", product); XmlHelper.AddElement("productPrice", "102.99", product);

// Lu ti liu. doc.Save(Console.Out); Console.ReadLine(); } }

Bn cng c th ly cc phng thc tr gip (nh AddAttribute v AddElement) lm cc phng thc th hin trong mt lp ty bin dn xut t XmlDocument. Mt cch khc n gin ha vic vit XML l sao li cc nt bng phng thc XmlNode.CloneNode. Phng thc ny nhn mt i s lun l. Nu gi tr ny l true, CloneNode s sao li ton b nhnh, vi tt c cc nt lng bn trong. V d di y to mt nt product mi bng cch sao li nt u tin:
// (Thm nt product u tin.)

// To mt product mi da vo product hin c. product = product.CloneNode(true);

// iu chnh d liu. product.Attributes[0].Value = "1002"; product.ChildNodes[0].ChildNodes[0].Value = "Blue China Tea Pot"; product.ChildNodes[1].ChildNodes[0].Value = "102.99";

// Thm phn t mi. products.AppendChild(product);

Ch trong trng hp ny, c mt s gi nh c p t ln cc nt hin c (v d, gi nh con u tin ca nt lun l productName, v con th hai lun l productPrice). Nu gi nh ny khng bo m ng, bn cn phi xt tn ca nt.

169 Chng 5: XML

4.

Tm mt nt khi bit tn ca n
Bn cn thu ly mt nt c th trong mt XmlDocument, v bn bit tn ca n nhng khng bit v tr ca n. S dng phng thc XmlDocument.GetElementsByTagName, phng thc ny s d tm ton b ti liu v tr v tp hp System.Xml.XmlNodeList cha cc nt c so trng.

Lp XmlDocument cung cp phng thc GetElementsByTagName dng tm ra cc nt c tn cho trc. N tr v kt qu l mt tp hp cc i tng XmlNode. on m di y trnh by cch s dng GetElementsByTagName tnh tng gi cc item trong mt danh mc bng cch thu ly tt c cc phn t c tn l "productPrice":
using System; using System.Xml; public class FindNodesByName { private static void Main() { // Np ti liu. XmlDocument doc = new XmlDocument(); doc.Load("ProductCatalog.xml"); // Thu ly tt c price. XmlNodeList prices = doc.GetElementsByTagName("productPrice"); decimal totalPrice = 0; foreach (XmlNode price in prices) {

// Ly phn text bn trong ca mi phn t c so trng. totalPrice += Decimal.Parse(price.ChildNodes[0].Value); } Console.WriteLine("Total catalog value: " + totalPrice.ToString()); Console.ReadLine(); } }

Bn

cng

th

tm

mt

phn

ti

liu

XML

bng

phng

thc

XmlElement.GetElementsByTagName (phng thc ny s d tt c cc nt con tm ra nt

170 Chng 5: XML

trng khp). s dng phng thc ny, trc ht ly mt XmlNode tng ng vi mt phn t, k p i tng ny thnh mt XmlElement. V d di y trnh by cch tm nt price bn di phn t product u tin:
// Thu ly tham chiu n product u tin. XmlNode product = doc.GetElementsByTagName("products")[0];

// Tm nt price bn di product ny. XmlNode price = ((XmlElement)product).GetElementsByTagName("productPrice")[0]; Console.WriteLine("Price is " + price.InnerText);

Nu cc phn t ca bn c cha c tnh ID, bn cng c th s dng mt phng thc c tn l GetElementById thu ly phn t c gi tr ID trng khp.

5.

Thu ly cc nt XML trong mt khng gian tn XML c th


Bn cn thu ly cc nt trong mt khng gian tn c th bng mt XmlDocument. S dng phin bn np chng ca phng thc
XmlDocument. GetElementsByTagName (yu cu mt tn khng gian tn lm i s). Ngoi ra, p

dng du hoa th (*) vo i s tn th nu bn mun so trng tt c cc th. Nhiu ti liu XML cha cc nt thuc nhiu khng gian tn khc nhau. V d, ti liu XML m t mt bi bo khoa hc c th s dng mt kiu nh du ring biu th cc phng trnh ton hc v cc biu vector. Hoc mt ti liu XML vi cc thng tin v t hng c th kt hp cc thng tin v khch hng v n t hng cng vi mt h s vn chuyn. Tng t, mt ti liu XML m t mt giao dch thng mi c th bao gm nhng phn thuc c hai cng ty, v nhng phn ny c vit theo ngn ng nh du ring. Mt tc v thng thng trong lp trnh XML l thu ly cc phn t thuc mt khng gian tn c th. Bn c th thc hin tc v ny vi phin bn np chng ca phng thc XmlDocument.GetElementsByTagName (yu cu mt tn khng gian tn lm i s). Bn c th s dng phng thc ny tm cc th theo tn, hoc tm tt c cc th trong khng gian tn c ch nh nu bn p dng du hoa th vo i s tn th. V d, ti liu XML phc hp di y bao gm cc thng tin v n t hng v khch hng trong hai khng gian tn khc nhau l http://mycompany/OrderML v http://mycompany/ClientML.
<?xml version="1.0" ?> <ord:order xmlns:ord="http://mycompany/OrderML" xmlns:cli="http://mycompany/ClientML">

<cli:client>

171 Chng 5: XML <cli:firstName>Sally</cli:firstName> <cli:lastName>Sergeyeva</cli:lastName> </cli:client>

<ord:orderItem itemNumber="3211"/> <ord:orderItem itemNumber="1155"/>

</ord:order>

chng

trnh

di

chn

tt

cc

th

trong

khng

gian

tn

http://mycompany/OrderML: using System; using System.Xml;

public class SelectNodesByNamespace {

private static void Main() {

// Np ti liu. XmlDocument doc = new XmlDocument(); doc.Load("Order.xml");

// Thu ly tt c cc th t hng. XmlNodeList matches = doc.GetElementsByTagName("*", "http://mycompany/OrderML");

// Hin th thng tin. Console.WriteLine("Element \tAttributes"); Console.WriteLine("******* \t**********");

foreach (XmlNode node in matches) {

Console.Write(node.Name + "\t"); foreach (XmlAttribute attribute in node.Attributes) { Console.Write(attribute.Value + " } Console.WriteLine(); } ");

172 Chng 5: XML

Console.ReadLine(); } }

Kt xut ca chng trnh ny nh sau:


Element ******* ord:order ord:orderItem ord:orderItem Attributes ********** http://mycompany/OrderML 3211 1155 http://mycompany/ClientML

6.

Tm cc phn t vi biu thc XPath


Bn cn duyt mt ti liu XML tm cc nt theo mt tiu chun tm kim cp cao. V d, bn c th mun duyt mt nhnh c th ca mt ti liu XML tm cc nt c cc c tnh no hoc cha mt s lng nt con lng bn trong. Thc thi mt biu thc XPath bng phng thc SelectNodes hay SelectSingleNode ca lp XmlDocument.

Lp XmlNode nh ngha hai phng thc dng tm kim da vo biu thc Xpath l SelectNodes v SelectSingleNode. Hai phng thc ny thao tc trn tt c cc nt con. V XmlDocument tha k t XmlNode nn bn c th gi XmlDocument.SelectNodes d tm ton b mt ti liu. Xt ti liu XML m t mt n t hng gm hai item:
<?xml version="1.0"?> <Order id="2004-01-30.195496"> <Client id="ROS-930252034"> <Name>Remarkable Office Supplies</Name> </Client>

<Items> <Item id="1001"> <Name>Electronic Protractor</Name> <Price>42.99</Price> </Item> <Item id="1002"> <Name>Invisible Ink</Name>

173 Chng 5: XML <Price>200.25</Price> </Item> </Items> </Order>

C php ca XPath s dng k hiu ging nh ng dn. V d, ng dn /Order/Items/Item cho bit phn t <Item> lng bn trong phn t <Items>, v phn t <Items> lng bn trong phn t gc <Order>. V d di y s dng mt ng dn tuyt i tm tn ca tt c cc item trong mt n t hng:
using System; using System.Xml;

public class XPathSelectNodes {

private static void Main() {

// Np ti liu. XmlDocument doc = new XmlDocument(); doc.Load("orders.xml");

// Thu ly tn ca tt c cc item. // Vic ny khng th hon tt d dng vi phng thc // GetElementsByTagName(), v cc phn t Name c s dng // bn trong cc phn t Item v cc phn t Client, v do // c hai kiu ny u s c tr v. XmlNodeList nodes = doc.SelectNodes("/Order/Items/Item/Name");

foreach (XmlNode node in nodes) { Console.WriteLine(node.InnerText); }

Console.ReadLine(); } }

Kt xut ca chng trnh ny nh sau:


Electronic Protractor Invisible Ink

XPath cung cp mt c php tm kim mnh. Do khng th gii thch tt c cc bin th ca n ch trong mt mc ngn nh th ny, nn bng 5.1 ch trnh by cc phn chnh trong mt

174 Chng 5: XML

biu thc XPath v cc v d m t cch lm vic ca chng vi ti liu XML trn. hiu chi tit hn, bn hy tham kho ti liu W3C XPath ti [http://www.w3.org/TR/xpath].
Bng 5.1 C php ca biu thc XPath Biu thc M t

Bt u mt ng dn tuyt i (chn t nt gc).


/ /Order/Items/Item chn tt c cc phn t Item l con ca mt phn t Items, m bn thn Items l con ca phn t gc Order.

Bt u mt ng dn tng i (chn nt bt c u).


// //Item/Name chn tt c cc phn t Name l con ca mt phn t Item, bt

chp chng xut hin u trong ti liu.


@

Chn mt c tnh ca mt nt.


/Order/@id chn c tnh c tn l id t phn t gc Order.

Chn bt c phn t no trong ng dn.


* /Order/* chn nt Items v Client v c hai u nm trong phn t gc Order.

Kt hp nhiu ng dn.
| /Order/Items/Item/Name|Order/Client/Name chn cc nt Name dng

m t mt Client v cc nt Name dng m t mt Item. Cho bit nt (mc nh) hin hnh.
.

Nu nt hin hnh l mt Order, biu thc ./Items ch n cc item lin quan vi n t hng . Cho bit nt cha.
//Name/.. chn phn t l cha ca mt Name, gm cc phn t Client v Item.

..

nh ngha tiu chun chn la (selection criteria), c th kim tra gi tr ca mt nt bn trong hay ca mt c tnh.
/Order[@id="2004-01-30.195496"] chn cc phn t Order vi gi tr c [ ]

tnh cho trc.


/Order/Items/Item[Price > 50] chn cc sn phm c gi trn $50. /Order/Items/Item[Price > 50 and Name="Laser Printer"] chn cc sn

phm trng khp vi c hai tiu chun. Hm ny thu ly cc phn t da vo phn text khi u ca phn t nm bn trong.
/Order/Items/Item[starts-with(Name,"C")] tm tt c cc phn t Item

starts-with

c phn t Name bt u bng mu t C.

175 Chng 5: XML

position

Hm ny thu ly cc phn t da vo v tr.


/Order/Items/Item[position()=2] chn phn t Item th hai.

count

Hm ny m s phn t. Bn cn ch nh tn ca phn t con cn m hoc du hoa th (*) cho tt c cc phn t con.


/Order/Items/Item[count(Price)=1] thu ly cc phn t Item c ng mt

phn t Price lng bn trong.

Biu thc XPath v tt c tn phn t v c tnh m bn s dng trong lun c phn bit ch hoa-thng, v bn thn XML c phn bit ch hoa-thng.

7. c v ghi XML m khng phi np ton b ti liu vo b nh



Bn cn c XML t mt stream, hoc ghi n ra mt stream. Tuy nhin, bn mun x l tng nt mt, khng phi np ton b vo b nh vi mt XmlDocument. ghi XML, hy to mt XmlTextWriter bc ly mt stream v s dng cc phng thc Write (nh WriteStartElement v WriteEndElement). c XML, hy to mt XmlTextReader bc ly mt stream v gi phng thc Read dch chuyn t nt ny sang nt khc.

Lp XmlTextWriter v XmlTextReader c/ghi XML trc tip t stream tng nt mt. Cc lp ny khng cung cp cc tnh nng dng duyt v thao tc ti liu XML nh XmlDocument, nhng hiu nng cao hn v vt b nh nh hn, c bit khi bn lm vic vi cc ti liu XML cc k ln. ghi XML ra bt k stream no, bn c th s dng XmlTextWriter. Lp ny cung cp cc phng thc Write dng ghi tng nt mt, bao gm:
WriteStartDocumentghi phn khi u ca ti liu; v WriteEndDocument, ng bt

k phn t no ang m cui ti liu.


WriteStartElementghi mt th m (opening tag) cho phn t bn ch nh. K ,

bn c th thm nhiu phn t lng bn trong phn t ny, hoc bn c th gi WriteEndElement ghi th ng (closing tag).
WriteElementStringghi mt phn t, cng vi mt th m, mt th ng, v ni

dung text.
WriteAttributeStringghi mt c tnh cho phn t ang m gn nht, cng vi tn

v gi tr. S dng cc phng thc ny thng cn t m lnh hn l to mt XmlDocument bng tay, nh c trnh by trong mc 5.2 v 5.3. c XML, bn s dng phng thc Read ca XmlTextReader. Phng thc ny tin reader n nt k tip, v tr v true. Nu khng cn nt no na, n s tr v false. Bn c th thu ly thng tin v nt hin ti thng qua cc thuc tnh ca XmlTextReader (bao gm Name, Value, v NodeType).

176 Chng 5: XML

nhn bit mt phn t c cc c tnh hay khng, bn phi kim tra thuc tnh HasAttributes v ri s dng phng thc GetAttribute thu ly cc c tnh theo tn hay theo ch s. Lp XmlTextReader ch c th truy xut mt nt ti mt thi im, v n khng th dch chuyn ngc hay nhy sang mt nt bt k. Do , tnh linh hot ca n km hn lp XmlDocument. ng dng di y ghi v c mt ti liu XML bng lp XmlTextWriter v XmlTextReader. Ti liu ny ging vi ti liu c to trong mc 5.2 v 5.3 bng lp XmlDocument.
using System; using System.Xml; using System.IO; using System.Text;

public class ReadWriteXml {

private static void Main() {

// To file v writer. FileStream fs = new FileStream("products.xml", FileMode.Create); XmlTextWriter w = new XmlTextWriter(fs, Encoding.UTF8);

// Khi ng ti liu. w.WriteStartDocument(); w.WriteStartElement("products");

// Ghi mt product. w.WriteStartElement("product"); w.WriteAttributeString("id", "1001"); w.WriteElementString("productName", "Gourmet Coffee"); w.WriteElementString("productPrice", "0.99"); w.WriteEndElement();

// Ghi mt product khc. w.WriteStartElement("product"); w.WriteAttributeString("id", "1002"); w.WriteElementString("productName", "Blue China Tea Pot"); w.WriteElementString("productPrice", "102.99");

177 Chng 5: XML w.WriteEndElement();

// Kt thc ti liu. w.WriteEndElement(); w.WriteEndDocument(); w.Flush(); fs.Close();

Console.WriteLine("Document created. " + "Press Enter to read the document."); Console.ReadLine();

fs = new FileStream("products.xml", FileMode.Open); XmlTextReader r = new XmlTextReader(fs);

// c tt c cc nt. while (r.Read()) {

if (r.NodeType == XmlNodeType.Element) {

Console.WriteLine(); Console.WriteLine("<" + r.Name + ">");

if (r.HasAttributes) {

for (int i = 0; i < r.AttributeCount; i++) { Console.WriteLine("\tATTRIBUTE: " + r.GetAttribute(i)); } } } else if (r.NodeType == XmlNodeType.Text) { Console.WriteLine("\tVALUE: " + r.Value); } } Console.ReadLine(); }

178 Chng 5: XML

8.

Xc nhn tnh hp l ca mt ti liu XML da trn mt Schema


Bn cn xc nhn tnh hp l ca mt ti liu XML bng cch bo m n tun theo mt XML Schema. S dng lp System.Xml.XmlValidatingReader. To mt th hin ca lp ny, np Schema vo tp hp XmlValidatingReader.Schemas, dch chuyn qua tng nt mt bng cch gi XmlValidatingReader.Read, v bt bt c ngoi l no. tm tt c cc li trong mt ti liu m khng phi bt ngoi l, hy th l s kin ValidationEventHandler.

Mt XML Schema (gin XML) nh ngha cc quy tc m mt kiu ti liu XML cho trc phi tun theo. Cc quy tc ny nh ngha: Cc phn t v c tnh c th xut hin trong ti liu. Cc kiu d liu cho phn t v c tnh. Cu trc ca ti liu, bao gm cc phn t no l con ca cc phn t khc. Th t v s lng cc phn t con xut hin trong ti liu. Cc phn t no l rng, c th cha text, hay i hi cc gi tr c nh.

Bn su v cc ti liu XML Schema vt qu phm vi ca chng ny, nhng bn c th tm hiu n thng qua mt v d n gin. Mc ny s s dng ti liu XML m t danh mc sn phm c trnh by trong mc 5.1. mc c bn nht, XML Schema Definition (XSD) c s dng nh ngha cc phn t c th xut hin trong ti liu XML. Bn thn ti liu XSD c vit theo dng XML, v bn s dng mt phn t c nh ngha trc (c tn l <element>) ch nh cc phn t s cn thit trong ti liu ch. c tnh type cho bit kiu d liu. V d di y l tn sn phm:
<xsd:element name="productName" type="xsd:string" />

V v d di y l gi sn phm:
<xsd:element name="productPrice" type="xsd:decimal" />

Bn c th tm hiu cc kiu d liu Schema ti [http://www.w3.org/TR/xmlschema-2]. Chng nh x n cc kiu d liu .NET v bao gm string, int, long, decimal, float, dateTime, boolean, base64Binary... C productName v productPrice u l cc kiu n gin v chng ch cha d liu dng k t. Cc phn t c cha cc phn t lng bn trong c gi l cc kiu phc tp. Bn c th lng chng vo nhau bng th <sequence> (nu th t l quan trng) hay th <all> (nu th t l khng quan trng). Di y l cch lp phn t <product> vo danh mc sn phm. Ch

179 Chng 5: XML

rng, cc c tnh lun c khai bo sau cc phn t, v chng khng c nhm vi th <sequence> hay <all> v th t khng quan trng.
<xsd:complexType name="product"> <xsd:sequence> <xsd:element name="productName" type="xsd:string"/> <xsd:element name="productPrice" type="xsd:decimal"/> <xsd:element name="inStock" type="xsd:boolean"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:integer"/> </xsd:complexType>

Theo mc nh, mt phn t c th xut hin ng mt ln trong mt ti liu. Nhng bn c th cu hnh iu ny bng cch ch nh cc c tnh maxOccurs v minOccurs. V d di y khng gii hn s lng sn phm trong danh mc:
<xsd:element name="product" type="product" maxOccurs="unbounded" />

Di y l Schema cho danh mc sn phm:


<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<!-- nh ngha product (kiu phc). --> <xsd:complexType name="product"> <xsd:sequence> <xsd:element name="productName" type="xsd:string"/> <xsd:element name="productPrice" type="xsd:decimal"/> <xsd:element name="inStock" type="xsd:boolean"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:integer"/> </xsd:complexType>

<!-- y l cu trc m ti liu phi tun theo. Bt u vi phn t productCatalog. --> <xsd:element name="productCatalog"> <xsd:complexType> <xsd:sequence> <xsd:element name="catalogName" type="xsd:string"/> <xsd:element name="expiryDate" type="xsd:date"/>

<xsd:element name="products">

180 Chng 5: XML

<xsd:complexType> <xsd:sequence> <xsd:element name="product" type="product" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element>

</xsd:schema>

Lp XmlValidatingReader thc thi tt c cc quy tc Schema nybo m ti liu l hp l v n cng kim tra ti liu XML c chnh dng hay cha (ngha l khng c cc k t bt hp l, tt c cc th m u c mt th ng tng ng, v.v...). kim tra mt ti liu, hy dng phng thc XmlValidatingReader.Read duyt qua tng nt mt. Nu tm thy li, XmlValidatingReader dng ln s kin ValidationEventHandler vi cc thng tin v li. Nu mun, bn c th th l s kin ny v tip tc kim tra ti liu tm thm li. Nu bn khng th l s kin ny, ngoi l XmlException s c dng ln khi bt gp li u tin v qu trnh kim tra s b b d. kim tra mt ti liu c chnh dng hay cha, bn c th s dng XmlValidatingReader m khng cn n Schema. V d k tip trnh by mt lp tin ch dng hin th tt c cc li trong mt ti liu XML khi phng thc ValidateXml c gi. Cc li s c hin th trong mt ca s Console, v mt bin lun l c tr v cho bit qu trnh kim tra thnh cng hay tht bi.
using System; using System.Xml; using System.Xml.Schema;

public class ConsoleValidator {

// Thit lp thnh true nu tn ti t nht mt li. private bool failed;

public bool Failed { get {return failed;} }

181 Chng 5: XML public bool ValidateXml(string xmlFilename, string schemaFilename) {

// To validator. XmlTextReader r = new XmlTextReader(xmlFilename); XmlValidatingReader validator = new XmlValidatingReader(r); validator.ValidationType = ValidationType.Schema;

// Np Schema vo validator. XmlSchemaCollection schemas = new XmlSchemaCollection(); schemas.Add(null, schemaFilename); validator.Schemas.Add(schemas);

// Thit lp phng thc th l s kin validation. validator.ValidationEventHandler += new ValidationEventHandler(ValidationEventHandler);

failed = false; try { // c tt c d liu XML. while (validator.Read()) {} }catch (XmlException err) { // iu ny xy ra khi ti liu XML c cha k t bt // hp l hoc cc th lng nhau hay ng khng ng. Console.WriteLine("A critical XML error has occurred."); Console.WriteLine(err.Message); failed = true; }finally { validator.Close(); }

return !failed; }

private void ValidationEventHandler(object sender, ValidationEventArgs args) {

182 Chng 5: XML

failed = true;

// Hin th li validation. Console.WriteLine("Validation error: " + args.Message); Console.WriteLine(); } }

Di y l cch s dng lp ny xc nhn tnh hp l ca danh mc sn phm:


using System;

public class ValidateXml {

private static void Main() {

ConsoleValidator consoleValidator = new ConsoleValidator(); Console.WriteLine("Validating ProductCatalog.xml.");

bool success = consoleValidator.ValidateXml("ProductCatalog.xml", "ProductCatalog.xsd"); if (!success) { Console.WriteLine("Validation failed."); }else { Console.WriteLine("Validation succeeded."); }

Console.ReadLine(); } }

Nu ti liu hp l th s khng c thng bo no xut hin, v bin success s c thit lp thnh true. Nhng xt xem iu g s xy ra nu bn s dng mt ti liu ph v cc quy tc Schema, chng hn file ProductCatalog_Invalid.xml nh sau:
<?xml version="1.0" ?> <productCatalog> <catalogName>Acme Fall 2003 Catalog</catalogName> <expiryDate>Jan 1, 2004</expiryDate>

183 Chng 5: XML

<products> <product id="1001"> <productName>Magic Ring</productName> <productPrice>$342.10</productPrice> <inStock>true</inStock> </product> <product id="1002"> <productName>Flying Carpet</productName> <productPrice>982.99</productPrice> <inStock>Yes</inStock> </product> </products> </productCatalog>

Nu bn kim tra ti liu ny, bin success s c thit lp thnh false v kt xut s cho bit cc li:
Validating ProductCatalog_Invalid.xml.

Validation error: The 'expiryDate' element has an invalid value according to its data type. An error occurred at file:///I:/CSharp/Chuong05/05-08/ bin/Debug/ProductCatalog_Invalid.xml, (4, 30).

Validation error: The 'productPrice' element has an invalid value according to its data type. An error occurred at file:///I:/CSharp/Chuong05/05-08/ bin/Debug/ProductCatalog_Invalid.xml, (9, 36).

Validation error: The 'inStock' element has an invalid value according to its data type. An error occurred at file:///I:/CSharp/Chuong05/05-08/ bin/Debug/ProductCatalog_Invalid.xml, (15, 27).

Validation failed.

Cui cng, nu mun xc nhn tnh hp l ca mt ti liu XML v ri x l n, bn c th s dng XmlValidatingReader qut ti liu khi n c c vo mt XmlDocument trong-bnh:
XmlDocument doc = new XmlDocument(); XmlTextReader r = new XmlTextReader("ProductCatalog.xml"); XmlValidatingReader validator = new XmlValidatingReader(r);

// Np Schema vo validator. validator.ValidationType = ValidationType.Schema;

184 Chng 5: XML

XmlSchemaCollection schemas = new XmlSchemaCollection(); schemas.Add(null, "ProductCatalog.xsd"); validator.Schemas.Add(schemas);

// Np v kim tra ti liu cng mt lc. try { doc.Load(validator); // (Validation thnh cng.) }catch (XmlSchemaException err) { // (Validation tht bi.) }

9.

S dng XML Serialization vi cc i tng ty bin


Bn cn s dng XML nh mt nh dng tun t ha (serialization format). Tuy nhin, bn khng mun x l XML trc tip trong m lnh, m mun tng tc vi d liu bng cc i tng ty bin. S dng lp System.Xml.Serialization.XmlSerializer chuyn d liu t i tng ca bn sang XML, v ngc li. Bn cng c th nh du m lnh ca lp bng cc c tnh ty bin biu din XML ca n.

Lp XmlSerializer cho php chuyn cc i tng thnh d liu XML, v ngc li. Lp ny thng minh to ng cc mng khi n tm thy cc phn t lng bn trong. Cc yu cu khi s dng XmlSerializer:
XmlSerializer ch tun t ha cc thuc tnh v cc bin cng khai.

Cc lp cn tun t ha phi cha mt phng thc khi dng mc nh khng c i s. XmlSerializer s s dng phng thc khi dng ny khi to i tng mi trong qu trnh gii tun t ha. Cc thuc tnh ca lp phi l kh-c (readable) v kh-ghi (writable). l v XmlSerializer s dng hm truy xut thuc tnh get ly thng tin v hm truy xut thuc tnh set phc hi d liu sau khi gii tun t ha. Bn cng c th lu tr cc i tng theo nh dng da-trn-XML bng cch s dng .NET Serialization v System.Runtime.Serialization.Formatters.Soap. SoapFormatter. Trong trng hp ny, bn ch cn lm cho lp ca bn tr thnh kh-tun-t-ha, khng cn cung cp phng thc khi dng mc nh hay bo m tt c cc thuc tnh l kh ghi. Tuy nhin, cch ny khng cho bn quyn kim sot trn nh dng XML -c-tun-t-ha.

185 Chng 5: XML

s dng XML serialization, trc ht bn phi nh du cc i tng d liu vi cc c tnh cho bit php nh x sang XML. Cc c tnh ny thuc khng gian tn System.Xml.Serialization v bao gm:
XmlRootcho bit tn phn t gc ca file XML. Theo mc nh, XmlSerializer s s

dng tn ca lp. c tnh ny c th c p dng khi khai bo lp.


XmlElementcho bit tn phn t dng cho mt thuc tnh hay bin cng khai. Theo

mc nh, XmlSerializer s s dng tn ca thuc tnh hay bin cng khai.


XmlAttributecho bit mt thuc tnh hay bin cng khai s c tun t ha thnh

mt c tnh (khng phi phn t), v ch nh tn c tnh.


XmlEnumcu hnh phn text s c s dng khi tun t ha cc gi tr lit k. Nu

bn khng s dng XmlEnum, tn ca hng lit k s c s dng.


XmlIgnorecho bit mt thuc tnh hay bin cng khai s khng c tun t ha.

V d, xt danh mc sn phm c trnh by trong mc 5.1. Bn c th m t ti liu XML ny bng cc i tng ProductCatalog v Product nh sau:
using System; using System.Xml.Serialization;

[XmlRoot("productCatalog")] public class ProductCatalog {

[XmlElement("catalogName")] public string CatalogName; // S dng kiu d liu ngy (b qua phn gi). [XmlElement(ElementName="expiryDate", DataType="date")] public DateTime ExpiryDate; // Cu hnh tn th. [XmlArray("products")] [XmlArrayItem("product")] public Product[] Products; public ProductCatalog() { // Phng thc khi dng mc nh (dng khi gii tun t ha). }

public ProductCatalog(string catalogName, DateTime expiryDate) { this.CatalogName = catalogName;

186 Chng 5: XML

this.ExpiryDate = expiryDate; } }

public class Product {

[XmlElement("productName")] public string ProductName;

[XmlElement("productPrice")] public decimal ProductPrice;

[XmlElement("inStock")] public bool InStock;

[XmlAttributeAttribute(AttributeName="id", DataType="integer")] public string Id;

public Product() { // Phng thc khi dng mc nh (dng khi gii tun t ha). }

public Product(string productName, decimal productPrice) { this.ProductName = productName; this.ProductPrice = productPrice; } }

Ch rng, cc lp ny s dng cc c tnh XML Serialization i tn phn t (s dng kiu k hiu Pascal1 trong tn thnh vin lp, v kiu k hiu lng lc 2 trong tn th XML), cho bit cc kiu d liu khng r rng, v ch nh cc phn t <product> s c lng bn trong <productCatalog> nh th no. Bng cch s dng cc lp ty bin ny v i tng XmlSerializer, bn c th chuyn XML thnh cc i tng v ngc li. on m di y to mt i tng ProductCatalog mi,
1 2

Pascal casing: Mu t u tin ca cc ch u vit hoa, v d SomeOtherName

Camel casing: Mu t u tin ca ch u vit thng, mu t u tin ca cc ch i sau vit hoa, v d someOtherName

187 Chng 5: XML

tun t ha i tng thnh ti liu XML, gii tun t ha ti liu thnh i tng, v ri hin th ti liu ny:
using System; using System.Xml; using System.Xml.Serialization; using System.IO;

public class SerializeXml {

private static void Main() {

// To danh mc sn phm. ProductCatalog catalog = new ProductCatalog("New Catalog", DateTime.Now.AddYears(1)); Product[] products = new Product[2]; products[0] = new Product("Product 1", 42.99m); products[1] = new Product("Product 2", 202.99m); catalog.Products = products;

// Tun t ha danh mc ra file. XmlSerializer serializer = new XmlSerializer(typeof(ProductCatalog)); FileStream fs = new FileStream("ProductCatalog.xml", FileMode.Create); serializer.Serialize(fs, catalog); fs.Close();

catalog = null;

// Gii tun t ha danh mc t file. fs = new FileStream("ProductCatalog.xml", FileMode.Open); catalog = (ProductCatalog)serializer.Deserialize(fs);

// Tun t ha danh mc ra ca s Console. serializer.Serialize(Console.Out, catalog); Console.ReadLine(); }

188 Chng 5: XML

10.

To XML Schema cho mt lp .NET


Bn cn to mt XML Schema da trn mt hay nhiu lp C#. iu ny cho php bn kim tra tnh hp l ca cc ti liu XML trc khi gii tun t ha chng vi XmlSerializer. S dng tin ch dng lnh XML Schema Definition Tool (xsd.exei km vi .NET Framework). Ch nh tn ca assembly lm i s dng lnh, v thm i s /t:[TypeName] cho bit kiu cn chuyn i.

Mc 5.9 trnh by cch s dng XmlSerializer tun t ha i tng .NET thnh XML, v gii tun t ha XML thnh i tng .NET. Nhng nu mun s dng XML nh mt phng cch tng tc vi cc ng dng khc, quy trnh nghip v, hay cc ng dng phiFramework, bn s cn xc nhn tnh hp l ca XML trc khi gii tun t ha n. Bn cng s cn to mt ti liu XML Schema nh ngha cu trc v cc kiu d liu c s dng trong nh dng XML ca bn, cc ng dng khc c th lm vic vi n. Mt gii php l s dng tin ch dng lnh xsd.exe. Tin ch xsd.exe i km vi .NET Framework. Nu ci t Microsoft Visual Studio .NET, bn s tm thy n trong th mc C:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Bin. Tin ch xsd.exe c th to ra XML Schema t mt assembly c bin dch. Bn ch cn cung cp tn file v cho bit lp m t ti liu XML vi i s /t:[TypeName]. V d, xt cc lp ProductCatalog v Product c trnh by trong mc 5.9. Bn c th to XML Schema cho mt danh mc sn phm vi dng lnh sau:
xsd 05-09.exe /t:ProductCatalog

Bn ch cn ch nh lp ProductCatalog trn dng lnh, v lp ny m t ti liu XML. XML Schema c to ra trong v d ny (c tn mc nh l schema0.xsd) s m t y mt danh mc sn phm, vi cc item sn phm lng bn trong. By gi, bn c th s dng XmlValidatingReader ( c trnh by trong mc 5.8) kim tra tnh hp l ca ti liu XML da vo XML Schema ny.

11.

To lp t mt XML Schema
Bn cn to mt hay nhiu lp C# da trn mt XML Schema; sau , bn c th to mt ti liu XML theo nh dng ph hp bng cc i tng ny v XmlSerializer. S dng tin ch dng lnh xsd.exe (i km vi .NET Framework). Ch nh tn file Schema lm i s dng lnh, v thm i s /c cho bit bn mun to m lnh cho lp.

189 Chng 5: XML

Mc 5.10 gii thiu tin ch dng lnh xsd.exe, tin ch ny c th c s dng to XML Schema da trn nh ngha lp. Qu trnh ngc li (to m lnh C# da trn mt ti liu XML Schema) cng c th xy ra. Vic ny hu ch khi bn mun ghi mt nh dng XML no , nhng li khng mun to ti liu ny bng cch ghi tng nt mt vi lp XmlDocument hay XmlTextWriter. Thay vo , bng cch s dng xsd.exe, bn c th to ra mt tp y cc i tng .NET. K , bn c th tun t ha cc i tng ny thnh biu din XML bng XmlSerializer, nh c m t trong mc 5.9. to m lnh t mt XML Schema, bn ch cn cung cp tn file Schema v thm i s /c cho bit bn mun to ra lp. V d, xt XML Schema c trnh by trong mc 5.8. Bn c th to m lnh C# t Schema ny vi dng lnh sau:
xsd ProductCatalog.xsd /c

Lnh ny s to ra mt file (ProductCatalog.cs) gm hai lp: Product v productCalalog. Hai lp ny tng t vi hai lp c to trong mc 5.9.

12.

Thc hin php bin i XSL


Bn cn bin i mt ti liu XML thnh mt ti liu khc bng XSLT stylesheet. S dng lp System.Xml.Xsl.XslTransform. Np XSLT stylesheet bng phng thc XslTransform.Load, v to ti liu kt xut bng phng thc Transform (cn cung cp ti liu ngun).

XSLT (hay XSL Transforms) l mt ngn ng da-trn-XML, c thit k bin i mt ti liu XML thnh mt ti liu khc. XSLT c th c s dng to mt ti liu XML mi vi cng d liu nhng c sp xp theo mt cu trc khc hoc chn mt tp con d liu trong mt ti liu. N cng c th c s dng to mt kiu ti liu c cu trc khc. XSLT thng c s dng theo cch ny nh dng mt ti liu XML thnh mt trang HTML. XSLT l mt ngn ng a nng, v vic to XSL Transforms vt qu phm vi quyn sch ny. Tuy nhin, bn c th hc cch to cc ti liu XSLT n gin bng cch xem mt v d c bn. Mc ny s bin i ti liu orders.xml ( c trnh by trong mc 5.6) thnh mt ti liu HTML v ri hin th kt qu. thc hin php bin i ny, bn s cn XSLT stylesheet nh sau:
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" >

<xsl:template match="Order"> <html><body><p> Order <b><xsl:value-of select="Client/@id"/></b> for <xsl:value-of select="Client/Name"/></p> <table border="1">

190 Chng 5: XML

<td>ID</td><td>Name</td><td>Price</td> <xsl:apply-templates select="Items/Item"/> </table></body></html> </xsl:template>

<xsl:template match="Items/Item"> <tr> <td><xsl:value-of select="@id"/></td> <td><xsl:value-of select="Name"/></td> <td><xsl:value-of select="Price"/></td> </tr> </xsl:template>

</xsl:stylesheet>

V c bn, mi XSL stylesheet gm mt tp cc template. Mi template so trng vi cc phn t trong ti liu ngun v ri m t cc phn t c so trng to nn ti liu kt qu. so trng template, ti liu XSLT s dng biu thc XPath, nh c m t trong mc 5.6. Stylesheet va trnh by trn (orders.xslt) gm hai template (l cc con ca phn t stylesheet gc). Template u tin trng khp vi phn t Order gc. Khi b x l XSLT tm thy mt phn t Order, n s ghi ra cc th cn thit bt u mt bng HTML vi cc tiu ct thch hp v chn d liu v khch hng bng lnh value-of (ghi ra kt qu dng text ca mt biu thc XPath). Trong trng hp ny, cc biu thc XPath (Client/@id v Client/Name) trng vi c tnh id v phn t Name. K tip, lnh apply-templates c s dng phn nhnh v x l cc phn t Item nm trong. iu ny l cn thit v c th c nhiu phn t Item. Mi phn t Item c so trng bng biu thc Items/Item (nt gc Order khng c ch nh v Order chnh l nt hin ti). Cui cng, cc th cn thit s c ghi ra kt thc ti liu HTML. Nu thc thi php bin i ny trn file orders.xml ( trnh by trong mc 5.6), bn s nhn c kt qu (ti liu HTML) nh sau:
<html> <body> <p> Order <b>ROS-930252034</b> for Remarkable Office Supplies</p> <table border="1"> <td>ID</td> <td>Name</td>

191 Chng 5: XML <td>Price</td> <tr> <td>1001</td> <td>Electronic Protractor</td> <td>42.99</td> </tr> <tr> <td>1002</td> <td>Invisible Ink</td> <td>200.25</td> </tr> </table> </body> </html>

p dng mt XSLT stylesheet trong .NET, bn cn s dng lp XslTransform. ng dng di y p dng php bin i v ri hin th file c bin i trong ca s trnh duyt web. Trong v d ny, m lnh s dng phin bn np chng ca phng thc Transform lu trc tip ti liu kt qu ra a, mc d bn c th thu ly v x l n nh mt stream bn trong ng dng ca bn.
using System; using System.Windows.Forms; using System.Xml.Xsl;

public class TransformXml : System.Windows.Forms.Form {

private AxSHDocVw.AxWebBrowser webBrowser;

// (B qua phn m designer.)

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

XslTransform transform = new XslTransform();

// Np XSL stylesheet. transform.Load("orders.xslt");

// Bin i orders.xml thnh orders.html. transform.Transform("orders.xml", "orders.html", null);

192 Chng 5: XML

object var = null; webBrowser.Navigate( "file:///" + Application.StartupPath + @"\orders.html", ref var, ref var, ref var, ref var); } }

Hnh 5.5 Kt xut stylesheet cho orders.xml

.NET Framework khng c iu kim no dng th hin ni dung HTML. Tuy nhin, chc nng ny c th c c thng qua kh nng lin tc COM nu bn s dng iu kim ActiveX Web Browser (i cng Microsoft Internet Explorer v h iu hnh Microsoft Windows). Ca s ny c th hin th cc file HTML cc b hay xa, v h tr JavaScript, VBScript, v tt c cc plug-in cho Internet Explorer (xem mc 11.4 bit cch thm iu kim Web Browser vo d n).

193

Chng 6:WINDOWS FORM

194

195 Chng 6: Windows Form

icrosoft .NET Framework cha mt tp phong ph cc lp dng to cc ng dng da-trn-Windows truyn thng trong khng gian tn System.Windows. Forms. Cc lp ny c phm vi t cc phn c bn nh cc lp TextBox, Button, v MainMenu n cc iu kim chuyn bit nh TreeView, LinkLabel, v NotifyIcon. Ngoi ra, bn s tm thy tt c cc cng c cn thit qun l cc ng dng giao din a ti liu (Multiple Document InterfaceMDI), tch hp vic tr gip cm-ng-cnh, v ngay c to cc giao din ngi dng a ngn ngtt c u khng cn vin n s phc tp ca Win32 API. Hu ht cc nh pht trin C# c th t nm bt nhanh chng m hnh lp trnh Windows Form. Tuy nhin, c mt s th thut v k thut khng tn nhiu thi gian c th lm cho vic lp trnh Windows hiu qu hn. Chng ny s trnh by cc vn sau y:

Cch khai thc trit cc iu kim, bao gm thm chng vo form lc thc thi (mc
6.1), lin kt chng vi d liu no (mc 6.2), v x l chng mt cch tng qut (mc 6.3).

Cch lm vic vi form, bao gm theo vt chng trong mt ng dng (mc 6.4), s
dng MDI (mc 6.5), v lu tr thng tin v kch thc v v tr (mc 6.6). Bn cng s bit cch to form a ngn ng (mc 6.13) v form khng ng vin (mc 6.14 v 6.15).

Mt s th thut khi lm vic vi cc iu kim thng dng nh


mc 6.12).

ListBox (mc 6.7),

TextBox (mc 6.8), ComboBox (mc 6.9), ListView (mc 6.10), v Menu (mc 6.11 v

Cch to mt icon ng trong khay h thng (mc 6.16). Cc khi nim m bn c th p dng cho nhiu kiu iu kim, bao gm xc nhn tnh
hp l (mc 6.17), ko-v-th (mc 6.18), tr gip cm-ng-cnh (mc 6.19), phong cch Windows XP (mc 6.20), v c ca form (mc 6.21).

Hu ht cc mc trong chng ny s dng cc lp iu kim, lun c nh ngha trong khng gian tn System.Windows.Forms. Khi a vo cc lp ny, tn khng gian tn y khng c ch nh, v Systems.Windows.Forms c tha nhn.

1.

Thm iu kim vo form lc thc thi


Bn cn thm mt iu kim vo form lc thc thi, khng phi lc thit k. To mt i tng ca lp iu kim thch hp. K , thm i tng ny vo mt form hoc mt iu kim container bng phng thc Add ca ControlCollection.

Trong mt ng dng da-trn-Windows .NET, khng c s khc bit no gia vic to iu kim lc thit k v vic to iu kim lc thc thi. Khi bn to mt iu kim lc thit k (s dng cng c Microsoft Visual Studio .NET), on m cn thit s c thm vo lp form, c th l trong mt phng thc c bit c tn l InitializeComponent. Bn c th s dng

196 Chng 6: Windows Form

on m ging nh vy trong ng dng ca bn to iu kim. Bn cn thc hin cc bc sau: 1. 2. 3. 4. To mt i tng ca lp iu kim thch hp. Cu hnh cc thuc tnh ca iu kim (c bit l kch thc v ta v tr). Thm iu kim ny vo form hoc iu kim container. Ngoi ra, nu cn th l cc s kin cho iu kim mi, bn c th gn chng vo cc phng thc hin c.

Mi iu kim u cung cp thuc tnh Controls tham chiu n ControlCollection cha tt c cc iu kim con ca n. thm mt iu kim con, bn cn gi phng thc ControlCollection.Add. V d sau y s lm r iu ny bng cch to ng mt danh sch cc CheckBox. Mt CheckBox c thm vo cho mi item trong mt mng. Tt c cc CheckBox c thm vo mt Panel (Panel c thuc tnh AutoScroll l true c th cun qua danh sch cc CheckBox).

Hnh 6.1 Danh sch cc CheckBox c-to-ng using System; using System.Windows.Forms; public class DynamicCheckBox : System.Windows.Forms.Form { // (B qua phn m designer.) private void DynamicCheckBox_Load(object sender, System.EventArgs e) { // To mng. string[] foods = {"Grain", "Bread", "Beans", "Eggs", "Chicken", "Milk", "Fruit", "Vegetables",

197 Chng 6: Windows Form "Pasta", "Rice", "Fish", "Beef"}; int topPosition = 10; foreach (string food in foods) { // To mt CheckBox mi. CheckBox checkBox = new CheckBox(); checkBox.Left = 10; checkBox.Top = topPosition; topPosition += 30; checkBox.Text = food; // Thm CheckBox vo form. panel.Controls.Add(checkBox); } } }

2.

Lin kt d liu vo iu kim


Bn cn lin kt mt i tng vo mt iu kim c th (c th l lu tr vi thng tin no lin quan n mt item cho trc). Lu tr mt tham chiu n i tng trong thuc tnh Tag ca iu kim.

Mi lp dn xut t System.Windows.Forms.Control u cung cp thuc tnh Tag v bn c th s dng n lu tr mt tham chiu n bt k kiu i tng no. Thuc tnh Tag khng c iu kim hay Microsoft .NET Framework s dng m n c dnh lm ni lu tr cc thng tin c th ca ng dng. Ngoi ra, mt vi lp khc khng dn xut t Control cng cung cp thuc tnh Tag, chng hn cc lp ListViewItem v TreeNode (trnh by cc item trong mt ListView hoc TreeView). Mt lp khng cung cp thuc tnh Tag l MenuItem. Thuc tnh Tag c nh ngha l mt kiu Object, ngha l bn c th s dng n lu tr bt k kiu gi tr hoc kiu tham chiu no, t mt s hoc chui n gin cho n mt i tng ty bin do bn nh ngha. Khi ly d liu t thuc tnh Tag, bn s cn p (kiu) i tng thnh kiu gc ca n. V d sau y thm danh sch cc file vo mt ListView. i tng FileInfo tng ng vi mi file c lu tr trong thuc tnh Tag. Khi ngi dng nhp p vo mt trong cc item, ng dng s ly i tng FileInfo t thuc tnh Tag v hin th kch thc file trong mt MessageBox (xem hnh 6.2).
using System; using System.Windows.Forms;

198 Chng 6: Windows Form

using System.IO;

public class TagPropertyExample : System.Windows.Forms.Form ( // (B qua phn m designer.) private void TagPropertyExample_Load(object sender, System.EventArgs e) { // Ly tt c cc file trong th mc gc a C. DirectoryInfo directory = new DirectoryInfo("C:\\"); FileInfo[] files = directory.GetFiles(); // Hin th tt c cc file trong ListView. foreach (FileInfo file in files) {

ListViewItem item = listView.Items.Add(file.Name); item.ImageIndex = 0; item.Tag = file; } }

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

// Ly kch thc file. ListViewItem item = ((ListView)sender).SelectedItems[0]; FileInfo file = (FileInfo)item.Tag; string info = file.FullName + " is " + file.Length + " bytes.";

// Hin th kch thc file. MessageBox.Show(info, "File Information"); } }

199 Chng 6: Windows Form

Hnh 6.2 Lu tr d liu trong thuc tnh Tag

3.

X l tt c cc iu kim trn form


Bn cn thc hin mt tc v chung cho tt c cc iu kim trn form (v d, ly hay xa thuc tnh Text ca chng, thay i mu hay thay i kch thc ca chng). Duyt ( quy) qua tp hp cc iu kim. Tng tc vi mi iu kim bng cc thuc tnh v phng thc ca lp Control c s.

Bn c th duyt qua cc iu kim trn form bng tp hp Form.Controls, tp ny cha tt c cc iu kim nm trc tip trn b mt form. Tuy nhin, nu vi iu kim trong s l iu kim container (nh GroupBox, Panel, hoc TabPage), chng c th cha nhiu iu kim na. Do , cn s dng k thut quy kim tra tp hp Controls. V d sau y trnh by mt form thc hin k thut quy tm mi TextBox c trn form v xa i ton b text trong . Form s kim tra mi iu kim xc nh xem n c phi l TextBox hay khng bng ton t typeof.
using System; using System.Windows.Forms;

public class ProcessAllControls : System.Windows.Forms.Form {

// (B qua phn m designer.)

private void cmdProcessAll_Click(object sender, System.EventArgs e) { ProcessControls(this); }

private void ProcessControls(Control ctrl) {

200 Chng 6: Windows Form

// B qua iu kim tr khi n l TextBox. if (ctrl.GetType() == typeof(TextBox)) { ctrl.Text = ""; }

// X l cc iu kim mt cch quy. // iu ny cn thit khi c mt iu kim cha nhiu // iu kim khc (v d, khi bn s dng Panel, // GroupBox, hoc iu kim container no khc). foreach (Control ctrlChild in ctrl.Controls) { ProcessControls(ctrlChild); } } }

4.

Theo vt cc form kh kin trong mt ng dng


Bn mun gi li vt ca tt c form hin ang c hin th. y l trng hp thng gp khi bn mun mt form c th tng tc vi mt form khc. To mt lp gi cc tham chiu n cc i tng Form. Lu tr cc tham chiu ny bng bin tnh.

.NET khng cung cp cch xc nh form no ang c hin th trong mt ng dng (ngoi tr ng dng MDI, s c m t trong mc 6.5). Nu mun xc nh form no ang tn ti, form no ang c hin th, hoc bn mun mt form c th gi cc phng thc v thit lp cc thuc tnh ca mt form khc th bn cn phi gi li vt ca cc i tng form. thc hin yu cu trn, hy to mt lp gm cc thnh vin tnh; lp ny c th theo vt cc form ang m bng mt tp hp, hay cc thuc tnh chuyn bit. V d, lp di y c th theo vt hai form:
public class OpenForms { public static Form MainForm; public static Form SecondaryForm; }

Khi form chnh hoc form ph c hin th, chng s t ng k vi lp OpenForms. Ni hp l t on m ny l trong phng thc th l s kin Form.Load.
private void MainForm_Load(object sender, EventArgs e) {

201 Chng 6: Windows Form

// ng k i tng form va c to. OpenForms.MainForm = this; }

Bn c th s dng on m tng t g b tham chiu khi form b ng.


private void MainForm_Unload(object sender, EventArgs e) { // G b i tng form. OpenForms.MainForm = null; }

By gi, mt form khc c th tng tc vi form ny thng qua lp OpenForms. V d, di y l cch form chnh lm n form ph:
if (OpenForms.SecondaryForm != null) { OpenForms.SecondaryForm.Hide(); }

Trong cch tip cn ny, chng ta gi s mi form c to ch mt ln. Nu bn c mt ng dng da-trn-ti-liu (document-based application), trong , ngi dng c th to nhiu i tng ca cng mt form, bn cn theo vt cc form ny bng mt tp hp. Tp hp ArrayList di y l mt v d:
public class OpenForms {

public static Form MainForm; public static ArrayList DocForms = new ArrayList(); }

Theo , form c th t thm vo tp hp khi cn, nh c trnh by trong on m sau y:


private void DocForm_Load(object sender, EventArgs e) {

// ng k i tng form va c to. OpenForms.DocForms.Add(this); }

5.

Tm tt c cc form trong ng dng MDI


Bn cn tm tt c cc form hin ang c hin th trong mt ng dng giao din a ti liu (Multiple Document Interface). Duyt qua cc form trong tp hp MdiChildren ca form MDI cha.

.NET Framework c hai li tt thun li cho vic qun l cc ng dng MDI: thuc tnh MdiChildren v MdiParent ca lp Form. Bn c th xt thuc tnh MdiParent ca bt k form

202 Chng 6: Windows Form

MDI con no tm form cha. Bn c th s dng tp hp MdiChildren ca form MDI cha tm tt c cc form con. V d sau y (xem hnh 6.3) s hin th tt c cc form con. Mi form con gm mt Label (cha thng tin v ngy gi), v mt Button. Khi ngi dng nhp vo Button, phng thc th l s kin s duyt qua tt c cc form con v hin th dng ch trong Label (vi thuc tnh ch-c). Di y l phn m cho form con:
public class MDIChild : System.Windows.Forms.Form { private System.Windows.Forms.Button cmdShowAllWindows; private System.Windows.Forms.Label label; // (B qua phn m designer.) public string LabelText {

get { return label.Text; } } private void cmdShowAllWindows_Click(object sender, System.EventArgs e) {

// Duyt qua tp hp cc form con. foreach (Form frm in this.MdiParent.MdiChildren) { // p kiu tham chiu Form thnh MDIChild. MDIChild child = (MDIChild)frm; MessageBox.Show(child.LabelText, frm.Text); } }

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

label.Text = DateTime.Now.ToString(); }

203 Chng 6: Windows Form }

Ch rng, khi on m duyt qua tp hp cc form con, n phi chuyn (p kiu) tham chiu Form thnh MDIChild c th s dng thuc tnh LabelText.

Hnh 6.3 Ly thng tin t cc form MDI con

6.

Lu tr kch thc v v tr ca form


Bn cn lu tr kch thc v v tr ca mt form (c th thay i kch thc c) v phc hi n li trong ln hin th form k tip. Lu tr cc thuc tnh Left, Top, Width, v Height ca form trong Windows Registry.

Windows Registry l ni l tng lu tr thng tin v v tr v kch thc cho form. C th, bn s lu tr thng tin v mi form trong mt kha c lp (c th s dng tn ca form lm kha). Cc kha ny s c lu tr ngay di kha ng dng. Bn cn to mt lp chuyn bit lu v ly cc thit lp cho form. Lp FormSettingStore c trnh by di y cung cp hai phng thc: SaveSettingsnhn vo mt form v ghi thng tin v kch thc v v tr ca n vo Registry; v ApplySettingsnhn vo mt form v p dng cc thit lp t Registry. ng dn ca kha v tn ca kha con c lu tr thnh cc bin thnh vin lp.
using System; using System.Windows.Forms; using Microsoft.Win32; public class FormSettingStore { private string regPath; private string formName; private RegistryKey key;

204 Chng 6: Windows Form

public string RegistryPath { get {return regPath;) }

public string FormName { get {return formName;} } public FormSettingStore(string registryPath, string formName) { this.regPath = registryPath; this.formName = formName; // To kha nu n cha tn ti. key = Registry.LocalMachine.CreateSubKey( registryPath + formName); } public void SaveSettings(System.Windows.Forms.Form form) { key.SetValue("Height", form.Height); key.SetValue("Width", form.Width); key.SetValue("Left", form.Left); key.SetValue("Top", form.Top); } public void ApplySettings(System.Windows.Forms.Form form) { form.Height = (int)key.GetValue("Height", form.Height); form.Width = (int)key.GetValue("Width", form.Width); form.Left = (int)key.GetValue("Left", form.Left); form.Top = (int)key.GetValue("Top", form.Top); } }

205 Chng 6: Windows Form

s dng lp FormSettingStore, bn ch cn thm on m th l s kin di y vo bt k form no. on m ny s lu cc thuc tnh ca form khi form ng v phc hi chng khi form c np.
private FormSettingStore formSettings; private void Form1_Load(object sender, System.EventArgs e) { formSettings = new FormSettingStore(@"Software\MyApp\", this.Name); formSettings.ApplySettings(this); } private void Form1_Closed(object sender, System.EventArgs e) { formSettings.SaveSettings(this); }

Nh rng, vic truy xut Registry c th b gii hn cn c vo ti khon ngi dng hin hnh v chnh sch bo mt truy xut m lnh (Code Access Security Policy). Khi bn to mt ng dng yu cu truy xut Registry, assembly s yu cu truy xut Registry bng yu cu quyn ti thiu (minimum permission requests c m t trong mc 13.7).

7.

Buc ListBox cun xung


Bn cn cun mt ListBox (bng m lnh) nhng item no trong danh sch c th c nhn thy. Thit lp thuc tnh ListBox.TopIndex (thit lp item c nhn thy u tin).

Trong vi trng hp, bn c mt ListBox lu tr mt lng thng tin ng k hoc mt ListBox m bn phi thm thng tin vo mt cch nh k. Thng th thng tin mi nht (c thm vo cui danh sch) li l thng tin quan trng hn thng tin u danh sch. Mt gii php l cun ListBox c th nhn thy cc item va mi thm vo. Form di y (gm mt ListBox v mt Button) s thm 20 item vo danh sch ri cun n trang cui cng bng thuc tnh TopIndex (xem hnh 6.4):
using System; using System.Windows.Forms;

public class ListBoxScrollTest : System.Windows.Forms.Form {

// (B qua phn m designer.)

206 Chng 6: Windows Form

int counter = 0;

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

for (int i = 0; i < 20; i++) {

counter++; listBox1.Items.Add("Item " + counter.ToString()); } listBox1.TopIndex = listBox1.Items.Count - 1; } }

Hnh 6.4 Cun ListBox n trang cui cng

8.

Ch cho php nhp s vo TextBox


Bn cn to mt TextBox sao cho TextBox ny b qua tt c cc c nhn phm khng phi s. Thm phng thc th l s kin TextBox.KeyPress. Trong phng thc ny, thit lp thuc tnh KeyPressEventArgs.Handled l true b qua c nhn phm khng hp l.

Cch tt nht hiu chnh u vo bt hp l l khng cho n c nhp ngay t u. iu ny d dng hin thc vi TextBox v n cung cp s kin KeyPress, s kin ny xy ra sau khi c nhn phm c tip nhn nhng trc khi n c hin th. Bn c th s dng thng

207 Chng 6: Windows Form

s s kin KeyPressEventArgs hy b c nhn phm khng hp l bng cch t thuc tnh Handled l true. u vo ch l s, bn cn cho php mt c nhn phm ch khi n tng ng vi mt s (0 n 9) hoc mt phm iu khin c bit (nh phm delete hoc mi tn). K t va nhn c cp cho s kin KeyPress thng qua thuc tnh KeyPressEventArgs.KeyChar. Bn c th s dng hai phng thc tnh ca lp System.Char l IsDigit v IsControl kim tra nhanh k t. Di y l phng thc th l s kin m bn s s dng ngn u vo khng phi s:
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) {

if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar)) { e.Handled = true; } }

Ch rng on m ny b qua du phn cch thp phn. cho php k t ny, bn cn sa li on m nh sau:
// Ly k t phn cch thp phn trn nn ny // ("." i vi US-English). string decimalString = Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator; char decimalChar = Convert.ToChar(decimalString);

if (Char.IsDigit(e.KeyChar) || Char.IsControl(e.KeyChar)) {} else if (e.KeyChar == decimalString && textBox1.Text.IndexOf(decimalString) == -1) {} else { e.Handled = true; }

on m ny ch cho php mt du phn cch thp phn, nhng n khng gii hn s ch s c th c dng. N cng khng cho php nhp s m (bn c th thay i iu ny bng cch cho php du tr - l k t u tin). Nh rng, on m ny cng gi nh bn nhp khng gian tn System.Threading.

9.

S dng ComboBox c tnh nng auto-complete


Bn cn to mt ComboBox t ng hon tt nhng g ngi dng g vo da trn danh sch cc item ca n.

208 Chng 6: Windows Form

Bn c th hin thc mt ComboBox c tnh nng auto-complete bng cch to mt iu kim ty bin chp phng thc OnKeyPress v OnTextChanged.

C nhiu bin th khc nhau i vi iu kim c tnh nng auto-complete. i lc, iu kim lp y cc gi tr da trn danh sch cc phn va chn (nh Microsoft Excel thng lm khi bn nhp gi tr cho cell) hoc x xung mt danh sch cc gi tr gn ging (nh Microsoft Internet Explorer thng lm khi bn g URL). Bn c th to mt ComboBox c tnh nng auto-complete bng cch th l s kin KeyPress v TextChanged, hoc bng cch to mt lp ty bin dn xut t ComboBox v chp phng thc OnKeyPress v OnTextChanged. Trong phng thc OnKeyPress, ComboBox xc nh c thc hin mt thay th auto-complete hay khng. Nu ngi dng nhn mt phm k t (mt mu t chng hn) th vic thay th c th c thc hin, nhng nu ngi dng nhn mt phm iu khin (phm backspace hoc phm mi tn chng hn) th khng thc hin g c. Phng thc OnTextChanged thc hin vic thay th sau khi vic x l phm hon tt. Phng thc ny tm item trng khp u tin i vi phn text hin thi, ri thm vo phn cn li ca text trng khp. Sau khi text c thm vo, ComboBox s chn (bi en) cc k t gia im chn hin ti v im cui ca text. Vic ny cho php ngi dng tip tc g v thay th auto-complete nu n khng phi l nhng g ngi dng mun. Di y l phn m cho lp AutoCompleteComboBox:
using System; using System.Windows.Forms; public class AutoCompleteComboBox : ComboBox { // Bin c dng khi mt phm c bit c nhn // (trong trng hp ny, thao tc thay th text s b b qua). private bool controlKey = false; // Xc nh xem phm c bit c c nhn hay khng. protected override void OnKeyPress( System.Windows.Forms.KeyPressEventArgs e) { base.OnKeyPress(e); if (e.KeyChar == (int)Keys.Escape) { // Xa text. this.SelectedIndex = -1; this.Text = ""; controlKey = true;

209 Chng 6: Windows Form } else if (Char.IsControl(e.KeyChar)) { controlKey = true; } else { controlKey = false; } } // Thc hin thay th text. protected override void OnTextChanged(System.EventArgs e) {

base.OnTextChanged(e);

if (this.Text != "" && !controlKey) {

// Tm kim item trng khp. string matchText = this.Text; int match = this.FindString(matchText);

// Nu tm thy th chn n vo. if (match != -1) {

this.SelectedIndex = match;

// Chn (bi en) phn text va thm vo // n c th c thay th nu ngi dng kip tc g. this.SelectionStart = matchText.Length; this.SelectionLength = this.Text.Length - this.SelectionStart; } } } }

th nghim AutoCompleteComboBox, bn c th to mt client n gin: thm ComboBox vo form v thm mt s t (word) vo ComboBox. Trong v d ny, cc t c ly t mt file text v ComboBox c thm vo form bng m lnh. Bn cng c th bin dch lp

210 Chng 6: Windows Form

AutoCompleteComboBox thnh mt Class Library Assembly c lp ri thm n vo hp cng

c, th l bn c th thm n vo form lc thit k.


using System; using System.Windows.Forms; using System.Drawing; using System.IO; public class AutoCompleteComboBoxTest : System.Windows.Forms.Form {

// (B qua phn m designer.) private void AutoCompleteComboBox_Load(object sender, System.EventArgs e) { // Thm ComboBox vo form. AutoCompleteComboBox combo = new AutoCompleteComboBox(); combo.Location = new Point(10,10); this.Controls.Add(combo);

// Thm mt s t (t mt file text) vo ComboBox. FileStream fs = new FileStream("words.txt", FileMode.Open); using (StreamReader r = new StreamReader(fs)) { while (r.Peek() > -1) { string word = r.ReadLine(); combo.Items.Add(word); } } } }

211 Chng 6: Windows Form Hnh 6.5 ComboBox c tnh nng auto-complete

10.

Sp xp ListView theo ct bt k
Bn cn sp xp mt ListView, nhng phng thc ni ti ListView.Sort ch sp xp cn c trn ct u tin. To mt hin thc cho giao din System.Collections.IComparer c th sp xp cc i tng ListViewItem (kiu IComparer c th sp xp da trn bt k tiu chun no bn mun). Thit lp thuc tnh ListView.ListViewItemSorter vi mt i tng ca kiu IComparer trc khi gi phng thc ListView.Sort.

ListView cung cp phng thc Sort sp cc item theo th t alphabet da trn phn text

trong ct u tin. Nu mun sp xp da trn cc gi tr ct khc hoc sp th t cc item theo bt k cch no khc, bn cn to mt hin thc ty bin ca giao din IComparer. Giao din IComparer nh ngha mt phng thc c tn l Compare, phng thc ny nhn vo hai i tng v xc nh i tng no s c sp trc. Lp ty bin ListViewItemComparer di y hin thc giao din IComparer v cp thm hai thuc tnh: Column v Numeric. Trong , Column cho bit ct no s c s dng sp xp; v Numeric l mt c Boolean, c thit lp l true nu mun thc hin vic so snh theo th t s thay v so snh theo th t alphabet.
using System; using System.Collections; using System.Windows.Forms;

public class ListViewItemComparer : IComparer {

private int column; private bool numeric = false;

public int Column {

get {return column;} set {column = value;} } public bool Numeric {

get {return numeric;} set {numeric = value;} }

212 Chng 6: Windows Form

public ListViewItemComparer(int columnIndex) { Column = columnIndex; } public int Compare(object x, object y) {

ListViewItem listX = (ListViewItem)x; ListViewItem listY = (ListViewItem)y;

if (Numeric) {

// Chuyn text thnh s trc khi so snh. // Nu chuyn i tht bi, s dng gi tr 0. decimal listXVal, listYVal; try { listXVal = Decimal.Parse(listX.SubItems[Column].Text); } catch { listXVal = 0; }

try { listYVal = Decimal.Parse(listY.SubItems[Column].Text); } catch { listYVal = 0; }

return Decimal.Compare(listXVal, listYVal); } else {

// Gi nguyn text nh dng chui // v thc hin so snh theo th t alphabetic.

213 Chng 6: Windows Form string listXText = listX.SubItems[Column].Text; string listYText = listY.SubItems[Column].Text;

return String.Compare(listXText, listYText); } } }

By gi, sp xp ListView, bn cn to mt i tng ListViewItemComparer, cu hnh cho n mt cch hp l, v ri thit lp n vo thuc tnh ListView.ListViewItemSorter trc khi gi phng thc ListView.Sort. Form di y trnh by mt th nghim n gin cho ListViewItemComparer. Mi khi ngi dng nhp vo header ca mt ct trong ListView th ListViewItemComparer s c to ra v c s dng sp xp danh sch da trn ct .
using System; using System.Windows.Forms; public class ListViewItemSort : System.Windows.Forms.Form { // (B qua phn m designer.) private void ListView1_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e) { ListViewItemComparer sorter = new ListViewItemComparer(e.Column); ListView1.ListViewItemSorter = sorter; ListView1.Sort(); } }

11.

Lin kt menu ng cnh vo iu kim


Bn cn lin kt mt menu ng cnh vo mi iu kim trn form (cc menu ny khc nhau). Tuy nhin, bn khng mun vit nhiu phng thc th l s kin ring r hin th menu ng cnh cho mi iu kim. Vit mt phng thc th l s kin chung thu ly i tng ContextMenu c kt hp vi iu kim, v ri hin th menu ny trn iu kim.

Bn c th lin kt mt iu kim vi mt menu ng cnh bng cch thit lp thuc tnh ContextMenu ca iu kim. Tuy nhin, y ch l mt thun li hin th menu ng cnh, bn phi thu ly menu v gi phng thc Show ca n. Thng thng, bn hin thc logic ny trong phng thc th l s kin MouseDown.

214 Chng 6: Windows Form

Thc ra, logic dng hin th menu ng cnh hon ton ging nhau, khng quan tm n iu kim g. Mi iu kim u h tr thuc tnh ContextMenu (c tha k t lp c s Control), ngha l bn c th d dng vit c mt phng thc th l s kin chung hin th cc menu ng cnh cho tt c cc iu kim. V d, xt mt form gm mt Label, mt PictureBox, v mt TextBox. Bn c th vit mt phng thc th l s kin MouseDown cho tt c cc i tng ny. on m di y kt ni tt c cc s kin ny vo mt phng thc th l s kin tn l Control_MouseDown:
this.label1.MouseDown += new MouseEventHandler(this.Control_MouseDown); this.pictureBox1.MouseDown += new MouseEventHandler(this.Control_MouseDown); this.textBox1.MouseDown += new MouseEventHandler(this.Control_MouseDown);

Phn m th l s kin hon ton c dng chung. N ch p kiu sender thnh Control, kim tra menu ng cnh, v hin th n.
private void Control_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {

if (e.Button == MouseButtons.Right) {

// Ly iu kim ngun. Control ctrl = (Control)sender;

if (ctrl.ContextMenu != null) {

// Hin th menu ng cnh. ctrl.ContextMenu.Show(ctrl, new Point(e.X, e.Y)); } } }

12.

S dng mt phn menu chnh cho menu ng cnh


Bn cn to mt menu ng cnh hin th cc item ging vi mt s item trong menu chnh ca ng dng. S dng phng thc CloneMenu ca lp MenuItem sao li mt phn ca menu chnh.

215 Chng 6: Windows Form

Trong nhiu ng dng, menu ng cnh ca mt iu kim sao li mt phn ca menu chnh. Tuy nhin, .NET khng cho php bn to mt i tng MenuItem cng lc nm trong nhiu menu. Gii php l to bn sao ca mt phn menu chnh bng phng thc CloneMenu. Phng thc ny khng ch chp cc item MenuItem (v cc submenu), m cn ng k mi i tng MenuItem vi cng phng thc th l s kin. Do , khi ngi dng nhp vo mt item trong menu ng cnh (bn sao), phng thc th l s kin tng ng s c thc thi nh th ngi dng nhp vo item trong menu chnh. V d, xt ng dng th nghim trong hnh 6.6. Trong v d ny, menu ng cnh cho TextBox hin th cc item ging nh trong menu File. y chnh l bn sao ca cc i tng MenuItem, nhng khi ngi dng nhp vo mt item, phng thc th l s kin tng ng s c thc thi.

Hnh 6.6 Chp mt phn menu chnh vo menu ng cnh

Di y l phn m cho form to v d ny. N s sao li cc item trong menu chnh khi form c np (ng tic l khng th thao tc vi cc item bn sao lc thit k).
using System; using System.Windows.Forms; using System.Drawing; public class ContextMenuCopy : System.Windows.Forms.Form { // (B qua phn m designer.) private void ContextMenuCopy_Load(object sender, System.EventArgs e) { ContextMenu mnuContext = new ContextMenu();

216 Chng 6: Windows Form

// Chp cc item t menu File vo menu ng cnh. foreach (MenuItem mnuItem in mnuFile.MenuItems) { mnuContext.MenuItems.Add(mnuItem.CloneMenu()); } // Gn menu ng cnh vo TextBox. TextBox1.ContextMenu = mnuContext; } private void TextBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {

if (e.Button == MouseButtons.Right){

TextBox1.ContextMenu.Show(TextBox1, new Point(e.X, e.Y)); } }

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

MessageBox.Show("This is the event handler for Open."); }

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

MessageBox.Show("This is the event handler for Save."); }

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

MessageBox.Show("This is the event handler for Exit."); } }

217 Chng 6: Windows Form

13.

To form a ngn ng
Bn cn to mt form c th bn a ha (localizable form); ngha l form ny c th c trin khai nhiu ngn ng khc nhau. Lu tr tt c cc thng tin bn a c th trong cc file resource (cc file ny s c bin dch thnh Satellite Assembly).

.NET Framework h tr s bn a ha (localization) thng qua vic s dng file resource. tng c bn l lu tr cc thng tin bn a c th (chng hn, phn text ca mt Button) trong mt file resource. Sau , bn c th to nhiu file resource cho nhiu bn a khc nhau ri bin dch chng thnh Satellite Assembly. Khi chy ng dng, .NET s t ng s dng ng Satellite Assembly da trn cc thit lp bn a (locale setting) ca my tnh hin hnh. Bn c th c v ghi cc file resource bng m lnh. Tuy nhin, Visual Studio .NET cng h tr vic thit k cc form c bn a ha: 1. 2. Trc tin, thit lp thuc tnh Localizable ca form l true trong ca s Properties. Thit lp thuc tnh Language ca form l bn a bn mun nhp thng tin cho n (xem hnh 6.7). K , cu hnh cc thuc tnh c th bn a ha ca tt c cc iu kim trn form. Thay v lu tr nhng thay i ny trong phn m thit k form, Visual Studio .NET to mt file resource mi lu tr d liu ca bn. Lp li bc 2 cho mi ngn ng bn mun h tr. Mi ln nh th, mt file resource mi s c to ra. Nu bn thay i thuc tnh Language thnh bn a m bn cu hnh th cc thit lp trc s xut hin tr li, v bn c th chnh sa chng.

3.

Hnh 6.7 Chn mt ngn ng bn a ha form

218 Chng 6: Windows Form

By gi, bn c th bin dch v th nghim ng dng trn cc h thng bn a khc nhau. Visual Studio .NET s to mt th mc v mt Satellite Assembly ring bit i vi mi file resource trong d n. Bn c th chn Project | Show All Files t thanh trnh n ca Visual Studio .NET xem cc file ny c b tr nh th no (xem hnh 6.8). Bn cng c th buc ng dng chp nhn mt bn a c th bng cch thay i thuc tnh Thread.CurrentUICulture. Tuy nhin, bn phi thay i thuc tnh ny trc khi form c np.

Hnh 6.8 Satellite assembly cho bn a Vietnamese using System; using System.Windows.Forms; using System.Threading; using System.Globalization; public class MultiLingualForm : System.Windows.Forms.Form { private System.Windows.Forms.Label label1; // (B qua phn m designer.) static void Main() {

219 Chng 6: Windows Form Thread.CurrentThread.CurrentUICulture = new CultureInfo("vi"); Application.Run(new MultiLingualForm()); } }

Bn cng c th s dng tin ch WinRes.exe (nm trong th mc \Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin) son tho thng tin resource. N cung cp trnh son tho form thu nh nhng khng c chc nng chnh sa m ngun, rt hu dng cho cc nh phin dch v cc chuyn gia phi lp trnh cn nhp cc thng tin bn a c th.

Hnh 6.9 Tin ch Windows Resource Localization Editor

Ngoi tin ch trn, bn cng c th s dng cc chng trnh chuyn dng bn a ha cc ng dng, chng hn RC-WinTrans (bn c th ti bn dng th ti [http://www.schaudin.com]). Chng trnh ny cho php bn pht trin cc d n phn mm a ngn ng hay bn a ha cc ng dng c sn trn nn Win32, .NET, v Java.

14.

To form khng th di chuyn c


Bn mun to mt form chim gi mt v tr c nh trn mn hnh v khng th di chuyn c. To mt form khng ng vin bng cch thit lp thuc tnh FormBorderStyle ca form l None.

Bn c th to mt form khng ng vin bng cch thit lp thuc tnh FormBorderStyle l None. Cc form ny khng th di chuyn c. V chng cng khng c kiu ng vin nu mun c ng vin xanh, bn phi t thm vo bng cch vit m hoc s dng hnh nn.

220 Chng 6: Windows Form

Cn mt cch khc to form khng th di chuyn c v c kiu ng vin ging iu kim. Trc tin, thit lp cc thuc tnh ControlBox, MinimizeBox, v MaximizeBox ca form l false. K tip, thit lp thuc tnh Text l chui rng. Khi , form s c ng vin ni mu xm hoc ng k mu en (ty thuc vo ty chn FormBorderStyle m bn s dng), tng t nh Button.

15.

Lm cho form khng ng vin c th di chuyn c


Bn mun to mt form khng c ng vin nhng vn c th di chuyn c. iu ny c th gp trong trng hp bn cn to mt ca s ty bin c hnh dng c nht v nh (v d, cc ng dng game hoc media player). To mt iu kim p ng cho cc s kin MouseDown, MouseUp, v MouseMove; v vit m di chuyn form.

Ngi dng thng s dng thanh tiu di chuyn form. Tuy nhin, form khng c ng vin cng khng c thanh tiu . Bn c th b vo thiu ht ny bng cch thm mt iu kim vo form phc v cng mc ch. V d, form trong hnh 6.10 cha mt Label h tr vic ko r. Ngi dng c th nhp vo Label ny, v ri ko r form n mt v tr khc trn mn hnh trong lc gi chut. Khi ngi dng di chuyn chut, form t ng c di chuyn tng ng (form c gn vi con tr chut).

Hnh 6.10 Form khng c ng vin nhng vn c th di chuyn c

hin thc gii php ny, bn cn thc hin cc bc sau: 1. 2. To mt bin c mc-form dng theo vt form (form hin c c ko r hay khng). Khi ngi dng nhp vo Label, c s c thit lp cho bit form ang ch ko r. Cng lc ny, v tr hin thi ca chut c ghi li. Bn cn thm logic ny vo phng thc th l s kin Label.MouseDown. Khi ngi dng di chuyn chut trn Label, form c di chuyn tng ng v tr ca chut trn Label vn khng thay i. Bn cn thm logic ny vo phng thc th l s kin Label.MouseMove. Khi ngi dng th chut, ch ko r c chuyn thnh off. Bn cn thm logic ny vo phng thc th l s kin Label.MouseUp.

3.

4.

Di y l phn m hon chnh cho form:

221 Chng 6: Windows Form using System; using System.Windows.Forms; using System.Drawing; public class DragForm : System.Windows.Forms.Form {

// (B qua phn m designer.)

// Bin c dng theo vt form. // Nu ang ch ko r, vic di chuyn chut // trn Label s c chuyn thnh vic di chuyn form. private bool dragging;

// Lu tr offset (v tr c nhp vo trn Label). private Point pointClicked;

private void lblDrag_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {

if (e.Button == MouseButtons.Left) {

dragging = true; pointClicked = new Point(e.X, e.Y); } else {

dragging = false; } }

private void lblDrag_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { if (dragging) { Point pointMoveTo; // Tm v tr hin ti ca chut trong ta mn hnh. pointMoveTo = this.PointToScreen(new Point(e.X, e.Y));

222 Chng 6: Windows Form

pointMoveTo.Offset(-pointClicked.X, -pointClicked.Y); // Di chuyn form. this.Location = pointMoveTo; } } private void lblDrag_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { dragging = false; } private void cmdClose_Click(object sender, System.EventArgs e) { this.Close(); } }

16.

To mt icon ng trong khay h thng


Bn cn to mt icon ng trong khay h thng (chng hn, cho bit tnh trng ca mt tc v ang chy). To v hin th NotifyIcon. S dng mt Timer, Timer ny s pht sinh mt cch nh k (mi giy chng hn) v cp nht thuc tnh NotifyIcon.Icon.

Vi .NET Framework th rt d dng hin th mt icon trong khay h thng bng NotifyIcon. Bn ch cn thm iu kim ny vo form, cung cp hnh icon bng thuc tnh Icon. Bn cng c th thm mt menu ng cnh vo iu kim ny bng thuc tnh ContextMenu (ty chn). Khng ging vi cc iu kim khc, NotifyIcon s t ng hin th menu ng cnh khi n c nhp phi. Bn c th lm ng icon trong khay h thng bng cch thay i icon nh k. V d, chng trnh sau s dng tm icon, th hin hnh mt trng t khuyt n y. Bng cch dch chuyn t hnh ny sang hnh khc, o gic v hnh ng s c to ra.
using System; using System.Windows.Forms; using System.Drawing;

223 Chng 6: Windows Form public class AnimatedSystemTrayIcon : System.Windows.Forms.Form {

// (B qua phn m designer.) Icon[] images; int offset = 0;

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

// Np vo tm icon. images = new Icon[8]; images[0] = new Icon("moon01.ico"); images[1] = new Icon("moon02.ico"); images[2] = new Icon("moon03.ico"); images[3] = new Icon("moon04.ico"); images[4] = new Icon("moon05.ico"); images[5] = new Icon("moon06.ico"); images[6] = new Icon("moon07.ico"); images[7] = new Icon("moon08.ico"); }

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {

// Thay i icon. // Phng thc th l s kin ny pht sinh mi giy mt ln. notifyIcon.Icon = images[offset]; offset++; if (offset > 7) offset = 0; } }

17.

Xc nhn tnh hp l ca u vo cho mt iu kim


Bn cn cnh bo cho ngi dng khi c d liu khng hp l c nhp vo mt iu kim (nh TextBox). S dng ErrorProvider hin th icon li k bn iu kim c li. Kim tra li trc khi cho php ngi dng tip tc.

224 Chng 6: Windows Form

C mt s cch bn c th thc hin vic xc nhn tnh hp l trong mt ng dng datrn-Windows. Mt cch tip cn l p ng cc s kin iu khin vic xc nhn tnh hp l v khng cho ngi dng thay i focus t iu kim ny sang iu kim khc nu li xy ra. Mt cch tip cn khc l dng c cho iu kim c li theo mt cch no ngi dng c th nhn thy tt c li mt lt. Bn c th s dng cch tip cn ny trong .NET vi iu kim ErrorProvider.
ErrorProvider l mt iu kim provider c bit, c s dng hin th icon li k bn

iu kim c li. Bn c th hin th icon li k bn mt iu kim bng cch s dng phng thc ErrorProvider.SetError, v ch nh iu kim thch hp v mt chui thng bo li. ErrorProvider s hin th icon li mt cch t ng bn phi iu kim. Khi ngi dng a chut ln icon li, s xut hin thng bo chi tit (xem hnh 6.11). Ch cn thm ErrorProvider vo form, bn c th s dng n hin th icon li k bn mt iu kim bt k. thm ErrorProvider, bn c th ko n vo khay thnh phn (component tray) hoc to n bng m. on m di y kim tra ni dung ca TextBox mi khi mt phm c nhn, xc nhn tnh hp l ca TextBox ny bng mt biu thc chnh quy (kim tra ni dung trong TextBox c tng ng vi mt a ch e-mail hp l hay khng). Nu ni dung ny khng hp l, ErrorProvider c s dng hin th thng bo li. Nu ni dung ny hp l, thng bo li hin c trong ErrorProvider s b xa. Cui cng, phng thc th l s kin Click cho nt OK s duyt qua tt c cc iu kim trn form v xc nhn rng khng iu kim no c li trc khi cho php ng dng tip tc.

Hnh 6.11 Form c xc nhn tnh hp l vi ErrorProvider using System; using System.Windows.Forms; using System.Text.RegularExpressions;

public class ErrorProviderValidation : System.Windows.Forms.Form {

// (B qua phn m designer.)

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

225 Chng 6: Windows Form Regex regex; regex = new Regex(@"\S+@\S+\.\S+");

Control ctrl = (Control)sender; if (regex.IsMatch(ctrl.Text)) { errProvider.SetError(ctrl, ""); } else { errProvider.SetError(ctrl, "This is not a valid e-mail address."); } }

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

string errorText = ""; bool invalidInput = false;

foreach (Control ctrl in this.Controls) {

if (errProvider.GetError(ctrl) != "") { errorText += " * " + errProvider.GetError(ctrl) + "\n";

invalidInput = true; } }

if (invalidInput) {

MessageBox.Show( "The form contains the following unresolved errors:\n\n" + errorText, "Invalid Input", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { this.Close(); }

226 Chng 6: Windows Form

} }

18.

Thc hin thao tc ko-v-th


Bn cn s dng tnh nng ko-v-th trao i thng tin gia hai iu kim (cng c th trong cc ca s hoc cc ng dng khc nhau) Khi ng thao tc ko-v-th bng phng thc DoDragDrop ca lp Control, v p ng cho s kin DragEnter v DragDrop.

Thao tc ko-v-th cho php ngi dng chuyn thng tin t ni ny n ni khc bng cch nhp vo mt item v r n n mt v tr khc. Thao tc ko-v-th gm ba bc c bn sau y: 1. 2. Ngi dng nhp vo iu kim, gi chut, v bt u r. Nu iu kim h tr tnh nng ko-v-th, n s thit lp ring mt vi thng tin. Ngi dng r chut ln mt iu kim khc. Nu iu kim ny chp nhn kiu ni dung c r n, con tr chut s i thnh hnh mi tn vi trang giy khng, con tr chut s i thnh hnh trn vi mt vch thng bn trong 3. . . Nu

Khi ngi dng th chut, d liu c gi n iu kim, v iu kim ny c th x l n mt cch thch hp.

h tr tnh nng ko-v-th, bn phi th l cc s kin DragEnter, DragDrop, v MouseDown. V d ny s dng hai TextBox, y l on m gn cc phng thc th l s kin m chng ta s s dng:
this.TextBox2.MouseDown += new MouseEventHandler(this.TextBox_MouseDown); this.TextBox2.DragDrop += new DragEventHandler(this.TextBox_DragDrop); this.TextBox2.DragEnter += new DragEventHandler(this.TextBox_DragEnter);

this.TextBox1.MouseDown += new MouseEventHandler(this.TextBox_MouseDown); this.TextBox1.DragDrop += new DragEventHandler(this.TextBox_DragDrop); this.TextBox1.DragEnter += new DragEventHandler(this.TextBox_DragEnter);

bt u mt thao tc ko-v-th, bn hy gi phng thc DoDragDrop ca iu kim ngun. Lc ny, bn cn cung cp d liu v ch nh kiu hot ng s c h tr (chp, di chuyn). V d di y s khi to mt thao tc ko-v-th khi ngi dng nhp vo mt TextBox:
private void TextBox_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {

TextBox txt = (TextBox)sender;

227 Chng 6: Windows Form txt.SelectAll(); txt.DoDragDrop(txt.Text, DragDropEffects.Copy); }

c th nhn d liu c r n, iu kim phi c thuc tnh AllowDrop l true. iu kim ny s nhn s kin DragEnter khi chut r d liu ln n. Lc ny, bn c th kim tra d liu ang c r n, quyt nh xem iu kim c th chp nhn vic th hay khng, v thit lp thuc tnh DragEventArgs.Effect tng ng, nh c trnh by trong on m di y:
private void TextBox_DragEnter(object sender, System.Windows.Forms.DragEventArgs e) {

if (e.Data.GetDataPresent(DataFormats.Text)) { e.Effect = DragDropEffects.Copy; } else { e.Effect = DragDropEffects.None; } }

Bc cui cng l p ng cho s kin DragDrop, s kin ny xy ra khi ngi dng th chut:
private void TextBox_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) {

TextBox txt = (TextBox)sender; txt.Text = (string)e.Data.GetData(DataFormats.Text); }

S dng cc on m trn, bn c th to mt ng dng th nghim tnh nng ko-v-th n gin (xem hnh 6.12), cho php text c r t TextBox ny n TextBox khc. Bn cng c th r text t mt ng dng khc v th n vo mt trong hai TextBox ny.

Hnh 6.12 Mt ng dng th nghim tnh nng ko-v-th

228 Chng 6: Windows Form

19.

S dng tr gip cm-ng-cnh


Bn mun hin th mt ch c th trong file tr gip da trn iu kim hin ang c chn. S dng thnh phn System.Windows.Forms.HelpProvider, v thit lp cc thuc tnh m rng (extender property) HelpKeyword v HelpNavigator cho mi iu kim.

.NET h tr tnh nng tr gip cm-ng-cnh (context-sensitive help) thng qua lp HelpProvider. Lp ny l mt iu kim m rng c bit. Khi bn thm n vo khay thnh phn (component tray), n s thm mt s thuc tnh vo tt c cc iu kim trn form. V d, hnh 6.13 trnh by mt form gm hai iu kim v mt HelpProvider. ListBox (hin ang c chn) c thm cc thuc tnh HelpKeyword, HelpNavigator, v HelpString (do HelpProvider cp). s dng tr gip cm-ng-cnh vi HelpProvider, bn cn thc hin ba bc sau y: 1. 2. 3. Thit lp thuc tnh HelpProvider.HelpNamespace l tn ca file tr gip (chng hn, myhelp.chm). i vi mi iu kim yu cu tr gip cm-ng-cnh, hy thit lp thuc tnh m rng HelpNavigator l HelpNavigator.Topic. i vi mi iu kim yu cu tr gip cm-ng-cnh, hy thit lp thuc tnh m rng HelpKeyword l tn ca ch lin kt vi iu kim ny (tn ch phi c trong file tr gip v c th c cu hnh trong cc cng c to file tr gip).

Hnh 6.13 Cc thuc tnh m rng do HelpProvider cp cho ListBox

Nu ngi dng nhn phm F1 trong khi mt iu kim no ang nhn focus, file tr gip s c m mt cch t ng v ch lin kt vi iu kim ny s c hin th trong ca

229 Chng 6: Windows Form

s tr gip. Nu ngi dng nhn phm F1 trong khi ang trn mt iu kim khng c ch tr gip (v d, GroupBox hoc Panel), cc thit lp tr gip cho iu kim nm bn trong s c s dng. Nu khng c iu kim no nm bn trong hoc iu kim nm bn trong khng c thit lp tr gip no, cc thit lp tr gip cho form s c s dng. Nu cc thit lp tr gip cho form cng khng c, HelpProvider s m bt k file tr gip no c nh ngha mc d n. Bn cng c th s dng cc phng thc ca HelpProvider thit lp hoc sa i nh x tr gip cm-ng-cnh lc thc thi.

20.

p dng phong cch Windows XP


Bn mun cc iu kim mang dng dp hin i ca Windows XP trn h thng Windows XP. Thit lp thuc tnh FlatStyle l FlatStyle.System cho tt c cc iu kim c h tr thuc tnh ny. Trong .NET Framework phin bn 1.0, bn phi to mt file manifest. Cn trong .NET Framework phin bn 1.1, bn ch cn gi phng thc Application.EnableVisualStyles.

Phong cch Windows XP t ng c p dng cho vng non-client ca form (nh ng vin, cc nt minimize v maximize). Tuy nhin, chng s khng c p dng cho cc iu kim nh Button v GroupBox tr khi bn thc hin thm mt vi bc na. Trc ht, bn phi cu hnh tt c cc iu kim dng nt trn form (nh Button, CheckBox, v RadioButton). Cc iu kim ny cung cp thuc tnh FlatStyle, m thuc tnh ny phi c thit lp l System. Bc k tip ty thuc vo phin bn .NET bn ang s dng. Nu ang s dng .NET Framework phin bn 1.1, bn ch cn gi phng thc Application.EnableVisualStyles trc khi cho hin th form. V d, bn c th khi to ng dng vi phng thc Main nh sau:
public static void Main() {

// Kch hot visual styles. Application.EnableVisualStyles();

// Hin th main form. Application.Run(new StartForm) }

Nu ang s dng .NET Framework phin bn 1.0, bn khng c s tr gip ca phng thc Application.EnableVisualStyles. Tuy nhin, bn vn c th s dng phong cch ny bng cch to mt file manifest cho ng dng ca bn. File manifest ny (ch l mt file vn bn thng thng vi ni dung XML) s bo vi Windows XP rng ng dng ca bn yu cu phin bn mi ca file comctl32.dll (file ny c trn tt c cc my tnh Windows XP). Windows XP s c v p dng cc thit lp t file manifest mt cch t ng, nu file manifest c t trong th mc ng dng v c tn trng vi tn file thc thi ng dng cng

230 Chng 6: Windows Form

phn m rng l .manifest (v d, TheApp.exe s c file manifest l TheApp.exe.manifest mc d n trng ging c hai phn m rng). Di y l mt file manifest. Bn c th chp file ny cho cc ng dng ca bnch cn i tn n cho ph hp. Bn cng cn i gi tr name (in m) thnh tn ng dng, mc d iu ny khng tht s cn thit.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="TheApp" type="win32" />

<dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" />

</dependentAssembly> </dependency> </assembly>

Phong cch Windows XP s khng xut hin trong mi trng thit k ca Visual Studio .NET. Do , th nghim k thut ny, bn cn phi chy ng dng. Tuy nhin, bn vn c th lm cho mi trng thit k ca Visual Studio .NET hin th theo phong cch Windows XP bng cch thm file devenv.exe.manifest vo th mc \Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE.

231 Chng 6: Windows Form

Hnh 6.14 Phong cch Windows XP v phong cch kinh in

Nu bn p dng file manifest cho mt ng dng ang chy trn phin bn Windows trc Windows XP, n s b b qua, v phong cch kinh in s c s dng. V l do ny, bn nn th nghim ng dng ca bn c khi c v khng c file manifest.

21.

Thay i c ca form
Bn mun thay i c ca form n trong sut hn khi xut hin Thit lp thuc tnh Opacity ca form vi mt gi tr nm gia 0% v 100%.

Thuc tnh Opacity ca mt form kim sot mc c hay trong ca mt ca s. mc 100%, form xut hin vi trng thi mc nh, ngha l khng c cc vng trong sut trn form. mc 0%, form hon ton trong sut, cng c ngha bn khng th tng tc vi form c na. Khi thay i c ca mt form bng m lnh, bn phi s dng mt s thc nm gia 0.0 v 1.0:
private void Form1_MouseEnter(object sender, System.EventArgs e) { this.Opacity = 1.0; }

private void Form1_MouseLeave(object sender, System.EventArgs e) { this.Opacity = 0.8; }

232 Chng 6: Windows Form

Nu ch mun trong sut nhng vng no trn form, bn hy s dng thuc tnh TransparencyKey. Bn nh ngha thuc tnh ny l mt mu no . Nu bt k phn no ca form trng vi mu , n s tr nn trong sut. Hnh 6.15 trnh by mt form vi c 80%. Chng ta t mt iu kim Panel ln form v thit lp mu nn ca Panel l mu m ta nh ngha trong thuc tnh TransparencyKey ca form. Nh th, form s trong sut trn vng thuc Panel.

Hnh 6.15 Mt form vi c 80% v mt Panel c mu nn ging vi thuc tnh TransparencyKey ca form

Bn c th bt gp mt s ng dng dng hnh bitmap lm giao din ngi dng, nht l cc kiu media player. Bn c th to kiu giao din th ny bng cch to mt hnh bitmap vi nhng vng no c mu l mu m bn mun trong sut. K tip, thit lp thuc tnh BackgroundImage ca form l file bitmap m bn to. Cui cng, thit lp thuc tnh TransparencyKey ca form l mu m bn mun trong sut trong hnh bitmap.
Bitmap Img = ((Bitmap)(Bitmap.FromFile("C:\\Example.bmp"))); // Mu ti Pixel(10,10) c s dng lm mu trong sut. Img.MakeTransparent(Img.GetPixel(10, 10)); this.BackgroundImage = Img; this.TransparencyKey = Img.GetPixel(10, 10);

Bn cng c th g b thanh tiu ca form bng cch thit lp FormBorderStyle l None (xem mc 6.14). form c th di chuyn c trong trng hp ny, bn hy p dng mc

233 Chng 6: Windows Form

6.15. Trn y l mt cch to form c hnh dng bt thng, mt cch khc s c trnh by trong mc 8.3.

234

Chng 7:ASP.NET V WEB FORM

235

236 Chng 7: ASP.NET v Web Form

icrosoft ASP.NET l mt nn dng pht trin cc ng dng Web, v n l mt phn ca Microsoft .NET Framework. ASP.NET cho php bn vit dch v Web XML (s c tho lun trong chng 12) v pht trin website (c tho lun trong chng ny). Cc trang ASP.NET s dng m hnh iu kim da-trn-s-kin, khin cho vic vit m cho chng cng tng t nh vit m cho cc ng dng da-trn-Windows thng thng. Tuy nhin, s tng t ny c th l gi to. Nh hu ht cc nh pht trin ASP.NET chng thc, cc ng dng Web c cch din t ring ca chng. V d, bn s cn thc hin thm cc bc duy tr trng thi, chuyn thng tin gia cc trang, th l nhng s kin pha client, thc hin xc thc, v bo m hiu nng ti u khi s dng c s d liu. Chng ny s xem xt tt c cc vn ny. Chng ny s khng gii thiu v ASP.NET. Thay vo , chng ny s gip nhng nh pht trin ASP.NET trung cp gii quyt nhng vn thng gp. tm hiu cn bn v ASP.NET, hy vo trang [http://www.asp.net] hoc tham kho cc ti liu khc chuyn v ASP.NET.

Cc mc trong chng ny trnh by cc vn sau y:

Chuyn hng cc yu cu ca ngi dng (mc 7.1). Duy tr trng thi gia cc yu cu trang (mc 7.2 v 7.3). S dng JavaScript ci tin giao din vi cc tnh nng pha client (mc 7.4, 7.5, v
7.6).

Cho php ngi dng upload file (mc 7.7). Xc thc client theo hai cch: Xc thc tch hp vi Windows (mc 7.8) v xc thc
da-trn-form (mc 7.9).

Xc nhn tnh hp l ca u vo m khng s dng iu kim validator ca ASP.NET


(mc 7.10).

To ng iu kim web (mc 7.11), hnh nh (mc 7.12), v iu kim ngi dng
(mc 7.13).

Ci thin hiu nng vi output-caching (mc 7.14) v data-caching (mc 7.15). Gii quyt thng bo li Unable to start debugging on the Web server (mc 7.16). Thay i ng cnh ti khon Windows m mt ng dng ASP.NET chy trong (mc
7.17). Chng ny s dng cc lp web c bn thuc khng gian tn System.Web v cc lp iu kim web thuc khng gian tn System.Web.UI.WebControls. Khi s dng cc lp trong cc khng gian tn ny, tn lp y s khng c ch nh.

1.

Chuyn hng ngi dng sang trang khc


Bn cn chuyn s thc thi t mt trang ASP.NET sang mt trang khc, hoc bn mun chuyn ngi dng n mt site hon ton khc.

237 Chng 7: ASP.NET v Web Form

S dng phng thc HttpResponse.Redirect chuyn ngi dng n mt URL mi, hoc s dng phng thc HttpServerUtility.Transfer (nhanh hn) chuyn ngi dng n mt Web Form ASP.NET khc trn cng server.

Cch d nht chuyn ngi dng t mt trang ny n mt trang khc l s dng phng thc HttpResponse.Redirect v cp mt URL mi. Bn c th truy xut i tng HttpResponse hin ti thng qua i tng HttpContext hoc s dng thuc tnh Reponse ca i tng Page hoc Control. Phng thc th l s kin di y (p ng cho mt c nhp chut vo Button) s chuyn ngi dng n mt trang ASP.NET mi:
private void cmdRedirect_Click(object sender, System.EventArgs e) {

Response.Redirect("newpage.aspx"); }

Phng thc Redirect c th lm vic vi URL tng i (ch n nhng ti nguyn trong cng th mc o), v vi URL y . URL c th ch n trang ASP.NET khc, kiu ti liu khc (nh trang HTML hoc hnh nh), v web-server khc. Phng thc Redirect gi ch th chuyn hng n trnh duyt. K , trnh duyt s yu cu trang mi. Kt qu l trnh duyt phi thc hin hai chuyn n web-server, v web-server phi x l thm mt yu cu na. Mt ty chn hiu qu hn l s dng phng thc HttpServerUtility.Transfer, phng thc ny s chuyn s thc thi n mt trang ASP.NET khc trn cng web-server. V d:
private void cmdRedirect_Click(object sender, System.EventArgs e) {

Server.Transfer("newpage.aspx"); }

Phng thc Transfer khng cn thm mt chuyn n client, nhng n s khng lm vic nu bn cn chuyn s thc thi n mt server khc hoc mt kiu ti nguyn khc vi Web Form (bao gm trang ASP c in).

2.

Duy tr trng thi gia cc yu cu ca trang


Bn cn lu tr vi thng tin c th ca ngi dng gia cc ln postback ca trang. S dng view state (trng thi nhn), query string argument (i s chui truy vn), session state (trng thi phin lm vic), hoc cookie, ty thuc vo nhu cu ca bn.

ASP.NET l mt m hnh lp trnh phi trng thi (stateless programming model). Mi khi mt postback c pht sinh, m s np vo b nh, thc thi, v c gii phng khi b nh. Nu mun gi li vt ca thng tin sau khi m hon tt vic x l, bn phi s dng cc kiu qun l trng thi (state management).

238 Chng 7: ASP.NET v Web Form

ASP.NET cung cp nhiu cch lu tr thng tin, hay trng thi, gia cc yu cu (request). Kiu trng thi m bn s dng cho bit: thng tin s sng bao lu, s c lu tr u, v s c bo mt nh th no. Bng 7.1 lit k nhng ty chn trng thi khc nhau c cp bi ASP.NET. Bng ny khng cha i tng Cache, i tng ny cung cp kho lu tr tm thi v s c m t trong mc 7.5. C php cho cc phng php lu tr d liu l nh nhau. D liu c lu tr trong mt i tng tp hp v c nh ch mc bng mt tn chui.
Bng 7.1 Cc kiu qun l trng thi
Kiu trng thi D liu c php V tr lu tr Thi gian sng Bo mt

View state

Tt c cc kiu d liu kh-tunt-ha .NET.

Mt trng n trong trang web hin hnh.

B mt khi ngi dng chuyn sang mt trang khc.

Mc nh l khng an ton. Tuy nhin, bn c th s dng cc ch th trang thc hin mt ha v bm ngn d liu b ph.

Query string

D liu chui.

Chui URL ca trnh duyt.

B mt khi ngi dng nhp mt URL mi hoc ng trnh duyt. Tuy nhin, n c th c lu tr trong mt bookmark. Ht hiu lc sau mt khong thi gian c nh ngha trc (thng l 20 pht, nhng khong thi gian ny c th thay i c). c thit lp bi lp trnh vin. C th c s dng trong nhiu trang v c th vn cn gia cc ln ving thm.

Ngi dng c th nhn thy c v chnh sa d dng.

Session state

Tt c cc kiu d liu kh-tunt-ha .NET.

B nh server (c th c cu hnh cho mt tin trnh hoc c s d liu bn ngoi). My tnh client (trong b nh hoc mt file text, ty thuc vo cc thit lp cho thi gian sng ca n).

An ton v d liu khng bao gi c chuyn cho client.

Cookie

D liu chui.

Khng an ton, v c th b ngi dng chnh sa.

239 Chng 7: ASP.NET v Web Form

Applicatio n state

Tt c cc kiu d liu kh-tunt-ha .NET.

B nh server.

Thi gian sng ca ng dng (cho n khi server c khi ng li). Khng ging vi cc phng php khc, d liu ng dng l ton cc i vi tt c cc ngi dng.

An ton v d liu khng bao gi c chuyn cho client.

Hnh 7.1 trnh by mt trang web th nghim cc kiu qun l trng thi khc nhau. Khi ngi dng nhp vo nt Store Data, mt i tng System.DateTime s c to ra v c lu tr trong view state, session state, v mt cookie ty bin. Khi ngi dng nhp vo nt Get Data, thng tin ny s c ly ra v hin th. Cui cng, nt Clear Data s xa thng tin ny trong tt c cc trng thi.

Hnh 7.1 Th nghim cc kiu qun l trng thi

Di y l phn m cho trang:


using System; using System.Web; using System.Web.UI.WebControls; using System.Web.SessionState;

public class TestState : System.Web.UI.Page {

protected System.Web.UI.WebControls.Button cmdClear; protected System.Web.UI.WebControls.Button cmdStore;

240 Chng 7: ASP.NET v Web Form

protected System.Web.UI.WebControls.Button cmdGetData; protected System.Web.UI.WebControls.Label lblData;

// (B qua phn m designer.)

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

// To i tng th nghim. DateTime now = DateTime.Now;

// Lu tr i tng trong view state. ViewState["TestData"] = now;

// Lu tr i tng trong session state. Session["TestData"] = now;

// Lu tr i tng trong mt cookie ty bin. // Kim tra xem cookie tn ti hay cha (c tn l 07-02). if (Request.Cookies["07-02"] == null) {

// To cookie. HttpCookie cookie = new HttpCookie("07-02");

// Cookie ch c th lu tr d liu chui. // N c th lu tr nhiu gi tr, // mi gi tr ng vi mt kha khc nhau. cookie["TestData"] = now.ToString();

// (Bn c th chnh sa cc thuc tnh // ca cookie thay i ngy ht hiu lc.)

// Gn cookie vo p ng. // N s c cung cp vi tt c cc yu cu n // site ny cho n khi ht hiu lc. Response.Cookies.Add(cookie);

241 Chng 7: ASP.NET v Web Form } }

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

lblData.Text = "";

// Kim tra thng tin trong view state. if (ViewState["TestData"] != null) {

DateTime data = (DateTime)ViewState["TestData"]; lblData.Text += "<b>View state data:</b> " + data.ToString() + "<br>";

}else {

lblData.Text += "No view state data found.<br>"; }

// Kim tra thng tin trong session state. if (Session["TestData"] != null) {

DateTime data = (DateTime)Session["TestData"]; lblData.Text += "<b>Session state data:</b> " + data.ToString() + "<br>";

}else {

lblData.Text += "No session data found.<br>"; }

// Kim tra thng tin trong cookie ty bin. HttpCookie cookie = Request.Cookies["07-02"]; if (cookie != null) {

string cookieData = (string)cookie["TestData"]; lblData.Text += "<b>Cookie data:</b> " +

242 Chng 7: ASP.NET v Web Form

cookieData + "<br>";

}else {

lblData.Text += "No cookie data found.<br>"; } }

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

ViewState["TestData"] = null; Session["TestData"] = null; // (Bn cng c th s dng Session.Abandon xa tt c // thng tin trong session state.)

// xa cookie, bn phi thay n thnh // mt cookie vt qu ngy ht hiu lc. HttpCookie cookie = new HttpCookie("07-02"); cookie.Expires = DateTime.Now.AddDays(-1); Response.Cookies.Add(cookie); } }

Mt kiu trng thi m trang ny khng th hin l query string (chui truy vn). Query string i hi mt chuyn hng trang, l tng cho vic chuyn thng tin t trang ny n trang khc. thit lp thng tin, bn phi chuyn hng ngi dng n mt trang mi v thm cc i s query string vo cui URL. Bn c th s dng phng thc HttpServerUtility.UrlEncode v UrlDecode bo m d liu chui l URL hp l.
DateTime now = DateTime.Now; string data = Server.UrlEncode(now.ToString()); Response.Redirect("newPage.aspx?TestData=" + data);

ly thng tin ny, bn c th s dng tp hp HttpResponse.QueryString:


// Kim tra thng tin trong query string. if (Request.QueryString["TestData"] != null) {

string data = Request.QueryString["TestData"]; data = Server.UrlDecode(data);

243 Chng 7: ASP.NET v Web Form lblData.Text += "<b>Found query string data:</b> " + data + "<br>"; }

3.

To cc bin thnh vin c trng thi cho trang


Bn cn to cc bin thnh vin trong lp trang v bo m cc gi tr ca chng c gi li khi trang c post-back. Phn ng vi s kin Page.PreRender, v ghi tt c cc bin thnh vin vo view state. Phn ng vi s kin Page.Load, v ly tt c cc gi tr ca cc bin thnh vin t view state. Phn m cn li ca bn gi y c th tng tc vi cc bin ny m khng phi lo lng cc vn v trng thi.

ASP.NET cung cp nhiu c ch trng thi, nh c m t trong mc 7.2. Tuy nhin, bn khng th s dng chng mt cch t ngtt c u i hi mt on m t thng tin vo v ly thng tin ra. Bn c th thc hin cc cng vic ny mt ln. Khi , phn m cn li ca bn c th tng tc trc tip vi bin thnh vin. cch tip cn ny c th lm vic c, bn cn c cc gi tr ca bin vo u mi postback. S kin Page.Load l mt chn la l tng cho on m ny v n lun pht sinh trc bt c s kin iu khin no khc. Bn c th s dng phng thc th l s kin Page.Load khi dng tt c cc bin. Ngoi ra, bn cn lu tr tt c cc bin trc khi trang c gi cho ngi dng, sau khi tt c vic x l hon tt. Trong trng hp ny, bn c th p ng cho s kin Page.PreRender, v s kin ny pht sinh sau tt c cc phng thc th l s kin khc, ch trc khi trang c chuyn thnh HTML v gi cho client. Trang v d sau y trnh by cch duy tr mt bin thnh vin ca trang c tn l memberValue:
using System; using System.Web; using System.Web.UI.WebControls;

public class StatefulMembers : System.Web.UI.Page {

// (B qua phn m designer.)

private int memberValue = 0;

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

// Np li tt c cc bin thnh vin. if (ViewState["memberValue"] != null) { memberValue = (int)ViewState["memberValue"];

244 Chng 7: ASP.NET v Web Form

} }

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

// Lu tt c cc bin thnh vin. ViewState["memberValue"] = memberValue;

// Hin th gi tr. lblCurrent.Text = memberValue.ToString(); }

// (Cc phng thc th l s kin khc gi y // } c th lm vic trc tip vi memberValue.)

4.

p ng cc s kin pha client vi JavaScript


Bn cn thm m JavaScript vo mt Web Form. nh ngha hm JavaScript trong mt chui, v s dng phng thc Page.RegisterClientScriptBlock chn hm JavaScript vo trang c tr v. Khi , bn c th thm cc c tnh iu khin gi cc hm ny.

ASP.NET l mt m hnh lp trnh a nng. ng tic, mt khi trang c tr v dng HTML, bn khng th thc thi bt k m .NET no na m khng phi pht sinh postback n server. Hn ch ny lm gim tnh hiu qu ca cc trang web c tnh tng tc (chng hn, xc nhn tnh hp l ca u vo). D nhin, khng c l do g khin bn khng th trn chc nng JavaScript pha client vo m .NET. Mc d .NET khng cha bt k giao din i tng no to JavaScript, nhng bn c th chn n vo trang bng tay. C mt cch thc hin vic ny l thit lp c tnh iu khin. V d, TextBox di y s hin th mt MessageBox khi n mt focus:
TextBox1.Attributes.Add("onBlur", "alert('The TextBox has lost focus!');");

Th TextBox s c tr v dng HTML nh sau:


<input name="TextBox1" type="text" id="TextBox1" onBlur="alert('The text box has lost focus!');" ... />

245 Chng 7: ASP.NET v Web Form

Trong trng hp ny, bn s dng hm JavaScript alert (ni ti) v s kin JavaScript onBlur (pht sinh khi mt iu kim mt focus). Hu ht cc phn t HTML u h tr cc s kin sau y:
onFocus xy ra khi mt iu kim nhn focus. onBlur xy ra khi mt iu kim mt focus. onClick xy ra khi ngi dng nhp vo mt iu kim. onChange xy ra khi ngi dng thay i gi tr ca iu kim no . onMouseOver xy ra khi ngi dng di chuyn con tr chut trn mt iu kim.

Mt cch khc chn m JavaScript l nh ngha mt hm JavaScript trong mt bin chui ri lnh cho ASP.NET chn n vo trang web c tr v. Nu lm theo cch ny, bt k iu kim no cng c th gi hm p ng cho mt s kin JavaScript. V d di y s lm r k thut ny bng mt trang web gm mt bng v mt bc hnh (xem hnh 7.2). Khi ngi dng di chuyn chut ln cc trong bng th hai hm JavaScript ty bin s c s dng: mt to highlight cho hin ti v mt g b highlight khi trc . Ngoi ra, hm to highlight cn thay i URL ca bc hnh ty thuc vo ct no ang c chn. Nu ngi dng a chut ln ct th nht, hnh mt ci s c hin th. Nu ngi dng a chut ln ct th hai hoc th ba, hnh quyn sch vi du chm hi nhp nhy s c hin th.
using System; using System.Web; using System.Web.UI.WebControls; public class JavaScriptTest : System.Web.UI.Page { protected System.Web.UI.WebControls.Table Table1; protected System.Web.UI.WebControls.Image Image1; // (B qua phn m designer.) private void Page_Load(object sender, System.EventArgs e) { // nh ngha cc hm JavaScript. string highlightScript = "<script language=JavaScript> " + "function HighlightCell(cell) {" + "cell.bgColor = '#C0C0C0';" + "if (cell.cellIndex == 0) {" + "document.Form1.Image1.src='happy_animation.gif';}" + "else {" + "document.Form1.Image1.src='question_animation.gif';}" +

246 Chng 7: ASP.NET v Web Form

";}" + "</script>"; string unhighlightScript = "<script language=JavaScript> " + "function UnHighlightCell(cell) {" + "cell.bgColor = '#FFFFFF';" + "}" + "</script>"; // Chn hm JavaScript vo trang (n s xut hin // ngay sau th <form runat=server>). // Ch rng mi khi kch bn c kt hp vi mt tn chui. // iu ny cho php nhiu iu kim ng k cng khi kch bn, // trong khi vn bo m n s c tr v ch mt ln // trong trang cui cng. if (!this.IsClientScriptBlockRegistered("Highlight")) { Page.RegisterClientScriptBlock("Highlight", highlightScript); } if (!this.IsClientScriptBlockRegistered("UnHighlight")) { Page.RegisterClientScriptBlock("UnHighlight", unhighlightScript); } // Thit lp c tnh cho mi trong bng. foreach (TableRow row in Table1.Rows) { foreach (TableCell cell in row.Cells) { cell.Attributes.Add("onMouseOver", "HighlightCell(this);"); cell.Attributes.Add("onMouseOut", "UnHighlightCell(this);"); } } }

247 Chng 7: ASP.NET v Web Form

Hnh 7.2 Hm JavaScript to highlight cho hin ti

Bn cn hiu r tnh bo mt ca JavaScript. Tt c m JavaScript c tr v trc tip trong trang HTML, v ngi dng c th xem xt n. Do , bn ng bao gi t bt k gii thut hoc thng tin b mt no vo m JavaScript. Ngoi ra, bn s dng JavaScript kim tra tnh hp l ch l mt tiu xo, khng phi l mt phng cch ngn cc hnh ng khng hp l, bi ngi dng c th v hiu hoc ph hng JavaScript trong trnh duyt ca h.

5.

Hin th ca s pop-up vi JavaScript


Bn cn hin th mt ca s pop-up p ng cho mt hnh ng ca ngi dng. ng k mt hm JavaScript (hoc thm mt c tnh iu khin s kin), v s dng hm JavaScript window.open.

V tt c m ASP.NET thc thi trn server nn khng c cch no hin th mt ca s mi t m C#. Bn c th thm siu lin kt vo mt trang sao cho n t ng m trong mt ca s mi bng cch thit lp c tnh target ca th <a> l _blank, nhng cch ny vn khng cung cp kh nng iu khin kch thc hoc kiu ca ca s. Gii php m ca s pop-up l s dng m JavaScript. Ca s pop-up c th l mt trang HTML, mt trang ASP.NET, mt file hnh, hoc bt k kiu ti nguyn no c th c m trong trnh duyt ca client. m mt ca s pop-up, bn cn s dng hm window.open v ch nh ba thng s. Thng s th nht l lin kt n trang mi, thng s th hai l tn frame ca ca s, v thng s th ba l mt chui cc c tnh (phn cch bng du phy) cu hnh kiu v kch thc ca ca s pop-up. Cc c tnh ny bao gm: c tnh height v widthc thit lp l cc gi tr tnh theo pixel.

248 Chng 7: ASP.NET v Web Form

c tnh toolbar, menubar, v scrollbarsc th c thit lp l yes hay no, ty thuc vo bn mun hin th cc phn t ny hay khng. c tnh resizablec th c thit lp l yes hay no, ty thuc vo bn mun ng vin ca s l c nh hay c th thay i kch thc c.

V d di y trnh by cch m mt trang ASP.NET th hai trong mt ca s pop-up khi ngi dng nhp vo mt Button.

Hnh 7.3 Hin th ca s pop-up

Bn cn thm on m ny vo phng thc th l s kin Page.Load.


string popupScript = "window.open('PopUp.aspx', " + "'CustomPopUp', " + "'width=200, height=200, menubar=yes, resizable=no')"; cmdPopUp.Attributes.Add("onClick", popupScript);

V y l on m (trong phng thc th l s kin Page.Load) dng hin th ca s popup mt cch t ng khi trang c hin th:
string popupScript = "<script language='javascript'>" + "window.open('PopUp.aspx', " + "'CustomPopUp', " + "'width=200, height=200, menubar=yes, resizable=no')" + "</script>";

249 Chng 7: ASP.NET v Web Form

Page.RegisterStartupScript("PopupScript", popupScript);

6.

Thit lp focus cho iu kim


Bn cn ch nh iu kim no s nhn focus khi trang c tr v v gi cho ngi dng. To mt lnh JavaScript thit lp focus, v thm n vo trang bng phng thc Page.RegisterStartupScript.

iu kim web ASP.NET khng cung cp cch thit lp focus cho iu kim, m ch cung cp thuc tnh TabIndex thit lp th t tab. Nhng thuc tnh ny ch p dng cho Microsoft Internet Explorer v khng th c s dng thit lp focus cho iu kim do bn chn. vt qua hn ch ny, bn cn s dng n m JavaScript. Phng thc di y s thc hin cng vic ny. N nhn vo mt tham chiu n bt k i tng iu kim no, thu ly ClientID kt giao (m JavaScript phi s dng ID ny tm n iu kim), ri to dng v ng k kch bn thit lp focus.
private void SetFocus(Control ctrl) {

// nh ngha lnh JavaScript. // Di chuyn focus n iu kim bn mun. string setFocus = "<script language='javascript'>" + "document.getElementById('" + ctrl.ClientID + "').focus();</script>";

// Thm m JavaScript vo trang. this.RegisterStartupScript("SetFocus", setFocus); }

Nu thm phng thc ny vo mt Web Form, bn c th gi SetFocus khi cn. V d di y s thit lp focus khi trang np ln u tin:
private void Page_Load(object sender, System.EventArgs e) {

if (!this.IsPostBack) { // Chuyn focus n mt TextBox c th. SetFocus(TextBox1); } }

250 Chng 7: ASP.NET v Web Form

7.

Cho php ngi dng upload file


Bn cn to mt trang cho php ngi dng upload mt file. S dng iu kim HtmlInputFile, thit lp kiu m ha ca form l multipart/form-data, v lu file bng phng thc HtmlInputFile.PostedFile. SaveAs.

V ASP.NET thc thi trn server nn khng c cch no truy xut cc ti nguyn trn my client, bao gm file. Tuy nhin, bn c th s dng iu kim System.Web.UI. HtmlControls.HtmlInputFile cho php ngi dng upload mt file. iu kim ny tr v phn t HTML <input type="file">, hin th mt nt Browse v mt hp cha tn file. Ngi dng nhp vo nt Browse v chn mt file. Bc ny din ra mt cch t ng v khng i hi bt k on m ty bin no. Sau , ngi dng phi nhp vo mt nt khc (bn phi to nt ny) bt u qu trnh upload. to mt trang cho php upload file, bn cn thc hin cc bc sau y: Thit lp kiu m ha ca form l multipart/form-data. thc hin thay i ny, tm th <form> trong file .aspx v iu chnh nh sau:
<form id="Form1" enctype="multipart/form-data" runat="server">

Thm iu kim HtmlInputFile vo trang. Trong Microsoft Visual Studio .NET, bn s tm thy iu kim ny di th HTML ca hp cng c, vi tn l File Field. Mt khi thm iu kim ny, bn nhp phi vo n v chn Run As Server Control to th <input type="file" runat="server">. Thm mt Button khc bt u qu trnh chuyn giao file c ch nh (bng phng thc HtmlInputFile.PostedFile.SaveAs).

Di y l phn m cho trang upload file:


using System; using System.Web; using System.Web.UI.WebControls; using System.IO; public class UploadPage : System.Web.UI.Page { protected System.Web.UI.WebControls.Label lblInfo; protected System.Web.UI.WebControls.Button cmdUpload; protected System.Web.UI.HtmlControls.HtmlInputFile FileInput; // (B qua phn m designer.)

251 Chng 7: ASP.NET v Web Form private void cmdUpload_Click(object sender, System.EventArgs e) { if (FileInput.PostedFile.FileName == "") { // Khng file no c ch nh. lblInfo.Text = "No file specified."; } else { try { if (FileInput.PostedFile.ContentLength > 1048576) { // Cm cc file ln hn 1 megabyte. lblInfo.Text = "File is too large."; }else { // File c lu vn gi li tn file gc ca n. string fileName = Path.GetFileName(FileInput.PostedFile.FileName); // Tin trnh ASP.NET phi c quyn i vi // v tr n thc hin lu file, nu khng // ngoi l "access denied" s xy ra. FileInput.PostedFile.SaveAs(fileName); lblInfo.Text = "File " + fileName + " uploaded."; } }catch (Exception err) { lblInfo.Text = err.Message; } } } }

252 Chng 7: ASP.NET v Web Form

Hnh 7.4 Trang th nghim upload file

Bn c th kim tra cc thuc tnh ca file c ch nh (bao gm kch thc ca n) trc khi lu ngn kiu tn cng t chi dch v (la ng dng ASP.NET upload cc file ln lm y a cng). Tuy nhin, on m ny khng ngn ngi dng submit file ngay t u, iu ny vn c th lm chm server v c s dng m mt kiu tn cng t chi dch v khcnm ly tt c cc tiu trnh th ASP.NET ang rnh. ngn chn kiu tn cng ny, bn hy s dng th <httpruntime> trong file Web.config ch nh kch thc ti a ca file (tnh theo kilobyte):
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> <httpRuntime maxRequestLength="4096" /> <!-- B qua cc thit lp khc. --> </system.web> </configuration>

Nu bn khng ch nh kch thc ti a, gi tr mc nh 4096 (4 megabyte) s p dng. Nu ngi dng cung cp mt file qu ln, mt ngoi l s pht sinh ngay khi trang c post-back.

C mt cch khc gi file t client ln web-server l s dng dch v Web XML ASP.NET. Bn cn pht trin mt ng dng da-trn-Windows cho php ngi dng chn mt file v ri giao tip vi mt dch v Web XML chuyn giao thng tin.

253 Chng 7: ASP.NET v Web Form

8.

S dng IIS authentication


Bn cn ngn ngi dng truy xut cc trang no tr khi h c xc thc da vo Windows user account (ti khon ngi dng Windows) trn server. S dng IIS Windows authentication. Chn phng php xc thc m bn thch, v t chi truy xut nc danh n th mc o bng IIS Manager. Bn c th ly thng tin v ngi dng c xc thc t thuc tnh Page.User hoc lp HttpContext.

IIS v ASP.NET s dng m hnh bo mt c sp lp (layered security model). Khi ngi dng yu cu mt trang ASP.NET trn HTTP, cc bc di y s din ra: 1. IIS thc hin vic xc thc ngi dng. Nu Anonymous access c kch hot, IIS s t ng ng nhp ngi dng vi ti khon nc danh (IUSR_[ServerName]). Nu khng, n s yu cu thng tin xc thc ng nhp ngi dng vi mt ti khon Windows khc. Nu IIS xc thc ngi dng thnh cng, n s chuyn yu cu n ASP.NET cng vi thng tin v ngi dng c xc thc. Theo , ASP.NET c th s dng cc dch v bo mt ca n da vo cc thit lp trong file Web.config (v d, khng cho ngi dng hoc nhm c th truy xut n cc trang hoc th mc no ). Ngoi ra, m ca bn c th hn ch cc hnh ng bng cch kim tra thng tin v ngi dng. Nu m ASP.NET truy xut bt k ti nguyn h thng no (v d, m mt file hoc kt ni n mt c s d liu), h iu hnh Windows s thc hin nhng kim tra bo mt ca n. Thng thng, m ng dng ASP.NET khng thc s chy di ti khon ca ngi dng c xc thc. Nh th, nhng kim tra bo mt ny c thc hin da trn ti khon tin trnh ASPNET (c cu hnh bng file machine.config).

2.

3.

s dng IIS authentication, bc u tin l v hiu Anonymous access cho th mc o. Bn cn khi ng IIS Manager (vo Start | Control Panel | Administrative Tools | Internet Information Services). K tip, nhp phi vo mt th mc o hoc mt th mc con bn trong th mc o, v chn Properties. Chn th Directory Security (xem hnh 7.5).

254 Chng 7: ASP.NET v Web Form

Hnh 7.5 Directory Security

K tip, nhp nt Edit. Ca s nh hnh 7.6 s xut hin. Trong na di ca ca s, bn c th kch hot mt trong cc phng php xc thc. Tuy nhin, khng phng php no c s dng tr khi bn xa du chn Anonymous access.

Hnh 7.6 Directory authentication

Bn c th kch hot nhiu phng php xc thc, trong trng hp ny client s s dng phng php c h tr mnh nht. Nu Anonymous access c kch hot th n lun c s dng. Cc phng php xc thc khc nhau c m t trong bng 7.2.
Bng 7.2 Cc kiu xc thc

255 Chng 7: ASP.NET v Web Form Ch M t

Anonymous

Client khng cn cung cp bt k thng tin no. Ngi dng c ng nhp bng ti khon nc danh c sn (IUSR_[ServerName]). Basic authentication l mt phn ca chun HTTP 1.0, v n c hu ht cc trnh duyt v web-server h tr. Khi s dng Basic authentication, trnh duyt yu cu ngi dng nhp username v password. Thng tin ny c chuyn cho IIS, v n c so trng vi Windows user account cc b. Basic authentication nn lun c phi hp vi SSL v n khng bo mt thng tin ng nhp trc khi chuyn giao. Digest authentication gi mt digest (tc m bm mt m) trn mng. Do , n an ton hn Basic authentication v thng tin ng nhp nu b chn cng khng th dng li c. Bt li ch yu l Digest authentication ch c h tr trn Internet Explorer 5.0 tr ln. Cng vy, web-server ca bn cn s dng Active Directory hoc c th truy xut n mt Active Directory server. Khi s dng Integrated authentication th Internet Explorer gi logon token cho ngi dng hin hnh mt cch t ng, min l n trn mt min ng tin cy. Integrated authentication ch c h tr trn Internet Explorer 2.0 tr ln v khng th lm vic trn cc proxy-server.

Basic

Digest

Integrated

Mt khi kch hot cc thit lp bo mt cho th mc o thch hp, bn cng nn bo m file Web.config c thit lp l s dng Windows authentication. Trong mt d n Visual Studio .NET, y l thit lp mc nh.
<configuration> <system.web> <!-- B qua cc thit lp khc. --> <authentication mode="Windows" /> </system.web> </configuration>

Vo lc ny, th mc o ca bn s yu cu xc thc ngi dng v ng dng Web s c th ly thng tin v ngi dng. Ngoi ra, bn c th thm cc quy tc phn quyn (authorization rule) ngn ngi dng hoc nhm no truy xut cc trang web hoc th mc con. Bn thc hin iu ny bng cch thm th <allow> v <deny> vo phn <authorization> ca file Web.config. V d, bn c th to mt th mc con vi ni dung file Web.config nh sau:
<configuration> <system.web> <authorization> <deny roles="Guest,Associate" /> <allow users="nnbphuong81" /> <deny users="*" />

256 Chng 7: ASP.NET v Web Form

</authorization> </system.web> </configuration>

ASP.NET xt qua cc quy tc phn quyn theo th t chng xut hin v dng khi tm thy mt trng khp. Trong v d ny, ngi dng trong cc nhm Guest hoc Associate s t ng b t chi. Ngi dng nnbphuong81 s c php (tr khi anh ta l thnh vin ca mt trong hai nhm b cm trn). Tt c cc ngi dng khc s b t chi. Trong trng hp ny, y l cc nhm v ti khon ngi dng cc b. Nu mun ni n mt ti khon min, bn hy s dng c php [DomainName]\[UserName]. trong v d ny, file Web.config khng cha phn <authentication>. l v phn ny c cu hnh trong file Web.config thuc th mc ng dng Web. Cc th mc con c th thit lp cc quy tc phn quyn ca chng, nhng chng khng th thay i ch xc thc. Mt ty chn khc khng cho truy xut n cc trang c th l s dng c tnh <location>:
<configuration> <system.web> <!-- B qua cc thit lp khc. --> </system.web>

<location path="SecurePage.aspx"> <system.web> <authorization> <deny roles="Guest" /> </authorization> </system.web> </location>

</configuration>

Cui cng, bn c th vit logic xc thc bng cch kim tra identity ca ngi dng trong phn m trang web (s dng thuc tnh Page.User, thuc tnh ny cung cp i tng WindowsPrincipal). Bn c th ly tn ngi dng t thuc tnh WindowsPrincipal.Identity.Name, v bn c th kim tra vai tr thnh vin trong nhm bng phng thc WindowsPrincipal.IsInRole. Phn m cho trang web di y s trnh by cc k thut ny:
using System; using System.Web; using System.Web.UI.WebControls;

257 Chng 7: ASP.NET v Web Form using System.Web.Security.Principal;

public class WindowsSecurityTest : System.Web.UI.Page {

protected System.Web.UI.WebControls.Label lblMessage;

// (B qua phn m designer.)

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

// Thu ly identity c IIS xc thc. WindowsIdentity identity = (WindowsIdentity)User.Identity;

// Kim tra xem n c phi l mt Administrator hay khng. bool isAdmin = User.IsInRole(@"BUILTIN\Administrators");

// Hin th mt vi thng tin v identity. lblMessage.Text = "You have reached the secured page, " + User.Identity.Name + "." + "<br><br>Authentication Type: " + identity.AuthenticationType.ToString() + "<br>Anonymous: " + identity.IsAnonymous.ToString() + "<br>Authenticated: " + identity.IsAuthenticated.ToString() + "<br>Guest: " + identity.IsGuest.ToString() + "<br>System: " + identity.IsSystem.ToString() + "<br>Administrator: " + isAdmin.ToString(); } }

9.

S dng Forms authentication


Bn cn ngn ngi dng truy xut cc trang no tr khi h t xc thc trc vi mt trang ng nhp ty bin. Hin thc Forms authentication bng cch cu hnh th <authentication> trong file Web.config ca ng dng. Bn phi to trang ng nhp, nhng ASP.NET s gi li trng thi xc thc ca ngi dng.

Forms authentication l mt m hnh bo mt linh hot, cho php ngn ngi dng cha c xc thc truy xut vo trang no . Bn cn vit m thc hin xc thc, v ASP.NET cp

258 Chng 7: ASP.NET v Web Form

mt cookie cho ngi dng c xc thc. Ngi dng khng c cookie s b chuyn hng sang trang ng nhp khi truy xut mt trang c bo v. hin thc Forms authentication, bn phi thc hin cc bc sau y: Cu hnh Forms authentication bng th <authentication> trong file Web.config ca ng dng. S dng cc thit lp trong file Web.config hn ch ngi dng nc danh truy xut vo mt trang hoc th mc c th. To trang ng nhp, v thm logic xc thc ca bn vo (s dng lp FormsAuthentication thuc khng gian tn System.Web.Security).

Bc u tin l cu hnh file Web.config trong th mc gc ca ng dng kch hot Forms authentication, nh c trnh by trong on m di y. Bn cng cn ch nh trang ng nhp ty bin (ngi dng cha c xc thc s b chuyn hng sang trang ny) v thi gian tr (sau thi gian ny, cookie s b loi b). Authentication cookie t ng c lm mi vi mi yu cu web.
<configuration> <system.web> <!-- B qua cc thit lp khc. --> <authentication mode="Forms"> <forms loginUrl="login.aspx" timeout="30" /> </authentication> </system.web> </configuration>

K n, bn cn thm quy tc phn quyn t chi ngi dng nc danh. Cch d nht bo ton cc trang l to mt th mc con cng vi file Web.config ca n. File Web.config ny s t chi vic truy xut ca cc ngi dng nc danh, nh c trnh by di y:
<configuration> <system.web> <authorization> <deny users="?" /> </authorization> <!-- B qua cc thit lp khc. --> </system.web> </configuration>

259 Chng 7: ASP.NET v Web Form

By gi, ASP.NET s t ng gi cc yu cu cha c xc thc (i vi cc trang trong th mc con) n trang ng nhp ty bin. Mt ty chn khc khng cho truy xut n cc trang c th trong th mc hin thi l s dng th <location>:
<configuration> <system.web> <!-- B qua cc thit lp khc. --> </system.web> <location path="SecurePage.aspx"> <system.web> <authorization> <deny users="?" /> </authorization> </system.web> </location> </configuration>

Bn cng c th t chi cc ngi dng c th bng cch nhp danh sch tn ngi dng (phn cch bng du phy) thay vo k t ? (? ngha l tt c cc ngi dng nc danh). K tip, bn cn to trang ng nhp. Trang ng nhp c th xc thc ngi dng bng password c vit cng (ph hp cho cc th nghim n gin), c s d liu pha server, hoc bt k kiu logic xc thc ty bin no. Mt khi ngi dng c xc thc thnh cng, bn cn gi phng thc tnh FormsAuthentication.RedirectFromLoginPage. Phng thc ny s thit lp authentication cookie v chuyn hng ngi dng n trang c yu cu lc u. Di y l trang ng nhp s b, ch kim tra mt password c th khi ngi dng nhp vo nt Login:
using System; using System.Web; using System.Web.UI.WebControls; using System.Web.Security; public class LoginPage : System.Web.UI.Page { protected System.Web.UI.WebControls.Label lblStatus; protected System.Web.UI.WebControls.Button cmdLogin; protected System.Web.UI.WebControls.TextBox txtPassword; protected System.Web.UI.WebControls.TextBox txtName;

260 Chng 7: ASP.NET v Web Form

// (B qua phn m designer.) private void cmdLogin_Click(object sender, System.EventArgs e){ if (txtPassword.Text.ToLower() == "secret") { FormsAuthentication.RedirectFromLoginPage( txtName.Text, false);

}else { lblStatus.Text = "Try again."; } } }

th nghim trang ng nhp trn, bn hy yu cu trang SecurePage.aspx (nm trong th mc Secured). Bn s b chuyn hng sang trang login.aspx, v nu nhp ng password, bn s c tr v trang SecurePage.aspx.

Hnh 7.7 Trang ng nhp ty bin

10.

Thc hin xc nhn tnh hp l c-chn-la


Bn cn s dng cc iu kim validator ca ASP.NET. Tuy nhin, bn mun kim tra bng m lnh c th xc nhn tnh hp l ch cc iu kim hay tp cc iu kim no , hoc c th ty bin cc thng bo li da trn u vo khng hp l. V hiu thuc tnh EnableClientScript ca mi iu kim validator trang c th c post-back. K , s dng phng thc Page.Validate xc nhn tnh

261 Chng 7: ASP.NET v Web Form

hp l ca trang hoc phng thc BaseValidator.Validate xc nhn tnh hp l ca tng iu kim ring r. iu kim validator ca ASP.NET l gii php l tng xc nhn tnh hp l ca form mt cch nhanh chng. Vi iu kim validator, bn c th xc nhn tnh hp l ca ton b trang cng mt lc. Nu mun xc nhn tnh hp l ch mt phn form, hoc mun quyt nh xem c cn xc nh tnh hp l mt iu kim no hay khng (da trn gi tr ca mt iu kim khc chng hn), bn s cn thc hin thao tc xc nhn tnh hp l c-chn-la. Bc u tin trong thao tc ny l v hiu thuc tnh EnableClientScript ca mi iu kim validator trn trang. Nu khng, vic kim tra s c thc hin ti client thng qua JavaScript, trang s khng c post-back nu n cha cc gi tr khng hp l, v phn m th l s kin s khng c thc thi. Mt khi thc hin thay i ny, bn c th xc nhn tnh hp l tng iu kim mt bng phng thc BaseValidator.Validate, hoc xc nhn tnh hp l ton b trang bng phng thc Page.Validate. V d di y thc hin kim tra pha server vi hai validator: RangeValidator v RegularExpressionValidator (xc nhn tnh hp l mt a ch e-mail). Nu kim tra tht bi, on m ny s duyt qua tp hp cc validator trn form bng thuc tnh Page.Validators. Mi khi tm thy mt validator c li, n s tm iu kim tng ng bng phng thc Page.FindControl ri hin th gi tr li.
using System; using System.Web; using System.Web.UI.WebControls;

public class SelectiveValidation : System.Web.UI.Page {

protected System.Web.UI.WebControls.TextBox txtNumber; protected System.Web.UI.WebControls.TextBox txtEmail; protected System.Web.UI.WebControls.Label lblCustomSummary; protected System.Web.UI.WebControls.RegularExpressionValidator validatorEmail; protected System.Web.UI.WebControls.RangeValidator validatorNumber; protected System.Web.UI.WebControls.Button cmdValidate;

// (B qua phn m designer.)

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

// Xc nhn tnh hp l ca trang. this.Validate();

262 Chng 7: ASP.NET v Web Form

if (!Page.IsValid) {

lblCustomSummary.Text = ""; foreach (BaseValidator validator in this.Validators) {

if (!validator.IsValid) {

TextBox invalidControl = (TextBox) this.FindControl(validator.ControlToValidate);

lblCustomSummary.Text += "The page contains the following error: <b>" + validator.ErrorMessage + "</b>.<br>" + "The invalid input is: <b>" + invalidControl.Text + "</b>." + "<br><br>"; } }

}else { lblCustomSummary.Text = "Validation succeeded."; } } }

263 Chng 7: ASP.NET v Web Form

Hnh 7.8 Thc hin thao tc xc nhn tnh hp l ty bin

11.

Thm ng iu kim vo Web Form


Bn cn thm mt iu kim web vo mt trang web lc thc thi v th l cc s kin ca n. To mt i tng iu kim, thm n vo tp hp Controls ca mt iu kim container, v s dng lnh AddHandler kt ni bt k phng thc th l s kin no. Bn phi to iu kim sau mi ln postback.

K thut thm iu kim web vo trang web tng t nh k thut thm iu kim Windows vo form, nhng c mt vi im khc, bao gm: Cc iu kim c-to-ng ch tn ti n ln postback k tip. Nu cn chng, bn phi ti to li khi trang c tr v. Tuy nhin, i hi ny khng ngn bn vit m th l cc s kin ca chng. Vic nh v cc iu kim c-to-ng khng my d dng. Bn nn s dng iu kim trc kin (literal control) cha m HTML (nh <br>) phn cch cc iu kim c-to-ng. Cc iu kim c-to-ng nn c t trong mt iu kim container (nh Panel) hn l t trc tip ln trang. iu ny khin cho vic nh v chng d dng hn. Nu mun tng tc vi iu kim sau ny, bn nn cho n mt nh danh (ID) duy nht. Bn c th s dng ID ny thu ly n t tp hp Controls ca iu kim container.

Ni tt nht to cc iu kim mi l trong phng thc th l s kin Page.Load (bo m iu kim s c to mi khi trang c p ng). Ngoi ra, nu bn thm mt iu kim

264 Chng 7: ASP.NET v Web Form

nhp (input) s dng view state, thng tin view state s c tr li cho iu kim sau khi s kin Page.Load pht sinh. Tng t, v s kin Page.Load lun pht sinh trc khi s kin no khc din ra, bn c th ti to mt iu kim dng nn cc s kin pha server, v phn m th l s kin ca n s din ra ngay sau s kin Page.Load. V d di y (xem hnh 7.9) s to ng ba iu kim (hai Button v mt TextBox) v nh v chng bng iu kim trc kin (ng vai tr l du phn cch). Hai Button c kt ni vi cc phng thc th l s kin ring bit. TextBox c cp mt nh danh duy nht phn text ca n c th c thu ly sau ny (trong p ng cho c nhp chut vo Button).

Hnh 7.9 Cc iu kim c-to-ng using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Security;

public class DynamicControls : System.Web.UI.Page {

protected System.Web.UI.WebControls.Label lblMessage; protected System.Web.UI.WebControls.Panel pnl;

// (B qua phn m designer.)

265 Chng 7: ASP.NET v Web Form private void Page_Load(object sender, System.EventArgs e) {

// To Button. Button dynamicButton = new Button(); dynamicButton.Text = "Dynamic Button A";

// Kt ni phng thc th l s kin. dynamicButton.Click += new EventHandler(cmdDynamicA_Click);

// Thm Button vo Panel. pnl.Controls.Add(dynamicButton);

// Thm du ngt dng. pnl.Controls.Add(new LiteralControl("<br>"));

// To Button th hai. dynamicButton = new Button(); dynamicButton.Text = "Dynamic Button B"; dynamicButton.Click += new EventHandler(cmdDynamicB_Click); pnl.Controls.Add(dynamicButton);

// Thm du ngt dng. pnl.Controls.Add(new LiteralControl("<br><br>"));

// To TextBox. TextBox dynamicText = new TextBox(); pnl.Controls.Add(dynamicText);

// Gn ID cho TextBox. dynamicText.ID = "DynamicText"; }

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

lblMessage.Text = "Clicked A"; GetText(); }

266 Chng 7: ASP.NET v Web Form

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

lblMessage.Text = "Clicked B"; GetText(); }

private void GetText(){ lblMessage.Text += "<br><br>";

foreach (Control ctrl in pnl.Controls){ if (ctrl.ID == "DynamicText"){ lblMessage.Text += "TextBox contains: " + ((TextBox)ctrl).Text; } } } }

Nu cn to ng cc layout phc tp (gm cc nhm iu kim c to dng trc), bn c th chuyn sang s dng iu kim ngi dng v np ng chng vo trang. K thut ny s c trnh by trong mc 7.13.

12.

Tr v ng mt bc hnh
Bn cn tr v ng mt bc hnh (chng hn, to dng kt xut dng biu hoc th). To dng bc hnh bng GDI+ v mt i tng System.Drawing.Bitmap trongb-nh. K , bn c th ghi n ra dng kt xut (output stream), hoc lu n vo a cng ca server v hin th n vi iu kim web Image.

Bn c th v ng cc bc hnh trong mt ng dng Web bng cch s dng cng on m GDI+ s dng trong mt ng dng da-trn-Windows. Ch c im khc l cch thc bn tr v bc hnh cui cng nh th no. V c bn, c hai cch tip cn m bn c th s dng: Bn c th a trc tip ni dung nh phn ca bc hnh vo thuc tnh OutputStream ca i tng HttpResponse. y l mt cch tip cn hay nu bn khng mun lm y a cng ca server vi cc file hnh khng h c s dng li. y cng l s la chn tt nht nu bn cn to ng cc bc hnh c thit k ph hp vi u vo ca ngi dng.

267 Chng 7: ASP.NET v Web Form

Bn c th lu bc hnh vo h thng file ca web-server v s dng th HTML <img> hin th n. y l s la chn tt nu bn cn to mt bc hnh s c s dng li, v trnh c chi ph ca vic ti to hnh lin tc.

Mc ny kho st c hai cch tip cn trn. Trc tin, hy xt cch to ng mt hnh m khng lu n ra file. Trong v d ny, mc ch l to mt banner n gin (xem hnh 7.10).

Hnh 7.10 Mt banner c-to-ng

rng ch c phn text ca banner l do ngi dng cung cp (thng qua chui truy vn). Font, mu, v kch thc c vit m cng (mc d chng c th c thit lp d dng da vo cc i s chui truy vn khc hoc da vo file Web.config). on m di y s trnh by cch tip cn ny:
using System; using System.Web; using System.Web.UI.WebControls; using System.Drawing; using System.Drawing.Drawing2D;

public class DynamicGraphic : System.Web.UI.Page {

// (B qua phn m designer.)

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

// Ly text t chui truy vn. // Nu khng c text, chn mc nh. string text = ""; if (Request.QueryString["image"] == null) {

268 Chng 7: ASP.NET v Web Form

Response.Redirect(Request.Url + "?image=" + Server.UrlEncode("This is a test image")); } else { text = Server.UrlDecode(Request.QueryString["image"]); }

// To mt hnh bitmap trong-b-nh // (rng 300 pixel v cao 200 pixel). int width = 300, height = 200; Bitmap bitmap = new Bitmap(width, height);

// Ly graphics context ca hnh bitmap. Graphics graphics = Graphics.FromImage(bitmap);

// Thit lp mu nn v cht lng hnh. // Mu ny s tr thnh ng vin. graphics.Clear(Color.OrangeRed); graphics.SmoothingMode = SmoothingMode.AntiAlias;

// V mt hnh ch nht. graphics.FillRectangle(new SolidBrush(Color.Olive), 5, 5, width - 10, height - 10);

// Chn font v alignment cho text. Font fontBanner = new Font("Verdana", 24, FontStyle.Bold); StringFormat stringFormat = new StringFormat(); stringFormat.Alignment = StringAlignment.Center; stringFormat.LineAlignment = StringAlignment.Center;

// V text. graphics.DrawString(text, fontBanner, new SolidBrush(Color.LightYellow), new Rectangle(0, 0, width, height), stringFormat);

269 Chng 7: ASP.NET v Web Form

// Lu bc hnh vo dng kt xut. bitmap.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);

graphics.Dispose(); bitmap.Dispose(); } }

Khi lu bc hnh vo dng kt xut, bn s th ch bt k kt xut no khc. V th, bn khng th s dng k thut ny vi mt trang cng c cha Web controls hoc ni dung HTML tnh. Theo , nu mun s dng mt trang phi hp cc bc hnh c-to-ng v cc iu kim web, bn cn bc bc hnh c-to-ng trong mt iu kim hoc ghi bc hnh ra a cng trc khi hin th n. Nu mun lu file vo a cng, bn cn chuyn phn m to dng bc hnh thnh mt phng thc c lp, m chng ta s t tn l GenerateBanner. K , trong phng thc th l s kin Page.Load, bn kim tra xem file tn ti cha (s dng phng thc tnh File.Exists). Nu file cha tn ti, bn to n trong b nh bng phng thc GenerateBanner v lu n bng phng thc Bitmap.Save. Nu file tn ti, bn ch cn np thng bc hnh ny. on m di y s trnh by cch tip cn ny:
using System; using System.IO; using System.Web; using System.Web.UI.WebControls; using System.Drawing; using System.Drawing.Drawing2D; public class DynamicGraphic : System.Web.UI.Page { protected System.Web.UI.WebControls.Image imageControl; // (B qua phn m designer.) private Bitmap GenerateBanner() { // To dng bc hnh, s dng phn m trong v d trn. } private void Page_Load(object sender, System.EventArgs e) {

270 Chng 7: ASP.NET v Web Form

// Thit lp tn file. // Gi s chui truy vn cha cc k t hp l cho tn file. string fileName = Request.QueryString["image"] + ".gif"; Bitmap bitmap = null; // Kim tra bc hnh vi phn text ny tn ti hay cha. if (File.Exists(fileName)) { // Np bc hnh hin c. try { bitmap = new Bitmap(fileName); }catch { bitmap = GenerateBanner(); } } else { bitmap = GenerateBanner(); // Lu bc hnh. bitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Gif); } // Hin th bc hnh. imageControl.ImageUrl = fileName; } }

13.

Np iu kim ngi dng bng m lnh


Bn cn to dng ng giao din ngi dng (user interface) cho mt trang t mt hoc nhiu iu kim ngi dng (user control). S dng phng thc Page.LoadControl to i tng iu kim t file .ascx, v ri thm n vo tp hp Controls ca mt iu kim container.

271 Chng 7: ASP.NET v Web Form

iu kim ngi dng l cc nhm iu kim c lp. Nh Web Form, iu kim ngi dng bao gm phn layout nh ngha cc iu kim bn trong (file .ascx) v phn code-behind cng vi logic th l s kin (file .cs). iu kim ngi dng cho php bn s dng li cc phn t giao din thng thng trn nhiu trang v to dng cc giao din phc tp t cc khi nh hn. Mt c im hu ch ca iu kim ngi dng l chng c th c np bng m lnh, iu ny cho php bn to mt giao din cu hnh cao do bn thit k ng y theo ngi dng. Bn ch cn np iu kim, cu hnh cc thuc tnh ca n, v ri thm n vo mt iu kim container. V d, xt trang web to ng cc bc hnh trong mc 7.12. Mt gii php theo cch hng i tng hn c th hin thc c l to mt iu kim ngi dng ty bin ng gi bc hnh c-to-ng. iu kim ngi dng ny cho php trang thit lp text, font, mu... thng qua cc thuc tnh khc nhau.
using System; using System.Web; using System.Web.UI.WebControls; using System.Drawing; using System.Drawing.Drawing2D; public class DynamicGraphicControl : System.Web.UI.UserControl { // (B qua phn m designer.) private string imageText = ""; public string ImageText { get { return imageText; } set { imageText = value; } } private Font textFont; public Font TextFont { get { return textFont; } set { textFont = value; }

272 Chng 7: ASP.NET v Web Form

private Size imageSize; public Size ImageSize { get { return imageSize; } set { imageSize = value; } }

private Color foreColor; public Color ForeColor { get { return foreColor; } set { foreColor = value; } }

private Color backColor; public Color BackColor { get { return backColor; } set { backColor = value; } }

private Color borderColor; public Color BorderColor { get {

273 Chng 7: ASP.NET v Web Form return borderColor; } set { borderColor = value; } }

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

if (ImageText == "") return;

// To mt hnh bitmap trong-b-nh. Bitmap bitmap = new Bitmap(ImageSize.Width, ImageSize.Height);

// ly graphics context ca hnh bitmap. Graphics graphics = Graphics.FromImage(bitmap);

// Thit lp mu nn v cht lng hnh. // Mu ny s tr thnh ng vin. graphics.Clear(BorderColor); graphics.SmoothingMode = SmoothingMode.AntiAlias;

// V mt hnh ch nht. graphics.FillRectangle(new SolidBrush(BackColor), 5, 5, ImageSize.Width - 10, ImageSize.Height - 10);

// Thit lp alignment cho text. StringFormat stringFormat = new StringFormat(); stringFormat.Alignment = StringAlignment.Center; stringFormat.LineAlignment = StringAlignment.Center;

// V text. graphics.DrawString(ImageText, TextFont, new SolidBrush(ForeColor), new Rectangle(0, 0, ImageSize.Width, ImageSize.Height), stringFormat);

274 Chng 7: ASP.NET v Web Form

// Lu bc hnh vo dng kt xut. bitmap.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);

graphics.Dispose(); bitmap.Dispose(); } }

Web Form np iu kim ngi dng ny trong phng thc th l s kin Page.Load. iu kim ngi dng c t trong mt Panel. Phng thc LoadControl tr v mt i tng Control, v n c p kiu thnh lp iu kim ngi dng thch hp.
using System; using System.Web; using System.Web.UI.WebControls; using System.Drawing; public class DynamicControlTest : System.Web.UI.Page { protected System.Web.UI.WebControls.Panel pnl; // (B qua phn m designer.) private void Page_Load(object sender, System.EventArgs e) { // Np iu kim. DynamicGraphicControl ctrl; ctrl = (DynamicGraphicControl) Page.LoadControl("DynamicGraphicControl.ascx"); // Cu hnh cc thuc tnh ca iu kim. ctrl.ImageText = "This is a new banner test"; ctrl.ImageSize = new Size(300, 200); ctrl.TextFont = new Font("Verdana", 24, FontStyle.Bold); ctrl.BackColor = Color.Olive; ctrl.ForeColor = Color.LightYellow; ctrl.BorderColor = Color.OrangeRed;

275 Chng 7: ASP.NET v Web Form

// Thm iu kim vo Panel. pnl.Controls.Add(ctrl); } }

Trong Visual Studio .NET, lp iu kim ngi dng lun c hiu lc v cc lp c bin dch thnh .dll. Tuy nhin, nu iu kim ngi dng khng phi mt b phn ca d n, bn s khng c lp iu kim ngi dng v bn s khng th truy xut bt k thuc tnh hay phng thc no ca iu kim ngi dng. khc phc vn ny, bn c th to mt lp c s hoc mt giao din nh ngha cc chc nng c bn c th truy xut vo bt k iu kim ngi dng ty bin no.

tm hiu k hn v k thut ny, bn hy download IBuySpy portal case study ti [http://www.asp.net/IBS_Portal]. N trnh by mt layout kh-ty-bin-cao c to dng hon ton t cc iu kim ngi dng c-np-ng.

14.

S dng page-caching v fragment-caching


Bn cn tng hiu nng bng cch lu gi cc trang c tr v. Thm ch th OutputCache vo trang hoc iu kim ngi dng, v ch nh trang s c gi trong cache bao lu (tnh theo giy).

Vic s dng caching va phi c th gim bt hiu ng tht c chai (chng hn, truy xut c s d liu) v tng ton b hiu nng ca mt website. Caching c hiu qu ln trong mt site c lu lng cao. V d, xt xem iu g s xy ra khi bn lu gi mt trang hin th kt qu ca mt truy vn c s d liu. Nu bn lu gi trang ny trong 1 pht, v trang ny nhn c 10 yu cu trong khong thi gian , bn s gim c 10 ln chi ph truy xut c s d liu. Bn c th hin thc caching mt cch d dngch cn thm ch th OutputCache vo trang web. Ch th ny phi c thm vo file .aspx, ch khng phi file .cs. V d di y lu gi mt trang trong 20 giy:
<%@ OutputCache Duration="20" VaryByParam="None" %>

V v d di y lu gi mt trang trong 20 giy nhng vn duy tr cc bn sao ty vo gi tr ca cc i s chui truy vn:


<%@ OutputCache Duration="20" VaryByParam="*" %>

Bn c th th nghim caching bng mt trang hin th ngy v gi trn server. Bn s nhn thy rng cc yu cu n sau (i vi trang ny) khng khin cho thi gian c to mi. Theo , thi gian c s c hin th cho n khi trang ht hiu lc. Output-caching khng hiu qu trong cc trng hp sau y: Trang ca bn cn t ty bin y theo cc thit lp c th ca ngi dng nh thng tin xc thc (i tng User) hoc trng thi (i tng Session). Trong trng hp ny, n khng to cm gic s dng li cng mt trang cho tt c cc ngi dng.

276 Chng 7: ASP.NET v Web Form

Trang ca bn cha cc iu kim post-back v dng nn cc s kin pha server. Trang ca bn cn thc hin mt hnh ng khc (nh ghi ra file nht k, nhp thng tin vo c s d liu, hoc thay i mt bin ng dng). Mt trang c lu gi s s dng li ton b HTML c tr v; phn m cho trang b b qua. Trang ca bn c cha cc d liu cn phi c to cng vi cc d liu hin hnh. y l trng hp i vi tm kim sn phm, nhng khng phi l trng hp i vi danh mc sn phm.

Trong cc trng hp ny, bn c th s dng mt dng caching linh hot hn. Bn c th s dng data-caching (s c m t trong mc 7.15) lu gi mt i tng c th. Hoc bn c th s dng fragment-caching lu gi mt phn ca trang. s dng fragmentcaching, bn cn to mt iu kim ngi dng cha tt c ni dung c th c lu gi v thm ch th OutputCache vo iu kim ngi dng. Khi , bn c th s dng iu kim ngi dng ny trong mt trang web. Phn m cho trang web vn s chy, nhng phn iu kim ngi dng c th c lu gi.

15.

Dng li d liu vi ASP.NET Cache


Bn cn s dng caching, nhng bn khng th lu gi ton b mt trang v n cha mt s m cn phi chy hoc mt s ni dung cn phi c to ng. S dng phng thc Cache.Insert lu gi bt k i tng no vi chnh sch ht hiu lc trt (sliding expiration) hoc ht hiu lc tuyt i (absolute expiration).

i tng Cache cho php bn lu gi hu nh bt k i tng .NET no bng mt kha chui cng vi chnh sch ht hiu lc do bn nh ngha. ASP.NET duy tr cache mt cch t ng, g b cc i tng khi chng ht hiu lc hoc khi cn b nh. C hai kiu chnh sch ht hiu lc bn c th s dng khi lu gi d liu trong cache. Ht hiu lc tuyt i (absolute expiration) lm mt hiu lc cc item c lu gi sau mt khong thi gian c nh, gn ging vi output-caching. Ht hiu lc tuyt i l cch tip cn tt nht nu bn mun lu gi cc thng tin cn c lm ti nh k (nh danh mc sn phm).
// Lu gi ObjectToCache trong 10 pht (vi kha l "Catalog"). // TimeSpan.Zero cho bit "khng s dng sliding expiration". Cache.Insert("Catalog", ObjectToCache, null, DateTime.Now.AddMinutes(10), TimeSpan.Zero);

Ht hiu lc trt (sliding expiration) g b cc i tng sau mt khong thi gian khng dng n. Trong trng hp ny, mi khi i tng c truy xut, thi gian sng ca n s c reset. Ht hiu lc trt lm vic tt khi bn c cc thng tin lun c hiu lc nhng lun khng c s dng (nh d liu thuc v qu kh). Thng tin ny khng cn c lm ti, nhng khng nn gi n trong cache nu n khng c s dng.

277 Chng 7: ASP.NET v Web Form // Lu gi ObjectToCache nu n c s dng t nht // mt ln mi 10 pht (vi kha l "Catalog"). // DateTime.MaxValue cho bit "khng s dng absolute expiration". Cache.Insert("Catalog", ObjectToCache, null, DateTime.MaxValue, TimeSpan.FromMinutes(10));

Bn c th ly cc item t cache bng tn kha. Tuy nhin, bn phi lun kim tra trc xem item c tn ti hay khng v ri p n thnh kiu nh mong mun. Khi thm cc i tng vo cache, cch tt nht l to mt hm c lp c th ti to i tng khi cn. V d, nu ang lu gi mt DataSet, bn cn to mt hm kim tra cache v ch truy vn li c s d liu khi khng tm thy DataSet. iu ny cho php bn trnh i phn x l tn nhiu thi gian nhttruy vn c s d liutrong khi vn cho php m lnh ca bn thay i hin th (chng hn, ngi dng yu cu sp th t) hoc thc hin cc hnh ng khc. V d di y s hin th mt bng cha thng tin v khch hng c ly t mt DataSet. Phn then cht l lp CustomerDatabase, ng gi cc chc nng cn thit d liu vo DataSet v qun l cache. V lp ny khng tha k t Page nn n cn s dng thuc tnh tnh HttpContext.Current ly tham chiu n i tng Cache.
using System; using System.Data; using System.Web; using System.Configuration; using System.Diagnostics; using System.Web.Caching; using System.Data.SqlClient;

public class CustomerDatabase {

private string connectionString;

// Ly tham chiu n i tng Cache. private Cache cache = HttpContext.Current.Cache;

public CustomerDatabase() {

// Ly chui kt ni t file Web.config. connectionString = ConfigurationSettings.AppSettings["NorthwindCon"]; }

278 Chng 7: ASP.NET v Web Form

public DataSet GetCustomers() {

DataSet customersDS;

// Kim tra item c nm trong cache hay khng. if (cache["Customers"] == null) {

// Ly DataSet t c s d liu. customersDS = GetCustomersFromDatabase();

// Lu gi item trong cache // cng vi sliding expiration l 60 giy. cache.Insert("Customers", customersDS, null, DateTime.MaxValue, TimeSpan.FromSeconds(60));

// Hin th thng ip trong ca s Debug. Debug.WriteLine("DataSet created from data source.");

}else {

// Hin th thng ip trong ca s Debug. Debug.WriteLine("DataSet retrieved from cache.");

// Ly item. customersDS = (DataSet)cache["Customers"]; }

// Tr v DataSet. return customersDS; }

private DataSet GetCustomersFromDatabase() {

// To DataSet. DataSet customersDS = new DataSet();

279 Chng 7: ASP.NET v Web Form

// d liu vo DataSet. SqlConnection con = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", con); SqlDataAdapter adapter = new SqlDataAdapter(cmd);

try {

con.Open(); adapter.Fill(customersDS, "Customers"); }catch {

customersDS = null; } finally { con.Close(); }

Bc k tip l to mt trang web s dng lp CustomerDatabase. Trang web di y gm mt DataGrid v mt Button. Mi khi ngi dng nhp vo Button, trang s gi phng thc CustomerDatabase.GetCustomers. Thng tin c ly t cache nu vn cn hiu lc hoc c truy vn li nu 60 giy tri qua. Bn c th nhn bit DataSet c c ly t cache hay khng bng cch nhn vo kt xut trong ca s Debug.
using System; using System.Web; using System.Web.UI.WebControls;

public class LoginPage : System.Web.UI.Page {

protected System.Web.UI.WebControls.DataGrid DataGrid1; protected System.Web.UI.WebControls.Button cmdGetData;

// (B qua phn m designer.)

private void cmdGetData_Click(object sender, System.EventArgs e){ CustomerDatabase custDB = new CustomerDatabase(); DataGrid1.DataSource = custDB.GetCustomers(); DataGrid1.DataBind(); }

280 Chng 7: ASP.NET v Web Form

16.

Kch hot vic g ri ng dng Web


Khi thc hin g ri mt ng dng Web vi Visual Studio .NET, bn nhn c li Unable to start debugging on the Web server. Bo m Internet Information Services (IIS) c ci t ng, IIS c ci t trc Microsoft .NET Framework, v Integrated Windows authentication c kch hot cho th mc cha ng dng Web.

Hnh 7.11 Li Unable to start debugging on the Web server

Li Unable to start debugging on the Web server cho bit rng Visual Studio .NET c th bin dch ng dng Web nhng khng th thc thi n ch g ri (debug mode). Vn ny pht sinh v nhiu l do: IIS cha c ci t hoc ci t khng ng. Ngi dng ang chy Visual Studio .NET khng phi l thnh vin ca nhm Debugger Users trn web-server. Ngi dng ang chy Visual Studio .NET khng c quyn (permission) g ri tin trnh ASP.NET. V d, nu tin trnh ASP.NET ang chy di ti khon h thng cc b, ngi dng phi c c quyn Administrator th mi c th g ri n. Web-server ang chy trn phin bn Windows khng h tr g ri, nh Microsoft Windows NT v Windows XP Home Edition (Windows 2000, Windows XP Professional, Windows XP Server, v Windows Server 2003 u h tr g ri). ng dng Web khng c file Web.config, hoc file Web.config khng kch hot g ri. Bn ang chy Visual Studio .NET, v bn khng kch hot Integrated Windows authentication cho th mc o.

Bc u tin bn cn thc hin khi chn on l do khng th g ri mt ng dng Web l kim tra vic ci t IIS trn web-server. thc hin iu ny, bn hy m http://localhost/localstart.asp trong trnh duyt (localhost l mt b danh cho my tnh hin hnh). Nu trang th nghim ny khng xut hin th c ngha l IIS khng c ci t hoc khng c kch hot. Bn cng c th bt u ng dng Web m khng thc hin g ri bng cch chn Debug | Start Without Debugging t thanh trnh n ca Visual Studio .NET. Nu th nghim ny thnh cng th c ngha l IIS c ci t ng.

281 Chng 7: ASP.NET v Web Form

Nu ci t IIS sau khi ci t Visual Studio .NET hoc .NET Framework, bn cn phi "sa" .NET Framework bng a ci t gc. bt u qu trnh ny, bn hy g lnh sau y vo ca s dng lnh (hoc ca s Run), nu ang dng phin bn DVD ca Visual Studio .NET:
<DVD Drive>:\wcu\dotNetFramework\dotnetfx.exe /t:c:\temp /c:"msiexec.exe /fvecms c:\temp\netfx.msi"

Nu ang dng phin bn CD ca Visual Studio .NET, bn hy s dng dng lnh sau y cng vi a Windows Component Update:
<CD Drive>:\dotNetFramework\dotnetfx.exe /t:c:\temp /c:"msiexec.exe /fvecms c:\temp\netfx.msi"

Nu IIS c ci t ng, bc k tip l xc nhn tnh hp l ca file Web.config. File Web.config phi c cu trc nh sau:
<configuration> <system.web> <compilation defaultLanguage="c#" debug="true" >

<!-- B qua cc thit lp khc. -->

</system.web> </configuration>

Theo mc nh, Visual Studio .NET thm th <compilation> vo file Web.config (c to t ng) vi c tnh debug c thit lp l true. Bc k tip l kim tra cu hnh IIS. Vn s xy ra nu bn qun to th mc o cho ng dng hoc nu bn chy mt ng dng sau khi g b hoc chnh sa th mc o ca n. khc phc cc vn ny, bn hy hiu chnh cc thit lp cho th mc o trong IIS Manager bng cch chn Control Panel | Administrative Tools | Internet Information Services t Start Menu. Bn cn kim tra xem th mc o tn ti v c cu hnh l mt ng dng Web hay cha (bn c th xem cc thit lp cho th mc o bng cch nhp phi vo n v chn Properties). V d, th mc o FMStocks7 (xem hnh 7.12) tn ti nhng cha c cu hnh l mt ng dng Web. gii quyt vn ny, bn ch cn nhp vo nt Create trong phn Application Settings.

282 Chng 7: ASP.NET v Web Form

Hnh 7.12 Mt th mc o khng phi l mt ng dng Web

Mt vn khc v cu hnh IIS c th xy ra trong Visual Studio .NET l khng thc hin xc thc. Visual Studio .NET truy xut web-server cc b bng Integrated Windows authentication, ngay c khi bn kch hot Anonymous authentication cho th mc o. iu ny ngha l th mc o ca bn phi cho php c Anonymous authentication v Integrated Windows authentication. cho php c hai phng php ny, bn cn thc hin cc bc sau y: 1. Trong IIS Manager, nhp phi vo th mc o cho ng dng ca bn v chn Properties (bn c th cu hnh kiu xc thc cho tt c cc th mc nu nhp phi vo th mc Web Sites v chn Properties). Chn th Directory Security (xem hnh 7.13). Trong phn Anonymous access and authentication control, nhp nt Edit. Trong hp thoi Authentication Methods, bn di Authenticated access, chn Integrated Windows authentication (xem hnh 7.14). Nhp OK.

2. 3. 4. 5.

283 Chng 7: ASP.NET v Web Form

Hnh 7.13 Directory Security

Hnh 7.14 Kch hot Integrated Windows authentication

284 Chng 7: ASP.NET v Web Form

17.

Thay i quyn cp cho m ASP.NET


Bn cn cp cho phn m ca trang web hoc dch v Web ca bn nhiu c quyn Windows hn (nh cc quyn cho file, thit lp Registry, c s d liu, v cc ti nguyn khc), hoc bn cn hn ch cc c quyn hin c. Bn c th gn trc tip cc c quyn cho ti khon ASPNET cc b, hoc c th cu hnh m ASP.NET ca bn s dng mt ti khon hon ton khc bng cch chnh sa th <processModel> trong file machine.config. Bn cng c th s dng k thut gi nhn (impersonation) mt on m thc thi vi cc quyn ca ngi dng c IIS xc thc.

M ASP.NET khng chy di ti khon ngi dng c IIS xc thc hoc ti khon nc danh IUSR_[ServerName]. Mt phn l do l ti khon ny thng khng c c quyn i vi m ASP.NET (c th to v xa cc file tm qun l tin trnh bin dch trang web). Theo mc nh, cc trang ASP.NET chy bng ti khon ASPNET cc b, ti khon ny c mt tp cc c quyn b gii hn. Nu cn m ASP.NET ca bn thc hin iu g khng c php theo mc nh i vi ti khon cc b (chng hn, ghi ra a cng trn server), bn c th cp cc quyn ny cho tin trnh ASPNET. Bn cng c th thay i thit lp ny bng cch m file machine.config (nm trong th mc <Windows directory>\Microsoft.NET\ Framework\<version>\CONFIG\) v chnh sa th <processModel>.

Hnh 7.15 File machine.config

Bn c th thit lp cc c tnh userName v password cho mt ngi dng bt k, hoc bn c th a vo s dng tin trnh ASPNET cc b (thit lp userName l machine v password l AutoGenerate) hoc ti khon h thng cc b (thit lp userName l SYSTEM v password l AutoGenerate). V ti khon h thng cc b c c y quyn trn my tnh nn ng bao gi s dng ti khon ny ngoi tr mc ch th nghim. Cc thit lp v ti khon ASP.NET l ton cc v tt c cc ng dng Web s chia s ti khon m bn ch nh.

285 Chng 7: ASP.NET v Web Form

Bn cng c th thay i ti khon dng thc thi cc ng dng hoc on m no bng k thut gi nhn. V d, cu hnh mt ng dng Web chy di mt ti khon ngi dng khc, bn cn thm th <identity> vo file Web.config nh sau:
<configuration> <system.web> <!-- B qua cc thit lp khc. -->

<identity impersonate="true" name="domain\user" password="pwd"/>

</system.web> </configuration>

Bn cng c th ch th ng dng Web s dng identity c IIS xc thc, s l ti khon nc danh IUSR_[ServerName] nu bn khng s dng Windows authentication ( c tho lun trong mc 7.8). Bn ch cn thm th <identity> m khng phi thm bt c thng tin xc thc no:
<identity impersonate="true"/>

Nh rng, i vi kiu gi nhn ny, ti khon ngi dng s yu cu truy xut c/ghi n th mc Temporary ASP.NET Files (ni lu tr cc file ASP.NET c bin dchc nh v ti \[WindowsDirectory]\Microsoft.NET\Framework\ [version]\Temporary ASP.NET Files). Cui cng, bn cng c th s dng k thut gi nhn bng m lnh (vn ny s c m t chi tit trong mc 13.15). Tuy vy, v d di y s lm vic cng vi Windows authentication. Nu IIS xc thc ngi dng (c m t trong mc 7.8), identity s c tha nhn khi s dng phng thc WindowsIdentity.Impersonate. s dng on m ny, bn phi nhp khng gian tn System.Security.Principal.
if (User.GetType() == typeof(WindowsPrincipal)) {

WindowsIdentity id = (WindowsIdentity)User.Identity; WindowsImpersonationContext impersonate = id.Impersonate();

// (Thc hin cc tc v vi ID ny.)

// Tr li ID. impersonate.Undo(); } else {

// Ngi dng khng c xc thc. // Nm li hoc thc hin cc bc khc. }

286 Chng 7: ASP.NET v Web Form

287

Chng 8: HA, A PHNG TIN, V IN N

288

289 Chng 8: ha, a phng tin, v in n

ha, video, audio, v in n l nhng du hiu tiu chun ca mt client a nng truyn thng trn h iu hnh Microsoft Windows. Khi tin n a phng tin, Microsoft .NET Framework h tr cho vi c tnh ny, trong khi b qua cc c tnh khc. V d, bn s tm thy mt tp phc tp cc cng c dng thc hin vic v trong khng gian hai chiu v vic in da-trn-s-kin vi GDI+ v cc kiu thuc khng gian tn System.Drawing. Cc lp ny h tr cc hm Graphics Device Interface (GDI) nguyn sinh trong Windows API; khin cho vic v cc hnh dng phc tp, lm vic vi ta v php bin hnh, v x l nh d dng hn. Mt khc, nu bn mun chi mt file audio, hin th mt file video, hoc ly thng tin v cc tc v in hin thi, bn s cn phi vt ra ngoi .NET Framework. Cc mc trong chng ny trnh by cch s dng cc c tnh ni ti .NET v cc th vin Win32 nguyn sinh thng qua P/Invoke hoc COM Interop. Mt vi k thut s c cp:

Tm v s dng cc font c ci t (mc 8.1), v hnh cun c (mc 8.5) v


thumbnail (mc 8.8), cng nh thc hin chp mn hnh bng Win32 API (mc 8.6).

Lm vic vi cc iu kim ty bin owner-drawn (mc 8.3 v 8.4) v x l cc i


tng ha trn mn hnh (mc 8.2 v 8.7).

Chi cc file audio v video (bao gm WAV, MP3, v MPEG) bng th vin Quartz c
trong Windows Media Player (mc 8.9, 8.10, v 8.11).

In cc vn bn n gin v phc tp (mc 8.13 v 8.14), in text vi wrapping (mc


8.15), to print preview (mc 8.16), v ly thng tin v my in (mc 8.12) v hng i in bng WMI (mc 8.17).

1.

Tm tt c cc font c ci t
Bn cn ly danh sch tt c cc font c ci t trn my tnh hin hnh. To i tng System.Drawing.Text.InstalledFontCollection, tp hp ny cha cc i tng FontFamily m t tt c cc font c ci t.

Lp InstalledFontCollection cho php bn ly thng tin v cc font c ci t. on m di y duyt qua tp hp font va c to; mi khi tm thy mt font, n s to mt Label mi hin th tn font vi din mo cho trc (kch thc 14 point). Label c thm vo mt Panel cun c, cho php ngi dng cun qua danh sch cc font hin c.
using System; using System.Windows.Forms; using System.Drawing; using System.Drawing.Text;

public class ListFonts : System.Windows.Forms.Form {

private System.Windows.Forms.Panel pnlFonts;

290 Chng 8: ha, a phng tin, v in n

// (B qua phn m designer.)

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

// To tp hp font. InstalledFontCollection fontFamilies = new InstalledFontCollection(); // Duyt qua tt c cc font. int offset = 10; foreach (FontFamily family in fontFamilies.Families) { try { // To mt Label hin th text (vit font ny). Label fontLabel = new Label(); fontLabel.Text = family.Name; fontLabel.Font = new Font(family, 14); fontLabel.Left = 10; fontLabel.Width = pnlFonts.Width; fontLabel.Top = offset; // Thm Label vo Panel cun c. pnlFonts.Controls.Add(fontLabel); offset += 30; }catch { // Li s xy ra nu font c chn khng // h tr normal style (mc nh c s dng khi // to i tng Font). Vn ny c th // c b qua m khng sao c. } } } }

291 Chng 8: ha, a phng tin, v in n

Hnh 8.1 Danh sch cc font c ci t

2.

Thc hin hit testing vi shape


Bn cn nhn bit ngi dng c nhp vo trong mt shape hay khng. Kim tra im m ngi dng nhp vo bng cc phng thc nh Rectangle.Contains v Region.IsVisible (thuc khng gian tn System.Drawing), hoc GraphicsPath.IsVisible (thuc khng gian tn System.Drawing.Drawing2D), ty vo kiu ca shape.

Thng thng, nu s dng GDI+ v shape trn form, c th bn s cn xc nh xem khi no ngi dng nhp vo trong mt shape cho trc. .NET Framework cung cp ba phng thc c th thc hin cng vic ny: Phng thc Rectangle.Containsnhn vo mt im v tr v true nu im ny nm bn trong hnh ch nht cho trc. Trong nhiu trng hp, bn c th ly c hnh ch nht i vi mt kiu shape khc. V d, bn c th s dng Image.GetBounds ly hnh ch nht m t ng bin ca shape. Cu trc Rectangle l thnh vin ca khng gian tn System.Drawing. Phng thc GraphicsPath.IsVisiblenhn vo mt im v tr v true nu im ny nm bn trong mt vng c nh ngha bi GraphicsPath khp kn. V mt GraphicsPath c th cha nhiu line, shape, v figure nn cch ny rt hu ch nu bn mun kim tra mt im c nm bn trong mt vng khng phi hnh ch nht hay khng. Lp GraphicsPath l mt thnh vin ca khng gian tn System.Drawing.Drawing2D. Phng thc Region.IsVisiblenhn vo mt im v tr v true nu im ny nm bn trong mt vng c nh ngha bi Region. Cng ging nh GraphicsPath, Region c th m t mt shape khng phi hnh ch nht. Region l mt thnh vin ca khng gian tn System.Drawing.

292 Chng 8: ha, a phng tin, v in n

V d sau y s to mt Rectangle v mt GraphicsPath. Theo mc nh, hai shape ny c nn mu xanh nht. Tuy nhin, phng thc th l s kin Form.MouseMove s kim tra xem con tr chut c nm trong mt trong hai shape ny hay khng, v cp nht mu nn thnh hng ti nu con tr .
using System; using System.Windows.Forms; using System.Drawing; using System.Drawing.Drawing2D;

public class HitTesting : System.Windows.Forms.Form {

// (B qua phn m designer.)

// nh ngha cc shape s c s dng. private GraphicsPath path; private Rectangle rectangle;

// nh ngha cc c theo vt con tr chut. private bool inPath = false; private bool inRectangle = false;

// nh ngha cc bt v. Brush highlightBrush = Brushes.HotPink; Brush defaultBrush = Brushes.LightBlue;

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

// To cc shape. path = new GraphicsPath(); path.AddEllipse(10, 10, 100, 60); path.AddCurve(new Point[] {new Point(50, 50), new Point(10,33), new Point(80,43)}); path.AddLine(50, 120, 250, 80); path.AddLine(120, 40, 110, 50); path.CloseFigure();

293 Chng 8: ha, a phng tin, v in n rectangle = new Rectangle(100, 170, 220, 120); }

private void HitTesting_Paint(object sender, System.Windows.Forms.PaintEventArgs e) {

Graphics g = e.Graphics;

// V shape da trn phn chn hin ti. if (inPath) {

g.FillPath(highlightBrush, path); g.FillRectangle(defaultBrush, rectangle);

}else if (inRectangle) {

g.FillRectangle(highlightBrush, rectangle); g.FillPath(defaultBrush, path);

}else {

g.FillPath(defaultBrush, path); g.FillRectangle(defaultBrush, rectangle); } g.DrawPath(Pens.Black, path); g.DrawRectangle(Pens.Black, rectangle); }

private void HitTesting_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) {

Graphics g = this.CreateGraphics();

// Thc hin "hit testing" vi hnh ch nht. if (rectangle.Contains(e.X, e.Y)) {

if (!inRectangle) {

294 Chng 8: ha, a phng tin, v in n

inRectangle = true;

// i mu nn hnh ch nht. g.FillRectangle(highlightBrush, rectangle); g.DrawRectangle(Pens.Black, rectangle); }

}else if (inRectangle) {

inRectangle = false;

// Phc hi hnh ch nht. g.FillRectangle(defaultBrush, rectangle); g.DrawRectangle(Pens.Black, rectangle); }

// Thc hin "hit testing" vi path. if (path.IsVisible(e.X, e.Y)) {

if (!inPath) {

inPath = true;

// i mu nn path. g.FillPath(highlightBrush, path); g.DrawPath(Pens.Black, path); }

}else if (inPath) {

inPath = false;

// Phc hi path. g.FillPath(defaultBrush, path);

295 Chng 8: ha, a phng tin, v in n g.DrawPath(Pens.Black, path); }

g.Dispose(); } }

Hnh 8.2 Thc hin hit testing vi i tng Rectangle v GraphicsPath

Ch rng hot ng ny din ra trc tip bn trong phng thc th l s kin MouseMove. Vic v ch c thc hin nu phn chn hin ti thay i. i vi mt on m n gin, bn c th lm mt hiu lc ton b form mi khi con tr chut di chuyn vo trong hoc ra khi mt vng v th l tt c vic v trong phng thc th l s kin Form.Paint, nhng iu ny dn n vic phi v nhiu hn v to nn hin tng rung hnh (flicker) khi ton b form c v li.

3.

To form c hnh dng ty bin


Bn cn to mt form hoc iu kim khng phi hnh ch nht. To mt i tng System.Drawing.Region c hnh dng nh bn mun, v gn n vo thuc tnh Form.Region hoc Control.Region.

to mt form hoc iu kim khng phi hnh ch nht, trc ht bn cn nh ngha hnh dng mnh mun. Cch tip cn d nht l s dng i tng System.Drawing.Drawing2D.GraphicsPath, n c th iu tit bt k s kt hp no ca cc hnh ellipse, ch nht, v cung khp kn. Bn c th thm cc shape vo mt i tng GraphicsPath bng cc phng thc nh AddEllipse, AddRectangle, v AddClosedCurve. Mt khi hon tt vic nh ngha hnh dng nh mong mun, bn c th to mt i tng Region t GraphicsPath nych cn trnh ra GraphicsPath trong phng thc khi dng ca

296 Chng 8: ha, a phng tin, v in n

lp Region. Cui cng, bn c th gn Region vo thuc tnh Form.Region hoc Control.Region. V d di y trnh by cch to mt form c hnh dng bt thng (xem hnh 8.3) bng hai cung trn (hai cung ny c chuyn thnh mt figure khp kn bng phng thc GraphicsPath.CloseAllFigures).

Hnh 8.3 Form khng phi hnh ch nht using System; using System.Windows.Forms; using System.Drawing; using System.Drawing.Drawing2D;

public class IrregularForm : System.Windows.Forms.Form {

private System.Windows.Forms.Button cmdClose; private System.Windows.Forms.Label label1;

// (B qua phn m designer.)

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

GraphicsPath path = new GraphicsPath(); Point[] pointsA = new Point[] {new Point(0, 0), new Point(40, 60), new Point(this.Width - 100, 10)}; path.AddCurve(pointsA);

297 Chng 8: ha, a phng tin, v in n Point[] pointsB = new Point[] {new Point(this.Width - 40, this.Height - 60), new Point(this.Width, this.Height), new Point(10, this.Height)}; path.AddCurve(pointsB);

path.CloseAllFigures(); this.Region = new Region(path); }

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

this.Close(); } }

i vi v d to iu kim khng phi hnh ch nht, bn hy tham kho mc 8.4.

4.

To iu kim c hnh dng ty bin


Bn cn to mt shape m ngi dng c th thao tc vi n trn form nh ko r, thay i kch thc.... To mt iu kim ty bin, v chp painting logic v shape. Gn shape ca bn vo thuc tnh Control.Region. K , bn c th s dng Region ny thc hin hit testing.

Nu mun to mt giao din ngi dng phc tp kt hp nhiu phn t c v ty bin, bn cn c phng cch theo vt cc phn t ny v cho php ngi dng tng tc vi chng. Cch tip cn d nht trong .NET l to mt iu kim chuyn bit bng cch dn xut mt lp t System.Windows.Forms.Control. K , bn c th ty bin phng cch m iu kim ny c v da theo tp cc s kin c bn ca n. iu kim c trnh by di y m t mt hnh ellipse n gin trn form. Tt c cc iu kim u c lin hp vi mt vng ch nht trn form, do iu kim EllipseShape s to mt ellipse lp y cc ng bin ny (c cp thng qua thuc tnh Control.ClientRectangle). Mt khi shape c to, thuc tnh Control.Region c thit lp da theo bin trn ellipse. iu ny bo m cc s kin nh MouseMove, MouseDown, Click... s xy ra ch khi chut trn ellipse, ch khng phi ton b hnh ch nht. Di y l phn m y ca lp EllipseShape:
using System; using System.Windows.Forms; using System.Drawing;

298 Chng 8: ha, a phng tin, v in n

using System.Drawing.Drawing2D;

public class EllipseShape : System.Windows.Forms.Control {

private GraphicsPath path = null;

private void RefreshPath() {

// To GraphicsPath cho shape v p dng n vo // iu kim bng cch thit lp thuc tnh Region. path = new GraphicsPath(); path.AddEllipse(this.ClientRectangle); this.Region = new Region(path); }

protected override void OnResize(System.EventArgs e) {

base.OnResize(e); RefreshPath(); this.Invalidate(); }

protected override void OnPaint (System.Windows.Forms.PaintEventArgs e) {

base.OnPaint(e); if (path != null) {

e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; e.Graphics.FillPath(new SolidBrush(this.BackColor), path); e.Graphics.DrawPath(new Pen(this.ForeColor, 4), path); } } }

Bn c th nh ngha iu kim EllipseShape trong mt Class Library Assembly c lp n c th c thm vo hp cng c ca Microsoft Visual Studio .NET v c s dng lc

299 Chng 8: ha, a phng tin, v in n

thit k. Tuy nhin, ngay c khng thc hin bc ny, cng d dng to c mt ng dng th nghim n gin. V d di y to hai ellipse v cho php ngi dng ko r c hai vng quanh form bng cch gi chut xung v di chuyn con tr.

Hnh 8.4 Ko r cc iu kim c hnh dng ty bin trn form public class SpriteTest : System.Windows.Forms.Form { // (B qua phn m designer.) // Cc c dng theo vt chut khi ch ko r c kch hot. private bool isDraggingA = false; private bool isDraggingB = false; // Cc iu kim c hnh dng ellipse. private EllipseShape ellipseA, ellipseB; private void SpriteTest_Load(object sender, System.EventArgs e) { // To v cu hnh c hai ellipse. ellipseA = new EllipseShape(); ellipseA.Width = ellipseA.Height = 100; ellipseA.Top = ellipseA.Left = 30; ellipseA.BackColor = Color.Red; this.Controls.Add(ellipseA);

ellipseB = new EllipseShape(); ellipseB.Width = ellipseB.Height = 100; ellipseB.Top = ellipseB.Left = 130;

300 Chng 8: ha, a phng tin, v in n

ellipseB.BackColor = Color.Azure; this.Controls.Add(ellipseB);

// Gn c hai ellipse vo cng tp cc phng thc // th l s kin. ellipseA.MouseDown += new MouseEventHandler(Ellipse_MouseDown); ellipseA.MouseUp += new MouseEventHandler(Ellipse_MouseUp); ellipseA.MouseMove += new MouseEventHandler(Ellipse_MouseMove);

ellipseB.MouseDown += new MouseEventHandler(Ellipse_MouseDown); ellipseB.MouseUp += new MouseEventHandler(Ellipse_MouseUp); ellipseB.MouseMove += new MouseEventHandler(Ellipse_MouseMove); }

private void Ellipse_MouseDown(object sender, MouseEventArgs e) {

// Thu ly ellipse gy ra s kin ny. Control control = (Control)sender;

if (e.Button == MouseButtons.Left) {

control.Tag = new Point(e.X, e.Y); if (control == ellipseA) { isDraggingA = true;

}else { isDraggingB = true; } } }

private void Ellipse_MouseUp(object sender, MouseEventArgs e) {

isDraggingA = false; isDraggingB = false;

301 Chng 8: ha, a phng tin, v in n }

private void Ellipse_MouseMove(object sender, MouseEventArgs e) {

// Thu ly ellipse gy ra s kin ny. Control control = (Control)sender;

if ((isDraggingA && control == ellipseA) || (isDraggingB && control == ellipseB)) {

// Ly offset. Point point = (Point)control.Tag;

// Di chuyn iu kim. control.Left = e.X + control.Left - point.X; control.Top = e.Y + control.Top - point.Y; } } }

5.

Thm tnh nng cun cho mt bc hnh


Bn cn to mt bc hnh c th cun c (bc hnh c ni dung ng). To kh nng cun t ng cho System.Windows.Forms.Panel bng cch thit lp Panel.AutoScroll l true v t mt System.Windows.Forms.PictureBox cha ni dung bc hnh vo trong Panel.

Khi bn thit lp Panel.AutoScroll l true, nu iu kim no trong Panel vt qu ng bin ca n, Panel s hin th thanh cun cho php ngi dng chuyn tip ni dung. Cch ny c bit tt i vi cc bc hnh ln. Bn c th np hoc to bc hnh trong b nh, gn n vo mt PictureBox (khng c s h tr ni ti no cho vic cun PictureBox), v ri hin th PictureBox bn trong Panel. Ch c mt vn m bn cn nh l phi thit lp kch thc ca PictureBox bng vi kch thc tht ca bc hnh bn mun hin th. V d sau y to mt bc hnh m t mt vn bn. Bc hnh c to t mt hnh bitmap trong-b-nh, v nhiu dng text c thm vo bng phng thc Graphics.DrawString. K , bc hnh c kt vi PictureBox (PictureBox ny c hin th trong mt Panel cun cxem hnh 8.5).

302 Chng 8: ha, a phng tin, v in n

Hnh 8.5 Thm tnh nng cun cho bc hnh vi ni dung ty bin using System; using System.Windows.Forms; using System.Drawing;

public class PictureScroll : System.Windows.Forms.Form {

private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.Panel panel1;

// (B qua phn m designer.)

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

string text = "The quick brown fox jumps over the lazy dog."; Font font = new Font("Tahoma", 20);

// To mt hnh bitmap trong-b-nh. Bitmap b = new Bitmap(600, 600); Graphics g = Graphics.FromImage(b); g.FillRectangle(Brushes.White, new Rectangle(0, 0, b.Width, b.Height));

// V nhiu dng text ln hnh bitmap. for (int i=0; i < 10; i++) {

303 Chng 8: ha, a phng tin, v in n g.DrawString(text, font, Brushes.Black, 50, 50 + i*60); }

// Hin th hnh bitmap trong PictureBox. pictureBox1.BackgroundImage = b; pictureBox1.Size = b.Size; } }

6.

Thc hin chp mn hnh Desktop


Bn cn ly nh chp ca mn hnh Desktop hin thi. S dng cc li gi Win32 API GetDesktopWindow, GetDC, v ReleaseDC trong th vin user32.dll. Ngoi ra, s dng GetCurrentObject trong th vin gdi32.dll.

.NET Framework khng cung cp lp no thc hin vic chp ton b mn hnh (thng c cp l ca s Desktop). Tuy nhin, bn c th truy xut cc c tnh ny bng cch s dng P/Invoke vi Win32 API. Bc u tin l to mt lp ng gi cc hm Win32 API bn cn s dng. Lp di y s khai bo cc hm ny v s dng chng trong phng thc cng khai Capture tr v mt i tng .NET Image cha ca s Desktop:
using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; public class DesktopCapture { [DllImport("user32.dll")] private extern static IntPtr GetDesktopWindow(); [DllImport("user32.dll")] private extern static IntPtr GetDC(IntPtr windowHandle); [DllImport("gdi32.dll")] private extern static IntPtr GetCurrentObject(IntPtr hdc, ushort objectType); [DllImport("user32.dll")] private extern static void ReleaseDC( IntPtr hdc );

304 Chng 8: ha, a phng tin, v in n

const int OBJ_BITMAP = 7; public static Bitmap Capture() {

// Ly Device Context ca ca s Desktop. IntPtr desktopWindow = GetDesktopWindow(); IntPtr desktopDC = GetDC( desktopWindow ); // Ly GDI handle ca bc hnh. IntPtr desktopBitmap = GetCurrentObject(desktopDC, OBJ_BITMAP);

// S dng handle to i tng .NET Image. Bitmap desktopImage = Image.FromHbitmap( desktopBitmap );

// Gii phng Device Context v tr v bc hnh. ReleaseDC(desktopDC); return desktopImage; } }

Hnh 8.6 Chp mn hnh Desktop

305 Chng 8: ha, a phng tin, v in n

Bc k tip l to mt client c th s dng chc nng ny. Form di y (xem hnh 8.6) s hin th bc hnh chp c trong mt PictureBox (nm trong mt Panel cun c, nh c m t trong mc 8.5).
public class ScreenCapture : System.Windows.Forms.Form {

private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.Panel panel1;

// (B qua phn m designer.)

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

pictureBox1.Image = DesktopCapture.Capture(); pictureBox1.Size = pictureBox1.Image.Size; } }

7.

S dng double buffering tng tc v li


Bn cn ti u thao tc v i vi mt form thng xuyn c lm ti, v bn mun gim hin tng rung hnh (flicker). Biu din hnh nh dng hnh bitmap trong-b-nh, ri chp hnh bitmap hon chnh vo form.

Trong mt vi ng dng, bn thng xuyn phi v li form hoc iu kim. iu ny thng gp khi th hin animation (hnh ng). V d, bn c th s dng Timer lm mt hiu lc form mi giy. Khi , on m thc hin thao tc v c th v li mt bc hnh ti mt v tr mi, to cm gic ng. Cch tip cn ny c mt vn : mi ln bn lm mt hiu lc form, Windows s v li nn ca s (xa form), v ri chy on m thc hin thao tc v. iu ny c th gy ra rung hnh ng k. Double buffering l mt k thut bn c th hin thc gim hin tng rung hnh. Vi double buffering, logic v s ghi mt hnh bitmap trong-b-nh, v hnh ny c chp ln form vo cui qu trnh v bng mt thao tc v li n l trong sut, nh m hin tng rung hnh gim mt cch ng k. Bc u tin khi hin thc double buffering l phi bo m nn ca form khng t ng c v li khi form b mt hiu lc. y l nguyn nhn ln nht gy ra rung hnh v n thay th bc hnh ca bn bng mt frame trng (gi d ch l mt phn nh ca mt giy). ngn vic v nn, bn cn chp phng thc OnPaintBackground ca form n khng nhn hnh ng no. Bc th hai l sa i on m thc hin thao tc v n v bc hnh thnh mt hnh bitmap trong-b-nh. Khi hon tt, hnh bitmap c chp vo form. Cch tip cn ny bo m lm ti l mt thao tc v li n l, v drawing logic tn nhiu thi gian s khng gy ra hin tng rung hnh.

306 Chng 8: ha, a phng tin, v in n

V d sau y trnh by mt bc hnh ( y l logo ca Windows XP) lun phin ln ln v nh li trn form. Drawing logic c thc hin trong phng thc th l s kin Form.Paint, v mt Timer c s dng lm mt hiu lc form mi 10 mili-giy bc hnh c th c v li. Ngi dng c th kch hot double buffering thng qua mt CheckBox trn form. Nu khng c double buffering, form b rung ng k. Tuy nhin, khi double buffering c kch hot, bc hnh ln ln v nh li mt cch mt m, khng cn rung na.
using System; using System.Drawing; using System.Drawing2D; using System.Windows.Forms; public class DoubleBuffering : System.Windows.Forms.Form { private System.Windows.Forms.CheckBox chkUseDoubleBuffering; private System.Windows.Forms.Timer tmrRefresh; // (B qua phn m designer.) // Theo di kch thc bc hnh, // v kiu animation (ln ln hoc nh li). private bool isShrinking = false; private int imageSize = 0; // Lu tr logo s c v ln form. private Image image; private void DoubleBuffering_Load(object sender, System.EventArgs e) { // Np bc hnh logo t file. image = Image.FromFile("image.bmp"); // Khi ng Timer lm mt hiu lc form. tmrRefresh.Start(); } private void tmrRefresh_Tick(object sender, System.EventArgs e) {

307 Chng 8: ha, a phng tin, v in n

// Thay i kch thc bc hnh da vo kiu animation. if (isShrinking) { imageSize--;

}else { imageSize++; }

// i hng thay i kch thc nu n gn bin ca form. if (imageSize > (this.Width - 150)) { isShrinking = true;

}else if (imageSize < 1) { isShrinking = false; }

// V li form. this.Invalidate(); }

private void DoubleBuffering_Paint(object sender, System.Windows.Forms.PaintEventArgs e) {

Graphics g; Bitmap drawing = null;

if (chkUseDoubleBuffering.Checked) {

// "Double buffering" ang c s dng. // To mt bitmap trong-b-nh m t b mt ca form. drawing = new Bitmap(this.Width, this.Height, e.Graphics); g = Graphics.FromImage(drawing);

}else {

// "Double buffering" khng c s dng.

308 Chng 8: ha, a phng tin, v in n

// V trc tip ln form. g = e.Graphics; }

g.SmoothingMode = SmoothingMode.HighQuality;

// V nn. g.FillRectangle(Brushes.Yellow, new Rectangle(new Point(0, 0), this.ClientSize));

// V bc hnh logo. g.DrawImage(image, 50, 50, 50 + imageSize, 50 + imageSize);

// Nu s dng "double buffering", chp hnh bitmap // hon tt trong b nh vo form. if (chkUseDoubleBuffering.Checked) {

e.Graphics.DrawImageUnscaled(drawing, 0, 0); g.Dispose(); } }

protected override void OnPaintBackground( System.Windows.Forms.PaintEventArgs pevent) {

// Khng lm g c. } }

8.

c bc hnh t file bng

Hin th hnh dng thumbnail


Bn cn hin th cc bc hnh trong mt th mc dng thumbnail. phng thc tnh
FromFile

ca

lp

System.Drawing.Image. K , bn c th thu ly hnh thumbnail bng phng

thc Image.GetThumbnailImage.

309 Chng 8: ha, a phng tin, v in n

Lp Image cung cp chc nng to thumbnail thng qua phng thc GetThumbnailImage. Bn ch cn truyn chiu rng v chiu cao ca hnh thumbnail bn mun (tnh bng pixel), v lp Image s to mt i tng Image mi ph hp vi tiu chun ny. Vic kh mo dng rng ca (antialiasing) c s dng khi thu nh bc hnh bo m cht lng bc hnh tt nht c th c, mc d mt s vt m v thiu ht mt vi tiu tit l khng th trnh khi (kh mo dng rng ca l qu trnh loi b cc ra lm chm, thng c trong cc bc hnh c thay i kch thc, bng cch t bng vi mt mu trung gian). Ngoi ra, bn c th cung cp mt callback to thumbnail mt cch bt ng b. Khi to mt thumbnail, vic quan trng l phi bo m t s gia hai chiu vn nh c (hng s). V d, nu bn thu nh mt bc hnh kch thc 200x100 thnh mt thumbnail kch thc 50x50, chiu rng s b nn cn mt phn t v chiu cao b nn cn mt na, iu ny lm mo bc hnh. bo m t l ny vn nh c, bn c th thay i chiu rng hoc chiu cao thnh mt kch thc c nh ri iu chnh chiu cn li cho cn xng. V d di y c mt file bitmap v to mt thumbnail kch thc khng ln hn 50x50 (vn bo ton t l gc):
using System; using System.Drawing; using System.Windows.Forms;

public class Thumbnails : System.Windows.Forms.Form {

// (B qua phn m designer.)

Image thumbnail;

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

Image img = Image.FromFile("test.jpg"); int thumbnailWidth = 0, thumbnailHeight = 0;

// iu chnh chiu ln hn l 50 pixel. // Vic ny bo m thumbnail s khng ln hn 50x50 pixel. // Nu mun hin th nhiu thumbnail, bn s phi dng // mt hnh vung 50x50 pixel cho mi thumbnail. if (img.Width > img.Height) {

thumbnailWidth = 50; thumbnailHeight = Convert.ToInt32(((50F / img.Width) * img.Height));

310 Chng 8: ha, a phng tin, v in n

}else {

thumbnailHeight = 50; thumbnailWidth = Convert.ToInt32(((50F / img.Height) * img.Width)); }

thumbnail = img.GetThumbnailImage(thumbnailWidth, thumbnailHeight, null, IntPtr.Zero); }

private void Thumbnails_Paint(object sender, System.Windows.Forms.PaintEventArgs e) {

e.Graphics.DrawImage(thumbnail, 10, 10); } }

9.

Pht ting beep ca h thng


Bn cn pht mt m thanh n gin, chng hn ting beep ca h thng. S dng mt hm khng-c-qun-l Win32 API nh Beep hay sndPlaySound, hoc gi hm Beep ca Microsoft Visual Basic .NET.

.NET Framework khng cha bt k lp c-qun-l no thc hin vic chi cc file m thanh, ngay c ting beep ca h thng cng khng. Tuy nhin, bn c th d dng vt qua tr ngi ny bng Win32 API hoc Visual Basic .NET (cp hm Beep thng qua lp Microsoft.VisualBasic.Interaction). Trong trng hp th hai, bn phi thm mt tham chiu n Microsoft.VisualBasic.dll (c trong tt c cc phin bn ca .NET Framework). V d sau y s dng c hm API Beep v hm Visual Basic Beep. Ch l hm API s dng loa gn trong ca my tnh v pht m thanh vi tn s (tnh bng Hertz, nm trong khong t 37 n 32,767) v thi gian (tnh bng mili-giy) cho trc. Cch ny s khng pht bt k m thanh no nu my tnh khng c loa gn trong. Mt khc, hm Visual Basic Beep pht ting beep chun ca h thng (l mt file WAV). Cch ny s khng pht bt k m thanh no nu my tnh khng c card m thanh, nu card m thanh khng c kt ni vi loa gn ngoi, hoc nu Windows c cu hnh l khng pht m thanh (thng qua phn Sounds and Audio Devices trong Control Panel).

311 Chng 8: ha, a phng tin, v in n using System; using System.Runtime.InteropServices; using Microsoft.VisualBasic;

public class BeepTest {

[DllImport("kernel32.dll")] private static extern bool Beep(int freq, int dur);

[STAThread] private static void Main(string[] args) {

// Pht ting "beep" tn s 440 Hz trong 100 mili-giy // trn internal speaker. Console.WriteLine("Win32 API beep test."); Beep(440, 100); Console.ReadLine();

// Pht ting "beep" mc nh ca h thng (file WAV). Console.WriteLine("VB beep test."); Interaction.Beep(); Console.ReadLine(); } }

Bn cng c th s dng cc hm Win32 API chi mt file m thanh do bn chn. K thut ny c m t trong mc 8.10.

10.

Bn cn chi mt file WAV hoc MP3.

Chi file audio


S dng hm API sndPlaySound (h tr file WAV), hoc s dng thnh phn ActiveMovie c trong Windows Media Player (h tr file WAV v MP3)

chi bt k m thanh no trong mt ng dng .NET, bn cn nhn s gip ca mt th vin bn ngoi hoc li gi h thng. May mn thay, c hai ty chn ny u d dng thc hin c.

312 Chng 8: ha, a phng tin, v in n

Th vin winmm.dll (c trong Windows) cha hm sndPlaySound nhn vo tn ca mt file WAV v mt thng s ch nh cch chi. Bn c th chn chi m thanh mt cch ng b (gin on vic thc thi ca chng trnh cho n khi m thanh hon tt), bt ng b, hoc trong mt vng lp chy pha nn. Th vin Quartz cung cp mt thnh phn COM c th chi nhiu kiu file audio, gm cc nh dng WAV v MP3. Th vin Quartz c cp thng qua quartz.dll v n l mt phn ca Microsoft DirectX cho Windows Media Player v h iu hnh Windows.

Trong v d ny, chng ta s s dng cch tip cn th hai. Bc u tin l to mt lp Interop c th qun l s tng tc gia ng dng .NET v th vin Quartz. Bn c th to mt lp C# cng vi on m Interop ny bng tin ch Type Library Importer (tlbimp.exe) v dng lnh sau y ([WindowsDir] l ng dn ca th mc ci t Windows):
tlbimp [WindowsDir]\system32\quartz.dll /out:QuartzTypeLib.dll

Bn c th s dng Visual Studio .NET to lp Interop bng cch thm vo mt tham chiu. Ch cn nhp phi vo d n ca bn trong Solution Explorer, v chn Add Reference t menu ng cnh. K tip, chn th COM, v cun xung chn ActiveMovie control type library (xem hnh 8.7). Mt khi lp Interop c to, bn c th lm vic vi giao din IMediaControl. Bn c th ch nh file m bn mun chi bng RenderFile, v c th iu khin playback bng cc phng thc nh Run, Stop, v Pause. Playback din ra trn mt tiu trnh c lp, nh th n s khng block on m ca bn.

313 Chng 8: ha, a phng tin, v in n Hnh 8.7 Chn ActiveMovie control type library trong hp thoi Add Reference

V d, tin ch Console di y s chi file audio c ch nh trong i s dng lnh u tin:


using System;

class PlayAudio {

public static void Main(string[] args) {

// Ly tn file c ch nh trong i s u tin. string filename = args[0];

// Truy xut giao din IMediaControl. QuartzTypeLib.FilgraphManager graphManager = new QuartzTypeLib.FilgraphManager(); QuartzTypeLib.IMediaControl mc = (QuartzTypeLib.IMediaControl)graphManager; // Ch nh tn file. mc.RenderFile(filename); // Bt u chi file audio bt ng b. mc.Run(); Console.WriteLine("Press Enter to continue."); Console.ReadLine(); mc.Stop(); } }

Bn cng c th s dng th vin Quartz hin th file video (s c trnh by trong mc 8.11).

11.

Chi file video


Bn cn chi mt file video (nh MPEG, AVI, hoc WMV) ngay trn form. S dng thnh phn ActiveMovie c trong Media Player. Gn kt xut video vo mt PictureBox trn form bng cch thit lp thuc tnh IVideoWindow.Owner l thuc tnh PictureBox.Handle.

314 Chng 8: ha, a phng tin, v in n

.NET Framework khng cha bt k lp c-qun-l no tng tc vi cc file video, nhng bn c th s dng chc nng DirectShow ca th vin Quartz da-trn-COM (c trong Windows Media Player v h iu hnh Windows). bit cch to mt Interop Assembly cho th vin Quartz, bn hy tham kho mc 8.10. Mt khi to Interop Assembly, bn c th s dng giao din IMediaControl np v chi mt file video. V c bn, k thut ny ging nh k thut trnh by trong mc 8.10 vi file audio. Tuy nhin, nu mun hin th ca s video ngay bn trong giao din ng dng ca bn (hn l trong mt ca s c lp), bn phi s dng giao din IVideoWindow. i tng FilgraphManager c th c p kiu thnh giao din IMediaControl v IVideoWindowv nhiu giao din khc cng c h tr nh IBasicAudio (cho php bn cu hnh cc thit lp balance v volume). Vi giao din IVideoWindow, bn c th gn kt xut video vo mt i tng trn form nh Panel hoc PictureBox. lm c nh vy, bn cn thit lp thuc tnh IVideoWindow.Owner l handle ca iu kim (bn c th ly c handle ny bng thuc tnh Control.Handle). K tip, gi IVideoWindow.SetWindowPosition thit lp kch thc v v tr ca ca s. Phng thc ny cng c th c gi thay i kch thc video trong qu trnh playback (chng hn, khi form b thay i kch thc). V d di y cho php ngi dng m bt k file video no v chi n trong mt PictureBox. PictureBox b neo n tt c cc cnh ca form, nh th n cng thay i kch thc khi form b thay i kch thc. on m p ng cho s kin PictureBox.SizeChanged s thay i kch thc ca ca s video tng ng.
using System; using QuartzTypeLib; using System.Windows.Forms; public class ShowMovie : System.Windows.Forms.Form {

private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.Button cmdOpen;

// (B qua phn m designer.)

// nh ngha cc hng dng ch nh window style. private const int WM_APP = 0x8000; private const int WM_GRAPHNOTIFY = WM_APP + 1; private const int EC_COMPLETE = 0x01; private const int WS_CHILD = 0x40000000; private const int WS_CLIPCHILDREN = 0x2000000;

315 Chng 8: ha, a phng tin, v in n // Gi tham chiu mc-form n giao din Media Control, // on m c th iu khin playback cho // movie c np hin ti. private IMediaControl mc = null;

// Gi tham chiu mc-form n ca s video trong // trng hp n cn c thay i kch thc. private IVideoWindow videoWindow = null;

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

// Cho php ngi dng chn file. OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Media Files|*.mpg;*.avi;*.wma;*.mov;" + "*.wav;*.mp2;*.mp3|All Files|*.*";

if (DialogResult.OK == openFileDialog.ShowDialog()) {

// Dng playback i vi movie hin ti, nu n tn ti. if (mc != null) mc.Stop();

// Np file movie. FilgraphManager graphManager = new FilgraphManager(); graphManager.RenderFile(openFileDialog.FileName);

// Gn ca s video vo PictureBox trn form. try {

videoWindow = (IVideoWindow)graphManager; videoWindow.Owner = (int) pictureBox1.Handle; videoWindow.WindowStyle = WS_CHILD | WS_CLIPCHILDREN; videoWindow.SetWindowPosition( pictureBox1.ClientRectangle.Left, pictureBox1.ClientRectangle.Top, pictureBox1.ClientRectangle.Width, pictureBox1.ClientRectangle.Height);

316 Chng 8: ha, a phng tin, v in n

} catch {

// Li c th xy ra nu file khng c // video source (chng hn, file MP3). // Bn c th b qua li ny v vn cho php // playback tip tc (khng c hnh). }

// Bt u playback (bt ng b). mc = (IMediaControl)graphManager; mc.Run(); } }

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

if (videoWindow != null) {

try {

videoWindow.SetWindowPosition( pictureBox1.ClientRectangle.Left, pictureBox1.ClientRectangle.Top, pictureBox1.ClientRectangle.Width, pictureBox1.ClientRectangle.Height);

} catch {

// B qua ngoi l (b nm khi thay i kch thc form) // khi file khng c video source. } } }

317 Chng 8: ha, a phng tin, v in n

private void ShowMovie_Closing(object sender, System.ComponentModel.CancelEventArgs e) {

if (mc != null) mc.Stop(); } }

Hnh 8.8 Chi file video trong PictureBox trn form

12.

Ly thng tin v cc my in c ci t
Bn cn ly danh sch cc my in ang c hiu lc trn my tnh. c tn cc my in c ci t trong tp hp InstalledPrinters ca lp System.Drawing.Printing.PrinterSettings.

Lp PrinterSettings m t cc thit lp cho mt my in v thng tin v my in . V d, bn c th s dng lp PrinterSettings xc nh cc kh giy (paper size), cc ngun giy (paper source), v cc phn gii (resolution) c h tr v kim tra kh nng in mu hoc in hai mt. Ngoi ra, bn c th ly cc thit lp trang mc nh cho l (margin), hng trang (orientation)... Lp PrinterSettings cung cp tp hp tnh InstalledPrinters, tp hp ny cha tn ca tt c cc my in c ci t trn my tnh. Nu mun tm thm thng tin v cc thit lp cho mt my in c th, bn cn to mt i tng PrinterSettings v thit lp thuc tnh PrinterName cho ph hp. ng dng Console di y s tm tt c cc my in c ci t trn my tnh v hin th thng tin v kh giy v phn gii c h tr bi mi my in.
using System; using System.Drawing.Printing;

318 Chng 8: ha, a phng tin, v in n

public class ListPrinters {

private static void Main(string[] args) {

foreach (string printerName in PrinterSettings.InstalledPrinters) {

// Hin th tn my in. Console.WriteLine("Printer: {0}", printerName);

// Ly cc thit lp my in. PrinterSettings printer = new PrinterSettings(); printer.PrinterName = printerName;

// Kim tra tnh hp l ca my in. // (Bc ny cn thit trong trng hp bn c tn my in // t mt gi tr do ngi dng cp hoc mt thit lp trong // file registry hay configuration.) if (printer.IsValid) {

// Hin th danh sch cc phn gii hp l. Console.WriteLine("Supported Resolutions:");

foreach (PrinterResolution resolution in printer.PrinterResolutions) { Console.WriteLine(" } Console.WriteLine(); {0}", resolution);

// Hin th danh sch cc kh giy hp l. Console.WriteLine("Supported Paper Sizes:");

foreach (PaperSize size in printer.PaperSizes) {

if (Enum.IsDefined(size.Kind.GetType(), size.Kind)) {

319 Chng 8: ha, a phng tin, v in n Console.WriteLine(" } } Console.WriteLine(); } } Console.ReadLine(); } } {0}", size);

Di y l kt xut m ng dng ny c th hin th:


Printer: SnagIt 7 Supported Resolutions: [PrinterResolution High] [PrinterResolution Medium] [PrinterResolution Low] [PrinterResolution Draft] [PrinterResolution X=600 Y=600] [PrinterResolution X=300 Y=300] [PrinterResolution X=200 Y=200] [PrinterResolution X=100 Y=100]

Supported Paper Sizes: [PaperSize Letter Kind=Letter Height=1100 Width=850] [PaperSize Legal Kind=Legal Height=1400 Width=850] [PaperSize Executive Kind=Executive Height=1050 Width=725] [PaperSize A4 Kind=A4 Height=1169 Width=827] [PaperSize Envelope #10 Kind=Number10Envelope Height=950 Width=412] [PaperSize Envelope DL Kind=DLEnvelope Height=866 Width=433] [PaperSize Envelope C5 Kind=C5Envelope Height=902 Width=638] [PaperSize Envelope B5 Kind=B5Envelope Height=984 Width=693] [PaperSize Envelope Monarch Kind=MonarchEnvelope Height=750 Width=387]

Printer: Adobe PDF Supported Resolutions: [PrinterResolution High] [PrinterResolution Medium] [PrinterResolution Low]

320 Chng 8: ha, a phng tin, v in n

[PrinterResolution Draft] [PrinterResolution X=72 Y=72] [PrinterResolution X=144 Y=144] [PrinterResolution X=300 Y=300] [PrinterResolution X=600 Y=600] [PrinterResolution X=1200 Y=1200] [PrinterResolution X=2400 Y=2400] [PrinterResolution X=3600 Y=3600] [PrinterResolution X=4000 Y=4000]

Supported Paper Sizes: [PaperSize Letter Kind=Letter Height=1100 Width=850] [PaperSize Tabloid Kind=Tabloid Height=1700 Width=1100] [PaperSize Ledger Kind=Ledger Height=1100 Width=1700] [PaperSize Legal Kind=Legal Height=1400 Width=850] [PaperSize Executive Kind=Executive Height=1050 Width=725] [PaperSize A3 Kind=A3 Height=1654 Width=1169] [PaperSize A4 Kind=A4 Height=1169 Width=827] [PaperSize A2 Kind=A2 Height=2339 Width=1654] [PaperSize 11 x 17 Kind=Custom Height=1700 Width=1100] [PaperSize Screen Kind=Custom Height=518 Width=650] [PaperSize ANSI C Kind=Custom Height=2200 Width=1700] [PaperSize ANSI D Kind=Custom Height=3400 Width=2200] [PaperSize ANSI E Kind=Custom Height=4400 Width=3400] [PaperSize ANSI F Kind=Custom Height=4000 Width=2800] ...

Bn khng cn thc hin cch lm ny khi to mt ng dng cung cp chc nng in. Theo mc 8.13, bn c th s dng PrintDialog nhc ngi dng chn mt my in v cc thit lp cho n. Lp PrintDialog c th t ng p dng cc thit lp ca n cho PrintDocument m khng cn vit thm m lnh.

Bn c th in mt vn bn trong bt k kiu ng dng no. Tuy nhin, ng dng ca bn phi cha mt tham chiu n System.Drawing.dll. Nu ang s dng mt kiu d n trong Visual Studio .NET khng c tham chiu ny (nh ng dng Console), bn cn phi thm n vo.

321 Chng 8: ha, a phng tin, v in n

13.

Bn cn in text hoc hnh.

In vn bn n gin
Th l s kin PrintDocument.PrintPage, v s dng cc phng thc DrawString v DrawImage ca lp Graphics in d liu ra trang.

.NET s dng m hnh in da-trn-s-kin bt ng b (asynchronous event-based printing model). in mt vn bn, bn cn to mt i tng System.Drawing.Printing.PrintDocument, cu hnh cc thuc tnh ca n, v ri gi phng thc Print thc hin tc v in. B thc thi s pht sinh cc s kin BeginPrint, PrintPage, v EndPrint ca lp PrintDocument trn mt tiu trnh mi. Bn th l cc s kin ny v s dng i tng System.Drawing.Graphics xut d liu ra trang. Hnh v text c ghi ra trang theo cng cch nh bn v ln ca s bng GDI+. Tuy nhin, bn c th cn phi theo vt v tr ca bn trn trang, v mi phng thc ca lp Graphics u yu cu ta ch nh ni cn v. Cc in c cu hnh thng qua cc thuc tnh PrintDocument.PrinterSettings v PrintDocument.DefaultPageSettings. Thuc tnh PrinterSettings tr v mt i tng PrinterSettings ( c m t trong mc 8.12) cho bit my in s c s dng. Thuc tnh DefaultPageSettings cung cp i tng PageSettings cho bit phn gii (resolution), l (margin), hng trang (orientation)... Bn c th cu hnh cc thuc tnh ny trong m lnh, hoc bn c th s dng lp System.Windows.Forms.PrintDialog ngi dng thc hin cc thay i thng qua hp thoi in chun ca Windows (xem hnh 8.9). Trong hp thoi in, ngi dng c th chn mt my in v chn s lng bn in (number of copies). Ngi dng cng c th nhp vo nt Properties cu hnh cc thit lp nng cao nh cch b tr trang (layout) v phn gii my in (resolution). Cui cng, ngi dng c th chp thun hoc hy b thao tc in bng cch nhp OK hoc Cancel. thit lp cho my

Hnh 8.9 Hp thoi Print

322 Chng 8: ha, a phng tin, v in n

Trc khi s dng lp PrintDialog, bn phi gn n vo i tng PrintDocument bng cch thit lp thuc tnh PrintDialog.Document. Theo , bt k s thay i no do ngi dng thc hin trong hp thoi in s t ng c p dng vo i tng PrintDocument. V d di y l mt form ch cha mt nt lnh. Khi ngi dng nhp vo nt ny, ng dng s to mt i tng PrintDocument mi, cho php ngi dng cu hnh cc thit lp in, v ri bt u thao tc in bt ng b. Phng thc th l s kin p ng cho s kin PrintPage s ghi ra nhiu dng text v mt bc hnh.
using System; using System.Windows.Forms; using System.Drawing; using System.Drawing.Printing;

public class SimplePrint : System.Windows.Forms.Form {

private System.Windows.Forms.Button cmdPrint;

// (B qua phn m designer.)

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

// To mt vn bn v gn vo phng thc th l s kin. PrintDocument doc = new PrintDocument(); doc.PrintPage += new PrintPageEventHandler(this.Doc_PrintPage);

// Cho php ngi dng chn mt my in // v ch nh cc thit lp khc. PrintDialog dlgSettings = new PrintDialog(); dlgSettings.Document = doc;

// Nu ngi dng nhp OK th in vn bn. if (dlgSettings.ShowDialog() == DialogResult.OK) {

// Phng thc ny tr v tc th, trc khi tc v in // bt u. S kin PrintPage s pht sinh bt ng b. doc.Print(); }

323 Chng 8: ha, a phng tin, v in n } private void Doc_PrintPage(object sender, PrintPageEventArgs e) { // nh ngha font. Font font = new Font("Tahoma", 30);

// Xc nh v tr trn trang. // Trong trng hp ny, chng ta c cc thit lp l // (mc d khng c g ngn chng ta vt qua bin l). float x = e.MarginBounds.Left; float y = e.MarginBounds.Top; // Xc nh chiu cao ca mt dng (da trn font c s dng). float lineHeight = font.GetHeight(e.Graphics); // In nm dng text. for (int i=0; i < 5; i++) { // V text vi bt v en, s dng font v // ta m chng ta xc nh. e.Graphics.DrawString("Thp Din Mai Phc " + i.ToString(), font, Brushes.Black, x, y); // Dch xung mt dng. y += lineHeight; } y += lineHeight; // V hnh. e.Graphics.DrawImage(Image.FromFile(Application.StartupPath + "\\test.bmp"), x, y); } }

V d ny c mt hn ch l n ch in mt trang n. in cc vn bn phc tp v nhiu trang hn, bn cn phi to mt lp chuyn bit ng gi cc thng tin v vn bn, trang hin hnh... K thut ny s c trnh by trong mc 8.14.

324 Chng 8: ha, a phng tin, v in n

Hnh 8-10 Vn bn c in (s dng my in Adobe PDF)

14.

In vn bn c nhiu trang
Bn cn in cc vn bn phc tp gm nhiu trang v in nhiu vn bn khc nhau cng mt lc. t thng tin mun in vo mt lp ty bin dn xut t PrintDocument, v thit lp thuc tnh PrintPageEventArgs.HasMorePages l true trong khi vn cn trang in.

S kin PrintDocument.PrintPage cho php bn ch in mt trang n. Nu mun in nhiu trang hn, bn cn thit lp thuc tnh PrintPageEventArgs.HasMorePages l true trong phng thc th l s kin PrintPage. Trong khi HasMorePages l true, lp PrintDocument vn tip tc pht sinh cc s kin PrintPage (mt s kin cho mt trang). Tuy nhin, bn cn bit l ang in n trang th my, d liu g s c in trn mi trang... thc hin iu ny, cch hay nht l to mt lp ty bin. Lp TextDocument di y tha k t PrintDocument v thm ba thuc tnh: Text lu tr mt mng cc dng text, PageNumber cho bit trang va c in, v Offset cho bit dng va c in (trong mng Text).
public class TextDocument : PrintDocument {

private string[] text;

325 Chng 8: ha, a phng tin, v in n private int pageNumber; private int offset;

public string[] Text { get {return text;} set {text = value;} }

public int PageNumber { get {return pageNumber;} set {pageNumber = value;} }

public int Offset { get {return offset;} set {offset = value;} }

public TextDocument(string[] text) { this.Text = text; } }

Ty thuc vo kiu ti liu mun in, bn c th chnh sa lp ny. V d, bn c th lu tr mt mng gm cc d liu hnh, mt vi ni dung s c s dng lm header hoc footer trn mi trang, thng tin v font, hoc tn ca file m bn mun c thng tin t n. Gi cc thng tin ny vo mt lp n s khin cho vic in nhiu vn bn cng mt lc d dng hn. Phn m khi u cng ging nh mc 8.13, ch khc l by gi to i tng TextDocument (thay v to i tng PrintDocument). Phng thc th l s kin PrintPage gi vt ca dng hin hnh v kim tra c cn ch trng trn trang hay khng trc khi thc hin in dng k tip. Nu cn trang mi, thuc tnh HasMorePages c thit lp l true v s kin PrintPage pht sinh ln na cho trang k tip. Nu khng, thao tc in xem nh hon tt. Phn m y cho form c trnh by di y:
using System; using System.Windows.Forms; using System.Drawing; using System.Drawing.Printing;

public class MultiPagePrint : System.Windows.Forms.Form {

326 Chng 8: ha, a phng tin, v in n

private System.Windows.Forms.Button cmdPrint; // (B qua phn m designer.) private void cmdPrint_Click(object sender, System.EventArgs e) { // To vn bn gm 100 dng. string[] printText = new string[100]; for (int i=0; i < 100; i++) {

printText[i] = i.ToString(); printText[i] += ": Thp Din Mai Phc (House of Flying Daggers)"; } PrintDocument doc = new TextDocument(printText); doc.PrintPage += new PrintPageEventHandler(this.Doc_PrintPage); PrintDialog dlgSettings = new PrintDialog(); dlgSettings.Document = doc;

// Nu ngi dng nhp OK th in vn bn. if (dlgSettings.ShowDialog() == DialogResult.OK) { doc.Print(); } } private void Doc_PrintPage(object sender, PrintPageEventArgs e) { // Thu ly vn bn gi s kin ny. TextDocument doc = (TextDocument)sender; // nh ngha font v xc nh chiu cao. Font font = new Font("Tahoma", 10); float lineHeight = font.GetHeight(e.Graphics);

327 Chng 8: ha, a phng tin, v in n // To cc bin lu gi v tr trn trang. float x = e.MarginBounds.Left; float y = e.MarginBounds.Top; // Tng bin m cho trang (cho bit s trang c in). doc.PageNumber += 1; // In tt c thng tin va kht trn trang. // Vng lp ny kt thc khi dng k tip vt qu bin l, // hoc khng cn dng no in. while ((y + lineHeight) < e.MarginBounds.Bottom && doc.Offset <= doc.Text.GetUpperBound(0)) { e.Graphics.DrawString(doc.Text[doc.Offset], font, Brushes.Black, x, y); // Dch n dng d liu k tip. doc.Offset += 1; // Dch xung mt dng trn trang. y += lineHeight; } if (doc.Offset < doc.Text.GetUpperBound(0)) { // Vn cn t nht mt trang na. // Cho bit s kin ny s pht sinh ln na. e.HasMorePages = true; }else { // Thao tc in hon tt. doc.Offset = 0; } } }

328 Chng 8: ha, a phng tin, v in n

15.

In text dng wrapping


Bn cn phn tch mt khi text ln thnh cc dng ring bit sao cho va kht trn mt trang. S dng phng thc np chng Graphics.DrawString (phng thc ny nhn vo mt hnh ch nht bin).

Thng thng, bn s cn ph mt khi text ln thnh cc dng ring bit c th in ln trang tng dng mt. .NET Framework c th thc hin cng vic ny mt cch t ng bng mt phin bn ca phng thc Graphics.DrawString (nhn vo mt hnh ch nht bin). Bn cn ch nh hnh ch nht m t ni bn mun text s hin th. Theo , text s c wrap mt cch t ng cho va kht bn trong ng bin ny. on m di y thc hin cch tip cn ny:
using System; using System.Windows.Forms; using System.Drawing; using System.Drawing.Printing;

public class WrappedPrint : System.Windows.Forms.Form {

private System.Windows.Forms.Button cmdPrint;

// (B qua phn m designer.)

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

// To mt vn bn v gn n vo phng thc th l s kin. string text = "Windows Server 2003 builds on the core strengths " + "of the Windows family of operating systems--security, " + "manageability, reliability, availability, and scalability. " + "Windows Server 2003 provides an application environment to " + "build, deploy, manage, and run XML Web services. " + "Additionally, advances in Windows Server 2003 provide many " + "benefits for developing applications."; PrintDocument doc = new ParagraphDocument(text); doc.PrintPage += new PrintPageEventHandler(this.Doc_PrintPage);

329 Chng 8: ha, a phng tin, v in n

// Cho php ngi dng chn mt my in // v ch nh cc thit lp khc. PrintDialog dlgSettings = new PrintDialog(); dlgSettings.Document = doc;

// Nu ngi dng nhp OK th in vn bn. if (dlgSettings.ShowDialog() == DialogResult.OK) { doc.Print(); } } private void Doc_PrintPage(object sender, PrintPageEventArgs e) { // Thu ly vn bn gi s kin ny. ParagraphDocument doc = (ParagraphDocument)sender; // nh ngha font v text. Font font = new Font("Arial", 15); e.Graphics.DrawString(doc.Text, font, Brushes.Black, e.MarginBounds, StringFormat.GenericDefault); } } public class ParagraphDocument : PrintDocument { private string text;

public string Text { get {return text;} set {text = value;} }

public ParagraphDocument(string text) { this.Text = text; } }

330 Chng 8: ha, a phng tin, v in n

Hnh 8.11 Vn bn c in (s dng my in Adobe PDF)

16.

Hin th print-preview
Bn cn s dng print-preview bit c vn bn khi c in ra s trng nh th no. S dng PrintPreviewDialog hoc PrintPreviewControl (c hai u thuc khng gian tn System.Windows.Forms).

.NET cung cp hai iu kim c th nhn vo mt i tng PrintDocument, chy on m thc hin thao tc in, v s dng n to print-preview trn mn hnh. Hai iu kim ny l:
PrintPreviewDialoghin th print-preview trong mt ca s c lp. PrintPreviewControlhin th print-preview trong mt form ty bin.

s dng ca s print-preview c lp, bn cn to i tng PrintPrevewDialog, n nh vn bn, v gi phng thc PrintPreviewDialog.Show.


PrintPreviewDialog dlgPreview = new PrintPreviewDialog(); dlgPreview.Document = doc; dlgPreview.Show();

Ca s print-preview (xem hnh 8.12) cung cp tt c cc iu khin cn thit di chuyn t trang ny sang trang khc, thu phng trang... Ca s ny cng cung cp nt Print cho php ngi dng gi trc tip vn bn n my in. Bn c th bin i ca s ny bng cch chnh sa cc thuc tnh ca PrintPrevewDialog. Bn cng c th thm PrintPreviewControl vo bt k form no hin th print-preview k bn cc thng tin khc. Trong trng hp ny, bn khng cn gi phng thc Show. Ngay khi bn thit lp thuc tnh PrintPreviewControl.Document th preview c to ra. xa preview, cn thit lp thuc tnh Document l null, v lm ti preview, cn gn li thuc tnh Document. PrintPreviewControl ch hin th cc trang preview, khng c thm iu khin no khc. Tuy nhin, bn c th thm cc iu kim thc hin thu phng trang, lt nhiu trang... Bn ch cn iu chnh cc thuc tnh ca PrintPreviewControl cho ph hp.

331 Chng 8: ha, a phng tin, v in n

V d, xt form c trnh by trong hnh 8.13. N sp nhp mt PrintPreviewControl v cho php ngi dng chn thit lp cho zoom (thu phng trang).

Hnh 8.12 S dng PrintPreviewDialog hin th print-preview trong mt ca s c lp

Hnh 8.13 S dng PrintPreviewControl hin th print-preview trong mt ca s ty bin

Di y l phn m cho form:


using System; using System.Windows.Forms; using System.Drawing; using System.Drawing.Printing;

public class PrintPreview : System.Windows.Forms.Form {

332 Chng 8: ha, a phng tin, v in n

private System.Windows.Forms.PrintPreviewControl printPreviewControl; private System.Windows.Forms.Button cmdPreview; private System.Windows.Forms.ListBox lstZoom; private System.Windows.Forms.Label label1;

// (B qua phn m designer.)

private PrintDocument doc;

// (B qua phn m cho phng thc th l s kin // PrintDocument.PrintPage - Xem mc 8.14)

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

// Thit lp cc zoom c php. for (int i=1; i <= 10; i++) { lstZoom.Items.Add((i * 10).ToString()); }

// To vn bn gm 100 dng. string[] printText = new string[100]; for (int i=0; i < 100; i++) { printText[i] = i.ToString(); printText[i] += ": The quick brown fox jumps over the lazy dog."; }

doc = new TextDocument(printText); doc.PrintPage += new PrintPageEventHandler(this.Doc_PrintPage);

lstZoom.Text = "100"; printPreviewControl.Zoom = 1; printPreviewControl.Document = doc; printPreviewControl.Rows = 2;

333 Chng 8: ha, a phng tin, v in n }

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

// Thit lp zoom. printPreviewControl.Zoom = Single.Parse(lstZoom.Text) / 100;

// Hin th c hai trang, trang ny trn trang kia. printPreviewControl.Rows = 2;

// Gn li PrintDocument lm ti preview. printPreviewControl.Document = doc; } }

// (B qua phn m cho lp TextDocument - Xem mc 8.14)

17.

Qun l tc v in
Bn cn tm dng hoc phc hi mt tc v in hoc mt hng i in. S dng Windows Management Instrumentation. Bn c th ly thng tin t hng i in bng mt truy vn vi lp Win32_PrintJob, v bn c th s dng cc phng thc Pause v Resume ca cc lp Win32_PrintJob v Win32_Printer qun l hng i.

Windows Management Instrumentation (WMI) cho php bn ly mt lng ln cc thng tin h thng bng mt c php ging truy vn. Mt trong cc cng vic m bn c th thc hin vi WMI l ly danh sch cc tc v in ang ch, cng vi thng tin v mi tc v. Bn cng c th thc hin cc thao tc nh in v phc hi mt tc v hoc tt c cc tc v cho mt my in. s dng WMI, bn cn thm mt tham chiu n System.Management.dll. ng dng di y thc hin mt truy vn WMI ly danh sch tt c cc tc v in ang ch trn my tnh v hin th ID cho mi tc v trong mt ListBox. Khi ngi dng chn mt item, mt truy vn y hn s c thc hin, v cc chi tit v tc v in ny c hin th trong mt TextBox. Cui cng, ngi dng c th nhp nt Pause v Resume sau khi chn mt tc v thay i trng thi ca n.
using System; using System.Windows.Forms; using System.Management; using System.Collections;

334 Chng 8: ha, a phng tin, v in n

public class PrintQueueTest : System.Windows.Forms.Form {

private System.Windows.Forms.ListBox lstJobs; private System.Windows.Forms.Button cmdRefresh; private System.Windows.Forms.TextBox txtJobInfo; private System.Windows.Forms.Button cmdPause; private System.Windows.Forms.Button cmdResume; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; // (B qua phn m designer.)

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

cmdRefresh_Click(null, null); }

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

// Chn tt c cc tc v in ang ch. string query = "SELECT * FROM Win32_PrintJob"; ManagementObjectSearcher jobQuery = new ManagementObjectSearcher(query); ManagementObjectCollection jobs = jobQuery.Get();

// Thm cc tc v trong hng i vo ListBox. lstJobs.Items.Clear(); txtJobInfo.Text = ""; foreach (ManagementObject job in jobs) { lstJobs.Items.Add(job["JobID"]); } }

// Phng thc ny thc hin truy vn WMI v tr v // tc v WMI cho item hin ang c chn trong ListBox. private ManagementObject GetSelectedJob() {

335 Chng 8: ha, a phng tin, v in n

try {

// Chn tc v in ph hp. string query = "SELECT * FROM Win32_PrintJob " + "WHERE JobID='" + lstJobs.Text + "'"; ManagementObjectSearcher jobQuery = new ManagementObjectSearcher(query); ManagementObjectCollection jobs = jobQuery.Get(); IEnumerator enumerator = jobs.GetEnumerator(); enumerator.MoveNext(); return (ManagementObject)enumerator.Current;

}catch (InvalidOperationException){

// Thuc tnh Current ca enumerator khng hp l return null; } } private void lstJobs_SelectedIndexChanged(object sender, System.EventArgs e) {

ManagementObject job = GetSelectedJob(); if (job == null) { txtJobInfo.Text = ""; return; } // Hin th thng tin v tc v. string jobInfo = "Document: " + job["Document"].ToString(); jobInfo += Environment.NewLine; jobInfo += "DriverName: " + job["DriverName"].ToString(); jobInfo += Environment.NewLine; jobInfo += "Status: " + job["Status"].ToString(); jobInfo += Environment.NewLine; jobInfo += "Owner: " + job["Owner"].ToString();

336 Chng 8: ha, a phng tin, v in n

jobInfo += Environment.NewLine; jobInfo += "PagesPrinted: " + job["PagesPrinted"].ToString(); jobInfo += Environment.NewLine; jobInfo += "TotalPages: " + job["TotalPages"].ToString(); if (job["JobStatus"] != null) { txtJobInfo.Text += Environment.NewLine; txtJobInfo.Text += "JobStatus: " + job["JobStatus"].ToString(); } if (job["StartTime"] != null) { jobInfo += Environment.NewLine; jobInfo += "StartTime: " + job["StartTime"].ToString(); }

txtJobInfo.Text = jobInfo; } private void cmdPause_Click(object sender, System.EventArgs e) { if (lstJobs.SelectedIndex == -1) return; ManagementObject job = GetSelectedJob(); if (job == null) return; // Tm dng tc v. int returnValue = Int32.Parse( job.InvokeMethod("Pause", null).ToString());

// Hin th thng tin v gi tr tr v. if (returnValue == 0) { MessageBox.Show("Successfully paused job.");

}else { MessageBox.Show( "Unrecognized return value when pausing job.");

337 Chng 8: ha, a phng tin, v in n } }

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

if (lstJobs.SelectedIndex == -1) return; ManagementObject job = GetSelectedJob(); if (job == null) return;

if ((Int32.Parse(job["StatusMask"].ToString()) & 1) == 1) {

// Phc hi tc v. int returnValue = Int32.Parse( job.InvokeMethod("Resume", null).ToString());

// Hin th thng tin v gi tr tr v. if (returnValue == 0) { MessageBox.Show("Successfully resumed job.");

}else if (returnValue == 5) { MessageBox.Show("Access denied.");

}else { MessageBox.Show( "Unrecognized return value when resuming job."); } } } }

338 Chng 8: ha, a phng tin, v in n

Hnh 8.14 Ly thng tin t hng i in

Nh rng cc quyn Windows c th ngn bn tm dng hoc g b mt tc v in do mt ngi dng khc to ra. Thc ra, cc quyn ny cn c th ngn bn ly thng tin trng thi v c th gy ra ngoi l.

Cc phng thc WMI khc m bn c th s dng trong mt kch bn in bao gm AddPrinterConnection, SetDefaultPrinter, CancelAllJobs, v PrintTestPage, tt c u lm vic vi lp Win32_Printer. c thm thng tin v WMI, bn hy tham kho ti liu MSDN ti a ch [http://msdn.microsoft.com/library/enus/wmisdk/ wmi/computer_system_hardware_classes.asp].

18.

S dng iu kim Microsoft Agent.

S dng Microsoft Agent


Bn mun ng dng ca mnh c s tr gip ca nhng nhn vt hot hnh nh trong Microsoft Word, Microsoft Excel...

Microsoft Agent l mt k thut dng thm cc nhn vt hot hnh c tnh tng tc vo ng dng hay trang web. Tnh tng tc l chc nng chnh yu ca k thut Microsoft Agent: cc nhn vt Microsoft Agent c th ni v p li u vo ca ngi dng thng qua vic nhn dng v tng hp ging ni. Microsoft s dng k thut ny trong cc ng dng nh Word, Excel, v PowerPoint; gip ngi dng tm cu tr li cho nhng cu hi v hiu cch thc hot ng ca ng dng. Microsoft cung cp thng tin v k thut Microsoft Agent ti
[www.microsoft.com/msagent].

iu kim Microsoft Agent cho php ngi dng tng tc vi cc ng dng v trang web thng qua ging nidng giao tip t nhin nht ca con ngi. Khi ngi dng ni vo micro, iu kim ny s dng mt b my nhn dng ging niy l ng dng dch m thanh u vo t micro thnh ngn ng m my tnh hiu c. iu kim Microsoft Agent

339 Chng 8: ha, a phng tin, v in n

cng s dng mt b my text-to-speechy l ng dng dch cc t do ngi dng nhp vo thnh m thanh c th nghe c qua loa. iu kim Microsoft Agent cho php bn truy xut bn nhn vt c nh ngha sn Genie (v thn), Merlin (thut s), Peedy (con vt) v Robby (ngi my). Mi nhn vt c mt tp cc hnh ng m bn c th s dng trong ng dng nhm minh ha cc quan im hay chc nng khc nhau. Chng hn, tp cc hnh ng ca Peedy gm cc dng bay khc nhau m bn c th s dng dch chuyn Peedy trn mn hnh. Bn cng c th t to cho mnh cc nhn vt hot hnh vi s tr gip ca Microsoft Agent Character Editor v Microsoft Linguistic Sound Editing Tool (c trong a CD nh km). V d di y minh ha cch xy dng mt ng dng n gin vi iu kim Microsoft Agent. ng dng ny gm hai ComboBox dng chn mt nhn vt v mt hnh ng. Khi ngi dng chn cc ComboBox ny, nhn vt c chn s xut hin v thc hin hnh ng c chn. ng dng ny s dng vic nhn dng v tng hp ging ni iu khin cc hnh ng ca nhn vt: ngi dng c th bo nhn vt thc hin hnh ng bng cch nhn phm [Scroll Lock] v ri c tn hnh ng vo micro. V d ny cng cho php ngi dng chuyn sang mt nhn vt mi bng cch gi tn nhn vt, v cn to thm mt lnh ty bin l MoveToMouse. Ngoi ra, nhn vt cng s c bt c text no m ngi dng nhp vo TextBox. Trc khi chy v d ny, bn phi ci t iu kim Microsoft Agent, b my nhn dng ging ni, b my text-to-speech, v cc nh ngha nhn vt (c trong a CD nh km). c th thm iu kim Microsoft Agent vo d n, bn hy nhp phi vo hp cng c v chn Add/Remove Items. K , vo th COM Components, v chn Microsoft Agent 2.0. Nh th, Microsoft Agent s c thm vo vo hp cng c. Khi bn th iu kim ny ln form, cc Interop Assembly cn thit s c sinh ra v c thm vo d n.

Hnh 8.15 Chn Microsoft Agent Control 2.0 trong ca s Customize Toolbox public class FrmAgent : System.Windows.Forms.Form

340 Chng 8: ha, a phng tin, v in n

{ // (B qua phn m designer.)

// i tng agent hin ti. private AgentObjects.IAgentCtlCharacter mSpeaker;

// Phng thc th l s kin KeyDown ca txtLocation. private void txtLocation_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) {

if (e.KeyCode == Keys.Enter) { // Thit lp ni lu tr nhn vt vo txtLocation. string location = txtLocation.Text;

// Khi to cc nhn vt. try { // Np cc nhn vt vo i tng agent. mainAgent.Characters.Load("Genie", location & "Genie.acs") mainAgent.Characters.Load("Merlin", location + "Merlin.acs"); mainAgent.Characters.Load("Peedy", location & "Peedy.acs") mainAgent.Characters.Load("Robby", location & "Robby.acs")

// V hiu txtLocation v kch hot cc iu kim khc. txtLocation.Enabled = false; txtSpeech.Enabled = true; cmdSpeak.Enabled = true; characterCombo.Enabled = true; actionsCombo.Enabled = true;

// Thit lp nhn vt hin ti l Merlin v hin nhn vt ny. mSpeaker = mainAgent.Characters["Merlin"]; GetAnimationNames(); // Thu ly danh sch hnh ng.

341 Chng 8: ha, a phng tin, v in n mSpeaker.Show(0); } catch (FileNotFoundException) { MessageBox.Show("Invalid character location", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } }

// Phng thc th l s kin Click ca nt Speak. private void cmdSpeak_Click(System.Object sender, System.EventArgs e) { // Nu txtSpeech rng, nhn vt nhc ngi dng nhp text vo txtSpeech. if (txtSpeech.Text == "") { mSpeaker.Speak("Please type the words you want me to speak", ""); } else { mSpeaker.Speak(txtSpeech.Text, ""); } }

// Phng thc th l s kin Click ca agent. private void mainAgent_ClickEvent(object sender, AxAgentObjects._AgentEvents_ClickEvent e) { mSpeaker.Play("Confused"); mSpeaker.Speak("Why are you poking me?", ""); mSpeaker.Play("RestPose"); }

// Phng thc th l s kin SelectedIndexChanged ca characterCombo // (ngi dng chn nhn vt mi). private void characterCombo_SelectedIndexChanged(System.Object sender, System.EventArgs e)

342 Chng 8: ha, a phng tin, v in n

{ ChangeCharacter(characterCombo.Text); }

// n nhn vt hin ti v hin nhn vt mi. private void ChangeCharacter(string name) { mSpeaker.Hide(0); mSpeaker = mainAgent.Characters[name]; GetAnimationNames(); // Sinh li danh sch hnh ng. mSpeaker.Show(0); }

// Thu ly tn cc hnh ng v a vo actionsCombo. private void GetAnimationNames() { // Bo m tnh an ton v tiu trnh. object synclockObject = (this); Monitor.Enter(synclockObject); try { // Ly tn cc hnh ng. IEnumerator enumerator = mainAgent.Characters.Character(mSpeaker.Name). AnimationNames.GetEnumerator(); string voiceString;

// Xa actionsCombo. actionsCombo.Items.Clear(); mSpeaker.Commands.RemoveAll();

// Thm tt c cc hnh ng (cho php ra lnh bng ging ni). while (enumerator.MoveNext()) { voiceString = Convert.ToString(enumerator.Current);

343 Chng 8: ha, a phng tin, v in n voiceString = voiceString.Replace("_", "underscore"); actionsCombo.Items.Add(enumerator.Current);

mSpeaker.Commands.Add(Convert.ToString(enumerator.Current), "" voiceString, true, false); }

// Thm lnh ty bin. mSpeaker.Commands.Add("MoveToMouse", "MoveToMouse", "Move To Mouse", true, true); } finally { Monitor.Exit(synclockObject); } }

// Phng thc th l s kin SelectedIndexChanged ca actionsCombo // (ngi dng chn hnh ng mi). private void actionsCombo_SelectedIndexChanged(System.Object sender, System.EventArgs e) { mSpeaker.Stop(null); mSpeaker.Play(actionsCombo.Text); mSpeaker.Play("RestPose"); }

// Phng thc th l s kin Command ca agent. private void mainAgent_Command(System.Object sender, AxAgentObjects._AgentEvents_CommandEvent e) { AgentObjects.IAgentCtlUserInput command = ((AgentObjects.IAgentCtlUserInput)(e.userInput));

// i nhn vt nu ngi dng c tn nhn vt. if (command.Voice == "Peedy" || command.Voice == "Robby" || command.Voice == "Merlin" || command.Voice == "Genie")

344 Chng 8: ha, a phng tin, v in n

{ ChangeCharacter(command.Voice); return; }

// Gi agent n chut. if (command.Name == "MoveToMouse") { mSpeaker.MoveTo(Convert.ToInt16(Cursor.Position.X - 60), Convert.ToInt16(Cursor.Position.Y - 60), null); return; }

// Thc hin hnh ng mi. mSpeaker.Stop(null); mSpeaker.Play(command.Name); } }

345 Chng 8: ha, a phng tin, v in n Hnh 8.16 ng dng th nghim Microsoft Agent

346

Chng 9:FILE, TH MC, V I/O

347

348 Chng 9: File, th mc, v I/O

c lp I/O ca Microsoft .NET gm hai loi chnh. Loi th nht truy xut thng tin t h thng file v cho php thc hin cc thao tc trn h thng file (nh chp file, chuyn th mc). Hai lp tiu biu l FileInfo v DirectoryInfo. Loi th hai quan trng hn, gm rt nhiu lp cho php c v ghi d liu t mi kiu stream. Stream c th tng ng vi mt file nh phn hay vn bn, mt file trong khng gian lu tr ring, mt kt ni mng, hoc mt vng m b nh. Trong mi trng hp, cch thc tng tc vi stream u nh nhau. Trong chng ny, chng ta s xem xt cc lp h thng file v cc lp datrn-stream. Cc mc trong chng ny trnh by cc vn sau:

Truy xut v sa i cc thng tin ca mt file hay mt th mc (cc mc 9.1, 9.2, 9.4,
9.5, v 9.16).

Chp, di chuyn, xa file hay th mc (mc 9.3). Hin th ng mt cy th mc trong mt ng dng da-trn-Windows (mc 9.6) v s
dng cc hp thoi file (mc 9.17).

c v ghi file vn bn (mc 9.7) v file nh phn (mc 9.8), cng nh to file tm
(mc 9.15) v file trong mt khng gian lu tr ring ca ngi dng (mc 9.18).

c file mt cch bt ng b (mc 9.9). Tm file (mc 9.10) v kim tra hai file c trng nhau hay khng (mc 9.11). Lm vic vi cc chui c cha thng tin ng dn (mc 9.12 n 9.14). Theo di s thay i ca h thng file (mc 9.19). Ghi ra cng COM (mc 9.20).

1.

To i tng

Truy xut cc thng tin v file hay th mc


Bn cn truy xut cc thng tin v mt file hay mt th mc, chng hn ngy to hay cc thuc tnh ca chng.
System.IO.FileInfo

cho

file

hay

tng

System.IO.DirectoryInfo cho th mc. Sau , truyn ng dn ti file hay th

mc trong phng thc khi dng. Cc thng tin cn thit s c truy xut thng qua cc thuc tnh ca i tng. to mt i tng FileInfo hay DirectoryInfo, bn cn truyn ng dn tng i hay y trong phng thc khi dng ca n. Bn c th ly cc thng tin v file hay th mc thng qua cc thuc tnh ca i tng tng ng. Bng 9.1 lit k cc thnh vin ca lp FileInfo v DirectoryInfo:
Bng 9.1 Cc thnh vin ca FileInfo v DirectoryInfo Thnh vin Thuc lp M t

349 Chng 9: File, th mc, v I/O

Exists

FileInfo v DirectoryInfo

Tr v true hay false, ty thuc vo file hay th mc c tn ti ng dn c ch nh hay khng. Tr v mt hoc nhiu gi tr thuc kiu lit k System.IO.FileAttributes, cho bit cc thuc tnh ca file hay th mc. Tr v cc th hin System.DateTime cho bit khi no mt file hay th mc c to ra, truy xut ln cui, v cp nht ln cui. Tr v mt chui cha tn y , tn th mc hay tn file (cng phn m rng), v phn m rng. Tr v kch thc file (tnh theo byte).
DirectoryName tr v chui cha tn ca th

Attributes

FileInfo v DirectoryInfo

CreationTime, LastAccessTime, v LastWriteTime FullName, Name, v Extension Length

FileInfo v DirectoryInfo

FileInfo v DirectoryInfo FileInfo

DirectoryName v Directory

FileInfo

mc cha; Directory tr v i tng DirectoryInfo m t th mc cha, cho php bn truy xut thm thng tin v n. Tr v i tng DirectoryInfo m t th mc cha hay th mc gc. To mt th mc bn trong th mc c m t bi i tng DirectoryInfo, tn th mc cn to c truyn cho phng thc. Tr v i tng DirectoryInfo m t th mc con va to. Tr v mng cc i tng DirectoryInfo, mi i tng m t mt th mc con trong th mc ny. Tr v mng cc i tng FileInfo, mi i tng m t mt file trong th mc ny.

Parent v Root

DirectoryInfo

CreateSubdirectory

DirectoryInfo

GetDirectories

DirectoryInfo

GetFiles

DirectoryInfo

Ch hai im quan trng khi s dng cc i tng FileInfo v DirectoryInfo: Tt c cc thuc tnh ca i tng FileInfo v DirectoryInfo c c ngay ln u tin bn truy xut mt thuc tnh no . Nu file hay th mc thay i sau thi im ny, bn phi gi phng thc Refresh cp nht cc thuc tnh. S khng c li nu bn ch nh mt ng dn khng tng ng vi mt file hay th mc ang tn ti khi to mt i tng FileInfo hay DirectoryInfo. Thay vo , bn s nhn c mt i tng m t file hay th mc khng tn tithuc tnh Exists ca n c gi tr false. Bn c th s dng i tng ny to file hay th mc bng cch gi phng thc Create ca n. Nu bn truy xut thuc tnh khc, ngoi l FileNotFoundException hay DirectoryNotFoundException s b nm.

350 Chng 9: File, th mc, v I/O

ng dng Console di y nhn mt ng dn file t dng lnh, v ri hin th thng tin v file v th mc cha file.

351 Chng 9: File, th mc, v I/O using System; using System.IO;

public class FileInformation {

private static void Main(string[] args) {

if (args.Length == 0) {

Console.WriteLine("Please supply a file name:); return; }

FileInfo file = new FileInfo(args[0]);

// Hin th thng tin file. Console.WriteLine("Checking file: " + file.Name); Console.WriteLine("File exists: " + file.Exists.ToString());

if (file.Exists) {

Console.Write("File created: "); Console.WriteLine(file.CreationTime.ToString()); Console.Write("File last updated: "); Console.WriteLine(file.LastWriteTime.ToString()); Console.Write("File last accessed: "); Console.WriteLine(file.LastAccessTime.ToString()); Console.Write("File size (bytes): "); Console.WriteLine(file.Length.ToString()); Console.Write("File attribute list: "); Console.WriteLine(file.Attributes.ToString());

} Console.WriteLine();

// Hin th thng tin th mc. DirectoryInfo dir = file.Directory;

352 Chng 9: File, th mc, v I/O

Console.WriteLine("Checking directory: " + dir.Name); Console.WriteLine("In directory: " + dir.Parent.Name); Console.Write("Directory exists: "); Console.WriteLine(dir.Exists.ToString());

if (dir.Exists) { Console.Write("Directory created: "); Console.WriteLine(dir.CreationTime.ToString()); Console.Write("Directory last updated: "); Console.WriteLine(dir.LastWriteTime.ToString()); Console.Write("Directory last accessed: "); Console.WriteLine(dir.LastAccessTime.ToString()); Console.Write("Directory attribute list: "); Console.WriteLine(dir.Attributes.ToString()); Console.WriteLine("Directory contains: " + dir.GetFiles().Length.ToString() + " files"); }

Console.ReadLine(); } }

Nu bn thc thi lnh FileInformation c:\windows\win.ini, kt xut c th nh sau:


Checking file: win.ini File exists: True File created: 2001-08-23 8:00:00 AM File last updated: 2003-03-22 9:55:16 AM File last accessed: 2003-05-26 2:21:53 PM File size (bytes): 2128 File attribute list: Archive

Checking directory: windows In directory: c:\ Directory exists: True Directory created: 2000-01-01 8:03:33 AM

353 Chng 9: File, th mc, v I/O Directory last updated: 2003-05-26 2:25:25 PM Directory last accessed: 2003-05-26 2:25:25 PM Directory attribute list: Directory Directory contains: 147 files

Bn c th s dng cc phng thc tnh ca lp File v Directory thay cho cc phng thc ca lp FileInfo v DirectoryInfo, nhng bn phi truyn tn file hay ng dn mi ln gi. Trong trng hp thc hin nhiu thao tc vi cng mt file hay th mc th s dng cc lp FileInfo v DirectoryInfo nhanh hn, v chng thc hin kim tra bo mt ch mt ln.

2.

To i tng

Thit lp cc thuc tnh ca file v th mc


Bn cn kim tra hay thay i cc thuc tnh ca file hay th mc.
System.IO.FileInfo

cho

file

hay

to

tng

System.IO.DirectoryInfo cho th mc. Sau , s dng cc ton t AND (&) v

OR (|) thay i gi tr ca thuc tnh Attributes. Cc thuc tnh FileInfo.Attributes v DirectoryInfo.Attributes m t cc thuc tnh ca file nh archive, system, hidden, read-only, compressed, v encrypted (tham kho thm trong ti liu MSDN). V mt file c th c nhiu thuc tnh nn Attributes l mt tp cc gi tr kiu lit k. kim tra hay thay i mt thuc tnh n l, bn cn s dng cc php ton trn bit. V d sau nhn vo mt file v kim tra thuc tnh read-only:
using System; using System.IO; public class Attributes { private static void Main() { // Gi s file ny c thuc tnh archive v read-only. FileInfo file = new FileInfo("data.txt"); // Lnh ny s hin th chui "ReadOnly, Archive". Console.WriteLine(file.Attributes.ToString()); // iu kin di y sai, v cn c thuc tnh khc // c thit lp. if (file.Attributes == FileAttributes.ReadOnly) { Console.WriteLine("File is read-only (faulty test).");

354 Chng 9: File, th mc, v I/O

} // iu kin di y ng, v n ch lc ra // thuc tnh read-only. if ((file.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) { Console.WriteLine("File is read-only (correct test)."); } Console.ReadLine(); } }

hiu c v d trn, bn cn bit rng Attributes c to thnh ( dng nh phn) bi mt dy cc ch s 0 v 1, chng hn 00010011. Mi ch s 1 cho bit mt thuc tnh c thit lp, mi ch s 0 cho bit mt thuc tnh khng c thit lp. Khi bn s dng php AND, n s so snh mi ch s ny vi mi ch s tng ng trong gi tr lit k. V d, nu bn AND gi tr 00100001 (m t thuc tnh archive v read-only) vi gi tr lit k 00000001 (m t thuc tnh read-only), kt qu s l 00000001 (ch c c ch s 1 khi c hai v tr tng ng u l 1).

Khi thit lp mt thuc tnh, bn cng phi s dng php ton trn bit. Trong trng hp ny, bn cn cn thn khng v xa cc thuc tnh khc.
// Ch thm thuc tnh read-ony. file.Attributes = file.Attributes | FileAttributes.ReadOnly; // Ch xa thuc tnh read-only. file.Attributes = file.Attributes & ~FileAttributes.ReadOnly;

3.

To i tng

Chp, chuyn, xa file hay th mc


Bn cn chp, chuyn, xa mt file hay th mc
System.IO.FileInfo

cho

file

hay

tng

System.IO.DirectoryInfo cho th mc, truyn ng dn cho phng thc khi

dng. S dng cc phng thc ca i tng chp, chuyn, xa. Cc lp FileInfo v DirectoryInfo cung cp nhiu phng thc dng thao tc trn file v th mc. Bng 9.2 v 9.3 trnh by cc phng thc ca lp FileInfo v DirectoryInfo.
[

Bng 9.2 Cc phng thc dng thao tc i tng FileInfo Phng thc M t

355 Chng 9: File, th mc, v I/O

CopyTo

Chp mt file sang ng dn mi, tn file c ch nh trong i s. N cng tr v mt i tng FileInfo m t file mi c chp. Bn c th truyn thm mt thng s ty chn c gi tr true cho php chp .
Create to file c ch nh v tr v mt i tng FileStream dng ghi ra file. CreateText cng thc hin nh

Create v CreateText

th, nhng tr v i tng StreamWriter gi ly stream. Xem mc 9.7 v 9.8 c thm thng tin v vic ghi file. M mt file (nu n tn ti). OpenRead v OpenText m file trong ch ch-c, tr v mt i tng FileStream hay StreamReader. OpenWrite m file trong ch ch-ghi, tr v mt i tng FileStream. Xem thm mc 9.7 v 9.8 c thm thng tin v vic c file. Xa file (nu n tn ti). Chuyn mt file n ng dn mi, tn file c ch nh trong i s. MoveTo cng c s dng i tn mt file m khng chuyn ch.

Open, OpenRead, OpenText,

v OpenWrite

Delete

MoveTo

Bng 9.3 Cc phng thc dng thao tc i tng DirectoryInfo Phng thc Create M t

To th mc c ch nh. Nu ng dn ch nh nhiu th mc cha tn ti, tt c s c to mt lt. To mt th mc vi tn c th bn trong th mc c m t bi i tng DirectoryInfo. N cng tr v mt i tng DirectoryInfo m t th mc con. Xa mt th mc (nu n tn ti). Nu mun xa mt th mc c cha cc th mc khc, bn phi s dng phng thc np chng Delete chp nhn mt thng s c tn l recursive v thit lp n l true. Chuyn mt th mc n ng dn mi. MoveTo c th c s dng i tn mt th mc m khng chuyn ch.

CreateSubdirectory

Delete

MoveTo

Lp DirectoryInfo khng c phng thc no dng sao chp th mc. Tuy nhin, bn c th d dng vit c mt phng thc nh th da trn k thut quy v phng thc CopyTo ca i tng FileInfo:
using System; using System.IO;

public class FileSystemUtil {

356 Chng 9: File, th mc, v I/O

public static void CopyDirectory(DirectoryInfo source, DirectoryInfo destination) {

if (!destination.Exists) { destination.Create(); }

// Chp tt c file. FileInfo[] files = source.GetFiles(); foreach (FileInfo file in files) {

file.CopyTo(Path.Combine(destination.FullName, file.Name)); }

// X l cc th mc con. DirectoryInfo[] dirs = sourceDir.GetDirectories(); foreach (DirectoryInfo dir in dirs) {

// Ly th mc ch. string destinationDir = Path.Combine(destination.FullName, dir.Name);

// Gi quy CopyDirectory(). CopyDirectory(dir, new DirectoryInfo(destinationDir)); } } }

V d sau s dng phng thc va vit trn chp th mc, ng dn cc th mc c truyn qua dng lnh:
public class CopyDir {

private static void Main(string[] args) {

if (args.Length != 2) {

357 Chng 9: File, th mc, v I/O Console.WriteLine("usage: " +

"CopyDir [sourcePath] [destinationPath]"); return; } DirectoryInfo sourceDir = new DirectoryInfo(args[0]); DirectoryInfo destinationDir = new DirectoryInfo(args[1]);

FileSystemUtil.CopyDirectory(new DirectoryInfo(sourceDir), new DirectoryInfo(destinationDir)); Console.WriteLine("Copy complete."); Console.ReadLine(); } }

4.

Tnh kch thc ca th mc


Bn cn tnh kch thc ca tt c file nm trong mt th mc (hoc c trong cc th mc con ca n). Duyt qua tt c file trong th mc, tnh tng cc thuc tnh FileInfo.Length ca chng. S dng k thut quy tnh cho c cc file nm trong cc th mc con.

Lp DirectoryInfo khng c thuc tnh no tr v thng tin kch thc. Tuy nhin, bn c th d dng tnh c kch thc ca tt c cc file nm trong mt th mc bng thuc tnh FileInfo.Length. Phng thc di y s dng k thut trn v c th ty chn duyt quy qua cc th mc con:
using System; using System.IO; public class FileSystemUtil {

public static long CalculateDirectorySize(DirectoryInfo directory, bool includeSubdirectories) {

long totalSize = 0;

// Duyt tt c cc file trong th mc.

358 Chng 9: File, th mc, v I/O

FileInfo[] files = directory.GetFiles(); foreach (FileInfo file in files) { totalSize += file.Length; }

// Duyt tt c cc th mc con. if (includeSubdirectories) {

DirectoryInfo[] dirs = directory.GetDirectories(); foreach (DirectoryInfo dir in dirs) { totalSize += CalculateDirectorySize(dir, true); } }

return totalSize; } }

V di y l ng dng th nghim phng thc trn:


using System; using System.IO; public class CalculateDirSize { private static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("Please supply a directory path."); return; } DirectoryInfo dir = new DirectoryInfo(args[0]); Console.WriteLine("Total size: " + FileSystemUtil.CalculateDirectorySize(dir, true).ToString() + " bytes."); Console.ReadLine();

359 Chng 9: File, th mc, v I/O } }

5.

Truy xut thng tin phin bn ca file


Bn cn truy xut cc thng tin v phin bn ca file nh publisher, revision number, comment S dng phng thc tnh GetVersionInfo ca lp System.Diagnostics. FileVersionInfo.

.NET Framework cho php bn truy xut cc thng tin v file m khng cn da vo Windows API. Bn ch cn s dng lp FileVersionInfo v gi phng thc GetVersionInfo vi i s l tn file. K , bn c th truy xut thng tin thng qua cc thuc tnh ca FileVersionInfo.
using System; using System.Diagnostics; public class VersionInfo { private static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("Please supply a file name."); return; } FileVersionInfo info = FileVersionInfo.GetVersionInfo(args[0]); // Hin th cc thng tin v phin bn. Console.WriteLine("Checking File: " + info.FileName); Console.WriteLine("Product Name: " + info.ProductName); Console.WriteLine("Product Version: " + info.ProductVersion); Console.WriteLine("Company Name: " + info.CompanyName); Console.WriteLine("File Version: " + info.FileVersion); Console.WriteLine("File Description: " + info.FileDescription); Console.WriteLine("Original Filename: " + info.OriginalFilename); Console.WriteLine("Legal Copyright: " + info.LegalCopyright); Console.WriteLine("InternalName: " + info.InternalName); Console.WriteLine("IsDebug: " + info.IsDebug);

360 Chng 9: File, th mc, v I/O

Console.WriteLine("IsPatched: " + info.IsPatched); Console.WriteLine("IsPreRelease: " + info.IsPreRelease); Console.WriteLine("IsPrivateBuild: " + info.IsPrivateBuild); Console.WriteLine("IsSpecialBuild: " + info.IsSpecialBuild); Console.ReadLine(); } }

Di y l kt xut khi bn chy lnh VersionInfo c:\windows\explorer.exe:


Checking File: c:\windows\explorer.exe Product Name: Microsoft Windows Operating System Product Version: 6.00.2600.0000 Company Name: Microsoft Corporation File Version: 6.00.2600.0000 (xpclient.010817-1148) File Description: Windows Explorer Original Filename: EXPLORER.EXE Legal Copyright: Microsoft Corporation. All rights reserved. InternalName: explorer IsDebug: False IsPatched: False IsPreRelease: False IsPrivateBuild: False IsSpecialBuild: False

6.

S dng TreeView hin th cy th mc just-in-time


Bn cn hin th mt cy th mc trong TreeView. Tuy nhin, vic lp y cu trc cy th mc khi khi ng tn qu nhiu thi gian. Thm cp th mc u tin vo TreeView, v thm mt nt gi (n) vo mi nhnh. Phn ng li s kin TreeView.BeforeExpand thm cc th mc con vo mt nhnh trc khi n c hin th.

Bn c th s dng k thut quy xy dng ton b cy th mc. Tuy nhin, vic qut h thng file theo cch ny c th chm, c bit i vi cc a ln. V l do ny, cc phn mm qun l file chuyn nghip (bao gm Windows Explorer) s dng mt k thut khc: ch hin th nhng thng tin no ngi dng cn n.

361 Chng 9: File, th mc, v I/O TreeView rt thch hp vi cch tip cn ny v n cung cp s kin BeforeExpand (s kin

ny pht sinh trc khi mt cp mi c hin th). Bn c th s dng mt placeholder (nh du hoa th hay nt rng) trong tt c cc nhnh cha c thm vo. iu ny cho php bn thm vo cc phn ca cy th mc khi chng c hin th. s dng kiu gii php ny, bn cn ba yu t sau: Phng thc Fillthm mt cp mi vo mt th mc. Bn s s dng phng thc ny thm vo cc cp khi chng c m rng. Phng thc th l s kin Form.Loads dng Fill to cy vi cp u tin. Phng thc th l s kin TreeView.BeforeExpandphn ng khi ngi dng m rng mt nt v gi Fill nu thng tin ca th mc ny cha c thm.

Di y l phn m cho form:


using System; using System.IO; using System.Drawing; using System.Windows.Forms; public class DirectoryTree : System.Windows.Forms.Form { private System.Windows.Forms.TreeView treeDirectory; // (B qua phn m designer.) private void Fill(TreeNode dirNode) { DirectoryInfo dir = new DirectoryInfo(dirNode.FullPath); // Mt ngoi l c th b nm nu bn khng c // quyn thao tc trn file hay th mc. // Bn c th bt v b qua ngoi l ny. foreach (DirectoryInfo dirItem in dir.GetDirectories()) { // Thm nt gi cho th mc. TreeNode newNode = new TreeNode(dirItem.Name); dirNode.Nodes.Add(newNode); newNode.Nodes.Add("*"); } } private void DirectoryTree_Load(object sender, System.EventArgs e) {

362 Chng 9: File, th mc, v I/O

// Thit lp nt u tin. TreeNode rootNode = new TreeNode("C:\\"); treeDirectory.Nodes.Add(rootNode); // Thm cp th nht v m rng n. Fill(rootNode); treeDirectory.Nodes[0].Expand(); } private void treeDirectory_BeforeExpand(object sender, System.Windows.Forms.TreeViewCancelEventArgs e) { // Nu tm thy mt nt gi, xa n v c cc th mc tht. if (e.Node.Nodes[0].Text == "*") { e.Node.Nodes.Clear(); Fill(e.Node); } } }

Hnh 9.1 Mt cy th mc vi TreeView

363 Chng 9: File, th mc, v I/O

7.

c v ghi file vn bn
Bn cn ghi d liu vo mt file vn bn theo kiu m ha ASCII, Unicode, hay UTF-8. To mt i tng System.IO.FileStream tham chiu n file. ghi file, hy gi FileStream trong mt System.IO.StreamWriter v s dng phng thc np chng Write. c file, hy gi FileStream trong mt System.IO.StreamReader v s dng phng thc Read hay ReadLine.

.NET cho php bn ghi hay c vn bn bng lp StreamWriter v StreamReader. Khi ghi d liu vi StreamWriter, hy s dng phng thc StreamWriter.Write. Phng thc ny c np chng h tr tt c cc kiu d liu thng thng trong C# .NET, bao gm chui, k t, s nguyn, s thc du chm ng, s thp phn,... Tuy nhin, phng thc Write lun chuyn d liu thnh vn bn. Nu mun chuyn vn bn ny tr v kiu ban u th bn nn s dng WriteLine bo m mi gi tr c t trn mt dng ring. C nhiu cch m t mt chui di dng nh phn, ty thuc vo cch m ha. Cc kiu m ha thng thng l: ASCIIs dng 7 bit m ha mi k t trong chui. D liu c m ha theo ASCII khng th cha cc k t Unicode m rng. Khi s dng kiu m ha ASCII trong .NET, cc bit c m thm mng byte kt qu s c 1 byte cho mi k t. Full Unicode, hay UTF-16s dng 16 bit m ha mi k t trong chui, nn mng byte kt qu s c 2 byte cho mi k t. UTF-7 Unicodes dng 7 bit cho cc k t ASCII bnh thng v nhiu cp 7 bit cho cc k t m rng. Kiu m ha ny ch yu dng cho cc giao thc 7 bit, chng hn mail. UTF-8 Unicodes dng 8 bit cho cc k t ASCII bnh thng v nhiu cp 8 bit cho cc k t m rng. Mng byte kt qu s c 1 byte cho mi k t (gi s khng c k t m rng).

.NET cung cp mt lp cho mi kiu m ha trong khng gian tn System.Text. Khi s dng StreamReader v StreamWriter, bn c th ch nh kiu m ha hoc s dng kiu mc nh l UTF-8. Khi c thng tin, s dng phng thc Read hay ReadLine ca lp StreamReader. Phng thc Read c mt k t, hay s k t do bn ch nh, v tr v mt k t hay mng k t. Phng thc ReadLine tr v mt chui cha ton b ni dung mt hng. ng dng Console di y minh ha vic ghi v c mt file vn bn:
using System; using System.IO; using System.Text; public class TextFileTest {

364 Chng 9: File, th mc, v I/O

private static void Main() { // To file mi. FileStream fs = new FileStream("test.txt", FileMode.Create);

// To mt writer v ch nh kiu m ha. // Kiu mc nh (UTF-8) h tr k t Unicode, // nhng m ha cc k t chun ging nh ASCII StreamWriter w = new StreamWriter(fs, Encoding.UTF8); // Ghi mt s thp phn, mt chui, v mt k t. w.WriteLine(124.23M); w.WriteLine("Test string"); w.WriteLine('!');

// Bo m tt c d liu c ghi t buffer. w.Flush(); // ng file. w.Close(); fs.Close(); Console.WriteLine("Press Enter to read the information."); Console.ReadLine(); // M file trong ch ch-c. fs = new FileStream("test.txt", FileMode.Open); StreamReader r = new StreamReader(fs, Encoding.UTF8); // c d liu v chuyn n v kiu thch hp. Console.WriteLine(Decimal.Parse(r.ReadLine())); Console.WriteLine(r.ReadLine()); Console.WriteLine(Char.Parse(r.ReadLine())); r.Close(); fs.Close();

365 Chng 9: File, th mc, v I/O

Console.ReadLine(); } }

8.

c v ghi file nh phn


Bn cn ghi d liu vo file nh phn vi kiu d liu mnh. To mt i tng System.IO.FileStream tham chiu n file. ghi file, hy gi FileStream trong mt System.IO.BinaryWriter v s dng phng thc np chng Write. c file, hy gi FileStream trong mt System.IO.BinaryReader v s dng phng thc Read ph hp vi kiu d liu.

.NET cho php bn ghi hay c d liu nh phn bng lp BinaryWriter v BinaryReader. Khi ghi d liu vi BinaryWriter, hy s dng phng thc BinaryWriter.Write. Phng thc ny c np chng h tr tt c kiu d liu thng thng trong C# .NET, bao gm chui, k t, s nguyn, s thc du chm ng, s thp phn,... Thng tin sau c m ha thnh mt dy cc byte v ghi vo file. Bn c th ch nh kiu m ha cho chui bng mt phng thc khi dng np chng nhn mt i tng System.Text.Encoding lm i s ( c m t trong mc 9.7). S dng file nh phn thao tc vi cc kiu d liu th kh phc tp, v khi truy xut thng tin, bn phi s dng mt trong nhng phng thc Read kiu mnh ca BinaryReader. V d: mun truy xut d liu dng thp phn th phi s dng ReadDecimal; cn mun c mt chui th phi s dng ReadString (BinaryWriter lun ghi li chiu di ca chui khi ghi chui vo file trnh li). ng dng Console di y minh ha vic ghi v c mt file nh phn:
using System; using System.IO;

public class BinaryFileTest {

private static void Main() {

// To file v to writer. FileStream fs = new FileStream("test.txt", FileMode.Create); BinaryWriter w = new BinaryWriter(fs);

// Ghi mt s thp phn, hai chui, v mt k t. w.Write(124.23M); w.Write("Test string");

366 Chng 9: File, th mc, v I/O

w.Write("Test string 2"); w.Write('!');

// Bo m tt c d liu c ghi t buffer. w.Flush();

// ng file. w.Close(); fs.Close();

Console.WriteLine("Press Enter to read the information."); Console.ReadLine();

// M file trong ch ch-c. fs = new FileStream("test.txt", FileMode.Open);

// Hin th d liu th trong file. StreamReader sr = new StreamReader(fs); Console.WriteLine(sr.ReadToEnd()); Console.WriteLine();

// c d liu v chuyn n v kiu thch hp. fs.Position = 0; BinaryReader br = new BinaryReader(fs); Console.WriteLine(br.ReadDecimal()); Console.WriteLine(br.ReadString()); Console.WriteLine(br.ReadString()); Console.WriteLine(br.ReadChar());

fs.Close();

Console.ReadLine(); } }

367 Chng 9: File, th mc, v I/O

9.

c file mt cch bt ng b
Bn cn c d liu t mt file m khng phi dng qu trnh thc thi m lnh ca bn. K thut ny thng c s dng khi file c lu tr trong mt ni c tc truy xut chm (chng hn mt a mng). To mt lp c file mt cch bt ng b. Bt u c mt khi d liu bng phng thc FileStream.BeginRead, v truyn phng thc callback. Khi callback c kch hot, gi FileStream.EndRead truy xut d liu, x l n, v c khi d liu k tip vi BeginRead.

FileStream h tr hot ng bt ng b thng qua phng thc BeginRead v EndRead. S

dng cc phng thc ny, bn c th c mt khi d liu trn mt trong cc tiu trnh do thread-pool cung cp m khng cn s dng trc tip cc lp tiu trnh trong khng gian tn System.Threading. Khi c file mt cch bt ng b, bn cn xc nh kch thc khi d liu trong mt ln c. Ty trng hp, bn c th mun c mt khi d liu nh (v d, chp tng khi mt sang file khc) hoc khi d liu tng i ln (v d, bn cn mt lng thng tin nht nh trc khi x l vic g ). Bn ch nh kch thc khi khi gi BeginRead, v truyn mt b m cha d liu. V BeginRead v EndRead cn truy xut nhiu mu thng tin ging nhau (chng hn FileStream, b m, kch thc khi,...), bn nn ng gi m lnh c file bt ng b trong mt lp. Vi lp AsyncProcessor trong v d di y, phng thc cng khai StartProcess bt u qu trnh c bt ng b. Mi khi qu trnh c hon tt, OnCompletedRead c kch hot v khi d liu c x l. Nu cn d liu trong file, mt qu trnh c bt ng b mi s c khi chy. Kch thc khi b nh l 2 KB (2048 byte).
using System; using System.IO; using System.Threading; public class AsyncProcessor { private Stream inputStream; // Kch thc mi khi d liu l 2 KB. private int bufferSize = 2048; public int BufferSize { get {return bufferSize;} set {bufferSize = value;} }

368 Chng 9: File, th mc, v I/O

// B m cha d liu. private byte[] buffer; public AsyncProcessor(string fileName) {

buffer = new byte[bufferSize];

// M file, truyn gi tr true h tr truy xut bt ng b. inputStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, true); } public void StartProcess() {

// Bt u qu trnh c bt ng b. inputStream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(OnCompletedRead), null); } private void OnCompletedRead(IAsyncResult asyncResult) { // Mt khi c c. Truy xut d liu. int bytesRead = inputStream.EndRead(asyncResult); // Nu khng c c byte no, stream ang cui file. if (bytesRead > 0) { // Tm dng gi lp vic x l d liu. Console.WriteLine("\t[ASYNC READER]: Read one block."); Thread.Sleep(TimeSpan.FromMilliseconds(20)); // Bt u c khi k tip. inputStream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(OnCompletedRead), null); }else {

369 Chng 9: File, th mc, v I/O // Kt thc. Console.WriteLine("\t[ASYNC READER]: Complete."); inputStream.Close(); } } }

V d di s dng AsyncProcessor c mt file c kch thc 1 MB.


public class AsynchronousIO { public static void Main() { // To file th nghim c kch thc 1MB. FileStream fs = new FileStream("test.txt", FileMode.Create); fs.SetLength(1000000); fs.Close();

// Bt u x l bt ng b trn mt tiu trnh khc. AsyncProcessor asyncIO = new AsyncProcessor("test.txt"); asyncIO.StartProcess();

// Cng thi im ny, thc hin cng vic khc. // y chng ta s lp trong 10 giy. DateTime startTime = DateTime.Now; while (DateTime.Now.Subtract(startTime).TotalSeconds < 10) {

Console.WriteLine("[MAIN THREAD]: Doing some work.");

// Tm dng gi lp mt thao tc tn nhiu thi gian. Thread.Sleep(TimeSpan.FromMilliseconds(100)); }

Console.WriteLine("[MAIN THREAD]: Complete."); Console.ReadLine();

// Xa file th. File.Delete("test.txt"); }

370 Chng 9: File, th mc, v I/O

V y l kt xut khi chy ng dng th nghim:


[MAIN THREAD]: Doing some work. [ASYNC READER]: Read one block. [ASYNC READER]: Read one block. [MAIN THREAD]: Doing some work. [ASYNC READER]: Read one block. [ASYNC READER]: Read one block. [ASYNC READER]: Read one block. [ASYNC READER]: Read one block. [MAIN THREAD]: Doing some work. [ASYNC READER]: Read one block. [ASYNC READER]: Read one block. [ASYNC READER]: Read one block. . . .

10.

Tm file ph hp mt biu thc wildcard


Bn cn x l nhiu file c im chung, da vo biu thc lc nh *.dll hay mysheet20??.xls. S dng phin bn np chng ca phng thc System.IO.DirectoryInfo. GetFiles nhn mt biu thc lc v tr v mt mng cc i tng FileInfo.

Cc i tng DirectoryInfo v Directory u cho php d trong th mc hin hnh tm cc file ph hp vi mt biu thc lc. Cc biu thc ny thng s dng cc k t wildcard nh ? v *. Bn cng c th s dng k thut tng t ly cc th mc ph hp vi mt mu nht nh bng phng thc np chng DirectoryInfo.GetDirectories. V d di y s ly tn ca tt c cc file trong mt th mc ph hp vi mt biu thc lc. Th mc v biu thc lc c truyn qua dng lnh.
using System; using System.IO; public class WildcardTest { private static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine(

371 Chng 9: File, th mc, v I/O "USAGE: return; } DirectoryInfo dir = new DirectoryInfo(args[0]); FileInfo[] files = dir.GetFiles(args[1]); // Hin th tn v kch thc file. foreach (FileInfo file in files) { Console.Write("Name: " + file.Name + " "); WildcardTest [directory] [filterExpression]");

Console.WriteLine("Size: " + file.Length.ToString()); } Console.ReadLine(); } }

Nu mun tm trong th mc con, bn cn s dng quy. Nhiu mc trong chng s dng k thut quy x l file, chng hn 9.3 v 9.4.

11.

Kim tra hai file c trng nhau hay khng


Bn cn so snh ni dung ca hai file v xc nh chng c trng nhau hay khng. Tnh m bm ca mi file bng lp System.Security.Cryptography.HashAlgorithm ri so snh cc m bm.

C nhiu cch so snh nhiu file. V d, c th xt mt phn ca file xem c ging nhau, hoc c c file so snh tng byte. C hai cch trn u ng, nhng trong mt s trng hp, s dng m bm thun tin hn. Mt gii thut bm sinh ra mt dng nh phn c trng (vi kch thc nh, thng khong 20 byte) cho file. C kh nng hai file khc nhau c cng m bm, nhng kh nng ny hu nh khng xy ra. Thc t, c nhng thay i nh nht (chng hn, ch thay i mt bit ca file ngun) cng c 50% kh nng thay i cc bit ca m bm. Do , m bm thng c s dng pht hin d liu b sa i (m bm s c cp chi tit hn trong chng 14). to mt m bm, trc ht bn phi to mt i tng HashAlgorithm bng phng thc tnh HashAlgorithm.Create. Sau gi HashAlgorithm.ComputeHash nhn mt mng byte cha m bm. V d di y c hai tn file t i s dng lnh v kim tra hai file ny c trng nhau hay khng:
using System; using System.IO;

372 Chng 9: File, th mc, v I/O

using System.Security.Cryptography; public class CompareFiles { private static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine("USAGE: [fileName]"); return; } Console.WriteLine("Comparing " + args[0] + " and " + args[1]); // To i tng bm. HashAlgorithm hashAlg = HashAlgorithm.Create(); CompareFiles [fileName] " +

// Tnh m bm cho file th nht. FileStream fsA = new FileStream(args[0], FileMode.Open); byte[] hashBytesA = hashAlg.ComputeHash(fsA); fsA.Close(); // Tnh m bm cho file th hai. FileStream fsB = new FileStream(args[1], FileMode.Open); byte[] hashBytesB = hashAlg.ComputeHash(fsB); fsB.Close(); // So snh m bm. if (BitConverter.ToString(hashBytesA) == BitConverter.ToString(hashBytesB)) {

Console.WriteLine("Files match."); }else { Console.WriteLine("No match."); }

373 Chng 9: File, th mc, v I/O

Console.ReadLine(); } }

Cc m bm c so snh bng cch chuyn chng thnh chui. Bn cng c th duyt qua mng v so snh tng byte. Cch ny nhanh hn mt t, nhng vic chuyn 20 byte thnh chui khng tn nhiu chi ph nn khng cn thit.

12.

Thao tc trn ng dn file


Bn cn ly mt phn ng dn file hoc kim tra mt ng dn file c dng chun hay khng. X l ng dn bng lp System.IO.Path. Bn c th s dng Path.GetFileName ly tn file t ng dn, Path.ChangeExtension thay i phn m rng ca ng dn, v Path.Combine to ng dn y m khng cn quan tm th mc ca bn c k t phn cch th mc(\) hay cha.

Thng kh thao tc vi cc ng dn file v c v s cch m t mt th mc. V d, bn c th s dng ng dn tuyt i (C:\Temp), ng dn UNC (\\MyServer\\MyShare\Temp), hoc mt trong cc ng dn tng i (C:\Temp\MyFiles\..\ hay C:\Temp\MyFiles\..\..\Temp). Cch d nht x l cc ng dn file l s dng cc phng thc tnh ca lp Path bo m c thng tin ng. V d, on m sau trch tn file t mt ng dn file:
string filename = @"..\System\MyFile.txt"; filename = Path.GetFileName(filename); // filename by gi l "MyFile.txt".

V on m sau s dng Path.Combine thm tn file vo ng dn th mc:


string filename = @"..\..\myfile.txt"; string fullPath = @"c:\Temp"; filename = Path.GetFileName(filename); fullPath = Path.Combine(fullPath, filename); // fullPath by gi l "c:\Temp\myfile.txt".

Cch ny c u im l k t phn cch th mc (\) s t ng c thm vo ng dn nu cn thit. Lp Path cng cung cp cc phng thc hu ch sau y thao tc trn thng tin ng dn:
ChangeExtensionthay i phn m rng ca file. Nu phn m rng mi khng c

ch nh, phn m rng hin ti s b xa.

374 Chng 9: File, th mc, v I/O

GetDirectoryNametr v thng tin ca cc th mc nm gia k t phn cch th mc

(\) u v cui.
GetFileNameWithoutExtensiontng t nh GetFileName, nhng b phn m rng. GetFullPathkhng c tc dng i vi ng dn tuyt i, v n s dng th mc

hin hnh i mt ng dn tng i thnh ng dn tuyt i. V d, nu C:\Temp\ l th mc hin hnh, gi GetFullPath cho file test.txt s tr v C:\Temp\ test.txt.
GetPathRoottr v chui cha th mc gc (v d, "C:\"). i vi ng dn tng

i, n tr v tham chiu rng.


HasExtensiontr v true nu ng dn kt thc vi phn m rng. IsPathRootedtr v true nu ng dn l tuyt i, false nu ng dn l tng

i.

Trong hu ht trng hp, mt ngoi l s b nm nu bn truyn ng dn khng hp l cho mt trong cc phng thc ny (chng hn, ng dn c cha cc k t khng hp l). Tuy nhin, nhng ng dn khng hp l do cha cc k t wildcard s khng lm sinh ra ngoi l.

13.

Xc nh ng dn tng ng vi mt file hay th mc


Bn c mt ng dn ( dng chui), v cn xc nh n tng ng vi mt th mc hay mt file. Kim tra ng dn vi phng thc Directory.Exists v File.Exists.

C hai lp System.IO.Directory v System.IO.File u c phng thc Exists.


Directory.Existstr v true nu ng dn (tng i hoc tuyt i) tng ng

vi mt th mc ang tn ti.
File.Existstr v true nu ng dn tng ng vi mt file ang tn ti.

S dng hai phng thc ny, bn c th nhanh chng xc nh mt ng dn c tng ng vi mt file hay th mc hay khng, nh v d sau:
using System; using System.IO;

public class FileOrPath {

private static void Main(string[] args) {

foreach (string arg in args) {

375 Chng 9: File, th mc, v I/O

Console.Write(arg);

if (Directory.Exists(arg)) { Console.WriteLine(" is a directory"); } else if (File.Exists(arg)) { Console.WriteLine(" is a file"); } else { Console.WriteLine(" does not exist"); } } Console.ReadLine(); } }

14.

Lm vic vi ng dn tng i
Bn cn thit lp th mc lm vic hin hnh c th s dng ng dn tng i trong m lnh ca bn. S dng phng thc tnh GetCurrentDirectory v SetCurrentDirectory ca lp System.IO.Directory.

ng dn tng i t ng c din dch da trn quan h vi th mc hin hnh. Bn c th ly th mc hin hnh bng phng thc Directory.GetCurrentDirectory hoc thay i n bng phng thc Directory.SetCurrentDirectory. Ngoi ra, bn c th s dng phng thc tnh GetFullPath ca lp System.IO.Path chuyn ng dn tng i thnh ng dn tuyt i. Di y l mt v d minh ha:
using System; using System.IO; public class RelativeDirTest { private static void Main() { Console.WriteLine("Using: " + Directory.GetCurrentDirectory()); Console.WriteLine("The relative path 'file.txt' " + "will automatically become: '" +

376 Chng 9: File, th mc, v I/O

Path.GetFullPath("file.txt") + "'"); Console.WriteLine();

Console.WriteLine("Changing current directory to C:\\"); Directory.SetCurrentDirectory("C:\\");

Console.WriteLine("Now the relative path 'file.txt' " + "will automatically become '" + Path.GetFullPath("file.txt") + "'");

Console.ReadLine(); } }

Kt xut ca ng dng ny c th nh sau (nu bn chy ng dng trong th mc C:\Temp):


Using: C:\Temp The relative path 'file.txt' will automatically become 'C:\Temp\file.txt' Changing current directory to C:\ The relative path 'file.txt' will automatically become 'C:\file.txt'

Nu s dng ng dn tng i, bn nn thit lp th mc lm vic khi bt u tng tc vi file. Nu khng, c th nh hng n s an ton ca h thng nu ngi dng c thay i th mc lm vic ng dng ca bn truy xut hoc ghi file h thng.

15.

To file tm
Bn cn to mt file s c t trong th mc tm ca ngi dng c th v s c tn duy nht, n khng ng vi cc file tm c sinh ra bi cc chng trnh khc. S dng phng thc tnh GetTempFileName ca lp System.IO.Path, phng thc ny tr v mt ng dn kt hp ng dn n th mc tm vi mt tn file c to nhu nhin.

C nhiu cch to file tm. Trong cc trng hp n gin, bn ch cn to mt file trong th mc ng dng, c th s dng mt GUID hoc mt tem thi gian kt hp vi mt gi tr ngu nhin lm tn file. Tuy nhin, lp Path h tr mt phng thc gip bn tn cng hn. N s to ra mt file vi tn duy nht trong th mc tm ca ngi dng hin hnh, chng hn C:\Documents and Settings\username\Local Settings\Temp\tmpac9.tmp.

377 Chng 9: File, th mc, v I/O using System; using System.IO; public class TemporaryFile { private static void Main() { string tempFile = Path.GetTempFileName(); Console.WriteLine("Using " + tempFile); FileStream fs = new FileStream(tempFile, FileMode.Open); // (Ghi d liu.) fs.Close(); // Xa file. File.Delete(tempFile); Console.ReadLine(); } }

16.

Ly dung lng a cn trng


Bn cn xt mt a v xc nh cn bao nhiu byte trng. S dng hm khng-c-qun-l Win32 API GetDiskFreeSpaceEx, (hm ny c khai bo trong kernell32.dll).

Khng lp no trong cc lp v h thng file ca .NET cho php xc nh dung lng a cn trng. Tuy nhin, bn c th d dng ly c thng tin ny bng hm Win32 API GetDiskFreeSpaceEx. Hm ny s tr v dung lng tng cng, dung lng cn trng, v dung lng cn trng c th s dng c (nh qun tr c th s dng Disk Quota Management hn ch dung lng m ngi dng c th s dng c).

378 Chng 9: File, th mc, v I/O

Hnh 9.2 Disk Quota Management

ng dng Console di y minh ha k thut ny:


using System; using System.Runtime.InteropServices;

public class GetFreeSpace {

[DllImport("kernel32.dll", EntryPoint="GetDiskFreeSpaceExA" )] private static extern long GetDiskFreeSpaceEx( string lpDirectoryName, out long lpFreeBytesAvailableToCaller, out long lpTotalNumberOfBytes, out long lpTotalNumberOfFreeBytes);

private static void Main() {

long result, total, free, available; result = GetDiskFreeSpaceEx("c:", out available, out total, out free);

379 Chng 9: File, th mc, v I/O if (result != 0) {

Console.WriteLine("Total Bytes: {0:N}", total); Console.WriteLine("Free Bytes: {0:N}", free); Console.WriteLine("Available Bytes: {0:N}", available); } Console.ReadLine(); } }

17.

Hin th cc hp thoi file


Bn cn hin cc hp thoi Windows chun m, lu file, v chn th mc. S dng cc lp OpenFileDialog, SaveFileDialog, v FolderBrowserDialog thuc khng gian tn System.Windows.Forms. Gi phng thc ShowDialog hin th hp thoi, xt gi tr tr v xc nh ngi dng nhn OK hay Cancel, v ly thng tin t thuc tnh FileName hay SelectedPath.

.NET cung cp cc i tng bc ly nhiu hp thoi Windows chun, bao gm cc hp thoi dng m v lu file, v chn th mc. Tt c cc lp ny u tha k t System.Windows.Forms.CommonDialog, bao gm:
OpenFileDialogcho php ngi dng chn mt file. Tn file v ng dn c th

c ly t thuc tnh FileName (hay tp hp FileNames, nu bn cho php chn nhiu file bng cch thit lp Multiselect l true). Ngoi ra, bn c th s dng thuc tnh Filter chn nh dng file v thit lp thuc tnh CheckFileExists kim tra tnh hp l (xem hnh 9.3).
[

380 Chng 9: File, th mc, v I/O

Hnh 9.3 OpenFileDialog

SaveFileDialogcho php ngi dng ch nh mt file mi. Tn file v ng dn c

th c ly t thuc tnh FileName. Bn c th s dng thuc tnh Filter chn nh dng file v thit lp cc thuc tnh CreatePrompt v OverwritePrompt hin th thng bo xc nhn khi ngi dng chn mt file mi hay file tn ti.
FolderBrowserDialogcho php ngi dng chn (v to) mt th mc. ng dn

chn c th c ly t thuc tnh SelectedPath. Ngoi ra, bn c th thit lp thuc tnh ShowNewFolderButton hin th nt Make New Folder (xem hnh 9.4).

Hnh 9.4 FolderBrowserDialog

Khi s dng OpenFileDialog hay SaveFileDialog, bn cn thit lp chui lc (ch nh cc phn m rng c php). Chui lc c phn cch bi k t "|" theo nh dng: "[Nhn] | [Danh sch cc phn m rng c phn cch bi du chm phy] | [Nhn] | [Danh sch cc phn m rng c phn cch bi du chm phy] | ...". Bn cng c th thit lp thuc tnh Title (tiu ) v InitialDirectory (th mc ban u). ng dng di y cho php ngi dng np ti liu vo mt RichTextBox, sa ni dung, v lu ti liu c sa (s dng lp OpenFileDialog v SaveFileDialog m v lu ti liu).
using System; using System.Drawing; using System.Windows.Forms;

public class SimpleEditForm : System.Windows.Forms.Form { private System.Windows.Forms.MenuItem mnuFile; private System.Windows.Forms.MenuItem mnuOpen;

381 Chng 9: File, th mc, v I/O private System.Windows.Forms.MenuItem mnuSave; private System.Windows.Forms.MenuItem mnuExit; private System.Windows.Forms.RichTextBox rtDoc; // (B qua phn m designer.)

private void mnuOpen_Click(object sender, System.EventArgs e) { OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = "Rich Text Files (*.rtf)|*.RTF|" + "All files (*.*)|*.*"; dlg.CheckFileExists = true; dlg.InitialDirectory = Application.StartupPath;

if (dlg.ShowDialog() == DialogResult.OK) { rtDoc.LoadFile(dlg.FileName); rtDoc.Enabled = true; } }

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

SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "RichText Files (*.rtf)|*.RTF|Text Files *.TXT" + "|All files (*.*)|*.*"; dlg.CheckFileExists = true; dlg.InitialDirectory = Application.StartupPath; (*.txt)|

if (dlg.ShowDialog() == DialogResult.OK) { rtDoc.SaveFile(dlg.FileName); } }

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

this.Close(); }

382 Chng 9: File, th mc, v I/O

18.

S dng khng gian lu tr ring


Bn cn lu d liu vo file, nhng ng dng ca bn khng c cp FileIOPermission s dng a cng. S dng cc lp IsolatedStorageFile v IsolatedStorageFileStream thuc khng gian tn System.IO.IsolatedStorage. Cc lp ny cho php ng dng ghi d liu vo mt file trong th mc ca mt ngi dng c th m khng cn c cp php truy xut trc tip a cng cc b.

.NET Framework h tr khng gian lu tr ring, tc l cho php bn c v ghi vo h thng file o ca ngi dng c th m CLR qun l. Khi bn to cc file lu tr ring, d liu t ng c lu vo mt ni duy nht trong ng dn profile ca ngi dng (thng thng ng dn ny c dng C:\Documents and Settings\[username]\Local Settings\Application Data\IsolatedStorage\ [guid_identifier]). Mt l do s dng khng gian lu tr ring l trao cho mt ng dng c--tin cy-mtphn c kh nng hn ch khi lu tr d liu (xem mc 13.1 c thm thng tin v m lnh c--tin-cy-mt-phn). V d, chnh sch bo mt CLR mc nh cp cho m lnh cc b c FileIOPermission khng hn ch, tc l c quyn c v ghi bt k file no. M lnh thc thi t mt my ch xa trn mng Intranet cc b t ng c cp t quyn hnthiu mt FileIOPermission, nhng c IsolatedStoragePermission, tc l c kh nng s dng khng gian lu tr ring (chnh sch bo mt cng hn ch dung lng ti a c th c s dng trong khng gian lu tr ring). Mt l do khc s dng khng gian lu tr ring l bo v d liu tt hn. V d, i vi d liu trong khng gian lu tr ring ca mt ngi dng, nhng ngi dng khc khng phi l nh qun tr s khng c quyn truy xut. on m di y minh ha cch truy xut khng gian lu tr ring:
using System; using System.IO; using System.IO.IsolatedStorage;

public class IsolatedStoreTest {

private static void Main() {

// To khng gian lu tr ring cho ngi dng hin hnh. IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForAssembly();

383 Chng 9: File, th mc, v I/O // To mt th mc ti gc ca khng gian lu tr ring. store.CreateDirectory("MyFolder");

// To mt file trong khng gian lu tr ring. Stream fs = new IsolatedStorageFileStream( "MyFile.txt", FileMode.Create, store);

StreamWriter w = new StreamWriter(fs);

// Ghi file nh bnh thng. w.WriteLine("Test"); w.Flush(); fs.Close();

Console.WriteLine("Current size: " + store.CurrentSize.ToString()); Console.WriteLine("Scope: " + store.Scope.ToString());

Console.WriteLine("Contained files include:"); string [] files = store.GetFileNames("*.*"); foreach (string file in files) { Console.WriteLine(file); }

Console.ReadLine(); } }

Theo mc nh, mi khng gian lu tr ring c tch bit bi ngi dng v assembly. iu ny c ngha l khi cng mt ngi chy cng mt ng dng, ng dng ny s truy xut d liu trong cng khng gian lu tr ring. Tuy nhin, bn c th tch bit thm bi min ng dng nhiu th hin ca cng mt ng dng nhn cc khng gian lu tr ring khc nhau, nh v d sau:
// Truy xut khng gian lu tr ring ca ngi dng // v assembly hin ti (tng t v d trn). store = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);

// Truy xut khng gian lu tr ring ca ngi dng, assembly, // v min ng dng hin hnh. Ni cch khc, d liu ny ch c

384 Chng 9: File, th mc, v I/O

// truy xut bi th hin hin ti ca ng dng. store = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly | IsolatedStorageScope.Domain, null, null);

File c lu tr nh mt phn profile ca ngi dng, v vy ngi dng c th truy xut cc file ny t bt k my no trong mng LAN nu roaming profile3 c cu hnh (trong trng hp ny, phi thit lp c IsolatedStorageFile.Roaming khi to khng gian lu tr). Bng cch .NET Framework v CLR cung cp cc mc cch ly, bn khng phi duy tr s tch bit gia cc file, v khng phi lo vic khng hiu r c ch lm vic s gy mt d liu quan trng.

19.

Theo di h thng file pht hin thay i


Bn cn phn ng khi h thng file thay i ti mt ng dn c th (chng hn sa hay to file). S dng thnh phn System.IO.FileSystemWatcher, ch nh file hoc ng dn cn theo di, v th l cc s kin Created, Deleted, Renamed, v Changed.

Khi lin kt nhiu ng dng v cc qu trnh nghip v, thng cn to mt chng trnh th ng v ch tr nn tch cc khi mt file c to ra hoc b thay i. Bn c th to kiu chng trnh th ny bng cch qut nh k qua mt th mc, nhng li gp phi vn cn bng. Qut cng thng xuyn, cng tn ti nguyn h thng. Qut cng t, cng lu pht hin c thay i. Cch tin nht l s dng lp FileSystemWatcher phn ng trc tip cc s kin file ca Windows. s dng FileSystemWatcher, bn phi to mt th hin v thit lp cc thuc tnh sau:
Pathch nh ng dn cn theo di. Filterch nh kiu file cn theo di. NotifyFilterch nh kiu thay i cn theo di.

FileSystemWatcher sinh ra bn s kin chnh: Created, Deleted, Renamed, v Changed. Cc s

kin ny cung cp thng tin qua i s FileSystemEventArgs, bao gm tn file (Name), ng dn y (FullPath), kiu thay i (ChangeType). S kin Renamed cung cp th hin RenamedEventArgs dn xut t FileSystemEventArgs, v thm thng tin v tn file ban u (OldName v OldFullPath). Nu cn, bn c th v hiu cc s kin ny bng cch thit lp thuc tnh FileSystemWatcher.EnableRaisingEvents l false. D dng th l cc s kin Created, Deleted, v Renamed. Nhng nu mun s dng s kin Changed, bn cn s dng thuc tnh NotifyFilter ch nh kiu thay i cn theo di. Bng khng, chng trnh ca bn c th b sa ly bi mt lot cc s kin khi file b thay i.
3

Roaming profile c to bi ngi qun tr h thng v c lu tr trn mt server. Profile ny c sn mi khi bn ng nhp vo bt k my tnh no trn mng. Bt c thay i no cng khin roaming profile c cp nht li trn server.

385 Chng 9: File, th mc, v I/O

Thuc tnh NotifyFilter c th c thit lp bng cch kt hp cc gi tr thuc kiu lit k System.IO.NotifyFilters: Attributes, CreationTime, DirectoryName, FileName, LastWrite, LastAccess, Security, v Size. V d di y th l s kin Created v Deleted. V th nghim cc s kin ny bng cch to ra mt file th nghim.
using System; using System.IO; using System.Windows.Forms;

public class FileWatcherTest {

private static void Main() {

// Cu hnh FileSystemWatcher. FileSystemWatcher watch = new FileSystemWatcher(); watch.Path = Application.StartupPath; watch.Filter = "*.*"; watch.IncludeSubdirectories = true;

// ng k cc phng thc th l s kin. watch.Created += new FileSystemEventHandler(OnCreatedOrDeleted); watch.Deleted += new FileSystemEventHandler(OnCreatedOrDeleted); watch.EnableRaisingEvents = true;

Console.WriteLine("Press Enter to create a file."); Console.ReadLine();

if (File.Exists("test.bin")) { File.Delete("test.bin"); }

FileStream fs = new FileStream("test.bin", FileMode.Create); fs.Close();

Console.WriteLine("Press Enter to terminate the application."); Console.WriteLine(); Console.ReadLine(); }

386 Chng 9: File, th mc, v I/O

// Pht sinh khi mt file mi c to ra // trong th mc cn theo di. private static void OnCreatedOrDeleted(object sender, FileSystemEventArgs e) {

// Hin th thng bo. Console.WriteLine("\tNOTIFICATION: " + e.FullPath + "' was " + e.ChangeType.ToString()); Console.WriteLine(); } }

20.

Truy xut cng COM


Bn cn gi d liu trc tip n mt cng tun t (serial port). Win32 API cung cp cc hm khng-c-qun-l trong th vin kernell32.dll trc tip c v ghi cc byte n cng tun t. Bn c th nhp cc hm ny vo ng dng hoc s dng Microft Communications ActiveX control (MSComm.ocxc trong Microsoft Visual Studio 6).

.NET khng cung cp bt k giao din c-qun-l no thao tc vi cc cng tun t. Do , nhng ai cn chc nng ny s phi lm vic vi cc c ch tng i phc tp. Mt hng gii quyt l to mt v bc .NET cho Microsoft Communications Control (MSComm.ocx). iu kim ny cung cp mt m hnh i tng mc-cao lm vic vi cng tun t. Tuy nhin, bn phi thu ly iu kim ny thng qua Visual Studio 6 (bn c th ch chn ci t cc thnh phn ActiveX khi ci t Visual Studio 6, tn khong 5MB). c thm thng tin, bn hy tham kho ti liu Visual Studio 6. Mt hng gii quyt khc l nhp cc hm API t th vin kernell32.dll. Cn cn thn khi s dng phng php ny v bn phi s dng ng kiu d liu C# v duy tr layout ca cc cu trc b nh. May mn l, vn ny c Justin Harrell (jharrell@aciss.com) gii quyt vi mt lp C# ty bin c tn l ComPort. M lnh ca lp ny kh di, bn hy xem trong a CD nh km. Bn c th thm lp ComPort vo ng dng ca bn v s dng on m sau tng tc vi mt cng COM.
ComPort port = new ComPort();

try { // Cu hnh cho cng.

387 Chng 9: File, th mc, v I/O port.BaudRate = 9600; port.Parity = 0; port.PortNum = 1; port.ReadTimeout = 10; port.StopBits = 1; port.ByteSize = 1;

// M cng. port.Open();

// Ghi d liu. port.Write(new byte[1]);

// ng cng. port.Close();

}catch (ApplicationException err) {

Console.WriteLine(err.Message); }

388 Chng 9: File, th mc, v I/O

389

Chng 10:C S D LIU

10

390

391 Chng 10: C s d liu

rong Microsoft .NET Framework, vic truy xut n cc loi data-source (ngun d liu) c cho php thng qua mt nhm cc lp c tn l Microsoft ADO.NET. Mi loi data-source c h tr thng qua mt data-provider (b cung cp d liu). Mi data-provider gm tp cc lp khng ch hin thc tp giao din chun, m cn cung cp chc nng duy nht ca data-source m n h tr. Cc lp ny m t v kt ni, cu lnh, thng s, data-adapter (b iu hp d liu), v data-reader (b c d liu) m qua , bn c th tng tc vi mt loi data-source. Bng 10.1 lit k cc hin thc data-provider trong .NET.
Bng 10.1 Cc hin thc data-provider trong .NET Framework Data-provider M t

.NET Framework Data Provider for ODBC .NET Framework Data Provider for OLE DB .NET Framework Data Provider for Oracle .NET Framework Data Provider for SQL Server .NET Compact Framework Data Provider for SQL Server CE

Cung cp kt ni n mi data-source c hin thc giao din ODBC; bao gm Microsoft SQL Server, Oracle, v Microsoft Access. Cc lp data-provider nm trong khng gian tn System.Data.Odbc v c tin t Odbc. Cung cp kt ni n mi data-source c hin thc giao din OLE DB; bao gm Microsoft SQL Server, MSDE, Oracle, v Jet. Cc lp dataprovider nm trong khng gian tn System.Data.OleDb v c tin t OleDb. Cung cp kt ni n Oracle. Cc lp data-provider nm trong khng gian tn System.Data.OracleClient v c tin t Oracle. Cung cp kt ni n Microsoft SQL Server phin bn 7 v mi hn (gm c MSDE) bng cch lin lc trc tip vi SQL Server m khng cn s dng ODBC hay OLE DB. Cc lp data-provider nm trong khng gian tn System.Data.SqlClient v c tin t Sql. Cung cp kt ni n Microsoft SQL Server CE. Cc lp data-provider nm trong khng gian tn System.Data.SqlServerCe v c tin t SqlCe.

Chng ny m t mt vi kha cnh thng c s dng nht ca ADO.NET. Tuy nhin, ADO.NET l mt phn con m rng ca th vin lp .NET Framework v cha mt lng ln cc chc nng cao cp. Do , c th hiu r hn v ADO.NET, bn nn tm c mt quyn sch khc chuyn v ADO.NET. Nhng mc trong chng ny trnh by cc vn sau:

Cch to, cu hnh, m, v ng kt ni c s d liu (mc 10.1). Cch s dng connection-pooling ci thin hiu nng v tnh quy m ca cc ng
dng c s dng kt ni c s d liu (mc 10.2).

Cch thc thi cc cu lnh SQL v cc th tc tn tr (Stored Procedure), v cch s


dng cc thng s ci thin tnh linh hot ca chng (mc 10.3 v 10.4).

Cch x l kt qu c tr v t truy vn c s d liu (mc 10.5 v 10.6). Cch nhn bit tt c cc i tng SQL Server ang c hiu lc trn mng (mc 10.7).

392 Chng 10: C s d liu

c file Excel vi ADO.NET (mc 10.8). Cch s dng Data Form Wizard (mc 10.9) v Crystal Report Wizard (mc 10.10).

Nhng mc trong chng ny s dng c s d liu mu Northwind (do Microsoft cp) lm r nhng k thut c tho lun.

1.

Bn cn m mt kt ni n mt c s d liu.

Kt ni c s d liu
To mt i tng kt ni ph hp vi kiu c s d liu m bn cn kt ni; tt c cc i tng kt ni u hin thc giao din System.Data.IDbConnection. Cu hnh i tng kt ni bng cch thit lp thuc tnh ConnectionString ca n. M kt ni bng cch gi phng thc Open ca i tng kt ni.

Bc u tin trong vic truy xut c s d liu l m mt mt kt ni n c s d liu. Giao din IDbConnection m t mt kt ni c s d liu, v mi data-provider cha mt hin thc duy nht. Di y l danh sch cc hin thc IDbConnection cho nm data-provider chun:

System.Data.Odbc.OdbcConnection System.Data.OleDb.OleDbConnection System.Data.OracleClient.OracleConnection System.Data.SqlServerCe.SqlCeConnection System.Data.SqlClient.SqlConnection

Bn cu hnh mt i tng kt ni bng mt chui kt ni. Chui kt ni l mt tp cc cp gi tr tn c phn cch bng du chm phy. Bn c th cung cp mt chui kt ni lm i s trong phng thc khi dng hoc bng cch thit lp thuc tnh ConnectionString ca i tng kt ni trc khi m kt ni. Mi hin thc lp kt ni yu cu bn cung cp nhng thng tin khc nhau trong chui kt ni. Bn hy tham kho ti liu v thuc tnh ConnectionString i vi mi hin thc bit c nhng gi tr m bn c th ch nh. Di y l mt s thit lp: Tn server c s d liu ch Tn c s d liu cn m vo lc u Gi tr timeout ca kt ni C ch connection-pooling (xem mc 10.2) C ch xc thc dng khi kt ni n cc c s d liu c bo mt, bao gm vic cung cp username v password

Mt khi c cu hnh, gi phng thc Open ca i tng kt ni m kt ni n c s d liu. K , bn c th s dng i tng kt ni thc thi nhng cu lnh da vo data-source (s c tho lun trong mc 10.3). Cc thuc tnh ca i tng kt ni cng

393 Chng 10: C s d liu

cho php bn ly thng tin v trng thi ca mt kt ni v nhng thit lp c s dng m kt ni. Khi hon tt mt kt ni, bn nn gi phng thc Close gii phng cc ti nguyn h thng v kt ni c s d liu nm di. IDbConnection c tha k t System.IDisposable, ngha l mi lp kt ni s hin thc phng thc Dispose. Phng thc ny s t ng gi Close, cho nn lnh using l mt cch rt r rng v hiu qu khi s dng i tng kt ni trong m lnh. t c hiu nng ti u trong vic truy cp d liu th phi m kt ni c s d liu cng chm cng tt, v khi hon tt th ngt kt ni cng sm cng tt. Vic ny bo m rng, bn khng truy xut ti kt ni c s d liu trong mt thi gian di v m lnh c c hi cao nht gi ly kt ni. iu ny c bit quan trng nu bn ang s dng connection-pooling. on m di y trnh by cch s dng lp SqlConnection m mt kt ni n SQL Server ang chy trn my cc b c s dng Integrated Windows Security (bo mt tch hp vi Windows). truy xut n mt my t xa, ch cn thay i data-source t localhost thnh tn ca i tng c s d liu.
// To i tng SqlConnection rng. using (SqlConnection con = new SqlConnection()) { // Cu hnh chui kt ni ca i tng SqlConnection. con.ConnectionString = "Data Source = localhost;"+ // i tng SQL Server cc b "Database = Northwind;" + // C s d liu mu Northwind

"Integrated Security=SSPI"; // Integrated Windows Security // M kt ni c s d liu. con.Open(); // Hin th thng tin v kt ni. if (con.State == ConnectionState.Open) { Console.WriteLine("SqlConnection Information:"); Console.WriteLine(" Console.WriteLine(" Console.WriteLine(" Console.WriteLine(" Console.WriteLine(" Console.WriteLine(" Console.WriteLine(" Console.WriteLine(" } else { Console.WriteLine("SqlConnection failed to open."); Connection State = " + con.State); Connection String = " + con.ConnectionString); Database Source = " + con.DataSource); Database = " + con.Database); Server Version = " + con.ServerVersion); Workstation Id = " + con.WorkstationId); Timeout = " + con.ConnectionTimeout); Packet Size = " + con.PacketSize);

394 Chng 10: C s d liu

Console.WriteLine(" }

Connection State = " + con.State);

// Cui khi using, Dispose s gi Close. }

on m di y trnh by mt chui kt ni dng m mt kt ni n c s d liu trn (nu bn ang s dng OLE DB Data Provider thc hin kt ni):
// To mt i tng OleDbConnection rng. using (OleDbConnection con = new OleDbConnection()) { // Cu hnh chui kt ni ca i tng OleDbConnection. con.ConnectionString = "Provider = SQLOLEDB;" + "Data Source = localhost;" + // OLE DB Provider for SQL Server // i tng SQL Server cc b

"Initial Catalog = Northwind;" + // C s d liu mu Northwind "Integrated Security=SSPI"; // M kt ni c s d liu. con.Open(); } // Integrated Windows Security

2.

S dng connection-pooling
Bn mun duy tr mt pool cha cc kt ni ang m ci thin hiu nng v tnh quy m cho mt h thng ln. Cu hnh pool bng cch s dng cc thit lp trong chui kt ni ca i tng kt ni.

Connection-pooling lm gim ng k tng ph lin hp vi vic to v hy kt ni c s d liu. Connection-pooling cng ci thin tnh quy m ca cc gii php bng cch gim s lng kt ni ng thi m mt c s d liu phi duy tra s thng ngi khng sut mt phn ng k thuc thi gian sng ca chng. Vi connection-pooling, thay v to v m mt i tng kt ni mi mi khi cn, bn c th ly kt ni m t pool. Khi bn hon tt vic s dng kt ni, thay v ng n, bn tr n v cho pool v cho php on m khc s dng n. Theo mc nh, SQL Server v Oracle Data Provider cung cp chc nng connection-pooling. Mt pool s hin din i vi mi chui kt ni do bn ch nh khi m mt kt ni mi. Mi khi bn m mt kt ni mi vi chui kt ni c s dng qua, n s c ly t pool

395 Chng 10: C s d liu

hin c. Ch khi bn ch nh mt chui kt ni khc th data-provider mi to mt pool mi. Bn c th iu khin cc c tnh ca pool bng cch s dng cc thit lp trong chui kt ni c m t trong bng 10.2.

Mt khi c to, pool s tn ti cho n khi tin trnh kt thc.

Bng 10.2 Cc thit lp trong chui kt ni dng iu khin Connection Pooling Thit lp M t

Connection Lifetime

Ch nh thi gian ti a (tnh bng giy) m mt kt ni c php sng trong pool trc khi n b ng. Tui ca mt kt ni c kim tra ch khi kt ni c tr v cho pool. Thit lp ny cn thit trong vic thu nh kch thc pool nu pool khng c s dng nhiu v cng bo m tnh cn bng ti c thc hin ti u trong mi trng c s d liu gom t. Gi tr mc nh l 0, c ngha l kt ni tn ti trong thi gian sng ca tin trnh hin thi. Ch c SQL Server Data Provider h tr. Ch nh kt ni c c reset hay khng khi chng c ly t pool. Gi tr True bo m trng thi ca kt ni c reset nhng cn phi thng bo cho c s d liu. Gi tr mc nh l True. Thit lp l False c c kt ni khng ly t pool. Gi tr mc nh l True. Ch nh s lng kt ni ti a cn c trong pool. Cc kt ni c to v thm vo pool khi c yu cu cho n khi t n con s ny. Nu mt yu cu kt ni c thc hin nhng khng cn kt ni trng th li gi s block cho n khi c mt kt ni c hiu lc. Gi tr mc nh l 100. Ch nh s lng kt ni ti thiu cn c trong pool. Lc to pool th s kt ni ny c to v thm vo pool. Trong qu trnh duy tr nh k hoc khi mt kt ni c yu cu, cc kt ni s c thm vo pool bo m s lng kt ni ti thiu c hiu lc. Gi tr mc nh l 0.

Connection Reset

Pooling

Max Pool Size

Min Pool Size

on m di y m t cu hnh ca mt pool: cha ti thiu 5 kt ni v ti a 15 kt ni, kt ni s ht hiu lc sau 10 pht (600 giy) v c reset mi khi mt kt ni c ly t pool.
// Thu ly pooled connection. using (SqlConnection con = new SqlConnection()) {

// Cu hnh chui kt ni ca i tng SqlConnection. con.ConnectionString = "Data Source = localhost;" + "Database = Northwind;" + // i tng SQL Server cc b // C s d liu mu Northwind

"Integrated Security = SSPI;" + // Integrated Windows Security

396 Chng 10: C s d liu

"Min Pool Size = 5;" + "Max Pool Size = 15;" + "Connection Reset = True;" + "Connection Lifetime = 600";

// Kch thc ti thiu ca pool // Kch thc ti a ca pool // Reset kt ni mi khi s dng // Thi gian sng ti a

// M kt ni c s d liu. con.Open();

// Truy xut c s d liu...

// Cui khi using, Dispose s gi Close, // tr kt ni v cho pool ti s dng. }

on m di y m t cch s dng thit lp Pooling c c mt i tng kt ni khng phi ly t pool. iu ny cn thit khi ng dng ca bn s dng mt kt ni n "sng lu".
// Thu ly non-pooled connection. using (SqlConnection con = new SqlConnection()) {

// Cu hnh chui kt ni ca i tng SqlConnection. con.ConnectionString = "Data Source = localhost;" + "Database = Northwind;" + // i tng SQL Server cc b // C s d liu mu Northwind

"Integrated Security = SSPI;" + // Integrated Windows Security "Pooling = False"; // Ch nh non-pooled connection

// M kt ni c s d liu. con.Open();

// Truy xut c s d liu...

// Cui khi using, Dispose s gi Close, // ng non-pooled connection. }

397 Chng 10: C s d liu

ODBC v OLE DB Data Provider cng h tr connection-pooling, nhng chng khng hin thc connection-pooling bn trong cc lp .NET, nn bn khng th cu hnh pool theo cch nh SQL Server hay Oracle Data Provider. Connection-pooling trong ODBC c qun l bi ODBC Driver Manager v c cu hnh bng cng c ODBC Data Source Administrator trong Control Panel. Connection-pooling trong OLE DB c qun l bi hin thc OLE DB nguyn sinh; bn c th lm mt hiu lc pooling bng cch thm thit lp OLE DB Services=-4; vo chui kt ni. SQL Server CE Data Provider khng h tr connectionpooling, v ti mt thi im SQL Server CE ch h tr mt kt ni.

3.

Thc thi cu lnh SQL hoc th tc tn tr


Bn cn thc thi mt cu lnh SQL hoc mt th tc tn tr trn mt c s d liu. To mt i tng cu lnh ph hp vi kiu c s d liu m bn nh s dng; tt c cc i tng cu lnh u hin thc giao din System.Data.IDbCommand. Cu hnh i tng cu lnh bng cch thit lp cc thuc tnh CommandType v CommandText ca n. Thc thi cu lnh bng mt trong cc phng thc ExecuteNonQuery, ExecuteReader, hay ExecuteScalar ty thuc vo kiu cu lnh v kt qu ca n.

Giao din IDbCommand m t mt cu lnh c s d liu, v mi data-provider cha mt hin thc duy nht. Di y l danh sch cc hin thc IDbCommand cho nm data-provider chun:
System.Data.Odbc.OdbcCommand System.Data.OleDb.OleDbCommand System.Data.OracleClient.OracleCommand System.Data.SqlServerCe.SqlCeCommand System.Data.SqlClient.SqlCommand

thc thi mt cu lnh da trn mt c s d liu, bn phi c mt kt ni ang m ( c tho lun trong mc 10.1) v mt i tng cu lnh c cu hnh ph hp vi kiu c s d liu ang truy xut. Bn c th to i tng cu lnh mt cch trc tip bng phng thc khi dng, nhng cch n gin hn l s dng phng thc CreateCommand ca i tng kt ni. Phng thc CreateCommand tr v mt i tng cu lnh (ng kiu dataprovider) v cu hnh n vi cc thng tin c s c ly t kt ni m bn s dng to cu lnh. Trc khi thc thi cu lnh, bn phi cu hnh cc thuc tnh c m t trong bng 10.3
[

Bng 10.3 Cc thuc tnh thng dng ca i tng cu lnh Thuc tnh CommandText M t

Chui cha cu lnh SQL hoc tn ca th tc tn tr. Ni dung ca thuc tnh CommandText phi tng thch vi gi tr bn ch nh trong thuc tnh CommandType.

398 Chng 10: C s d liu

CommandTimeout

S nguyn (int) ch nh s giy i cu lnh tr v trc khi ht thi gian v ngoi l xy ra. Mc nh l 30 giy. Mt gi tr thuc kiu lit k System.Data.CommandType, ch nh kiu cu lnh c m t bi i tng cu lnh. i vi hu ht cc dataprovider, gi tr hp l l StoredProcedure (khi bn mun thc thi mt th tc tn tr), v Text (khi bn mun thc thi mt cu lnh SQL dng text). Nu ang s dng OLE DB Data Provider, bn c th ch nh TableDirect khi mun tr v ton b ni dung ca mt hoc nhiu bng; hy tham kho ti liu .NET Framework SDK bit thm chi tit. Mc nh l Text. i tng IDbConnection, cung cp kt ni n c s d liu m bn s thc thi cu lnh trn . Nu bn to cu lnh bng phng thc IDbConnection.CreateCommand, thuc tnh ny s t ng c thit lp thnh i tng IDbConnection m bn to cu lnh t n. i tng System.Data.IDataParameterCollection, cha tp cc thng s thay th vo cu lnh (xem mc 10.4 bit cch s dng thng s). i tng System.Data.IDbTransaction, m t phin giao dch m cu lnh c a vo (xem ti liu .NET Framework SDK bit thm chi tit v phin giao dch).

CommandType

Connection

Parameters

Transaction

Mt khi bn cu hnh i tng cu lnh th c nhiu cch thc thi n, ty thuc vo bn cht ca cu lnh, kiu d liu do cu lnh tr v, v bn mun x l d liu theo nh dng no. thc thi mt cu lnh nh INSERT, DELETE, hoc CREATE TABLE (khng tr v d liu trong c s d liu), bn hy gi ExecuteNonQuery. i vi cc cu lnh UPDATE, INSERT, v DELETE, phng thc ExecuteNonQuery tr v mt s nguyn cho bit s hng b tc ng bi cu lnh. i vi cc cu lnh khc nh CREATE TABLE, ExecuteNonQuery tr v -1. V d di y s dng UPDATE chnh sa mt bn ghi.
public static void ExecuteNonQueryExample(IDbConnection con) {

// To v cu hnh cu lnh mi. IDbCommand com = con.CreateCommand(); com.CommandType = CommandType.Text; com.CommandText = "UPDATE Employees SET Title = 'Sales Director'" + " WHERE EmployeeId = '5'";

// Thc thi cu lnh v x l kt qu. int result = com.ExecuteNonQuery();

399 Chng 10: C s d liu

if (result == 1) { Console.WriteLine("Employee title updated."); } else { Console.WriteLine("Employee title not updated."); } }

thc thi mt cu lnh tr v mt tp kt qu nh lnh SELECT hoc th tc tn tr, bn hy s dng phng thc ExecuteReader. Phng thc ny tr v mt i tng IDataReader (s c tho lun trong mc 10.5) m qua n bn c th truy xut n d liu kt qu. Hu ht cc data-provider cng cho php bn thc thi nhiu cu lnh SQL trong mt li gi phng thc ExecuteReader; v d trong mc 10.5 s gii thch iu ny v trnh by cch truy xut mi tp kt qu. on m di y s dng phng thc ExecuteReader thc thi th tc tn tr Ten Most Expensive Products (mi sn phm t nht) t c s d liu Northwind v hin th kt qu trong ca s Console:
public static void ExecuteReaderExample(IDbConnection con) {

// To v cu hnh cu lnh mi. IDbCommand com = con.CreateCommand(); com.CommandType = CommandType.StoredProcedure; com.CommandText = "Ten Most Expensive Products";

// Thc thi cu lnh v x l kt qu. using (IDataReader reader = com.ExecuteReader()) {

Console.WriteLine("Price of the Ten Most Expensive Products.");

while (reader.Read()) {

// Hin th chi tit v sn phm. Console.WriteLine(" {0} = {1}",

reader["TenMostExpensiveProducts"], reader["UnitPrice"]); } } }

400 Chng 10: C s d liu

Nu mun thc thi mt truy vn, nhng ch cn gi tr thuc ct u tin ca hng u tin trong d liu kt qu, bn hy s dng phng thc ExecuteScalar. Gi tr tr v l mt tham chiu i tng v bn cn p n v ng kiu. Di y l v d:
public static void ExecuteScalarExample(IDbConnection con) {

// To v cu hnh cu lnh mi. IDbCommand com = con.CreateCommand(); com.CommandType = CommandType.Text; com.CommandText = "SELECT COUNT(*) FROM Employees";

// Thc thi cu lnh v p kiu kt qu. int result = (int)com.ExecuteScalar();

Console.WriteLine("Employee count = " + result); }

Cc hin thc IDbCommand trong Oracle v SQL Data Provider c hin thc cc phng thc thc thi cu lnh b sung. Mc 10.6 s m t cch s dng phng thc ExecuteXmlReader do lp SqlCommand cung cp. Bn hy tham kho ti liu .NET Frameworks SDK bit thm chi tit v cc phng thc b sung ExecuteOracleNonQuery v ExecuteOracleScalar do lp OracleCommand cung cp.

4.

S dng thng s trong cu lnh SQL hoc th tc tn tr


Bn cn thit lp cc i s ca mt th tc tn tr hoc s dng cc thng s trong mt cu lnh SQL ci thin tnh linh hot. To i tng thng s ph hp vi kiu i tng cu lnh m bn d nh thc thi; tt c cc i tng thng s u hin thc giao din System.Data.IDataParameter. Cu hnh kiu d liu, gi tr, v hng ca i tng thng s v thm chng vo tp hp thng s ca i tng cu lnh bng phng thc IDbCommand.Parameters.Add.

Tt c cc i tng cu lnh u h tr vic s dng thng s, do bn c th thc hin cc cng vic sau: Thit lp cc i s ca th tc tn tr Ly cc gi tr tr v t th tc tn tr i cc gi tr thnh cc cu lnh text lc thc thi

Giao din IDataParameter m t mt thng s v mi data-provider cha mt hin thc duy nht. Di y l danh sch cc hin thc IDataParameter cho nm data-provider chun:

401 Chng 10: C s d liu

System.Data.Odbc.OdbcParameter System.Data.OleDb.OleDbParameter System.Data.OracleClient.OracleParameter System.Data.SqlServerCe.SqlCeParameter System.Data.SqlClient.SqlParameter

Cc thuc tnh ca i tng thng s m t nhng th m mt i tng cu lnh cn khi thc thi mt cu lnh da trn data-source. Bng 10.4 m t cc thuc tnh thng c s dng khi cu hnh cho thng s.
Bng 10.4 Cc thuc tnh ca i tng thng s Thuc tnh DbType M t

Gi tr thuc kiu lit k System.Data.DbType, ch nh kiu d liu cha trong thng s. Cc gi tr thng c s dng l String, Int32, DateTime, v Currency. Gi tr thuc kiu lit k System.Data.ParameterDirection, cho bit hng truyn d liu cho thng s. Cc gi tr hp l l Input, InputOutput, Output, v ReturnValue. Gi tr bool, cho bit thng s c chp nhn gi tr null hay khng. Chui cha tn thng s. i tng cha gi tr ca thng s.

Direction IsNullable ParameterName Value

s dng thng s vi mt cu lnh text, bn phi cho bit v tr cn thay th gi tr thng s bn trong cu lnh. ODBC, OLE DB, v SQL Server CE Data Provider h tr cc thng s v tr (positional parameter); v tr ca mi thng s c nhn bit bng du chm hi ( ?). V d, cu lnh di y cho bit c hai v tr cn c thay th bng cc gi tr thng s:
UPDATE Employees SET Title = ? WHERE EmployeeId = ?

SQL Server v Oracle Data Provider h tr cc thng s c t tn (named parameter), cho php bn ch nh mi v tr thng s bng mt tn vi biu tng @ ng trc. Di y l cu lnh tng ng nh trn nhng s dng thng s c t tn:
UPDATE Employees SET Title = @title WHERE EmployeeId = @id

ch nh cc gi tr thng s thay th vo mt cu lnh, bn phi to cc i tng thng s ng kiu v thm chng vo tp hp thng s ca i tng lnh (c th c truy xut thng qua thuc tnh Parameters). Bn c th thm cc thng s c t tn theo th t bt k, nhng bn phi thm cc thng s v tr theo ng th t m chng xut hin trong cu lnh text. Khi bn thc thi cu lnh, gi tr ca mi thng s s c thay th vo trong chui lnh trc khi cu lnh c thc thi da trn data-source. Phng thc ParameterizedCommandExample c trnh by y m t cch s dng thng s trong lnh UPDATE ca SQL Server. Cc i s ca phng thc ParameterizedCommandExample gm mt SqlConnection ang m v hai chui. Gi tr ca hai chui ny c thay th vo trong lnh UPDATE bng thng s. V d sau y trnh by hai

402 Chng 10: C s d liu

cch to i tng thng s: phng thc IDbCommand.CreateParameter, v phng thc IDbCommand.Parameters. Bn cng c th to cc i tng thng s bng phng thc khi dng v cu hnh chng bng cc i s ca phng thc khi dng hoc thng qua vic thit lp cc thuc tnh ca chng.
public static void ParameterizedCommandExample(SqlConnection con, string employeeID, string title) { // To v cu hnh mt cu lnh mi cha 2 thng s c t tn. SqlCommand com = con.CreateCommand(); com.CommandType = CommandType.Text; com.CommandText = "UPDATE Employees SET Title = @title" + " WHERE EmployeeId = @id"; // To i tng SqlParameter cho thng s title. SqlParameter p1 = com.CreateParameter(); p1.ParameterName = "@title"; p1.SqlDbType = SqlDbType.VarChar; p1.Value = title; com.Parameters.Add(p1); // S dng c php tc k thm thng s id. com.Parameters.Add("@id",SqlDbType.Int).Value = employeeID; // Thc thi cu lnh v x l kt qu. int result = com.ExecuteNonQuery(); }

Khi s dng thng s thc thi th tc tn tr, bn phi cung cp cc i tng thng s p ng cho mi i s do th tc tn tr yu cugm c i s input v output. Bn phi thit lp thuc tnh Direction ca mi thng s nh c m t trong bng 10.4 (mc nh l Input). Nu th tc tn tr c gi tr tr v, thng s gi gi tr tr v (vi thuc tnh Direction l ReturnValue) phi l thng s u tin c thm vo tp hp thng s. V d di y s dng thng s thc thi th tc tn tr:
public static void StoredProcedureExample(SqlConnection con, string category, string year) {

// To v cu hnh mt cu lnh mi.

403 Chng 10: C s d liu SqlCommand com = con.CreateCommand(); com.CommandType = CommandType.StoredProcedure; com.CommandText = "SalesByCategory";

// To i tng SqlParameter cho thng s category. com.Parameters.Add("@CategoryName",SqlDbType.NVarChar).Value = category;

// To i tng SqlParameter cho thng s year. com.Parameters.Add("@OrdYear",SqlDbType.NVarChar).Value = year;

// Thc thi cu lnh v x l kt qu. using (IDataReader reader = com.ExecuteReader()) { } }

5.

X l kt qu ca truy vn SQL bng data-reader


Bn cn x l d liu cha trong i tng System.Data.IDataReader (i tng ny c tr v khi bn thc thi phng thc IDbCommand.ExecuteReader c tho lun trong mc 10.3). S dng cc thnh vin ca i tng IDataReader duyt tun t cc hng trong tp kt qu v truy xut cc item d liu cha trong mi hng.

Giao din IDataReader m t mt data-reader, y l mt c ch ch-tin, ch-c (forwardonly, read-only) truy xut kt qu ca truy vn SQL. Mi data-provider cha mt hin thc IDataReader duy nht. Di y l danh sch cc hin thc IDataReader cho nm dataprovider chun:
System.Data.Odbc.OdbcDataReader System.Data.OleDb.OleDbDataReader System.Data.OracleClient.OracleDataReader System.Data.SqlServerCe.SqlCeDataReader System.Data.SqlClient.SqlDataReader

Giao din IDataReader tha k giao din System.Data.IDataRecord. Cc giao din ny khai bo cc chc nng truy xut d liu v cu trc ca d liu c trong tp kt qu. Bng 10.5 m t vi thnh vin thng dng ca giao din IDataReader v IDataRecord. Ngoi cc thnh vin c lit k trong bng 10.5, data-reader cn cung cp mt tp cc phng thc thc hin vic ly d liu c nh kiu t hng hin ti. Mi phng thc sau y nhn vo mt i s nguyn cho bit ch s (nh t 0) ca ct m d liu s c tr

404 Chng 10: C s d liu

v t ct ny: GetBoolean, GetByte, GetBytes, GetChar, GetChars, GetDateTime, GetDecimal, GetDouble, GetFloat, GetGuid, GetInt16, GetInt32, GetInt64, GetString, GetValue, v GetValues.

405 Chng 10: C s d liu Bng 10.5 Cc thnh vin thng dng ca cc lp data-reader Thnh vin Thuc tnh FieldCount IsClosed M t

Ly s ct trong hng hin ti. Tr v true nu IDataReader b ng; false nu n hin ang m. Tr v mt i tng m t gi tr ca ct c th trong hng hin ti. Ct c th c ch nh bng mt ch s nguyn (nh s t 0) hoc mt chui cha tn ct. Bn phi p gi tr tr v thnh kiu ph hp. y l b ch mc (indexer) cho cc lp data-reader. Ly tn ca kiu d liu i vi mt ct c th. Ly i tng System.Type m t kiu d liu ca gi tr cha trong ct c th (ct ny c ch nh bng mt ch s nguynnh s t 0). Ly tn ca ct c th (ct ny c ch nh bng mt ch s nguynnh s t 0). Ly s th t ct (nh s t 0) ng vi mt tn ct c th. Tr v i tng System.Data.DataTable cha siu d liu m t cc ct c trong IDataReader. Tr v true nu gi tr trong ct c th cha gi tr null; nu khng th tr v false. Nu IDataReader cha nhiu tp kt qu v c nhiu lnh c thc thi, NextResult s di chuyn n cc tp kt qu k tip. Theo mc nh, IDataReader c b tr ti tp kt qu u tin. Dch reader n bn ghi k tip. Reader lun bt u ti bn ghi u tin.

Item

Phng thc GetDataTypeName

GetFieldType

GetName GetOrdinal GetSchemaTable

IsDBNull

NextResult

Read

Data-reader Server v Oracle cng cha cc phng thc thc hin vic ly d liu thuc cc kiu d liu c trng ca data-source. V d, SqlDataReader cha cc phng thc nh GetSqlByte, GetSqlDecimal, v GetSqlMoney, v OracleDataReader cha cc phng thc nh GetOracleLob, GetOracleNumber, v GetOracleMonthSpan. Bn hy tham kho ti liu .NET Framework SDK bit thm chi tit. Khi hon tt vi data-reader, bn nn gi phng thc Close c th s dng li kt ni c s d liu. IDataReader tha k System.IDisposable; ngha l mi lp data-reader u hin thc phng thc Dispose. Phng thc ny s t ng gi Close, cho nn lnh using l mt cch rt r rng v hiu qu khi s dng data-reader.

406 Chng 10: C s d liu

V d di y m t cch s dng data-reader x l ni dung ca hai tp kt qu c tr v bi vic thc thi mt truy vn gm hai lnh SELECT. Tp kt qu u tin c lit k v hin th trong ca s Console. Tp kt qu th hai c duyt qua tm v hin th thng tin siu d liu.
using System; using System.Data; using System.Data.SqlClient;

public class DataReaderExample {

public static void Main() {

// To i tng SqlConnection mi. using (SqlConnection con = new SqlConnection()) {

// Cu hnh chui kt ni ca i tng SqlConnection. con.ConnectionString = "Data Source = localhost;" + "Database = Northwind; Integrated Security=SSPI";

// To v cu hnh cu lnh mi. SqlCommand com = con.CreateCommand(); com.CommandType = CommandType.Text; com.CommandText = "SELECT BirthDate,FirstName,LastName " + "FROM Employees ORDER BY BirthDate; " + "SELECT * FROM Employees";

// M kt ni c s d liu v thc thi cu lnh. con.Open();

// Thc thi cu lnh v thu ly SqlReader. using (SqlDataReader reader = com.ExecuteReader()) { // X l tp kt qu u tin // v hin th ni dung ca tp kt qu. Console.WriteLine("Employee Birthdays (By Age).");

407 Chng 10: C s d liu while (reader.Read()) { Console.WriteLine("{0,18:D} - {1} {2}", reader.GetDateTime(0), reader["FirstName"], reader[2]); } // X l tp kt qu th hai v hin th chi tit // v cc ct v cc kiu d liu trong tp kt qu. reader.NextResult(); Console.WriteLine("Employee Table Metadata."); for (int field = 0; field < reader.FieldCount; field++) { Console.WriteLine(" Column Name:{0} Type:{1}", // Ly d liu nh kiu // S dng ch s chui // S dng ch s th t

reader.GetName(field), reader.GetDataTypeName(field)); }

} } Console.ReadLine(); } }

6.

Thu ly ti liu XML t truy vn SQL Server


Bn cn thc thi mt truy vn da trn SQL Server 2000 hoc MSDE v ly cc kt qu dng XML. S dng mnh FOR XML trong truy vn SQL tr v kt qu dng XML. Thc thi cu lnh bng phng thc SqlCommand.ExecuteXmlReader, kt qu tr v l mt i tng System.Xml.XmlReader m thng qua n bn c th truy xut d liu XML.

SQL Server 2000 v MSDE trc tip h tr XML. Bn ch cn thm mnh FOR XML AUTO vo cui truy vn SQL cho bit rng cc kt qu s c tr v dng XML. Theo mc nh, dng XML ny khng phi l mt ti liu XML y . Thay vo , n tr v kt qu ca mi bn ghi theo tng phn t (element) ring r, vi tt c cc trng (field) u l c tnh (attribute). V d, truy vn sau y:
SELECT CustomerID, CompanyName FROM Customers FOR XML AUTO

408 Chng 10: C s d liu

s tr v XML vi cu trc nh sau:


<Customers CustomerID="ALFKI" CompanyName="Alfreds Futterkiste"/> <Customers CustomerID="ANTON" CompanyName="Antonio Moreno Taquera"/> <Customers CustomerID="GOURL" CompanyName="Gourmet Lanchonetes"/>

Bn c th thm t kha ELEMENTS vo cui truy vn nh dng kt qu theo cc phn t lng nhau. V d, truy vn sau y:
SELECT CustomerID, CompanyName FROM Customers FOR XML AUTO, ELEMENTS

s tr v XML vi cu trc nh sau:


<Customers> <CustomerID>ALFKI</CustomerID> <CompanyName>Alfreds Futterkiste</CompanyName> </Customers> <Customers> <CustomerID>ANTON</CustomerID> <CompanyName>Antonio Moreno Taquera</CompanyName> </Customers> <Customers> <CustomerID>GOURL</CustomerID> <CompanyName>Gourmet Lanchonetes</CompanyName> </Customers>

Bn cng c th nh dng kt qu mt cch chi tit hn bng c php FOR XML EXPLICIT. V d, c php ny cho php bn chuyn mt vi trng (field) thnh c tnh (attribute) v cc trng khc thnh phn t (element). Bn hy tham kho mt quyn sch chuyn v SQL Server bit thm chi tit.

V d di y trnh by cch ly kt qu dng XML bng mnh FOR XML v phng thc ExecuteXmlReader. Ch rng, kt ni khng th c s dng cho by k cu lnh no khc trong khi XmlReader ang m. Bn nn x l kt qu cng nhanh cng tt v phi lun ng XmlReader li (Chng 5 c rt nhiu v d trnh by cch s dng lp XmlReader).
using System; using System.Xml; using System.Data; using System.Data.SqlClient; public class XmlQueryExample {

409 Chng 10: C s d liu

public static void Main() { // To i tng SqlConnection mi. using (SqlConnection con = new SqlConnection()) { // Cu hnh chui kt ni ca i tng SqlConnection. con.ConnectionString = "Data Source = localhost;" + "Database = Northwind; Integrated Security=SSPI"; // To v cu hnh cu lnh mi c cha FOR XML AUTO. SqlCommand com = con.CreateCommand(); com.CommandType = CommandType.Text; com.CommandText = "SELECT CustomerID, CompanyName" + " FROM Customers FOR XML AUTO";

// Khai bo XmlReader n c th c tham chiu trong // khi finally (bo m ng n li sau khi s dng). XmlReader reader = null; try { // M kt ni c s d liu. con.Open();

// Thc thi cu lnh v ly XmlReader // truy xut cc kt qu. reader = com.ExecuteXmlReader();

while (reader.Read()) {

Console.Write("Element: " + reader.Name); if (reader.HasAttributes) { for (int i = 0; i < reader.AttributeCount; i++) {

reader.MoveToAttribute(i); Console.Write(" {0}: {1}",

reader.Name, reader.Value); }

410 Chng 10: C s d liu

reader.MoveToElement(); Console.WriteLine(); } } } catch (Exception ex) {

Console.WriteLine(ex.ToString()); } finally {

// Bo m reader ng. if (reader != null) reader.Close(); } }

Console.ReadLine(); } }

Di y l mt vi kt xut t ng dng th nghim ny:


Element: Customers Element: Customers Element: Customers ... CustomerID: ALFKI CustomerID: ANTON CustomerID: GOURL CompanyName: Alfreds Futterkiste CompanyName: Antonio Moreno Taquera CompanyName: Gourmet Lanchonetes

Thay v lm vic vi XmlReader v truy xut d liu mt cch tun t, bn c th c d liu XML vo System.Xml.XmlDocument. Theo cch ny, tt c d liu c ly vo b nh, v kt ni c s d liu c th ng li. K , bn c th tip tc tng tc vi ti liu XML (Chng 5 c rt nhiu v d trnh by cch s dng lp XmlDocument). Di y l on m m bn s cn:
XmlDocument doc = new XmlDocument();

// To i tng SqlConnection mi. using (SqlConnection con = new SqlConnection()) {

// Cu hnh chui kt ni ca i tng SqlConnection. con.ConnectionString = "Data Source = localhost;" + "Database = Northwind; Integrated Security=SSPI";

411 Chng 10: C s d liu

// To v cu hnh cu lnh mi c cha FOR XML AUTO. SqlCommand com = con.CreateCommand(); com.CommandType = CommandType.Text; com.CommandText = "SELECT CustomerID, CompanyName FROM Customers FOR XML AUTO";

// M kt ni c s d liu. con.Open();

// Load d liu XML vo XmlDocument. Cn phi to trc mt // phn t gc c th t mi phn t hng kt qu vo . XmlReader reader = com.ExecuteXmlReader(); doc.LoadXml("<results></results>");

// To XmlNode t phn t XML k tip (c c t reader). XmlNode newNode = doc.ReadNode(reader);

while (newNode != null) {

doc.DocumentElement.AppendChild(newNode); newNode = doc.ReadNode(reader); } }

// X l XmlDocument ngt kt ni. Console.WriteLine(doc.OuterXml);

7.

Nhn bit tt c cc th hin SQL Server 2000 trn mng


Bn cn ly danh sch tt c cc th hin ca SQL Server 2000 c th truy xut c trn mng. S dng COM Interop truy xut chc nng ca Microsoft SQLDMO Object Library. To mt i tng Application ri gi phng thc ListAvailableSQLServers ca n. ListAvailableSQLServers s tr v i tng NameList, l mt tp hp cha tn ca mi i tng SQL Server 2000 c tm thy trn mng.

412 Chng 10: C s d liu

Th vin lp .NET Framework khng c chc nng tm cc SQL Server cha bit; tuy nhin, cng vic ny khng my kh khn vi Microsoft SQLDMO Object Library (c truy xut qua COM Interop). Mc 15.6 s trnh by chi tit cch to mt Interop Assembly thc hin vic truy xut n mt thnh phn COM. Nu ang s dng Microsoft Visual Studio .NET, bn hy thm mt tham chiu n Microsoft SQLDMO Object Library c lit k trong th COM ca hp thoi Add Reference (xem hnh 10.1).

Hnh 10.1 Chn Microsoft SQLDMO Object Library trong hp thoi Add Reference

Nu khng c Visual Studio .NET, bn hy s dng Type Library Importer (tlbimp.exe) to mt Interop Assembly cho file sqldmo.dll (thng nm trong th mc \Program Files\Microsoft SQL Server\80\Tools\Binn).

C mt vn c tm thy trong bn gc SQLDMO Object Library. c th chy c d n ny, bn cn phi ci t SQL Server Service Pack 2 hoc mi hn.

Gi s bn s dng cc thit lp mc nh khi to Interop Assembly cho mnh, trc ht bn cn nhp khng gian tn SQLDMO. ly c danh sch cc SQL Server ang c hiu lc, bn hy to mt i tng SQLDMO.Application v gi phng thc ListAvailableSQLServers ca n. Mi chui trong i tng tr v SQLDMO.NameList l tn ca mt SQL Server ang c hiu lc. Bn c th s dng cc tn ny trong chui kt ni hoc hin th chng trong mt danh

413 Chng 10: C s d liu

sch cho ngi dng chn. V d di y s hin th tn ca tt c cc SQL Server c th truy xut c trong ca s Console:
using System; using SQLDMO;

public class SQLDMOExample {

public static void Main() {

// Thu ly danh sch tt c cc SQL Server c hiu lc. SQLDMO.Application app = new SQLDMO.Application(); SQLDMO.NameList names = app.ListAvailableSQLServers();

// X l tp hp NameList. if (names.Count == 0) { Console.WriteLine("No SQL Servers visible on the network."); } else {

// Hin th danh sch cc SQL Server c hiu lc. Console.WriteLine("SQL Servers visible : " + names.Count);

foreach (string name in names) {

Console.WriteLine(" } }

Name : " + name);

Console.ReadLine(); } }

8.

c file Excel vi ADO.NET


Bn mun thu ly hay chn d liu vo mt ti liu Microsoft Excel bng ADO.NET. S dng ODBC .NET provider kt hp vi Microsoft Excel ODBC Driver.

414 Chng 10: C s d liu

Khng c OLE DB provider hay provider c-qun-l no cho Excel. Tuy nhin, bn c th s dng Microsoft Excel ODBC Driver (c ci t mc nh cng vi Excel) kt hp vi ODBC .NET provider (i km vi .NET Framework 1.1 v Visual Studio .NET 2003). Trong chui kt ni, bn cn ch nh driver m bn ang s dng v tn file Excel. V d di y ch n file test.xls trong th mc startup ca ng dng:
private string ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=" + Application.StartupPath + "\\test.xls;";

Sau khi kt ni, bn c th thc hin hai kiu thao tc: SELECT hay INSERT. Thay v s dng bng, bn chn hay chn da vo tn sheet. Tn sheet phi kt thc bng du la ( $) v c t trong du ngoc vung (nu khng, s sinh ra li c php). nh dng b b qua, v hng u tin t ng c s dng lm cc tn ct. V d di y trch v hin th tt c cc hng trong Sheet1. Hnh 10.2 l file Excel gc. Hnh 10.3 l d liu c trnh by trn form.
private void ExcelView_Load (System.Object sender, System.EventArgs e) { OdbcConnection Con = new OdbcConnection(ConnectionString); OdbcDataAdapter Adapter = new OdbcDataAdapter("SELECT * FROM [Sheet1$]", Con); DataSet Ds = new DataSet();

try { Con.Open(); Adapter.Fill(Ds, "Sheet1"); } catch (Exception Err) { MessageBox.Show(Err.ToString()); } finally { Con.Close(); }

grid.DataSource = Ds.Tables["Sheet1"]; }

415 Chng 10: C s d liu

Hnh 10.2 File Excel gc

Hnh 10.3 D liu Excel trong ng dng .NET

Mt cch tip cn khc l s dng Automation vn hnh Excel thng qua cc giao din COM do n cung cp. Cch ny i hi bn s dng COM Interop v cc i tng ca Excel, v ch lm vic khi Excel c ci t trn my tnh. Tuy vy, n cung cp rt nhiu chc nng cho vic tng tc vi d liu bng tnh.

9.

1. 2. S dng Data Form Wizard.

S dng Data Form Wizard


Bn mun xy dng mt ng dng c s d liu vi y chc nng nhng khng phi vit bt c dng m no.

s dng Data Form Wizard, bn hy thc hin cc bc di y: To mt d n mi, chn mu Empty Project. t tn d n l DataFormWiz. Nhp OK. T thanh trnh n chnh ca IDE, chn Project | Add New Item hin th hp thoi Add New Item (xem hnh 10.4).

416 Chng 10: C s d liu

Hnh 10.4 Hp thoi Add New Item

3.

Chn Data Form Wizard, v gi nguyn tn mc nh DataForm1.cs. Nhp Open thm Data Form Wizard vo d n. Ngay khi bn nhp Open, Data Form Wizard s khi chy. Nhp Next. t tn cho tp d liu mi l dsDataWizard (xem hnh 10.5). Nhp Next.

4.

Hnh 10.5 To mt tp d liu mi vi tn l dsDataWizard

417 Chng 10: C s d liu

5.

To mt kt ni mi bng cch nhp nt New Connection (xem hnh 10.6).

Hnh 10.6 Nhp nt New Connection to kt ni mi

6.

Kt ni n c s d liu Northwind ca SQL Server trong hp thoi Data Link Properties (xem hnh 10.7). Nhp OK.

418 Chng 10: C s d liu

Hnh 10.7 Hp thoi Data Link Properties

419 Chng 10: C s d liu

7.

Chn kt ni va to (xem hnh 10.8). Nhp Next.

Hnh 10.8 Chn kt ni Northwind va mi to

8.

Thm bng Categories v Products vo danh sch Selected Item(s) (xem hnh 10.9). Nhp Next.

420 Chng 10: C s d liu

Hnh 10.9 Thm bng Categories v Products

9.

Chng ta cn t tn cho quan h gia cc bng. G CategoriesProducts vo hp Name. Categories l bng cha vi kha chnh l CategoryID. Products l bng con vi kha ngoi l CategoryID (xem hnh 10.10). Nhp nt > thm quan h ny vo hp Relations bn phi. Nhp Next.

421 Chng 10: C s d liu

Hnh 10.10 To quan h


[

10. Trong ca s k, chng ta chn cc bng v cc trng d liu cn hin th. Gi nguyn tt c cc trng d liu tr trng Picture thuc bng Categories (xem hnh 10.11). Nhp Next.

Hnh 10.11 Chn cc bng v cc trng d liu cn hin th

422 Chng 10: C s d liu

11. Chng ta mun hin th tt c cc bn ghi trong mt khung li, cho nn gi nguyn cc thit lp mc nh (xem hnh 10.12). Nhp Finish kt thc trnh thut s. Sau vi giy, DataForm mi s c kt sinh v hin th (xem hnh 10.13).

Hnh 10.12 Gi nguyn cc thit lp hin th mc nh

423 Chng 10: C s d liu Hnh 10.13 DataForm1.vb

12. Cui cng, bn phi bo cho ng dng bit form Data Form Wizard s l i tng startup. Nhp phi vo d n trong Solution Explorer, v chn Properties. Chn DataFormWiz.DataForm1 t danh sch Startup object. Nhp OK.

Hnh 10.14 Chn DataFormWiz.DataForm1 t danh sch Startup object

Nhn F5 chy chng trnh. Nhp nt Load thit lp kt ni c s d liu v thu ly d liu (xem hnh 10.15). Cun bng Categories, v chn mt mt bn ghi. rng bng Products bn di thay i theo quan h m chng ta xy dng. Bn c th thay i bt c trng d liu no trong bt k bn ghi no. Nu nt Update c nhp vo, tt c nhng thay i c thc hin trong cc khung li d liu s c truyn v ngun d liu Northwind. V bn khng phi vit bt k dng m no!

424 Chng 10: C s d liu

Hnh 10.15 D n Data Form Wizard

10.

S dng Crystal Report Wizard


Bn mun to Crystal Report t mt ngun d liu. Xy dng mt bn bo co bng Crystal Report Wizard. Sau , s dng iu kim CrystalReportViewer trnh by bn bo co ny trn form.

Crystal Reports for Visual Studio .NET l cng c bo co chun dnh cho Visual Studio .NET. Bn c th tip qun nhng bo co ny trn nn Web v Windows, v phn b chng dng dch v Web trn mt server. Mc ny s trnh by tng bc mt cch sinh bo co t mt ngun d liu. Trc tin, bn hy to mt d n ng dng Windows mi vi tn l CrystalExample. c th hin th Crystal Report, bn cn thc hin hai bc chnh: th nht l xy dng mt bn bo co, v th hai l thm mt iu kim CrystalReportViewer vo form trnh by bo co. Vic xy dng mt bn bo co c m t trong 11 bc nh di y: 1. T thanh trnh n chnh ca IDE, chn Project | Add New Item v chn Crystal Report (xem hnh 10.16). Nhp Open.

425 Chng 10: C s d liu

Hnh 10.16 Thm Crystal Report vo d n

2.

Crystal Report Wizard s nhc ta chn kiu bo co cn xy dng (xem hnh 10.17). Gi nguyn bo co chun mc nh, ri nhp OK.

Hnh 10.17 Gi nguyn bo co chun mc nh

3.

Crystal Report Wizard hin th hp thoi Standard Report Expert (xem hnh 10.18). Nhp vo du cng k th mc OLE DB (ADO) trong hp danh sch Available Data Sources.

426 Chng 10: C s d liu

Hnh 10.18 Hp thoi Standard Report Expert

4.

Bn s thy hp thoi OLE DB (ADO) (xem hnh 10.19). Chn Microsoft OLE DB Provider for SQL Server, ri nhp Next.

427 Chng 10: C s d liu Hnh 10.19 Chn Microsoft OLE DB Provider for SQL Server

5.

K tip, chng ta cn bo vi trnh thut s c s d liu no s c kt ni. Chn c s d liu Northwind (xem hnh 10.20). Nhp Next.

Hnh 10.20 Chn c s d liu Northwind

6.

Crystal Report Wizard hin th hp thoi Advanced Information. Chng ta khng cn thay i thng tin no cho v d ny, cho nn nhp Finish. Trong ca s Standard Report Expert, chn bng Categories v Products cho bn bo co ca chng ta (xem hnh 10.21). Nhp Next.

428 Chng 10: C s d liu

Hnh 10.21 Chn bng Categories v Products

7.

Trong th Links ca hp thoi Standard Report Expert, gi nguyn cc mc nh nh hnh 10.22. Bn c th thy trnh thut s nh x kha chnh trong Categories n kha ngoi trong Products. Nhp Next hin th th Fields.

429 Chng 10: C s d liu

Hnh 10.22 Kha chnh trong Categories c nh x n kha ngoi trong Products

8.

T bng Categories, chn CategoryName v Description. T bng Products, chn ProductName, QuantityPerUnit, UnitPrice, v UnitsInStock (xem hnh 10.23). Nhp Next hin th th Group.

Hnh 10.23 Chn cc trng d liu cn hin th

430 Chng 10: C s d liu

9.

Chn CategoryName v ProductName phn nhm (xem hnh 10.24).

Hnh 10.24 Chn CategoryName v ProductName phn nhm

10. Nhp Next nhiu ln chp nhn cc thit lp mc nh cho cc th Total, Top N, Chart, v Select. Khi n th cui cng (th Style), g tiu Category - Product Report (xem hnh 10.25).

431 Chng 10: C s d liu

Hnh 10.25 G tiu Category - Product Report

11. Nhp Finish. File CrystalReport1.rpt (xem hnh 10.26) s c thm vo d n.

Hnh 10.26 Bn bo co c thit k

432 Chng 10: C s d liu

Chng ta xy dng xong bn bo co. Bc th hai l thit lp mt c ch xem bn bo co ny. Bc ny kh d dng. Bn hy ko iu kim CrystalReportViewer t hp cng c vo form mc nh. Nhp phi vo CrystalReportViewer, v chn Properties. Tm thuc tnh Dock v chn Fill (xem hnh 10.27). Ty chn ny s khin CrystalReportViewer lp y vng client ca form. K tip, tm thuc tnh ReportSource, v nhp Browse. Chn file CrystalReport1.rpt m chng ta va xy dng. By gi, bn hy chy chng trnh xem kt qu (xem hnh 10.29).

Hnh 10.27 Tm thuc tnh Dock v chn Fill

433 Chng 10: C s d liu

Hnh 10.28 Form bo co hon chnh

Hnh 10.29 Trnh by bo co vi Crystal Report

Nh bn c th thy, iu kim CrystalReportViewer kh tinh vi. Bn c th s dng cc chc nng c sn phn trang v in bo co. Bn c th nhp nt Export Report (hnh phong b vi mi tn ) xut bo co thnh mt file Adobe Acrobat (.pdf), Microsoft Excel (.xls), Microsoft Word (.doc), hay Rich Text Document (.rtf). Bn cng c th phng to bn bo co hoc tm kim text bn trong bn bo co. Trnh thut s ny ny mnh n ni bn khng phi vit dng m no c. Mt file m ngun bo co, cha mt lp bo co cho bn bo co ny, t ng c sinh ra. Lp bo co ny c lp c s l ReportClass.

434 Chng 10: C s d liu

435

Chng 11:LP TRNH MNG

11

436

437 Chng 11: Lp trnh mng

icrosoft .NET Framework bao gm mt tp cc lp dng lp trnh mng thuc hai khng gian tn: System.Net v System.Net.Sockets. Cc lp ny h tr mi th, t lp trnh da-trn-socket vi TCP/IP cho n download file v trang HTML t web thng qua HTTP. Hai khng gian tn ny cng l nn tng cho hai nn networking cp cao hnRemoting v dch v Web XML. Hai nn ny s c cp chi tit trong chng 12. Chng ny s trnh by cc vn sau:

Ly ti nguyn t web thng qua HTTP (mc 11.1, 11.2, v 11.3). Hin th mt trang web trong mt ng dng da-trn-Windows bng iu kim Web
Browser (mc 11.4).

Ly a ch IP v thng tin DNS v my tnh hin hnh v cc min khc trn World
Wide Web (mc 11.5 v 11.6).

Gi thng ip ping (mc 11.7) v giao tip bng giao thc TCP v UDP (mc 11.8
n 11.13).

Gi v nhn e-mail (mc 11.14 v 11.15).

1.

Download file thng qua HTTP


Bn cn mt cch tht nhanh v n gin download mt file t mt website thng qua HTTP. S dng phng thc tnh DownloadFile ca lp System.Net.WebClient.

.NET Framework cung cp vi c ch dng gi d liu thng qua HTTP. Mt trong nhng cch d nht l s dng lp System.Net.WebClient. N cung cp nhng phng thc mc-cao nh DownloadFile v UploadFile. Cc phng thc ny khng c s h tr ni ti no cho giao tip bt ng b, hay xc thc. Nu cn cc tnh nng ny, bn c th s dng cc chc nng phc tp hn do lp WebRequest v WebResponse cung cp (s c m t trong mc 11.2 v 11.3). Chng trnh v d di y s download file winXP.gif t localhost v lu vo a.
using System; using System.Net; using System.IO; public class Download { private static void Main() { string remoteUri = "http://localhost/winXP.gif"; string localFileName = "winXP.gif"; WebClient client = new WebClient();

438 Chng 11: Lp trnh mng

Console.WriteLine("Downloading file " + remoteUri + " to " + Path.GetFullPath(localFileName)); // Thc hin download. client.DownloadFile(remoteUri, localFileName); Console.WriteLine("Download complete."); Console.ReadLine(); } }

2.

Download v x l file bng stream


Bn cn ly mt file t mt website, nhng khng mun lu trc tip vo a. Thay vo , bn mun x l ngay trong ng dng ca mnh. S dng lp WebRequest to yu cu, lp WebResponse nhn p ng t webserver, v mt s dng reader (StreamReader i vi d liu HTML hay text, hoc BinaryReader i vi d liu nh phn) phn tch p ng .

Download mt file cn bn bc c bn sau: 1. S dng phng thc tnh Create ca lp System.Net.WebRequest ch nh trang bn cn. Phng thc ny tr v mt i tng dn xut t WebRequest, ph thuc vo kiu Uniform Resource Identifier (URI) bn s dng. V d, nu ti nguyn l HTTP (vi cm t http://), n s to ra i tng HttpWebRequest; nu ti nguyn l file (vi cm t file://), n s to ra i tng FileWebRequest. Bn c th thit lp thi gian tr thng qua thuc tnh WebRequest.Timeout. S dng phng thc GetResponse ca i tng WebRequest, phng thc ny tr v mt i tng WebResponse cho trang. Nu yu cu vt qua thi gian tr th ngoi l WebException s b nm. To mt StreamReader hoc mt BinaryReader cho WebResponse. Cng vic cui cng l x l stream ny, chng hn ghi n ra file ri hin th trong ng dng ca bn...

2.

3. 4.

on m di y s ly v hin th mt file nh v ni dung HTML ca mt trang web.


using System; using System.Net; using System.IO; using System.Drawing; using System.Windows.Forms;

439 Chng 11: Lp trnh mng public class DownloadForm : System.Windows.Forms.Form { private System.Windows.Forms.PictureBox picBox; private System.Windows.Forms.TextBox textBox; // (B qua phn m designer.) private void DownloadForm_Load(object sender, System.EventArgs e) { string picUri = "http://localhost/winXP.gif"; string htmlUri = "http://localhost/iishelp/iis/misc/default.asp"; // To yu cu. WebRequest requestPic = WebRequest.Create(picUri); WebRequest requestHtml = WebRequest.Create(htmlUri); // Nhn p ng. Cng vic ny s mt nhiu // thi gian, c bit khi file cn ly qu ln. WebResponse responsePic = requestPic.GetResponse(); WebResponse responseHtml = requestHtml.GetResponse();

// c response stream. Image downloadedImage = Image.FromStream(responsePic.GetResponseStream()); StreamReader r = new StreamReader(responseHtml.GetResponseStream()); string htmlContent = r.ReadToEnd(); r.Close();

// Hin th nh. picBox.Image = downloadedImage;

// Hin th ni dung dng text ca trang HTML. textBox.Text = htmlContent; } }

440 Chng 11: Lp trnh mng

Hnh 11.1 Download ni dung ca mt trang web

download file ln mt cch hiu qu, bn c th s dng k thut bt ng b c m t trong chng 4. Bn cng c th s dng phng thc WebRequest.BeginGetResponse, phng thc ny khng chn m lnh ca bn v s gi th tc callback khi nhn c p ng.

3.

Ly trang HTML t mt website c yu cu xc thc


Bn cn thu ly mt file t mt website, nhng website yu cu mt s thng tin xc thc. S dng lp WebRequest v WebResponse c m t trong mc 11.2. Tuy nhin, trc khi gi yu cu, bn phi cu hnh thuc tnh WebRequest.Credentials vi cc thng tin xc thc.

Mt s website yu cu thng tin xc thc t ngi dng. Khi kt ni thng qua trnh duyt, thng tin ny c th c cung cp mt cch trong sut (v d, mt intranet-site cc b c s dng Integrated Windows authentication), hoc trnh duyt c th yu cu thng tin ny thng qua mt hp thoi ng nhp. Khi truy xut mt trang web bng lp trnh th m lnh ca bn cn phi cung cp cc thng tin ny.

441 Chng 11: Lp trnh mng

Cch tip cn m bn s dng ty thuc vo kiu xc thc m website s dng. Nu website s dng Basic authentication hay Digest authentication, bn cn gi kt hp username v password, bng cch to mt i tng System.Net. NetworkCredential v gn n vo thuc tnh WebRequest.Credentials. Nu website s dng Integrated Windows authentication, bn thc hin tng t nh trn. Bn c th ly cc thng tin ng nhp ca ngi dng hin hnh t i tng System.Net.CredentialCache. Nu website i hi chng ch, bn cn np chng ch t mt file bng lp System.Security.Cryptography.X509Certificates.X509Certificate, v thm n vo tp hp HttpWebRequest.ClientCertificates.

Di y l on m v d cho c ba cch tip cn trn:


using System; using System.Net; using System.Security.Cryptography.X509Certificates;

public class DownloadWithAuthentication {

private static void Main() {

string uriBasic, uriIntegrated, uriCertificate;

// Xc thc username v password vi Basic authentication. WebRequest requestA = WebRequest.Create(uriBasic); requestA.Credentials = new NetworkCredential("userName", "password"); requestA.PreAuthenticate = true;

// ng nhp ngi dng hin hnh vi // Integrated Windows authentication. WebRequest requestB = WebRequest.Create(uriIntegrated); requestB.Credentials = CredentialCache.DefaultCredentials; requestB.PreAuthenticate = true;

// Xc thc ngi dng bng ch k in t. HttpWebRequest requestC = (HttpWebRequest) WebRequest.Create(uriCertificate); X509Certificate cert = X509Certificate.CreateFromCertFile(@"c:\user.cer");

442 Chng 11: Lp trnh mng

requestC.ClientCertificates.Add(cert);

// (By gi bt u ly v x l p ng.) } }

Nh rng, nu mun s dng kiu xc thc chng ch, bn phi np chng ch t file. Khng c cch no to i tng X509Certificate t mt chng ch trong kho chng ch ca my tnh.

4.

Hin th trang web trong ng dng da-trn-Windows


Bn cn hin th mt trang HTML (hay bt k kiu ti liu no m Microsoft Internet Explorer h tr) trong mt ng dng da-trn-Windows. S dng iu kim ActiveX Web Browser (i cng vi Internet Explorer).

.NET Framework khng cung cp iu kim no dng dch ni dung HTML. Tuy nhin, chc nng ny li rt cn thit cho vic hin th mt ni dung HTML cc b (k c nhng ti liu HTML ng gi theo nh dng file tr gip ca Windows) cng nh cc thng tin no t web. hin th mt trang HTML, bn c th thm mt ca s Internet Explorer vo ng dng da-trn-Windows. Ca s ny khng ch h tr HTML, m cn h tr JavaScript, Microsoft Visual Basic Scripting Edition (VBScript), ActiveX control, v rt nhiu plug-in khc, ty thuc vo cu hnh h thng ca bn (c th gm c Microsoft Word, Microsoft Excel, v Adobe Acrobat Reader). Bn cn c th s dng iu kim Web Browser duyt mt th mc trong a cc b, hay hin th cc file trn mt FTP (File Transfer Protocol) site. thm Web Browser vo mt d n trong Microsoft Visual Studio .NET, bn hy nhp phi vo hp cng c v chn Add/Remove Items. Sau , chn th COM Components, v chn Microsoft Web Browser (xem hnh 11.2). Theo , iu kim Microsoft Web Browser s c thm vo hp cng c. Khi bn th iu kim ny vo form, cc Interop Assembly cn thit s c to ra v thm vo d n ca bn.

443 Chng 11: Lp trnh mng

Hnh 11.2 Chn Microsoft Web Browser trong hp thoi Customize Toolbox

Nu khng s dng Visual Studio .NET, bn cn to ra mt v bc bng tin ch Type Library Importer (Tlbimp.exe), s c gii thch trong mc 15.6. Khi s dng iu kim Web Browser, bn thng cn cc phng thc sau:
Navigate (v Navigate2) Chuyn trang sang URL do bn ch nh. GoBack v GoForward Li sang cc trang trong danh sch history. GoHome Li sang trang mc nh (home) c thit lp trn my tnh hin hnh, v GoSearch Hin th trang tm kim.

Ngi dng c th vo mt trang mi bng cch nhp vo mt lin kt no trong trang hin hnh (nu n tn ti). Bn c th ly URL hin hnh t thuc tnh LocationURL v xc nh iu kim vn cn x l trang hay khng bng cch kim tra thuc tnh Busy. Ngoi ra, bn c th phn ng vi nhiu s kin khc nhau.

444 Chng 11: Lp trnh mng

Hnh 11.3 S dng iu kim Web Browser using System; using System.Drawing; using System.Windows.Forms;

public class WebBrowser : System.Windows.Forms.Form {

private AxSHDocVw.AxWebBrowser explorer; private System.Windows.Forms.Button cmdBack; private System.Windows.Forms.Button cmdHome; private System.Windows.Forms.Button cmdForward;

// (B qua phn m designer.)

445 Chng 11: Lp trnh mng private void WebBrowser_Load(object sender, System.EventArgs e) {

object nullObject = null; object uri = "http://www.dvpub.com.vn"; explorer.Navigate2(ref uri, ref nullObject, ref nullObject, ref nullObject, ref nullObject); }

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

explorer.GoHome(); }

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

try { explorer.GoForward(); } catch { MessageBox.Show("Already on last page."); } }

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

try { explorer.GoBack(); } catch { MessageBox.Show("Already on first page."); } } }

Hu ht cc phng thc ca iu kim Web Browser u yu cu mt vi thng s. V cc phng thc ny khng c np chng, v v C# khng h tr tham s ty chn, nn bn phi cung cp gi tr cho mi tham s. Bn khng th s dng tham chiu null c, v chng l cc thng s ref. Thay vo , bn hy to ra mt bin i tng cha tham chiu null, sau cung cp n cho cc thng s m bn khng cn s dng. K thut ny s c m t chi tit trong mc 15.8.

446 Chng 11: Lp trnh mng

5.

Ly a ch IP ca my tnh hin hnh


Bn cn ly a ch IP ca my tnh hin hnh, c th l s dng sau ny trong m lnh networking. S dng phng thc GetHostName v GetHostByName ca lp System.Net.Dns.

Lp Dns cung cp cc dch v phn gii tn min. Bn c th gi phng thc GetHostName ly v tn host ca my tnh hin hnh. Sau , bn c th dch tn ny sang a ch IP bng phng thc GetHostByName. y l mt v d:
using System; using System.Net; public class GetIPAddress { private static void Main() {

// Ly tn host ca my tnh hin hnh. string hostName = Dns.GetHostName();

// Ly a ch IP trng khp u tin. string ipAddress = Dns.GetHostByName(hostName).AddressList[0].ToString(); Console.WriteLine("Host name: " + hostName); Console.WriteLine("IP address: " + ipAddress); Console.ReadLine(); } }

Phng thc GetHostByName tr v danh sch cc a ch IP c hiu lc. Trong rt nhiu trng hp, danh sch ny ch c mt phn t.

Khi s dng a ch IP trong giao tip mng, bn c th s dng a ch 127.0.0.1 ch n my tnh hin hnh thay cho a ch IP thc t ca n.

447 Chng 11: Lp trnh mng

6.

Phn gii tn min thnh a ch IP


Bn mun xc nh a ch IP ca mt my tnh da vo tn min ca n bng cch thc hin mt truy vn Domain Name System (DNS) . S dng phng thc GetHostByName ca lp System.Net.Dns vi i s l tn min.

Trn web, cc a ch IP c th truy xut cng khai thng c nh x n tn min d nh hn. V d, a ch 207.171.185.16 c nh x n tn min www.amazon.com. xc nh a ch IP khi c tn min, my tnh cn lin lc vi mt DNS-server. Qu trnh phn gii tn min c thc hin mt cch trong sut khi bn s dng lp System.Net.Dns. Lp ny cho php ly a ch IP ca mt tn min bng phng thc GetHostByName. Di y l on m trnh by cch ly danh sch cc a ch IP c nh x n tn min www.microsoft.com.
using System; using System.Net;

public class ResolveIP {

private static void Main() {

foreach (IPAddress ip in Dns.GetHostByName("www.microsoft.com").AddressList) {

Console.Write(ip.AddressFamily.ToString() + ": "); Console.WriteLine(ip.ToString()); }

Console.ReadLine(); } }

Khi chy on m trn, bn s thy kt xut nh sau:


InterNetwork: 207.46.249.222 InterNetwork: 207.46.134.222 InterNetwork: 207.46.249.27 InterNetwork: 207.46.134.155 InterNetwork: 207.46.249.190

448 Chng 11: Lp trnh mng

7.

Ping mt a ch IP
Bn mun kim tra mt my tnh c online hay khng v o thi gian p ng (response time) ca n. Gi mt thng ip ping. Thng ip ny c gi bng giao thc Internet Control Message Protocol (ICMP) vi mt raw-socket.

Mt thng ip ping giao tip vi mt thit b ti mt a ch IP c th, gi mt thng ip th nghim, v yu cu thit b ny p ng li. o thi gian kt ni gia hai my tnh, bn c th o thi gian cho mt p ng. Mc d thng ip ping n gin hn cc kiu giao tip khc, nhng hin thc mt tin ch ping trong .NET i hi mt lng ln m lnh networking mc-thp v phc tp. Th vin lp .NET khng c sn gii php nothay vo , bn phi s dng raw-socket v mt s m lnh cc k di. Tuy nhin, c t nht mt nh pht trin gii quyt c vn ping. Di y l m lnh do Lance Olson, mt nh pht trin ca Microsoft, cung cp. M lnh ny cho php ping mt host bng tn hay a ch IP v o lng mili-giy cho mt p ng.
using System; using System.Net; using System.Net.Sockets;

public class Pinger {

public static int GetPingTime(string host) {

int dwStart = 0, dwStop = 0;

// To mt raw-socket. Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);

// Ly IPEndPoint ca server, v chuyn n thnh EndPoint. IPHostEntry serverHE = Dns.GetHostByName(host); IPEndPoint ipepServer = new IPEndPoint(serverHE.AddressList[0], 0); EndPoint epServer = (ipepServer);

449 Chng 11: Lp trnh mng // Thit lp endpoint cho my client. IPHostEntry fromHE = Dns.GetHostByName(Dns.GetHostName()); IPEndPoint ipEndPointFrom = new IPEndPoint(fromHE.AddressList[0], 0); EndPoint EndPointFrom = (ipEndPointFrom);

// To packet. int PacketSize = 0; IcmpPacket packet = new IcmpPacket(); for (int j = 0; j < 1; j++) { packet.Type = ICMP_ECHO; packet.SubCode = 0; packet.CheckSum = UInt16.Parse("0"); packet.Identifier = UInt16.Parse("45"); = UInt16.Parse("0");

packet.SequenceNumber

int PingData = 32; packet.Data = new Byte[PingData];

for (int i = 0; i < PingData; i++) packet.Data[i] = (byte)'#';

PacketSize = PingData + 8;

Byte [] icmp_pkt_buffer = new Byte [PacketSize]; int index = 0; index = Serialize(packet, icmp_pkt_buffer, PacketSize, PingData);

// Tnh checksum cho packet. double double_length = Convert.ToDouble(index); double dtemp = Math.Ceiling(double_length / 2); int cksum_buffer_length = Convert.ToInt32(dtemp); UInt16[] cksum_buffer = new UInt16[cksum_buffer_length]; int icmp_header_buffer_index = 0;

for (int i = 0; i < cksum_buffer_length; i++) {

450 Chng 11: Lp trnh mng

cksum_buffer[i] = BitConverter.ToUInt16(icmp_pkt_buffer, icmp_header_buffer_index); icmp_header_buffer_index += 2; }

UInt16 u_cksum = checksum(cksum_buffer, cksum_buffer_length); packet.CheckSum = u_cksum;

// Tun t ha packet. byte[] sendbuf = new byte[PacketSize]; index = Serialize(packet, sendbuf, PacketSize, PingData);

// Bt u tnh gi. dwStart = System.Environment.TickCount; socket.SendTo(sendbuf, PacketSize, 0, epServer);

// Nhn p ng, v ngng tnh gi. byte[] ReceiveBuffer = new byte[256]; socket.ReceiveFrom(ReceiveBuffer, 256, 0, ref EndPointFrom); dwStop = System.Environment.TickCount - dwStart; }

// Dn dp v tr v thi gian "ping" (tnh theo giy). socket.Close(); return (int)dwStop; }

private static int Serialize(IcmpPacket packet, byte[] buffer, int packetSize, int pingData) {

// (B qua phng thc private dng tun t ha packet.) }

private static UInt16 checksum(UInt16[] buffer, int size) {

451 Chng 11: Lp trnh mng // (B qua phng thc private dng tnh checksum.) } }

public class IcmpPacket { public byte Type; public byte SubCode; public UInt16 CheckSum; public UInt16 Identifier; public UInt16 SequenceNumber; public byte[] Data; }

Bn c th s dng phng thc tnh Pinger.GetPingTime vi mt a ch IP hay mt tn min. Phng thc GetPingTime tr v lng mili-giy tri qua trc khi mt p ng c tip nhn. Di y l on m th nghim trn ba website:
public class PingTest {

private static void Main() {

Console.WriteLine("Milliseconds to contact www.yahoo.com:" + Pinger.GetPingTime("www.yahoo.com").ToString()); Console.WriteLine("Milliseconds to contact www.seti.org:" + Pinger.GetPingTime("www.seti.org").ToString()); Console.WriteLine("Milliseconds to contact the local computer:" + Pinger.GetPingTime("127.0.0.1").ToString());

Console.ReadLine(); } }

Th nghim ping cho php bn xc minh cc my tnh khc c online hay khng. N cng c th hu ch khi ng dng ca bn cn nh gi nhng my tnh khc nhau ( xa) nhng cho cng ni dung xc nh my no c thi gian giao tip mng thp nht.

Mt yu cu ping c th khng thnh cng nu b firewall ngn li. V d, nhiu site b qua yu cu ping v s b sa vo mt lung ping cng mt lc s lm cn tr server (thc cht l mt tn cng t chi dch v).

452 Chng 11: Lp trnh mng

8.

Giao tip bng TCP


Bn cn gi d liu gia hai my tnh trn mt network bng kt ni TCP/IP. Mt my tnh (server) phi lng nghe bng lp System.Net.Sockets.TcpListener. Mi khi mt kt ni c thit lp, c hai my tnh u c th giao tip bng lp System.Net.Sockets.TcpListener.

TCP l mt giao thc ng tin cy da-trn-kt-ni, cho php hai my tnh giao tip thng qua mt network. to mt kt ni TCP, mt my tnh phi ng vai tr l server v bt u lng nghe trn mt endpoint c th (endpoint c nh ngha l mt a ch IP, cho bit my tnh v s port). Mt my tnh khc phi ng vai tr l client v gi mt yu cu kt ni n endpoint m my tnh th nht ang lng nghe trn . Mt khi kt ni c thit lp, hai my tnh c th trao i cc thng ip vi nhau. C hai my tnh ch n gin c/ghi t mt System.Net.Sockets.NetworkStream.

Mc d mt kt ni TCP lun cn c mt server v mt client, nhng khng l do g mt ng dng khng th l c hai. V d, trong mt ng dng peer-to-peer, mt tiu trnh c s dng lng nghe cc yu cu n (ng vai tr l mt server) trong khi mt tiu trnh khc c s dng khi to cc kt ni i (ng vai tr l mt client). Trong v d i km mc ny, client v server l cc ng dng ring r v c t trong cc th mc con ring.

Mt khi kt ni TCP c thit lp, hai my tnh c th gi bt k kiu d liu no bng cch ghi d liu ra NetworkStream. Tuy nhin, tng hay l bt u thit k mt ng dng mng bng cch nh ngha giao thc mc-ng-dng m client v server s s dng giao tip. Giao thc ny cha cc hng m t cc lnh c php, bo m m lnh ca ng dng khng cha cc chui giao tip c vit cng.
namespace SharedComponent {

public class ServerMessages { public const string AcknowledgeOK = "OK"; public const string AcknowledgeCancel = "Cancel"; public const string Disconnect = "Bye"; }

public class ClientMessages { public const string RequestConnect = "Hello"; public const string Disconnect = "Bye"; } }

453 Chng 11: Lp trnh mng

Trong v d ny, bng t vng c nh ngha sn ch l c bn. Bn c th thm nhiu hng hn na ty thuc vo kiu ng dng. V d, trong mt ng dng truyn file, client c th gi mt thng ip yu cu mt file. Sau , server c th p li bng mt acknowledgment (ACK) v tr v cc chi tit ca file (kch thc file chng hn). Nhng hng ny s c bin dch thnh mt Class Library Assembly ring, v c client v server u phi tham chiu n assembly ny. on m di y l mt khun dng cho mt TCP-server c bn. N lng nghe trn mt port c nh, nhn kt ni n u tin v ri i client yu cu ngng kt ni. Ti thi im ny, server c th gi phng thc TcpListener.AcceptTcpClient ln na i client k tip. Nhng thay vo , n s ng li.
using System; using System.Net; using System.Net.Sockets; using System.IO; using SharedComponent;

public class TcpServerTest {

private static void Main() {

// To listener trn port 8000. TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8000);

Console.WriteLine("About to initialize port."); listener.Start(); Console.WriteLine("Listening for a connection...");

try {

// i yu cu kt ni, v tr v TcpClient. TcpClient client = listener.AcceptTcpClient(); Console.WriteLine("Connection accepted.");

// Thu ly network stream. NetworkStream stream = client.GetStream();

// To BinaryWriter ghi ra stream. BinaryWriter w = new BinaryWriter(stream);

454 Chng 11: Lp trnh mng

// To BinaryReader c t stream. BinaryReader r = new BinaryReader(stream);

if (r.ReadString() == ClientMessages.RequestConnect) {

w.Write(ServerMessages.AcknowledgeOK); Console.WriteLine("Connection completed.");

while (r.ReadString() != ClientMessages.Disconnect) {}

Console.WriteLine(); Console.WriteLine("Disconnect request received."); w.Write(ServerMessages.Disconnect); } else { Console.WriteLine("Could not complete connection."); }

// ng socket. client.Close(); Console.WriteLine("Connection closed.");

// ng socket nm di (ngng lng nghe yu cu mi). listener.Stop(); Console.WriteLine("Listener stopped."); } catch (Exception err) { Console.WriteLine(err.ToString()); }

Console.ReadLine(); } }

on m di y l mt khun dng cho mt TCP-client c bn. N tip xc vi server ti a ch IP v port c ch nh. Trong v d ny, a ch loopback ( 127.0.0.1ch n my tnh hin hnh) c s dng. Nh rng kt ni TCP yu cn hai port: mt ti server v mt

455 Chng 11: Lp trnh mng

ti client. Tuy nhin, ch cn ch nh port ti server, cn port ti client c th c chn ng lc thc thi t cc port c sn.
using System; using System.Net; using System.Net.Sockets; using System.IO; using SharedComponent; public class TcpClientTest { private static void Main() { TcpClient client = new TcpClient(); try {

Console.WriteLine("Attempting to connect to the server " + "on port 8000."); client.Connect(IPAddress.Parse("127.0.0.1"), 8000); Console.WriteLine("Connection established.");

// Thu ly network stream. NetworkStream stream = client.GetStream();

// To BinaryWriter ghi ra stream. BinaryWriter w = new BinaryWriter(stream);

// To BinaryReader c t stream. BinaryReader r = new BinaryReader(stream);

w.Write(ClientMessages.RequestConnect);

if (r.ReadString() == ServerMessages.AcknowledgeOK) {

Console.WriteLine("Connected."); Console.WriteLine("Press Enter to disconnect."); Console.ReadLine(); Console.WriteLine("Disconnecting...");

456 Chng 11: Lp trnh mng

w.Write(ClientMessages.Disconnect); } else { Console.WriteLine("Connection not completed."); }

// ng connection socket. client.Close(); Console.WriteLine("Port closed."); } catch (Exception err) { Console.WriteLine(err.ToString()); }

Console.ReadLine(); } }

Di y l transcript pha server:


About to initialize port. Listening for a connection... Connection accepted. Connection completed.

Disconnect request received. Connection closed. Listener stopped.

V di y l transcript pha client:


Attempting to connect to the server on port 8000. Connection established. Connected. Press Enter to disconnect.

Disconnecting... Port closed.

457 Chng 11: Lp trnh mng

9.

Ly a ch IP ca client t kt ni socket
ng dng server cn xc nh a ch IP ca client sau khi n chp nhn mt kt ni. S dng phng thc AcceptSocket ca lp TcpListener ly lp mc-thp l System.Net.Sockets.Socket thay v l TcpClient. S dng thuc tnh Socket.RemoteEndPoint ly a ch IP ca client.

Lp TcpClient khng cho php bn thu ly socket nm di hay bt c thng tin no v port v a ch IP ca client. Lp ny c cung cp thuc tnh Socket, nhng thuc tnh ny l c-bo-v (protected) v do khng th truy xut c t cc lp phi dn xut. truy xut socket nm di, bn c hai ty chn: To mt lp ty bin dn xut t TcpClient. Lp ny c th truy xut thuc tnh cbo-v Socket v trng n ra thng qua mt thuc tnh mi. Sau , bn phi s dng lp ty bin ny thay cho TcpClient. B qua lp TcpClient bng cch s dng phng thc TcpListener.AcceptSocket. Bn vn c th s dng cc lp mc-cao l BinaryReader v BinaryWriter c/ghi d liu, nhng bn cn phi to NetworkStream trc (s dng socket).

Mc ny s dng cch th hai. Di y l phin bn sa i ca server trong mc 11.8:


using System; using System.Net; using System.Net.Sockets; using System.IO; using SharedComponent;

public class TcpServerTest {

private static void Main() {

// To listener trn port 8000. TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8000);

Console.WriteLine("About to initialize port."); listener.Start(); Console.WriteLine("Listening for a connection...");

try {

458 Chng 11: Lp trnh mng

// i yu cu kt ni, v tr v mt Socket. Socket socket = listener.AcceptSocket(); Console.WriteLine("Connection accepted."); // To network stream. NetworkStream stream = new NetworkStream(socket); // To BinaryWriter ghi ra stream. BinaryWriter w = new BinaryWriter(stream); // To BinaryReader c t stream. BinaryReader r = new BinaryReader(stream); if (r.ReadString() == ClientMessages.RequestConnect) { w.Write(ServerMessages.AcknowledgeOK); Console.WriteLine("Connection completed."); // Ly a ch IP ca client. Console.WriteLine("The client is from IP address: " + ((IPEndPoint)socket.RemoteEndPoint).Address.ToString()); Console.Write("The client uses local port: " + ((IPEndPoint)socket.RemoteEndPoint).Port.ToString()); while (r.ReadString() != ClientMessages.Disconnect) {} Console.WriteLine(); Console.WriteLine("Disconnect request received."); w.Write(ServerMessages.Disconnect); } else { Console.WriteLine("Could not complete connection."); } // ng socket. socket.Close();

459 Chng 11: Lp trnh mng Console.WriteLine("Connection closed."); // ng socket nm di (ngng lng nghe yu cu mi). listener.Stop(); Console.WriteLine("Listener stopped."); } catch (Exception err) { Console.WriteLine(err.ToString()); } Console.ReadLine(); } }

10.

Thit lp cc ty chn socket


Bn cn thit lp cc ty chn socket mc-thp, chng hn cc ty chn cho bit send timeout v receive timeout. S dng phng thc Socket.SetSocketOption. Bn c th thit lp cc thuc tnh ca socket c s dng lng nghe cc yu cu hoc cc thuc tnh ca socket c s dng cho mt phin client c th.

Bn c th s dng phng thc Socket.SetSocketOption thit lp mt s thuc tnh socket mc-thp. Khi gi phng thc ny, bn cn cung cp ba i s sau y: Mt gi tr thuc kiu lit k SocketOptionLevel, cho bit kiu socket m thit lp ny s p dng cho n (bao gm IP, IPv6, Socket, Tcp, Udp). Mt gi tr thuc kiu lit k SocketOptionName, cho bit thit lp socket m bn mun thay i (xem danh sch cc gi tr ca SocketOptionName trong ti liu .NET Framework). Mt gi tr m t thit lp mi. Gi tr ny thng l mt s nguyn, nhng cng c th l mt mng byte hay mt kiu i tng.

V d di y s thit lp send-timeout ca socket:


// Thao tc gi s ht hiu lc nu khng nhn c // thng tin xc nhn trong vng 1000 mili-giy. socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 1000);

Ch rng, truy xut socket m t mt kt ni client/server, bn phi s dng phng thc TcpListener.AcceptSocket thay cho phng thc TcpListener.AcceptTcpClient ( c tho lun trong mc 11.9). Bn cng c th thit lp cc ty chn cho socket c s dng bi TcpListener theo di cc yu cu kt ni. Tuy nhin, bn phi thc hin thm mt vi bc na. Lp TcpListener

460 Chng 11: Lp trnh mng

cung cp thuc tnh Socket, nhng kh nng truy xut ca n l protected, ngha l bn khng th truy xut n mt cch trc tip. Thay vo , bn phi dn xut mt lp mi t TcpListener:
public class CustomTcpListener : TcpListener { public Socket Socket { get {return base.Server;} } public CustomTcpListener(IPAddress ip, int port) : base(ip, port) {} }

By gi, bn c th s dng lp ny khi to mt TcpListener. V d di y s dng cch tip cn ny thit lp mt ty chn socket:
CustomTcpListener listener = new CustomTcpListener(IPAddress.Parse("127.0.0.1"), 8000); listener.Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000); // (S dng CustomTcpListener ging nh s dng TcpListener.)

11.

To mt TCP-server h-tr-a-tiu-trnh
Bn mun to mt TCP-server c th cng lc x l nhiu TCP-client. S dng phng thc AcceptTcpClient ca lp TcpListener. Mi khi c mt client mi kt ni n, khi chy mt tiu trnh mi x l yu cu v gi TcpListener.AcceptTcpClient ln na.

Mt endpoint TCP (a ch IP v port) c th phc v nhiu kt ni. Thc ra, h iu hnh m ng phn ln cng vic gim bn. Nhng g bn cn lm l to mt i tng th (worker object) trn server x l mi kt ni trong mt tiu trnh ring. Xt lp TCP-client v TCP-server c trnh by trong mc 11.8. Bn c th d dng chuyn server ny thnh mt server h-tr-a-tiu-trnh thc hin nhiu kt ni cng mt lc. Trc ht, to mt lp tng tc vi mt client:
using System; using System.Net; using System.Net.Sockets; using System.IO;

461 Chng 11: Lp trnh mng using System.Threading; using SharedComponent;

public class ClientHandler {

private TcpClient client; private string ID;

public ClientHandler(TcpClient client, string ID) {

this.client = client; this.ID = ID; }

public void Start() {

// Thu ly network stream. NetworkStream stream = client.GetStream();

// To BinaryWriter ghi ra stream. BinaryWriter w = new BinaryWriter(stream);

// To BinaryReader c t stream. BinaryReader r = new BinaryReader(stream);

if (r.ReadString() == ClientMessages.RequestConnect) {

w.Write(ServerMessages.AcknowledgeOK); Console.WriteLine(ID + ": Connection completed."); while (r.ReadString() != ClientMessages.Disconnect) {}

Console.WriteLine(ID + ": Disconnect request received."); w.Write(ServerMessages.Disconnect);

}else { Console.WriteLine(ID + ": Could not complete connection."); }

462 Chng 11: Lp trnh mng

// ng socket. client.Close(); Console.WriteLine(ID + ": Client connection closed.");

Console.ReadLine(); } }

K tip, thay i m lnh ca server sao cho n lp lin tc, to ra cc th hin ClientHandler mi khi cn v chy chng trong cc tiu trnh mi. Di y l m lnh c sa i:
public class TcpServerTest { private static void Main() { TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8000); Console.WriteLine("Server: About to initialize port."); listener.Start(); Console.WriteLine("Server: Listening for a connection..."); int clientNum = 0; while (true) { try { // i yu cu kt ni, v tr v mt TcpClient. TcpClient client = listener.AcceptTcpClient(); Console.WriteLine("Server: Connection accepted."); // To mt i tng mi x l kt ni ny. clientNum++; ClientHandler handler = new ClientHandler(client, "Client " + clientNum.ToString()); // Khi ng i tng ny lm vic trong

463 Chng 11: Lp trnh mng // mt tiu trnh khc. Thread handlerThread = new Thread(new ThreadStart(handler.Start)); handlerThread.IsBackground = true; handlerThread.Start(); // (Bn cng c th thm Handler v HandlerThread vo // mt tp hp theo di cc phin client.)

}catch (Exception err) { Console.WriteLine(err.ToString()); } } } }

Di y l transcript pha server ca mt phin lm vic vi hai client:


Server: About to initialize port. Server: Listening for a connection... Server: Connection accepted. Client 1: Connection completed. Server: Connection accepted. Client 2: Connection completed. Client 2: Disconnect request received. Client 2: Client connection closed. Client 1: Disconnect request received. Client 1: Client connection closed.

Bn c th thm m lnh vo server n theo vt cc i tng th hin hnh trong mt tp hp. Lm nh th s cho php server hy b cc tc v ny nu n cn phi ng v ch c php mt s ti a client cng mt lc.

12.

S dng TCP mt cch bt ng b


Bn cn ghi d liu ra network-stream tng khi mt, m khng phi block phn m lnh cn li. K thut ny c th c s dng nu bn mun stream mt file ln trn mng. To mt lp ring x l k thut streaming bt ng b. Bn c th bt u stream mt khi d liu bng phng thc NetworkStream.BeginWrite v cung cp mt phng thc callback. Khi callback c kch hot th gi khi k tip.

464 Chng 11: Lp trnh mng

Lp NetworkStream h tr vic s dng bt ng b thng qua phng thc BeginRead v BeginWrite. S dng cc phng thc ny, bn c th gi hay nhn mt khi d liu trn mt trong cc tiu trnh do thread-pool ca b thc thi .NET cung cp, m khng block m lnh ca bn. Mc ny trnh by k thut ghi bt ng b. Khi gi d liu mt cch bt ng b, bn phi gi d liu nh phn th (mt mng byte). V bn cn chn kch thc mi ln gi hay nhn. V d di y vit li server t mc 11.11 sao cho mi lp ClientHandler gi mt lng ln d liu c c t mt file. D liu ny c gi mt cch bt ng b, ngha l ClientHandler c th tip tc thc hin cc tc v khc (trong v d ny, n ch vic ly cc thng ip c gi t client). Mt thun li ca cch tip cn ny l ton b ni dung ca file chng bao gi nm trong b nh mt lt. Thay vo , n c thu ly ngay trc khi mt khi mi c gi. Mt thun li khc na l server c th hy b thao tc vo bt c lc no. V d, nu client ch c n khi d liu th ba th ngt kt ni, server s thit lp mt bin thnh vin lun l c tn l fileStop bo cho callback khng gi d liu na. Di y l lp ClientHandler c sa i (lp TcpServerTest khng cn thay i g):
using System; using System.Net; using System.Net.Sockets; using System.IO; using SharedComponent; public class ClientHandler { private TcpClient client; private string ID; // Kch thc mt khi d liu (2 KB). private int bufferSize = 2048; // B m dng cha d liu. private byte[] buffer; // Dng c d liu t mt file. private FileStream fileStream; // Dng giao tip vi client. private NetworkStream networkStream; // Du hiu ngng gi d liu. private bool fileStop = false;

465 Chng 11: Lp trnh mng

public ClientHandler(TcpClient client, string ID) { this.buffer = new byte[bufferSize]; this.client = client; this.ID = ID; } public void Start() { // Thu ly network stream. networkStream = client.GetStream(); // To cc i tng dng gi v nhn text. BinaryWriter w = new BinaryWriter(networkStream); BinaryReader r = new BinaryReader(networkStream); if (r.ReadString() == ClientMessages.RequestConnect) { w.Write(ServerMessages.AcknowledgeOK); Console.WriteLine(ID + ": Connection completed.");

string message = ""; while (message != ClientMessages.Disconnect) { message = r.ReadString(); if (message == ClientMessages.RequestData) { // Tn file c th do client cung cp, nhng // trong v d ny, file th nghim l m cng. fileStream = new FileStream("test.bin", FileMode.Open);

// Gi kch thc file. w.Write(fileStream.Length.ToString());

// Khi chy thao tc bt ng b. StreamData(null); }

466 Chng 11: Lp trnh mng

} fileStop = true; Console.WriteLine(ID + ": Disconnect request received."); } else { Console.WriteLine(ID + ": Could not complete connection."); }

// ng kt ni. client.Close(); Console.WriteLine(ID + ": Client connection closed."); Console.ReadLine(); }

private void StreamData(IAsyncResult asyncResult) {

// Hy b nu client ngng kt ni. if (fileStop == true) { fileStop = false; return; } if (asyncResult != null) { // Mt khi c ghi mt cch bt ng b. networkStream.EndWrite(asyncResult); } // Ly khi k tip t file. int bytesRead = fileStream.Read(buffer, 0, buffer.Length);

// Nu khng c c byte no, stream n cui file. if (bytesRead > 0) {

Console.WriteLine("Streaming new block.");

// Ghi khi k tip ra network stream. networkStream.BeginWrite(buffer, 0, buffer.Length,

467 Chng 11: Lp trnh mng new AsyncCallback(StreamData), null); } else {

// Kt thc thao tc. Console.WriteLine("File streaming complete."); fileStream.Close(); } } }

Bn c th s dng mt mu tng t c d liu mt cch bt ng b pha client.

13.

Giao tip bng UDP


Bn cn gi d liu gia hai my tnh trn mt network bng User Datagram Protocol (UDP) stream. S dng lp System.Net.Sockets.UdpClient, v s dng hai tiu trnh: mt gi d liu v mt nhn d liu.

UDP l mt giao thc phi kt ni, khng c bt k iu khin dng chy hay kim tra li no. Khc vi TCP, UDP s khng c s dng nhng ni cn n giao tip ng tin cy. Tuy nhin, v chi ph thp hn, UDP thng c s dng cho cc ng dng "chatty", ti chp nhn mt mt vi thng ip. V d, gi s bn mun to mt network m trong , cc client gi thng tin v nhit hin thi ti v tr ca chng n mt server mi vi pht. Bn c th s dng UDP trong trng hp ny v tn s giao tip cao v thit hi do mt packet l khng ng k (v server c th tip tc s dng nhit nhn c cui cng). ng dng di y s dng hai tiu trnh: mt nhn thng ip v mt gi thng ip. th nghim ng dng ny, hy np hai th hin cng mt lc. Trn my tnh A, cho bit a ch IP ca my tnh B. Trn my tnh B, cho bit a ch IP ca my tnh A. Theo , bn c th gi qua li thng ip dng text (bn c th m phng th nghim ny trn mt my n bng cch s dng hai port khc nhau v a ch loopback).
using System; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; public class UdpTest { private static int localPort; private static void Main() {

468 Chng 11: Lp trnh mng

// nh ngha endpoint (thng ip c gi ti y). Console.Write("Connect to IP: "); string IP = Console.ReadLine(); Console.Write("Connect to port: "); int port = Int32.Parse(Console.ReadLine()); IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse(IP), port); // nh ngha endpoint cc b (thng ip c nhn ti y). Console.Write("Local port for listening: "); localPort = Int32.Parse(Console.ReadLine()); Console.WriteLine(); // To mt tiu trnh mi nhn thng ip n. Thread receiveThread = new Thread( new ThreadStart(ReceiveData)); receiveThread.IsBackground = true; receiveThread.Start(); UdpClient client = new UdpClient();

try { string text; do { text = Console.ReadLine();

if (text != "") {

// M ha d liu thnh dng nh phn // bng php m ha UTF8. byte[] data = Encoding.UTF8.GetBytes(text);

// Gi text n client xa. client.Send(data, data.Length, remoteEndPoint);

469 Chng 11: Lp trnh mng } } while (text != ""); } catch (Exception err) { Console.WriteLine(err.ToString()); } Console.ReadLine(); } private static void ReceiveData() { UdpClient client = new UdpClient(localPort); while (true) { try { // Nhn d liu (byte). IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0); byte[] data = client.Receive(ref anyIP);

// Chuyn byte thnh text bng php m ha UTF8. string text = Encoding.UTF8.GetString(data);

// Hin th text thu c. Console.WriteLine(">> " + text); } catch (Exception err) { Console.WriteLine(err.ToString()); } } } }

Ch rng, cc ng dng UDP khng th s dng NetworkStream nh cc ng dng TCP. Thay vo , chng phi chuyn tt c d liu thnh mt stream bng mt lp m ha, nh c m t trong mc 2.2. Bn c th th nghim ng dng ny vi cc client trn my cc b bng cch s dng hai port khc nhau v a ch loopback. V d, gi s c hai UDP-client: client A v client B. Di y l transcript i vi client A:
Connect to IP: 127.0.0.1 Connect to port: 8001 Local port for listening: 8080

470 Chng 11: Lp trnh mng

Hi there!

V y l transcript tng ng i vi client B (cng vi thng ip nhn c):


Connect to IP: 127.0.0.1 Connect to port: 8080 Local port for listening: 8001 >> Hi there!

14.

Gi e-mail thng qua SMTP


Bn cn gi e-mail n mt a ch e-mail bng mt SMTP-server (Simple Mail Transfer Protocol server). S dng lp SmtpMail v MailMessage thuc khng gian tn System.Web.Mail.

Cc lp trong khng gian tn System.Web.Mail cung cp mt v bc cho thnh phn Collaboration Data Objects for Windows 2000 (CDOSYS). Chng cho php bn son v gi thng ip e-mail bng SMTP. D dng s dng cc kiu ny. Bn ch cn to mt i tng MailMessage, cho bit a ch email ca ngi gi v ngi nhn, v t ni dung ca thng ip trong thuc tnh Body.
MailMessage myMessage = new MailMessage(); myMessage.To = "someone@somewhere.com"; myMessage.From = "me@somewhere.com"; myMessage.Subject = "Hello"; myMessage.Priority = MailPriority.High; myMessage.Body = "This is the message!";

Nu mun, bn c th gi mt thng ip HTML bng cch thay i nh dng ca thng ip v s dng cc th HTML.
myMessage.BodyFormat = MailFormat.Html; myMessage.Body = @"<HTML><HEAD></HEAD>" + @"<BODY>This is the message!</BODY></HTML>";

Bn c th thm file nh km bng tp hp MailMessage.Attachments v lp MailAttachment.


MailAttachment myAttachment = new MailAttachment("c:\\mypic.gif"); myMessage.Attachments.Add(myAttachment);

gi thng ip, bn ch cn cho bit tn ca SMTP-server v gi phng thc SmptMail.Send.

471 Chng 11: Lp trnh mng SmtpMail.SmtpServer = "test.mailserver.com"; SmtpMail.Send(myMessage);

Tuy nhin, c mt vi vn khi s dng lp SmtpMail gi mt thng ip e-mail. Lp ny cn mt SMTP-server cc b hay mt relay-server trn mng. Ngoi ra, lp SmtpMail khng h tr vic xc thc, do , nu SMTP-server yu cu username v password, bn s khng th gi bt k mail no. khc phc vn ny, bn c th trc tip s dng thnh phn CDOSYS thng qua COM Interop (gi s bn c phin bn server ca Windows hay Microsoft Exchange).

Nh rng, giao thc SMTP khng c s dng ly e-mail. i vi cng vic ny, bn cn giao thc POP3 hay IMAP, c hai giao thc ny u khng c trong .NET Framework. c thm thng tin v cch s dng v cu hnh SMTP-server, bn hy tham kho cc quyn sch chuyn v IIS.

15.

Gi v nhn e-mail vi MAPI


Bn mun gi mt thng ip e-mail, nhng SMTP-server (Simple Mail Transfer Protocol server) cha c cu hnh trn my tnh. S dng Simple MAPI (Messaging Application Programming Interface) bng cch nhp hm cn thit t th vin h thng khng-c-qun-l Mapi32.dll.

MAPI l giao din cho php bn tng tc vi cc tnh nng mailing c tch hp trong h iu hnh Windows. Bn c th s dng MAPI (thng qua cc hm API khng-c-qun-l, hoc thng qua thnh phn MAPI i cng vi Visual Studio 6) tng tc vi mail-client mc nh (thng l Microsoft Outlook hay Outlook Express). Cc tc v bao gm: ly thng tin contact t s a ch, ly thng ip trong Inbox, son v gi thng ip. ng tic, khng c lp no s dng MAPI trong .NET Framework. Tuy nhin, bn c th s dng th vin khng-c-qun-l Mapi32.dll. Thch thc chnh khi s dng Simple MAPI trong .NET l marshal cc cu trc c s dng trong .NET thnh cc cu trc m Simple MAPI cn, sau marshal cc cu trc do Simple MAPI tr v cho ng dng .NET. y khng phi l mt cng vic n gin. Tuy nhin, Microsoft cung cp mt gii php ton vn trong mt thnh phn C# tng qut (c th ti min ph). Bn c th s dng hai d n di y: Mt thnh phn th vin lp (Class Library Component) bc ly cc hm Simple MAPI v lm cho chng c hiu lc thng qua cc phng thc ca lp. Mt chng trnh (th nghim) s dng thnh phn ny ng nhp, ng xut, c mail, gi mail...

M lnh ca c hai d n ny khng my phc tp, nhng rt di nn khng trnh by y (bn hy xem trong a CD nh km).

i vi mt v d phc tp hn (xy dng trn th vin Simple MAPI ca Microsoft to mt ng dng Windows Form), mt d n C# mu (c th ti

472 Chng 11: Lp trnh mng

min

ph)

Thomas

Scheidegger

cung

cp

ti

[http://www.codeproject.com/ csharp/simplemapidotnet.asp].

473 Chng 11: Lp trnh mng

474

Chng 12:DCH V WEB XML V REMOTING

12

475

476 Chng 12: Dch v Web XML v Remoting

icrosoft .NET Framework h tr hai m hnh lp trnh phn tn cp cao l Remoting v dch v Web XML. Mc d c hai cng ngh ny c nhiu im tng ng (v d, c hai cng tru tng ha li gi gia cc tin trnh hay gia cc my tnh khc nhau thnh li gi phng thc ca cc i tng xa), nhng chng cng c vi im khc nhau c bn. Dch v Web XML c xy dng bng cc chun xuyn-nn v da vo khi nim XML messaging. Dch v Web XML c thc thi bi b thc thi ASP.NET; ngha l chng c c cc tnh nng ca ASP.NET nh output-caching. iu ny cng c ngha l dch v Web XML thuc dng phi trng thi (stateless). Ni chung, dch v Web XML thch hp nht khi bn cn xuyn bin nn (v d, mt Java-client gi mt dch v Web ASP.NET) hay bin tin cy (v d, trong cc phin giao dch thng mi). Trong chng ny, chng ta s bn mt s mc lin quan n dch v Web XML sau:

Nng cao tnh linh hot ca cc lp proxy bng cch khng vit m cng cho a ch
ca dch v Web XML (mc 12.1).

S dng k thut caching nng cao hiu nng v kh nng phc v (tnh quy m)
ca dch v Web XML (mc 12.2 v 12.3).

To phng thc giao dch cho dch v Web XML (mc 12.4). Truyn thng tin xc thc cho mt dch v Web XML bng proxy (mc 12.5). Gi bt ng b mt phng thc ca dch v Web XML (mc 12.6).
Remoting l mt cng ngh c trng ca .NET dnh cho cc i tng phn tn v c xem nh l mt hu du ca cng ngh DCOM. Cng ngh ny l tng cho cc h thng inhouse4; trong , tt c cc ng dng u c xy dng trn nn .NET, chng hn backbone ca mt h thng x l ha n. Remoting cho php cc chun giao tip khc nhau, chng hn cc thng ip nh phn nh gn v cc kt ni TCP/IP hiu qu hn m dch v Web XML khng h tr. Ngoi ra, Remoting cn l cng ngh duy nht h tr cc i tng c trng thi, v giao tip hai chiu thng qua callback. N cng l cng ngh duy nht cho php gi cc i tng .NET ty bin qua mng. Trong chng ny, chng ta s bn mt s mc lin quan n Remoting sau:

To cc i tng kh-truy-xut-t-xa; ng k v qun l chng trn IIS (mc 12.7,


12.8, v 12.9).

Pht sinh s kin trn cc knh truy xut t xa (mc 12.10). Kim sot thi gian sng v phin bn ca cc i tng kh-truy-xut-t-xa (mc
12.11 v 12.12).

Hin thc cc phng thc mt chiu trong cc i tng kh-truy-xut-t-xa (mc


12.13).

in-house system: H thng cng ngh thng tin do phng IT ca mt cng ty xy dng nn.

477 Chng 12: Dch v Web XML v Remoting

Chng ny ch a ra mt s k thut hu dng trong vic s dng dch v Web XML v Remoting. hiu su hn, bn cn tham kho cc sch chuyn v ti ny.

1.

Trnh vit m cng cho a ch URL ca dch v Web XML


Bn cn s dng mt dch v Web XML c t ti mt a ch URL m a ch ny c th thay i sau khi bn trin khai ng dng client. S dng a ch URL ng cho dch v Web XML. Khi , a ch ng ny c ly mt cch t ng t file cu hnh ca ng dng client. Trong Microsoft Visual Studio .NET, bn c th cu hnh a ch URL ng bng cch thay i ty chn URL Behavior ca Web Reference. Bn cng c th s dng cng c Web Services Description Language (Wsdl.exe) vi i s /appsettingurlkey.

Theo mc nh, khi bn to mt lp proxy th a ch URL ca dch v Web XML l m cng trong phng thc khi dng ca lp proxy ny. Bn c th chp thit lp ny trong m lnh bng cch iu chnh thuc tnh Url ca lp proxy sau khi to mt th hin ca n. Tuy nhin, c mt ty chn khc: cu hnh cho lp proxy s dng mt a ch URL ng. Trong Visual Studio .NET, bn c th thc hin iu ny bng cch chn Web Reference trong ca s Solution Explorer v thay i ty chn URL Behavior trong ca s Properties (xem hnh 12.1).

Hnh 12.1 Cu hnh a ch URL cho dch v Web XML

Sau khi bn thay i nh trn, a ch URL ca dch v Web XML s t ng c thm vo file cu hnh ca ng dng client. File cu hnh ny c tn l Web.config i vi cc ng dng Web, v [AppName].exe.config i vi cc ng dng khc (lu , ngun xut hin trong mi trng thit k ch l App.config, nhng sau s c Visual Studio .NET i tn mt cch t ng). V d di y l thit lp c sinh t ng trong file cu hnh:
<?xml version="1.0" encoding="utf-8"?>

478 Chng 12: Dch v Web XML v Remoting

<configuration>

<appSettings> <add key="AppName.ServerName.ServiceName" value="http://localhost/WebServices/MyService.asmx"/> </appSettings>

</configuration>

Bn cng c th s dng a ch URL ng do cng c Wsdl.exe sinh ra. Trong trng hp ny, bn s dng i s /appsettingurlkey cho bit tn ca thit lp cu hnh m URL s c lu tr . Bn phi to file cu hnh bng tay.
wsdl /out:Proxy.cs http://localhost/WebServices/MyService.asmx?WSDL /appsettingurlkey:MyService

Trong c hai trng hp, m lnh ca lp proxy s c sa i c a ch URL t file cu hnh. Nu khng tm thy gi tr cn thit, n s mc nh s dng a ch URL c s dng trong qu trnh pht trin ng dng. Cch tip cn ny cho php bn i a ch URL ca dch v Web XML sau khi bin dch v trin khai ng dng (ch cn thay i file cu hnh).

2.

S dng k thut response-caching trong dch v Web XML


Bn mun nng cao hiu nng ca dch v Web XML bng cch lu tr gi tr tr v ca mt phng thc web. S dng response-caching bng cch thit lp thuc tnh CacheDuration ca c tnh System.Web.Services.WebMethod.

Trong ASP.NET, dch v Web XML h tr response-caching ging ht nh cc trang web ASP.NET. Khi response-caching c kch hot, m lnh ca bn ch thc hin mt ln, v gi tr tr v ca phng thc web s c lu li v c tr v trong cc ln gi tip theo. i vi Web Form, caching c thc hin cho tng form. i vi dch v Web XML, caching c kch hot v cu hnh ring cho mi phng thc web. V d, phng thc web di y tr v gi tr ngy gi hin hnh trn my server. Thng tin ny c lu li trong mt pht, ngha l cc li yu cu tip theo trong khong thi gian ny s nhn li thng tin c lu trc .
Using System; using System.Web.Services; public class ResponseCaching { [WebMethod(CacheDuration=60)]

479 Chng 12: Dch v Web XML v Remoting public string GetDate() { return DateTime.Now.ToString(); } }

Nu phng thc web ca bn nhn nhiu i s, ASP.NET s s dng li gi tr c lu ch khi cc gi tr i s cng ging nh th. Nu bn c mt phng thc nhn tm gi tr rng th caching tr nn khng hiu qu v i khi tr nn lng ph, v c qu nhiu thng tin cn c lu nhng t khi c s dng li. V d, s dng caching trong mt phng thc web thc hin php tnh da trn u vo dng s khng phi l mt s la chn tt. Tri li, s dng caching trong mt phng thc web nhn gi tr ID ca mt nhm nh sn phm chc chn l mt s la chn tt. Bao gi cng vy, response-caching b qua m lnh ca bn, khin n tr nn khng t cch nu phng thc web ca bn cn thc hin cc hnh ng khc (chng hn ghi nht k), hay phng thc web ca bn ph thuc vo mt s thng tin khc ngoi cc i s c a vo (chng hn thng tin xc thc ca ngi dng hay d liu trong phin lm vic).

Mt hn ch ca response-caching l n ch cho php bn s dng li d liu trong phm vi ca mt phng thc web. Nu bn mun s dng li d liu trong nhiu phng thc web khc nhau, k thut data-caching s hiu qu hn.

3.

S dng k thut data-caching trong dch v Web XML


Bn cn chy phng thc web ca bn nhng vn s dng mt s thng tin c lu. Hoc, bn mun nng cao hiu nng ca dch v Web XML bng cch lu tr mt s d liu, v cn s dng li d liu ny trong mt s phng thc. Bn c th lu bt c i tng no vo cache bng phng thc Insert ca i tng System.Web.Caching.Cache. Bn c th truy xut cache thng qua thuc tnh tnh HttpContext.Current.

Cch thc lm vic ca data-caching vi mt dch v Web XML cng ging nh vi mt trang web. Bn c th lu tr d liu vo cache bng m trang web v ly n v trong mt dch v Web XML, hay ngc li. c thm thng tin v data-caching v cc kiu chnh sch ht hiu lc (expiration policy) m n h tr, bn hy tham kho mc 7.15. im khc bit duy nht gia caching trong mt dch v Web XML v caching trong mt trang web l: Trong dch v Web XML, bn khng th thu ly i tng Cache nh mt thuc tnh ni ti; thay vo , bn cn truy xut cache thng qua thuc tnh tnh HttpContext.Current. V d di y trnh by mt dch v Web XML vi hai phng thc web:
GetProductCatalog: Tr v mt DataSet vi cc thng tin v sn phm. DataSet ny c

th c ly t cache hoc c sinh t ng (nu cn) bng hm GetCustomerDataSet.


GetProductList: Cng s dng DataSet v hm GetCustomerDataSet nhng ch ly mt

phn thng tin (tn sn phm).

480 Chng 12: Dch v Web XML v Remoting

C hai phng thc web trn u c th s dng chung d liu c lu, iu ny lm gim nh gnh nng t ln c s d liu.
using System; using System.Data; using System.Data.SqlClient; using System.Web.Services; using System.Web;

public class DataCachingTest { private static string connectionString = "Data Source=localhost;" + "Initial Catalog=Northwind;user ID=sa"; [WebMethod()] public DataSet GetProductCatalog() {

// Tr v DataSet (t cache, nu c th). return GetCustomerDataSet(); } [WebMethod()] public string[] GetProductList() {

// Truy xut bng khch hng (t cache, nu c th). DataTable dt = GetCustomerDataSet().Tables[0];

// To mng cha tn khch hng string[] names = new string[dt.Rows.Count];

// d liu vo mng. int i = 0; foreach (DataRow row in dt.Rows) { names[i] = row["ProductName"].ToString(); i += 1; }

481 Chng 12: Dch v Web XML v Remoting return names; }

private DataSet GetCustomerDataSet() {

// Kim tra item c trong cache cha. DataSet ds = HttpContext.Current.Cache["Products"] as DataSet; if (ds == null) { string SQL = "SELECT * FROM Products"; // To cc i tng ADO.NET. SqlConnection con = new SqlConnection(connectionString); SqlCommand com = new SqlCommand(SQL, con); SqlDataAdapter adapter = new SqlDataAdapter(com); ds = new DataSet(); // Thc thi cu truy vn. try { con.Open(); adapter.Fill(ds, "Products"); // Lu item vo cache (trong 60 giy). HttpContext.Current.Cache.Insert("Products", ds, null, DateTime.Now.AddSeconds(60), TimeSpan.Zero); } catch (Exception err) { System.Diagnostics.Debug.WriteLine(err.ToString()); } finally { con.Close(); } } return ds; } }

482 Chng 12: Dch v Web XML v Remoting

4.

To phng thc web h tr giao dch


Bn mun thc thi tt c cc hnh ng ca mt phng thc web trong ng cnh ca mt phin giao dch COM+ sao cho chng ch c hai kh nng: hoc l thnh cng hoc l tht bi. Kch hot mt phin giao dch t ng bng cch chn mt gi tr thuc kiu lit k System.EnterpriseServices.TransactionOption v p dng n cho thuc tnh TransactionOption ca c tnh WebMethod.

Trong ASP.NET, dch v Web XML h tr cc phin giao dch t ng (c th c kch hot trn mi phng thc). Khi c kch hot, bt k ngun d liu no c h tr giao dch COM+ s t ng c a vo phin giao dch hin hnh khi n c s dng trong m lnh ca bn. Phin giao dch s t ng c commit khi phng thc web hon tt. Phin giao dch ny c roll-back khi c bt k ngoi l cha-c-th-l no xy ra hoc bn gi phng thc SetAbort ca lp System.EnterpriseServices.ContextUtil. kch hot vic h tr giao dch cho mt phng thc web, bn cn thit lp thuc tnh TransactionOption ca c tnh WebMethod l RequiresNew. V d, phng thc web (h tr giao dch) di y s xa cc bn ghi trong mt c s d liu v ri hy b phin giao dch ny. s dng on m ny, bn phi thm mt tham chiu n System.EnterpriseServices.dll.
using System; using System.Data.SqlClient; using System.Web.Services; using System.EnterpriseServices;

public class TransactionTest {

private static string connectionString = "Data Source=localhost;" + "Initial Catalog=Northwind;user ID=sa";

[WebMethod(TransactionOption=TransactionOption.RequiresNew)] public void FailedTransaction() {

// To kt ni. SqlConnection con = new SqlConnection(connectionString);

// To cu truy vn SQL. SqlCommand cmd = new SqlCommand("DELETE * FROM Customers", con);

483 Chng 12: Dch v Web XML v Remoting

// Thc thi cu truy vn. Tc v ny s t ng c // ng k nh mt phn trong phin giao dch. con.Open(); cmd.ExecuteNonQuery(); con.Close();

// Gi mt phng thc no khc. DoSomething();

// Nu khng c li xy ra, cc thay i trong c s d liu // s c commit y khi phng thc ny kt thc. }

private void DoSomething() {

// Hy b phin giao dch. ContextUtil.SetAbort(); }

Bn c th s dng tin ch Component Service (trong phn Administrative Tools ca Control Panel) theo di phin giao dch trn. Trong tin ch ny, bn hy chn mc Distributed Transaction Coordinator ca my tnh hin hnh, v xem Transaction Statistics. Hnh 12.2 cho thy mt phin giao dch khng thnh cng khi chy on m trn.

484 Chng 12: Dch v Web XML v Remoting

Hnh 12.2 Theo di mt phin giao dch khng thnh cng


[

V bn cht phi trng thi (stateless) ca giao thc HTTP, nn mt phng thc web ch c th gp phn lm gc ca mt phin giao dch; ngha l bn khng th a nhiu hn mt phng thc web vo cng mt phin giao dch. Mc d thuc tnh TransactionOption chp nhn tt c cc gi tr TransactionOption chun, nhng cc gi tr ny khng mang ngha nh mong i. V d, Disabled, NotSupported, v Supported u c cng tc dng l v hiu vic h tr giao dch. Tng t, c Required v RequiresNew u kch hot vic h tr giao dch v khi chy mt phin giao dch mi. Bn nn s dng RequiresNew trong cc phng thc web v tn ca n tng xng vi hnh vi tht s (!).

Cc giao dch COM+ lm vic mt cch trong sut vi hu ht cc ngun d liu v chng cung cp cc b qun l ti nguyn tng thch. Nhng lun nh rng, nu bn tng tc vi mt ti nguyn khng h tr giao dch, m lnh s khng c roll-back. Mt s hot ng khng phi l giao dch: ghi file, t thng tin vo trng thi phin lm vic, v truy xut mt thit b phn cng (nh my in). Mt khc, cc thao tc d liu vi hu ht cc h c s d liu Enterprise (bao gm Microsoft SQL Server v Oracle) u l tng thch COM+.

485 Chng 12: Dch v Web XML v Remoting

5.

Thit lp thng tin xc thc cho dch v Web XML


Bn mun gi cc thng tin ng nhp t client ca dch v Web XML n IIS authentication. S dng thuc tnh Credentials ca lp proxy. Bn c th to mt i tng NetworkCredential mi cha username v password; hoc s dng CredentialCache ly cc thng tin xc thc ca ngi dng hin hnh.

Cng ging nh trang web, dch v Web XML c th c s dng cng vi IIS authentication. Nhng g bn cn lm l t dch v Web XML vo mt th mc o hn ch vic truy xut nc danh. Tuy nhin, nu ngi dng c th cung cp cc thng tin nh x n mt ti khon ngi dng hp l, ngi dng ny s c xc thc v bn c th ly cc thng tin xc thc ny thng qua i tng WebService.User. Khc vi trang web, dch v Web XML khng c sn phng thc no thu ly thng tin xc thc t client v dch v Web XML c thc thi bi cc ng dng khc, ch khng phi bi ngi dng. Do , ng dng ang tng tc vi dch v Web XML s chu trch nhim nhp bt k thng tin xc thc cn thit no. V d sau m phng mt dch v Web XML c thc hin xc thc ngi dng. GetIISUser tr v ngi dng c IIS xc thc. Nu truy xut nc danh c php th kt qu s l mt chui rng. Nu truy xut nc danh b t chi th kt qu s l mt chui c dng [DomainName]\[UserName] hay [ComputerName]\[UserName].
public class AuthenticationTest : System.Web.Services.WebService {

// Ly thng tin v ngi dng c IIS xc thc. [WebMethod()] public string GetIISUser() { return User.Identity.Name; } }

Bc cui cng l to mt client c th cung cp cc thng tin xc thc. Cc thng tin ny c nhp thng qua thuc tnh Credentials ca i tng proxy (thit lp thuc tnh ny tng t nh thit lp thuc tnh WebRequest.Credentials khi ly v mt trang webtham kho mc 11.3). on m di y trnh by cch truy xut mt dch v Web XML s dng Basic authentication (xc thc c bn):
// To proxy. localhost.AuthenticationTest proxy = new localhost.AuthenticationTest();

// To thng tin xc thc. proxy.Credentials = new System.Net.NetworkCredential( "myUserName", "myPassword");

486 Chng 12: Dch v Web XML v Remoting

Console.WriteLine(proxy.GetIISUser());

on m di y trnh by cch truy xut mt dch v Web XML s dng Integrated Windows authentication (xc thc c tch hp vi Windows):
// To proxy. localhost.AuthenticationTest proxy = new localhost.AuthenticationTest();

// Gn thng tin xc thc ca ngi dng hin hnh cho lp proxy. proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;

Console.WriteLine(proxy.GetIISUser());

6.

Gi bt ng b mt phng thc web


Bn cn gi mt phng thc web trong mt tiu trnh khc chng trnh ca bn c th thc hin cc tc v khc trong khi ch p ng. S dng cc phng thc bt ng b c sn trong lp proxy. Cc phng thc ny c tn l BeginXXX v EndXXX vi XXX l tn ca phng thc ng b gc.

Lp proxy (c to t ng) c cc tnh nng c bn m bn cn gi bt k phng thc web no mt cch bt ng b. V d, phng thc web di y c chc nng tm dng mt khong thi gian ngu nhin t 10 n 19 giy:
using System; using System.Web.Services;

public class Wait : System.Web.Services.WebService {

[WebMethod] public int Wait() {

DateTime start = DateTime.Now; Random rand = new Random(); TimeSpan delay = new TimeSpan(0, 0, rand.Next(10, 20)); while (DateTime.Now < start.Add(delay)) {} return delay.Seconds; } }

487 Chng 12: Dch v Web XML v Remoting

Vi on m trn, lp proxy tng ng s gm ba phng thc: Wait, BeginWait v EndWait. Phng thc Wait gi phng thc web mt cch ng b. Phng thc BeginWait khi chy phng thc web trong mt tiu trnh ring v tr v ngay lp tc. Phng thc BeginXXX lun nhn nhiu hn phng thc gc hai i s v tr v mt i tng IAsyncState. Hai i s ny c s dng nhp thng tin trng thi v mt callback. i tng IAsyncState cho php bn xc nh khi no li gi kt thc. V d, bn c th nh k kim tra thuc tnh IAsyncState.IsComplete xc nh li gi phng thc hon tt cha. Khi n hon tt, bn nhp i tng IAsyncState vo phng thc EndWait nhn gi tr tr v t phng thc web. Nu bn gi EndWait trc khi phng thc web hon tt, m lnh ca bn s i cho n khi n hon tt. C hai mu bt ng b ph bin dng cho dch v Web XML. Cch th nht l gi vi phng thc bt ng b mt lt, ri i chng hon tt. Cch ny cho php bn gim thi gian i tng cng, v n lm vic tt nht vi i tng System.Threading.WaitHandle. V d di y gi phng thc Wait ba ln:
using System; using System.Threading;

public class WaitClient {

[MTAThread] private static void Main() {

localhost.WaitService proxy = new localhost.WaitService();

DateTime startDate = DateTime.Now;

// Gi ba phng thc mt cch bt ng b. IAsyncResult handle1 = proxy.BeginWait(null, null); IAsyncResult handle2 = proxy.BeginWait(null, null); IAsyncResult handle3 = proxy.BeginWait(null, null);

WaitHandle[] waitHandle = {handle1.AsyncWaitHandle, handle2.AsyncWaitHandle, handle3.AsyncWaitHandle};

// i cho c ba phng thc hon tt. WaitHandle.WaitAll(waitHandle);

int totalDelay = proxy.EndWait(handle1) + proxy.EndWait(handle2) + proxy.EndWait(handle3);

488 Chng 12: Dch v Web XML v Remoting

TimeSpan elapsedTime = DateTime.Now - startDate;

Console.WriteLine("Completed after " + elapsedTime.ToString()); Console.WriteLine("Total delay time: " + totalDelay.ToString()); } }

Trong trng hp ny, thi gian tri qua nh hn thi gian tr hon tng cng:
Completed after 00:00:20.2591312 Total delay time: 47

Cch th hai l s dng callback. Bn cn nhp mt y nhim ch nh mt phng thc c th trong m lnh. Khi phng thc web hon tt, y nhim ny s c gi vi i s l mt i tng IAsyncResult thch hp. Di y l on m gi phng thc BeginWait (cng vi mt callback):
AsyncCallback callback = new AsyncCallback(Callback);

// Gi phng thc mt cch bt ng b. proxy.BeginWait(callback, proxy);

V y l callback (s c kch hot khi thao tc hon tt):


public static void Callback(IAsyncResult handle) {

localhost.WaitService proxy = (localhost.WaitService)handle.AsyncState; int result = proxy.EndWait(handle); Console.WriteLine("Waited " + result.ToString()); }

7.

To lp kh-truy-xut-t-xa
Bn mun to mt lp c th c truy xut t mt ng dng khc hay t mt my tnh khc trn mng. Tuy vy, bn khng cn tnh tng thch xuyn-nn v bn mun c hiu nng ti u. Lm cho lp ny tr thnh kh-truy-xut-t-xa (remotable) bng cch dn xut t lp System.MarshalByRefObject, v to mt host ng k lp ny vi kin trc .NET Remoting.

Remoting cho php bn lm cho mt i tng tr nn truy xut c qua cc bin my v bin tin trnh. Trong khi dch v Web XML l gii php l tng khi bn cn chia s cc chc

489 Chng 12: Dch v Web XML v Remoting

nng qua cc nn hay cc bin tin cy, Remoting l la chn tt nht cho mt h thng m trong tt c cc thnh phn u c xy dng trn nn .NET v h iu hnh Windows. s dng .NET Remoting, bn cn cc phn sau (mi phn phi thuc v mt assembly ring bit): Lp kh-truy-xut-t-xa Lp ny c th c truy xut t cc ng dng v cc my tnh khc, v phi dn xut t System.MarshalByRefObject. ng dng host ng dng ny ng k kiu kh-truy-xut-t-xa vi kin trc .NET Remoting bng lp RemotingConfiguration (thuc khng gian tn System.Runtime.Remoting). Min l ng dng host ang chy, cc client xa c th to ra cc th hin ca lp kh-truy-xut-t-xa. ng dng client ng dng ny c th to ra cc th hin ca lp kh-truy-xut-t-xa trong tin trnh ca host v tng tc vi chng. Client s dng lp RemotingConfiguration ng k cc kiu m n mun truy xut t xa.

Hnh sau m t s tng tc gia ba phn trn. Trong v d ny, ch c mt client. Tuy nhin, cng c th c nhiu client to ra cc th hin ca lp kh-truy-xut-t-xa cng mt lc. Trong trng hp ny, mi client s c mt i tng kh-truy-xut-t-xa ca chnh n, v tt c cc i tng ny s thuc v min ng dng ca host.

Ordinary Object

Remotable Object

Client

Cross-application call

Component host

Hnh 12.3 S dng mt lp kh-truy-xut-t-xa

Bc u tin l to lp kh-truy-xut-t-xa. V d, lp kh-truy-xut-t-xa di y tr v mt DataSet; vi cch ny, mt client c th truy xut thng tin t c s d liu m khng phi trc tip kt ni n c s d liu pha server.
using System; using System.Data; using System.Data.SqlClient;

public class ProductsDB : MarshalByRefObject {

private static string connectionString = "Data Source=localhost;" + "Initial Catalog=Northwind;Integrated Security=SSPI";

public DataTable GetProducts() {

string SQL = "SELECT * FROM Products";

490 Chng 12: Dch v Web XML v Remoting

// To cc i tng ADO.NET. SqlConnection con = new SqlConnection(connectionString); SqlCommand com = new SqlCommand(SQL, con); SqlDataAdapter adapter = new SqlDataAdapter(com); DataSet ds = new DataSet();

// Thc thi cu truy vn. try { con.Open(); adapter.Fill(ds, "Products"); } catch (Exception err) { Console.WriteLine(err.ToString()); } finally { con.Close(); }

return ds.Tables[0]; }

// Phng thc ny kim tra Remoting c hot ng hay khng. public string GetHostLocation() { return AppDomain.CurrentDomain.FriendlyName; } }

Lp ny c nh ngha trong mt Class Library Assembly c tn l RemoteObject.dll.

mc l tng, i tng xa s khng gi li bt k trng thi no. Tnh cht ny cho php bn s dng ch kch hot gi mt ln (single-call activation), trong i tng s c to ra ngay u mi li gi phng thc v s c gii phng khi kt thc (ging nh trong dch v Web XML). iu ny bo m cc i tng khng chim nhiu ti nguyn ca server v vic qun l thi gian sng ca chng tr nn d dng hn.

K n, bn phi to hosty l ng dng pha server qun l tt c cc th hin ca lp kh-truy-xut-t-xa. Bn c th s dng bt k kiu ng dng .NET no lm host (bao gm: ng dng da-trn-Windows, dch v Windows, v ng dng Console). Di y l mt host n gin dng Console:

491 Chng 12: Dch v Web XML v Remoting using System; using System.Runtime.Remoting;

public class Server {

private static void Main() {

// ng k cc lp kh-truy-xut-t-xa vi .NET Remoting. RemotingConfiguration.Configure("Server.exe.config");

// Min l ng dng ny ang chy, cc i tng xa // s l kh truy xut. Console.WriteLine("Press a key to shut down the server."); Console.ReadLine(); } }

Chng trnh trn s dng file cu hnh (app.config) cu hnh cc lp m n s h tr, cc cng m n s h tr cho giao tip mng, v a ch URI (Uniform Resource Identifier) m client s s dng truy xut i tng. Di y l mt file cu hnh n gin ng k lp RemoteObjects.RemoteObject t RemoteObject.dll vi a ch cng l 9080 thng qua giao thc TCP/IP. Assembly ny phi nm trong GAC (Global Assembly Cache) hoc trong cng th mc vi ng dng server. File cu hnh cng cu hnh i tng xa dng ch kch hot gi-mt-ln.
<configuration> <system.runtime.remoting> <application>

<!-- nh ngha i tng kh-truy-xut-t-xa. --> <service> <wellknown mode = "SingleCall" type="RemoteObject.ProductsDB, RemoteObject" objectUri="RemoteObject" /> </service>

<!-- nh ngha giao thc dng cho truy xut mng. Bn c th s dng knh tcp hay http. --> <channels>

492 Chng 12: Dch v Web XML v Remoting

<channel ref="tcp" port="9080" /> </channels>

</application> </system.runtime.remoting> </configuration>

Host khng bao gi tng tc trc tip ti cc i tng xa, nhng g n lm ch l ng k cc kiu thch hp vi kin trc .NET Remoting. Sau thi im , ng dng client c th to ra cc i tng ny, v ng dng server c th tip tc thc hin cc cng vic khc. Tuy nhin, khi host b ng, tt c cc i tng s b hy, v khng th to i tng c na. ng dng client s dng file cu hnh tng t nh trn nh ngha a ch URL v kiu ca i tng xa. a ch URL c nh dng nh sau:
[Protocol]://[Server]:[PortNumber]/[ObjectURI]

Di y l file cu hnh pha client:


<configuration> <system.runtime.remoting> <application>

<! nh ngha i tng m ng dng ny mun truy xut t xa. --> <client> <wellknown type="RemoteObject.ProductsDB, RemoteObject" url="tcp://localhost:9080/RemoteObject" /> </client>

<!-- nh ngha giao thc dng cho truy xut mng. Giao thc ny phi khp vi giao thc c nh ngha pha server, nhng a ch cng c th khc. a ch cng 0 ngha l "ly bt k mt a ch cng no cn trng". --> <channels> <channel ref="tcp" port="0" /> </channels>

</application> </system.runtime.remoting>

493 Chng 12: Dch v Web XML v Remoting </configuration>

ng dng client s dng phng thc RemotingConfiguration.Configure ng k cc i tng m n mun gi. Sau khi ng k xong, client c th to i tng ny ging nh to i tng cc b mc d n tht s nm trong min ng dng ca host. on m di y trnh by cc bc ny:
using System; using System.Runtime.Remoting; using System.Data; using RemoteObject;

public class Client {

private static void Main() {

// ng k cc lp s c truy xut t xa. RemotingConfiguration.Configure("Client.exe.config");

// Tng tc vi i tng xa thng qua proxy. ProductsDB proxy = new ProductsDB(); // Hin th tn min ng dng ca host. Console.WriteLine("Object executing in: " + proxy.GetHostLocation());

// Ly DataSet v hin th ni dung ca n. DataTable dt = proxy.GetProducts(); foreach (DataRow row in dt.Rows) { Console.WriteLine(row[1]); } Console.ReadLine(); } }

to mt i tng xa, client cn mt tham chiu n assembly m lp ny c nh ngha trong . iu ny cn thm mt bc trin khai na, bn c th trnh i bng cch s dng mt giao din c nh ngha cc chc nng c h tr.

494 Chng 12: Dch v Web XML v Remoting

chuyn d liu n i tng xa (hoc chuyn d liu t i tng xa v), cc kiu d liu dng cho cc tham s v gi tr tr v phi l kh-tun-t-ha (serializablett c cc kiu c bn u c tnh cht ny). Nu mun s dng cc lp ty bin chuyn d liu, bn phi lm cho cc lp ny tr thnh khtun-t-ha bng cch p dng c tnh Serializable (xem mc 16.1 bit thm chi tit).

8. ng k tt c cc lp kh-truy-xut-t-xa trong mt assembly



Bn mun ng k tt c cc lp kh-truy-xut-t-xa c nh ngha trong mt assembly m khng phi ch nh chng trong file cu hnh. Np assembly (c cha cc lp kh-truy-xut-t-xa) bng c ch phn chiu (reflection). Duyt qua tt c cc kiu trong v s dng phng thc RemotingConfiguration.RegisterWellKnownServiceType ng k mi lp khtruy-xut-t-xa.

.NET cho php bn ng k cc lp kh-truy-xut-t-xa mt cch d dng thng qua vic vit file cu hnh hoc vit m chng trnh. Xt v d trong mc 12.7. ng k bng m chng trnh, trc ht bn phi g b nhng khai bo lp trong file cu hnh trn server nh sau:
<configuration> <system.runtime.remoting> <application>

<channels> <channel ref="tcp" port="9080" /> </channels>

</application> </system.runtime.remoting> </configuration>

By gi, bn c th s dng k thut phn chiu kt hp vi phng thc RegisterWellKnownServiceType ng k tt c cc lp kh-truy-xut-t-xa. Tuy nhin, bn cn thm mt tham chiu n System.Runtime.Remoting.dll. on m di y tm cc lp kh-truy-xut-t-xa trong RemoteObject.dll v ng k mi lp:
using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels;

495 Chng 12: Dch v Web XML v Remoting using System.Runtime.Remoting.Channels.Tcp; using System.Reflection;

public class Server {

private static void Main() {

// S dng file cu hnh nh ngha cc ty chn v mng. RemotingConfiguration.Configure("Server.exe.config");

// Ly knh Remoting c ng k. TcpChannel channel = (TcpChannel)ChannelServices.RegisteredChannels[0];

// Np RemoteObject.dll. Assembly assembly = Assembly.LoadFrom("RemoteObject.dll");

// X l tt c cc kiu trong RemoteObject.dll. foreach (Type type in assembly.GetTypes()) {

// Kim tra kiu c phi l kh-truy-xut-t-xa hay khng. if (type.IsSubclassOf(typeof(MarshalByRefObject))) {

// ng k kiu (tn kiu l a ch URI). Console.WriteLine("Registering " + type.Name); RemotingConfiguration.RegisterWellKnownServiceType( type, type.Name, WellKnownObjectMode.SingleCall);

// Xc nh a ch URL (kiu c publish ti y). string[] urls = channel.GetUrlsForUri(type.Name); Console.WriteLine(urls[0]); } }

Console.WriteLine("Press a key to shut down the server."); Console.ReadLine(); }

496 Chng 12: Dch v Web XML v Remoting

9.

Qun l cc i tng xa trong IIS


Bn mun to mt i tng kh-truy-xut-t-xa trong IIS ( c th s dng SSL hay IIS authentication) thay cho mt host chuyn bit. t file cu hnh v assembly vo mt th mc o, v thay i URI sao cho n kt thc bng .rem hay .soap.

Thay v to mt host chuyn bit, bn c th qun l mt lp kh-truy-xut-t-xa trong IIS (Internet Information Services). iu ny cho php bn bo m cc lp kh-truy-xut-t-xa s lun c hiu lc, v cho php bn s dng cc tnh nng ca IIS nh SSL Encryption v Integrated Windows authentication. qun l mt lp kh-truy-xut-t-xa trong IIS, trc ht bn phi to mt th mc o. Th mc ny cha hai th: file cu hnh dng ng k cc lp kh-truy-xut-t-xa v th mc bin dng cha Class Library Assembly tng ng (hoc ci t assembly vo GAC). File cu hnh ny hon ton tng t vi file cu hnh m bn s dng cho mt host ty bin. Tuy nhin, bn phi tun theo cc quy tc: Bn phi s dng knh HTTP (mc d c th s dng Binary formatter i vi cc kch thc thng ip nh hn). Bn khng th ch c th a ch cng. IIS lng nghe tt c cc cng bn cu hnh trong IIS Manager (cng 80 v 443). URI phi kt thc bng .rem hay .soap. File cu hnh phi c tn l Web.config, nu khng n s b b qua.

File Web.config di y s ng k lp c trnh by trong mc 12.7:


<configuration> <system.runtime.remoting> <application> <service> <wellknown mode="SingleCall" type="RemoteObject.ProductsDB, RemoteObject" objectUri="RemoteObject.rem" /> </service>

<channels> <channel ref="http">

<!-- G b ch thch di y s dng Binary formatter

497 Chng 12: Dch v Web XML v Remoting thay cho SOAP formatter (mc nh). --> <!-<serverProviders> <formatter ref="binary"/> </serverProviders> -->

</channel> </channels>

</application> </system.runtime.remoting> </configuration>

Client c th s dng i tng c qun l trong IIS ging nh i tng c qun l trong mt host ty bin. Tuy nhin, tn th mc o s l mt phn ca URI. V d, nu file Web.config va trnh by trn c t trong th mc o http://localhost/RemoteObjects th URL y s l http://localhost/RemoteObjects/RemoteObject.rem.

Khi qun l mt i tng vi IIS, ti khon c s dng thc thi i tng l ti khon ASP.NET (c nh ngha trong file machine.config). Nu ti khon ny khng c quyn truy xut c s d liu (l trng thi mc nh), bn s gp li khi chy v d ny. gii quyt vn ny, bn hy xem mc 7.17.

10.

Pht sinh s kin trn knh truy xut t xa


Bn cn to mt client c th nhn mt s kin do i tng xa pht sinh. Phi chc rng bn ang s dng cc knh hai chiu (bidirectional channel). To mt i tng kh-truy-xut-t-xa bn client (c th nhn s kin t server).

Mc d c php th l s kin khng h thay i khi bn s dng .NET Remoting, nhng bn cn to mt client c th th l s kin t mt i tng xa. Di y l cc yu cu chnh: Lp kh-truy-xut-t-xa phi s dng ch c-client-kch-hot (client-activated) hay ch kch hot n-nht (singleton activation) khng phi ch kch hot gimt-ln (single-call activation). iu ny bo m i tng vn cn sng gia cc ln gi phng thc, cho php n pht sinh s kin n client. Client phi s dng knh hai chiu n c th nhn cc kt ni do server khi to. i tng EventArgs phi l kh-tun-t-ha n c th c chuyn qua cc bin min ng dng. Client phi s dng mt i tng kh-truy-xut-t-xa nhn s kin (c gi l listener). Theo , listener s dng mt s kin cc b m client c th x l c. i

498 Chng 12: Dch v Web XML v Remoting

tng xa khng th trc tip pht sinh s kin n mt lp bnh thng v lp bnh thng khng th c truy xut t cc min ng dng khc. Bn phi thay i cc file cu hnh ca client v server cho php full serialization (iu ny khng cn thit vi .NET 1.0).

Di y l lp kh-truy-xut-t-xa m bn c th s dng pht sinh mt s kin n client. Lp ny cung cp phng thc StartTask khi chy mt b nh thi, pht sinh sau mt thi gian ngn (khong 10 giy). Khi b nh thi pht sinh, i tng kh-truy-xut-txa dng ln s kin TaskComplete.
using System; using System.Timers;

public delegate void TaskCompleted(object sender, TaskCompleteEventArgs e);

public class RemoteObject : MarshalByRefObject {

public event TaskCompleted TaskComplete; private Timer tmr = new Timer();

public void StartTask() {

tmr.Interval = 10000; tmr.Elapsed += new ElapsedEventHandler(tmrCallback); tmr.Start(); }

private void tmrCallback(object sender, ElapsedEventArgs e) {

tmr.Enabled = false; if (TaskComplete != null) { TaskComplete(this, new TaskCompleteEventArgs("Task completed on server")); } }

public override object InitializeLifetimeService() {

499 Chng 12: Dch v Web XML v Remoting return null; } }

[Serializable()] public class TaskCompleteEventArgs : EventArgs {

public string Result;

public TaskCompleteEventArgs(string result) { this.Result = result; } }

Bc k tip l nh ngha mt lp kh-truy-xut-t-xa chy trn client v c th nhn s kin ny. Theo , lp ny c th tip xc vi client. Lp EventListener di y trnh by mt v d nh thn ch n gin dng ln s kin th hai, m client c th trc tip x l. Cng nh tt c cc i tng kh-truy-xut-t-xa, n s ch c truy xut trong 5 pht, tr khi bn thay i chnh sch lease (s c m t trong mc 12.11). C mt cch l chp phng thc InitializeLifetimeService cho php i tng c sng vnh vin:
public class EventListener : MarshalByRefObject {

public event RemoteObject.TaskCompleted TaskComplete;

// Th l s kin xa. public void OnTaskComplete(object sender, RemoteObject.TaskCompleteEventArgs e) { TaskComplete(sender, e); }

public override object InitializeLifetimeService() { return null; } }

Listener phi c nh ngha trong mt assembly ring n c th c tham chiu bi ng dng client v lp kh-truy-xut-t-xa (c hai u cn tng tc vi n). By gi ng dng client c th khi chy tc v bt ng b thng qua lp RemoteObject v th l s kin thng qua lp EventListener. on m di y trnh by mt client ch n gin hin th thng bo khi nhn c s kin:

500 Chng 12: Dch v Web XML v Remoting

using System; using System.Windows.Forms; using System.Runtime.Remoting;

public class ClientForm : System.Windows.Forms.Form {

private System.Windows.Forms.Button cmdStart;

// (B qua phn m designer.)

RemoteObject.RemoteObject remoteObj; EventListener.EventListener listener;

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

RemotingConfiguration.Configure("Client.exe.config"); remoteObj = new RemoteObject.RemoteObject(); listener = new EventListener.EventListener(); }

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

// Kt ni phng thc th l s kin xa. remoteObj.TaskComplete += new RemoteObject.TaskCompleted(listener.OnTaskComplete);

// Kt ni phng thc th l s kin cc b. listener.TaskComplete += new RemoteObject.TaskCompleted(TaskComplete);

remoteObj.StartTask(); MessageBox.Show("Task has been started."); }

// nh ngha phng thc th l s kin cc b.

501 Chng 12: Dch v Web XML v Remoting private void TaskComplete(object sender, RemoteObject.TaskCompleteEventArgs e) {

MessageBox.Show("Event received: " + e.Result); } }

c th lm vic, bn phi chc rng client ang s dng cc knh hai chiu. Do , th <channel> trong file cu hnh phi trng ging nh sau:
<channel ref="tcp" port="0" />

V khng c ging nh cc v d di y:
<channel ref="tcp server" port="0" /> <channel ref="tcp client" port="0" />

Ngoi ra, bn phi kch hot vic h tr full serialization. Nu khng, server s khng c php nhn y nhim cho phng thc Listener.TaskCompleted, v s khng th kt ni n phng thc th l s kin xa. kch hot vic h tr full serialization bn server, bn cn thay i file cu hnh ca host nh sau:
<configuration> <system.runtime.remoting> <application> <client url="tcp://localhost:9080/Server"> <activated type="RemoteObject.RemoteObject, RemoteObject"/> </client>

<channels> <channel ref="tcp" port="0"> <serverProviders> <formatter ref="binary" typeFilterLevel="Full" /> </serverProviders> </channel> </channels>

</application> </system.runtime.remoting> </configuration>

kch hot vic h tr full serialization bn client, bn cn thay i file cu hnh ca client nh sau:
<configuration>

502 Chng 12: Dch v Web XML v Remoting

<system.runtime.remoting> <application name="SimpleServer" > <service> <activated type="RemoteObject.RemoteObject, RemoteObject"/> </service> <channels> <channel ref="tcp" port="9080"> <serverProviders> <formatter ref="binary" typeFilterLevel="Full" /> </serverProviders> </channel> </channels> </application> </system.runtime.remoting> </configuration>

11.

Kim sot thi gian sng ca mt i tng xa


Bn mun cu hnh thi gian sng ca mt i tng n-nht hay c-clientkch-hot khi n khng cn c s dng. Ch nh cc thit lp mc nh v thi gian sng trong file cu hnh ca host; chp phng thc InitializeLifetimeService trong lp xa; hoc hin thc mt c ch kim sot thi gian sng bn client.

Nu mt i tng s dng ch kch hot gi mt ln (single-call activation), n s t ng b hy vo cui mi li gi phng thc. iu ny khc vi cc i tng c-clientkch-hot (client-activated) v n-nht (singleton), cc i tng ny c thi gian sng lu hn v tun theo lifetime lease (tm dch l hp ng cho thu thi gian sng). Vi cc thit lp mc nh, mt i tng xa s t ng b hy nu n khng hot ng trong hai pht, min l n tn ti t nht nm pht. Host, i tng xa, v client u c th thay i cc thit lp v thi gian sng. Host c th ch nh cc thit lp mc nh v thi gian sng trong file cu hnh. Cc thit lp ny s p dng cho tt c cc i tng xa m n qun l. Lp xa c th chp phng thc GetLifetimeService iu chnh cc thit lp lease ban u bng i tng ILease.

503 Chng 12: Dch v Web XML v Remoting

Client c th gi phng thc MarshalByRefObject.GetLifetimeService vi mt i tng xa c th thu ly mt th hin ILease. K tip, client c th gi phng thc ILease.Renew ch nh lng thi gian ti thiu m i tng s sng.

V d di y s dng cch tip cn th nht (dng th <lifetime> trong file cu hnh ca host). Cc thit lp lease p dng cho tt c cc i tng xa do host to ra. S dng M ch pht hay S ch giy. i tng xa c thi gian sng ban u l 10 pht. Khi client truy xut i tng, thi gian sng ca n t ng c lm mi t nht ba pht.
<configuration> <system.runtime.remoting> <application> <service> <wellknown mode = "Singleton" type="RemoteObjects.RemoteObject, RemoteObjects" objectUri="RemoteObject" /> </service> <channels> <channel ref="tcp" port="9080" /> </channels> <lifetime leaseTime = "10M" renewOnCallTime = "3M" /> </application> </system.runtime.remoting> </configuration>

Mt cch tip cn khc l chp phng thc InitializeLifetimeService mt i tng xa t kim sot thi gian sng ca n. Bn c th thm on m di y vo lp xa n c thi gian sng mc nh l 10 pht v thi gian lm mi l 5 pht:
public override object InitializeLifetimeService() { ILease lease = MyBase.InitializeLifetimeService();

// Lease ch c th c cu hnh nu n ang trng thi ban u. if (lease.CurrentState == LeaseState.Initial) { lease.InitialLeaseTime = TimeSpan.FromMinutes(10); lease.RenewOnCallTime = TimeSpan.FromMinutes(5); }

504 Chng 12: Dch v Web XML v Remoting

return lease; }

Nu mun i tng c thi gian sng v hn, bn ch cn tr v mt tham chiu null thay v l i tng ILease. Trng hp thng thng nht l bn mun to mt i tng n-nht chy c lp (v lu di) ngay c khi client khng s dng n.

12.

Kim sot phin bn ca cc i tng xa


Bn mun to mt host c th qun l nhiu phin bn ca mt i tng. Ci t tt c cc phin bn ca i tng vo GAC, v ng k mi phin bn ti mt endpoint URI khc bit.

.NET Remoting khng c s h tr ni ti no cho vic nh phin bn. Khi mt client to mt i tng xa, host t ng s dng phin bn trong th mc cc b hoc, trong trng hp l mt assembly dng chung, phin bn mi nht trong GAC. h tr nhiu phin bn, bn c ba la chn: To cc ng dng host ring bit. Mi host s c mt phin bn khc nhau ca assembly i tng xa v s ng k phin bn ca n vi mt URI khc nhau. Cch ny buc bn phi chy nhiu ng dng host cng mt lc v thit thc nht khi bn ang s dng IIS (c m t trong mc 12.9). To mt assembly i tng xa hon ton mi (thay v thay i phin bn). Theo , bn c th ng k cc lp trong hai assembly ti cc URI khc nhau, s dng cng host. Ci t tt c cc phin bn ca assembly i tng xa vo GAC. Theo , bn c th to mt host nh x cc URI khc nhau n cc phin bn c th ca assembly i tng xa.

Ty chn cui cng l linh hot nht trong trng hp bn cn h tr nhiu phin bn. V d, file cu hnh di y ng k hai phin bn ca RemoteObjects ti hai endpoint khc nhau. Bn cn ghi r s phin bn v token kha cng khai khi s dng cc assembly trong GAC. Bn c th tm thy thng tin ny bng cch xem assembly trong Windows Explorer GAC plug-in (vo th mc C:\Windows\Assembly).
<configuration> <system.runtime.remoting> <application> <service> <!-- Thng tin type c chia thnh ba hng cho hp vi bin trang. Trong file cu hnh, thng tin ny phi c t trn mt hng. -->

505 Chng 12: Dch v Web XML v Remoting

<wellknown mode="SingleCall" type="RemoteObjects.RemoteObject, RemoteObjects, Version 1.0.0.1, Culture=neutral, PublicKeyToken=8b5ed84fd25209e1" objectUri="RemoteObj" /> <wellknown mode="SingleCall" type="RemoteObjects.RemoteObject, RemoteObjects, Version 2.0.0.1, Culture=neutral, PublicKeyToken=8b5ed84fd25209e1" objectUri="RemoteObj_2.0" /> </service> <channels> <channel ref="tcp server" port="9080" /> </channels> </application> </system.runtime.remoting> </configuration>

File cu hnh ca client khng phi thay i g ht (tr vic cp nht URI, nu cn). Client chn phin bn m n mun s dng bng URI tng ng.

Hnh 12.4 Th mc C:\Windows\Assembly

506 Chng 12: Dch v Web XML v Remoting

13.

To phng thc mt chiu vi dch v Web XML hay Remoting


Bn mun mt phng thc web hay mt thnh phn xa thc hin mt tc v ko di, v bn khng mun bt client phi i trong lc m lnh ang thc thi. To mt phng thc web mt chiu bng cch p dng c tnh SoapDocumentMethod hay SoapRpcMethod v thit lp thuc tnh OneWay ca c tnh ny l true. To mt phng thc Remoting mt chiu bng cch p dng c tnh OneWay thuc khng gian tn System.Runtime.Remoting.Messaging.

Vi cc phng thc mt chiu, client gi mt thng ip yu cu, v server p ng tc th cho bit rng phng thc bt u qu trnh x l. Cch lm vic ny c cc h qu sau: Client khng cn i trong lc m lnh ang thc thi. Phng thc khng th tr v thng tin no cho client (thng qua mt gi tr tr v hay mt thng s ByRef). Nu phng thc nm mt ngoi l cha-c-th-l, n s khng c truyn v cho client.

R rng l cc phng thc mt chiu khng ph hp khi client cn nhn thng tin t server. Tuy nhin, chng li l tng khi cn khi chy mt kiu tc v no pha server (chng hn, bt u mt cng vic x l b). to mt phng thc web mt chiu, bn cn p dng c tnh SoapDocumentMethod (thuc khng gian tn System.Web.Services.Protocols) cho phng thc thch hp v thit lp thuc tnh OneWay l true. V d di y l mt dch v Web XML c hai phng thc, mi phng thc u gy tr hon 10 giy. Mt trong hai phng thc ny s dng c tnh SoapDocumentMethod ( client khng phi i 10 giy).
using System; using System.Web.Services; using System.Web.Services.Protocols; public class OneWayTestWebService { [WebMethod()] public void DoLongTaskWithWait() { // (Bt u mt tc v ko di v khin client phi i.) Delay(10); } [WebMethod, SoapDocumentMethod(OneWay=true)] public void DoLongTaskWithoutWait() {

507 Chng 12: Dch v Web XML v Remoting // (Bt u mt tc v ko di nhng khng khin client phi i.) Delay(10); } private void Delay(int seconds) { DateTime currentTime = DateTime.Now; while (DateTime.Now.Subtract(currentTime).TotalSeconds < seconds) {} } }

V d trn gi nh dch v Web XML v client ang s dng SOAP document (mc nh). Nu ang s dng Remote Procedure Call (RPC), bn hy s dng c tnh tng ng l SoapRpcMethod nh du phng thc mt chiu. to mt phng thc mt chiu trong mt thnh phn trn Remoting, bn cn p dng c tnh OneWay (thuc khng gian tn System.Runtime.Remoting.Messaging) cho phng thc thch hp. on m di y trnh by mt v d ging nh trn nhng vi mt thnh phn xa:
using System; using System.Runtime.Remoting.Messaging; public class OneWayTestRemoting : MarshalByRefObject { public void DoLongTaskWithWait() { // (Bt u mt tc v ko di v khin client phi i.) Delay(10); } [OneWay()] public void DoLongTaskWithoutWait() { // (Bt u mt tc v ko di nhng khng khin client phi i.) Delay(10); } private void Delay(int seconds) { DateTime currentTime = DateTime.Now; while (DateTime.Now.Subtract(currentTime).TotalSeconds < seconds) {} } }

Phng thc mt chiu khng phi l cch duy nht loi b vic tr hon client. Bn cng c th iu chnh client gi phng thc web mt cch bt ng

508 Chng 12: Dch v Web XML v Remoting

b. Trong trng hp ny, client s i dch v Web XML hon tt, nhng n s i trn mt tiu trnh khc, v do client c th tip tc vi cc cng vic khc. Vic gi phng thc bt ng b c m t trong mc 12.6.

509

Chng 13:BO MT

13

510

511 Chng 13: Bo mt

c tiu chnh ca Microsoft .NET Framework l lm cho vic lp trnh tr nn an ton hnc bit lu tm n vic s dng mobile code5 v cc h thng phn tn. Hu ht cc h iu hnh hin i (bao gm Microsoft Windows) u h tr bo mt da-trn-ngi-dng (User-Based Security), cho php bn kim sot cc hnh ng v cc ti nguyn m mt ngi dng truy xut n. Tuy nhin, do s pht trin ca mng my tnh, c bit l Internet, s bo mt nu ch da vo nh danh ca ngi dng trn h thng l cha . Khi quan tm n bo mt, m lnh khng nn t ng nhn mc tin cy nh mc tin cy m bn n nh cho ngi ang chy m lnh ny. .NET Framework kt hp hai m hnh bo mt b sung ln nhau (thc hin nhiu vn lin quan n bo mt ngi dng v m lnh): CAS (Code Access SecurityBo mt truy xut m lnh) RBS (Role-Based SecurityBo mt da-trn-vai-tr)

CAS v RBS khng thay th hay sao li cc phng tin bo mt do h iu hnh nm di cung cp. Chng l cc c ch c lp nn, cp thm cc kh nng bo mt nng cao tnh bo mt tng th trong cc gii php c-qun-l. CAS s dng cc thng tin v ngun gc ca mt assembly c thu thp lc thc thiy l chng c (evidence) xc nh xem m lnh c th truy xut cc hnh ng v ti nguyn noy l quyn (permission). Chnh sch bo mt ca .NET Frameworkmt tp hp phn cp cc quy tc cu hnhnh ngha php nh x gia chng c v quyn. Th vin lp .NET Framework s dng cc yu cu quyn (permission demand hay permission request) bo v cc chc nng quan trng nht ca n khng b truy xut tri php. Mt yu cu buc b thc thi bo m rng: nu mun gi mt phng thc c-bo-v th m lnh phi c mt quyn c th no . CAS bo m rng: kh nng thc thi ca m lnh ty thuc vo mc tin cy ca bn i vi ngi to ra m v ngun gc ca n, ch khng phi mc tin cy i vi ngi dng ang chy m. Cc mc lin quan n CAS trong chng ny tho lun cc vn sau:

Cho php m lnh c--tin-cy-mt-phn (partially trusted code) truy xut cc


assembly tn mnh ca bn (mc 13.1).

V hiu hon ton CAS (mc 13.2) hoc ch v hiu vic kim tra quyn thc thi (mc
13.3).

Yu cu cc quyn truy xut m lnh c th v xc nh xem b thc thi cp cc


quyn no cho m lnh ca bn (mc 13.4, 13.5, 13.6, v 13.7).

Kim sot s tha k v chp thnh vin bng CAS (mc 13.8). Xem xt v x l chng c ca assembly (mc 13.9 v 13.10). X l bo mt b thc thi bng min ng dng (mc 13.11 v 13.12).
RBS cho php bn thc hin cc quyt nh lc thc thi (runtime decision) da trn nh danh (identity) v cc vai tr (role) ca ngi dng m ng dng ang chy trn danh ngha ngi dng ny. Trn h iu hnh Windows, y chnh l vic thc hin cc quyt nh da trn tn ngi dng Windows v cc nhm Windows m ngi dng thuc v. Tuy nhin, RBS
5

Mobile code l phn mm c truyn qua mt h thng mng v sau c thc thi trn h thng cc b.

512 Chng 13: Bo mt

cung cp mt c ch bo mt chung khng l thuc vo h iu hnh nm di, cho php bn tch hp vo bt k h thng ti khon ngi dng no. Cc mc trong chng ny tho lun cc vn sau y ca .NET RBS:

Tch hp RBS vi cc ti khon ngi dng Windows v xc nh xem mt ngi dng


c l thnh vin ca mt nhm Windows no hay khng (mc 13.13).

Kim sot vic truy xut n cc chc nng ca ng dng da trn ngi dng hin
hnh v cc vai tr m ngi dng ny l mt thnh vin (mc 13.14).

Gi nhn mt ngi dng Windows thc hin cc tc v h iu hnh trn danh


ngha ngi dng (mc 13.15). Cc mc lin quan n RBS v CAS trong chng ny trnh by mt s cng vic thng thng m bn s cn thc hin trong cc ng dng, nhng chng ch m t mt phn nh trong cc kh nng bo mt ca .NET Framework. hiu r hn, bn hy tham kho mt quyn sch khc chuyn v bo mt trong .NET Framework.

1.

Cho php m lnh c--tin-cy-mt-phn s dng assembly tn mnh ca bn


Bn cn vit mt assembly chia s sao cho n l kh truy xut i vi m lnh c--tin-cy-mt-phn (theo mc nh, b thc thi khng cho php m lnh c-tin-cy-mt-phn truy xut cc kiu v cc thnh vin nm trong mt assembly tn mnh). p dng c tnh System.Security.AllowPartiallyTrustedCallersAttribute cho assembly chia s ca bn.

gim thiu cc nguy c bo mt do m lnh nguy him by ra, b thc thi khng cho php cc assembly c--tin-cy-mt-phn truy xut n cc assembly tn mnh. Hn ch ny lm gim nguy c m lnh nguy him tn cng vo h thng ca bn, nhng i vi mt cch tip cn p ch nh th cn phi c li gii thch. Theo quy tc, cc assembly tn mnh c ci t trong Global Assembly Cache (GAC) v cha cc chc nng quan trng c dng chung gia nhiu ng dng. iu ny hon ton ng vi cc assembly cu thnh th vin lp .NET Framework. Cc assembly tn mnh khc t cc sn phm c-phn-b-rng-ri cng s nm trong GAC v l kh truy xut i vi cc ng dng c-qun-l. Kh nng hin din trong GAC cao, tnh kh truy xut d dng, v tm quan trng i vi nhiu ng dng khc nhau khin cho cc assembly tn mnh l mc tiu c kh nng nht i vi bt c hnh ng ph hoi no ca m lnh nguy him cqun-l. Thng thng, m lnh c kh nng nguy him l m c np t cc ni xanh Internet bn c t (hay khng c) s kim sot no. Vi chnh sch bo mt mc nh, tt c m lnh chy t my cc b u c tin cy ton phn (full trust), trong khi m lnh c np t cc ni xa ch c tin cy mt phn (partial trust). Ngn m lnh c--tin-cy-mt-phn truy xut n cc assembly tn mnh; ngha l m lnh c--tin-cy-mt-phn khng c c

513 Chng 13: Bo mt

hi s dng cc tnh nng ca assembly cho cc mc ch nguy him, v khng th kho st assembly tm cc l hng c th khai thc c. D nhin, l thuyt ny gi nh rng bn qun l chnh sch bo mt mt cch ph hp. Nu bn gn tt c m lnh c tin cy ton phn, khng ch bt k assembly no cng c th truy xut assembly tn mnh ca bn, m m lnh ny cn c th truy xut tt c cc chc nng ca .NET Framework. iu ny s l mt tai ha bo mt!

Nu bn thit k, hin thc, v th nghim assembly chia s ca bn mt cch ph hp bng CAS gii hn vic truy xut n cc thnh vin quan trng, bn khng cn p t mt hn ch bao trm ngn m lnh c--tin-cy-mtphn s dng assembly ca bn. Tuy nhin, i vi mt assembly bt k, khng th chng minh rng khng c l hng bo mt no m nguy him c th li dng. Do , bn nn xem xt cn thn nhu cu cho php m lnh c--tin-cymt-phn truy xut assembly tn mnh trc khi p dng c tnh AllowPartiallyTrustedCallersAttribute.

B thc thi ngn m lnh c--tin-cy-mt-phn truy xut cc assembly tn mnh bng cch t LinkDemand vo tp quyn FullTrust trn mi thnh vin cng-khai (public) v c-bov (protected) ca mi kiu kh-truy-xut-cng-khai c nh ngha trong assembly. iu ny c ngha l ch nhng assembly c cp cc quyn tng ng vi tp quyn FullTrust th mi c th truy xut cc kiu v thnh vin trong assembly tn mnh. Vic p dng AllowPartiallyTrustedCallersAttribute vo assembly tn mnh bo vi b thc thi khng buc LinkDemand c hiu lc trn cc thnh vin v cc kiu bn trong.

on

B thc thi chu trch nhim buc cc hot ng bo mt ngm LinkDemand c hiu lc bo v cc assembly tn mnh; C# assembler khng sinh ra cc lnh khai bo LinkDemand lc bin dch. m di y trnh by mt ng dng c s dng c tnh

AllowPartiallyTrustedCallersAttribute. Ch rng, bn phi s dng tin t assembly:

bo vi trnh bin dch rng ch ca c tnh ny l assembly (cn c gi l c tnh ton ccglobal attribute). Ngoi ra, khng cn thm phn Attribute vo tn ca c tnhmc d bn c th thm vo nu mun. V bn nhm n assembly nn c tnh ny phi c t sau cc lnh using mc trn, nhng trc cc khai bo khng gian tn v kiu.
using System.Security;

[assembly:AllowPartiallyTrustedCallers]

public class AllowPartiallyTrustedCallersExample { }

Thc t, tt c cc c tnh ton cc u nm trong mt file c lp vi phn m lnh cn li ca ng dng. Microsoft Visual Studio .NET s dng cch tip cn ny: to mt file c tn l AssemblyInfo.cs cha tt c cc c tnh ton cc.

514 Chng 13: Bo mt

Nu sau khi p dng AllowPartiallyTrustedCallersAttribute cho assembly, bn mun m lnh c--tin-cy-mt-phn ch gi c mt s thnh vin no , bn cn b sung LinkDemand cho tp quyn FullTrust trn cc thnh vin cn thit, nh c trnh by trong on m di y:
[System.Security.Permissions.PermissionSetAttribute (System.Security.Permissions.SecurityAction.LinkDemand, Name="FullTrust")] public void SomeMethod() { }

2.

Bn cn v hiu CAS.

V hiu bo mt truy xut m lnh


Thit lp thuc tnh SecurityEnabled ca lp System.Security.SecurityManager l false v lu li bng phng thc SecurityManager.SavePolicy. Bn cng c th s dng cng c Code Access Security Policy (Caspol.exe) v thc thi lnh caspol s off.

CAS l phn then cht trong m hnh bo mt ca b thc thi .NET, v cng l phn c trng ca nn tng .NET m nhiu nn tng khc khng c. Mc d CAS c xy dng vi tiu ch m bo hiu nng thc thi cao nht v c s dng mt cch cn trng trong th vin lp .NET, nhng vn c mt chi ph cho mi yu cu bo mt (security demand) v stack walk (kt qu) m b thc thi phi thc hin. i lc, bo mt mc-m-lnh c th khng l iu bn bn tm, hoc nhu cu hiu nng c th vt qu nhu cu CAS. Trong cc trng hp ny, bn c th v hiu hon ton CAS v loi b chi ph cho vic kim tra bo mt mc-m-lnh. V hiu CAS c tc dng trao cho m lnh kh nng thc hin bt k hnh ng no m .NET Framework h tr (tng ng vi tp quyn FullTrust), bao gm kh nng np m lnh khc, gi cc th vin nguyn sinh, v s dng con tr trc tip truy xut b nh.

Bn ch nn v hiu CAS v cc l do hiu nng sau khi tiu ht tt c cc chng mc c th khc t c cc c im hiu nng m ng dng ca bn i hi. Vic lp profile cho m lnh thng s nhn bit nhng vng m bn c th ci thin ng k hiu nng nhng khng phi v hiu CAS. Ngoi ra, bn cn bo m cc ti nguyn h thng c bo v bng cc c ch bo mt ca h iu hnh (nh Windows ACLs) trc khi v hiu CAS.

Caspol.exe l mt tin ch c cp cng vi .NET Framework, cho php bn cu hnh chnh sch bo mt truy xut m lnh t dng lnh. Khi bn nhp lnh caspol s off hoc caspol s on, tin ch ny s xc lp thuc tnh SecurityEnabled ca lp SecurityManager. Lp SecurityManager cung cp tp cc phng thc tnh truy xut d liu v chc nng bo

515 Chng 13: Bo mt

mt quan trng. on m di y trnh by cch s dng thuc tnh SecurityEnabled v hiu v kch hot CAS:
// V hiu CAS. System.Security.SecurityManager.SecurityEnabled = false; // Lu cu hnh. System.Security.SecurityManager.SavePolicy(); // Kch hot CAS. System.Security.SecurityManager.SecurityEnabled = true; // Lu cu hnh. System.Security.SecurityManager.SavePolicy();

hiu

CAS,

lnh

ca

bn

phi

phn

ControlPolicy

ca

System.Security.Permissions.SecurityPermission. kch hot CAS, bn khng cn phi

c quyn c th no. Thay i SecurityEnabled s khng nh hng n hot ng ca CAS trong cc tin trnh hin c, v cng khng nh hng n cc tin trnh mi cho n khi bn gi phng thc SavePolicy lu trng thi ca SecurityEnabled vo Windows Registry. ng tic, .NET Framework khng bo m nhng thay i ca SecurityEnabled s tc ng ng n hot ng ca CAS trong tin trnh hin hnh. Do , bn phi thay i SecurityEnabled ri m mt tin trnh mi c c hot ng ng nh mong mun.

Hnh 13.1 Registry Editor (CAS b v hiu)

Trng thi hin hnh ca CAS (on/off) c lu trong kha HKEY_ LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\Security\Policy ca Windows Registry. Nu kha ny khng tn ti, mc nh CAS l on.

516 Chng 13: Bo mt

3.

Thit lp thuc tnh

V hiu vic kim tra quyn thc thi


Bn cn ngn b thc thi kim tra mi assembly c np vo c quyn thc thi (execution permission) hay khng.
CheckExecutionRights

ca

lp

System.Security.

SecurityManager l false ri lu li bng phng thc SecurityManager. SavePolicy. Bn cng c th s dng cng c Code Access Security Policy

(Caspol.exe) v thc thi lnh caspol e off. Mi khi np assembly, b thc thi bo m grant-set ca assembly ny c cha phn t Execution ca SecurityPermission. B thc thi hin thc mt qu trnh phn gii chnh sch li (lazy policy resolution process), ngha l grant-set ca mt assembly khng c tnh cho n khi c mt yu cu bo mt (security demand) c thc hin trn assembly ny. Vic kim tra quyn thc thi khng ch buc b thc thi kim tra mi assembly c quyn thc thi hay khng, m cn gin tip to ra vic phn gii chnh sch i vi mi assembly c np, ph nhn li ch ca vic phn gii chnh sch li. Cc yu t ny c th gy ra s tr hon ng k khi cc assembly c np, c bit khi b thc thi np nhiu assembly cng mt lc. Trong nhiu trng hp, vic cho php m lnh np v chy khng phi l mt nguy c ng k min l tt c cc hot ng v cc ti nguyn quan trng khc c bo v bng CAS v bng c ch bo mt ca h iu hnh. B thc thi .NET cho php bn v hiu vic t ng kim tra cc quyn thc thi ngay bn trong m lnh, hay bng cng c Caspol.exe. Khi bn nhp lnh caspol e off hoc caspol e on, Caspol.exe s xc lp thuc tnh CheckExecutionRights ca lp SecurityManager. Bn c th thc hin cng vic ny bn trong m lnh nh sau:
// V hiu vic kim tra quyn thc thi. System.Security.SecurityManager.CheckExecutionRights = false;

// Lu cu hnh. System.Security.SecurityManager.SavePolicy();

// Kch hot vic kim tra quyn thc thi. System.Security.SecurityManager.CheckExecutionRights = true;

// Lu cu hnh. System.Security.SecurityManager.SavePolicy();

thay i gi tr ca CheckExecutionRights th m lnh ca bn phi c phn t ControlPolicy ca SecurityPermission. Thay i ny s c tc dng vi tin trnh hin hnh ngay tc th, cho php bn np cc assembly trong lc thc thi m b thc thi khng phi

517 Chng 13: Bo mt

kim tra chng c quyn thc thi hay khng. Tuy nhin, thay i ny s khng nh hng n cc tin trnh hin c. Do vy, bn phi lu thay i vo Windows Registry (bng phng thc SavePolicy) n c tc dng vi cc tin trnh mi.

4.

Bo m b thc thi cp cho assembly mt s quyn no


Bn cn bo m b thc thi cp cho assembly ca bn cc quyn truy xut m lnh (code access permission) m cc quyn ny quyt nh s thnh cng trong hot ng ca ng dng. S dng cc yu cu quyn (permission request) ch nh cc quyn truy xut m lnh m assembly cn phi c. Bn khai bo cc yu cu quyn bng cc c tnh quyn truy xut m lnh mc assembly.

Cc yu cu quyn cho bit cc quyn m m lnh phi c th mi c th chy c. V d, nu bn vit mt trnh xem phim sao cho ngi dng c th s dng n ti v xem phim t mt server, tht tai hi nu chnh sch bo mt ca ngi dng khng cho php chng trnh ny m mt kt ni mng n server. Chng trnh ca bn s np v chy, nhng khi ngi dng kt ni n server xem phim, chng trnh s crash vi ngoi l System.Security.SecurityException. Gii php l a vo assembly yu cu quyn cn thit c th m mt kt ni mng n server (System.Net.WebPermission hay System.Net.SocketPermission, ty thuc vo kiu kt ni bn cn m). B thc thi thc hin cc yu cu quyn vi nguyn tc: khoan np m lnh, iu ny tt hn l np m lnh v tht bi sau khi thc hin mt hnh ng m n khng c quyn. V vy, nu sau qu trnh phn gii chnh sch bo mt, b thc thi xc nh c grant-set ca assembly khng th p ng cc yu cu quyn ca assembly, n s khng np assembly v nm ngoi l System.Security.Policy.PolicyException. khai bo mt yu cu quyn, bn phi s dng bn sao c tnh (attribute counterpart) ca quyn truy xut m lnh bn cn. Tt c cc quyn truy xut m lnh u c mt bn sao c tnh m bn c th s dng to ra cc lnh bo mt khai bo (declarative security statement)bao gm cc yu cu quyn. V d, bn sao c tnh ca SocketPermission l SocketPermissionAttribute, v bn sao c tnh ca WebPermission l WebPermissionAttributeTt c cc quyn v cc bn sao c tnh ca chng cng theo quy c t tn v l cc thnh vin ca cng khng gian tn. ng dng PermissionRequestExample di y c hai yu cu quyn: mt cho SocketPermission v mt cho SecurityPermission. Bn cn nh cc iu sau: Bn phi khai bo yu cu quyn sau bt k lnh using mc trn no nhng trc bt k khai bo kiu hay khng gian tn no. c tnh phi nhm n assembly nn bn phi thm tin t assembly: vo tn c tnh. Khng cn thm phn Attribute vo tn c tnhmc d bn c th thm vo nu mun. Bn phi ch nh SecurityAction.RequestMinimum l i s u tin ca c tnhgi tr ny cho bit y l mt yu cu quyn.

518 Chng 13: Bo mt

Bn phi cu hnh c tnh m t quyn truy xut m lnh m bn cn bng cc thuc tnh ca c tnh. Bn hy tham kho ti liu .NET Framework SDK bit thm chi tit v cc thuc tnh do mi c tnh bo mt truy xut m lnh hin thc. Cc lnh yu cu quyn khng c kt thc bng du chm phy (;). to nhiu yu cu quyn, ch cn thm nhiu lnh yu cu quyn nh c trnh by trong v d di y:
using System.Net; using System.Security.Permissions; // Yu cu SocketPermission (cho php m mt kt ni // TCP n host v port c ch nh). [assembly:SocketPermission(SecurityAction.RequestMinimum, Access = "Connect", Host = "www.fabrikam.com", Port = "3538", Transport = "Tcp")] // Yu cu phn t UnmanagedCode ca SecurityPermission, // (kim sot kh nng thc thi m lnh khng-c-qun-l). [assembly:SecurityPermission(SecurityAction.RequestMinimum, UnmanagedCode = true)] public class PermissionRequestExample { public static void Main() { // Lm g ... } }

Nu bn thc thi ng dng PermissionRequestExample v chnh sch bo mt khng cp cho assembly ny cc quyn c yu cu, bn s nhn c ngoi l PolicyException nh di y v ng dng s khng thc thi. Khi s dng chnh sch bo mt mc nh, iu ny s xy ra nu bn chy assembly t mt mng dng chung v cc assembly c np t Intranet khng c cp SocketPermission.
Unhandled Exception: System.Security.Policy.PolicyException: Required permission cannot be acquired.

Khi bn np mt assembly t bn trong m lnh (t ng hay bng tay), v assembly ny c cha cc yu cu quyn m chnh sch bo mt khng p ng th phng thc m bn s dng np assembly s nm ngoi l PolicyException, do bn phi th l sao cho ph hp.

519 Chng 13: Bo mt

5.

Gii hn cc quyn c cp cho assembly


Bn cn hn ch cc quyn truy xut m lnh c cp cho assembly ca bn, m bo ngi khc v phn mm khc khng th bin m lnh ca bn thanh mt c ch m thng qua thc hin cc hnh ng nguy him hay khng mong mun. S dng cc lnh bo mt khai bo (declarative security statement) ch nh cc yu cu quyn ty chn (optional permission request) v cc yu cu loi tr quyn (permission refusal request) trong assembly ca bn. Cc yu cu quyn ty chn nh ngha tp ti a cc quyn m b thc thi s cp cho assembly. Cc yu cu loi tr quyn ch nh cc quyn c th m b thc thi s khng cp cho assembly.

Nu quan tm n bo mt, tht l tng khi m lnh ca bn ch c cc quyn truy xut m lnh cn thit thc hin chc nng ca n. iu ny gim thiu nguy c ngi khc v m lnh khc s dng m lnh ca bn thc hin cc hnh ng nguy him hay khng mong mun. Vn l, b thc thi phn gii cc quyn ca mt assembly bng chnh sch bo mt (do mt ngi dng no hay ngi qun tr cu hnh). Chnh sch bo mt c th khc nhau ti mi ni m ng dng chy, v bn khng th kim sot cc quyn m chnh sch bo mt n nh cho m lnh ca bn. Mc d bn khng th kim sot chnh sch bo mt ti tt c cc ni m m lnh chy, nhng .NET Framework cung cp hai c ch m thng qua , bn c th loi b cc quyn c cp cho assembly ca bn: yu cu loi tr (refuse request) v yu cu ty chn (optional request). Yu cu loi tr cho php bn ch ra cc quyn c th m bn khng mun b thc thi cp cho assembly. Sau qu trnh phn gii chnh sch, nu grant-set ca mt assembly cha bt k quyn no c ch nh trong mt yu cu loi tr, b thc thi s loi b quyn . Yu cu ty chn nh ngha tp ti a cc quyn m b thc thi c th cp cho assembly. Nu grant-set ca mt assembly cha bt k quyn no khc vi cc quyn c ch nh trong yu cu ty chn, b thc thi s loi b quyn . Khc vi yu cu quyn ti thiu ( c tho lun trong mc 13.4), b thc thi s khng t chi np assembly cua bn nu n khng th cp tt c cc quyn c ch nh trong yu cu ty chn. Bn c th coi yu cu loi tr v yu cu ty chn l cc cch chn la thu c cng kt qu; cch m bn s dng ty thuc vo s lng quyn bn mun loi b. Nu mun loi b mt s t quyn, bn hy chn yu cu loi tr. Tuy nhin, nu mun loi b nhiu quyn, bn hy chn yu cu ty chn (yu cu ny gm mt s quyn bn cn, phn quyn con li se t ng bi loi bo). Bn thm cc yu cu ty chn v yu cu loi tr vo m lnh bng cc lnh bo mt khai bo vi c php ging nh cc yu cu quyn ti thiu c tho lun trong mc 13.4. im khc bit duy nht l gi tr ca System.Security.Permissions.SecurityAction m bn truyn cho phng thc khi dng ca c tnh quyn. S dng SecurityAction.RequestOptional khai bo mt yu cu ty chn v SecurityAction.RequestRefuse khai bo mt yu cu loi tr. Cng ging nh cc yu cu quyn ti thiu, bn phi khai bo cc yu cu ty chn v yu cu loi tr l cc c tnh ton cc bng cch thm tin t assembly: vo tn c tnh. Ngoi ra, tt c cc yu cu phi

520 Chng 13: Bo mt

xut hin sau bt k lnh using mc trn no nhng trc bt k khai bo kiu hay khng gian tn no. V d di y minh ha mt yu cu quyn ty chn cho tp quyn Internet. y l tp quyn c nh ngha bi chnh sch bo mt mc nh. Khi b thc thi np OptionalRequestExample, n s khng cp cho assembly ny bt c quyn no khng nm trong tp quyn Internet (tham kho ti liu .NET Framework SDK bit thm chi tit v cc quyn trong tp quyn Internet).
using System.Security.Permissions; [assembly:PermissionSet(SecurityAction.RequestOptional, Name = "Internet")] public class OptionalRequestExample { public static void Main() { // Lm g ... } }

Tri vi OptionalRequestExample, v d di y s dng mt yu cu loi tr loi b quyn System.Security.Permissions.FileIOPermission (m t quyn truy xut ghi i vi a C):
using System.Security.Permissions; [assembly:FileIOPermission(SecurityAction.RequestRefuse, Write = @"C:\")] public class RefuseRequestExample { public static void Main() { // Lm g ... } }

6.

Xem cc yu cu quyn c to bi mt assembly


Bn cn xem cc cc loi tr v cc yu cu quyn khai bo c to bn trong mt assembly c th cu hnh chnh sch bo mt mt cch ph hp, hoc

521 Chng 13: Bo mt

nm c cc mt hn ch ca mt th vin m bn mun gi t m lnh ca bn.

S dng cng c Permissions View (Permview.exec cp cng vi .NET Framework SDK).

cu hnh chnh sch bo mt mt cch ph hp, bn cn bit cc nhu cu quyn truy xut m lnh (code access permission requirements) ca cc assembly m bn d nh s chy. iu ny ng cho c cc th vin v cc assembly thc thi c truy xut t ng dng ca bn. i vi th vin, bn cn bit assembly loi b nhng quyn no khng s dng th vin ny thc hin mt hnh ng b hn ch (s dn n ngoi l System.Security.SecurityException). Cng c Permview.exe cung cp mt c ch n gin m thng qua , bn c th xem cc yu cu quyn khai bo (declarative permission request) c to bn trong mt assembly bao gm yu cu ti thiu (minimum request), yu cu ty chn (optional request), v yu cu loi tr (refusal request). V d, lp di y khai bo mt cu ti thiu, mt yu cu ty chn, v mt yu cu loi tr:
using System.Net; using System.Security.Permissions; // Yu cu quyn ti thiu: SocketPermission. [assembly:SocketPermission(SecurityAction.RequestMinimum, Unrestricted = true)] // Yu cu quyn ty chn: SecurityPermission. [assembly:SecurityPermission(SecurityAction.RequestOptional, Unrestricted = true)] // Yu cu loi tr quyn: FileIOPermission. [assembly:SecurityPermission(SecurityAction.RequestRefuse, Unrestricted = true)] public class PermissionViewExample { public static void Main() { // Lm g ... } }

Thc thi lnh permview PermissionViewExample.exe s sinh ra kt xut nh sau. Mc d khng my thn thin nhng bn vn c th c kt xut xc nh cc yu cu quyn c to bi assembly. Mi kiu trong ba kiu yu cu quynti thiu, ty chn, v loi tr c lit k di mt tiu ring v c kt cu dng XML ca mt i tng System.Security.PermissionSet.

522 Chng 13: Bo mt

Microsoft (R) .NET Framework Permission Request Viewer. Version 1.1.4322.510 Copyright (C) Microsoft Corporation 1998-2002. All rights reserved. minimal permission set: <PermissionSet class="System.Security.PermissionSet" version="1"> <IPermission class="System.Net.SocketPermission, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/> </PermissionSet> optional permission set: <PermissionSet class="System.Security.PermissionSet" version="1"> <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/> </PermissionSet> refused permission set: <PermissionSet class="System.Security.PermissionSet" version="1"> <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/> </PermissionSet>

Bng cch ch nh i s /decl khi chy tin ch Permview.exe, bn c th xem tt c cc lnh bo mt khai bo (declarative security statement) nm trong mt assembly. Vic ny cho thy r nhng g assembly thc hin bn trong v cho php bn cu hnh chnh sch bo mt mt cch ph hp. Tuy nhin, Permview.exe khng hin th cc thao tc bo mt bt buc (imperative security operation) nm trong mt assembly. Hin khng c cch no trch v tng kt cc thao tc bo mt bt buc c thc thi bn trong mt assembly.

7.

Xc nh m lnh c quyn no lc thc thi hay khng


Bn cn xc nh assembly ca bn c mt quyn c th no lc thc thi hay khng.

523 Chng 13: Bo mt

To v cu hnh quyn m bn mun kim tra ri truyn n cho phng thc tnh IsGranted ca lp System.Security.SecurityManager.

S dng yu cu quyn ti thiu, bn c th bao am rng b thc thi cp cho assembly tp cc quyn c ch nh; nu m lnh ca bn ang chy, bn c th chc rng n c cc quyn ti thiu c yu cu. Tuy nhin, bn c th mun hin thc mt chc nng c tnh c hi sao cho ng dng c th cung cp chc nng ch khi b thc thi cp cho assembly ca bn cc quyn phu hp. Cch tip cn ny c chnh thc ha mt phn bng cc yu cu quyn ty chn, cho php bn nh ngha mt tp cc quyn m m lnh ca bn c th tn dng nu chnh sch bo mt cp chng, nhng li khng thit yu i vi s vn hnh thnh cng cua ma lnh (mc 13.5 trnh by chi tit v cc yu cu quyn ty chn). Vn i vi cc yu cu quyn ty chn l b thc thi khng c kh nng bo cho assembly rng n cp nhng quyn no. Bn c th s dng mt thao tc c-bo-v v tht bi mt cch m xui khi li gi ny dn n ngoi l System.Security.SecurityException. Tuy nhin, s hiu qu hn khi xc nh xem bn c cc quyn cn thit hay khng. Sau , bn c th xy dng logic vo trong m lnh trnh gi phai cc thnh vin c-bo-v m s gy ra stack walk v dng nn cc ngoi l bo mt. on m di y trnh by cch s dng phng thc IsGranted xc nh xem assembly hin ti c quyn ghi vo th mc C:\Data hay khng. Bn c th to mt li gi nh th mi khi bn cn kim tra quyn, nhng s hiu qu hn nu s dng mt gi tr lun l thit lp mt c cu hnh cho bit c cho php ngi dng lu file hay khng.
// nh ngha mt bin lun l cho bit assembly c quyn // truy xut ghi i vi th mc C:\Data hay khng. bool canWrite = false; // To v cu hnh mt i tng FileIOPermission m t quyn // truy xut ghi i vi th mc C:\Data. System.Security.Permissions.FileIOPermission fileIOPerm = new System.Security.Permissions.FileIOPermission( System.Security.Permissions.FileIOPermissionAccess.Write, @"C:\Data"); // Kim tra assembly hin ti c quyn c ch nh hay khng. canWrite = System.Security.SecurityManager.IsGranted(fileIOPerm);

8.

Hn ch ai tha k cc lp ca bn v chp cc thnh vin lp


Bn cn kim sot nhng ai c th tha k cc lp ca bn thng qua s tha k (inheritance) v mt lp dn xut c th chp nhng thnh vin no.

524 Chng 13: Bo mt

S dng cc lnh bo mt khai bo (declarative security statement) p dng thnh vin SecurityAction.InheritanceDemand vo phn khai bo ca cc lp v cc thnh vin bn cn bo v.

Cc modifier nh sealed, public, private, v virtual cho php bn kim sot kh nng ca cc lp khc khi cc lp ny tha k lp ca bn v chp cc thnh vin ca n. Tuy nhin, cc modifier ny khng linh hot, khng c kh nng chn lc khi gii hn nhng m lnh no c th tha k mt lp hoc chp cc thnh vin ca n. V d, bn mun ch nhng m lnh do cng ty hay khoa ca bn vit th mi c th tha k cc lp nghip v quan trng, hoc ch nhng m lnh c np t my cc b th mi c th tha k cc phng thc no . Bng cch p dng InheritanceDemand vo khai bo lp hay thnh vin, bn c th ch nh cc quyn (lc thc thi) m mt lp phi c th mi c th tha k lp ca bn hoc chp cc thnh vin c th no . Nh rng, cc quyn ca mt lp l cc quyn ca assembly m lp ny c khai bo trong . Mc d bn c th yu cu bt k quyn hay tp quyn no trong InheritanceDemand, nhng thng thng l yu cu cc quyn nh danh (identity permission). Quyn nh danh m t chng c (evidence) do mt assembly a cho b thc thi. Nu mt assembly a ra cc kiu chng c no lc np, b thc thi s t ng gn cho assembly ny quyn nh danh ph hp. Quyn nh danh cho php bn s dng cc lnh bo mt bt buc v khai bo (imperative v declarative security statement) trc tip ra cc quyt nh bo mt (security decision) cn c trn nh danh m (code identity) m khng cn trc tip nh gi cc i tng chng c. Bng 13-1 lit k kiu quyn nh danh c to cho mi kiu chng c (kiu chng c l thnh vin ca khng gian tn System.Security.Policy, kiu quyn nh danh l thnh vin ca khng gian tn System.Security.Permissions).
Bng 13.1 Cc lp chng c v cc quyn nh danh
Lp chng c ApplicationDirectory Hash Publisher Site StrongName Url Zone Quyn nh danh Khng Khng PublisherIdentityPermission SiteIdentityPermission StrongNameIdentityPermission UrlIdentityPermission ZoneIdentityPermission

B thc thi gn cc quyn nh danh cho mt assembly da trn chng c do assembly ny a ra. Bn khng th gn thm quyn nh danh cho mt assembly thng qua vic cu hnh chnh sch bo mt.

Bn phi s dng c php bo mt khai bo (declarative security syntax) hin thc mt InheritanceDemand, nn bn phi s dng bn sao c tnh (attribute counterpart) ca lp quyn m bn mun yu cu. Tt c cc lp quyn u c mt bn sao c tnh to cc

525 Chng 13: Bo mt

lnh bo mt khai bobao gm InheritanceDemand. V d, bn sao c tnh ca PublisherIdentityPermission l PublisherIdentityPermissionAttribute, v bn sao c tnh ca StrongNameIdentityPermission l StrongNameIdentityPermissionAttributett c cc quyn v cc bn sao c tnh ca chng cng theo quy c t tn v l cc thnh vin ca cng khng gian tn. kim sot nhng m lnh no c th tha k lp ca bn, hy p dng InheritanceDemand khi khai bo lp. on m di y trnh by mt lp c bo v bng InheritanceDemand. Theo , ch nhng lp bn trong cc assembly c k bi publisher-certificate (nm trong file pubcert.cer) th mi c th tha k lp InheritanceDemandExample. Ni dung ca file pubcert.cer c c lc bin dch, v cc thng tin chng thc cn thit c gn vo assembly.
[PublisherIdentityPermission(SecurityAction.InheritanceDemand, CertFile = @"I:\CSharp\Chuong13\pubcert.cer")] public class InheritanceDemandExample { }

kim sot nhng m lnh no c th chp cc thnh vin no , bn hy p dng InheritanceDemand khi khai bo thnh vin. Xt on m di y, ch nhng lp c cp tp quyn FullTrust th mi c th chp phng thc SomeProtectedMethod.
[PermissionSet(SecurityAction.InheritanceDemand, Name="FullTrust")] public void SomeProtectedMethod () { }

9.

Kim tra chng c ca mt assembly


Bn cn kim tra chng c m b thc thi gn cho mt assembly. Thu ly i tng System.Reflection.Assembly m t assembly m bn quan tm. Ly tp hp System.Security.Policy.Evidence t thuc tnh Evidence ca i tng Assembly, ri truy xut cc i tng chng c bn trong bng phng thc GetEnumerator, GetHostEnumerator, hay GetAssemblyEnumerator ca lp Evidence.

Lp Evidence m t mt tp hp cc i tng chng c. Thuc tnh ch-c Evidence ca lp Assembly tr v mt i tng tp hp Evidence cha tt c cc i tng chng c m b thc thi gn cho assembly khi assembly ny c np. Tht ra, lp Evidence cha hai tp hp, m t hai kiu chng c khc nhau: chng c host v chng c assembly. Chng c host bao gm cc i tng chng c c gn cho assembly bi b thc thi hay m lnh np assembly (m lnh ny l ng tin cy). Chng c assembly m t cc i tng chng c ty bin c nhng vo assembly lc to dng. Lp Evidence hin thc ba phng thc sau y lit k cc i tng chng c bn trong:
GetEnumerator

526 Chng 13: Bo mt

GetHostEnumerator GetAssemblyEnumerator

Phng thc GetEnumerator tr v mt System.Collections.IEnumerator dng lit k tt c cc i tng chng c bn trong tp hp Evidence. Phng thc GetHostEnumerator v GetAssemblyEnumerator tr v mt th hin IEnumerator lit k ch cc i tng chng c t tp hp tng ng. V d di y trnh by cch hin th chng c host v chng c assembly ca mt assembly. Ch rng, tt c cc lp chng c chun u chp phng thc Object.ToString biu din trng thi ca i tng chng c. Mc d c lin quan nhng khng phi lc no v d ny cng hin th chng c m mt assembly s c khi c np t bn trong chng trnh ca bn. Runtime host (nh Microsoft ASP.NET hay Microsoft Internet Explorer runtime host) c th t gn thm chng c host khi n np mt assembly.
using System; using System.Reflection; using System.Collections; using System.Security.Policy;

public class ViewEvidenceExample { public static void Main(string[] args) {

// Np assembly c ch nh. Assembly a = Assembly.LoadFrom(args[0]);

// Thu ly tp hp Evidence t assembly c np. Evidence e = a.Evidence;

// Hin th chng c host. IEnumerator x = e.GetHostEnumerator(); Console.WriteLine("HOST EVIDENCE COLLECTION:"); while(x.MoveNext()) { Console.WriteLine(x.Current.ToString()); }

// Hin th chng c assembly. x = e.GetAssemblyEnumerator(); Console.WriteLine("ASSEMBLY EVIDENCE COLLECTION:"); while(x.MoveNext()) {

527 Chng 13: Bo mt Console.WriteLine(x.Current.ToString()); } } }

Tt c cc lp chng c chun do .NET Framework cp u bt bin, bn khng th thay i cc gi tr ca chng sau khi b thc thi to ra ri gn chng cho assembly. Ngoi ra, bn khng th thm hay loi b cc item trong lc ang lit k mt tp hp bng IEnumerator, nu khng, phng thc MoveNext s nm ngoi l System.InvalidOperationException.

10.

X l chng c khi np mt assembly


Bn cn x l chng c khi np mt assembly tc ng n cc quyn m b thc thi cp cho assembly. To cc i tng chng c m bn mun gn cho assembly, sau thm chng vo mt th hin ca lp System.Security.Policy.Evidence, ri truyn tp hp Evidence cho phng thc dng np assembly.

Chng c (c chim hu bi mt assembly) nh ngha nh danh (identity) ca assembly v xc nh b thc thi cp cc quyn no cho assembly. B np assembly (Assembly Loader) chu trch nhim chnh trong vic xc nh gn chng c g cho mt assembly, nhng mt host ng tin cy (nh ASP.NET hay Internet Explorer runtime host) cng c th gn chng c cho mt assembly. M lnh ca bn c th gn chng c khi np mt assembly nu m lnh ny c phn t ControlEvidence ca SecurityPermission.

Nu bn np mt assembly vo mt min ng dng hai ln nhng gn chng c khc vo assembly ny mi ln nh th, b thc thi s nm ngoi l System.IO.FileLoadException.

C nhiu phng thc thc hin vic gn chng c khi np mt assembly. Mt c im m tt c cc phng thc ny thng c l nhn mt tp hp Evidence lm i slp Evidence l mt b cha cho cc i tng chng c. Bn phi t tng i tng chng c m bn mun gn cho assembly vo mt tp hp Evidence v truyn n cho phng thc np assembly. Nu bn gn chng c mi xung t vi chng c c gn bi b np assembly, chng c mi s thay th chng c c. Bng 13-2 lit k cc lp v cc phng thc ca chng trc tip hay gin tip np mt assembly. Mi phng thc cung cp mt hay nhiu phin bn np chng chp nhn mt tp hp Evidence.
Bng 13.2 Cc lp v cc phng thc ca chng cho php bn gn chng c cho mt assembly Lp/Phng thc M t

Lp System.Activator
CreateInstance CreateInstanceFrom

Cc phng thc ny nh hng n min ng dng hin hnh. To mt kiu trong min ng dng hin hnh t assembly c ch nh.

528 Chng 13: Bo mt

Lp System.AppDomain
CreateInstance CreateInstanceAndUnwrap CreateInstanceFrom CreateInstanceFromAndUnwrap

Cc phng thc ny nh hng n min ng dng c m t bi i tng AppDomain (phng thc c gi trn ).

To mt kiu t assembly c ch nh.

To
DefineDynamicAssembly

mt i tng System.Reflection.Emit. AssemblyBuilder, bn c th s dng n to ng mt assembly trong b nh. Np v thc thi mt assembly c im nhp c nh ngha (phng thc Main). Np assembly c ch nh. Cc phng thc ny nh hng n min ng dng hin hnh.

ExecuteAssembly Load

Lp System.Reflection.Assembly
Load LoadFile LoadFrom LoadWithPartialName

Np assembly c ch nh.

on m di y trnh by cch s dng phng thc Assembly.Load np mt assembly vo min ng dng hin hnh. Trc khi gi Load, on m ny to mt tp hp Evidence v s dng phng thc AddHost ca n thm cc i tng chng c Site v Zone (cc thnh vin ca khng gian tn System.Security.Policy).
// To cc i tng chng c Site v Zone mi. System.Security.Policy.Site siteEvidence = new System.Security.Policy.Site("www.microsoft.com"); System.Security.Policy.Zone zoneEvidence = new System.Security.Policy.Zone(System.Security.SecurityZone.Trusted); // To mt tp hp Evidence mi. System.Security.Policy.Evidence evidence = new System.Security.Policy.Evidence(); // Thm cc i tng chng c Site v Zone vo tp hp Evidence // bng phng thc AddHost.

529 Chng 13: Bo mt evidence.AddHost(siteEvidence); evidence.AddHost(zoneEvidence); // Np assembly c tn l "SomeAssembly" v gn cc i tng Site v // Zone cho n. Cc i tng ny s chp cc i tng Site v Zone // do b np assembly gn. System.Reflection.Assembly assembly = System.Reflection.Assembly.Load("SomeAssembly", evidence);

11. X l bo mt b thc thi bng chng c ca min ng dng



Bn cn buc mt gii hn trn (upper limit) ln cc quyn ang c hiu lc vi tt c cc assembly c np vo mt min ng dng c th. Cu hnh chnh sch bo mt cp cc quyn ph hp da trn chng c m bn d nh gn cho min ng dng. Khi to min ng dng bng phng thc tnh CreateDomain ca lp System.AppDomain, bn hy cung cp mt tp hp System.Security.Policy.Evidence cha cc i tng chng c ca min ng dng. Sau , np cc assembly m bn mun gii hn cc quyn ca chng bn trong min ng dng ny.

ng nh b thc thi gn quyn cho assembly da trn chng c m assembly ny a ra lc np, b thc thi cng gn quyn cho cc min ng dng da trn chng c ca chng. B thc thi khng gn chng c cho cc min ng dng theo cch nh n gn cho cc assembly v khng c g chng c ta vo. Thay vo , m lnh to min ng dng phi gn chng c khi cn.

B thc thi ch s dng cc mc chnh sch cng ty (enterprise), my (machine), v ngi dng (user) tnh cc quyn ca mt min ng dng; cc chnh sch bo mt ca cc min ng dng hin c khng gi vai tr g c. Mc 13.12 s tho lun chnh sch bo mt min ng dng.

Cc min ng dng khng c chng c l trong sut i vi cc c ch bo mt truy xut m lnh ca b thc thi. Cc min ng dng c gn chng c c mt grant-set da trn chnh sch bo mt v ng mt vai tr quan trng trong vic phn gii cc yu cu bo mt CAS. Khi qu trnh thc thi ng dng xuyn qua mt bin min ng dng, b thc thi ghi li vic chuyn tip trn call stack. Khi mt yu cu bo mt gy nn mt stack walk, bn ghi chuyn tip min ng dng c x l ging nh cc bn ghi stack khcb thc thi nh gi grantset kt giao vi bn ghi stack bo m n cha cc quyn c yu cu. iu ny ngha l cc quyn ca mt min ng dng nh hng n tt c m lnh c np vo min ng dng. Thc t, min ng dng thit lp mt gii hn trn ln cc kh nng ca tt c m lnh c np vo n. Mt v d quan trng trong s dng chng c min ng dng l Microsoft Internet Explorer. Internet Explorer to mt min ng dng cho mi site m n download cc iu kim cqun-l t . Tt c cc iu kim c download t mt site cho trccng nh cc assembly m chng npchy trong cng min ng dng. Khi Internet Explorer to min

530 Chng 13: Bo mt

ng dng cho mt site, n gn chng c System.Security.Policy.Site cho miu ng dng ny. iu ny bo m rng, nu cc iu kim c download np mt assembly (ngay c t a cc b), cc hnh ng ca assembly ny b rng buc bi cc quyn c cp cho min ng dng da trn chng c Site v chnh sch bo mt.

Tr khi bn gn chng c cho min ng dng mt cch tng minh khi to n, min ng dng ny khng nh hng g n cc yu cu bo mt (security demand).

gn chng c cho mt min ng dng, bn hy to mt tp hp Evidence v thm cc i tng chng c cn thit vo bng phng thc Evidence.AddHost. Khi to min ng dng mi, bn truyn tp hp Evidence cho mt trong cc phin bn np chng ca phng thc tnh CreateDomain. Qu trinh phn giai chinh sch thng ky cua b thc thi se xc inh grant-set ca min ng dng. ng dng di y trnh by cch gn chng c cho mt min ng dng. Trong , ng dng np m lnh t mt publisher c th vo mt min ng dng publisher c th. Bng cch gn cho miu ng dng chng c System.Security.Policy.Publisher m t publisher ca phn mm, v d ny hn ch cc kh nng ca m lnh c np vo min ng dng. S dng chnh sch bo mt, bn c th gn m lnh ca publisher mt tp quyn cc i tng xng vi mc tin cy bn t vo publisher.
using System; using System.Security.Policy; using System.Security.Cryptography.X509Certificates;

public class AppDomainEvidenceExample {

public static void Main() {

// To mt min ng dng mi cho mi publisher m ng dng ny // s np m lnh ca n. Truyn cho phng thc CreateAppDomain // tn cng ty, v tn ca file cha chng ch X.509v3 // ca cng ty ny. AppDomain appDom1 = CreateAppDomain("Litware", "litware.cer"); AppDomain appDom2 = CreateAppDomain("Fabrikam", "fabrikam.cer");

// Np m lnh t cc publisher vo min ng dng ph hp // thc thi. }

531 Chng 13: Bo mt

// Phng thc ny to mt min ng dng mi np v chy m lnh // trong t mt publisher c th. i s name ch nh tn ca // min ng dng. i s certFile ch nh tn ca file cha // mt chng ch X.509v3 cho publisher m m lnh ca n s // c chy trong min ng dng mi. private static AppDomain CreateAppDomain(string name, string certFile){

// To mt i tng X509Certificate mi t chng ch X.509v3 // nm trong file c ch nh. X509Certificate cert = X509Certificate.CreateFromCertFile(certFile);

// To chng c Publisher mi t i tng X509Certificate. Publisher publisherEvidence = new Publisher(cert);

// To mt tp hp Evidence mi. Evidence evidence = new Evidence();

// Thm chng c Publisher vo tp hp Evidence. evidence.AddHost(publisherEvidence);

// Tao mt min ng dung mi vi tp hp Evidence // cha chng c Publisher va tra v min ng dung // va c tao ra. return AppDomain.CreateDomain(name, evidence); } }

12.

X l bo mt b thc thi bng chnh sch bo mt ca min ng dng


Bn cn kim sot (bng m lnh) cc quyn c cp cho cc assembly. Cu hnh (bng m lnh) chnh sch bo mt ca min ng dng m bn np cc assembly vo .

532 Chng 13: Bo mt

Chnh sch bo mt (security policy) bao gm bn mc chnh sch: cng ty (enterprise), my (machine), ngi dng (user), v min ng dng (application domain). B thc thi quyt nh nhng quyn no cp cho mt assembly bng cch xc nh tp quyn c cp bi mi mc chnh sch ri tnh php giao (php AND lun l) ca bn tp quyn. Cc quyn nm trong tp giao l grant-set cui cng ca assembly.

Ngay c khi cc mc chnh sch cng ty, my, hay ngi dng ch nh code group LevelFinal (ch th b thc thi khng nh gi cc mc chnh sch thp hn), b thc thi lun s dng mc chnh sch ca min ng dng tnh grantset ca mt assembly.

Ch cc mc chinh sch cng ty, my, v ngi dng l c cu hnh tnh bng Administrative Tools. V min ng dng khng tn ti bn ngoi ng cnh ca b thc thi nn khng th cu hnh tnh chnh sch min ng dng c. cu hnh chnh sch bo mt ca mt min ng dng, bn phi to mt mc chnh sch (bng m lnh) ri gn n cho min ng dng. Xy dng mt mc chnh sch bng m lnh c th l mt cng vic lu di, ty thuc vo phc tp ca chnh sch bo mt m bn cn din t. Lp System.Security.Policy.PolicyLevel m t mt mc chnh sch bo mt. Bn trong mi i tng PolicyLevel, bn phi to dng mt cu trc phn cp cc code group, nh ngha cc iu kin thnh vin, cc tp quyn, v cc c tnh ca mi code group. C rt nhiu kiu c s dng to dng mc chnh sch, v tho lun v cc kiu ny l vt qu phm vi quyn sch ny. Lp trnh bo mt .NET, nh cp trc y, cung cp thng tin chi tit v mi lp ny v trnh by cch xy dng mt mc chnh sch bng m lnh.

Thng thng, bn s pht trin mt cng c tr gip vic to mt mc chnh sch v ghi nh ngha mc chnh sch ra file; sau , bn c th np nh ngha ny t a khi cn. Lp PolicyLevel c hai phng thc nhm n gin ha qu trnh ny: ToXml a mt i tng PolicyLevel v dng d lu tr, v FromXml xy dng li mt i tng PolicyLevel t dng c lu tr.

Mt khi c i tng PolicyLevel m t chnh sch bo mt nh mong mun, bn c th gn n cho mt min ng dng. Thu ly tham chiu System.AppDomain n min ng dng m bn mun cu hnh, v truyn i tng PolicyLevel cho phng thc AppDomain.SetAppDomainPolicy. M lnh ca bn phi c phn t ControlDomainPolicy ca SecurityPermission th mi c th gi SetAppDomainPolicy. Bn ch c th gi SetAppDomainPolicy mt ln trn mi min ng dng; nu bn gi SetAppDomainPolicy ln th hai, n s nm ngoi l System.Security.Policy.PolicyException. Bn khng phi gn i tng PolicyLevel cho mt min ng dng trc khi np cc assembly vo min ng dng ny. Cc assembly c np trc khi bn thit lp chnh sch bo mt min ng dng c cc grant-set ch da trn cc mc chnh sch: cng ty, my, v ngi dng. Chnh sch min ng dng ch p dng cho cc assembly c np sau khi n c cu hnh. Thng thng, bn s dng kh nng ny np cc assembly chia s ngtin-cy vo min ng dng m khng b rng buc bi chnh sch min ng dng.

533 Chng 13: Bo mt

ng dng di y trnh by qu trnh to mt mc chnh sch v gn n cho mt min ng dng. Mc chnh sch ny cp cc quyn da trn publisher ca mt assemblyc th hin trong cc khon ca chng c System.Security.Policy.Publisher.
using System; using System.Security; using System.Security.Policy; using System.Security.Cryptography.X509Certificates;

public class AppDomainPolicyExample { public static void Main() { // To mt min ng dng mi ( np cc assembly vo ). AppDomain domain = AppDomain.CreateDomain("modules"); // Np cc assembly vo min ng dng m bn khng mun // b rng buc bi chnh sch bo mt min ng dng.

// Cu hnh chnh sch bo mt cho i tng AppDomain. SetDomainPolicy(domain);

// Np cc assembly vo min ng dng c bo v. } // Phng thc ny cu hnh chnh sch bo mt ca i tng // AppDomain c truyn cho n. Chnh sch bo mt s gn cc // quyn khc nhau cho mi assembly da trn publisher ca // assembly. Nhng assembly t cc publisher v danh khng c // cp quyn no c. private static void SetDomainPolicy(AppDomain domain) {

// To mt PolicyLevel mi cho min ng dng. PolicyLevel policy = PolicyLevel.CreateAppDomainLevel();

// To mt FirstMatchCodeGroup mi dng lm nt gc ca h // thng phn cp code group. Cu hnh group ny sao cho

534 Chng 13: Bo mt

// n trng khp vi tt c code. iu ny ngha l tt c // cc assembly u khi u vi mt grant-set rng cho // mc chnh sch min ng dng. policy.RootCodeGroup = new FirstMatchCodeGroup( new AllMembershipCondition(), new PolicyStatement(policy.GetNamedPermissionSet("Nothing")) );

// To tp cc code group xc nh cc quyn no s c cp // cho mt assembly do mt publisher to ra. V code group gc // l mt FirstMatchCodeGroup, nn qu trnh phn gii chnh sch // ch so trng assembly trn cc group con cho n khi tm thy // trng khp u tin. Mi code group c to vi c tnh // Exclusive bo m rng assembly khng ly thm quyn // no t cc code group khc. // To code group cp tp quyn FullTrust cho cc // assembly c pht hnh bi Microsoft. X509Certificate microsoftCert = X509Certificate.CreateFromCertFile("microsoft.cer");

policy.RootCodeGroup.AddChild(new UnionCodeGroup( new PublisherMembershipCondition(microsoftCert), new PolicyStatement(policy.GetNamedPermissionSet("FullTrust"), PolicyStatementAttribute.Exclusive) ));

// To code group cp tp quyn Internet cho cc // assembly c pht hnh bi Litware, Inc. X509Certificate litwareCert = X509Certificate.CreateFromCertFile("litware.cer");

policy.RootCodeGroup.AddChild(new UnionCodeGroup( new PublisherMembershipCondition(litwareCert), new PolicyStatement(policy.GetNamedPermissionSet("Internet"), PolicyStatementAttribute.Exclusive)

535 Chng 13: Bo mt ));

// To code group cp tp quyn Execution cho cc // assembly c pht hnh bi Fabrikam, Inc. X509Certificate fabrikamCert = X509Certificate.CreateFromCertFile("fabrikam.cer"); policy.RootCodeGroup.AddChild(new UnionCodeGroup( new PublisherMembershipCondition(fabrikamCert), new PolicyStatement(policy.GetNamedPermissionSet("Execution"), PolicyStatementAttribute.Exclusive) ));

// Thm mt code group sau cng bt tt c cc assembly // khng khp vi publisher no. Gn group ny vi tp quyn // Nothing. V group ny l Exclusive nn assembly s khng // nhn quyn no t cc group khc, ngay c t cc // mc chnh sch cao hn (cng ty, my, v ngi dng). policy.RootCodeGroup.AddChild(new UnionCodeGroup( new AllMembershipCondition(), new PolicyStatement(policy.GetNamedPermissionSet("Nothing"), PolicyStatementAttribute.Exclusive) ));

// Gn chnh sch cho min ng dng. domain.SetAppDomainPolicy(policy); } }

13.

Xc nh ngi dng hin hnh c l thnh vin ca mt nhm Windows no hay khng
Bn cn xc nh ngi dng hin hnh ca ng dng c phi l thnh vin ca mt nhm ngi dng Windows no hay khng. Thu ly i tng System.Security.Principal.WindowsIdentity m t ngi dng hin hnh bng phng thc tnh WindowsIdentity.GetCurrent. K tip, truyn i tng WindowsIdentity cho phng thc khi dng ca lp System.Security.Principal.WindowsPrincipal thu ly i tng

536 Chng 13: Bo mt

WindowsPrincipal. Cui cng, gi phng thc IsInRole ca i tng WindowsPrincipal xc nh ngi dng ny c nm trong mt nhm Windows

no hay khng. C ch RBS ca .NET Framework tru tng ha cc tnh nng bo mt da-trn-ngi-dng ca h iu hnh nm di thng qua hai giao din chnh sau y:

System.Security.Principal.IIdentity System.Security.Principal.IPrincipal

Giao din IIdentity m t thc th m m lnh hin ang chy trn danh ngha ca thc th ny, chng hn mt ngi dng hoc ti khon dch v (service account). Giao din IPrincipal m t IIdentity ca thc th v tp cc vai tr m thc th ny thuc v. Mt vai tr ch l mt s phn loi, dng nhm cc thc th vi cc kh nng bo mt tng t nhau, chng hn mt nhm ngi dng Windows. tch hp RBS vi bo mt ngi dng Windows, .NET Framework cung cp hai lp sau y (hin thc giao din IIdentity v IPrincipal):

System.Security.Principal.WindowsIdentity System.Security.Principal.WindowsPrincipal

Lp WindowsIdentity hin thc giao din IIdentity v m t mt ngi dng Windows. Lp WindowsPrincipal hin thc IPrincipal v m t tp cc nhm Windows m ngi dng ny thuc v. V .NET RBS l mt gii php chung c thit k sao cho c lp nn, bn khng th truy xut cc tnh nng v cc kh nng ca ti khon ngi dng Windows thng qua giao din IIdentity v IPrincipal, bn phi s dng trc tip cc i tng WindowsIdentity v WindowsPrincipal. xc nh ngi dng hin hnh c phi l thnh vin ca mt nhm Windows no hay khng, trc tin bn phi gi phng thc tnh WindowsIdentity.GetCurrent. Phng thc ny tr v mt i tng WindowsIdentity m t ngi dng Windows m tiu trnh hin ang chy trn danh ngha ca ngi dng ny. K tip, to mt i tng WindowsPrincipal mi v truyn i tng WindowsIdentity cho phng thc khi dng. Cui cng, gi phng thc IsInRole ca i tng WindowsPrincipal kim tra xem ngi dng ny c nm trong mt nhm (vai tr) c th no hay khng. IsInRole tr v true nu ngi dng ny l thnh vin ca nhm c ch nh, ngc li tr v false.

Bn c th thu ly tham chiu IPrincipal n mt i tng WindowsPrincipal bng thuc tnh tnh CurrentPrincipal ca lp System.Threading.Thread. Tuy nhin, k thut ny ty thuc vo cu hnh chnh sch principal ca min ng dng hin hnh; mc 13.14 s tho lun vn ny chi tit hn. Phin bn th nht nhn mt chui cha tn ca nhm cn kim tra. Tn nhm phi c dng [DomainName]\[GroupName] i vi cc nhm da-trn-min v phi c dng [MachineName]\[GroupName] i vi cc nhm c nh ngha cc b. Nu mun kim

Phng thc IsInRole c ba phin bn np chng:

537 Chng 13: Bo mt

tra t cch thnh vin ca mt nhm Windows chun, bn hy s dng dng BUILTIN\[GroupName]. IsInRole thc hin kim tra c phn bit ch hoa-thng i vi tn nhm c ch nh. Phin bn th hai nhn mt s nguyn (int), s ny ch nh mt Windows Role Identifier (RID). RID cung cp mt c ch nhn bit cc nhm, khng ph thuc vo ngn ng (language) v s bn a ha (localization). Phin thnh vin thuc kiu lit k System.Security.Principal.WindowsBuiltInRole. Kiu lit k ny nh ngha cc thnh vin m t cc nhm Windows c sn. Bng 13.3 lit k tn, RID, v gi tr WindowsBuiltInRole cho mi nhm Windows chun. bn th ba nhn mt

Bng 13.3 Tn, RID, v gi tr WindowsBuiltInRole ca cc ti khon c sn Tn ti khon RID (Hex) Gi tr WindowsBuiltInRole AccountOperator Administrator BackupOperator Guest PowerUser PrintOperator Replicator SystemOperator User

BUILTIN\Account Operators BUILTIN\Administrators BUILTIN\Backup Operators BUILTIN\Guests BUILTIN\Power Users BUILTIN\Print Operators BUILTIN\Replicators BUILTIN\Server Operators BUILTIN\Users
[

0x224 0x220 0x227 0x222 0x223 0x226 0x228 0x225 0x221

Lp WindowsIdentity cung cp cc phng thc khi dng np chng cho php bn thu ly i tng WindowsIdentity m t mt ngi dng no (khi chy trn Microsoft Windows Server 2003 tr v sau). Bn c th s dng i tng ny v phng php c m t trong mc ny xc nh xem ngi dng c phi l thnh vin ca mt nhm Windows no hay khng. Nu bn s dng mt trong cc phng thc khi dng ny khi chy trn mt phin bn Windows c, n s nm ngoi l System.ArgumentException. Trn cc nn Windows trc Windows Server 2003, bn phi s dng m lnh nguyn sinh (native code) thu ly Windows access token m t ngi dng cn thit. K , bn c th s dng access token ny to i tng WindowsIdentity; mc 13.15 s trnh by cch thu ly Windows access token cho nhng ngi dng c th.

ng dng WindowsGroupExample di y trnh by cch kim tra ngi dng hin hnh c l thnh vin ca mt tp cc nhm Windows c nu tn hay khng. Cc nhm ny c ch nh trong cc i s dng lnh; bn nh t tn my tnh, tn min, hay BUILTIN (i vi cc nhm Windows chun) vo trc tn nhm.

538 Chng 13: Bo mt

using System; using System.Security.Principal;

public class WindowsGroupExample {

public static void Main (string[] args) {

// Thu ly i tng WindowsIdentity // m t ngi dng hin hnh. WindowsIdentity identity = WindowsIdentity.GetCurrent();

// To i tng WindowsPrincipal m t cc kh nng bo mt // ca i tng WindowsIdentity c ch nh. WindowsPrincipal principal = new WindowsPrincipal(identity);

// Duyt qua cc i s dng lnh (tn nhm) v kim tra xem // ngi dng hin hnh c l thnh vin ca mi nhm hay khng. foreach (string role in args) {

Console.WriteLine("Is {0} a member of {1}? = {2}", identity.Name, role, principal.IsInRole(role)); } } }

Nu bn chy v d ny vi t cch ngi dng c tn l nnbphuong81 trn mt my tnh c tn l MACHINE bng lnh WindowsGroupExample BUILTIN\Administrators BUILTIN\Users MACHINE\Accountants, kt xut c th nh sau:
Is MACHINE\nnbphuong81 a member of BUILTIN\Administrators? = False Is MACHINE\nnbphuong81 a member of BUILTIN\Users? = True Is MACHINE\nnbphuong81 a member of MACHINE\Accountants? = True

14. Hn ch nhng ngi dng no thc thi m lnh ca bn

Bn cn hn ch nhng ngi dng no truy xut cc phn t trong m lnh ca bn da trn tn ngi dng hay cc vai tr m ngi dng ny l thnh vin.

539 Chng 13: Bo mt

S dng lp System.Security.Permissions.PrincipalPermission v bn sao c tnh System.Security.Permissions.PrincipalPermissionAttribute ca lp ny bo v cc phn t trong chng trnh ca bn vi cc yu cu RBS.

.NET Framework h tr c yu cu RBS bt buc (imperative RBS demand) v yu cu RBS khai bo (declarative RBS demand). Lp PrincipalPermission h tr cc lnh bo mt bt buc, v bn sao c tnh PrincipalPermissionAttribute ca lp ny h tr cc lnh bo mt khai bo. Cc yu cu RBS s dng c php ging nh cc yu cu CAS, nhng cc yu cu RBS ch r tn m ngi dng hin hnh phi c, hoc thng thng hn l cc vai tr m ngi dng ny l thnh vin. Mt yu cu RBS lnh cho b thc thi xt tn v cc vai tr ca ngi dng hin hnh, v nu chng khng t yu cu, b thc thi s nm ngoi l System.Security.SecurityException. on m di y trnh by c php ca mt yu cu bo mt bt buc:
// C php ca mt yu cu bo mt bt buc da-trn-vai-tr. public static void SomeMethod() { PrincipalPermission perm = new PrincipalPermission("UserName", "RoleName");

perm.Demand(); }

Trc tin, bn phi to mt i tng PrincipalPermission ch nh tn ngi dng v tn vai tr m bn yu cu, ri gi phng thc Demand ca n. Bn ch c th ch nh mt tn ngi dng v tn vai tr cho mi yu cu. Nu tn ngi dng hoc tn vai tr l null, bt k gi tr no cng s tha mn yu cu. Khc vi cc quyn truy xut m lnh, mt yu cu RBS khng cho kt qu trong mt stack walk; b thc thi ch nh gi tn ngi dng v cc vai tr ca ngi dng hin hnh. on m di y trnh by c php ca mt yu cu bo mt khai bo:
// C php ca mt yu cu bo mt khai bo da-trn-vai-tr. [PrincipalPermission(SecurityAction.Demand, Name = "UserName", Role = "RoleName")] public static void SomeMethod() { /*...*/}

Bn c th thay cc yu cu RBS khai bo mc lp hay mc thnh vin. Cc yu cu mclp p dng cho tt c cc thnh vin ca lp tr khi c mt yu cu mc-thnh-vin chp yu cu mc-lp. Ni chung, bn c th t chn hin thc cc yu cu RBS bt buc hay khai bo. Tuy nhin, cc yu cu bo mt bt buc cho php bn tch hp cc yu cu RBS vi logic ca m lnh thc hin nhng yu cu RBS phc tp. Ngoi ra, nu khng bit vai tr hay tn ngi dng yu cu lc bin dch, bn phi s dng cc yu cu bt buc. Cc yu cu RBS khai bo c thun li l chng c lp vi logic ca m lnh v d nhn bit hn. Ngoi ra, bn c th

540 Chng 13: Bo mt

xem cc yu cu RBS khai bo bng cng c Permview.exe ( c tho lun trong mc 13.6). Cho d hin thc yu cu RBS bt buc hay khai bo, bn cng phi chc rng b thc thi c th truy xut tn v cc vai tr ca ngi dng hin hnh nh gi yu cu mt cch ph hp. Lp System.Threading.Thread m t mt tiu trnh ca h iu hnh (chy m lnh cqun-l). Thuc tnh tnh CurrentPrincipal ca lp Thread cha mt th hin IPrincipal m t ngi dng m tiu trnh hin ang chy trn danh ngha ca ngi ny. mc h iu hnh, mi tiu trnh cng c mt Windows access token kt giaom t ti khon Windows m tiu trnh hin ang chy trn danh ngha ca ti khon ny. Bn cn hiu rng th hin IPrincipal v Windows access token l hai thc th ring bit. Windows s dng access token thc hin c ch bo mt h iu hnh, trong khi b thc thi .NET s dng th hin IPrincipal nh gi cc yu cu RBS mc ng dng. Mc d chng c th m t cng mt ngi dng, nhng iu ny khng c ngha l lun lun nh vy. Theo mc nh, thuc tnh Thread.CurrentPrincipal l khng xc nh. V vic thu ly cc thng tin lin quan n ngi dng c th mt nhiu thi gian, v ch mt phn nh trong s cc ng dng s dng thng tin ny, cc nh thit k .NET chn cch khi dng "li" i vi thuc tnh CurrentPrincipal. Trc tin, m lnh thu ly thuc tnh Thread.CurrentPrincipal, b thc thi gn mt th hin IPrincipal cho thuc tnh ny theo logic sau y: 1. Nu min ng dng m tiu trnh hin hnh ang thc thi c mt principal mc nh, th b thc thi s gn principal ny cho thuc tnh Thread.CurrentPrincipal. Theo mc nh, min ng dng khng c principal mc nh. Bn c th thit lp principal mc nh ca mt min ng dng bng cch gi phng thc SetThreadPrincipal trn mt i tng System.AppDomain m t min ng dng bn mun cu hnh. gi SetPrincipalPolicy, m lnh ca bn phi c phn t ControlPrincipal ca SecurityPermission. Bn ch c th thit lp principal mc nh mt ln cho mi min ng dng; li gi SetThreadPrincipal th hai dn n ngoi l System.Security.Policy.PolicyException. 2. Nu min ng dng khng c principal mc nh, chnh sch principal ca min ng dng s xc nh hin thc IPrincipal no s c to ra v gn n cho Thread.CurrentPrincipal. cu hnh chnh sch principal cho mt min ng dng, bn cn thu ly i tng AppDomain m t min ng dng v gi phng thc SetPrincipalPolicy ca i tng ny. Phng thc SetPrincipalPolicy nhn vo mt thnh vin thuc kiu lit k System.Security.Principal.PrincipalPolicy, gi tr ny cho bit kiu ca i tng IPrincipal s c gn cho Thread.CurrentPrincipal. gi SetPrincipalPolicy, m lnh ca bn phi c phn t ControlPrincipal ca SecurityPermission. Bng 13.4 lit k cc gi tr ca PrincipalPolicy; gi tr mc nh l UnauthenticatedPrincipal. 3. Nu m lnh ca bn c phn t ControlPrincipal ca SecurityPermission, bn c th t to ra i tng IPrincipal v trc tip gn n cho thuc tnh

541 Chng 13: Bo mt Thread.CurrentPrincipal. Vic ny s ngn b thc thi gn cc i tng IPrincipal

mc nh hoc to ra cc i tng mi da trn chnh sch principal.


Bng 13.4 Cc thnh vin thuc kiu lit k PrincipalPolicy Tn thnh vin NoPrincipal M t

Khng c i tng IPrincipal no c to ra, Thread.CurrentPrincipal tr v mt tham chiu null. Mt i tng System.Security.Principal. GenericPrincipal rng c to ra v c gn cho Thread.CurrentPrincipal. Mt i tng WindowsPrincipal (m t ngi dng Windows ng nhp) c to ra v c gn cho Thread.CurrentPrincipal.

UnauthenticatedPrincipal

WindowsPrincipal

Bt k s dng phng php no thit lp IPrincipal cho tiu trnh hin hnh, bn cng phi lm nh th trc khi s dng cc yu cu bo mt RBS, nu khng thng tin v ngi dng (IPrincipal) s khng c hiu lc b thc thi c th x l yu cu. Bnh thng, khi chy trn nn Windows, bn thit lp chnh sch principal ca mt min ng dng l PrincipalPolicy.WindowsPrincipal thu ly thng tin v ngi dng Windows:
// Thu ly mt tham chiu n min ng dng hin hnh. AppDomain appDomain = System.AppDomain.CurrentDomain;

// Cu hnh min ng dng hin hnh sao cho s dng cc // principal da-trn-Windows. appDomain.SetPrincipalPolicy( System.Security.Principal.PrincipalPolicy.WindowsPrincipal);

File RoleBasedSecurityExample.cs (trong a CD nh km) minh ha cch s dng cc yu cu RBS bt buc v khai bo. Phn th nht trnh by ba phng thc c bo v bng cc yu cu RBS bt buc. Nu i tng Thread.CurrentPrincipal khng tha cc i hi v tn ngi dng v t cch thnh vin, yu cu s nm ngoi l SecurityException.
public static void ProtectedMethod1() { // Mt yu cu bo mt bt buc da-trn-vai-tr: principal // hin hnh m t mt nh danh vi tn l "nnbphuong81", // cc vai tr ca principal l khng quan trng. System.Security.Permissions.PrincipalPermission perm = new System.Security.Permissions.PrincipalPermission (@"MACHINE\nnbphuong81", null); perm.Demand();

542 Chng 13: Bo mt

} public static void ProtectedMethod2() { // Mt yu cu bo mt bt buc da-trn-vai-tr: principal // hin ti l mt thnh vin ca vai tr "Managers" hay // "Developers". Khi s dng PrincipalPermission, bn ch c th din // t mi quan h OR. l v phng thc PrincipalPolicy.Intersect // lun tr v mt quyn rng tr khi hai input l nh nhau. // Tuy nhin, bn c th s dng lgic ca m lnh hin thc // cc iu kin phc tp hn. Trong trng hp ny, tn ca nh // danh l khng quan trng. System.Security.Permissions.PrincipalPermission perm1 = new System.Security.Permissions.PrincipalPermission (null, @"MACHINE\Managers");

System.Security.Permissions.PrincipalPermission perm2 = new System.Security.Permissions.PrincipalPermission (null, @"MACHINE\Developers");

perm1.Union(perm2).Demand(); }

public static void ProtectedMethod3() {

// Mt yu cu bo mt bt buc da-trn-vai-tr: principal // hin ti m t mt nh danh vi tn l "nnbphuong81" v // l mt thnh vin ca vai tr "Managers". System.Security.Permissions.PrincipalPermission perm = new System.Security.Permissions.PrincipalPermission (@"MACHINE\nnbphuong81", @"MACHINE\Managers");

perm.Demand(); }

Phn th hai trnh by ba phng thc c bo v bng cc yu cu RBS khai bo, tng ng vi cc yu cu RBS bt buc va c trnh by trn:

543 Chng 13: Bo mt // Mt yu cu bo mt khai bo da-trn-vai-tr: principal hin ti // m t mt nh danh vi tn l "nnbphuong81", cc vai tr ca // principal l khng quan trng. [PrincipalPermission(SecurityAction.Demand, Name = @"MACHINE\nnbphuong81")] public static void ProtectedMethod1() { /*...*/}

// Mt yu cu bo mt khai bo da-trn-vai-tr: principal hin ti // l mt thnh vin ca vai tr "Managers" hay "Developers". Bn ch // c th din t mi quan h OR (khng th din t mi quan h AND). // Tn ca nh danh l khng quan trng. [PrincipalPermission(SecurityAction.Demand, Role = @"MACHINE\Managers")] [PrincipalPermission(SecurityAction.Demand, Role = @"MACHINE\Developers")] public static void ProtectedMethod2() { /*...*/}

// Mt yu cu bo mt khai bo da-trn-vai-tr: principal hin ti // m t mt nh danh vi tn l "nnbphuong81" v l mt thnh vin // ca vai tr "Managers". [PrincipalPermission(SecurityAction.Demand, Name = @"MACHINE\nnbphuong81", Role = @"MACHINE\Managers")] public static void ProtectedMethod3() { /*...*/}

15.

Gi nhn ngi dng Windows


Bn mun m lnh ca bn chy trong ng cnh ca mt ngi dng Windows no ch khng phi ti khon ngi dng hin ang tch cc. Thu ly i tng System.Security.Principal.WindowsIdentity m t ngi dng Windows m bn cn gi nhn, ri gi phng thc Impersonate ca i tng WindowsIdentity.

Mi tiu trnh Windows u c mt access token kt giaom t ti khon Windows m tiu trnh hin ang chy trn danh ngha ca ti khon ny. H iu hnh Windows s dng access token xc nh mt tiu trnh c cc quyn thch ng thc hin cc thao tc c-bo-v trn danh ngha ca ti khon ny hay khng, nh c/ghi file, khi ng li h thng, v thay i thi gian h thng. Theo mc nh, mt ng dng c-qun-l chy trong ng cnh ca ti khon Windows thc thi ng dng. iu ny l hon ton bnh thng, nhng i lc bn mun chy ng

544 Chng 13: Bo mt

dng trong ng cnh ca mt ti khon Windows khc. iu ny ng trong trng hp cc ng dng pha server cn x l phin giao dch da trn danh ngha ca cc ngi dng kt ni n server. Thng thng, mt ng dng server chy trong ng cnh ca ti khon Windows c to ring cho ng dngy l ti khon dch v (service account). Ti khon dch v ny s c cc quyn ti thiu truy xut cc ti nguyn h thng, lm cho ng dng hot ng nh th l ngi dng kt ni cho php ng dng truy xut cc hot ng v ti nguyn ph hp vi quyn hn ca ngi dng . Khi mt ng dng nm ly nh danh ca mt ngi dng khc, y l s gi nhn (impersonation). Nu c hin thc ng, s gi nhn s n gin ha vic qun tr bo mt v thit k ng dng, trong khi vn duy tr vic gii trnh ngi dng.

Nh tho lun trong mc 13.14, Windows access token v .NET principal ca mt tiu trnh l cc thc th ring bit v c th m t nhng ngi dng khc nhau. K thut gi nhn c m t trong mc ny ch thay i Windows access token ca tiu trnh hin hnh, ch khng thay i principal ca tiu trnh ny. thay i principal ca tiu trnh, m lnh ca bn phi c phn t ControlPrincipal ca SecurityPermission v gn mt i tng System.Security.Principal.IPrincipal mi vo thuc tnh CurrentPrincipal ca System.Threading.Thread hin hnh.

Lp System.Security.Principal.WindowsIdentity cung cp cc chc nng m thng qua , bn c th thc hin s gi nhn. Tuy nhin, qu trnh ny ty thuc vo ng dng ca bn ang chy trn phin bn Windows no. Trn Windows Server 2003 tr v sau, lp WindowsIdentity h tr cc phin bn np ca chng phng thc khi dng, cho php to ra cc i tng WindowsIdentity da trn tn ti khon ca ngi dng cn gi nhn. Trn tt c cc phin bn Windows trc , trc ht bn phi thu ly System.IntPtr cha tham chiu n Windows access token m t ngi dng cn gi nhn. thu ly tham chiu ny, bn cn s dng mt phng thc nguyn sinh nh LogonUser ca Win32 API.

Vn ch yu khi thc hin s gi nhn trn Windows 2000 v Windows NT l mt ti khon phi c c quyn SE_TCB_NAME th mi c th thc thi LogonUser. iu ny i hi bn cu hnh chnh sch bo mt ca Windows v cp cho ti khon quyn Act as part of operating system (mc tin cy rt cao). Bn ng bao gi trc tip cp c quyn SE_TCB_NAME cho cc ti khon ngi dng.

Mt khi c i tng WindowsIdentity m t ngi dng cn gi nhn, bn hy gi phng thc Impersonate ca n. T lc ny, tt c cc hnh ng m m lnh ca bn thc hin u din ra trong ng cnh ca ti khon Windows c gi nhn. Phng thc Impersonate tr v i tng System.Security.Principal.WindowsSecurityContext, i tng ny m t ti khon tch cc trc khi gi nhn. tr v ti khon c, bn cn gi phng thc Undo ca i tng WindowsSecurityContext ny. ng dng di y trnh by s gi nhn ca mt ngi dng Windows. ng dng ny cn hai i s dng lnh: tn ti khon ca ngi dng cn gi nhn v password ca ti khon.

545 Chng 13: Bo mt

ng dng ny s dng hm LogonUser ca Win32 API thu ly Windows access token cho ngi dng c ch nh, gi nhn ngi dng ny, ri tr v ng cnh ca ngi dng c. V d, lnh ImpersonationExample nnbphuong81 password s gi nhn ngi dng nnbphuong81 nu ngi dng tn ti trong c s d liu ti khon cc b.
using System; using System.IO; using System.Security.Principal; using System.Security.Permissions; using System.Runtime.InteropServices; // Bo m assembly c quyn truy xut m lnh khng-c-qun-l // v c quyn kim sot principal ca tiu trnh. [assembly:SecurityPermission(SecurityAction.RequestMinimum, UnmanagedCode=true, ControlPrincipal=true)]

public class ImpersonationExample {

// nh ngha cc hng s c s dng cng vi hm LogonUser. const int LOGON32_PROVIDER_DEFAULT = 0; const int LOGON32_LOGON_INTERACTIVE = 2; // Nhp hm Win32 LogonUser t advapi32.dll. Ch nh // "SetLastError = true" c th truy xut cc m li ca Win32. [DllImport("advapi32.dll", SetLastError=true)] static extern int LogonUser(string userName, string domain, string password, int logonType, int logonProvider, ref IntPtr accessToken); public static void Main(string[] args) { // To mt IntPtr mi gi ly access token // do hm LogonUser tr v. IntPtr accessToken = IntPtr.Zero; // Gi LogonUser thu ly access token cho ngi dng // c ch nh. Bin accessToken c truyn cho LogonUser // bng tham chiu v s cha tham chiu n Windows access token // nu LogonUser thnh cng. int result = LogonUser(

546 Chng 13: Bo mt

args[0], ".", args[1],

// tn ngi dng ng nhp // s dng CSDL ti khon cc b // password ca ngi dng

LOGON32_LOGON_INTERACTIVE, // to mt interactive login LOGON32_PROVIDER_DEFAULT, ref accessToken ); // Nu li xy ra (LogonUser tr v zero), hin th li v thot. if (result == 0) { // s dng logon provider mc nh // nhn access token handle

Console.WriteLine("LogonUser returned error {0}", Marshal.GetLastWin32Error());

} else {

// To mt WindowsIdentity mi t Windows access token. WindowsIdentity identity = new WindowsIdentity(accessToken);

// Hin th nh danh ang tch cc (trc khi gi nhn). Console.WriteLine("Identity before impersonation = {0}", WindowsIdentity.GetCurrent().Name); // Gi nhn ngi dng c ch nh. i tng // WindowsImpersonationContext cha cc thng tin // cn thit tr v ng cnh ca ngi dng c. WindowsImpersonationContext impContext = identity.Impersonate(); // Hin th nh danh ang tch cc (trong lc gi nhn). Console.WriteLine("Identity during impersonation = {0}", WindowsIdentity.GetCurrent().Name); // *************************************************************** // Thc hin cc hnh ng vi danh ngha ngi dng c gi nhn // ***************************************************************

547 Chng 13: Bo mt // Tr v ngi dng Windows c bng i tng // WindowsImpersonationContext. impContext.Undo();as // Hin th nh danh ang tch cc (sau khi gi nhn). Console.WriteLine("Identity after impersonation WindowsIdentity.GetCurrent().Name); } } } = {0}",

548

Chng 14:MT M

14

549

550 Chng 14: Mt m

t m (cryptography) l mt trong nhng mt phc tp nht ca qu trnh pht trin phn mm m bt k nh pht trin no cng s s dng. L thuyt k thut mt m hin i cc k kh hiu v i hi mt mc kin thc ton hc m tng i t ngi c c. May mn l th vin lp .NET Framework cung cp cc hin thc d s dng cho hu ht cc k thut mt m thng dng v h tr cc gii thut ph bin nht. Chng ny s bn v cc vn sau:

To s ngu nhin (mc 14.1). To v xc minh cc m bm mt m v cc m bm c kha (mc 14.2, 14.3, 14.4, v
14.5).

S dng gii thut i xng v khng i xng mt ha v gii mt ha d liu


(mc 14.6 v 14.8).

Tm li, lu tr, v chuyn i cc kha mt m (mc 14.7, 14.9, v 14.10).


Khi ngh cch p dng cc k thut trong chng ny vo m lnh, bn nn nh rng mt m chng phi l ci m bn hin thc n l. Mt m khng ngang bng vi bo mt (security); s dng mt m ch l mt phn nh trong vic to mt gii php an ton.

i vi nhng ai cha quen thuc vi mt m, di y l nh ngha ca mt s t quan trng: Encrypt (ng t, tm dch l mt ha) l m ha thng tin theo cch no mi ngi khng th c c n, tr nhng ai c kha. Decrypt (ng t, tm dch l gii mt ha) l gii m thng tin -c-mt-ha. Key l chui cc bit dng mt ha v gii mt ha thng tin. Plaintext l text cha-c-mt-ha hay -c-gii-mt-ha. Ciphertext l text -c-mt-ha.

1.

To s ngu nhin
Bn cn to mt s ngu nhin dng cho cc ng dng mt m v bo mt. S dng mt b to s ngu nhin mt m (cryptographic random number generator), chng hn System.Security.Cryptography.RNGCryptoServiceProvider.

Lp System.Random l mt b to s gi ngu nhin, n s dng mt gii thut ton hc m phng vic to s ngu nhin. Thc ra, gii thut ny l tt nh (deterministic), ngha l bn lun c th tnh c s k tip s l g da trn s c to trc . iu ny ngha l cc s c to bi lp Random s khng ph hp khi tnh bo mt c u tin, chng hn to kha mt ha v password. Khi cn mt s ngu nhin khng tt nh (nondeterministic) dng trong cc ng dng lin quan n mt m hay bo mt, bn phi s dng b to s ngu nhin dn xut t lp

551 Chng 14: Mt m System.Security.Cryptography.RandomNumberGenerator. y l mt lp tru tng m tt c

cc b to s ngu nhin c th u s tha k t n. Hin ti, ch c mt hin thc l lp RNGCryptoServiceProvider. Lp ny cung cp mt v bc c-qun-l cho hm CryptGenRandom ca Win32 CryptoAPI, v bn c th s dng vo mt mng byte cc gi tr byte ngu nhin.

Cc s do RNGCryptoServiceProvider sinh ra khng tht s ngu nhin. Tuy nhin, chng ngu nhin p ng yu cu cho cc ng dng mt m v bo mt trong hu ht cc mi trng chnh ph v thng mi.

Lp c s RandomNumberGenerator l mt factory cho cc lp hin thc dn xut t . Gi


RandomNumberGenerator.Create("System.Security.Cryptography.RNGCryptoServiceProvider")

s tr v mt th hin ca RNGCryptoServiceProvider, v bn c th s dng n to s ngu nhin. Ngoi ra, v RNGCryptoServiceProvider l hin thc duy nht nn n s l lp mc nh c to ra khi bn gi phng thc Create khng c i s: RandomNumberGenerator.Create(). V d di y to mt i tng RNGCryptoServiceProvider v s dng n to cc gi tr ngu nhin. Phng thc GetBytes vo mt mng byte cc gi tr byte ngu nhin. Bn c th s dng phng thc GetNonZeroBytes nu cn d liu ngu nhin khng cha gi tr zero.
using System; using System.Security.Cryptography; public class SecureRandomNumberExample { public static void Main() { // To mng byte dng lu tr d liu ngu nhin. byte[] number = new byte[32]; // To b to s ngu nhin mc nh. RandomNumberGenerator rng = RandomNumberGenerator.Create(); // To d liu ngu nhin. rng.GetBytes(number); // Hin th d liu ngu nhin. Console.WriteLine(BitConverter.ToString(number)); } }

552 Chng 14: Mt m

Nhng n lc tnh ton cn thit to mt s ngu nhin vi RNGCryptoServiceProvider ln hn nhiu so vi Random. i vi mc ch thng ngy, s dng RNGCryptoServiceProvider l qu mc cn thit. Bn nn xem xt s lng s ngu nhin cn to v mc ch ca cc s ny trc khi quyt nh s dng RNGCryptoServiceProvider. S dng lp RNGCryptoServiceProvider qu mc v khng cn thit c th nh hng ng k ln hiu nng ca ng dng.

2.

Tnh m bm ca password
Bn cn lu tr password ca ngi dng mt cch an ton bn c th s dng n xc thc ngi dng trong tng lai. ng lu tr password ca ngi dng dng plaintext v y l mt nguy c bo mt ln. Thay vo , hy to v lu tr mt m bm ca password bng mt lp gii thut bm dn xut t lp System.Security.Cryptography.HashAlgorithm. Khi xc thc, to m bm ca password v so snh n vi m bm c lu tr.

Cc gii thut bm l cc hm mt m mt chiu, nhn plaintext c chiu di thay i v to mt gi tr s c kch thc c nh. Chng l mt chiu v gn nh khng th tm li plaintext gc t m bm. Cc gii thut bm l tt nh (deterministic); p dng cng gii thut bm cho mt mu plaintext lun to ra cng m bm. iu ny khin m bm tr nn hu ch cho vic xc nh hai khi plaintext (trong trng hp ny l password) c ging nhau hay khng. Mc ch ca cc gii thut bm bo m rngmc d khng phi khng xy rakh nng hai mu plaintext khc nhau to ra cng m bm l cc k nh. Ngoi ra, khng c mi tng quan no gia s ging nhau ca hai mu plaintext v m bm ca chng; mt khc bit nh trong plaintext cng c th gy ra khc bit ng k trong m bm. Khi s dng password xc thc mt ngi dng, bn khng quan tm n ni dung ca password do ngi dng nhp vo. Bn ch cn bit rng password c nhp trng khp vi password m bn ghi li cho ngi dng trong c s d liu ti khon. Bn cht ca cc gii thut bm khin chng tr nn l tng trong vic lu tr password mt cch an ton. Khi ngi dng cung cp mt password mi, bn phi to m bm ca password v lu tr m bm ny, ri loi b password dng text. Mi khi ngi dng xc thc vi ng dng ca bn, tnh m bm ca password do ngi cung cp v so snh n vi m bm m bn lu tr.

Ngi ta thng hi cch thu ly password t mt m bm. V cu tr li l khng th. Mc ch ca m bm l ng vai tr nh mt token v bn c th ty lu tr n m khng sinh ra l hng bo mt no. Nu ngi dng qun password, bn khng th tm li n t m bm c lu tr; bn phi reset ti khon ny thnh gi tr mc nh no , hoc to mt password mi cho ngi dng.

553 Chng 14: Mt m

Lp tru tng HashAlgorithm cung cp lp c s tt c cc hin thc gii thut bm c th dn xut t . Th vin lp .NET Framework c su hin thc gii thut bm c th (c lit k trong bng 14.1), mi lp hin thc l mt thnh vin ca khng gian tn System.Security.Cryptography. Cc lp vi phn ui l CryptoServiceProvider bc ly cc chc nng do Win32 CryptoAPI cung cp, trong khi cc lp vi phn ui l Managed c hin thc hon ton bng m lnh c-qun-l.
Bng 14.1 Cc hin thc gii thut bm Tn gii thut Tn lp MD5CryptoServiceProvider SHA1CryptoServiceProvider SHA1Managed SHA256Managed SHA384Managed SHA512Managed Kch thc m bm (bit)

MD5 SHA hay SHA1 SHA1Managed SHA256 hay SHA-256 SHA384 hay SHA-384 SHA512 hay SHA-512

128 160 160 256 384 512

Mc d bn c th trc tip to ra th hin ca cc lp gii thut bm, lp c s HashAlgorithm l mt factory cho cc lp hin thc dn xut t n. Gi phng thc tnh HashAlgorithm.Create vi i s l tn gii thut s tr v mt i tng thuc kiu c ch nh. S dng factory cho php bn ghi m lnh tng qut v m lnh ny c th lm vic vi bt k hin thc gii thut bm no. Mt khi bn c i tng HashAlgorithm, phng thc ComputeHash ca n nhn mt mng byte cha plaintext v tr v mt mng byte mi cha m bm c to ra. Bng 14.1 cho bit kch thc ca m bm (tnh bng bit) c to ra bi mi lp gii thut bm. Lp HashPasswordExample di y trnh by cch to m bm t mt chui (password chng hn). ng dng ny cn hai i s dng lnh: tn ca gii thut bm cn s dng v chui cn to m bm. V phng thc HashAlgorithm.ComputeHash yu cu mt mng byte nn trc ht bn phi m ha chui nhp bng lp System.Text.Encoding (lp ny cung cp cc c ch dng chuyn chui thnh/t cc nh dng m ha k t khc nhau).
using System; using System.Text; using System.Security.Cryptography; public class HashPasswordExample { public static void Main(string[] args) { // To HashAlgorithm ca kiu c ch nh bi // i s dng lnh th nht. using (HashAlgorithm hashAlg = HashAlgorithm.Create(args[0])) {

554 Chng 14: Mt m

// Chuyn chui password (i s dng lnh th hai) // thnh mt mng byte. byte[] pwordData = Encoding.Default.GetBytes(args[1]); // To m bm ca password. byte[] hash = hashAlg.ComputeHash(pwordData); // Hin th m bm ca password. Console.WriteLine(BitConverter.ToString(hash)); } } }

Chy lnh HashPasswordExample SHA1 ThisIsMyPassword s hin th m bm sau y:


80-36-31-2F-EA-D9-93-45-79-34-C9-FD-21-EE-8D-05-16-DC-A1-E2

3.

Tnh m bm ca file
Bn cn xc nh ni dung ca mt file c thay i theo thi gian hay khng. To m bm cho ni dung ca file bng phng thc ComputeHash ca lp System.Security.Cryptography.HashAlgorithm. Lu tr m bm ny sau ny so snh vi cc m bm c to mi.

Ngoi vic cho php bn lu tr password mt cch an ton ( c tho lun trong mc 14.2), m bm cn cung cp mt phng cch rt hay xc nh mt file c thay i hay khng. Bng cch tnh ton v lu tr m bm ca mt file, sau ny bn c th tnh li m bm ca file ny xc nh file c thay i trong thi gian chuyn tip hay khng. Gii thut bm s sinh ra mt m bm rt khc ngay c ch vi mt thay i rt nh trong file, nn kh nng hai file khc nhau cho ra cng m bm l cc k nh.

Cc m bm chun khng ph hp khi gi cng vi mt file bo m tnh ton vn ca ni dung file. Nu ai chn c file trn ng i, ngi ny c th d dng thay i file v tnh li m bm. Chng ta s tho lun mt bin th ca m bm trong mc 14.5 (m bm c kha), m bm ny ph hp cho vic bo m tnh ton vn ca file trn ng i.

D dng to c m bm ca mt file vi lp HashAlgorithm. Trc ht, th hin ha mt trong cc hin thc gii thut bm dn xut t lp HashAlgorithm (bn cn truyn tn gii thut bm cho phng thc HashAlgorithm.Createxem tn cc gii thut bm hp l trong bng 14.1). K tip, thay v truyn mt mng byte cho phng thc ComputeHash, bn hy truyn mt i tng System.IO.Stream m t file cn c to m bm. i tng

555 Chng 14: Mt m HashAlgorithm x l qu trnh c d liu t Stream v tr v mt mng byte cha m bm

cho file. Lp HashStreamExample di y trnh by cch to m bm t mt file. Bn phi ch nh tn gii thut bm v tn file lm i s dng lnh, v d HashStreamExample SHA1 HashStreamExample.cs.
using System; using System.IO; using System.Security.Cryptography;

public class HashStreamExample {

public static void Main(string[] args) {

// To mt HashAlgorithm vi kiu c ch nh trong // i s dng lnh th nht. using (HashAlgorithm hashAlg = HashAlgorithm.Create(args[0])) {

// M mt FileStream cho file c ch nh trong // i s dng lnh th hai. using (Stream file = new FileStream(args[1], FileMode.Open)) {

// To m bm cho ni dung ca file. byte[] hash = hashAlg.ComputeHash(file);

// Hin th m bm. Console.WriteLine(BitConverter.ToString(hash)); } } } }

4.

Kim tra m bm
Bn cn xc minh mt password hoc xc nhn mt file vn khng thay i bng cch so snh hai m bm. Chuyn c m bm c v mi thnh chui thp lc phn, chui Base64, hay mng byte v so snh chng.

556 Chng 14: Mt m

Bn c th s dng m bm xc nh hai mu d liu c ging nhau hay khng, khng phi lu tr hay duy tr vic truy xut n d liu gc. xc nh d liu c thay i theo thi gian hay khng, bn phi to v lu tr m bm ca d liu gc. Sau , hy to mt m bm khc cho d liu ny ri so snh m bm c v mi cho thy c thay i no xy ra hay khng. nh dng ca m bm gc s xc nh cch thc ph hp nht kim tra m bm mi c to.

Nhiu mc trong chng ny s dng phng thc ToString ca lp System.BitConverter chuyn mng byte thnh gi tr chui thp lc phn khi hin th. Mc d d s dng v thch hp cho mc ch hin th, bn c th nhn thy cch ny khng ph hp khi lu tr m bm v n t du gch ni (-) gia mi gi tr byte (v d, 4D-79-3A-C9-). Ngoi ra, lp BitConverter khng cung cp phng thc no phn tch mt biu din chui nh th tr v mt mng byte.

M bm thng c lu tr trong file text dng chui thp lc phn (v d, 89D22213170A9CFF09A392F00E2C6C4EDC1B0EF9) hoc chui c m ha theo Base64 (v d, idIiExcKnP8Jo5LwDixsTtwbDvk=). M bm cng c th c lu tr trong c s d liu dng gi tr byte th. Bt k bn lu tr m bm theo cch no, bc u tin khi so snh m bm c v mi l a chng v mt dng chung. on m di y chuyn m bm mi (mng byte) thnh chui thp lc phn khi so snh vi m bm c. Ngoi phng thc BitConverter.ToString m chng ta tho lun trn, th vin lp .NET Framework khng cung cp phng thc no chuyn mt mng byte thnh chui thp lc phn. Bn phi vit mt vng lp i qua cc phn t ca mng byte, chuyn mi byte thnh chui, v gn chui ny vo biu din chui thp lc phn ca m bm. S dng System.Text.StringBuilder s trnh to ra cc chui mi khng cn thit mi khi vng lp gn gi tr byte k tip vo chui kt qu (xem mc 2.1 bit thm chi tit).
// Phng thc dng so snh m bm mi vi // m bm c sn (c biu din dng chui thp lc phn). private static bool VerifyHexHash(byte[] hash, string oldHashString) { // To biu din chui cho m bm mi. System.Text.StringBuilder newHashString = new System.Text.StringBuilder(hash.Length); foreach (byte b in hash) { newHashString.AppendFormat("{0:X2}", b); } // So snh biu din chui ca m bm c v mi, // v tr v kt qu.

557 Chng 14: Mt m return (oldHashString == newHashString.ToString()); }

Trong on m di y, m bm mi l mt mng byte v m bm c l mt chui c m ha theo Base64. on m ny s m ha m bm mi thnh chui Base64 ri thc hin php so snh chui.
// Phng thc dng so snh m bm mi vi // m bm c sn (c biu din dng chui Base64). private static bool VerifyB64Hash(byte[] hash, string oldHashString) {

// To biu din chui Base64 cho m bm mi. string newHashString = System.Convert.ToBase64String(hash);

// So snh biu din chui ca m bm c v mi, // ri tr v kt qu. return (oldHashString == newHashString); }

Cui cng, on m di y so snh hai m bm c biu din dng mng byte. Th vin lp .NET Framework khng c phng thc no thc hin kiu so snh ny, do bn phi vit mt vng lp so snh cc phn t ca hai mng. on m ny c s dng mt vi k thut khng tn nhiu thi gian nh: bo m cc mng byte c cng chiu di trc khi bt u so snh chng, v tr v false khi tm thy khc bit u tin.
// Phng thc dng so snh m bm mi vi // m bm c sn (c biu din dng mng byte). private static bool VerifyByteHash(byte[] hash, byte[] oldHash) {

// Nu mt mng l null, hoc hai mng c chiu di khc nhau // th chng khng bng nhau. if (hash == null || oldHash == null || hash.Length != oldHash.Length) return false;

// Duyt qua mng byte v so snh mi gi tr byte. for (int count = 0; count < hash.Length; count++) { if (hash[count] != oldHash[count]) return false; }

// Hai m bm bng nhau. return true; }

558 Chng 14: Mt m

5.

Bo m tnh ton vn d liu bng m bm c kha


Bn cn chuyn mt file cho ai v cp cho ngi ny mt phng cch xc minh tnh ton vn ca file. Cp cho ngi nhn mt kha b mt (key). Kha ny c th l mt s c sinh ngu nhin, nhng n cng c th l mt nhm t m bn v ngi nhn tha thun. S dng kha cng vi mt trong nhng lp gii thut bm c kha dn xut t lp System.Security.Cryptography.KeyedHashAlgorithm to m bm c kha. Gi m bm ny cng vi file. Khi nhn c file, ngi nhn s to m bm c kha cho file ny bng kha. Nu hai m bm ging nhau, ngi nhn s bit rng file ny do bn gi n v n khng b thay i trong qu trnh chuyn giao.

M bm rt hu ch khi so snh hai mu d liu xc nh chng c ging nhau hay khng (c khi bn khng th truy xut c d liu gc). Tuy nhin, bn khng th s dng m bm cam oan vi ngi nhn v tnh ton vn ca d liu. Nu c ai chn c d liu, ngi ny c th thay th d liu v to m bm mi. Khi ngi nhn kim tra m bm, n c v ng nhng thc t d liu khng ging vi nhng g bn gi lc ban u. Mt gii php n gin v hiu qu cho vn ton vn d liu l m bm c kha ( keyed hash code). M bm c kha cng tng t nh m bm bnh thng ( c tho lun trong mc 14.2 v 14.3); tuy nhin, m bm c kha kt hp thm mt phn t d liu b mt (kha), phn t ny ch c ngi gi v ngi nhn bit. Nu khng c kha, khng ai c th to c m bm ng t tp d liu cho trc.

Kha phi c gi b mt. Nu ai bit kha th c th to ra m bm c kha hp l, ngha l bn s khng th xc nh h c thay i ni dung ca ti liu hay khng. V l do ny, bn khng nn chuyn giao hay lu tr kha cng vi ti liu cn c bo v tnh ton vn. Mc 14.10 s cung cp mt c ch m bn c th s dng trao i kha mt cch an ton.

To m bm c kha cng tng t nh to m bm bnh thng v lp tru tng System.Security.Cryptography.KeyedHashAlgorithm m rng lp System.Security.Cryptography.HashAlgorithm. Lp KeyedHashAlgorithm cung cp mt lp c s tt c cc gii thut bm c kha dn xut t . Th vin lp .NET Framework c hai hin thc gii thut bm c kha c lit k trong bng 14.2; mi hin thc l mt thnh vin ca khng gian tn System.Security.Cryptography.
Bng 14.2 Cc hin thc gii thut bm c kha Gii thut/Tn lp HMACSHA1 MACTripleDES Kch thc kha (bit) Kch thc m bm (bit)

bt k 64, 128, 192

160 64

559 Chng 14: Mt m

Cng nh cc gii thut bm chun, bn c th trc tip to ra cc i tng gii thut bm c kha, hoc bn c th s dng phng thc tnh KeyedHashAlgorithm.Create vi i s l tn gii thut. S dng factory cho php bn vit m lnh tng qut v m lnh ny c th lm vic vi bt k hin thc gii thut bm c kha no, nhng theo bng 14.2, mi lp h tr cc chiu di kha khc nhau nn bn phi cung cp gi tr ny trong m lnh tng qut. Nu s dng phng thc khi dng to i tng bm c kha, bn c th truyn kha cho phng thc ny. Khi s dng factory, bn phi thit lp kha bng thuc tnh Key (c tha k t lp KeyedHashAlgorithm). Mt khi cu hnh kha, gi phng thc ComputeHash vi i s l mt mng byte hay mt i tng System.IO.Stream. Gii thut bm c kha s x l d liu nhp v tr v mt mng byte cha m bm c kha. Bng 14.2 cho thy kch thc ca m bm do mi gii thut bm c kha sinh ra. Lp KeyedHashStreamExample di y trnh by cch to m bm c kha t mt file. Bn phi ch nh tn file v mt kha lm i s dng lnh. ng dng ny s dng lp HMACSHA1 to m bm c kha v ri hin th n ra ca s Console.
using System; using System.IO; using System.Text; using System.Security.Cryptography;

public class KeyedHashStreamExample {

public static void Main(string[] args) {

// To mng byte t chui key (l i s dng lnh th hai). byte[] key = Encoding.Unicode.GetBytes(args[1]);

// To mt i tng HMACSHA1 // (truyn key cho phng thc khi dng). using (HMACSHA1 hashAlg = new HMACSHA1(key)) {

// M mt FileStream c file (tn file // c ch nh trong i s dng lnh th nht). using (Stream file = new FileStream(args[0], FileMode.Open)) {

// To m bm c kha cho ni dung file. byte[] hash = hashAlg.ComputeHash(file);

// Hin th m bm c kha ra ca s Console.

560 Chng 14: Mt m

Console.WriteLine(BitConverter.ToString(hash)); } } } }

Lnh KeyedHashStreamExample KeyedHashStreamExample.cs secretKey s sinh ra m bm nh sau:


95-95-2A-8E-44-D4-3C-55-6F-DA-06-44-27-79-29-81-15-C7-2A-48

ng dng KeyedHashMessageExample.cs (c trong a CD nh km) trnh by cch to mt m bm c kha t mt chui. ng dng ny yu cn hai i s dng lnh: mt thng ip v mt kha, v s to ra m bm c kha cho chui thng ip bng kha ny. V d, lnh KeyedHashMessageExample "Two hundred dollars is my final offer" secretKey s sinh ra m bm nh sau:
83-43-0D-9D-07-6F-AA-B7-BC-79-CD-6F-AD-7B-FA-EA-19-D1-24-44

6.

Bo v file bng php mt ha i xng


Bn cn mt ha mt file bng gii thut mt ha i xng (symmetric encryption). Trc ht, bn phi th hin ha mt trong cc lp gii thut i xng c th dn xut t lp System.Security.Cryptography.SymmetricAlgorithm. Sau , gi phng thc CreateEncryptor hay CreateDecryptor ca i tng SymmetricAlgorithm thu ly mt i tng c hin thc giao din System.Security.Cryptography.ICryptoTransform. S dng i tng ICryptoTransform ny kt hp vi mt i tng System.Security.Cryptography.CryptoStream mt ha hay gii mt ha d liu c t mt file (c truy xut bng mt i tng System.IO.FileStream).

Lp tru tng SymmetricAlgorithm cung cp mt lp c s tt c cc hin thc gii thut i xng c th dn xut t . Th vin lp .NET Framework c bn hin thc gii thut i xng c th c lit k trong bng 14.3, mi lp l mt thnh vin ca khng gian tn System.Security.Cryptography. Cc lp c ui l CryptoServiceProvider bc ly cc chc nng do Win32 CryptoAPI cung cp, trong khi cc lp c ui l Managed (hin ti ch c RijndaelManaged) c hin thc hon ton bng m lnh c-qun-l. Bng ny cng cho thy chiu di kha m mi gii thut h tr (chiu di mc nh c in m). Ni chung, kha cng di, cng kh gii mt ha ciphertext nu khng c kha, nhng cng c nhiu yu t khc cn xem xt.
Bng 14.3 Cc hin thc gii thut i xng Tn gii thut Tn lp Chiu di kha (bit)

561 Chng 14: Mt m

DES TripleDES hay 3DES RC2 Rijndael

DESCryptoServiceProvider TripleDESCryptoServiceProvider

64 128, 192 40, 48 56, 64, 72, 80, 88, 96, 104, 112, 120, 128 128, 192, 256

RC2CryptoServiceProvider

RijndaelManaged

Mc d bn c th to ra cc th hin ca cc lp gii thut i xng mt cch trc tip, lp c s SymmetricAlgorithm l mt factory cho cc lp hin thc c th dn xut t . Gi phng thc tnh SymmetricAlgorithm.Create vi i s l tn gii thut s tr v mt i tng thuc kiu c ch nh. S dng factory cho php bn vit m lnh tng qut, v m lnh ny c th lm vic vi bt k hin thc gii thut i xng no:
string algName = "3DES"; SymmetricAlgorithm alg = SymmetricAlgorithm.Create(algName);

Nu bn gi SymmetricAlgorithm.Create v khng ch nh tn gii thut, SymmetricAlgorithm s tr v mt i tng RijndaelManaged. Nu bn ch nh mt gi tr khng hp l, SymmetricAlgorithm s tr v null. Bn c th cu hnh cc nh x tn/lp mi bng file cu hnh (xem ti liu .NET Framework SDK bit thm chi tit).

Trc khi mt ha d liu vi mt trong cc lp gii thut i xng, bn cn mt kha (key) v mt vect khi ng (initialization vector). Kha l thng tin b mt dng mt ha v gii mt ha d liu. Vect khi ng l d liu ngu nhin c truyn cho gii thut mt ha. Bn phi s dng cng kha v vect khi ng cho c mt ha v gii mt ha d liu. Tuy nhin, ch c kha l cn phi c gi b mt, bn c th lu tr hay gi vect khi ng cng vi d liu -c-mt-ha. Kha cho mi lp dn xut t SymmetricAlgorithm c th c truy xut thng qua thuc tnh Key, v vect khi ng c th c truy xut thng qua thuc tnh IV. Cch n gin nht v t li nht to kha v vect khi ng mi l lp t to chng gim bn. Sau khi to mt i tng gii thut i xng, nu bn khng thit lp cc thuc tnh Key v IV cho n, i tng ny s t ng to ra cc gi tr mi ngay khi bn cho gi mt thnh vin c s dng cc gi tr Key v IV. Mt khi c thit lp, i tng gii thut i xng s tip tc s dng cc gi tr Key v IV ny. thay i gi tr ca Key v IV, bn c th gn trc tip cc gi tr mi hoc gi phng thc GenerateKey v GenerateIV (buc i tng gii thut i xng to ra cc gi tr ngu nhin mi). Bn khng th trc tip thc hin mt ha v gii mt ha vi mt i tng gii thut i xng. Mt khi to v cu hnh i tng gii thut i xng, bn phi gi phng thc CreateEncryptor hay CreateDecryptor ca n thu ly mt i tng c hin thc giao din System.Security.Cryptography.ICryptoTransform. K , bn c th s dng cc phng thc ca i tng ICryptoTransform ny mt ha v gii mt ha d liu. Tuy nhin, i tng ICryptoTransform yu cu bn truyn d liu theo tng khi (c kch thc c nh) v lp (bng tay) khi d liu cui cng v khi ny t khi c kch thc ng.

562 Chng 14: Mt m

Giao din ICryptoTransform khng qu kh s dng, nhng khng my thn thin; do vy .NET Framework km thm lp System.Security.Cryptography.CryptoStream. y l lp dn xut t System.IO.Stream, dng n gin ha vic mt ha v gii mt ha d liu c c t cc i tng Stream khc. Lp ny cho php bn mt ha v gii mt ha d liu t cc file v cc kt ni mng mt cch d dng bng mt m hnh x l quen thuc, v n cung cp cho bn tt c cc tin ch quen thuc khi truy xut d liu da-vo-Stream. Phng thc khi dng ca CryptoStream yu cu ba i s: mt Stream nm di, mt th hin ca ICryptoTransform, v mt gi tr thuc kiu lit k System.Security.Cryptography.CryptoStreamMode. Gi tr CryptoStreamMode cho bit ch ca i tng CryptoStream mi; cc gi tr hp l l Read v Write. Khi bn gi phng thc Read hay Write ca CryptoStream, CryptoStream s s dng th hin ICryptoTransform mt ha v gii mt ha d liu ang truyn qua CryptoStream. i tng CryptoStream bo m kch thc khi dng cho th hin ICryptoTransform lun ng. Cu hnh ca mt i tng CryptoStream c tnh linh hot cao, nhng c th hi kh hiu. Bng 14.4 m t hot ng ca mt i tng CryptoStream da trn ch ca CryptoStream v kiu th hin ICryptoTransform c s dng trong phng thc khi dng ca CryptoStream.
Bng 14.4 Hot ng ca i tng CryptoStream
Ch ca CryptoStream Ch th ca ICryptoTransform M t

Read Read Write

Mt ha Gii mt ha Mt ha

Stream

nm

di

cha

plaintext

ngun.

CryptoStream.Read ghi ciphertext ra b m xut. Stream nm di cha ciphertext ngun. CryptoStream.Read ghi plaintext ra b m xut. CryptoStream.Write ch nh plaintext cn mt ha. Stream nm di nhn ciphertext -c-mt-ha. CryptoStream.Write ch nh ciphertext cn gii mt

Write

Gii mt ha

ha. Stream nm di nhn plaintext -c-giimt-ha.

Lp SymmetricEncryptionExample di y trnh by cch s dng gii thut Triple DES mt ha mt file v ri gii mt ha file . Phng thc Main nhn tn ca file cn mt ha lm i s dng lnh. Trc tin, n s to kha v vect khi ng; sau , gi phng thc EncryptFile, k tip l phng thc DecryptFile, v sinh ra hai file: file th nht cha phin bn -c-mt-ha ca file ngun, file th hai cha phin bn -c-gii-mt-ha ca file -c-mt-ha (ging file ngun).
using System; using System.IO; using System.Security.Cryptography;

563 Chng 14: Mt m public class SymmetricEncryptionExample { public static void Main(string[] args) { // To mt gii thut Triple DES mi thu ly kha dng cho // v d ny. Kha ny s c dng chung trong cc phng thc // EncryptFile v DecryptFile. Bnh thng, kha c // tha thun gia ngi gi v ngi nhn, hoc c gi // (bi ngi gi) cng vi file -c-mt-ha. byte[] key; byte[] iv;

using(SymmetricAlgorithm alg = SymmetricAlgorithm.Create("3DES")){ key = alg.Key; iv = alg.IV; } // Mt ha file. Tin t "encrypted" s c thm vo tn file // ngun v c s dng lm tn ca file -c-mt-ha. EncryptFile(args[0], "encrypted"+args[0], (byte[])key.Clone(), (byte[])iv.Clone());

// Gii mt ha file -c-mt-ha. Tin t "decrypted" s c // thm vo tn file gc v c s dng lm tn ca file // -c-gii-mt-ha. DecryptFile("encrypted"+args[0], "decrypted"+args[0], key, iv); } // Phng thc dng mt ha mt file (bng gii thut Triple DES) // vi key v iv cho trc. private static void EncryptFile(string srcFileName, string destFileName, byte[] key, byte[] iv) { // To cc stream truy xut file ngun v file ch. Stream srcFile = new FileStream(srcFileName, FileMode.Open, FileAccess.Read);

564 Chng 14: Mt m

Stream destFile = new FileStream(destFileName, FileMode.Create, FileAccess.Write); // To mt gii thut Triple DES mi mt ha file. using(SymmetricAlgorithm alg = SymmetricAlgorithm.Create("3DES")){

// Cu hnh thuc tnh Key v IV ca gii thut. alg.Key = key; alg.IV = iv;

// To mt CryptoStream mt ha ni dung ca // Stream ngun khi n c c. Gi phng thc // CreateEncryptor ca SymmetricAlgorithm // nhn th hin ICryptoTransform v // truyn n cho CryptoStream. CryptoStream cryptoStream = new CryptoStream(srcFile, alg.CreateEncryptor(), CryptoStreamMode.Read);

// Khai bo b m dng c d liu t file ngun // thng qua CryptoStream v ghi n ra file ch. int bufferLength; byte[] buffer = new byte[1024]; // c file ngun (tng khi 1024 byte) v ghi phin bn // -c-mt-ha ra file ch. do { bufferLength = cryptoStream.Read(buffer, 0, 1024); destFile.Write(buffer, 0, bufferLength); } while (bufferLength > 0); // ng stream v xa cc d liu b mt. destFile.Flush(); Array.Clear(key,0,key.Length);

565 Chng 14: Mt m Array.Clear(iv,0,iv.Length); cryptoStream.Clear(); cryptoStream.Close(); srcFile.Close(); destFile.Close(); } } // Phng thc dng gii mt ha mt file -c-mt-ha bng // gii thut Triple DES vi key v iv cho trc. private static void DecryptFile(string srcFileName, string destFileName, byte[] key, byte[] iv) { // To cc stream truy xut file ngun v file ch. Stream srcFile = new FileStream(srcFileName, FileMode.Open, FileAccess.Read); Stream destFile = new FileStream(destFileName, FileMode.Create, FileAccess.Write); // To mt gii thut Triple DES mi gii mt ha file. using(SymmetricAlgorithm alg = SymmetricAlgorithm.Create("3DES")){ // Cu hnh thuc tnh Key v IV ca gii thut. alg.Key = key; alg.IV = iv; // To mt CryptoStream gii mt ha ni dung ca d liu // -c-mt-ha khi n c ghi. Gi phng thc // CreateDecryptor ca SymmetricAlgorithm nhn th hin // ICryptoTransform v truyn n cho CryptoStream. CryptoStream cryptoStream = new CryptoStream(destFile, alg.CreateDecryptor(), CryptoStreamMode.Write); // Khai bo b m dng c d liu t file -c// mt-ha v ghi ra file ch thng qua CryptoStream.

566 Chng 14: Mt m

int bufferLength; byte[] buffer = new byte[1024]; // c file -c-mt-ha (tng khi 1024 byte) v ghi // phin bn -c-gii-mt-ha ra file ch. do { bufferLength = srcFile.Read(buffer, 0, 1024); cryptoStream.Write(buffer, 0, bufferLength); } while (bufferLength > 0); // ng stream v xa cc d liu b mt. cryptoStream.FlushFinalBlock(); Array.Clear(key,0,key.Length); Array.Clear(iv,0,iv.Length); cryptoStream.Clear(); cryptoStream.Close(); srcFile.Close(); destFile.Close(); } } }

7.

Truy li kha i xng t password


Bn cn to mt kha i xng t mt password ngi dng ch cn nh password v khng cn lu tr kha. S dng lp System.Security.Cryptography.PasswordDeriveBytes to kha i xng t chui password.

Him c ngi no nh c gi tr ca mt kha i xng, v khng thc t khi bt ngi dng nhp cc s di nh th bng tay. iu ny ngha l kha phi c lu tr mt dng an ton sao cho ng dng c th truy xut c (trong smart card, a mm, c s d liu hay file). Vn lin quan vi vic cp, phn b, truy xut, v lu tr kha l mt trong nhng mt kh nht trong qu trnh hin thc bt k gii php mt m no (vn ny c quy chung v qun l kha). Khi cn ghi nh mt b mt (kha), bn khng ch lo bo v d liu m cn phi lo bo v cc b mt dng bo v d liu! Mt cch lu tr kha l cp cho ngi dng mt password d nh hn v s dng mt giao thc truy li kha (key derivation protocol) to mt kha i xng t password. Theo ,

567 Chng 14: Mt m

mi khi cn mt ha hay gii mt ha d liu, ngi dng ch cn nhp password v my tnh s to ra kha (nu ngi dng nhp cng password, giao thc ny s to ra cng kha).

Truy li kha t nhng t hay nhm t d nh lm gim ng k tnh ngu nhin ca kha, dn n gim tnh bo mt c cp bi nhng hm mt m c s dng kha . Trong trng hp ti t nht, hacker c th on c password, v crack d liu ca bn thng qua vic gii m mt m (cryptanalysis).

Th vin lp .NET Framework c mt hin thc truy li kha i xng: PasswordDeriveBytes. Lp ny s dng mt gii thut bm c p dng lp i lp li cho mt password to ra mt kha vi chiu di nh mong mun. Khi cu hnh mt i tng PasswordDeriveBytes, bn c th ch nh tn gii thut bm cng nh s ln lp (mc nh, SHA-1 c p dng 100 ln). Ngoi ra, bn cng cn cung cp gi tr salt. Salt l d liu ngu nhin m qu trnh truy li kha s s dng lm cho kha tm c tr nn bn vng hn i vi cc dng tn cng bng mt m. Bn khng cn gi b mt cho gi tr salt; bn phi lu tr v s dng n khi truy li kha t password sau ny (nu khng c gi tr salt ng, bn s khng th truy li kha ng v khng th gii mt ha c).

Bn khng th to kha bt i xng bng giao thc truy li kha. Gii thut mt ha bt i xng (asymmetric encryption) da vo cc mi lin h ton c th gia cc thnh phn kha cng khai (public key) v kha ring (private key). Nh th, mi gii thut mt ha bt i xng yu cu bn phi tun theo mt quy trnh ring c th to ra cc kha mi.

V d di y trnh by cch s dng lp PasswordDeriveBytes to mt kha i xng gm 64 bit t mt chui password. V d ny yu cu hai i s dng lnh: tn gii thut bm v password (tn ca cc gii thut bm c lit k trong bng 14.1).
using System; using System; using System.Security.Cryptography; public class DerivedKeyExample { public static void Main(string[] args) { // S dng mt b to s ngu nhin to gi tr salt. byte[] salt = new byte[8]; RandomNumberGenerator.Create().GetBytes(salt); // To mt i tng PasswordDeriveBytes to kha t // password. Cn cung cp password ngun (l i s dng // lnh th hai) v salt. PasswordDeriveBytes pdb =

568 Chng 14: Mt m

new PasswordDeriveBytes(args[1], salt); // Thit lp gii thut bm dng to kha, tn // gii thut c ch nh trong i s dng lnh th nht. // Gii thut c s dng mc nh l SHA-1. pdb.HashName = args[0]; // Thit lp s ln lp l 200 (y l s ln gii thut bm // c p dng cho password to kha). Mc nh l 100. pdb.IterationCount = 200; // To mt kha gm 8 byte (64 bit) t password. // Chiu di ca kha b gii hn bi chiu di ca // m bm - 160 bit i vi SHA-1. byte[] key = pdb.GetBytes(8); // Hin th kha v salt. Console.WriteLine("Key = {0}", BitConverter.ToString(key));

Console.WriteLine("Salt = {0}", BitConverter.ToString(salt)); } }

Chy lnh DerivedKeyExample SHA1 S0meVereeStr@ngeP@$$w0rd (s dng gii thut bm SHA-1 truy li mt kha gm 8 byte t chui "S0meVereeStr@ngeP@$$w0rd") s sinh ra kt xut tng t nh sau:
Key = 53-72-74-5B-A4-88-A4-80 Salt = 70-82-79-F4-3B-F9-DF-D2

Ch rng, mi khi bn chy cng mt lnh, DerivedKeyExample sinh ra kha khc nhau. l do tc dng ca salt. Nu bn b i dng lnh gn mt gi tr ngu nhin vo salt (c in m trong on m trn), sau bin dch li v chy DerivedKeyExample, bn s nhn thy v d ny lun to ra cng mt kha vi mt password cho trc.

8.

Gi mt b mt bng php mt ha bt i xng


Bn cn s dng php mt ha bt i xng (asymmetric encryption) gi mt b mt. Th hin ha lp gii thut bt i xng System.Security.Cryptography. RSACryptoServiceProvider. S dng phng thc RSACryptoServiceProvider.

569 Chng 14: Mt m Encrypt v kha cng khai (public key) ca ngi nhn mt ha thng ip.

Sau o, ngi nhn s s dng phng thc RSACryptoServiceProvider.Decrypt v kha ring (private key) gii mt ha b mt -c-mt-ha. .NET Framework nh ngha mt h thng phn cp theo lp cho cc gii thut bt i xng tng t nh nh ngha cho cc gii thut i xng ( c tho lun trong mc 14.6). Tt c cc gii thut bt i xng phi tha k mt lp c s tru tng chung c tn l System.Security.Cryptography.AsymmetricAlgorithm. C hai hin thc gii thut bt i xng c th:
System.Security.Cryptography.RSACryptoServiceProvider System.Security.Cryptography.DSACryptoServiceProvider

V c ui l CryptoServiceProvider nn c hai lp ny u bc ly cc chc nng do Win32 CryptoAPI cung cp. Tuy nhin, ch c lp RSACryptoServiceProvider l h tr vic mt ha d liu. Lp DSACryptoServiceProvider hin thc Digital Signature Algorithm (DSA), bn c th s dng gii thut ny ch to ch k s (xem Federal Information Processing Standard [FIPS] 186-2 ti [http://www.itl.nist.gov/fipspubs] bit thm chi tit v DSA). Mc d bn c th to mt i tng gii thut bt i xng bng phng thc tnh Create ca lp c s AsymmetricAlgorithm, nhng b li bn s phi tr gi cht t cho vic ny. Lp AsymmetricAlgorithm khng khai bo cc phng thc m RSACryptoServiceProvider s dng mt ha v gii mt ha d liu. Thay vo , bn phi trc tip th hin ha lp RSACryptoServiceProvider bng mt trong cc phng thc khi dng ca n. Trc khi mt ha hay gii mt ha d liu vi i tng RSACryptoServiceProvider, bn cn truy xut cc kha thch hp. Kha ca gii thut bt i xng khc nhiu so vi kha ca gii thut i xng. Th nht, n c hai thnh phn: kha cng khai (public key) v kha ring (private key). Th hai, thay v ch l mt dy cc byte c sinh ngu nhin, kha bt i xng c to theo mt cch thc c bit. C mt mi quan h ton c bit gia kha cng khai v kha ring; mi quan h ny cho php gii thut bt i xng mt ha d liu bng mt kha v gii mt ha d liu bng mt kha khc. Mi gii thut bt i xng s dng cch thc to kha ca chnh n, v cc lp hin thc c th ng gi cc chc nng cn thit to ra cc kha mi. Kha cng khai khng cn c gi b mt v ch s hu c th ty gi n cho bn thng qua e-mail, hoc post n ln mt website hay mt server phn phi kha mi ngi cng thy. Nhng ai mun gi b mt th s dng kha cng khai mt ha b mt. Sau , ngi nhn s dng kha ring gii mt ha b mt. Kha ring phi c gi b mt; nhng ai s hu kha ring u c th gii mt ha d liu -c-mt-ha bng kha cng khai. to mt b mt c-mt-ha-bt-i-xng, bn phi c kha cng khai ca ngi nhn v np n vo mt i tng RSACryptoServiceProvider. C hai cch np kha cng khai: S dng phng thc RSACryptoServiceProvider.ImportParameters nhp mt cu trc System.Security.Cryptography.RSAParameters, cu trc ny cha thng tin kha cng khai ca ngi nhn. Ch s hu c th to cu trc RSAParameters bng phng thc RSACryptoServiceProvider.ExportParameters v gi n cho bn. Tuy nhin, ngi ny c th gi cho bn kha cng khai dng byte, v bn phi t np gi tr ny vo cu trc RSAParameters.

570 Chng 14: Mt m

S dng phng thc RSACryptoServiceProvider.FromXmlString np d liu kha cng khai t mt chui XML. Ch s hu c th to d liu XML ny bng phng thc RSACryptoServiceProvider.ToXmlString v gi n cho bn. C v ToXmlString ca lp RSACryptoServiceProvider u nhn mt i s lun l, nu l true, i tng RSACryptoServiceProvider s xut c kha cng khai v kha ring. Bn ch nh gi tr ny l false khi cn xut kha cho mc ch phn phi hay lu tr.
ExportParameters

phng

thc

Mt khi np kha cng khai ca ngi nhn vo i tng RSACryptoServiceProvider, bn c th mt ha d liu. Gii thut bt i xng chm hn gii thut i xng khi mt ha v gii mt ha d liu. V l do ny, bn khng nn s dng gii thut bt i xng mt ha lng d liu ln. Thng thng, nu cn mt ha lng d liu ln, bn nn s dng gii thut i xng v ri mt ha kha i xng bng gii thut bt i xng bn c th gi kha i xng cng vi d liu. Mc 14.10 s tho lun v vn ny. bo m tnh nht qun trong vic s dng, lp RSACryptoServiceProvider khng h tr m hnh mt ha v gii mt ha da-trn-System.IO.Stream ( c s dng trong mc 14.6). mt ha d liu vi i tng RSACryptoServiceProvider, bn hy gi phng thc Encrypt, truyn cho n mt mng byte cha plaintext; Encrypt s tr v mt mng byte cha ciphertext. Phng thc Encrypt cng mhn mt i s lun l cho bit kiu padding m i tng RSACryptoServiceProvider s s dng. Padding cho bit i tng bt i xng s x l plaintext nh th no trc khi mt ha. Padding bo m gii thut bt i xng khng cn x l tng khi d liu, v bo v ciphertext i vi cc dng tn cng bng mt m. Din gii cc dng padding vt qu phm vi ca quyn sch ny. Ni chung, nu ang s dng Microsoft Windows XP tr v sau, bn nn ch nh i s padding l true; nu khng, bn phi ch nh i s padding l l false (nu khng th Encrypt s nm ngoi l System.Security.Cryptography.CryptographicException). Gii mt ha d liu cng n gin nh mt ha d liu. Ngi nhn cn to mt i tng RSACryptoServiceProvider v np n cng vi kha ring. Thng thng, kha ny s c lu tr trong mt kho cha kha (key container) do CryptoAPI qun l (s c tho lun k hn trong mc 14.9). Ngi nhn gi RSACryptoServiceProvider.Decrypt v truyn cho n ciphertext m bn gi. Ngi nhn phi ch nh c ch padding, v n cng phi ging nh khi mt ha d liu. Phng thc Decrypt tr v mt mng byte cha plaintext -cgii-mt-ha. Nu plaintext m t mt chui, ngi nhn phi chuyn mng byte thnh gi tr chui thch hp bng lp System.Text.Encoding.

Lp RSACryptoServiceProvider tha k cc phng thc c tn l EncryptValue v DecryptValue t lp cha ca n l System.Security.Cryptography.RSA. Lp RSACryptoServiceProvider khng hin thc cc phng thc ny v nm ngoi l System.NotSupportedException nu bn gi chng.
AsymmetricEncryptionExample

Lp

di y trnh by cch RSACryptoServiceProvider mt ha mt chui v ri gii mt ha:


using System;

dng

lp

571 Chng 14: Mt m using System.Text; using System.Security.Cryptography; public class AsymmetricEncryptionExample { public static void Main(string[] args) { // Khai bo mt bin RSAParameters, bin ny s cha // thng tin PUBLIC KEY ca ngi nhn. RSAParameters recipientsPublicKey; // Khai bo mt bin CspParameters, bin ny s cho bit // PRIVATE KEY c lu tr trong kho cha kha no. // Thng thng, ch c ngi nhn mi c th truy xut // thng tin ny. Vi mc ch minh ha, chng ta s to // mt cp kha ngay u v d v s dng cc kha ny // cho c bn gi v bn nhn. CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = "MyKeys"; // To cp kha bt i xng bng lp RSACryptoServiceProvider. // Lu cc kha ny vo mt kho cha kha c tn l "MyKeys" // v trch thng tin PUBLIC KEY vo bin recipientsPublicKey. using (RSACryptoServiceProvider rsaAlg = new RSACryptoServiceProvider(cspParams)) {

// Cu hnh cho gii thut lu kha vo kho cha kha. rsaAlg.PersistKeyInCsp = true;

// Trch PUBLIC KEY. recipientsPublicKey = rsaAlg.ExportParameters(false); } // Hin th thng ip plaintext gc. Console.WriteLine("Original message = {0}", args[0]); // Chuyn thng ip gc thnh mng byte. Tt nht l khng // truyn cc thng tin b mt dng chui gia cc phng thc.

572 Chng 14: Mt m

byte[] plaintext = Encoding.Unicode.GetBytes(args[0]); // Mt ha thng ip bng phng thc EncryptMessage. // Phng thc ny cn PUBLIC KEY ca ngi nhn. byte[] ciphertext = EncryptMessage(plaintext, recipientsPublicKey);

// Hin th ciphertext do phng thc EncryptMessage tr v. // S dng phng thc BitConverter.ToString method cho n gin // mc d n chn du gch ni (-) vo gia cc gi tr byte // (khng ng vi biu din d liu trong b nh). Console.WriteLine("Formatted Ciphertext = {0}", BitConverter.ToString(ciphertext)); // Gii mt ha thng ip (-c-mt-ha) bng phng thc // DecryptMessage. Phng thc ny cn truy xut PRIVATE KEY // ca ngi nhn (ch c ngi nhn mi c th truy xut c). // Chng ta s truyn cho n mt i tng CspParameters // (cho bit PRIVATE KEY c lu tr trong kho cha kha no). // Gii php ny an ton hn l truyn PRIVATE KEY th // gia cc phng thc. byte[] decData = DecryptMessage(ciphertext, cspParams); // Chuyn thng ip -c-gii-mt-ha t mng byte // thnh chui v hin th n ra ca s Console. Console.WriteLine("Decrypted message = {0}", Encoding.Unicode.GetString(decData)); // Nhn Enter kt thc. Console.ReadLine(); }

// Phng thc dng mt ha (theo RSA) mt thng ip bng // PUBLIC KEY (nm trong mt cu trc RSAParameters). private static byte[] EncryptMessage(byte[] plaintext, RSAParameters rsaParams) {

573 Chng 14: Mt m

// Khai bo mng byte cha ciphertext. byte[] ciphertext = null;

// To mt th hin ca gii thut RSA. using (RSACryptoServiceProvider rsaAlg = new RSACryptoServiceProvider()) { rsaAlg.ImportParameters(rsaParams); // Mt ha plaintext bng OAEP padding // (ch c h tr trn Windows XP tr v sau). ciphertext = rsaAlg.Encrypt(plaintext, true); } // Xa cc gi tr c gi trong mng byte cha plaintext. // iu ny bo m d liu b mt khng cn trong b nh // sau khi bn gii phng tham chiu n n. Array.Clear(plaintext, 0, plaintext.Length); return ciphertext; } // Phng thc dng gii mt ha mt thng ip (-c-mt-ha// theo-RSA) bng PRIVATE KEY (do i tng CspParameters ch nh). private static byte[] DecryptMessage(byte[] ciphertext, CspParameters cspParams ) { // Khai bo mng byte cha plaintext (-c-gii-mt-ha). byte[] plaintext = null; // To mt th hin ca gii thut RSA. using (RSACryptoServiceProvider rsaAlg = new RSACryptoServiceProvider(cspParams)) { // Gii mt ha plaintext bng OAEP padding. plaintext = rsaAlg.Decrypt(ciphertext, true); }

574 Chng 14: Mt m

return plaintext; } }

Lnh AsymmetricEncryptionExample "I love you!" s sinh ra kt xut tng t nh sau:


Original message = I love you! Formatted Ciphertext = 1F-53-05-2B-9D-CC-20-6B-5D-D3-D4-0B-C9-5F-CA-FA-C1-61-6C3B-5B-9E-EA-B9-D0-AF-E5-2B-05-BC-D4-94-DD-71-D6-21-2A-B0-82-6B-16-C0-89-3E-24-B3B3-A3-15-FE-16-7A-B0-58-14-43-CD-69-1A-FD-08-39-2D-09-A6-41-86-96-78-B4-3D-D6-C739-8A-90-84-D6-68-E6-5D-86-32-14-67-51-A7-B7-5A-EF-CF-F4-6D-E4-B0-18-6A-16-2A-AF54-B7-3C-B8-19-6E-A5-86-BF-3E-B2-6D-17-E3-1D-E8-AD-D1-A8-D9-54-93-8E-F1-E8-5D-AC4A Decrypted message = I love you!

Nu bn chy v d ny nhiu ln vi cng thng ip v kha, ciphertext s khc nhau. l v c ch padding sinh ra d liu ngu nhin trnh cc dng tn cng bng mt m. Mc d hi rc ri nhng y chnh l cch hnh x m ta mong i.

9.

Lu tr kha bt i xng mt cch an ton


Bn cn lu tr cp kha bt i xng vo mt ni an ton ng dng ca bn c th truy xut c d dng. Da vo chc nng lu tr kha do hai lp gii thut bt i xng cung cp (RSACryptoServiceProvider v DSACryptoServiceProviderthuc khng gian tn System.Security.Cryptography).

C hai lp gii thut bt i xngRSACryptoServiceProvider v DSACryptoServiceProvider u bc ly cc chc nng do CSP (Cryptographic Service Providermt thnh phn ca Win32 CryptoAPI) hin thc. Ngoi cc dch v nh mt ha, gii mt ha, v ch k s, mi CSP cn cung cp mt kho cha kha (key container). Kho cha kha l vng lu tr dnh cho cc kha m CSP qun l; CSP s dng c ch bo mt ca h iu hnh v php mt ha mnh bo v ni dung ca kho cha kha. Kho cha kha cho php ng dng d dng truy xut kha m khng nh hng n tnh bo mt ca kha. Khi gi cc hm ca mt CSP, ng dng cn ch nh tn ca kho cha kha v CSP s truy xut cc kha cn thit. V kha khng truyn t CSP n ng dng nn ng dng khng th lm hi tnh bo mt ca kha. Lp RSACryptoServiceProvider v DSACryptoServiceProvider cho php bn cu hnh hin thc CSP nm di bng mt th hin ca lp System.Security.Cryptography. CspParameters. cu hnh cho mt i tng RSACryptoServiceProvider hay DSACryptoServiceProvider s dng mt kho cha kha c th, bn phi hon tt cc bc di y: 1. To mt i tng CspParameters.

575 Chng 14: Mt m

2. 3.

Thit lp trng KeyContainerName ca i tng CspParameters l mt gi tr chui m t tn ca kho cha kha cn s dng; chui c th cha khong trng. To mt i tng RSACryptoServiceProvider hay DSACryptoServiceProvider, v truyn i tng CspParameters lm i s cho phng thc khi dng.

Nu kho cha kha tn ti bn trong tm vc ca CSP v cha cc kha thch hp, CSP s s dng cc kha ny khi thc hin cc thao tc mt m. Nu kho cha kha hay kha khng tn ti, CSP s t ng to kha mi. buc CSP lu tr cc kha mi c to vo kho cha kha, bn phi thit lp thuc tnh PersistKeyInCsp (ca i tng RSACryptoServiceProvider hay DSACryptoServiceProvider) l true. Phng thc LoadKeys di y l mt on trch trong file StoreAsymmetricKeyExample.cs (xem a CD nh km). LoadKeys to mt i tng RSACryptoServiceProvider v cu hnh cho n s dng mt kho cha kha c tn l MyKeys. Bng cch ch nh PersistKeyInCsp l true, gii thut s t ng lu tr cc kha mi c to vo kho cha kha ny.
// Phng thc ny to mt i tng RSACryptoServiceProvider // v np cc kha t mt kho cha kha nu chng tn ti; nu khng, // RSACryptoServiceProvider s t ng to cc kha mi v lu // chng vo kho cha kha s dng sau ny. public static void LoadKeys(string container) {

// To mt i tng CspParameters v thit lp trng // KeyContainerName l tn ca kho cha kha. System.Security.Cryptography.CspParameters cspParams = new System.Security.Cryptography.CspParameters(); cspParams.KeyContainerName = container;

// To mt i tng gii thut RSA v truyn i tng // CspParameters lm i s trong phng thc khi dng. using (System.Security.Cryptography.RSACryptoServiceProvider rsaAlg = new System.Security.Cryptography.RSACryptoServiceProvider(cspParams)){

// Cu hnh cho i tng RSACryptoServiceProvider // lu tr kha vo kho cha kha. rsaAlg.PersistKeyInCsp = true;

// Hin th PUBLIC KEY. System.Console.WriteLine(rsaAlg.ToXmlString(false)); } }

576 Chng 14: Mt m

Lp RSACryptoServiceProvider v DSACryptoServiceProvider khng cung cp phng thc no trc tip g b kho cha kha. xa cc kha c lu tr, bn hy thit lp gi tr ca PersistKeyInCsp l false v gi phng thc Clear hay Dispose ca i tng RSACryptoServiceProvider hay DSACryptoServiceProvider. Phng thc DeleteKeys di y s trnh by k thut ny:
// Phng thc ny to mt i tng RSACryptoServiceProvider // v xa cc kha hin c khi kho cha kha. public static void DeleteKeys(string container) {

// To mt i tng CspParameters v thit lp trng // KeyContainerName l tn ca kho cha kha cn xa. System.Security.Cryptography.CspParameters cspParams = new System.Security.Cryptography.CspParameters(); cspParams.KeyContainerName = container;

// To mt i tng gii thut RSA v truyn i tng // CspParameters lm i s trong phng thc khi dng. using (System.Security.Cryptography.RSACryptoServiceProvider rsaAlg = new System.Security.Cryptography.RSACryptoServiceProvider(cspParams)){

// Cu hnh cho i tng RSACryptoServiceProvider // khng lu tr kha vo kho cha kha. rsaAlg.PersistKeyInCsp = false; // Hin th PUBLIC KEY. V chng ta gi Dispose() // sau li gi ny nn cc kha hin c s khng thay i // cho n khi phng thc c gi ln th hai. System.Console.WriteLine(rsaAlg.ToXmlString(false)); // V m lnh nm trong khi "using" nn Dispose c gi // trn i tng RSACryptoServiceProvider. V i tng // ny c cu hnh l khng lu tr kha nn kho cha kha // s b xa. Thay v gi Dispose(), gi rsaAlg.Clear() // s c cng tc dng, v n gin tip gi Dispose(). }

577 Chng 14: Mt m }

Win32 CryptoAPI h tr c user-key-store v machine-key-store. H iu hnh Windows bo m mt user-key-store ch c th c truy xut bi ngi to ra n, nhng mt machinekey-store c th c truy xut bi bt k ngi dng no ca my. Theo mc nh, lp RSACryptoServiceProvider v DSACryptoServiceProvider s s dng user-key-store. Bn c th ch nh s dng machine-key-store bng cch thit lp thuc tnh tnh UseMachineKeyStore ca lp RSACryptoServiceProvider hay DSACryptoServiceProvider l true. iu ny s c tc dng vi tt c m lnh ang chy trong min ng dng hin hnh. Nu mun kim sot cht ch hn, bn c th thit lp thuc tnh CspParameters.Flags l gi tr System.Security.Cryptography.CspProviderFlags.UseMachineKeyStore trc khi to i tng mt ha bt i xng.

Bn nn xt cc yu cu bo mt mt cch cn thn trc khi chn s dng machine-key-store. Thc t l ngi dng no c quyn truy xut my u c th ginh c quyn truy xut cc kha trong kho lu tr, iu ny ph nh hu ht cc li ch do php mt ha bt i xng mang li.

10.

Trao i kha phin i xng mt cch an ton


Bn cn trao i d liu -c-mt-ha-i-xng vi ai , v bn cn mt bin php an ton phn b kha phin (session key) i xng cng vi d liu. S dng c ch trao i kha do lp System.Security.Cryptography. RSACryptoServiceProvider hin thc. Theo c ch ny, kha i xng s c mt ha bt i xng bng kha cng khai (public key) ca ngi nhn. Theo , bn c th gi kha i xng -c-mt-ha cng vi d liu -c-mtha. Ngi nhn phi gii mt ha kha i xng bng kha ring (private key), ri mi tin hnh gii mt ha d liu.

Mi khi mt ha d liu (bng gii thut i xng) chuyn giao, bn nn to mt kha mi, c gi l kha phin (session key). S dng kha phin c hai li ch chnh: Nu ai (khng c php) ly c nhiu khi ciphertext c mt ha bng cng mt kha i xng, kh nng ngi gii c d liu s tng cao. Nu ai tm c kha phin ca bn, ngi ny ch c th truy xut c mt tp d liu no -c-mt-ha, ch khng phi tt c cc b mt ca bn qu kh v tng lai.

Vn i vi kha phin l phn b v bo mt kha. Mt gii php l tha thun mt lng ln kha phin vi nhng ngi m bn cn trao i d liu vi h. Tht khng may, vic ny nhanh chng tr nn kh qun l; v thc t l tt c cc kha ca bn trong tng lai u c lu tr ti mt ni no , iu ny tng kh nng chng s b xm hi. Cch tt hn l gi kha phin theo mt dng c mt ha mnh cng vi d liu m bn mt ha vi kha qu trnh ny c gi l trao i kha (key exchange). Qu trnh trao i kha s dng php mt ha bt i xng mt ha kha phin i xng. Nu mun gi d liu cho ai , bn to mt kha phin i xng, mt ha d liu, v ri mt ha kha phin bng kha cng khai ca ngi nhn. Khi nhn c d liu, ngi nhn gii mt ha kha phin bng kha ring ca h, v ri gii mt ha d liu. Quan trng l vic

578 Chng 14: Mt m

trao i kha cho php bn trao i cc lng d liu ln (-c-mt-ha) vi bt c ai, thm ch nhng ngi bn cha tng tip xc trc y, min l bn c th truy xut kha cng khai i xng ca h.

Mt cch l tng, bn s dng mt gii thut bt i xng mt ha tt c d liu, nh th trnh c nhu cu trao i cc kha i xng. Tuy nhin, tc ca cc gii thut bt i xng khi mt ha v gii mt ha d liu khin chng khng thc t cho vic s dng vi cc lng ln d liu. S dng cc gii thut bt i xng mt ha cc kha phin i xng l mt gii php tuy phc tp hn, nhng l tt nht c hai mt: tnh linh hot v tnh nhanh chng.

Th vin lp .NET Framework h tr vic trao i kha ch vi gii thut RSA, nhng bn phi la chn gia hai formatting scheme: Optimal Asymmetric Encryption Padding (OAEP) v PKCS #1 v 1.5. Bn v cc formatting scheme ny vt qu phm vi ca quyn sch ny. Ni chung, bn nn s dng OAEP formatting tr khi bn c nhu cu giao tip vi mt h thng c c s dng PKCS formatting. Hai lp di y hin thc c ch trao i kha, mi c ch ng vi mt formatting scheme:
System.Security.Cryptography.RSAOAEPKeyExchangeFormatter System.Security.Cryptography.RSAPKCS1KeyExchangeFormatter

chun b mt kha i xng dng cho trao i, bn phi to mt i tng formatter vi kiu nh mong mun v ri n nh mt i tng gii thut bt i xng (RSACryptoServiceProvider) cho formatter bng phng thc SetKey ca formatter. Bn phi cu hnh cho gii thut bt i xng s dng kha cng khai ca ngi nhn. Khi cu hnh xong, gi phng thc CreateKeyExchange ca formatter v truyn mt mng byte cha kha phin i xng m bn cn nh dng. Phng thc CreateKeyExchange tr v mt mng byte cha d liu bn s gi i. Gii nh dng cho kha ngc vi qu trnh nh dng. C hai lp deformatter, mi lp ng vi mt formatting scheme.
System.Security.Cryptography.RSAOAEPKeyExchangeDeformatter System.Security.Cryptography.RSAPKCS1KeyExchangeDeformatter

gii nh dng mt kha phin c nh dng, hy to mt i tng deformatter vi kiu ph hp ri gi phng thc SetKey ca n n nh mt i tng gii thut bt i xng. Bn phi np kha ring ca bn vo gii thut bt i xng. Cui cng, gi phng thc DecryptKeyExchange vi i s l d liu trao i. Phng thc ny tr v mt mng byte cha kha phin i xng gc. File KeyExchangeExample.cs cha v d minh ha cho vic trao i kha. Phng thc Main m phng vic to, nh dng, trao i, v gii nh dng mt kha phin i xng. N s to mt cp kha bt i xng s dng cho c v d ny. Thc t, ngi gi (ngi to kha i xng) ch c kha cng khai ca ngi nhn; ngi nhn c kha ring (c gi b mt).

579 Chng 14: Mt m

Cng nh nn s dng mt kha i xng c chiu di ph hp vi tnh b mt ca d liu ang c bo v, bn nn mt ha kha phin bng mt gii thut bt i xng v chiu di kha t nht cng phi tng ng vi kha i xng. Nu kha bt i xng yu hn kha i xng, c kh nng k tn cng s ph v gii thut bt i xng v thu ly kha i xng thay v c gii mt ha d liu -c-mt-ha-i-xng. Xem [http://www.ietf.org/rfc/rfc3766.txt] (c trong a CD nh km) bit chi tit v s tng ng gia chiu di kha i xng v bt i xng.

K , phng thc Main gi phng thc FormatKeyExchange vi i s l mt mng byte cha kha i xng v mt i tng RSAParameters cha kha cng khai ca ngi nhn. Phng thc FormatKeyExchange tr v mt mng byte cha kha i xng -c-mt-ha v -c-nh-dng, chun b gi i. K tip, phng thc Main gi phng thc DeformatKeyExchange vi i s l d liu trao i c nh dng v i tng CspParameters cha mt tham chiu n kho cha kha MyKeys (cha kha ring ca ngi nhn). Trong sut qu trnh ny, phng thc Main s hin th kha phin gc, d liu trao i c nh dng, v cui cng l kha phin c gii nh dng.
using System; using System.Text; using System.Security.Cryptography;

public class KeyExchangeExample { public static void Main() { // Khai bo mt bin RSAParameters, bin ny s // cha thng tin PUBLIC KEY ca ngi nhn. RSAParameters recipientsPublicKey;

// Khai bo mt bin CspParameters, bin ny s cho bit // PRIVATE KEY c lu tr trong kho cha kha no. // Thng thng, ch c ngi nhn mi c th truy xut // thng tin ny. Vi mc ch minh ha, chng ta s to // mt cp kha ngay u v d v s dng cc kha ny // cho c bn gi v bn nhn. CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = "MyKeys"; // To cp kha bt i xng bng lp RSACryptoServiceProvider. // Lu cc kha ny vo mt kho cha kha c tn l "MyKeys"

580 Chng 14: Mt m

// v trch thng tin PUBLIC KEY vo bin recipientsPublicKey. using (RSACryptoServiceProvider rsaAlg = new RSACryptoServiceProvider(cspParams)) { // Cu hnh cho gii thut lu kha vo kho cha kha. rsaAlg.PersistKeyInCsp = true; // Trch PUBLIC KEY. recipientsPublicKey = rsaAlg.ExportParameters(false); }

// To gii thut i xng Triple-DES v s dng // kha c sinh t ng lm kha phin. using (SymmetricAlgorithm symAlg = SymmetricAlgorithm.Create("3DES")) {

// Hin th kha phin gc. Console.WriteLine("Session Key at Source = {0}\n\r", BitConverter.ToString(symAlg.Key));

// Chun b kha phin i xng dng cho trao i // (s dng phng thc FormatKeyExchange, phng thc // ny cn kha dng mt ha v PUBLIC KEY // ca ngi nhn). byte[] exchangeData = FormatKeyExchange(symAlg.Key, recipientsPublicKey);

// Hin th kha phin -c-mt-ha (do phng thc // FormatKeyExchange tr v). Console.WriteLine("Exchange Data = {0}\n\r", BitConverter.ToString(exchangeData));

// ****** GI KHA ****** // By gi, kha phin c th c gi i bng cc // knh giao tip bnh thng.

581 Chng 14: Mt m // Trch kha phin t d liu trao i bng // phng thc DeformatKeyExchange. byte[] sessionKey = DeformatKeyExchange(exchangeData, cspParams);

// Hin th kha phin va c trch. Console.WriteLine("Session Key at Destination = {0}\n\r", BitConverter.ToString(sessionKey));

// Nhn Enter kt thc. Console.ReadLine(); } }

// Phng thc dng mt ha v nh dng kha phin i xng. // mt ha kha phin, chng ta cn truy xut PUBLIC KEY // ca ngi nhn (trong cu trc RSAParameters). private static byte[] FormatKeyExchange(byte[] sessionKey, RSAParameters rsaParams) {

// To mt gii thut bt i xng RSA. using (RSACryptoServiceProvider asymAlg = new RSACryptoServiceProvider()) {

// Np PUBLIC KEY ca ngi nhn. asymAlg.ImportParameters(rsaParams);

// To mt RSA OAEP formatter nh dng d liu trao i. RSAOAEPKeyExchangeFormatter formatter = new RSAOAEPKeyExchangeFormatter();

// Ch nh gii thut RSA dng mt ha kha phin. formatter.SetKey(asymAlg);

// Mt ha v nh dng kha phin ri tr v kt qu. return formatter.CreateKeyExchange(sessionKey); }

582 Chng 14: Mt m

// Phng thc dng gii mt ha d liu trao i v trch kha phin // i xng. gii mt ha d liu trao i, chng ta cn truy xut // PRIVATE KEY (t kho cha kha do i s cspParams ch nh). private static byte[] DeformatKeyExchange(byte[] exchangeData, CspParameters cspParams) {

// To mt gii thut bt i xng RSA. using (RSACryptoServiceProvider asymAlg = new RSACryptoServiceProvider(cspParams)) {

// To mt RSA OAEP deformatter trch kha phin // t d liu trao i. RSAOAEPKeyExchangeDeformatter deformatter = new RSAOAEPKeyExchangeDeformatter();

// Ch nh gii thut RSA dng gii mt ha d liu trao i. deformatter.SetKey(asymAlg);

// Gii mt ha d liu trao i v tr v kha phin. return deformatter.DecryptKeyExchange(exchangeData); } } }

Chy KeyExchangeExample s sinh ra kt xut tng t nh sau:


Session Key at Source = EE-5B-16-5B-AC-46-3D-72-CC-73-19-D9-0B-8A-19-E2-A6-02-13BE-F8-CE-DF-40

Exchange Data = 60-FA-3B-63-41-25-F1-AD-08-F9-FC-67-CD-C6-FB-3E-0F-C3-62C6-3F-5C-C0-7E-D1-60-2D-19-58-07-EE-BB-7C-53-A5-C2-FB-CA-D7-64-FF-BA-33-77-AC-5287-5F-75-E7-57-99-01-90-CD-70-36-1E-53-0C-82-C6-CE-B8-BC-8B-C9-39-6F-29-39-5F-6CA6-43-E5-B0-A1-42-46-1C-9B-1C-72-EB-5E-67-06-44-C0-CE-AB-70-B8-39-8E-9F-01-E8-4951-36-D6-27-09-94-DA-42-CE-79-C2-72-88-4D-CE-63-B4-A0-AC-07-AF-26-A7-76-DE-21-BEA5

Session Key at Destination = EE-5B-16-5B-AC-46-3D-72-CC-73-19-D9-0B-8A-19-E2-A602-13-BE-F8-CE-DF-40

583 Chng 14: Mt m

584

Chng 15:KH NNG LIN TC M LNH KHNGC-QUN-L

15

585

586 Chng 15: Kh nng lin tc m lnh khng-c-qun-l

icrosoft .NET Framework l mt nn cc k cao vng, l s kt hp ca mt ngn ng mi (C#), mt b thc thi c-qun-l (CLR), mt nn cho cc ng dng Web (Microsoft ASP.NET), v mt th vin lp rt ln xy dng tt c cc kiu ng dng. Tuy nhin, .NET Framework khng lp li cc tnh nng c trong m lnh khngc-qun-l. Hin thi, .NET Framework khng bao gm mi hm c trong Win32 API, trong khi nhiu doanh nghip ang s dng cc gii php phc tp c xy dng vi cc ngn ng da-trn-COM nh Microsoft Visual Basic 6 v Microsoft Visual C++ 6. May mn l Microsoft khng c nhng doanh nghip b i nn tng m lnh m h xy dng khi chuyn sang nn .NET. Thay vo , .NET Framework c trang b vi cc tnh nng interoperability (kh nng lin tc), cho php bn s dng li m lnh c (legacy code) trong cc ng dng .NET Framework v truy xut cc assembly .NET nh th chng l cc thnh phn COM. Chng ny s tho lun cc vn sau: Cch gi cc hm thuc DLL khng-c-qun-l (mc 15.1 n 15.5). Cch s dng thnh phn COM trong ng dng .NET Framework (mc 15.6 n 15.8). Cch s dng iu kim ActiveX trong ng dng .NET Framework (mc 15.9). Cch to mt thnh phn .NET sao cho mt COM-client c th s dng n (mc 15.10).

1.

Gi mt hm trong mt DLL khng-c-qun-l


Bn cn gi mt hm C trong mt DLL. y c th l mt hm ca Win32 API hoc do bn vit. Khai bo mt phng thc trong m C# m bn s s dng truy xut hm khng-c-qun-l. Khai bo phng thc ny l static v extern, p dng c tnh System.Runtime.InteropServices.DllImportAttribute ch nh file DLL v tn ca hm cn dng.

s dng mt hm C t mt th vin ngoi, bn ch cn khai bo n mt cch thch hp. CRL s t ng m trch phn vic cn li, bao gm vic ti DLL vo b nh khi hm c gi v chuyn cc thng s t kiu d liu .NET thnh kiu d liu C. Dch v .NET h tr vic thc thi xuyn-nn ny c tn l PInvoke (Platform Invoke), v qu trnh ny thng l trong sut i vi ngi s dng. Thnh thong, bn s cn thc hin thm mt s vic, chng hn cn h tr cu trc trong-b-nh (in-memory structure), callback, hay chui c th thay i (mutable string). PInvoke thng c s dng truy xut cc hm Win32 API, c bit l cc tnh nng khng c trong cc lp c-qun-l thuc .NET Framework. Cc v d c trnh by trong chng ny s s dng PInvoke theo cch ny. C ba th vin chnh trong Win32 API: kernel32.dll gm cc hm c-trng-h-iu-hnh nh np tin trnh, chuyn ng cnh, nhp/xut file v b nh. user32.dll gm cc hm dng thao tc ca s, trnh n, hp thoi, biu tng,

587 Chng 15: Kh nng lin tc m lnh khng-c-qun-l

gdi32.dll gm cc hm ha dng v trc tip ln ca s, trnh n, b mt iu kim, cng nh in n.

V d, xt cc hm Win32 API dng c v ghi cc file INI, chng hn GetPrivateProfileString v WritePrivateProfileString trong kernell32.dll. .NET Framework khng c lp no bc ly chc nng ny. Tuy nhin, c th nhp cc hm ny bng c tnh DllImportAttribute nh sau:
[DllImport("kernel32.DLL", EntryPoint="WritePrivateProfileString")] private static extern bool WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName);

Cc i s trong phng thc WritePrivateProfileString phi tng thch vi hm trong DLL, nu khng s c li khi gi n. V phng thc WritePrivateProfileString c khai bo tham chiu n mt hm trong DLL nn bn khng c vit m cho n. Phn EntryPoint trong c tnh DllImportAttribute trong v d ny l ty chn, v tn phng thc c khai bo trng vi tn ca hm trong th vin ngoi. Trong v d sau, lp IniFileWrapper khai bo cc phng thc ring tham chiu ti cc hm Win32 API, sau gi chng t cc phng thc cng khai khc da trn file c ch nh:
using System; using System.Text; using System.Runtime.InteropServices; using System.Windows.Forms;

public class IniFileWrapper {

private string filename;

public string Filename { get {return filename;} } public IniFileWrapper(string filename) { this.filename = filename; } [DllImport("kernel32.dll", EntryPoint="GetPrivateProfileString")] private static extern int GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName); [DllImport("kernel32.dll", EntryPoint="WritePrivateProfileString")]

588 Chng 15: Kh nng lin tc m lnh khng-c-qun-l

private static extern bool WritePrivateProfileString( string lpAppName, string lpKeyName, string lpString, string lpFileName); // Bn hm sau khng c s dng trong v d ny, // nhng c khai bo cho y . [DllImport("kernel32.dll", EntryPoint="WritePrivateProfileInt")] private static extern int GetPrivateProfileInt(string lpAppName, string lpKeyName, int iDefault, string lpFileName) ; [DllImport("kernel32.dll", EntryPoint="GetPrivateProfileSection")] private static extern int GetPrivateProfileSection( string lpAppName, byte[] lpReturnedString, int nSize, string lpFileName); [DllImport("kernel32.dll", EntryPoint="WritePrivateProfileSection")] private static extern bool WritePrivateProfileSection( string lpAppName, byte[] data, string lpFileName); [DllImport("kernel32.dll", EntryPoint="GetPrivateProfileSectionNames")] private static extern int GetPrivateProfileSectionNames( byte[] lpReturnedString, int nSize, string lpFileName);

public string GetIniValue(string section, string key) {

StringBuilder buffer = new StringBuilder(); string sDefault = ""; if (GetPrivateProfileString(section, key, sDefault, buffer, buffer.Capacity, filename) != 0) { return buffer.ToString(); } else { return null; } }

589 Chng 15: Kh nng lin tc m lnh khng-c-qun-l

public bool WriteIniValue(string section, string key, string value) { return WritePrivateProfileString(section, key, value, filename); } }

Phng thc GetPrivateProfileString c mt thng s thuc kiu StringBuilder (lpReturnedString). l v chui ny phi l kh ikhi li gi hm hon tt, n s cha thng tin ca file INI. Bt c khi no cn chui kh i, bn phi s dng StringBuilder thay cho String. Thng thng, bn cn to StringBuilder vi mt b m k t c kch thc xc nh, ri truyn kch thc ny ( nSize) cho phng thc. Bn c th ch nh s lng k t trong phng thc khi dng ca StringBuilder (xem mc 2.1 c thm thng tin v StringBuilder).

th nghim lp IniFileWrapper, bn hy to mt file INI cha thng tin sau:


[SampleSection] Key1=Value1 Key2=Value2 Key3=Value3

V thc thi on m sau c v ghi mt gi tr trong file INI.


public class IniTest { private static void Main() {

IniFileWrapper ini = new IniFileWrapper( Application.StartupPath + "\\initest.ini"); string val = ini.GetIniValue("SampleSection", "Key1"); Console.WriteLine("Value of Key1 in [SampleSection] is: " + val); ini.WriteIniValue("SampleSection", "Key1", "New Value"); val = ini.GetIniValue("SampleSection", "Key1"); Console.WriteLine("Value of Key1 in [SampleSection] is now: " + val); ini.WriteIniValue("SampleSection", "Key1", "Value1"); Console.ReadLine(); } }

590 Chng 15: Kh nng lin tc m lnh khng-c-qun-l

2.

Ly handle ca mt iu kim, ca s, hoc file


Bn cn gi mt hm khng-c-qun-l, v hm ny cn handle ca mt iu kim, ca s, hoc file. Nhiu lp, bao gm lp FileStream v tt c lp dn xut t Control, tr v handle (thuc cu trc IntPtr) thng qua thuc tnh Handle. Cng c lp tr v thng tin tng t; v d, lp System.Diagnostics.Process c thm thuc tnh Process.MainWindowHandle ngoi thuc tnh Handle.

.NET Framework khng che du cc chi tit nm di, chng hn handle dng cho ca s v iu kim. Mc d khng thng s dng thng tin ny, bn c th ly n khi cn gi mt hm khng-c-qun-l v hm ny cn n n. Xt ng dng di y, form chnh lun hin th trn tt c cc ca s khc bt k n c focus hay khng (c c chc nng ny bng cch thit lp thuc tnh Form.TopMost l true). Form cn c mt Timer nh k gi cc hm khng-c-qun-l GetForegroundWindow v GetWindowText ly thng tin ca ca s hin ang c focus. Ngoi ra, handle ca form chnh c ly thng qua thuc tnh Form.Handle, ri c so snh vi handle ca form hin ang tch cc kim tra form chnh ang c focus hay khng.

Hnh 15.1 Thng tin v ca s ang tch cc using System; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Text; public class ActiveWindowInfo : System.Windows.Forms.Form { // (B qua phn m designer.) private System.Windows.Forms.Timer tmrRefresh; private System.Windows.Forms.Label lblCurrent; private System.Windows.Forms.Label lblHandle;

591 Chng 15: Kh nng lin tc m lnh khng-c-qun-l private System.Windows.Forms.Label lblCaption; [DllImport("user32.dll")] private static extern int GetForegroundWindow(); [DllImport("user32.dll")] private static extern int GetWindowText(int hWnd, StringBuilder text, int count); private void tmrRefresh_Tick(object sender, System.EventArgs e) { int chars = 256; StringBuilder buff = new StringBuilder(chars); int handle = GetForegroundWindow();

if (GetWindowText(handle, buff, chars) > 0) {

lblCaption.Text = buff.ToString(); lblHandle.Text = handle.ToString(); if (new IntPtr(handle) == this.Handle) { lblCurrent.Text = "True"; } else { lblCurrent.Text = "False"; } } } }

Handle ca form c qun l mt cch trong sut i vi ngi dng. Thay i thuc tnh no ca form c th khin cho CRL to mt handle mi. Do , bn nn lun truy xut handle ngay trc khi s dng n (khng nn gi n trong mt bin s dng trong mt thi gian di).

3.

nh nh

Gi mt hm khng-c-qun-l c s dng cu trc


Bn cn gi mt hm khng-c-qun-l c thng s l mt cu trc. ngha cho cu cu trc. trc S trong dng m phng C#. thc S tnh dng
SizeOf

c ca

tnh lp

System.Runtime.InteropServices.StructLayoutAttribute cu hnh vic cp b

592 Chng 15: Kh nng lin tc m lnh khng-c-qun-l

System.Runtime.Interop.Marshal nu mun xc nh kch thc ca cu trc

theo byte. Trong m C# thun ty, bn khng c kh nng trc tip kim sot vic cp b nh. Thay vo , CRL s quyt nh khi no cn a d liu vo b nh ti u ha hot ng. iu ny gy rc ri khi lm vic vi cc hm C, v cu trc phi c tr lin tc trong b nh. May mn l .NET gii quyt vn ny bng c tnh StructLayoutAttribute, cho php bn ch nh cc thnh vin ca mt lp hay mt cu trc cho trc s c sp xp trong b nh nh th no. V d, xt hm GetVersionEx trong th vin kernel32.dll. Hm ny nhn mt con tr ch ti cu trc OSVERSIONINFO v s dng n tr v thng tin phin bn ca h iu hnh. s dng cu trc OSVERSIONINFO trong m C#, bn phi nh ngha n vi c tnh StructLayoutAttribute nh sau:
[StructLayout(LayoutKind.Sequential)] public class OSVersionInfo {

public int dwOSVersionInfoSize; public int dwMajorVersion; public int dwMinorVersion; public int dwBuildNumber; public int dwPlatformId; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)] public String szCSDVersion; }

Ch rng, cu trc ny cng s dng c tnh System.Runtime.InteropServices. MarshalAsAttribute (cn cho cc chui c kch thc khng i). y, MarshalAsAttribute ch nh chui s c truyn bng tr v s cha mt b m gm 128 k t c ch nh trong cu trc OSVersionInfo. Trong v d ny, LayoutKind.Sequential c s dng, ngha l cc kiu d liu trong cu trc c b tr theo th t m chng c lit k trong cu trc hoc lp. Ngoi LayoutKind.Sequential, bn c th s dng LayoutKind.Explicit. Trong trng hp ny, bn phi s dng FieldOffsetAttribute nh ngha di ca cc trng. Cch ny hu ch khi bn mun lu tr cc trng mt cch linh ng hn, hoc bn mun b qua (khng s dng) trng no . V d sau nh ngha lp OSVersionInfo vi LayoutKind.Explicit.
[StructLayout(LayoutKind.Explicit)] public class OSVersionInfo { [FieldOffset(0)] public int dwOSVersionInfoSize;

593 Chng 15: Kh nng lin tc m lnh khng-c-qun-l [FieldOffset(4)] public int dwMajorVersion; [FieldOffset(8)] public int dwMinorVersion; [FieldOffset(12)] public int dwBuildNumber; [FieldOffset(16)] public int dwPlatformId; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)] [FieldOffset(20)] public String szCSDVersion; }

Sau khi nh ngha cu trc c s dng bi hm GetVersionEx, bn c th khai bo hm ny v s dng n. ng dng di y s trnh by ton b m lnh cn thit. Ch , InAttribute v OutAttribute c p dng cho OSVersionInfo bit rng marshalling s c thc hin trn cu trc ny khi n c truyn cho hm v khi n c tr v t hm. Ngoi ra, phng thc Marshal.SizeOf c s dng tnh kch thc ca cu trc trong b nh.
using System; using System.Runtime.InteropServices; public class CallWithStructure { // (B qua lp OSVersionInfo.) [DllImport("kernel32.dll")] public static extern bool GetVersionEx([In, Out] OSVersionInfo osvi); private static void Main() { OSVersionInfo osvi = new OSVersionInfo(); osvi.dwOSVersionInfoSize = Marshal.SizeOf(osvi); GetVersionEx(osvi); Console.WriteLine("Class size: " + osvi.dwOSVersionInfoSize); Console.WriteLine("Major Version: " + osvi.dwMajorVersion); Console.WriteLine("Minor Version: " + osvi.dwMinorVersion); Console.WriteLine("Build Number: " + osvi.dwBuildNumber); Console.WriteLine("Platform Id: " + osvi.dwPlatformId); Console.WriteLine("CSD Version: " + osvi.szCSDVersion); Console.WriteLine("Platform: " + Environment.OSVersion.Platform); Console.WriteLine( "Version: " + Environment.OSVersion.Version); Console.ReadLine(); }

594 Chng 15: Kh nng lin tc m lnh khng-c-qun-l

Nu chy ng dng ny trn h thng Windows XP, bn s thy thng tin nh sau:
Class size: 148 Major Version: 5 Minor Version: 1 Build Number: 2600 Platform Id: 2 CSD Version: Service Pack 1 Platform: Win32NT Version: 5.1.2600.0

4.

Gi mt hm khng-c-qun-l c s dng callback


Bn cn gi mt hm khng-c-qun-l v cho php n gi mt hm khc. To mt y nhim cho callback. S dng y nhim ny khi nh ngha v s dng hm khng-c-qun-l.

Nhiu hm ca Win32 API s dng callback. V d, nu mun ly tn ca tt c cc ca s ang m, bn c th s dng hm EnumWindows trong th vin user32.dll . Khi gi EnumWindows, bn cn truyn cho n mt con tr ch n mt hm khc trong m lnh ca bn. H iu hnh Windows sau s gi hm ny mi khi tm thy mt ca s ang m, v truyn handle ca ca s cho n. .NET Framework cho php bn qun l vic s dng callback m khng cn cc con tr v cc khi m khng an ton. Thay vo , bn c th nh ngha v s dng mt y nhim ch n hm callback. Khi bn truyn y nhim cho hm EnumWindows, CLR s t ng marshal y nhim thnh con tr hm khng-c-qun-l nh mong mun. V d di y s dng EnumWindows cng vi mt callback hin th tn ca tt c cc ca s ang m.
using System; using System.Text; using System.Runtime.InteropServices; public class GetWindows { // Ch k cho hm callback. public delegate bool CallBack(int hwnd, int lParam); // Hm khng-c-qun-l s kch hot callback

595 Chng 15: Kh nng lin tc m lnh khng-c-qun-l // khi duyt qua cc ca s ang m. [DllImport("user32.dll")] public static extern int EnumWindows(CallBack callback, int param); [DllImport("user32.dll")] public static extern int GetWindowText(int hWnd, StringBuilder lpString, int nMaxCount); private static void Main() { CallBack callBack = new CallBack(DisplayWindowInfo); // Yu cu h iu hnh duyt qua cc ca s ang m, // kch hot callback vi handle ca mi ca s. EnumWindows(callBack, 0); Console.ReadLine(); } // Hm s nhn callback. Thng s th hai // khng c s dng nhng phi c khai bo // tng thch vi ch k ca callback. public static bool DisplayWindowInfo(int hWnd, int lParam) { int chars = 100; StringBuilder buf = new StringBuilder(chars); if (GetWindowText(hWnd, buf, chars) != 0) { Console.WriteLine(buf); } return true; } }

5.

Ly thng tin li khng-c-qun-l


Bn cn truy xut thng tin li (m li hoc thng ip m t li) gii thch ti sao mt li gi Win32 API tht bi. Trong phn khai bo ca hm khng-c-qun-l, thit lp trng SetLastError ca c tnh DllImportAttribute l true. Nu c li khi thc thi, gi

596 Chng 15: Kh nng lin tc m lnh khng-c-qun-l

phng thc tnh Marshal.GetLastWin32Error truy xut m li. ly thng ip m t mt m li c th, s dng hm khng-c-qun-l FormatMessage. Bn khng th trc tip ly thng tin li bng hm khng-c-qun-l GetLastError. Vn l, m li do GetLastError tr v c th khng phn nh li do hm khng-c-qun-l gy ra. Thay vo , n c th c thit lp bi cc lp .NET Framework khc hoc CLR. Bn c th ly thng tin li mt cch an ton bng phng thc tnh Marshal.GetLastWin32Error. Phng thc ny cn c gi ngay sau li gi hm khng-c-qun-l, v n s tr v thng tin li ch mt ln (cc ln gi GetLastWin32Error sau s tr v m li 127). Ngoi ra, bn phi thit lp trng SetLastError ca c tnh DllImportAttribute l true, cho bit nhng li do hm ny sinh ra s c ghi nhn.
[DllImport("user32.dll", SetLastError=true)]

Sau , bn c th s dng hm FormatMessage trong th vin kernel32.dll ly thng ip m t li t m li Win32. V d, ng dng di y mun hin th mt MessageBox, nhng li s dng handle khng ng. M li c ly bng Marshal.GetLastWin32Error, v thng ip m t li c ly bng FormatMessage.
using System; using System.Runtime.InteropServices; public class TestError { [DllImport("kernel32.dll")] private unsafe static extern int FormatMessage(int dwFlags, int lpSource, int dwMessageId, int dwLanguageId, ref String lpBuffer, int nSize, int Arguments);

[DllImport("user32.dll", SetLastError=true)] public static extern int MessageBox(int hWnd, string pText, string pCaption, int uType); private static void Main() { int badWindowHandle = 453; MessageBox(badWindowHandle, "Message", "Caption", 0); int errorCode = Marshal.GetLastWin32Error(); Console.WriteLine(errorCode); Console.WriteLine(GetErrorMessage(errorCode));

597 Chng 15: Kh nng lin tc m lnh khng-c-qun-l

Console.ReadLine(); }

// GetErrorMessage tr v thng ip li // tng ng vi m li errorCode. public static string GetErrorMessage(int errorCode) {

int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100; int FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200; int FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000;

int messageSize = 255; string lpMsgBuf = ""; int dwFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS;

int retVal = FormatMessage(dwFlags, 0, errorCode, 0, ref lpMsgBuf, messageSize, 0);

if (0 == retVal) { return null; } else { return lpMsgBuf; } } }

Sau y l kt xut ca ng dng:


1400 Invalid window handle.

6.

S dng thnh phn COM trong .NET-client


Bn cn s dng thnh phn COM trong mt .NET-client. S dng mt Primary Interop Assembly, nu c. Nu khng, to mt Runtime Callable Wrapper bng Type Library Importer (Tlbimp.exe), hoc tnh nng Add Reference trong Visual Studio .NET.

598 Chng 15: Kh nng lin tc m lnh khng-c-qun-l

.NET Framework h tr kh nng lin tc vi COM. cho php .NET-client tng tc vi mt thnh phn COM, .NET s dng mt Runtime Callable Wrapper (RCW)mt lp proxy c bit ng vai tr trung gian gia m .NET v thnh phn COM. RCW s x l tt c chi tit, bao gm vic marshal cc kiu d liu, s dng cc giao din COM truyn thng, v x l cc s kin COM. Bn c ba ty chn khi s dng mt RCW: Ly RCW t tc gi ca thnh phn COM. Trong trng hp ny, RCW c gi l mt Primary Interop Assembly (PIA). To RCW bng tin ch dng lnh Tlbimp.exe hoc bng Visual Studio .NET. T to RCW thng qua cc kiu trong khng gian tn System.Runtime. InteropServices (cch ny cc k di dng v phc tp).

Nu mun s dng Visual Studio .NET to RCW, bn ch cn chn Project | Add Reference v sau chn thnh phn thch hp trong th COM. Interop Assembly s c to ra v c thm vo cc tham chiu ca d n. Sau , bn c th s dng Object Browser kho st cc khng gian tn v cc lp c trong thnh phn ny.
[

Hnh 15.2 S dng Object Browser xem cc khng gian tn v cc lp c trong thnh phn COM

Nu khng s dng Visual Studio .NET, bn c th to mt Wrapper Assembly bng cng c Tlbimp.exe, ch cn truyn cho n tn file cha thnh phn COM. V d, dng lnh sau y s to mt RCW vi tn file v khng gian tn mc nh, gi s file MyCOMComponent.dll ang nm trong th mc hin hnh.
tlbimp MyCOMComponent.dll

Gi s MyCOMComponent cha mt th vin kiu c tn l MyClasses, file RCW s c tn l MyClasses.dll v s trng cc lp ca n thng qua mt khng gian tn c tn l MyClasses. Bn c th cu hnh cc ty chn ny bng cc i s dng lnh (c m t chi tit trong ti

599 Chng 15: Kh nng lin tc m lnh khng-c-qun-l

liu MSDN). V d, bn c th s dng /out:[Filename] ch nh tn file assemby, s dng /namespace:[Namespace] ch nh khng gian tn. Bn cng c th s dng /keyfile[keyfilename] to tn mnh cho assembly, v t n vo Global Assembly Cache (GAC). S dng /primary to mt PIA. Nu c th, bn nn s dng PIA thay v to RCW. PIA hot ng ng tin cy hn v c to ra bi nh pht hnh thnh phn, v cng c th cha mt s tnh nng nng cao. Nu mt PIA c ng k vi h thng cho mt thnh phn COM th Visual Studio .NET s t ng s dng PIA khi bn thm mt tham chiu n thnh phn COM. V d, adodb.dll (c trong .NET Framework) cho php bn s dng cc i tng ADO truyn thng. Nu bn thm mt tham chiu n thnh phn Microsoft ActiveX Data Objects, Interop Assembly ny s t ng c s dng, m khng sinh ra mt RCW mi. Tng t, Microsoft Office XP cung cp mt PIA nng cao s h tr .NET cho Office Automation (bn c th ti PIA ny ti a ch [http://msdn.microsoft.com/downloads/list/office.asp]). V d sau minh ha cch s dng COM Interop truy xut cc i tng ADO truyn thng trong ng dng .NET Framework.
using System;

public class ADOClassic {

private static void Main() {

ADODB.Connection con = new ADODB.Connection(); string connectionString = "Provider=SQLOLEDB.1;" + "Data Source=localhost;" + "Initial Catalog=Northwind;Integrated Security=SSPI"; con.Open(connectionString, null, null, 0);

object recordsAffected; ADODB.Recordset rs = con.Execute("SELECT * From Customers", out recordsAffected, 0); while (rs.EOF != true) { Console.WriteLine(rs.Fields["CustomerID"].Value); rs.MoveNext(); }

Console.ReadLine(); } }

600 Chng 15: Kh nng lin tc m lnh khng-c-qun-l

7.

Gii phng nhanh thnh phn COM


Bn cn bo m mt thnh phn COM c xa khi b nh ngay tc th, khng phi ch b thu gom rc (Garbage Collector) lm vic. Hoc bn mun bo m cc i tng COM c gii phng theo mt th t xc nh. S dng phng thc tnh Marshal.ReleaseComObject v truyn RCW thch hp gii phng tham chiu n i tng COM nm di.

COM s m cc tham chiu n i tng xc nh khi no i tng s c gii phng. Khi bn s dng mt RCW, tham chiu s c gi c khi bin i tng vt khi tm vc. Tham chiu ny ch c gii phng khi b thu gom rc gii phng i tng RCW. Do , bn khng th kim sot vic cc i tng COM s c gii phng khi no hoc theo th t no. vt qua hn ch ny, bn c th s dng phng thc Marshal.ReleaseComObject. Trong v d mc 15.6, bn hy thm hai dng sau vo cui m lnh gii phng i tng Recordset v Connection nm di.
Marshal.ReleaseComObject(rs); Marshal.ReleaseComObject(con);

V mt k thut, phng thc ReleaseComObject khng thc s gii phng i tng COM, n ch gim s lng tham chiu n i tng. Nu s tham chiu l 0, i tng COM s c gii phng. Tuy nhin, nu cng th hin ca mt i tng COM c s dng ti nhiu mu m lnh, n phi c gii phng cc ni trc khi c gii phng khi b nh.

8.

S dng trng Type.Missing.

S dng thng s ty chn


Bn cn gi mt phng thc trong thnh phn COM m khng phi truyn tt c cc thng s cn thit.

Hu ht cc phng thc trong .NET Framework u c np chng nhiu ln bn c th gi phin bn yu cu ch nhng thng s do bn cung cp. Mt khc, COM khng h tr vic np chng phng thc. Thay vo , cc thnh phn COM thng s dng cc phng thc vi mt danh sch di cc thng s ty chn. Khng may l, C# khng h tr thng s ty chn, ngha l ngi pht trin phi cung cp thm cc gi tr khng cn thit khi truy xut mt thnh phn COM. V v cc thng s COM thng c truyn bng tham chiu nn m lnh ca bn khng th truyn mt tham chiu null, m phi khai bo mt bin i tng v ri truyn bin . Bn c th gim nh vn n mt chng mc no bng cch cung cp trng Type.Missing bt c khi no mun b qua mt thng s ty chn. Nu cn truyn mt thng

601 Chng 15: Kh nng lin tc m lnh khng-c-qun-l

s bng tham chiu, bn ch cn khai bo mt bin i tng, thit lp n l Type.Missing, v s dng n trong mi trng hp:
private static object n = Type.Missing;

V d di y s dng i tng Word to v hin th mt ti liu. Trong , c nhiu phng thc yu cu cc thng s ty chn (c truyn bng tham chiu). Vic s dng trng Type.Missing n gin ha m lnh rt nhiu.
using System; public class OptionalParameters { private static object n = Type.Missing; private static void Main() { // Chy Word pha nn. Word.ApplicationClass app = new Word.ApplicationClass(); app.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone; // To mt ti liu mi (khng kh kin i vi ngi dng). Word.Document doc = app.Documents.Add(ref n, ref n, ref n, ref n); Console.WriteLine(); Console.WriteLine("Creating new document."); Console.WriteLine(); // Thm mt tiu v hai hng text. Word.Range range = doc.Paragraphs.Add(ref n).Range; range.InsertBefore("Test Document"); string style = "Heading 1"; object objStyle = style; range.set_Style(ref objStyle); range = doc.Paragraphs.Add(ref n).Range; range.InsertBefore("Line one.\nLine two."); range.Font.Bold = 1; // Hin th Print Preview, lm cho Word tr nn kh kin. doc.PrintPreview(); app.Visible = true;

602 Chng 15: Kh nng lin tc m lnh khng-c-qun-l

Console.ReadLine(); } }

9.

S dng iu kim ActiveX trong .NET-client


Bn cn t mt iu kim ActiveX trn mt ca s ng dng .NET Framework. S dng mt RCW (cng ging nh vi mt thnh phn COM bnh thng). lm vic vi iu kim ActiveX khi thit k, thm n vo hp cng c ca Visual Studio .NET.

.NET Framework h tr nh nhau i vi tt c cc thnh phn COM, bao gm iu kim ActiveX. iu khc nhau c bn l lp RCW (cho iu kim ActiveX) dn xut t kiu .NET c bit System.Windows.Forms.AxHost. V mt k thut, bn thm AxHost vo form, v n s giao tip vi iu kim ActiveX pha hu trng. V dn xut t System.Windows.Forms.Control, nn AxHost cng c cc thuc tnh, phng thc, v s kin chun nh Location, Size, Anchor,.. Nu RCW c sinh t ng, cc lp AxHost lun bt u bng Ax. Bn c th to mt RCW cho mt iu kim ActiveX cng ging nh cho bt c thnh phn COM no khc bng cng c Tlbimp.exe hoc tnh nng Add Reference trong Visual Studio .NET, sau lp trnh to iu kim. Tuy nhin, mt cch tip cn d hn trong Visual Studio .NET l thm iu kim ActiveX vo hp cng c (xem mc 11.4 bit thm chi tit). Chng c g xy ra khi bn thm mt iu kim ActiveX vo hp cng c. Tuy nhin, bn c th s dng biu tng trong hp cng c thm mt th hin ca iu kim vo form. Ln u bn lm vic ny, Visual Studio .NET s to mt Interop Assembly v thm n vo d n ca bn. V d, nu bn thm iu kim Microsoft Masked Edit (khng c iu kim .NET tng ng), Visual Studio .NET s to mt RCW Assembly c tn l AxInterop.MSMask.dll. Di y l on m trong vng designer dng to mt th hin ca iu kim ny v thm n vo form:
this.axMaskEdBox1 = new AxMSMask.AxMaskEdBox(); ((System.ComponentModel.ISupportInitialize)(this.axMaskEdBox1)). BeginInit(); // // axMaskEdBox1 // this.axMaskEdBox1.Location = new System.Drawing.Point(16, 12); this.axMaskEdBox1.Name = "axMaskEdBox1"; this.axMaskEdBox1.OcxState = ((System.Windows.Forms.AxHost.State)

603 Chng 15: Kh nng lin tc m lnh khng-c-qun-l (resources.GetObject("axMaskEdBox1.OcxState"))); this.axMaskEdBox1.Size = new System.Drawing.Size(112, 20); this.axMaskEdBox1.TabIndex = 0; this.Controls.Add(this.axMaskEdBox1);

Ch rng, cc thuc tnh ty bin ca iu kim ActiveX khng c p dng trc tip thng qua cc lnh thit lp thuc tnh. Thay vo , chng s c thit lp theo nhm khi thuc tnh OcxState c thit lp. Tuy nhin, m lnh ca bn c th s dng cc thuc tnh ny mt cch trc tip.

10.

To thnh phn .NET dng cho COM-client


Bn cn to mt thnh phn .NET sao cho mt COM-client c th gi n. To mt assembly theo cc ch dn trong mc ny. To mt th vin kiu cho assembly ny bng tin ch dng lnh Type Library Exporter (Tlbexp.exe).

.NET Framework h tr vic COM-client s dng thnh phn .NET. Khi COM-client to mt i tng .NET, CLR s to mt i tng c-qun-l v mt COM Callable Wrapper (CCW) bc ly i tng ny. COM-client s tng tc vi i tng thng qua CCW. CLR ch to mt CCW cho mt i tng c-qun-l, bt chp c bao nhiu COM-client ang s dng n. Cc kiu cn c truy xut bi COM-client phi tha mn cc yu cu sau: Cc kiu c-qun-l (lp, giao din, cu trc, hoc kiu lit k) phi c khai bo l public. Nu COM-client cn to i tng, n phi c mt phng thc khi dng mc nh public. COM khng h tr cc phng thc khi dng c cha thng s. Cc thnh vin ca kiu cn c truy xut phi l cc thnh vin public. COM-client khng truy xut c cc thnh vin private, protected, internal, v static. Khng nn to cc quan h tha k gia cc lp, v cc quan h ny s khng kh kin i vi COM-client (mc d .NET gi lp quan h ny bng cch khai bo mt giao din lp c s dng chung). Cc lp m bn trng ra nn hin thc mt giao din. Vi mc ch kim sot phin bn, bn c th s dng c tnh System.Runtime.InteropServices.GuidAttribute ch nh GUID s c gn cho giao din. Nn to tn mnh cho assembly n c th c ci t vo GAC v c dng chung cho nhiu client.

Ngoi ra, bn nn tun theo cc kinh nghim sau:

to mt i tng .NET, COM-client cn mt th vin kiu (file .tlb). File th vin kiu c th c to t mt assembly bng tin ch dng lnh Tlbexp.exe. V d:
tlbexp ManagedLibrary.dll

604 Chng 15: Kh nng lin tc m lnh khng-c-qun-l

Mt khi to ra th vin kiu, bn c th tham chiu n t mt cng c pht trin khngc-qun-l. Vi Visual Basic 6, bn tham chiu file .tlb t hp thoi Project | Reference. Trong Visual C++ 6, bn c th s dng lnh #import nhp cc nh ngha kiu t th vin kiu.

605

Chng 16:CC GIAO DIN V MU THNG DNG

16

606

607 Chng 16: Cc giao din v mu thng dng

hng ny trnh by cch hin thc cc mu (pattern) s c s dng thng xuyn trong qu trnh pht trin cc ng dng Microsoft .NET Framework. Mt s mu c chun ha bng cc giao din c nh ngha trong th vin lp .NET Framework. Mt s khc th t cng nhc hn, nhng vn yu cu bn thc hin cc cch tip cn c th thit k v hin thc cc kiu ca bn. Cc mc trong chng ny m t cch:

To cc kiu kh-tun-t-ha bn c th d dng lu tr vo a, gi qua mng, hoc


truyn bng tr qua cc bin min ng dng (mc 16.1).

Cung cp mt c ch dng to bn sao y v chnh xc ca i tng (mc


16.2).

Hin thc cc kiu sao cho d dng so snh v sp xp (mc 16.3). H tr vic lit k cc phn t trong cc tp hp ty bin (mc 16.4). Bo m rng mt kiu c s dng cc ti nguyn khng-c-qun-l s gii phng
cc ti nguyn khi khng cn cn n chng na (mc 16.5).

Hin th dng chui ca cc i tng bin i da trn format specifier (mc 16.6). Hin thc cc kiu i s s kin v ngoi l ty bin (bn s thng xuyn s dng
chng trong qu trnh pht trin ng dng) (mc 16.7 v 16.8).

Hin thc cc mu thit k thng dng Singleton v Observer bng cc tnh nng c sn
ca C# v th vin lp .NET Framework (mc 16.9 v 16.10).

1.

Hin thc kiu kh-tun-t-ha (serializable type)


Bn cn hin thc mt kiu ty bin kh-tun-t-ha, cho php bn: Lu tr cc th hin ca kiu vo kho lu tr (file hay c s d liu). Chuyn cc th hin ca kiu qua mng. Truyn cc th hin ca kiu bng tr qua cc bin min ng dng. i vi vic tun t ha cc kiu n gin, hy p dng c tnh System.SerializableAttribute vo khai bo kiu. i vi cc kiu phc tp hn, hoc kim sot ni dung v cu trc ca d liu c-tun-t-ha, hy hin thc giao din System.Runtime.Serialization.ISerializable.

Mc 2.12 trnh by cch tun t ha v gii tun t ha mt i tng bng cc lp formatter (c cp cng vi th vin lp .NET Framework). Tuy nhin, theo mc nh th cc kiu khng l kh-tun-t-ha. hin thc mt kiu ty bin l kh-tun-t-ha, bn phi p dng c tnh SerializableAttribute vo khai bo kiu. Khi tt c cc trng d liu trong kiu u l kh-tun-t-ha, vic p dng SerializableAttribute l tt c nhng g cn lm khin cho kiu ty bin ca bn l kh-tun-t-ha. Nu bn hin thc mt lp ty bin dn xut t mt lp c s, lp c s cng phi l kh-tun-t-ha. Mi lp formatter cha logic cn thit tun t ha cc kiu c gn vi c tnh SerializableAttribute v s tun t ha tt c cc trng public, protected, v private.

608 Chng 16: Cc giao din v mu thng dng

on m di y trnh by cc khai bo kiu v khai bo trng ca mt lp kh-tun-tha c tn l Employee.


using System;

[Serializable] public class Employee {

private string name; private int age; private string address; }

Cc lp dn xut t mt kiu kh-tun-t-ha khng tha k c tnh SerializableAttribute. khin cho cc kiu dn xut l kh-tun-t-ha, bn phi khai bo chng l kh-tun-t-ha bng cch p dng c tnh SerializableAttribute.

Bn c th ngn vic tun t ha mt trng no bng cch p dng c tnh System.NonSerializedAttribute cho trng ny. Bn nn ngn vic tun t ha i vi cc trng sau: Cha cc kiu d liu khng-kh-tun-t-ha. Cha cc gi tr c th khng hp l khi i tng c gii tun t ha, v d: kt ni c s d liu, a ch b nh, ID ca tiu trnh, v handle ca ti nguyn khng-cqun-l. Cha cc thng tin nhy cm hay ring t, v d: mt khu, kha mt ha, v cc chi tit ring v ngi hay t chc. Cha cc d liu d dng ti to hay thu ly c t cc ngun khcc bit khi d liu ln.

Nu ngn vic tun t ha mt s trng, bn phi hin thc kiu sao cho b li vic nhng d liu no s khng hin din khi mt i tng c gii tun t ha. ng tic, bn khng th to hay thu ly cc trng d liu b mt trong mt phng thc khi dng v formatter khng gi phng thc khi dng trong qu trnh gii tun t ha i tng. Gii php thng thng nht l hin thc mu Lazy Initialization, trong kiu ca bn s to hay thu ly d liu ngay ln u tin cn n. on m di y trnh by mt phin bn c chnh sa ca lp Employee vi c tnh NonSerializedAttribute c p dng cho trng address, ngha l formatter s khng tun t ha gi tr ca trng ny. Lp Employee hin thc cc thuc tnh cng khai dng truy xut cc thnh vin d liu ring, l ni thun tin hin thc Lazy Initialization cho trng address.

609 Chng 16: Cc giao din v mu thng dng using System;

[Serializable] public class Employee {

private string name; private int age;

[NonSerialized] private string address;

// Phng thc khi dng n gin. public Employee(string name, int age, string address) {

this.name = name; this.age = age; this.address = address; }

// Thuc tnh cng khai dng truy xut tn ca nhn vin. public string Name { get { return name; } set { name = value; } }

// Thuc tnh cng khai dng truy xut tui ca nhn vin. public int Age { get { return age; } set { age = value; } }

// Thuc tnh cng khai dng truy xut a ch ca nhn vin. // S dng "Lazy Initialization" thit lp a ch v // i tng c-gii-tun-t-ha s khng c gi tr a ch. public string Address { get { if (address == null) {

610 Chng 16: Cc giao din v mu thng dng

// Np a ch t kho lu tr. } return address; }

set { address = value; } } }

i vi phn ln cc kiu ty bin, vic s dng c tnh SerializableAttribute v NonSerializedAttribute s p ng nhu cu tun t ha ca bn. Nu cn kim sot qu trnh tun t ha, bn cn hin thc giao din ISerializable. Cc lp formatter s dng logic khc nhau khi tun t ha v gii tun t ha th hin ca cc kiu c hin thc ISerializable. hin thc ng ISerializable, bn phi: Khai bo rng kiu ca bn c hin thc giao din ISerializable. p dng c tnh SerializableAttribute vo khai bo kiu nh va c m t; khng s dng NonSerializedAttribute v n s khng c tc dng. Hin thc phng thc ISerializable.GetObjectData (c s dng trong qu trnh tun t ha), phng thc ny nhn cc kiu i s sau:
System.Runtime.Serialization.SerializationInfo System.Runtime.Serialization.StreamingContext

Hin thc mt phng thc khi dng khng cng khai (c s dng trong qu trnh gii tun t ha), phng thc ny nhn cng i s nh phng thc GetObjectData. Nh rng, nu bn c nh dn xut mt s lp t lp kh-tun-t-ha th phng thc khi dng ny phi l protected. Nu bn to mt lp kh-tun-t-ha t mt lp c s cng c hin thc ISerializable, th phng thc GetObjectData v phng thc khi dng (dng gii tun t ha) ca bn phi gi cc phng thc tng ng trong lp cha.

Trong qu trnh tun t ha, formatter s gi phng thc GetObjectData v truyn cho n cc tham chiu SerializationInfo v StreamingContext. Bn phi d liu cn tun t ha vo i tng SerializationInfo. Lp SerializationInfo cung cp phng thc AddValue dng thm d liu. Vi mi ln gi AddValue, bn phi ch nh tn d liu (tn ny s c s dng trong qu trnh gii tun t ha thu ly d liu). Phng thc AddValue c n 16 phin bn np chng, cho php bn thm nhiu kiu d liu khc nhau vo i tng SerializationInfo.

611 Chng 16: Cc giao din v mu thng dng

i tng StreamingContext cung cp cc thng tin v ch nh v ch ca d liu c-tun-t-ha, cho php bn chn tun t ha d liu no. V d, bn c th cn tun t ha d liu ring nu n c dnh cho mt min ng dng khc trong cng tin trnh, nhng khng cn nu d liu s c ghi ra file.

Trong qu trnh gii tun t ha, formatter s gi phng thc khi dng vic gii tun t ha, li truyn cho n cc tham chiu SerializationInfo v StreamingContext. Kiu ca bn phi trch d liu -c-tun-t-ha t i tng SerializationInfo bng mt trong cc phng thc SerializationInfo.Get*, v d: GetString, GetInt32, hay GetBoolean. i tng StreamingContext cung cp cc thng tin v ngun gc ca d liu -ctun-t-ha, phn nh logic m bn hin thc cho vic tun t ha. Trong qu trnh tun t ha chun, formatter khng s dng kh nng ca i tng StreamingContext cho bit cc chi tit v ngun gc, ch, v ch nh ca d liu c-tun-t-ha. Tuy nhin, nu mun thc hin qu trnh tun t ha ty bin, bn c th cu hnh i tng StreamingContext ca formatter trc khi bt u qu trnh tun t ha v gii tun t ha. Tham kho ti liu .NET Framework SDK c thm thng tin v lp StreamingContext.

V d di y trnh by phin bn c chnh sa ca lp Employee, c hin thc giao din ISerializable. Trong phin bn ny, lp Employee khng tun t ha trng address nu i tng StreamingContext ch nh rng ch ca d liu c-tun-t-ha l file. Phng thc Main s gii thch vic tun t ha v gii tun t ha ca mt i tng Employee.
using System; using System.Runtime.Serialization; [Serializable] public class Employee : ISerializable { private string name; private int age; private string address; // Phng thc khi dng n gin. public Employee(string name, int age, string address) {

this.name = name; this.age = age; this.address = address; }

612 Chng 16: Cc giao din v mu thng dng

// Phng thc khi dng dng kch hot formatter thc hin vic // gii tun t ha mt i tng Employee. Bn nn khai bo // phng thc khi dng ny l private, hay t nht cng l // protected bo m n khng b gi qu mc cn thit. private Employee(SerializationInfo info, StreamingContext context) { // Trch xut tn v tui ca Employee (s lun hin din // trong d liu -c-tun-t-ha bt chp gi tr // ca StreamingContext). name = info.GetString("Name"); age = info.GetInt32("Age"); // Thc hin trch xut a ch ca Employee // (tht bi nu khng c). try { address = info.GetString("Address"); } catch (SerializationException) { address = null; } } // Cc thuc tnh Name, Age, v Address ( trnh by trn).

// c khai bo bi giao din ISerializable, phng thc // GetObjectData cung cp c ch formatter thu ly // d liu s-c-tun-t-ha. public void GetObjectData(SerializationInfo inf, StreamingContext con){

// Lun tun t ha tn v tui ca Employee. inf.AddValue("Name", name); inf.AddValue("Age", age);

// Khng tun t ha a ch ca Employee nu StreamingContext // cho bit rng d liu c-tun-t-ha s c ghi ra file.

613 Chng 16: Cc giao din v mu thng dng if ((con.State & StreamingContextStates.File) == 0) {

inf.AddValue("Address", address); } }

// Chp Object.ToString tr v chui m t Employee. public override string ToString() {

StringBuilder str = new StringBuilder();

str.AppendFormat("Name: {0}\n\r", Name); str.AppendFormat("Age: {0}\n\r", Age); str.AppendFormat("Address: {0}\n\r", Address);

return str.ToString(); }

public static void Main(string[] args) {

// To mt i tng Employee m t Phuong. Employee phuong = new Employee("Phuong", 23, "HCM");

// Hin th Phuong. Console.WriteLine(phuong);

// Tun t ha Phuong vi ch l mt min ng dng khc. // a ch ca Phuong s c tun t ha. Stream str = File.Create("phuong.bin"); BinaryFormatter bf = new BinaryFormatter(); bf.Context = new StreamingContext(StreamingContextStates.CrossAppDomain); bf.Serialize(str, phuong); str.Close();

// Gii tun t ha v hin th Phuong. str = File.OpenRead("phuong.bin");

614 Chng 16: Cc giao din v mu thng dng

bf = new BinaryFormatter(); phuong = (Employee)bf.Deserialize(str); str.Close(); Console.WriteLine(phuong);

// Tun t ha Phuong vi ch l file. Trong trng hp ny, // a ch ca Phuong s khng c tun t ha. str = File.Create("phuong.bin"); bf = new BinaryFormatter(); bf.Context = new StreamingContext(StreamingContextStates.File); bf.Serialize(str, phuong); str.Close();

// Gii tun t ha v hin th Phuong. str = File.OpenRead("phuong.bin"); bf = new BinaryFormatter(); phuong = (Employee)bf.Deserialize(str); str.Close(); Console.WriteLine(phuong);

Console.ReadLine(); }

2.

Hin thc kiu kh-sao-chp (cloneable type)


Bn cn to mt kiu ty bin cung cp mt c ch n gin lp trnh vin to bn sao cho cc th hin ca kiu. Hin thc giao din System.ICloneable.

Khi gn mt kiu gi tr sang mt kiu gi tr khc l bn to mt bn sao ca gi tr . Khng c mi lin h no gia hai gi trmt thay i trn gi tr ny s khng nh hng n gi tr kia. Tuy nhin, khi gn mt kiu tham chiu sang mt kiu tham chiu khc (ngoi tr chuic b thc thi x l c bit), bn khng to mt bn sao mi ca kiu tham chiu. Thay vo , c hai kiu tham chiu u ch n cng mt i tng, v nhng thay i trn gi tr ca i tng u c phn nh trong c hai tham chiu. to mt bn sao tht ca mt kiu tham chiu, bn phi nhi li i tng m n ch n.

615 Chng 16: Cc giao din v mu thng dng

Giao din ICloneable nhn dng mt kiu l kh-sao-chp v khai bo phng thc Clone l mt c ch m thng qua , bn c th thu ly bn sao ca mt i tng. Phng thc Clone khng nhn i s no v tr v mt System.Object, bt chp kiu ang hin thc l g. iu ny ngha l mt khi sao mt i tng, bn phi p bn sao v ng kiu. Cch hin thc phng thc Clone cho mt kiu ty bin ty thuc vo cc thnh vin d liu c khai bo bn trong kiu. Nu kiu ty bin ch cha cc thnh vin d liu kiu gi tr (int, byte...) v System.String, bn c th hin thc phng thc Clone bng cch to mt i tng mi v thit lp cc thnh vin d liu ca n c gi tr ging nh i tng hin ti. Lp Object (tt c cc kiu u dn xut t y) cha phng thc MemberwiseClone dng t ng ha qu trnh ny. V d di y trnh by mt lp n gin c tn l Employee, ch cha cc thnh vin chui. Do , phng thc Clone da vo phng thc tha k MemberwiseClone to bn sao.
using System;

public class Employee : ICloneable {

public string Name; public string Title;

// Phng thc khi dng n gin. public Employee(string name, string title) {

Name = name; Title = title; }

// To mt bn sao bng phng thc Object.MemberwiseClone // v lp Employee ch cha cc tham chiu chui. public object Clone() {

return MemberwiseClone(); } }

Nu kiu ty bin ca bn c cha cc thnh vin d liu kiu tham chiu, bn phi quyt nh xem phng thc Clone ca bn s thc hin mt bn sao cn (shallow copy) hay mt bn sao su (deep copy). Bn sao cn ngha l bt k thnh vin d liu kiu tham chiu no trong bn sao u s ch n i tng ging nh thnh vin d liu kiu tham chiu tng ng trong i tng gc. Bn sao su ngha l bn phi sao ton b th i tng (object graph) cc thnh vin d liu kiu tham chiu ca bn sao ch n cc bn sao (c lp v mt vt l) ca cc i tng c tham chiu bi i tng gc.

616 Chng 16: Cc giao din v mu thng dng

D dng hin thc mt bn sao cns dng phng thc MemberwiseClone va c m t. Tuy nhin, mt bn sao su thng l ci m lp trnh vin mong i khi ln u tin sao mt i tngnhng him khi l ci h ly. iu ny c bit ng i vi cc lp tp hp trong khng gian tn System.Collections, tt c u hin thc bn sao cn trong cc phng thc Clone ca chng. Mc d s c ch nu cc tp hp ny hin thc bn sao su, c hai l do chnh cc kiu (c bit l cc lp tp hp) khng hin thc bn sao su: Vic to bn sao ca mt th i tng ln s tn nhiu b nh v thi gian x l. Cc tp hp thng thng c th cha cc th i tng su v rng, bao gm bt k kiu i tng no. Vic to mt hin thc bn sao su phc v nhiu th nh th l khng kh thi v mt s i tng trong tp hp c th khng phi l kh-sao-chp, v mt s khc c th cha cc tham chiu vng, khin qu trnh sao chp tr thnh mt vng lp v tn.

i vi cc tp hp kiu mnh, trong bn cht ca cc phn t c hiu v c kim sot th mt bn sao su c th l mt tnh nng rt hu ch. V d, System.Xml.XmlNode hin thc mt bn sao su trong phng thc Clone, iu ny cho php bn to ng bn sao ca ton b h thng phn cp i tng XML ch vi mt lnh n.

Nu cn sao mt i tng khng hin thc ICloneable nhng li l kh-tun-tha, bn c th tun t ha ri gii tun t ha i tng c c cng kt qu nh khi sao chp. Tuy nhin, qu trnh tun t ha c th khng tun t ha tt c cc thnh vin d liu (nh c tho lun trong mc 16.1). Cng vy, nu to mt kiu kh-tun-t-ha ty bin, bn c th s dng qu trnh tun t ha va c m t thc hin mt bn sao su bn trong phng thc ICloneable.Clone. sao mt i tng kh-tun-t-ha, bn hy s dng lp System.Runtime.Serialization.Formatters.Binary.BinaryFormatter tun t ha i tng ny thnh mt i tng System.IO.MemoryStream, v ri gii tun t ha i tng ny t System.IO.MemoryStream.

Lp Team di y hin thc phng thc Clone thc hin mt bn sao su. Lp Team cha mt tp hp cc i tng Employe m t mt nhm ngi. Khi bn gi phng thc Clone ca mt i tng Team, phng thc ny s to bn sao ca mi i tng Employee v thm n vo i tng Team c sao. Lp Team cung cp mt phng thc khi dng private n gin ha m lnh trong phng thc Clone (s dng phng thc khi dng l cch thng thng n gin ha qu trnh sao chp).
using System; using System.Collections; public class Team : ICloneable { public ArrayList TeamMembers = new ArrayList(); public Team() {

617 Chng 16: Cc giao din v mu thng dng } // Phng thc khi dng private c phng thc Clone gi // to mt i tng Team mi v vo ArrayList ca n // bn sao ca cc i tng Employee t mt ArrayList c trc. private Team(ArrayList members) {

foreach (Employee e in members) {

TeamMembers.Add(e.Clone()); } } // Thm mt i tng Employee vo Team. public void AddMember(Employee member) {

TeamMembers.Add(member); }

public object Clone() {

// To mt bn sao su ca Team bng cch gi phng thc // khi dng Team v truyn cho n ArrayList cha // cc thnh vin ca Team. return new Team(this.TeamMembers);

// Lnh ny s to mt bn sao cn ca Team: // return MemberwiseClone(); } }

3.

Hin thc kiu kh-so-snh (comparable type)


Bn cn mt c ch dng so snh cc kiu ty bin, cho php bn d dng sp xp tp hp cha cc th hin ca kiu ny. cung cp mt c ch so snh chun cho mt kiu, hin thc giao din System.IComparable. h tr nhiu dng so snh, to ring tng kiu tr gip (helper) v cc kiu ny hin thc giao din System.Collections.IComparer.

618 Chng 16: Cc giao din v mu thng dng

Nu mun sp xp kiu ca bn ch theo mt th t no (nh ID tng dn, hay tn theo th t alphabet), bn nn hin thc giao din IComparable. Giao din ny nh ngha phng thc CompareTo nh sau:
int CompareTo(object obj);

i tng (obj) c truyn cho phng thc phi cng kiu vi i tng ang gi, nu khng CompareTo s nm ngoi l System.ArgumentException. Gi tr do CompareTo tr v c tnh nh sau: Nu i tng hin ti nh hn obj, tr v mt s m (chng hn, -1). Nu i tng hin ti c cng gi tr nh obj, tr v zero. Nu i tng hin ti ln hn obj, tr v mt s dng (chng hn, 1).

Php so snh ny thc hin iu g l ty thuc vo kiu hin thc giao din IComparable. V d, nu mun sp xp da theo tn, bn cn thc hin php so snh chui (String). Tuy nhin, nu mun sp xp da theo ngy sinh, bn cn thc hin php so snh ngy (System.DateTime). h tr nhiu dng sp xp cho mt kiu c th, bn phi hin thc ring r tng kiu tr gip v cc kiu ny hin thc giao din IComparer. Giao din ny nh ngha phng thc Compare nh sau:
int Compare(object x, object y);

Kiu tr gip phi ng gi logic cn thit so snh hai i tng v tr v mt gi tr da trn logic nh sau: Nu x nh hn y, tr v mt s m (chng hn, -1). Nu x c cng gi tr nh y, tr v zero. Nu x ln hn y, tr v mt s dng (chng hn, 1).

Lp Newspaper di y hin thc c giao din IComparable v IComparer. Phng thc Newspaper.CompareTo thc hin php so snh khng phn bit ch hoa-thng hai i tng Newspaper da trn trng name ca chng. Mt lp private lng bn trong c tn l AscendingCirculationComparer hin thc IComparer v so snh hai i tng Newspaper da trn trng circulation ca chng. i tng AscendingCirculationComparer c thu ly bng thuc tnh tnh Newspaper.CirculationSorter.
using System; using System.Collections;

public class Newspaper : IComparable {

private string name; private int circulation;

619 Chng 16: Cc giao din v mu thng dng private class AscendingCirculationComparer : IComparer {

int IComparer.Compare(object x, object y) {

// X l cc tham chiu null. // Null c coi nh nh hn bt c gi tr no khc. if (x == null && y == null) return 0; else if (x == null) return -1; else if (y == null) return 1;

// Trng hp x v y tham chiu n cng mt i tng. if (x == y) return 0;

// Bo m x v y u l cc th hin ca Newspaper. Newspaper newspaperX = x as Newspaper; if (newspaperX == null) {

throw new ArgumentException("Invalid object type", "x"); }

Newspaper newspaperY = y as Newspaper; if (newspaperY == null) {

throw new ArgumentException("Invalid object type", "y"); }

// So snh circulation. IComparer quy nh rng: // // // tr v mt s m nu x < y tr v zero nu x = y tr v mt s dng nu x > y

// D dng hin thc logic ny bng php tnh s nguyn. return newspaperX.circulation - newspaperY.circulation; } }

public Newspaper(string name, int circulation) {

620 Chng 16: Cc giao din v mu thng dng

this.name = name; this.circulation = circulation; }

// Khai bo mt thuc tnh ch-c, tr v mt th hin ca // AscendingCirculationComparer. public static IComparer CirculationSorter{ get { return new AscendingCirculationComparer(); } } public override string ToString() { return string.Format("{0}: Circulation = {1}", name, circulation); } // Phng thc CompareTo so snh hai i tng Newspaper da trn // php so snh trng name (khng phn bit ch hoa-thng). public int CompareTo(object obj) { // Mt i tng lun c coi nh ln hn null. if (obj == null) return 1;

// Trng hp i tng kia l mt tham chiu n i tng ny. if (obj == this) return 0; // p i tng kia v Newspaper. Newspaper other = obj as Newspaper; // Nu "other" l null, n khng phi l mt th hin ca // Newspaper. Trong trng hp ny, CompareTo phi nm // ngoi l System.ArgumentException. if (other == null) { throw new ArgumentException("Invalid object type", "obj"); } else {

621 Chng 16: Cc giao din v mu thng dng

// Tnh gi tr tr v bng cch thc hin php so snh // trng name (khng phn bit ch hoa-thng).

// V name l chui nn cch d nht l da vo kh nng // so snh ca lp String (thc hin php so snh chui // c phn bit bn a). return string.Compare(this.name, other.name, true); } } }

Phng thc Main minh ha php so snh v kh nng sp xp nh c hin thc giao din IComparable v IComparer. Phng thc ny s to mt tp hp System.Collections.ArrayList cha nm i tng Newspaper, sau sp xp ArrayList hai ln bng phng thc ArrayList.Sort. Ln u, thao tc Sort s dng c ch so snh mc nh ca Newspaper (thng qua phng thc IComparable.CompareTo). Ln sau, thao tc Sort s dng i tng AscendingCirculationComparer (thng qua phng thc IComparer.Compare).
public static void Main() { ArrayList newspapers = new ArrayList(); newspapers.Add(new Newspaper("Tuoi Tre", 125780)); newspapers.Add(new Newspaper("Echip", 55230)); newspapers.Add(new Newspaper("Thanh Nien", 235950)); newspapers.Add(new Newspaper("Phu Nu", 88760)); newspapers.Add(new Newspaper("Tiep Thi", 5670)); Console.WriteLine("Unsorted newspaper list:"); foreach (Newspaper n in newspapers) { Console.WriteLine(n); } Console.WriteLine(Environment.NewLine); Console.WriteLine("Newspaper list sorted by name (default order):"); newspapers.Sort(); foreach (Newspaper n in newspapers) { Console.WriteLine(n); }

622 Chng 16: Cc giao din v mu thng dng

Console.WriteLine(Environment.NewLine); Console.WriteLine("Newspaper list sorted by circulation:"); newspapers.Sort(Newspaper.CirculationSorter); foreach (Newspaper n in newspapers) { Console.WriteLine(n); } }

Chy phng thc Main s sinh ra kt qu nh sau:


Unsorted newspaper list: Tuoi Tre: Circulation = 125780 Echip: Circulation = 55230 Thanh Nien: Circulation = 235950 Phu Nu: Circulation = 88760 Tiep Thi: Circulation = 5670 Newspaper list sorted by name (default order): Echip: Circulation = 55230 Phu Nu: Circulation = 88760 Thanh Nien: Circulation = 235950 Tiep Thi: Circulation = 5670 Tuoi Tre: Circulation = 125780 Newspaper list sorted by circulation: Tiep Thi: Circulation = 5670 Echip: Circulation = 55230 Phu Nu: Circulation = 88760 Tuoi Tre: Circulation = 125780 Thanh Nien: Circulation = 235950

4.

Hin thc kiu kh-lit-k (enumerable type)


Bn cn to mt kiu tp hp sao cho ni dung ca n c th c lit k bng lnh foreach. Hin thc giao din System.IEnumerable trong kiu tp hp ca bn. Phng thc GetEnumerator ca giao din IEnumerable tr v mt enumeratormt i

623 Chng 16: Cc giao din v mu thng dng

tng c hin thc giao din System.IEnumerator. Giao din IEnumerator nh ngha cc phng thc s c lnh foreach s dng kit k tp hp. Mt b ch mc bng s (numerical indexer) cho php bn duyt qua cc phn t ca mt tp hp bng vng lp for. Tuy nhin, k thut ny khng cung cp mc tru tng ph hp vi cc cu trc d liu phi tuyn, nh cy v tp hp a chiu. Lnh foreach cung cp mt c ch duyt qua cc i tng ca mt tp hp m khng quan tm cu trc bn trong ca chng l g. h tr ng ngha foreach, i tng cha tp hp phi hin thc giao din System.IEnumerable. Giao din ny khai bo mt phng thc c tn l GetEnumerator, phng thc ny khng nhn i s v tr v mt i tng System.IEnumerator:
IEnumerator GetEnumerator();

i tng IEnumerator l i tng h tr vic lit k cc phn t ca tp hp. Giao din IEnumerator cung cp mt con chy ch-c, ch-tin (read-only, forward-only cursor) dng truy xut cc thnh vin ca tp hp nm di. Bng 16.1 m t cc thnh vin ca giao din IEnumerator.
Bng 16.1 Cc thnh vin ca giao din IEnumerator Thnh vin M t

Current

Thuc tnh ny tr v phn t d liu hin ti. Khi enumerator c to ra, Current ch n v tr ng trc phn t d liu u tin, ngha l bn phi gi MoveNext trc khi s dng Current. Nu Current c gi v enumerator ang ng trc phn t u tin hoc sau phn t cui cng trong tp hp d liu, Current s nm ngoi l System.InvalidOperationException. Phng thc ny dch chuyn enumerator sang phn t d liu k tip trong tp hp; tr v true nu cn phn t, tr v false nu khng cn phn t. Nu ngun d liu nm di thay i trong thi gian sng ca enumerator, MoveNext s nm ngoi l InvalidOperationException. Phng thc ny dch chuyn enumerator v v tr ng trc phn t u tin trong tp hp d liu. Nu ngun d liu nm di thay i trong thi gian sng ca enumerator, Reset s nm ngoi l InvalidOperationException.

MoveNext

Reset

Cc lp TeamMember, Team, v TeamMemberEnumerator minh ha vic hin thc giao din IEnumerable v IEnumerator. Lp TeamMember m t mt thnh vin ca mt i:
// Lp TeamMember m t mt thnh vin trong i. public class TeamMember { public string Name; public string Title; // Phng thc khi dng n gin.

624 Chng 16: Cc giao din v mu thng dng

public TeamMember(string name, string title) { Name = name; Title = title; } // Tr v chui m t TeamMember. public override string ToString() { return string.Format("{0} ({1})", Name, Title); } }

Lp Team (m t mt i) l mt tp hp cc i tng TeamMember. Lp ny hin thc giao din IEnumerable v khai bo mt lp c tn l TeamMemberEnumerator cung cp chc nng lit k. Thng thng, cc lp tp hp s trc tip hin thc c giao din IEnumerable v IEnumerator. Tuy nhin, s dng mt lp enumerator ring bit l cch n gin nht cho php nhiu enumeratorv nhiu tiu trnhlit k ng thi cc phn t ca Team.
Team hin thc mu Observer bng cch s dng cc thnh vin s kin v y nhim bo

cho tt c cc i tng TeamMemberEnumerator bit Team nm di c thay i hay khng (xem mc 16.10 c thm thng tin v mu Observer). Lp TeamMemberEnumerator l mt lp private lng bn trong nn bn khng th to cc th hin ca n, tr khi thng qua phng thc Team.GetEnumerator. Di y l phn m cho lp Team v TeamMemberEnumerator:
// Lp Team m t tp hp cc i tng TeamMember. Hin thc giao din // IEnumerable h tr vic lit k cc i tng TeamMember. public class Team : IEnumerable {

// TeamMemberEnumerator l mt lp private lng bn trong, cung cp // chc nng lit k cc i tng TeamMember trong tp hp // Team. V l lp lng bn trong nn TeamMemberEnumerator // c th truy xut cc thnh vin private ca lp Team. private class TeamMemberEnumerator : IEnumerator {

private Team sourceTeam;

// Gi tr lun l cho bit Team nm di c thay i hay khng. private bool teamInvalid = false;

625 Chng 16: Cc giao din v mu thng dng

// Gi tr nguyn cho bit TeamMember hin ti (ch s // trong ArrayList). Gi tr ban u l -1. private int currentMember = -1;

// Phng thc khi dng (nhn mt tham chiu n Team). internal TeamMemberEnumerator(Team team) {

this.sourceTeam = team;

sourceTeam.TeamChange += new TeamChangedEventHandler(this.TeamChange); }

// Hin thc thuc tnh IEnumerator.Current. public object Current { get {

// Nu TeamMemberEnumerator ng trc phn t u tin // hoc sau phn t cui cng th nm ngoi l. if (currentMember == -1 || currentMember > (sourceTeam.teamMembers.Count-1)) {

throw new InvalidOperationException(); }

// Nu khng, tr v TeamMember hin ti. return sourceTeam.teamMembers[currentMember]; } }

// Hin thc phng thc IEnumerator.MoveNext. public bool MoveNext() {

// Nu Team nm di bt hp l, nm ngoi l. if (teamInvalid) {

626 Chng 16: Cc giao din v mu thng dng

throw new InvalidOperationException("Team modified"); }

// Nu khng, tin n TeamMember k tip. currentMember++;

// Tr v false nu ta dch qua khi TeamMember cui cng. if (currentMember > (sourceTeam.teamMembers.Count-1)) { return false; } else { return true; } }

// Hin thc phng thc IEnumerator.Reset. Phng thc ny // reset v tr ca TeamMemberEnumerator v u tp hp Team. public void Reset() {

// Nu Team nm di bt hp l, nm ngoi l. if (teamInvalid) {

throw new InvalidOperationException("Team modified"); }

// Dch con tr currentMember v trc phn t u tin. currentMember = -1; }

// Phng thc th l s kin tp hp Team nm di thay i. internal void TeamChange(Team t, EventArgs e) {

// Bo hiu Team nm di hin ang bt hp l. teamInvalid = true; } }

627 Chng 16: Cc giao din v mu thng dng

// y nhim dng ch nh ch k m tt c // cc phng thc th l s kin phi hin thc. public delegate void TeamChangedEventHandler(Team t, EventArgs e);

// ArrayList dng cha cc i tng TeamMember. private ArrayList teamMembers;

// S kin dng bo cho TeamMemberEnumerator // bit Team thay i. public event TeamChangedEventHandler TeamChange; // Phng thc khi dng Team. public Team() {

teamMembers = new ArrayList(); } // Hin thc phng thc IEnumerable.GetEnumerator. public IEnumerator GetEnumerator() {

return new TeamMemberEnumerator(this); }

// Thm mt i tng TeamMember vo Team. public void AddMember(TeamMember member) {

teamMembers.Add(member);

if (TeamChange != null) {

TeamChange(this, null); } } }

Nu lp tp hp ca bn cha nhiu kiu d liu khc nhau v bn mun lit k chng mt cch ring r, vic hin thc giao din IEnumerable trn lp tp hp ny th vn cn thiu. Trong trng hp ny, bn cn hin thc mt s thuc tnh tr v cc th hin khc nhau ca

628 Chng 16: Cc giao din v mu thng dng

IEnumerator. V d, nu lp Team m t c cc thnh vin v cc my tnh trong i, bn c

th hin thc cc thuc tnh ny nh sau:


// Thuc tnh dng lit k cc thnh vin trong i. public IEnumerator Members { get { return new TeamMemberEnumerator(this); } }

// Thuc tnh dng lit k cc computer trong i. public IEnumerator Computers { get { return new TeamComputerEnumerator(this); } }

Khi , bn c th s dng cc enumerator ny nh sau:


Team team = new Team(); foreach(TeamMember in team.Members) { // Lm g ... }

foreach(TeamComputer in team.Computers) { // Lm g ... }

Lnh foreach cng h tr cc kiu c hin thc mt mu tng ng vi mu c nh ngha bi giao din IEnumerable v IEnumerator, mc d kiu khng hin thc cc giao din ny. Tuy nhin, m lnh ca bn s r rng hn v d hiu hn nu bn hin thc giao din IEnumerable. Bn hy xem C# Language Specification bit chi tit v cc yu cu ca lnh foreach [http://msdn.microsoft. com/net/ecma].

629 Chng 16: Cc giao din v mu thng dng

5.

Hin thc lp kh-hy (disposable class)


Bn cn to mt lp c tham chiu n cc ti nguyn khng-c-qun-l v cung cp mt c ch ngi dng gii phng cc ti nguyn mt cch tt nh. Hin thc giao din System.IDisposable, v gii phng cc ti nguyn khngc-qun-l khi m client gi phng thc IDisposable.Dispose.

Mt i tng khng c tham chiu n vn tn ti trn vng nh ng (heap) v tiu th cc ti nguyn cho n khi b thu gom rc (Garbage Collector) gii phng i tng v cc ti nguyn. B thu gom rc s t ng gii phng cc ti nguyn c-qun-l (nh b nh), nhng n s khng gii phng cc ti nguyn khng-c-qun-l (nh file handle v kt ni c s d liu) c tham chiu bi cc i tng c-qun-l. Nu mt i tng cha cc thnh vin d liu tham chiu n cc ti nguyn khng-c-qun-l, i tng ny phi gii phng cc ti nguyn . Mt gii php l khai bo mt destructorhay finalizercho lp. Trc khi gii phng phn b nh do mt th hin ca lp s dng, b thu gom rc s gi finalizer ca i tng ny. Finalizer c th thc hin cc bc cn thit gii phng cc ti nguyn khng-c-qunl. V b thu gom rc ch s dng mt tiu trnh thc thi tt c cc finalizer, vic s dng finalizer c th bt li trong qu trnh thu gom rc v nh hng n hiu nng ca ng dng. Ngoi ra, bn khng th kim sot khi b thc thi gii phng cc ti nguyn khng-cqun-l v bn khng th trc tip gi finalizer ca mt i tng, v bn ch c quyn kim sot hn ch trn cc hot ng ca b thu gom rc bng lp System.GC. Bng cch s dng finalizer, .NET Framework nh ngha mu Dispose nh mt phng tin cung cp quyn kim sot khi b thc thi gii phng cc ti nguyn khng-c-qun-l. hin thc mu Dispose, lp phi hin thc giao din IDisposable. Giao din ny khai bo mt phng thc c tn l Dispose; trong , bn phi hin thc phn m cn thit gii phng cc ti nguyn khng-c-qun-l. Cc th hin ca cc lp c hin thc mu Dispose c gi l cc i tng kh-hy (disposable object). Khi m lnh hon tt vi mt i tng kh-hy, n s gi phng thc Dispose ca i tng gii phng cc ti nguyn khng-c-qun-l, vn da vo b thu gom rc gii phng cc ti nguyn c-qun-l ca i tng. Cn hiu rng b thc thi khng bt buc hy cc i tng; vic gi phng thc Dispose l nhim v ca client. Tuy nhin, v th vin lp .NET Framework s dng mu Dispose rng khp nn C# cung cp lnh using n gin ha vic s dng cc i tng kh-hy. on m sau trnh by cu trc ca lnh using:
using (FileStream fileStream = new FileStream("SomeFile.txt", FileMode.Open)) { // Lm g vi i tng fileStream... }

Di y l mt s im cn lu khi hin thc mu Dispose:

630 Chng 16: Cc giao din v mu thng dng

M client nn c kh nng gi i gi li phng thc Dispose m khng gy ra cc nh hng bt li. Trong cc ng dng h-tr-a-tiu-trnh, iu quan trng l ch c mt tiu trnh thc thi phng thc Dispose. Thng thng, bo m s ng b tiu trnh l nhim v ca m client, mc d bn c th hin thc s ng b bn trong phng thc Dispose. Phng thc Dispose khng nn nm ngoi l. V phng thc Dispose dn dp tt c nn khng cn gi finalizer ca i tng. Phng thc Dispose ca bn nn gi phng thc GC.SuppressFinalize bo m finalizer khng c gi trong qu trnh thu gom rc. Hin thc mt finalizer sao cho phng thc Dispose s c n gi theo mt c ch an ton trong trng hp m client gi Dispose khng ng. Tuy nhin, nn trnh tham chiu n cc i tng c-qun-l trong finalizer v khng r trng thi ca i tng. Nu mt lp kh-hy tha k mt lp kh-hy khc, phng thc Dispose ca lp con phi gi phng thc Dispose ca lp cha. Gi phn m ca lp con trong mt khi try v gi phng thc Dispose ca lp cha trong mt mnh finally bo m vic thc thi. Cc phng thc v thuc tnh khc ca lp nn nm ngoi l
System.ObjectDisposedException nu m client thc thi mt phng thc trn mt i

tng b hy. Lp DisposeExample di y minh ha mt hin thc ph bin ca mu Dispose:


using System;

// Hin thc giao din IDisposable. public class DisposeExample : IDisposable { // Phn t d liu private dng bo hiu // i tng b hy hay cha. bool isDisposed = false; // Phn t d liu private dng lu gi // handle ca ti nguyn khng-c-qun-l. private IntPtr resourceHandle; // Phng thc khi dng. public DisposeExample() { // Thu ly tham chiu n ti nguyn khng-c-qun-l.

631 Chng 16: Cc giao din v mu thng dng // resourceHandle = ... } // Destructor/Finalizer. ~DisposeExample() { // Gi phin bn np chng protected ca Dispose // v truyn gi tr "false" cho bit rng // Dispose ang c gi trong qu trnh thu gom rc, // ch khng phi bi m consumer. Dispose(false); }

// Hin thc public ca phng thc IDisposable.Dispose, c gi // bi consumer ca i tng gii phng cc ti nguyn khng// c-qun-l mt cch tt nh. public void Dispose() {

// Gi phin bn np chng protected ca Dispose v truyn // gi tr "true" cho bit rng Dispose ang c gi // bi m consumer, ch khng phi bi b thu gom rc. Dispose(true);

// V phng thc Dispose thc hin tt c vic dn dp cn // thit nn bo m b thu gom rc khng gi destructor ca lp. GC.SuppressFinalize(this); }

// Phin bn np chng protected ca phng thc Dispose. i s // disposing cho bit phng thc c gi bi m consumer (true), // hay bi b thu gom rc (false). protected virtual void Dispose(bool disposing) {

if (!isDisposed) {

if (disposing) {

// Phng thc ny c gi bi m consumer. Gi

632 Chng 16: Cc giao din v mu thng dng

// phng thc Dispose ca cc thnh vin d liu // c-qun-l c hin thc giao din IDisposable. // }

// Gii phng tt c cc ti nguyn khng-c-qun-l // v thit lp gi tr ca cc thnh vin d liu // c-qun-l thnh null. // Close(resourceHandle); }

// Bo rng i tng ny b hy. isDisposed = true; } // Trc khi thc thi bt k chc nng no, bo m rng // Dispose cha c thc thi trn i tng. public void SomeMethod() { // Nm mt ngoi l nu i tng b hy. if (isDisposed) { throw new ObjectDisposedException("DisposeExample"); }

// Thc thi chc nng ca phng thc... // } public static void Main() { // Lnh using bo m phng thc Dispose c gi // c khi ngoi l xy ra. using (DisposeExample d = new DisposeExample()) {

// Lm g vi d...

633 Chng 16: Cc giao din v mu thng dng } } }

6.

Hin thc kiu kh-nh-dng (formattable type)


Bn cn hin thc mt kiu c th c s dng theo cc format string, v c th to ra nhng biu din chui khc nhau cho ni dung ca n da vo format specifier. Hin thc giao din System.IFormattable.

on m di y minh ha cch s dng format specifier (phn in m) trong phng thc WriteLine ca lp System.Console.
double a = 345678.5678; uint b = 12000; byte c = 254; Console.WriteLine("a = {0}, b = {1}, and c = {2}", a, b, c); Console.WriteLine("a = {0:c0}, b = {1:n4}, and c = {2,10:x5}", a, b, c);

Khi chy trn my vi thit lp bn a l English (U.K.), on m ny s cho kt xut nh sau (thay i ni dung ca format specifier s thay i nh dng ca kt xut mt cch ng k mc d d liu vn khng thay i):
a = 345678.5678, b = 12000, and c = 254 a = 345,679, b = 12,000.0000, and c = 000fe

kch hot vic h tr format specifier, bn phi hin thc giao din IFormattable. Giao din ny khai bo mt phng thc c tn l ToString vi ch k nh sau:
string ToString(string format, IFormatProvider formatProvider);

i s format l mt System.String cha format string (chui nh dng). Format string l phn format specifier pha sau du hai chm. V d, trong format specifier {2,10:x5} ( v d trn), "x5" l format string. Format string cha nhng ch th m th hin IFormattable s s dng khi to ra dng chui cho ni dung ca n. Ti liu .NET Framework pht biu rng: nhng kiu c hin thc IFormattable th phi h tr format string "G" (general), nhng nhng format string c h tr khc th ph thuc vo hin thc. i s format l null nu format specifier khng cha phn format string, v d {0} hay {1,20}. i s formatProvider l tham chiu n mt th hin System.IFormatProvider (dng truy xut cc thng tin bn abao gm cc d liu nh biu tng tin t hay s lng ch s thp phn). Theo mc nh, formatProvider l null, ngha l bn s s dng cc thit lp bn a ca tiu trnh hin hnh (c th ly c thng qua phng thc tnh CurrentCulture ca lp System.Globalization.CultureInfo). .NET Framework ch yu s dng IFormattable h tr vic nh dng cc kiu gi tr, nhng n c th c s dng cho bt k kiu no. V d, lp Person di y c hin thc giao din IFormattable. Lp ny cha danh hiu v tn ca mt ngi, v s tr v tn theo

634 Chng 16: Cc giao din v mu thng dng

cc nh dng khc nhau ty vo format string. Lp Person khng s dng cc thit lp bn a do i s formatProvider cung cp.
using System; public class Person : IFormattable { // Cc thnh vin private dng lu tr danh hiu // v tn ca mt ngi. private string title; private string[] names;

// Phng thc khi dng dng thit lp danh hiu v tn. public Person(string title, params string[] names) {

this.title = title; this.names = names; }

// Chp phng thc Object.ToString tr v // tn theo nh dng general. public override string ToString() { return ToString("G", null); } // Hin thc phng thc IFormattable.ToString tr v // tn theo cc dng khc nhau da trn format string. public string ToString(string format, IFormatProvider formatProvider) { string result = null; // S dng nh dng general nu format = null. if (format == null) format = "G"; // Ni dung ca format string cho bit nh dng ca tn. switch (format.ToUpper()[0]) {

635 Chng 16: Cc giao din v mu thng dng

case 'S': // S dng dng short: first-initial v surname. result = names[0][0] + ". " + names[names.Length-1]; break; case 'P': // S dng dng polite: title, initials, v surname. if (title != null && title.Length != 0) { result = title + ". "; } for (int count = 0; count < names.Length; count++) { if ( count != (names.Length - 1)) { result += names[count][0] + ". "; } else { result += names[count]; } } break; case 'I': // S dng dng informal: ch c first-name. result = names[0]; break; case 'G': default: // S dng dng mc nh/general: first-name v surname. result = names[0] + " " + names[names.Length-1]; break; } return result; } }

on m di y trnh by cch s dng kh nng nh dng ca lp Person:


// To mt i tng Person m t mt ngi c tn l // Mr. Richard Glen David Peters. Person person =

636 Chng 16: Cc giao din v mu thng dng

new Person("Mr", "Richard", "Glen", "David", "Peters");

// Hin th tn bng nhiu format string khc nhau. System.Console.WriteLine("Dear {0:G},", person); System.Console.WriteLine("Dear {0:P},", person); System.Console.WriteLine("Dear {0:I},", person); System.Console.WriteLine("Dear {0},", person); System.Console.WriteLine("Dear {0:S},", person);

Khi c thc thi, on m ny sinh ra kt xut nh sau:


Dear Richard Peters, Dear Mr. R. G. D. Peters, Dear Richard, Dear Richard Peters, Dear R. Peters,

7.

Hin thc lp ngoi l ty bin


Bn cn to mt lp ngoi l ty bin sao cho bn c th s dng c ch th l ngoi l ca b thc thi th l cc ngoi l c-trng-ng-dng. To mt lp kh-tun-t-ha, tha k lp System.ApplicationException v hin thc cc phng thc khi dng vi ch k nh sau:
public CustomException() : base() {} public CustomException(string message) : base(message) {} public CustomException(string message, Exception inner) : base(message, inner) {}

Thm bt c thnh vin d liu ty bin no m ngoi l cn n, bao gm cc phng thc khi dng v cc thuc tnh cn thit thao tc cc thnh vin d liu. Cc lp ngoi l l duy nht, bn khng c khai bo cc lp mi hin thc chc nng mi hay m rng. C ch th l ngoi l ca b thc thi (c trng ra bi cc lnh: try, catch, v finally) lm vic da trn kiu ngoi l b nm, ch khng phi cc thnh vin chc nng hay d liu c hin thc bi ngoi l b nm. Nu cn nm mt ngoi l, bn nn s dng mt lp ngoi l c sn trong th vin lp .NET Framework (nu tn ti mt lp ph hp). Di y l mt s ngoi l hu ch:
System.ArgumentNullExceptionkhi m lnh truyn mt gi tr i s null cho mt

phng thc khng h tr i s null.


System.ArgumentOutOfRangeExceptionkhi m lnh truyn cho phng thc mt gi

tr i s khng ph hp (ln qu hay nh qu).

637 Chng 16: Cc giao din v mu thng dng

System.FormatExceptionkhi m lnh truyn cho phng thc mt i s String cha

d liu khng c nh dng ng. Nu khng c lp ngoi l no p ng c nhu cu ca bn, hoc bn cm thy ng dng ca bn s c li t vic s dng cc ngoi l c-trng-ng-dng, bn c th to mt lp ngoi l cho mnh. tch hp ngoi l ty bin vi c ch th l ngoi l ca b thc thi v vn gi tnh nht qun vi mu c hin thc bi cc lp ngoi l c sn, bn cn: t mt tn c ngha cho lp ngoi l ty bin, kt thc bng t Exception, chng hn, TypeMismatchException hay RecordNotFoundException. Tha k lp ApplicationException. V c bn, lp ngoi l ty bin phi tha k lp System.Exception, nu khng trnh bin dch s dng ln li khi bn nm ngoi l. ApplicationException tha k Exception v c ngh lm lp s s cho tt c cc lp ngoi l c-trng-ng-dng. nh du lp ngoi l ty bin l sealed nu bn khng mun cc lp ngoi l khc c th tha k n. Hin thc thm cc thuc tnh v cc thnh vin d liu h tr cc thng tin ty bin m lp ngoi l ny cung cp. Hin thc ba phng thc khi dng public vi ch k nh di y v bo m chng gi phng thc khi dng ca lp c s:
public CustomException() : base() {} public CustomException(string message): base(message) {} public CustomException(string message, Exception inner) : base(message, inner) {}

Lm cho lp ngoi ty bin tr nn kh-tun-t-ha b thc thi c th marshal cc th hin ca n qua cc bin min ng dng v bin my. p dng c tnh System.SerializableAttribute thng l cho cc lp ngoi l khng hin thc cc thnh vin d liu ty bin. Tuy nhin, v Exception hin thc giao din System.Runtime.Serialization.ISerializable nn nu ngoi l ca bn c khai bo cc thnh vin d liu ty bin, bn phi chp phng thc ISerializable.GetObjectData ca lp Exception cng nh hin thc mt phng thc khi dng gii tun t ha vi ch k nh di y. Nu lp ngoi l ca bn l sealed, nh du phng thc khi dng gii tun t ha l private; nu khng th nh du n l protected.
private CustomException(SerializationInfo info, StreamingContext context) {}

Phng thc GetObjectData v phng thc khi dng gii tun t ha phi gi phng thc tng ng trong lp c s cho php lp c s thc hin tun t ha v gii tun t ha d liu ca n mt cch ng n (xem mc 16.1 bit cch lm cho mt lp tr nn kh-tun-t-ha). Di y l mt lp ngoi l ty bin c tn l CustomException (tha k lp ApplicationException). Lp ny khai bo hai thnh vin d liu ty bin: mt chui c tn l stringInfo v mt gi tr lun l c tn l booleanInfo.

638 Chng 16: Cc giao din v mu thng dng

using System; using System.Runtime.Serialization;

// nh du CustomException l Serializable (kh-tun-t-ha). [Serializable] public sealed class CustomException : ApplicationException {

// Cc thnh vin d liu ty bin cho CustomException. private string stringInfo; private bool booleanInfo;

// Ba phng thc khi dng chun; ch cn gi phng thc // khi dng ca lp c s (System.ApplicationException). public CustomException() : base() {}

public CustomException(string message): base(message) {}

public CustomException(string message, Exception inner) : base(message, inner) {}

// Phng thc khi dng gii tun t ha (cn cho giao din // ISerialization). V CustomException l sealed nn phng thc // khi dng ny l private. Nu CustomException khng phi l // sealed th phng thc khi dng ny nn c khai bo l // protected cc lp dn xut c th gi n trong qu trnh // gii tun t ha. private CustomException(SerializationInfo info, StreamingContext context) : base (info, context) {

// Gii tun t ha mi thnh vin d liu ty bin. stringInfo = info.GetString("StringInfo"); booleanInfo = info.GetBoolean("BooleanInfo"); }

// Cc phng thc khi dng cho php m lnh thit lp

639 Chng 16: Cc giao din v mu thng dng // cc thnh vin d liu ty bin. public CustomException(string message, string stringInfo, bool booleanInfo): this(message) { this.stringInfo = stringInfo; this.booleanInfo = booleanInfo; }

public CustomException(string message, Exception inner, string stringInfo, bool booleanInfo) : this(message, inner) { this.stringInfo = stringInfo; this.booleanInfo = booleanInfo; } // Cc thuc tnh ch-c cho php truy xut n cc // thnh vin d liu ty bin. public string StringInfo { get { return stringInfo; } } public bool BooleanInfo { get { return booleanInfo; } } // Phng thc GetObjectData (c khai bo trong giao din // ISerializable) c s dng trong qu trnh tun t ha // CustomException. V CustomException c khai bo cc thnh // vin d liu ty bin nn n phi chp hin thc // GetObjectData ca lp c s. public override void GetObjectData(SerializationInfo info, StreamingContext context) {

// Tun t ha cc thnh vin d liu ty bin. info.AddValue("StringInfo", stringInfo); info.AddValue("BooleanInfo", booleanInfo); // Gi lp c s tun t ha cc thnh vin ca n. base.GetObjectData(info, context); }

640 Chng 16: Cc giao din v mu thng dng

// Chp thuc tnh Message ca lp c s ( km cc // thnh vin d liu ty bin vo). public override string Message { get { string message = base.Message; if (stringInfo != null) { message += Environment.NewLine + stringInfo + " = " + booleanInfo; } return message; } } }

Trong cc ng dng ln, bn s thng xuyn hin thc mt vi lp ngoi l ty bin. Bn cn lu tm n cch t chc cc ngoi l ty bin v m lnh s s dng chng nh th no. Ni chung, trnh to ra cc lp ngoi l mi tr khi m lnh cn n lc bt ngoi l ; s dng cc thnh vin d liu thu thng tin, ch khng phi cc lp ngoi l. Ngoi ra, trnh phn cp lp theo chiu su m nn phn cp cn, theo chiu rng.

8.

Hin thc i s s kin ty bin


Khi dng ln mt s kin, bn cn truyn mt trng thi c-trng-s-kin cho cc phng thc th l s kin. To mt lp i s s kin ty bin dn xut t lp System.EventArg. Khi dng ln s kin, hy to mt th hin ca lp i s s kin v truyn n cho cc phng thc th l s kin.

Khi khai bo cc kiu s kin, thng thng bn s cn truyn trng thi c-trng-s-kin cho cc phng thc th l s kin. to mt lp i s s kin ty bin tun theo mu Event do .NET Framework nh ngha, bn cn: Dn xut lp i s s kin ty bin t lp EventArgs. Lp EventArgs khng cha d liu v c s dng cng vi cc s kin khng cn truyn trng thi. t mt tn c ngha cho lp i s s kin ty bin, kt thc bng t EventArgs; chng hn, DiskFullEventArgs hay MailReceivedEventArgs. nh du lp i s s kin l sealed nu bn khng mun cc lp i s s kin khc c th tha k n.

641 Chng 16: Cc giao din v mu thng dng

Hin thc thm cc thuc tnh v cc thnh vin d liu h tr trng thi s kin m bn cn truyn cho cc phng thc th l s kin. Tt nht l lm cho trng thi s kin tr nn bt bin (immutable), nh vy bn nn s dng cc thnh vin d liu private readonly v s dng cc thuc tnh public cho php truy xut ch-c n cc thnh vin d liu ny. Hin thc mt phng thc khi dng public h tr cu hnh ban u ca trng thi s kin. Lm cho lp i s s kin ca bn tr nn kh-tun-t-ha (serializable) b thc thi c th marshal cc th hin ca n qua cc bin min ng dng v bin my. p dng c tnh System.SerializableAttribute thng l cho cc lp i s s kin. Tuy nhin, nu lp i s s kin c cc yu cu tun t ha c bit, bn phi hin thc giao din System.Runtime.Serialization.ISerializable (xem mc 16.1 bit cch lm cho mt lp tr nn kh-tun-t-ha).

on m di y trnh by mt lp i s s kin ty bin c tn l MailReceivedEventArgs. Gi s c mt mail-server truyn cc th hin ca lp MailReceivedEventArgs cho cc phng thc th l s kin nhn mt thng ip e-mail. Lp ny cha cc thng tin v ngi gi v ch ca thng ip e-mail.
using System;

[Serializable] public sealed class MailReceivedEventArgs : EventArgs {

// Cc thnh vin private readonly gi trng thi s kin // (c phn b cho tt c cc phng thc th l s kin). // Lp MailReceivedEventArgs s cho bit ai gi mail // v ch l g. private readonly string from; private readonly string subject;

// Phng thc khi dng (khi to trng thi s kin). public MailReceivedEventArgs(string from, string subject) {

this.from = from; this.subject = subject; }

// Cc thuc tnh ch-c cho php truy xut // trng thi s kin. public string From { get { return from; } }

642 Chng 16: Cc giao din v mu thng dng

public string Subject { get { return subject; } } }

9.

Hin thc mu Singleton


Bn cn bo m ch c mt th hin ca mt kiu tn ti mt thi im cho trc v th hin l kh-truy-xut i vi tt c cc phn t ca ng dng. Hin thc kiu ny theo mu Singleton nh sau: Hin thc mt thnh vin tnh private gi mt tham chiu n th hin ca kiu. Hin thc mt thuc tnh tnh kh-truy-xut-cng-khai cho php truy xut ch-c n th hin. Hin thc mt phng thc khi dng private m lnh khng th to thm cc th hin ca kiu.

Trong tt c cc mu c bit n, c l mu Singleton c bit n nhiu nht v thng c s dng nht. Mc ch ca mu Singleton l bo m ch c mt th hin ca mt kiu tn ti mt thi im cho trc v cho php truy xut ton cc n cc chc nng ca th hin . on m di y trnh by mt hin thc ca mu Singleton cho mt lp c tn l SingletonExample:
public class SingletonExample {

// Thnh vin tnh dng gi mt tham chiu n th hin singleton. private static SingletonExample instance;

// Phng thc khi dng tnh dng to th hin singleton. // Mt cch khc l s dng "Lazy Initialization" trong // thuc tnh Instance. static SingletonExample () { instance = new SingletonExample(); }

// Phng thc khi dng private dng ngn m lnh to thm // cc th hin ca kiu singleton. private SingletonExample () {}

// Thuc tnh public cho php truy xut n th hin singleton. public static SingletonExample Instance {

643 Chng 16: Cc giao din v mu thng dng

get { return instance; } }

// Cc phng thc public cung cp chc nng ca singleton. public void SomeMethod1 () { /*..*/ } public void SomeMethod2 () { /*..*/ } }

gi cc chc nng ca lp SingletonExample, bn c th ly v mt tham chiu n singleton bng thuc tnh Instance v ri gi cc phng thc ca n. Bn cng c th trc tip thc thi cc thnh vin ca singleton thng qua thuc tnh Instance. on m di y trnh by c hai cch ny:
// Thu ly tham chiu n singleton v gi mt phng thc ca n. SingletonExample s = SingletonExample.Instance; s.SomeMethod1();

// Thc thi chc nng ca singleton m khng cn tham chiu. SingletonExample.Instance.SomeMethod2();

10.

Hin thc mu Observer


Bn cn hin thc mt c ch hiu qu mt i tng (subject) bo vi cc i tng khc (observer) v nhng thay i trng thi ca n. Hin thc mu Observer bng cc kiu y nhim (ng vai tr l cc con tr hm an-ton-v-kiu-d-liutype-safe function pointer) v cc kiu s kin.

Cch truyn thng khi hin thc mu Observer l hin thc hai giao din: mt m t observer (IObserver) v mt m t subject (ISubject). Cc i tng c hin thc IObserver s ng k vi subject, cho bit chng mun c thng bo v cc s kin quan trng (nh thay i trng thi) tc ng n subject. Subject chu trch nhim qun l danh sch cc observer ng k v thng bo vi chng khi p ng cc s kin tc ng n subject. Subject thng thng bo vi observer bng phng thc Notify (c khai bo trong giao din IObserver). Subject c th truyn d liu cho observer trong phng thc Notify, hoc observer c th cn gi mt phng thc c khai bo trong giao din ISubject thu ly thm cc chi tit v s kin. Mc d bn c th hin thc mu Observer bng C# theo cch va c m t, nhng v mu Observer qu ph bin trong cc gii php phn mm hin i nn C# v .NET Framework cung cp cc kiu s kin v y nhim n gin ha hin thc ca n. S dng s kin v y nhim ngha l bn khng cn khai bo giao din IObserver v ISubject. Ngoi ra, bn khng cn hin thc cc logic cn thit qun l v thng bo vi cc observer ng k y chnh l phn d xy ra li nht khi vit m.

644 Chng 16: Cc giao din v mu thng dng

.NET Framework s dng mt hin thc cho mu Observer da-trn-s-kin v da-trn-ynhim thng xuyn n ni n c t mt ci tn: mu Event. File ObserverExample.cs cha mt hin thc cho mu Event. V d ny bao gm: Lp Thermostat (subject)theo di nhit hin ti v thng bo vi observer khi c s thay i nhit . Lp mt hin thc ty bin ca System.EventArgs, c s dng ng gi d liu cn phn b cho observer.
TemperatureChangeEventArgsl

lp

y nhim TemperatureEventHandlernh ngha ch k ca phng thc m tt c cc observer ca i tng Thermostat phi hin thc, v i tng Thermostat s gi phng thc ny trong s kin thay i nhit . Lp TemperatureChangeObserver v TemperatureAverageObserverl cc observer ca lp Thermostat.
TemperatureChangeEventArgs

Lp

(c

trnh

by

bn

di)

dn

xut

lp

System.EventArgs. Lp ny s cha tt c cc d liu cn thit subject truyn cho cc

observer khi n thng bo vi chng v mt s kin. Nu khng cn truyn d liu, bn khng phi nh ngha mt lp i s mi (bn ch cn truyn i s null khi dng nn s kin). Xem mc 16.8 bit r hn v cch hin thc lp i s s kin ty bin.
// Lp i s s kin cha thng tin v s kin thay i nhit . // Mt th hin ca lp ny s c truyn cng vi mi s kin. public class TemperatureChangeEventArgs : System.EventArgs {

// Cc thnh vin d liu cha nhit c v mi. private readonly int oldTemperature, newTemperature;

// Phng thc khi dng (nhn gi tr nhit c v mi). public TemperatureChangeEventArgs(int oldTemp, int newTemp) {

oldTemperature = oldTemp; newTemperature = newTemp; }

// Cc thuc tnh dng truy xut cc gi tr nhit . public int OldTemperature { get { return oldTemperature; } } public int NewTemperature { get { return newTemperature; } } }

on m di y trnh by cch khai bo y nhim TemperatureEventHandler. Da trn khai bo ny, tt c cc observer phi hin thc mt phng thc (tn khng quan trng), tr v

645 Chng 16: Cc giao din v mu thng dng

s: mt i tng Thermostat v mt i tng TemperatureChangeEventArgs. Trong qu trnh thng bo, i s Thermostat ch n i tng Thermostat dng nn s kin, v i s TemperatureChangeEventArgs cha cc d liu v nhit c v mi.
void // y nhim cho bit ch k m tt c cc phng thc // th l s kin phi hin thc. public delegate void TemperatureEventHandler(Thermostat s, TemperatureChangeEventArgs e);

nhn

hai

Lp Thermostat l i tng b gim st trong mu Observer (Event) ny. Theo l thuyt, mt thit b gim st thit lp nhit hin ti bng cch gi thuc tnh Temperature trn mt i tng Thermostat. Khi , i tng Thermostat dng nn s kin TemperatureChange v gi mt i tng TemperatureChangeEventArgs n mi observer. Di y l m lnh cho lp Thermostat:
// Lp m t mt b n nhit, l ngun gc ca cc s kin thay i // nhit . Trong mu Observer, i tng Thermostat l subject. public class Thermostat { // Trng private dng gi nhit hin ti. private int temperature = 0; // S kin dng duy tr danh sch cc y nhim observer v // dng nn s kin thay i nhit . public event TemperatureEventHandler TemperatureChange; // Phng thc protected dng dng nn s kin TemperatureChange. // V s kin ch c th c pht sinh bn trong kiu cha n nn // vic s dng phng thc protected cho php cc lp dn xut // c cch hnh x ty bin v vn c th dng nn s kin // ca lp c s. virtual protected void RaiseTemperatureEvent (TemperatureChangeEventArgs e) { if (TemperatureChange != null) { TemperatureChange(this, e); } } // Thuc tnh public dng ly v thit lp nhit hin ti. // Pha "set" chu trch nhim dng nn s kin thay i nhit

646 Chng 16: Cc giao din v mu thng dng

// thng bo vi tt c cc observer v thay i ny. public int Temperature { get { return temperature; } set { // To mt i tng i s s kin mi cha // nhit c v mi. TemperatureChangeEventArgs e = new TemperatureChangeEventArgs(temperature, value); // Cp nht nhit hin ti. temperature = value; // Dng nn s kin thay i nhit . RaiseTemperatureEvent(e); } } }

Vi

mc

ch

minh

ha

mu

Observer,

ny

hai

kiu

observer:

TemperatureAverageObserver (hin th nhit trung bnh mi khi mt s kin thay i nhit

xy ra) v TemperatureChangeObserver (hin th thng tin v s thay i mi khi mt s kin thay i nhit xy ra). Di y l m lnh cho hai lp ny:
// Observer hin th thng tin v s thay i nhit // khi c mt s kin thay i nhit xy ra. public class TemperatureChangeObserver {

// Phng thc khi dng (nhn mt tham chiu n i tng // Thermostat cn c TemperatureChangeObserver gim st). public TemperatureChangeObserver(Thermostat t) {

// To mt th hin y nhim TemperatureEventHandler v // ng k n vi Thermostat c ch nh. t.TemperatureChange += new TemperatureEventHandler(this.TemperatureChange); }

647 Chng 16: Cc giao din v mu thng dng

// Phng thc th l s kin thay i nhit . public void TemperatureChange(Thermostat sender, TemperatureChangeEventArgs temp) {

System.Console.WriteLine ("ChangeObserver: Old={0}, New={1}, Change={2}", temp.OldTemperature, temp.NewTemperature, temp.NewTemperature - temp.OldTemperature); } }

// Observer hin th thng tin v nhit d trung bnh // khi c mt s kin thay i nhit xy ra. public class TemperatureAverageObserver {

// Sum cha tng cc gi tr nhit . // Count cha s ln s kin thay i nhit xy ra. private int sum = 0, count = 0;

// Phng thc khi dng (nhn mt tham chiu n i tng // Thermostat cn c TemperatureAverageObserver gim st). public TemperatureAverageObserver (Thermostat t) {

// To mt th hin y nhim TemperatureEventHandler v // ng k n vi Thermostat c ch nh. t.TemperatureChange += new TemperatureEventHandler(this.TemperatureChange); } // Phng thc th l s kin thay i nhit . public void TemperatureChange(Thermostat sender, TemperatureChangeEventArgs temp) { count++; sum += temp.NewTemperature;

System.Console.WriteLine

648 Chng 16: Cc giao din v mu thng dng

("AverageObserver: Average={0:F}", (double)sum/(double)count); } }

Lp Thermostat nh ngha mt phng thc Main (c trnh by bn di) chy v d ny. Sau khi to mt i tng Thermostat v hai i tng observer, phng thc Main s nhc bn nhp vo mt nhit . Mi khi bn nhp mt nhit mi, i tng Thermostat s bo cho observer hin th thng tin ra ca s Console.
public static void Main() {

// To mt i tng Thermostat. Thermostat t = new Thermostat();

// To hai observer. new TemperatureChangeObserver(t); new TemperatureAverageObserver(t);

// Lp ly nhit t ngi dng. Bt c gi tr // no khng phi s nguyn s khin vng lp kt thc. do {

System.Console.Write("\n\rEnter current temperature: ");

try { // Chuyn u vo ca ngi dng thnh mt s // nguyn v s dng n thit lp nhit // hin ti ca b n nhit. t.Temperature = System.Int32.Parse(System.Console.ReadLine());

} catch (System.Exception) { // S dng iu kin ngoi l kt thc vng lp. System.Console.WriteLine("Terminating ObserverExample."); return; } } while (true);

649 Chng 16: Cc giao din v mu thng dng }

Di y l kt xut khi chy ObserverExample.cs (cc gi tr in m l do bn nhp vo):


Enter current temperature: 50 ChangeObserver: Old=0, New=50, Change=50 AverageObserver: Average=50.00

Enter current temperature: 20 ChangeObserver: Old=50, New=20, Change=-30 AverageObserver: Average=35.00

Enter current temperature: 40 ChangeObserver: Old=20, New=40, Change=20 AverageObserver: Average=36.67

650 Chng 16: Cc giao din v mu thng dng

651

Chng 17:S HA HP VI MI TRNG WINDOWS

17

652

653 Chng 17: S ha hp vi mi trng Windows

icrosoft .NET Framework c thit k sao cho c th chy trn nhiu h iu hnh khc nhau, nng cao tnh kh chuyn ca m lnh (code mobility) v n gin ha vic tch hp xuyn-nn (cross-platform integration).

Hin ti, .NET Framework c th chy trn cc h iu hnh: Microsoft Windows, FreeBSD, Linux, v Mac OS X. Tuy nhin, nhiu bn hin thc vn cha hon chnh hay cha c chp nhn rng ri. Microsoft Windows hin l h iu hnh m .NET Framework c ci t nhiu nht. Do , cc mc trong chng ny tp trung vo cc tc v c trng cho h iu hnh Windows, bao gm: Ly cc thng tin mi trng Windows (mc 17.1 v 17.2). Ghi vo nht k s kin Windows (mc 17.3). Truy xut Windows Registry (mc 17.4). To v ci t dch v Windows (mc 17.5 v 17.6). To shortcut trn Desktop hay trong Start menu ca Windows (mc 17.7). Phn ln cc chc nng c tho lun trong chng ny c CLR bo v bng cc quyn bo mt truy xut m lnh (Code Access Security). Xem chng 13 v bo mt truy xut m lnh, v xem ti liu .NET Framework SDK v cc quyn cn thit thc thi tng b phn.

1.

Truy xut thng tin mi trng


Bn cn truy xut cc thng tin v mi trng thc thi m ng dng ang chy trong . S dng cc thnh vin ca lp System.Environment.

Lp Environment cung cp mt tp cc thnh vin tnh dng ly (v trong mt s trng hp, sa i) thng tin v mi trng m mt ng dng ang chy trong . Bng 17.1 m t cc thnh vin thng dng nht.
Bng 17.1 Cc thnh vin thng dng ca lp Environment Thnh vin Thuc tnh CommandLine M t

Ly chui cha dng lnh thc thi ng dng hin ti, gm c tn ng dng; xem chi tit mc 1.5. Ly v thit lp chui cha th mc hin hnh ca ng dng. Ban u, thuc tnh ny cha tn ca th mc m ng dng chy trong . Ly mt gi tr lun l cho bit CRL bt u tt, hoc min ng dng bt u gii phng hay cha. Ly chui cha tn my.

CurrentDirectory

HasShutdownStarted MachineName

654 Chng 17: S ha hp vi mi trng Windows

OSVersion

Ly mt i tng System.OperatingSystem cha cc thng tin v nn v phin bn ca h iu hnh nm di. Xem chi tit bn di bng. Ly chui cha ng dn y ca th mc h thng. Ly mt gi tr kiu int cho bit thi gian (tnh bng mili-giy) t khi h thng khi ng. Ly chui cha tn min ca ngi dng hin hnh. Thuc tnh ny s ging vi thuc tnh MachineName nu y l my c lp. Ly mt gi tr lun l cho bit ng dng c ang chy trong ch tng tc vi ngi dng hay khng. Tr v false khi ng dng l mt dch v hoc ng dng Web. Ly chui cha tn ngi dng khi chy tiu trnh hin hnh. Ly mt i tng System.Version cha thng tin v phin bn ca CRL.
Phng thc

SystemDirectory

TickCount

UserDomainName

UserInteractive

UserName

Version

ExpandEnvironmentVariables

Thay tn ca cc bin mi trng trong mt chui bng gi tr ca bin; xem chi tit mc 17.2. Tr v mt mng kiu chui cha tt c cc phn t dng lnh dng thc thi ng dng hin ti, gm c tn ng dng; xem chi tit mc 1.5. Tr v chui cha gi tr ca mt bin mi trng; xem chi tit mc 17.2. Tr v mt System.Collections.Idictionary cha tt c cc bin mi trng v cc gi tr ca chng; xem chi tit mc 17.2 Tr v chui cha ng dn n mt th mc h thng c bit, c xc nh bi kiu lit k System.Environment.SpecialFolder (bao gm cc th mc cho Internet cache, Cookie, History, Desktop, v Favourite; xem ti liu .NET Framework SDK c danh sch tt c cc gi tr ny).

GetCommandLineArgs

GetEnvironmentVariable

GetEnvironmentVariables

GetFolderPath

655 Chng 17: S ha hp vi mi trng Windows GetLogicalDrives

Tr v mng kiu chui cha tn ca tt c cc a lun l.

i tng OperatingSystem (do OSVersion tr v) c hai thuc tnh: Platform v Version. Thuc tnh Platform tr v mt gi tr thuc kiu lit k System.PlatformIDxc nh nn hin hnh; cc gi tr hp l l Win32NT, Win32S, Win32Windows, v WinCE. Thuc tnh Version tr v mt i tng System.Versionxc nh phin bn ca h iu hnh. xc nh chnh xc tn h iu hnh, bn phi s dng c thng tin nn v phin bn, bng 17.2 di y s lit k mt s thng tin chi tit.
Bng 17.2 Xc nh h iu hnh PlatformID Win32Windows Win32Windows Win32NT Win32NT Win32NT Win32NT Major Version Minor Version H iu hnh

4 4 4 5 5 5

10 90 0 0 1 2

Windows 98 Windows Me Windows NT 4 Windows 2000 Windows XP Windows Server 2003

Lp AccessEnvironmentExample trong v d di y s dng lp Environment hin th thng tin v mi trng hin hnh.
using System; public class AccessEnvironmentExample { public static void Main() { // Dng lnh. Console.WriteLine("Command line : " + Environment.CommandLine); // Thng tin v phin bn h iu hnh v mi trng thc thi. Console.WriteLine("OS PlatformID : " + Environment.OSVersion.Platform); Console.WriteLine("OS Major Version : " + Environment.OSVersion.Version.Major); Console.WriteLine("OS Minor Version : " + Environment.OSVersion.Version.Minor); Console.WriteLine("CLR Version : " + Environment.Version); // Thng tin v ngi dng, my, v min.

656 Chng 17: S ha hp vi mi trng Windows

Console.WriteLine("User Name : " + Environment.UserName); Console.WriteLine("Domain Name : " + Environment.UserDomainName); Console.WriteLine("Machine name : " + Environment.MachineName); // Cc thng tin mi trng khc. Console.WriteLine("Is interactive ? : " + Environment.UserInteractive); Console.WriteLine("Shutting down ? : " + Environment.HasShutdownStarted); Console.WriteLine("Ticks since startup : " + Environment.TickCount); // Hin th tn ca tt c cc a lun l. foreach (string s in Environment.GetLogicalDrives()) { Console.WriteLine("Logical drive : " + s); } // Thng tin v cc th mc chun. Console.WriteLine("Current folder : " + Environment.CurrentDirectory); Console.WriteLine("System folder : " + Environment.SystemDirectory); // Lit k tt c cc th mc c bit. foreach (Environment.SpecialFolder s in Enum.GetValues(typeof(Environment.SpecialFolder))) {

Console.WriteLine("{0} folder : {1}", s, Environment.GetFolderPath(s)); }

// Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

657 Chng 17: S ha hp vi mi trng Windows

2.

Ly gi tr ca mt bin mi trng
Bn cn ly gi tr ca mt bin mi trng s dng cho ng dng ca bn. S dng cc phng thc GetEnvironmentVariable, GetEnvironmentVariables, v ExpandEnvironmentVariables ca lp Environment.

Phng thc GetEnvironmentVariable tr v chui cha gi tr ca mt bin mi trng, cn phng thc GetEnvironmentVariables tr v mt Idictionary cha tn v gi tr ca tt c cc bin mi trng di dng chui. Phng thc ExpandEnvironmentVariables cung cp mt c ch n gin thay tn bin mi trng bng gi tr ca n bn trong mt chui, bng cch t tn bin mi trng gia du phn trm (%). V d sau minh ha cch s dng ba phng thc trn:
using System; using System.Collections;

public class VariableExample {

public static void Main () {

// Ly mt bin mi trng thng qua tn. Console.WriteLine("Path = " + Environment.GetEnvironmentVariable("Path")); Console.WriteLine();

// Thay tn bin mi trng bng gi tr ca n. Console.WriteLine(Environment.ExpandEnvironmentVariables( "The Path on %computername% is %Path%")); Console.WriteLine();

// Ly tt c cc bin mi trng. Hin th gi tr // ca cc bin mi trng bt u bng k t 'P'. IDictionary vars = Environment.GetEnvironmentVariables(); foreach (string s in vars.Keys) { if (s.ToUpper().StartsWith("P")) { Console.WriteLine(s + " = " + vars[s]); } } Console.WriteLine();

658 Chng 17: S ha hp vi mi trng Windows

// Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

3.

Ghi mt s kin vo nht k s kin Windows


Bn cn ghi mt s kin vo nht k s kin Windows. S dng cc thnh vin ca lp System.Diagnostics.EventLog to mt nht k (nu cn), ng k mt ngun s kin (event source), v ghi s kin.

Bn c th ghi vo nht k s kin Windows bng cc phng thc tnh ca lp EventLog, hoc c th to mt i tng EventLog v s dng cc thnh vin ca n. D chn cch no, trc khi ghi bn cn phi quyt nh s s dng nht k no v ng k mt ngun s kin cho nht k . Ngun s kin n gin ch l mt chui (duy nht) nhn din ng dng ca bn. Mt ngun s kin ch c th c ng k cho mt nht k ti mt thi im. Theo mc nh, nht k s kin gm ba loi: Application, System, v Security. Thng thng, bn s ghi vo nht k Application, nhng cng c th ghi vo mt nht k ty bin. Bn khng cn phi trc tip to ra nht k ty bin; khi bn ng k mt ngun s kin cho mt nht k, nu nht k ny khng tn ti, n s c to mt cch t ng. Mt khi chn nht k ch v ng k ngun s kin tng ng cho n, bn c th bt u ghi cc entry nht k bng phng thc WriteEntry. Phng thc ny cung cp cc phin bn np chng cho php bn ch nh mt vi hoc tt c cc gi tr sau: Chui cha ngun s kin cho entry nht k (ch c cc phng thc tnh). Chui cha thng ip cho entry nht k. Gi tr thuc kiu lit k System.Diagnostics.EventLogEntryType, ch nh kiu ca entry nht k. Cc gi tr hp l l Error, FailureAlert, Information, SuccessAudit, v Warning. Gi tr kiu int ch nh ID ca entry nht k. Gi tr kiu short ch nh category ca entry nht k. Mng kiu byte cha d liu th tng ng vi entry nht k.

Lp EventLogExample trong v d di y trnh by cch s dng cc phng thc tnh ca lp EventLog ghi mt entry vo nht k s kin ca my cc b. Lp EventLog cng cung cp cc phng thc np chng ghi vo nht k s kin ca cc my xa (xem ti liu .NET Framework SDK bit thm chi tit).
using System; using System.Diagnostics;

659 Chng 17: S ha hp vi mi trng Windows public class EventLogExample { public static void Main () { // Nu ngun s kin khng tn ti, ng k n vi // nht k Application trn my cc b. // ng k mt ngun s kin tn ti s // sinh ra ngoi l System.ArgumentException. if (!EventLog.SourceExists("EventLogExample")) {

EventLog.CreateEventSource("EventLogExample","Application"); } // Ghi mt s kin vo nht k s kin. EventLog.WriteEntry( "EventLogExample", "A simple test event.", // Ngun s kin ng k // Thng ip cho s kin

EventLogEntryType.Information, // Kiu s kin 1, 0, new byte[] {10, 55, 200} ); // Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } } // ID ca s kin // Category ca s kin // D liu ca s kin

4.

Truy xut Windows Registry


Bn cn c thng tin t Registry hoc ghi thng tin vo Registry. S dng lp Microsoft.Win32.Registry ly v i tng Microsoft.Win32. RegistryKey m t mt kha mc-c-s. S dng cc thnh vin ca i tng RegistryKey duyt cy phn cp; c, sa, v to kha v gi tr.

Bn khng th truy xut trc tip cc kha v cc gi tr nm trong Registry. Trc ht bn phi thu ly i tng RegistryKey m t mt kha mc-c-s, sau duyt qua cy phn cp ca i tng ny n kha cn tm. Lp Registry hin thc by trng tnh, cc

660 Chng 17: S ha hp vi mi trng Windows

trng ny u tr v i tng RegistryKey m t kha mc-c-s. Bng 17.3 trnh by cc kha mc-c-s ng vi cc trng ny.
Bng 17.3 Cc trng tnh ca lp Registry Trng ClassesRoot CurrentConfig CurrentUser DynData LocalMachine PerformanceData Users ng vi

HKEY_CLASSES_ROOT HKEY_CURRENT_CONFIG HKEY_CURRENT_USER HKEY_DYN_DATA HKEY_LOCAL_MACHINE HKEY_PERFORMANCE_DATA HKEY_USERS

Phng thc tnh RegistryKey.OpenRemoteBaseKey cho php bn m mt kha mc-c-s trn mt my xa (xem chi tit trong ti liu .NET Framework SDK).

Mt khi c i tng RegistryKey m t kha mc-c-s, bn phi duyt qua cy phn cp n kha cn tm. h tr vic duyt cy, lp RegistryKey cung cp cc thnh vin di y: Thuc tnh SubKeyCountTr v s kha con. Phng thc GetSubKeyNamesTr v mt mng kiu chui cha tn ca tt c cc kha con. Phng thc OpenSubKeyTr v tham chiu n mt kha con. Phng thc ny c hai phin bn np chng: phng thc th nht m kha trong ch ch-c; phng thc th hai nhn mt i s kiu bool, nu l true th cho php ghi.

Mt khi c i tng RegistryKey m t kha cn tm, bn c th to, c, cp nht, hoc xa cc kha con v cc gi tr bng cc phng thc trong bng 17.4. Cc phng thc sa i ni dung ca kha i hi bn phi c i tng RegistryKey cho php ghi.
Bng 17.4 Cc phng thc ca RegistryKey dng to, c, cp nht, v xa cc kha v cc gi tr Registry Phng thc CreateSubKey M t

To mt kha mi vi tn c ch nh v tr v i tng RegistryKey cho php ghi. Nu kha tn ti, phng thc ny s tr v mt tham chiu cho php ghi n kha tn ti. Xa kha vi tn c ch nh, kha ny phi khng c kha con (nhng c th c gi tr); nu khng, ngoi l System.InvalidOperationException s b nm. Xa kha vi tn c ch nh cng vi tt c cc kha con ca n.

DeleteSubKey

DeleteSubKeyTree

661 Chng 17: S ha hp vi mi trng Windows DeleteValue

Xa mt gi tr vi tn c ch nh khi kha hin ti. Tr v gi tr vi tn c ch nh t kha hin ti. Gi tr tr v l mt i tng, bn phi p n v kiu thch hp. Dng n gin nht ca GetValue tr v null nu gi tr khng tn ti. Ngoi ra cn c mt phin bn np chng cho php ch nh gi tr tr v mc nh (thay cho null) nu gi tr khng tn ti. Tr v mng kiu chui cha tn ca tt c cc gi tr trong kha hin ti. To (hoc cp nht) gi tr vi tn c ch nh. Bn khng th ch nh kiu d liu Registry dng lu tr d liu; SetValue s t ng chn kiu da trn kiu d liu c lu tr.

GetValue

GetValueNames

SetValue

Lp RegistryKey c hin thc giao din IDisposable; bn nn gi phng thc IDisposable.Dispose gii phng cc ti nguyn ca h iu hnh khi hon tt vi i tng RegistryKey. Lp RegistryExample trong v d sau nhn mt i s dng lnh v duyt quy cy c gc l CurrentUser tm cc kha c tn trng vi i s dng lnh. Khi tm c mt kha, RegistryExample s hin th tt c cc gi tr kiu chui nm trong kha ny. Lp RegistryExample cng gi mt bin m trong kha HKEY_CURRENT_USER\ RegistryExample.
using System; using Microsoft.Win32;

public class RegistryExample {

public static void Main(String[] args) {

if (args.Length > 0) {

// M kha c s CurrentUser. using(RegistryKey root = Registry.CurrentUser) {

// Cp nht bin m. UpdateUsageCounter(root);

// Duyt quy tm kha vi tn cho trc. SearchSubKeys(root, args[0]); } }

662 Chng 17: S ha hp vi mi trng Windows

// Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); }

public static void UpdateUsageCounter(RegistryKey root) {

// To mt kha lu tr bin m, // hoc ly tham chiu n kha c. RegistryKey countKey = root.CreateSubKey("RegistryExample");

// c gi tr ca bin m hin ti, v ch nh // gi tr mc nh l 0. p i tng v kiu Int32, // v gn vo mt gi tr int. int count = (Int32)countKey.GetValue("UsageCount", 0);

// Ghi bin m c cp nht tr li Registry, // hoc to mt gi tr mi nu n cha tn ti. countKey.SetValue("UsageCount", ++count); } public static void SearchSubKeys(RegistryKey root, String searchKey) { // Lp qua tt c cc kha con trong kha hin ti. foreach (string keyname in root.GetSubKeyNames()) { try { using (RegistryKey key = root.OpenSubKey(keyname)) { if (keyname == searchKey) PrintKeyValues(key); SearchSubKeys(key, searchKey); } } catch (System.Security.SecurityException) { // B qua SecurityException vi ch nh ca v d ny. // Mt s kha con ca HKEY_CURRENT_USER c bo mt

663 Chng 17: S ha hp vi mi trng Windows // v s nm SecurityException khi c m. } } } public static void PrintKeyValues(RegistryKey key) { // Hin th tn ca kha c tm thy, // v s lng gi tr ca n. Console.WriteLine("Registry key found : {0} contains {1} values", key.Name, key.ValueCount); // Hin th cc gi tr ny. foreach (string valuename in key.GetValueNames()) { if (key.GetValue(valuename) is String) { Console.WriteLine(" Value : {0} = {1}",

valuename, key.GetValue(valuename)); } } } }

Khi c thc thi trn my chy Windows XP vi dng lnh RegistryExample Environment, v d ny s cho kt xut nh sau:
Registry key found : HKEY_CURRENT_USER\Environment contains 4 values Value : TEMP = C:\Documents and Settings\nnbphuong81\Local Settings\Temp Value : TMP = C:\Documents and Settings\nnbphuong81\Local Settings\Temp Value : LIB = C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Lib\ Value : INCLUDE = C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\include\

5.

To mt dch v Windows
Bn cn to mt ng dng ng vai tr l mt dch v Windows. To mt lp tha k t lp System.ServiceProcess.ServiceBase. S dng cc thuc tnh tha k iu khin hnh vi ca dch v, v chp cc phng

664 Chng 17: S ha hp vi mi trng Windows

thc tha k hin thc cc chc nng cn thit. Hin thc phng thc Main, trong to mt th hin ca lp dch v v truyn n cho phng thc tnh ServiceBase.Run. Nu ang s dng Microsoft Visual C# .NET, bn c th dng mu d n Windows Service to mt dch v Windows. Mu ny cung cp sn cc m lnh c bn cn cho mt lp dch v, v bn c th hin thc thm cc chc nng ty bin. to mt dch v Windows bng tay, bn phi hin thc mt lp dn xut t ServiceBase. Lp ServiceBase cung cp cc chc nng c bn cho php Windows Service Control Manager (SCM) cu hnh dch v, thi hnh dch v di nn, v iu khin thi gian sng ca dch v. SCM cng iu khin vic cc ng dng khc c th iu khin dch v nh th no.

Lp ServiceBase c nh ngha trong System.Serviceprocess, do bn phi thm mt tham chiu n assembly ny khi xy dng lp dch v.

Hnh 17.1 Mu d n Windows Service

iu khin dch v ca bn, SDM s dng by phng thc protected tha k t lp ServiceBase (xem bng 17.5). Bn cn chp cc phng thc ny hin thc cc chc nng v cch thc hot ng ca dch v. Khng phi tt c dch v u h tr tt c cc thng ip iu khin. Cc thuc tnh tha k t lp ServiceBase s bo vi SCM rng dch v ca bn h tr cc thng ip iu khin no; thuc tnh iu khin mi kiu thng ip c ghi r trong bng 17.5.
Bng 17.5 Cc phng thc dng iu khin s hot ng ca mt dch v Phng thc M t

665 Chng 17: S ha hp vi mi trng Windows

OnStart

Tt c cc dch v u phi h tr phng thc OnStart, SCM gi phng thc ny khi ng dch v. SCM truyn cho dch v mt mng kiu chui cha cc i s cn thit. Nu OnStart khng tr v trong 30 giy th SCM s khng chy dch v. c SCM gi dng mt dch vSCM ch gi OnStop nu thuc tnh CanStop l true. c SCM gi tm dng mt dch vSCM ch gi OnPause nu thuc tnh CanPauseAndContinue l true. c SCM gi tip tc mt dch v b tm dngSCM ch gi OnContinue nu thuc tnh CanPauseAndContinue l true. c SCM gi khi h thng ang ttSCM ch gi OnShutDown nu thuc tnh CanShutdown l true. c SCM gi khi trng thi ngun mc-h-thng thay i, chng hn mt laptop chuyn sang ch suspend. SCM ch gi OnPowerEvent nu thuc tnh CanHandlePowerEvent l true. Cho php m rng c ch iu khin dch v vi cc thng ip iu khin ty bin; xem chi tit trong ti liu .NET Framework SDK.

OnStop

OnPause

OnContinue

OnShutdown

OnPowerEvent

OnCustomCommand

Nh c cp trong bng 17.5, phng thc OnStart phi tr v trong vng 30 giy, do bn khng nn s dng OnStart thc hin cc thao tc khi ng tn nhiu thi gian. Mt lp dch v nn hin thc mt phng thc khi dng thc hin cc thao tc khi ng, bao gm vic cu hnh cc thuc tnh tha k t lp ServiceBase. Ngoi cc thuc tnh khai bo cc thng ip iu khin no c dch v h tr, lp ServiceBase cn hin thc ba thuc tnh quan trng khc:
ServiceNameL tn c SCM s dng nhn dng dch v, v phi c thit lp

trc khi dch v chy.


AutoLogiu khin vic dch v c t ng ghi vo nht k s kin hay khng khi

nhn thng ip iu khin OnStart, OnStop, OnPause, v OnContinue.


EventLogTr v mt i tng EventLog c cu hnh trc vi tn ngun s kin

(event source) trng vi thuc tnh ServiceName c ng k vi nht k Application (xem mc 17.3 c thm thng tin v lp EventLog). Bc cui cng trong vic to mt dch v l hin thc phng thc tnh Main. Phng thc ny phi to mt th hin ca lp dch v v truyn n cho phng thc tnh ServiceBase.Run. Nu mun chy nhiu dch v trong mt tin trnh, bn phi to mt mng cc i tng ServiceBase v truyn n cho phng thc ServiceBase.Run. Mc d cc lp dch v u c phng thc Main nhng bn khng th thc thi m lnh dch v mt cch trc tip; bn s nhn c hp thng bo nh hnh 17.2 nu trc tip chy mt lp dch v. Mc 17.6 s trnh by cch ci t dch v trc khi thc thi.

666 Chng 17: S ha hp vi mi trng Windows

Hnh 17.2 Hp thng bo Windows Service Start Failure

Lp ServiceExample trong v d di y s dng mt System.Timers.Timer ghi mt entry vo nht k s kin Windows theo nh k.
using System; using System.Timers; using System.ServiceProcess;

public class ServiceExample : ServiceBase {

// Timer iu khin khi no ServiceExample ghi vo nht k s kin. private System.Timers.Timer timer;

public ServiceExample() {

// Thit lp thuc tnh ServiceBase.ServiceName. ServiceName = "ServiceExample";

// Cu hnh cc thng ip iu khin. CanStop = true; CanPauseAndContinue = true; // Cu hnh vic ghi cc s kin quan trng vo // nht k Application. AutoLog = true; } // Phng thc s c thc thi khi Timer ht // hiu lc ghi mt entry vo nht k Application. private void WriteLogEntry(object sender, ElapsedEventArgs e) {

// S dng i tng EventLog ghi vo nht k s kin.

667 Chng 17: S ha hp vi mi trng Windows EventLog.WriteEntry("ServiceExample active : " + e.SignalTime); } protected override void OnStart(string[] args) { // Ly chu k ghi s kin t i s th nht. // Mc nh l 5000 mili-giy, // v ti thiu l 1000 mili-giy. double interval; try { interval = System.Double.Parse(args[0]); interval = Math.Max(1000, interval); } catch { interval = 5000; }

EventLog.WriteEntry(String.Format("ServiceExample starting. " + "Writing log entries every {0} milliseconds...", interval));

// To, cu hnh, v khi ng mt System.Timers.Timer // gi phng thc WriteLogEntry theo nh k. // Cc phng thc Start v Stop ca lp System.Timers.Timer // gip thc hin cc chc nng khi ng, tm dng, tip tc, // v dng dch v. timer = new Timer(); timer.Interval = interval; timer.AutoReset = true; timer.Elapsed += new ElapsedEventHandler(WriteLogEntry); timer.Start(); } protected override void OnStop() {

EventLog.WriteEntry("ServiceExample stopping..."); timer.Stop(); // Gii phng ti nguyn h thng do Timer s dng.

668 Chng 17: S ha hp vi mi trng Windows

timer.Dispose(); timer = null; } protected override void OnPause() {

if (timer != null) { EventLog.WriteEntry("ServiceExample pausing..."); timer.Stop(); } }

protected override void OnContinue() {

if (timer != null) { EventLog.WriteEntry("ServiceExample resuming..."); timer.Start(); } }

public static void Main() {

// To mt th hin ca lp ServiceExample ghi mt // entry vo nht k Application. Truyn i tng ny // cho phng thc tnh ServiceBase.Run. ServiceBase.Run(new ServiceExample()); } }

6.

To mt b ci t dch v Windows
Bn to mt ng dng dch v Windows v cn ci t n. Tha k lp System.Configuration.Install.Installer to mt lp ci t gm nhng thng tin cn thit ci t v cu hnh lp dch v ca bn. S dng cng c Installutil.exe thc hin vic ci t.

669 Chng 17: S ha hp vi mi trng Windows

Nh cp trong mc 17.5, bn khng th chy cc lp dch v mt cch trc tip. V dch v c tch hp mc cao vi h iu hnh Windows v thng tin c gi trong Registry nn dch v phi c ci t trc khi chy. Nu ang s dng Microsoft Visual Studio .NET, bn c th to mt b ci t cho dch v mt cch t ng bng cch nhp phi vo khung thit k ca lp dch v v chn Add Installer t menu ng cnh. B ci t ny c th c gi bi cc d n trin khai hoc cng c Installutil.exe ci t dch v. Bn cng c th t to mt b ci t cho dch v Windows theo cc bc sau: 1. 2. 3. To mt lp tha k t lp Installer. p dng c tnh System.ComponentModel.RunInstallerAttribute(true) cho lp ci t. Trong phng thc khi dng ca lp ci t, to mt th hin ca lp System.ServiceProcess.ServiceProcessInstaller. Thit lp cc thuc tnh Account, UserName, v Password ca i tng ServiceProcessInstaller cu hnh ti khon m dch v s chy. Cng trong phng thc khi dng ca lp ci t, to mt th hin ca lp System.ServiceProcess.ServiceInstaller cho mi dch v cn ci t. S dng cc thuc tnh ca i tng ServiceInstaller cu hnh cc thng tin v mi dch v, bao gm:
ServiceNameCh nh tn m Windows s dng nhn dng dch v. Tn

4.

ny

phi

trng

vi

gi

tr

gn

cho

thuc

tnh

ServiceBase.ServiceName. DisplayNameCh nh tn thn thin cho dch v. StartTypeS dng cc gi tr thuc kiu lit k System.ServiceProcess. ServiceStartMode iu khin vic dch v c khi ng t ng hay

bng tay, hay b v hiu. 5.


ServiceDependsUponly mt mng kiu chui cha tn cc dch v phi

c chy trc khi dch v hin hnh chy. S dng thuc tnh Installers tha k t lp c s Installer ly mt i tng System.Configuration.Install.InstallerCollection. Thm cc i tng ServiceProcessInstaller v tt c cc i tng ServiceInstaller vo tp hp ny.

Lp ServiceInstallerExample di y l mt b ci t cho lp ServiceExample trong mc 17.5. D n mu cho mc ny cha c hai lp ServiceExample v ServiceInstallerExample, v to ra file thc thi ServiceInstallerExample.exe.
using System.ServiceProcess; using System.Configuration.Install; using System.ComponentModel;

[RunInstaller(true)] public class ServiceInstallerExample : Installer {

670 Chng 17: S ha hp vi mi trng Windows

public ServiceInstallerExample() {

// To v cu hnh i tng ServiceProcessInstaller. ServiceProcessInstaller ServiceExampleProcess = new ServiceProcessInstaller(); ServiceExampleProcess.Account = ServiceAccount.LocalSystem;

// To v cu hnh i tng ServiceInstaller. ServiceInstaller ServiceExampleInstaller = new ServiceInstaller(); ServiceExampleInstaller.DisplayName = "C# Service Example"; ServiceExampleInstaller.ServiceName = "ServiceExample"; ServiceExampleInstaller.StartType = ServiceStartMode.Automatic;

// Thm i tng ServiceProcessInstaller v ServiceInstaller // vo tp hp Installers (tha k t lp c s Installer). Installers.Add(ServiceExampleInstaller); Installers.Add(ServiceExampleProcess); } }

ci t ServiceExample, bn cn to dng d n, chuyn n th mc cha file ServiceInstallerExample.exe (mc nh l bin\debug), ri thc thi lnh Installutil ServiceInstallerExample.exe. Sau , bn c th s dng Windows Computer Management xem v iu khin dch v. Mc d StartType c ch nh l Automatic, dch v ny vn khng c khi ng sau khi ci t. Bn phi khi ng dch v bng tay (hoc khi ng li my) trc khi dch v ghi cc entry vo nht k s kin. Mt khi dch v chy, bn c th xem cc entry m n ghi vo nht k Application bng Event Viewer. g b ServiceExample, bn hy thc thi lnh Installutil /u ServiceInstallerExample.exe.

671 Chng 17: S ha hp vi mi trng Windows

Hnh 17.3 Windows Computer Management

7.

To shortcut trn Desktop hay trong Start menu


Bn cn to mt shortcut trn Desktop hay trong Start menu ca ngi dng.

672 Chng 17: S ha hp vi mi trng Windows

S dng COM Interop truy xut cc chc nng ca Windows Script Host. To v cu hnh mt th hin IWshShortcut tng ng vi shortcut. Th mc cha shortcut s xc nh shortcut xut hin trn Desktop hay trong Start menu.

Th vin lp .NET Framework khng c chc nng to shortcut trn Desktop hay trong Start menu; tuy nhin, vic ny c th c thc hin d dng bng thnh phn Windows Script Host (c truy xut thng qua COM Interop). Cch to Interop Assembly truy xut mt thnh phn COM c trnh by trong mc 15.6. Nu ang s dng Visual Studio .NET, bn hy thm mt tham chiu n Windows Script Host Object Model (c lit k trong th COM ca hp thoi Add Reference). Nu khng c Visual Studio .NET, bn hy s dng cng c Type Library Importer (Tlbimp.exe) to mt Interop Assembly cho file wshom.ocx (file ny thng nm trong th mc Windows\System32). Bn c th ly phin bn mi nht ca Windows Script Host ti [http://msdn.microsoft.com/scripting].

Hnh 17.4 Chn Windows Script Host Object Model trong hp thoi Add Reference

Mt khi to v nhp Interop Assembly vo d n, bn hy thc hin cc bc sau: 1. 2. To mt i tng WshShell truy xut vo Windows shell. S dng thuc tnh SpecialFolders ca i tng WshShell xc nh ng dn n th mc s cha shortcut. Tn ca th mc ng vai tr l index i vi thuc tnh SpecialFolders. V d, ch nh gi tr Desktop to shortcut trn Desktop, v ch nh gi tr StartMenu to shortcut trong Start menu. Thuc tnh SpecialFolders cn

673 Chng 17: S ha hp vi mi trng Windows

c th c s dng ly ng dn n mi th mc c bit ca h thng; cc gi tr thng dng khc l AllUsersDesktop v AllUsersStartMenu. 3. Gi phng thc CreateShortcut ca i tng WshShell, v truyn ng dn y ca file shortcut cn to (c phn m rng l .lnk). Phng thc ny s tr v mt th hin IWshShortcut. S dng cc thuc tnh ca th hin IWshShortcut cu hnh shortcut. V d, bn c th cu hnh file thc thi c shortcut tham chiu, biu tng dng cho shortcut, li m t, v phm nng. Gi phng thc Save ca th hin IWshShortcut ghi shortcut vo a. Shortcut s nm trn Desktop hay trong Start menu (hay mt ni no khc) ty vo ng dn c ch nh khi to th hin IWshShortcut.

4.

5.

Lp ShortcutExample trong v d di y to shortcut cho Notepad.exe trn Desktop v trong Start menu ca ngi dng hin hnh. ShortcutExample to hai shortcut ny bng phng thc CreateShortcut v ch nh hai th mc khc nhau cho file shortcut. Cch ny gip bn to file shortcut trong bt k th mc c bit no c tr v t thuc tnh WshShell.SpecialFolders.
using System; using IWshRuntimeLibrary;

public class ShortcutExample { public static void Main() { // To shortcut cho Notepad trn Desktop. CreateShortcut("Desktop");

// To shortcut cho Notepad trong Start menu. CreateShortcut("StartMenu");

// Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } public static void CreateShortcut(string destination) {

// To mt i tng WshShell truy xut // cc chc nng ca Windows shell. WshShell wshShell = new WshShell();

674 Chng 17: S ha hp vi mi trng Windows

// Ly ng dn s cha file Notepad.lnk. Bn c th // s dng phng thc System.Environment.GetFolderPath // ly ng dn, nhng s dng WshShell.SpecialFolders // s truy xut c nhiu th mc hn. Bn cn to mt // i tng tm tham chiu n chui destination // tha mn yu cu ca phng thc Item. object destFolder = (object)destination; string fileName = (string)wshShell.SpecialFolders.Item(ref destFolder) + @"\Notepad.lnk";

// To i tng shortcut. Tuy nhin, chng c g c // to ra trong th mc cho n khi shortcut c lu. IWshShortcut shortcut = (IWshShortcut)wshShell.CreateShortcut(fileName);

// Cu hnh ng dn file thc thi. // S dng lp Environment cho n gin. shortcut.TargetPath = Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\notepad.exe"; // Thit lp th mc lm vic l Personal (My Documents). shortcut.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);

// Cung cp li m t cho shortcut. shortcut.Description = "Notepad Text Editor";

// Gn phm nng cho shortcut. shortcut.Hotkey = "CTRL+ALT+N";

// Cu hnh ca s Notepad lun phng to khi khi ng. shortcut.WindowStyle = 3;

675 Chng 17: S ha hp vi mi trng Windows // Cu hnh shortcut hin th icon u tin trong notepad.exe. shortcut.IconLocation = "notepad.exe, 0";

// Lu file shortcut. shortcut.Save(); } }

676

PH LC A MT S CNG C .NET
GII THIU

P
PH LC A: GII THIU MT S CNG C .NET

hn ph lc ny gii thiu mt s cng c nh (hu ht l min ph) nhng rt tt cho cc nh pht trin .NET, trong c nhng cng c gip pht trin ng dng nhanh hn v c nhng cng c c th lm thay i cch thc vit m lnh ca bn.

Bin dch cc on m ngn vi Snippet Compiler Xy dng biu thc chnh quy vi Regulator Sinh m vi CodeSmith Vit kim th n v vi NUnit Kim sot m lnh vi FxCop Kho st assembly vi .NET Reflector Lp ti liu m lnh vi NDoc To dng gii php vi NAnt Cc cng c chuyn i: ASP.NET Version Switcher, Visual Studio .NET Project Converter, VB.NET to C# Converter, v Convert C# to VB.NET

Xy dng website qun tr c s d liu vi ASP.NET Maker 1.1


A.1 Bin dch cc on m ngn vi Snippet Compiler Snippet Compiler l mt ng dng nh dng vit, bin dch, v chy m lnh. Cng c ny hu ch khi bn c nhng on m ngn v bn khng mun phi to ton b d n Visual Studio .NET (cng vi cc file i km) cho chng. Ly v d, gi s bn mun chy mt ng dng no t Microsoft .NET Framework. Trong Snippet Compiler, bn hy to mt ng dng Console mi. Phn m lnh c th c to bn trong phng thc Main ca ng dng ny. on m di y trnh by cch to mt th hin ca Notepad t .NET Framework:
using System; using System.Collections;

677 Ph lc A: Gii thiu mt s cng c .NET

public class MyClass { public static void Main() { System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo.FileName= "notepad.exe"; proc.Start(); proc.WaitForExit(); } }

Hnh A-1 Snippet Compiler

Hnh A-1 cho thy on m ny trong Snippet Compiler. th nghim on m ny, bn ch vic nhn nt Play (hnh tam gic xanh), v n s chy ch g ri. on m ny s sinh ra mt ca s pop-up (ng dng Console), v Notepad s xut hin. Khi bn ng Notepad, ng dng Console cng s ng.

678 Ph lc A: Gii thiu mt s cng c .NET

Snippet Compiler c vit bi Jeff Key v c th c download ti [http://www.sliver.com/dotnet/SnippetCompiler].

A.2 Xy dng biu thc chnh quy vi Regulator Regulator l mt cng c vi y tnh nng dng xy dng v kim tra cc biu thc chnh quy. Biu thc chnh quy c s dng nh ngha cc mu trong nhng chui da trn k t, tn s xut hin, v th t k t. Chng thng c s dng nhiu nht lm phng tin xc nhn tnh tnh hp l ca u vo do ngi dng cung cp hoc tm mt chui k t bn trong mt chui ln hnchng hn, khi tm kim mt a ch URL hay email trn mt trang web. Regulator cho php bn nhp mt biu thc chnh quy v mt u vo no (bn s chy biu thc chnh quy da trn u vo ny). Bng cch ny, bn c th thy cch thc lm vic ca biu thc chnh quy v kt qu tr v trc khi hin thc n trong ng dng ca mnh. Hnh A-2 cho thy Regulator vi mt biu thc chnh quy n gin.

Hnh A-2 Regulator vi mt biu thc chnh quy n gin

Phn document cha biu thc chnh quy, trong v d ny l [0-9]*, biu thc ny trng khp vi bt k dy ch s no. Hp pha di phi cha u vo cho biu thc chnh quy, v hp pha di tri hin th nhng trng khp m biu thc chnh quy tm thy bn trong cc u vo. Vit v kim tra cc biu thc chnh quy trong mt ng dng c lp nh th ny th d hn nhiu so vi thao tc chng trong ng dng ca bn. Mt trong nhng tnh nng hay nht ca Regulator l kh nng tm kim th vin biu thc chnh quy trc tuyn ti [http://regexlib.com]. V d, nu nhp chui "phone" vo hp tm

679 Ph lc A: Gii thiu mt s cng c .NET

kim, bn s tm thy hn 20 biu thc chnh quy khc nhau trng khp vi cc s in thoi, bao gm cc biu thc cho Anh, c, v nhiu s in thoi khc.

Regulator c vit bi Roy Osherove v c th c download ti [http://regex.osherove.com].

A.3 Sinh m vi CodeSmith CodeSmith l mt cng c sinh m da-trn-template (khun mu), s dng mt c php tng t nh ASP.NET kt sinh bt k kiu m hay text no. Khc vi nhiu cng c sinh m khc, CodeSmith khng yu cu bn m t mt bn thit k hay kin trc ng dng c th. Khi s dng CodeSmith, bn c th kt sinh mi th, t mt tp hp n gin, c-nhkiu-mnh n ton b mt ng dng. Khi xy dng mt ng dng, bn thng phi lp i lp li nhng tc v no , chng hn vit m truy xut d liu hay xy dng cc tp hp ty bin. CodeSmith c bit hu ch trong nhng tnh hung nh vy, v bn c th vit cc template t ng ha cc tc v ny, iu ny khng ch ci thin hiu nng m cn gip bn bt nhm chn. CodeSmith c sn mt s template, bao gm nhng template cho tt c cc kiu tp hp .NET cng nh nhng template sinh th tc tn tr, nhng sc mnh thc s ca cng c ny chnh l kh nng to cc template ty bin. Template ca CodeSmith ch l file vn bn n thun (c th c to bng cng c son tho vn bn bt k), vi phn m rng l .cst. Template c gii thiu di y s nhn mt chui v ri xy dng mt lp da vo chui . Bc u tin l vit phn header, phn ny khai bo ngn ng ca template, ngn ng ch, v m t vn tt v template:
<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Car Template" %>

Phn k tip ca template l cc khai bo thuc tnh, cc thuc tnh ny s c ch nh mi khi template chy. V d di y khai bo mt thuc tnh chui:
<%@ Property Name="ClassName" Type="String" Category="Context" Description="Class Name" %>

Khai bo ny s lm cho thuc tnh ClassName xut hin trong ca s thuc tnh ca CodeSmith n c th c ch nh khi template chy. Bc tip theo l xy dng phn thn ca template (vi m lnh tng t nh ASP.NET). Nh bn c th thy, template ny nhn chui nhp v sinh ra mt lp vi tn . Trong phn thn ca template, cc th ng v m c s dng nh trong ASP.NET. Trong template ny, ta ch chn gi tr thuc tnh, nhng cng c th s dng bt k kiu m .NET no bn trong cc th ny.
public sealed class <%= ClassName %> { private static volatile <%= ClassName %> _instance; private <%= ClassName %>() {}

680 Ph lc A: Gii thiu mt s cng c .NET

private static readonly object _syncRoot = new object();

public static <%= ClassName %> Value { get { if (_instance == null) { lock(_syncRoot) { if (_instance == null) { _instance = new <%= ClassName %>(); } } } return _instance; } } }

Mt khi template hon tt, bn hy np n vo CodeSmith (xem hnh A-3). Bn c th nhn thy thuc tnh pha bn tri l thuc tnh m chng ta khai bo trong template. Nu bn nhp SingletonClass lm tn lp v nhp nt Generate, CodeSmith s sinh ra lp di y:
public sealed class SingletonClass { private static volatile SingletonClass _instance; private SingletonClass() {} private static readonly object _syncRoot = new object();

public static SingletonClass Value { get { if (_instance == null) {

681 Ph lc A: Gii thiu mt s cng c .NET lock(_syncRoot) { if (_instance == null) { _instance = new SingletonClass(); } } } return _instance; } } }

Hnh A-3 Np template vo CodeSmith

CodeSmith tng i d s dng v c th sinh ra nhng kt qu tuyt vi nu c p dng mt cch ng n. Mt trong nhng phn ph bin nht cn c sinh m l tng truy xut d liu. CodeSmith c mt assembly c bit vi tn l SchemaExplorer, assembly ny c th c s dng sinh ra cc template t bng, th tc tn tr, hay hu nh bt k i tng SQL Server no khc.

CodeSmith c vit bi Eric J. Smith v c th c download (bn dng th) ti [http://www.ericjsmith.net/codesmith/download.aspx].

A.4 Vit kim th n v vi NUnit NUnit l b khung kim th n v c xy dng cho .NET Framework, cho php bn vit cc phng thc kim th theo ngn ng do bn chn kim tra mt hm c th ca chng

682 Ph lc A: Gii thiu mt s cng c .NET

trnh. ng dng NUnit cung cp mt b khung vit cc kim th n v, cng nh mt giao din ha chy cc kim th n v v xem kt qu. V d, chng ta cn kim tra chc nng ca lp Hashtable trong .NET Framework xc nh hai i tng c th c thm vo v ly ra hay khng. Bc u tin l tham chiu n assembly NUnit.Framework c th truy xut cc thuc tnh v phng thc ca b khung NUnit. Bc k tip l to mt lp v nh du n vi c tnh [TestFixture] NUnit bit lp ny c cha phng thc kim th.
using System; using System.Collections; using NUnit.Framework;

namespace NUnitExample { [TestFixture] public class HashtableTest { public HashtableTest() {

} } }

K tip, chng ta to mt phng thc v nh du n vi c tnh [Test] NUnit bit y l phng thc kim th. Trong phng thc ny, chng ta s thit lp mt Hashtable v a vo hai gi tr, sau s dng phng thc Assert.AreEqual xem chng ta c th thu ly ng cc gi tr m chng ta a vo Hashtable hay khng:
[Test] public void HashtableAddTest() { Hashtable ht = new Hashtable();

ht.Add("Key1", "Value1"); ht.Add("Key2", "Value2");

Assert.AreEqual("Value1", ht["Key1"], "Wrong object returned!"); Assert.AreEqual("Value2", ht["Key2"], "Wrong object returned!"); }

chy phng thc kim th ny, bn cn to mt d n NUnit, m assembly c sinh ra bn trn v nhp nt Run. Hnh A-4 cho thy kt qu.

683 Ph lc A: Gii thiu mt s cng c .NET

Trn y ch l mt kim th n gin, nhng cho thy kh nng ca NUnit. C rt nhiu kiu kim th, cng nh nhiu phng thc Assert, c th c s dng kim th mi phn trong m lnh ca bn. Mt kim th n v c th lu v chy li mi khi bn sa i m lnh, iu ny gip bn pht hin li d dng hn v m bo pht trin ng dng tt hn.

NUnit l mt d n m ngun m v c th c download ti [http://www.nunit.org].

Hnh A-4 NUnit

Cng c mt bn add-in ca NUnit cho Visual Studio .NET, add-in ny cho php bn trc tip chy cc phng thc kim th n v t Visual Studio .NET (c th c download ti [http://sourceforge.net/projects/nunitaddin]). c thm thng tin v NUnit v v tr ca n trong vic pht trin test-driven (vn hnh theo kim th), bn hy xem bi vit Test-Driven C#: Improve the Design and Flexibility of Your Project with Extreme Programming Techniques trong a CD nh km. A.5 Kim sot m lnh vi FxCop .NET Framework rt mnh, c ngha kh nng to ra nhng ng dng tuyt vi l rt cao, nhng kh nng to ra nhng chng trnh ti cng l rt cao. FxCop l mt trong nhng cng c c th c s dng tr gip to ra nhng ng dng tt hn bng vic cho php bn kho st mt assembly v kim tra tnh tng thch ca n vi mt s quy lut. FxCop cha tp cc quy lut do Microsoft to ra, nhng bn cng c th to ra nhng quy lut cho mnh. Chng hn, nu mun tt c cc lp u c mt phng thc khi dng mc nh khng i s, bn c th vit mt quy lut kim tra phng thc khi dng trn mi lp ca assembly. c thm thng tin v vic to nhng quy lut ty bin, bn hy vo [http://msdn.microsoft.com/msdnmag/issues/04/06/bugslayer]. V d, chng ta hy xem FxCop pht hin ra li g trong assembly NUnitExample ( c trnh by mc A.4). Trc tin, bn cn to mt d n FxCop v a assembly ny vo. Sau

684 Ph lc A: Gii thiu mt s cng c .NET

, bn hy nhn Analyze, FxCop s kho st assembly ny v a ra cc thng bo li (xem hnh A-5). FxCop nhn thy mt s vn vi assembly ny. Bn c th nhp p ln mt li xem chi tit, bao gm li m t quy lut v ni m bn c th tm thy nhiu thng tin hn. FxCop c th gip bn to m lnh tt hn, nht qun hn, nhng n khng th sa cha vic thit k ti hay lp trnh km. FxCop cng khng phi l mt s thay th cho vic kim tra m lnh (code review), nhng v n c th bt nhiu li trc khi kim tra m lnh nn bn c th dnh nhiu thi gian cho cc vn h trng hn l phi lo lng v cc quy c t tn.

Hnh A-5 FxCop a ra cc thng bo khi kho st NUnitExample

FxCop c pht trin bi Microsoft v c th c download ti [http://www.gotdotnet.com/team/fxcop].

A.6 Kho st assembly vi .NET Reflector .NET Reflector l mt trnh duyt lp (class browser) v trnh dch ngc (decompiler), n c th kho st mt assembly v cho bn thy tt c cc b mt trong . .NET Framework a ra c ch phn chiu (reflection) kho st bt k m lnh no da-trn-.NET, cho d n l mt lp n hay ton b mt assembly. C ch phn chiu cng c th c s dng thu ly thng tin v cc lp, phng thc, v thuc tnh khc nhau trong mt assembly no . S

685 Ph lc A: Gii thiu mt s cng c .NET

dng .NET Reflector, bn c th duyt cc lp v cc phng thc ca mt assembly, bn c th kho st ngn ng trung gian (Microsoft Intermediate Language MSIL) do cc lp v phng thc ny sinh ra, v bn c th dch ngc cc lp v phng thc sang C# hay Visual Basic .NET. V d, chng ta s s dng .NET Reflector kho st assembly NUnitExample ( c trnh by mc A.4). Hnh A-6 th hin assembly ny khi c np vo .NET Reflector. Bn trong .NET Reflector cn c nhng cng c m bn c th s dng kho st thm assembly ny. xem MSIL ca mt phng thc, bn hy nhp vo phng thc ny v chn Disassembler. Ngoi vic xem MSIL, bn cng c th xem phng thc dng C# bng cch chn Decompiler t trnh n Tools. Bn cng c th xem phng thc ny c dch ngc sang Visual Basic .NET hay Delphi bng cch thay i ty chn trong trnh n Languages. Di y l on m do .NET Reflector sinh ra:
public void HashtableAddTest() { Hashtable hashtable1 = new Hashtable(); hashtable1.Add("Key1", "Value1"); hashtable1.Add("Key2", "Value2"); Assert.AreEqual("Value1", hashtable1["Key1"], "Wrong object returned!"); Assert.AreEqual("Value2", hashtable1["Key2"], "Wrong object returned!"); }

686 Ph lc A: Gii thiu mt s cng c .NET

Hnh A-6 Kho st NUnitExample vi .NET Reflector

on m trn rt ging vi on m m chng ta vit:


public void HashtableAddTest() { Hashtable ht = new Hashtable();

ht.Add("Key1", "Value1"); ht.Add("Key2", "Value2");

Assert.AreEqual("Value1", ht["Key1"],"Wrong object returned!"); Assert.AreEqual("Value2", ht["Key2"],"Wrong object returned!"); }

Mc d c mt vi khc bit nh v m lnh nhng chng ging ht nhau v chc nng. Cng dng hay nht ca .NET Reflector l kho st cc assembly v phng thc ca .NET Framework. .NET Framework cung cp nhiu cch khc nhau thc hin cc thao tc tng t nhau. V d, nu bn cn c mt tp d liu t XML, c nhiu cch khc nhau thc hin iu ny: s dng XmlDocument, XPathNavigator, hay XmlReader. Bng cch s dng .NET Reflector, bn c th xem Microsoft s dng g khi vit phng thc ReadXml ca DataSet, hoc h lm g khi c d liu t file cu hnh. .NET Reflector cng rt c ch khi tm hiu cch to cc i tng nh HttpHandlers; v qua , bn bit c cch thc m nhm pht trin ca Microsoft xy dng cc i tng trong Framework.

.NET Reflector c vit bi Lutz Roeder v c th c download ti [http://www.aisto.com/roeder/dotnet].

A.7 Lp ti liu m lnh vi NDoc Vic lp ti liu m lnh gn nh l mt cng vic khng my hng th. y khng ni v ti liu thit k m l ti liu cho tng phng thc v thuc tnh ca lp. Cng c NDoc s s t ng sinh ti liu cho m lnh ca bn bng cch s dng c ch phn chiu kho st assembly v s dng file XML c sinh t cc ch thch XML C# (cc ch thch XML ch c hiu lc cho C#, nhng c mt Visual Studio .NET Power Toy vi tn l VBCommenter cng s thc hin ging nh vy i vi Visual Basic .NET). Vi NDoc, bn vn c lp ti liu cho m lnh, nhng lp khi vit m (trong cc ch thch XML). Bc u tin khi s dng NDoc l m chc nng sinh ch thch XML i vi assembly ca bn. Nhp phi vo d n v chn Properties | Configuration Properties | Build, ri nhp mt ng dn lu file XML trong ty chn XML Documentation File (xem hnh A-7). Khi d n c to dng, mt file XML s c sinh ra vi tt c cc ch thch XML i km.

687 Ph lc A: Gii thiu mt s cng c .NET

Hnh A-7 Chn ng dn lu ti liu XML

Di y l phng thc mc A.4:


/// <summary> /// This test adds a number of values to the Hashtable collection /// and then retrieves those values and checks if they match. /// </summary> [Test] public void HashtableAddTest() { // Phn thn phng thc y. }

Phn ch thch XML cho phng thc ny s c trch xut v lu thnh file XML nh sau:
<?xml version="1.0" ?> <doc> <assembly> <name>NUnitExample</name> </assembly> <members> <member name="M:NUnitExample.HashtableTest.HashtableAddTest"> <summary>This test adds a number of values to the Hashtable collection and then retrieves those values and checks if they match.

688 Ph lc A: Gii thiu mt s cng c .NET

</summary> </member> </members> </doc>

Bc k tip l np assembly v file XML vo NDoc. Sau , nhp nt Build Documentation chy qu trnh sinh ti liu (xem hnh A-8). Hnh A-9 l ti liu CHM do NDoc sinh ra.

Hnh A-8 NDoc

689 Ph lc A: Gii thiu mt s cng c .NET

Hnh A-9 Ti liu CHM do NDoc sinh ra

NDoc l mt d n m ngun m v c th c download ti [http://ndoc.sourceforge.net].

A.8 To dng gii php vi NAnt NAnt l mt cng c to dng da-trn-.NET, gip bn vit mt quy trnh to dng d n cho mnh. Khi c nhiu nh pht trin cng lm vic trn mt d n, bn khng th ph thc vic to dng cho tng ngi. Bn cng khng mun phi thng xuyn to dng d n mt cch th cng. Thay vo , bn vit mt quy trnh to dng t ng chy mi m. NAnt cho php bn to dng gii php, chp file, chy cc kim tra NUnit, gi e-mail, v nhiu na. ng tic, NAnt thiu giao din ha, nhng n c mt ng dng Console v cc file XML ch nh cc tc v no s c hon thnh trong qu trnh to dng. Lu rng MSBuild, mt nn to dng mi trong trong phin bn Visual Studio 2005, cng c tnh nng tng t nh NAnt. V d, chng ta cn vit file to dng NAnt cho d n NUnitExample mc A.4. Trc tin, bn hy to mt file XML vi phn m rng l .build, v t n trong th mc gc ca d n:
<?xml version="1.0"?> <project name="NUnit Example" default="build" basedir="."> <description>The NUnit Example Project</description> <property name="debug" value="true"/> <target name="build" description="compiles the source code"> <csc target="library" output=".\bin\debug\NUnitExample.dll" debug="${debug}"> <references> <includes name="C:\Program Files\NUnit 2.2\bin \NUnit.Framework.dll" /> </references> <sources> <includes name="NUnitExample.cs"/>

690 Ph lc A: Gii thiu mt s cng c .NET

</sources> </csc> </target> </project>

Th project c s dng t tn cho d n, target mc nh, v th mc c s. Th ny cn c nhng th con sau: Th description c s dng t mt m t ngn gn v d n. Th property c s dng lu tr mt thit lp sao cho n c th c truy xut t bt c u trong file to dng. V d ny to mt thuc tnh vi tn l debug, v thit lp n l true hay false ty vo bn c mun d n c bin dch cu hnh g ri hay khng (thuc tnh ny khng nh hng g n cch thc to dng d n; n ch l mt bin s m bn c th thit lp v s c thu v khi bn tht s xc nh cch thc to dng d n). K tip l th target. Mt d n c th c nhiu target (c th c ch nh khi NAnt chy). Nu khng c target no c ch nh, target mc nh s c s dng (ta thit lp n trong th project). Trong v d ny, target mc nh l build. Bn trong th target, bn cn thit lp tn ca target v m t nhng g m target ny s thc hin. Th csc c s dng ch nh nhng g s c truyn cho trnh bin dch C#. Trc tin, bn phi thit lp target cho th csc. Do cn to file .dll nn v d ny thit lp target l library. K tip, bn phi thit lp output cho th csc, y l ni m file .dll s c to. Cui cng, bn cn thit lp thuc tnh debug, cho bit d n c c bin dch ch g ri hay khng. V to mt thuc tnh trc lu tr gi tr ny, ta c th s dng chui ${debug} truy xut gi tr ca thuc tnh. Th csc cng cn c cc th con: th references cho bit nhng assembly no cn c tham chiu; v th sources cho bit nhng file no i km. V d ny tham chiu n assembly NUnit.Framework.dll v cha file NUnitExample.cs. to dng, bn cn n th mc gc ca d n v thc thi NAnt.exe (xem hnh A-10). Nu to dng thnh cng, bn c th tm thy file cc .dll v .pdb trong th mc bin ca d n.

691 Ph lc A: Gii thiu mt s cng c .NET

Hnh A-10 Thc thi Nant.exe ti th mc gc ca d n

Tuy khng d dng nh vic nhp Build trong Visual Studio, nhng NAnt l mt cng c rt mnh khi xy dng quy trnh to dng chy t ng theo lch biu. NAnt cng c cc tnh nng hu ch nh chy cc kim th n v hay chp cc file i km (cc tnh nng ny khng c quy trnh to dng ca Visual Studio 2003 h tr).

NAnt l mt d n m ngun m v c th c download ti [http://sourceforge.net/projects/nant].

A.9 Chuyn i phin bn ASP.NET vi ASP.NET Version Switcher Khi th l mt yu cu, IIS xem phn m rng ca file c yu cu; v ri da vo cc nh x phn m rng (extension mapping) cho th mc o hay website, n y nhim yu cu cho mt phn m rng ISAPI hoc t th l n. y l cch ASP.NET lm vic; cc nh x phn m rng c ng k cho tt c cc phn m rng ASP.NET v hng chng n aspnet_isapi.dll. Khi bn ci t ASP.NET 1.1, nh x phn m rng c nng cp sang phin bn mi ca aspnet_isapi.dll. iu ny gy ra li khi mt ng dng c to dng trn ASP.NET 1.0 li chy trn phin bn 1.1. gii quyt vn ny, bn c th chuyn tt c cc nh x phn m rng tr v phin bn 1.0 ca aspnet_isapi.dll, nhng vi 18 nh x phn m rng th qu l vt v nu lm th cng. y chnh l ni ASP.NET Version Switcher tr nn hu dng. Tin ch nh ny c th c s dng chuyn phin bn .NET Framework ca bt k ng dng ASP.NET no. S dng cng c ny rt n gin: bn hy chn mt ng dng v ri chn phin bn .NET Framework m bn mun ng dng ny s dng (xem hnh A-11). Sau , cng c ny s s dng tin ch dng lnh aspnet_regiis.exe chuyn ng dng v phin bn .NET Framework c chn. Cng c ny cng hu ch khi c thm cc phin bn ASP.NET v .NET Framework mi trong tng lai.

692 Ph lc A: Gii thiu mt s cng c .NET

Hnh A-11 ASP.NET Version Switcher

ASP.NET Version Switcher c vit bi Denis Bauer v c th c download ti [http://www.denisbauer.com/NETTools/ASPNETVersionSwitcher.aspx].

A.10 Chuyn i phin bn d n vi Visual Studio .NET Project Converter Visual Studio .NET Project Converter (xem hnh A-12) c s dng chuyn i phin bn ca mt file d n Visual Studio. Mc d ch c mt t khc bit gia phin bn 1.0 v 1.1 ca .NET Framework, nhng mt khi file d n c chuyn t Visual Studio .NET 2002 sang Visual Studio .NET 2003 th khng th chuyn ngc li. i khi vic chuyn ngc li cn thit. Cng c ny c th chuyn bt k file gii php hay d n no t Visual Studio 7.1 (Visual Studio .NET 2003) v Visual Studio 7.0 (Visual Studio .NET 2002), v ngc li.

Hnh A-12 Visual Studio .NET Project Converter

693 Ph lc A: Gii thiu mt s cng c .NET

Visual Studio .NET Project Converter c vit bi Dacris Software v c th c download ti [http://www.codeproject.com/macro/vsconvert.asp].

A.11 Chuyn m ngun VB.NET sang C# vi VB.NET to C# Converter VB.NET to C# Converter c s dng chuyn ton b mt d n VB.NET sang d n C#. Chng trnh ny c th chuyn c mt s im m cc chng trnh khc khng thc hin c; chng hn nh cc lnh ReDim, cc bin dng chung cc b, c ch th l s kin, cc lnh Case phc tp, cc li gi API
[

Hnh A-13 VB.NET to C# Converter


[

VB.NET to C# Converter l trnh chuyn i m ngun sang m ngun. Sau khi chuyn i, m lnh ca bn vn gi li tnh d c vn c (bao gm cc tn bin v cc ch thch). Tnh tin cy ca chng trnh cng rt cao, chnh xc trn 99% trong hu ht cc ln th nghim.

VB.NET to C# Converter c pht trin bi VBConversions v c th c download (bn dng th) ti [http://www.vbconversions.com].

A.12 Chuyn m ngun C# sang VB.NET vi Convert C# to VB.NET Ngc vi VB.NET to C# Converter, Convert C# to VB.NET c s dng chuyn m ngun C# sang VB.NET.

694 Ph lc A: Gii thiu mt s cng c .NET

Hnh A-14 Convert C# to VB.NET

Convert C# to VB.NET c vit bi Kamal Patel v c th c download ti [http://www.kamalpatel.net].

A.13 Xy dng website qun tr c s d liu vi ASP.NET Maker 1.1 ASP.NET Maker l mt b sinh m rt mnh nhng li rt d s dng, gip bn nhanh chng to cc trang qun tr ASP.NET (ngn ng C# hay VB.NET) t mt ngun d liu (cc c s d liu c h tr: Microsoft Access, Microsoft SQL Server, Oracle, bt k c s d liu no vi kt ni ADO hay ODBC). ASP.NET Maker c trang b rt nhiu tnh nng hu ch nh khung nhn drill-down, c ch bo mt cao cp, tch hp vi CSS v Visual Studio .NET Gi s bn cn xy dng mt website dng cho qun tr c s d liu pubs (trong SQL Server). Di y l cc bc c bn: Trc tin, vo th Database, nh du chn Connection String v nhp chui Provider=SQLOLEDB;Initial Catalog=pubs;Data Source=127.0.0.1; User

695 Ph lc A: Gii thiu mt s cng c .NET

ID=sa;Password=sa (khng c du ngoc kp), ri nhp nt Connect. Danh sch cc bng v khung nhn s c np v hin th pha tri (xem hnh A-15). Khi , bn c th ty chnh mi trng trong cc bng v khung nhn sao cho ph hp.

Hnh A-15 Np c s d liu pubs vo ASP.NET Maker

K tip, vo th ASP.NET, ri vo th .NET Specific Options, chn phin bn .NET Framework v ngn ng (VB.NET hay C#).

Hnh A-16 Th ASP.NET | .NET Specific Options

696 Ph lc A: Gii thiu mt s cng c .NET

K tip, vo th Security, nh du chn Administrator Login, nhp Login Name v Password. y l ti khon qun tr (s c vit m cng).

Hnh A-17 Th Security

Cui cng, vo th Generate v nhp nt Generate. Sau khi xy dng thnh cng, bn hy vo http://localhost/pubs xem kt qu.

Hnh A-18 Th Generate

ASP.NET Maker c pht trin bi e.World v c th c download (bn dng th) ti [http://www.hkvstore.com].

697

PH LC B: THUT NG ANH - VIT

PH LC B
THUT NG

ANH VIT
Absolute [adj].................................................................................................. Tuyt i Abstract [adj]................................................................................................ Tru tng Access [v]........................................................................................................ Truy xut Access modifier............................................................. T kha thay i tm truy xut Accessibility..................................................................................... Kh nng truy xut Account........................................................................................................... Ti khon ACL [Access Control List]............................................ Danh sch iu khin truy xut Administrator........................................................................................... Ngi qun tr Aggregate function..................................................................................... Hm tp hp Algorithm........................................................................................................ Gii thut API [Application Programming Interface]........................Giao din lp trnh ng dng Application...................................................................................................... ng dng Application domain................................................................................ Min ng dng Argument.............................................................................................................. i s Arithmetic............................................................................................................ S hc Array...................................................................................................................... Mng Assembly...................................................................................................... Gi kt hp Asymmetric [adj]........................................................................................Bt i xng Asynchronous [adj]..................................................................................... Bt ng b Attribute............................................................................................................. c tnh Authentication.............................................................................................. S xc thc Authorization........................................................................................... S phn quyn Availability.............................................................................................. Tnh kh dng Binary............................................................................................................... Nh phn Block....................................................................................................................... Khi Bound........................................................................................................................ Cn Boundary................................................................................... ng bin / Ranh gii Breakpoint..................................................................................................... im dng

698 Ph lc B: Thut ng Anh - Vit

Browser.........................................................................................................Trnh duyt Buffer.................................................................................................................. B m Built-in [adj]......................................................................................................... Ni ti Cache...................................................................................Kho cha (truy xut nhanh) Caching.................................................................................................... C ch lu gi CAS [Code Access Security]................................................ Bo mt truy xut m lnh Certificate....................................................................................................... Chng ch Channel................................................................................................................... Knh Character................................................................................................................ K t Class..........................................................................................................................Lp Client............................................................................................................ Trnh khch Clone [v]........................................................................................................... Sao chp Cloneable [adj].......................................................................................... Kh sao chp CLR [Common Language Runtime].................................. B thc thi ngn ng chung Code................................................................................................................... M lnh Collection........................................................................................................... Tp hp Column...................................................................................................................... Ct Command................................................................................................................ Lnh Communication............................................................................................ S giao tip Comparable [adj]......................................................................................... Kh so snh Compare [v]........................................................................................................ So snh Compatibility........................................................................................ Tnh tng thch Compile [v]...................................................................................................... Bin dch Compiler................................................................................................. Trnh bin dch Component................................................................................................... Thnh phn Component tray.................................................................................... Khay thnh phn Configuration.................................................................................................... Cu hnh Connection.......................................................................................................... Kt ni Constant.................................................................................................................. Hng Constructor................................................................................ Phng thc khi dng Context.............................................................................................................Ng cnh Context-sensitive help............................................................... Tr gip cm-ng-cnh Control............................................................................................................ iu kim Convert [v].................................................................................................... Chuyn i Convertible [adj].................................................................................... Kh chuyn i Cryptography...................................................................................................... Mt m Culture....................................................................................................... Min vn ha Custom [adj]..................................................................................................... Ty bin Data..................................................................................................................... D liu Data binding.................................................................................... K thut kt d liu Database.....................................................................................................C s d liu De-compile [v].............................................................................................. Dch ngc

699 Ph lc B: Thut ng Anh - Vit


De-serialize [v]...................................................................................... Gii tun t ha Decrypt [v].................................................................................................. Gii mt ha Decryption.............................................................................................. S gii mt ha Debug [v].............................................................................................................. G ri Debugger...................................................................................................... Trnh g ri Default.............................................................................................................. Mc nh Delegate................................................................................................... y nhim hm Deploy [v]....................................................................................................... Trin khai Destructor............................................................................................ Phng thc hy Device................................................................................................................. Thit b Derive [v].......................................................................................................... Dn xut Dictionary........................................................................................................... T in Digital signature.............................................................................................. Ch k s Directive............................................................................................................... Ch th Directory........................................................................................................... Th mc Disposable [adj]................................................................................................. Kh hy Dispose [v]................................................................................................................ Hy Distributed [adj]....................................................................................C tnh phn tn Document............................................................................................................ Ti liu Domain................................................................................................................... Min Edit [v]........................................................................................................... Hiu chnh Editor...................................................................................................... Trnh son tho Encapsulation............................................................................................... S ng gi Encode [v]........................................................................................................... M ha Encoding..................................................................................................... Php m ha Encrypt [v]......................................................................................................... Mt ha Encryption..................................................................................................... S mt ha Entry............................................................................................................. Khon mc Enumeration..................................................................................................Kiu lit k Environment..................................................................................................Mi trng Error........................................................................................................................... Li Event................................................................................................................... S kin Event hander........................................................................ Phng thc th l s kin Event log................................................................................................ Nht k s kin Evidence.......................................................................................................... Chng c Exception.............................................................................................................. Bit l Exception hander................................................................... Phng thc th l bit l Expiration................................................................................................ S ht hiu lc Export [v]................................................................................................................. Xut Expression....................................................................................................... Biu thc Feature............................................................................................................ Tnh nng Field.................................................................................................................... Trng File....................................................................................................................... Tp tin Filter......................................................................................................................B lc Flag............................................................................................................................. C

700 Ph lc B: Thut ng Anh - Vit

Flexibility..................................................................................................Tnh linh hot Form................................................................................................................. Biu mu Format............................................................................................................ nh dng FTP [File Transfer Protocol].......................................................... Giao thc truyn file Function................................................................................................................... Hm Functionality.................................................................................................. Chc nng GAC [Global Assembly Cache]..................................... Kho cha gi kt hp ton cc GC [Garbage Collector]..........................................................................B thu gom rc Generalization................................................................................... Tnh tng qut ha Global [adj]...................................................................................................... Ton cc Globalization..........................................................................................S ton cu ha Graphics............................................................................................................... ha Group..................................................................................................................... Nhm GUI [Graphical User Interface]........................................ Giao din ngi dng ha GUID [Globally Unique Identifier]................................... nh danh duy nht ton cc Handle [v]............................................................................................................. Th l Handle............................................................................................................. Mc qun Hash [v].................................................................................................................... Bm Hash code........................................................................................................... M bm Hashtable.........................................................................................................Bng bm Help................................................................................................................... Tr gip HTML [HyperText Markup Language]...................... Ngn ng nh du siu vn bn Hyperlink.................................................................................................... Siu kin kt IDE [Integrated Development Environment]..................Mi trng pht trin tch hp Identifier.............................................................................................................. Din t Imperson [v]...................................................................................................... Gi nhn Impersonation............................................................................................... S gi nhn Implement [v].................................................................................................. Hin thc Implementation......................................................................................... Bn hin thc Import [v]................................................................................................................ Nhp Index.................................................................................................................. Ch mc Indexer.......................................................................................................... B ch mc Inheritance...................................................................................................... S tha k Initialize [v]....................................................................................................... Khi to Input........................................................................................... u vo / D liu nhp Insert [v].................................................................................................................. Chn Install [v].............................................................................................................. Ci t Instance............................................................................................................. Th hin Integration..................................................................................................... S tch hp Interface........................................................................................................... Giao din Interoperability.................................................................................... Kh nng lin tc IP [Internet Protocol]......................................................................... Giao thc Internet

701 Ph lc B: Thut ng Anh - Vit


Item................................................................................................................. Mc chn JIT [just-in-time]....................................................................... Tc thi / Va ng lc Key......................................................................................................................... Kha Keyword.............................................................................................................T kha Language......................................................................................................... Ngn ng Length.............................................................................................................. Chiu di Library.............................................................................................................. Th vin Lifetime................................................................................................... Thi gian sng Link.................................................................................................................... Lin kt List.................................................................................................................. Danh sch Literal...............................................................................................................Trc kin Load [v].................................................................................................................... Np Local [adj]........................................................................................................... Cc b Locale.................................................................................................................. Bn a Localization............................................................................................. S bn a ha Lock......................................................................................................................... Cht Logic........................................................................................... M thi hnh chc nng Loop.................................................................................................................. Vng lp Managed [adj]........................................................................................... c qun l Management................................................................................................... S qun l Mapping....................................................................................................... Php nh x Member......................................................................................................... Thnh vin Membership...................................................................................... T cch thnh vin Memory............................................................................................................... B nh Menu............................................................................................................... Trnh n Message........................................................................................................ Thng ip Metacharacter..................................................................................................Siu k t Metadata....................................................................................................... Siu d liu Method........................................................................................................ Phng thc Model................................................................................................................. M hnh Module............................................................................................................... n th MSIL [Microsoft Intermediate Language]..................................... Ngn ng trung gian Multilingual [adj]....................................................................................... a ngn ng Multithreading.............................................................................. Lp trnh a tiu trnh Native [adj]................................................................................................. Nguyn sinh Namespace.............................................................................................. Khng gian tn Network................................................................................................................. Mng Node.......................................................................................................................... Nt Object.............................................................................................................. i tng Object-oriented programming...............................................Lp trnh hng i tng Operating system....................................................................................... H iu hnh Operator.............................................................................................................. Ton t Output.................................................................................................. u ra / Kt xut Overload.................................................................................................. Bn np chng Override [v]........................................................................................................ Chp

702 Ph lc B: Thut ng Anh - Vit

Parameter..........................................................................................................Thng s Password.......................................................................................................... Mt khu Path................................................................................................................ ng dn Pattern.............................................................................................................. Kiu mu Performance.................................................................................................... Hiu nng Permission............................................................................................................ Quyn Pixel................................................................................................................. im nh Platform.................................................................................................................... Nn Pointer................................................................................................................. Con tr Policy............................................................................................................. Chnh sch Polymorphisme........................................................................................... Tnh a hnh Pool................................................................................................................ Kho d tr Pooling...................................................................................................... C ch d tr POP3 [Post Office Protocol 3].....................................................Giao thc nhn mail 3 Port......................................................................................................................... Cng Postfix................................................................................................................... Hu t Prefix.................................................................................................................... Tin t Private [adj]........................................................................................................... Ring Privilege......................................................................................................... c quyn Procedure............................................................................................................ Th tc Process............................................................................................................. Tin trnh Processor........................................................................................................... B x l Project.................................................................................................................... D n Property..........................................................................................................Thuc tnh Protected [adj].............................................................................................c bo v Protocol........................................................................................................... Giao thc Public [adj]..................................................................................................... Cng khai Query................................................................................................................ Truy vn Queue............................................................................................................... Hng i Random......................................................................................................... Ngu nhin RBS [Role-Based Security]..................................................... Bo mt da-trn-vai-tr Record................................................................................................. Bn ghi / Mu tin Recursion........................................................................................................ S quy Reference...................................................................................................... Tham chiu Reflection.......................................................................................... C ch phn chiu Register [v]........................................................................................................ ng k Regular expression.......................................................................... Biu thc chnh quy Relationship................................................................................................ Mi quan h Relative [adj]................................................................................................. Tng i Remotable [adj]................................................................................ Kh truy xut t xa Resource........................................................................................................ Ti nguyn Reusability.....................................................................................Kh nng ti s dng

703 Ph lc B: Thut ng Anh - Vit


Role...................................................................................................................... Vai tr Routine....................................................................................................... Thng trnh Row.............................................................................................................Hng / Dng Runtime......................................................................................................... B thc thi Schema................................................................................................. Lc / Khun Script................................................................................................................. Kch bn Security......................................................................................................... S bo mt Serialize [v].................................................................................................. Tun t ha Serializable [adj].................................................................................... Kh tun t ha Serialization............................................................................................. S tun t ha Server............................................................................................................... Trnh ch Service................................................................................................................ Dch v Session..................................................................................................... Phin lm vic Setting............................................................................................................... Thit lp Shared [adj]......................................................................... c chia s / Dng chung Signature.............................................................................................................. Ch k SMTP [Simple Mail Transfer Protocol]........................ Giao thc truyn mail n gin SOAP [Simple Object Access Protocol]........... Giao thc truy xut i tng n gin Solution............................................................................................................ Gii php Specialization....................................................................................... Tnh chuyn ha SQL [Structured Query Language].................................Ngn ng truy vn c cu trc Stack............................................................................................................ Ngn chng State................................................................................................................ Trng thi State | Stateless [adj].......................................................... C trng thi | Phi trng thi Statement......................................................................................... Cu lnh / Khai bo Static [adj]............................................................................................................... Tnh Stored procedure..................................................................................... Th tc tn tr Stream............................................................................................................ Dng chy String..................................................................................................................... Chui Strong name.................................................................................................... Tn mnh Strong type..................................................................................................... Kiu mnh Strongly-named [adj]......................................................................c nh tn mnh Strongly-typed [adj]..................................................................... c nh kiu mnh Structure............................................................................................................ Cu trc Symmetric [adj]............................................................................................... i xng Synchronization......................................................................................S ng b ha Synchronous [adj]............................................................................................. ng b System.............................................................................................................. H thng System tray.............................................................................................. Khay h thng Table....................................................................................................................... Bng Tag............................................................................................................................ Th Task...................................................................................................................... Tc v Template....................................................................................................... Khun mu Thread................................................................... Tiu trnh / Mch trnh / Tuyn on Thread-safe..................................................................................... An ton v tiu trnh

704 Ph lc B: Thut ng Anh - Vit

Throw [v]................................................................................................................. Nm Timestamp................................................................................................ Tem thi gian Tool.................................................................................................................... Cng c Toolbox....................................................................................................... Hp cng c Transaction............................................................................................. Phin giao dch Type......................................................................................................................... Kiu Type-safe................................................................................... An ton v kiu d liu Unmanaged [adj]............................................................................ Khng c qun l Update............................................................................................................... Cp nht URI [Uniform Resource Identifier]...................... B nhn dng ti nguyn ng dng URL [Uniform Resource Locator]............................. B nh v ti nguyn ng dng User.............................................................................................................. Ngi dng Utility................................................................................................................. Tin ch Validation.................................................................................. S xc nhn tnh hp l Value..................................................................................................................... Gi tr Variable................................................................................................................... Bin Version............................................................................................................ Phin bn Virtual [adj]................................................................................................................ o Visible [adj]...................................................................................................... Kh kin Visual [adj]..................................................................................................... Trc quan Wildcard................................................................................................... K t i din Window................................................................................................................ Ca s Worker...................................................................................................................... Th Wrapper............................................................................................................... V bc WSDL [Web Services Description Language]................ Ngn ng m t dch v Web XML [Extensible Markup Language]............................... Ngn ng nh du m rng

705

TI LIU THAM KHO

TI LIU THAM KHO


CC GII PHP LP TRNH C#
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12]
Allen Jones. C# Programmer's Cookbook. Microsoft Press, 2004. John Connell. Coding Techniques for Microsoft Visual Basic .NET. Microsoft Press, 2002. Harvey M. Deitel, Paul J. Deitel, & Tem R. Nieto. Visual Basic .NET How to Program, Second Edition. Prentice Hall, 2002. Jose Mojica. C# and VB .NET Conversion Pocket Reference. O'Reilly, 2002. James Avery. Ten Must-Have Tools Every Developer Should Download Now. MSDN Magazine, 2004. Karl Moore. The Ultimate VB.NET and ASP.NET Code Book. Apress, 2003. Matthew MacDonald. Microsoft Visual Basic .NET Programmer's Cookbook. Microsoft Press, 2003. Mark Schmidt & Simon Robinson. Microsoft Visual C# .NET 2003 Developer's Cookbook. Sams Publishing, 2003. Dng Quang Thin. Lp trnh Visual C# th no? Nh xut bn Tng Hp TP. H Ch Minh, 2005. Nguyn Ngc Bnh Phng & L Trn Nht Qunh. Cc gii php lp trnh Visual Basic .NET. Nh xut bn Giao thng Vn ti, 2006. Thi Thanh Phong & Nguyn Ngc Bnh Phng. S tay tra cu VB.NET. Nh xut bn Giao thng Vn ti, 2004. V mt s website nh www.msdn.microsoft.com, www.codeproject.com, www.msd2d.com, www.developersdex.com, www.windowsforms.net, www.gotdotnet.com, www.codeguru.com, www.developerfusion.com, v.v...

CC GII PHP LP TRNH C#


Nguyn Ngc Bnh Phng Thi Thanh Phong
tng hp & bin dch Chu trch nhim xut bn

TS. Nguyn Xun Thy


Bin tp

H Nguyn Th Thanh Thy


Trnh by ba

Nguyn Th Thanh Thy


Ch bn & Sa bn in

Nguyn Ngc Bnh Phng

In 1000 cun, kh 19x27cm, ti XN in S 05. S ng k KHXB 180-230/XB-QLXB do Cc Xut Bn cp ngy 03 thng 03 nm 2005. In xong v np lu chiu thng 09 nm 2006.

You might also like