Cac Giai Phap Lap Trinh C - Sharp

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 562

www.nhipsongcongnghe.

net

t ng h p v bin d ch

Nguy n Ng c Bnh Phng - Thi Thanh Phong


cng s c ng tc c a Nguy n Thanh Nhn - Tr n L Vnh Phong N g u y n Q ua n g N a m i n h P ha n C h T m B i M i n h K h o a - L N g c S n Thi Kim Ph ng - L Tr n Nh t Qunh

Ch u trch nhi m xu t b n: TS. Nguy n Xun Th y Bin t p: H Nguy n Th Thanh Thy Trnh by ba: Nguy n Th Thanh Th y Ch b n & S a b n in: Nguy n Ng c Bnh Phng

Nh sch t Vit
a ch : 225 Nguy n Tri Phng, Q.5, TP. H Ch Minh i n tho i: (08) 2 652 039 E-mail: datviet@dvpub.com.vn Website: www.dvpub.com.vn

www.nhipsongcongnghe.net

Nguyn Ngc Bnh Phng - Thi Thanh Phong


tng hp & bin dch

http://www.dvpub.com.vn/dv/details.aspx?itemid=243

NH XU T B N GIAO THNG V N T I

www.nhipsongcongnghe.net

www.nhipsongcongnghe.net
L I NI U

L I NI

c gi i php l p trnh C# kh o st chi u r ng c a th vi n l p .NET Framework v cung c p gi i php c th cho cc v n th ng g p. M i gi i php c trnh by theo d ng v n /gi i php m t cch ng n g n v km theo l cc v d m u. Cc gi i php l p trnh C# khng nh m m c ch h ng d n b n cch l p trnh C#. Tuy v y, ngay c khi m i lm quen v i l p trnh ng d ng c xy d ng trn .NET Framework v i C#, b n cng s nh n th y quy n sch ny l m t ti nguyn v gi. m c l t ng, khi b n i m t v i m t v n , quy n sch ny s cung c p m t gi i phphay t nh t n s g i cho b n h ng i ng. Ngay c n u b n ch mu n m r ng ki n th c c a mnh v th vi n l p .NET, Cc gi i php l p trnh C# cng l m t ti li u r t h u ch. B n khng th tr nn thnh th o C# v cc l p trong th vi n l p .NET n u ch n thu n c v chng, b n ph i s d ng v th nghi m chng b ng cch vi t th t nhi u chng trnh. C u trc v n i dung c a quy n sch ny cng nh tnh kh thi trong th gi i th c c a cc gi i php c a ra s cung c p i m kh i u hon h o, t lm bn p cho vi c th nghi m c a chnh b n. Ph n m l nh trong quy n sch ny c vi t v ch y th nghi m trn phin b n 1.1 c a .NET Framework. Trong nhi u tr ng h p, b n s nh n th y v d m u ny cng s ch y trn phin b n 1.0 hay 2.0 c a .NET Framework, tuy nhin i u ny cha c th nghi m. Chng ti xin chn thnh c m n cc b n Nguy n Thanh Nhn, Tr n L Vnh Phong, Nguy n Quang Nam, inh Phan Ch Tm, Bi Minh Khoa, L Ng c Sn, Thi Kim Ph ng, v L Tr n Nh t Qunh c nh ng ng gp qu bu cho quy n sch; c m n Nh xu t b n Giao thng V n t i v Nh sch t Vi t t o i u ki n cho quy n sch ny n v i b n c. Do l n u tin xu t b n nn quy n sch ny kh trnh kh i nh ng thi u st. R t mong nh n c ki n ng gp v nh n xt c a cc b n l n ti b n sau c hon thi n hn. Trn tr ng c m n

www.nhipsongcongnghe.net
C U TRC C A SCH

C U TRC C A SCH

Quy n sch ny c chia thnh 17 chng, m i chng t p trung vo m t ch c th trong qu trnh t o cc gi i php C#.

Chng 1: PHT TRI N Chng 2: THAO TC D

NG D NG LI U

Chng 3: MI N NG D NG, C CH PH N CHI U, V SIU D LI U Chng 4: TI U TRNH, TI N TRNH, V S Chng 5: XML Chng 6: WINDOWS FORM Chng 7: ASP.NET V WEB FORM Chng 8: H A, D A PHNG TI N, V IN LI U WEB XML V REMOTING N Chng 9: FILE, TH M C, V I/O Chng 10: C S Chng 11: L P TRNH M NG Chng 12: D CH V Chng 14: M T M Chng 15: KH NNG LIN TC M L NH KHNG- C-QU N-L Chng 16: CC GIAO DI N V M U THNG D NG Chng 17: S HA H P V I MI TR NG WINDOWS Chng 13: B O M T NG B

www.nhipsongcongnghe.net
QUY C

QUY C

Quy n sch ny s d ng cc quy c nh sau:


V font ch

Ch in nghingDng cho tn ring, tn file v th m c, v i khi nh n m nh. Ch v i b r ng c nh (font Courie New)Dng cho cc o n chng trnh, v cho cc ph n t m l nh nh cu l nh, ty ch n, bi n, c tnh, kha, hm, ki u, l p, khng gian tn, phng th c, module, thu c tnh, thng s , gi tr , i t ng, s ki n, phng th c th l s ki n, th XML, th HTML, n i dung file, v k t xu t t cc cu l nh. Ch in m v i b r ng c nhDng trong cc o n chng trnh nu b t m t ph n quan tr ng c a m l nh ho c dng cho cc dng l nh, cu l nh SQL.
V k hi u
V n Th thu t

Gi i php

Ghi ch

11

www.nhipsongcongnghe.net
YU C U V H TH NG

YU C U V H TH NG

ch y c nh ng v d m u i km quy n sch ny, b n s c n nh ng ph n m m sau y: Microsoft .NET Framework SDK version 1.1 Microsoft Visual Studio .NET 2003 Microsoft Windows 2000, Windows XP, ho c Microsoft Windows Server 2003 Microsoft SQL Server 2000 ho c MSDE i v i cc m c trong chng 10 Microsoft Internet Information Services (IIS) i v i m t s m c trong chng 7 v chng 12 Yu c u t i thi u v ph n c ng l b vi x l Pentium II 450 MHz, v i dung l ng RAM t i thi u l 128 MB n u b n ang s d ng Microsoft Windows 2000, v l 256 MB n u b n ang s d ng Windows XP, Windows 2000 Server, hay Windows Server 2003. B n c n kho ng 5 GB dung l ng a c ng cn tr ng ci t Visual Studio .NET 2003. Nh ng gi tr ny l m c t i thi u, qu trnh pht tri n s d dng hn trn m t h th ng v i dung l ng RAM l n v a c ng cn tr ng nhi u. M c d b n hi n th c .NET Framework cho Windows c a Microsoft l tiu i m c a quy n sch ny, m t m c tiu quan tr ng l c p m t ti nguyn h u ch cho nh ng l p trnh vin C# khng quan tm n n n m h ang lm vi c ho c cng c m h truy xu t. Ngoi nh ng ch c bi t khng c h tr trn t t c n n .NET (nh Windows Form, ADO.NET, v ASP.NET), nhi u v d m u trong quy n sch ny u h p l trn t t c b n hi n th c .NET.

13

www.nhipsongcongnghe.net
CCH S D NG A CD

CCH S

D NG

A CD

l nh c c p d ng t p cc gi i php v d n Visual Studio .NET 2003, c t ch c theo chng v s m c. M i chng l m t gi i php c l p, v m i m c l m t d n c l p bn trong gi i php c a chng. M t vi m c trong chng 11 v chng 12 trnh by v l p trnh m ng g m nh ng d n c l p c ch a cc ph n client v server trong gi i php c a m c. M c d t t c nh ng v d m u c c p d ng d n Visual Studio .NET, nhng h u h t u bao g m m t file ngu n n m b n c th bin d ch v ch y c l p v i Visual Studio .NET. N u khng s nh v m ngu n cho d ng Visual Studio .NET 2003, b n c th m t m c c th b ng cch duy t c u trc th m c c a v d m u. V d , tm m ngu n cho m c 4.3, b n s tm n trong th m c Chuong04\04-03. N u s d ng trnh bin d ch dng l nh th ph i b o m r ng b n thm tham chi u n t t c cc assembly c n thi t. M t s ng d ng m u yu c u cc i s dng l nh (s c m t trong ph n vn b n c a m c). N u s d ng Visual Studio .NET, b n c th nh p cc i s ny trong Project Properties (m c Debugging c a ph n Configuration Properties). Nh r ng, n u c n nh p tn th m c hay file c ch a kho ng tr ng th b n c n t tn y trong d u nhy kp. T t c v d truy xu t d li u ADO.NET c t o v i SQL Server 2000. Chng cng c th c s d ng v i SQL Server 7 v MSDE. Visual Studio .NET c ch a cc k ch b n SQL ci t cc c s d li u m u Northwind v Pubs n u chng cha hi n di n (cc file instnwnd.sql v instpubs.sql trong th m c C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\ v1.1\Samples\Setup). B n c th ch y cc k ch b n ny b ng Query Analyzer (v i SQL Server) hay OSQL.exe (v i MSDE).

15

s d ng cc m c trong chng 7 v chng 12, b n c n chp chng vo th m c I:\CSharp\ ( ng d n ny l m c ng trong cc file d n Visual Studio .NET). B n cng s c n t o m t th m c o n I:\CSharp. B n c th ci t php nh c tn l CSharp nh x x ny b ng IIS Manager. Th c hi n theo cc b c d i y: 1. 2. Kh i ch y IIS Manager (ch n Start | Control Panel | Administrative Tools | Internet Information Services). Kh i ch y Virtual Directory Wizard trong IIS Manager b ng cch nh p ph i vo Default Web Site v ch n New | Virtual Directory t menu ng c nh. Nh p Next b t CSharp. Nh p Next u. M u thng tin ti p t c. u tin l b danh

3. 4. 5.

M u thng tin th hai l th m c v t l I:\CSharp. Nh p Next ti p t c. C a s thu t s cu i cng cho php b n i u ch nh quy n cho th m c o. B n nn s d ng cc thi t l p m c nh. Nh p Next. Nh p Finish k t thc trnh thu t s. B n s th y th m c o ny trong ph n cy c a IIS Manager. Khai tri n th m c o CSharp trong IIS thnh th m c n m trong CSharp\Chuong07\07-01. Nh p ph i vo th m c ny, ch n Properties, r i nh p vo chuy n th m c ny thnh nt Create trong th Directory th m c ng d ng Web. L p l i b c 8 cho m i m c trong chng 7.

6. 7. 8.

9.

10. Theo trnh t c trnh by trong cc b c 7-9, t o th m c 12.2, 12.3, 12.4, v 12.6 m c ng d ng Web cho cc trong chng 12.

www.nhipsongcongnghe.net
M CL C

M CL C

L I NI

U ................................................................................................................................ 6

C U TRC C A SCH................................................................................................................ 8 QUY C ................................................................................................................................... 10 YU C U V H TH NG .......................................................................................................... 12 CCH S D NG A CD........................................................................................................... 14

M C L C .................................................................................................................................... 16 Chng 1: PHT TRI N NG D NG 24

1.1 T o ng d ng Console.................................................................................................. 26 1.2 T o ng d ng d a-trn-Windows ................................................................................. 28 1.3 T o v s d ng module................................................................................................. 31 1.4 T o v s d ng th vi n ............................................................................................... 32 1.5 Truy xu t cc i s dng l nh ..................................................................................... 34 1.6 Ch n bin d ch m t kh i m vo file th c thi ................................................................ 35 1.7 Truy xu t m t ph n t chng trnh c tn trng v i m t t kha............................... 37 1.8 T o v qu n l c p kha tn m nh ............................................................................... 38 1.9 T o tn m nh cho assembly ......................................................................................... 39 1.10 Xc minh m t assembly tn m nh khng b s a i .................................................. 41 1.11 Hon vi c k assembly................................................................................................ 42 1.12 K assembly v i ch k s Authenticode ................................................................... 44 1.13 T o v thi t l p tin t ng m t SPC th nghi m ......................................................... 46

17

1.14 Qu n l Global Assembly Cache................................................................................. 47 1.15 Ngn ng i khc d ch ng c m ngu n c a b n ...................................................... 48 Chng 2: THAO TC D LI U 51

2.1 Thao tc chu i m t cch hi u qu ................................................................................ 53 2.2 M ha chu i b ng cc ki u m ha k t ................................................................... 54 2.3 Chuy n cc ki u gi tr c b n thnh m ng ki u byte .................................................. 56 2.4 M ha d li u nh phn thnh vn b n........................................................................ 58 2.5 S d ng bi u th c chnh quy ki m tra d li u nh p................................................ 60 2.6 S d ng bi u th c chnh quy c bin d ch.......................................................... 62 2.7 T o ngy v gi t chu i............................................................................................... 64 2.8 C ng, tr , so snh ngy gi .......................................................................................... 65 2.9 S p x p m t m ng ho c m t ArrayList ......................................................................... 67 2.10 Chp m t t p h p vo m t m ng................................................................................ 68 2.11 T o m t t p h p ki u m nh ........................................................................................ 69 2.12 Lu m t i t ng kh -tu n-t -ha vo file ............................................................... 70 Chng 3: MI N NG D NG, C CH PH N CHI U, V SIU D LI U 74

3.1 T o mi n ng d ng ....................................................................................................... 76 3.2 Chuy n cc i t ng qua l i cc mi n ng d ng ....................................................... 77 3.3 Trnh n p cc assembly khng c n thi t vo mi n ng d ng ..................................... 78 3.4 T o ki u khng th v t qua bin mi n ng d ng ....................................................... 79 3.5 N p assembly vo mi n ng d ng hi n hnh............................................................... 80 3.6 Th c thi assembly mi n ng d ng khc.................................................................... 81 3.7 Th hi n ha m t ki u trong mi n ng d ng khc........................................................ 82 3.8 Truy n d li u gi a cc mi n ng d ng ....................................................................... 87 3.9 Gi i phng assembly v mi n ng d ng....................................................................... 88 3.10 Truy xu t thng tin Type.............................................................................................. 89 3.11 Ki m tra ki u c a m t i t ng ................................................................................. 90 3.12 T o m t i t ng b ng c ch ph n chi u ............................................................... 91 3.13 T o m t c tnh ty bi n ............................................................................................ 94 3.14 S d ng c ch ph n chi u ki m tra cc c tnh c a m t ph n t chng trnh...................................................................................................................................... 96 Chng 4: TI U TRNH, TI N TRNH, V S 4.1 Th 4.2 Th 4.3 Th 4.4 Th 4.5 Th 4.6 i NG B 98

c thi phng th c v i thread-pool ........................................................................ 100 c thi phng th c m t cch b t ng b ............................................................. 103 c thi phng th c b ng Timer .............................................................................. 109 c thi phng th c b ng cch ra hi u i t ng WaitHandle ............................... 111 c thi phng th c b ng ti u trnh m i .................................................................. 113 u khi n qu trnh th c thi c a m t ti u trnh .......................................................... 115

4.7 Nh n bi t khi no m t ti u trnh k t thc..................................................................... 118 4.8 ng b ha qu trnh th c thi c a nhi u ti u trnh.................................................... 119 4.9 T o m t i t ng t p h p c tnh ch t an-ton-v -ti u-trnh.................................... 123 4.10 Kh i ch y m t ti n trnh m i ..................................................................................... 124 4.11 K t thc m t ti n trnh ............................................................................................... 126 4.12 B o m ch c th ch y m t th hi n c a ng d ng t i m t th i i m................... 128

www.nhipsongcongnghe.net
Chng 5: XML 130 5.1 Hi n th c u trc c a m t ti li u XML trong TreeView ............................................... 132 5.2 Chn thm nt vo ti li u XML .................................................................................. 136 5.3 Chn thm nt vo ti li u XML m t cch nhanh chng ............................................ 137 5.4 Tm m t nt khi bi t tn c a n ................................................................................... 139 5.5 Thu l y cc nt XML trong m t khng gian tn XML c th ....................................... 140 5.6 Tm cc ph n t v i bi u th c XPath ......................................................................... 142 5.7 c v ghi XML m khng ph i n p ton b ti li u vo b nh ............................... 144 5.8 Xc nh n tnh h p l c a m t ti li u XML d a trn m t Schema ............................. 146 5.9 S d ng XML Serialization v i cc i t ng ty bi n............................................... 151 5.10 T o XML Schema cho m t l p .NET ........................................................................ 154 5.11 T o l p t m t XML Schema .................................................................................... 154 5.12 Th c hi n php bi n i XSL.................................................................................... 155 Chng 6: WINDOWS FORM 158

6.1 Thm i u ki m vo form lc th c thi ......................................................................... 160 6.2 Lin k t d li u vo i u ki m..................................................................................... 162 6.3 X l t t c cc i u ki m trn form............................................................................ 163 6.4 Theo v t cc form kh ki n trong m t ng d ng ........................................................ 164 6.5 Tm t t c cc form trong ng d ng MDI .................................................................... 165 6.6 Lu tr kch th c v v tr c a form........................................................................... 166 6.7 Bu c ListBox cu n xu ng ............................................................................................ 168 6.8 Ch cho php nh p s vo TextBox ............................................................................ 169 6.9 S d ng ComboBox c tnh nng auto-complete ....................................................... 170 6.10 S p x p ListView theo c t b t k .............................................................................. 172 6.11 Lin k t menu ng c nh vo i u ki m .................................................................... 174 6.12 S d ng m t ph n menu chnh cho menu ng c nh ............................................... 175 6.13 T o form a ngn ng ............................................................................................... 176 6.14 T o form khng th di chuy n c ......................................................................... 179 6.15 Lm cho form khng ng vi n c th di chuy n c ......................................... 180 6.16 T o m t icon ng trong khay h th ng.................................................................... 181 6.17 Xc nh n tnh h p l c a u vo cho m t i u ki m .............................................. 182 6.18 Th c hi n thao tc ko-v-th .................................................................................. 184 6.19 S d ng tr gip c m-ng -c nh............................................................................... 186 6.20 p d ng phong cch Windows XP ............................................................................ 187 6.21 Thay i c c a form .......................................................................................... 188 Chng 7: ASP.NET V WEB FORM 191

7.1 Chuy n h ng ng i dng sang trang khc.............................................................. 193 7.2 Duy tr tr ng thi gi a cc yu c u c a trang ............................................................. 194 7.3 T o cc bi n thnh vin c tr ng thi cho trang ......................................................... 198 7.4 p ng cc s ki n pha client v i JavaScript.......................................................... 199 7.5 Hi n th c a s pop-up v i JavaScript ........................................................................ 202 7.6 Thi t l p focus cho i u ki m...................................................................................... 203 7.7 Cho php ng i dng upload file................................................................................ 204 7.8 S d ng IIS authentication.......................................................................................... 206

19

7.9 S d ng Forms authentication .................................................................................... 210 7.10 Th c hi n xc nh n tnh h p l c-ch n-l a ............................................................ 213 7.11 Thm ng i u ki m vo Web Form ....................................................................... 214 7.12 Tr v ng m t b c hnh ......................................................................................... 217 7.13 N p i u ki m ng i dng b ng m l nh................................................................. 220 7.14 S d ng page-caching v fragment-caching ............................................................ 223 7.15 Dng l i d li u v i ASP.NET Cache ....................................................................... 224 7.16 Kch ho t vi c g r i ng d ng Web......................................................................... 226 7.17 Thay i quy n c p cho m ASP.NET................................................................. 230 Chng 8: H A, A PHNG TI N, V IN N 233

8.1 Tm t t c cc font c ci

t............................................................................. 235

8.2 Th c hi n hit testing v i shape................................................................................. 236 8.3 T o form c hnh d ng ty bi n................................................................................... 240 8.4 T o i u ki m c hnh d ng ty bi n .......................................................................... 241 8.5 Thm tnh nng cu n cho m t b c hnh ..................................................................... 244 8.6 Th c hi n ch p mn hnh Desktop ............................................................................. 245 8.7 S d ng double buffering tng t c v l i ........................................................ 247 8.8 Hi n th hnh d ng thumbnail ................................................................................... 249 8.9 Pht ti ng beep c a h th ng ................................................................................... 250 8.10 Chi file audio............................................................................................................ 251 8.11 Chi file video............................................................................................................ 253 8.12 L y thng tin v cc my in c ci t ............................................................ 255 8.13 In vn b n n gi n................................................................................................... 258 8.14 In vn b n c nhi u trang.......................................................................................... 261 8.15 In text d ng wrapping ................................................................................................ 263 8.16 Hi n th print-preview................................................................................................. 265 8.17 Qu n l tc v in........................................................................................................ 267 8.18 S d ng Microsoft Agent........................................................................................... 270 Chng 9: FILE, TH M C, V I/O 276

9.1 Truy xu t cc thng tin v file hay th m c ................................................................ 278 9.2 Thi t l p cc thu c tnh c a file v th m c................................................................ 281 9.3 Chp, chuy n, xa file hay th m c............................................................................ 282 9.4 Tnh kch th c c a th m c ...................................................................................... 284 9.5 Truy xu t thng tin phin b n c a file ......................................................................... 285 9.6 S d ng TreeView hi n th cy th m c just-in-time ............................................. 287 9.7 c v ghi file vn b n ................................................................................................ 288 9.8 c v ghi file nh phn ............................................................................................... 290 9.9 c file m t cch b t ng b ..................................................................................... 291 9.10 Tm file ph h p m t bi u th c wildcard ................................................................... 294 9.11 Ki m tra hai file c trng nhau hay khng................................................................. 294 9.12 Thao tc trn ng d n file..................................................................................... 296 9.13 Xc nh ng d n tng ng v i m t file hay th m c........................................ 297 9.14 Lm vi c v i ng d n tng i........................................................................... 298 9.15 T o file t m ................................................................................................................ 299 9.16 L y dung l ng a cn tr ng ................................................................................... 299

www.nhipsongcongnghe.net
9.17 Hi n th cc h p tho i file .......................................................................................... 300 9.18 S d ng khng gian lu tr ring ............................................................................. 303 9.19 Theo di h th ng file pht hi n thay i ............................................................. 305 9.20 Truy xu t c ng COM ................................................................................................. 306 Chng 10: C S D LI U 309

10.1 K t n i c s d li u ................................................................................................. 312 10.2 S d ng connection-pooling ..................................................................................... 314 10.3 Th c thi cu l nh SQL ho c th t c t n tr .............................................................. 316 10.4 S d ng thng s trong cu l nh SQL ho c th t c t n tr ..................................... 319 10.5 X l k t qu c a truy v n SQL b ng data-reader.................................................... 321 10.6 Thu l y ti li u XML t truy v n SQL Server............................................................. 325 10.7 Nh n bi t t t c cc th hi n SQL Server 2000 trn m ng ...................................... 328 10.8 c file Excel v i ADO.NET...................................................................................... 329 10.9 S d ng Data Form Wizard ...................................................................................... 331 10.10 S d ng Crystal Report Wizard .............................................................................. 338 Chng 11: L P TRNH M NG 345

11.1 Download file thng qua HTTP ................................................................................. 347 11.2 Download v x l file b ng stream .......................................................................... 348 11.3 L y trang HTML t m t website c yu c u xc th c .............................................. 350 11.4 Hi n th trang web trong ng d ng d a-trn-Windows ............................................. 351 11.5 L y a ch IP c a my tnh hi n hnh ...................................................................... 354 11.6 Phn gi i tn mi n thnh a ch IP........................................................................... 355 11.7 Ping m t a ch IP .................................................................................................. 355 11.8 Giao ti p b ng TCP ................................................................................................... 358 11.9 L y a ch IP c a client t k t n i socket ................................................................. 362 11.10 Thi t l p cc ty ch n socket .................................................................................. 363 11.11 T o m t TCP-server h -tr - a-ti u-trnh ................................................................ 364 11.12 S d ng TCP m t cch b t ng b ....................................................................... 366 11.13 Giao ti p b ng UDP................................................................................................. 369 11.14 G i e-mail thng qua SMTP.................................................................................... 371 11.15 G i v nh n e-mail v i MAPI .................................................................................. 372 Chng 12: D CH V WEB XML V REMOTING 374

12.1 Trnh vi t m c ng cho a ch URL c a d ch v Web XML .................................... 377 12.2 S d ng k thu t response-caching trong d ch v Web XML................................... 378 12.3 S d ng k thu t data-caching trong d ch v Web XML........................................... 379 12.4 T o phng th c web h tr giao d ch..................................................................... 381 12.5 Thi t l p thng tin xc th c cho d ch v Web XML................................................... 383 12.6 G i b t ng b m t phng th c web .................................................................... 384 12.7 T o l p kh -truy-xu t-t -xa....................................................................................... 386 12.8 ng k t t c cc l p kh -truy-xu t-t -xa trong m t assembly .............................. 390 12.9 Qu n l cc i t ng xa trong IIS ........................................................................ 391 12.10 Pht sinh s ki n trn knh truy xu t t xa ............................................................ 392 12.11 Ki m sot th i gian s ng c a m t i t ng xa.................................................. 396 12.12 Ki m sot phin b n c a cc i t ng xa ......................................................... 397

21

12.13 T o phng th c m t chi u v i d ch v Web XML hay Remoting........................ 398 Chng 13: B O M T 401

13.1 Cho php m l nh c- -tin-c y-m t-ph n s d ng assembly tn m nh c a b n.. 404 13.2 V hi u b o m t truy xu t m l nh............................................................................ 406 13.3 V hi u vi c ki m tra quy n th c thi ......................................................................... 407 13.4 B o m b th c thi c p cho assembly m t s quy n no ................................. 408 13.5 Gi i h n cc quy n c c p cho assembly............................................................ 410 13.6 Xem cc yu c u quy n c t o b i m t assembly............................................... 412 13.7 Xc nh m l nh c quy n no lc th c thi hay khng ...................................... 413 13.8 H n ch ai th a k cc l p c a b n v chp cc thnh vin l p .................. 414 13.9 Ki m tra ch ng c c a m t assembly....................................................................... 416 13.10 X l ch ng c khi n p m t assembly.................................................................... 417 13.11 X l b o m t b th c thi b ng ch ng c c a mi n ng d ng .............................. 419 13.12 X l b o m t b th c thi b ng chnh sch b o m t c a mi n ng d ng .............. 421 13.13 Xc nh ng i dng hi n hnh c l thnh vin c a m t nhm Windows no hay khng ..................................................................................................................... 424 13.14 H n ch nh ng ng i dng no th c thi m l nh c a b n ............................... 426 13.15 Gi nh n ng i dng Windows............................................................................... 430 Chng 14: M T M 434

14.1 T o s ng u nhin..................................................................................................... 436 14.2 Tnh m bm c a password ...................................................................................... 437 14.3 Tnh m bm c a file ................................................................................................. 439 14.4 Ki m tra m bm ....................................................................................................... 441 14.5 B o m tnh ton v n d li u b ng m bm c kha ............................................. 442 14.6 B o v file b ng php m t ha i x ng .................................................................. 444 14.7 Truy l i kha i x ng t password .......................................................................... 449 14.8 G i m t b m t b ng php m t ha b t i x ng ..................................................... 451 14.9 Lu tr kha b t i x ng m t cch an ton............................................................ 455 14.10 Trao i kha phin i x ng m t cch an ton..................................................... 457 Chng 15: KH NNG LIN TC M L NH KHNG- C-QU N-L 462

15.1 G i m t hm trong m t DLL khng- c-qu n-l .................................................... 464 15.2 L y handle c a m t i u ki m, c a s , ho c file ...................................................... 467 15.3 G i m t hm khng- c-qu n-l c s d ng c u trc ........................................... 468 15.4 G i m t hm khng- c-qu n-l c s d ng callback........................................... 470 15.5 L y thng tin l i khng- c-qu n-l........................................................................ 471 15.6 S d ng thnh ph n COM trong .NET-client ............................................................ 472 15.7 Gi i phng nhanh thnh ph n COM.......................................................................... 474 15.8 S d ng thng s ty ch n ....................................................................................... 475 15.9 S d ng i u ki m ActiveX trong .NET-client........................................................... 476 15.10 T o thnh ph n .NET dng cho COM-client ........................................................... 477 Chng 16: CC GIAO DI N V M U THNG D NG 479

16.1 Hi n th c ki u kh -tu n-t -ha (serializable type) ................................................... 481 16.2 Hi n th c ki u kh -sao-chp (cloneable type).......................................................... 486 16.3 Hi n th c ki u kh -so-snh (comparable type) ........................................................ 489

www.nhipsongcongnghe.net
16.4 Hi n th c ki u kh -li t-k (enumerable type) ........................................................... 492 16.5 Hi n th c l p kh -h y (disposable class) ................................................................. 497 16.6 Hi n th c ki u kh - nh-d ng (formattable type)...................................................... 500 16.7 Hi n th c l p ngo i l ty bi n ................................................................................. 502 16.8 Hi n th c i s s ki n ty bi n.............................................................................. 505 16.9 Hi n th c m u Singleton........................................................................................... 506 16.10 Hi n th c m u Observer ......................................................................................... 507 Chng 17: S HA H P V I MI TR NG WINDOWS 513

17.1 Truy xu t thng tin mi tr ng.................................................................................. 515 17.2 L y gi tr c a m t bi n mi tr ng .......................................................................... 518 17.3 Ghi m t s ki n vo nh t k s ki n Windows ......................................................... 519 17.4 Truy xu t Windows Registry...................................................................................... 520 17.5 T o m t d ch v Windows ......................................................................................... 523 17.6 T o m t b ci t d ch v Windows......................................................................... 527 17.7 T o shortcut trn Desktop hay trong Start menu ...................................................... 529 PH L C A: GI I THI U M T S CNG C .NET .............................................................. 533 A.1 Bin d ch cc o n m ng n v i Snippet Compiler.................................................... 533 A.2 Xy d ng bi u th c chnh quy v i Regulator ............................................................. 534 A.3 Sinh m v i CodeSmith .............................................................................................. 535 A.4 Vi t ki m th n v v i NUnit .................................................................................... 538 A.5 Ki m sot m l nh v i FxCop..................................................................................... 539 A.6 Kh o st assembly v i .NET Reflector ....................................................................... 540 A.7 L p ti li u m l nh v i NDoc ..................................................................................... 542 A.8 T o d ng gi i php v i NAnt ...................................................................................... 544 A.9 Chuy n i phin b n ASP.NET v i ASP.NET Version Switcher.............................. 546 A.10 Chuy n i phin b n d n v i Visual Studio .NET Project Converter.................. 546 A.11 Chuy n m ngu n VB.NET sang C# v i VB.NET to C# Converter ......................... 547 A.12 Chuy n m ngu n C# sang VB.NET v i Convert C# to VB.NET............................. 548 A.13 Xy d ng website qu n tr c s d li u v i ASP.NET Maker 1.1 .......................... 548 PH L C B: THU T NG ANH - VI T................................................................................... 551

TI LI U THAM KH O ............................................................................................................ 559

23

24

Chng 1: PHT TRI N

NG D NG

25

26 Chng 1: Pht tri n

ng d ng

hng ny trnh by m t s ki n th c n n t ng, c n thi t trong qu trnh pht tri n m t ng d ng C#. Cc m c trong chng s trnh by chi ti t cc v n sau y: Xy d ng cc ng d ng Console v Windows Form (m c 1.1 v 1.2). i s dng l nh t bn trong ng d ng (m c 1.5). ty bi n vi c bin d ch m ngu n (m c 1.6).

T o v s d ng n th m l nh v th vi n m l nh (m c 1.3 v 1.4). Truy xu t S d ng cc ch th bin d ch

Truy xu t cc ph n t chng trnh ( c xy d ng trong ngn ng khc) c tn xung t v i cc t kha C# (m c 1.7). T o v xc minh tn m nh cho assembly (m c 1.8, 1.9, 1.10, v 1.11). K m t assembly b ng ch k s Microsoft Authenticode (m c 1.12 v 1.13). Qu n l nh ng assembly chia s 1.14). c lu tr trong Global Assembly Cache (m c

Ngn ng i dng d ch ng c assembly c a b n (m c 1.15). T t c cc cng c c th o lu n trong chng ny Framework ho c .NET Framework SDK. u c trong Microsoft .NET

Cc cng c thu c Framework n m trong th m c chnh c a phin b n Framework m b n ang s d ng (m c nh l \WINDOWS\Microsoft.NET\ Framework\v1.1.4322 n u b n s d ng .NET Framework version 1.1). Qu trnh ci t .NET s t ng thm th m c ny vo ng d n mi tr ng c a h th ng. Cc cng c c cung c p cng v i SDK n m trong th m c Bin c a th m c ci nh l \Program Files\Microsoft Visual Studio .NET 2003\ t SDK (m c ng, SDK\v1.1\Bin). Th m c ny khng c thm vo ng d n m t cch t v v y b n ph i t thm n vo d dng truy xu t cc cng c ny. H u h t cc cng c trn u h tr hai d ng i s dng l nh: ng n v di. Chng ny lun trnh by d ng di v d hi u hn (nhng b l i b n ph i g nhi u hn). i v i d ng ng n, b n hy tham kh o ti li u tng ng trong .NET Framework SDK.

1.1

To ng dng Console
B n mu n xy d ng m t ng d ng khng c n giao di n ng i dng thay vo hi n th k t qu v c d li u nh p t dng l nh. h a (GUI),

Hi n th c m t phng th c tnh c tn l Main d i cc d ng sau trong t nh t m t file m ngu n:


public public public public static static static static void Main(); void Main(string[] args); int Main(); int Main(string[] args);

Chng 1: Pht tri n

27 ng d ng

S d ng i s /target:exe khi bin d ch assembly c a b n b ng trnh bin d ch C# (csc.exe). M c nh trnh bin d ch C# s xy d ng m t ng d ng Console tr khi b n ch nh lo i khc. V l do ny, khng c n ch nh /target.exe, nhng thm n vo s r rng hn, h u ch khi t o cc k ch b n bin d ch s c s d ng b i cc ng d ng khc ho c s c s d ng l p i l p l i trong m t th i gian. V d sau minh h a m t l p c tn l ConsoleUtils ( c nh ngha trong file ConsoleUtils.cs):
using System; public class ConsoleUtils { // Phng th c hi n th l i nh c v c p ng t public static string ReadString(string msg) { Console.Write(msg); return System.Console.ReadLine(); } // Phng th c hi n th thng i p. public static void WriteString(string msg) { System.Console.WriteLine(msg); } // Phng th c Main dng th public static void Main() { nghi m l p ConsoleUtils. console.

// Yu c u ng i dng nh p tn. string name = ReadString("Please enter your name : "); // Hi n th thng i p cho m ng. WriteString("Welcome to Microsoft .NET Framework, " + name); } }

xy d ng l p ConsoleUtils thnh m t ng d ng Console c tn l ConsoleUtils.exe, s d ng l nh:


csc /target:exe ConsoleUtils.cs

B n c th ch y file th c thi tr c ti p t dng l nh. Khi ch y, phng th c Main c a ng d ng ConsoleUtils.exe yu c u b n nh p tn v sau hi n th thng i p cho m ng nh sau:
Please enter your name : Binh Phuong Welcome to Microsoft .NET Framework, Binh Phuong

Th c t , ng d ng hi m khi ch g m m t file m ngu n. V d , l p HelloWorld d i y s d ng l p ConsoleUtils hi n th thng i p Hello, world ln mn hnh (HelloWorld n m trong file HelloWorld.cs).
public class HelloWorld { public static void Main() { ConsoleUtils.WriteString("Hello, world"); } }

28 Chng 1: Pht tri n

ng d ng

xy d ng m t ng d ng Console g m nhi u file m ngu n, b n ph i ch nh t t c cc file m ngu n ny trong i s dng l nh. V d , l nh sau y xy d ng ng d ng MyFirstApp.exe t cc file m ngu n HelloWorld.cs v ConsoleUtils.cs:
csc /target:exe /main:HelloWorld /out:MyFirstApp.exe HelloWorld.cs ConsoleUtils.cs

i s /out ch nh tn c a file th c thi s c t o ra. N u khng c ch nh, tn c a file th c thi s l tn c a file m ngu n u tintrong v d trn l HelloWorld.cs. V c hai l p HelloWorld v ConsoleUtils u c phng th c Main, trnh bin d ch khng th t ng quy t nh u l i m nh p cho file th c thi. B n ph i s d ng i s /main ch nh tn c a l p ch a i m nh p cho ng d ng c a b n.

1.2

To ng dng da-trn-Windows
B n c n xy d ng m t ng d ng cung c p giao di n ng i dng d a-trn-Windows Form. h a (GUI)

Hi n th c m t phng th c tnh Main trong t nh t m t file m ngu n. Trong Main, t o m t th hi n c a m t l p th a k t l p System.Windows.Forms.Form ( y l form chnh c a ng d ng). Truy n i t ng ny cho phng th c tnh Run c a l p System.Windows.Forms.Application. S d ng i s /target:winexe khi bin d ch assembly c a b n b ng trnh bin d ch C# (csc.exe). Vi c xy d ng m t ng d ng c giao di n ng i dng h a Windows n gi n hon ton khc xa vi c pht tri n m t ng d ng d a-trn-Windows hon ch nh. Tuy nhin, b t k vi t m t ng d ng n gi n nh Hello World hay vi t phin b n k ti p cho Microsoft Word, b n cng ph i th c hi n nh ng vi c sau: T o m t l p th a k t l p System.Windows.Forms.Form cho m i form c n cho ng d ng. Trong m i l p form, khai bo cc thnh vin m t cc i u ki m trn form, v d Button, Label, ListBox, TextBox. Cc thnh vin ny nn c khai bo l private ho c t nh t cng l protected cc ph n t khc c a chng trnh khng truy xu t tr c ti p chng c. N u mu n cho php truy xu t cc i u ki m ny, hi n th c cc thnh vin c n thi t trong l p form cung c p vi c truy xu t gin ti p (ki m sot c) n cc i u ki m n m trong. Trong l p form, khai bo cc phng th c th l cc s ki n do cc i u ki m trn form sinh ra, ch ng h n vi c nh p vo Button, vi c nh n phm khi m t TextBox ang tch c c. Cc phng th c ny nn c khai bo l private ho c protected v tun theo m u s ki n .NET chu n (s c m t trong m c 16.10). Trong cc phng th c ny (ho c trong cc phng th c c g i b i cc cc phng th c ny), b n s nh ngha cc ch c nng c a ng d ng. Khai bo m t phng th c kh i d ng cho l p form t o cc i u ki m trn form v c u hnh tr ng thi ban u c a chng (kch th c, mu, n i dung). Phng th c kh i d ng ny cng nn lin k t cc phng th c th l s ki n c a l p v i cc s ki n tng ng c a m i i u ki m.

Chng 1: Pht tri n

29 ng d ng

Khai bo phng th c tnh Mainth ng l m t phng th c c a l p tng ng v i form chnh c a ng d ng. Phng th c ny l i m b t u c a ng d ng v c cc d ng nh c c p m c 1.1. Trong phng th c Main, t o m t th hi n c a form chnh v truy n n cho phng th c tnh Application.Run. Phng th c Run hi n th form chnh v kh i ch y m t vng l p thng i p chu n trong ti u trnh hi n hnh, chuy n cc tc ng t ng i dng (nh n phm, nh p chu t) thnh cc s ki n g i n ng d ng.

L p WelcomeForm trong v d d i y minh h a cc k thu t trn. Khi ch y, n yu c u ng i dng nh p vo tn r i hi n th m t MessageBox cho m ng.
using System.Windows.Forms; public class WelcomeForm : Form { // Cc thnh vin private gi private Label label1; private TextBox textBox1; private Button button1; tham chi u n cc i u ki m.

// Phng th c kh i d ng (t o m t th hi n form // v c u hnh cc i u ki m trn form). public WelcomeForm() { // T o cc i u ki m trn form. this.label1 = new Label(); this.textBox1 = new TextBox(); this.button1 = new Button(); // T m hon layout logic c a form trong khi // chng ta c u hnh v b tr cc i u ki m. this.SuspendLayout(); // C u hnh cc Label (hi n th yu c u). 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:"; // C u hnh TextBox (nh n thng tin t ng i dng). this.textBox1.Location = new System.Drawing.Point(152, 32); this.textBox1.Name = "textBox1"; this.textBox1.TabIndex = 1; this.textBox1.Text = ""; // C u hnh Buton (ng i dng nh n vo sau khi nh p 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); // C u hnh WelcomeForm v thm cc i u ki m. 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"; this.Text = "Microsoft .NET Framework";

30 Chng 1: Pht tri n

ng d ng

// Ph c h i layout logic c a form ngay khi // t t c cc i u ki m c c u hnh. this.ResumeLayout(false); } // i m nh p c a ng d ng (t o m t th hi n form, ch y vng l p // thng i p chu n trong ti u trnh hi n hnh - vng l p chuy n // cc tc ng t ng i dng thnh cc s ki n n ng d ng). public static void Main() { Application.Run(new WelcomeForm()); } // Phng th c th l s ki n // ( c g i khi ng i dng nh p vo nt Enter). private void button1_Click(object sender, System.EventArgs e) { // Ghi ra Console. System.Console.WriteLine("User entered: " + textBox1.Text); // Hi n th l i cho trong MessageBox. MessageBox.Show("Welcome to Microsoft .NET Framework, " + textBox1.Text, "Microsoft .NET Framework"); } }

Hnh 1.1 M t ng d ng Windows Form n gi n

xy d ng l p WelcomeForm (trong file WelcomeForm.cs) thnh m t ng d ng, s d ng l nh:


csc /target:winexe WelcomeForm.cs

i s /target:winexe bo cho trnh bin d ch bi t y l ng d ng d a-trn-Windows. Do , trnh bin d ch s xy d ng file th c thi sao cho khng c c a s Console no c t o ra khi b n ch y ng d ng. N u b n s d ng /target:exe khi xy d ng m t ng d ng Windows Form thay cho /target:winexe th ng d ng v n lm vi c t t, nhng s t o ra m t c a s Console khi ch y. M c d i u ny khng c a chu ng trong m t ng d ng hon ch nh, c a s Console v n h u ch n u b n c n ghi ra cc thng tin g r i ho c ng nh p khi ang pht tri n v th nghi m m t ng d ng Windows Form. B n c th ghi ra Console b ng phng th c Write v WriteLine c a l p System.Console.

Chng 1: Pht tri n

31 ng d ng

ng d ng WelcomeForm.exe trong hnh 1.1 hi n th l i cho ng i dng c tn l Binh Phuong. Phin b n ny c a ng d ng c xy d ng b ng i s /target:exe, nn c c a s Console hi n th k t qu c a dng l nh Console.WriteLine trong phng th c th l s ki n button1_Click . Vi c xy d ng m t ng d ng GUI s th ng t n nhi u th i gian do ph i t o i t ng, c u hnh v lin k t nhi u form v i u ki m. Nhng may m n l Microsoft Visual Studio .NET t ng ha h u h t cc ho t ng ny. N u khng c cng c nh Microsoft Visual Studio .NET th vi c xy d ng m t ng d ng h a s s r t lu, nhm chn v d sinh ra l i.

1.3
B n c n th c hi n cc cng vi c sau:

To v s dng module
Tng hi u qu th c thi v s d ng b nh c a ng d ng b ng cch b o r ng b th c thi n p cc ki u t c s d ng ch khi no c n thi t. m

Bin d ch cc ki u c vi t trong C# thnh m t d ng c th s d ng l i c trong cc ngn ng .NET khc. S d ng cc ki u d ng C# c a b n. c pht tri n b ng m t ngn ng khc bn trong ng

S d ng i s /target:module (c a trnh bin d ch C#) c a b n thnh m t module. S d ng i s /addmodule c vo assembly c a b n.

xy d ng m ngu n C# k t h p cc module hi n

Module l cc kh i c b n t o d ng nn cc assembly .NET. Module bao g m m t file n ch a: M ngn ng trung gian (Microsoft Intermediate LanguageMSIL): ngu n C# trong qu trnh bin d ch. Siu d li u (metadata): M t cc ki u n m trong module. Cc ti nguyn (resource): Ch ng h n icon v string table, c s d ng b i cc ki u trong module. c t o t m

Assembly g m m t hay nhi u module v m t manifest. Khi ch c m t module, module v manifest th ng c xy d ng thnh m t file cho thu n ti n. Khi c nhi u module, assembly l m t nhm lu n l c a nhi u file c tri n khai nh m t th th ng nh t. Trong tr ng h p ny, manifest c th n m trong m t file ring hay chung v i m t trong cc module. Vi c xy d ng m t assembly t nhi u module gy kh khn cho vi c qu n l v tri n khai assembly; nhng trong m t s tr ng h p, cch ny c nhi u l i ch, bao g m: B th c thi s ch n p m t module khi cc ki u nh ngha trong module ny c yu c u. Do , khi c m t t p cc ki u m ng d ng t khi dng, b n c th t chng trong m t module ring m b th c thi ch n p khi c n. Vi c ny c cc l i ch sau: Tng hi u qu th c thi, c bi t khi ng d ng c n p qua m ng. Gi m thi u nhu c u s d ng b nh .

32 Chng 1: Pht tri n

ng d ng

Kh nng s d ng nhi u ngn ng khc nhau vi t cc ng d ng ch y trn b th c thi ngn ng chung (Common Language RuntimeCLR) l m t th m nh c a .NET Framework. Tuy nhin, trnh bin d ch C# khng th bin d ch m ngu n c vi t b ng Microsoft Visual Basic .NET hay COBOL .NET trong assembly c a b n. B n ph i s d ng trnh bin d ch c a ngn ng bin d ch m ngu n thnh MSIL theo m t c u trc m trnh bin d ch C# c th hi u c l module. Tng t , n u mu n l p trnh vin c a cc ngn ng khc s d ng cc ki u c pht tri n b ng C#, b n ph i xy d ng chng thnh m t module. bin d ch file ngu n ConsoleUtils.cs thnh m t module, s d ng l nh:

csc /target:module ConsoleUtils.cs

L nh ny s cho k t qu l m t file c tn l ConsoleUtils.netmodule. Ph n m r ng netmodule l ph n m r ng m c nh cho module, v tn file trng v i tn file ngu n C#. B n cng c th xy d ng m t module t nhi u file ngu n, cho k t qu l m t file (module) ch a MSIL v siu d li u cho cc ki u ch a trong t t c file ngu n. V d , l nh:
csc /target:module ConsoleUtils.cs WindowsUtils.cs

bin d ch hai file ngu n ConsoleUtils.cs v WindowsUtils.cs thnh m t module c tn l ConsoleUtils.netmodule. Tn c a module c /out. V d , l nh: t theo tn file ngu n u tin tr khi b n ch nh c th b ng is

csc /target:module /out:Utilities.netmodule ConsoleUtils.cs WindowsUtils.cs

s cho k t qu l file Utilities.netmodule. xy d ng m t assembly g m nhi u module, s d ng i s /addmodule. V d , xy d ng file th c thi MyFirstApp.exe t hai module: WindowsUtils.netmodule v ConsoleUtils.netmodule v hai file ngu n: SourceOne.cs v SourceTwo.cs, s d ng l nh:
csc /out:MyFirstApp.exe /target:exe /addmodule:WindowsUtils.netmodule,ConsoleUtils.netmodule SourceOne.cs SourceTwo.cs

L nh ny s cho k t qu l m t assembly g m cc file sau: MyFirstApp.exe: Ch a manifest cng nh MSIL cho cc ki u c khai bo trong hai file ngu n SourceOne.cs v SourceTwo.cs. ConsoleUtils.netmodule v WindowsUtils.netmodule: Gi y l m t ph n c a assembly nhng khng thay i sau khi bin d ch. (N u b n ch y MyFirstApp.exe m khng c cc file netmodule, ngo i l System.IO.FileNotFoundException s b nm).

1.4

To v s dng th vin
B n c n xy d ng m t t p cc ch c nng thnh m t th vi n tham chi u v ti s d ng b i nhi u ng d ng. n c th c

Chng 1: Pht tri n

33 ng d ng

t o th vi n, s d ng i s /target:library khi bin d ch assembly c a b n b ng trnh bin d ch C# (csc.exe). tham chi u th vi n, s d ng i s /reference v ch nh tn c a th vi n khi bin d ch ng d ng. M c 1.1 minh h a cch xy d ng ng d ng MyFirstApp.exe t hai file m ngu n ConsoleUtils.cs v HelloWorld.cs. File ConsoleUtils.cs ch a l p ConsoleUtils, cung c p cc phng th c n gi n ha s tng tc v i Console. Cc ch c nng ny c a l p ConsoleUtils cng c th h u ch cho cc ng d ng khc. s d ng l i l p ny, thay v g p c m ngu n c a n vo m i ng d ng, b n c th xy d ng n thnh m t th vi n, khi n cc ch c nng ny c th truy xu t c b i nhi u ng d ng. xy d ng file ConsoleUtils.cs thnh m t th vi n, s d ng l nh:
csc /target:library ConsoleUtils.cs

L nh ny sinh ra m t file th vi n c tn l ConsoleUtils.dll. t o m t th vi n t nhi u file m ngu n, li t k tn cc file ny cu i dng l nh. B n c th s d ng i s /out ch nh tn th vi n, n u khng, tn th vi n c t theo tn c a file m ngu n u tin. V d , t o th vi n MyFirstLibrary.dll t hai file m ngu n ConsoleUtils.cs v WindowsUtils.cs, s d ng l nh:
csc /out:MyFirstLibrary.dll /target:library ConsoleUtils.cs WindowsUtils.cs

Tr c khi phn ph i th vi n cho ng i khc s d ng, b n nn t o tn m nh (strong-name) khng ai c th ch nh s a assembly c a b n. Vi c t tn m nh cho th vi n cn cho php ng i khc ci t n vo Global Assembly Cache, gip vi c ti s d ng d dng hn (xem m c 1.9 v cch t tn m nh cho th vi n c a b n v m c 1.14 v cch ci t m t th vi n c tn m nh vo Global Assembly Cache). Ngoi ra, b n c th nh d u th vi n c a b n v i ng i dng bi t b n l tc gi c a th vi n (xem m c 1.12 v cch ch k Authenticode nh d u th vi n v i Authenticode). bin d ch m t assembly c s d ng cc ki u c khai bo trong cc th vi n khc, b n ph i bo cho trnh bin d ch bi t c n tham chi u n th vi n no b ng i s /reference. V d , bin d ch file HelloWorld.cs (trong m c 1.1) trong tr ng h p l p ConsoleUtils n m trong th vi n ConsoleUtils.dll, s d ng l nh:
csc /reference:ConsoleUtils.dll HelloWorld.cs

B n c n ch ba i m sau: N u tham chi u nhi u hn m t th vi n, b n c n phn cch tn cc th vi n b ng d u ph y ho c ch m ph y, nhng khng s d ng kho ng tr ng. V d :
/reference:ConsoleUtils.dll,WindowsUtils.dll

N u th vi n khng n m cng th m c v i file m ngu n, b n c n s d ng ch nh th m c ch a th vi n. V d :


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

i s /lib

N u th vi n c n tham chi u l m t assembly g m nhi u file, b n c n tham chi u file c ch a manifest (xem thng tin v assembly g m nhi u file trong m c 1.3).

34 Chng 1: Pht tri n

ng d ng

1.5
B n c n truy xu t cc is

Truy xut cc i s dng lnh


c ch nh trn dng l nh khi th c thi ng d ng. S d ng m t d ng c a phng th c Main, trong nh n i s dng l nh d i d ng m t m ng chu i. Ngoi ra, c th truy xu t i s dng l nh t b t c u trong m ngu n c a b n b ng cc thnh vin tnh c a l p System.Environment.

Khai bo phng th c Main thu c m t trong cc d ng sau d ng m t m ng chu i:


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

truy xu t

i s dng l nh d i

Khi ch y, i s args s ch a m t chu i cho m i gi tr c nh p trn dng l nh v n m sau tn ng d ng. Phng th c Main trong v d d i y s duy t qua m i i s dng l nh c truy n cho n v hi n th chng ra c a s Console:
public class CmdLineArgExample { public static void Main(string[] args) { // Duy t qua cc i s dng l nh. foreach (string s in args) { System.Console.WriteLine(s); } } }

Khi th c thi CmdLineArgExample v i l nh:


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

ng d ng s t o ra k t xu t nh sau:
one "two" four 'five six' three

Ch r ng, khc v i C v C++, tn c a ng d ng khng n m trong m ng ch a cc i s . T t c k t n m trong d u nhy kp () c xem nh m t i s , nhng d u nhy n (') ch c xem nh k t bnh th ng. N u mu n s d ng d u nhy kp trong i s , t k t v ch ng c (\) tr c n. T t c cc kho ng tr ng u b b qua tr khi chng n m trong d u nhy kp. N u mu n truy xu t i s dng l nh ni khc (khng ph i trong phng th c Main), b n s d ng sau ny. c n x l cc i s dng l nh trong phng th c Main v lu tr chng Ngoi ra, b n c th s d ng l p System.Environment, l p ny cung c p hai thnh vin tnh tr v thng tin dng l nh: CommandLine v GetCommandLineArgs. Thu c tnh CommandLine tr v m t chu i ch a ton b dng l nh. Ty thu c vo h i u hnh ng d ng ang ch y m thng tin ng d n c ng tr c tn ng d ng hay khng. Cc h i u hnh Windows NT 4.0, Windows 2000, v Windows XP khng ch a thng tin ng d n, trong khi Windows 98 v Windows ME th l i ch a.

Chng 1: Pht tri n

35 ng d ng

Phng th c GetCommandLineArgs tr v m t m ng chu i ch a cc i s dng l nh. M ng ny c th c x l gi ng nh m ng c truy n cho phng th c Main, tuy nhin ph n t u tin c a m ng ny l tn ng d ng.

1.6

Chn bin dch mt khi m vo file thc thi


B n c n ch n m t s ph n m ngu n s c bin d ch trong file th c thi. S d ng cc ch th ti n x l #if, #elif, #else, v #endif ch nh kh i m no s c bin d ch trong file th c thi. S d ng c tnh System.Diagnostics. ConditionalAttribute ch nh cc phng th c m s ch c g i ty theo i u ki n. i u khi n vi c ch n cc kh i m b ng cc ch th #define v #undef trong m ngu n, ho c s d ng i s /define khi ch y trnh bin d ch C#.

N u mu n ng d ng c a b n ho t ng khc nhau ty vo cc y u t nh n n ho c mi tr ng m ng d ng ch y, b n c th ki m tra i u ki n khi ch y bn trong m ngu n v kch ho t cc ho t ng c n thi t. Tuy nhin, cch ny lm m ngu n l n ln v nh h ng n hi u nng. M t cch ti p c n khc l xy d ng nhi u phin b n c a ng d ng h tr cc n n v mi tr ng khc nhau. M c d cch ny kh c ph c c cc v n v l n c a m ngu n v vi c gi m hi u nng, nhng n khng ph i l gi i php t t khi ph i gi m ngu n khc nhau cho m i phin b n. V v y, C# cung c p cc tnh nng cho php b n xy d ng cc phin b n ty bi n c a ng d ng ch t m t m ngu n. Cc ch th ti n x l cho php b n ch nh cc kh i m s c bin d ch vo file th c thi ch n u cc k hi u c th c nh ngha lc bin d ch. Cc k hi u ho t ng nh cc cng t c on/off, chng khng c gi tr m ch l c nh ngha hay cha c nh ngha. nh ngha m t k hi u, b n c th s d ng ch th #define trong m ngu n ho c s d ng i s trnh bin d ch /define. K hi u c nh ngha b ng #define c tc d ng n cu i file nh ngha n. K hi u c nh ngha b ng /define c tc d ng trong t t c cc file ang c bin d ch. b m t k hi u nh ngha b ng /define, C# cung c p ch th #undef, h u ch khi b n mu n b o m m t k hi u khng c nh ngha trong cc file ngu n c th . Cc ch th #define v #undef ph i n m ngay u file m ngu n, trn c cc ch th using. Cc k hi u c phn bi t ch hoa-th ng. Trong v d sau, bi n platformName c gn gi tr ty vo cc k hi u winXP, win2000, winNT, ho c win98 c c nh ngha hay khng. Ph n u c a m ngu n nh ngha cc k hi u win2000 v released (khng c s d ng trong v d ny), v b k hi u win98 trong tr ng h p n c nh ngha trn dng l nh trnh bin d ch.
#define win2000 #define release #undef win98 using System; public class ConditionalExample { public static void Main() { // Khai bo chu i ch a tn c a n n.

36 Chng 1: Pht tri n

ng d ng

string platformName; #if winXP // platformName = #elif win2000 // platformName = #elif winNT // platformName = #elif win98 // platformName = #else // platformName = #endif } } Bin d ch cho Windows XP "Microsoft Windows XP"; Bin d ch cho Windows 2000 "Microsoft Windows 2000"; Bin d ch cho Windows NT "Microsoft Windows NT"; Bin d ch cho Windows 98 "Microsoft Windows 98"; N n khng c nh n bi t "Unknown";

Console.WriteLine(platformName);

xy d ng l p ConditionalExample (ch a trong file ConditionalExample.cs) v cc k hi u winXP v DEBUG (khng c s d ng trong v d ny), s d ng l nh:
csc /define:winXP;DEBUG ConditionalExample.cs

nh ngha

C u trc #if .. #endif nh gi cc m nh #if v #elif ch n khi tm th y m t m nh ng, ngha l n u c nhi u k hi u c nh ngha (ch ng h n, winXP v win2000), th t cc m nh l quan tr ng. Trnh bin d ch ch bin d ch o n m n m trong m nh ng. N u khng c m nh no ng, trnh bin d ch s bin d ch o n m n m trong m nh #else. B n cng c th s d ng cc ton t lu n l B ng 1.1 tm t t cc ton t c h tr . bin d ch c i u ki n d a trn nhi u k hi u.

B ng 1.1 Cc ton t lu n l c h tr b i ch th #if .. #endif Ton t == V d #if winXP == true M t

B ng. ng n u winXP ng v i #if winXP.

nh ngha. Tng c nh

!=

#if winXP != true

Khng b ng. ng n u winXP khng ngha. Tng ng v i #if !winXP. Php AND lu n l. nh ngha. Php OR lu n l. c nh ngha.

&&

#if winXP && release

ng n u winXP v release c ng n u winXP ho c release

||

#if winXP || release

()

#if (winXP || win2000) && release

D u ngo c n cho php nhm cc bi u th c. ng n u winXP ho c win2000 c nh ngha, ng th i release cng c nh ngha.

B n khng nn l m d ng cc ch th bin d ch c i u ki n v khng nn vi t cc bi u th c i u ki n qu ph c t p; n u khng, m ngu n c a b n s tr nn d nh m l n v kh qu n l c bi t khi d n c a b n cng l n.

Chng 1: Pht tri n

37 ng d ng

M t cch khc khng linh ho t nhng hay hn ch th ti n x l #if l s d ng c tnh System.Diagnostics.ConditionalAttribute. N u b n p d ng ConditionalAttribute cho m t phng th c, trnh bin d ch s b qua m i l i g i phng th c n u k hi u do ConditionalAttribute ch nh khng c nh ngha t i i m g i. Trong o n m sau, ConditionalAttribute xc nh r ng phng th c DumpState ch c bin d ch vo file th c thi n u k hi u DEBUG c nh ngha khi bin d ch.
[System.Diagnostics.Conditional("DEBUG")] public static void DumpState() {//...}

Vi c s d ng ConditionalAttribute gip t cc i u ki n g i m t phng th c t i ni khai bo n m khng c n cc ch th #if. Tuy nhin, b i v trnh bin d ch th t s b qua cc l i g i phng th c, nn m c a b n khng th ph thu c vo cc gi tr tr v t phng th c. i u ny c ngha l b n c th p d ng ConditionalAttribute ch v i cc phng th c tr v void. B n c th p d ng nhi u th hi n ConditionalAttribute cho m t phng th c, tng ng v i php OR lu n l. Cc l i g i phng th c DumpState d i y ch c bin d ch n u DEBUG ho c TEST c nh ngha.
[System.Diagnostics.Conditional("DEBUG")] [System.Diagnostics.Conditional("TEST")] public static void DumpState() {//...}

Vi c th c hi n php AND lu n l c n s d ng phng th c i u ki n trung gian, khi n cho m tr nn qu ph c t p, kh hi u v kh b o tr. V d d i y c n phng th c trung gian DumpState2 nh ngha c hai k hi u DEBUG v TEST.
[System.Diagnostics.Conditional("DEBUG")] public static void DumpState() { DumpState2(); } [System.Diagnostics.Conditional("TEST")] public static void DumpState2() {//...}

Cc l p Debug v Trace thu c khng gian tn System.Diagnostics s d ng c tnh ConditionalAttribute trong nhi u phng th c c a chng. Cc phng th c c a l p Debug ty thu c vo vi c nh ngha k hi u DEBUG, cn cc phng th c c a l p Trace ty thu c vo vi c nh ngha k hi u TRACE.

1.7

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


B n c n truy xu t m t thnh vin c a m t ki u, nhng tn ki u ho c tn thnh vin ny trng v i m t t kha c a C#. t k hi u @ vo tr c cc tn trng v i t kha.

.NET Framework cho php b n s d ng cc thnh ph n ph n m m (software component) c pht tri n b ng cc ngn ng .NET khc bn trong ng d ng C# c a b n. M i ngn ng u c m t t p t kha (ho c t dnh ring) cho n v c cc h n ch khc nhau i v i cc

38 Chng 1: Pht tri n

ng d ng

tn m l p trnh vin c th gn cho cc ph n t chng trnh nh ki u, thnh vin, v bi n. Do , c kh nng m t thnh ph n c pht tri n trong m t ngn ng khc tnh c s d ng m t t kha c a C# t tn cho m t ph n t no . K hi u @ cho php b n s d ng m t tn. o n m sau t o m t i t ng t kha c a C# lm nh danh v kh c ph c vi c ng ki u operator v thi t l p thu c tnh volatile c a n l true (c operator v volatile u l t kha c a C#):
// T o i t ng operator. @operator Operator1 = new @operator(); // Thi t l p thu c tnh volatile c a operator. Operator1.@volatile = true;

1.8

To v qun l cp kha tn mnh


B n c n t o m t c p kha cng khai v kha ring (public key v private key) gn tn m nh cho assembly. S d ng cng c Strong Name (sn.exe) t o c p kha v lu tr chng trong m t file ho c trong m t kho ch a kha Cryptographic Service Provider. Cryptographic Service Provider (CSP) l m t ph n t c a Win32 CryptoAPI, cung c p cc d ch v nh m t ha, gi i m t ha v t o ch k s . CSP cn cung c p cc ti n ch cho kho ch a kha (key container) nh s d ng gi i thu t m t ha m nh v cc bi n php b o m t c a h i u hnh b o v n i dung c a kho ch a kha. CSP v CryptoAPI khng c c p y trong quy n sch ny, b n hy tham kh o thm trong ti li u SDK.

MyKey.snk (ph n m

t o m t c p kha m i v lu tr chng trong file c tn l MyKey.snk, th c thi l nh sn k r ng .snk th ng c s d ng cho cc file ch a kha tn m nh). File c t o ra ch a c kha cng khai v kha ring. B n c th s d ng l nh sn tp MyKey.snk xem kha cng khai, l nh ny cho k t xu t 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 07020000002400005253413200040000010001008bb302ef9180bf717ace00d570dd649821f24ed57 8fdccf1bc4017308659c126570204bc4010fdd1907577df1c2292349d9c2de33e49bd991a0a5bc9b6 9e5fd95bafad658a57b8236c5bd9a43be022a20a52c2bd8145448332d5f85e9ca641c26a4036165f2 f353942b643b10db46c82d6d77bbc210d5a7c5aca84d7acb52cc1654759c62aa34988... Public key token is f7241505b81b5ddc

Token c a kha cng khai l 8 byte cu i c a m bm c tnh ra t kha cng khai. V kha cng khai qu di nn .NET s d ng token cho m c ch hi n th , v l m t c ch ng n g n cho cc assembly khc tham chi u kha cng khai (chng 14 s th o lu n t ng qut v m bm). Nh tn g i c a n, kha cng khai (ho c token c a kha cng khai) khng c n c gi b m t. Khi b n t o tn m nh cho assembly ( c th o lu n trong m c 1.9), trnh bin d ch s s d ng kha ring t o m t ch k s (m t m bm - c-m t-ha) c a assembly manifest.

Chng 1: Pht tri n

39 ng d ng

Trnh bin d ch nhng ch k s v kha cng khai vo assembly tra ch k s .

ng i dng c th ki m

Vi c gi b m t kha ring l c n thi t v ng i truy xu t vo kha ring c a b n c th thay i assembly v t o m t tn m nh m ikhi n cho khch hng c a b n khng bi t m ngu n b s a i. Khng c c ch no lo i b cc kha tn m nh b t n h i. N u kha ring b t n h i, b n ph i t o kha m i v phn ph i phin b n m i c a assembly ( c t tn m nh b ng cc kha m i). B n cng c n thng bo cho khch hng bi t l kha b t n h i v h nn s d ng phin b n notrong tr ng h p ny, b n b m t c ti n b c v uy tn. C nhi u cch b o v kha ring c a b n; s d ng cch no l ty vo cc y u t nh: C u trc v t m c c a t ch c. Qu trnh pht tri n v phn ph i ng d ng. Ph n m m v ph n c ng hi n c. Yu c u c a khch hng. Thng th ng, m t nhm nh cc c nhn ng tin c y ( c g i l signing authority) s c trch nhi m m b o an ton cho cc kha tn m nh c a cng ty v k m i assembly tr c khi chng c phn ph i. Kh nng tr hon k assembly (s c th o lu n m c 1.11) t o i u ki n thu n l i cho vi c ng d ng m hnh ny v trnh c vi c b n ph i phn ph i kha ring cho m i thnh vin c a nhm pht tri n. Cng c Strong Name cn cung c p tnh nng s d ng kho ch a kha CSP n gi n ha vi c b o m t cc kha tn m nh. M t khi t o m t c p kha trong m t file, b n c th ci lu tr c p kha n m trong t cc kha ny vo kho ch a kha CSP v xa file i. V d , file MyKey.snk vo m t kho ch a kha CSP c tn l StrongNameKeys, s d ng l nh sn -i MyKeys.snk StrongNameKeys (m c 1.9 s gi i thch cch s d ng cc kha tn m nh c lu tr trong m t kho ch a kha CSP). M t kha c nh quan tr ng c a kho ch a kha CSP l c cc kho ch a kha d a-theo ng idng v c cc kho ch a kha d a-theo-my. C ch b o m t c a Windows b o m ng i dng ch truy xu t c kho ch a kha d a-theo-ng i-dng c a chnh h . Tuy nhin, b t k ng i dng no c a my u c th truy xu t kho ch a kha d a-theo-my. Theo m c nh, cng c Strong Name s d ng kho ch a kha d a-theo-my, ngha l m i ng i ng nh p vo my v bi t tn c a kho ch a kha u c th k m t assembly b ng cc kha tn m nh c a b n. cng c Strong Name s d ng kho ch a kha d a-theo-ng idng, s d ng l nh sn m n; khi mu n tr l i kho ch a kha d a-theo-my, s d ng l nh sn m y. L nh sn m s cho bi t cng c Strong Name hi n c c u hnh l s d ng kho ch a kha d a-theo-ng i-dng hay d a-theo-my. xa cc kha tn m nh t kho StrongNameKeys (cng nh xa c kho ny), s d ng l nh
sn d StrongNameKeys.

1.9

To tn mnh cho assembly


B n c n t o tn m nh cho m t assembly n:

40 Chng 1: Pht tri n

ng d ng

C m t nh danh duy nh t, cho php gn cc quy n c th vo assembly khi c u hnh Code Access Security Policy (chnh sch b o m t cho vi c truy xu t m l nh). Khng th b s a i v sau m o nh n l nguyn b n. ng d ng, v c ci t trong Global H tr vi c nh s phin b n v cc chnh sch v phin b n (version policy). C th c chia s trong nhi u Assembly Cache (GAC).

S d ng cc c tnh (attribute) m c-assembly ch nh ni ch a c p kha tn m nh, v c th ch nh thm s phin b n v thng tin b n a cho assembly. Trnh bin d ch s t o tn m nh cho assembly trong qu trnh xy d ng. t o tn m nh cho m t assembly b ng trnh bin d ch C#, b n c n cc y u t sau: M t c p kha tn m nh n m trong m t file ho c m t kho ch a kha CSP (xem m c 1.8 v cch t o c p kha tn m nh). S d ng cc c tnh m c-assembly kha tn m nh . ch nh ni trnh bin d ch c th tm th y c p

N u c p kha n m trong m t file, p d ng c tnh System.Reflection. AssemblyKeyFileAttribute cho assembly v ch nh tn file ch a cc kha. N u c p kha n m trong m t kho ch a kha CSP, p d ng c tnh System.Reflection.AssemblyKeyNameAttribute cho assembly v ch nh tn c a kho ch a kha.

Ngoi ra, b n c th ty ch n: p d ng c tnh System.Reflection.AssemblyCultureAttribute cho assembly ch nh thng tin b n a m assembly h tr (B n khng th ch nh b n a cho cc assembly th c thi v assembly th c thi ch h tr b n a trung l p). p d ng c tnh System.Reflection.AssemblyVersionAttribute cho assembly nh phin b n c a assembly. ch

o n m d i y (trong file HelloWorld.cs) minh h a cch s d ng cc m) ch nh kha, b n a, v phin b n 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"); } }

c tnh (ph n in

t o m t assembly tn m nh t o n m trn, t o cc kha tn m nh v lu tr chng trong file MyKeyFile b ng l nh sn -k MyKeyFile.snk. Sau , s d ng l nh sn -i MyKeyFile.snk

Chng 1: Pht tri n MyKeys

41 ng d ng

t cc kha vo m t kho ch a kha CSP c tn l MyKeys. Cu i cng, s d ng l nh csc HelloWorld.cs bin d ch file HelloWorld.cs thnh m t assembly tn m nh. B n cng c th s d ng cng c Assembly Linker (al.exe) t o assembly tn m nh, cch ny cho php ch nh cc thng tin tn m nh trn dng l nh thay v s d ng cc c tnh trong m ngu n. Cch ny h u ch khi b n khng mu n nhng cc c tnh tn m nh vo file ngu n v khi b n s d ng k ch b n xy d ng nh ng cy m ngu n s . Xem thm thng tin v Assembly Linker trong ti li u .NET Framework SDK.

ci

1.10

Xc minh mt assembly tn mnh khng b sa i

B n c n xc minh r ng m t assembly tn m nh cha h b s a c bin d ch. S d ng cng c Strong Name (sn.exe)

i sau khi n

xc minh tn m nh c a assembly.

M i khi n p m t assembly tn m nh, b th c thi .NET l y m bm - c-m t-ha ( c nhng trong assembly) v gi i m t ha v i kha cng khai (cng c nhng trong assembly). Sau , b th c thi tnh m bm c a assembly manifest v so snh n v i m bm v a- c-gi i-m t-ha. Qu trnh xc minh ny s nh n bi t assembly c b thay i sau khi bin d ch hay khng. N u m t qu trnh xc minh tn m nh th t b i v i m t assembly th c thi, b th c thi s hi n th h p tho i nh hnh 1.2. N u c n p m t assembly th t b i trong qu trnh xc minh, b th c thi s nm ngo i l System.IO.FileLoadException v i thng i p Strong name validation failed.

Hnh 1.2 L i khi c th c thi m t assembly tn m nh b s a

Ngoi vi c t o v qu n l cc kha tn m nh ( c th o lu n trong m c 1.8), cng c Strong Name cn cho php xc minh cc assembly tn m nh. xc minh assembly tn m nh HelloWorld.exe khng b s a i, s d ng l nh sn -vf HelloWorld.exe. i s -v yu c u cng c Strong Name xc minh tn m nh c a m t assembly xc nh, i s -f bu c th c hi n vi c xc minh tn m nh ngay c n b v hi u tr c cho m t assembly no . (B n c th s d ng i s -Vr v hi u vi c xc minh tn m nh i v i m t assembly, v d sn -Vr HelloWorld.exe; m c 1.11 s trnh by l do t i sao c n v hi u vi c xc minh tn m nh). N u assembly ny c xc minh l khng i, b n s th y k t xu t nh sau:
Version 1.1.4322.573 Microsoft (R) .NET Framework Strong Name Utility

42 Chng 1: Pht tri n

ng d ng

Copyright (C) Microsoft Corporation 1998-2002. All rights reserved. Assembly 'HelloWorld.exe' is valid

Tuy nhin, n u assembly ny b s a

i, b n s th y k t xu t 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

1.11

Hon vic k assembly

B n c n t o m t assembly tn m nh, nhng khng mu n m i thnh vin trong nhm pht tri n truy xu t kha ring c a c p kha tn m nh. Trch xu t v phn ph i kha cng khai c a c p kha tn m nh. Lm theo h ng d n trong m c 1.9 t o tn m nh cho assembly. p d ng c tnh System.Reflection.AssemblyDelaySignAttribute cho assembly ch nh n l assembly s c k sau. S d ng i s -Vr c a cng c Strong Name (sn.exe) v hi u vi c xc minh tn m nh cho assembly ny. Cc assembly tham chi u n assembly tn m nh s ch a token c a assembly c tham chi u, ngha l assembly c tham chi u ph i c t o tn m nh tr c khi c tham chi u. Trong m t mi tr ng pht tri n m assembly th ng xuyn c xy d ng l i, m i ng i pht tri n v ki m th u c n c quy n truy xu t c p kha tn m nh c a b n y l m t nguy c b o m t ch y u. Thay v phn ph i kha ring cho m i thnh vin c a nhm pht tri n, .NET Framework cung c p c ch hon vi c k m t assembly ( c g i l delay signing), theo b n c th t o tn m nh khng hon ch nh cho assembly (t m g i l tn m nh bn ph n). Tn m nh bn ph n ny ch ch a kha cng khai v token c a kha cng khai (c n thi t tham chi u assembly), nhng ch a ch cho ch k s c t o ra t kha ring sau ny. Khi qu trnh pht tri n hon t t, signing authority (ng i ch u trch nhi m v vi c b o m t v vi c s d ng c p kha tn m nh) s k l i assembly b hon tr c hon thnh tn m nh cho n. Ch k c tnh ton d a trn kha ring v c nhng vo assembly, v gi y b n c th phn ph i assembly. Khi hon vi c k m t assembly, b n ch c n truy xu t kha cng khai c a c p kha tn m nh. Khng c nguy c b o m t no t vi c phn ph i kha cng khai, v signing authority ph i phn ph i kha cng khai n m i thnh vin c a nhm pht tri n. trch xu t kha cng khai t file MyKeys.snk v ghi n vo file MyPublicKey.snk, s d ng l nh sn -p MyKeys.snk MyPublicKey.snk. N u b n lu tr c p kha tn m nh trong m t kho ch a kha CSP c tn l MyKeys, s d ng l nh sn -pc MyKeys MyPublicKey.snk trch xu t kha cng khai ra r i lu tr n vo file MyPublicKey.snk. V d d i y p d ng cc c tnh c th o lu n trong m c 1.9 khai bo phin b n, b n a, v ni ch a kha cng khai. ng th i p d ng c tnh AssemblyDelaySign(true) cho assembly bo cho trnh bin d ch bi t b n mu n tr hon vi c k assembly.
using System; using System.Reflection;

Chng 1: Pht tri n [assembly:AssemblyKeyFile("MyPublicKey.snk")] [assembly:AssemblyCulture("")] [assembly:AssemblyVersion("1.0.0.0")] [assembly:AssemblyDelaySign(true)] public class HelloWorld { public static void Main() { Console.WriteLine("Hello, world"); } }

43 ng d ng

Khi c n p m t assembly b hon k, b th c thi s nh n ra assembly ny c tn m nh v c xc minh assembly (nh c th o lu n trong m c 1.10). Nhng v khng c ch k s nn b n ph i v hi u ch c nng xc minh ny b ng l nh sn -Vr HelloWorld.exe. Khi qu trnh pht tri n hon t t, b n c n k l i assembly hon thnh tn m nh cho assembly. Cng c Strong Name cho php th c hi n i u ny m khng c n thay i m ngu n ho c bin d ch l i assembly, tuy nhin, b n ph i c quy n truy xu t kha ring c a c p kha tn m nh. k l i assembly c tn l HelloWorld.exe v i c p kha n m trong file MyKeys.snk, s d ng l nh sn -R HelloWorld.exe MyKeys.snk. N u c p kha c lu tr trong m t kho ch a kha CSP c tn l MyKeys, s d ng l nh sn -Rc HelloWorld.exe MyKeys. Sau khi k l i assembly, b n ph i m ch c nng xc minh tn m nh cho assembly b ng i s -Vu c a cng c Strong Name, v d sn -Vu HelloWorld.exe. kch ho t l i vi c xc minh tn m nh cho t t c cc assembly b b n v hi u tr c , s d ng l nh sn Vx. S d ng l nh sn -Vl xem danh sch cc assembly b v hi u ch c nng ny. Khi s d ng assembly k sau, b n nn so snh cc l n xy d ng khc nhau c a assembly b o m chng ch khc nhau ch k. i u ny ch c th th c hi n c n u assembly c k l i b ng i s -R c a cng c Strong Name. S d ng l nh sn -D assembly1 assembly2 so snh hai assembly.

Hnh 1.3 T m hon vi c k assembly

44 Chng 1: Pht tri n

ng d ng

Hnh 1.4 K l i assembly

1.12

K assembly vi ch k s Authenticode

B n c n k m t assembly b ng Authenticode ng i dng bi t b n chnh l ng i pht hnh (publisher) v assembly khng b s a i sau khi k. S d ng cng c File Signing (signcode.exe) Certificate (SPC) c a b n. k assembly v i Software Publisher

Tn m nh cung c p m t nh danh duy nh t cng nh ch ng minh tnh ton v n c a m t assembly, nhng n khng xc minh ai l ng i pht hnh assembly ny. Do , .NET k assembly. i u ny cho php ng i dng Framework cung c p k thu t Authenticode bi t b n l ng i pht hnh v xc nh n tnh ton v n c a assembly. Ch k Authenticode cn c s d ng lm ch ng c (evidence) cho assembly khi c u hnh chnh sch b o m t truy xu t m l nh (Code Access Security Policyxem m c 13.9 v 13.10). k m t assembly v i ch k Authenticode, b n c n m t SPC do m t Certificate Authority c p SPC (cng v i nhi u ki u ch ng ch khc) cho cc c (CA) c p. CA c trao quy n nhn ho c cng ty s d ng. Tr c khi c p m t ch ng ch , CA c trch nhi m xc nh n nh ng ng i yu c u v b o m h k k t khng s d ng sai cc ch ng ch do CA c p. c c m t SPC, b n nn xem Microsoft Root Certificate Program Members t i
[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsecure/html/rootcertprog.asp].

y, b n c th tm th y danh sch cc CA, nhi u CA trong s c th c p cho b n m t SPC. V i m c ch th nghi m, b n c th t o m t SPC th nghi m theo qu trnh s c m t trong m c 1.13. Tuy nhin, b n khng th phn ph i ph n m m c k v i ch ng ch th nghi m ny. V m t SPC th nghi m khng do m t CA ng tin c y c p, nn h u h t ng i dng s khng tin t ng assembly c k b ng SPC th nghi m ny. Khi c m t SPC, s d ng cng c File Signing k assembly c a b n. Cng c File Signing s d ng kha ring c a SPC t o m t ch k s v nhng ch k ny cng ph n cng khai c a SPC vo assembly (bao g m kha cng khai). Khi xc minh m t assembly, ng i dng s d ng kha cng khai gi i m t ha m bm - c-m t-ha, tnh ton l i m bm c a assembly, v so snh hai m bm ny b o m chng l nh nhau. Khi hai m

Chng 1: Pht tri n

45 ng d ng

bm ny trng nhau, ng i dng c th ch c ch n r ng b n k assembly, v n khng b thay i t khi b n k. V d , k m t assembly c tn l MyAssembly.exe v i m t SPC n m trong file MyCert.spc v kha ring n m trong file MyPrivateKey.pvk, s d ng l nh:
signcode -spc MyCert.spc -v MyPrivateKey.pvk MyAssembly.exe

Trong v d ny, cng c File Signing s hi n th m t h p tho i nh hnh 1.5, yu c u b n nh p m t kh u ( c s d ng b o v kha ring trong file MyPrivateKey.pvk).

Hnh 1.5 Cng c File Signing yu c u nh p m t kh u khi truy xu t file ch a kha ring

B n cng c th truy xu t kha v ch ng ch trong cc kho ch a. B ng 1.2 li t k cc i s th ng dng nh t c a cng c File Signing. B n hy tham kh o ti li u .NET Framework xem t t c cc i s . SDK
B ng 1.2 Cc is -k -s -spc -v i s th ng dng c a cng c File Signing M t

Ch Ch Ch Ch

nh tn c a kho ch a kha ring SPC nh tn c a kho ch a SPC nh tn file ch a SPC nh tn file ch a kha ring SPC

k m t assembly g m nhi u file, b n c n ch nh tn file ch a assembly manifest. N u mu n s d ng c tn m nh v Authenticode cho assembly, b n ph i t o tn m nh cho assembly tr c (xem cch t o tn m nh cho assembly trong m c 1.9). ki m tra tnh h p l c a m t file c k v i ch k Authenticode, s d ng cng c Certificate Verification (chktrust.exe). V d , s d ng l nh chktrust MyAssembly.exe ki m tra file MyAssembly.exe. N u cha c u hnh cho h th ng n tin t ng SPC dng k assembly, b n s th y h p tho i tng t nh hnh 1.6, hi n th thng tin v ng i pht hnh v cho b n ch n l c tin t ng ng i pht hnh hay khng (ch ng ch trong hnh 1.6 l m t ch ng ch th nghi m c t o theo qu trnh c m t trong m c 1.13). N u b n nh p Yes, ho c tr c ch n l lun tin t ng SPC, cng c Verification xc nh n tnh h p l c a ch k v assembly. Certificate

46 Chng 1: Pht tri n

ng d ng

Hnh 1.6 Cng c Certificate Verification

1.13

To v thit lp tin tng mt SPC th nghim


th nghi m.

B n c n t o m t SPC

S d ng cng c Certificate Creation (makecert.exe) t o m t ch ng ch X.509 v t o m t SPC t s d ng cng c Software Publisher Certificate (cert2spc.exe) ch ng ch X.509 ny. Thi t l p tin t ng ch ng ch th nghi m b ng cng c Set Registry (setreg.exe). t o m t SPC th nghi m cho m t nh pht hnh ph n m m c tn l Square Nguyen, tr c t o m t ch ng ch X.509. L nh: h t s d ng cng c Certificate Creation
makecert -n "CN=Square Nguyen" -sk MyKeys TestCertificate.cer

s t o m t file c tn l TestCertificate.cer ch a m t ch ng ch X.509, v lu tr kha ring tng ng trong m t kho ch a kha CSP c tn l MyKeys ( c t o t ng n u cha t n t i). B n cng c th ghi kha ring vo file b ng cch thay -sk b ng -sv. V d , ghi kha ring vo m t file c tn l PrivateKeys.pvk, s d ng l nh:
makecert -n "CN=Square Nguyen" -sv PrivateKey.pvk TestCertificate.cer

Chng 1: Pht tri n Hnh 1.7 Cng c Certificate Creation nh c nh p m t kh u

47 ng d ng

b o v file ch a kha ring

N u b n ghi kha ring vo file, cng c Certificate Creation s nh c b n nh p m t kh u b o v file ny (xem hnh 1.7). Cng c Certificate Creation h tr nhi u i s , b ng 1.3 li t k m t vi Xem thm ti li u .NET Framework SDK v cng c Certificate Creation.
B ng 1.3 Cc is -e -m i s th ng dng c a cng c Certificate Creation M t

i s th ng dng.

Ch Ch

nh ngy ch ng ch khng cn hi u l c. nh kho ng th i gian (tnh b ng thng) m ch ng ch cn hi u l c.

-n

Ch nh m t tn X.500 tng ng v i ch ng ch . y l tn c a ng i pht hnh ph n m m m ng i dng th y khi h xem chi ti t c a SPC t o ra. Ch nh tn CSP gi kha ring.

-sk -ss -sv

Ch nh tn kho ch ng ch (cng c Certificate Creation s lu ch ng ch X.509 trong ). Ch nh tn file gi kha ring.

Khi t o m t ch ng ch X.509 b ng cng c Certificate Creation, c n chuy n ch ng ch ny thnh m t SPC b ng cng c Software Publisher Certificate Test (cert2spc.exe). chuy n TestCertificate.cer thnh m t SPC, s d ng l nh:
cert2spc TestCertificate.cer TestCertificate.spc

Cng c Software Publisher Certificate Test khng c

i s ty ch n no.

B c cu i cng s d ng SPC th nghi m l thi t l p tin t ng CA th nghi m g c (root test CA); y l ng i pht hnh m c nh cc ch ng ch th nghi m. B c ny ch c n l nh setreg 1 true c a cng c Set Registry (setreg.exe). Khi k t thc th nghi m SPC, b thi t l p tin t ng i v i CA th nghi m b ng l nh setreg 1 false. By gi , b n c th s d ng SPC th nghi m k assembly v i Authenticode nh qu trnh m t m c 1.12.

1.14

Qun l Global Assembly Cache


dng l nh xem n i

B n c n thm ho c lo i b assembly t Global Assembly Cache (GAC). S d ng cng c Global Assembly Cache (gacutil.exe) t dung c a GAC, cng nh thm ho c lo i b assembly.

Tr c khi c ci t vo GAC, assembly ph i c tn m nh (xem m c 1.9 v cch t o tn m nh cho assembly). ci t assembly c tn l SomeAssembly.dll vo GAC, s d ng l nh gacutil /i SomeAssembly.dll. lo i b SomeAssembly.dll ra kh i GAC, s d ng l nh gacutil /u SomeAssembly. Ch khng s d ng ph n m r ng .dll ni n assembly m t khi n c ci t vo GAC.

48 Chng 1: Pht tri n

ng d ng

xem cc assembly c ci t vo GAC, s d ng l nh gacutil /l. L nh ny s li t k t t c cc assembly c ci t trong GAC, cng nh danh sch cc assembly c bin d ch tr c sang d ng nh phn v ci t trong NGEN cache. S d ng l nh gacutil /l SomeAssembly trnh ph i tm h t danh sch xem m t assembly c ci t cha. .NET Framework s d ng GAC ch khi th c thi, trnh bin d ch C# s khng tm trong GAC b t k tham chi u ngo i no m assembly c a b n tham chi u n. Trong qu trnh pht tri n, trnh bin d ch C# ph i truy xu t c m t b n sao c c b c a b t k assembly chia s no c tham chi u n. B n c th chp assembly chia s vo th m c m ngu n c a b n, ho c s d ng i s /lib c a trnh bin d ch C# ch nh th m c m trnh bin d ch c th tm th y cc assembly c n thi t trong .

1.15

Ngn ngi khc dch ngc m ngun ca bn


m assembly .NET c a b n khng b d ch ng c.

B n mu n b o

Xy d ng cc gi i php d a-trn-server n u c th ng i dng khng truy xu t assembly c. N u b n ph i phn ph i assembly th khng c cch no ngn ng i dng d ch ng c chng. Cch t t nh t c th lm l s d ng k thu t obfuscation v cc thnh ph n c bin d ch thnh m l nh nguyn sinh (native code) assembly kh b d ch ng c hn. V assembly .NET bao g m m t t p cc m l nh v siu d li u c chu n ha, c l p n n t ng m t cc ki u n m trong assembly, nn chng tng i d b d ch ng c. i u ny cho php cc trnh d ch ng c d dng t o c m ngu n r t gi ng v i m g c, y s l v n kh gi i quy t n u m c a b n c ch a cc thng tin ho c thu t ton c n gi b m t. Cch duy nh t m b o ng i dng khng th d ch ng c assembly l khng cho h l y c assembly. N u c th , hi n th c cc gi i php d a-trn-server nh cc ng d ng Microsoft ASP.NET v d ch v Web XML. V i m t chnh sch b o m t t t server, khng ai c th truy xu t assembly, do khng th d ch ng c chng. N u vi c xy d ng cc gi i php d a-trn-server l khng ph h p, b n c hai ty ch n sau y: S d ng m t obfuscator khi n cho assembly c a b n kh b d ch ng c (Visual Studio .NET 2003 c ch a phin b n Community c a m t obfuscator, c tn l Dotfuscator). Obfuscator s d ng nhi u k thu t khc nhau khi n cho assembly kh b d ch ng c; nguyn l c a cc k thu t ny l: i tn cc tr ng v cc phng th c private nh m gy kh khn cho vi c hi u m c ch c a m l nh. c v

Chn cc l nh dng i u khi n khi n cho ng i khc kh c th l n theo logic c a ng d ng.

Chuy n nh ng ph n c a ng d ng m b n mu n gi b m t thnh cc i t ng COM hay cc DLL nguyn sinh, sau s d ng P/Invoke ho c COM Interop g i chng t ng d ng c-qu n-l c a b n (xem chng 15 v cch g i m l nh khng- cqu n-l).

Chng 1: Pht tri n

49 ng d ng

Khng c cch ti p c n no ngn c nh ng ng i c k nng v quy t tm d ch ng c m ngu n c a b n, nhng chng s lm cho cng vi c ny tr nn kh khn ng k v ngn c h u h t nhng k t m thng th ng. Nguy c m t ng d ng b d ch ng c khng ch ring cho C# hay .NET. M t ng i quy t tm c th d ch ng c b t k ph n m m no n u anh ta c k nng v th i gian.

50 Chng 1: Pht tri n

ng d ng

51

Chng 2: THAO TC D

LI U

52

Chng 2: Thao tc d

53 li u

H
2.1

u h t cc ng d ng u c n thao tc trn m t lo i d li u no . Microsoft .NET Framework cung c p nhi u k thu t n gi n ha hay nng cao hi u qu cc thao tc d li u thng d ng. Chng ny s c p cc k thu t sau:

Thao tc chu i m t cch hi u qu (m c 2.1). M t cc ki u d li u c s b ng cc ki u m ha khc nhau (m c 2.2, 2.3, v 2.4). S d ng bi u th c chnh quy 2.6). xc nh n tnh h p l v thao tc chu i (m c 2.5 v

Lm vi c v i ngy v gi (m c 2.7 v 2.8). Lm vi c v i m ng v t p h p (m c 2.9, 2.10, v 2.11). Tu n t ha tr ng thi i t ng v lu n vo file (m c 2.12).

Thao tc chui mt cch hiu qu


B n c n thao tc trn n i dung c a m t i t ng String v trnh chi ph c a vi c t ng t o cc i t ng String m i do tnh khng i c a i t ng String. S d ng l p System.Text.StringBuilder th c hi n cc thao tc, sau chuy n k t qu thnh String b ng phng th c StringBuilder.ToString.

Cc i t ng String trong .NET l khng i, ngha l m t khi c t o th chng khng th b thay i. V d , n u b n t o m t String b ng cch n i m t s k t ho c chu i, th khi thm m t ph n t m i vo cu i String hi n c, b th c thi s t o ra m t String m i ch a k t qu (ch khng ph i String c b thay i). Do s n y sinh chi ph ng k n u ng d ng c a b n th ng xuyn thao tc trn String. L p StringBuilder kh c ph c v n ny b ng cch cung c p m t b m k t , v cho php thao tc trn n i dung c a n m b th c thi khng ph i t o i t ng m i ch a k t qu sau m i l n thay i. B n c th t o m t i t ng StringBuilder r ng ho c c kh i t o l n i dung c a m t String hi n c. Sau , thao tc trn n i dung c a StringBuilder ny b ng cc phng th c n p ch ng (cho php b n chn, thm d ng chu i c a cc ki u d li u khc nhau). Cu i cng, g i StringBuilder.ToString chuy n n i dung hi n t i c a StringBuilder thnh m t String. Khi b n thm d li u m i vo chu i, c hai thu c tnh quan tr ng nh h ng n ho t ng c a StringBuilder l Capacity v Length. Capacity m t kch th c c a b m StringBuilder, cn Length m t kch th c c a chu i k t trong b m. N u vi c thm d li u m i vo StringBuilder lm kch th c chu i (Length) v t qu kch th c b m (Capacity) th StringBuilder s c p pht b mm i ch a chu i. N u thi u c n th n, vi c c p pht b m ny c th ph nh l i ch c a vi c s d ng StringBuilder. Do , n u bi t chnh xc kch th c c a chu i, ho c bi t kch th c t i a c a chu i, b n c th trnh vi c c p pht b m qu m c c n thi t b ng cch thi t l p thu c tnh Capacity ho c ch nh kch th c b m lc t o StringBuilder. Khi thi t l p cc thu c tnh Capacity v Length, c n ch cc i m sau:

54 Chng 2: Thao tc d

li u

N u b n thi t l p gi tr Capacity nh hn gi tr Length, thu c tnh Capacity s nm ngo i l System.ArgumentOutOfRangeException. N u b n thi t l p gi tr Length nh hn kch th c c a chu i hi n c trong b chu i s b c t b t ph n l n hn. m,

N u b n thi t l p gi tr Length l n hn kch th c c a chu i, b m s c "l p" thm cc kho ng tr ng cho b ng v i Length. Vi c thi t l p gi tr Length l n hn gi tr Capacity s t ng i u ch nh Capacity cho b ng v i Length.

Phng th c ReverseString d i y minh h a cch s d ng l p StringBuilder om t chu i. N u khng s d ng l p StringBuilder th c hi n thao tc ny th s t n chi ph ng k , c bi t khi chu i ngu n di. Vi c kh i t o StringBuilder v i kch th c b ng chu i ngu n b o m khng c n ph i c p pht l i b m trong qu trnh o chu i.
public static string ReverseString(string str) { // Ki m tra cc tr ng h p khng c n if (str == null || str.Length == 1) { return str; } o chu i.

// T o m t StringBuilder v i s c ch a c n thi t. System.Text.StringBuilder revStr = new System.Text.StringBuilder(str.Length); // Duy t ng c chu i ngu n t ng k t m t // v thm t ng k t c c vo StringBuilder. for (int count = str.Length-1; count > -1; count--) { revStr.Append(str[count]); } // Tr v chu i c o. return revStr.ToString(); }

2.2

M ha chui bng cc kiu m ha k t


B n c n trao i d li u d ng k t v i cc h th ng s d ng ki u m ha khc v i UTF-16 (ki u m ha ny c s d ng b i CRL). S d ng l p System.Text.Encoding v cc l p con c a n cc ki u m ha khc nhau. chuy n i k t gi a

Unicode khng ph i l ki u m ha duy nh t, cng nh UTF-16 khng ph i cch duy nh t bi u di n k t Unicode. Khi ng d ng c n trao i d li u k t v i cc h th ng bn ngoi ( c bi t l cc h th ng c), d li u c n ph i c chuy n i gi a UTF-16 v ki u m ha m h th ng h tr . chuy n k t qua L p tr u t ng Encoding, v cc l p con c a n cung c p cc ch c nng l i gi a nhi u ki u m ha khc nhau. M i th hi n c a l p con h tr vi c chuy n i gi a UTF-16 v m t ki u m ha khc. Phng th c tnh Encoding.GetEncoding nh n vo tn ho c s hi u trang m (code page number) c a m t ki u m ha v tr v th hi n c a l p m ha tng ng.

Chng 2: Thao tc d

55 li u

B ng 2.1 li t k m t vi ki u m k t v s hi u trang m m b n ph i truy n cho phng th c GetEncoding t o ra th hi n c a l p m ha tng ng. B ng ny cng cung c p cc thu c tnh tnh c a l p Encoding i di n cho phng th c GetEncoding tng ng.
B ng 2.1 Cc l p m ha k t Ki u m ha L p ASCIIEncoding Encoding UTF7Encoding UTF8Encoding UnicodeEncoding UnicodeEncoding Encoding S d ng

ASCII M c nh (ki u m ha hi n hnh trn h th ng) UTF-7 UTF-8 UTF-16 (Big Endian) UTF-16 (Little Endian) Windows OS

GetEncoding(20127)

hay thu c tnh ASCII


GetEncoding(0)

hay thu c tnh Default


GetEncoding(65000)

hay thu c tnh UTF7


GetEncoding(65001) hay thu c tnh UTF8 GetEncoding(1201)

hay thu c tnh BigEndianUnicode


GetEncoding(1200)

hay thu c tnh Unicode


GetEncoding(1252)

Sau khi l y c i t ng l p Encoding h tr ki u m ha thch h p, s d ng phng th c GetBytes chuy n chu i ngu n ( c m ha theo UTF-16) thnh m ng ki u byte ch a cc k t c m ha theo ki u c n chuy n, v s d ng GetString chuy n m ng byte thnh chu i ch. V d d i y trnh by cch s d ng m t vi l p m ha:
using System; using System.IO; using System.Text; public class CharacterEncodingExample { public static void Main() { // T o file gi cc k t qu . using (StreamWriter output = new StreamWriter("output.txt")) { // T o v ghi ra file m t chu i ch a k hi u c a s string srcString = "Area = \u03A0r^2"; output.WriteLine("Source Text : " + srcString); PI.

// Ghi cc byte c m ha theo UTF-16 // c a chu i ngu n ra file. byte[] utf16String = Encoding.Unicode.GetBytes(srcString); output.WriteLine("UTF-16 Bytes: {0}", BitConverter.ToString(utf16String)); // Chuy n chu i ngu n c m ha theo UTF-16 // thnh UTF-8 v ASCII byte[] utf8String = Encoding.UTF8.GetBytes(srcString); byte[] asciiString = Encoding.ASCII.GetBytes(srcString); // Ghi m ng cc byte c m ha theo UTF-8 v ASCII ra file.

56 Chng 2: Thao tc d

li u

output.WriteLine("UTF-8 Bytes: {0}", BitConverter.ToString(utf8String)); output.WriteLine("ASCII Bytes: {0}", BitConverter.ToString(asciiString)); // Chuy n cc byte c m ha theo UTF-8 v ASCII // thnh chu i 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 li u xu ng file v output.Flush(); output.Close(); } } } ng file.

Ch y CharacterEncodingExample s t o ra file output.txt. M file ny trong m t trnh so n th o c h tr Unicode, b n s th y k t qu nh sau:


Source UTF-16 UTF-8 ASCII UTF-8 ASCII Text : Bytes: Bytes: Bytes: Text : Text : Area = r^2 41-00-72-00-65-00-61-00-20-00-3D-00-20-00-A0-03-72-00-5E-00-32-00 41-72-65-61-20-3D-20-CE-A0-72-5E-32 41-72-65-61-20-3D-20-3F-72-5E-32 Area = r^2 Area = ?r^2

Ch r ng, n u s d ng UTF-16 th m i k t c m ha b i 2 byte, nhng v h u h t cc k t u l k t chu n nn byte cao l 0 (n u s d ng little-endian th byte th p vi t tr c). Do , h u h t cc k t u c m ha b i nh ng s gi ng nhau trong ba ki u m ha, ngo i tr k hi u PI c m ha khc ( c in m trong k t qu trn). m ha PI c n 2 byte, i h i ny c UTF-8 h tr nn th hi n c , trong khi ASCII ch s d ng m t byte nn thay PI b ng m 3F, y l m c a d u h i (?). N u chuy n cc k t Unicode sang ASCII ho c m t ki u m ha khc th c th m t d li u. B t k k t Unicode no c m k t khng bi u di n c trong ki u m ha ch s b b qua khi chuy n i. L p Encoding cng cung c p phng th c tnh Covert n gi n ha vi c chuy n m t m ng byte t ki u m ha ny sang ki u m ha khc khng ph i qua trung gian UTF-16. V d , dng m sau chuy n tr c ti p cc byte trong m ng asciiString t ASCII sang UTF-8:
byte[] utf8String = Encoding.Convert(Encoding.ASCII, Encoding.UTF8, asciiString);

2.3

Chuyn cc kiu gi tr c bn thnh mng kiu byte


B n c n chuy n cc ki u gi tr c b n thnh m ng ki u byte.

Chng 2: Thao tc d

57 li u

L p System.BitConverter cung c p cc phng th c tnh r t ti n l i cho vi c chuy n i qua l i gi a cc m ng ki u byte v h u h t cc ki u gi tr c b ntr ki u decimal. chuy n m t gi tr ki u decimal sang m ng ki u byte, b n c n s d ng i t ng System.IO.BinaryWriter ghi gi tr vo m t th hi n System.IO.MemoryStream, sau g i phng th c Memorystream.ToArray. c m t gi tr decimal t m t m ng ki u byte, b n c n t o m t i t ng MemoryStream t m ng ki u byte, sau s d ng th hi n System.IO.BinaryReader c gi tr ny t MemoryStream. Phng th c tnh GetBytes c a l p BitConverter cung c p nhi u phin b n n p ch ng cho php chuy n h u h t cc ki u gi tr c b n sang m ng ki u byte. Cc ki u c h tr l bool, char, double, short, int, long, float, ushort, uint, v ulong. L p BitConverter cng cung c p cc phng th c tnh cho php chuy n cc m ng ki u byte thnh cc ki u gi tr chu n nh ToBoolean, ToUInt32, ToDouble,... V d sau minh h a cch chuy n cc gi tr bool v int thnh m ng ki u byte, v ng c l i. i s th hai trong ToBoolean v ToUInt32 cho bi t v tr (tnh t 0) trong m ng byte m BitConverter s l y cc byte k t t o gi tr d li u.
byte[] b = null; // Chuy n m t gi tr bool thnh m ng ki u byte v hi n th . b = BitConverter.GetBytes(true); Console.WriteLine(BitConverter.ToString(b)); // Chuy n m t m ng ki u byte thnh gi tr bool v hi n th . Console.WriteLine(BitConverter.ToBoolean(b,0)); // Chuy n m t gi tr int thnh m ng ki u byte v hi n th . b = BitConverter.GetBytes(3678); Console.WriteLine(BitConverter.ToString(b)); // Chuy n m t m ng ki u byte thnh gi tr int v hi n th . Console.WriteLine(BitConverter.ToInt32(b,0));

i v i ki u decimal, l p BitConverter khng h


MemoryStream v BinaryWriter.

tr , nn b n ph i s

d ng thm

// T o m ng ki u byte t gi tr decimal. public static byte[] DecimalToByteArray (decimal src) { // T o m t MemoryStream lm b m ch a d li u nh using (MemoryStream stream = new MemoryStream()) { phn.

// T o m t BinaryWriter ghi d li u nh phn vo stream. using (BinaryWriter writer = new BinaryWriter(stream)) { // Ghi gi tr decimal vo BinaryWriter/MemoryStream. writer.Write(src); // Tr v m ng ki u byte. return stream.ToArray(); } } }

58 Chng 2: Thao tc d

li u

chuy n m t m ng ki u byte thnh m t gi tr decimal, s d ng BinaryReader MemoryStream.


// T o gi tr decimal t m ng ki u byte. public static decimal ByteArrayToDecimal (byte[] src) { // T o m t MemoryStream ch a m ng. using (MemoryStream stream = new MemoryStream(src)) { // T o m t BinaryReader c t stream. using (BinaryReader reader = new BinaryReader(stream)) { // c v tr v gi tr decimal t // BinaryReader/MemoryStream. return reader.ReadDecimal(); } } }

ct

L p BitConverter cng cung c p phng th c ToString t o m t String ch a gi tr m ng. G i ToString v truy n i s l m t m ng byte s tr v m t String ch a gi tr th p l c phn c a cc byte trong m ng, cc gi tr ny cch nhau b i d u g ch n i, v d 34-A7-2C. Tuy nhin, khng c phng th c no t o m t m ng ki u byte t m t chu i theo nh d ng ny.

2.4
S

M ha d liu nh phn thnh vn bn


B n c n chuy n d li u nh phn sang m t d ng sao cho c th c lu tr trong m t file vn b n ASCII (ch ng h n file XML), ho c c g i i trong e-mail.
System.Converter

d ng cc phng th c tnh ToBase64String v FromBase64String c a l p chuy n i qua l i gi a d li u nh phn v chu i c m ha theo Base64.

Base64 l m t ki u m ha cho php b n m t d li u nh phn nh m t dy cc k t ASCII n c th c chn vo m t file vn b n ho c m t e-mail, m d li u nh phn khng ch a 3 byte d li u ngu n c cho php. Base64 lm vi c trn nguyn t c s d ng 4 byte v m b o m i byte ch s d ng 7 bit th p ch a d li u. i u ny c ngha l m i byte d li u c m ha theo Base64 c d ng gi ng nh m t k t ASCII, nn c th c lu tr ho c truy n i b t c ni u cho php k t ASCII. L p Convert cung c p hai phng th c ToBase64String v FromBase64String m ha v gi i m Base64. Tuy nhin, tr c khi m ha Base64, b n ph i chuy n d li u thnh m ng ki u byte; v sau khi gi i m, b n ph i chuy n m ng ki u byte tr v ki u d li u thch h p (xem l i m c 2.2 v 2.3). V d sau minh h a cch s d ng l p Convert m ha v gi i m Base64 v i chu i Unicode, gi tr int, gi tr decimal. i v i gi tr decimal, b n ph i s d ng l i cc phng th c ByteArrayToDecimal v DecimalToByteArray trong m c 2.3.
// M ha Base64 v i chu i Unicode. public static string StringToBase64 (string src) {

Chng 2: Thao tc d // Chuy n chu i thnh m ng ki u byte. byte[] b = Encoding.Unicode.GetBytes(src); // Tr v chu i c m ha theo Base64. return Convert.ToBase64String(b); } // Gi i m m t chu i Unicode c m ha theo Base64. public static string Base64ToString (string src) { // Gi i m vo m ng ki u byte. byte[] b = Convert.FromBase64String(src); // Tr v chu i Unicode. return Encoding.Unicode.GetString(b); } // M ha Base64 v i gi tr decimal. public static string DecimalToBase64 (decimal src) { // Chuy n gi tr decimal thnh m ng ki u byte. byte[] b = DecimalToByteArray(src); // Tr v gi tr decimal c m ha theo Base64. return Convert.ToBase64String(b); } // Gi i m m t gi tr decimal c m ha theo Base64. public static decimal Base64ToDecimal (string src) { // Gi i m vo m ng ki u byte. byte[] b = Convert.FromBase64String(src); // Tr v gi tr decimal. return ByteArrayToDecimal(b); } // M ha Base64 v i gi tr int. public static string IntToBase64 (int src) { // Chuy n gi tr int thnh m ng ki u byte. byte[] b = BitConverter.GetBytes(src); // Tr v gi tr int c m ha theo Base64. return Convert.ToBase64String(b); } // Gi i m m t gi tr int c m ha theo Base64. public static int Base64ToInt (string src) { // Gi i m vo m ng ki u byte. byte[] b = Convert.FromBase64String(src); // Tr v gi tr int. return BitConverter.ToInt32(b,0); }

59 li u

60 Chng 2: Thao tc d

li u

2.5

S dng biu thc chnh quy kim tra d liu nhp


B n c n ki m tra d li u nh p vo c ng v i c u trc v n i dung c quy nh tr c hay khng. V d , b n mu n b o m ng i dng nh p a ch IP, s i n tho i, hay a ch e-mail h p l . S d ng bi u th c chnh quy cc k t c quy nh tr c b o m d li u nh p ng c u trc v ch ch a i v i t ng d ng thng tin.

Khi ng d ng nh n d li u t ng i dng ho c c d li u t file, b n nn gi nh d li u ny l cha chnh xc v c n c ki m tra l i. M t nhu c u ki m tra kh ph bi n l xc nh cc s i n tho i, s th tn d ng, a ch e-mail c ng d ng hay khng. Vi c ki m tra c u trc v n i dung c a d li u khng m b o d li u l chnh xc nhng gip lo i b nhi u d li u sai v n gi n ha vi c ki m tra sau ny. Bi u th c chnh quy (regular expression) cung c p m t c ch r t t t ki m tra m t chu i c ng v i c u trc quy nh tr c hay khng, do b n c th l i d ng tnh nng ny cho m c ch ki m tra d li u nh p. Tr c tin, b n ph i xc nh c php c a bi u th c chnh quy cho ph h p v i c u trc v n i dung c a d li u c n ki m tra, y l ph n kh nh t khi s d ng bi u th c chnh quy. Bi u th c chnh quy c xy d ng trn hai y u t : tr c ki n (literal) v siu k t (metacharacter). Tr c ki n m t cc k t c th xu t hi n trong m u m b n mu n so trng; siu k t h tr vi c so trng cc k t i di n (wildcard), t m tr , nhm, l p, i u ki n, v cc c ch i u khi n khc. y khng th o lu n y v c php bi u th c chnh quy (tham kh o ti li u .NET SDK hi u thm v bi u th c chnh quy), nhng b ng 2.2 s m t cc siu k t th ng dng.
B ng 2.2 Cc siu k t th ng dng Siu k t . \d \D \s \S \w \W ^ \A $ \z M t

M i k t tr k t xu ng dng (\n). K t ch s th p phn (digit). K t khng ph i ch s (non-digit). K t whitespace (nh kho ng tr ng, tab...). K t non-whitespace. K t word (g m m u t , ch s , v d u g ch d i). K t non-word. B t B t u m t chu i ho c dng. u m t chu i.

K t thc m t chu i ho c dng. K t thc m t chu i.

Chng 2: Thao tc d

61 li u

Ngn cch cc bi u th c c th so trng, v d AAA|ABA|ABB s so trng v i AAA, ABA, ho c ABB (cc bi u th c c so trng t tri sang). So trng v i m t trong cc k t trong nhm, v d [AbC] s so trng v i A, b, ho c C. So trng v i b t c k t no khng thu c cc k t trong nhm, v d [^AbC] s khng so trng v i A, b, or C nhng so trng v i B, F, So trng v i b t k k t no thu c kho ng ny, v d [A-C] s so trng v i A, B, ho c C. Xc nh m t bi u th c con sao cho n c xem nh m t y u t i v i cc y u t c trnh by trong b ng ny. Xc nh c m t ho c khng c k t ho c bi u th c con d A?B so trng v i B, AB, nhng khng so trng v i AAB. Xc nh khng c ho c c nhi u k t ho c bi u th c con v d A*B so trng v i B, AB, AAB, AAAB, n l

[abc]

[^abc]

[a-z]

( )

ng tr c n, v ng tr c n,

Xc nh c m t ho c c nhi u k t ho c bi u th c con ng tr c n, v d A+B so trng v i AB, AAB, AAAB, nhng khng so trng v i B. Xc nh c ng n k t ho c bi u th c con so trng v i AA. ng tr c n, v d A{2} ch

{n}

{n,}

Xc nh c t nh t n k t ho c bi u th c con ng tr c n, v d A{2,} so trng v i AA, AAA, AAAA, nhng khng so trng v i A. Xc nh c t n n m k t ng tr c n, v d A{2,4} so trng v i AA, AAA, v AAAA nhng khng so trng v i A ho c AAAAA.

{n, m}

Khi d li u c n ki m tra cng ph c t p th c php c a bi u th c chnh quy cng cng ph c t p. V d , d dng ki m tra d li u nh p ch ch a s hay c chi u di t i thi u, nhng ki m tra m t URL kh ph c t p. B ng 2.3 li t k m t s bi u th c chnh quy dng ki m tra cc ki u d li u thng d ng.
B ng 2.3 M t s bi u th c chnh quy thng d ng Ki u d li u nh p M t Bi u th c chnh quy ^\d+$

S PIN M t kh u n gi n

Ch ch a cc ch s th p phn; v d 5, ho c 5683874674. Ch a 4 ch s th p phn, v d 1234. Ch a t 6 n 8 k t ; v d ghtd6f ho c b8c7hogh.

^\d{4}$

^\w{6,8}$

62 Chng 2: Thao tc d

li u

S th tn d ng

Ch a d li u ph h p v i c u trc c a h u h t cc lo i s th tn d ng, v d 4921835221552042 ho c 49218352-2155-2042.


[\w-]+ ngha l ch a m t

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

a ch e-mail

ho c nhi u k t word ho c d u g ch ngang, v d


some-body@adatum.com

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

HTTP ho c HTTPS URL M t khi

D li u l m t URL d a-trn-HTTP hay d a-trn-HTTPS, v d


http://www.microsoft.com

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

bi t c php c a bi u th c chnh quy, b n t o m t

i t ng

System.Text.RegularExpression.Regex b ng cch truy n cho phng th c kh i d ng c a n

chu i ch a bi u th c chnh quy. Sau , g i phng th c IsMatch c a i t ng Regex v truy n chu i c n ki m tra, phng th c ny tr v m t gi tr lu n l cho bi t chu i c h p l khng. C php c a bi u th c chnh quy s ch nh Regex so trng ton b chu i hay ch so trng m t ph n c a chu i (xem ^, \A, $, v \z trong b ng 2.2) Phng th c ValidateInput d i y minh h a cch ki m tra chu i nh p b ng bi u th c chnh quy:
public static bool ValidateInput(string regex, string input) { // T o i t ng Regex d a trn bi u th c chnh quy. Regex r = new Regex(regex); // Ki m tra d li u nh p c trng v i bi u th c chnh quy hay khng. return r.IsMatch(input); }

B n c th s d ng i t ng Regex ki m tra nhi u chu i, nhng khng th thay i bi u th c chnh quy c g n cho n; b n ph i t o m t i t ng Regex m i tng ng v i m t c u trc m i. Phng th c ValidateInput trn t o ra m t i t ng Regex m i m i l n c g i, thay vo b n c th s d ng phng th c tnh n p ch ng IsMatch.
public static bool ValidateInput(string regex, string input) { // Ki m tra d li u nh p c trng v i bi u th c chnh quy hay khng. return Regex.IsMatch(input, regex); }

2.6

S dng biu thc chnh quy c bin dch


B n c n gi m thi u cc tc ng ln hi u nng c a chnh quy ph c t p c s d ng th ng xuyn. ng d ng khi cc bi u th c

Khi kh i t o i t ng System.Text.RegularExpressions.Regex, hy truy n thm ty ch n Compiled thu c ki u li t k System.Text.RegularExpressions.

Chng 2: Thao tc d RegexOptions

63 li u

bin d ch bi u th c chnh quy thnh Microsoft Intermediate Language (MSIL). Theo m c nh, khi b n t o i t ng Regex, m u bi u th c chnh quy do b n xc nh trong phng th c kh i d ng c bin d ch thnh m t d ng trung gian (khng ph i MSIL). M i l n b n s d ng i t ng Regex, b th c thi phin d ch d ng trung gian ny v p d ng n ki m tra chu i. V i cc bi u th c chnh quy ph c t p c s d ng th ng xuyn, vi c phin d ch l p l p i l i c th gy tc ng x u ln hi u nng c a ng d ng. Khi ty ch n RegexOptions.Compiled c ch nh, b th c thi s bin d ch bi u th c chnh quy thnh MSIL. MSIL ny c g i l m just-in-time (JIT), c bin d ch thnh m my nguyn sinh trong l n th c thi u tin, gi ng nh m assembly thng th ng. Bi u th c chnh quy c bin d ch cng c s d ng gi ng nh i t ng Regex, vi c bin d ch ch gip th c thi nhanh hn. Tuy nhin, vi c bin d ch bi u th c chnh quy cng c vi nh c i m. Tr c tin, trnh bin d ch JIT ph i lm vi c nhi u hn, d n n ch m qu trnh bin d ch, c bi t khi t o bi u th c chnh quy c bin d ch khi ng d ng kh i ng. Th hai, bi u th c chnh quy c bin d ch v n t n t i trong b nh khi khng cn c s d ng n a, n khng b b thu gom rc (Garbage Collector) xa i nh cc bi u th c chnh quy thng th ng. Vng nh b chi m ch c gi i phng khi chng trnh k t thc, ho c khi b n gi i phng mi n ng d ng. Dng m sau minh h a cch t o m t i t ng Regex c bin d ch thnh MSIL:
Regex reg = new Regex(@"[\w-]+@([\w-]+\.)+[\w-]+", RegexOptions.Compiled);

Ngoi ra, phng th c tnh Regex.CompileToAssembly cho php b n t o m t bi u th c chnh quy c bin d ch v ghi n vo m t assembly khc. Ngha l b n c th t o m t assembly ch a cc bi u th c chnh quy s d ng cho nhi u ng d ng sau ny. bin d ch m t bi u th c chnh quy v lu n vo m t assembly, th c hi n cc b c sau: 1. T o m t m ng System.Text.RegularExpressions.RegexCompilationInfo l n ch a cc i t ng RegexCompilationInfo, m i i t ng ng v i m t bi u th c chnh quy c n c bin d ch. T o m t i t ng RegexCompilationInfo cho m i bi u th c chnh quy v truy n i s cho phng th c kh i d ng xc nh cc thu c tnh c a bi u th c chnh quy ny. Cc thu c tnh thng d ng l: 3.
IsPublicgi tr bool xc l cng khai hay khng. Namem t String xc

2.

nh l p bi u th c chnh quy c t o ra c t m v c

nh tn c a l p. nh khng gian tn c a l p. nh m u m bi u th c chnh quy s so trng (xem chi

Namespacem t String xc Patternm t String xc

ti t

m c 2.5). thu c ki u li t k System.Text.RegularExpressions. nh cc ty ch n cho bi u th c chnh quy. xc nh tn c a assembly m

Optionsm t gi tr RegexOptions xc

T o m t i t ng System.Reflection.AssemblyName phng th c Regex.CompileToAssembly s t o ra.

64 Chng 2: Thao tc d

li u

4.

G i

phng

th c

Regex.CompileToAssembly,

truy n

cc

m ng

RegexCompilationInfo v

i t ng AssemblyName.

Qu trnh trn t o ra m t assembly ch a cc khai bo l p cho t ng bi u th c chnh quy c bin d ch, m i l p d n xu t t Regex. s d ng m t bi u th c chnh quy c bin d ch trong assembly, b n c n t o i t ng bi u th c chnh quy ny v g i cc phng th c c a n gi ng nh khi t o n v i phng th c kh i d ng Regex bnh th ng. B n nh thm tham chi u t i assembly khi s d ng cc l p bi u th c chnh quy n m trong n. o n m sau minh h a cch t o m t assembly c tn l MyRegex.dll, ch a hai bi u th c chnh quy c tn l PinRegex v CreditCardRegex:
using System.Text.RegularExpressions; using System.Reflection; public class CompiledRegexExample { public static void Main() { // T o m ng ch a cc i t ng RegexCompilationInfo. RegexCompilationInfo[] regexInfo = new RegexCompilationInfo[2]; // T o i t ng RegexCompilationInfo cho PinRegex. regexInfo[0] = new RegexCompilationInfo(@"^\d{4}$", RegexOptions.Compiled, "PinRegex", "", true); // T o i t ng RegexCompilationInfo cho CreditCardRegex. regexInfo[1] = new RegexCompilationInfo( @"^\d{4}-?\d{4}-?\d{4}-?\d{4}$", RegexOptions.Compiled, "CreditCardRegex", "", true); // T o i t ng AssemblyName nh ngha assembly. AssemblyName assembly = new AssemblyName(); assembly.Name = "MyRegEx"; // T o cc bi u th c chnh quy c bin d ch. Regex.CompileToAssembly(regexInfo, assembly); } }

2.7

To ngy v gi t chui
B n c n t o m t th hi n System.DateTime m t gi , ngy c ch chu i. S d ng phng th c Parse ho c ParseExact c a l p DateTime. nh trong m t

C nhi u cch m t ngy, gi ; v d 1st June 2004, 1/6/2004, 6/1/2004, 1-Jun-2004 cng ch m t ngy; 16:43 v 4:43 PM cng ch m t gi . L p DateTime cung c p phng th c tnh Parse r t linh ho t, cho php t o th hi n DateTime t nhi u cch m t khc nhau trong chu i. Phng th c Parse r t m nh trong vi c t o i t ng DateTime t m t chu i cho tr c. N c th x l m t chu i ch ch a m t ph n thng tin hay ch a thng tin sai, v thay th cc gi tr thi u b ng cc gi tr m c nh. Ngy m c nh l ngy hi n t i, gi m c nh l 12:00:00

Chng 2: Thao tc d

65 li u

AM. N u sau m i c g ng, Parse khng th t o i t ng DateTime, n s nm ngo i l System.FormatException. V d sau minh h a tnh linh ho t c a 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 hi n t i l 07/10/2004) DateTime dt5 = DateTime.Parse("2:15 PM");

Phng th c Parse linh ho t v c th t s a l i. Tuy nhin, m c linh ho t ny khng c n thi t trong tr ng h p b n mu n b o m cc chu i ph i theo m t nh d ng nh t nh. Khi , s d ng phng th c ParseExact thay cho Parse. D ng n gi n nh t c a ParseExact nh n ba i s : chu i ch a ngy gi , chu i nh d ng xc nh c u trc m chu i ch a ngy gi ph i tun theo, v m t tham chi u IFormatProvider cung c p thng tin c th v b n a. N u IFormatProvider l null, thng tin v b n a c a ti u trnh (thread) hi n hnh s c s d ng. N u ngy gi trong chu i ang xt khng ng v i nh d ng quy nh, ParseExact s nm ngo i l System.FormatException. Chu i nh d ng c s d ng tng t nh khi b n ch nh chu i i di n cho m t i t ng DateTime. i u ny c ngha l b n c th s d ng c nh d ng chu n l n nh d ng ty bi n. Tham kh o ph n ti li u cho l p System.Globalization.DateTimeFormatInfo trong ti li u .NET Framework SDK c thng tin y v t t c cc ki u nh d ng.
// Ch phn tch cc chu i ch a LongTimePattern. DateTime dt6 = DateTime.ParseExact("2:13:30 PM", "h:mm:ss tt", null); // Ch phn tch cc chu i ch a 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 chu i ch a MonthDayPattern. DateTime dt8 = DateTime.ParseExact("September 03", "MMMM dd", null);

2.8

Cng, tr, so snh ngy gi


B n c n th c hi n cc php tnh s h c c b n hay php so snh trn ngy, gi . S d ng cc c u trc DateTime v TimeSpan (h tr cc ton t s h c v so snh).

66 Chng 2: Thao tc d

li u

M t i t ng DateTime m t m t th i i m xc nh (ch ng h n 4:15 AM, ngy 21 thng 04 nm 1980), trong khi i t ng TimeSpan m t m t kho ng th i gian (ch ng h n 2 gi , 35 pht). B n c th c ng, tr , so snh cc i t ng TimeSpan v DateTime. Th c ch t, c DateTime v TimeSpan u s d ng tick m t th i gian1 tick b ng 100 nano-giy (m t nano-giy b ng m t ph n t (10-9) giy). TimeSpan lu kho ng th i gian c a n l s tick b ng kho ng th i gian , DateTime lu s tick tri qua k t 12:00:00 khuya ngy 1 thng 1 nm 0001 sau cng nguyn. Cch ti p c n ny v vi c s d ng ton t n p ch ng gip DateTime v TimeSpan d dng h tr cc php tnh s h c v so snh. B ng 2.4 tm t t cc ton t m hai c u trc ny h tr .
B ng 2.4 Cc ton t Ton t c cung c p b i DateTime v TimeSpan TimeSpan DateTime

Gn (=)

V TimeSpan l m t c u trc nn php gn tr v m t b n sao, khng ph i m t tham chi u. C ng hai Tr hai i t ng TimeSpan. i t ng TimeSpan.

V DateTime l m t c u trc nn php gn tr v m t b n sao, khng ph i m t tham chi u. C ng Tr m t m t


TimeSpan

C ng (+) Tr (-) B ng (==) Khng b ng (!=) L n hn (>)

vo cho

m t m t

DateTime. DateTime

DateTime ho c m t TimeSpan.

So snh hai i t ng TimeSpan v tr v true n u b ng nhau. So snh hai i t ng TimeSpan v tr v true n u khng b ng nhau. Xc nh m t i t ng TimeSpan c l n hn m t i t ng TimeSpan khc hay khng. Xc nh m t i t ng TimeSpan c l n hn ho c b ng m t i t ng TimeSpan khc hay khng. Xc nh m t i t ng TimeSpan c nh hn m t i t ng TimeSpan khc hay khng. Xc nh m t i t ng TimeSpan c nh hn ho c b ng m t i t ng TimeSpan khc hay khng. Tr v m t gi tr
TimeSpan.

So snh hai i t ng DateTime v tr v true n u b ng nhau. So snh hai i t ng DateTime v tr v true n u khng b ng nhau. Xc nh m t i t ng DateTime c l n hn m t i t ng DateTime khc hay khng. Xc nh m t i t ng DateTime c l n hn ho c b ng m t i t ng DateTime khc hay khng. Xc nh m t i t ng DateTime c nh hn m t i t ng DateTime khc hay khng. Xc nh m t i t ng DateTime c nh hn ho c b ng m t i t ng DateTime khc hay khng. Khng h tr . Khng h tr .

L n ho c b ng (>=)

Nh hn (<)

Nh ho c b ng (<=) m (-) Dng (+)

od uc am t

Tr v chnh TimeSpan.

Chng 2: Thao tc d

67 li u

C u trc DateTime cng hi n th c cc phng th c AddTicks, AddMilliseconds, AddSeconds, AddMinutes, AddHours, AddDays, AddMonths, v AddYears. M i phng th c ny cho php b n c ng (ho c tr b ng cc gi tr m) ph n t th i gian thch h p v i i t ng DateTime. Cc phng th c ny v cc ton t c li t k trong b ng 2.4 khng lm thay i DateTime g cthay vo chng s t o m t i t ng m i v i gi tr c thay i. o n m d i y trnh by cch s d ng cc ton t thao tc cc c u trc DateTime v TimeSpan:
// T o m TimeSpan // T o m TimeSpan // T o m TimeSpan // T o m DateTime // T o m DateTime // T o m DateTime t TimeSpan m t 2.5 ngy. timespan1 = new TimeSpan(2,12,0,0); t TimeSpan m t 4.5 ngy. timespan2 = new TimeSpan(4,12,0,0); t TimeSpan m t 1 tu n. oneWeek = timespan1 + timespan2; t DateTime v i ngy gi hi n t i. now = DateTime.Now; t DateTime m t 1 tu n tr c y. past = now - oneWeek; t DateTime m t 1 tu n trong tng lai. future = now + oneWeek;

2.9

Sp xp mt mng hoc mt ArrayList


B n c n s p x p cc ph n t trong m t m ng ho c m t ArrayList. S d ng phng th c ArrayList.Sort Array.Sort s p x p m ng. s p x p ArrayList v phng th c tnh

D ng n gi n nh t c a Sort l s p x p cc i t ng n m trong m t m ng ho c ArrayList khi cc i t ng ny c hi n th c giao di n System.Icomparable v c ki u gi ng nhaut t c cc ki u d li u c b n u hi n th c Icomparable. o n m d i y minh h a cch s d ng phng th c Sort:
// T o m t m ng m i v thm ph n t int[] array = {4, 2, 9, 3}; // S p x p m ng. Array.Sort(array); // Hi n th n i dung c a m ng c s p x p. foreach (int i in array) { Console.WriteLine(i);} // T o m t ArrayList m i v thm ph n t ArrayList list = new ArrayList(4); list.Add("Phong"); list.Add("Phuong"); list.Add("Khoa"); list.Add("Tam"); // S p x p ArrayList. list.Sort(); // Hi n th n i dung c a ArrayList c s p x p. foreach (string s in list) { Console.WriteLine(s);} vo. vo.

68 Chng 2: Thao tc d

li u

s p x p cc i t ng khng hi n th c IComparable, b n c n truy n cho phng th c Sort m t i t ng hi n th c giao di n System.Collections.IComparer. Hi n th c c a IComparer ph i c kh nng so snh cc i t ng n m trong m ng ho c ArrayList (xem m c 16.3 bi t cch hi n th c IComparable v IComparer).

2.10

Chp mt tp hp vo mt mng

B n c n chp n i dung c a m t t p h p vo m t m ng. S d ng phng th c ICollection.CopyTo ( c hi n th c b i t t c cc l p t p h p), ho c s d ng phng th c ToArray ( c hi n th c b i cc t p h p ArrayList, Stack, Queue). Cc phng th c ICollection.CopyTo v ToArray c cng ch c nng, chng chp cc ph n t trong m t t p h p vo m t m ng. S khc bi t n m ch CopyTo chp vo m t m ng c, trong khi ToArray t o ra m t m ng m i r i chp vo .
CopyTo nh n hai i s : m t m ng v m t ch s . M ng ny l ch c a qu trnh sao chp v ph i c ki u tng thch v i cc ph n t c a t p h p. N u ki u khng tng thch hay khng c s chuy n i ng m t ki u ph n t c a t p h p sang ki u ph n t c a m ng th ngo i l System.InvalidCastException s b nm. Ch s l m t v tr trong m ng m b t ut cc ph n t c a t p h p s c chp vo. N u ch s ny l n hn ho c b ng chi u di c a m ng, ho c s ph n t c a t p h p v t qu s c ch a c a m ng th ngo i l System.ArgumentException s b nm. o n m sau minh h a cch s d ng CopyTo chp n i dung c a m t ArrayList vo m t m ng: // T o m t ArrayList m i v thm ph n t ArrayList list = new ArrayList(5); list.Add("Phuong"); list.Add("Phong"); list.Add("Nam"); list.Add("Tam"); list.Add("Nhan"); vo.

// T o m t string[] v s d ng ICollection.CopyTo // chp n i dung c a ArrayList. string[] array1 = new string[5]; list.CopyTo(array1,0);

Cc l p ArrayList, Stack, v Queue cng hi n th c phng th c ToArray, phng th c ny t ng t o m t m ng v i kch th c ch a cc ph n t c a c a t p h p. N u b n khng truy n i s cho ToArray, n s tr v m t object[] b t ch p ki u c a cc i t ng trong ch nh ki u c a m ng t p h p. Tuy nhin, b n c th truy n m t i t ng System.Type (B n ph i p m ng ki u m nh v ng ki u). V d sau minh h a cch s d ng ToArray cho ArrayList trn:
// S d ng ArrayList.ToArray t o m t object[] // t n i dung c a t p h p. object[] array2 = list.ToArray(); // S // t d ng ArrayList.ToArray n i dung c a t p h p. t o m t string[] ki u m nh

Chng 2: Thao tc d string[] array3 = (string[])list.ToArray(System.Type.GetType("System.String"));

69 li u

2.11
T o m t l p d n xu t t l p

To mt tp hp kiu mnh
nh. hay
System.Collections.CollectionBase

B n c n t o m t t p h p ch ch a cc ph n t thu c m t ki u nh t

System.Collections.DictionaryBase, v hi n th c cc phng th c an-ton-v -

ki u-d -li u (type-safe)

thao tc trn t p h p.

Cc l p CollectionBase v DictionaryBase c th ng vai tr cc l p c s d n xu t ra cc l p t p h p an-ton-ki u m khng ph i hi n th c l i cc giao di n chu n: IDictionary, IList, ICollection, v IEnumerable.
CollectionBasedng cho cc t p h p d a-trn-Ilist (nh ArrayList). Th c ch t, CollectionBase duy tr t p h p b ng m t xu t thng qua thu c tnh b o v List.

i t ng ArrayList chu n, c th

c truy

DictionaryBasedng cho cc t p h p d a-trn-IDictionary (nh Hashtable). Th c

ch t, DictionaryBase duy tr t p h p b ng m t i t ng Hashtable chu n, c th truy xu t thng qua thu c tnh b o v Dictionary. o n m sau hi n th c m t t p h p tn m nh (d a trn l p CollectionBase) danh sch cc i t ng 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) { 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); }

th hi n m t

70 Chng 2: Thao tc d

li u

public void Insert(int index, AssemblyName value) { this.List.Insert(index, value); } }

C hai l p CollectionBase v DictionaryBase u hi n th c m t t p cc phng th c cb o-v c ti p u ng On*. Cc phng th c ny (ch ng h n OnClear, OnClearComplete, OnGet, OnGetComplete,) th ng c chp cc l p d n xu t nh m cho php b n hi n th c cc ch c nng ty bi n c n thi t qu n l t p h p ki u m nh. Cc l p CollectionBase v DictionaryBase s g i phng th c ph h p tr c v sau khi vi c ch nh s a c th c hi n trn t p h p n m d i thng qua thu c tnh List hay Dictionary.

2.12
S

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

B n c n lu m t i t ng kh -tu n-t -ha v cc tr ng thi c a n vo file, sau gi i tu n t ha khi c n. d ng m t formatter tu n t ha i t ng v ghi n vo m System.IO.FileStream. Khi c n truy xu t i t ng, s d ng formatter cng ki c d li u c-tu n-t -ha t file v gi i tu n t ha i t ng. Th vi n l .NET Framework cung c p cc hi n th c formatter sau y tu n t ha t ng theo d ng nh phn hay SOAP: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter System.Runtime.Serialization.Formatters.Soap.SoapFormatter t u p i

L p BinaryFormatter v SoapFormatter c th c s d ng tu n t ha m t i t ng c a b t k ki u no c g n v i c tnh System.SerializableAttribute. BinaryFormatter sinh ra m t stream d li u nh phn m t i t ng v tr ng thi c a n, trong khi SoapFormatter sinh ra m t ti li u SOAP. C hai l p BinaryFormatter v SoapFormatter u hi n th c giao di n System.Runtime. Serialization.IFormatter, giao di n ny nh ngha hai phng th c: Serialize v Deserialize.
Serializenh n m t tham chi u System.Object v m t tham chi u System.IO.Stream

lm

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

i s , c d li u c a i t ng c-tu n-t -ha t Stream, v tr v m t tham chi u Object n i t ng c-gi itu n-t -ha. B n ph i p tham chi u Object ny v ki u thch h p.

Deserializenh n m t tham chi u Stream lm

g i cc phng th c Serialize v Deserialize c a l p BinaryFormatter, m l nh c a b n ph i c c p ph n t SerializationFormatter c a l p System.Security.Permissions. SecurityPermission. g i cc phng th c Serialize v Deserialize c a l p SoapFormatter, m l nh c a b n ph i c c p quy n tin t ng tuy t i (full trust) v assembly System.Runtime. Serialization.Formatters.Soap.dll (l p SoapFormatter c khai bo bn trong assembly ny)

Chng 2: Thao tc d

71 li u

khng cho php cc m l nh ch c-tin-c y-m t-ph n (partially trusted caller) s d ng n. Tham kh o m c 13.1 c thm thng tin v m l nh c-tin-c y-m t-ph n. L p BinarySerializationExample d i y minh h a cch s d ng l p BinaryFormatter tu n t ha m t System.Collections.ArrayList ch a danh sch tn ng i vo m t file. Sau , ArrayList c gi i tu n t ha t file v n i dung c a n s c hi n th trong c a s Console.
using System.IO; using System.Collections; using System.Runtime.Serialization.Formatters.Binary; public class BinarySerializationExample { public static void Main() { // T o v c u hnh ArrayList tu n t ArrayList people = new ArrayList(); people.Add("Phuong"); people.Add("Phong"); people.Add("Nam"); ha.

// Tu n t ha i t ng ArrayList. FileStream str = File.Create("people.bin"); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(str, people); str.Close(); // Gi i tu n t ha i t ng ArrayList. str = File.OpenRead("people.bin"); bf = new BinaryFormatter(); people = (ArrayList)bf.Deserialize(str); str.Close(); // Hi n th n i dung c a i t ng ArrayList // - c-gi i-tu n-t -ha. foreach (string s in people) { System.Console.WriteLine(s); } } }

d ng l p SoapFormatter theo cch nh c trnh by trong l p trn, ch c n thay m i th hi n c a l p BinaryFormatter b ng th hi n c a l p SoapFormatter v thay i ch th using nh p khng gian tn System.Runtime.Serialization.Formatters.Soap. Ngoi ra, b n c n thm m t tham chi u n System.Runtime.Serialization.Formatters.Soap.dll khi bin d ch m. File SoapSerializationExample.cs trong a CD nh km s trnh by cch s d ng l p SoapFormatter.
BinarySerializationExample

B n c th

Hnh 2.1 v 2.2 d i y minh h a hai k t qu khc nhau khi s d ng l p BinaryFormatter v SoapFormatter. Hnh 2.1 trnh by n i dung c a file people.bin c t o ra khi s d ng BinaryFormatter, hnh 2.2 trnh by n i dung c a file people.xml c t o ra khi s d ng SoapFormatter.

72 Chng 2: Thao tc d

li u

Hnh 2.1 N i dung file people.bin

Hnh 2.2 N i dung file people.xml

Chng 2: Thao tc d

73 li u

74

Chng 3: MI N

NG D NG, C CH PH N CHI U, V SIU D LI U

75

76 Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

li u

c m nh v tnh linh ho t c a Microsoft .NET Framework c nng cao b i kh nng ki m tra v thao tc cc ki u v siu d li u lc th c thi. Cc m c trong chng ny s trnh by cc kha c nh thng d ng c a mi n ng d ng (application domain), c ch ph n chi u (reflection), v siu d li u (metadata), bao g m: T o v h y cc mi n ng d ng (m c 3.1 v 3.9). Lm vi c v i cc ki u v cc 3.3, 3.4, v 3.8). T o ng cc 3.12). i t ng v n p i t ng khi s d ng nhi u mi n ng d ng (m c 3.2,

Lm vi c v i thng tin Type (m c 3.10 v 3.11). ng cc assembly lc th c thi (m c 3.5, 3.6, 3.7, v

T o v ki m tra cc

c tnh ty bi n (cc m c 3.13 v 3.14).

3.1
B n c n t o m t mi n ng d ng m i.

To min ng dng
S d ng phng th c tnh CreateDomain c a l p System.AppDomain.

D ng th c n gi n nh t c a phng th c CreateDomain nh n m t i s ki u string ch nh tn thn thi n cho mi n ng d ng m i. Cc d ng th c khc cho php b n ch nh ch ng c (evidence) v cc thi t l p c u hnh cho mi n ng d ng m i. Ch ng c c ch nh b ng i t ng System.Security.Policy.Evidence; m c 13.11 trnh by cc tc ng c a ch ng c khi b n t o m t mi n ng d ng. Cc thi t l p c u hnh c ch nh b ng i t ng System.AppDomainSetup. L p AppDomainSetup ch a cc thng tin c u hnh cho m t mi n ng d ng. B ng 3.1 ki t k cc thu c tnh th ng c s d ng nh t c a l p AppDomainSetup khi t o cc mi n ng d ng. Cc thu c tnh ny c th c truy xu t sau khi t o thng qua cc thnh vin c a i t ng AppDomain, v m t s c th thay i lc th c thi; b n hy tham kh o ti li u .NET Framework SDK v l p AppDomain hi u chi ti t hn.
B ng 3.1 Cc thu c tnh thng d ng c a l p AppDomainSetup Thu c tnh M t

ApplicationBase

Th m c m CRL s xt trong qu trnh d tm cc assembly ring. K thu t d tm (probing) s c th o lu n trong m c 3.5. Th c t , ApplicationBase l th m c g c cho ng d ng ang th c thi. Theo m c nh, y l th m c ch a assembly. C th c c thu c tnh ny sau khi t o mi n ng d ng b ng thu c tnh AppDomain.BaseDirectory. Tn c a file c u hnh, c s d ng b i m c n p vo mi n ng d ng. C th c c thu c tnh ny sau khi t o mi n ng d ng b ng phng th c AppDomain.GetData v i kha APP_CONFIG_FILE.

ConfigurationFile

Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

77 li u

DisallowPublisherPolicy

Quy nh ph c c xt assembly tn lu n trong m

n publisher policy c a file c u hnh ng d ng n hay khng khi xc nh phin b n c a m t m nh n i k t. Publisher policy s c th o c 3.5.

PrivateBinPath

Danh sch cc th m c cch nhau b i d u ch m ph y m b th c thi s s d ng khi d tm cc assembly ring. Cc th m c ny c v tr tng i so v i th m c c ch nh trong ApplicationBase. C th c c thu c tnh ny sau khi t o mi n ng d ng b ng thu c tnh AppDomain.RelativeSearchPath. C th thay i thu c tnh ny lc th c thi b ng phng th c AppendPrivatePath v ClearPrivatePath.

V d d i y trnh by cch t o v c u hnh m t mi n ng d ng:


// Kh i t o m t i t ng c a l p AppDomainSetup. AppDomainSetup setupInfo = new AppDomainSetup(); // C u hnh cc thng tin ci t cho mi n ng d ng. setupInfo.ApplicationBase = @"C:\MyRootDirectory"; setupInfo.ConfigurationFile = "MyApp.config"; setupInfo.PrivateBinPath = "bin;plugins;external"; // T o m t mi n ng d ng m i (truy n null lm i s ch ng c ). // Nh lu m t tham chi u n AppDomain m i v n // khng th c thu l y theo b t k cch no khc. AppDomain newDomain = AppDomain.CreateDomain( "My New AppDomain", new System.Security.Policy.Evidence(), setupInfo);

B n ph i duy tr m t tham chi u n i t ng AppDomain v a t o b i v khng c c ch no li t k cc mi n ng d ng hi n c t bn trong m c-qu n-l.

3.2

Chuyn cc i tng qua li cc min ng dng


B n c n chuy n cc cc gi tr tr v . S d ng cc i t ng qua l i gi a cc mi n ng d ng nh cc i s hay

i t ng marshal-by-value hay marshal-by-reference.

H th ng .NET Remoting (s c th o lu n trong chng 12) gip vi c g i cc i t ng qua l i cc mi n ng d ng tr nn d dng. Tuy nhin, n u b n cha quen v i .NET Remoting, k t qu c th r t khc so v i mong i. Th c ra, v n gy kh khn khi dng nhi u mi n ng d ng l s tng tc v i .NET Remoting v cch th c lun chuy n i t ng qua cc mi n ng d ng. T t c cc ki u d li u c th chia thnh ba lo i: nonremotable, marshal-by-value (MBV), v marshal-by-reference (MBR). Ki u nonremotable khng th v t qua bin mi n ng d ng v

78 Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

li u

khng th dng lm cc i s hay cc gi tr tr v c a cc l i g i trong mi tr ng lin mi n ng d ng. Ki u nonremotable s c th o lu n trong m c 3.4. Ki u MBV l ki u kh -tu n-t -ha. Khi m t i t ng ki u MBV c chuy n qua m t mi n ng d ng khc nh l i s hay gi tr tr v , h th ng .NET Remoting s tu n t ha tr ng thi hi n t i c a i t ng, chuy n d li u sang mi n ng d ng ch, v t o m t b n sao c a i t ng v i cng tr ng thi nh i t ng g c. K t qu l t n t i b n sao c a i t ng c hai mi n ng d ng. Hai i t ng ny ban u gi ng nhau hon ton, nhng c l p nhau, nn vi c thay i i t ng ny khng nh h ng n i t ng kia. D i y l v d m t ki u kh -tu n-t -ha c tn l Employee, c chuy n qua m t mi n ng d ng khc b ng tr (xem m c 16.1 bi t cch t o ki u kh -tu n-t -ha).
[System.Serializable] public class Employee { // Hi n th c cc thnh vin } y.

Ki u MBR l l p d n xu t t l p System.MarshalByRefObject. Khi m t i t ng ki u MBR c chuy n qua m t mi n ng d ng khc nh i s hay gi tr tr v , h th ng .NET Remoting s t o m t i t ng proxy cho i t ng MBV c n chuy n trong mi n ng d ng ch. i t ng i di n th c hi n cc hnh vi hon ton gi ng v i i t ng MBR m n i di n. Th c ra, khi th c hi n m t hnh vi trn i t ng i di n, h th ng .NET Remoting th c hi n ng m vi c chuy n l i g i v cc i s c n thi t n mi n ng d ng ngu n, v t i th c hi n l i g i hm trn i t ng MBR g c. K t qu c tr v thng qua i t ng i di n. D i y l m t phin b n khc c a l p Employee, c chuy n qua m t mi n ng d ng khc b ng tham chi u thay v b ng tr (xem m c 12.7 bi t chi ti t v cch t o ki u MBR).
public class Employee : System.MarshalByRefObject { // Hi n th c cc thnh vin } y.

3.3 Trnh np cc assembly khng cn thit vo min


ng dng
B n c n chuy n m t tham chi u i t ng qua l i gi a cc mi n ng d ng khc nhau; tuy nhin, b n khng mu n CLR n p siu d li u m t ki u c a i t ng vo cc mi n ng d ng trung gian. ng gi tham chi u i t ng trong m t System.Runtime.Remoting.ObjectHandle v khi c n truy xu t i t ng th khi ph c l i. Khi b n truy n m t i t ng marshal-by-value (MBV) qua cc mi n ng d ng, b th c thi s t o m t th hi n m i c a i t ng ny trong mi n ng d ng ch. i u ny c ngha l b th c thi ph i n p assembly ch a siu d li u m t ki u c a i t ng vo cc mi n ng d ng. Do , vi c truy n cc tham chi u MBV qua cc mi n ng d ng trung gian s d n n

Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

79 li u

vi c b th c thi n p cc assembly khng c n thi t vo cc mi n ng d ng ny. M t khi c n p th cc assembly th a ny s khng c gi i phng kh i mi n ng d ng n u khng gi i phng c mi n ng d ng ch a chng (xem m c 3.9). L p ObjectHandle cho php b n ng gi tham chi u i t ng truy n qua cc d ng m b th c thi khng ph i n p thm assembly. Khi i t ng ny n mi n ch, b n c th khi ph c tham chi u i t ng, b th c thi s n p cc assembly c cho php b n truy xu t n i t ng nh bnh th ng. ng gi m t i t System.Data.DataSet), b n c th th c hi n nh sau:
// T o m t DataSet m i. System.Data.DataSet data1 = new System.Data.DataSet(); // C u hnh/thm d li u cho DataSet.

mi n ng ng d ng n thi t v ng (v d

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

khi ph c m t cho ph h p, v d :

i t ng, s d ng phng th c ObjectHandle.Unwrap v p ki u tr v

// Khi ph c DataSet t ObjectHandle. System.Data.DataSet data2 = (System.Data.DataSet)objHandle.Unwrap();

3.4

To kiu khng th vt qua bin min ng dng


B n c n t o m t ki u d li u sao cho cc th hi n c a ki u ny khng th truy xu t t m l nh cc mi n ng d ng khc. c

Ph i ch c ch n ki u d li u thu c d ng nonremotable, t c l khng th tu n t ha cng nh khng d n xu t t l p MarshalByRefObject. i khi b n mu n ki u d li u no ch c gi i h n truy xu t trong ph m vi c a mi n ng d ng. t o ki u d li u d ng nonremotable, ph i ch c r ng ki u ny khng ph i l kh tu n-t -ha v cng khng d n xu t (tr c ti p hay gin ti p) t l p MarshalByRefObject. Nh ng i u ki n ny s m b o r ng tr ng thi c a i t ng khng th c truy xu t t cc mi n ng d ng khc (cc i t ng ny khng th c s d ng lm i s hay gi tr tr v trong cc l i g i phng th c lin mi n ng d ng). i u ki n ki u d li u khng ph i l kh -tu n-t -ha c th c hi n d dng do m t l p khng th a k kh nng tu n t ha t l p cha c a n. b o m m t ki u khng ph i l kh -tu n-t -ha, b n ph i ch c ch n r ng c tnh System.SerializableAttribute khng c p d ng khi khai bo ki u. B n c n lu khi m b o m t l p khng c truy n b ng tham chi u. Nhi u l p trong th vi n l p .NET d n xu t tr c ti p hay gin ti p t MarshalByRefObject; b n ph i c n th n khng d n xu t l p c a b n t cc l p ny. Nh ng l p c s thng d ng d n xu t t MarshalByRefObject bao g m: System.ComponentModel.Component, System.IO.Stream, System.IO.TextReader, System.IO.TextWriter, System.NET.WebRequest, v System.Net.

80 Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

li u

WebResponse (xem ti li u .NET Framework SDK MarshalByRefObject).

c danh sch

cc l p d n xu t t

3.5

Np assembly vo min ng dng hin hnh


B n c n n p m t assembly vo mi n ng d ng lc th c thi. S d ng phng th c tnh Load hay LoadFrom c a l p System.Reflection.Assembly.

B th c thi t ng n p cc assembly m assembly c a b n tham chi u n lc bin d ch. Tuy nhin, b n cng c th ch th cho b th c thi n p assembly. Cc phng th c Load v LoadFrom u th c hi n m t cng vi c l n p m t assembly vo mi n ng d ng hi n hnh, v c hai u tr v m t i t ng Assembly m t assembly v a c n p. S khc bi t gi a hai phng th c l danh sch cc i s c cung c p nh n d ng assembly c n n p, v cch th c b th c thi nh v assembly ny. Phng th c Load cung c p nhi u d ng th c cho php ch s d ng m t trong nh ng d ng sau: M t string ch a tn y hay tn ring ph n nh assembly c n n p, b n c th

nh n d ng assembly.

M t System.Reflection.AssemblyName m t chi ti t v assembly. M t m ng byte ch a d li u c u thnh assembly.

Thng th ng, tn c a assembly c s d ng n p assembly. Tn y c a m t assembly bao g m: tn, phin b n, b n a, v token kha cng khai, c phn cch b i d u ph y (v d : System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken= b77a5c561934e089). ch nh m t assembly khng c tn m nh, s d ng PublicKeyToken=null. B n cng c th s d ng tn ng n nh n d ng m t assembly nhng t nh t ph i cung c p tn c a assembly (khng c ph n m r ng). o n m d i y trnh by cc cch s d ng phng th c Load:
// N p assembly System.Data dng tn y . string name1 = "System.Data,Version=1.0.5000.0," + "Culture=neutral,PublicKeyToken=b77a5c561934e089"; Assembly a1 = Assembly.Load(name1); // N p 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); // N p assembly SomeAssembly dng tn ng n. Assembly a3 = Assembly.Load("SomeAssembly");

Khi phng th c Load c g i, b th c thi th c hi n qu trnh nh v v n p assembly. D i y s tm t t qu trnh ny; b n tham kh o ti li u .NET Framework SDK bi t thm chi ti t.

Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

81 li u

1.

N u b n ch nh assembly tn m nh, phng th c Load s p d ng version policy (chnh sch phin b n) v publisher policy (chnh sch nh pht hnh) cho php kh nng chuy n ti p (redirect) n m t phin b n assembly khc. Version policy c ch nh trong file c u hnh my tnh hay ng d ng c a b n b ng ph n t <bindingRedirect>. Publisher policy c ch nh trong cc assembly c bi t c ci t bn trong GAC (Global Assembly Cache). M t khi xc nh ng phin b n c a assembly c n s d ng, b th c thi s c g ng n p cc assembly tn m nh t GAC. N u assembly khng c tn m nh ho c khng c tm th y trong GAC, b th c thi s tm ph n t <codeBase> trong cc file c u hnh my tnh v ng d ng. Ph n t <codeBase> nh x tn c a assembly thnh m t file hay m t URL. N u assembly c tn m nh, <codeBase> c th ch n b t k v tr no k c cc URL d a-trn-Internet; n u khng, <codeBase> ph i ch n m t th m c c v tr tng i so v i th m c ng d ng. N u assembly khng t n t i trong v tr c ch nh, phng th c Load s nm ngo i l System.IO.FileNotFoundException. N u khng c ph n t <codeBase> tng ng v i assembly, b th c thi s tm assembly b ng k thu t probing. Qu trnh probing s tm file u tin c tn c a assembly (v i ph n m r ng l .dll hay .exe) trong cc v tr: Th m c g c c a ng d ng. Cc th m c con c a th m c g c ph h p v i tn v b n Cc th m c con (c a th m c g c) do ng i dng ch a c a assembly. nh.

2. 3.

4.

Phng th c Load l cch d nh t tm v n p cc assembly, nhng cng c th t n nhi u chi ph cho vi c d trong nhi u th m c tm cc assembly c tn y u. Phng th c LoadFrom cho php b n n p assembly t m t v tr xc nh, n u khng tm th y n s nm ngo i l FileNotFoundException. B th c thi s khng c tm assembly nh phng th c Loadphng th c LoadFrom khng h tr GAC, policy, ph n t <codeBase> hay probing. D i y l o n m trnh by cch s d ng LoadFrom n p c:\shared\MySharedAssembly.dll. Lu r ng, khc v i Load, LoadFrom yu c u b n ch nh ph n m r ng c a file assembly.
// N p assembly c tn l c:\shared\MySharedAssembly.dll Assembly a4 = Assembly.LoadFrom(@"c:\shared\MySharedAssembly.dll");

3.6

Thc thi assembly min ng dng khc


B n c n th c thi m t assembly hnh. m t mi n ng d ng khc v i mi n ng d ng hi n i di n cho mi n ng

G i phng th c ExecuteAssembly c a i t ng AppDomain d ng, v ch nh tn c a assembly c n th c thi.

N u b n c m t assembly kh -th c-thi v mu n n p th c thi n trong m t mi n ng d ng, phng th c ExecuteAssembly s gip b n. Phng th c ExecuteAssembly c b n d ng th c khc nhau. D ng th c n gi n nh t ch nh n vo m t ki u string ch a tn c a assembly c n th c thi; b n c th ch nh m t file c c b hay m t URL. M t d ng th c khc cho php b n

82 Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

li u

ch nh ch ng c (evidence) cho assembly (xem m c 13.10) v cc nh p c a assembly (tng ng v i cc i s dng l nh).

is

truy n

n i m

Phng th c ExecuteAssembly n p assembly c ch nh v th c thi phng th c c nh ngha trong siu d li u l i m nh p c a assembly (th ng l phng th c Main). N u assembly c ch nh khng c kh nng th c thi, ExecuteAssembly s nm ngo i l System.Runtime.InteropServices.COMException. B th c thi khng th c thi assembly trong m t ti u trnh m i, v th quy n ki m sot s khng tr v cho n khi qu trnh th c thi c a assembly k t thc. Do ExecuteAssembly n p m t assembly b ng tn ring ph n (ch c tn file), CLR s khng dng GAC hay probing tm assembly (xem m c 3.5 bi t thm chi ti t). V d d i y trnh by cch s d ng phng th c ExecuteAssembly n p v th c thi m t assembly. L p ExecuteAssemblyExample t o m t AppDomain v th c thi chnh n trong AppDomain b ng phng th c ExecuteAssembly. K t qu l c hai b n sao c a ExecuteAssemblyExample c n p vo hai mi n ng d ng khc nhau.
using System; public class ExecuteAssemblyExample { public static void Main(string[] args) { // // // // if N u assembly ang th c thi trong m t AppDomain c tn thn thi n l "NewAppDomain" th khng t o AppDomain m i. i u ny s trnh m t vng l p v t n t o AppDomain. (AppDomain.CurrentDomain.FriendlyName != "NewAppDomain") { // T o mi n ng d ng m i c tn l "NewAppDomain". AppDomain domain = AppDomain.CreateDomain("NewAppDomain"); // Th c thi assembly ny trong AppDomain m i v // truy n m ng cc i s dng l nh. domain.ExecuteAssembly("ExecuteAssemblyExample.exe", null, args); } // Hi n th cc i s dng l nh ln mn hnh // cng v i tn thn thi n c a AppDomain. foreach (string s in args) { Console.WriteLine(AppDomain.CurrentDomain.FriendlyName + " : " + s); } } }

3.7

Th hin ha mt kiu trong min ng dng khc


B n c n th hi n ha m t ki u trong m t mi n ng d ng khc v i mi n ng d ng hi n hnh. G i phng th c CreateInstance hay CreateInstanceFrom c a i di n cho mi n ng d ng ch. i t ng AppDomain

Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

83 li u

Vi c s d ng phng th c ExecuteAssembly ( c th o lu n trong m c 3.6) khng m y kh khn; nhng khi pht tri n cc ng d ng ph c t p c s d ng nhi u mi n ng d ng, ch c ch n b n mu n ki m sot qu trnh n p cc assembly, t o cc ki u d li u, v tri u g i cc thnh vin c a i t ng bn trong mi n ng d ng. Cc phng th c CreateInstance v CreateInstanceFrom cung c p nhi u phin b n n p ch ng gip b n ki m sot qu trnh t o i t ng. Cc phin b n n gi n nh t s d ng phng th c kh i d ng m c nh c a ki u, nhng c hai phng th c ny u thi t t cc phin b n cho php b n cung c p i s s d ng b t k phng th c kh i d ng no. Phng th c CreateInstance n p m t assembly c tn xc nh vo mi n ng d ng b ng qu trnh c m t cho phng th c Assembly.Load trong m c 3.5. Sau , CreateInstance t o i t ng cho ki u v tr v m t tham chi u n i t ng m i c ng gi trong ObjectHandle ( c m t trong m c 3.3). Tng t nh th i v i phng th c CreateInstanceFrom; tuy nhin, CreateInstanceFrom n p assembly vo mi n ng d ng b ng qu trnh c m t cho phng th c Assembly.LoadFrom trong m c 3.5. c p hai phng th c r t ti n l i c tn l CreateInstanceAndUnwrap v CreateInstanceFromAndUnwrap, chng s t ng khi ph c tham chi u n i t ng c t o t i t ng ObjectHandle; b n ph i p i t ng tr v cho ng ki u tr c khi s d ng.
AppDomain

cng

cung

N u b n s d ng CreateInstance hay CreateInstanceFrom t o i t ng ki u MBV trong m t mi n ng d ng khc, i t ng s c t o nhng tham chi u tr v s khng ch n i t ng . Do cch th c i t ng MBV v t qua bin mi n ng d ng, tham chi u ny s ch n m t b n sao c a i t ng c t o t ng trong mi n ng d ng c c b . Ch khi b n t o n i t ng trong mi n ng d ng khc (xem m t ki u MBR th tham chi u tr v m i ch m c 3.2 bi t thm chi ti t v ki u MBV v MBR). K thu t chung n gi n ha vi c qu n l cc mi n ng d ng l s d ng l p i u khi n (controller class). M t l p i u khi n l m t ki u MBR ty bi n. B n hy t o m t mi n ng d ng r i t o i t ng l p i u khi n trong mi n ng d ng ny b ng phng th c CreateInstance. L p i u khi n hi n th c cc ch c nng c n thi t cho ng d ng thao tc mi n ng d ng v cc n i dung c a n. Cc ch c nng ny c th bao g m: n p assembly, t o thm mi n ng d ng, d n d p tr c khi xa mi n ng d ng, hay li t k cc ph n t chng trnh (b n khng th th c hi n bn ngoi mi n ng d ng). V d d i y trnh by cch s d ng m t l p i u khi n c tn l PluginManager. Khi c t o trong m t mi n ng d ng, PluginManager cho php b n t o i t ng c a cc l p c hi n th c giao di n IPlugin, ch y v d ng cc plug-in , v tr v danh sch cc plug-in hi n c n p.
using using using using System; System.Reflection; System.Collections; System.Collections.Specialized; cc plug-in.

// Giao di n chung cho t t c public interface IPlugin { void Start(); void Stop(); }

84 Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

li u

// M t hi n th c n gi n cho giao di n Iplugin // minh h a l p i u khi n PluginManager. public class SimplePlugin : IPlugin { public void Start() { Console.WriteLine(AppDomain.CurrentDomain.FriendlyName + ": SimplePlugin starting..."); } public void Stop() {

Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

85 li u

Console.WriteLine(AppDomain.CurrentDomain.FriendlyName + ": SimplePlugin stopping..."); } } // L p i u khi n, qu n l vi c n p v thao tc // cc plug-in trong mi n ng d ng c a n. public class PluginManager : MarshalByRefObject { // ListDictionary gi tham chi u n cc plug-in. private ListDictionary plugins = new ListDictionary(); // Phng th c kh i d ng m c public PluginManager() {} nh.

// Phng th c kh i d ng nh n danh sch cc plug-in. public PluginManager(ListDictionary pluginList) { // N p cc plug-in c ch nh. foreach (string plugin in pluginList.Keys) { this.LoadPlugin((string)pluginList[plugin], plugin); } } // N p assembly v t o plug-in c ch nh. public bool LoadPlugin(string assemblyName, string pluginName) { try { // N p assembly. Assembly assembly = Assembly.Load(assemblyName); // T o plug-in m i. IPlugin plugin = (IPlugin)assembly.CreateInstance(pluginName, true); if (plugin != null) { // Thm plug-in m i vo ListDictionary. plugins[pluginName] = plugin; return true; } else { return false; } } catch { return false; } } public void StartPlugin(string plugin) { // L y m t plug-in t ListDictionary v // g i phng th c Start. ((IPlugin)plugins[plugin]).Start(); }

86 Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

li u

public void StopPlugin(string plugin) { // L y m t plug-in t ListDictionary v // g i phng th c 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() { // T o m t mi n ng d ng m i. AppDomain domain1 = AppDomain.CreateDomain("NewAppDomain1"); // T o m t PluginManager trong mi n ng d ng m i // b ng phng th c kh i d ng m c nh. PluginManager manager1 = (PluginManager)domain1.CreateInstanceAndUnwrap( "CreateInstanceExample", "PluginManager"); // N p m t plug-in m i vo NewAppDomain1. manager1.LoadPlugin("CreateInstanceExample", "SimplePlugin"); // Ch y v d ng plug-in trong NewAppDomain1. manager1.StartPlugin("SimplePlugin"); manager1.StopPlugin("SimplePlugin"); // T o m t mi n ng d ng m i. AppDomain domain2 = AppDomain.CreateDomain("NewAppDomain2"); // T o m t ListDictionary ch a cc plug-in. ListDictionary pluginList = new ListDictionary(); pluginList["SimplePlugin"] = "CreateInstanceExample"; // T o m t PluginManager trong mi n ng d ng m i // v ch nh danh sch cc plug-in. PluginManager manager2 = (PluginManager)domain1.CreateInstanceAndUnwrap( "CreateInstanceExample", "PluginManager", true, 0, null, new object[] {pluginList}, null, null, null); // Hi n th cc plug-in c n p vo NewAppDomain2. Console.WriteLine("Plugins in NewAppDomain2:"); foreach (string s in manager2.GetPluginList()) { Console.WriteLine(" - " + s); } // Nh n Enter thot. Console.ReadLine(); } }

Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

87 li u

3.8
B n c n m t c ch mi n ng d ng.

Truyn d liu gia cc min ng dng


n gi n truy n d li u tr ng thi hay c u hnh gi a cc Dng cc phng th c SetData v GetData c a l p AppDomain.

D li u c th c truy n qua cc mi n ng d ng nh i s hay tr tr v khi b n cho g i cc thnh vin c a cc i t ng hi n c trong cc mi n ng d ng. Vi c truy n d li u qua cc mi n ng d ng c th c hi n d dng gi ng nh truy n d li u trong cng m t mi n ng d ng. M i mi n ng d ng u duy tr m t vng m d li u (data cache) ch a m t t p cc c p tn/gi tr . H u h t n i dung c a vng m d li u ph n nh cc thi t l p c u hnh c a mi n ng d ng, nh cc gi tr t i t ng AppDomainSetup c cung c p trong qu trnh t o mi n ng d ng (xem m c 3.1). Vng m d li u ny c th c s d ng trao i d li u gi a cc mi n ng d ng hay lu tr cc gi tr t m th i dng trong cng m t mi n ng d ng. Phng th c SetData th c hi n vi c k t h p m t kha d ng chu i v i m t i t ng v lu tr n vo vng m d li u c a mi n ng d ng. Phng th c GetData th c hi n cng vi c ng c l i l l y l i i t ng t vng m d li u thng qua kha. N u m l nh trong m t mi n ng d ng g i phng th c SetData hay GetData truy xu t vng m d li u c a mi n ng d ng khc, th i t ng d li u ph i h tr ng ngha marshal-by-value hay marshal-byreference, n u khng th ngo i l System.Runtime.Serialization.SerializationException s b nm (xem m c 3.3 bi t thm chi ti t v cch truy n i t ng qua cc mi n ng d ng). o n m sau trnh by cch s d ng phng th c SetData v GetData truy n m t System.Collections.ArrayList gi a hai mi n ng d ng.
using System; using System.Reflection; using System.Collections; public class ListModifier { public ListModifier () { // Nh n danh sch t m d li u. ArrayList list = (ArrayList)AppDomain.CurrentDomain.GetData("People"); // Thay i danh sch. list.Add("Tam"); } } public class PassDataExample { public static void Main() { // T o m t mi n ng d ng m i. AppDomain domain = AppDomain.CreateDomain("Test"); // T o m t ArrayList v thm thng tin vo. ArrayList list = new ArrayList(); list.Add("Phuong"); list.Add("Phong"); list.Add("Nam");

88 Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

li u ng d ng m i.

// t danh sch vo vng m d domain.SetData("People", list);

li u c a mi n

// T o m t ListModifier trong mi n ng d ng m i // s thay i n i dung c a list trong vng m d domain.CreateInstance("03-08", "ListModifier");

li u.

// Nh n l i danh sch v hi n th n i dung c a n. foreach (string s in (ArrayList)domain.GetData("People")) { Console.WriteLine(s); } // Nh n Enter thot. Console.ReadLine(); } }

3.9

Gii phng assembly v min ng dng


B n c n gi i phng cc assembly hay cc mi n ng d ng lc th c thi. Khng c cch no gi i phng cc assembly ring l . B n c th gi i phng ton ng th i v i b m t mi n ng d ng b ng phng th c tnh AppDomain.Unload, vi c gi i phng mi n ng d ng l t t c cc assembly c n p vo mi n ng d ng cng c gi i phng.

Cch duy nh t gi i phng m t assembly l gi i phng c mi n ng d ng m n c n p vo. ng ti c, vi c gi i phng m t mi n ng d ng cng s gi i phng lun t t c cc assembly c n p vo . y l m t gi i h n yu c u b n ph i t ch c v qu n l t t c u trc mi n ng d ng v assembly. Khi gi i phng m t mi n ng d ng b ng phng th c tnh AppDomain.Unload, b n c n truy n cho n m t tham chi u AppDomain n mi n ng d ng c n gi i phng. B n khng th gi i phng mi n ng d ng m c nh do CLR t o lc startup. o n m d i y trnh by cch s d ng phng th c Unload.
// T o m t mi n ng d ng m i. AppDomain newDomain = AppDomain.CreateDomain("New Domain"); // N p assembly vo mi n ng d ng my. // Gi i phng mi n ng d ng. AppDomain.Unload(newDomain);

Phng th c Unload ch n cc ti u trnh m i i vo mi n ng d ng c ch nh v g i phng th c Thread.Abort trn t t c cc ti u trnh hi n ang ch y trong mi n ng d ng ny. N u ti u trnh g i phng th c Unload hi n ang ch y trong mi n ng d ng c n gi i phng th m t ti u trnh khc s c kh i ch y th c hi n qu trnh gi i phng. N u c v n trong vi c gi i phng mi n ng d ng, ngo i l System.CannotUnloadAppDomainException s b nm b i ti u trnh th c hi n qu trnh gi i phng. Trong khi mi n ng d ng ang c gi i phng, CLR g i th c thi cc phng th c gi i phng c a t t c cc i t ng trong mi n ng d ng. Ty thu c vo s l ng i t ng v b n ch t c a cc phng th c gi i phng m qu trnh ny c th m t m t kho ng th i gian no . Phng th c AppDomain.IsFinalizingForUnload tr v true n u mi n ng d ng ang

Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

89 li u

c gi i phng v CLR b t false.

u gi i phng cc

i t ng trong ; ng c l i, tr v

3.10
B n mu n thu l y

Truy xut thng tin Type


i t ng System.Type m t m t ki u d li u nh t nh.

S d ng m t trong cc cch sau: Ton t typeof Phng th c tnh GetType c a l p System.Type Phng th c GetType thu c m t th hi n c a ki u Phng th c GetNestedType hay GetNestedTypes c a l p Type Phng th c GetType hay GetTypes c a l p Assembly Phng th c GetType, GetTypes, hay FindTypes c a l p System.Reflection.
Module

i t ng Type cung c p m t i m kh i u lm vi c v i cc ki u d li u b ng c ch ph n chi u. M t i t ng Type cho php b n ki m tra siu d li u c a ki u, thu l y cc thnh vin c a ki u, v t o cc i t ng c a ki u. Do t m quan tr ng c a n, .NET Framework cung c p nhi u c ch l y tham chi u n cc i t ng Type. Phng php hi u qu nh t typeof: thu l y i t ng Type cho m t ki u c th l s d ng ton t

System.Type t1 = typeof(System.Text.StringBuilder);

Tn ki u khng c t trong d u nhy kp v ph i kh phn gi i i v i trnh bin d ch. V tham chi u c phn gi i lc bin d ch nn assembly ch a ki u ny tr thnh ph n ph thu c tnh c a assembly v s c li t k nh th trong assembly manifest c a b n. M t cch khc l s d ng phng th c tnh Type.GetType, nh n vo m t chu i ch a tn ki u. V s d ng chu i ch nh ki u nn b n c th thay i n lc th c thi, i u ny m ra cnh c a n v i th gi i l p trnh ng b ng c ch ph n chi u (xem m c 3.12). N u b n ch nh tn ki u, b th c thi ph i tm ki u ny trong m t assembly c n p. B n cng c th ch nh m t tn ki u theo tiu chu n assembly (tham kh o ti li u .NET Framework SDK v phng th c Type.GetType bi t cch k t c u tn ki u theo tiu chu n assembly). Cc l nh sau trnh by cch s d ng phng th c GetType:
// C phn bi t ch hoa-th ng, tr v null n u khng tm th y. Type t2 = Type.GetType("System.String"); // C phn bi t ch hoa-th ng, // nm ngo i l TypeLoadException n u khng tm th y. Type t3 = Type.GetType("System.String", true); // Khng phn bi t ch hoa-th ng, // nm ngo i l TypeLoadException n u khng tm th y. Type t4 = Type.GetType("system.string", true, true); // Tn ki u theo tiu chu n assembly. Type t5 = Type.GetType("System.Data.DataSet,System.Data," + "Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089");

90 Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

li u

thu l y i t ng Type m t ki u c a m t i t ng hi n c, hy s d ng phng th c GetType, c hi n th c b i Object v c th a k b i t t c cc ki u d li u. D i y l m t v d :


System.Text.StringBuilder sb = new System.Text.StringBuilder(); Type t6 = sb.GetType();

B ng 3.2 tm t t cc phng th c khc cng cung c p kh nng truy xu t


B ng 3.2 Cc phng th c tr v Phng th c Type.GetNestedType i t ng Type M t

i t ng Type.

L y

i t ng Type m t m t ki u l ng bn trong

i t ng

Type hi n c

Type.GetNestedTypes

L y m t m ng cc i t ng Type m t cc ki u l ng bn trong i t ng Type hi n c L y i t ng Type m t m t ki u c khai bo bn trong assembly L y m t m ng cc bn trong assembly i t ng Type m t cc ki u c khai bo

Assembly.GetType

Assembly.GetTypes

Module.GetType

L y i t ng Type m t m t ki u c khai bo bn trong module L y m t m ng cc bn trong module i t ng Type m t cc ki u c khai bo

Module.GetTypes

Module.FindTypes

L y m t m ng c l c, ch a cc i t ng Type m t cc ki u c khai bo bn trong modulecc ki u ny c l c b ng m t delegate (xc nh xem m i Type c xu t hi n trong m ng ch hay khng)

3.11

Kim tra kiu ca mt i tng


i t ng.

B n mu n ki m tra ki u c a m t

S d ng phng th c th a k Object.GetType thu l y Type cho i t ng ny. Trong vi tr ng h p, b n cng c th s d ng ton t is v as ki m tra ki u c a m t i t ng. T t c cc ki u d li u u th a k phng th c GetType t l p c s Object. Nh c th o lu n trong m c 3.10, phng th c ny tr v m t tham chi u Type m t ki u c a i t ng. B th c thi duy tr m t i t ng Type cho m i ki u c n p v t t c cc tham chi u cho ki u ny cng ch n i t ng ny. i u ny ngha l b n c th so snh hai tham chi u ki u m t cch hi u qu . V d d i y trnh by cch ki m tra m t i t ng c ph i l System.IO.StringReader hay khng:
// T o m t StringReader th nghi m. Object someObject = new StringReader("This is a StringReader");

Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

91 li u

// Ki m tra xem someObject c ph i l m t StringReader hay khng // b ng cch thu l y v so snh tham chi u Type (s d ng ton t typeof). if (typeof(System.IO.StringReader) == someObject.GetType()) { // Lm g . }

C# cung c p ton t is th c hi n nhanh vi c ki m tra nh trn. Ngoi ra, is s tr v true n u i t ng c n ki m tra d n xu t t l p c ch nh. o n m d i y ki m tra xem someObject l m t th hi n c a System.IO.TextReader, hay m t l p d n xu t t TextReader (nh StringReader):
// Ki m tra xem someObject l TextReader, // hay d n xu t t TextReader b ng ton t if (someObject is System.IO.TextReader) { // Lm g . } is.

C hai cch ny u i h i ki u dng v i ton t typeof v is ph i l ki u bi t v kh phn gi i lc bin d ch. M t cch khc linh ho t hn (nhng ch m hn) l s d ng phng tr v m t tham chi u Type cho ki u c ch nh. Tham chi u Type th c Type.GetType khng c phn gi i cho n khi th c thi, vi c ny nh h ng n hi u nng, nhng cho php b n thay i php so snh ki u lc th c thi d a trn gi tr c a m t chu i. Phng th c IsType d i y s tr v true n u i t ng thu c ki u c ch nh v s d ng phng th c Type.IsSubclassOf ki m tra i t ng ny c ph i l m t l p con c a ki u 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); }

Cu i cng, b n c th s d ng ton t as p b t k i t ng no sang ki u c ch nh. N u i t ng khng th b p sang ki u c ch nh, ton t as s tr v null. i u ny cho php b n th c hi n cc php p ki u an ton (safe cast), nhng ki u c so snh ph i l kh phn gi i lc th c thi. D i y l m t v d :
// S d ng ton t as th c hi n m t php p ki u an ton. StringReader reader = someObject as System.IO.StringReader; if (reader != null) { // Lm g . }

Phng th c tnh GetUnderlyingType c a l p System.Enum cho php b n thu l y ki u th c s c a m t ki u li t k.

3.12

To mt i tng bng c ch phn chiu


i t ng b ng c ch ph n chi u.

B nc nt om t

92 Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

li u

Thu l y

i t ng Type m t ki u c a i t ng c n t o, g i phng th c c c i t ng System.Reflection.ConstructorInfo m t phng th c kh i d ng c n dng, sau th c thi phng th c ConstructorInfo.Invoke.


GetConstructor c a n

B c u tin trong vi c t o m t i t ng b ng c ch ph n chi u l thu l y i t ng Type m t ki u c a i t ng c n t o (xem m c 3.10 bi t thm chi ti t). Khi c c i t ng Type, hy g i phng th c GetConstructor thu l y i t ng ConstructorInfo m t m t trong cc phng th c kh i d ng c a ki u ny. D ng th c thng d ng nh t c a phng th c GetConstructor l nh n m t m ng Type lm i s , v tr v i t ng ConstructorInfo m t phng th c kh i d ng nh n cc i s c ch nh trong m ng Type. thu l y i t ng ConstructorInfo m t phng th c kh i d ng m c nh (khng c i s ), b n hy truy n cho phng th c GetConstructor m t m ng Type r ng (s d ng tr ng tnh Type.EmptyTypes); ng s d ng null, n u khng GetConstructor s nm ngo i l System.ArgumentNullException. N u GetConstructor khng tm th y phng th c kh i d ng no c ch k ph h p v i cc i s c ch nh th n s tr v null. Mt khi c i t ng ConstructorInfo nh mong mu n, hy g i phng th c Invoke c a n. B n ph i cung c p m t m ng ch a cc i s m b n mu n truy n cho phng th c kh i d ng. Phng th c Invoke s t o i t ng m i v tr v m t tham chi u n i t ng (b n ph i p v ki u ph h p). D i y l o n m trnh by cch t o m t i t ng System.Text.StringBuilder, ch nh n i dung ban u cho StringBuilder v s c ch a c a n.
// Thu l y i t ng Type cho l p StringBuilder. Type type = typeof(System.Text.StringBuilder); // T o Type[] ch a cc i t ng Type cho m i i s // c a phng th c kh i d ng (m t chu i v m t s nguyn). Type[] argTypes = new Type[] {typeof(System.String), typeof(System.Int32)}; // Thu l y i t ng ConstructorInfo. ConstructorInfo cInfo = type.GetConstructor(argTypes); // T o object[] ch a cc i s cho phng th c kh i d ng. object[] argVals = new object[] {"Some string", 30}; // T o i t ng v p n v ki u StringBuilder. StringBuilder sb = (StringBuilder)cInfo.Invoke(argVals);

Ch c nng ph n chi u th ng c s d ng hi n th c cc factory. Trong , b n s c ch ph n chi u th hi n ha cc l p th a k m t l p c s ph bi n hay hi n th giao di n ph bi n. Thng th ng, c l p c s chung v giao di n chung u c s L p c s tr u t ng s hi n th c giao di n v b t k ch c nng chung no, sau m th c c th s th a k l p c s .

d ng cm t d ng. i hi n

Khng c c ch no khai bo r ng m i l p c th ph i hi n th c cc phng th c kh i d ng v i cc ch k c th . N u mu n ng i khc (hng th ba) hi n th c cc l p c th th b n ph i ch r (trong ti li u h ng d n) ch k c a phng th c kh i d ng m factory c a b n g i. Cch thng th ng trnh v n ny l s d ng phng th c kh i d ng m c nh (khng c i s ), sau c u hnh i t ng b ng phng th c v thu c tnh. V d d i y s hi n th c m t factory dng t o cc i t ng c hi n th c giao di n IPlugin.

Chng 3: Mi n using System; using System.Reflection;

ng d ng, c ch ph n chi u, v siu d

93 li u

// Giao di n chung m t t c cc plug-in ph i hi n th c. public interface IPlugin { string Description { get; set; } void Start(); void Stop(); } // L p c s tr u t ng m t t c cc plug-in ph i d n xu t t public abstract class AbstractPlugin : IPlugin { // Chu i ch a l i m t plug-in. private string description = ""; // Thu c tnh dng l y l i m t public string Description { get { return description; } set { description = value; } } plug-in. y.

// Khai bo cc thnh vin c a giao di n IPlugin. public abstract void Start(); public abstract void Stop(); } // M t hi n th c n gi n cho giao di n IPlugin // minh h a l p PluginFactory. public class SimplePlugin : AbstractPlugin { // Hi n th c phng th c Start. public override void Start() { Console.WriteLine(Description }

+ ": Starting...");

// Hi n th c phng th c Stop. public override void Stop() { Console.WriteLine(Description + ": Stopping..."); } } // Factory dng t o cc i t ng c a IPlugin. public sealed class PluginFactory { public static IPlugin CreatePlugin(string assembly, string pluginName, string description) { // Thu l y i t ng Type cho plug-in c ch nh. Type type = Type.GetType(pluginName + ", " + assembly); // Thu l y i t ng ConstructorInfo. ConstructorInfo cInfo = type.GetConstructor(Type.EmptyTypes); // T o i t ng v p n v ki u StringBuilder. IPlugin plugin = (IPlugin)cInfo.Invoke(null); // C u hnh IPlugin m i. plugin.Description = description; return plugin; } }

Cu l nh sau y s t o

i t ng SimplePlugin b ng l p PluginFactory:

94 Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

li u

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

L p System.Activator cung c p hai phng th c tnh CreateInstance v CreateInstanceFrom dng t o cc i t ng d a trn i t ng Type hay chu i ch a tn ki u. Xem ti li u .NET Framework SDK bi t thm chi ti t.

3.13
B n c n t o ra m t c tnh theo b n.

To mt c tnh ty bin

T o m t l p d n xu t t l p c s tr u t ng System.Attribute. Hi n th c cc phng th c kh i d ng, cc tr ng, v cc thu c tnh cho php ng i dng nh ngha: c u hnh c tnh. S d ng System.AttributeUsageAttribute Nh ng ph n t chng trnh no l ch c a B n c th p d ng nhi u th hi n c a hay khng c tnh c tnh cho m t ph n t chng trnh

c tnh c c th a k b i cc ki u d n xu t hay khng

c tnh cung c p m t c ch t ng qut cho vi c k t h p thng tin khai bo (siu d li u) v i cc ph n t chng trnh. Siu d li u ny n m trong assembly c bin d ch, cho php cc chng trnh thu l y n thng qua c ch ph n chi u lc th c thi (xem m c 3.14.) Cc xc nh cch th c tng tc v chng trnh khc, c bi t l CLR, s d ng thng tin ny qu n l cc ph n t chng trnh. c tnh ty bi n th hy d n xu t m t l p t l p c s tr u t ng System.Attribute. Cc l p c tnh ty bi n ph i l public v c tn k t thc b ng Attribute. M t c tnh ty bi n ph i c t nh t m t phng th c kh i d ng cng khai. Cc i s c a phng th c kh i d ng s tr thnh cc i s v tr (positional parameter) c a c tnh. Nh v i b t k l p no khc, b n c th khai bo nhi u phng th c kh i d ng, cho php ng i dng ty ch n s d ng cc t p khc nhau c a cc i s v tr khi p d ng c tnh. B t k thu c tnh v tr ng c/ghi cng khai no do c tnh khai bo u tr thnh i s c nu tn (named parameter). i u khi n cch th c ng i dng p d ng c tnh, hy p d ng c tnh c tnh ty bi n c a b n. c tnh AttributeUsageAttribute h tr m t i s v tr v hai i s c nu tn, c m t trong b ng 3.3. Cc gi tr m c nh ch nh gi tr s c p d ng cho c tnh ty bi n c a b n n u b n khng p d ng AttributeUsageAttribute ho c khng ch nh gi tr cho m t thng s .
AttributeUsageAttribute cho B ng 3.3 Cc thnh vin thu c ki u li t k AttributeUsage Thng s Ki u M t M c nh

t o m t

Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

95 li u

ValidOn

v tr

M t thnh vin thu c ki u li t k nh ph n t chng trnh m c tnh s c hi u l c trn .


System.AttributeTargets, ch

AttributeTargets.All

AllowMultiple

c nu tn c nu tn

c tnh c th c ch nh nhi u l n cho m t ph n t hay khng. c tnh c c th a k b i cc l p d n xu t hay cc thnh vin c chp hay khng.

false

Inherited

true

V d d i y trnh by cch t o m t c tnh ty bi n c tn l AuthorAttribute, cho php b n xc nh tn v cng ty c a ng i t o ra l p hay assembly. AuthorAttribute khai bo m t phng th c kh i d ng cng khai, nh n m t chu i ch a tn tc gi . i u ny yu c u ng i s d ng AuthorAttribute ph i lun cung c p m t i s v tr ch a tn tc gi . Company l thu c tnh cng khai (c th dng lm i s c nu tn), Name l thu c 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 { private string company; // Cng ty c a tc gi private string name; // Tn tc gi // Khai bo phng th c kh i d ng cng khai. public AuthorAttribute(string name) { this.name = name; company = ""; } // Khai bo thu c tnh Company c quy n set/get. public string Company { get { return company; } set { company = value; } } // Khai bo thu c tnh Name ch public string Name{ get { return name;} } } c.

D i y l cch s d ng AuthorAttribute:
// Khai bo Square Nguyen l tc gi c a assembly. [assembly:Author("Square Nguyen", Company = "Goldsoft Ltd.")] // Khai bo Square Nguyen l tc gi c a l p. [Author("Square Nguyen", Company = "Goldsoft Ltd.")] public class SomeClass { }

96 Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d c a l p.

li u

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

3.14

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


ki m tra cc c tnh ty bi n c p

B n mu n s d ng c ch ph n chi u d ng cho m t ph n t chng trnh.

G i phng th c GetCustomAttributes c a i t ng d n xu t t l p System.Reflection.MemberInfo ( i t ng ny m t ph n t chng trnh c n ki m tra). T t c cc l p m t cc ph n t chng trnh u d n xu t t l p MemberInfo. L p ny bao g m Type, EventInfo, FieldInfo, PropertyInfo, v MethodBase. MethodBase c thm hai l p con: ConstructorInfo v MethodInfo. B n c th g i phng th c GetCustomAttributes n u c c b t k i t ng no c a cc l p ny. Phng th c ny s tr v m ng ch a cc c tnh ty bi n c p d ng cho ph n t chng trnh. Ch l m ng ny ch ch a cc c tnh ty bi n ch khng ch a cc c tnh c s n trong th vi n cc l p c s c a .NET Framework. Phng th c GetCustomAttributes c hai d ng th c. D ng u tin nh n m t i s bool xc nh phng th c ny c tr v cc c tnh c th a k t cc l p cha hay khng. D ng th hai nh n thm m t i s Type c vai tr nh m t b l c, k t qu tr v l cc c tnh thu c ki u c ch nh b i Type. V d sau s d ng c tnh ty bi n AuthorAttribute c khai bo trong m c 3.13 v p d ng n vo l p GetCustomAttributesExample. Phng th c Main s g i phng th c GetCustomAttributes, l c cc c tnh k t qu tr v ch c cc th hi n c a AuthorAttribute. B n c th th c hi n p ki u an ton cc c tnh ny v tham chi u AuthorAttribute v truy xu t cc thnh vin c a chng m khng c n s d ng c ch ph n chi u.
using System; [Author("Stephen Chau")] [Author("Square Nguyen", Company = "Goldsoft Ltd.")] public class GetCustomAttributesExample { public static void Main() { // L y i t ng Type cho chnh l p ny. Type type = typeof(GetCustomAttributesExample); // L y cc c tnh cho ki u ny. S d ng b l c // k t qu tr v ch c cc th hi n c a AuthorAttribute. object[] attrs = type.GetCustomAttributes(typeof(AuthorAttribute), true);

Chng 3: Mi n

ng d ng, c ch ph n chi u, v siu d

97 li u

// Li t k cc c tnh. foreach (AuthorAttribute a in attrs) { Console.WriteLine(a.Name + ", " + a.Company); } // Nh n Enter k t thc. Console.ReadLine(); } }

98

Chng 4: TI U TRNH, TI N TRNH, V S

NG B

99

100 Chng 4: Ti u trnh, ti n trnh, v s

ng b

t trong nh ng i m m nh c a h i u hnh Microsoft Windows l cho php nhi u chng trnh (ti n trnhprocess) ch y ng th i v cho php m i ti n trnh th c hi n nhi u tc v ng th i (b ng nhi u ti u trnhthread). Chng ny s trnh by cch ki m sot cc ti n trnh v cc ti u trnh trong cc ng d ng d a vo cc tnh nng do th vi n l p .NET Framework cung c p. Cc m c trong chng ny s trnh by cch th c hi n cc v n sau: S d ng cc k thu t v cc tnh nng khc nhau c a .NET Framework trnh m i (m c 4.1 n 4.5). Ki m sot qu trnh th c thi c a m t ti u trnh 4.6 v 4.7). t o cc ti u

bi t c khi no n k t thc (m c

ng b ha qu trnh th c thi c a nhi u ti u trnh (m c 4.8 v 4.9). Ch y v d ng cc ti n trnh m i (m c 4.10 v 4.11). B o m r ng t i m t th i i m ch c th ch y m t th hi n c a ng d ng (m c 4.12).

4.1

Thc thi phng thc vi thread-pool


B n c n th c thi m t phng th c b ng m t ti u trnh trong thread-pool c a b th c thi. Khai bo m t phng th c ch a m l nh c n th c thi; phng th c ny ph i tr i s . Sau , t o m t th hi n c a y nhi m v void v ch nh n m t System.Threading.WaitCallback tham chi u n phng th c ny. Ti p t c, g i phng th c tnh QueueUserWorkItem c a l p System.Threading.ThreadPool, v truy n th hi n y nhi m t o lm i s . B th c thi s x p th hi n y nhi m ny vo hng i v th c thi n khi m t ti u trnh trong thread-pool s n sng.

N u ng d ng s d ng nhi u ti u trnh c th i gian s ng ng n hay duy tr m t s l ng l n cc ti u trnh ng th i th hi u nng c th gi m st b i cc chi ph cho vi c t o, v n hnh v h y cc ti u trnh. Ngoi ra, trong m t h th ng h -tr - a-ti u-trnh, cc ti u trnh th ng tr ng thi r i su t m t kho ng th i gian di ch i u ki n th c thi ph h p. Vi c s d ng thread-pool s cung c p m t gi i php chung nh m c i thi n tnh quy m v hi u nng c a cc h th ng h -tr - a-ti u-trnh. .NET Framework cung c p m t hi n th c n gi n cho thread-pool m chng ta c th truy xu t thng qua cc thnh vin tnh c a l p ThreadPool. Phng th c QueueUserWorkItem cho php b n th c thi m t phng th c b ng m t ti u trnh trong thread-pool ( t cng vi c vo hng i). M i cng vi c c m t b i m t th hi n c a y nhi m WaitCallback (tham chi u n phng th c c n th c thi). Khi m t ti u trnh trong thread-pool s n sng, n nh n cng vi c k ti p t hng i v th c thi cng vi c ny. Khi hon t t cng vi c, thay v k t thc, ti u trnh ny quay v thread-pool v nh n cng vi c k ti p t hng i. Vi c s d ng thread-pool c a b th c thi gip n gi n ha vi c l p trnh h -tr - a-ti u-trnh. Tuy nhin, c n lu y l thread-pool c hi n th c n gi n, ch nh m m c ch s d ng chung. Tr c khi quy t nh s d ng thread-pool ny, c n xem xt cc i m sau:

Chng 4: Ti u trnh, ti n trnh, v s

101 ng b

B th c thi quy nh s ti u trnh t i a c c p cho thread-pool; b n khng th thay i s t i a ny b ng cc tham s c u hnh hay t bn trong m c-qu n-l. Gi i h n m c nh l 25 ti u trnh cho m i CPU trong h th ng. S ti u trnh t i a trong thread-pool khng gi i h n s cc cng vi c ang ch trong hng i. Cng nh vi c cho php b n s d ng thread-pool th c thi m l nh m t cch tr c ti p, b th c thi cn s d ng thread-pool cho nhi u m c ch bn trong, bao g m vi c th c thi phng th c m t cch b t ng b (xem m c 4.2) v th c thi cc s ki n nh th i (xem m c 4.3). T t c cc cng vi c ny c th d n n s tranh ch p gi a cc ti u trnh trong thread-pool; ngha l hng i c th tr nn r t di. M c d di t i a c a hng i ch b gi i h n b i s l ng b nh cn l i cho ti n trnh c a b th c thi, nhng hng i qu di s lm ko di qu trnh th c thi c a cc cng vi c trong hng i. B n khng nn s d ng thread-pool th c thi cc ti n trnh ch y trong m t th i gian di. V s ti u trnh trong thread-pool l c gi i h n, nn ch m t s t ti u trnh thu c cc ti n trnh lo i ny cng s nh h ng ng k n ton b hi u nng c a threadpool. c bi t, b n nn trnh t cc ti u trnh trong thread-pool vo tr ng thi i trong m t th i gian qu di. B n khng th i u khi n l ch trnh c a cc ti u trnh trong thread-pool, cng nh khng th thay i u tin c a cc cng vi c. Thread-pool x l cc cng vi c theo th t nh khi b n thm chng vo hng i. M t khi cng vi c c t vo hng i th b n khng th h y hay d ng n.

V d d i y trnh by cch s d ng l p ThreadPool th c thi m t phng th c c tn l DisplayMessage. V d ny s truy n DisplayMessage n thread-pool hai l n, l n u khng c i s , l n sau c i s l i t ng MessageInfo (cho php ki m sot thng tin m ti u trnh s hi n th ).
using System; using System.Threading; // L p dng truy n d li u cho phng th c DisplayMessage // khi n c th c thi b ng thread-pool. public class MessageInfo { private int iterations; private string message; // Phng th c kh i d ng nh n cc thi t l p c u hnh cho ti u trnh. public MessageInfo(int iterations, string message) { this.iterations = iterations; this.message = message; } // Cc thu c tnh dng l y cc thi t l p c u hnh. public int Iterations { get { return iterations; } } public string Message { get { return message; } } } public class ThreadPoolExample { // Hi n th thng tin ra c a s Console.

102 Chng 4: Ti u trnh, ti n trnh, v s

ng b

public static void DisplayMessage(object state) { // p i s state sang MessageInfo. MessageInfo config = state as MessageInfo; // // // if N u i s config l null, khng c i s no c truy n cho phng th c ThreadPool.QueueUserWorkItem; s d ng cc gi tr m c nh. (config == null) { // Hi n th m t thng bo ra c a s Console ba l n. for (int count = 0; count < 3; count++) { Console.WriteLine("A thread-pool example."); // Vo tr ng thi ch , dng cho m c ch minh h a. // Trnh a cc ti u trnh c a thread-pool // vo tr ng thi ch trong cc ng d ng th c t . Thread.Sleep(1000); } } else { // Hi n th m t thng bo c ch nh tr c // v i s l n cng c ch nh tr c. for (int count = 0; count < config.Iterations; count++) { Console.WriteLine(config.Message); // Vo tr ng thi ch , dng cho m c ch minh h a. // Trnh a cc ti u trnh c a thread-pool // vo tr ng thi ch trong cc ng d ng th c t . Thread.Sleep(1000); } } } public static void Main() { // T o m t i t ng y nhi m, cho php chng ta // truy n phng th c DisplayMessage cho thread-pool. WaitCallback workMethod = new WaitCallback(ThreadPoolExample.DisplayMessage); // Th c thi DisplayMessage b ng thread-pool (khng c ThreadPool.QueueUserWorkItem(workMethod); i s ).

// Th c thi DisplayMessage b ng thread-pool (truy n m t // i t ng MessageInfo cho phng th c DisplayMessage). MessageInfo info = new MessageInfo(5, "A thread-pool example with arguments."); ThreadPool.QueueUserWorkItem(workMethod, info); // Nh n Enter k t thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

Chng 4: Ti u trnh, ti n trnh, v s

103 ng b

4.2

Thc thi phng thc mt cch bt ng b


B n c n th c thi m t phng th c v ti p t c th c hi n cc cng vi c khc trong khi phng th c ny v n ch y trong m t ti u trnh ring bi t. Sau khi phng th c hon t t, b n c n l y tr tr v c a n. Khai bo m t y nhi m c ch k gi ng nh phng th c c n th c thi. Sau , t o m t th hi n c a y nhi m tham chi u n phng th c ny. Ti p theo, g i th c thi phng th c c a b n. phng th c BeginInvoke c a th hi n y nhi m K n, s d ng phng th c EndInvoke ki m tra tr ng thi c a phng th c cng nh thu l y tr tr v c a n n u hon t t.

Khi cho g i m t phng th c, chng ta th ng th c hi n m t cch ng b ; ngha l m l nh th c hi n l i g i ph i i vo tr ng thi d ng (block) cho n khi phng th c c th c hi n xong. y l cch c n thi t khi m l nh yu c u qu trnh th c thi phng th c ph i hon t t tr c khi n c th ti p t c. Tuy nhin, trong m t s tr ng h p, b n l i c n th c thi phng th c m t cch b t ng b ; ngha l b n cho th c thi phng th c ny trong m t ti u trnh ring trong khi v n ti p t c th c hi n cc cng vi c khc. .NET Framework h tr ch th c thi b t ng b , cho php b n th c thi b t k phng th c no m t cch b t ng b b ng m t y nhi m. Khi khai bo v bin d ch m t y nhi m, trnh bin d ch s t ng sinh ra hai phng th c h tr ch th c thi b t ng b : BeginInvoke v EndInvoke. Khi b n g i phng th c BeginInvoke c a m t th hi n y nhi m, phng th c c tham chi u b i y nhi m ny c x p vo hng i th c thi b t ng b . Quy n ki m sot qu trnh th c thi c tr v cho m g i BeginInvoke ngay sau , v phng th c c tham chi u s th c thi trong ng c nh c a ti u trnh s n sng tr c tin trong thread-pool. Cc i s c a phng th c BeginInvoke g m cc i s c ch nh b i y nhi m, c ng v i hai i s dng khi phng th c th c thi b t ng b k t thc. Hai i s ny l: M t th hi n c a y nhi m System.AsyncCallback tham chi u n phng th c m b th c thi s g i khi phng th c th c thi b t ng b k t thc. Phng th c ny s c th c thi trong ng c nh c a m t ti u trnh trong thread-pool. Truy n gi tr null cho i s ny ngha l khng c phng th c no c g i v b n ph i s d ng m t c ch khc xc nh khi no phng th c th c thi b t b k t thc (s c th o lu n bn d i). M t tham chi u i t ng m b th c thi s lin k t v i qu trnh th c thi b t ng b . Phng th c th c thi b t ng b khng th s d ng hay truy xu t n i t ng ny, nhng m l nh c a b n c th s d ng n khi phng th c ny k t thc, cho php b n lin k t thng tin tr ng thi v i qu trnh th c thi b t ng b . V d , i t ng ny cho php b n nh x cc k t qu v i cc thao tc b t ng b c kh i t o trong tr ng h p b n kh i t o nhi u thao tc b t ng b nhng s d ng chung m t phng th c callback x l vi c k t thc.

Phng th c EndInvoke cho php b n l y tr tr v c a phng th c th c thi b t ng b , nhng tr c h t b n ph i xc nh khi no n k t thc. D i y l b n k thu t dng xc nh m t phng th c th c thi b t ng b k t thc hay cha:

104 Chng 4: Ti u trnh, ti n trnh, v s

ng b

Blockingd ng qu trnh th c thi c a ti u trnh hi n hnh cho n khi phng th c th c thi b t ng b k t thc. i u ny r t gi ng v i s th c thi ng b . Tuy nhin, n u linh ho t ch n th i i m chnh xc a m l nh c a b n vo tr ng thi d ng (block) th b n v n cn c h i th c hi n thm m t s vi c tr c khi m l nh i vo tr ng thi ny. Pollingl p i l p l i vi c ki m tra tr ng thi c a phng th c th c thi b t ng b xc nh n k t thc hay cha. y l m t k thu t r t n gi n, nhng n u xt v m t x l th khng c hi u qu . B n nn trnh cc vng l p ch t lm lng ph th i gian c a b x l; t t nh t l nn t ti u trnh th c hi n polling vo tr ng thi ngh (sleep) trong m t kho ng th i gian b ng cch s d ng Thread.Sleep gi a cc l n ki m tra tr ng thi. B i k thu t polling i h i b n ph i duy tr m t vng l p nn ho t ng c a ti u trnh ch s b gi i h n, tuy nhin b n c th d dng c p nh t ti n cng vi c. Waitings d ng m t i t ng d n xu t t l p System.Threading.WaitHandle bo hi u khi phng th c th c thi b t ng b k t thc. Waiting l m t c i ti n c a k thu t polling, n cho php b n ch nhi u phng th c th c thi b t ng b k t thc. B n cng c th ch nh cc gi tr time-out cho php ti u trnh th c hi n waiting d ng l i n u phng th c th c thi b t ng b di n ra qu lu, ho c b n mu n c p nh t nh k b ch tr ng thi. CallbacksCallback l m t phng th c m b th c thi s g i khi phng th c th c thi b t ng b k t thc. M l nh th c hi n l i g i khng c n th c hi n b t k thao tc ki m tra no, nhng v n c th ti p t c th c hi n cc cng vi c khc. Callback r t linh ho t nhng cng r t ph c t p, c bi t khi c nhi u phng th c th c thi b t ng b ch y ng th i nhng s d ng cng m t callback. Trong nh ng tr ng h p nh th , b n ph i s d ng cc i t ng tr ng thi thch h p so trng cc phng th c hon t t v i cc phng th c kh i t o.

L p AsyncExecutionExample trong v d d i y m t c ch th c thi b t ng b . N s d ng m t y nhi m c tn l AsyncExampleDelegate th c thi b t ng b m t phng th c c tn l LongRunningMethod. Phng th c LongRunningMethod s d ng Thread.Sleep m ph ng m t phng th c c th i gian th c thi di.
// y nhi m cho php b n th c hi n vi c th c thi b t ng b // c a AsyncExecutionExample.LongRunningMethod. public delegate DateTime AsyncExampleDelegate(int delay, string name); // Phng th c c th i gian th c 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); // M ph ng vi c x l t n nhi u th i gian. Thread.Sleep(delay); Console.WriteLine("{0} : {1} example - thread finishing.", DateTime.Now.ToString("HH:mm:ss.ffff"), name); // Tr v th i gian hon t t phng th c. return DateTime.Now; }

Chng 4: Ti u trnh, ti n trnh, v s AsyncExecutionExample ch a nm phng th c di n

105 ng b

k t thc phng th c th c thi b t phng th c .

t cc cch ti p c n khc nhau v vi c ng b . D i y s m t v cung c p m l nh cho cc

1. Phng th c BlockingExample
Phng th c BlockingExample th c thi b t ng b phng th c LongRunningMethod v ti p t c th c hi n cng vi c c a n trong m t kho ng th i gian. Khi x l xong cng vi c ny, BlockingExample chuy n sang trang thi d ng (block) cho n khi phng th c LongRunningMethod k t thc. vo tr ng thi d ng, BlockingExample th c thi phng th c EndInvoke c a th hi n y nhi m AnsyncExampleDelegate. N u phng th c LongRunningMethod k t thc, EndInvoke tr v ngay l p t c, n u khng, BlockingExample chuy n sang tr ng thi d ng cho n khi phng th c LongRunningMethod k t thc.
public static void BlockingExample() { Console.WriteLine(Environment.NewLine + "*** Running Blocking Example ***"); // G i LongRunningMethod m t cch b t ng b . Truy n null cho // c y nhi m callback v i t ng tr ng thi b t ng b . AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod); IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000, "Blocking", null, null); // Th c hi n cng vi c khc cho n khi // s n sng i vo tr ng thi d ng. for (int count = 0; count < 3; count++) { Console.WriteLine("{0} : Continue processing until " + "ready to block...", DateTime.Now.ToString("HH:mm:ss.ffff")); Thread.Sleep(200); } // i vo tr ng thi d ng cho n khi phng th c // th c thi b t ng b k t thc v thu l y k t qu . Console.WriteLine("{0} : Blocking until method is " + "complete...", DateTime.Now.ToString("HH:mm:ss.ffff")); DateTime completion = longRunningMethod.EndInvoke(asyncResult); // Hi n th thng tin k t thc. Console.WriteLine("{0} : Blocking example complete.", completion.ToString("HH:mm:ss.ffff")); }

2. Phng th c PollingExample
Phng th c PollingExample th c thi b t ng b phng th c LongRunningMethod v sau th c hi n vng l p polling cho n khi LongRunningMethod k t thc. PollingExample ki m tra thu c tnh IsComplete c a th hi n IAsyncResult ( c tr v b i BeginInvoke) xc nh phng th c LongRunningMethod k t thc hay cha, n u cha, PollingExample s g i Thread.Sleep.

106 Chng 4: Ti u trnh, ti n trnh, v s

ng b

public static void PollingExample() { Console.WriteLine(Environment.NewLine + "*** Running Polling Example ***"); // G i LongRunningMethod m t cch b t ng b . Truy n null cho // c y nhi m callback v i t ng tr ng thi b t ng b . AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod); IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000, "Polling", null, null); // Th c hi n polling ki m tra phng th c th c thi // b t ng b k t thc hay cha. N u cha k t thc // th i vo tr ng thi ch trong 300 mini-giy // tr c khi th c hi n polling l n n a. 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 l y k t qu c a phng th c th c thi b t DateTime completion = longRunningMethod.EndInvoke(asyncResult); ng b .

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

3. Phng th c WaitingExample
Phng th c WaitingExample th c thi b t ng b phng th c LongRunningExample v sau ch cho n khi LongRunningMethod k t thc. WaitingExample s d ng thu c tnh AsyncWaitHandle c a th hi n IAsyncResult ( c tr v b i BeginInvoke) c c m t WaitHandle v sau g i phng th c WaitOne c a WaitHandle. Vi c s d ng gi tr time-out cho php WaitingExample d ng qu trnh i th c hi n cng vi c khc ho c d ng hon ton n u phng th c th c thi b t ng b di n ra qu lu.
public static void WaitingExample() { Console.WriteLine(Environment.NewLine + "*** Running Waiting Example ***"); // G i LongRunningMethod m t cch b t ng b . Truy n null cho // c y nhi m callback v i t ng tr ng thi b t ng b . AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod); IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000, "Waiting", null, null); // i phng th c th c thi b t ng b k t thc. // Time-out sau 300 mili-giy v hi n th tr ng thi ra // c a s Console tr c khi ti p t c i.

Chng 4: Ti u trnh, ti n trnh, v s 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 l y k t qu c a phng th c th c thi b t DateTime completion = longRunningMethod.EndInvoke(asyncResult); ng b .

107 ng b

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

4. Phng th c WaitAllExample
Phng th c WaitAllExample th c thi b t ng b phng th c LongRunningMethod nhi u l n v sau s d ng m ng cc i t ng WaitHandle i cho n khi t t c cc phng th c k t thc.
public static void WaitAllExample() { Console.WriteLine(Environment.NewLine + "*** Running WaitAll Example ***"); // M t ArrayList ch a cc th hi n IAsyncResult // cho cc phng th c th c thi b t ng b . ArrayList asyncResults = new ArrayList(3); // G i ba l n LongRunningMethod m t cch b t ng b . // Truy n null cho c y nhi m callback v i t ng // tr ng thi b t ng b . Thm th hi n IAsyncResult // cho m i phng th c vo ArrayList. AsyncExampleDelegate longRunningMethod = 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)); // T o m t m ng cc i t ng WaitHandle, // s c s d ng i t t c cc phng th c // th c thi b t ng b k t thc. WaitHandle[] waitHandles = new WaitHandle[3]; for (int count = 0; count < 3; count++) { waitHandles[count] = ((IAsyncResult)asyncResults[count]).AsyncWaitHandle; } // i c ba phng th c th c thi b t ng b k t thc. // Time-out sau 300 mili-giy v hi n th tr ng thi ra // c a s Console tr c khi ti p t c i.

108 Chng 4: Ti u trnh, ti n trnh, v s

ng b

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")); } // Ki m tra k t qu c a m i phng th c v xc // th i gian phng th c cu i cng k t thc. DateTime completion = DateTime.MinValue; foreach (IAsyncResult result in asyncResults) { DateTime time = longRunningMethod.EndInvoke(result); if ( time > completion) completion = time; } // Hi n th thng tin k t thc. Console.WriteLine("{0} : WaitAll example complete.", completion.ToString("HH:mm:ss.ffff")); } nh

5. Phng th c CallbackExample
Phng th c CallbackExample th c thi b t ng b phng th c LongRunningMethod v truy n m t th hi n y nhi m AsyncCallback (tham chi u n phng th c CallbackHandler) cho phng th c BeginInvoke. Phng th c CallbackHandler s c g i m t cch t ng khi phng th c LongRunningMethod k t thc, k t qu l phng th c CallbackExample v n ti p t c th c hi n cng vi c.
public static void CallbackExample() { Console.WriteLine(Environment.NewLine + "*** Running Callback Example ***"); // G i LongRunningMethod m t cch b t ng b . Truy n m t // th hi n y nhi m AsyncCallback tham chi u n // phng th c CallbackHandler. CallbackHandler s // t ng c g i khi phng th c th c thi b t ng b // k t thc. Truy n m t tham chi u n th hi n y nhi m // AsyncExampleDelegate nh m t tr ng thi b t ng b ; // n u khng, phng th c callback khng th truy xu t // th hi n y nhi m g i EndInvoke. AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod); IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000, "Callback", new AsyncCallback(CallbackHandler), longRunningMethod); // Ti p t c v i cng vi c khc. for (int count = 0; count < 15; count++) { Console.WriteLine("{0} : Continue processing...", DateTime.Now.ToString("HH:mm:ss.ffff")); Thread.Sleep(200); } } // Phng th c x l vi c k t thc b t ng b b ng callbacks. public static void CallbackHandler(IAsyncResult result) {

Chng 4: Ti u trnh, ti n trnh, v s // Trch tham chi u n th hi n AsyncExampleDelegate // t th hi n IAsyncResult. AsyncExampleDelegate longRunningMethod = (AsyncExampleDelegate)result.AsyncState; // Thu l y k t qu c a phng th c th c thi b t ng b . DateTime completion = longRunningMethod.EndInvoke(result); // Hi n th thng tin k t thc. Console.WriteLine("{0} : Callback example complete.", completion.ToString("HH:mm:ss.ffff")); }

109 ng b

4.3

Thc thi phng thc bng Timer


B n c n th c thi m t phng th c trong m t ti u trnh ring theo chu k hay m t th i i m xc nh. Khai bo m t phng th c tr v void v ch nh n m t i t ng lm i s . Sau , t o m t th hi n y nhi m System.Threading.TimerCallback tham chi u n phng th c ny. Ti p theo, t o m t i t ng System.Threading.Timer v truy n n cho th hi n y nhi m TimerCallback cng v i m t i t ng tr ng thi m Timer s truy n cho phng th c c a b n khi Timer h t hi u l c. B th c thi s ch cho n khi Timer h t hi u l c v sau g i phng th c c a b n b ng m t ti u trnh trong thread-pool.

Thng th ng, r t h u ch khi th c thi m t phng th c m t th i i m xc nh hay nh ng th i kho ng xc nh. V d , b n c n sao lu d li u lc 1:00 AM m i ngy hay xa vng m d li u m i 20 pht. L p Timer gip vi c nh th i th c thi m t phng th c tr nn d dng, cho php b n th c thi m t phng th c c tham chi u b i y nhi m TimerCallback nh ng th i kho ng nh t nh. Phng th c c tham chi u s th c thi trong ng c nh c a m t ti u trnh trong thread-pool. Khi t o m t i t ng Timer, b n c n ch nh hai th i kho ng (th i kho ng c th nh l cc gi tr ki u int, long, uint, hay System.TimeSpan): Gi tr thi l n c ch

u tin l th i gian tr (tnh b ng mili-giy) phng th c c a b n c th c u tin. Ch nh gi tr 0 th c thi phng th c ngay l p t c, v ch nh System.Threading.Timeout.Infinite t o Timer tr ng thi cha b t u (unstarted). Gi tr th hai l kho ng th i gian m Timer s l p l i vi c g i phng th c c a b n sau l n th c thi u tin. N u b n ch nh gi tr 0 hay Timeout.Infinite th Timer ch th c thi phng th c m t l n duy nh t (v i i u ki n th i gian tr ban u khng ph i l Timeout.Infinite). i s th hai c th cung c p b ng cc tr ki u int, long, uint, hay System.TimeSpan.

Sau khi t o i t ng Timer, b n cng c th thay i cc th i kho ng c s d ng b i Timer b ng phng th c Change, nhng b n khng th thay i phng th c s c g i. Khi dng xong Timer, b n nn g i phng th c Timer.Depose gi i phng ti nguyn h

110 Chng 4: Ti u trnh, ti n trnh, v s

ng b

th ng b chi m gi b i Timer. Vi c h y Timer cng h y lun phng th c c th c thi.

nh th i

L p TimerExample d i y trnh by cch s d ng Timer g i m t phng th c c tn l TimerHandler. Ban u, Timer c c u hnh g i TimerHandler sau hai giy v l p l i sau thay i cc m t giy. V d ny cng trnh by cch s d ng phng th c Timer.Change th i kho ng.
using System; using System.Threading; public class TimerExample { // Phng th c s c th c khi Timer h t hi u l c. // Hi n th m t thng bo ra c a s Console. private static void TimerHandler(object state) { Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), state); } public static void Main() { // T o m t th hi n y nhi m TimerCallback m i // tham chi u n phng th c tnh TimerHandler. // TimerHandler s c g i khi Timer h t hi u l c. TimerCallback handler = new TimerCallback(TimerHandler); // T o m t i t ng tr ng thi, i t ng ny s c // truy n cho phng th c TimerHandler. // Trong tr ng h p ny, m t thng bo s c hi n th . string state = "Timer expired."; Console.WriteLine("{0} : Creating Timer.", DateTime.Now.ToString("HH:mm:ss.ffff")); // T o m t Timer, pht sinh l n u tin sau hai giy // v sau l m i giy. using (Timer timer = new Timer(handler, state, 2000, 1000)) { int period; // c th i kho ng m i t Console cho n khi // ng i dng nh p 0. Cc gi tr khng h p l // s s d ng gi tr m c nh l 0 (d ng v d ). do { try { period = Int32.Parse(Console.ReadLine()); } catch { period = 0; } // Thay i Timer v i th i kho ng m i. if (period > 0) timer.Change(0, period); } while (period > 0); } // Nh n Enter k t thc. Console.WriteLine("Main method complete. Press Enter.");

Chng 4: Ti u trnh, ti n trnh, v s Console.ReadLine(); } }

111 ng b

M c d Timer th ng c s d ng g i th c thi cc phng th c nh ng th i kho ng, nhng n cng cung c p cch th c th c thi m t phng th c m t th i i m xc nh. B n c n ph i tnh ton kho ng th i gian t th i i m hi n t i n th i i m c n th c thi. V d d i y s th c hi n i u ny:
public static void RunAt(DateTime execTime) { // Tnh kho ng th i gian t th i i m hi n t i // n th i i m c n th c thi. TimeSpan waitTime = execTime - DateTime.Now; if (waitTime < new TimeSpan(0)) waitTime = new TimeSpan(0); // T o m t th hi n y nhi m TimerCallback m i // tham chi u n phng th c tnh TimerHandler. // TimerHandler s c g i khi Timer h t hi u l c. TimerCallback handler = new TimerCallback(TimerHandler); // T o m t Timer ch pht sinh m t l n t i th i i m // c ch nh. Ch nh th i kho ng th hai l -1 // ngn Timer th c thi l p l i phng th c. new Timer(handler, null, waitTime, new TimeSpan(-1)); }

4.4 Thc thi phng thc bng cch ra hiu i tng


WaitHandle
B n mu n th c thi m t hay nhi u phng th c m t cch t ng khi m t t ng d n xu t t l p System.Threading.WaitHandle i vo tr ng thi signaled. i

T o m t th hi n y nhi m System.Threading.WaitOrTimerCallback tham chi u n phng th c c n th c thi. Sau , ng k th hi n y nhi m v i t ng WaitHandle v i thread-pool b ng phng th c tnh ThreadPool. RegisterWaitForSingleObject. B n c th s d ng cc l p d n xu t t WaitHandle ( c th o lu n trong m c 4.2) g i th c thi m t phng th c. B ng phng th c RegisterWaitForSingleObject c a l p ThreadPool, b n c th ng k th hi n y nhi m WaitOrTimerCallback v i thread-pool khi m t i t ng d n xu t t WaitHandle i vo tr ng thi signaled. B n c th c u hnh threadpool th c thi phng th c ch m t l n hay t ng ng k l i phng th c m i khi WaitHandle i vo tr ng thi signaled. N u WaitHandle tr ng thi signaled khi b n g i RegisterWaitForSingleObject, phng th c s th c thi ngay l p t c. Phng th c Unregister c a i t ng System.Threading.RegisteredWaitHandle ( c tr v b i phng th c RegisterWaitForSingleObject) c s d ng h y b vi c ng k. L p th ng c dng lm b kch ho t l AutoResetEvent, n s t ng chuy n sang tr ng thi unsignaled sau khi tr ng thi signaled. Tuy nhin, b n cng c th thay i tr ng thi

112 Chng 4: Ti u trnh, ti n trnh, v s

ng b

signaled theo mu n b ng l p ManualResetEvent hay Mutex. V d d i y trnh by cch s d ng m t AutoResetEvent kch ho t th c thi m t phng th c c tn l EventHandler.
using System; using System.Threading; public class EventExecutionExample { // Phng th c s c th c thi khi AutoResetEvent i vo tr ng // thi signaled ho c qu trnh i h t th i gian (time-out). private static void EventHandler(object state, bool timedout) { // // // if Hi n th thng bo thch h p ra c a s Console ty vo qu trnh i h t th i gian hay AutoResetEvent tr ng thi signaled. (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() { // T o m t AutoResetEvent tr ng thi unsignaled. AutoResetEvent autoEvent = new AutoResetEvent(false); // T o m t th hi n y nhi m WaitOrTimerCallback // tham chi u n phng th c tnh EventHandler. // EventHandler s c g i khi AutoResetEvent i vo // tr ng thi signaled hay qu trnh i h t th i gian. WaitOrTimerCallback handler = new WaitOrTimerCallback(EventHandler); // T o i t ng tr ng thi ( c truy n cho phng th c // th l s ki n khi n c kch ho t). Trong tr ng h p // ny, m t thng bo s c hi n th . string state = "AutoResetEvent signaled."; // ng k th hi n y nhi m i AutoResetEvent i vo // tr ng thi signaled. Thi t l p 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") { // N u "Cancel" khng c nh p vo Console, // AutoResetEvent s i vo tr ng thi signal, // v phng th c EventHandler c th c thi. // AutoResetEvent s t ng tr v tr ng thi unsignaled. autoEvent.Set(); }

Chng 4: Ti u trnh, ti n trnh, v s // H y b vi c ng k qu trnh i. Console.WriteLine("Unregistering wait operation."); handle.Unregister(null); // Nh n Enter k t thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

113 ng b

4.5

Thc thi phng thc bng tiu trnh mi


B n mu n th c thi m l nh trong m t ti u trnh ring, v mu n ki m sot hon ton qu trnh th c thi v tr ng thi c a ti u trnh . Khai bo m t phng th c tr v void v khng c i s . Sau , t o m t th hi n y nhi m System.Threading.ThreadStart tham chi u n phng th c ny. Ti p theo, t o m t i t ng System.Threading.Thread m i, v truy n th hi n y nhi m cho phng th c kh i d ng c a n. K n, g i phng th c Thread.Start b t u th c thi phng th c c a b n.

tng linh ho t v m c ki m sot khi hi n th c cc ng d ng h -tr - a-ti u-trnh, b n ph i tr c ti p t o v qu n l cc ti u trnh. y l cch ti p c n ph c t p nh t trong vi c l p trnh h -tr - a-ti u-trnh, nhng cng l cch duy nh t v t qua nh ng h n ch c h u trong cc cch ti p c n s d ng cc ti u trnh trong thread-pool, nh c th o lu n trong b n m c tr c. L p Thread cung c p m t c ch m qua b n c th t o v ki m sot cc ti u trnh. t o v ch y m t ti u trnh m i, b n hy ti n hnh theo cc b c sau: 1. T o m t i t ng y nhi m ThreadStart tham chi u n phng th c ch a m l nh m b n mu n dng m t ti u trnh m i ch y n. Gi ng nh cc y nhi m khc, ThreadStart c th tham chi u n m t phng th c tnh hay phng th c c a m t i t ng. Phng th c c tham chi u ph i tr v void v khng c i s . T o m t i t ng Thread, v truy n th hi n y nhi m ThreadStart cho phng th c kh i d ng c a n. Ti u trnh m i c tr ng thi ban u l Unstarted (m t thnh vin thu c ki u li t k System.Threading.ThreadState). G i th c thi phng th c Start c a i t ng Thread chuy n tr ng thi c a n sang ThreadState.Running v b t u th c thi phng th c c tham chi u b i th hi n y nhi m ThreadStart (n u b n g i phng th c Start qu m t l n, n s nm ngo i l System.Threading.ThreadStateException).

2.

3.

V y nhi m ThreadStart khai bo khng c i s , b n khng th truy n d li u tr c ti p cho phng th c c tham chi u. truy n d li u cho ti u trnh m i, b n ph i c u hnh d li u l kh truy xu t i v i m l nh ang ch y trong ti u trnh m i. Cch ti p c n thng th ng l t o m t l p ng gi c d li u c n cho ti u trnh v phng th c c th c thi b i ti u trnh. Khi mu n ch y m t ti u trnh m i, b n hy t o m t i t ng c a l p ny, c u hnh tr ng thi cho n, v r i ch y ti u trnh. D i y l m t v d :
using System; using System.Threading; public class ThreadExample {

114 Chng 4: Ti u trnh, ti n trnh, v s

ng b

// Cc bi n gi thng tin tr ng thi. private int iterations; private string message; private int delay; public ThreadExample(int iterations, string message, int delay) { this.iterations = iterations; this.message = message; this.delay = delay; } public void Start() { // T o m t th hi n y nhi m ThreadStart // tham chi u n DisplayMessage. ThreadStart method = new ThreadStart(this.DisplayMessage); // T o m t i t ng Thread v truy n th hi n y nhi m // ThreadStart cho phng th c kh i d ng c a n. Thread thread = new Thread(method); Console.WriteLine("{0} : Starting new thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); // Kh i ch y ti u trnh m i. thread.Start(); } private void DisplayMessage() { // Hi n th thng bo ra c a s Console v i s l n // c ch nh (iterations), ngh gi a m i thng bo // m t kho ng th i 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); } } public static void Main() { // T o m t i t ng ThreadExample. ThreadExample example = new ThreadExample(5, "A thread example.", 500); // Kh i ch y i t ng ThreadExample. example.Start(); // Ti p t c th c hi n cng vi c khc. for (int count = 0; count < 13; count++) { Console.WriteLine("{0} : Continue processing...", DateTime.Now.ToString("HH:mm:ss.ffff")); Thread.Sleep(200); } // Nh n Enter k t thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

Chng 4: Ti u trnh, ti n trnh, v s

115 ng b

4.6

iu khin qu trnh thc thi ca mt tiu trnh


B n c n n m quy n i u khi n khi m t ti u trnh ch y v d ng, v c th t m d ng qu trnh th c thi c a m t ti u trnh. S d ng cc phng th c Abort, Interrupt, Resume, Start, v Suspend c a Thread m b n c n i u khi n.

Cc phng th c c a l p Thread c tm t t trong b ng 4.1 cung c p m t c ch i u khi n m c cao ln qu trnh th c thi c a m t ti u trnh. M i phng th c ny tr v ti u trnh ang g i ngay l p t c. Tuy nhin, tr ng thi c a ti u trnh hi n hnh ng vai tr quan tr ng trong k t qu c a l i g i phng th c, v tr ng thi c a m t ti u trnh c th thay i nhanh chng. K t qu l, b n ph i vi t m b t v th l cc ngo i l c th b nm khi b n c i u khi n qu trnh th c thi c a m t Thread. L p ThreadControlExample d i y trnh by cch s d ng cc phng th c c li t k trong b ng 4.1. V d ny kh i ch y m t ti u trnh th hai, hi n th nh k m t thng bo ra c a s Console v r i i vo tr ng thi ngh (sleep). B ng cch nh p cc l nh t i d u nh c l nh, b n c th gin o n, t m hon, ph c h i, v h y b ti u trnh th hai.
B ng 4.1 i u khi n qu trnh th c thi c a m t ti u trnh M t

Phng th c

Abort

K t thc m t ti u trnh b ng cch nm ngo i l System.Threading. ThreadAbortException trong m l nh ang c ch y. M l nh c a ti u th c hi n vi c trnh b h y c th b t ngo i l ThreadAbortException d n d p, nhng b th c thi s t ng nm ngo i l ny l n n a b o m ti u trnh k t thc, tr khi ResetAbort c g i. Abort tr v ngay l p l c, nhng b th c thi xc nh chnh xc khi no ngo i l b nm, do b n khng th cho r ng ti u trnh k t thc b i Abort tr v . B n nn s d ng cc k thu t c m t trong m c 4.7 n u c n xc nh khi no ti u trnh ny th t s k t thc. M t khi h y m t ti u trnh, b n khng th kh i ch y l i n. Nm ngo i l System.Threading.ThreadInterruptedException (trong m l nh ang c ch y) lc ti u trnh ang tr ng thi WaitSleepJoin. i u ny ngha l ti u trnh ny g i Sleep, Join (m c 4.7); ho c ang i WaitHandle ra hi u ( i vo tr ng thi signaled) hay ang i m t i t ng dng cho s ng b ti u trnh (m c 4.8). N u ti u trnh ny khng tr ng thi WaitSleepJoin, ThreadInterruptedException s b nm sau khi ti u trnh i vo tr ng thi WaitSleepJoin. Ph c h phng hon s trong ti i qu trnh th c thi c a m t ti u trnh b t m hon (xem th c Suspend). Vi c g i Resume trn m t ti u trnh cha b t m sinh ra ngo i l System.Threading.ThreadStateException u trnh ang g i.

Interrupt

Resume

116 Chng 4: Ti u trnh, ti n trnh, v s

ng b

Start

Kh i ch y ti u trnh m i; xem m c 4.5 th c Start.

bi t cch s d ng phng

Suspend

T m hon qu trnh th c thi c a m t ti u trnh cho n khi phng th c Resume c g i. Vi c t m hon m t ti u trnh b t m hon s khng c hi u l c, nhng vi c g i Suspend trn m t ti u trnh cha kh i ch y ho c k t thc s sinh ra ngo i l ThreadStateException trong ti u trnh ang g i.

using System; using System.Threading; public class ThreadControlExample { private static void DisplayMessage() { // L p i l p l i vi c hi n th 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) { // Ti u trnh b gin o n. Vi c b t ngo i l // ThreadInterruptedException cho php v d ny // th c hi n hnh ng ph h p v ti p t c th c thi. Console.WriteLine("{0} : Second thread interrupted.", DateTime.Now.ToString("HH:mm:ss.ffff")); } catch (ThreadAbortException abortEx) { // i t ng trong thu c tnh // ThreadAbortException.ExceptionState c cung c p // b i ti u trnh g i Thread.Abort. // Trong tr ng h p ny, n ch a m t chu i // m t l do c a vi c h y b . Console.WriteLine("{0} : Second thread aborted ({1})", DateTime.Now.ToString("HH:mm:ss.ffff"), abortEx.ExceptionState); // M c d ThreadAbortException // b th c thi s nm n l n n a // ti u trnh k t thc. } } } public static void Main() { // T o m t i t ng Thread v truy n cho n m t th hi n // y nhi m ThreadStart tham chi u n DisplayMessage. c th l, b o m m t thng bo ra c a s Console.

Chng 4: Ti u trnh, ti n trnh, v s Thread thread = new Thread(new ThreadStart(DisplayMessage)); Console.WriteLine("{0} : Starting second thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); // Kh i ch y ti u trnh th thread.Start(); hai.

117 ng b

// L p v x l l nh do ng i dng nh p. char command = ' '; do { string input = Console.ReadLine(); if (input.Length > 0) command = input.ToUpper()[0]; else command = ' '; switch (command) { case 'S': // T m hon ti u trnh th hai. Console.WriteLine("{0} : Suspending second thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); thread.Suspend(); break; case 'R': // Ph c h i ti u trnh th hai. try { Console.WriteLine("{0} : Resuming second " + "thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); thread.Resume(); } catch (ThreadStateException) { Console.WriteLine("{0} : Thread wasn't " + "suspended.", DateTime.Now.ToString("HH:mm:ss.ffff")); } break; case 'I': // Gin o n ti u trnh th hai. Console.WriteLine("{0} : Interrupting second " + "thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); thread.Interrupt(); break; case 'E': // H y b ti u trnh th hai v truy n m t i t ng // tr ng thi cho ti u trnh ang b h y, // trong tr ng h p ny l m t thng bo. Console.WriteLine("{0} : Aborting second thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); thread.Abort("Terminating example."); // i ti u trnh th thread.Join(); break; } } while (command != 'E'); hai k t thc.

118 Chng 4: Ti u trnh, ti n trnh, v s

ng b

// Nh n Enter k t thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

4.7

Nhn bit khi no mt tiu trnh kt thc


B n mu n bi t khi no m t ti u trnh k t thc. S d ng thu c tnh IsAlive hay phng th c Join c a l p Thread.

Cch d

nh t

ki m tra m t ti u trnh

k t thc hay cha l ki m tra thu c tnh

Thread.IsAlive. Thu c tnh ny tr v true n u ti u trnh c kh i ch y nhng cha k t

thc hay b h y. Thng th ng, b n s c n m t ti u trnh i m t ti u trnh khc hon t t vi c x l c a n. Thay v ki m tra thu c tnh IsAlive trong m t vng l p, b n c th s d ng phng th c Thread.Join. Phng th c ny khi n ti u trnh ang g i d ng l i (block) cho n khi ti u trnh c tham chi u k t thc. B n c th ty ch n ch nh m t kho ng th i gian (gi tr int hay TimeSpan) m sau kho ng th i gian ny, Join s h t hi u l c v qu trnh th c thi c a ti u trnh ang g i s ph c h i l i. N u b n ch nh m t gi tr time-out, Join tr v true n u ti u trnh k t thc, v false n u Join h t hi u l c. V d d i y th c thi m t ti u trnh th hai v r i g i Join i ti u trnh th hai k t thc. V ti u trnh th hai m t 5 giy th c thi, nhng phng th c Join ch nh gi tr time-out l 3 giy, nn Join s lun h t hi u l c v v d ny s hi n th m t thng bo ra c a s Console.
using System; using System.Threading; public class ThreadFinishExample { private static void DisplayMessage() { // Hi n th m t thng bo ra c a s Console 5 l n. 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); } } public static void Main() { // T o m t th hi n y nhi m ThreadStart // tham chi u n DisplayMessage. ThreadStart method = new ThreadStart(DisplayMessage); // T o m t i t ng Thread v truy n th hi n y nhi m

Chng 4: Ti u trnh, ti n trnh, v s // ThreadStart cho phng th c kh i d ng c a n. Thread thread = new Thread(method); Console.WriteLine("{0} : Starting second thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); // Kh i ch y ti u trnh th thread.Start(); hai.

119 ng b

// D ng cho n khi ti u trnh th hai k t thc, // ho c Join h t hi u l c sau 3 giy. if (!thread.Join(3000)) { Console.WriteLine("{0} : Join timed out !!", DateTime.Now.ToString("HH:mm:ss.ffff")); } // Nh n Enter k t thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

4.8 ng b ha qu trnh thc thi ca nhiu tiu trnh


B n c n ph i h p cc ho t ng c a nhi u ti u trnh b o m s d ng hi u qu cc ti nguyn dng chung, v b n khng lm sai l c d li u dng chung khi m t php chuy n ng c nh ti u trnh (thread context switch) x y ra trong qu trnh thay i d li u. S d ng cc l p Monitor, AutoResetEvent, ManualResetEvent, v Mutex (thu c khng gian tn System.Threading). Thch th c l n nh t trong vi c vi t m t ng d ng h -tr - a-ti u-trnh l b o m cc ti u trnh lm vi c trong s ha h p. Vi c ny th ng c g i l ng b ha ti u trnh v bao g m: B o m cc ti u trnh truy xu t cc khng gy ra sai l c. i t ng v d li u dng chung m t cch ph h p m b o r ng chng ch

B o m cc ti u trnh ch th c thi khi th t s c n thi t v ph i c th c thi v i chi ph t i thi u khi chng r i.

C ch ng b ha thng d ng nh t l l p Monitor. L p ny cho php m t ti u trnh n thu l y ch t (lock) trn m t i t ng b ng cch g i phng th c tnh Monitor.Enter. B ng cch thu l y ch t tr c khi truy xu t m t ti nguyn hay d li u dng chung, ta ch c ch n r ng ch c m t ti u trnh c th truy xu t ti nguyn cng lc. M t khi hon t t v i ti nguyn, ti u trnh ny s gi i phng ch t ti u trnh khc c th truy xu t n. Kh i m th c hi n cng vi c ny th ng c g i l vng hnh cng (critical section). B n c th s d ng b t k i t ng no ng vai tr lm ch t, v s d ng t kha this thu l y ch t trn i t ng hi n t i. i m chnh l t t c cc ti u trnh khi truy xu t m t ti nguyn dng chung ph i thu l y cng m t ch t. Cc ti u trnh khc khi thu l y ch t trn cng m t i t ng s block ( i vo tr ng thi WaitSleepJoin) v c thm vo hng s n sng (ready queue) c a ch t ny cho n khi ti u trnh ch gi i phng n b ng phng th c tnh

120 Chng 4: Ti u trnh, ti n trnh, v s

ng b

Monitor.Exit. Khi ti u trnh ch g i Exit, m t trong cc ti u trnh t hng s n sng s thu l y

ch t. N u ti u trnh ch khng gi i phng ch t b ng Exit, t t c cc ti u trnh khc s block v h n nh. V v y, c n t l i g i Exit bn trong kh i finally b o m n c g i c khi ngo i l x y ra. V Monitor th ng xuyn c s d ng trong cc ng d ng h -tr - a-ti u-trnh nn C# cung c p h tr m c-ngn-ng thng qua l nh lock. Kh i m c gi trong l nh lock tng ng v i g i Monitor.Enter khi i vo kh i m ny, v g i Monitor.Exit khi i ra kh i m ny. Ngoi ra, trnh bin d ch t ng t l i g i Monitor.Exit trong kh i finally b o m ch t c gi i phng khi m t ngo i l b nm. gi i phng ch t v t ti u trnh ny Ti u trnh ch (s h u ch t) c th g i Monitor.Wait vo hng ch (wait queue). Cc ti u trnh trong hng ch cng c tr ng thi l WaitSleepJoin v s ti p t c block cho n khi ti u trnh ch g i phng th c Pulse hay PulseAll c a l p Monitor. Phng th c Pulse di chuy n m t trong cc ti u trnh t hng ch vo hng s n sng, cn phng th c PulseAll th di chuy n t t c cc ti u trnh. Khi m t ti u trnh c di chuy n t hng ch vo hng s n sng, n c th thu l y ch t trong l n gi i phng k ti p. C n hi u r ng cc ti u trnh thu c hng ch s khng thu c ch t, chng s i v h n nh di chuy n chng vo hng s n sng. S d ng Wait cho n khi b n g i Pulse hay PulseAll v Pulse l cch ph bi n khi thread-pool c s d ng x l cc item t m t hng i dng chung. L p ThreadSyncExample d i y trnh by cch s d ng l p Monitor v l nh lock. V d ny kh i ch y ba ti u trnh, m i ti u trnh (l n l t) thu l y ch t c a m t i t ng c tn l consoleGate. K , m i ti u trnh g i phng th c Monitor.Wait. Khi ng i dng nh n Enter l n u tin, Monitor.Pulse s c g i gi i phng m t ti u trnh ang ch . L n th hai ng i dng nh n Enter, Monitor.PulseAll s c g i gi i phng t t c cc ti u trnh ang ch cn l i.
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 l y ch t trn try { i t ng consoleGate.

Monitor.Enter(consoleGate); Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), "Acquired consoleGate lock, waiting..."); // i cho n khi Pulse c g i trn Monitor.Wait(consoleGate); i t ng consoleGate.

Console.WriteLine("{0} : Thread pulsed, terminating.",

Chng 4: Ti u trnh, ti n trnh, v s DateTime.Now.ToString("HH:mm:ss.ffff")); } finally { Monitor.Exit(consoleGate); } } public static void Main() { // Thu l y ch t trn lock (consoleGate) { i t ng consoleGate.

121 ng b

// T o v kh i ch y ba ti u trnh m i // (ch y phng th c DisplayMesssage). for (int count = 0; count < 3; count++) { (new Thread(new ThreadStart(DisplayMessage))).Start(); } } Thread.Sleep(1000); // nh th c m t ti u trnh ang ch . Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), "Press Enter to pulse one waiting thread."); Console.ReadLine(); // Thu l y ch t trn lock (consoleGate) { i t ng consoleGate.

// Pulse m t ti u trnh ang ch . Monitor.Pulse(consoleGate); } // nh th c t t c cc ti u trnh ang ch . Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), "Press Enter to pulse all waiting threads."); Console.ReadLine(); // Thu l y ch t trn lock (consoleGate) { i t ng consoleGate. ang ch .

// Pulse t t c cc ti u trnh Monitor.PulseAll(consoleGate); }

// Nh n Enter k t thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

Cc l p thng d ng khc dng ng b ha ti u trnh l cc l p con c a l p System.Threading.WaitHandle, bao g m AutoResetEvent, ManualResetEvent, v Mutex. Th hi n c a cc l p ny c th tr ng thi signaled hay unsignaled. Cc ti u trnh c th s d ng

122 Chng 4: Ti u trnh, ti n trnh, v s

ng b

cc phng th c c a cc l p c li t k trong b ng 4.2 ( c th a k t l p WaitHandle) i vo tr ng thi WaitSleepJoin v i tr ng thi c a m t hay nhi u i t ng d n xu t t WaitHandle bi n thnh signaled.
B ng 4.2 Cc phng th c c a WaitHandle dng trnh Phng th c ng b ha qu trnh th c thi c a cc ti u M t

WaitAny

Ti u trnh g i phng th c tnh ny s i vo tr ng thi WaitSleepJoin v i b t k m t trong cc i t ng WaitHandle thu c m t m ng WaitHandle bi n thnh signaled. B n cng c th ch nh gi tr timeout. Ti u trnh g i phng th c tnh ny s i vo tr ng thi WaitSleepJoin v i t t c cc i t ng WaitHandle trong m t m ng WaitHandle bi n thnh signaled. B n cng c th ch nh gi tr time-out. Phng th c WaitAllExample trong m c 4.2 trnh by cch s d ng phng th c WaitAll. Ti u trnh g i phng th c ny s i vo tr ng thi WaitSleepJoin v i m t i t ng WaitHandle c th bi n thnh signaled. Phng th c WaitingExample trong m c 4.2 trnh by cch s d ng phng th c WaitOne.

WaitAll

WaitOne

i m khc bi t chnh gi a cc l p AutoResetEvent, ManualResetEvent, v Mutex l cch th c chng chuy n tr ng thi t signaled thnh unsignaled, v tnh kh ki n (visibility) c a chng. L p AutoResetEvent v ManualResetEvent l c c b i v i m t ti n trnh. ra hi u m t AutoResetEvent, b n hy g i phng th c Set c a n, phng th c ny ch gi i phng m t ti u trnh ang i s ki n. AutoResetEvent s t ng tr v tr ng thi unsignaled. V d trong m c 4.4 trnh by cch s d ng l p AutoResetEvent. L p ManualResetEvent ph i c chuy n i qua l i gi a signaled v unsignaled b ng phng th c Set v Reset c a n. G i Set trn m t ManualResetEvent s t tr ng thi c a n l signaled, gi i phng t t c cc ti u trnh ang i s ki n. Ch khi g i Reset m i lm cho ManualResetEvent tr thnh unsignaled. M t Mutex l signaled khi n khng thu c s h u c a b t k ti u trnh no. M t ti u trnh ginh quy n s h u Mutex lc kh i d ng ho c s d ng m t trong cc phng th c c li t k trong b ng 4.2. Quy n s h u Mutex c gi i phng b ng cch g i phng th c Mutex.ReleaseMutex (ra hi u Mutex v cho php m t ti u trnh khc thu l y quy n s h u ny). Thu n l i chnh c a Mutex l b n c th s d ng chng ng b ha cc ti u trnh qua cc bin ti n trnh. M c 4.12 trnh by cch s d ng Mutex. Ngoi cc ch c nng v a c m t , i m khc bi t chnh gi a cc l p WaitHandle v l p Monitor l l p Monitor c hi n th c hon ton b ng m l nh c-qu n-l, trong khi cc l p WaitHandle cung c p v b c cho cc ch c nng bn d i c a c a h i u hnh. i u ny d n n h qu l: S d ng l p Monitor ng ngha v i vi c m l nh c a b n s kh chuy n hn v khng b l thu c vo kh nng c a h i u hnh bn d i.

Chng 4: Ti u trnh, ti n trnh, v s

123 ng b

B n c th s d ng cc l p d n xu t t WaitHandle ng b ha vi c th c thi c a cc ti u trnh c-qu n-l v khng- c-qu n-l, trong khi l p Monitor ch c th ng b ha cc ti u trnh c-qu n-l.

4.9 To mt i tng tp hp c tnh cht an-ton-vtiu-trnh


B n mu n nhi u ti u trnh c th m t cch an ton. ng th i truy xu t n i dung c a m t t p h p

S d ng l nh lock ng b ha cc ti u trnh truy xu t n t p h p, ho c truy xu t t p h p thng qua m t v b c c tnh ch t an-ton-v -ti u-trnh (threadsafe). nh, cc l p t p h p chu n thu c khng gian tn System.Collections v vi c nhi u ti u trnh ng th i c n i dung c a t p h p. Tuy nhin, n u m t hay nhi u ti u trnh ny s a i t p h p, nh t nh b n s g p r c r i. l v h i u hnh c th lm t qung cc hnh ng c a ti u trnh trong khi t p h p ch m i c s a i m t ph n. i u ny s a t p h p vo m t tr ng thi v nh, ch c ch n khi n cho m t ti u trnh khc truy xu t t p h p th t b i, tr v d li u sai, ho c lm h ng t p h p.
System.Collections.Specialized s h tr

Theo m c

S d ng ng b ha ti u trnh s sinh ra m t chi ph hi u nng. C t ph p l khng-an-ton-v -ti u-trnh (non-thread-safe) nh m c nh s cho hi u nng t t hn i v i cc tr ng h p c nhi u ti u trnh khng c dng n. cc t p h p thng d ng nh t u hi n th c m t phng th c tnh c tn l Synchronized; bao g m cc l p: ArrayList, Hashtable, Queue, SortedList, v Stack (thu c khng gian tn System.Collections). Phng th c Synchronized nh n m t i t ng t p h p (v i ki u ph h p) lm i s v tr v m t i t ng cung c p m t v b c c- ng-b i t ng v b c ha (synchronized wrapper) bao l y i t ng t p h p c ch nh. ny c cng ki u v i t p h p g c, nhng t t c cc phng th c v thu c tnh dng c v ghi t p h p b o m r ng ch m t ti u trnh c kh nng truy xu t n i dung c a t p h p cng lc. o n m d i y trnh by cch t o m t Hashtable c tnh ch t an-ton-v -ti u-trnh (b n c th ki m tra m t t p h p c ph i l an-ton-v -ti u-trnh hay khng b ng thu c tnh IsSynchronized).
// T o m t Hashtable chu n. Hashtable hUnsync = new Hashtable(); // T o m t v b c c- ng-b -ha. Hashtable hSync = Hashtable.Synchronized(hUnsync);

T t c

Cc l p t p h p nh HybridDictionary, ListDictionary, v StringCollection (thu c khng gian tn System.Collections.Specialized) khng hi n th c phng th c Synchronized. cung c p kh nng truy xu t an-ton-v -ti u-trnh n th hi n c a cc l p ny, b n ph i hi n th c qu trnh ng b ha (s d ng i t ng c tr v t thu c tnh SyncRoot) nh c trnh by trong o n m d i y:

124 Chng 4: Ti u trnh, ti n trnh, v s

ng b

// T o m t NameValueCollection. NameValueCollection nvCollection = new NameValueCollection(); // Thu l y ch t trn NameValueCollection tr c khi th c hi n s a lock (((ICollection)nvCollection).SyncRoot) { // S a i NameValueCollection... }

i.

Ch r ng l p NameValueCollection d n xu t t l p NameObjectCollectionBase, l p c s ny s d ng c ch hi n th c giao di n t ng minh hi n th c thu c tnh ICollection.SyncRoot. Nh c trnh by, b n ph i p NameValueCollection v ICollection tr c khi truy xu t thu c tnh SyncRoot. Vi c p ki u l khng c n thi t iv i cc l p t p h p chuyn bi t nh HybridDictionary, ListDictionary, v StringCollection (cc l p ny khng s d ng c ch hi n th c giao di n t ng minh hi n th c SyncRoot). N u c n s d ng r ng kh p l p t p h p c ng b ha, b n c th n gi n ha m l nh b ng cch t o m t l p m i d n xu t t l p t p h p c n s d ng. K ti p, chp cc thnh vin c a l p c s cung c p kh nng truy xu t n i dung c a t p h p v th c hi n ng b ha tr c khi g i thnh vin l p c s tng ng. B n c th s d ng l nh lock m t cch bnh th ng ng b ha i t ng c tr v b i thu c tnh SyncRoot c a l p c s nh c th o lu n trn. Tuy nhin, b ng cch t o l p d n xu t, b n c th hi n th c cc k thu t ng b ha cao c p hn, ch ng h n s d ng System.Threading.ReaderWriterLock cho php nhi u ti u trnh c nhng ch m t ti u trnh ghi.

4.10

Khi chy mt tin trnh mi

B n c n th c thi m t ng d ng trong m t ti n trnh m i. S d ng i t ng System.Diagnostics.ProcessStartInfo ch nh cc chi ti t cho ng d ng c n ch y. Sau , t o i t ng System.Diagnostics.Process m t ti n trnh m i, gn i t ng ProcessStartInfo cho thu c tnh StartInfo c a i t ng Process, v r i kh i ch y ng d ng b ng cch g i Process.Start. L p Process cung c p m t d ng bi u di n c-qu n-l cho m t ti n trnh c a h i u hnh v cung c p m t c ch n gi n m thng qua , b n c th th c thi c ng d ng cqu n-l l n khng- c-qu n-l. L p Process hi n th c b n phin b n n p ch ng cho phng th c Start (b n c th s d ng phng th c ny kh i ch y m t ti n trnh m i). Hai trong s ny l cc phng th c tnh, cho php b n ch nh tn v cc i s cho ti n trnh m i. V d , hai l nh d i y u th c thi Notepad trong m t ti n trnh m i:
// Th c thi notepad.exe, khng c i s . Process.Start("notepad.exe"); // Th c thi notepad.exe, tn file c n m l i s . Process.Start("notepad.exe", "SomeFile.txt");

Hai d ng khc c a phng th c Start yu c u b n t o i t ng ProcessStartInfo c c u hnh v i cc chi ti t c a ti n trnh c n ch y; vi c s d ng i t ng ProcessStartInfo cung c p m t c ch i u khi n t t hn trn cc hnh vi v c u hnh c a ti n trnh m i. B ng 4.3 tm t t m t vi thu c tnh thng d ng c a l p ProcessStartInfo.
[

B ng 4.3 Cc thu c tnh c a l p ProcessStartInfo

Chng 4: Ti u trnh, ti n trnh, v s Thu c tnh Arguments M t

125 ng b

Cc

i s dng

truy n cho ti n trnh m i.

ErrorDialog

N u Process.Start khng th kh i ch y ti n trnh c ch nh, n s nm ngo i l System.ComponentModel.Win32Exception. N u ErrorDialog l true, Start s hi n th m t thng bo l i tr c khi nm ngo i l . Tn c a ng d ng. B n cng c th ch nh b t k ki u file no m b n c u hnh ng d ng k t giao v i n. V d , n u b n ch nh m t file v i ph n m r ng l .doc hay .xls, Microsoft Word hay Microsoft Excel s ch y. M t
ProcessWindowStyle,

FileName

WindowStyle

thu c ki u li t k System.Diagnostics. i u khi n cch th c hi n th c a c a s . Cc gi tr h p l bao g m: Hidden, Maximized, Minimized, v Normal. y c a th m c lm vi c.

thnh

vin

WorkingDirectory

Tn

Khi hon t t v i m t i t ng Process, b n nn h y n gi i phng cc ti nguyn h th ngg i Close, Dispose, ho c t o i t ng Process bn trong t m v c c a l nh using. Vi c h y m t i t ng Process khng nh h ng ln ti n trnh h th ng n m d i, ti n trnh ny v n s ti p t c ch y. V d d i y s d ng Process th c thi Notepad trong m t c a s tr ng thi phng to v m m t file c tn l C:\Temp\file.txt. Sau khi t o, v d ny s g i phng th c Process.WaitForExit d ng ti u trnh ang ch y cho n khi ti n trnh k t thc ho c gi tr time-out ( c ch nh trong phng th c ny) h t hi u l c.
using System; using System.Diagnostics; public class StartProcessExample { public static void Main () { // T o m t i t ng ProcessStartInfo v c u hnh cho n // v i cc thng tin c n thi t ch y ti n trnh m i. ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "notepad.exe"; startInfo.Arguments = "file.txt"; startInfo.WorkingDirectory = @"C:\Temp"; startInfo.WindowStyle = ProcessWindowStyle.Maximized; startInfo.ErrorDialog = true; // T o m t i t ng Process m i. using (Process process = new Process()) { // Gn ProcessStartInfo vo Process. process.StartInfo = startInfo; try { // Kh i ch y ti n trnh m i. process.Start();

126 Chng 4: Ti u trnh, ti n trnh, v s

ng b

// i ti n trnh m i k t thc tr c khi thot. Console.WriteLine("Waiting 30 seconds for process to" + " finish."); process.WaitForExit(30000); } catch (Exception ex) { Console.WriteLine("Could not start process."); Console.WriteLine(ex); } } // Nh n Enter k t thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

4.11

Kt thc mt tin trnh

B n mu n k t thc m t ti n trnh (m t ng d ng hay m t d ch v ). Thu l y i t ng Process m t ti n trnh h i u hnh c n k t thc. i v i cc ng d ng d a-trn-Windows, hy g i phng th c Process.CloseMainWindow g i m t thng i p n c a s chnh c a ng d ng. i v i cc ng d ng d atrn-Windows b qua CloseMainWindow, hay i v i cc ng d ng khng-d a-trnWindows, g i phng th c Process.Kill. N u kh i ch y m t ti n trnh m i t m l nh c-qu n-l b ng l p Process ( c th o lu n trong m c 4.10), b n c th k t thc ti n trnh m i b ng i t ng Process m t ti n trnh ny. B n cng c th thu l y cc i t ng Process ch n cc ti n trnh khc hi n ang ch y b ng cc phng th c tnh c a l p Process ( c tm t t trong b ng 4.4).
B ng 4.4 Cc phng th c dng Phng th c GetCurrentProcess GetProcessById GetProcesses thu l y cc tham chi u Process M t

Tr v Tr v

i t ng Process m t ti n trnh hi n ang tch c c. i t ng Process m t ti n trnh v i ID c ch nh.

Tr v m ng cc i t ng Process m t t t c cc ti n trnh hi n ang tch c c. Tr v m ng cc i t ng Process m t t t c cc ti n trnh hi n ang tch c c v i tn thn thi n c ch nh. Tn thn thi n l tn c a file th c thi khng tnh ph n m r ng v ng d n; v d , notepad hay calc.

GetProcessesByName

i t ng Process m t ti n trnh c n k t thc, b n c n g i phng th c CloseMainWindow hay phng th c Kill. Phng th c CloseMainWindow g i m t thng i p n c a s chnh c a ng d ng d a-trn-Windows. Phng th c ny c cng tc d ng nh th ng i dng ng c a s chnh b ng trnh n h th ng, v n cho c h i ng d ng th c hi n

M t khi c

Chng 4: Ti u trnh, ti n trnh, v s

127 ng b

vi c t t m t cch bnh th ng. CloseMainWindow s khng k t thc cc ng d ng khng c c a s chnh ho c cc ng d ng c c a s chnh b v hi u (c th v m t h p tho i hi n ang c m ). V i nh ng tnh hu ng nh th , CloseMainWindow s tr v false.
CloseMainWindow tr v true n u thng i p c g i thnh cng, nhng khng b o m ti n trnh th t s k t thc. V d , cc ng d ng dng so n th o d li u th ng s cho c h i ng i dng lu l i cc d li u cha c lu n u nh n c thng i p ny. Ng i dng th ng c c h i h y b vi c ng c a s v i nh ng tnh hu ng nh th . i u ny ngha l CloseMainWindow s tr v true, nhng ng d ng v n c ch y khi ng i dng h y b . B n c th s d ng phng th c Process.WaitForExit bo hi u vi c k t thc ti n trnh v thu c tnh Process.HasExited ki m tra ti n trnh k t thc hay cha. V b n cng c th s d ng phng th c Kill.

Phng th c Kill k t thc m t ti n trnh ngay l p t c; ng i dng khng c c h i d ng vi c k t thc, v t t c cc d li u cha c lu s b m t. Kill l ty ch n duy nh t k t thc cc ng d ng d a-trn-Windows khng p l i CloseMainWindow v k t thc cc ng d ng khng-d a-trn-Windows. V d d i y kh i ch y m t th hi n m i c a Notepad, i 5 giy, sau k t thc ti n trnh Notepad. Tr c tin, v d ny k t thc ti n trnh b ng CloseMainWindow. N u CloseMainWindow tr v false, ho c ti n trnh Notepad v n c ch y sau khi CloseMainWindow c g i, v d ny s g i Kill v bu c ti n trnh Notepad k t thc; b n c th bu c CloseMainWindow tr v false b ng cch b m c h p tho i File Open m .
using System; using System.Threading; using System.Diagnostics; public class TerminateProcessExample { public static void Main () { // T o m t Process m i v ch y notepad.exe. using (Process process = Process.Start("notepad.exe")) { // i 5 giy v k t thc ti n trnh Notepad. Console.WriteLine("Waiting 5 seconds before terminating" + " notepad.exe."); Thread.Sleep(5000); // K t thc ti n trnh Notepad. Console.WriteLine("Terminating Notepad with " + "CloseMainWindow."); // G i m t thng i p n c a s chnh. if (!process.CloseMainWindow()) { // Khng g i c thng i p. K t thc Notepad b ng Kill. Console.WriteLine("CloseMainWindow returned false - " + " terminating Notepad with Kill."); process.Kill(); } else { // Thng i p c g i thnh cng; i 2 giy // ch ng th c vi c k t thc tr c khi vi n if (!process.WaitForExit(2000)) { n Kill.

Console.WriteLine("CloseMainWindow failed to" +

128 Chng 4: Ti u trnh, ti n trnh, v s

ng b

" terminate - terminating Notepad with Kill."); process.Kill(); } } } // Nh n Enter k t thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

4.12
B nc nb o d ng.

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


m r ng, t i m t th i i m ch c th ch y m t th hi n c a ng

T o m t i t ng System.Threading.Mutex v b o ng d ng thu l y quy n s h u i t ng ny lc kh i ng.


Mutex cung c p m t c ch ng b ha qu trnh th c thi c a cc ti u trnh v t qua bin ti n trnh v cn cung c p m t c ch ti n l i b o r ng ch m t th hi n c a ng d ng ang ch y. B ng cch c thu l y quy n s h u m t i t ng Mutex lc kh i ng v thot n u khng th thu c Mutex, b n c th b o m r ng ch m t th hi n c a ng d ng ang ch y. V d d i y s d ng m t Mutex c tn l MutexExample b o m ch m t th hi n c a v d c th th c thi. using System; using System.Threading; public class MutexExample { public static void Main() { // Gi tr lu n l cho bi t ng d ng ny // c quy n s h u Mutex hay khng. bool ownsMutex; // T o v l y quy n s h u m t Mutex c tn l MutexExample. using (Mutex mutex = new Mutex(true, "MutexExample", out ownsMutex)) { // N u ng d ng s h u Mutex, n c th // n u khng, ng d ng s thot. if (ownsMutex) { ti p t c th c thi;

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();

Chng 4: Ti u trnh, ti n trnh, v s // Gi i 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."); } } // Nh n Enter k t thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

129 ng b

130

Chng 5: XML

131

132 Chng 5: XML

t trong nh ng kha c nh ng ch nh t c a Microsoft .NET Framework l s tch h p su s c v i XML. Trong nhi u ng d ng .NET, b n s khng nh n th y r ng mnh ang s d ng cc k thu t XMLchng s c s d ng pha h u tr ng khi b n tu n t ha m t Microsoft ADO.NET DataSet, g i m t d ch v Web XML, ho c c cc thi t l p ng d ng trong m t file c u hnh Web.config. Trong cc tr ng h p khc, b n s mu n lm vi c tr c ti p v i khng gian tn System.Xml thao tc d li u XML. Cc tc v XML thng th ng khng ch phn tch m t file XML m cn xc nh n tnh h p l t o m t ti li u hay trang c a n d a trn m t XML Schema, p d ng php bi n i XSL HTML m i, v tm ki m m t cch thng minh v i XPath. Cc m c trong chng ny trnh by cc v n sau: Cc k thu t dng 5.7). c, phn tch, v thao tc d li u XML (m c 5.1, 5.2, 5.3, v

Duy t m t ti li u XML tm cc nt c th theo tn (m c 5.4), theo khng gian tn (m c 5.5), hay theo bi u th c XPath (m c 5.6). Xc nh n tnh h p l c a m t ti li u XML d a trn m t XML Schema (m c 5.8). Tu n t ha m t i t ng thnh XML (m c 5.9), t o XML Schema cho m t l p (m c 5.10), v t o m ngu n cho l p d a trn m t XML Schema (m c 5.11). Bi n i m t ti li u XML thnh m t ti li u khc b ng XSLT stylesheet (m c 5.12).

5.1

Hin th cu trc ca mt ti liu XML trong TreeView


B n c n hi n th c u trc v n i dung c a m t ti li u XML trong m t ng d ng d a-trn-Windows. N p ti li u XML b ng l p System.Xml.XmlDocument. Sau , vi t m t phng th c chuy n m t XmlNode thnh m t System.Windows.Forms.TreeNode, r i g i n m t cch quy duy t qua ton b ti li u.

.NET Framework cung c p nhi u cch khc nhau x l cc ti li u XML. Cch m b n s d ng ty thu c vo tc v c n l p trnh. M t trong s l l p XmlDocument. L p ny cung c p m t d ng bi u di n trong-b -nh cho m t ti li u XML, tun theo W3C Document Object Model (DOM); cho php b n duy t qua cc nt theo b t k h ng no, chn v lo i b nt, v thay i ng c u trc lc ch y. B n hy vo [http://www.w3c.org] bi t thm chi ti t v DOM. s d ng l p XmlDocument, b n ch vi c t o m t th hi n c a l p ny r i g i phng th c
Load cng v i m t tn file, m t Stream, m t TextReader, hay m t XmlReader (b n cng c th

cung c p m t URL ch n m t ti li u XML). Th hi n XmlDocument s ch a t t c cc nt (d ng cy) c trong ti li u ngu n. i m nh p (entry point) dng truy xu t cc nt ny l ph n t g c, c c p thng qua thu c tnh XmlDocument.DocumentElement. y l m t i t ng XmlElement, c th ch a nhi u i t ng XmlNode l ng bn trong, cc i t ng ny c th ch a nhi u i t ng XmlNode n a, v c ti p t c nh th . M t XmlNode l ph n c u thnh

133 Chng 5: XML

c b n c a m t file XML. M t nt XML c th l m t ph n t (attribute), l i ch thch, hay text. Khi lm vi c v i XmlNode hay m t l p d n xu t t b n c th s d ng cc thu c tnh c b n sau y:
ChildNodes l t p h p cc nt l ng bn trong Name l tn c a nt.

(element), m t

c tnh

(nh XmlElement hay XmlAttribute), m c u tin.

NodeType l m t thnh vin thu c ki u li t k System.Xml.XmlNodeType, cho bi t ki u c a nt (ph n t , c tnh, text...). Value l n i dung c a nt, n u l nt text hay nt CDATA. Attributes l t p h p cc nt m t cc

c tnh c p d ng cho ph n t .

InnerText l chu i ch a gi tr (text) c a nt hi n hnh v t t c cc nt l ng bn trong. InnerXml l chu i ch a th OuterXml l chu i ch a th

nh d u XML cho t t c cc nt l ng bn trong. nh d u XML cho nt hi n hnh v t t c cc nt l ng bn

trong. V d d i y duy t qua t t c cc nt c a m t XmlDocument (b ng thu c tnh ChildNodes v m t phng th c quy) r i hi n th chng trong m t 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 ph n m designer.) private void cmdLoad_Click(object sender, System.EventArgs e) { // Xa cy. treeXml.Nodes.Clear(); // N p ti li u XML. XmlDocument doc = new XmlDocument(); try { doc.Load(txtXmlFile.Text); }catch (Exception err) { MessageBox.Show(err.Message); return; } // d li u vo TreeView. ConvertXmlNodeToTreeNode(doc, treeXml.Nodes); // M r ng t t c cc nt. treeXml.Nodes[0].ExpandAll(); } private void ConvertXmlNodeToTreeNode(XmlNode xmlNode, TreeNodeCollection treeNodes) {

134 Chng 5: XML // Thm m t TreeNode m t XmlNode ny. TreeNode newTreeNode = treeNodes.Add(xmlNode.Name); // Ty bi n ph n text cho TreeNode d a vo // ki u v n i dung c a 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 + "-->"; break; } // G i phng th c ny m t cch quy cho m i // (XmlAttribute l m t l p con c a XmlNode). if (xmlNode.Attributes != null) { c tnh

foreach (XmlAttribute attribute in xmlNode.Attributes) { ConvertXmlNodeToTreeNode(attribute, newTreeNode.Nodes); } } // G i phng th c ny m t cch quy cho m i nt con. foreach (XmlNode childNode in xmlNode.ChildNodes) { ConvertXmlNodeToTreeNode(childNode, newTreeNode.Nodes); } } }

Xt file XML d i 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>

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

Hnh 5.1 C u trc c a m t ti li u XML


[

Hnh 5.2 InnerText c a ph n t g c

Hnh 5.3 InnerXml c a ph n t g c

136 Chng 5: XML

Hnh 5.4 OuterXml c a ph n t g c

5.2

Chn thm nt vo ti liu XML


B n c n i u ch nh m t ti li u XML b ng cch chn vo d li u m i, ho c b n mu n t o m t ti li u hon ton m i trong b nh . T o nt b ng m t phng th c c a XmlDocument (nh CreateElement, CreateAttribute, CreateNode...). K ti p, chn n vo b ng m t phng th c c a XmlNode (nh InsertAfter, InsertBefore, hay AppendChild).

Chn m t nt vo XmlDocument bao g m hai b c: t o nt r i chn n vo v tr thch h p. lu l i nh ng thay i. Sau , b n c th g i XmlDocument.Save t o m t nt, b n s d ng m t trong cc phng th c c a XmlDocument b t u b ng t m nt s c cng khng gian tn nh ph n cn l i c a ti li u (b n cng c th cung c p m t khng gian tn lm i s ). K ti p, b n ph i tm m t nt ph h p v s d ng m t trong cc phng th c chn c a n thm nt m i vo.
Create, ty thu c vo ki u c a nt. Vi c ny b o

V d d i y trnh by k thu t ny b ng cch t o m t ti li u XML m i:


using System; using System.Xml; public class GenerateXml { private static void Main() { // T o m t ti li u m i r ng. XmlDocument doc = new XmlDocument(); XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null); doc.AppendChild(docNode); // T o v chn m t ph n t m i. XmlNode productsNode = doc.CreateElement("products"); doc.AppendChild(productsNode); // T o m t ph n t l ng bn trong (cng v i m t c tnh). XmlNode productNode = doc.CreateElement("product"); XmlAttribute productAttribute = doc.CreateAttribute("id"); productAttribute.Value = "1001"; productNode.Attributes.Append(productAttribute); productsNode.AppendChild(productNode); // T o v thm cc ph n t con cho nt product ny // (cng v i d li u text).

137 Chng 5: XML 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); // T o v thm m t 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 li u. doc.Save(Console.Out); Console.ReadLine(); } }

Ti li u c t o ra trng gi ng 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>

5.3

Chn thm nt vo ti liu XML mt cch nhanh chng


B n c n chn thm nt vo m t ti li u XML m khng ph i dng dng. n m l nh di

Vi t cc phng th c tr gip (nh n vo tn th v n i dung c a nt) chn nt vo ti li u XML. Cch khc, s d ng phng th c XmlDocument.CloneNode sao l i cc nhnh c a m t XmlDocument. Chn m t nt vo XmlDocument c n nhi u m l nh. C nhi u cch thu ng n m l nh ny. M t cch l t o m t l p tr gip (helper) g m cc phng th c m c-cao chn nt vo ti li u. V d , b n c th vi t phng th c AddElement t o m t ph n t m i, chn n vo, v thm text ( y l ba thao tc c n thi t khi chn ph n t ).

138 Chng 5: XML

V d d i y l m t l p 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); 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 b n c th vi t m l nh gi n hn nh sau:
public class GenerateXml { private static void Main() {

t o m t ti li u XML (gi ng m c 5.2) v i c php n

// T o ti li u. 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); 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 li u.

139 Chng 5: XML doc.Save(Console.Out); Console.ReadLine(); } }

B n cng c th l y cc phng th c tr gip (nh AddAttribute v AddElement) lm cc phng th c th hi n trong m t l p ty bi n d n xu t t XmlDocument. M t cch khc n gi n ha vi c vi t XML l sao l i cc nt b ng phng th c i s lu n l. N u gi tr ny l true, CloneNode s sao l i ton b nhnh, v i t t c cc nt l ng bn trong.
XmlNode.CloneNode. Phng th c ny nh n m t

V d d i y t o m t nt product m i b ng cch sao l i nt


// (Thm nt product u tin.)

u tin:

// T o m t product m i d a vo product hi n c. product = product.CloneNode(true); // i u ch nh d li u. product.Attributes[0].Value = "1002"; product.ChildNodes[0].ChildNodes[0].Value = "Blue China Tea Pot"; product.ChildNodes[1].ChildNodes[0].Value = "102.99"; // Thm ph n t m i. products.AppendChild(product);

Ch trong tr ng h p ny, c m t s gi nh c p t ln cc nt hi n c (v d , gi nh con u tin c a nt lun l productName, v con th hai lun l productPrice). N u gi nh ny khng b o m ng, b n c n ph i xt tn c a nt.

5.4

Tm mt nt khi bit tn ca n
B n c n thu l y m t nt c th trong m t XmlDocument, v b n bi t tn c a n nhng khng bi t v tr c a n. S d ng phng th c XmlDocument.GetElementsByTagName, phng th c ny s d tm ton b ti li u v tr v t p h p System.Xml.XmlNodeList ch a cc nt c so trng.

L p XmlDocument cung c p phng th c GetElementsByTagName dng cho tr c. N tr v k t qu l m t t p h p cc i t ng XmlNode.

tm ra cc nt c tn

o n m d i y trnh by cch s d ng GetElementsByTagName tnh t ng gi cc item trong m t danh m c b ng cch thu l y t t c cc ph n t c tn l "productPrice":
using System; using System.Xml; public class FindNodesByName { private static void Main() { // N p ti li u. XmlDocument doc = new XmlDocument(); doc.Load("ProductCatalog.xml"); // Thu l y t t c price.

140 Chng 5: XML XmlNodeList prices = doc.GetElementsByTagName("productPrice"); decimal totalPrice = 0; foreach (XmlNode price in prices) { // L y ph n text bn trong c a m i ph n t c so trng. totalPrice += Decimal.Parse(price.ChildNodes[0].Value); } Console.WriteLine("Total catalog value: " + totalPrice.ToString()); Console.ReadLine(); } }

phng th c tm ra nt trng kh p). s d ng phng th c ny, tr c h t l y m t XmlNode tng ng v i m t ph n t , k p i t ng ny thnh m t XmlElement. V d d i y trnh by cch tm nt price bn d i ph n t product u tin: XML
XmlElement.GetElementsByTagName (phng th c ny s d t t c cc nt con // Thu l y tham chi u n product u tin. XmlNode product = doc.GetElementsByTagName("products")[0]; // Tm nt price bn d i product ny. XmlNode price = ((XmlElement)product).GetElementsByTagName("productPrice")[0]; Console.WriteLine("Price is " + price.InnerText);

B n

cng

th

tm

m t

ph n

ti

li u

b ng

N u cc ph n t c a b n c ch a c tnh ID, b n cng c th s d ng m t phng th c c tn l GetElementById thu l y ph n t c gi tr ID trng kh p.

5.5 Thu ly cc nt XML trong mt khng gian tn XML


c th
B n c n thu l y cc nt trong m t khng gian tn c th b ng m t XmlDocument. S d ng phin b n
GetElementsByTagName (yu c u m t tn khng gian tn lm

d ng d u hoa th (*) vo

th c XmlDocument. i s ). Ngoi ra, p i s tn th n u b n mu n so trng t t c cc th .

n p

ch ng

c a

phng

Nhi u ti li u XML ch a cc nt thu c nhi u khng gian tn khc nhau. V d , ti li u XML m t m t bi bo khoa h c c th s d ng m t ki u nh d u ring bi u th cc phng trnh ton h c v cc bi u vector. Ho c m t ti li u XML v i cc thng tin v t hng c th k t h p cc thng tin v khch hng v n t hng cng v i m t h s v n chuy n. Tng t , m t ti li u XML m t m t giao d ch thng m i c th bao g m nh ng ph n thu c c hai cng ty, v nh ng ph n ny c vi t theo ngn ng nh d u ring. M t tc v thng th ng trong l p trnh XML l thu l y cc ph n t thu c m t khng gian tn c th . B n c th th c hi n tc v ny v i phin b n n p ch ng c a phng th c XmlDocument.GetElementsByTagName (yu c u m t tn khng gian tn lm i s ). B n c th

141 Chng 5: XML

s d ng phng th c ny tm cc th theo tn, ho c tm t t c cc th trong khng gian tn c ch nh n u b n p d ng d u hoa th vo i s tn th . V d , ti li u XML ph c h p d i y bao g m 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> <cli:firstName>Sally</cli:firstName> <cli:lastName>Sergeyeva</cli:lastName> </cli:client> <ord:orderItem itemNumber="3211"/> <ord:orderItem itemNumber="1155"/> </ord:order>

chng

trnh

d i

ch n

t t

cc

th

trong

khng

gian

tn

http://mycompany/OrderML: using System; using System.Xml; public class SelectNodesByNamespace { private static void Main() { // N p ti li u. XmlDocument doc = new XmlDocument(); doc.Load("Order.xml"); // Thu l y t t c cc th t hng. XmlNodeList matches = doc.GetElementsByTagName("*", "http://mycompany/OrderML"); // Hi n 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(); } Console.ReadLine(); } }

K t xu t c a chng trnh ny nh sau:


Element ******* Attributes **********

142 Chng 5: XML ord:order ord:orderItem ord:orderItem http://mycompany/OrderML 3211 1155 http://mycompany/ClientML

5.6

Tm cc phn t vi biu thc XPath


B n c n duy t m t ti li u XML tm cc nt theo m t tiu chu n tm ki m c p cao. V d , b n c th mu n duy t m t nhnh c th c a m t ti li u XML tm cc nt c cc c tnh no ho c ch a m t s l ng nt con l ng bn trong. Th c bi u th c XPath SelectSingleNode c a l p XmlDocument. thi m t b ng phng th c
SelectNodes

hay

nh ngha hai phng th c dng tm ki m d a vo bi u th c Xpath l SelectNodes v SelectSingleNode. Hai phng th c ny thao tc trn t t c cc nt con. V XmlDocument th a k t XmlNode nn b n c th g i XmlDocument.SelectNodes d tm ton b m t ti li u. Xt ti li u XML m t m t n t hng g m 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> <Price>200.25</Price> </Item> </Items> </Order>

L p XmlNode

C php c a XPath s d ng k hi u gi ng nh ng d n. V d , ng d n /Order/Items/Item cho bi t ph n t <Item> l ng bn trong ph n t <Items>, v ph n t <Items> l ng bn trong ph n t g c <Order>. V d d i y s d ng m t ng d n tuy t i tm tn c a t t c cc item trong m t n t hng:
using System; using System.Xml; public class XPathSelectNodes { private static void Main() { // N p ti li u. XmlDocument doc = new XmlDocument(); doc.Load("orders.xml"); // Thu l y tn c a t t c cc item. // Vi c ny khng th hon t t d dng v i phng th c

143 Chng 5: XML // GetElementsByTagName(), v cc ph n t Name c s d ng // bn trong cc ph n t Item v cc ph n t Client, v do // c hai ki u 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(); } }

K t xu t c a chng tr nh ny nh sau:
Electronic Protractor Invisible Ink

XPath cung c p m t c php tm ki m m nh. Do khng th gi i thch t t c cc bi n th c a n ch trong m t m c ng n nh th ny, nn b ng 5.1 ch trnh by cc ph n chnh trong m t bi u th c XPath v cc v d m t cch lm vi c c a chng v i ti li u XML trn. hi u chi ti t hn, b n hy tham kh o ti li u W3C XPath t i [http://www.w3.org/TR/xpath].
B ng 5.1 C php c a bi u th c XPath Bi u th c M t

B t
/

u m t ng d n tuy t

i (ch n t nt g c). cc ph n t Item l con c a m t ph n t i (ch n nt b t c u).

/Order/Items/Item ch n t t c

Items, m b n thn Items l con c a ph n t g c Order.

B t
//

u m t ng d n tng

//Item/Name ch n t t c cc ph n t Name l con c a m t ph n t Item, b t ch p chng xu t hi n u trong ti li u.

Ch n m t

c tnh c a m t nt. c tnh c tn l id t ph n t g c Order. hai u n m trong ph n t g c

/Order/@id ch n

Ch n b t c ph n t no trong ng d n.
* /Order/* ch n nt Items v Client v c Order.

K t h p nhi u ng d n.
| /Order/Items/Item/Name|Order/Client/Name ch n cc nt Name dng

m t m t Client v cc nt Name dng Cho bi t nt (m c


.

m t m t Item. n cc item lin

nh) hi n hnh.

N u nt hi n hnh l m t Order, bi u th c ./Items ch quan v i n t hng . Cho bi t nt cha.


//Name/.. ch n ph n t Item.

..

l cha c a m t Name, g m cc ph n t Client v

144 Chng 5: XML

nh ngha tiu chu n ch n l a (selection criteria), c th ki m tra gi tr c a m t nt bn trong hay c a m t c tnh.


/Order[@id="2004-01-30.195496"] ch n cc ph n t [ ] Order v i gi tr

tnh cho tr c.
/Order/Items/Item[Price > 50] ch n cc s n ph m c gi trn $50. /Order/Items/Item[Price > 50 and Name="Laser Printer"] ch n cc s n

ph m trng kh p v i c hai tiu chu n. Hm ny thu l y cc ph n t d a vo ph n text kh i bn trong.


/Order/Items/Item[starts-with(Name,"C")] tm t t c

u c a ph n t n m cc ph n t Item

starts-with

c ph n t Name b t
position

u b ng m u t C.

Hm ny thu l y cc ph n t d a vo v tr.
/Order/Items/Item[position()=2] ch n ph n t Item th hai.

count

Hm ny m s ph n t . B n c n ch nh tn c a ph n t con c n ho c d u hoa th (*) cho t t c cc ph n t con.


/Order/Items/Item[count(Price)=1] thu l y cc ph n t Item c

m ng

m t ph n t Price l ng bn trong. Bi u th c XPath v t t c tn ph n t v c tnh m b n s d ng trong lun c phn bi t ch hoa-th ng, v b n thn XML c phn bi t ch hoa-th ng.

5.7 c v ghi XML m khng phi np ton b ti liu


vo b nh
B n c n mu n x c XML t m t stream, ho c ghi n ra m t stream. Tuy nhin, b n l t ng nt m t, khng ph i n p ton b vo b nh v i m t XmlDocument. ghi XML, hy t o m t XmlTextWriter b c l y m t stream v s d ng cc phng th c Write (nh WriteStartElement v WriteEndElement). c XML, hy t o m t XmlTextReader b c l y m t stream v g i phng th c Read d ch chuy n t nt ny sang nt khc. L p XmlTextWriter v XmlTextReader c/ghi XML tr c ti p t stream t ng nt m t. Cc l p ny khng cung c p cc tnh nng dng duy t v thao tc ti li u XML nh XmlDocument, nhng hi u nng cao hn v v t b nh nh hn, c bi t khi b n lm vi c v i cc ti li u XML c c k l n. ghi XML ra b t k stream no, b n c th s d ng XmlTextWriter. L p ny cung c p cc phng th c Write dng ghi t ng nt m t, bao g m:

145 Chng 5: XML

WriteStartDocumentghi ph n kh i u c a ti li u; v WriteEndDocument, ng b t k ph n t no ang m cu i ti li u. WriteStartElementghi m t th m (opening tag) cho ph n t b n ch nh. K , b n c th thm nhi u ph n t l ng bn trong ph n t ny, ho c b n c th g i WriteEndElement ghi th ng (closing tag). WriteElementStringghi m t ph n t , cng v i m t th

m , m t th

ng, v n i

dung text.
WriteAttributeStringghi m t

c tnh cho ph n t

ang m g n nh t, cng v i tn

v gi tr . S d ng cc phng th c ny th ng c n t m l nh hn l t o m t XmlDocument b ng tay, nh c trnh by trong m c 5.2 v 5.3. c XML, b n s d ng phng th c Read c a XmlTextReader. Phng th c ny ti n reader n nt k ti p, v tr v true. N u khng cn nt no n a, n s tr v false. B n c th thu l y thng tin v nt hi n t i thng qua cc thu c tnh c a XmlTextReader (bao g m Name, Value, v NodeType). nh n bi t m t ph n t c cc c tnh hay khng, b n ph i ki m tra thu c tnh d ng phng th c GetAttribute thu l y cc c tnh theo tn hay theo ch s . L p XmlTextReader ch c th truy xu t m t nt t i m t th i i m, v n khng th d ch chuy n ng c hay nh y sang m t nt b t k. Do , tnh linh ho t c a n km hn l p XmlDocument.
HasAttributes v r i s

ng d ng d i y ghi v c m t ti li u XML b ng l p XmlTextWriter v XmlTextReader. Ti li u ny gi ng v i ti li u c t o trong m c 5.2 v 5.3 b ng l p XmlDocument.


using using using using System; System.Xml; System.IO; System.Text;

public class ReadWriteXml { private static void Main() { // T o file v writer. FileStream fs = new FileStream("products.xml", FileMode.Create); XmlTextWriter w = new XmlTextWriter(fs, Encoding.UTF8); // Kh i ng ti li u. w.WriteStartDocument(); w.WriteStartElement("products"); // Ghi m t product. w.WriteStartElement("product"); w.WriteAttributeString("id", "1001"); w.WriteElementString("productName", "Gourmet Coffee"); w.WriteElementString("productPrice", "0.99"); w.WriteEndElement(); // Ghi m t product khc. w.WriteStartElement("product"); w.WriteAttributeString("id", "1002"); w.WriteElementString("productName", "Blue China Tea Pot");

146 Chng 5: XML w.WriteElementString("productPrice", "102.99"); w.WriteEndElement(); // K t thc ti li u. 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 t t 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(); } }

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


mt Schema
B n c n xc nh n tnh h p l c a m t ti li u XML b ng cch b o theo m t XML Schema. m n tun

S d ng l p System.Xml.XmlValidatingReader. T o m t th hi n c a l p ny, n p Schema vo t p h p XmlValidatingReader.Schemas, d ch chuy n qua t ng nt m t tm t t c b ng cch g i XmlValidatingReader.Read, v b t b t c ngo i l no. cc l i trong m t ti li u m khng ph i b t ngo i l , hy th l s ki n ValidationEventHandler. M t XML Schema (gi n XML) nh ngha cc quy t c m m t ki u ti li u XML cho tr c ph i tun theo. Cc quy t c ny nh ngha:

147 Chng 5: XML

Cc ph n t v

c tnh c th xu t hi n trong ti li u. c tnh.

Cc ki u d li u cho ph n t v

C u trc c a ti li u, bao g m cc ph n t no l con c a cc ph n t khc. Th t v s l ng cc ph n t con xu t hi n trong ti li u. Cc ph n t no l r ng, c th ch a text, hay i h i cc gi tr c nh.

Bn su v cc ti li u XML Schema v t qu ph m vi c a chng ny, nhng b n c th tm hi u n thng qua m t v d n gi n. M c ny s s d ng ti li u XML m t danh m c s n ph m c trnh by trong m c 5.1. m c c b n nh t, XML Schema Definition (XSD) c s d ng nh ngha cc ph n t c th xu t hi n trong ti li u XML. B n thn ti li u XSD c vi t theo d ng XML, v b n s d ng m t ph n t c nh ngha tr c (c tn l <element>) ch nh cc ph n t s c n thi t trong ti li u ch. c tnh type cho bi t ki u d li u. V d d i y l tn s n ph m:
<xsd:element name="productName" type="xsd:string" />

V v d d i y l gi s n ph m:
<xsd:element name="productPrice" type="xsd:decimal" />

B n c th tm hi u cc ki u d li u Schema t i [http://www.w3.org/TR/xmlschema-2]. Chng nh x n cc ki u d li u .NET v bao g m string, int, long, decimal, float, dateTime, boolean, base64Binary... C productName v productPrice u l cc ki u n gi n v chng ch ch a d li u d ng k t . Cc ph n t c ch a cc ph n t l ng bn trong c g i l cc ki u ph c t p. B n c th l ng chng vo nhau b ng th <sequence> (n u th t l quan tr ng) hay th <all> (n u th t l khng quan tr ng). D i y l cch l p ph n t <product> vo danh m c s n ph m. Ch r ng, cc c tnh lun c khai bo sau cc ph n t , v chng khng c nhm v i th <sequence> hay <all> v th t khng quan tr ng.
<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 m c nh, m t ph n t c th xu t hi n ng m t l n trong m t ti li u. Nhng b n c th c u hnh i u ny b ng cch ch nh cc c tnh maxOccurs v minOccurs. V d d i y khng gi i h n s l ng s n ph m trong danh m c:
<xsd:element name="product" type="product" maxOccurs="unbounded" />

D i y l Schema cho danh m c s n ph m:


<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-nh ngha product (ki u ph c). --> <xsd:complexType name="product">

148 Chng 5: XML <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 c u trc m ti li u ph i tun theo. B t u v i ph n 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"> <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>

L p XmlValidatingReader th c thi t t c cc quy t c Schema nyb o m ti li u l h p l v n cng ki m tra ti li u XML c ch nh d ng hay cha (ngha l khng c cc k t b t h p l , t t c cc th m u c m t th ng tng ng, v.v...). ki m tra m t ti li u, hy dng phng th c XmlValidatingReader.Read duy t qua t ng nt m t. N u tm th y l i, XmlValidatingReader d ng ln s ki n ValidationEventHandler v i cc thng tin v l i. N u mu n, b n c th th l s ki n ny v ti p t c ki m tra ti li u tm thm l i. N u b n khng th l s ki n ny, ngo i l XmlException s c d ng ln khi b t g p l i u tin v qu trnh ki m tra s b b d . ki m tra m t ti li u c ch nh d ng hay cha, b n c th s d ng XmlValidatingReader m khng c n n Schema. V d k ti p trnh by m t l p ti n ch dng hi n th t t c cc l i trong m t ti li u XML khi phng th c ValidateXml c g i. Cc l i s c hi n th trong m t c a s Console, v m t bi n lu n l c tr v cho bi t qu trnh ki m tra thnh cng hay th t b i.
using System; using System.Xml; using System.Xml.Schema; public class ConsoleValidator { // Thi t l p thnh true n u t n t i t nh t m t l i. private bool failed; public bool Failed { get {return failed;} } public bool ValidateXml(string xmlFilename, string schemaFilename) {

149 Chng 5: XML // T o validator. XmlTextReader r = new XmlTextReader(xmlFilename); XmlValidatingReader validator = new XmlValidatingReader(r); validator.ValidationType = ValidationType.Schema; // N p Schema vo validator. XmlSchemaCollection schemas = new XmlSchemaCollection(); schemas.Add(null, schemaFilename); validator.Schemas.Add(schemas); // Thi t l p phng th c th l s ki n validation. validator.ValidationEventHandler += new ValidationEventHandler(ValidationEventHandler); failed = false; try { // c t t c d li u XML. while (validator.Read()) {} }catch (XmlException err) { // i u ny x y ra khi ti li u XML c ch a k t b t // h p l ho c cc th l ng 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) { failed = true; // Hi n th l i validation. Console.WriteLine("Validation error: " + args.Message); Console.WriteLine(); } }

D i y l cch s d ng l p ny
using System; public class ValidateXml { private static void Main() {

xc nh n tnh h p l c a danh m c s n ph m:

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.");

150 Chng 5: XML } Console.ReadLine(); } }

N u ti li u h p l th s khng c thng bo no xu t hi n, v bi n success s c thi t l p thnh true. Nhng xt xem i u g s x y ra n u b n s d ng m t ti li u ph v cc quy t c Schema, ch ng h n file ProductCatalog_Invalid.xml nh sau:
<?xml version="1.0" ?> <productCatalog> <catalogName>Acme Fall 2003 Catalog</catalogName> <expiryDate>Jan 1, 2004</expiryDate> <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>

N u b n ki m tra ti li u ny, bi n success s bi t cc l i:


Validating ProductCatalog_Invalid.xml.

c thi t l p thnh false v k t xu t s cho

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.

Cu i cng, n u mu n xc nh n tnh h p l c a m t ti li u XML v r i x l n, b n c th s d ng XmlValidatingReader qut ti li u khi n c c vo m t XmlDocument trong-b nh :


XmlDocument doc = new XmlDocument(); XmlTextReader r = new XmlTextReader("ProductCatalog.xml"); XmlValidatingReader validator = new XmlValidatingReader(r); // N p Schema vo validator. validator.ValidationType = ValidationType.Schema; XmlSchemaCollection schemas = new XmlSchemaCollection(); schemas.Add(null, "ProductCatalog.xsd");

151 Chng 5: XML validator.Schemas.Add(schemas); // N p v ki m tra ti li u cng m t lc. try { doc.Load(validator); // (Validation thnh cng.) }catch (XmlSchemaException err) { // (Validation th t b i.) }

5.9

S dng XML Serialization vi cc i tng ty bin


B n c n s d ng XML nh m t nh d ng tu n t ha (serialization format). Tuy nhin, b n khng mu n x l XML tr c ti p trong m l nh, m mu n tng tc v i d li u b ng cc i t ng ty bi n. S d ng l p System.Xml.Serialization.XmlSerializer t ng c a b n sang XML, v ng c l i. B n cng c th b ng cc c tnh ty bi n bi u di n XML c a n. chuy n d li u t i nh d u m l nh c a l p

L p XmlSerializer cho php chuy n cc i t ng thnh d li u XML, v ng c l i. L p ny thng minh t o ng cc m ng khi n tm th y cc ph n t l ng bn trong. Cc yu c u khi s d ng XmlSerializer:
XmlSerializer ch tu n t ha cc thu c tnh v cc bi n cng khai.

Cc l p c n tu n t ha ph i ch a m t phng th c kh i d ng m c nh khng c i s . XmlSerializer s s d ng phng th c kh i d ng ny khi t o i t ng m i trong qu trnh gi i tu n t ha. Cc thu c tnh c a l p ph i l kh - c (readable) v kh -ghi (writable). l v XmlSerializer s d ng hm truy xu t thu c tnh get l y thng tin v hm truy xu t thu c tnh set ph c h i d li u sau khi gi i tu n t ha. B n cng c th lu tr cc i t ng theo nh d ng d a-trn-XML b ng cch s d ng .NET Serialization v System.Runtime.Serialization.Formatters.Soap. SoapFormatter. Trong tr ng h p ny, b n ch c n lm cho l p c a b n tr thnh kh -tu n-t -ha, khng c n cung c p phng th c kh i d ng m c nh hay b o m t t c cc thu c tnh l kh ghi. Tuy nhin, cch ny khng cho b n quy n ki m sot trn nh d ng XML - c-tu n-t -ha.

s d ng XML serialization, tr c h t b n ph i nh d u cc i t ng d li u v i cc c tnh cho bi t php nh x sang XML. Cc c tnh ny thu c khng gian tn System.Xml.Serialization v bao g m:
XmlRootcho bi t tn ph n t

d ng tn c a l p. m c

g c c a file XML. Theo m c nh, XmlSerializer s s c tnh ny c th c p d ng khi khai bo l p.

XmlElementcho bi t tn ph n t

dng cho m t thu c tnh hay bi n cng khai. Theo nh, XmlSerializer s s d ng tn c a thu c tnh hay bi n cng khai.

152 Chng 5: XML

XmlAttributecho bi t m t thu c tnh hay bi n cng khai s

c tu n t ha thnh

m t

c tnh (khng ph i ph n t ), v ch

nh tn

c tnh.

XmlEnumc u hnh ph n text s

c s d ng khi tu n t ha cc gi tr li t k. N u b n khng s d ng XmlEnum, tn c a h ng li t k s c s d ng.

XmlIgnorecho bi t m t thu c tnh hay bi n cng khai s khng c tu n t ha.

V d , xt danh m c s n ph m c trnh by trong m c 5.1. B n c th m t ti li u XML ny b ng cc i t ng ProductCatalog v Product nh sau:


using System; using System.Xml.Serialization; [XmlRoot("productCatalog")] public class ProductCatalog { [XmlElement("catalogName")] public string CatalogName; // S d ng ki u d li u ngy (b qua ph n gi ). [XmlElement(ElementName="expiryDate", DataType="date")] public DateTime ExpiryDate; // C u hnh tn th . [XmlArray("products")] [XmlArrayItem("product")] public Product[] Products; public ProductCatalog() { // Phng th c kh i d ng m c } nh (dng khi gi i tu n t ha).

public ProductCatalog(string catalogName, DateTime expiryDate) { this.CatalogName = catalogName; 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 th c kh i d ng m c } nh (dng khi gi i tu n t ha).

public Product(string productName, decimal productPrice) { this.ProductName = productName; this.ProductPrice = productPrice; }

153 Chng 5: XML }

Ch r ng, cc l p ny s d ng cc c tnh XML Serialization i tn ph n t (s d ng ki u k hi u Pascal1 trong tn thnh vin l p, v ki u k hi u lng l c 2 trong tn th XML), cho bi t cc ki u d li u khng r rng, v ch nh cc ph n t <product> s c l ng bn trong <productCatalog> nh th no. B ng cch s d ng cc l p ty bi n ny v i t ng XmlSerializer, b n c th chuy n XML thnh cc i t ng v ng c l i. o n m d i y t o m t i t ng ProductCatalog m i, tu n t ha i t ng thnh ti li u XML, gi i tu n t ha ti li u thnh i t ng, v r i hi n th ti li u ny:
using using using using System; System.Xml; System.Xml.Serialization; System.IO;

public class SerializeXml { private static void Main() { // T o danh m c s n ph m. 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; // Tu n t ha danh m c ra file. XmlSerializer serializer = new XmlSerializer(typeof(ProductCatalog)); FileStream fs = new FileStream("ProductCatalog.xml", FileMode.Create); serializer.Serialize(fs, catalog); fs.Close(); catalog = null; // Gi i tu n t ha danh m c t file. fs = new FileStream("ProductCatalog.xml", FileMode.Open); catalog = (ProductCatalog)serializer.Deserialize(fs); // Tu n t ha danh m c ra c a s Console. serializer.Serialize(Console.Out, catalog); Console.ReadLine(); } }

1
2

Pascal casing: M u t Camel casing: M u t

u tin c a cc ch u tin c a ch

u vi t hoa, v d SomeOtherName u vi t th ng, m u t u tin c a cc ch i sau vi t hoa, v

d someOtherName

154 Chng 5: XML

5.10

To XML Schema cho mt lp .NET

B n c n t o m t XML Schema d a trn m t hay nhi u l p C#. i u ny cho php b n ki m tra tnh h p l c a cc ti li u XML tr c khi gi i tu n t ha chng v i XmlSerializer. S d ng ti n ch dng l nh XML Schema Definition Tool (xsd.exe i km v i .NET Framework). Ch nh tn c a assembly lm i s dng l nh, v thm i s /t:[TypeName] cho bi t ki u c n chuy n i. M c 5.9 trnh by cch s d ng XmlSerializer tu n t ha i t ng .NET thnh XML, v gi i tu n t ha XML thnh i t ng .NET. Nhng n u mu n s d ng XML nh m t phng cch tng tc v i cc ng d ng khc, quy trnh nghi p v , hay cc ng d ng phiFramework, b n s c n xc nh n tnh h p l c a XML tr c khi gi i tu n t ha n. B n cng s c n t o m t ti li u XML Schema nh ngha c u trc v cc ki u d li u c s d ng trong nh d ng XML c a b n, cc ng d ng khc c th lm vi c v i n. M t gi i php l s d ng ti n ch dng l nh xsd.exe. Ti n ch xsd.exe i km v i .NET Framework. N u ci t Microsoft Visual Studio .NET, b n s tm th y n trong th m c C:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Bin. Ti n ch xsd.exe c th t o ra XML Schema t m t assembly c bin d ch. B n ch c n cung c p tn file v cho bi t l p m t ti li u XML v i i s /t:[TypeName]. V d , xt cc l p ProductCatalog v Product c trnh by trong m c 5.9. B n c th t o XML Schema cho m t danh m c s n ph m v i dng l nh sau:
xsd 05-09.exe /t:ProductCatalog

B n ch c n ch nh l p ProductCatalog trn dng l nh, v l p ny m t ti li u XML. XML Schema c t o ra trong v d ny (c tn m c nh l schema0.xsd) s m t y m t danh m c s n ph m, v i cc item s n ph m l ng bn trong. By gi , b n c th s d ng XmlValidatingReader ( c trnh by trong m c 5.8) ki m tra tnh h p l c a ti li u XML d a vo XML Schema ny.

5.11

To lp t mt XML Schema
sau , b n c i t ng ny v

B n c n t o m t hay nhi u l p C# d a trn m t XML Schema; th t o m t ti li u XML theo nh d ng ph h p b ng cc XmlSerializer.

S d ng ti n ch dng l nh xsd.exe ( i km v i .NET Framework). Ch nh tn file Schema lm i s dng l nh, v thm i s /c cho bi t b n mu n t o m l nh cho l p. M c 5.10 gi i thi u ti n ch dng l nh xsd.exe, ti n ch ny c th c s d ng t o XML Schema d a trn nh ngha l p. Qu trnh ng c l i (t o m l nh C# d a trn m t ti li u XML Schema) cng c th x y ra. Vi c ny h u ch khi b n mu n ghi m t nh d ng

155 Chng 5: XML

XML no , nhng l i khng mu n t o ti li u ny b ng XmlDocument hay XmlTextWriter. Thay vo , b ng cch s m tt p y cc i t ng .NET. K , b n c th tu n bi u di n XML b ng XmlSerializer, nh c m t trong m

cch ghi t ng nt m t v i l p d ng xsd.exe, b n c th t o ra t ha cc i t ng ny thnh c 5.9.

t o m l nh t m t XML Schema, b n ch c n cung c p tn file Schema v thm i s /c cho bi t b n mu n t o ra l p. V d , xt XML Schema c trnh by trong m c 5.8. B n c th t o m l nh C# t Schema ny v i dng l nh sau:
xsd ProductCatalog.xsd /c

L nh ny s t o ra m t file (ProductCatalog.cs) g m hai l p: Product v productCalalog. Hai l p ny tng t v i hai l p c t o trong m c 5.9.

5.12
B n c n bi n

Thc hin php bin i XSL


i m t ti li u XML thnh m t ti li u khc b ng XSLT stylesheet.

S d ng l p System.Xml.Xsl.XslTransform. N p XSLT stylesheet b ng phng th c XslTransform.Load, v t o ti li u k t xu t b ng phng th c Transform (c n cung c p ti li u ngu n). XSLT (hay XSL Transforms) l m t ngn ng d a-trn-XML, c thi t k bi n i m t ti li u XML thnh m t ti li u khc. XSLT c th c s d ng t o m t ti li u XML m i v i cng d li u nhng c s p x p theo m t c u trc khc ho c ch n m t t p con d li u trong m t ti li u. N cng c th c s d ng t o m t ki u ti li u c c u trc khc. XSLT th ng c s d ng theo cch ny nh d ng m t ti li u XML thnh m t trang HTML. XSLT l m t ngn ng a nng, v vi c t o XSL Transforms v t qu ph m vi quy n sch ny. Tuy nhin, b n c th h c cch t o cc ti li u XSLT n gi n b ng cch xem m t v d c b n. M c ny s bi n i ti li u orders.xml ( c trnh by trong m c 5.6) thnh m t ti li u HTML v r i hi n th k t qu . th c hi n php bi n i ny, b n s c n 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"> <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>

156 Chng 5: XML </tr> </xsl:template> </xsl:stylesheet>

V c b n, m i XSL stylesheet g m m t t p cc template. M i template so trng v i cc ph n t trong ti li u ngu n v r i m t cc ph n t c so trng t o nn ti li u k t qu . so trng template, ti li u XSLT s d ng bi u th c XPath, nh c m t trong m c 5.6. Stylesheet v a trnh by trn (orders.xslt) g m hai template (l cc con c a ph n t stylesheet g c). Template u tin trng kh p v i ph n t Order g c. Khi b x l XSLT tm th y m t ph n t Order, n s ghi ra cc th c n thi t b t u m t b ng HTML v i cc tiu c t thch h p v chn d li u v khch hng b ng l nh value-of (ghi ra k t qu d ng text c a m t bi u th c XPath). Trong tr ng h p ny, cc bi u th c XPath (Client/@id v Client/Name) trng v i c tnh id v ph n t Name. phn nhnh v x l cc ph n t Item n m K ti p, l nh apply-templates c s d ng trong. i u ny l c n thi t v c th c nhi u ph n t Item. M i ph n t Item c so trng b ng bi u th c Items/Item (nt g c Order khng c ch nh v Order chnh l nt hi n t i). Cu i cng, cc th c n thi t s c ghi ra k t thc ti li u HTML. N u th c thi php bi n i ny trn file orders.xml ( trnh by trong m c 5.6), b n s nh n c k t qu (ti li u 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> <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 d ng m t XSLT stylesheet trong .NET, b n c n s d ng l p XslTransform. ng d ng d i y p d ng php bi n i v r i hi n th file c bi n i trong c a s trnh duy t web. Trong v d ny, m l nh s d ng phin b n n p ch ng c a phng th c Transform lu tr c ti p ti li u k t qu ra a, m c d b n c th thu l y v x l n nh m t stream bn trong ng d ng c a b n.
using System; using System.Windows.Forms; using System.Xml.Xsl;

157 Chng 5: XML public class TransformXml : System.Windows.Forms.Form { private AxSHDocVw.AxWebBrowser webBrowser; // (B qua ph n m designer.)

private void TransformXml_Load(object sender, System.EventArgs e) { XslTransform transform = new XslTransform(); // N p XSL stylesheet. transform.Load("orders.xslt"); // Bi n i orders.xml thnh orders.html. transform.Transform("orders.xml", "orders.html", null); object var = null; webBrowser.Navigate( "file:///" + Application.StartupPath + @"\orders.html", ref var, ref var, ref var, ref var); } }

Hnh 5.5 K t xu t stylesheet cho orders.xml

.NET Framework khng c i u ki m no dng th hi n n i dung HTML. Tuy nhin, ch c nng ny c th c c thng qua kh nng lin tc COM n u b n s d ng i u ki m ActiveX Web Browser ( i cng Microsoft Internet Explorer v h i u hnh Microsoft Windows). C a s ny c th hi n th cc file HTML c c b hay xa, v h tr JavaScript, VBScript, v t t c cc plug-in cho Internet Explorer (xem m c 11.4 bi t cch thm i u ki m Web Browser vo d n).

158

Chng 6: WINDOWS FORM

159

160 Chng 6: Windows Form

icrosoft .NET Framework ch a m t t p phong ph cc l p dng t o cc ng d ng d a-trn-Windows truy n th ng trong khng gian tn System.Windows. Forms. Cc l p ny c ph m vi t cc ph n c b n nh cc l p TextBox, Button, v MainMenu n cc i u ki m chuyn bi t nh TreeView, LinkLabel, v NotifyIcon. Ngoi ra, b n s tm th y t t c cc cng c c n thi t qu n l cc ng d ng giao di n a ti li u (Multiple Document InterfaceMDI), tch h p vi c tr gip c m-ng -c nh, v ngay c t o cc giao di n ng i dng a ngn ng t t c u khng c n vi n n s ph c t p c a Win32 API.

H u h t cc nh pht tri n C# c th t n m b t nhanh chng m hnh l p trnh Windows Form. Tuy nhin, c m t s th thu t v k thu t khng t n nhi u th i gian c th lm cho vi c l p trnh Windows hi u qu hn. Chng ny s trnh by cc v n sau y: Cch khai thc tri t cc i u ki m, bao g m thm chng vo form lc th c thi (m c 6.1), lin k t chng v i d li u no (m c 6.2), v x l chng m t cch t ng qut (m c 6.3). Cch lm vi c v i form, bao g m theo v t chng trong m t ng d ng (m c 6.4), s d ng MDI (m c 6.5), v lu tr thng tin v kch th c v v tr (m c 6.6). B n cng s bi t cch t o form a ngn ng (m c 6.13) v form khng ng vi n (m c 6.14 v 6.15). M t s th thu t khi lm vi c v i cc i u ki m thng d ng nh ListBox (m c 6.7), TextBox (m c 6.8), ComboBox (m c 6.9), ListView (m c 6.10), v Menu (m c 6.11 v m c 6.12). Cch t o m t icon ng trong khay h th ng (m c 6.16). Cc khi ni m m b n c th p d ng cho nhi u ki u i u ki m, bao g m xc nh n tnh h p l (m c 6.17), ko-v-th (m c 6.18), tr gip c m-ng -c nh (m c 6.19), phong c c a form (m c 6.21). cch Windows XP (m c 6.20), v H u h t cc m c trong chng ny s d ng cc l p i u ki m, lun c nh ngha trong khng gian tn System.Windows.Forms. Khi a vo cc l p ny, tn khng gian tn y khng c ch nh, v Systems.Windows.Forms c th a nh n.

6.1

Thm iu kim vo form lc thc thi


B n c n thm m t i u ki m vo form lc th c thi, khng ph i lc thi t k . T o m t i t ng c a l p i u ki m thch h p. K , thm i t ng ny vo m t form ho c m t i u ki m container b ng phng th c Add c a ControlCollection.

Trong m t ng d ng d a-trn-Windows .NET, khng c s khc bi t no gi a vi c t o i u ki m lc thi t k v vi c t o i u ki m lc th c thi. Khi b n t o m t i u ki m lc thi t k (s d ng cng c Microsoft Visual Studio .NET), o n m c n thi t s c thm vo l p form, c th l trong m t phng th c c bi t c tn l InitializeComponent. B n c th s d ng

161 Chng 6: Windows Form

o n m gi ng nh v y trong ng d ng c a b n sau: 1. 2. 3. 4. T om t

t o i u ki m. B n c n th c hi n cc b c

i t ng c a l p i u ki m thch h p. v tr).

C u hnh cc thu c tnh c a i u ki m ( c bi t l kch th c v t a Thm i u ki m ny vo form ho c i u ki m container.

Ngoi ra, n u c n th l cc s ki n cho i u ki m m i, b n c th g n chng vo cc phng th c hi n c.

M i i u ki m u cung c p thu c tnh Controls tham chi u n ControlCollection ch a t t c cc i u ki m con c a n. thm m t i u ki m con, b n c n g i phng th c ControlCollection.Add. V d sau y s lm r i u ny b ng cch t o ng m t danh sch cc CheckBox. M t CheckBox c thm vo cho m i item trong m t m ng. T t c cc CheckBox c thm vo m t Panel (Panel c thu c tnh AutoScroll l true c th cu n qua danh sch cc CheckBox).

Hnh 6.1 Danh sch cc CheckBox c-t ousing System; using System.Windows.Forms; public class DynamicCheckBox : System.Windows.Forms.Form { // (B qua ph n m designer.)

ng

private void DynamicCheckBox_Load(object sender, System.EventArgs e) { // T o m ng. string[] foods = {"Grain", "Bread", "Beans", "Eggs", "Chicken", "Milk", "Fruit", "Vegetables", "Pasta", "Rice", "Fish", "Beef"}; int topPosition = 10; foreach (string food in foods) { // T o m t CheckBox m i. CheckBox checkBox = new CheckBox(); checkBox.Left = 10; checkBox.Top = topPosition; topPosition += 30; checkBox.Text = food; // Thm CheckBox vo form. panel.Controls.Add(checkBox);

162 Chng 6: Windows Form } } }

6.2
Lu tr m t tham chi u M il th s khng lu tr n

Lin kt d liu vo iu kim


B n c n lin k t m t i t ng vo m t i u ki m c th (c th l thng tin no lin quan n m t item cho tr c). lu tr vi

i t ng trong thu c tnh Tag c a i u ki m.

p d n xu t t System.Windows.Forms.Control u cung c p thu c tnh Tag v b n c d ng n lu tr m t tham chi u n b t k ki u i t ng no. Thu c tnh Tag c i u ki m hay Microsoft .NET Framework s d ng m n c dnh lm ni cc thng tin c th c a ng d ng. Ngoi ra, m t vi l p khc khng d n xu t t Control cng cung c p thu c tnh Tag, ch ng h n cc l p ListViewItem v TreeNode (trnh by cc item trong m t ListView ho c TreeView). M t l p khng cung c p thu c tnh Tag l MenuItem. Thu c tnh Tag c nh ngha l m t ki u Object, ngha l b n c th s d ng n lu tr b t k ki u gi tr ho c ki u tham chi u no, t m t s ho c chu i n gi n cho n m t i t ng ty bi n do b n nh ngha. Khi l y d li u t thu c tnh Tag, b n s c n p (ki u) i t ng thnh ki u g c c a n.

i t ng FileInfo tng ng v i V d sau y thm danh sch cc file vo m t ListView. m i file c lu tr trong thu c tnh Tag. Khi ng i dng nh p p vo m t trong cc item, ng d ng s l y i t ng FileInfo t thu c tnh Tag v hi n th kch th c file trong m t MessageBox (xem hnh 6.2).
using System; using System.Windows.Forms; using System.IO; public class TagPropertyExample : System.Windows.Forms.Form ( // (B qua ph n m designer.)

private void TagPropertyExample_Load(object sender, System.EventArgs e) { // L y t t c cc file trong th m c g c a C. DirectoryInfo directory = new DirectoryInfo("C:\\"); FileInfo[] files = directory.GetFiles(); // Hi n th t t 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) {

163 Chng 6: Windows Form // L y kch th c file. ListViewItem item = ((ListView)sender).SelectedItems[0]; FileInfo file = (FileInfo)item.Tag; string info = file.FullName + " is " + file.Length + " bytes."; // Hi n th kch th c file. MessageBox.Show(info, "File Information"); } }

Hnh 6.2 Lu tr d li u trong thu c tnh Tag

6.3

X l tt c cc iu kim trn form


B n c n th c hi n m t tc v chung cho t t c cc i u ki m trn form (v d , l y i mu hay thay i kch th c c a hay xa thu c tnh Text c a chng, thay chng). Duy t ( quy) qua t p h p cc i u ki m. Tng tc v i m i i u ki m b ng cc thu c tnh v phng th c c a l p Control c s .

B n c th duy t qua cc i u ki m trn form b ng t p h p Form.Controls, t p ny ch a t t c cc i u ki m n m tr c ti p trn b m t form. Tuy nhin, n u vi i u ki m trong s l i u ki m container (nh GroupBox, Panel, ho c TabPage), chng c th ch a nhi u i u ki m n a. Do , c n s d ng k thu t quy ki m tra t p h p Controls. V d sau y trnh by m t form th c hi n k thu t quy tm m i TextBox c trn form v xa i ton b text trong . Form s ki m tra m i i u ki m xc nh xem n c ph i l TextBox hay khng b ng ton t typeof.
using System; using System.Windows.Forms; public class ProcessAllControls : System.Windows.Forms.Form { // (B qua ph n m designer.)

private void cmdProcessAll_Click(object sender, System.EventArgs e) { ProcessControls(this);

164 Chng 6: Windows Form } private void ProcessControls(Control ctrl) { // B qua i u ki m tr khi n l TextBox. if (ctrl.GetType() == typeof(TextBox)) { ctrl.Text = ""; } // X l cc i u ki m m t cch quy. // i u ny c n thi t khi c m t i u ki m ch a nhi u // i u ki m khc (v d , khi b n s d ng Panel, // GroupBox, ho c i u ki m container no khc). foreach (Control ctrlChild in ctrl.Controls) { ProcessControls(ctrlChild); } } }

6.4

Theo vt cc form kh kin trong mt ng dng


B n mu n gi l i v t c a t t c form hi n ang c hi n th . y l tr ng h p th ng g p khi b n mu n m t form c th tng tc v i m t form khc. T o m t l p gi cc tham chi u ny b ng bi n tnh. n cc i t ng Form. Lu tr cc tham chi u

.NET khng cung c p cch xc nh form no ang c hi n th trong m t ng d ng (ngo i tr ng d ng MDI, s c m t trong m c 6.5). N u mu n xc nh form no ang t n t i, form no ang c hi n th , ho c b n mu n m t form c th g i cc phng th c v thi t l p cc thu c tnh c a m t form khc th b n c n ph i gi l i v t c a cc i t ng form. th c hi n yu c u trn, hy t o m t l p g m cc thnh vin tnh; l p ny c th theo v t cc form ang m b ng m t t p h p, hay cc thu c tnh chuyn bi t. V d , l p d i y c th theo v t hai form:
public class OpenForms { public static Form MainForm; public static Form SecondaryForm; }

Khi form chnh ho c form ph c hi n th , chng s t ng k v i l p OpenForms. Ni h p l t o n m ny l trong phng th c th l s ki n Form.Load.


private void MainForm_Load(object sender, EventArgs e) { // ng k i t ng form v a OpenForms.MainForm = this; } c t o.

B n c th s d ng o n m tng t
// G b i t ng form. OpenForms.MainForm = null; }

g b tham chi u khi form b

ng.

private void MainForm_Unload(object sender, EventArgs e) {

165 Chng 6: Windows Form

By gi , m t form khc c th tng tc v i form ny thng qua l p OpenForms. V d , d i y l cch form chnh lm n form ph :
if (OpenForms.SecondaryForm != null) { OpenForms.SecondaryForm.Hide(); }

Trong cch ti p c n ny, chng ta gi s m i form c t o ch m t l n. N u b n c m t ng d ng d a-trn-ti-li u (document-based application), trong , ng i dng c th t o nhi u i t ng c a cng m t form, b n c n theo v t cc form ny b ng m t t p h p. T p h p ArrayList d i y l m t v d :
public class OpenForms { public static Form MainForm; public static ArrayList DocForms = new ArrayList(); }

Theo , form c th t thm vo t p h p khi c n, nh c trnh by trong o n m sau y:


private void DocForm_Load(object sender, EventArgs e) { // ng k i t ng form v a OpenForms.DocForms.Add(this); } c t o.

6.5

Tm tt c cc form trong ng dng MDI


B n c n tm t t c cc form hi n ang c hi n th trong m t ng d ng giao di n a ti li u (Multiple Document Interface). Duy t qua cc form trong t p h p MdiChildren c a form MDI cha.

.NET Framework c hai l i t t thu n l i cho vi c qu n l cc ng d ng MDI: thu c tnh MdiChildren v MdiParent c a l p Form. B n c th xt thu c tnh MdiParent c a b t k form MDI con no tm form cha. B n c th s d ng t p h p MdiChildren c a form MDI cha tm t t c cc form con. V d sau y (xem hnh 6.3) s hi n th t t c cc form con. M i form con g m m t Label (ch a thng tin v ngy gi ), v m t Button. Khi ng i dng nh p vo Button, phng th c th l s ki n s duy t qua t t c cc form con v hi n th dng ch trong Label (v i thu c tnh ch - c). D i y l ph n 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 ph n m designer.)

public string LabelText { get { return label.Text; }

166 Chng 6: Windows Form } private void cmdShowAllWindows_Click(object sender, System.EventArgs e) { // Duy t qua t p h p cc form con. foreach (Form frm in this.MdiParent.MdiChildren) { // p ki u tham chi u 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(); } }

Ch r ng, khi o n m duy t qua t p h p cc form con, n ph i chuy n (p ki u) tham c th s d ng thu c tnh LabelText. chi u Form thnh MDIChild

Hnh 6.3 L y thng tin t cc form MDI con

6.6

Lu tr kch thc v v tr ca form


B n c n lu tr kch th c v v tr c a m t form (c th thay c) v ph c h i n l i trong l n hi n th form k ti p. i kch th c

Lu tr cc thu c tnh Left, Top, Width, v Height c a form trong Windows Registry. Windows Registry l ni l t ng lu tr thng tin v v tr v kch th c cho form. C th , b n s lu tr thng tin v m i form trong m t kha c l p (c th s d ng tn c a form lm kha). Cc kha ny s c lu tr ngay d i kha ng d ng. B n c n t o m t l p chuyn bi t lu v l y cc thi t l p cho form. L p FormSettingStore c trnh by d i y cung c p hai phng th c: SaveSettingsnh n vo m t form v ghi thng tin v kch th c v v tr c a n vo Registry; v ApplySettingsnh n vo m t form

167 Chng 6: Windows Form

v p d ng cc thi t l p t Registry. thnh cc bi n thnh vin l p.


using System; using System.Windows.Forms; using Microsoft.Win32; public class FormSettingStore { private string regPath; private string formName; private RegistryKey key; public string RegistryPath { get {return regPath;) } public string FormName { get {return formName;} }

ng d n c a kha v tn c a kha con c lu tr

public FormSettingStore(string registryPath, string formName) { this.regPath = registryPath; this.formName = formName; // T o kha n u n cha t n t i. 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); } }

s d ng l p FormSettingStore, b n ch c n thm o n m th l s ki n d i y vo b t k form no. o n m ny s lu cc thu c tnh c a form khi form ng v ph c h i chng khi form c n p.
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); }

168 Chng 6: Windows Form

Nh r ng, vi c truy xu t Registry c th b gi i h n cn c vo ti kho n ng i dng hi n hnh v chnh sch b o m t truy xu t m l nh (Code Access Security Policy). Khi b n t o m t ng d ng yu c u truy xu t Registry, assembly s yu c u truy xu t Registry b ng yu c u quy n t i thi u (minimum permission requests c m t trong m c 13.7).

6.7

Buc ListBox cun xung


B n c n cu n m t ListBox (b ng m l nh) c th c nhn th y. nh ng item no trong danh sch u tin).

Thi t l p thu c tnh ListBox.TopIndex (thi t l p item c nhn th y Trong vi tr ng h ListBox m b n ph ( c thm vo cu M t gi i php l cu

p, b n c m t ListBox lu tr m t l ng thng tin ng k ho c m t i thm thng tin vo m t cch nh k. Th ng th thng tin m i nh t i danh sch) l i l thng tin quan tr ng hn thng tin u danh sch. n ListBox c th nhn th y cc item v a m i thm vo. n

Form d i y (g m m t ListBox v m t Button) s thm 20 item vo danh sch r i cu n trang cu i cng b ng thu c tnh TopIndex (xem hnh 6.4):
using System; using System.Windows.Forms; public class ListBoxScrollTest : System.Windows.Forms.Form { // (B qua ph n m designer.)

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; } }

169 Chng 6: Windows Form

Hnh 6.4 Cu n ListBox

n trang cu i cng

6.8

Ch cho php nhp s vo TextBox


B n c n t o m t TextBox sao cho TextBox ny b qua t t c cc c nh n phm khng ph i s . Thm phng th c th l s ki n TextBox.KeyPress. Trong phng th c ny, thi t l p thu c tnh KeyPressEventArgs.Handled l true b qua c nh n phm khng h pl .

Cch t t nh t hi u ch nh u vo b t h p l l khng cho n c nh p ngay t u. i u ny d dng hi n th c v i TextBox v n cung c p s ki n KeyPress, s ki n ny x y ra sau khi c nh n phm c ti p nh n nhng tr c khi n c hi n th . B n c th s d ng thng s s ki n KeyPressEventArgs h y b c nh n phm khng h p l b ng cch t thu c tnh Handled l true. u vo ch l s , b n c n cho php m t c nh n phm ch khi n tng ng v i m t s (0 n 9) ho c m t phm i u khi n c bi t (nh phm delete ho c mi tn). K t v a nh n c c p cho s ki n KeyPress thng qua thu c tnh KeyPressEventArgs.KeyChar. B n c th s d ng hai phng th c tnh c a l p System.Char l IsDigit v IsControl ki m tra nhanh k t . D i y l phng th c th l s ki n m b n s s d ng
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar)) { e.Handled = true; } }

ngn

u vo khng ph i s :

Ch r ng o n m ny b qua d u phn cch th p phn. l i o n m nh sau:


// L y k t phn cch th p phn trn n n ny // ("." i v i US-English). string decimalString =

cho php k t ny, b n c n s a

170 Chng 6: Windows Form 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; }

o n m ny ch cho php m t d u phn cch th p phn, nhng n khng gi i h n s ch s c th c dng. N cng khng cho php nh p s m (b n c th thay i i u ny b ng cch cho php d u tr - l k t u tin). Nh r ng, o n m ny cng gi nh b n nh p khng gian tn System.Threading.

6.9

S dng ComboBox c tnh nng auto-complete


B n c n t o m t ComboBox t danh sch cc item c a n. ng hon t t nh ng g ng i dng g vo d a trn B n c th hi n th c m t ComboBox c tnh nng auto-complete b ng cch t o m t i u ki m ty bi n chp phng th c OnKeyPress v OnTextChanged.

C nhi u bi n th khc nhau i v i i u ki m c tnh nng auto-complete. i lc, i u ki m l p y cc gi tr d a trn danh sch cc ph n v a ch n (nh Microsoft Excel th ng lm khi b n nh p gi tr cho cell) ho c x xu ng m t danh sch cc gi tr g n gi ng (nh Microsoft Internet Explorer th ng lm khi b n g URL). B n c th t o m t ComboBox c tnh nng auto-complete b ng cch th l s ki n KeyPress v TextChanged, ho c b ng cch t o m t l p ty bi n d n xu t t ComboBox v chp phng th c OnKeyPress v OnTextChanged. Trong phng th c OnKeyPress, ComboBox xc nh c th c hi n m t thay th auto-complete hay khng. N u ng i dng nh n m t phm k t (m t m u t ch ng h n) th vi c thay th c th c th c hi n, nhng n u ng i dng nh n m t phm i u khi n (phm backspace ho c phm mi tn ch ng h n) th khng th c hi n g c . Phng th c OnTextChanged th c hi n vi c thay th sau khi vi c x l phm hon t t. Phng th c ny tm item trng kh p u tin i v i ph n text hi n th i, r i thm vo ph n cn l i c a text trng kh p. Sau khi text c thm vo, ComboBox s ch n (bi en) cc k t gi a i m chn hi n t i v i m cu i c a text. Vi c ny cho php ng i dng ti p t c g v thay th auto-complete n u n khng ph i l nh ng g ng i dng mu n. D i y l ph n m cho l p AutoCompleteComboBox:
using System; using System.Windows.Forms; public class AutoCompleteComboBox : ComboBox { // Bi n c dng khi m t phm c bi t c nh n // (trong tr ng h p ny, thao tc thay th text s private bool controlKey = false; b b qua).

// Xc nh xem phm c bi t c c nh n hay khng. protected override void OnKeyPress(

171 Chng 6: Windows Form System.Windows.Forms.KeyPressEventArgs e) { base.OnKeyPress(e); if (e.KeyChar == (int)Keys.Escape) { // Xa text. this.SelectedIndex = -1; this.Text = ""; controlKey = true; } else if (Char.IsControl(e.KeyChar)) { controlKey = true; } else { controlKey = false; } } // Th c hi n thay th text. protected override void OnTextChanged(System.EventArgs e) { base.OnTextChanged(e); if (this.Text != "" && !controlKey) { // Tm ki m item trng kh p. string matchText = this.Text; int match = this.FindString(matchText); // N u tm th y th chn n vo. if (match != -1) { this.SelectedIndex = match; // Ch n (bi en) ph n text v a thm vo // n c th c thay th n u ng i dng ki p t c g. this.SelectionStart = matchText.Length; this.SelectionLength = this.Text.Length - this.SelectionStart; } } } }

th nghi m AutoCompleteComboBox, b n c th t o m t client n gi n: thm ComboBox vo form v thm m t s t (word) vo ComboBox. Trong v d ny, cc t c l y t m t file text v ComboBox c thm vo form b ng m l nh. B n cng c th bin d ch l p AutoCompleteComboBox thnh m t Class Library Assembly c l p r i thm n vo h p cng c , th l b n c th thm n vo form lc thi t k .
using using using using System; System.Windows.Forms; System.Drawing; System.IO;

public class AutoCompleteComboBoxTest : System.Windows.Forms.Form { // (B qua ph n m designer.)

private void AutoCompleteComboBox_Load(object sender,

172 Chng 6: Windows Form System.EventArgs e) { // Thm ComboBox vo form. AutoCompleteComboBox combo = new AutoCompleteComboBox(); combo.Location = new Point(10,10); this.Controls.Add(combo); // Thm m t s t (t m t 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); } } } }

Hnh 6.5 ComboBox c tnh nng auto-complete

6.10

Sp xp ListView theo ct bt k

B n c n s p x p m t ListView, nhng phng th c n i t i ListView.Sort ch s p x p cn c trn c t u tin. T o m t hi n th c cho giao di n System.Collections.IComparer c th s p x p cc i t ng ListViewItem (ki u IComparer c th s p x p d a trn b t k tiu chu n no b n mu n). Thi t l p thu c tnh ListView.ListViewItemSorter v i m t i t ng c a ki u IComparer tr c khi g i phng th c ListView.Sort.
ListView cung c p phng th c Sort s p cc item theo th t alphabet d a trn ph n text trong c t u tin. N u mu n s p x p d a trn cc gi tr c t khc ho c s p th t cc item theo b t k cch no khc, b n c n t o m t hi n th c ty bi n c a giao di n IComparer.

Giao di n IComparer nh ngha m t phng th c c tn l Compare, phng th c ny nh n vo hai i t ng v xc nh i t ng no s c s p tr c. L p ty bi n ListViewItemComparer d i y hi n th c giao di n IComparer v c p thm hai thu c tnh: Column v Numeric. Trong , Column cho bi t c t no s c s d ng s p x p; v Numeric l m t c Boolean, c thi t l p l true n u mu n th c hi n vi c 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 {

173 Chng 6: Windows Form 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;} } public ListViewItemComparer(int columnIndex) { Column = columnIndex; } public int Compare(object x, object y) { ListViewItem listX = (ListViewItem)x; ListViewItem listY = (ListViewItem)y; if (Numeric) { // Chuy n text thnh s tr c khi so snh. // N u chuy n i th t b i, s d ng 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 d ng chu i // v th c hi n so snh theo th t alphabetic. string listXText = listX.SubItems[Column].Text; string listYText = listY.SubItems[Column].Text; return String.Compare(listXText, listYText); } } }

By gi , s p x p ListView, b n c n t o m t i t ng ListViewItemComparer, c u hnh cho n m t cch h p l, v r i thi t l p n vo thu c tnh ListView.ListViewItemSorter tr c khi g i phng th c ListView.Sort.

174 Chng 6: Windows Form

Form d i y trnh by m t th nghi m n gi n cho ListViewItemComparer. M i khi ng i dng nh p vo header c a m t c t trong ListView th ListViewItemComparer s c t o ra v c s d ng s p x p danh sch d a trn c t .
using System; using System.Windows.Forms; public class ListViewItemSort : System.Windows.Forms.Form { // (B qua ph n m designer.)

private void ListView1_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e) { ListViewItemComparer sorter = new ListViewItemComparer(e.Column); ListView1.ListViewItemSorter = sorter; ListView1.Sort(); } }

6.11

Lin kt menu ng cnh vo iu kim

B n c n lin k t m t menu ng c nh vo m i i u ki m trn form (cc menu ny khc nhau). Tuy nhin, b n khng mu n vi t nhi u phng th c th l s ki n ring r hi n th menu ng c nh cho m i i u ki m. Vi t m t phng th c th l s ki n chung thu l y i t ng ContextMenu c k t h p v i i u ki m, v r i hi n th menu ny trn i u ki m. B n c th lin k t m t i u ki m v i m t menu ng c nh b ng cch thi t l p thu c tnh ContextMenu c a i u ki m. Tuy nhin, y ch l m t thu n l i hi n th menu ng c nh, b n ph i thu l y menu v g i phng th c Show c a n. Thng th ng, b n hi n th c logic ny trong phng th c th l s ki n MouseDown. Th c ra, logic dng hi n th i u ki m g. M i i u ki m Control), ngha l b n c th d th cc menu ng c nh cho t t c menu ng c nh hon ton gi ng nhau, khng quan tm n u h tr thu c tnh ContextMenu ( c th a k t l p c s dng vi t c m t phng th c th l s ki n chung hi n cc i u ki m.

V d , xt m t form g m m t Label, m t PictureBox, v m t TextBox. B n c th vi t m t phng th c th l s ki n MouseDown cho t t c cc i t ng ny. o n m d i y k t n i t t c cc s ki n ny vo m t phng th c th l s ki n 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);

Ph n m th l s ki n hon ton c dng chung. N ch p ki u sender thnh Control, ki m tra menu ng c nh, v hi n th n.
private void Control_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { if (e.Button == MouseButtons.Right) {

175 Chng 6: Windows Form // L y i u ki m ngu n. Control ctrl = (Control)sender; if (ctrl.ContextMenu != null) { // Hi n th menu ng c nh. ctrl.ContextMenu.Show(ctrl, new Point(e.X, e.Y)); } } }

6.12

S dng mt phn menu chnh cho menu ng cnh

B n c n t o m t menu ng menu chnh c a ng d ng.

c nh hi n th cc item gi ng v i m t s item trong sao l i m t ph n c a menu

S d ng phng th c CloneMenu c a l p MenuItem chnh.

Trong nhi u ng d ng, menu ng c nh c a m t i u ki m sao l i m t ph n c a menu chnh. Tuy nhin, .NET khng cho php b n t o m t i t ng MenuItem cng lc n m trong nhi u menu. Gi i php l t o b n sao c a m t ph n menu chnh b ng phng th c CloneMenu. Phng th c ny khng ch chp cc item MenuItem (v cc submenu), m cn ng k m i i t ng MenuItem v i cng phng th c th l s ki n. Do , khi ng i dng nh p vo m t item trong menu ng c nh (b n sao), phng th c th l s ki n tng ng s c th c thi nh th ng i dng nh p vo item trong menu chnh. V d , xt ng d ng th nghi m trong hnh 6.6. Trong v d ny, menu ng c nh cho TextBox i t ng hi n th cc item gi ng nh trong menu File. y chnh l b n sao c a cc MenuItem, nhng khi ng i dng nh p vo m t item, phng th c th l s ki n tng ng s c th c thi.

Hnh 6.6 Chp m t ph n menu chnh vo menu ng c nh

176 Chng 6: Windows Form

D i y l ph n m cho form t o v d ny. N s sao l i cc item trong menu chnh khi form c n p ( ng ti c l khng th thao tc v i cc item b n sao lc thi t k ).
using System; using System.Windows.Forms; using System.Drawing; public class ContextMenuCopy : System.Windows.Forms.Form { // (B qua ph n m designer.)

private void ContextMenuCopy_Load(object sender, System.EventArgs e) { ContextMenu mnuContext = new ContextMenu(); // Chp cc item t menu File vo menu ng c nh. foreach (MenuItem mnuItem in mnuFile.MenuItems) { mnuContext.MenuItems.Add(mnuItem.CloneMenu()); } // G n menu ng c nh 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."); } }

6.13

To form a ngn ng

B n c n t o m t form c th b n a ha (localizable form); ngha l form ny c th c tri n khai nhi u ngn ng khc nhau. Lu tr t t c cc thng tin b n a c th trong cc file resource (cc file ny s c bin d ch thnh Satellite Assembly).

177 Chng 6: Windows Form

.NET Framework h tr s b n a ha (localization) thng qua vi c s d ng file resource. t ng c b n l lu tr cc thng tin b n a c th (ch ng h n, ph n text c a m t Button) trong m t file resource. Sau , b n c th t o nhi u file resource cho nhi u b n a khc ng s nhau r i bin d ch chng thnh Satellite Assembly. Khi ch y ng d ng, .NET s t d ng ng Satellite Assembly d a trn cc thi t l p b n a (locale setting) c a my tnh hi n hnh. B n c th c v ghi cc file resource b ng m l nh. Tuy nhin, Visual Studio .NET cng h tr vi c thi t k cc form c b n a ha: 1. 2. Tr c tin, thi t l p thu c tnh Localizable c a form l true trong c a s Properties. Thi t l p thu c tnh Language c a form l b n a b n mu n nh p thng tin cho n (xem hnh 6.7). K , c u hnh cc thu c tnh c th b n a ha c a t t c cc i u ki m trn form. Thay v lu tr nh ng thay i ny trong ph n m thi t k form, Visual lu tr d li u c a b n. Studio .NET t o m t file resource m i L p l i b c 2 cho m i ngn ng b n mu n h tr . M i l n nh th , m t file resource m i s c t o ra. N u b n thay i thu c tnh Language thnh b n a m b n c u hnh th cc thi t l p tr c s xu t hi n tr l i, v b n c th ch nh s a chng.

3.

Hnh 6.7 Ch n m t ngn ng

b n

a ha form

By gi , b n c th bin d ch v th nghi m ng d ng trn cc h th ng b n a khc nhau. Visual Studio .NET s t o m t th m c v m t Satellite Assembly ring bi t i v i m i file resource trong d n. B n c th ch n Project | Show All Files t thanh trnh n c a Visual Studio .NET xem cc file ny c b tr nh th no (xem hnh 6.8). B n cng c th bu c ng d ng ch p nh n m t b n a c th b ng cch thay i thu c tnh Thread.CurrentUICulture. Tuy nhin, b n ph i thay i thu c tnh ny tr c khi form c n p.

178 Chng 6: Windows Form

Hnh 6.8 Satellite assembly cho b n using using using using System; System.Windows.Forms; System.Threading; System.Globalization;

a Vietnamese

public class MultiLingualForm : System.Windows.Forms.Form { private System.Windows.Forms.Label label1; // (B qua ph n m designer.)

static void Main() { Thread.CurrentThread.CurrentUICulture = new CultureInfo("vi"); Application.Run(new MultiLingualForm()); } }

B n cng c th s d ng ti n ch WinRes.exe (n m trong th m c \Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin) so n th o thng tin resource. N cung c p trnh so n th o form thu nh nhng khng c ch c nng ch nh s a m ngu n, r t h u d ng cho cc nh phin d ch v cc chuyn gia phi l p trnh c n nh p cc thng tin b n a c th.

179 Chng 6: Windows Form

Hnh 6.9 Ti n ch Windows Resource Localization Editor

Ngoi ti n ch trn, b n cng c th s d ng cc chng trnh chuyn dng b n a ha cc ng d ng, ch ng h n RC-WinTrans (b n c th t i b n dng th t i [http://www.schaudin.com]). Chng trnh ny cho php b n pht tri n cc d n ph n m m a ngn ng hay b n a ha cc ng d ng c s n trn n n Win32, .NET, v Java.

6.14

To form khng th di chuyn c


nh trn mn hnh v khng th

B n mu n t o m t form chi m gi m t v tr c di chuy n c.

T o m t form khng ng vi n b ng cch thi t l p thu c tnh FormBorderStyle c a form l None. B n c th t o m t form khng ng vi n b ng cch thi t l p thu c tnh FormBorderStyle l None. Cc form ny khng th di chuy n c. V chng cng khng c ki u ng vi n n u mu n c ng vi n xanh, b n ph i t thm vo b ng cch vi t m ho c s d ng hnh n n. Cn m t cch khc t ki m. Tr c tin, thi t l l false. K ti p, thi t l mu xm ho c ng k tng t nh Button. o form khng th di chuy n c v c ki u ng vi n gi ng i u p cc thu c tnh ControlBox, MinimizeBox, v MaximizeBox c a form p thu c tnh Text l chu i r ng. Khi , form s c ng vi n n i mu en (ty thu c vo ty ch n FormBorderStyle m b n s d ng),

180 Chng 6: Windows Form

6.15 Lm cho form khng ng vin c th di chuyn


c
B n mu n t o m t form khng c ng vi n nhng v n c th di chuy n c. i u ny c th g p trong tr ng h p b n c n t o m t c a s ty bi n c hnh dng c nh t v nh (v d , cc ng d ng game ho c media player). T o m t i u ki m p ng cho cc s ki n MouseDown, MouseUp, v MouseMove; v vi t m di chuy n form. Ng i dng th ng s d ng thanh tiu di chuy n form. Tuy nhin, form khng c ng vi n cng khng c thanh tiu . B n c th b vo thi u h t ny b ng cch thm m t i u ki m vo form ph c v cng m c ch. V d , form trong hnh 6.10 ch a m t Label h tr vi c ko r. Ng i dng c th nh p vo Label ny, v r i ko r form n m t v tr khc trn mn hnh trong lc gi chu t. Khi ng i dng di chuy n chu t, form t ng c di chuy n tng ng (form c g n v i con tr chu t).

Hnh 6.10 Form khng c ng vi n nhng v n c th di chuy n c

hi n th c gi i php ny, b n c n th c hi n cc b c sau: 1. 2. T o m t bi n c khng). m c-form dng theo v t form (form hi n c c ko r hay

Khi ng i dng nh p vo Label, c s c thi t l p cho bi t form ang ch ko r. Cng lc ny, v tr hi n th i c a chu t c ghi l i. B n c n thm logic ny vo phng th c th l s ki n Label.MouseDown. Khi ng i dng di chuy n chu t trn Label, form c di chuy n tng ng v tr c a chu t trn Label v n khng thay i. B n c n thm logic ny vo phng th c th l s ki n Label.MouseMove. Khi ng i dng th chu t, ch ko r c chuy n thnh off. B n c n thm logic ny vo phng th c th l s ki n Label.MouseUp.

3.

4.

D i y l ph n m hon ch nh cho form:


using System; using System.Windows.Forms; using System.Drawing; public class DragForm : System.Windows.Forms.Form { // (B qua ph n m designer.)

181 Chng 6: Windows Form // Bi n // N u // trn private c dng theo v t form. ang ch ko r, vi c di chuy n chu t Label s c chuy n thnh vi c di chuy n form. bool dragging;

// Lu tr offset (v tr c nh p 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 hi n t i c a chu t trong t a mn hnh. pointMoveTo = this.PointToScreen(new Point(e.X, e.Y)); pointMoveTo.Offset(-pointClicked.X, -pointClicked.Y); // Di chuy n 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(); } }

6.16

To mt icon ng trong khay h thng

B n c n t o m t icon ng trong khay h th ng (ch ng h n, cho bi t tnh tr ng c a m t tc v ang ch y). T o v hi n th NotifyIcon. S d ng m t Timer, Timer ny s pht sinh m t cch nh k (m i giy ch ng h n) v c p nh t thu c tnh NotifyIcon.Icon.

182 Chng 6: Windows Form

V i .NET Framework th r t d dng hi n th m t icon trong khay h th ng b ng NotifyIcon. B n ch c n thm i u ki m ny vo form, cung c p hnh icon b ng thu c tnh Icon. B n cng c th thm m t menu ng c nh vo i u ki m ny b ng thu c tnh ContextMenu (ty ch n). Khng gi ng v i cc i u ki m khc, NotifyIcon s t ng hi n th menu ng c nh khi n c nh p ph i. B n c th lm ng icon trong khay h th ng b ng cch thay i icon nh k. V d , chng trnh sau s d ng tm icon, th hi n hnh m t trng t khuy t n y. B ng cch d ch chuy n t hnh ny sang hnh khc, o gic v hnh ng s c t o ra.
using System; using System.Windows.Forms; using System.Drawing; public class AnimatedSystemTrayIcon : System.Windows.Forms.Form { // (B qua ph n m designer.) Icon[] images; int offset = 0; private void Form1_Load(object sender, System.EventArgs e) { // N p 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 th c th l s ki n ny pht sinh m i giy m t l n. notifyIcon.Icon = images[offset]; offset++; if (offset > 7) offset = 0; } }

6.17

Xc nhn tnh hp l ca u vo cho mt iu kim

B n c n c nh bo cho ng i dng khi c d li u khng h p l i u ki m (nh TextBox).

c nh p vo m t

S d ng ErrorProvider hi n th icon l i k bn i u ki m c l i. Ki m tra l i tr c khi cho php ng i dng ti p t c.

183 Chng 6: Windows Form

C m t s cch b n c th th c hi n vi c xc nh n tnh h p l trong m t ng d ng d atrn-Windows. M t cch ti p c n l p ng cc s ki n i u khi n vi c xc nh n tnh h p l v khng cho ng i dng thay i focus t i u ki m ny sang i u ki m khc n u l i x y ra. M t cch ti p c n khc l d ng c cho i u ki m c l i theo m t cch no ng i dng c th nhn th y t t c l i m t l t. B n c th s d ng cch ti p c n ny trong .NET v i i u ki m ErrorProvider. i u ki m provider c bi t, c s d ng hi n th icon l i k bn i u ki m c l i. B n c th hi n th icon l i k bn m t i u ki m b ng cch s d ng phng th c ErrorProvider.SetError, v ch nh i u ki m thch h p v m t chu i thng bo l i. ErrorProvider s hi n th icon l i m t cch t ng bn ph i i u ki m. Khi ng i dng a chu t ln icon l i, s xu t hi n thng bo chi ti t (xem hnh 6.11). Ch c n thm ErrorProvider vo form, b n c th s d ng n hi n th icon l i k bn m t i u ki m b t k. thm ErrorProvider, b n c th ko n vo khay thnh ph n (component tray) ho c t o n b ng m. o n m d i y ki m tra n i dung c a TextBox m i khi m t phm c nh n, xc nh n tnh h p l c a TextBox ny b ng m t bi u th c chnh quy (ki m tra n i dung trong TextBox c tng ng v i m t a ch e-mail h p l hay khng). N u n i dung ny khng h p l , ErrorProvider c s d ng hi n th thng bo l i. N u n i dung ny h p l , thng bo l i hi n c trong ErrorProvider s b xa. Cu i cng, phng th c th l s ki n Click cho nt OK s duy t qua t t c cc i u ki m trn form v xc nh n r ng khng i u ki m no c l i tr c khi cho php ng d ng ti p t c.
ErrorProvider l m t

Hnh 6.11 Form c xc nh n tnh h p l v i ErrorProvider using System; using System.Windows.Forms; using System.Text.RegularExpressions; public class ErrorProviderValidation : System.Windows.Forms.Form { // (B qua ph n m designer.)

private void txtEmail_TextChanged(object sender, System.EventArgs e) { 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.");

184 Chng 6: Windows Form } } 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(); } } }

6.18

Thc hin thao tc ko-v-th

B n c n s d ng tnh nng ko-v-th trao i thng tin gi a hai i u ki m (cng c th trong cc c a s ho c cc ng d ng khc nhau) Kh i ng thao tc ko-v-th b ng phng th c DoDragDrop c a l p Control, v p ng cho s ki n DragEnter v DragDrop. Thao tc ko-v-th cho php ng i dng chuy n thng tin t ni ny n ni khc b ng cch nh p vo m t item v r n n m t v tr khc. Thao tc ko-v-th g m ba b c c b n sau y: 1. 2. Ng i dng nh p vo i u ki m, gi chu t, v b t u r. N u i u ki m h tr tnh nng ko-v-th , n s thi t l p ring m t vi thng tin. Ng i dng r chu t ln m t i u ki m khc. N u i u ki m ny ch p nh n ki u n i dung c r 3. h n, con tr chu t s i thnh hnh mi tn v i trang gi y . . N u khng, con tr chu t s i thnh hnh trn v i m t v ch th ng bn trong

Khi ng i dng th chu t, d li u c g i l n m t cch thch h p. tr

n i u ki m, v i u ki m ny c th x

tnh nng ko-v-th , b n ph i th l cc s ki n DragEnter, DragDrop, v MouseDown. V d ny s d ng hai TextBox, y l o n m g n cc phng th c th l s ki n m chng ta s s d ng:

185 Chng 6: Windows Form 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);

b t u m t thao tc ko-v-th , b n hy g i phng th c DoDragDrop c a i u ki m ngu n. Lc ny, b n c n cung c p d li u v ch nh ki u ho t ng s c h tr (chp, di chuy n). V d d i y s kh i t o m t thao tc ko-v-th khi ng i dng nh p vo m t TextBox:
private void TextBox_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { TextBox txt = (TextBox)sender; txt.SelectAll(); txt.DoDragDrop(txt.Text, DragDropEffects.Copy); }

c th nh n d li u c r n, i u ki m ph i c thu c tnh AllowDrop l true. i u ki m ny s nh n s ki n DragEnter khi chu t r d li u ln n. Lc ny, b n c th ki m tra d li u ang c r n, quy t nh xem i u ki m c th ch p nh n vi c th hay khng, v thi t l p thu c tnh DragEventArgs.Effect tng ng, nh c trnh by trong o n m d i 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; } }

B c cu i cng l p ng cho s ki n DragDrop, s ki n ny x y ra khi ng i dng th chu t:


private void TextBox_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) { TextBox txt = (TextBox)sender; txt.Text = (string)e.Data.GetData(DataFormats.Text); }

S d ng cc o n m trn, b n c th t o m t ng d ng th nghi m tnh nng ko-v-th n gi n (xem hnh 6.12), cho php text c r t TextBox ny n TextBox khc. B n cng c th r text t m t ng d ng khc v th n vo m t trong hai TextBox ny.

186 Chng 6: Windows Form Hnh 6.12 M t ng d ng th nghi m tnh nng ko-v-th

6.19
B n mu n hi n th m t ch ang c ch n.

S dng tr gip cm-ng-cnh


c th trong file tr gip d a trn i u ki m hi n

S d ng thnh ph n System.Windows.Forms.HelpProvider, v thi t l p cc thu c tnh m r ng (extender property) HelpKeyword v HelpNavigator cho m i i u ki m. tnh nng tr gip c m-ng -c nh (context-sensitive help) thng qua l p HelpProvider. L p ny l m t i u ki m m r ng c bi t. Khi b n thm n vo khay thnh ph n (component tray), n s thm m t s thu c tnh vo t t c cc i u ki m trn form. V d , hnh 6.13 trnh by m t form g m hai i u ki m v m t HelpProvider. ListBox (hi n ang c ch n) c thm cc thu c tnh HelpKeyword, HelpNavigator, v HelpString (do HelpProvider c p). s d ng tr gip c m-ng -c nh v i HelpProvider, b n c n th c hi n ba b c sau y: 1. 2. 3. Thi t l p thu c tnh HelpProvider.HelpNamespace l tn c a file tr gip (ch ng h n, myhelp.chm). i v i m i i u ki m yu c u tr gip c m-ng -c nh, hy thi t l p thu c tnh m r ng
HelpNavigator l HelpNavigator.Topic.

.NET h

tr

i v i m i i u ki m yu c u tr gip c m-ng -c nh, hy thi t l p thu c tnh m r ng lin k t v i i u ki m ny (tn ch ph i c trong file tr gip v c th c c u hnh trong cc cng c t o file tr gip).
HelpKeyword l tn c a ch

Hnh 6.13 Cc thu c tnh m r ng do HelpProvider c p cho ListBox

N u ng i dng nh n phm F1 trong khi m t i u ki m no ang nh n focus, file tr gip s c m m t cch t ng v ch lin k t v i i u ki m ny s c hi n th trong c a s tr gip. N u ng i dng nh n phm F1 trong khi ang trn m t i u ki m khng c ch tr gip (v d , GroupBox ho c Panel), cc thi t l p tr gip cho i u ki m n m bn trong s c s d ng. N u khng c i u ki m no n m bn trong ho c i u ki m n m bn trong

187 Chng 6: Windows Form

khng c thi t l p tr gip no, cc thi t l p tr gip cho form s c s d ng. N u cc thi t l p tr gip cho form cng khng c, HelpProvider s m b t k file tr gip no c nh ngha m c d n. B n cng c th s d ng cc phng th c c a HelpProvider thi t l p ho c s a i nh x tr gip c m-ng -c nh lc th c thi.

6.20

p dng phong cch Windows XP


i c a Windows XP trn h th ng

B n mu n cc i u ki m mang dng d p hi n Windows XP.

Thi t l p thu c tnh FlatStyle l FlatStyle.System cho t t c cc i u ki m c h tr thu c tnh ny. Trong .NET Framework phin b n 1.0, b n ph i t o m t file manifest. Cn trong .NET Framework phin b n 1.1, b n ch c n g i phng th c Application.EnableVisualStyles. Phong cch Windows XP t ng c p d ng cho vng non-client c a form (nh ng vi n, cc nt minimize v maximize). Tuy nhin, chng s khng c p d ng cho cc i u ki m nh Button v GroupBox tr khi b n th c hi n thm m t vi b c n a. Tr c h t, b n ph i c u hnh t t c cc i u ki m d ng nt trn form (nh Button, CheckBox, v RadioButton). Cc i u ki m ny cung c p thu c tnh FlatStyle, m thu c tnh ny ph i c thi t l p l System. B c k ti p ty thu c vo phin b n .NET b n ang s d ng. N u ang s d ng .NET Framework phin b n 1.1, b n ch c n g i phng th c Application.EnableVisualStyles tr c khi cho hi n th form. V d , b n c th kh i t o ng d ng v i phng th c Main nh sau:
public static void Main() { // Kch ho t visual styles. Application.EnableVisualStyles(); // Hi n th main form. Application.Run(new StartForm) }

N u ang s d ng .NET Framework phin b n 1.0, b n khng c s tr gip c a phng th c Application.EnableVisualStyles. Tuy nhin, b n v n c th s d ng phong cch ny b ng cch t o m t file manifest cho ng d ng c a b n. File manifest ny (ch l m t file vn b n thng th ng v i n i dung XML) s bo v i Windows XP r ng ng d ng c a b n yu c u phin b n m i c a file comctl32.dll (file ny c trn t t c cc my tnh Windows XP). Windows XP s c v p d ng cc thi t l p t file manifest m t cch t ng, n u file manifest c t trong th m c ng d ng v c tn trng v i tn file th c thi ng d ng cng ph n m r ng l .manifest (v d , TheApp.exe s c file manifest l TheApp.exe.manifest m c d n trng gi ng c hai ph n m r ng). D i y l m t file manifest. B n c th chp file ny cho cc ng d ng c a b nch c n i tn n cho ph h p. B n cng c n i gi tr name (in m) thnh tn ng d ng, m c d i u ny khng th t s c n thi t.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

188 Chng 6: Windows Form <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 xu t hi n trong mi tr ng thi t k c a Visual Studio .NET. Do , th nghi m k thu t ny, b n c n ph i ch y ng d ng. Tuy nhin, b n v n c th lm cho mi tr ng thi t k c a Visual Studio .NET hi n th theo phong cch Windows XP b ng cch thm file devenv.exe.manifest vo th m c \Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE.

Hnh 6.14 Phong cch Windows XP v phong cch kinh i n

N u b n p d ng file manifest cho m t ng d ng ang ch y trn phin b n Windows tr c Windows XP, n s b b qua, v phong cch kinh i n s c s d ng. V l do ny, b n nn th nghi m ng d ng c a b n c khi c v khng c file manifest.

6.21
B n mu n thay i c c a form

Thay i c ca form
n trong su t hn khi xu t hi n

189 Chng 6: Windows Form

Thi t l p thu c tnh Opacity c a form v i m t gi tr n m gi a 0% v 100%. Thu c tnh Opacity c a m t form ki m sot m c c hay trong c a m t c a s . m c 100%, form xu t hi n v i tr ng thi m c nh, ngha l khng c cc vng trong su t trn form. m c 0%, form hon ton trong su t, cng c ngha b n khng th tng tc v i form c n a. Khi thay v 1.0: i c c a m t form b ng m l nh, b n ph i s d ng m t s th c n m gi a 0.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; }

N u ch mu n trong su t nh ng vng no trn form, b n hy s d ng thu c tnh TransparencyKey. B n nh ngha thu c tnh ny l m t mu no . N u b t k ph n no c a form trng v i mu , n s tr nn trong su t. Hnh 6.15 trnh by m t form v i c 80%. Chng ta t m t i u ki m Panel ln form v thi t l p mu n n c a Panel l mu m ta nh ngha trong thu c tnh TransparencyKey c a form. Nh th , form s trong su t trn vng thu c Panel.

Hnh 6.15 M t form v i c 80% v m t Panel c mu n n gi ng v i thu c tnh TransparencyKey c a form

B n c th b t g p m t s ng d ng dng hnh bitmap lm giao di n ng i dng, nh t l cc ki u media player. B n c th t o ki u giao di n th ny b ng cch t o m t hnh bitmap v i nh ng vng no c mu l mu m b n mu n trong su t. K ti p, thi t l p thu c tnh

190 Chng 6: Windows Form BackgroundImage c a form l file bitmap m b n

t o. Cu i cng, thi t l p thu c tnh TransparencyKey c a form l mu m b n mu n trong su t trong hnh bitmap.
Bitmap Img = ((Bitmap)(Bitmap.FromFile("C:\\Example.bmp"))); // Mu t i Pixel(10,10) c s d ng lm mu trong su t. Img.MakeTransparent(Img.GetPixel(10, 10)); this.BackgroundImage = Img; this.TransparencyKey = Img.GetPixel(10, 10);

B n cng c th g b thanh tiu c a form b ng cch thi t l p FormBorderStyle l None (xem m c 6.14). form c th di chuy n c trong tr ng h p ny, b n hy p d ng m c 6.15. Trn y l m t cch t o form c hnh dng b t th ng, m t cch khc s c trnh by trong m c 8.3.

191

Chng 7: ASP.NET V WEB FORM

192

193 Chng 7: ASP.NET v Web Form

icrosoft ASP.NET l m t n n dng pht tri n cc ng d ng Web, v n l m t ph n c a Microsoft .NET Framework. ASP.NET cho php b n vi t d ch v Web XML (s c th o lu n trong chng 12) v pht tri n website ( c th o lu n trong chng ny). Cc trang ASP.NET s d ng m hnh i u ki m d a-trn-s -ki n, khi n cho vi c vi t m cho chng cng tng t nh vi t m cho cc ng d ng d a-trn-Windows thng th ng. Tuy nhin, s tng t ny c th l gi t o. Nh h u h t cc nh pht tri n ASP.NET ch ng th c, cc ng d ng Web c cch di n t ring c a chng. V d , b n s c n th c hi n thm cc b c duy tr tr ng thi, chuy n thng tin gi a cc trang, th l nh ng s ki n pha client, th c hi n xc th c, v b o m hi u nng t i u khi s d ng c s d li u. Chng ny s xem xt t t c cc v n ny.

Chng ny s khng gi i thi u v ASP.NET. Thay vo , chng ny s gip nh ng nh pht tri n ASP.NET trung c p gi i quy t nh ng v n th ng g p. tm hi u cn b n v ASP.NET, hy vo trang [http://www.asp.net] ho c tham kh o cc ti li u khc chuyn v ASP.NET. Cc m c trong chng ny trnh by cc v n sau y: Chuy n h ng cc yu c u c a ng i dng (m c 7.1). Duy tr tr ng thi gi a cc yu c u trang (m c 7.2 v 7.3). S d ng JavaScript 7.6). c i ti n giao di n v i cc tnh nng pha client (m c 7.4, 7.5, v

Cho php ng i dng upload file (m c 7.7). Xc th c client theo hai cch: Xc th c tch h p v i Windows (m c 7.8) v xc th c d a-trn-form (m c 7.9). Xc nh n tnh h p l c a (m c 7.10). u vo m khng s d ng i u ki m validator c a ASP.NET

T o ng i u ki m web (m c 7.11), hnh nh (m c 7.12), v i u ki m ng i dng (m c 7.13). C i thi n hi u nng v i output-caching (m c 7.14) v data-caching (m c 7.15). Gi i quy t thng bo l i Unable to start debugging on the Web server (m c 7.16). Thay 7.17). i ng c nh ti kho n Windows m m t ng d ng ASP.NET ch y trong (m c

Chng ny s d ng cc l p web c b n thu c khng gian tn System.Web v cc l p i u ki m web thu c khng gian tn System.Web.UI.WebControls. Khi s d ng cc l p trong cc khng gian tn ny, tn l p y s khng c ch nh.

7.1

Chuyn hng ngi dng sang trang khc


B n c n chuy n s th c thi t m t trang ASP.NET sang m t trang khc, ho c b n mu n chuy n ng i dng n m t site hon ton khc.

194 Chng 7: ASP.NET v Web Form

S d ng phng th c HttpResponse.Redirect chuy n ng i dng n m t URL m i, ho c s d ng phng th c HttpServerUtility.Transfer (nhanh hn) chuy n ng i dng n m t Web Form ASP.NET khc trn cng server. Cch d nh t chuy n ng i dng t m t trang ny n m t trang khc l s d ng phng th c HttpResponse.Redirect v c p m t URL m i. B n c th truy xu t i t ng HttpResponse hi n t i thng qua i t ng HttpContext ho c s d ng thu c tnh Reponse c a i t ng Page ho c Control. Phng th c th l s ki n d i y ( p ng cho m t c nh p chu t vo Button) s chuy n ng i dng n m t trang ASP.NET m i:
private void cmdRedirect_Click(object sender, System.EventArgs e) { Response.Redirect("newpage.aspx"); }

Phng th c Redirect c th lm vi c v i URL tng i (ch n nh ng ti nguyn trong cng th m c o), v v i URL y . URL c th ch n trang ASP.NET khc, ki u ti li u khc (nh trang HTML ho c hnh nh), v web-server khc. Phng th c Redirect g i ch th chuy n h ng n trnh duy t. K , trnh duy t s yu c u trang m i. K t qu l trnh duy t ph i th c hi n hai chuy n n web-server, v webserver ph i x l thm m t yu c u n a. M t ty ch n hi u qu hn l s d ng phng th c HttpServerUtility.Transfer, phng th c ny s chuy n s th c thi n m t trang ASP.NET khc trn cng web-server. V d :
private void cmdRedirect_Click(object sender, System.EventArgs e) { Server.Transfer("newpage.aspx"); }

Phng th c Transfer khng c n thm m t chuy n n client, nhng n s khng lm vi c n u b n c n chuy n s th c thi n m t server khc ho c m t ki u ti nguyn khc v i Web Form (bao g m trang ASP c i n).

7.2

Duy tr trng thi gia cc yu cu ca trang


B n c n lu tr vi thng tin trang. c th c a ng i dng gi a cc l n postback c a

S d ng view state (tr ng thi nhn), query string argument ( i s chu i truy v n), session state (tr ng thi phin lm vi c), ho c cookie, ty thu c vo nhu c u c a b n. ASP.NET l m postback c N u mu n gi ki u qu n l tr t m hnh l p trnh phi tr ng thi (stateless programming model). M i khi m t pht sinh, m s n p vo b nh , th c thi, v c gi i phng kh i b nh . l i v t c a thng tin sau khi m hon t t vi c x l, b n ph i s d ng cc ng thi (state management).

ASP.NET cung c p nhi u cch lu tr thng tin, hay tr ng thi, gi a cc yu c u (request). Ki u tr ng thi m b n s d ng cho bi t: thng tin s s ng bao lu, s c lu tr u, v s c b o m t nh th no. B ng 7.1 li t k nh ng ty ch n tr ng thi khc nhau c c p

195 Chng 7: ASP.NET v Web Form

b i ASP.NET. B ng ny khng ch a th i v s c m t trong m c 7.5.

i t ng Cache,

i t ng ny cung c p kho lu tr t m i

C php cho cc phng php lu tr d li u l nh nhau. D li u c lu tr trong m t t ng t p h p v c nh ch m c b ng m t tn chu i.


B ng 7.1 Cc ki u qu n l tr ng thi
Ki u tr ng thi D li u c php V tr lu tr Th i gian s ng B om t

View state

T t c cc ki u d li u kh -tu nt -ha .NET.

M t tr ng n trong trang web hi n hnh.

B m t khi ng i dng chuy n sang m t trang khc.

M c nh l khng an ton. Tuy nhin, b n c th s d ng cc ch th trang th c hi n m t ha v bm ngn d li u b ph.

Query string

D li u chu i.

Chu i URL c a trnh duy t.

B m t khi ng i dng nh p m t URL m i ho c ng trnh duy t. Tuy nhin, n c th c lu tr trong m t bookmark. H t hi u l c sau m t kho ng th i gian c nh ngha tr c (th ng l 20 pht, nhng kho ng th i gian ny c th thay i c). c thi t l p b i l p trnh vin. C th c s d ng trong nhi u trang v c th v n cn gi a cc l n vi ng thm.

Ng i dng c th nhn th y c v ch nh s a d dng.

Session state

T t c cc ki u d li u kh -tu nt -ha .NET.

B nh server (c th c c u hnh cho m t ti n trnh ho c c s d li u bn ngoi). My tnh client (trong b nh ho c m t file text, ty thu c vo cc thi t l p cho th i gian s ng c a n).

An ton v d li u khng bao gi c chuy n cho client.

Cookie

D li u chu i.

Khng an ton, v c th b ng i dng ch nh s a.

196 Chng 7: ASP.NET v Web Form

Applicatio n state

T t c cc ki u d li u kh -tu nt -ha .NET.

B nh server.

Th i gian s ng c a ng d ng (cho n khi server c kh i ng l i). Khng gi ng v i cc phng php khc, d li u ng d ng l ton c c i v i t t c cc ng i dng.

An ton v d li u khng bao gi c chuy n cho client.

Hnh 7.1 trnh by m t trang web th nghi m cc ki u qu n l tr ng thi khc nhau. Khi ng i dng nh p vo nt Store Data, m t i t ng System.DateTime s c t o ra v c lu tr trong view state, session state, v m t cookie ty bi n. Khi ng i dng nh p vo nt Get Data, thng tin ny s c l y ra v hi n th . Cu i cng, nt Clear Data s xa thng tin ny trong t t c cc tr ng thi.

Hnh 7.1 Th nghi m cc ki u qu n l tr ng thi

D i y l ph n m cho trang:
using using using using System; System.Web; System.Web.UI.WebControls; System.Web.SessionState;

public class TestState : System.Web.UI.Page { protected protected protected protected // (B System.Web.UI.WebControls.Button cmdClear; System.Web.UI.WebControls.Button cmdStore; System.Web.UI.WebControls.Button cmdGetData; System.Web.UI.WebControls.Label lblData;

qua ph n m designer.)

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

197 Chng 7: ASP.NET v Web Form // T o i t ng th nghi m. DateTime now = DateTime.Now; // Lu tr i t ng trong view state. ViewState["TestData"] = now; // Lu tr i t ng trong session state. Session["TestData"] = now; // Lu tr i t ng trong m t cookie ty bi n. // Ki m tra xem cookie t n t i hay cha (c tn l 07-02). if (Request.Cookies["07-02"] == null) { // T o cookie. HttpCookie cookie = new HttpCookie("07-02"); // Cookie ch c th // N c th lu tr // m i gi tr ng v cookie["TestData"] = lu tr d li u chu i. nhi u gi tr , i m t kha khc nhau. now.ToString();

// (B n c th ch nh s a cc thu c tnh // c a cookie thay i ngy h t hi u l c.) // G n cookie vo p ng. // N s c cung c p v i t t c cc yu c u // site ny cho n khi h t hi u l c. Response.Cookies.Add(cookie); } } private void cmdGetData_Click(object sender, System.EventArgs e) { lblData.Text = ""; // Ki m 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>"; } // Ki m 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>"; } n

198 Chng 7: ASP.NET v Web Form // Ki m tra thng tin trong cookie ty bi n. HttpCookie cookie = Request.Cookies["07-02"]; if (cookie != null) { string cookieData = (string)cookie["TestData"]; lblData.Text += "<b>Cookie data:</b> " + 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; // (B n cng c th s d ng Session.Abandon // thng tin trong session state.) // xa cookie, b n ph i thay n thnh // m t cookie v t qu ngy h t hi u l c. HttpCookie cookie = new HttpCookie("07-02"); cookie.Expires = DateTime.Now.AddDays(-1); Response.Cookies.Add(cookie); } }

xa t t c

M t ki u tr ng thi m trang ny khng th hi n l query string (chu i truy v n). Query string i h i m t chuy n h ng trang, l t ng cho vi c chuy n thng tin t trang ny n trang khc. thi t l p thng tin, b n ph i chuy n h ng ng i dng n m t trang m i v thm cc i s query string vo cu i URL. B n c th s d ng phng th c HttpServerUtility.UrlEncode v UrlDecode b o m d li u chu i l URL h p l .
DateTime now = DateTime.Now; string data = Server.UrlEncode(now.ToString()); Response.Redirect("newPage.aspx?TestData=" + data);

l y thng tin ny, b n c th s d ng t p h p HttpResponse.QueryString:


// Ki m tra thng tin trong query string. if (Request.QueryString["TestData"] != null) { string data = Request.QueryString["TestData"]; data = Server.UrlDecode(data); lblData.Text += "<b>Found query string data:</b> " + data + "<br>"; }

7.3

To cc bin thnh vin c trng thi cho trang


B n c n t o cc bi n thnh vin trong l p trang v b o c gi l i khi trang c post-back. m cc gi tr c a chng

Ph n ng v i s ki n Page.PreRender, v ghi t t c cc bi n thnh vin vo view state. Ph n ng v i s ki n Page.Load, v l y t t c cc gi tr c a cc bi n thnh

199 Chng 7: ASP.NET v Web Form

vin t view state. Ph n m cn l i c a b n gi y c th tng tc v i cc bi n ny m khng ph i lo l ng cc v n v tr ng thi. ASP.NET cung c p nhi u c ch tr ng thi, nh c m t trong m c 7.2. Tuy nhin, b n khng th s d ng chng m t cch t ngt t c u i h i m t o n m t thng tin vo v l y thng tin ra. B n c th th c hi n cc cng vi c ny m t l n. Khi , ph n m cn l i c a b n c th tng tc tr c ti p v i bi n thnh vin. cch ti p c n ny c th lm vi c c, b n c n c cc gi tr c a bi n vo u m i postback. S ki n Page.Load l m t ch n l a l t ng cho o n m ny v n lun pht sinh tr c b t c s ki n i u khi n no khc. B n c th s d ng phng th c th l s ki n Page.Load kh i d ng t t c cc bi n. Ngoi ra, b n c n lu tr t t c cc bi n tr c khi trang c g i cho ng i dng, sau khi t t c vi c x l hon t t. Trong tr ng h p ny, b n c th p ng cho s ki n Page.PreRender, v s ki n ny pht sinh sau t t c cc phng th c th l s ki n khc, ch tr c khi trang c chuy n thnh HTML v g i cho client. Trang v d
memberValue: using System; using System.Web; using System.Web.UI.WebControls; public class StatefulMembers : System.Web.UI.Page { // (B qua ph n m designer.)

sau

y trnh by cch duy tr m t bi n thnh vin c a trang c tn l

private int memberValue = 0; private void Page_Load(object sender, System.EventArgs e) { // N p l i t t c cc bi n thnh vin. if (ViewState["memberValue"] != null) { memberValue = (int)ViewState["memberValue"]; } } private void StatefulMembers_PreRender(object sender, System.EventArgs e) { // Lu t t c cc bi n thnh vin. ViewState["memberValue"] = memberValue; // Hi n th gi tr . lblCurrent.Text = memberValue.ToString(); } // (Cc phng th c th l s ki n khc gi y // c th lm vi c tr c ti p v i memberValue.) }

7.4

p ng cc s kin pha client vi JavaScript


B n c n thm m JavaScript vo m t Web Form.

200 Chng 7: ASP.NET v Web Form

Page.RegisterClientScriptBlock

nh ngha hm JavaScript trong m t chu i, v s d ng phng th c chn hm JavaScript vo trang c tr v . Khi , b n c th thm cc c tnh i u khi n g i cc hm ny.

ASP.NET l m t m hnh l p trnh a nng. ng ti c, m t khi trang c tr v d ng HTML, b n khng th th c thi b t k m .NET no n a m khng ph i pht sinh postback n server. H n ch ny lm gi m tnh hi u qu c a cc trang web c tnh tng tc (ch ng h n, xc nh n tnh h p l c a u vo). D nhin, khng c l do g khi n b n khng th tr n ch c nng JavaScript pha client vo m .NET. M c d .NET khng ch a b t k giao di n i t ng no t o JavaScript, nhng b n c th chn n vo trang b ng tay. C m t cch th c hi n vi c ny l thi t l p c tnh i u khi n. V d , TextBox d i y s hi n th m t MessageBox khi n m t focus:
TextBox1.Attributes.Add("onBlur", "alert('The TextBox has lost focus!');");

Th TextBox s

c tr v d ng HTML nh sau:
... />

<input name="TextBox1" type="text" id="TextBox1" onBlur="alert('The text box has lost focus!');"

Trong tr ng h p ny, b n s d ng hm JavaScript alert (n i t i) v s ki n JavaScript onBlur (pht sinh khi m t i u ki m m t focus). H u h t cc ph n t HTML u h tr cc s ki n sau y:
onFocusx y ra khi m t i u ki m nh n focus. onBlurx y ra khi m t i u ki m m t focus. onClickx y ra khi ng i dng nh p vo m t i u ki m. onChangex y ra khi ng i dng thay

i gi tr c a i u ki m no .

onMouseOverx y ra khi ng i dng di chuy n con tr chu t trn m t i u ki m.

M t cch khc chn m JavaScript l nh ngha m t hm JavaScript trong m t bi n chu i r i l nh cho ASP.NET chn n vo trang web c tr v . N u lm theo cch ny, b t k i u ki m no cng c th g i hm p ng cho m t s ki n JavaScript. V d d i y s lm r k thu t ny b ng m t trang web g m m t b ng v m t b c hnh (xem hnh 7.2). Khi ng i dng di chuy n chu t ln cc trong b ng th hai hm JavaScript ty bi n s c s d ng: m t t o highlight cho hi n t i v m t g b highlight kh i tr c . Ngoi ra, hm t o highlight cn thay i URL c a b c hnh ty thu c vo c t no ang c ch n. N u ng i dng a chu t ln c t th nh t, hnh m t c i s c hi n th . N u ng i dng a chu t ln c t th hai ho c th ba, hnh quy n sch v i d u ch m h i nh p nhy s c hi n 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 ph n m designer.)

201 Chng 7: ASP.NET v Web Form 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';}" + ";}" + "</script>"; string unhighlightScript = "<script language=JavaScript> " + "function UnHighlightCell(cell) {" + "cell.bgColor = '#FFFFFF';" + "}" + "</script>"; // // // // // // if } if (!this.IsClientScriptBlockRegistered("UnHighlight")) { Page.RegisterClientScriptBlock("UnHighlight", unhighlightScript); } // Thi t l p c tnh cho m i trong b ng. foreach (TableRow row in Table1.Rows) { foreach (TableCell cell in row.Cells) { cell.Attributes.Add("onMouseOver", "HighlightCell(this);"); cell.Attributes.Add("onMouseOut", "UnHighlightCell(this);"); } } } Chn hm JavaScript vo trang (n s xu t hi n ngay sau th <form runat=server>). Ch r ng m i kh i k ch b n c k t h p v i m t tn chu i. i u ny cho php nhi u i u ki m ng k cng kh i k ch b n, trong khi v n b o m n s c tr v ch m t l n trong trang cu i cng. (!this.IsClientScriptBlockRegistered("Highlight")) { Page.RegisterClientScriptBlock("Highlight", highlightScript);

202 Chng 7: ASP.NET v Web Form

Hnh 7.2 Hm JavaScript t o highlight cho hi n t i

B n c n hi u r tnh b o m t c a JavaScript. T t c m JavaScript c tr v tr c ti p trong trang HTML, v ng i dng c th xem xt n. Do , b n ng bao gi t b t k gi i thu t ho c thng tin b m t no vo m JavaScript. Ngoi ki m tra tnh h p l ch l m t ti u x o, khng ph i ra, b n s d ng JavaScript l m t phng cch ngn cc hnh ng khng h p l , b i ng i dng c th v hi u ho c ph h ng JavaScript trong trnh duy t c a h .

7.5

Hin th ca s pop-up vi JavaScript


B n c n hi n th m t c a s pop-up dng. p ng cho m t hnh ng c a ng i

ng k m t hm JavaScript (ho c thm m t d ng hm JavaScript window.open.

c tnh i u khi n s ki n), v s

V t t c m ASP.NET th c thi trn server nn khng c cch no hi n th m t c a s m i ng m trong m t c a t m C#. B n c th thm siu lin k t vo m t trang sao cho n t s m i b ng cch thi t l p c tnh target c a th <a> l _blank, nhng cch ny v n khng cung c p kh nng i u khi n kch th c ho c ki u c a c a s . Gi i php m c a s pop-up l s d ng m JavaScript. C a s pop-up c th l m t trang HTML, m t trang ASP.NET, m t file hnh, ho c b t k ki u ti nguyn no c th c m trong trnh duy t c a client. m m t c a s pop-up, b n c n s d ng hm window.open v ch nh ba thng s . Thng s th nh t l lin k t n trang m i, thng s th hai l tn frame c a c a s , v thng s th ba l m t chu i cc c tnh (phn cch b ng d u ph y) c u hnh ki u v kch th c c a c a s pop-up. Cc c tnh ny bao g m: c tnh height v width c thi t l p l cc gi tr tnh theo pixel. c tnh toolbar, menubar, v scrollbarsc th c thi t l p l yes hay no, ty thu c vo b n mu n hi n th cc ph n t ny hay khng.

203 Chng 7: ASP.NET v Web Form

c tnh resizablec th c thi t l p l yes hay no, ty thu c vo b n mu n ng vi n c a s l c nh hay c th thay i kch th c c.

V d d i y trnh by cch m m t trang ASP.NET th hai trong m t c a s pop-up khi ng i dng nh p vo m t Button.

Hnh 7.3 Hi n th c a s pop-up

B n c n thm o n m ny vo phng th c th l s ki n 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 o n m (trong phng th c th l s ki n Page.Load) dng up m t cch t ng khi trang c hi n th :


string popupScript = "<script language='javascript'>" + "window.open('PopUp.aspx', " + "'CustomPopUp', " + "'width=200, height=200, menubar=yes, resizable=no')" + "</script>"; Page.RegisterStartupScript("PopupScript", popupScript);

hi n th c a s pop-

7.6
B n c n ch ng i dng.

Thit lp focus cho iu kim


nh i u ki m no s nh n focus khi trang c tr v v g i cho

T o m t l nh JavaScript thi t l p focus, v thm n vo trang b ng phng th c Page.RegisterStartupScript.

204 Chng 7: ASP.NET v Web Form

i u ki m web ASP.NET khng cung c p cch thi t l p focus cho i u ki m, m ch cung c p thu c tnh TabIndex thi t l p th t tab. Nhng thu c tnh ny ch p d ng cho Microsoft Internet Explorer v khng th c s d ng thi t l p focus cho i u ki m do b n ch n. v t qua h n ch ny, b n c n s d ng n m JavaScript. Phng th c d i y s th c hi n cng vi c ny. N nh n vo m t tham chi u n b t k i t ng i u ki m no, thu l y ClientID k t giao (m JavaScript ph i s d ng ID ny tm n i u ki m), r i t o d ng v ng k k ch b n thi t l p focus.
private void SetFocus(Control ctrl) { // nh ngha l nh JavaScript. // Di chuy n focus n i u ki m b n mu n. string setFocus = "<script language='javascript'>" + "document.getElementById('" + ctrl.ClientID + "').focus();</script>"; // Thm m JavaScript vo trang. this.RegisterStartupScript("SetFocus", setFocus); }

N u thm phng th c ny vo m t Web Form, b n c th g i SetFocus khi c n. V d d i y s thi t l p focus khi trang n p l n u tin:
private void Page_Load(object sender, System.EventArgs e) { if (!this.IsPostBack) { // Chuy n focus n m t TextBox c SetFocus(TextBox1); } } th .

7.7
S d ng

Cho php ngi dng upload file


B n c n t o m t trang cho php ng i dng upload m t file. i u ki m HtmlInputFile, thi t l p ki u m ha c a form l
multipart/form-data, v lu file b ng phng th c HtmlInputFile.PostedFile. SaveAs.

V ASP.NET th c thi trn server nn khng c cch no truy xu t cc ti nguyn trn my client, bao g m file. Tuy nhin, b n c th s d ng i u ki m System.Web.UI. HtmlControls.HtmlInputFile cho php ng i dng upload m t file. i u ki m ny tr v ph n t HTML <input type="file">, hi n th m t nt Browse v m t h p ch a tn file. Ng i dng nh p vo nt Browse v ch n m t file. B c ny di n ra m t cch t ng v khng i h i b t k o n m ty bi n no. Sau , ng i dng ph i nh p vo m t nt khc (b n ph i t o nt ny) b t u qu trnh upload. t o m t trang cho php upload file, b n c n th c hi n cc b c sau y: Thi t l p ki u m ha c a form l multipart/form-data. th <form> trong file .aspx v i u ch nh nh sau: th c hi n thay i ny, tm

<form id="Form1" enctype="multipart/form-data" runat="server">

205 Chng 7: ASP.NET v Web Form

Thm i u ki m HtmlInputFile vo trang. Trong Microsoft Visual Studio .NET, b n s tm th y i u ki m ny d i th HTML c a h p cng c , v i tn l File Field. M t khi thm i u ki m ny, b n nh p ph i vo n v ch n Run As Server Control t o th <input type="file" runat="server">. Thm m t Button khc b t u qu trnh chuy n giao file c ch phng th c HtmlInputFile.PostedFile.SaveAs).
System; System.Web; System.Web.UI.WebControls; System.IO;

nh (b ng

D i y l ph n m cho trang upload file:


using using using using

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 ph n m designer.)

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) { // C m cc file l n hn 1 megabyte. lblInfo.Text = "File is too large."; }else { // File c lu v n gi l i tn file g c c a n. string fileName = Path.GetFileName(FileInput.PostedFile.FileName); // Ti n trnh ASP.NET ph i c quy n i v i // v tr n th c hi n lu file, n u khng // ngo i l "access denied" s x y ra. FileInput.PostedFile.SaveAs(fileName); lblInfo.Text = "File " + fileName + " uploaded."; } }catch (Exception err) { lblInfo.Text = err.Message; } } } }

206 Chng 7: ASP.NET v Web Form

Hnh 7.4 Trang th nghi m upload file

B n c th ki m tra cc thu c tnh c a file c ch nh (bao g m kch th c c a n) tr c khi lu ngn ki u t n cng t ch i d ch v (l a ng d ng ASP.NET upload cc file l n lm y a c ng). Tuy nhin, o n m ny khng ngn ng i dng submit file ngay t u, i u ny v n c th lm ch m server v c s d ng m m t ki u t n cng t ch i d ch v khcn m l y t t c cc ti u trnh th ASP.NET ang r nh. ngn ch n ki u t n cng ny, b n hy s d ng th <httpruntime> trong file Web.config ch nh kch th c t i a c a file (tnh theo kilobyte):
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> <httpRuntime maxRequestLength="4096" /> <!-- B qua cc thi t l p khc. --> </system.web> </configuration>

N u b n khng ch nh kch th c t i a, gi tr m c nh 4096 (4 megabyte) s p d ng. N u ng i dng cung c p m t file qu l n, m t ngo i l s pht sinh ngay khi trang c post-back. C m t cch khc g i file t client ln web-server l s d ng d ch v Web XML ASP.NET. B n c n pht tri n m t ng d ng d a-trn-Windows cho php ng i dng ch n m t file v r i giao ti p v i m t d ch v Web XML chuy n giao thng tin.

7.8

S dng IIS authentication


B n c n ngn ng i dng truy xu t cc trang no tr khi h c xc th c d a vo Windows user account (ti kho n ng i dng Windows) trn server. S d ng IIS Windows authentication. Ch n phng php xc th c m b n thch, v t ch i truy xu t n c danh n th m c o b ng IIS Manager. B n c th l y thng tin v ng i dng c xc th c t thu c tnh Page.User ho c l p HttpContext.

207 Chng 7: ASP.NET v Web Form

IIS v ASP.NET s d ng m hnh b o m t c s p l p (layered security model). Khi ng i dng yu c u m t trang ASP.NET trn HTTP, cc b c d i y s di n ra: 1. IIS th c hi n vi c xc th c ng i dng. N u Anonymous access c kch ho t, IIS s t ng ng nh p ng i dng v i ti kho n n c danh (IUSR_[ServerName]). N u khng, n s yu c u thng tin xc th c ng nh p ng i dng v i m t ti kho n Windows khc. N u IIS xc th c ng i dng thnh cng, n s chuy n yu c u n ASP.NET cng v i thng tin v ng i dng c xc th c. Theo , ASP.NET c th s d ng cc d ch v b o m t c a n d a vo cc thi t l p trong file Web.config (v d , khng cho ng i dng ho c nhm c th truy xu t n cc trang ho c th m c no ). Ngoi ra, m c a b n c th h n ch cc hnh ng b ng cch ki m tra thng tin v ng i dng. N u m ASP.NET truy xu t b t k ti nguyn h th ng no (v d , m m t file ho c k t n i n m t c s d li u), h i u hnh Windows s th c hi n nh ng ki m tra b o m t c a n. Thng th ng, m ng d ng ASP.NET khng th c s ch y d i ti kho n c a ng i dng c xc th c. Nh th , nh ng ki m tra b o m t ny c th c hi n d a trn ti kho n ti n trnh ASPNET ( c c u hnh b ng file machine.config).

2.

3.

s d ng IIS authentication, b c u tin l v hi u Anonymous access cho th m c o. B n c n kh i ng IIS Manager (vo Start | Control Panel | Administrative Tools | Internet Information Services). K ti p, nh p ph i vo m t th m c o ho c m t th m c con bn trong th m c o, v ch n Properties. Ch n th Directory Security (xem hnh 7.5).

Hnh 7.5 Directory Security

K ti p, nh p nt Edit. C a s nh hnh 7.6 s xu t hi n. Trong n a d i c a c a s , b n c th kch ho t m t trong cc phng php xc th c. Tuy nhin, khng phng php no c s d ng tr khi b n xa d u ch n Anonymous access.

208 Chng 7: ASP.NET v Web Form

Hnh 7.6 Directory authentication

B n c th kch ho t nhi u phng php xc th c, trong tr ng h p ny client s s d ng phng php c h tr m nh nh t. N u Anonymous access c kch ho t th n lun c s d ng. Cc phng php xc th c khc nhau c m t trong b ng 7.2.
B ng 7.2 Cc ki u xc th c Ch M t

Anonymous

Client khng c n cung c p b t k thng tin no. Ng i dng c ng nh p b ng ti kho n n c danh c s n (IUSR_[ServerName]). Basic authentication l m t ph n c a chu n HTTP 1.0, v n c h u h t cc trnh duy t v web-server h tr . Khi s d ng Basic authentication, trnh duy t yu c u ng i dng nh p username v password. Thng tin ny c chuy n cho IIS, v n c so trng v i Windows user account c c b . Basic authentication nn lun c ph i h p v i SSL v n khng b o m t thng tin ng nh p tr c khi chuy n giao. Digest authentication g i m t digest (t c m bm m t m) trn m ng. Do , n an ton hn Basic authentication v thng tin ng nh p n u b ch n cng khng th dng l i c. B t l i ch y u l Digest authentication ch c h tr trn Internet Explorer 5.0 tr ln. Cng v y, web-server c a b n c n s d ng Active Directory ho c c th truy xu t n m t Active Directory server. Khi s d ng Integrated authentication th Internet Explorer g i logon token cho ng i dng hi n hnh m t cch t ng, mi n l n trn m t mi n ng tin c y. Integrated authentication ch c h tr trn Internet Explorer 2.0 tr ln v khng th lm vi c trn cc proxy-server.

Basic

Digest

Integrated

M t khi kch ho t cc thi t l p b o m t cho th m c o thch h p, b n cng nn b o m file Web.config c thi t l p l s d ng Windows authentication. Trong m t d n Visual Studio .NET, y l thi t l p m c nh.

209 Chng 7: ASP.NET v Web Form <configuration> <system.web> <!-- B qua cc thi t l p khc. --> <authentication mode="Windows" /> </system.web> </configuration>

Vo lc ny, th m c o c a b n s yu c u xc th c ng i dng v ng d ng Web s c th l y thng tin v ng i dng. Ngoi ra, b n c th thm cc quy t c phn quy n (authorization rule) ngn ng i dng ho c nhm no truy xu t cc trang web ho c th m c con. B n th c hi n i u ny b ng cch thm th <allow> v <deny> vo ph n <authorization> c a file Web.config. V d , b n c th t o m t th m c con v i n i dung file Web.config nh sau:
<configuration> <system.web> <authorization> <deny roles="Guest,Associate" /> <allow users="nnbphuong81" /> <deny users="*" /> </authorization> </system.web> </configuration>

ASP.NET xt qua cc quy t c phn quy n theo th t chng xu t hi n v d ng khi tm th y m t trng kh p. Trong v d ny, ng i dng trong cc nhm Guest ho c Associate s t ng b t ch i. Ng i dng nnbphuong81 s c php (tr khi anh ta l thnh vin c a m t trong hai nhm b c m trn). T t c cc ng i dng khc s b t ch i. Trong tr ng h p ny, y l cc nhm v ti kho n ng i dng c c b . N u mu n ni n m t ti kho n mi n, b n hy s d ng c php [DomainName]\[UserName]. trong v d ny, file Web.config khng ch a ph n <authentication>. l v ph n ny c c u hnh trong file Web.config thu c th m c ng d ng Web. Cc th m c con c th thi t l p cc quy t c phn quy n c a chng, nhng chng khng th thay i ch xc th c. M t ty ch n khc khng cho truy xu t n cc trang c th l s d ng c tnh <location>:
<configuration> <system.web> <!-- B qua cc thi t l p khc. --> </system.web> <location path="SecurePage.aspx"> <system.web> <authorization> <deny roles="Guest" /> </authorization> </system.web> </location> </configuration>

Cu i cng, b n c th vi t logic xc th c b ng cch ki m tra identity c a ng i dng trong ph n m trang web (s d ng thu c tnh Page.User, thu c tnh ny cung c p i t ng WindowsPrincipal). B n c th l y tn ng i dng t thu c tnh WindowsPrincipal.Identity.Name, v b n c th ki m tra vai tr thnh vin trong nhm b ng

210 Chng 7: ASP.NET v Web Form

phng th c WindowsPrincipal.IsInRole. Ph n m cho trang web d i y s trnh by cc k thu t ny:


using using using using System; System.Web; System.Web.UI.WebControls; System.Web.Security.Principal;

public class WindowsSecurityTest : System.Web.UI.Page { protected System.Web.UI.WebControls.Label lblMessage; // (B qua ph n m designer.)

private void Page_Load(object sender, System.EventArgs e) { // Thu l y identity c IIS xc th c. WindowsIdentity identity = (WindowsIdentity)User.Identity; // Ki m tra xem n c ph i l m t Administrator hay khng. bool isAdmin = User.IsInRole(@"BUILTIN\Administrators"); // Hi n th m t 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(); } }

7.9

S dng Forms authentication


B n c n ngn ng i dng truy xu t cc trang no tr khi h t xc th c tr c v i m t trang ng nh p ty bi n. Hi n th c Forms authentication b ng cch c u hnh th <authentication> trong file Web.config c a ng d ng. B n ph i t o trang ng nh p, nhng ASP.NET s gi l i tr ng thi xc th c c a ng i dng.

Forms authentication l m t m hnh b o m t linh ho t, cho php ngn ng i dng cha c xc th c truy xu t vo trang no . B n c n vi t m th c hi n xc th c, v ASP.NET c p m t cookie cho ng i dng c xc th c. Ng i dng khng c cookie s b chuy n h ng sang trang ng nh p khi truy xu t m t trang c b o v . hi n th c Forms authentication, b n ph i th c hi n cc b c sau y: C u hnh Forms authentication b ng th <authentication> trong file Web.config c a ng d ng. S d ng cc thi t l p trong file Web.config vo m t trang ho c th m c c th . h n ch ng i dng n c danh truy xu t

211 Chng 7: ASP.NET v Web Form

T o trang

ng nh p, v thm logic xc th c c a b n vo (s

d ng l p

FormsAuthentication thu c khng gian tn System.Web.Security).

B c u tin l c u hnh file Web.config trong th m c g c c a ng d ng kch ho t Forms authentication, nh c trnh by trong o n m d i y. B n cng c n ch nh trang ng nh p ty bi n (ng i dng cha c xc th c s b chuy n h ng sang trang ny) ng c v th i gian tr (sau th i gian ny, cookie s b lo i b ). Authentication cookie t lm m i v i m i yu c u web.
<configuration> <system.web> <!-- B qua cc thi t l p khc. -->

<authentication mode="Forms"> <forms loginUrl="login.aspx" timeout="30" /> </authentication> </system.web> </configuration>

K n, b n c n thm quy t c phn quy n t ch i ng i dng n c danh. Cch d nh t b o ton cc trang l t o m t th m c con cng v i file Web.config c a n. File Web.config ny s t ch i vi c truy xu t c a cc ng i dng n c danh, nh c trnh by d i y:
<configuration> <system.web> <authorization> <deny users="?" /> </authorization> <!-- B qua cc thi t l p khc. --> </system.web> </configuration>

By gi , ASP.NET s t ng g i cc yu c u cha c xc th c ( m c con) n trang ng nh p ty bi n. M t ty ch n khc khng cho truy xu t d ng th <location>:

i v i cc trang trong th

n cc trang c th trong th m c hi n th i l s

<configuration> <system.web> <!-- B qua cc thi t l p khc. --> </system.web> <location path="SecurePage.aspx"> <system.web> <authorization> <deny users="?" /> </authorization> </system.web> </location> </configuration>

B n cng c th t ch i cc ng i dng c th b ng cch nh p danh sch tn ng i dng (phn cch b ng d u ph y) thay vo k t ? (? ngha l t t c cc ng i dng n c danh).

212 Chng 7: ASP.NET v Web Form

K ti p, b n c n t o trang ng nh p. Trang ng nh p c th xc th c ng i dng b ng password c vi t c ng (ph h p cho cc th nghi m n gi n), c s d li u pha server, ho c b t k ki u logic xc th c ty bi n no. M t khi ng i dng c xc th c thnh cng, b n c n g i phng th c tnh FormsAuthentication.RedirectFromLoginPage. Phng th c ny s thi t l p authentication cookie v chuy n h ng ng i dng n trang c yu c u lc u. D i y l trang ng nh p s b , ch ki m tra m t password c th khi ng i dng nh p vo nt Login:
using using using using System; System.Web; System.Web.UI.WebControls; System.Web.Security; System.Web.UI.WebControls.Label lblStatus; System.Web.UI.WebControls.Button cmdLogin; System.Web.UI.WebControls.TextBox txtPassword; System.Web.UI.WebControls.TextBox txtName;

public class LoginPage : System.Web.UI.Page { protected protected protected protected // (B

qua ph n 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 nghi m trang ng nh p trn, b n hy yu c u trang SecurePage.aspx (n m trong th m c Secured). B n s b chuy n h ng sang trang login.aspx, v n u nh p ng password, b n s c tr v trang SecurePage.aspx.

Hnh 7.7 Trang ng nh p ty bi n

213 Chng 7: ASP.NET v Web Form

7.10

Thc hin xc nhn tnh hp l c-chn-la

B n c n s d ng cc i u ki m validator c a ASP.NET. Tuy nhin, b n mu n ki m tra b ng m l nh c th xc nh n tnh h p l ch cc i u ki m hay t p cc i u ki m no , ho c c th ty bi n cc thng bo l i d a trn u vo khng h p l . V hi u thu c tnh EnableClientScript c a m i i u ki m validator trang c xc nh n tnh th c post-back. K , s d ng phng th c Page.Validate h p l c a trang ho c phng th c BaseValidator.Validate xc nh n tnh h p l c a t ng i u ki m ring r . i u ki m validator c a ASP.NET l gi i php l t ng xc nh n tnh h p l c a form m t cch nhanh chng. V i i u ki m validator, b n c th xc nh n tnh h p l c a ton b trang cng m t lc. N u mu n xc nh n tnh h p l ch m t ph n form, ho c mu n quy t nh xem c c n xc nh tnh h p l m t i u ki m no hay khng (d a trn gi tr c a m t i u ki m khc ch ng h n), b n s c n th c hi n thao tc xc nh n tnh h p l c-ch n-l a. B c u tin trong thao tc ny l v hi u thu c tnh EnableClientScript c a m i i u ki m validator trn trang. N u khng, vi c ki m tra s c th c hi n t i client thng qua JavaScript, trang s khng c post-back n u n ch a cc gi tr khng h p l , v ph n m th l s ki n s khng c th c thi. M t khi th c hi n thay i ny, b n c th xc nh n tnh h p l t ng i u ki m m t b ng phng th c BaseValidator.Validate, ho c xc nh n tnh h p l ton b trang b ng phng th c Page.Validate. y th c hi n ki m tra pha server v i hai validator: RangeValidator v RegularExpressionValidator (xc nh n tnh h p l m t a ch e-mail). N u ki m tra th t b i, o n m ny s duy t qua t p h p cc validator trn form b ng thu c tnh Page.Validators. M i khi tm th y m t validator c l i, n s tm i u ki m tng ng b ng phng th c Page.FindControl r i hi n th gi tr l i.
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 ph n m designer.)

V d

d i

private void cmdValidate_Click(object sender, System.EventArgs e) { // Xc nh n tnh h p l this.Validate(); if (!Page.IsValid) { c a trang.

214 Chng 7: ASP.NET v Web Form 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."; } } }

Hnh 7.8 Th c hi n thao tc xc nh n tnh h p l ty bi n

7.11

Thm ng iu kim vo Web Form

B n c n thm m t i u ki m web vo m t trang web lc th c thi v th l cc s ki n c a n. T o m t i t ng i u ki m, thm n vo t p h p Controls c a m t i u ki m k t n i b t k phng th c th l s container, v s d ng l nh AddHandler ki n no. B n ph i t o i u ki m sau m i l n postback.

215 Chng 7: ASP.NET v Web Form

K thu t thm i u ki m web vo trang web tng t nh k thu t thm i u ki m Windows vo form, nhng c m t vi i m khc, bao g m: Cc i u ki m c-t o- ng ch t n t i n l n postback k ti p. N u c n chng, b n ph i ti t o l i khi trang c tr v . Tuy nhin, i h i ny khng ngn b n vi t m th l cc s ki n c a chng. Vi c nh v cc i u ki m c-t o- ng khng m y d dng. B n nn s d ng i u ki m tr c ki n (literal control) ch a m HTML (nh <br>) phn cch cc i u ki m c-t o- ng. Cc i u ki m c-t o- ng nn c t trong m t i u ki m container (nh Panel) hn l t tr c ti p ln trang. i u ny khi n cho vi c nh v chng d dng hn. N u mu n tng tc v i i u ki m sau ny, b n nn cho n m t nh danh (ID) duy nh t. B n c th s d ng ID ny thu l y n t t p h p Controls c a i u ki m container.

Ni t t nh t t o cc i u ki m m i l trong phng th c th l s ki n Page.Load (b o m i u ki m s c t o m i khi trang c p ng). Ngoi ra, n u b n thm m t i u ki m nh p (input) s d ng view state, thng tin view state s c tr l i cho i u ki m sau khi s ki n Page.Load pht sinh. Tng t , v s ki n Page.Load lun pht sinh tr c khi s ki n no khc di n ra, b n c th ti t o m t i u ki m d ng nn cc s ki n pha server, v ph n m th l s ki n c a n s di n ra ngay sau s ki n Page.Load. V d d i y (xem hnh 7.9) s t o ng ba i u ki m (hai Button v m t TextBox) v nh v chng b ng i u ki m tr c ki n ( ng vai tr l d u phn cch). Hai Button c k t n i v i cc phng th c th l s ki n ring bi t. TextBox c c p m t nh danh duy nh t ph n text c a n c th c thu l y sau ny (trong p ng cho c nh p chu t vo Button).

Hnh 7.9 Cc i u ki m c-t ousing using using using using System; System.Web; System.Web.UI; System.Web.UI.WebControls; System.Web.Security;

ng

216 Chng 7: ASP.NET v Web Form public class DynamicControls : System.Web.UI.Page { protected System.Web.UI.WebControls.Label lblMessage; protected System.Web.UI.WebControls.Panel pnl; // (B qua ph n m designer.)

private void Page_Load(object sender, System.EventArgs e) { // T o Button. Button dynamicButton = new Button(); dynamicButton.Text = "Dynamic Button A"; // K t n i phng th c th l s ki n. dynamicButton.Click += new EventHandler(cmdDynamicA_Click); // Thm Button vo Panel. pnl.Controls.Add(dynamicButton); // Thm d u ng t dng. pnl.Controls.Add(new LiteralControl("<br>")); // T o Button th hai. dynamicButton = new Button(); dynamicButton.Text = "Dynamic Button B"; dynamicButton.Click += new EventHandler(cmdDynamicB_Click); pnl.Controls.Add(dynamicButton); // Thm d u ng t dng. pnl.Controls.Add(new LiteralControl("<br><br>")); // T o 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(); } 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; }

217 Chng 7: ASP.NET v Web Form } } }

N u c n t o ng cc layout ph c t p (g m cc nhm i u ki m c t o d ng tr c), b n c th chuy n sang s d ng i u ki m ng i dng v n p ng chng vo trang. K thu t ny s c trnh by trong m c 7.13.

7.12
B n c n tr v ho c th ).

Tr v ng mt bc hnh
ng m t b c hnh (ch ng h n, t o d ng k t xu t d ng bi u

T o d ng b c hnh b ng GDI+ v m t i t ng System.Drawing.Bitmap trong-b nh . K , b n c th ghi n ra dng k t xu t (output stream), ho c lu n vo a c ng c a server v hi n th n v i i u ki m web Image. B n c th v ng cc b c hnh trong m t ng d ng Web b ng cch s d ng cng o n m GDI+ s d ng trong m t ng d ng d a-trn-Windows. Ch c i m khc l cch th c b n tr v b c hnh cu i cng nh th no. V c b n, c hai cch ti p c n m b n c th s d ng: B n c th a tr c ti p n i dung nh phn c a b c hnh vo thu c tnh OutputStream c a i t ng HttpResponse. y l m t cch ti p c n hay n u b n khng mu n lm y a c ng c a server v i cc file hnh khng h c s d ng l i. y cng l s l a ch n t t nh t n u b n c n t o ng cc b c hnh c thi t k ph h p v i u vo c a ng i dng. B n c th lu b c hnh vo h th ng file c a web-server v s d ng th HTML <img> hi n th n. y l s l a ch n t t n u b n c n t o m t b c hnh s c s d ng l i, v trnh c chi ph c a vi c ti t o hnh lin t c.

M c ny kh o st c hai cch ti p c n trn. Tr c tin, hy xt cch t o ng m t hnh m khng lu n ra file. Trong v d ny, m c ch l t o m t banner n gi n (xem hnh 7.10).

Hnh 7.10 M t banner c-t o-

ng

218 Chng 7: ASP.NET v Web Form

r ng ch c ph n text c a banner l do ng i dng cung c p (thng qua chu i truy v n). Font, mu, v kch th c c vi t m c ng (m c d chng c th c thi t l p d dng d a vo cc i s chu i truy v n khc ho c d a vo file Web.config). o n m d i y s trnh by cch ti p c n ny:
using using using using using System; System.Web; System.Web.UI.WebControls; System.Drawing; System.Drawing.Drawing2D;

public class DynamicGraphic : System.Web.UI.Page { // (B qua ph n m designer.)

private void Page_Load(object sender, System.EventArgs e) { // L y text t chu i truy v n. // N u khng c text, ch n m c nh. string text = ""; if (Request.QueryString["image"] == null) { Response.Redirect(Request.Url + "?image=" + Server.UrlEncode("This is a test image")); } else { text = Server.UrlDecode(Request.QueryString["image"]); } // T o m t hnh bitmap trong-b -nh // (r ng 300 pixel v cao 200 pixel). int width = 300, height = 200; Bitmap bitmap = new Bitmap(width, height); // L y graphics context c a hnh bitmap. Graphics graphics = Graphics.FromImage(bitmap); // Thi t l p mu n n v ch t l ng hnh. // Mu ny s tr thnh ng vi n. graphics.Clear(Color.OrangeRed); graphics.SmoothingMode = SmoothingMode.AntiAlias; // V m t hnh ch nh t. graphics.FillRectangle(new SolidBrush(Color.Olive), 5, 5, width - 10, height - 10); // Ch n 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); // Lu b c hnh vo dng k t xu t. bitmap.Save(Response.OutputStream,

219 Chng 7: ASP.NET v Web Form System.Drawing.Imaging.ImageFormat.Gif); graphics.Dispose(); bitmap.Dispose(); } }

Khi lu b c hnh vo dng k t xu t, b n s th ch b t k k t xu t no khc. V th , b n khng th s d ng k thu t ny v i m t trang cng c ch a Web controls ho c n i dung HTML tnh. Theo , n u mu n s d ng m t trang ph i h p cc b c hnh c-t o- ng v cc i u ki m web, b n c n b c b c hnh c-t o- ng trong m t i u ki m ho c ghi b c hnh ra a c ng tr c khi hi n th n. N u mu n lu file vo a c ng, b n c n chuy n ph n m t o d ng b c hnh thnh m t phng th c c l p, m chng ta s t tn l GenerateBanner. K , trong phng th c th l s ki n Page.Load, b n ki m tra xem file t n t i cha (s d ng phng th c tnh File.Exists). N u file cha t n t i, b n t o n trong b nh b ng phng th c GenerateBanner v lu n b ng phng th c Bitmap.Save. N u file t n t i, b n ch c n n p th ng b c hnh ny. o n m d i y s trnh by cch ti p c n ny:
using using using using using using System; System.IO; System.Web; System.Web.UI.WebControls; System.Drawing; System.Drawing.Drawing2D;

public class DynamicGraphic : System.Web.UI.Page { protected System.Web.UI.WebControls.Image imageControl; // (B qua ph n m designer.)

private Bitmap GenerateBanner() { // T o d ng b c hnh, s } private void Page_Load(object sender, System.EventArgs e) { // Thi t l p tn file. // Gi s chu i truy v n ch a cc k t h p l cho tn file. string fileName = Request.QueryString["image"] + ".gif"; Bitmap bitmap = null; // Ki m tra b c hnh v i ph n text ny if (File.Exists(fileName)) { // N p b c hnh hi n c. try { bitmap = new Bitmap(fileName); }catch { bitmap = GenerateBanner(); } } else { bitmap = GenerateBanner(); // Lu b c hnh. bitmap.Save(fileName, t n t i hay cha. d ng ph n m trong v d trn.

220 Chng 7: ASP.NET v Web Form System.Drawing.Imaging.ImageFormat.Gif); } // Hi n th b c hnh. imageControl.ImageUrl = fileName; } }

7.13

Np iu kim ngi dng bng m lnh

B n c n t o d ng ng giao di n ng i dng (user interface) cho m t trang t m t ho c nhi u i u ki m ng i dng (user control). S d ng phng th c Page.LoadControl t o i t ng i u ki m t file .ascx, v r i thm n vo t p h p Controls c a m t i u ki m container. i u ki m ng i dng l cc nhm i u ki m c l p. Nh Web Form, i u ki m ng i dng bao g m ph n layout nh ngha cc i u ki m bn trong (file .ascx) v ph n code-behind cng v i logic th l s ki n (file .cs). i u ki m ng i dng cho php b n s d ng l i cc ph n t giao di n thng th ng trn nhi u trang v t o d ng cc giao di n ph c t p t cc kh i nh hn. M t c i m h u ch c a i u ki m ng i dng l chng c th c n p b ng m l nh, i u ny cho php b n t o m t giao di n c u hnh cao do b n thi t k ng y theo ng i dng. B n ch c n n p i u ki m, c u hnh cc thu c tnh c a n, v r i thm n vo m t i u ki m container. V d , xt trang web t o ng cc b c hnh trong m c 7.12. M t gi i php theo cch h ng i t ng hn c th hi n th c c l t o m t i u ki m ng i dng ty bi n ng gi b c hnh c-t o- ng. i u ki m ng i dng ny cho php trang thi t l p text, font, mu... thng qua cc thu c tnh khc nhau.
using using using using using System; System.Web; System.Web.UI.WebControls; System.Drawing; System.Drawing.Drawing2D;

public class DynamicGraphicControl : System.Web.UI.UserControl { // (B qua ph n m designer.)

private string imageText = ""; public string ImageText { get { return imageText; } set { imageText = value; } } private Font textFont; public Font TextFont { get { return textFont; } set {

221 Chng 7: ASP.NET v Web Form textFont = value; } } 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 { return borderColor; } set { borderColor = value; } } private void Page_Load(object sender, System.EventArgs e) { if (ImageText == "") return; // T o m t hnh bitmap trong-b -nh . Bitmap bitmap = new Bitmap(ImageSize.Width, ImageSize.Height); // l y graphics context c a hnh bitmap. Graphics graphics = Graphics.FromImage(bitmap); // Thi t l p mu n n v ch t l ng hnh. // Mu ny s tr thnh ng vi n. graphics.Clear(BorderColor); graphics.SmoothingMode = SmoothingMode.AntiAlias;

222 Chng 7: ASP.NET v Web Form // V m t hnh ch nh t. graphics.FillRectangle(new SolidBrush(BackColor), 5, 5, ImageSize.Width - 10, ImageSize.Height - 10); // Thi t l p 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); // Lu b c hnh vo dng k t xu t. bitmap.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif); graphics.Dispose(); bitmap.Dispose(); } }

Web Form n p i u ki m ng i dng ny trong phng th c th l s ki n Page.Load. i u ki m ng i dng c t trong m t Panel. Phng th c LoadControl tr v m t i t ng Control, v n c p ki u thnh l p i u ki m ng i dng thch h p.
using using using using System; System.Web; System.Web.UI.WebControls; System.Drawing;

public class DynamicControlTest : System.Web.UI.Page { protected System.Web.UI.WebControls.Panel pnl; // (B qua ph n m designer.)

private void Page_Load(object sender, System.EventArgs e) { // N p i u ki m. DynamicGraphicControl ctrl; ctrl = (DynamicGraphicControl) Page.LoadControl("DynamicGraphicControl.ascx"); // C u hnh cc thu c tnh c a i u ki m. 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; // Thm i u ki m vo Panel. pnl.Controls.Add(ctrl); } }

Trong Visual Studio .NET, l p i u ki m ng i dng lun c hi u l c v cc l p c bin d ch thnh .dll. Tuy nhin, n u i u ki m ng i dng khng ph i m t b ph n c a d n, b n s khng c l p i u ki m ng i dng v b n s khng th truy xu t b t k thu c tnh hay

223 Chng 7: ASP.NET v Web Form

phng th c no c a i u ki m ng i dng. kh c ph c v n ny, b n c th t o m t l p c s ho c m t giao di n nh ngha cc ch c nng c b n c th truy xu t vo b t k i u ki m ng i dng ty bi n no. tm hi u k hn v k thu t ny, b n hy download IBuySpy portal case study t i [http://www.asp.net/IBS_Portal]. N trnh by m t layout kh -ty-bi n-cao c t o d ng hon ton t cc i u ki m ng i dng c-n p- ng.

7.14

S dng page-caching v fragment-caching


nh trang

B n c n tng hi u nng b ng cch lu gi cc trang c tr v . Thm ch th OutputCache vo trang ho c i u ki m ng i dng, v ch s c gi trong cache bao lu (tnh theo giy).

Vi c s d ng caching v a ph i c th gi m b t hi u ng th t c chai (ch ng h n, truy xu t c s d li u) v tng ton b hi u nng c a m t website. Caching c hi u qu l n trong m t site c lu l ng cao. V d , xt xem i u g s x y ra khi b n lu gi m t trang hi n th k t qu c a m t truy v n c s d li u. N u b n lu gi trang ny trong 1 pht, v trang ny nh n c 10 yu c u trong kho ng th i gian , b n s gi m c 10 l n chi ph truy xu t c s d li u. B n c th hi n th c caching m t cch d dngch c n thm ch th OutputCache vo trang web. Ch th ny ph i c thm vo file .aspx, ch khng ph i file .cs. V d d i y lu gi m t trang trong 20 giy:
<%@ OutputCache Duration="20" VaryByParam="None" %>

V v d d i y lu gi m t trang trong 20 giy nhng v n duy tr cc b n sao ty vo gi tr c a cc i s chu i truy v n:


<%@ OutputCache Duration="20" VaryByParam="*" %>

B n c th th nghi m caching b ng m t trang hi n th ngy v gi trn server. B n s nh n th y r ng cc yu c u n sau ( i v i trang ny) khng khi n cho th i gian c t o m i. Theo , th i gian c s c hi n th cho n khi trang h t hi u l c. Output-caching khng hi u qu trong cc tr ng h p sau y: Trang c a b n c n t ty bi n y theo cc thi t l p c th c a ng i dng nh thng tin xc th c ( i t ng User) ho c tr ng thi ( i t ng Session). Trong tr ng h p ny, n khng t o c m gic s d ng l i cng m t trang cho t t c cc ng i dng. Trang c a b n ch a cc i u ki m post-back v d ng nn cc s ki n pha server. Trang c a b n c n th c hi n m t hnh ng khc (nh ghi ra file nh t k, nh p thng tin vo c s d li u, ho c thay i m t bi n ng d ng). M t trang c lu gi s s d ng l i ton b HTML c tr v ; ph n m cho trang b b qua. Trang c a b n c ch a cc d li u c n ph i c t o cng v i cc d li u hi n hnh. y l tr ng h p i v i tm ki m s n ph m, nhng khng ph i l tr ng h p i v i danh m c s n ph m.

224 Chng 7: ASP.NET v Web Form

Trong cc tr ng h p ny, b n c th s d ng m t d ng caching linh ho t hn. B n c th s d ng data-caching (s c m t trong m c 7.15) lu gi m t i t ng c th . Ho c b n c th s d ng fragment-caching lu gi m t ph n c a trang. s d ng fragmentcaching, b n c n t o m t i u ki m ng i dng ch a t t c n i dung c th c lu gi v thm ch th OutputCache vo i u ki m ng i dng. Khi , b n c th s d ng i u ki m ng i dng ny trong m t trang web. Ph n m cho trang web v n s ch y, nhng ph n i u ki m ng i dng c th c lu gi .

7.15

Dng li d liu vi ASP.NET Cache

B n c n s d ng caching, nhng b n khng th lu gi ton b m t trang v n ch a m t s m c n ph i ch y ho c m t s n i dung c n ph i c t o ng. S d ng phng th c Cache.Insert lu gi b t k i t ng no v i chnh sch h t hi u l c tr t (sliding expiration) ho c h t hi u l c tuy t i (absolute expiration). i t ng Cache cho php b n lu gi h u nh b t k i t ng .NET no b ng m t kha chu i cng v i chnh sch h t hi u l c do b n nh ngha. ASP.NET duy tr cache m t cch t ng, g b cc i t ng khi chng h t hi u l c ho c khi c n b nh . C hai ki u chnh sch h t hi u l c b n c th s d ng khi lu gi d li u trong cache. H t hi u l c tuy t i (absolute expiration) lm m t hi u l c cc item c lu gi sau m t kho ng th i gian c nh, g n gi ng v i output-caching. H t hi u l c tuy t i l cch ti p c n t t nh t n u b n mu n lu gi cc thng tin c n c lm ti nh k (nh danh m c s n ph m).
// Lu gi ObjectToCache trong 10 pht (v i kha l "Catalog"). // TimeSpan.Zero cho bi t "khng s d ng sliding expiration". Cache.Insert("Catalog", ObjectToCache, null, DateTime.Now.AddMinutes(10), TimeSpan.Zero);

H t hi u l c tr t (sliding expiration) g b cc i t ng sau m t kho ng th i gian khng dng n. Trong tr ng h p ny, m i khi i t ng c truy xu t, th i gian s ng c a n s c reset. H t hi u l c tr t lm vi c t t khi b n c cc thng tin lun c hi u l c nhng lun khng c s d ng (nh d li u thu c v qu kh ). Thng tin ny khng c n c lm ti, nhng khng nn gi n trong cache n u n khng c s d ng.
// Lu gi ObjectToCache n u n c s d ng t nh t // m t l n m i 10 pht (v i kha l "Catalog"). // DateTime.MaxValue cho bi t "khng s d ng absolute expiration". Cache.Insert("Catalog", ObjectToCache, null, DateTime.MaxValue, TimeSpan.FromMinutes(10));

B n c th l y cc item t cache b ng tn kha. Tuy nhin, b n ph i lun ki m tra tr c xem item c t n t i hay khng v r i p n thnh ki u nh mong mu n. Khi thm cc i t ng vo cache, cch t t nh t l t o m t hm c l p c th ti t o i t ng khi c n. V d , n u ang lu gi m t DataSet, b n c n t o m t hm ki m tra cache v ch truy v n l i c s d li u khi khng tm th y DataSet. i u ny cho php b n trnh i ph n x l t n nhi u th i gian nh ttruy v n c s d li utrong khi v n cho php m l nh

225 Chng 7: ASP.NET v Web Form

c a b n thay ng khc.

i hi n th (ch ng h n, ng i dng yu c u s p th t ) ho c th c hi n cc hnh

V d d i y s hi n th m t b ng ch a thng tin v khch hng c l y t m t DataSet. Ph n then ch t l l p CustomerDatabase, ng gi cc ch c nng c n thi t d li u vo DataSet v qu n l cache. V l p ny khng th a k t Page nn n c n s d ng thu c tnh tnh HttpContext.Current l y tham chi u n i t ng Cache.
using using using using using using using System; System.Data; System.Web; System.Configuration; System.Diagnostics; System.Web.Caching; System.Data.SqlClient;

public class CustomerDatabase { private string connectionString; // L y tham chi u n i t ng Cache. private Cache cache = HttpContext.Current.Cache; public CustomerDatabase() { // L y chu i k t n i t file Web.config. connectionString = ConfigurationSettings.AppSettings["NorthwindCon"]; } public DataSet GetCustomers() { DataSet customersDS; // Ki m tra item c n m trong cache hay khng. if (cache["Customers"] == null) { // L y DataSet t c s d li u. customersDS = GetCustomersFromDatabase(); // Lu gi item trong cache // cng v i sliding expiration l 60 giy. cache.Insert("Customers", customersDS, null, DateTime.MaxValue, TimeSpan.FromSeconds(60)); // Hi n th thng i p trong c a s Debug. Debug.WriteLine("DataSet created from data source."); }else { // Hi n th thng i p trong c a s Debug. Debug.WriteLine("DataSet retrieved from cache."); // L y item. customersDS = (DataSet)cache["Customers"]; } // Tr v DataSet. return customersDS;

226 Chng 7: ASP.NET v Web Form } private DataSet GetCustomersFromDatabase() { // T o DataSet. DataSet customersDS = new DataSet(); // d li u 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(); }

B c k ti p l t o m t trang web s d ng l p CustomerDatabase. Trang web m t DataGrid v m t Button. M i khi ng i dng nh p vo Button, trang s g CustomerDatabase.GetCustomers. Thng tin c l y t cache n u v n cn c truy v n l i n u 60 giy tri qua. B n c th nh n bi t DataSet c hay khng b ng cch nhn vo k t xu t trong c a 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 ph n m designer.)

d i y g m i phng th c hi u l c ho c c l y t cache

private void cmdGetData_Click(object sender, System.EventArgs e){ CustomerDatabase custDB = new CustomerDatabase(); DataGrid1.DataSource = custDB.GetCustomers(); DataGrid1.DataBind(); } }

7.16

Kch hot vic g ri ng dng Web

Khi th c hi n g r i m t ng d ng Web v i Visual Studio .NET, b n nh n c l i Unable to start debugging on the Web server. B o m Internet Information Services (IIS) c ci t ng, IIS c ci t tr c Microsoft .NET Framework, v Integrated Windows authentication c kch ho t cho th m c ch a ng d ng Web.

227 Chng 7: ASP.NET v Web Form

Hnh 7.11 L i Unable to start debugging on the Web server

L i Unable to start debugging on the Web server cho bi t r ng Visual Studio .NET c th bin d ch ng d ng Web nhng khng th th c thi n ch g r i (debug mode). V n ny pht sinh v nhi u l do: IIS cha c ci t ho c ci t khng ng. Ng i dng ang ch y Visual Studio .NET khng ph i l thnh vin c a nhm Debugger Users trn web-server. Ng i dng ang ch y Visual Studio .NET khng c quy n (permission) g r i ti n trnh ASP.NET. V d , n u ti n trnh ASP.NET ang ch y d i ti kho n h th ng c c b , ng i dng ph i c c quy n Administrator th m i c th g r i n. Web-server ang ch y trn phin b n Windows khng h tr g r i, 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 r i). ng d ng Web khng c file Web.config, ho c file Web.config khng kch ho t g r i. B n ang ch y Visual Studio .NET, v b n khng kch ho t Integrated Windows authentication cho th m c o.

B c u tin b n c n th c hi n khi ch n on l do khng th g r i m t ng d ng Web l ki m tra vi c ci t IIS trn web-server. th c hi n i u ny, b n hy m http://localhost/localstart.asp trong trnh duy t (localhost l m t b danh cho my tnh hi n hnh). N u trang th nghi m ny khng xu t hi n th c ngha l IIS khng c ci t ho c khng c kch ho t. B n cng c th b t u ng d ng Web m khng th c hi n g r i b ng cch ch n Debug | Start Without Debugging t thanh trnh n c a Visual Studio .NET. N u th nghi m ny thnh cng th c ngha l IIS c ci t ng. N u ci t IIS sau khi ci t Visual Studio .NET ho c .NET Framework, b n c n ph i "s a" .NET Framework b ng a ci t g c. b t u qu trnh ny, b n hy g l nh sau y vo c a s dng l nh (ho c c a s Run), n u ang dng phin b n DVD c a Visual Studio .NET:
<DVD Drive>:\wcu\dotNetFramework\dotnetfx.exe /t:c:\temp /c:"msiexec.exe /fvecms c:\temp\netfx.msi"

N u ang dng phin b n CD c a Visual Studio .NET, b n hy s d ng dng l nh sau y cng v i a Windows Component Update:
<CD Drive>:\dotNetFramework\dotnetfx.exe /t:c:\temp /c:"msiexec.exe /fvecms c:\temp\netfx.msi"

N u IIS c ci t ng, b c k ti p l xc nh n tnh h p l c a file Web.config. File Web.config ph i c c u trc nh sau:


<configuration>

228 Chng 7: ASP.NET v Web Form <system.web> <compilation defaultLanguage="c#" debug="true" > <!-- B qua cc thi t l p khc. -->

</system.web> </configuration>

Theo m c ng) v i

nh, Visual Studio .NET thm th <compilation> vo file Web.config ( c t o t c tnh debug c thi t l p l true.

B c k ti p l ki m tra c u hnh IIS. V n s x y ra n u b n qun t o th m c o cho ng d ng ho c n u b n ch y m t ng d ng sau khi g b ho c ch nh s a th m c o c a n. kh c ph c cc v n ny, b n hy hi u ch nh cc thi t l p cho th m c o trong IIS Manager b ng cch ch n Control Panel | Administrative Tools | Internet Information Services t Start Menu. B n c n ki m tra xem th m c o t n t i v c c u hnh l m t ng d ng Web hay cha (b n c th xem cc thi t l p cho th m c o b ng cch nh p ph i vo n v ch n Properties). V d , th m c o FMStocks7 (xem hnh 7.12) t n t i nhng cha c c u hnh l m t ng d ng Web. gi i quy t v n ny, b n ch c n nh p vo nt Create trong ph n Application Settings.

Hnh 7.12 M t th m c o khng ph i l m t ng d ng Web

M tv n khc v c u hnh IIS c th x y ra trong Visual Studio .NET l khng th c hi n xc th c. Visual Studio .NET truy xu t web-server c c b b ng Integrated Windows authentication, ngay c khi b n kch ho t Anonymous authentication cho th m c o. i u ny ngha l th m c o c a b n ph i cho php c Anonymous authentication v Integrated Windows authentication. cho php c hai phng php ny, b n c n th c hi n cc b c sau y:

229 Chng 7: ASP.NET v Web Form

1.

Trong IIS Manager, nh p ph i vo th m c o cho ng d ng c a b n v ch n Properties (b n c th c u hnh ki u xc th c cho t t c cc th m c n u nh p ph i vo th m c Web Sites v ch n Properties). Ch n th Directory Security (xem hnh 7.13). Trong ph n Anonymous access and authentication control, nh p nt Edit. Trong h p tho i Authentication Methods, bn d i Authenticated access, ch n Integrated Windows authentication (xem hnh 7.14). Nh p OK.

2. 3. 4. 5.

Hnh 7.13 Directory Security

230 Chng 7: ASP.NET v Web Form

Hnh 7.14 Kch ho t Integrated Windows authentication

7.17

Thay i quyn cp cho m ASP.NET

B n c n c p cho ph n m c a trang web ho c d ch v Web c a b n nhi u c quy n Windows hn (nh cc quy n cho file, thi t l p Registry, c s d li u, v cc ti nguyn khc), ho c b n c n h n ch cc c quy n hi n c. B n c th gn tr c ti p cc c quy n cho ti kho n ASPNET c c b , ho c c th c u hnh m ASP.NET c a b n s d ng m t ti kho n hon ton khc b ng cch ch nh s a th <processModel> trong file machine.config. B n cng c th s d ng k thu t gi nh n (impersonation) m t o n m th c thi v i cc quy n c a ng i dng c IIS xc th c. M ASP.NET khng ch y d i ti kho n ng i dng c IIS xc th c ho c ti kho n n c danh IUSR_[ServerName]. M t ph n l do l ti kho n ny th ng khng c c quy n i v i m ASP.NET (c th t o v xa cc file t m qu n l ti n trnh bin d ch trang web). Theo m c nh, cc trang ASP.NET ch y b ng ti kho n ASPNET c c b , ti kho n ny c m t t p cc c quy n b gi i h n. N u c n m ASP.NET c a b n th c hi n i u g khng c php theo m c nh i v i ti kho n c c b (ch ng h n, ghi ra a c ng trn server), b n c th c p cc quy n ny cho ti n trnh ASPNET. B n cng c th thay i thi t l p ny b ng cch m file machine.config (n m trong th m c <Windows directory>\Microsoft.NET\ Framework\<version>\CONFIG\) v ch nh s a th <processModel>.

231 Chng 7: ASP.NET v Web Form

Hnh 7.15 File machine.config

B n c th thi t l p cc c tnh userName v password cho m t ng i dng b t k, ho c b n c th a vo s d ng ti n trnh ASPNET c c b (thi t l p userName l machine v password l AutoGenerate) ho c ti kho n h th ng c c b (thi t l p userName l SYSTEM v password l AutoGenerate). V ti kho n h th ng c c b c c y quy n trn my tnh nn ng bao gi s d ng ti kho n ny ngo i tr m c ch th nghi m. Cc thi t l p v ti kho n ASP.NET l ton c c v t t c cc ng d ng Web s chia s ti kho n m b n ch nh. B n cng c th thay i ti kho n dng th c thi cc ng d ng ho c o n m no b ng k thu t gi nh n. V d , c u hnh m t ng d ng Web ch y d i m t ti kho n ng i dng khc, b n c n thm th <identity> vo file Web.config nh sau:
<configuration> <system.web> <!-- B qua cc thi t l p khc. --> <identity impersonate="true" name="domain\user" password="pwd"/> </system.web> </configuration>

B n cng c th ch th ng d ng Web s d ng identity c IIS xc th c, s l ti kho n n c danh IUSR_[ServerName] n u b n khng s d ng Windows authentication ( c th o lu n trong m c 7.8). B n ch c n thm th <identity> m khng ph i thm b t c thng tin xc th c no:
<identity impersonate="true"/>

Nh r ng, i v i ki u gi nh n ny, ti kho n ng i dng s yu c u truy xu t c/ghi n th m c Temporary ASP.NET Files (ni lu tr cc file ASP.NET c bin d ch c nh v t i \[WindowsDirectory]\Microsoft.NET\Framework\ [version]\Temporary ASP.NET Files). Cu i cng, b n cng c th s d ng k thu t gi nh n b ng m l nh (v n ny s c m t chi ti t trong m c 13.15). Tuy v y, v d d i y s lm vi c cng v i Windows authentication. N u IIS xc th c ng i dng ( c m t trong m c 7.8), identity s c th a nh n khi s d ng phng th c WindowsIdentity.Impersonate. s d ng o n m ny, b n ph i nh p khng gian tn System.Security.Principal.
if (User.GetType() == typeof(WindowsPrincipal)) {

232 Chng 7: ASP.NET v Web Form WindowsIdentity id = (WindowsIdentity)User.Identity; WindowsImpersonationContext impersonate = id.Impersonate(); // (Th c hi n cc tc v // Tr l i ID. impersonate.Undo(); } else { // Ng i dng khng c xc th c. // Nm l i ho c th c hi n cc b c khc. } v i ID ny.)

233

Chng 8:

H A,

A PHNG TI N, V IN N

234

Chng 8:

235 h a, a phng ti n, v in n

h a, video, audio, v in n l nh ng d u hi u tiu chu n c a m t client a nng truy n th ng trn h i u hnh Microsoft Windows. Khi ti n n a phng ti n, Microsoft .NET Framework h tr cho vi c tnh ny, trong khi b qua cc c tnh khc. V d , b n s tm th y m t t p ph c t p cc cng c dng th c hi n vi c v trong khng gian hai chi u v vi c in d a-trn-s -ki n v i GDI+ v cc ki u thu c khng gian tn System.Drawing. Cc l p ny h tr cc hm Graphics Device Interface (GDI) nguyn sinh trong Windows API; khi n cho vi c v cc hnh d ng ph c t p, lm vi c v i t a v php bi n hnh, v x l nh d dng hn. M t khc, n u b n mu n chi m t file audio, hi n th m t file video, ho c l y thng tin v cc tc v in hi n th i, b n s c n ph i v t ra ngoi .NET Framework. Cc m c trong chng ny trnh by cch s d ng cc c tnh n i t i .NET v cc th vi n Win32 nguyn sinh thng qua P/Invoke ho c COM Interop. M t vi k thu t s c c p: Tm v s d ng cc font c ci t (m c 8.1), v hnh cu n c (m c 8.5) v thumbnail (m c 8.8), cng nh th c hi n ch p mn hnh b ng Win32 API (m c 8.6). Lm vi c v i cc i u ki m ty bi n owner-drawn (m c 8.3 v 8.4) v x l cc t ng h a trn mn hnh (m c 8.2 v 8.7). i

Chi cc file audio v video (bao g m WAV, MP3, v MPEG) b ng th vi n Quartz c trong Windows Media Player (m c 8.9, 8.10, v 8.11). In cc vn b n n gi n v ph c t p (m c 8.13 v 8.14), in text v i wrapping (m c 8.15), t o print preview (m c 8.16), v l y thng tin v my in (m c 8.12) v hng i in b ng WMI (m c 8.17).

8.1
T o cc

Tm tt c cc font c ci t
B n c n l y danh sch t t c cc font c ci t trn my tnh hi n hnh. i t ng System.Drawing.Text.InstalledFontCollection, t p h p ny ch a i t ng FontFamily m t t t c cc font c ci t.

L p InstalledFontCollection cho php b n l y thng tin v cc font c ci t. o n m d i y duy t qua t p h p font v a c t o; m i khi tm th y m t font, n s t o m t Label m i hi n th tn font v i di n m o cho tr c (kch th c 14 point). Label c thm vo m t Panel cu n c, cho php ng i dng cu n qua danh sch cc font hi n c.
using using using using System; System.Windows.Forms; System.Drawing; System.Drawing.Text;

public class ListFonts : System.Windows.Forms.Form { private System.Windows.Forms.Panel pnlFonts; // (B qua ph n m designer.)

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

236 Chng 8:

h a, a phng ti n, v in n

// T o t p h p font. InstalledFontCollection fontFamilies = new InstalledFontCollection(); // Duy t qua t t c cc font. int offset = 10; foreach (FontFamily family in fontFamilies.Families) { try { // T o m t Label hi n th text (vi t 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 cu n c. pnlFonts.Controls.Add(fontLabel); offset += 30; }catch { // L i s x y ra n u font c ch n khng // h tr normal style (m c nh c s d ng khi // t o i t ng Font). V n ny c th // c b qua m khng sao c . } } } } font ny).

Hnh 8.1 Danh sch cc font c ci

8.2
Ki m tra

Thc hin hit testing vi shape


B n c n nh n bi t ng i dng c nh p vo trong m t shape hay khng. i m m ng i dng nh p vo b ng cc phng th c nh
Rectangle.Contains v Region.IsVisible (thu c khng gian tn System.Drawing),

Chng 8:

237 h a, a phng ti n, v in n

ho c GraphicsPath.IsVisible (thu c khng gian tn System.Drawing.Drawing2D), ty vo ki u c a shape. Thng th ng, n u s d ng GDI+ v shape trn form, c th b n s c n xc nh xem khi no ng i dng nh p vo trong m t shape cho tr c. .NET Framework cung c p ba phng th c c th th c hi n cng vi c ny: Phng th c Rectangle.Containsnh n vo m t i m v tr v true n u i m ny n m bn trong hnh ch nh t cho tr c. Trong nhi u tr ng h p, b n c th l y c hnh ch nh t i v i m t ki u shape khc. V d , b n c th s d ng Image.GetBounds l y hnh ch nh t m t ng bin c a shape. C u trc Rectangle l thnh vin c a khng gian tn System.Drawing. Phng th c GraphicsPath.IsVisiblenh n vo m t i m v tr v true n u i m ny n m bn trong m t vng c nh ngha b i GraphicsPath khp kn. V m t GraphicsPath c th ch a nhi u line, shape, v figure nn cch ny r t h u ch n u b n mu n ki m tra m t i m c n m bn trong m t vng khng ph i hnh ch nh t hay khng. L p GraphicsPath l m t thnh vin c a khng gian tn System.Drawing.Drawing2D. Phng th c Region.IsVisiblenh n vo m t i m v tr v true n u i m ny n m bn trong m t vng c nh ngha b i Region. Cng gi ng nh GraphicsPath, Region c th m t m t shape khng ph i hnh ch nh t. Region l m t thnh vin c a khng gian tn System.Drawing.

V d sau y s t o m t Rectangle v m t GraphicsPath. Theo m c nh, hai shape ny c n n mu xanh nh t. Tuy nhin, phng th c th l s ki n Form.MouseMove s ki m tra xem con tr chu t c n m trong m t trong hai shape ny hay khng, v c p nh t mu n n thnh h ng ti n u con tr .
using using using using System; System.Windows.Forms; System.Drawing; System.Drawing.Drawing2D;

public class HitTesting : System.Windows.Forms.Form { // (B qua ph n m designer.) d ng.

// nh ngha cc shape s c s private GraphicsPath path; private Rectangle rectangle;

// nh ngha cc c theo v t con tr private bool inPath = false; private bool inRectangle = false; // nh ngha cc bt v . Brush highlightBrush = Brushes.HotPink; Brush defaultBrush = Brushes.LightBlue;

chu t.

private void HitTesting_Load(object sender, System.EventArgs e) { // T o cc shape. path = new GraphicsPath(); path.AddEllipse(10, 10, 100, 60);

238 Chng 8:

h a, a phng ti n, v in n

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(); rectangle = new Rectangle(100, 170, 220, 120); } private void HitTesting_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; // V shape d a trn ph n ch n hi n t i. 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(); // Th c hi n "hit testing" v i hnh ch if (rectangle.Contains(e.X, e.Y)) { if (!inRectangle) { inRectangle = true; // i mu n n hnh ch nh t. g.FillRectangle(highlightBrush, rectangle); g.DrawRectangle(Pens.Black, rectangle); } }else if (inRectangle) { inRectangle = false; // Ph c h i hnh ch nh t. g.FillRectangle(defaultBrush, rectangle); g.DrawRectangle(Pens.Black, rectangle); } nh t.

Chng 8: // Th c hi n "hit testing" v i path. if (path.IsVisible(e.X, e.Y)) { if (!inPath) { inPath = true; // i mu n n path. g.FillPath(highlightBrush, path); g.DrawPath(Pens.Black, path); } }else if (inPath) { inPath = false; // Ph c h i path. g.FillPath(defaultBrush, path); g.DrawPath(Pens.Black, path); } g.Dispose(); } }

239 h a, a phng ti n, v in n

Hnh 8.2 Th c hi n hit testing v i

i t ng Rectangle v GraphicsPath

Ch r ng ho Vi c v ch b n c th lm kh i m t vng i u ny d n form c v l

t ng ny di n ra tr c ti p bn trong phng th c th l s ki n MouseMove. c th c hi n n u ph n ch n hi n t i thay i. i v i m t o n m n gi n, m t hi u l c ton b form m i khi con tr chu t di chuy n vo trong ho c ra v th l t t c vi c v trong phng th c th l s ki n Form.Paint, nhng n vi c ph i v nhi u hn v t o nn hi n t ng rung hnh (flicker) khi ton b i.

240 Chng 8:

h a, a phng ti n, v in n

8.3

To form c hnh dng ty bin


B n c n t o m t form ho c i u ki m khng ph i hnh ch nh t. T o m t i t ng System.Drawing.Region c hnh d ng nh b n mu n, v gn n vo thu c tnh Form.Region ho c Control.Region.

t o m t form ho c i u ki m khng ph i hnh ch nh t, tr c h t b n c n nh ngha hnh d ng mnh mu n. Cch ti p c n d nh t l s d ng i t ng System.Drawing.Drawing2D.GraphicsPath, n c th i u ti t b t k s k t h p no c a cc hnh ellipse, ch nh t, v cung khp kn. B n c th thm cc shape vo m t i t ng GraphicsPath b ng cc phng th c nh AddEllipse, AddRectangle, v AddClosedCurve. M t khi hon t t vi c nh ngha hnh d ng nh mong mu n, b n c th t o m t i t ng Region t GraphicsPath nych c n trnh ra GraphicsPath trong phng th c kh i d ng c a l p Region. Cu i cng, b n c th gn Region vo thu c tnh Form.Region ho c Control.Region. V d d i y trnh by cch t o m t form c hnh dng b t th ng (xem hnh 8.3) b ng hai cung trn (hai cung ny c chuy n thnh m t figure khp kn b ng phng th c GraphicsPath.CloseAllFigures).

Hnh 8.3 Form khng ph i hnh ch nh t using using using using System; System.Windows.Forms; System.Drawing; System.Drawing.Drawing2D;

public class IrregularForm : System.Windows.Forms.Form { private System.Windows.Forms.Button cmdClose; private System.Windows.Forms.Label label1; // (B qua ph n 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)};

Chng 8: path.AddCurve(pointsA); 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); }

241 h a, a phng ti n, v in n

private void cmdClose_Click(object sender, System.EventArgs e) { this.Close(); } }

i v i v d t o i u ki m khng ph i hnh ch nh t, b n hy tham kh o m c 8.4.

8.4

To iu kim c hnh dng ty bin


B n c n t o m t shape m ng i dng c th thao tc v i n trn form nh ko r, thay i kch th c.... T o m t i u ki m ty bi n, v chp painting logic v shape. Gn shape c a th c b n vo thu c tnh Control.Region. K , b n c th s d ng Region ny hi n hit testing.

N u mu n t o m t giao di n ng i dng ph c t p k t h p nhi u ph n t c v ty bi n, b n c n c phng cch theo v t cc ph n t ny v cho php ng i dng tng tc v i chng. Cch ti p c n d nh t trong .NET l t o m t i u ki m chuyn bi t b ng cch d n xu t m t l p t System.Windows.Forms.Control. K , b n c th ty bi n phng cch m i u ki m ny c v d a theo t p cc s ki n c b n c a n. i u ki m c trnh by d i y m t m t hnh ellipse n gi n trn form. T t c cc i u ki m u c lin h p v i m t vng ch nh t trn form, do i u ki m EllipseShape s t o m t ellipse l p y cc ng bin ny ( c c p thng qua thu c tnh Control.ClientRectangle). M t khi shape c t o, thu c tnh Control.Region c thi t l p d a theo bin trn ellipse. i u ny b o m cc s ki n nh MouseMove, MouseDown, Click... s x y ra ch khi chu t trn ellipse, ch khng ph i ton b hnh ch nh t. D i y l ph n m
using using using using

c a l p EllipseShape:

System; System.Windows.Forms; System.Drawing; System.Drawing.Drawing2D;

public class EllipseShape : System.Windows.Forms.Control { private GraphicsPath path = null; private void RefreshPath() {

242 Chng 8:

h a, a phng ti n, v in n

// T o GraphicsPath cho shape v p d ng n vo // i u ki m b ng cch thi t l p thu c 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); } } }

B n c th nh ngha i u ki m EllipseShape trong m t Class Library Assembly n c th c thm vo h p cng c c a Microsoft Visual Studio .NET v c s thi t k . Tuy nhin, ngay c khng th c hi n b c ny, cng d dng t o c m t th nghi m n gi n. V d d i y t o hai ellipse v cho php ng i dng ko vng quanh form b ng cch gi chu t xu ng v di chuy n con tr .

cl p d ng lc ng d ng r c hai

Hnh 8.4 Ko r cc i u ki m c hnh d ng ty bi n trn form public class SpriteTest : System.Windows.Forms.Form { // (B qua ph n m designer.) ko r c kch ho t.

// Cc c dng theo v t chu t khi ch private bool isDraggingA = false; private bool isDraggingB = false; // Cc i u ki m c hnh d ng ellipse.

Chng 8: private EllipseShape ellipseA, ellipseB;

243 h a, a phng ti n, v in n

private void SpriteTest_Load(object sender, System.EventArgs e) { // T o v c u 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; ellipseB.BackColor = Color.Azure; this.Controls.Add(ellipseB); // G n c hai ellipse vo cng t p cc phng th c // th l s ki n. 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 l y ellipse gy ra s ki n 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; } private void Ellipse_MouseMove(object sender, MouseEventArgs e) { // Thu l y ellipse gy ra s ki n ny. Control control = (Control)sender; if ((isDraggingA && control == ellipseA) || (isDraggingB && control == ellipseB)) { // L y offset. Point point = (Point)control.Tag;

244 Chng 8:

h a, a phng ti n, v in n // Di chuy n i u ki m. control.Left = e.X + control.Left - point.X; control.Top = e.Y + control.Top - point.Y;

} } }

8.5

Thm tnh nng cun cho mt bc hnh


B n c n t o m t b c hnh c th cu n c (b c hnh c n i dung ng). T o kh nng cu n t ng cho System.Windows.Forms.Panel b ng cch thi t l p Panel.AutoScroll l true v t m t System.Windows.Forms.PictureBox ch a n i dung b c hnh vo trong Panel.

Khi b n thi t l p Panel.AutoScroll l true, n u i u ki m no trong Panel v t qu ng bin c a n, Panel s hi n th thanh cu n cho php ng i dng chuy n ti p n i dung. Cch ny c bi t t t i v i cc b c hnh l n. B n c th n p ho c t o b c hnh trong b nh , gn n vo m t PictureBox (khng c s h tr n i t i no cho vi c cu n PictureBox), v r i hi n th PictureBox bn trong Panel. Ch c m t v n m b n c n nh l ph i thi t l p kch th c c a PictureBox b ng v i kch th c th t c a b c hnh b n mu n hi n th . V d sau y t o m t b c hnh m t m t vn b n. B c hnh c t o t m t hnh bitmap trong-b -nh , v nhi u dng text c thm vo b ng phng th c Graphics.DrawString. K , b c hnh c k t v i PictureBox (PictureBox ny c hi n th trong m t Panel cu n cxem hnh 8.5).

Hnh 8.5 Thm tnh nng cu n cho b c hnh v i n i dung ty bi n 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 ph n m designer.)

Chng 8:

245 h a, a phng ti n, v in n

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); // T o m t 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 nhi u dng text ln hnh bitmap. for (int i=0; i < 10; i++) { g.DrawString(text, font, Brushes.Black, 50, 50 + i*60); } // Hi n th hnh bitmap trong PictureBox. pictureBox1.BackgroundImage = b; pictureBox1.Size = b.Size; } }

8.6

Thc hin chp mn hnh Desktop


B n c n l y nh ch p c a mn hnh Desktop hi n th i. S d ng cc l i g i Win32 API GetDesktopWindow, GetDC, v ReleaseDC trong th vi n user32.dll. Ngoi ra, s d ng GetCurrentObject trong th vi n gdi32.dll.

.NET Framework khng cung c p l p no th c hi n vi c ch p ton b mn hnh (th ng c c p l c a s Desktop). Tuy nhin, b n c th truy xu t cc c tnh ny b ng cch s d ng P/Invoke v i Win32 API. B c u tin l t o m t l p ng gi cc hm Win32 API b n c n s d ng. L p d i y s khai bo cc hm ny v s d ng chng trong phng th c cng khai Capture tr v m t i t ng .NET Image ch a c a s Desktop:
using using using using System; System.Drawing; System.Runtime.InteropServices; 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 );

246 Chng 8:

h a, a phng ti n, v in n

const int OBJ_BITMAP = 7; public static Bitmap Capture() { // L y IntPtr IntPtr // L y IntPtr Device Context c a c a s Desktop. desktopWindow = GetDesktopWindow(); desktopDC = GetDC( desktopWindow ); GDI handle c a b c hnh. desktopBitmap = GetCurrentObject(desktopDC, OBJ_BITMAP);

// S d ng handle t o i t ng .NET Image. Bitmap desktopImage = Image.FromHbitmap( desktopBitmap ); // Gi i phng Device Context v tr ReleaseDC(desktopDC); return desktopImage; } } v b c hnh.

Hnh 8.6 Ch p mn hnh Desktop

B c k ti p l t o m t client c th s d ng ch c nng ny. Form d i y (xem hnh 8.6) s hi n th b c hnh ch p c trong m t PictureBox (n m trong m t Panel cu n c, nh c m t trong m c 8.5).
public class ScreenCapture : System.Windows.Forms.Form { private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.Panel panel1; // (B qua ph n m designer.)

private void cmdCapture_Click(object sender, System.EventArgs e) { pictureBox1.Image = DesktopCapture.Capture(); pictureBox1.Size = pictureBox1.Image.Size; } }

Chng 8:

247 h a, a phng ti n, v in n

8.7

S dng double buffering tng tc v li


B n c n t i u thao tc v i v i m t form th ng xuyn c lm ti, v b n mu n gi m hi n t ng rung hnh (flicker). Bi u di n hnh nh d ng hnh bitmap trong-b -nh , r i chp hnh bitmap hon ch nh vo form.

Trong m t vi ng d ng, b n th ng xuyn ph i v l i form ho c i u ki m. i u ny th ng g p khi th hi n animation (hnh ng). V d , b n c th s d ng Timer lm m t hi u l c form m i giy. Khi , o n m th c hi n thao tc v c th v l i m t b c hnh t i m t v tr m i, t o c m gic ng. Cch ti p c n ny c m t v n : m i l n b n lm m t hi u l c form, Windows s v l i n n c a s (xa form), v r i ch y o n m th c hi n thao tc v . i u ny c th gy ra rung hnh ng k . Double buffering l m t k thu t b n c th hi n th c gi m hi n t ng rung hnh. V i double buffering, logic v s ghi m t hnh bitmap trong-b -nh , v hnh ny c chp ln form vo cu i qu trnh v b ng m t thao tc v l i n l trong su t, nh m hi n t ng rung hnh gi m m t cch ng k . B c u tin khi hi n th c double buffering l ph i b o m n n c a form khng t ng c v l i khi form b m t hi u l c. y l nguyn nhn l n nh t gy ra rung hnh v n thay th b c hnh c a b n b ng m t frame tr ng (gi d ch l m t ph n nh c a m t giy). ngn vi c v n n, b n c n chp phng th c OnPaintBackground c a form n khng nh n hnh ng no. B c th hai l s a i o n m th c hi n thao tc v n v b c hnh thnh m t hnh bitmap trong-b -nh . Khi hon t t, hnh bitmap c chp vo form. Cch ti p c n ny b o m lm ti l m t thao tc v l i n l , v drawing logic t n nhi u th i gian s khng gy ra hi n t ng rung hnh. V d sau y trnh by m t b c hnh ( y l logo c a Windows XP) lun phin l n ln v nh l i trn form. Drawing logic c th c hi n trong phng th c th l s ki n Form.Paint, v m t Timer c s d ng lm m t hi u l c form m i 10 mili-giy b c hnh c th c v l i. Ng i dng c th kch ho t double buffering thng qua m t CheckBox trn form. N u khng c double buffering, form b rung ng k . Tuy nhin, khi double buffering c kch ho t, b c hnh l n ln v nh l i m t cch m t m, khng cn rung n a.
using using using using System; System.Drawing; System.Drawing2D; System.Windows.Forms;

public class DoubleBuffering : System.Windows.Forms.Form { private System.Windows.Forms.CheckBox chkUseDoubleBuffering; private System.Windows.Forms.Timer tmrRefresh; // (B qua ph n m designer.) l i). // Theo di kch th c b c hnh, // v ki u animation (l n ln ho c nh private bool isShrinking = false; private int imageSize = 0;

248 Chng 8:

h a, a phng ti n, v in n ln form.

// Lu tr logo s c v private Image image;

private void DoubleBuffering_Load(object sender, System.EventArgs e) { // N p b c hnh logo t file. image = Image.FromFile("image.bmp"); // Kh i ng Timer tmrRefresh.Start(); lm m t hi u l c form.

} private void tmrRefresh_Tick(object sender, System.EventArgs e) { // Thay i kch th c b c hnh d a vo ki u animation. if (isShrinking) { imageSize--; }else { imageSize++; } // i h ng thay i kch th c n u if (imageSize > (this.Width - 150)) { isShrinking = true; }else if (imageSize < 1) { isShrinking = false; } // V l i 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 d ng. // T o m t bitmap trong-b -nh m t b m t c a form. drawing = new Bitmap(this.Width, this.Height, e.Graphics); g = Graphics.FromImage(drawing); }else { // "Double buffering" khng // V tr c ti p ln form. g = e.Graphics; } g.SmoothingMode = SmoothingMode.HighQuality; // V n n. g.FillRectangle(Brushes.Yellow, new Rectangle(new Point(0, 0), this.ClientSize)); // V b c hnh logo. c s d ng. n g n bin c a form.

Chng 8:

249 h a, a phng ti n, v in n

g.DrawImage(image, 50, 50, 50 + imageSize, 50 + imageSize); // N u s d ng "double buffering", chp hnh bitmap // hon t t 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.8
c b c hnh t file
System.Drawing.Image. K

Hin th hnh dng thumbnail


B n c n hi n th cc b c hnh trong m t th m c d ng thumbnail. b ng phng th c tnh FromFile c a l p , b n c th thu l y hnh thumbnail b ng phng th c Image.GetThumbnailImage.

L p Image cung c p ch c nng t o thumbnail thng qua phng th c GetThumbnailImage. B n ch c n truy n chi u r ng v chi u cao c a hnh thumbnail b n mu n (tnh b ng pixel), v l p Image s t o m t i t ng Image m i ph h p v i tiu chu n ny. Vi c kh mo d ng rng ca (antialiasing) c s d ng khi thu nh b c hnh b o m ch t l ng b c hnh t t nh t c th c, m c d m t s v t m v thi u h t m t vi ti u ti t l khng th trnh kh i (kh mo d ng rng ca l qu trnh lo i b cc ra l m ch m, th ng c trong cc b c hnh c thay i kch th c, b ng cch t bng v i m t mu trung gian). Ngoi ra, b n c th cung c p m t callback t o thumbnail m t cch b t ng b . Khi t o m t thumbnail, vi c quan tr ng l ph i b o m t s gi a hai chi u v n nh c (h ng s ). V d , n u b n thu nh m t b c hnh kch th c 200x100 thnh m t thumbnail kch th c 50x50, chi u r ng s b nn cn m t ph n t v chi u cao b nn cn m t n a, i u ny lm mo b c hnh. b o m t l ny v n nh c, b n c th thay i chi u r ng ho c chi u cao thnh m t kch th c c nh r i i u ch nh chi u cn l i cho cn x ng. V d d i y c m t file bitmap v t o m t thumbnail kch th c khng l n hn 50x50 (v n b o ton t l g c):
using System; using System.Drawing; using System.Windows.Forms; public class Thumbnails : System.Windows.Forms.Form { // (B qua ph n m designer.)

Image thumbnail;

250 Chng 8:

h a, a phng ti n, v in n

private void Thumbnails_Load(object sender, System.EventArgs e) { Image img = Image.FromFile("test.jpg"); int thumbnailWidth = 0, thumbnailHeight = 0; // // // // if i u ch nh chi u l n hn l 50 pixel. Vi c ny b o m thumbnail s khng l n hn 50x50 pixel. N u mu n hi n th nhi u thumbnail, b n s ph i dng m t hnh vung 50x50 pixel cho m i thumbnail. (img.Width > img.Height) { thumbnailWidth = 50; thumbnailHeight = Convert.ToInt32(((50F / img.Width) * img.Height)); }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); } }

8.9

Pht ting beep ca h thng


B n c n pht m t m thanh n gi n, ch ng h n ti ng beep c a h th ng. S d ng m t hm khng- c-qu n-l Win32 API nh Beep hay sndPlaySound, ho c g i hm Beep c a Microsoft Visual Basic .NET.

.NET Framework khng ch a b t k l p c-qu n-l no th c hi n vi c chi cc file m thanh, ngay c ti ng beep c a h th ng cng khng. Tuy nhin, b n c th d dng v t qua tr ng i ny b ng Win32 API ho c Visual Basic .NET (c p hm Beep thng qua l p Microsoft.VisualBasic.Interaction). Trong tr ng h p th hai, b n ph i thm m t tham chi u n Microsoft.VisualBasic.dll (c trong t t c cc phin b n c a .NET Framework). V d sau y s d ng c hm API Beep v hm Visual Basic Beep. Ch l hm API s d ng loa g n trong c a my tnh v pht m thanh v i t n s (tnh b ng Hertz, n m trong kho ng t 37 n 32,767) v th i gian (tnh b ng mili-giy) cho tr c. Cch ny s khng pht b t k m thanh no n u my tnh khng c loa g n trong. M t khc, hm Visual Basic Beep pht ti ng beep chu n c a h th ng (l m t file WAV). Cch ny s khng pht b t k m thanh no n u my tnh khng c card m thanh, n u card m thanh khng c k t n i v i loa g n ngoi, ho c n u Windows c c u hnh l khng pht m thanh (thng qua ph n Sounds and Audio Devices trong Control Panel).

Chng 8: 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) {

251 h a, a phng ti n, v in n

// Pht ti ng "beep" t n s 440 Hz trong 100 mili-giy // trn internal speaker. Console.WriteLine("Win32 API beep test."); Beep(440, 100); Console.ReadLine(); // Pht ti ng "beep" m c nh c a h Console.WriteLine("VB beep test."); Interaction.Beep(); Console.ReadLine(); } } th ng (file WAV).

B n cng c th s d ng cc hm Win32 API ny c m t trong m c 8.10.

chi m t file m thanh do b n ch n. K thu t

8.10
B n c n chi m t file WAV ho c MP3.

Chi file audio

S d ng hm API sndPlaySound (h tr file WAV), ho c s d ng thnh ph n ActiveMovie c trong Windows Media Player (h tr file WAV v MP3) chi b t k m thanh no trong m t ng d ng .NET, b n c n nh n s gip c a m t th vi n bn ngoi ho c l i g i h th ng. May m n thay, c hai ty ch n ny u d dng th c hi n c. Th vi n winmm.dll (c trong Windows) ch a hm sndPlaySound nh n vo tn c a m t file WAV v m t thng s ch nh cch chi. B n c th ch n chi m thanh m t cch ng b (gin o n vi c th c thi c a chng trnh cho n khi m thanh hon t t), b t ng b , ho c trong m t vng l p ch y pha n n. Th vi n Quartz cung c p m t thnh ph n COM c th chi nhi u ki u file audio, g m cc nh d ng WAV v MP3. Th vi n Quartz c c p thng qua quartz.dll v n l m t ph n c a Microsoft DirectX cho Windows Media Player v h i u hnh Windows.

Trong v d ny, chng ta s s d ng cch ti p c n th hai. B c u tin l t o m t l p Interop c th qu n l s tng tc gi a ng d ng .NET v th vi n Quartz. B n c th t o m t l p C# cng v i o n m Interop ny b ng ti n ch Type Library Importer (tlbimp.exe) v dng l nh sau y ([WindowsDir] l ng d n c a th m c ci t Windows):
tlbimp [WindowsDir]\system32\quartz.dll /out:QuartzTypeLib.dll

252 Chng 8:

h a, a phng ti n, v in n

B n c th s d ng Visual Studio .NET t o l p Interop b ng cch thm vo m t tham chi u. Ch c n nh p ph i vo d n c a b n trong Solution Explorer, v ch n Add Reference t menu ng c nh. K ti p, ch n th COM, v cu n xu ng ch n ActiveMovie control type library (xem hnh 8.7). M t khi l p Interop c t o, b n c th lm vi c v i giao di n IMediaControl. B n c th ch nh file m b n mu n chi b ng RenderFile, v c th i u khi n playback b ng cc phng th c nh Run, Stop, v Pause. Playback di n ra trn m t ti u trnh c l p, nh th n s khng block o n m c a b n.

Hnh 8.7 Ch n ActiveMovie control type library trong h p tho i Add Reference

V d , ti n ch Console d i y s chi file audio c ch tin:


using System; class PlayAudio { public static void Main(string[] args) { // L y tn file c ch nh trong string filename = args[0]; i s

nh trong

i s dng l nh

u tin.

// Truy xu t giao di n IMediaControl. QuartzTypeLib.FilgraphManager graphManager = new QuartzTypeLib.FilgraphManager(); QuartzTypeLib.IMediaControl mc = (QuartzTypeLib.IMediaControl)graphManager; // Ch nh tn file. mc.RenderFile(filename);

Chng 8: // B t u chi file audio b t mc.Run(); ng b .

253 h a, a phng ti n, v in n

Console.WriteLine("Press Enter to continue."); Console.ReadLine(); mc.Stop(); } }

B n cng c th s d ng th vi n Quartz 8.11).

hi n th file video (s

c trnh by trong m c

8.11

Chi file video

B n c n chi m t file video (nh MPEG, AVI, ho c WMV) ngay trn form. S d ng thnh ph n ActiveMovie c trong Media Player. G n k t xu t video vo m t PictureBox trn form b ng cch thi t l p thu c tnh IVideoWindow.Owner l thu c tnh PictureBox.Handle. .NET Framework khng ch a b t k l p c-qu n-l no tng tc v i cc file video, nhng b n c th s d ng ch c nng DirectShow c a th vi n Quartz d a-trn-COM (c trong Windows Media Player v h i u hnh Windows). bi t cch t o m t Interop Assembly cho th vi n Quartz, b n hy tham kh o m c 8.10. M t khi t o Interop Assembly, b n c th s d ng giao di n IMediaControl n p v chi m t file video. V c b n, k thu t ny gi ng nh k thu t trnh by trong m c 8.10 v i file audio. Tuy nhin, n u mu n hi n th c a s video ngay bn trong giao di n ng d ng c a b n (hn l trong m t c a s c l p), b n ph i s d ng giao di n IVideoWindow. i t ng FilgraphManager c th c p ki u thnh giao di n IMediaControl v IVideoWindowv nhi u giao di n khc cng c h tr nh IBasicAudio (cho php b n c u hnh cc thi t l p balance v volume). V i giao di n IVideoWindow, b n c th g n k t xu t video vo m t i t ng trn form nh Panel ho c PictureBox. lm c nh v y, b n c n thi t l p thu c tnh IVideoWindow.Owner l handle c a i u ki m (b n c th l y c handle ny b ng thu c tnh Control.Handle). K ti p, g i IVideoWindow.SetWindowPosition thi t l p kch th c v v tr c a c a s . Phng th c ny cng c th c g i thay i kch th c video trong qu trnh playback (ch ng h n, khi form b thay i kch th c). V d y cho php ng i dng m b t k n t t c cc c nh c th c khi form b thay i kch th c. PictureBox.SizeChanged s thay i kch th c c a c
PictureBox. PictureBox b neo 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 ph n m designer.)

d i

file video no v chi n trong m t a form, nh th n cng thay i kch o n m p ng cho s ki n a s video tng ng.

254 Chng 8: // nh private private private private private

h a, a phng ti n, v in n ngha const const const const const cc int int int int int h ng dng ch nh window style. WM_APP = 0x8000; WM_GRAPHNOTIFY = WM_APP + 1; EC_COMPLETE = 0x01; WS_CHILD = 0x40000000; WS_CLIPCHILDREN = 0x2000000;

// Gi tham chi u m c-form n giao di n Media Control, // o n m c th i u khi n playback cho // movie c n p hi n t i. private IMediaControl mc = null; // Gi tham chi u m c-form n c a s video trong // tr ng h p n c n c thay i kch th c. private IVideoWindow videoWindow = null; private void cmdOpen_Click(object sender, System.EventArgs e) { // Cho php ng i dng ch n file. OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Media Files|*.mpg;*.avi;*.wma;*.mov;" + "*.wav;*.mp2;*.mp3|All Files|*.*"; if (DialogResult.OK == openFileDialog.ShowDialog()) { // D ng playback i v i movie hi n t i, n u n t n t i. if (mc != null) mc.Stop(); // N p file movie. FilgraphManager graphManager = new FilgraphManager(); graphManager.RenderFile(openFileDialog.FileName); // G n c a s try { video vo PictureBox trn form.

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); } catch { // // // // } // B t u playback (b t ng b ). mc = (IMediaControl)graphManager; mc.Run(); } } L i c th x y ra n u file khng c video source (ch ng h n, file MP3). B n c th b qua l i ny v v n cho php playback ti p t c (khng c hnh).

Chng 8: 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 ngo i l (b nm khi thay // khi file khng c video source. } } } private void ShowMovie_Closing(object sender, System.ComponentModel.CancelEventArgs e) { if (mc != null) mc.Stop(); } }

255 h a, a phng ti n, v in n

i kch th c form)

Hnh 8.8 Chi file video trong PictureBox trn form

8.12

Ly thng tin v cc my in c ci t
c tn cc my in c ci

B n c n l y danh sch cc my in ang c hi u l c trn my tnh. t trong t p h p InstalledPrinters c a l p System.Drawing.Printing.PrinterSettings. L p PrinterSettings m t cc thi t l p cho m t my in v thng tin v my in . V d , b n c th s d ng l p PrinterSettings xc nh cc kh gi y (paper size), cc ngu n gi y (paper source), v cc phn gi i (resolution) c h tr v ki m tra kh nng in mu

256 Chng 8:

h a, a phng ti n, v in n

ho c in hai m t. Ngoi ra, b n c th l y cc thi t l p trang m c trang (orientation)...

nh cho l (margin), h ng

L p PrinterSettings cung c p t p h p tnh InstalledPrinters, t p h p ny ch a tn c a t t c cc my in c ci t trn my tnh. N u mu n tm thm thng tin v cc thi t l p cho m t my in c th , b n c n t o m t i t ng PrinterSettings v thi t l p thu c tnh PrinterName cho ph h p. ng d ng Console d i y s tm t t c cc my in c ci t trn my tnh v hi n th thng tin v kh gi y v phn gi i c h tr b i m i my in.
using System; using System.Drawing.Printing; public class ListPrinters { private static void Main(string[] args) { foreach (string printerName in PrinterSettings.InstalledPrinters) { // Hi n th tn my in. Console.WriteLine("Printer: {0}", printerName); // L y cc thi t l p my in. PrinterSettings printer = new PrinterSettings(); printer.PrinterName = printerName; // // // // if Ki m tra tnh h p (B c ny c n thi t m t gi tr do file registry hay (printer.IsValid) l c a my in. t trong tr ng h p b n c tn my in ng i dng c p ho c m t thi t l p trong configuration.) {

// Hi n th danh sch cc phn gi i h p l . Console.WriteLine("Supported Resolutions:"); foreach (PrinterResolution resolution in printer.PrinterResolutions) { Console.WriteLine(" {0}", resolution); } Console.WriteLine(); // Hi n th danh sch cc kh gi y h p l . Console.WriteLine("Supported Paper Sizes:"); foreach (PaperSize size in printer.PaperSizes) { if (Enum.IsDefined(size.Kind.GetType(), size.Kind)) { Console.WriteLine(" {0}", size); } } Console.WriteLine(); } } Console.ReadLine(); } }

D i y l k t xu t m ng d ng ny c th hi n th :

Chng 8: 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]

257 h a, a phng ti n, v in n

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] [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] ...

B n khng c n th c hi n cch lm ny khi t o m t ng d ng cung c p ch c nng in. Theo nh c ng i dng ch n m t my in v cc thi t m c 8.13, b n c th s d ng PrintDialog l p cho n. L p PrintDialog c th t ng p d ng cc thi t l p c a n cho PrintDocument m khng c n vi t thm m l nh.

258 Chng 8:

h a, a phng ti n, v in n

B n c th in m t vn b n trong b t k ki u ng d ng no. Tuy nhin, ng d ng c a b n ph i ch a m t tham chi u n System.Drawing.dll. N u ang s d ng m t ki u d n trong Visual Studio .NET khng c tham chi u ny (nh ng d ng Console), b n c n ph i thm n vo.

8.13
B n c n in text ho c hnh.

In vn bn n gin

Th l s ki n PrintDocument.PrintPage, v s d ng cc phng th c DrawString in d li u ra trang. v DrawImage c a l p Graphics .NET s d ng m hnh in d a-trn-s -ki n b t ng b (asynchronous event-based printing model). in m t vn b n, b n c n t o m t i t ng System.Drawing.Printing.PrintDocument, c u hnh cc thu c tnh c a n, v r i g i phng th c Print th c hi n tc v in. B th c thi s pht sinh cc s ki n BeginPrint, PrintPage, v EndPrint c a l p PrintDocument trn m t ti u trnh m i. B n th l cc s ki n ny v s d ng i t ng System.Drawing.Graphics xu t d li u ra trang. Hnh v text c ghi ra trang theo cng cch nh b n v ln c a s b ng GDI+. Tuy nhin, b n c th c n ph i theo v t v tr c a b n trn trang, v m i phng th c c a l p Graphics u yu c u t a ch nh ni c n v . in c c u hnh thng qua cc thu c tnh PrintDocument.PrinterSettings v PrintDocument.DefaultPageSettings. Thu c tnh PrinterSettings tr v m t i t ng PrinterSettings ( c m t trong m c 8.12) cho bi t my in s c s d ng. Thu c tnh DefaultPageSettings cung c p i t ng PageSettings cho bi t phn gi i (resolution), l (margin), h ng trang (orientation)... B n c th c u hnh cc thu c tnh ny trong m l nh, ho c b n c th s d ng l p System.Windows.Forms.PrintDialog ng i dng th c hi n cc thay i thng qua h p tho i in chu n c a Windows (xem hnh 8.9). Trong h p tho i in, ng i dng c th ch n m t my in v ch n s l ng b n in (number of copies). Ng i dng cng c th nh p vo nt Properties c u hnh cc thi t l p nng cao nh cch b tr trang (layout) v phn gi i my in (resolution). Cu i cng, ng i dng c th ch p thu n ho c h y b thao tc in b ng cch nh p OK ho c Cancel. Cc thi t l p cho my

Chng 8:

259 h a, a phng ti n, v in n

Hnh 8.9 H p tho i Print

Tr c khi s d ng l p PrintDialog, b n ph i g n n vo i t ng PrintDocument b ng cch thi t l p thu c tnh PrintDialog.Document. Theo , b t k s thay i no do ng i dng th c hi n trong h p tho i in s t ng c p d ng vo i t ng PrintDocument. V d d i y l m t form ch ch a m t nt l nh. Khi ng i dng nh p vo nt ny, ng d ng s t o m t i t ng PrintDocument m i, cho php ng i dng c u hnh cc thi t l p in, v r i b t u thao tc in b t ng b . Phng th c th l s ki n p ng cho s ki n PrintPage s ghi ra nhi u dng text v m t b c hnh.
using using using using System; System.Windows.Forms; System.Drawing; System.Drawing.Printing;

public class SimplePrint : System.Windows.Forms.Form { private System.Windows.Forms.Button cmdPrint; // (B qua ph n m designer.)

private void cmdPrint_Click(object sender, System.EventArgs e) { // T o m t vn b n v g n vo phng th c th l s ki n. PrintDocument doc = new PrintDocument(); doc.PrintPage += new PrintPageEventHandler(this.Doc_PrintPage); // Cho php ng i dng ch n m t my in // v ch nh cc thi t l p khc. PrintDialog dlgSettings = new PrintDialog(); dlgSettings.Document = doc; // N u ng i dng nh p OK th in vn b n. if (dlgSettings.ShowDialog() == DialogResult.OK) { // Phng th c ny tr v t c th, tr c khi tc v in // b t u. S ki n PrintPage s pht sinh b t ng b . doc.Print(); } }

260 Chng 8:

h a, a phng ti n, 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 tr ng h p ny, chng ta c cc thi t l p l // (m c d khng c g ngn chng ta v t qua bin l ). float x = e.MarginBounds.Left; float y = e.MarginBounds.Top; // Xc nh chi u cao c a m t dng (d a trn font float lineHeight = font.GetHeight(e.Graphics); // In nm dng text. for (int i=0; i < 5; i++) { // V text v i bt v en, s d ng font v // t a m chng ta xc nh. e.Graphics.DrawString("Th p Di n Mai Ph c " + i.ToString(), font, Brushes.Black, x, y); // D ch xu ng m t dng. y += lineHeight; } y += lineHeight; // V hnh. e.Graphics.DrawImage(Image.FromFile(Application.StartupPath + "\\test.bmp"), x, y); } } c s d ng).

V d ny c m t h n ch l n ch in m t trang n. in cc vn b n ph c t p v nhi u trang hn, b n c n ph i t o m t l p chuyn bi t ng gi cc thng tin v vn b n, trang hi n hnh... K thu t ny s c trnh by trong m c 8.14.

Hnh 8-10 Vn b n c in (s d ng my in Adobe PDF)

Chng 8:

261 h a, a phng ti n, v in n

8.14

In vn bn c nhiu trang

B n c n in cc vn b n ph c t p g m nhi u trang v in nhi u vn b n khc nhau cng m t lc. t thng tin mu n in vo m t l p ty bi n d n xu t t PrintDocument, v thi t l p thu c tnh PrintPageEventArgs.HasMorePages l true trong khi v n cn trang in. S ki n PrintDocument.PrintPage cho php b n ch in m t trang n. N u mu n in nhi u trang hn, b n c n thi t l p thu c tnh PrintPageEventArgs.HasMorePages l true trong phng th c th l s ki n PrintPage. Trong khi HasMorePages l true, l p PrintDocument v n ti p t c pht sinh cc s ki n PrintPage (m t s ki n cho m t trang). Tuy nhin, b n c n bi t l ang in n trang th m y, d li u g s c in trn m i trang... th c hi n i u ny, cch hay nh t l t o m t l p ty bi n. L p TextDocument d i y th a k t PrintDocument v thm ba thu c tnh: Text lu tr m t m ng cc dng text, PageNumber cho bi t trang v a c in, v Offset cho bi t dng v a c in (trong m ng Text).
public class TextDocument : PrintDocument { private string[] text; 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 thu c vo ki u ti li u mu n in, b n c th ch nh s a l p ny. V d , b n c th lu tr m t m ng g m cc d li u hnh, m t vi n i dung s c s d ng lm header ho c footer trn m i trang, thng tin v font, ho c tn c a file m b n mu n c thng tin t n. Gi cc thng tin ny vo m t l p n s khi n cho vi c in nhi u vn b n cng m t lc d dng hn. Ph n m kh i u cng gi ng nh m c 8.13, ch khc l by gi t o i t ng TextDocument (thay v t o i t ng PrintDocument). Phng th c th l s ki n PrintPage gi v t c a dng hi n hnh v ki m tra c cn ch tr ng trn trang hay khng tr c khi th c hi n in dng

262 Chng 8:

h a, a phng ti n, v in n

k ti p. N u c n trang m i, thu c tnh HasMorePages c thi t l p l true v s ki n PrintPage pht sinh l n n a cho trang k ti p. N u khng, thao tc in xem nh hon t t. Ph n m
using using using using

cho form c trnh by d i y:

System; System.Windows.Forms; System.Drawing; System.Drawing.Printing;

public class MultiPagePrint : System.Windows.Forms.Form { private System.Windows.Forms.Button cmdPrint; // (B qua ph n m designer.)

private void cmdPrint_Click(object sender, System.EventArgs e) { // T o vn b n g m 100 dng. string[] printText = new string[100]; for (int i=0; i < 100; i++) { printText[i] = i.ToString(); printText[i] += ": Th p Di n Mai Ph c (House of Flying Daggers)"; } PrintDocument doc = new TextDocument(printText); doc.PrintPage += new PrintPageEventHandler(this.Doc_PrintPage); PrintDialog dlgSettings = new PrintDialog(); dlgSettings.Document = doc; // N u ng i dng nh p OK th in vn b n. if (dlgSettings.ShowDialog() == DialogResult.OK) { doc.Print(); } } private void Doc_PrintPage(object sender, PrintPageEventArgs e) { // Thu l y vn b n g i s ki n ny. TextDocument doc = (TextDocument)sender; // nh ngha font v xc nh chi u cao. Font font = new Font("Tahoma", 10); float lineHeight = font.GetHeight(e.Graphics); // T o cc bi n lu gi v tr trn trang. float x = e.MarginBounds.Left; float y = e.MarginBounds.Top; // Tng bi n m cho trang (cho bi t s doc.PageNumber += 1; trang c in).

// In t t c thng tin v a kht trn trang. // Vng l p ny k t thc khi dng k ti p v t qu bin l , // ho c khng cn dng no in. while ((y + lineHeight) < e.MarginBounds.Bottom && doc.Offset <= doc.Text.GetUpperBound(0)) {

Chng 8:

263 h a, a phng ti n, v in n

e.Graphics.DrawString(doc.Text[doc.Offset], font, Brushes.Black, x, y); // D ch n dng d doc.Offset += 1; li u k ti p.

// D ch xu ng m t dng trn trang. y += lineHeight; } if (doc.Offset < doc.Text.GetUpperBound(0)) { // V n cn t nh t m t trang n a. // Cho bi t s ki n ny s pht sinh l n n a. e.HasMorePages = true; }else { // Thao tc in hon t t. doc.Offset = 0; } } }

8.15

In text dng wrapping

B n c n phn tch m t kh i text l n thnh cc dng ring bi t sao cho v a kht trn m t trang. S d ng phng th c n p ch ng Graphics.DrawString (phng th c ny nh n vo m t hnh ch nh t bin). Thng th ng, b n s c n ph m t kh i text l n thnh cc dng ring bi t c th in ln trang t ng dng m t. .NET Framework c th th c hi n cng vi c ny m t cch t ng b ng m t phin b n c a phng th c Graphics.DrawString (nh n vo m t hnh ch nh t bin). B n c n ch nh hnh ch nh t m t ni b n mu n text s hi n th . Theo , text s c wrap m t cch t ng cho v a kht bn trong ng bin ny. o n m d i y th c hi n cch ti p c n ny:
using using using using System; System.Windows.Forms; System.Drawing; System.Drawing.Printing;

public class WrappedPrint : System.Windows.Forms.Form { private System.Windows.Forms.Button cmdPrint; // (B qua ph n m designer.)

private void cmdPrint_Click(object sender, System.EventArgs e) { // T o m t vn b n v g n n vo phng th c th l s ki n. string text = "Windows Server 2003 builds on the core strengths " + "of the Windows family of operating systems--security, " + "manageability, reliability, availability, and scalability. " +

264 Chng 8:

h a, a phng ti n, v in n

"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); // Cho php ng i dng ch n m t my in // v ch nh cc thi t l p khc. PrintDialog dlgSettings = new PrintDialog(); dlgSettings.Document = doc; // N u ng i dng nh p OK th in vn b n. if (dlgSettings.ShowDialog() == DialogResult.OK) { doc.Print(); } } private void Doc_PrintPage(object sender, PrintPageEventArgs e) { // Thu l y vn b n g i s ki n 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; } }

Hnh 8.11 Vn b n c in (s d ng my in Adobe PDF)

Chng 8:

265 h a, a phng ti n, v in n

8.16
B n c n s d ng print-preview th no.

Hin th print-preview
bi t c vn b n khi c in ra s trng nh u thu c khng

S d ng PrintPreviewDialog ho c PrintPreviewControl (c hai gian tn System.Windows.Forms).

.NET cung c p hai i u ki m c th nh n vo m t i t ng PrintDocument, ch y o n m th c hi n thao tc in, v s d ng n t o print-preview trn mn hnh. Hai i u ki m ny l:
PrintPreviewDialoghi n th print-preview trong m t c a s

c l p. nh

PrintPreviewControlhi n th print-preview trong m t form ty bi n.

s d ng c a s print-preview c l p, b n c n t o i t ng PrintPrevewDialog, n vn b n, v g i phng th c PrintPreviewDialog.Show.


PrintPreviewDialog dlgPreview = new PrintPreviewDialog(); dlgPreview.Document = doc; dlgPreview.Show();

C a s print-preview (xem hnh 8.12) cung c p t t c cc i u khi n c n thi t di chuy n t trang ny sang trang khc, thu phng trang... C a s ny cng cung c p nt Print cho php ng i dng g i tr c ti p vn b n n my in. B n c th bi n i c a s ny b ng cch ch nh s a cc thu c tnh c a PrintPrevewDialog. B n cng c th thm PrintPreviewControl vo b t k form no hi n th print-preview k bn cc thng tin khc. Trong tr ng h p ny, b n khng c n g i phng th c Show. Ngay khi b n thi t l p thu c tnh PrintPreviewControl.Document th preview c t o ra. xa preview, c n thi t l p thu c tnh Document l null, v lm ti preview, c n gn l i thu c tnh Document. PrintPreviewControl ch hi n th cc trang preview, khng c thm i u khi n no khc. Tuy nhin, b n c th thm cc i u ki m th c hi n thu phng trang, lt nhi u trang... B n ch c n i u ch nh cc thu c tnh c a PrintPreviewControl cho ph h p. V d , xt form c trnh by trong hnh 8.13. N sp nh p m t PrintPreviewControl v cho php ng i dng ch n thi t l p cho zoom (thu phng trang).

266 Chng 8:

h a, a phng ti n, v in n hi n th print-preview trong m t c a s cl p

Hnh 8.12 S d ng PrintPreviewDialog

Hnh 8.13 S d ng PrintPreviewControl

hi n th print-preview trong m t c a s ty bi n

D i y l ph n m cho form:
using using using using System; System.Windows.Forms; System.Drawing; System.Drawing.Printing;

public class PrintPreview : System.Windows.Forms.Form { private private private private // (B System.Windows.Forms.PrintPreviewControl printPreviewControl; System.Windows.Forms.Button cmdPreview; System.Windows.Forms.ListBox lstZoom; System.Windows.Forms.Label label1; qua ph n m designer.)

private PrintDocument doc; // (B qua ph n m cho phng th c th l s // PrintDocument.PrintPage - Xem m c 8.14) ki n

private void PrintPreview_Load(object sender, System.EventArgs e) { // Thi t l p cc zoom c php. for (int i=1; i <= 10; i++) { lstZoom.Items.Add((i * 10).ToString()); } // T o vn b n g m 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."; }

Chng 8:

267 h a, a phng ti n, v in n

doc = new TextDocument(printText); doc.PrintPage += new PrintPageEventHandler(this.Doc_PrintPage); lstZoom.Text = "100"; printPreviewControl.Zoom = 1; printPreviewControl.Document = doc; printPreviewControl.Rows = 2; } private void cmdPreview_Click(object sender, System.EventArgs e) { // Thi t l p zoom. printPreviewControl.Zoom = Single.Parse(lstZoom.Text) / 100; // Hi n th c hai trang, trang ny printPreviewControl.Rows = 2; trn trang kia.

// G n l i PrintDocument lm ti preview. printPreviewControl.Document = doc; } } // (B qua ph n m cho l p TextDocument - Xem m c 8.14)

8.17

Qun l tc v in
i in.

B n c n t m d ng ho c ph c h i m t tc v in ho c m t hng

S d ng Windows Management Instrumentation. B n c th l y thng tin t hng i in b ng m t truy v n v i l p Win32_PrintJob, v b n c th s d ng cc phng th c Pause v Resume c a cc l p Win32_PrintJob v Win32_Printer qu n l hng i. Windows Management Instrumentation (WMI) cho php b n l y m t l ng l n cc thng tin h th ng b ng m t c php gi ng truy v n. M t trong cc cng vi c m b n c th th c hi n v i WMI l l y danh sch cc tc v in ang ch , cng v i thng tin v m i tc v . B n cng c th th c hi n cc thao tc nh in v ph c h i m t tc v ho c t t c cc tc v cho m t my in. s d ng WMI, b n c n thm m t tham chi u n System.Management.dll. ng d ng d i y th c hi n m t truy v n WMI l y danh sch t t c cc tc v in ang ch trn my tnh v hi n th ID cho m i tc v trong m t ListBox. Khi ng i dng ch n m t item, m t truy v n y hn s c th c hi n, v cc chi ti t v tc v in ny c hi n th trong m t TextBox. Cu i cng, ng i dng c th nh p nt Pause v Resume sau khi ch n m t tc v thay i tr ng thi c a n.
using using using using System; System.Windows.Forms; System.Management; System.Collections;

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;

268 Chng 8:

h a, a phng ti n, v in n

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 ph n m designer.) private void PrintQueueTest_Load(object sender, System.EventArgs e) { cmdRefresh_Click(null, null); } private void cmdRefresh_Click(object sender, System.EventArgs e) { // Ch n t t 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 th c ny th c hi n truy v n WMI v tr v // tc v WMI cho item hi n ang c ch n trong ListBox. private ManagementObject GetSelectedJob() { try { // Ch n tc v in ph h p. 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){ // Thu c tnh Current c a enumerator khng h p l return null; } } private void lstJobs_SelectedIndexChanged(object sender, System.EventArgs e) { ManagementObject job = GetSelectedJob(); if (job == null) { txtJobInfo.Text = ""; return; } // Hi n th thng tin v tc v . string jobInfo = "Document: " + job["Document"].ToString();

Chng 8: jobInfo jobInfo jobInfo jobInfo jobInfo jobInfo += += += += += +=

269 h a, a phng ti n, v in n

Environment.NewLine; "DriverName: " + job["DriverName"].ToString(); Environment.NewLine; "Status: " + job["Status"].ToString(); Environment.NewLine; "Owner: " + job["Owner"].ToString();

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; // T m d ng tc v . int returnValue = Int32.Parse( job.InvokeMethod("Pause", null).ToString()); // Hi n 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."); } } 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) { // Ph c h i tc v . int returnValue = Int32.Parse( job.InvokeMethod("Resume", null).ToString()); // Hi n th thng tin v gi tr tr v . if (returnValue == 0) { MessageBox.Show("Successfully resumed job.");

270 Chng 8:

h a, a phng ti n, v in n }else if (returnValue == 5) { MessageBox.Show("Access denied."); }else { MessageBox.Show( "Unrecognized return value when resuming job."); }

} } }

Hnh 8.14 L y thng tin t hng

i in

Nh r ng cc quy n Windows c th ngn b n t m d ng ho c g b m t tc v in do m t ng i dng khc t o ra. Th c ra, cc quy n ny cn c th ngn b n l y thng tin tr ng thi v c th gy ra ngo i l . Cc phng th c WMI khc m b n c th s d ng trong m t k ch b n in bao g m AddPrinterConnection, SetDefaultPrinter, CancelAllJobs, v PrintTestPage, t tc u lm vi c v i l p Win32_Printer. c thm thng tin v WMI, b n hy tham kh o ti li u MSDN t i a ch [http://msdn.microsoft.com/library/en-us/wmisdk/ wmi/computer_system_hardware_classes.asp].

8.18
S d ng i u ki m Microsoft Agent.

S dng Microsoft Agent

B n mu n ng d ng c a mnh c s tr gip c a nh ng nhn v t ho t hnh nh trong Microsoft Word, Microsoft Excel... Microsoft Agent l m t k thu t dng thm cc nhn v t ho t hnh c tnh tng tc vo ng d ng hay trang web. Tnh tng tc l ch c nng chnh y u c a k thu t Microsoft Agent: cc nhn v t Microsoft Agent c th ni v p l i u vo c a ng i dng thng qua vi c nh n d ng v t ng h p gi ng ni. Microsoft s d ng k thu t ny trong cc ng d ng nh Word, Excel, v PowerPoint; gip ng i dng tm cu tr l i cho nh ng cu h i v hi u cch

Chng 8:

271 h a, a phng ti n, v in n

th c ho t

ng c a ng d ng. Microsoft cung c p thng tin v k thu t Microsoft Agent t i

[www.microsoft.com/msagent].

i u ki m Microsoft Agent cho php ng i dng tng tc v i cc ng d ng v trang web thng qua gi ng nid ng giao ti p t nhin nh t c a con ng i. Khi ng i dng ni vo micro, i u ki m ny s d ng m t b my nh n d ng gi ng ni y l ng d ng d ch m thanh u vo t micro thnh ngn ng m my tnh hi u c. i u ki m Microsoft Agent cng s d ng m t b my text-to-speech y l ng d ng d ch cc t do ng i dng nh p vo thnh m thanh c th nghe c qua loa. i u ki m Microsoft Agent cho php b n truy xu t b n nhn v t c nh ngha s n Genie (v th n), Merlin (thu t s), Peedy (con v t) v Robby (ng i my). M i nhn v t c m t t p cc hnh ng m b n c th s d ng trong ng d ng nh m minh h a cc quan i m hay ch c nng khc nhau. Ch ng h n, t p cc hnh ng c a Peedy g m cc d ng bay khc nhau m b n c th s d ng d ch chuy n Peedy trn mn hnh. B n cng c th t t o cho mnh cc nhn v t ho t hnh v i s tr gip c a Microsoft Agent Character Editor v Microsoft Linguistic Sound Editing Tool (c trong a CD nh km). V d d i y minh h a cch xy d ng m t ng d ng n gi n v i i u ki m Microsoft Agent. ng d ng ny g m hai ComboBox dng ch n m t nhn v t v m t hnh ng. Khi ng i dng ch n cc ComboBox ny, nhn v t c ch n s xu t hi n v th c hi n hnh ng c ch n. ng d ng ny s d ng vi c nh n d ng v t ng h p gi ng ni i u khi n cc hnh ng c a nhn v t: ng i dng c th b o nhn v t th c hi n hnh ng b ng cch nh n phm [Scroll Lock] v r i c tn hnh ng vo micro. V d ny cng cho php ng i dng chuy n sang m t nhn v t m i b ng cch g i tn nhn v t, v cn t o thm m t l nh ty bi n l MoveToMouse. Ngoi ra, nhn v t cng s c b t c text no m ng i dng nh p vo TextBox. Tr c khi ch y v d ny, b n ph i ci t i u ki m Microsoft Agent, b my nh n d ng gi ng ni, b my text-to-speech, v cc nh ngha nhn v t (c trong a CD nh km). c th thm i u ki m Microsoft Agent vo d n, b n hy nh p ph i vo h p cng c v ch n Add/Remove Items. K , vo th COM Components, v ch n Microsoft Agent 2.0. Nh th , Microsoft Agent s c thm vo vo h p cng c . Khi b n th i u ki m ny ln form, cc Interop Assembly c n thi t s c sinh ra v c thm vo d n.

272 Chng 8:

h a, a phng ti n, v in n

Hnh 8.15 Ch n Microsoft Agent Control 2.0 trong c a s Customize Toolbox public class FrmAgent : System.Windows.Forms.Form { // (B qua ph n m designer.) // i t ng agent hi n t i. private AgentObjects.IAgentCtlCharacter mSpeaker; // Phng th c th l s ki n KeyDown c a txtLocation. private void txtLocation_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { // Thi t l p ni lu tr nhn v t vo txtLocation. string location = txtLocation.Text; // Kh i t o cc nhn v t. try { // N p cc nhn v t vo i t ng 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 hi u txtLocation v kch ho t cc txtLocation.Enabled = false; txtSpeech.Enabled = true; cmdSpeak.Enabled = true; characterCombo.Enabled = true; actionsCombo.Enabled = true; i u ki m khc.

// Thi t l p nhn v t hi n t i l Merlin v hi n nhn v t ny. mSpeaker = mainAgent.Characters["Merlin"]; GetAnimationNames(); // Thu l y danh sch hnh ng.

Chng 8:

273 h a, a phng ti n, v in n

mSpeaker.Show(0); } catch (FileNotFoundException) { MessageBox.Show("Invalid character location", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } // Phng th c th l s ki n Click c a nt Speak. private void cmdSpeak_Click(System.Object sender, System.EventArgs e) { // N u txtSpeech r ng, nhn v t nh c ng i dng nh p text vo txtSpeech. if (txtSpeech.Text == "") { mSpeaker.Speak("Please type the words you want me to speak", ""); } else { mSpeaker.Speak(txtSpeech.Text, ""); } } // Phng th c th l s ki n Click c a 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 th c th l s ki n SelectedIndexChanged c a characterCombo // (ng i dng ch n nhn v t m i). private void characterCombo_SelectedIndexChanged(System.Object sender, System.EventArgs e) { ChangeCharacter(characterCombo.Text); } // n nh n v t hi n t i v hi n nhn v t m i. private void ChangeCharacter(string name) { mSpeaker.Hide(0); mSpeaker = mainAgent.Characters[name]; GetAnimationNames(); // Sinh l i danh sch hnh mSpeaker.Show(0); } // Thu l y tn cc hnh ng v a vo actionsCombo. private void GetAnimationNames() { // B o m tnh an ton v ti u trnh. object synclockObject = (this); Monitor.Enter(synclockObject); try { // L y tn cc hnh ng. IEnumerator enumerator =

ng.

274 Chng 8:

h a, a phng ti n, v in n mainAgent.Characters.Character(mSpeaker.Name). AnimationNames.GetEnumerator(); string voiceString; // Xa actionsCombo. actionsCombo.Items.Clear(); mSpeaker.Commands.RemoveAll(); // Thm t t c cc hnh ng (cho php ra l nh b ng gi ng ni). while (enumerator.MoveNext()) { voiceString = Convert.ToString(enumerator.Current); voiceString = voiceString.Replace("_", "underscore"); actionsCombo.Items.Add(enumerator.Current); mSpeaker.Commands.Add(Convert.ToString(enumerator.Current), "" voiceString, true, false); } // Thm l nh ty bi n. mSpeaker.Commands.Add("MoveToMouse", "MoveToMouse", "Move To Mouse", true, true);

} finally { Monitor.Exit(synclockObject); } } // Phng th c th l s ki n SelectedIndexChanged c a actionsCombo // (ng i dng ch n hnh ng m i). private void actionsCombo_SelectedIndexChanged(System.Object sender, System.EventArgs e) { mSpeaker.Stop(null); mSpeaker.Play(actionsCombo.Text); mSpeaker.Play("RestPose"); } // Phng th c th l s ki n Command c a agent. private void mainAgent_Command(System.Object sender, AxAgentObjects._AgentEvents_CommandEvent e) { AgentObjects.IAgentCtlUserInput command = ((AgentObjects.IAgentCtlUserInput)(e.userInput)); // i nhn v t n u ng i dng c tn nhn v t. if (command.Voice == "Peedy" || command.Voice == "Robby" || command.Voice == "Merlin" || command.Voice == "Genie") { ChangeCharacter(command.Voice); return; } // G i agent n chu t. if (command.Name == "MoveToMouse") { mSpeaker.MoveTo(Convert.ToInt16(Cursor.Position.X - 60), Convert.ToInt16(Cursor.Position.Y - 60), null); return;

Chng 8: } // Th c hi n hnh ng m i. mSpeaker.Stop(null); mSpeaker.Play(command.Name); } }

275 h a, a phng ti n, v in n

Hnh 8.16

ng d ng th nghi m Microsoft Agent

276

Chng 9: FILE, TH M C, V I/O

277

278 Chng 9: File, th m c, v I/O

c l p I/O c a Microsoft .NET g m hai lo i chnh. Lo i th nh t truy xu t thng tin t h th ng file v cho php th c hi n cc thao tc trn h th ng file (nh chp file, chuy n th m c). Hai l p tiu bi u l FileInfo v DirectoryInfo. Lo i th hai quan tr ng hn, g m r t nhi u l p cho php c v ghi d li u t m i ki u stream. Stream c th tng ng v i m t file nh phn hay vn b n, m t file trong khng gian lu tr ring, m t k t n i m ng, ho c m t vng m b nh . Trong m i tr ng h p, cch th c tng tc v i stream u nh nhau. Trong chng ny, chng ta s xem xt cc l p h th ng file v cc l p d atrn-stream. Cc m c trong chng ny trnh by cc v n Truy xu t v s a 9.5, v 9.16). sau: i cc thng tin c a m t file hay m t th m c (cc m c 9.1, 9.2, 9.4,

Chp, di chuy n, xa file hay th m c (m c 9.3). Hi n th ng m t cy th m c trong m t ng d ng d a-trn-Windows (m c 9.6) v s d ng cc h p tho i file (m c 9.17). c v ghi file vn b n (m c 9.7) v file nh phn (m c 9.8), cng nh t o file t m (m c 9.15) v file trong m t khng gian lu tr ring c a ng i dng (m c 9.18). c file m t cch b t ng b (m c 9.9). n 9.14). Tm file (m c 9.10) v ki m tra hai file c trng nhau hay khng (m c 9.11). Lm vi c v i cc chu i c ch a thng tin ng d n (m c 9.12 Theo di s thay i c a h th ng file (m c 9.19). Ghi ra c ng COM (m c 9.20).

9.1

Truy xut cc thng tin v file hay th mc


B n c n truy xu t cc thng tin v m t file hay m t th m c, ch ng h n ngy t o hay cc thu c tnh c a chng. T o i t ng System.IO.FileInfo cho file hay i t ng System.IO.DirectoryInfo cho th m c. Sau , truy n ng d n t i file hay th m c trong phng th c kh i d ng. Cc thng tin c n thi t s c truy xu t thng qua cc thu c tnh c a i t ng.

t o m t i t ng FileInfo hay DirectoryInfo, b n c n truy n ng d n tng i hay y trong phng th c kh i d ng c a n. B n c th l y cc thng tin v file hay th m c thng qua cc thu c tnh c a i t ng tng ng. B ng 9.1 li t k cc thnh vin c a l p FileInfo v DirectoryInfo:
B ng 9.1 Cc thnh vin c a FileInfo v DirectoryInfo Thnh vin Thu c l p FileInfo v DirectoryInfo M t

Exists

Tr v true hay false, ty thu c vo file hay th m c c t n t i ng d n c ch nh hay khng.

279 Chng 9: File, th m c, v I/O

Attributes

FileInfo v DirectoryInfo

Tr v m t ho c nhi u gi tr thu c ki u li t k System.IO.FileAttributes, cho bi t cc thu c tnh c a file hay th m c. Tr v cc th hi n System.DateTime cho bi t khi no m t file hay th m c c t o ra, truy xu t l n cu i, v c p nh t l n cu i. Tr v m t chu i ch a tn y m c hay tn file (cng ph n m ph n m r ng. , tn th r ng), v

CreationTime, LastAccessTime, v LastWriteTime FullName, Name, v Extension Length

FileInfo v DirectoryInfo

FileInfo v DirectoryInfo FileInfo

Tr v kch th c file (tnh theo byte).


DirectoryName tr v chu i ch a tn c a th m c cha; Directory tr v i t ng DirectoryInfo m t th m c cha, cho php b n truy xu t thm thng tin v n.

DirectoryName v Directory

FileInfo

Parent v Root

DirectoryInfo

Tr v i t ng DirectoryInfo m t th m c cha hay th m c g c. T o m t th m c bn trong th m c c m t b i i t ng DirectoryInfo, tn th m c c n t o c truy n cho phng th c. Tr v i t ng DirectoryInfo m t th m c con v a t o. Tr v m ng cc i t ng DirectoryInfo, m i i t ng m t m t th m c con trong th m c ny. Tr v m ng cc i t ng FileInfo, m i t ng m t m t file trong th m c ny. i t ng FileInfo v DirectoryInfo: c ngay l n u i sau th i i m i

CreateSubdirectory

DirectoryInfo

GetDirectories

DirectoryInfo

GetFiles

DirectoryInfo

Ch hai i m quan tr ng khi s d ng cc

T t c cc thu c tnh c a i t ng FileInfo v DirectoryInfo c tin b n truy xu t m t thu c tnh no . N u file hay th m c thay c p nh t cc thu c tnh. ny, b n ph i g i phng th c Refresh

S khng c l i n u b n ch nh m t ng d n khng tng ng v i m t file hay th m c ang t n t i khi t o m t i t ng FileInfo hay DirectoryInfo. Thay vo , b n s nh n c m t i t ng m t file hay th m c khng t n t ithu c tnh Exists c a n c gi tr false. B n c th s d ng i t ng ny t o file hay th m c b ng cch g i phng th c Create c a n. N u b n truy xu t thu c tnh khc, ngo i l FileNotFoundException hay DirectoryNotFoundException s b nm.

ng d ng Console d i y nh n m t ng d n file t dng l nh, v r i hi n th thng tin v file v th m c ch a file.

280 Chng 9: File, th m c, 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]); // Hi n 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(); // Hi n th thng tin th m c. DirectoryInfo dir = file.Directory; 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(); } }

281 Chng 9: File, th m c, v I/O

N u b n th c thi l nh FileInformation c:\windows\win.ini, k t xu t 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 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

B n c th s d ng cc phng th c tnh c a l p File v Directory thay cho cc phng th c c a l p FileInfo v DirectoryInfo, nhng b n ph i truy n tn file hay ng d n m i l n g i. Trong tr ng h p th c hi n nhi u thao tc v i cng m t file hay th m c th s d ng cc l p FileInfo v DirectoryInfo nhanh hn, v chng th c hi n ki m tra b o m t ch m t l n.

9.2
T o ( |) i thay

Thit lp cc thuc tnh ca file v th mc


B n c n ki m tra hay thay t ng i cc thu c tnh c a file hay th m c. cho file hay t o i t ng , s d ng cc ton t AND (&) v OR i gi tr c a thu c tnh Attributes.
System.IO.FileInfo

System.IO.DirectoryInfo cho th m c. Sau

Cc thu c tnh FileInfo.Attributes v DirectoryInfo.Attributes m t cc thu c tnh c a file nh archive, system, hidden, read-only, compressed, v encrypted (tham kh o thm trong ti li u MSDN). V m t file c th c nhi u thu c tnh nn Attributes l m t t p cc gi tr ki u li t k. ki m tra hay thay i m t thu c tnh n l , b n c n s d ng cc php ton trn bit. V d sau nh n vo m t file v ki m tra thu c tnh read-only:
using System; using System.IO; public class Attributes { private static void Main() { // Gi s file ny c thu c tnh archive v read-only. FileInfo file = new FileInfo("data.txt"); // L nh ny s hi n th chu i "ReadOnly, Archive". Console.WriteLine(file.Attributes.ToString()); // // i u ki n d i y sai, v cn c thu c tnh khc c thi t l p.

282 Chng 9: File, th m c, v I/O if (file.Attributes == FileAttributes.ReadOnly) { Console.WriteLine("File is read-only (faulty test)."); } // i u ki n d i y ng, v n ch l c ra // thu c tnh read-only. if ((file.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) { Console.WriteLine("File is read-only (correct test)."); } Console.ReadLine(); } }

hi u c v d trn, b n c n bi t r ng Attributes c t o thnh ( d ng nh phn) b i m t dy cc ch s 0 v 1, ch ng h n 00010011. M i ch s 1 cho bi t m t thu c tnh c thi t l p, m i ch s 0 cho bi t m t thu c tnh khng c thi t l p. Khi b n s d ng php AND, n s so snh m i ch s ny v i m i ch s tng ng trong gi tr li t k. V d , n u b n AND gi tr 00100001 (m t thu c tnh archive v read-only) v i gi tr li t k 00000001 (m t thu c tnh read-only), k t qu s l 00000001 (ch c c ch s 1 khi c hai v tr tng ng u l 1). Khi thi t l p m t thu c tnh, b n cng ph i s d ng php ton trn bit. Trong tr ng h p ny, b n c n c n th n khng v xa cc thu c tnh khc.
// Ch thm thu c tnh read-ony. file.Attributes = file.Attributes | FileAttributes.ReadOnly; // Ch xa thu c tnh read-only. file.Attributes = file.Attributes & ~FileAttributes.ReadOnly;

9.3

Chp, chuyn, xa file hay th mc


B n c n chp, chuy n, xa m t file hay th m c T o i t ng System.IO.FileInfo cho file hay i t ng System.IO.DirectoryInfo cho th m c, truy n ng d n cho phng th c kh i d ng. S d ng cc phng th c c a i t ng chp, chuy n, xa.

Cc l p FileInfo v DirectoryInfo cung c p nhi u phng th c dng thao tc trn file v th m c. B ng 9.2 v 9.3 trnh by cc phng th c c a l p FileInfo v DirectoryInfo.
[

B ng 9.2 Cc phng th c dng Phng th c

thao tc

i t ng FileInfo M t

CopyTo

Chp m t file sang ng d n m i, tn file c ch nh trong i s . N cng tr v m t i t ng FileInfo m t file m i c chp. B n c th truy n thm m t thng s ty ch n c gi tr true cho php chp .

283 Chng 9: File, th m c, v I/O

Create v CreateText

c ch nh v tr v m t i t ng ghi ra file. CreateText cng th c hi n nh th , nhng tr v i t ng StreamWriter gi l y stream. Xem m c 9.7 v 9.8 c thm thng tin v vi c ghi file.
FileStream dng

Create t o file

Open, OpenRead, OpenText, v OpenWrite

M m t file (n u n t n t i). OpenRead v OpenText m file trong ch ch - c, tr v m t i t ng FileStream hay StreamReader. OpenWrite m file trong ch ch -ghi, tr v c m t i t ng FileStream. Xem thm m c 9.7 v 9.8 thm thng tin v vi c c file. Xa file (n u n t n t i). Chuy n m t file n ng d n m i, tn file c ch nh trong i s . MoveTo cng c s d ng i tn m t file m khng chuy n ch .
thao tc i t ng DirectoryInfo M t

Delete

MoveTo

B ng 9.3 Cc phng th c dng Phng th c Create

T o th m c c ch nh. N u ng d n ch m c cha t n t i, t t c s c t o m t l t.

nh nhi u th

CreateSubdirectory

T o m t th m c v i tn c th bn trong th m c c m t b i i t ng DirectoryInfo. N cng tr v m t i t ng DirectoryInfo m t th m c con. Xa m t th m c (n u n t n t i). N u mu n xa m t th m c c ch a cc th m c khc, b n ph i s d ng phng th c n p ch ng Delete ch p nh n m t thng s c tn l recursive v thi t l p n l true. Chuy n m t th m c n ng d n m i. MoveTo c th s d ng i tn m t th m c m khng chuy n ch . c

Delete

MoveTo

L p DirectoryInfo khng c phng th c no dng sao chp th m c. Tuy nhin, b n c th d dng vi t c m t phng th c nh th d a trn k thu t quy v phng th c CopyTo c a i t ng FileInfo:
using System; using System.IO; public class FileSystemUtil { public static void CopyDirectory(DirectoryInfo source, DirectoryInfo destination) { if (!destination.Exists) { destination.Create(); } // Chp t t c file.

284 Chng 9: File, th m c, v I/O FileInfo[] files = source.GetFiles(); foreach (FileInfo file in files) { file.CopyTo(Path.Combine(destination.FullName, file.Name)); } // X l cc th m c con. DirectoryInfo[] dirs = sourceDir.GetDirectories(); foreach (DirectoryInfo dir in dirs) { // L y th m c ch. string destinationDir = Path.Combine(destination.FullName, dir.Name); // G i quy CopyDirectory(). CopyDirectory(dir, new DirectoryInfo(destinationDir)); } } }

V d sau s d ng phng th c v a vi t truy n qua dng l nh:


public class CopyDir {

trn

chp th m c, ng d n cc th m c c

private static void Main(string[] args) { if (args.Length != 2) { 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(); } }

9.4

Tnh kch thc ca th mc


B n c n tnh kch th c c a t t c file n m trong m t th m c (ho c c trong cc th m c con c a n). Duy t qua t t c file trong th m c, tnh t ng cc thu c tnh FileInfo.Length c a chng. S d ng k thu t quy tnh cho c cc file n m trong cc th m c con.

L p DirectoryInfo khng c thu c tnh no tr v thng tin kch th c. Tuy nhin, b n c th d dng tnh c kch th c c a t t c cc file n m trong m t th m c b ng thu c tnh FileInfo.Length.

285 Chng 9: File, th m c, v I/O

Phng th c d i y s d ng k thu t trn v c th ty ch n duy t con:


using System; using System.IO; public class FileSystemUtil {

quy qua cc th m c

public static long CalculateDirectorySize(DirectoryInfo directory, bool includeSubdirectories) { long totalSize = 0; // Duy t t t c cc file trong th m c. FileInfo[] files = directory.GetFiles(); foreach (FileInfo file in files) { totalSize += file.Length; } // Duy t t t c cc th m c con. if (includeSubdirectories) { DirectoryInfo[] dirs = directory.GetDirectories(); foreach (DirectoryInfo dir in dirs) { totalSize += CalculateDirectorySize(dir, true); } } return totalSize; } }

V d i y l ng d ng th nghi m phng th c 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(); } }

9.5

Truy xut thng tin phin bn ca file


B n c n truy xu t cc thng tin v phin b n c a file nh publisher, revision number, comment

286 Chng 9: File, th m c, v I/O

d ng phng th c tnh GetVersionInfo c a l p System.Diagnostics.

FileVersionInfo.

.NET Framework cho php b n truy xu t cc thng tin v file m khng c n d a vo Windows API. B n ch c n s d ng l p FileVersionInfo v g i phng th c GetVersionInfo v i i s l tn file. K , b n c th truy xu t thng tin thng qua cc thu c tnh c a 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]); // Hi n th cc thng tin v phin b n. 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); Console.WriteLine("IsPatched: " + info.IsPatched); Console.WriteLine("IsPreRelease: " + info.IsPreRelease); Console.WriteLine("IsPrivateBuild: " + info.IsPrivateBuild); Console.WriteLine("IsSpecialBuild: " + info.IsSpecialBuild); Console.ReadLine(); } }

D i y l k t xu t khi b n ch y l nh 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

287 Chng 9: File, th m c, v I/O

9.6 S dng TreeView hin th cy th mc just-intime


B n c n hi n th m t cy th m c trong TreeView. Tuy nhin, vi c l p cy th m c khi kh i ng t n qu nhi u th i gian. y c u trc

Thm c p th m c u tin vo TreeView, v thm m t nt gi ( n) vo m i nhnh. Ph n ng l i s ki n TreeView.BeforeExpand thm cc th m c con vo m t nhnh tr c khi n c hi n th . B th m hi n c th s d ng k thu t quy xy d ng ton b cy th m c. Tuy nhin, vi c qut h ng file theo cch ny c th ch m, c bi t i v i cc a l n. V l do ny, cc ph n m qu n l file chuyn nghi p (bao g m Windows Explorer) s d ng m t k thu t khc: ch n th nh ng thng tin no ng i dng c n n.

ki n BeforeExpand (s ki n ny pht sinh tr c khi m t c p m i c hi n th ). B n c th s d ng m t placeholder (nh d u hoa th hay nt r ng) trong t t c cc nhnh cha c thm vo. i u ny cho php b n thm vo cc ph n c a cy th m c khi chng c hi n th . s d ng ki u gi i php ny, b n c n ba y u t sau: Phng th c Fillthm m t c p m i vo m t th m c. B n s s d ng phng th c ny thm vo cc c p khi chng c m r ng. Phng th c th l s ki n Form.Loads d ng Fill t o cy v i c p u tin. Phng th c th l s ki n TreeView.BeforeExpandph n ng khi ng i dng m r ng m t nt v g i Fill n u thng tin c a th m c ny cha c thm.
System; System.IO; System.Drawing; System.Windows.Forms;

TreeView r t thch h p v i cch ti p c n ny v n cung c p s

D i y l ph n m cho form:
using using using using

public class DirectoryTree : System.Windows.Forms.Form { private System.Windows.Forms.TreeView treeDirectory; // (B qua ph n m designer.)

private void Fill(TreeNode dirNode) { DirectoryInfo dir = new DirectoryInfo(dirNode.FullPath); // M t ngo i l c th b nm n u b n khng c // quy n thao tc trn file hay th m c. // B n c th b t v b qua ngo i l ny. foreach (DirectoryInfo dirItem in dir.GetDirectories()) { // Thm nt gi cho th m c. TreeNode newNode = new TreeNode(dirItem.Name); dirNode.Nodes.Add(newNode); newNode.Nodes.Add("*"); }

288 Chng 9: File, th m c, v I/O } private void DirectoryTree_Load(object sender, System.EventArgs e) { // Thi t l p nt u tin. TreeNode rootNode = new TreeNode("C:\\"); treeDirectory.Nodes.Add(rootNode); // Thm c p th nh t v m r ng n. Fill(rootNode); treeDirectory.Nodes[0].Expand(); } private void treeDirectory_BeforeExpand(object sender, System.Windows.Forms.TreeViewCancelEventArgs e) { // N u tm th y m t nt gi , xa n v if (e.Node.Nodes[0].Text == "*") { e.Node.Nodes.Clear(); Fill(e.Node); } } } c cc th m c th t.

Hnh 9.1 M t cy th m c v i TreeView

9.7
T om t

c v ghi file vn bn
B n c n ghi d li u vo m t file vn b n theo ki u m ha ASCII, Unicode, hay UTF-8. i t ng System.IO.FileStream tham chi u n file. ghi file, hy gi FileStream trong m t System.IO.StreamWriter v s d ng phng th c n p ch ng Write. c file, hy gi FileStream trong m t System.IO.StreamReader v s d ng phng th c Read hay ReadLine.

.NET cho php b n ghi hay c vn b n b ng l p StreamWriter v StreamReader. Khi ghi d li u v i StreamWriter, hy s d ng phng th c StreamWriter.Write. Phng th c ny c n p ch ng h tr t t c cc ki u d li u thng th ng trong C# .NET, bao g m chu i, k t , s nguyn, s th c d u ch m ng, s th p phn,... Tuy nhin, phng th c Write lun

289 Chng 9: File, th m c, v I/O

chuy n d li u thnh vn b n. N u mu n chuy n vn b n ny tr v ki u ban s d ng WriteLine b o m m i gi tr c t trn m t dng ring.

u th b n nn

C nhi u cch m t m t chu i d i d ng nh phn, ty thu c vo cch m ha. Cc ki u m ha thng th ng l: ASCIIs d ng 7 bit m ha m i k t trong chu i. D li u c m ha theo ASCII khng th ch a cc k t Unicode m r ng. Khi s d ng ki u m ha ASCII trong .NET, cc bit c m thm m ng byte k t qu s c 1 byte cho m i k t . Full Unicode, hay UTF-16s d ng 16 bit byte k t qu s c 2 byte cho m i k t . m ha m i k t trong chu i, nn m ng

UTF-7 Unicodes d ng 7 bit cho cc k t ASCII bnh th ng v nhi u c p 7 bit cho cc k t m r ng. Ki u m ha ny ch y u dng cho cc giao th c 7 bit, ch ng h n mail. UTF-8 Unicodes d ng 8 bit cho cc k t ASCII bnh th ng v nhi u c p 8 bit cho cc k t m r ng. M ng byte k t qu s c 1 byte cho m i k t (gi s khng c k t m r ng).

.NET cung c p m t l p cho m i ki u m ha trong khng gian tn System.Text. Khi s d ng StreamReader v StreamWriter, b n c th ch nh ki u m ha ho c s d ng ki u m c nh l UTF-8. Khi c thng tin, s d ng phng th c Read hay ReadLine c a l p StreamReader. Phng th c Read c m t k t , hay s k t do b n ch nh, v tr v m t k t hay m ng k t . Phng th c ReadLine tr v m t chu i ch a ton b n i dung m t hng. ng d ng Console d i y minh h a vi c ghi v
using System; using System.IO; using System.Text; public class TextFileTest { private static void Main() { // T o file m i. FileStream fs = new FileStream("test.txt", FileMode.Create); // T o m t writer v ch nh ki u m // Ki u m c nh (UTF-8) h tr k t // nhng m ha cc k t chu n gi ng StreamWriter w = new StreamWriter(fs, ha. Unicode, nh ASCII Encoding.UTF8);

c m t file vn b n:

// Ghi m t s th p phn, m t chu i, v m t k t . w.WriteLine(124.23M); w.WriteLine("Test string"); w.WriteLine('!'); // B o m t t c w.Flush(); // ng file. w.Close(); fs.Close(); Console.WriteLine("Press Enter to read the information."); d li u c ghi t buffer.

290 Chng 9: File, th m c, v I/O Console.ReadLine(); // M file trong ch ch - c. fs = new FileStream("test.txt", FileMode.Open); StreamReader r = new StreamReader(fs, Encoding.UTF8); // c d li u v chuy n n v ki u thch h p. Console.WriteLine(Decimal.Parse(r.ReadLine())); Console.WriteLine(r.ReadLine()); Console.WriteLine(Char.Parse(r.ReadLine())); r.Close(); fs.Close(); Console.ReadLine(); } }

9.8
T om t

c v ghi file nh phn


B n c n ghi d li u vo file nh phn v i ki u d li u m nh. i t ng System.IO.FileStream tham chi u n file. ghi file, hy gi d ng phng th c n p ch ng Write. c file, hy gi FileStream trong m t System.IO.BinaryReader v s d ng phng th c Read ph h p v i ki u d li u.
FileStream trong m t System.IO.BinaryWriter v s

.NET cho php b n ghi hay c d li u nh phn b ng l p BinaryWriter v BinaryReader. Khi ghi d li u v i BinaryWriter, hy s d ng phng th c BinaryWriter.Write. Phng th c ny c n p ch ng h tr t t c ki u d li u thng th ng trong C# .NET, bao g m chu i, k t , s nguyn, s th c d u ch m ng, s th p phn,... Thng tin sau c m ha thnh m t dy cc byte v ghi vo file. B n c th ch nh ki u m ha cho chu i b ng m t phng th c kh i d ng n p ch ng nh n m t i t ng System.Text.Encoding lm i s ( c m t trong m c 9.7). S d ng file nh phn thao tc v i cc ki u d li u th kh ph c t p, v khi truy xu t thng tin, b n ph i s d ng m t trong nh ng phng th c Read ki u m nh c a BinaryReader. V d : mu n truy xu t d li u d ng th p phn th ph i s d ng ReadDecimal; cn mu n c m t chu i th ph i s d ng ReadString (BinaryWriter lun ghi l i chi u di c a chu i khi ghi chu i vo file trnh l i). ng d ng Console d i y minh h a vi c ghi v
using System; using System.IO; public class BinaryFileTest { private static void Main() { // T o file v t o writer. FileStream fs = new FileStream("test.txt", FileMode.Create); BinaryWriter w = new BinaryWriter(fs); // Ghi m t s th p phn, hai chu i, v m t k t .

c m t file nh phn:

291 Chng 9: File, th m c, v I/O w.Write(124.23M); w.Write("Test string"); w.Write("Test string 2"); w.Write('!'); // B o m t t c 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); // Hi n th d li u th trong file. StreamReader sr = new StreamReader(fs); Console.WriteLine(sr.ReadToEnd()); Console.WriteLine(); // c d li u v chuy n n v ki u thch h p. 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(); } } d li u c ghi t buffer.

9.9

c file mt cch bt ng b
B n c n c d li u t m t file m khng ph i d ng qu trnh th c thi m l nh c a b n. K thu t ny th ng c s d ng khi file c lu tr trong m t ni c t c truy xu t ch m (ch ng h n m t a m ng). T om tl p c file m t cch b t ng b . B t u c m t kh i d li u b ng phng th c FileStream.BeginRead, v truy n phng th c callback. Khi callback c kch ho t, g i FileStream.EndRead truy xu t d li u, x l n, v c kh i d li u k ti p v i BeginRead.

FileStream h tr ho t ng b t ng b thng qua phng th c BeginRead v EndRead. S d ng cc phng th c ny, b n c th c m t kh i d li u trn m t trong cc ti u trnh do thread-pool cung c p m khng c n s d ng tr c ti p cc l p ti u trnh trong khng gian tn System.Threading.

Khi c file m t cch b t ng b , b n c n xc nh kch th c kh i d li u trong m t l n c. Ty tr ng h p, b n c th mu n c m t kh i d li u nh (v d , chp t ng kh i m t

292 Chng 9: File, th m c, v I/O

sang file khc) ho c kh i d li u tng i l n (v d , b n c n m t l ng thng tin nh t nh tr c khi x l vi c g ). B n ch nh kch th c kh i khi g i BeginRead, v truy n m t b m ch a d li u. V BeginRead v EndRead c n truy xu t nhi u m u thng tin gi ng nhau (ch ng h n FileStream, b m, kch th c kh i,...), b n nn ng gi m l nh c file b t ng b trong m t l p. V i l p AsyncProcessor trong v d d i y, phng th c cng khai StartProcess b t u qu trnh c b t ng b . M i khi qu trnh c hon t t, OnCompletedRead c kch ho t v kh i d li u c x l. N u cn d li u trong file, m t qu trnh c b t ng b m i s c kh i ch y. Kch th c kh i b nh l 2 KB (2048 byte).
using System; using System.IO; using System.Threading; public class AsyncProcessor { private Stream inputStream; // Kch th c m i kh i d li u l 2 KB. private int bufferSize = 2048; public int BufferSize { get {return bufferSize;} set {bufferSize = value;} } // B m ch a d li u. private byte[] buffer; public AsyncProcessor(string fileName) { buffer = new byte[bufferSize]; // M file, truy n gi tr true h tr truy xu t b t inputStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, true); } public void StartProcess() { // B t u qu trnh c b t ng b . inputStream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(OnCompletedRead), null); } private void OnCompletedRead(IAsyncResult asyncResult) { // M t kh i c c. Truy xu t d li u. int bytesRead = inputStream.EndRead(asyncResult); // N u khng c c byte no, stream if (bytesRead > 0) { ang cu i file. ng b .

// T m d ng gi l p vi c x l d li u. Console.WriteLine("\t[ASYNC READER]: Read one block."); Thread.Sleep(TimeSpan.FromMilliseconds(20)); // B t u c kh i k ti p. inputStream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(OnCompletedRead), null);

293 Chng 9: File, th m c, v I/O }else { // K t thc. Console.WriteLine("\t[ASYNC READER]: Complete."); inputStream.Close(); } } }

V d d i s d ng AsyncProcessor
public class AsynchronousIO { public static void Main() {

c m t file c kch th c 1 MB.

// T o file th nghi m c kch th c 1MB. FileStream fs = new FileStream("test.txt", FileMode.Create); fs.SetLength(1000000); fs.Close(); // B t u x l b t ng b trn m t ti u trnh khc. AsyncProcessor asyncIO = new AsyncProcessor("test.txt"); asyncIO.StartProcess(); // Cng th i i m ny, th c hi n cng vi c khc. // y chng ta s l p trong 10 giy. DateTime startTime = DateTime.Now; while (DateTime.Now.Subtract(startTime).TotalSeconds < 10) { Console.WriteLine("[MAIN THREAD]: Doing some work."); // T m d ng gi l p m t thao tc t n nhi u th i gian. Thread.Sleep(TimeSpan.FromMilliseconds(100)); } Console.WriteLine("[MAIN THREAD]: Complete."); Console.ReadLine(); // Xa file th . File.Delete("test.txt"); } }

V y l k t xu t khi ch y ng d ng th nghi m:
[MAIN THREAD]: [ASYNC [ASYNC [MAIN THREAD]: [ASYNC [ASYNC [ASYNC [ASYNC [MAIN THREAD]: [ASYNC [ASYNC [ASYNC . . . Doing some work. READER]: Read one READER]: Read one Doing some work. READER]: Read one READER]: Read one READER]: Read one READER]: Read one Doing some work. READER]: Read one READER]: Read one READER]: Read one block. block. block. block. block. block. block. block. block.

294 Chng 9: File, th m c, v I/O

9.10
S

Tm file ph hp mt biu thc wildcard


i m chung, d a vo bi u th c l c nh *.dll hay

B n c n x l nhi u file c mysheet20??.xls.

GetFiles nh n m t bi u th c l c v tr v m t m ng cc

d ng phin b n n p ch ng c a phng th c System.IO.DirectoryInfo. i t ng FileInfo.

Cc i t ng DirectoryInfo v Directory u cho php d trong th m c hi n hnh tm cc file ph h p v i m t bi u th c l c. Cc bi u th c ny th ng s d ng cc k t wildcard nh ? v *. B n cng c th s d ng k thu t tng t l y cc th m c ph h p v i m t m u nh t nh b ng phng th c n p ch ng DirectoryInfo.GetDirectories. V d d i y s l y tn c a t t c cc file trong m t th m c ph h p v i m t bi u th c l c. Th m c v bi u th c l c c truy n qua dng l nh.
using System; using System.IO; public class WildcardTest { private static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine( "USAGE: WildcardTest [directory] [filterExpression]"); return; } DirectoryInfo dir = new DirectoryInfo(args[0]); FileInfo[] files = dir.GetFiles(args[1]); // Hi n th tn v kch th c file. foreach (FileInfo file in files) { Console.Write("Name: " + file.Name + " "); Console.WriteLine("Size: " + file.Length.ToString()); } Console.ReadLine(); } }

N u mu n tm trong th m c con, b n c n s d ng k thu t quy x l file, ch ng h n 9.3 v 9.4.

quy. Nhi u m c trong chng s d ng

9.11

Kim tra hai file c trng nhau hay khng


nh chng c trng nhau hay khng.

B n c n so snh n i dung c a hai file v xc

Tnh m bm c a m i file b ng l p System.Security.Cryptography.HashAlgorithm r i so snh cc m bm. C nhi u cch so snh nhi u file. V d , c th xt m t ph n c a file xem c gi ng nhau, ho c c c file so snh t ng byte. C hai cch trn u ng, nhng trong m t s tr ng h p, s d ng m bm thu n ti n hn.

295 Chng 9: File, th m c, v I/O

M t gi i thu t bm sinh ra m t d ng nh phn c trng (v i kch th c nh , th ng kho ng 20 byte) cho file. C kh nng hai file khc nhau c cng m bm, nhng kh nng ny h u nh khng x y ra. Th c t , c nh ng thay i nh nh t (ch ng h n, ch thay i m t bit c a file ngu n) cng c 50% kh nng thay i cc bit c a m bm. Do , m bm th ng c s d ng pht hi n d li u b s a i (m bm s c c p chi ti t hn trong chng 14). t o m t m bm, tr c h t b n ph i t o m t i t ng HashAlgorithm b ng phng th c tnh HashAlgorithm.Create. Sau g i HashAlgorithm.ComputeHash nh n m t m ng byte ch a m bm. V d d i y khng: c hai tn file t i s dng l nh v ki m tra hai file ny c trng nhau hay

using System; using System.IO; using System.Security.Cryptography; public class CompareFiles { private static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine("USAGE: [fileName]"); return; } CompareFiles [fileName] " +

Console.WriteLine("Comparing " + args[0] + " and " + args[1]); // T o i t ng bm. HashAlgorithm hashAlg = HashAlgorithm.Create(); // Tnh m bm cho file th nh t. 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."); } Console.ReadLine(); } }

Cc m bm c so snh b ng cch chuy n chng thnh chu i. B n cng c th duy t qua m ng v so snh t ng byte. Cch ny nhanh hn m t t, nhng vi c chuy n 20 byte thnh chu i khng t n nhi u chi ph nn khng c n thi t.

296 Chng 9: File, th m c, v I/O

9.12

Thao tc trn ng dn file


d ng

B n c n l y m t ph n ng d n file ho c ki m tra m t ng d n file c chu n hay khng.

X l ng d n b ng l p System.IO.Path. B n c th s d ng Path.GetFileName l y tn file t ng d n, Path.ChangeExtension thay i ph n m r ng c a ng d n, v Path.Combine t o ng d n y m khng c n quan tm th m c c a b n c k t phn cch th m c(\) hay cha. Th ng kh thao tc v i cc ng d n file v c v s cch m t m t th m c. V d , b n c th s d ng ng d n tuy t i (C:\Temp), ng d n UNC (\\MyServer\\MyShare\Temp), ho c m t trong cc ng d n tng i (C:\Temp\MyFiles\..\ hay C:\Temp\MyFiles\..\..\Temp). Cch d nh t x l cc ng d n file l s d ng cc phng th c tnh c a l p Path m c thng tin ng. V d , o n m sau trch tn file t m t ng d n file:
string filename = @"..\System\MyFile.txt"; filename = Path.GetFileName(filename); // filename by gi l "MyFile.txt".

b o

V o n m sau s d ng Path.Combine

thm tn file vo ng d n th m c:

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 i m l k t phn cch th m c (\) s t c n thi t. L p Path cng cung c p cc phng th c h u ch sau y d n:
ChangeExtensionthay

ng c thm vo ng d n n u thao tc trn thng tin ng

ch

i ph n m r ng c a file. N u ph n m r ng m i khng c nh, ph n m r ng hi n t i s b xa. v thng tin c a cc th m c n m gi a k t phn cch th u v cu i.

GetDirectoryNametr

m c (\)

GetFileNameWithoutExtensiontng t nh GetFileName, nhng b ph n m r ng. GetFullPathkhng c tc d ng i v i ng d n tuy t i, v n s d ng th m c hi n hnh i m t ng d n tng i thnh ng d n tuy t i. V d , n u C:\Temp\ l th m c hi n hnh, g i GetFullPath cho file test.txt s tr v C:\Temp\ test.txt. GetPathRoottr v chu i ch a th m c g c (v d , "C:\").

i v i ng d n tng

i, n tr v tham chi u r ng.


HasExtensiontr v true n u ng d n k t thc v i ph n m r ng.

297 Chng 9: File, th m c, v I/O

IsPathRootedtr v true n u ng d n l tuy t

i, false n u ng d n l tng

i. Trong h u h t tr ng h p, m t ngo i l s b nm n u b n truy n ng d n khng h p l cho m t trong cc phng th c ny (ch ng h n, ng d n c ch a cc k t khng h p l ). Tuy nhin, nh ng ng d n khng h p l do ch a cc k t wildcard s khng lm sinh ra ngo i l .

9.13 Xc nh ng dn tng ng vi mt file hay th


mc
B n c m t ng d n ( d ng chu i), v c n xc m c hay m t file. C hai l p System.IO.Directory v System.IO.File nh n tng ng v i m t th

Ki m tra ng d n v i phng th c Directory.Exists v File.Exists. u c phng th c Exists. i ho c tuy t i) tng ng


Directory.Existstr v true n u ng d n (tng v i m t th m c ang t n t i.

File.Existstr v true n u ng d n tng ng v i m t file ang t n t i.

S d ng hai phng th c ny, b n c th nhanh chng xc v i m t file hay th m c 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) { 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(); } }

nh m t ng d n c tng ng

298 Chng 9: File, th m c, v I/O

9.14
S

Lm vic vi ng dn tng i
c th s d ng ng d n tng

B n c n thi t l p th m c lm vi c hi n hnh i trong m l nh c a b n.


System.IO.Directory.

d ng phng th c tnh GetCurrentDirectory v SetCurrentDirectory c a l p

ng d n tng i t ng c di n d ch d a trn quan h v i th m c hi n hnh. B n c th l y th m c hi n hnh b ng phng th c Directory.GetCurrentDirectory ho c thay i n b ng phng th c Directory.SetCurrentDirectory. Ngoi ra, b n c th s d ng phng th c tnh GetFullPath c a l p System.IO.Path chuy n ng d n tng i thnh ng d n tuy t i. D i y l m t v d minh h a:
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: '" + 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(); } }

K t xu t c a ng d ng ny c th nh sau (n u b n ch y ng d ng trong th m c 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'

N u s d ng ng d n tng i, b n nn thi t l p th m c lm vi c khi b t u tng tc v i file. N u khng, c th nh h ng n s an ton c a h th ng n u ng i dng c thay i th m c lm vi c ng d ng c a b n truy xu t ho c ghi file h th ng.

299 Chng 9: File, th m c, v I/O

9.15
B n c n t o m t file s c c tn duy nh t, n khng trnh khc.

To file tm
t trong th m c t m c a ng i dng c th v s ng v i cc file t m c sinh ra b i cc chng

S d ng phng th c tnh GetTempFileName c a l p System.IO.Path, phng th c ny tr v m t ng d n k t h p ng d n n th m c t m v i m t tn file c t o nh u nhin. C nhi u cch t o file t m. Trong cc tr ng h p n gi n, b n ch c n t o m t file trong th m c ng d ng, c th s d ng m t GUID ho c m t tem th i gian k t h p v i m t gi tr ng u nhin lm tn file. Tuy nhin, l p Path h tr m t phng th c gip b n t n cng hn. N s t o ra m t file v i tn duy nh t trong th m c t m c a ng i dng hi n hnh, ch ng h n C:\Documents and Settings\username\Local Settings\Temp\tmpac9.tmp.
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 fs.Close(); // Xa file. File.Delete(tempFile); Console.ReadLine(); } } li u.)

9.16
B n c n xt m t a v xc

Ly dung lng a cn trng


nh cn bao nhiu byte tr ng.

S d ng hm khng- c-qu n-l Win32 API GetDiskFreeSpaceEx, (hm ny c khai bo trong kernell32.dll). Khng l p no trong cc l p v h th ng file c a .NET cho php xc nh dung l ng a cn tr ng. Tuy nhin, b n c th d dng l y c thng tin ny b ng hm Win32 API GetDiskFreeSpaceEx. Hm ny s tr v dung l ng t ng c ng, dung l ng cn tr ng, v dung l ng cn tr ng c th s d ng c (nh qu n tr c th s d ng Disk Quota Management h n ch dung l ng m ng i dng c th s d ng c).

300 Chng 9: File, th m c, v I/O

Hnh 9.2 Disk Quota Management

ng d ng Console d i y minh h a k thu t 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); 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(); } }

9.17

Hin th cc hp thoi file


m , lu file, v ch n th m c.

B n c n hi n cc h p tho i Windows chu n

301 Chng 9: File, th m c, v I/O

S d ng cc l p OpenFileDialog, SaveFileDialog, v FolderBrowserDialog thu c khng gian tn System.Windows.Forms. G i phng th c ShowDialog hi n th h p tho i, xt gi tr tr v xc nh ng i dng nh n OK hay Cancel, v l y thng tin t thu c tnh FileName hay SelectedPath. .NET cung c p cc i t ng b c l y nhi u h p tho i Windows chu n, bao g m cc h p tho i dng m v lu file, v ch n th m c. T t c cc l p ny u th a k t System.Windows.Forms.CommonDialog, bao g m: ng d n c th c l y t thu c tnh FileName (hay t p h p FileNames, n u b n cho php ch n nhi u file b ng cch thi t l p Multiselect l true). Ngoi ra, b n c th s d ng thu c tnh Filter ch n nh d ng file v thi t l p thu c tnh CheckFileExists ki m tra tnh h p l (xem hnh 9.3).
[

OpenFileDialogcho php ng i dng ch n m t file. Tn file v

Hnh 9.3 OpenFileDialog

nh m t file m i. Tn file v ng d n c th c l y t thu c tnh FileName. B n c th s d ng thu c tnh Filter ch n nh d ng file v thi t l p cc thu c tnh CreatePrompt v OverwritePrompt hi n th thng bo xc nh n khi ng i dng ch n m t file m i hay file t n t i. ng d n ch n c th c l y t thu c tnh SelectedPath. Ngoi ra, b n c th thi t l p thu c tnh ShowNewFolderButton hi n th nt Make New Folder (xem hnh 9.4).
FolderBrowserDialogcho php ng i dng ch n (v t o) m t th m c.

SaveFileDialogcho php ng i dng ch

302 Chng 9: File, th m c, v I/O

Hnh 9.4 FolderBrowserDialog

Khi s d ng OpenFileDialog hay SaveFileDialog, b n c n thi t l p chu i l c (ch nh cc ph n m r ng c php). Chu i l c c phn cch b i k t "|" theo nh d ng: "[Nhn] | [Danh sch cc ph n m r ng c phn cch b i d u ch m ph y] | [Nhn] | [Danh sch cc ph n m r ng c phn cch b i d u ch m ph y] | ...". B n cng c th thi t l p thu c tnh Title (tiu ) v InitialDirectory (th m c ban u). ng d ng d i y cho php ng i dng n p ti li u vo m t RichTextBox, s a n i dung, v lu ti li u c s a (s d ng l p OpenFileDialog v SaveFileDialog m v lu ti li u).
using System; using System.Drawing; using System.Windows.Forms; public class SimpleEditForm : System.Windows.Forms.Form { private private private private private // (B System.Windows.Forms.MenuItem mnuFile; System.Windows.Forms.MenuItem mnuOpen; System.Windows.Forms.MenuItem mnuSave; System.Windows.Forms.MenuItem mnuExit; System.Windows.Forms.RichTextBox rtDoc; qua ph n 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) {

303 Chng 9: File, th m c, v I/O SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "RichText Files (*.rtf)|*.RTF|Text Files (*.txt)|*.TXT" + "|All files (*.*)|*.*"; dlg.CheckFileExists = true; dlg.InitialDirectory = Application.StartupPath; if (dlg.ShowDialog() == DialogResult.OK) { rtDoc.SaveFile(dlg.FileName); } } private void mnuExit_Click(object sender, System.EventArgs e) { this.Close(); } }

9.18
B n c n lu d
FileIOPermission

S dng khng gian lu tr ring


li u vo file, nhng s d ng a c ng. ng d ng c a b n khng c c p

S d ng cc l p IsolatedStorageFile v IsolatedStorageFileStream thu c khng gian tn System.IO.IsolatedStorage. Cc l p ny cho php ng d ng ghi d li u vo m t file trong th m c c a m t ng i dng c th m khng c n c c p php truy xu t tr c ti p a c ng c c b . .NET Framework h tr khng gian lu tr ring, t c l cho php b n c v ghi vo h th ng file o c a ng i dng c th m CLR qu n l. Khi b n t o cc file lu tr ring, d li u t ng c lu vo m t ni duy nh t trong ng d n profile c a ng i dng (thng th ng ng d n ny c d ng C:\Documents and Settings\[username]\Local Settings\Application Data\IsolatedStorage\ [guid_identifier]). M t l do s d ng khng gian lu tr ring l trao cho m t ng d ng c- -tin c y-m tph n c kh nng h n ch khi lu tr d li u (xem m c 13.1 c thm thng tin v m l nh c- -tin-c y-m t-ph n). V d , chnh sch b o m t CLR m c nh c p cho m l nh c c b c FileIOPermission khng h n ch , t c l c quy n c v ghi b t k file no. M l nh th c thi t m t my ch xa trn m ng Intranet c c b t ng c c p t quy n hnthi u m t FileIOPermission, nhng c IsolatedStoragePermission, t c l c kh nng s d ng khng gian lu tr ring (chnh sch b o m t cng h n ch dung l ng t i a c th c s d ng trong khng gian lu tr ring). M t l do khc s d ng khng gian lu tr ring l b o v d li u t t hn. V d , i v i d li u trong khng gian lu tr ring c a m t ng i dng, nh ng ng i dng khc khng ph i l nh qu n tr s khng c quy n truy xu t. o n m d i y minh h a cch truy xu t khng gian lu tr ring:
using System; using System.IO; using System.IO.IsolatedStorage; public class IsolatedStoreTest { private static void Main() {

304 Chng 9: File, th m c, v I/O // T o khng gian lu tr ring cho ng i dng hi n hnh. IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForAssembly(); // T o m t th m c t i g c c a khng gian lu tr store.CreateDirectory("MyFolder"); // T o m t 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 th ng. 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(); } } ring.

Theo m c nh, m i khng gian lu tr ring c tch bi t b i ng i dng v assembly. i u ny c ngha l khi cng m t ng i ch y cng m t ng d ng, ng d ng ny s truy xu t d li u trong cng khng gian lu tr ring. Tuy nhin, b n c th tch bi t thm b i mi n ng d ng nhi u th hi n c a cng m t ng d ng nh n cc khng gian lu tr ring khc nhau, nh v d sau:
// Truy xu t khng gian lu tr ring c a ng i dng // v assembly hi n t i (tng t v d trn). store = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null); // Truy xu t khng gian lu tr ring c a ng i dng, assembly, // v mi n ng d ng hi n hnh. Ni cch khc, d li u ny ch c // truy xu t b i th hi n hi n t i c a ng d ng. store = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly | IsolatedStorageScope.Domain, null, null);

File c lu tr nh m t ph n profile c a ng i dng, v v y ng i dng c th truy xu t cc file ny t b t k my no trong m ng LAN n u roaming profile1 c c u hnh (trong tr ng h p ny, ph i thi t l p c IsolatedStorageFile.Roaming khi t o khng gian lu tr ).
1

Roaming profile c t o b i ng i qu n tr h th ng v c lu tr trn m t server. Profile ny c s n m i khi b n ng nh p vo b t k my tnh no trn m ng. B t c thay i no cng khi n roaming profile c c p nh t l i trn server.

305 Chng 9: File, th m c, v I/O

B ng cch .NET Framework v CLR cung c p cc m c cch ly, b n khng ph i duy tr s tch bi t gi a cc file, v khng ph i lo vi c khng hi u r c ch lm vi c s gy m t d li u quan tr ng.

9.19

Theo di h thng file pht hin thay i


i t i m t ng d n c th (ch ng h n

B n c n ph n ng khi h th ng file thay s a hay t o file).

S d ng thnh ph n System.IO.FileSystemWatcher, ch nh file ho c ng d n c n theo di, v th l cc s ki n Created, Deleted, Renamed, v Changed. Khi lin k t nhi u ng d ng v cc qu trnh nghi p v , th ng c n t o m t chng trnh th ng v ch tr nn tch c c khi m t file c t o ra ho c b thay i. B n c th t o ki u chng trnh th ny b ng cch qut nh k qua m t th m c, nhng l i g p ph i v n cn b ng. Qut cng th ng xuyn, cng t n ti nguyn h th ng. Qut cng t, cng lu pht hi n c thay i. Cch ti n nh t l s d ng l p FileSystemWatcher ph n ng tr c ti p cc s ki n file c a Windows. s d ng FileSystemWatcher, b n ph i t o m t th hi n v thi t l p cc thu c tnh sau:
Pathch Filterch

nh ng d n c n theo di. nh ki u file c n theo di. nh ki u thay i c n theo di.

NotifyFilterch

FileSystemWatcher sinh ra b n s ki n chnh: Created, Deleted, Renamed, v Changed. Cc s ki n ny cung c p thng tin qua i s FileSystemEventArgs, bao g m tn file (Name), ng d n y (FullPath), ki u thay i (ChangeType). S ki n Renamed cung c p th hi n RenamedEventArgs d n xu t t FileSystemEventArgs, v thm thng tin v tn file ban u (OldName v OldFullPath). N u c n, b n c th v hi u cc s ki n ny b ng cch thi t l p thu c tnh FileSystemWatcher.EnableRaisingEvents l false. D dng th l cc s ki n Created, Deleted, v Renamed. Nhng n u mu n s d ng s ki n Changed, b n c n s d ng thu c tnh NotifyFilter ch nh ki u thay i c n theo di. B ng khng, chng trnh c a b n c th b sa l y b i m t lo t cc s ki n khi file b thay i.

Thu c tnh NotifyFilter c th c thi t l p b ng cch k t h p cc gi tr thu c ki u li t k System.IO.NotifyFilters: Attributes, CreationTime, DirectoryName, FileName, LastWrite, LastAccess, Security, v Size. V d d i y th l s ki n Created v Deleted. V th nghi m cc s ki n ny b ng cch t o ra m t file th nghi m.
using System; using System.IO; using System.Windows.Forms; public class FileWatcherTest { private static void Main() { // C u hnh FileSystemWatcher.

306 Chng 9: File, th m c, v I/O FileSystemWatcher watch = new FileSystemWatcher(); watch.Path = Application.StartupPath; watch.Filter = "*.*"; watch.IncludeSubdirectories = true; // ng k cc phng th c th l s ki n. 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(); } // Pht sinh khi m t file m i c t o ra // trong th m c c n theo di. private static void OnCreatedOrDeleted(object sender, FileSystemEventArgs e) { // Hi n th thng bo. Console.WriteLine("\tNOTIFICATION: " + e.FullPath + "' was " + e.ChangeType.ToString()); Console.WriteLine(); } }

9.20
B n c n g i d li u tr c ti p

Truy xut cng COM


n m t c ng tu n t (serial port).

Win32 API cung c p cc hm khng- c-qu n-l trong th vi n kernell32.dll tr c ti p c v ghi cc byte n c ng tu n t . B n c th nh p cc hm ny vo ng d ng ho c s d ng Microft Communications ActiveX control (MSComm.ocx c trong Microsoft Visual Studio 6). .NET khng cung c p b t k giao di n c-qu n-l no thao tc v i cc c ng tu n t . Do , nh ng ai c n ch c nng ny s ph i lm vi c v i cc c ch tng i ph c t p. M t h ng gi i quy t l t o m t v b c .NET cho Microsoft Communications Control (MSComm.ocx). i u ki m ny cung c p m t m hnh i t ng m c-cao lm vi c v i c ng tu n t . Tuy nhin, b n ph i thu l y i u ki m ny thng qua Visual Studio 6 (b n c th ch ch n ci t cc thnh ph n ActiveX khi ci t Visual Studio 6, t n kho ng 5MB). c thm thng tin, b n hy tham kh o ti li u Visual Studio 6.

307 Chng 9: File, th m c, v I/O

M t h ng gi i quy t khc l nh p cc hm API t th vi n kernell32.dll. C n c n th n khi s d ng phng php ny v b n ph i s d ng ng ki u d li u C# v duy tr layout c a cc c u trc b nh . May m n l, v n ny c Justin Harrell (jharrell@aciss.com) gi i quy t v i m t l p C# ty bi n c tn l ComPort. M l nh c a l p ny kh di, b n hy xem trong a CD nh km. B n c th thm l p ComPort vo ng d ng c a b n v s d ng o n m sau m t c ng COM.
ComPort port = new ComPort(); try { // C u hnh cho c ng. port.BaudRate = 9600; port.Parity = 0; port.PortNum = 1; port.ReadTimeout = 10; port.StopBits = 1; port.ByteSize = 1; // M c ng. port.Open(); // Ghi d li u. port.Write(new byte[1]); // ng c ng. port.Close(); }catch (ApplicationException err) { Console.WriteLine(err.Message); }

tng tc v i

308 Chng 9: File, th m c, v I/O

309

Chng 10: C S

LI U

10

310

Chng 10: C s d

311 li u

rong Microsoft .NET Framework, vi c truy xu t n cc lo i data-source (ngu n d li u) c cho php thng qua m t nhm cc l p c tn l Microsoft ADO.NET. M i lo i data-source c h tr thng qua m t data-provider (b cung c p d li u). M i data-provider g m t p cc l p khng ch hi n th c t p giao di n chu n, m cn cung c p ch c nng duy nh t c a data-source m n h tr . Cc l p ny m t v k t n i, cu l nh, thng s , data-adapter (b i u h p d li u), v data-reader (b c d li u) m qua , b n c th tng tc v i m t lo i data-source. B ng 10.1 li t k cc hi n th c data-provider trong .NET.
B ng 10.1 Cc hi n th c 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 c p k t n i n m i data-source c hi n th c giao di n ODBC; bao g m Microsoft SQL Server, Oracle, v Microsoft Access. Cc l p data-provider n m trong khng gian tn System.Data.Odbc v c ti n t Odbc. Cung c p k t n i n m i data-source c hi n th c giao di n OLE DB; bao g m Microsoft SQL Server, MSDE, Oracle, v Jet. Cc l p dataprovider n m trong khng gian tn System.Data.OleDb v c ti n t OleDb. Cung c p k t n i n Oracle. Cc l p data-provider n m trong khng gian tn System.Data.OracleClient v c ti n t Oracle. Cung c p k t n i n Microsoft SQL Server phin b n 7 v m i hn (g m c MSDE) b ng cch lin l c tr c ti p v i SQL Server m khng c n s d ng ODBC hay OLE DB. Cc l p data-provider n m trong khng gian tn System.Data.SqlClient v c ti n t Sql. Cung c p k t n i n Microsoft SQL Server CE. Cc l p data-provider n m trong khng gian tn System.Data.SqlServerCe v c ti n t SqlCe.

Chng ny m t m t vi kha c nh th ng c s d ng nh t c a ADO.NET. Tuy nhin, ADO.NET l m t ph n con m r ng c a th vi n l p .NET Framework v ch a m t l ng l n cc ch c nng cao c p. Do , c th hi u r hn v ADO.NET, b n nn tm c m t quy n sch khc chuyn v ADO.NET. Nh ng m c trong chng ny trnh by cc v n sau: Cch t o, c u hnh, m , v ng k t n i c s d li u (m c 10.1). Cch s d ng connection-pooling c i thi n hi u nng v tnh quy m c a cc ng d ng c s d ng k t n i c s d li u (m c 10.2). Cch th c thi cc cu l nh SQL v cc th t c t n tr (Stored Procedure), v cch s d ng cc thng s c i thi n tnh linh ho t c a chng (m c 10.3 v 10.4). Cch x l k t qu c tr v t truy v n c s d li u (m c 10.5 v 10.6). i t ng SQL Server ang c hi u l c trn m ng (m c 10.7). Cch nh n bi t t t c cc

312 Chng 10: C s d

li u

c file Excel v i ADO.NET (m c 10.8). Cch s d ng Data Form Wizard (m c 10.9) v Crystal Report Wizard (m c 10.10). Nh ng m c trong chng ny s d ng c s d li u m u Northwind (do Microsoft c p) lm r nh ng k thu t c th o lu n.

10.1
B nc nm m tk tn i n m t c s d li u.

Kt ni c s d liu

T o m t i t ng k t n i ph h p v i ki u c s d li u m b n c n k t n i; t t c cc i t ng k t n i u hi n th c giao di n System.Data.IDbConnection. C u hnh i t ng k t n i b ng cch thi t l p thu c tnh ConnectionString c a n. M k t n i b ng cch g i phng th c Open c a i t ng k t n i. B c u tin trong vi c truy xu t c s d li u l m m t m t k t n i n c s d li u. Giao di n IDbConnection m t m t k t n i c s d li u, v m i data-provider ch a m t hi n th c duy nh t. D i y l danh sch cc hi n th c IDbConnection cho nm data-provider chu n:

System.Data.Odbc.OdbcConnection System.Data.OleDb.OleDbConnection System.Data.OracleClient.OracleConnection System.Data.SqlServerCe.SqlCeConnection System.Data.SqlClient.SqlConnection

B n c u hnh m t i t ng k t n i b ng m t chu i k t n i. Chu i k t n i l m t t p cc c p gi tr tn c phn cch b ng d u ch m ph y. B n c th cung c p m t chu i k t n i lm i s trong phng th c kh i d ng ho c b ng cch thi t l p thu c tnh ConnectionString c a i t ng k t n i tr c khi m k t n i. M i hi n th c l p k t n i yu c u b n cung c p nh ng thng tin khc nhau trong chu i k t n i. B n hy tham kh o ti li u v thu c tnh ConnectionString i v i m i hi n th c bi t c nh ng gi tr m b n c th ch nh. D i y l m t s thi t l p: Tn server c s d li u ch Tn c s d li u c n m vo lc Gi tr timeout c a k t n i C ch connection-pooling (xem m c 10.2) C ch xc th c dng khi k t n i cung c p username v password n cc c s d li u c b o m t, bao g m vi c u

M t khi c c u hnh, g i phng th c Open c a i t ng k t n i m k t n i n c s d li u. K , b n c th s d ng i t ng k t n i th c thi nh ng cu l nh d a vo data-source (s c th o lu n trong m c 10.3). Cc thu c tnh c a i t ng k t n i cng cho php b n l y thng tin v tr ng thi c a m t k t n i v nh ng thi t l p c s d ng m k t n i. Khi hon t t m t k t n i, b n nn g i phng th c Close gi i phng cc ti nguyn h th ng v k t n i c s d li u n m d i. IDbConnection c th a k t

Chng 10: C s d System.IDisposable, ngha l m i l p k t n i s

313 li u

hi n th c phng th c Dispose. Phng th c ny s t ng g i Close, cho nn l nh using l m t cch r t r rng v hi u qu khi s d ng i t ng k t n i trong m l nh. t c hi u nng t i u trong vi c truy c p d li u th ph i m k t n i c s d li u cng ch m cng t t, v khi hon t t th ng t k t n i cng s m cng t t. Vi c ny b o m r ng, b n khng truy xu t t i k t n i c s d li u trong m t th i gian di v m l nh c c h i cao nh t gi l y k t n i. i u ny c bi t quan tr ng n u b n ang s d ng connection-pooling. o n m d i y trnh by cch s d ng l p SqlConnection m m t k t n i n SQL Server ang ch y trn my c c b c s d ng Integrated Windows Security (b o m t tch h p v i Windows). truy xu t n m t my t xa, ch c n thay i data-source t localhost thnh tn c a i t ng c s d li u.
// T o i t ng SqlConnection r ng. using (SqlConnection con = new SqlConnection()) { // C u hnh chu i k t n i c a con.ConnectionString = "Data Source = localhost;"+ "Database = Northwind;" + "Integrated Security=SSPI"; // M k t n i c s con.Open(); d li u. i t ng SqlConnection. // i t ng SQL Server c c b // C s d li u m u Northwind // Integrated Windows Security

// Hi n th thng tin v k t n i. if (con.State == ConnectionState.Open) { Console.WriteLine("SqlConnection Information:"); Console.WriteLine(" Connection State = " + con.State); Console.WriteLine(" Connection String = " + con.ConnectionString); Console.WriteLine(" Database Source = " + con.DataSource); Console.WriteLine(" Database = " + con.Database); Console.WriteLine(" Server Version = " + con.ServerVersion); Console.WriteLine(" Workstation Id = " + con.WorkstationId); Console.WriteLine(" Timeout = " + con.ConnectionTimeout); Console.WriteLine(" Packet Size = " + con.PacketSize); } else { Console.WriteLine("SqlConnection failed to open."); Console.WriteLine(" Connection State = " + con.State); } // Cu i kh i using, Dispose s g i Close. }

o n m d i y trnh by m t chu i k t n i dng m m tk tn i trn (n u b n ang s d ng OLE DB Data Provider th c hi n k t n i):


// T o m t i t ng OleDbConnection r ng. using (OleDbConnection con = new OleDbConnection()) { // C u hnh chu i k t n i c a i t con.ConnectionString = "Provider = SQLOLEDB;" + "Data Source = localhost;" + "Initial Catalog = Northwind;" + "Integrated Security=SSPI"; // M k t n i c s con.Open(); d li u. ng OleDbConnection.

n c s d li u

// OLE DB Provider for SQL Server // i t ng SQL Server c c b // C s d li u m u Northwind // Integrated Windows Security

314 Chng 10: C s d }

li u

10.2

S dng connection-pooling
c i thi n hi u nng v i t ng

B n mu n duy tr m t pool ch a cc k t n i ang m tnh quy m cho m t h th ng l n.

C u hnh pool b ng cch s d ng cc thi t l p trong chu i k t n i c a k t n i.

Connection-pooling lm gi m ng k t ng ph lin h p v i vi c t o v h y k t n i c s d li u. Connection-pooling cng c i thi n tnh quy m c a cc gi i php b ng cch gi m s l ng k t n i ng th i m m t c s d li u ph i duy tr a s th ng ng i khng su t m t ph n ng k thu c th i gian s ng c a chng. V i connection-pooling, thay v t o v m m t i t ng k t n i m i m i khi c n, b n c th l y k t n i m t pool. Khi b n hon t t vi c s d ng k t n i, thay v ng n, b n tr n v cho pool v cho php o n m khc s d ng n. Theo m c nh, SQL Server v Oracle Data Provider cung c p ch c nng connectionpooling. M t pool s hi n di n i v i m i chu i k t n i do b n ch nh khi m m t k t n i m i. M i khi b n m m t k t n i m i v i chu i k t n i c s d ng qua, n s c l y t pool hi n c. Ch khi b n ch nh m t chu i k t n i khc th data-provider m i t o m t pool m i. B n c th i u khi n cc c tnh c a pool b ng cch s d ng cc thi t l p trong chu i k t n i c m t trong b ng 10.2. M t khi c t o, pool s t n t i cho
B ng 10.2 Cc thi t l p trong chu i k t n i dng Thi t l p

n khi ti n trnh k t thc.


i u khi n Connection Pooling M t

Connection Lifetime

Ch nh th i gian t i a (tnh b ng giy) m m t k t n i c php s ng trong pool tr c khi n b ng. Tu i c a m t k t n i c ki m tra ch khi k t n i c tr v cho pool. Thi t l p ny c n thi t trong vi c thu nh kch th c pool n u pool khng c s d ng nhi u v cng b o m tnh cn b ng t i c th c hi n t i u trong mi tr ng c s d li u gom t . Gi tr m c nh l 0, c ngha l k t n i t n t i trong th i gian s ng c a ti n trnh hi n th i. Ch c SQL Server Data Provider h tr . Ch nh k t n i c c reset hay khng khi chng c l y t pool. Gi tr True b o m tr ng thi c a k t n i c reset nhng c n ph i thng bo cho c s d li u. Gi tr m c nh l True. Thi t l p l False l True. c c k t n i khng l y t pool. Gi tr m c nh

Connection Reset

Pooling

Chng 10: C s d

315 li u

Max Pool Size

Ch nh s l ng k t n i t i a c n c trong pool. Cc k t n i c t o v thm vo pool khi c yu c u cho n khi t n con s ny. N u m t yu c u k t n i c th c hi n nhng khng cn k t n i tr ng th l i g i s block cho n khi c m t k t n i c hi u l c. Gi tr m c nh l 100. Ch nh s l ng k t n i t i thi u c n c trong pool. Lc t o pool th s k t n i ny c t o v thm vo pool. Trong qu trnh duy tr nh k ho c khi m t k t n i c yu c u, cc k t n i s c thm vo pool b o m s l ng k t n i t i thi u c hi u l c. Gi tr m c nh l 0.

Min Pool Size

o n m d i y m t c u hnh c a m t pool: ch a t i thi u 5 k t n i v t i a 15 k t n i, k t n i s h t hi u l c sau 10 pht (600 giy) v c reset m i khi m t k t n i c l y t pool.
// Thu l y pooled connection. using (SqlConnection con = new SqlConnection()) { // C u hnh chu i k t n i c a i t ng SqlConnection. con.ConnectionString = "Data Source = localhost;" + // i t ng SQL Server c c b "Database = Northwind;" + // C s d li u m u Northwind "Integrated Security = SSPI;" + // Integrated Windows Security "Min Pool Size = 5;" + // Kch th c t i thi u c a pool "Max Pool Size = 15;" + // Kch th c t i a c a pool "Connection Reset = True;" + // Reset k t n i m i khi s d ng "Connection Lifetime = 600"; // Th i gian s ng t i a // M k t n i c s con.Open(); // Truy xu t c s d d li u. li u...

// Cu i kh i using, Dispose s g i Close, // tr k t n i v cho pool ti s d ng. }

o n m d i y m t cch s d ng thi t l p Pooling c c m t i t ng k t n i khng ph i l y t pool. i u ny c n thi t khi ng d ng c a b n s d ng m t k t n i n "s ng lu".


// Thu l y non-pooled connection. using (SqlConnection con = new SqlConnection()) { // C u hnh chu i k t n i c a i t ng SqlConnection. con.ConnectionString = "Data Source = localhost;" + // i t ng SQL Server c c b "Database = Northwind;" + // C s d li u m u Northwind "Integrated Security = SSPI;" + // Integrated Windows Security "Pooling = False"; // Ch nh non-pooled connection // M k t n i c s con.Open(); // Truy xu t c s d d li u. li u...

316 Chng 10: C s d

li u

// Cu i kh i using, Dispose s g i Close, // ng non-pooled connection. }

ODBC v OLE DB Data Provider cng h tr connection-pooling, nhng chng khng hi n th c connection-pooling bn trong cc l p .NET, nn b n khng th c u hnh pool theo cch nh SQL Server hay Oracle Data Provider. Connection-pooling trong ODBC c qu n l b i ODBC Driver Manager v c c u hnh b ng cng c ODBC Data Source Administrator trong Control Panel. Connection-pooling trong OLE DB c qu n l b i hi n th c OLE DB nguyn sinh; b n c th lm m t hi u l c pooling b ng cch thm thi t l p OLE DB Services=-4; vo chu i k t n i. SQL Server CE Data Provider khng h tr connectionpooling, v t i m t th i i m SQL Server CE ch h tr m t k t n i.

10.3

Thc thi cu lnh SQL hoc th tc tn tr

B n c n th c thi m t cu l nh SQL ho c m t th t c t n tr trn m t c s d li u. T o m t i t ng cu l nh ph h p v i ki u c s d li u m b n nh s d ng; t t c cc i t ng cu l nh u hi n th c giao di n System.Data.IDbCommand. C u hnh i t ng cu l nh b ng cch thi t l p cc thu c tnh CommandType v CommandText c a n. Th c thi cu l nh b ng m t trong cc phng th c ExecuteNonQuery, ExecuteReader, hay ExecuteScalar ty thu c vo ki u cu l nh v k t qu c a n. Giao di n IDbCommand m t m t cu l nh c s d li u, v m i data-provider ch a m t hi n th c duy nh t. D i y l danh sch cc hi n th c IDbCommand cho nm data-provider chu n:
System.Data.Odbc.OdbcCommand System.Data.OleDb.OleDbCommand System.Data.OracleClient.OracleCommand System.Data.SqlServerCe.SqlCeCommand System.Data.SqlClient.SqlCommand

th c thi m t cu l nh d a trn m t c s d li u, b n ph i c m t k t n i ang m ( c th o lu n trong m c 10.1) v m t i t ng cu l nh c c u hnh ph h p v i ki u c s d li u ang truy xu t. B n c th t o i t ng cu l nh m t cch tr c ti p b ng phng th c kh i d ng, nhng cch n gi n hn l s d ng phng th c CreateCommand c a i t ng k t n i. Phng th c CreateCommand tr v m t i t ng cu l nh ( ng ki u dataprovider) v c u hnh n v i cc thng tin c s c l y t k t n i m b n s d ng t o cu l nh. Tr c khi th c thi cu l nh, b n ph i c u hnh cc thu c tnh c m t trong b ng 10.3
[

B ng 10.3 Cc thu c tnh thng d ng c a Thu c tnh

i t ng cu l nh M t

Chng 10: C s d

317 li u

CommandText

Chu i ch a cu l nh SQL ho c tn c a th t c t n tr . N i dung c a thu c tnh CommandText ph i tng thch v i gi tr b n ch nh trong thu c tnh CommandType. S nguyn (int) ch nh s giy i cu l nh tr v tr c khi h t th i gian v ngo i l x y ra. M c nh l 30 giy. M t gi tr thu c ki u li t k System.Data.CommandType, ch nh ki u cu l nh c m t b i i t ng cu l nh. i v i h u h t cc dataprovider, gi tr h p l l StoredProcedure (khi b n mu n th c thi m t th t c t n tr ), v Text (khi b n mu n th c thi m t cu l nh SQL d ng text). N u ang s d ng OLE DB Data Provider, b n c th ch nh TableDirect khi mu n tr v ton b n i dung c a m t ho c nhi u b ng; hy tham kh o ti li u .NET Framework SDK bi t thm chi ti t. M c nh l Text. i t ng IDbConnection, cung c p k t n i n c s d li u m b n s th c thi cu l nh trn . N u b n t o cu l nh b ng phng th c IDbConnection.CreateCommand, thu c tnh ny s t ng c thi t l p thnh i t ng IDbConnection m b n t o cu l nh t n. i t ng System.Data.IDataParameterCollection, ch a t p cc thng s thay th vo cu l nh (xem m c 10.4 bi t cch s d ng thng s ). i t ng System.Data.IDbTransaction, m t phin giao d ch m cu l nh c a vo (xem ti li u .NET Framework SDK bi t thm chi ti t v phin giao d ch).

CommandTimeout

CommandType

Connection

Parameters

Transaction

M t khi b n c u hnh i t ng cu l nh th c nhi u cch th c thi n, ty thu c vo b n ch t c a cu l nh, ki u d li u do cu l nh tr v , v b n mu n x l d li u theo nh d ng no. th c thi m t cu l nh nh INSERT, DELETE, ho c CREATE TABLE (khng tr v d li u trong c s d li u), b n hy g i ExecuteNonQuery. i v i cc cu l nh UPDATE, INSERT, v DELETE, phng th c ExecuteNonQuery tr v m t s nguyn cho bi t s hng b tc ng b i cu l nh. i v i cc cu l nh khc nh CREATE TABLE, ExecuteNonQuery tr v -1. V d d i y s d ng UPDATE ch nh s a m t b n ghi.
public static void ExecuteNonQueryExample(IDbConnection con) { // T o v c u hnh cu l nh m i. IDbCommand com = con.CreateCommand(); com.CommandType = CommandType.Text; com.CommandText = "UPDATE Employees SET Title = 'Sales Director'" + " WHERE EmployeeId = '5'"; // Th c thi cu l nh v x l k t qu . int result = com.ExecuteNonQuery(); if (result == 1) { Console.WriteLine("Employee title updated.");

318 Chng 10: C s d

li u

} else { Console.WriteLine("Employee title not updated."); } }

th c thi m t cu l nh tr v m t t p k t qu nh l nh SELECT ho c th t c t n tr , b n hy s d ng phng th c ExecuteReader. Phng th c ny tr v m t i t ng IDataReader (s c th o lu n trong m c 10.5) m qua n b n c th truy xu t n d li u k t qu . H u h t cc data-provider cng cho php b n th c thi nhi u cu l nh SQL trong m t l i g i phng th c ExecuteReader; v d trong m c 10.5 s gi i thch i u ny v trnh by cch truy xu t m i t p k t qu . o n m d i y s d ng phng th c ExecuteReader th c thi th t c t n tr Ten Most Expensive Products (m i s n ph m t nh t) t c s d li u Northwind v hi n th k t qu trong c a s Console:
public static void ExecuteReaderExample(IDbConnection con) { // T o v c u hnh cu l nh m i. IDbCommand com = con.CreateCommand(); com.CommandType = CommandType.StoredProcedure; com.CommandText = "Ten Most Expensive Products"; // Th c thi cu l nh v x l k t qu . using (IDataReader reader = com.ExecuteReader()) { Console.WriteLine("Price of the Ten Most Expensive Products."); while (reader.Read()) { // Hi n th chi ti t v s n ph m. Console.WriteLine(" {0} = {1}", reader["TenMostExpensiveProducts"], reader["UnitPrice"]); } } }

N u mu n th c thi m t truy v n, nhng ch c n gi tr thu c c t u tin c a hng u tin trong d li u k t qu , b n hy s d ng phng th c ExecuteScalar. Gi tr tr v l m t tham chi u i t ng v b n c n p n v ng ki u. D i y l v d :
public static void ExecuteScalarExample(IDbConnection con) { // T o v c u hnh cu l nh m i. IDbCommand com = con.CreateCommand(); com.CommandType = CommandType.Text; com.CommandText = "SELECT COUNT(*) FROM Employees"; // Th c thi cu l nh v p ki u k t qu . int result = (int)com.ExecuteScalar(); Console.WriteLine("Employee count = " + result); }

Cc hi n th c IDbCommand trong Oracle v SQL Data Provider c hi n th c cc phng th c th c thi cu l nh b sung. M c 10.6 s m t cch s d ng phng th c ExecuteXmlReader do l p SqlCommand cung c p. B n hy tham kh o ti li u

Chng 10: C s d

319 li u

.NET Frameworks SDK bi t thm chi ti t v cc phng th c b sung ExecuteOracleNonQuery v ExecuteOracleScalar do l p OracleCommand cung c p.

10.4S dng thng s trong cu lnh SQL hoc th tc


tn tr
B n c n thi t l p cc i s c a m t th t c t n tr trong m t cu l nh SQL c i thi n tnh linh ho t. T o thi; ho c s d ng cc thng s

i t ng thng s ph h p v i ki u i t ng cu l nh m b n d nh th c t t c cc i t ng thng s u hi n th c giao di n System.Data.IDataParameter. C u hnh ki u d li u, gi tr , v h ng c a i t ng thng s v thm chng vo t p h p thng s c a i t ng cu l nh b ng phng th c IDbCommand.Parameters.Add. T t c cc i t ng cu l nh cc cng vi c sau: Thi t l p cc u h tr vi c s d ng thng s , do b n c th th c hi n

i s c a th t c t n tr

L y cc gi tr tr v t th t c t n tr i cc gi tr thnh cc cu l nh text lc th c thi

Giao di n IDataParameter m t m t thng s v m i data-provider ch a m t hi n th c duy nh t. D i y l danh sch cc hi n th c IDataParameter cho nm data-provider chu n:
System.Data.Odbc.OdbcParameter System.Data.OleDb.OleDbParameter System.Data.OracleClient.OracleParameter System.Data.SqlServerCe.SqlCeParameter System.Data.SqlClient.SqlParameter

Cc thu c tnh c a i t ng thng s m t nh ng th m m t i t ng cu l nh c n khi th c thi m t cu l nh d a trn data-source. B ng 10.4 m t cc thu c tnh th ng c s d ng khi c u hnh cho thng s .
B ng 10.4 Cc thu c tnh c a Thu c tnh M t i t ng thng s

DbType

Gi tr thu c ki u li t k System.Data.DbType, ch nh ki u d li u ch a trong thng s . Cc gi tr th ng c s d ng l String, Int32, DateTime, v Currency. Gi tr thu c ki u li t k System.Data.ParameterDirection, cho bi t h ng truy n d li u cho thng s . Cc gi tr h p l l Input, InputOutput, Output, v ReturnValue. Gi tr bool, cho bi t thng s c ch p nh n gi tr null hay khng.

Direction

IsNullable

320 Chng 10: C s d ParameterName Value

li u

Chu i ch a tn thng s . i t ng ch a gi tr c a thng s .

s d ng thng s v i m t cu l nh text, b n ph i cho bi t v tr c n thay th gi tr thng s bn trong cu l nh. ODBC, OLE DB, v SQL Server CE Data Provider h tr cc thng s v tr (positional parameter); v tr c a m i thng s c nh n bi t b ng d u ch m h i (?). V d , cu l nh d i y cho bi t c hai v tr c n c thay th b ng 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 b n ch nh m i v tr thng s b ng m t tn v i bi u t ng @ ng tr c. D i y l cu l nh tng ng nh trn nhng s d ng thng s c t tn:
UPDATE Employees SET Title = @title WHERE EmployeeId = @id

ch nh cc gi tr thng s thay th vo m t cu l nh, b n ph i t o cc i t ng thng s ng ki u v thm chng vo t p h p thng s c a i t ng l nh (c th c truy xu t thng qua thu c tnh Parameters). B n c th thm cc thng s c t tn theo th t b t k, nhng b n ph i thm cc thng s v tr theo ng th t m chng xu t hi n trong cu l nh text. Khi b n th c thi cu l nh, gi tr c a m i thng s s c thay th vo trong chu i l nh tr c khi cu l nh c th c thi d a trn data-source. Phng th c ParameterizedCommandExample c trnh by y m t cch s d ng thng s trong l nh UPDATE c a SQL Server. Cc i s c a phng th c ParameterizedCommandExample g m m t SqlConnection ang m v hai chu i. Gi tr c a hai chu i ny c thay th vo trong l nh UPDATE b ng thng s . V d sau y trnh by hai cch t o i t ng thng s : phng th c IDbCommand.CreateParameter, v phng th c IDbCommand.Parameters. B n cng c th t o cc i t ng thng s b ng phng th c kh i d ng v c u hnh chng b ng cc i s c a phng th c kh i d ng ho c thng qua vi c thi t l p cc thu c tnh c a chng.
public static void ParameterizedCommandExample(SqlConnection con, string employeeID, string title) { // T o v c u hnh m t cu l nh m i ch a 2 thng s c SqlCommand com = con.CreateCommand(); com.CommandType = CommandType.Text; com.CommandText = "UPDATE Employees SET Title = @title" + " WHERE EmployeeId = @id"; // T o i t ng SqlParameter cho thng s SqlParameter p1 = com.CreateParameter(); p1.ParameterName = "@title"; p1.SqlDbType = SqlDbType.VarChar; p1.Value = title; com.Parameters.Add(p1); title. t tn.

// S d ng c php t c k thm thng s id. com.Parameters.Add("@id",SqlDbType.Int).Value = employeeID; // Th c thi cu l nh v x l k t qu . int result = com.ExecuteNonQuery(); }

Chng 10: C s d

321 li u

Khi s d ng thng s th c thi th t c t n tr , b n ph i cung c p cc i t ng thng s p ng cho m i i s do th t c t n tr yu c ug m c i s input v output. B n ph i thi t l p thu c tnh Direction c a m i thng s nh c m t trong b ng 10.4 (m c nh l Input). N u th t c t n tr c gi tr tr v , thng s gi gi tr tr v (v i thu c tnh Direction l ReturnValue) ph i l thng s u tin c thm vo t p h p thng s . V d d i y s d ng thng s th c thi th t c t n tr :
public static void StoredProcedureExample(SqlConnection con, string category, string year) { // T o v c u hnh m t cu l nh m i. SqlCommand com = con.CreateCommand(); com.CommandType = CommandType.StoredProcedure; com.CommandText = "SalesByCategory"; // T o i t ng SqlParameter cho thng s category. com.Parameters.Add("@CategoryName",SqlDbType.NVarChar).Value = category; // T o i t ng SqlParameter cho thng s year. com.Parameters.Add("@OrdYear",SqlDbType.NVarChar).Value = year; // Th c thi cu l nh v x l k t qu . using (IDataReader reader = com.ExecuteReader()) { } }

10.5 X l kt qu ca truy vn SQL bng data-reader


B n c n x l d li u ch a trong i t ng System.Data.IDataReader ( i t ng ny c tr v khi b n th c thi phng th c IDbCommand.ExecuteReader c th o lu n trong m c 10.3). S d ng cc thnh vin c a i t ng IDataReader duy t tu n t trong t p k t qu v truy xu t cc item d li u ch a trong m i hng. cc hng

Giao di n IDataReader m t m t data-reader, y l m t c ch ch -ti n, ch - c (forwardonly, read-only) truy xu t k t qu c a truy v n SQL. M i data-provider ch a m t hi n th c IDataReader duy nh t. D i y l danh sch cc hi n th c IDataReader cho nm dataprovider chu n:
System.Data.Odbc.OdbcDataReader System.Data.OleDb.OleDbDataReader System.Data.OracleClient.OracleDataReader System.Data.SqlServerCe.SqlCeDataReader System.Data.SqlClient.SqlDataReader

Giao di n IDataReader th a k giao di n System.Data.IDataRecord. Cc giao di n ny khai bo cc ch c nng truy xu t d li u v c u trc c a d li u c trong t p k t qu . B ng 10.5 m t vi thnh vin thng d ng c a giao di n IDataReader v IDataRecord.

322 Chng 10: C s d

li u

Ngoi cc thnh vin c li t k trong b ng 10.5, data-reader cn cung c p m t t p cc phng th c th c hi n vi c l y d li u c nh ki u t hng hi n t i. M i phng th c sau y nh n vo m t i s nguyn cho bi t ch s ( nh t 0) c a c t m d li u s c tr v t c t ny: GetBoolean, GetByte, GetBytes, GetChar, GetChars, GetDateTime, GetDecimal, GetDouble, GetFloat, GetGuid, GetInt16, GetInt32, GetInt64, GetString, GetValue, v GetValues.

Chng 10: C s d B ng 10.5 Cc thnh vin thng d ng c a cc l p data-reader Thnh vin Thu c tnh FieldCount IsClosed M t

323 li u

L y s c t trong hng hi n t i. Tr v true n u IDataReader b ng; false n u n hi n ang m .

Item

Tr v m t i t ng m t gi tr c a c t c th trong hng hi n t i. C t c th c ch nh b ng m t ch s nguyn ( nh s t 0) ho c m t chu i ch a tn c t. B n ph i p gi tr tr v thnh ki u ph h p. y l b ch m c (indexer) cho cc l p data-reader.

Phng th c GetDataTypeName

L y tn c a ki u d li u

i v i m t c t c th .

GetFieldType

L y i t ng System.Type m t ki u d li u c a gi tr ch a trong c t c th (c t ny c ch nh b ng m t ch s nguyn nh s t 0). L y tn c a c t c th (c t ny nguyn nh s t 0). c ch nh b ng m t ch s

GetName GetOrdinal GetSchemaTable

L y s th t c t ( nh s t 0) ng v i m t tn c t c th . Tr v i t ng System.Data.DataTable ch a siu d li u m t cc c t c trong IDataReader. Tr v true n u gi tr trong c t c th ch a gi tr null; n u khng th tr v false. N u IDataReader ch a nhi u t p k t qu v c nhi u l nh c th c thi, NextResult s di chuy n n cc t p k t qu k ti p. Theo m c nh, IDataReader c b tr t i t p k t qu u tin. D ch reader tin. n b n ghi k ti p. Reader lun b t u t i b n ghi u

IsDBNull

NextResult

Read

Data-reader Server v Oracle cng ch a cc phng th c th c hi n vi c l y d li u thu c cc ki u d li u c trng c a data-source. V d , SqlDataReader ch a cc phng th c nh GetSqlByte, GetSqlDecimal, v GetSqlMoney, v OracleDataReader ch a cc phng th c nh GetOracleLob, GetOracleNumber, v GetOracleMonthSpan. B n hy tham kh o ti li u .NET Framework SDK bi t thm chi ti t. Khi hon t t v i data-reader, b n nn g i phng th c Close c th s d ng l i k t n i c s d li u. IDataReader th a k System.IDisposable; ngha l m i l p data-reader u hi n th c phng th c Dispose. Phng th c ny s t ng g i Close, cho nn l nh using l m t cch r t r rng v hi u qu khi s d ng data-reader. x l n i dung c a hai t p k t qu c tr V d d i y m t cch s d ng data-reader v b i vi c th c thi m t truy v n g m hai l nh SELECT. T p k t qu u tin c li t k v

324 Chng 10: C s d

li u

hi n th trong c a s Console. T p k t qu th hai c duy t qua siu d li u.


using System; using System.Data; using System.Data.SqlClient; public class DataReaderExample { public static void Main() { // T o i t ng SqlConnection m i. using (SqlConnection con = new SqlConnection()) {

tm v hi n th thng tin

// C u hnh chu i k t n i c a i t ng SqlConnection. con.ConnectionString = "Data Source = localhost;" + "Database = Northwind; Integrated Security=SSPI"; // T o v c u hnh cu l nh m i. SqlCommand com = con.CreateCommand(); com.CommandType = CommandType.Text; com.CommandText = "SELECT BirthDate,FirstName,LastName " + "FROM Employees ORDER BY BirthDate; " + "SELECT * FROM Employees"; // M k t n i c s con.Open(); d li u v th c thi cu l nh.

// Th c thi cu l nh v thu l y SqlReader. using (SqlDataReader reader = com.ExecuteReader()) { // X l t p k t qu u tin // v hi n th n i dung c a t p k t qu . Console.WriteLine("Employee Birthdays (By Age)."); while (reader.Read()) { Console.WriteLine("{0,18:D} reader.GetDateTime(0), reader["FirstName"], reader[2]); } // X l t p k t qu th hai v hi n th chi ti t // v cc c t v cc ki u d li u trong t p k t qu . reader.NextResult(); Console.WriteLine("Employee Table Metadata."); for (int field = 0; field < reader.FieldCount; field++) { Console.WriteLine(" Column Name:{0} reader.GetName(field), reader.GetDataTypeName(field)); } } } Console.ReadLine(); } } Type:{1}", - {1} {2}", // L y d li u nh ki u // S d ng ch s chu i // S d ng ch s th t

Chng 10: C s d

325 li u

10.6

Thu ly ti liu XML t truy vn SQL Server

B n c n th c thi m t truy v n d a trn SQL Server 2000 ho c MSDE v l y cc k t qu d ng XML. S d ng m nh FOR XML trong truy v n SQL tr v k t qu d ng XML. Th c thi cu l nh b ng phng th c SqlCommand.ExecuteXmlReader, k t qu tr v l m t i t ng System.Xml.XmlReader m thng qua n b n c th truy xu t d li u XML. SQL Server 2000 v MSDE tr c ti p h tr XML. B n ch c n thm m nh FOR XML AUTO vo cu i truy v n SQL cho bi t r ng cc k t qu s c tr v d ng XML. Theo m c nh, d ng XML ny khng ph i l m t ti li u XML y . Thay vo , n tr v k t qu c a m i b n ghi theo t ng ph n t (element) ring r , v i t t c cc tr ng (field) u l c tnh (attribute). V d , truy v n sau y:
SELECT CustomerID, CompanyName FROM Customers FOR XML AUTO

s tr v XML v i c u trc nh sau:


<Customers CustomerID="ALFKI" CompanyName="Alfreds Futterkiste"/> <Customers CustomerID="ANTON" CompanyName="Antonio Moreno Taquera"/> <Customers CustomerID="GOURL" CompanyName="Gourmet Lanchonetes"/>

B n c th thm t kha ELEMENTS vo cu i truy v n l ng nhau. V d , truy v n sau y: s tr v XML v i c u 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>

nh d ng k t qu theo cc ph n t

SELECT CustomerID, CompanyName FROM Customers FOR XML AUTO, ELEMENTS

B n cng c th nh d ng k t qu m t cch chi ti t hn b ng c php FOR XML EXPLICIT. V d , c php ny cho php b n chuy n m t vi tr ng (field) thnh c tnh (attribute) v cc tr ng khc thnh ph n t (element). B n hy tham kh o m t quy n sch chuyn v SQL Server bi t thm chi ti t. V d d i y trnh by cch l y k t qu d ng XML b ng m nh FOR XML v phng th c ExecuteXmlReader. Ch r ng, k t n i khng th c s d ng cho b y k cu l nh no khc

326 Chng 10: C s d

li u

trong khi XmlReader ang m . B n nn x l k t qu cng nhanh cng t t v ph i lun ng XmlReader l i (Chng 5 c r t nhi u v d trnh by cch s d ng l p XmlReader).
using using using using System; System.Xml; System.Data; System.Data.SqlClient;

public class XmlQueryExample { public static void Main() { // T o i t ng SqlConnection m i. using (SqlConnection con = new SqlConnection()) { // C u hnh chu i k t n i c a i t ng SqlConnection. con.ConnectionString = "Data Source = localhost;" + "Database = Northwind; Integrated Security=SSPI"; // T o v c u hnh cu l nh m i c ch a 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 chi u trong // kh i finally (b o m ng n l i sau khi s d ng). XmlReader reader = null; try { // M k t n i c s con.Open(); d li u.

// Th c thi cu l nh v l y XmlReader // truy xu t cc k t 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); } reader.MoveToElement(); Console.WriteLine(); } } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } finally { // B o m reader ng. if (reader != null) reader.Close(); } }

Chng 10: C s d Console.ReadLine(); } }

327 li u

D i y l m t vi k t xu t t
Element: Customers Element: Customers Element: Customers ...

ng d ng th nghi m ny:
CompanyName: Alfreds Futterkiste CompanyName: Antonio Moreno Taquera CompanyName: Gourmet Lanchonetes

CustomerID: ALFKI CustomerID: ANTON CustomerID: GOURL

Thay v lm vi c v i XmlReader v truy xu t d li u m t cch tu n t , b n c th c d li u XML vo System.Xml.XmlDocument. Theo cch ny, t t c d li u c l y vo b nh , v k t n i c s d li u c th ng l i. K , b n c th ti p t c tng tc v i ti li u XML (Chng 5 c r t nhi u v d trnh by cch s d ng l p XmlDocument). D i y l o n m m b n s c n:
XmlDocument doc = new XmlDocument(); // T o i t ng SqlConnection m i. using (SqlConnection con = new SqlConnection()) { // C u hnh chu i k t n i c a i t ng SqlConnection. con.ConnectionString = "Data Source = localhost;" + "Database = Northwind; Integrated Security=SSPI"; // T o v c u hnh cu l nh m i c ch a FOR XML AUTO. SqlCommand com = con.CreateCommand(); com.CommandType = CommandType.Text; com.CommandText = "SELECT CustomerID, CompanyName FROM Customers FOR XML AUTO"; // M k t n i c s con.Open(); d li u.

// Load d li u XML vo XmlDocument. C n ph i t o tr c m t // ph n t g c c th t m i ph n t hng k t qu vo . XmlReader reader = com.ExecuteXmlReader(); doc.LoadXml("<results></results>"); // T o XmlNode t ph n t XML k ti p ( c XmlNode newNode = doc.ReadNode(reader); while (newNode != null) { doc.DocumentElement.AppendChild(newNode); newNode = doc.ReadNode(reader); } } // X l XmlDocument ng t k t n i. Console.WriteLine(doc.OuterXml); c t reader).

328 Chng 10: C s d

li u

10.7

Nhn bit tt c cc th hin SQL Server 2000 trn mng

B n c n l y danh sch t t c cc th hi n c a SQL Server 2000 c th truy xu t c trn m ng. S d ng COM Interop Library. T o m t truy xu t ch c nng c a Microsoft SQLDMO Object i t ng Application r i g i phng th c ListAvailableSQLServers c a n. ListAvailableSQLServers s tr v i t ng NameList, l m t t p h p ch a tn c a m i i t ng SQL Server 2000 c tm th y trn m ng.

Th vi n l p .NET Framework khng c ch c nng tm cc SQL Server cha bi t; tuy nhin, cng vi c ny khng m y kh khn v i Microsoft SQLDMO Object Library ( c truy xu t qua COM Interop). M c 15.6 s trnh by chi ti t cch t o m t Interop Assembly th c hi n vi c truy xu t n m t thnh ph n COM. N u ang s d ng Microsoft Visual Studio .NET, b n hy thm m t tham chi u n Microsoft SQLDMO Object Library c li t k trong th COM c a h p tho i Add Reference (xem hnh 10.1).

Hnh 10.1 Ch n Microsoft SQLDMO Object Library trong h p tho i Add Reference

N u khng c Visual Studio .NET, b n hy s d ng Type Library Importer (tlbimp.exe) t o m t Interop Assembly cho file sqldmo.dll (th ng n m trong th m c \Program Files\Microsoft SQL Server\80\Tools\Binn).

Chng 10: C s d

329 li u

C m t v n c tm th y trong b n g c SQLDMO Object Library. c th ch y c d n ny, b n c n ph i ci t SQL Server Service Pack 2 ho c m i hn. Gi s b n s d ng cc thi t l p m c nh khi t o Interop Assembly cho mnh, tr c h t b n c n nh p khng gian tn SQLDMO. l y c danh sch cc SQL Server ang c hi u l c, b n hy t o m t i t ng SQLDMO.Application v g i phng th c ListAvailableSQLServers c a n. M i chu i trong i t ng tr v SQLDMO.NameList l tn c a m t SQL Server ang c hi u l c. B n c th s d ng cc tn ny trong chu i k t n i ho c hi n th chng trong m t danh sch cho ng i dng ch n. V d d i y s hi n th tn c a t t c cc SQL Server c th truy xu t c trong c a s Console:
using System; using SQLDMO; public class SQLDMOExample { public static void Main() { // Thu l y danh sch t t c cc SQL Server c hi u l c. SQLDMO.Application app = new SQLDMO.Application(); SQLDMO.NameList names = app.ListAvailableSQLServers(); // X l t p h p NameList. if (names.Count == 0) { Console.WriteLine("No SQL Servers visible on the network."); } else { // Hi n th danh sch cc SQL Server c hi u l c. Console.WriteLine("SQL Servers visible : " + names.Count); foreach (string name in names) { Console.WriteLine(" } } Console.ReadLine(); } } Name : " + name);

10.8
B n mu n thu l y hay chn d ADO.NET.

c file Excel vi ADO.NET


li u vo m t ti li u Microsoft Excel b ng

S d ng ODBC .NET provider k t h p v i Microsoft Excel ODBC Driver. Khng c OLE DB provider hay provider c-qu n-l no cho Excel. Tuy nhin, b n c th s d ng Microsoft Excel ODBC Driver ( c ci t m c nh cng v i Excel) k t h p v i ODBC .NET provider ( i km v i .NET Framework 1.1 v Visual Studio .NET 2003).

330 Chng 10: C s d

li u

Trong chu i k t n i, b n c n ch nh driver m b n ang s d ng v tn file Excel. V d d i y ch n file test.xls trong th m c startup c a ng d ng:
private string ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=" + Application.StartupPath + "\\test.xls;";

Sau khi k t n i, b n c th th c hi n hai ki u thao tc: SELECT hay INSERT. Thay v s d ng b ng, b n ch n hay chn d a vo tn sheet. Tn sheet ph i k t thc b ng d u la ($) v c t trong d u ngo c vung (n u khng, s sinh ra l i c php). nh d ng b b qua, v hng u tin t ng c s d ng lm cc tn c t. V d d i y trch v hi n th t t c cc hng trong Sheet1. Hnh 10.2 l file Excel g c. Hnh 10.3 l d li u 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"]; }

Chng 10: C s d Hnh 10.2 File Excel g c Hnh 10.3 D li u Excel trong ng d ng .NET

331 li u

M t cch ti p c n khc l s d ng Automation v n hnh Excel thng qua cc giao di n COM do n cung c p. Cch ny i h i b n s d ng COM Interop v cc i t ng c a Excel, v ch lm vi c khi Excel c ci t trn my tnh. Tuy v y, n cung c p r t nhi u ch c nng cho vi c tng tc v i d li u b ng tnh.

10.9
S d ng Data Form Wizard.

S dng Data Form Wizard


li u v i y ch c nng nhng

B n mu n xy d ng m t ng d ng c s d khng ph i vi t b t c dng m no.

s d ng Data Form Wizard, b n hy th c hi n cc b c d i y: 1. 2. T o m t d n m i, ch n m u Empty Project. OK. t tn d n l DataFormWiz. Nh p hi n th h p tho i

T thanh trnh n chnh c a IDE, ch n Project | Add New Item Add New Item (xem hnh 10.4).

Hnh 10.4 H p tho i Add New Item

3.

Ch n Data Form Wizard, v gi nguyn tn m c nh DataForm1.cs. Nh p Open thm Data Form Wizard vo d n. Ngay khi b n nh p Open, Data Form Wizard s kh i ch y. Nh p Next. t tn cho t p d li u m i l dsDataWizard (xem hnh 10.5). Nh p Next.

4.

332 Chng 10: C s d

li u

Hnh 10.5 T o m t t p d li u m i v i tn l dsDataWizard

5.

T o m t k t n i m i b ng cch nh p nt New Connection (xem hnh 10.6).

Hnh 10.6 Nh p nt New Connection

t ok tn im i

6.

K t n i n c s d li u Northwind c a SQL Server trong h p tho i Data Link Properties (xem hnh 10.7). Nh p OK.

Chng 10: C s d

333 li u

Hnh 10.7 H p tho i Data Link Properties

334 Chng 10: C s d

li u

7.

Ch n k t n i v a t o (xem hnh 10.8). Nh p Next.

Hnh 10.8 Ch n k t n i Northwind v a m i t o

8.

Thm b ng Categories v Products vo danh sch Selected Item(s) (xem hnh 10.9). Nh p Next.

Hnh 10.9 Thm b ng Categories v Products

Chng 10: C s d

335 li u

9.

Chng ta c n t tn cho quan h gi a cc b ng. G CategoriesProducts vo h p Name. Categories l b ng cha v i kha chnh l CategoryID. Products l b ng con v i kha ngo i l CategoryID (xem hnh 10.10). Nh p nt > thm quan h ny vo h p Relations bn ph i. Nh p Next.

Hnh 10.10 T o quan h


[

10. Trong c a s k , chng ta ch n cc b ng v cc tr ng d li u c n hi n th . Gi nguyn t t c cc tr ng d li u tr tr ng Picture thu c b ng Categories (xem hnh 10.11). Nh p Next.

Hnh 10.11 Ch n cc b ng v cc tr ng d li u c n hi n th

336 Chng 10: C s d

li u

11. Chng ta mu n hi n th t t c cc b n ghi trong m t khung l i, cho nn gi nguyn cc thi t l p m c nh (xem hnh 10.12). Nh p Finish k t thc trnh thu t s. Sau vi giy, DataForm m i s c k t sinh v hi n th (xem hnh 10.13).

Hnh 10.12 Gi nguyn cc thi t l p hi n th m c

nh

Hnh 10.13 DataForm1.vb

12. Cu i cng, b n ph i bo cho ng d ng bi t form Data Form Wizard s l i t ng startup. Nh p ph i vo d n trong Solution Explorer, v ch n Properties. Ch n DataFormWiz.DataForm1 t danh sch Startup object. Nh p OK.

Chng 10: C s d

337 li u

Hnh 10.14 Ch n DataFormWiz.DataForm1 t danh sch Startup object

Nh n F5 ch y chng trnh. Nh p nt Load thi t l p k t n i c s d li u v thu l y d li u (xem hnh 10.15). Cu n b ng Categories, v ch n m t m t b n ghi. r ng b ng Products bn d i thay i theo quan h m chng ta xy d ng. B n c th thay i b t c tr ng d li u no trong b t k b n ghi no. N u nt Update c nh p vo, t t c nh ng thay i c th c hi n trong cc khung l i d li u s c truy n v ngu n d li u Northwind. V b n khng ph i vi t b t k dng m no!

Hnh 10.15 D n Data Form Wizard

338 Chng 10: C s d

li u

10.10

S dng Crystal Report Wizard

B n mu n t o Crystal Report t m t ngu n d li u. Xy d ng m t b n bo co b ng Crystal Report Wizard. Sau , s d ng i u ki m CrystalReportViewer trnh by b n bo co ny trn form. Crystal Reports for Visual Studio .NET l cng c bo co chu n dnh cho Visual Studio .NET. B n c th ti p qu n nh ng bo co ny trn n n Web v Windows, v phn b chng d ng d ch v Web trn m t server. M c ny s trnh by t ng b c m t cch sinh bo co t m t ngu n d li u. Tr c tin, b n hy t o m t d n ng d ng Windows m i v i tn l CrystalExample. c th hi n th Crystal Report, b n c n th c hi n hai b c chnh: th nh t l xy d ng m t b n bo co, v th hai l thm m t i u ki m CrystalReportViewer vo form trnh by bo co. Vi c xy d ng m t b n bo co c m t trong 11 b c nh d i y: 1. T thanh trnh n chnh c a IDE, ch n Project | Add New Item v ch n Crystal Report (xem hnh 10.16). Nh p Open.

Hnh 10.16 Thm Crystal Report vo d n

2.

Crystal Report Wizard s nh c ta ch n ki u bo co c n xy d ng (xem hnh 10.17). Gi nguyn bo co chu n m c nh, r i nh p OK.

Chng 10: C s d Hnh 10.17 Gi nguyn bo co chu n m c nh

339 li u

3.

Crystal Report Wizard hi n th h p tho i Standard Report Expert (xem hnh 10.18). Nh p vo d u c ng k th m c OLE DB (ADO) trong h p danh sch Available Data Sources.

Hnh 10.18 H p tho i Standard Report Expert

4.

B n s th y h p tho i OLE DB (ADO) (xem hnh 10.19). Ch n Microsoft OLE DB Provider for SQL Server, r i nh p Next.

340 Chng 10: C s d

li u

Hnh 10.19 Ch n Microsoft OLE DB Provider for SQL Server

5.

K ti p, chng ta c n bo v i trnh thu t s c s d li u no s s d li u Northwind (xem hnh 10.20). Nh p Next.

c k t n i. Ch n c

Hnh 10.20 Ch n c s d li u Northwind

6.

Crystal Report Wizard hi n th h p tho i Advanced Information. Chng ta khng c n thay i thng tin no cho v d ny, cho nn nh p Finish. Trong c a s Standard Report Expert, ch n b ng Categories v Products cho b n bo co c a chng ta (xem hnh 10.21). Nh p Next.

Chng 10: C s d Hnh 10.21 Ch n b ng Categories v Products

341 li u

7.

Trong th Links c a h p tho i Standard Report Expert, gi nguyn cc m c hnh 10.22. B n c th th y trnh thu t s nh x kha chnh trong Categories ngo i trong Products. Nh p Next hi n th th Fields.

nh nh n kha

Hnh 10.22 Kha chnh trong Categories c nh x

n kha ngo i trong Products

8.

T b ng Categories, ch n CategoryName v Description. T b ng Products, ch n ProductName, QuantityPerUnit, UnitPrice, v UnitsInStock (xem hnh 10.23). Nh p Next hi n th th Group.

342 Chng 10: C s d

li u

Hnh 10.23 Ch n cc tr ng d li u c n hi n th

9.

Ch n CategoryName v ProductName

phn nhm (xem hnh 10.24).

Hnh 10.24 Ch n CategoryName v ProductName

phn nhm

10. Nh p Next nhi u l n ch p nh n cc thi t l p m c nh cho cc th Total, Top N, Chart, v Select. Khi n th cu i cng (th Style), g tiu Category - Product Report (xem hnh 10.25).

Hnh 10.25 G tiu

Category - Product Report

Chng 10: C s d

343 li u

11. Nh p Finish. File CrystalReport1.rpt (xem hnh 10.26) s

c thm vo d n.

Hnh 10.26 B n bo co c thi t k

Chng ta xy d ng xong b n bo co. B c th hai l thi t l p m t c ch xem b n bo co ny. B c ny kh d dng. B n hy ko i u ki m CrystalReportViewer t h p cng c vo form m c nh. Nh p ph i vo CrystalReportViewer, v ch n Properties. Tm thu c tnh Dock v ch n Fill (xem hnh 10.27). Ty ch n ny s khi n CrystalReportViewer l p y vng client c a form. K ti p, tm thu c tnh ReportSource, v nh p Browse. Ch n file CrystalReport1.rpt m chng ta v a xy d ng. By gi , b n hy ch y chng trnh xem k t qu (xem hnh 10.29).

344 Chng 10: C s d

li u Hnh 10.27 Tm thu c tnh Dock v ch n Fill

Hnh 10.28 Form bo co hon ch nh

Hnh 10.29 Trnh by bo co v i Crystal Report

Nh b n c th th y, i u ki m CrystalReportViewer kh tinh vi. B n c th s d ng cc ch c nng c s n phn trang v in bo co. B n c th nh p nt Export Report (hnh phong b v i mi tn ) xu t bo co thnh m t file Adobe Acrobat (.pdf), Microsoft Excel (.xls), Microsoft Word (.doc), hay Rich Text Document (.rtf). B n cng c th phng to b n bo co ho c tm ki m text bn trong b n bo co. Trnh thu t s ny ny m nh n n i b n khng ph i vi t dng m no c . M t file m ngu n bo co, ch a m t l p bo co cho b n bo co ny, t ng c sinh ra. L p bo co ny c l p c s l ReportClass.

345

Chng 11: L P TRNH M NG

11

346

347 Chng 11: L p trnh m ng

icrosoft .NET Framework bao g m m t t p cc l p dng l p trnh m ng thu c hai khng gian tn: System.Net v System.Net.Sockets. Cc l p ny h tr m i th , t l p trnh d a-trn-socket v i TCP/IP cho n download file v trang HTML t web thng qua HTTP. Hai khng gian tn ny cng l n n t ng cho hai n n networking c p cao hnRemoting v d ch v Web XML. Hai n n ny s c c p chi ti t trong chng 12. Chng ny s trnh by cc v n sau:

L y ti nguyn t web thng qua HTTP (m c 11.1, 11.2, v 11.3). Hi n th m t trang web trong m t ng d ng d a-trn-Windows b ng i u ki m Web Browser (m c 11.4). L y a ch IP v thng tin DNS v my tnh hi n hnh v cc mi n khc trn World Wide Web (m c 11.5 v 11.6). G i thng i p ping (m c 11.7) v giao ti p b ng giao th c TCP v UDP (m c 11.8 n 11.13). G i v nh n e-mail (m c 11.14 v 11.15).

11.1

Download file thng qua HTTP


download m t file t m t website

B n c n m t cch th t nhanh v n gi n thng qua HTTP.

S d ng phng th c tnh DownloadFile c a l p System.Net.WebClient. .NET Framework cung c p vi c ch dng g i d li u thng qua HTTP. M t trong nh ng cch d nh t l s d ng l p System.Net.WebClient. N cung c p nh ng phng th c m ccao nh DownloadFile v UploadFile. Cc phng th c ny khng c s h tr n i t i no cho giao ti p b t ng b , hay xc th c. N u c n cc tnh nng ny, b n c th s d ng cc ch c nng ph c t p hn do l p WebRequest v WebResponse cung c p (s c m t trong m c 11.2 v 11.3). Chng trnh v d d i 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(); Console.WriteLine("Downloading file " + remoteUri + " to " + Path.GetFullPath(localFileName)); // Th c hi n download. client.DownloadFile(remoteUri, localFileName); Console.WriteLine("Download complete."); Console.ReadLine(); }

348 Chng 11: L p trnh m ng }

11.2

Download v x l file bng stream


a.

B n c n l y m t file t m t website, nhng khng mu n lu tr c ti p vo Thay vo , b n mu n x l ngay trong ng d ng c a mnh.

S d ng l p WebRequest t o yu c u, l p WebResponse nh n p ng t webserver, v m t s d ng reader (StreamReader i v i d li u HTML hay text, ho c BinaryReader i v i d li u nh phn) phn tch p ng . Download m t file c n b n b c c b n sau: 1. S d ng phng th c tnh Create c a l p System.Net.WebRequest ch nh trang b n c n. Phng th c ny tr v m t i t ng d n xu t t WebRequest, ph thu c vo ki u Uniform Resource Identifier (URI) b n s d ng. V d , n u ti nguyn l HTTP (v i c m t http://), n s t o ra i t ng HttpWebRequest; n u ti nguyn l file (v i c m t file://), n s t o ra i t ng FileWebRequest. B n c th thi t l p th i gian tr thng qua thu c tnh WebRequest.Timeout. S d ng phng th c GetResponse c a i t ng WebRequest, phng th c ny tr v m t i t ng WebResponse cho trang. N u yu c u v t qua th i gian tr th ngo i l WebException s b nm. T o m t StreamReader ho c m t BinaryReader cho WebResponse. Cng vi c cu i cng l x l stream ny, ch ng h n ghi n ra file r i hi n th trong ng d ng c a b n...
System; System.Net; System.IO; System.Drawing; System.Windows.Forms;

2.

3. 4.

o n m d i y s l y v hi n th m t file nh v n i dung HTML c a m t trang web.


using using using using using

public class DownloadForm : System.Windows.Forms.Form { private System.Windows.Forms.PictureBox picBox; private System.Windows.Forms.TextBox textBox; // (B qua ph n 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"; // T o yu c u. WebRequest requestPic = WebRequest.Create(picUri); WebRequest requestHtml = WebRequest.Create(htmlUri); // Nh n p ng. Cng vi c ny s m t nhi u // th i gian, c bi t khi file c n l y qu l n. WebResponse responsePic = requestPic.GetResponse(); WebResponse responseHtml = requestHtml.GetResponse();

349 Chng 11: L p trnh m ng // c response stream. Image downloadedImage = Image.FromStream(responsePic.GetResponseStream()); StreamReader r = new StreamReader(responseHtml.GetResponseStream()); string htmlContent = r.ReadToEnd(); r.Close(); // Hi n th nh. picBox.Image = downloadedImage; // Hi n th n i dung d ng text c a trang HTML. textBox.Text = htmlContent; } }

Hnh 11.1 Download n i dung c a m t trang web

download file l n m t cch hi u qu , b n c th s d ng k thu t b t ng b c m t trong chng 4. B n cng c th s d ng phng th c WebRequest.BeginGetResponse, phng th c ny khng ch n m l nh c a b n v s g i th t c callback khi nh n c p ng.

350 Chng 11: L p trnh m ng

11.3

Ly trang HTML t mt website c yu cu xc thc

B n c n thu l y m t file t m t website, nhng website yu c u m t s thng tin xc th c. S d ng l p WebRequest v WebResponse c m t trong m c 11.2. Tuy nhin, tr c khi g i yu c u, b n ph i c u hnh thu c tnh WebRequest.Credentials v i cc thng tin xc th c. M t s website yu c u thng tin xc th c t ng i dng. Khi k t n i thng qua trnh duy t, thng tin ny c th c cung c p m t cch trong su t (v d , m t intranet-site c c b c s d ng Integrated Windows authentication), ho c trnh duy t c th yu c u thng tin ny thng qua m t h p tho i ng nh p. Khi truy xu t m t trang web b ng l p trnh th m l nh c a b n c n ph i cung c p cc thng tin ny. Cch ti p c n m b n s d ng ty thu c vo ki u xc th c m website s d ng. N u website s d ng Basic authentication hay Digest authentication, b n c n g i k t h p username v password, b ng cch t o m t i t ng System.Net. NetworkCredential v gn n vo thu c tnh WebRequest.Credentials. N u website s d ng Integrated Windows authentication, b n th c hi n tng t nh trn. B n c th l y cc thng tin ng nh p c a ng i dng hi n hnh t i t ng System.Net.CredentialCache. N u website i h i ch ng ch , b n c n n p ch ng ch t m t file b ng l p
System.Security.Cryptography.X509Certificates.X509Certificate, v thm n vo

t p h p HttpWebRequest.ClientCertificates. D i y l o n m v d cho c ba cch ti p c n trn:


using System; using System.Net; using System.Security.Cryptography.X509Certificates; public class DownloadWithAuthentication { private static void Main() { string uriBasic, uriIntegrated, uriCertificate; // Xc th c username v password v i Basic authentication. WebRequest requestA = WebRequest.Create(uriBasic); requestA.Credentials = new NetworkCredential("userName", "password"); requestA.PreAuthenticate = true; // ng nh p ng i dng hi n hnh v i // Integrated Windows authentication. WebRequest requestB = WebRequest.Create(uriIntegrated); requestB.Credentials = CredentialCache.DefaultCredentials; requestB.PreAuthenticate = true;

351 Chng 11: L p trnh m ng // Xc th c ng i dng b ng ch k i n t . HttpWebRequest requestC = (HttpWebRequest) WebRequest.Create(uriCertificate); X509Certificate cert = X509Certificate.CreateFromCertFile(@"c:\user.cer"); requestC.ClientCertificates.Add(cert); // (By gi } } b t u l y v x l p ng.)

Nh r ng, n u mu n s d ng ki u xc th c ch ng ch , b n ph i n p ch ng ch t file. Khng c cch no t o i t ng X509Certificate t m t ch ng ch trong kho ch ng ch c a my tnh.

11.4

Hin th trang web trong ng dng da-trnWindows

B n c n hi n th m t trang HTML (hay b t k ki u ti li u no m Microsoft Internet Explorer h tr ) trong m t ng d ng d a-trn-Windows. S d ng i u ki m ActiveX Web Browser ( i cng v i Internet Explorer). .NET Framework khng cung c p i u ki m no dng d ch n i dung HTML. Tuy nhin, ch c nng ny l i r t c n thi t cho vi c hi n th m t n i dung HTML c c b (k c nh ng ti li u HTML ng gi theo nh d ng file tr gip c a Windows) cng nh cc thng tin no t web. hi n th m t trang HTML, b n c th thm m t c a s Internet Explorer vo ng d ng d a-trn-Windows. C a s ny khng ch h tr HTML, m cn h tr JavaScript, Microsoft Visual Basic Scripting Edition (VBScript), ActiveX control, v r t nhi u plug-in khc, ty thu c vo c u hnh h th ng c a b n (c th g m c Microsoft Word, Microsoft Excel, v Adobe Acrobat Reader). B n cn c th s d ng i u ki m Web Browser duy t m t th m c trong a c c b , hay hi n th cc file trn m t FTP (File Transfer Protocol) site. thm Web Browser vo m t d n trong Microsoft Visual Studio .NET, b n hy nh p ph i vo h p cng c v ch n Add/Remove Items. Sau , ch n th COM Components, v ch n Microsoft Web Browser (xem hnh 11.2). Theo , i u ki m Microsoft Web Browser s c thm vo h p cng c . Khi b n th i u ki m ny vo form, cc Interop Assembly c n thi t s c t o ra v thm vo d n c a b n.

352 Chng 11: L p trnh m ng

Hnh 11.2 Ch n Microsoft Web Browser trong h p tho i Customize Toolbox

N u khng s d ng Visual Studio .NET, b n c n t o ra m t v b c b ng ti n ch Type Library Importer (Tlbimp.exe), s c gi i thch trong m c 15.6. Khi s d ng i u ki m Web Browser, b n th ng c n cc phng th c sau:
Navigate (v Navigate2)Chuy n trang sang URL do b n ch

nh.

GoBack v GoForwardLi sang cc trang trong danh sch history. GoHomeLi sang trang m c

nh (home) c thi t l p trn my tnh hi n hnh, v GoSearchHi n th trang tm ki m.

Ng i dng c th vo m t trang m i b ng cch nh p vo m t lin k t no trong trang hi n hnh (n u n t n t i). B n c th l y URL hi n hnh t thu c tnh LocationURL v xc nh i u ki m v n cn x l trang hay khng b ng cch ki m tra thu c tnh Busy. Ngoi ra, b n c th ph n ng v i nhi u s ki n khc nhau.

353 Chng 11: L p trnh m ng

Hnh 11.3 S d ng i u ki m Web Browser using System; using System.Drawing; using System.Windows.Forms; public class WebBrowser : System.Windows.Forms.Form { private private private private // (B AxSHDocVw.AxWebBrowser explorer; System.Windows.Forms.Button cmdBack; System.Windows.Forms.Button cmdHome; System.Windows.Forms.Button cmdForward; qua ph n m designer.)

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) {

354 Chng 11: L p trnh m ng 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."); } } }

H u h t cc phng th c c a i u ki m Web Browser u yu c u m t vi thng s . V cc phng th c ny khng c n p ch ng, v v C# khng h tr tham s ty ch n, nn b n ph i cung c p gi tr cho m i tham s . B n khng th s d ng tham chi u null c, v chng l cc thng s ref. Thay vo , b n hy t o ra m t bi n i t ng ch a tham chi u null, sau cung c p n cho cc thng s m b n khng c n s d ng. K thu t ny s c m t chi ti t trong m c 15.8.

11.5

Ly a ch IP ca my tnh hin hnh


s d ng sau ny trong

B n c n l y a ch IP c a my tnh hi n hnh, c th l m l nh networking.

S d ng phng th c GetHostName v GetHostByName c a l p System.Net.Dns. L p Dns cung c p cc d ch v phn gi i tn mi n. B n c th g i phng th c GetHostName l y v tn host c a my tnh hi n hnh. Sau , b n c th d ch tn ny sang a ch IP b ng phng th c GetHostByName. y l m t v d :
using System; using System.Net; public class GetIPAddress { private static void Main() { // L y tn host c a my tnh hi n hnh. string hostName = Dns.GetHostName(); // L y a ch IP trng kh p u tin. string ipAddress = Dns.GetHostByName(hostName).AddressList[0].ToString(); Console.WriteLine("Host name: " + hostName); Console.WriteLine("IP address: " + ipAddress); Console.ReadLine(); } }

355 Chng 11: L p trnh m ng

Phng th c GetHostByName tr v danh sch cc tr ng h p, danh sch ny ch c m t ph n t .

a ch IP c hi u l c. Trong r t nhi u a ch 127.0.0.1

Khi s d ng a ch IP trong giao ti p m ng, b n c th s d ng ch n my tnh hi n hnh thay cho a ch IP th c t c a n.

11.6

Phn gii tn min thnh a ch IP

B n mu n xc nh a ch IP c a m t my tnh d a vo tn mi n c a n b ng cch th c hi n m t truy v n Domain Name System (DNS) . S d ng phng th c GetHostByName c a l p System.Net.Dns v i i s l tn mi n. d xc Trn web, cc a ch IP c th truy xu t cng khai th ng c nh x n tn mi n nh hn. V d , a ch 207.171.185.16 c nh x n tn mi n www.amazon.com. nh a ch IP khi c tn mi n, my tnh c n lin l c v i m t DNS-server.

Qu trnh phn gi i tn mi n c th c hi n m t cch trong su t khi b n s d ng l p System.Net.Dns. L p ny cho php l y a ch IP c a m t tn mi n b ng phng th c GetHostByName. D i y l o n m trnh by cch l y danh sch cc a ch IP c nh x n tn mi n 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 ch y o n m trn, b n s th y k t xu t nh sau:


InterNetwork: InterNetwork: InterNetwork: InterNetwork: InterNetwork: 207.46.249.222 207.46.134.222 207.46.249.27 207.46.134.155 207.46.249.190

11.7

Ping mt a ch IP
ng

B n mu n ki m tra m t my tnh c online hay khng v o th i gian p (response time) c a n.

356 Chng 11: L p trnh m ng

G i m t thng i p ping. Thng i p ny c g i b ng giao th c Internet Control Message Protocol (ICMP) v i m t raw-socket. M t thng i p ping giao ti p v i m t thi t b t i m t a ch IP c th , g i m t thng i p th nghi m, v yu c u thi t b ny p ng l i. o th i gian k t n i gi a hai my tnh, b n c th o th i gian cho m t p ng. M c d thng i p ping n gi n hn cc ki u giao ti p khc, nhng hi n th c m t ti n ch ping trong .NET i h i m t l ng l n m l nh networking m c-th p v ph c t p. Th vi n l p .NET khng c s n gi i php nothay vo , b n ph i s d ng raw-socket v m t s m l nh c c k di. Tuy nhin, c t nh t m t nh pht tri n gi i quy t c v n ping. D i y l m l nh do Lance Olson, m t nh pht tri n c a Microsoft, cung c p. M l nh ny cho php ping m t host b ng tn hay a ch IP v o l ng mili-giy cho m t 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; // T o m t raw-socket. Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp); // L y IPEndPoint c a server, v chuy n n thnh EndPoint. IPHostEntry serverHE = Dns.GetHostByName(host); IPEndPoint ipepServer = new IPEndPoint(serverHE.AddressList[0], 0); EndPoint epServer = (ipepServer); // Thi t l p endpoint cho my client. IPHostEntry fromHE = Dns.GetHostByName(Dns.GetHostName()); IPEndPoint ipEndPointFrom = new IPEndPoint(fromHE.AddressList[0], 0); EndPoint EndPointFrom = (ipEndPointFrom); // T o 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"); packet.SequenceNumber = UInt16.Parse("0"); int PingData = 32; packet.Data = new Byte[PingData]; for (int i = 0; i < PingData; i++) packet.Data[i] = (byte)'#';

357 Chng 11: L p trnh m ng 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++) { 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; // Tu n t ha packet. byte[] sendbuf = new byte[PacketSize]; index = Serialize(packet, sendbuf, PacketSize, PingData); // B t u tnh gi . dwStart = System.Environment.TickCount; socket.SendTo(sendbuf, PacketSize, 0, epServer); // Nh n p ng, v ng ng tnh gi . byte[] ReceiveBuffer = new byte[256]; socket.ReceiveFrom(ReceiveBuffer, 256, 0, ref EndPointFrom); dwStop = System.Environment.TickCount - dwStart; } // D n d p v tr v socket.Close(); return (int)dwStop; } private static int Serialize(IcmpPacket packet, byte[] buffer, int packetSize, int pingData) { // (B } private static UInt16 checksum(UInt16[] buffer, int size) { // (B } } public class IcmpPacket { public byte Type; public byte SubCode; public UInt16 CheckSum; public UInt16 Identifier; public UInt16 SequenceNumber; qua phng th c private dng tnh checksum.) qua phng th c private dng tu n t ha packet.) th i gian "ping" (tnh theo giy).

358 Chng 11: L p trnh m ng public byte[] Data; }

B n c th s d ng phng th c tnh Pinger.GetPingTime v i m t a ch IP hay m t tn mi n. Phng th c GetPingTime tr v l ng mili-giy tri qua tr c khi m t p ng c ti p nh n. D i y l o n m th nghi m 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 nghi m ping cho php b n xc minh cc my tnh khc c online hay khng. N cng c th h u ch khi ng d ng c a b n c n nh gi nh ng my tnh khc nhau ( xa) nhng cho cng n i dung xc nh my no c th i gian giao ti p m ng th p nh t. M t yu c u ping c th khng thnh cng n u b firewall ngn l i. V d , nhi u site b qua yu c u ping v s b sa vo m t lu ng ping cng m t lc s lm c n tr server (th c ch t l m t t n cng t ch i d ch v ).

11.8

Giao tip bng TCP

B n c n g i d li u gi a hai my tnh trn m t network b ng k t n i TCP/IP. M t my tnh (server) ph i l ng nghe b ng l p System.Net.Sockets.TcpListener. M i khi m t k t n i c thi t l p, c hai my tnh u c th giao ti p b ng l p System.Net.Sockets.TcpListener. TCP l m t giao th c ng tin c y d a-trn-k t-n i, cho php hai my tnh giao ti p thng qua m t network. t o m t k t n i TCP, m t my tnh ph i ng vai tr l server v b t u l ng nghe trn m t endpoint c th (endpoint c nh ngha l m t a ch IP, cho bi t my tnh v s port). M t my tnh khc ph i ng vai tr l client v g i m t yu c u k t n i n endpoint m my tnh th nh t ang l ng nghe trn . M t khi k t n i c thi t l p, hai my tnh c th trao i cc thng i p v i nhau. C hai my tnh ch n gi n c/ghi t m t System.Net.Sockets.NetworkStream. M c d m t k t n i TCP lun c n c m t server v m t client, nhng khng l do g m t ng d ng khng th l c hai. V d , trong m t ng d ng peer-to-peer, m t ti u trnh c s d ng l ng nghe cc yu c u n ( ng vai tr l m t server) trong khi m t ti u trnh khc c s d ng kh i t o cc k t n i i ( ng vai tr l m t client). Trong v d i km m c ny, client v server l cc ng d ng ring r v c t trong cc th m c con ring.

359 Chng 11: L p trnh m ng

M t khi k t n i TCP c thi t l p, hai my tnh c th g i b t k ki u d li u no b ng cch ghi d li u ra NetworkStream. Tuy nhin, t ng hay l b t u thi t k m t ng d ng m ng b ng cch nh ngha giao th c m c- ng-d ng m client v server s s d ng giao ti p. Giao th c ny ch a cc h ng m t cc l nh c php, b o m m l nh c a ng d ng khng ch a cc chu i giao ti p c vi t c ng.
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"; } }

Trong v d ny, b ng t v ng c nh ngha s n ch l c b n. B n c th thm nhi u h ng hn n a ty thu c vo ki u ng d ng. V d , trong m t ng d ng truy n file, client c th g i m t thng i p yu c u m t file. Sau , server c th p l i b ng m t acknowledgment (ACK) v tr v cc chi ti t c a file (kch th c file ch ng h n). Nh ng h ng ny s c bin d ch thnh m t Class Library Assembly ring, v c client v server u ph i tham chi u n assembly ny. o n m d i y l m t khun d ng cho m t TCP-server c b n. N l ng nghe trn m t port c nh, nh n k t n i n u tin v r i i client yu c u ng ng k t n i. T i th i i m ny, server c th g i phng th c TcpListener.AcceptTcpClient l n n a i client k ti p. Nhng thay vo , n s ng l i.
using using using using using System; System.Net; System.Net.Sockets; System.IO; SharedComponent;

public class TcpServerTest { private static void Main() { // T o 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 c u k t n i, v tr v TcpClient. TcpClient client = listener.AcceptTcpClient(); Console.WriteLine("Connection accepted."); // Thu l y network stream.

360 Chng 11: L p trnh m ng NetworkStream stream = client.GetStream(); // T o BinaryWriter ghi ra stream. BinaryWriter w = new BinaryWriter(stream); // T o 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 n m d i (ng ng l ng nghe yu c u m i). listener.Stop(); Console.WriteLine("Listener stopped."); } catch (Exception err) { Console.WriteLine(err.ToString()); } Console.ReadLine(); } }

o n m d i y l m t khun d ng cho m t TCP-client c b n. N ti p xc v i server t i a ch IP v port c ch nh. Trong v d ny, a ch loopback (127.0.0.1ch n my tnh hi n hnh) c s d ng. Nh r ng k t n i TCP yu c n hai port: m t t i server v m t t i client. Tuy nhin, ch c n ch nh port t i server, cn port t i client c th c ch n ng lc th c thi t cc port c s n.
using using using using using System; System.Net; System.Net.Sockets; System.IO; 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);

361 Chng 11: L p trnh m ng Console.WriteLine("Connection established."); // Thu l y network stream. NetworkStream stream = client.GetStream(); // T o BinaryWriter ghi ra stream. BinaryWriter w = new BinaryWriter(stream); // T o 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..."); 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(); } }

D i 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 d i y l transcript pha client:


Attempting to connect to the server on port 8000. Connection established. Connected. Press Enter to disconnect. Disconnecting... Port closed.

362 Chng 11: L p trnh m ng

11.9
S

Ly a ch IP ca client t kt ni socket
nh a ch IP c a client sau khi n ch p nh n m t k t l y l p m c-th p l d ng thu c tnh

ng d ng server c n xc n i.
System.Net.Sockets.Socket

d ng phng th c AcceptSocket c a l p TcpListener thay v l TcpClient. S Socket.RemoteEndPoint l y a ch IP c a client.

L p TcpClient khng cho php b n thu l y socket n m d i hay b t c thng tin no v port v a ch IP c a client. L p ny c cung c p thu c tnh Socket, nhng thu c tnh ny l c-b o-v (protected) v do khng th truy xu t c t cc l p phi d n xu t. truy xu t socket n m d i, b n c hai ty ch n: T o m t l p ty bi n d n xu t t TcpClient. L p ny c th truy xu t thu c tnh cb o-v Socket v trng n ra thng qua m t thu c tnh m i. Sau , b n ph i s d ng l p ty bi n ny thay cho TcpClient. B qua l p TcpClient b ng cch s d ng phng th c TcpListener.AcceptSocket. B n v n c th s d ng cc l p m c-cao l BinaryReader v BinaryWriter c/ghi d li u, nhng b n c n ph i t o NetworkStream tr c (s d ng socket). i c a server trong m c 11.8:
System; System.Net; System.Net.Sockets; System.IO; SharedComponent;

M c ny s d ng cch th hai. D i y l phin b n s a


using using using using using

public class TcpServerTest { private static void Main() { // T o 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 c u k t n i, v tr v m t Socket. Socket socket = listener.AcceptSocket(); Console.WriteLine("Connection accepted."); // T o network stream. NetworkStream stream = new NetworkStream(socket); // T o BinaryWriter ghi ra stream. BinaryWriter w = new BinaryWriter(stream); // T o BinaryReader c t stream. BinaryReader r = new BinaryReader(stream);

363 Chng 11: L p trnh m ng if (r.ReadString() == ClientMessages.RequestConnect) { w.Write(ServerMessages.AcknowledgeOK); Console.WriteLine("Connection completed."); // L y a ch IP c a 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(); Console.WriteLine("Connection closed."); // ng socket n m d i (ng ng l ng nghe yu c u m i). listener.Stop(); Console.WriteLine("Listener stopped."); } catch (Exception err) { Console.WriteLine(err.ToString()); } Console.ReadLine(); } }

11.10

Thit lp cc ty chn socket

B n c n thi t l p cc ty ch n socket m c-th p, ch ng h n cc ty ch n cho bi t send timeout v receive timeout. S d ng phng th c Socket.SetSocketOption. B n c th thi t l p cc thu c tnh c a socket c s d ng l ng nghe cc yu c u ho c cc thu c tnh c a socket c s d ng cho m t phin client c th . B n c th s d ng phng th c Socket.SetSocketOption thi t l p m t s thu c tnh socket m c-th p. Khi g i phng th c ny, b n c n cung c p ba i s sau y: M t gi tr thu c ki u li t k SocketOptionLevel, cho bi t ki u socket m thi t l p ny s p d ng cho n (bao g m IP, IPv6, Socket, Tcp, Udp). M t gi tr thu c ki u li t k SocketOptionName, cho bi t thi t l p socket m b n mu n thay i (xem danh sch cc gi tr c a SocketOptionName trong ti li u .NET Framework). M t gi tr m t thi t l p m i. Gi tr ny th ng l m t s nguyn, nhng cng c th l m t m ng byte hay m t ki u i t ng.

364 Chng 11: L p trnh m ng

V d d i y s thi t l p send-timeout c a socket:


// Thao tc g i s h t hi u l c n u khng nh n c // thng tin xc nh n trong vng 1000 mili-giy. socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 1000);

truy xu t socket m t m t k t n i client/server, b n ph i s d ng phng th c c th o lu n trong m c 11.9).


TcpListener.AcceptSocket thay cho phng th c TcpListener.AcceptTcpClient (

Ch r ng,

B n cng cc yu c cung c p khng th

c th thi t l p cc ty ch n cho socket c s d ng b i TcpListener theo di u k t n i. Tuy nhin, b n ph i th c hi n thm m t vi b c n a. L p TcpListener thu c tnh Socket, nhng kh nng truy xu t c a n l protected, ngha l b n truy xu t n m t cch tr c ti p. Thay vo , b n ph i d n xu t m t l p m i t TcpListener:
public class CustomTcpListener : TcpListener { public Socket Socket { get {return base.Server;} } public CustomTcpListener(IPAddress ip, int port) : base(ip, port) {} }

By gi , b n c th s d ng l p ny khi t o m t TcpListener. V d d i y s d ng cch ti p c n ny thi t l p m t ty ch n socket:


CustomTcpListener listener = new CustomTcpListener(IPAddress.Parse("127.0.0.1"), 8000); listener.Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000); // (S d ng CustomTcpListener gi ng nh s d ng TcpListener.)

11.11

To mt TCP-server h-tr-a-tiu-trnh

B n mu n t o m t TCP-server c th cng lc x l nhi u TCP-client. S d ng phng th c AcceptTcpClient c a l p TcpListener. M i khi c m t client m i k t n i n, kh i ch y m t ti u trnh m i x l yu c u v g i TcpListener.AcceptTcpClient l n n a. M t endpoint TCP ( a ch IP v port) c th ph c v nhi u k t n i. Th c ra, h i u hnh m ng ph n l n cng vi c gim b n. Nh ng g b n c n lm l t o m t i t ng th (worker object) trn server x l m i k t n i trong m t ti u trnh ring. Xt l p TCP-client v TCP-server c trnh by trong m c 11.8. B n c th d dng chuy n server ny thnh m t server h -tr - a-ti u-trnh th c hi n nhi u k t n i cng m t lc. Tr c h t, t o m t l p tng tc v i m t client:
using using using using System; System.Net; System.Net.Sockets; System.IO;

365 Chng 11: L p trnh m ng 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 l y network stream. NetworkStream stream = client.GetStream(); // T o BinaryWriter ghi ra stream. BinaryWriter w = new BinaryWriter(stream); // T o 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."); } // ng socket. client.Close(); Console.WriteLine(ID + ": Client connection closed."); Console.ReadLine(); } }

K ti p, thay i m l nh c a server sao cho n l p lin t c, t o ra cc th hi n ClientHandler m i khi c n v ch y chng trong cc ti u trnh m i. D i y l m l nh c s a 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) {

366 Chng 11: L p trnh m ng try { // i yu c u k t n i, v tr v m t TcpClient. TcpClient client = listener.AcceptTcpClient(); Console.WriteLine("Server: Connection accepted."); // T o m t i t ng m i x l k t n i ny. clientNum++; ClientHandler handler = new ClientHandler(client, "Client " + clientNum.ToString()); // Kh i ng i t ng ny lm vi c trong // m t ti u trnh khc. Thread handlerThread = new Thread(new ThreadStart(handler.Start)); handlerThread.IsBackground = true; handlerThread.Start(); // (B n cng c th thm Handler v HandlerThread vo // m t t p h p theo di cc phin client.) }catch (Exception err) { Console.WriteLine(err.ToString()); } } } }

D i y l transcript pha server c a m t phin lm vi c v i 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.

B n c th thm m l nh vo server n theo v t cc i t ng th hi n hnh trong m t t p h p. Lm nh th s cho php server h y b cc tc v ny n u n c n ph i ng v ch c php m t s t i a client cng m t lc.

11.12

S dng TCP mt cch bt ng b

B n c n ghi d li u ra network-stream t ng kh i m t, m khng ph i block ph n m l nh cn l i. K thu t ny c th c s d ng n u b n mu n stream m t file l n trn m ng. T o m t l p ring x l k thu t streaming b t ng b . B n c th b t u stream m t kh i d li u b ng phng th c NetworkStream.BeginWrite v cung c p m t phng th c callback. Khi callback c kch ho t th g i kh i k ti p.

367 Chng 11: L p trnh m ng

L p NetworkStream h tr vi c s d ng b t ng b thng qua phng th c BeginRead v BeginWrite. S d ng cc phng th c ny, b n c th g i hay nh n m t kh i d li u trn m t trong cc ti u trnh do thread-pool c a b th c thi .NET cung c p, m khng block m l nh c a b n. M c ny trnh by k thu t ghi b t ng b . Khi g i d li u m t cch b t ng b , b n ph i g i d li u nh phn th (m t m ng byte). V b n c n ch n kch th c m i l n g i hay nh n. V d d i y vi t l i server t m c 11.11 sao cho m i l p ClientHandler g i m t l ng l n d li u c c t m t file. D li u ny c g i m t cch b t ng b , ngha l ClientHandler c th ti p t c th c hi n cc tc v khc (trong v d ny, n ch vi c l y cc thng i p c g i t client). M t thu n l i c a cch ti p c n ny l ton b n i dung c a file ch ng bao gi n m trong b nh m t l t. Thay vo , n c thu l y ngay tr c khi m t kh i m i c g i. M t thu n l i khc n a l server c th h y b thao tc vo b t c lc no. V d , n u client ch c n kh i d li u th ba th ng t k t n i, server s thi t l p m t bi n thnh vin lu n l c tn l fileStop bo cho callback khng g i d li u n a. D i y l l p ClientHandler c s a
using using using using using System; System.Net; System.Net.Sockets; System.IO; SharedComponent;

i (l p TcpServerTest khng c n thay

i g):

public class ClientHandler { private TcpClient client; private string ID; // Kch private // B private th c m t kh i d li u (2 KB). int bufferSize = 2048; m dng ch a d li u. byte[] buffer;

// Dng c d li u t m t file. private FileStream fileStream; // Dng giao ti p v i client. private NetworkStream networkStream; // D u hi u ng ng g i d li u. private bool fileStop = false; public ClientHandler(TcpClient client, string ID) { this.buffer = new byte[bufferSize]; this.client = client; this.ID = ID; } public void Start() { // Thu l y network stream. networkStream = client.GetStream(); // T o cc i t ng dng g i v nh n text. BinaryWriter w = new BinaryWriter(networkStream); BinaryReader r = new BinaryReader(networkStream); if (r.ReadString() == ClientMessages.RequestConnect) {

368 Chng 11: L p trnh m ng 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 c p, nhng // trong v d ny, file th nghi m l m c ng. fileStream = new FileStream("test.bin", FileMode.Open); // G i kch th c file. w.Write(fileStream.Length.ToString()); // Kh i ch y thao tc b t StreamData(null); ng b .

} } fileStop = true; Console.WriteLine(ID + ": Disconnect request received."); } else { Console.WriteLine(ID + ": Could not complete connection."); } // ng k t n i. client.Close(); Console.WriteLine(ID + ": Client connection closed."); Console.ReadLine(); } private void StreamData(IAsyncResult asyncResult) { // H y b n u client ng ng k t n i. if (fileStop == true) { fileStop = false; return; } if (asyncResult != null) { // M t kh i c ghi m t cch b t networkStream.EndWrite(asyncResult); } ng b .

// L y kh i k ti p t file. int bytesRead = fileStream.Read(buffer, 0, buffer.Length); // N u khng c c byte no, stream if (bytesRead > 0) { n cu i file.

Console.WriteLine("Streaming new block."); // Ghi kh i k ti p ra network stream. networkStream.BeginWrite(buffer, 0, buffer.Length, new AsyncCallback(StreamData), null); } else { // K t thc thao tc. Console.WriteLine("File streaming complete.");

369 Chng 11: L p trnh m ng fileStream.Close(); } } }

B n c th s d ng m t m u tng t

c d li u m t cch b t

ng b pha client.

11.13

Giao tip bng UDP

B n c n g i d li u gi a hai my tnh trn m t network b ng User Datagram Protocol (UDP) stream. S d ng l p System.Net.Sockets.UdpClient, v s d ng hai ti u trnh: m t d li u v m t nh n d li u. g i

UDP l m t giao th c phi k t n i, khng c b t k i u khi n dng ch y hay ki m tra l i no. Khc v i TCP, UDP s khng c s d ng nh ng ni c n n giao ti p ng tin c y. Tuy nhin, v chi ph th p hn, UDP th ng c s d ng cho cc ng d ng "chatty", t i ch p nh n m t m t vi thng i p. V d , gi s b n mu n t o m t network m trong , cc client g i thng tin v nhi t hi n th i t i v tr c a chng n m t server m i vi pht. B n c th s d ng UDP trong tr ng h p ny v t n s giao ti p cao v thi t h i do m t packet l khng ng k (v server c th ti p t c s d ng nhi t nh n c cu i cng). ng d ng d i y s d ng hai ti u trnh: m t nh n thng i p v m t g i thng i p. th nghi m ng d ng ny, hy n p hai th hi n cng m t lc. Trn my tnh A, cho bi t a ch IP c a my tnh B. Trn my tnh B, cho bi t a ch IP c a my tnh A. Theo , b n c th g i qua l i thng i p d ng text (b n c th m ph ng th nghi m ny trn m t my n b ng cch s d ng hai port khc nhau v a ch loopback).
using using using using using System; System.Text; System.Net; System.Net.Sockets; System.Threading;

public class UdpTest { private static int localPort; private static void Main() { // nh ngha endpoint (thng i p c g i t i Console.Write("Connect to IP: "); string IP = Console.ReadLine(); Console.Write("Connect to port: "); int port = Int32.Parse(Console.ReadLine()); y).

IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse(IP), port); // nh ngha endpoint c c b (thng i p c nh n t i Console.Write("Local port for listening: "); localPort = Int32.Parse(Console.ReadLine()); Console.WriteLine(); // T o m t ti u trnh m i nh n thng Thread receiveThread = new Thread( i p n. y).

370 Chng 11: L p trnh m ng new ThreadStart(ReceiveData)); receiveThread.IsBackground = true; receiveThread.Start(); UdpClient client = new UdpClient(); try { string text; do { text = Console.ReadLine(); if (text != "") { // M ha d li u thnh d ng nh phn // b ng php m ha UTF8. byte[] data = Encoding.UTF8.GetBytes(text); // G i text n client xa. client.Send(data, data.Length, remoteEndPoint); } } while (text != ""); } catch (Exception err) { Console.WriteLine(err.ToString()); } Console.ReadLine(); } private static void ReceiveData() { UdpClient client = new UdpClient(localPort); while (true) { try { // Nh n d li u (byte). IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0); byte[] data = client.Receive(ref anyIP); // Chuy n byte thnh text b ng php m ha UTF8. string text = Encoding.UTF8.GetString(data); // Hi n th text thu c. Console.WriteLine(">> " + text); } catch (Exception err) { Console.WriteLine(err.ToString()); } } } }

Ch r ng, cc ng d ng UDP khng th s d ng NetworkStream nh cc ng d ng TCP. Thay vo , chng ph i chuy n t t c d li u thnh m t stream b ng m t l p m ha, nh c m t trong m c 2.2. B n c th th nghi m ng d ng ny v i cc client trn my c c b b ng cch s d ng hai port khc nhau v a ch loopback. V d , gi s c hai UDP-client: client A v client B. D i y l transcript i v i client A:
Connect to IP: 127.0.0.1 Connect to port: 8001 Local port for listening: 8080

371 Chng 11: L p trnh m ng Hi there!

V y l transcript tng ng

i v i client B (cng v i thng i p nh n c):

Connect to IP: 127.0.0.1 Connect to port: 8080 Local port for listening: 8001 >> Hi there!

11.14
B n c n g i e-mail n m t Transfer Protocol server).

Gi e-mail thng qua SMTP


a ch e-mail b ng m t SMTP-server (Simple Mail

S d ng l p SmtpMail v MailMessage thu c khng gian tn System.Web.Mail. Cc l p trong khng gian tn System.Web.Mail cung c p m t v b c cho thnh ph n Collaboration Data Objects for Windows 2000 (CDOSYS). Chng cho php b n so n v g i thng i p e-mail b ng SMTP. D dng s d ng cc ki u ny. B n ch c n t o m t i t ng MailMessage, cho bi t a ch email c a ng i g i v ng i nh n, v t n i dung c a thng i p trong thu c 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!";

N u mu n, b n c th g i m t thng i p HTML b ng cch thay v s d ng cc th HTML.


myMessage.BodyFormat = MailFormat.Html; myMessage.Body = @"<HTML><HEAD></HEAD>" + @"<BODY>This is the message!</BODY></HTML>";

nh d ng c a thng i p

B n c th

thm file

nh km b ng t p h p MailMessage.Attachments v l p

MailAttachment. MailAttachment myAttachment = new MailAttachment("c:\\mypic.gif"); myMessage.Attachments.Add(myAttachment);

g i thng
SmptMail.Send.

i p, b n ch c n cho bi t tn c a SMTP-server v g i phng th c

SmtpMail.SmtpServer = "test.mailserver.com"; SmtpMail.Send(myMessage);

Tuy nhin, c m t vi v n khi s d ng l p SmtpMail g i m t thng i p e-mail. L p ny c n m t SMTP-server c c b hay m t relay-server trn m ng. Ngoi ra, l p SmtpMail khng h tr vi c xc th c, do , n u SMTP-server yu c u username v password, b n s khng th g i b t k mail no. kh c ph c v n ny, b n c th tr c ti p s d ng thnh ph n CDOSYS thng qua COM Interop (gi s b n c phin b n server c a Windows hay Microsoft Exchange).

372 Chng 11: L p trnh m ng

Nh r ng, giao th c SMTP khng c s d ng l y e-mail. i v i cng vi c ny, b n c n giao th c POP3 hay IMAP, c hai giao th c ny u khng c trong .NET Framework. c thm thng tin v cch s d ng v c u hnh SMTP-server, b n hy tham kh o cc quy n sch chuyn v IIS.

11.15

Gi v nhn e-mail vi MAPI

B n mu n g i m t thng i p e-mail, nhng SMTP-server (Simple Mail Transfer Protocol server) cha c c u hnh trn my tnh. S d ng Simple MAPI (Messaging Application Programming Interface) b ng cch nh p hm c n thi t t th vi n h th ng khng- c-qu n-l Mapi32.dll. MAPI l giao di n cho php b n tng tc v i cc tnh nng mailing c tch h p trong h i u hnh Windows. B n c th s d ng MAPI (thng qua cc hm API khng- c-qu n-l, tng tc v i mail-client ho c thng qua thnh ph n MAPI i cng v i Visual Studio 6) m c nh (th ng l Microsoft Outlook hay Outlook Express). Cc tc v bao g m: l y thng tin contact t s a ch , l y thng i p trong Inbox, so n v g i thng i p. ng ti c, khng c l p no s d ng MAPI trong .NET Framework. Tuy nhin, b n c th s d ng th vi n khng- c-qu n-l Mapi32.dll. Thch th c chnh khi s d ng Simple MAPI trong .NET l marshal cc c u trc c s d ng trong .NET thnh cc c u trc m Simple MAPI c n, sau marshal cc c u trc do Simple MAPI tr v cho ng d ng .NET. y khng ph i l m t cng vi c n gi n. Tuy nhin, Microsoft cung c p m t gi i php ton v n trong m t thnh ph n C# t ng qut (c th t i mi n ph). B n c th s d ng hai d n d i y: M t thnh ph n th vi n l p (Class Library Component) b c l y cc hm Simple MAPI v lm cho chng c hi u l c thng qua cc phng th c c a l p. M t chng trnh (th nghi m) s d ng thnh ph n ny mail, g i mail... ng nh p, ng xu t, c y

M l nh c a c hai d n ny khng m y ph c t p, nhng r t di nn khng trnh by (b n hy xem trong a CD nh km).

i v i m t v d ph c t p hn (xy d ng trn th vi n Simple MAPI c a Microsoft t o m t ng d ng Windows Form), m t d n C# m u (c th t i mi n ph) c Thomas Scheidegger cung c p t i [http://www.codeproject.com/ csharp/simplemapidotnet.asp].

373 Chng 11: L p trnh m ng

374

Chng 12: D CH V WEB XML V REMOTING

12

375

376 Chng 12: D ch v Web XML v Remoting

icrosoft .NET Framework h tr hai m hnh l p trnh phn tn c p cao l Remoting v d ch v Web XML. M c d c hai cng ngh ny c nhi u i m tng ng (v d , c hai cng tr u t ng ha l i g i gi a cc ti n trnh hay gi a cc my tnh khc nhau thnh l i g i phng th c c a cc i t ng xa), nhng chng cng c vi i m khc nhau c b n.

D ch v Web XML c xy d ng b ng cc chu n xuyn-n n v d a vo khi ni m XML messaging. D ch v Web XML c th c thi b i b th c thi ASP.NET; ngha l chng c c cc tnh nng c a ASP.NET nh output-caching. i u ny cng c ngha l d ch v Web XML thu c d ng phi tr ng thi (stateless). Ni chung, d ch v Web XML thch h p nh t khi b n c n xuyn bin n n (v d , m t Java-client g i m t d ch v Web ASP.NET) hay bin tin c y (v d , trong cc phin giao d ch thng m i). Trong chng ny, chng ta s bn m t s m c lin quan n d ch v Web XML sau: Nng cao tnh linh ho t c a cc l p proxy b ng cch khng vi t m c ng cho c a d ch v Web XML (m c 12.1). a ch

S d ng k thu t caching nng cao hi u nng v kh nng ph c v (tnh quy m) c a d ch v Web XML (m c 12.2 v 12.3). T o phng th c giao d ch cho d ch v Web XML (m c 12.4). Truy n thng tin xc th c cho m t d ch v Web XML b ng proxy (m c 12.5). G ib t ng b m t phng th c c a d ch v Web XML (m c 12.6). Remoting l m t cng ngh c trng c a .NET dnh cho cc i t ng phn tn v c xem nh l m t h u du c a cng ngh DCOM. Cng ngh ny l t ng cho cc h th ng inhouse1; trong , t t c cc ng d ng u c xy d ng trn n n .NET, ch ng h n backbone c a m t h th ng x l ha n. Remoting cho php cc chu n giao ti p khc nhau, ch ng h n cc thng i p nh phn nh g n v cc k t n i TCP/IP hi u qu hn m d ch v Web XML khng h tr . Ngoi ra, Remoting cn l cng ngh duy nh t h tr cc i t ng c tr ng thi, v giao ti p hai chi u thng qua callback. N cng l cng ngh duy nh t cho php g i cc i t ng .NET ty bi n qua m ng. Trong chng ny, chng ta s bn m t s m c lin quan n Remoting sau: T o cc i t ng kh -truy-xu t-t -xa; ng k v qu n l chng trn IIS (m c 12.7, 12.8, v 12.9). Pht sinh s ki n trn cc knh truy xu t t xa (m c 12.10). Ki m sot th i gian s ng v phin b n c a cc 12.11 v 12.12). Hi n th c cc phng th c m t chi u trong cc 12.13). i t ng kh -truy-xu t-t -xa (m c i t ng kh -truy-xu t-t -xa (m c

Chng ny ch a ra m t s k thu t h u d ng trong vi c s d ng d ch v Web XML v Remoting. hi u su hn, b n c n tham kh o cc sch chuyn v ti ny.

in-house system: H th ng cng ngh thng tin do phng IT c a m t cng ty xy d ng nn.

377 Chng 12: D ch v Web XML v Remoting

12.1

Trnh vit m cng cho a ch URL ca dch v Web XML

B n c n s d ng m t d ch v Web XML c t t i m t ny c th thay i sau khi b n tri n khai ng d ng client.

a ch URL m

a ch

S d ng a ch URL ng cho d ch v Web XML. Khi , a ch ng ny c l y m t cch t ng t file c u hnh c a ng d ng client. Trong Microsoft Visual Studio .NET, b n c th c u hnh a ch URL ng b ng cch thay i ty ch n URL Behavior c a Web Reference. B n cng c th s d ng cng c Web Services Description Language (Wsdl.exe) v i i s /appsettingurlkey. Theo m c nh, khi b n t o m t l p proxy th a ch URL c a d ch v Web XML l m c ng trong phng th c kh i d ng c a l p proxy ny. B n c th chp thi t l p ny trong m l nh b ng cch i u ch nh thu c tnh Url c a l p proxy sau khi t o m t th hi n c a n. Tuy nhin, c m t ty ch n khc: c u hnh cho l p proxy s d ng m t a ch URL ng. Trong Visual Studio .NET, b n c th th c hi n i u ny b ng cch ch n Web Reference trong c a s Solution Explorer v thay i ty ch n URL Behavior trong c a s Properties (xem hnh 12.1).

Hnh 12.1 C u hnh

a ch URL cho d ch v Web XML

Sau khi b n thay i nh trn, a ch URL c a d ch v Web XML s t ng file c u hnh c a ng d ng client. File c u hnh ny c tn l Web.config i v Web, v [AppName].exe.config i v i cc ng d ng khc (lu , ngu n xu t tr ng thi t k ch l App.config, nhng sau s c Visual Studio .NET t ng). V d d i y l thi t l p c sinh t ng trong file c u hnh:
<?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <add key="AppName.ServerName.ServiceName"

c thm vo i cc ng d ng hi n trong mi i tn m t cch

378 Chng 12: D ch v Web XML v Remoting value="http://localhost/WebServices/MyService.asmx"/> </appSettings> </configuration>

B n cng c th s d ng a ch URL ng do cng c Wsdl.exe sinh ra. Trong tr ng h p ny, b n s d ng i s /appsettingurlkey cho bi t tn c a thi t l p c u hnh m URL s c lu tr . B n ph i t o file c u hnh b ng tay.
wsdl /out:Proxy.cs http://localhost/WebServices/MyService.asmx?WSDL /appsettingurlkey:MyService

Trong c hai tr ng h p, m l nh c a l p proxy s c s a i c a ch URL t file c u hnh. N u khng tm th y gi tr c n thi t, n s m c nh s d ng a ch URL c s d ng trong qu trnh pht tri n ng d ng. Cch ti p c n ny cho php b n i a ch URL c a d ch v Web XML sau khi bin d ch v tri n khai ng d ng (ch c n thay i file c u hnh).

12.2 S dng k thut response-caching trong dch v


Web XML
B n mu n nng cao hi u nng c a d ch v Web XML b ng cch lu tr gi tr tr v c a m t phng th c web. S d ng response-caching b ng cch thi t l p thu c tnh CacheDuration c a tnh System.Web.Services.WebMethod. c

Trong ASP.NET, d ch v Web XML h tr response-caching gi ng h t nh cc trang web ASP.NET. Khi response-caching c kch ho t, m l nh c a b n ch th c hi n m t l n, v gi tr tr v c a phng th c web s c lu l i v c tr v trong cc l n g i ti p theo. i v i Web Form, caching c th c hi n cho t ng form. i v i d ch v Web XML, caching c kch ho t v c u hnh ring cho m i phng th c web. V d , phng th c web d i y tr v gi tr ngy gi hi n hnh trn my server. Thng tin ny c lu l i trong m t pht, ngha l cc l i yu c u ti p theo trong kho ng th i gian ny s nh n l i thng tin c lu tr c .
Using System; using System.Web.Services; public class ResponseCaching { [WebMethod(CacheDuration=60)] public string GetDate() { return DateTime.Now.ToString(); } }

N u phng th c web c a b n nh n nhi u i s , ASP.NET s s d ng l i gi tr c lu ch khi cc gi tr i s cng gi ng nh th . N u b n c m t phng th c nh n t m gi tr r ng th caching tr nn khng hi u qu v i khi tr nn lng ph, v c qu nhi u thng tin c n c lu nhng t khi c s d ng l i. V d , s d ng caching trong m t phng th c

379 Chng 12: D ch v Web XML v Remoting

web th c hi n php tnh d a trn u vo d ng s khng ph i l m t s l a ch n t t. Tri l i, s d ng caching trong m t phng th c web nh n gi tr ID c a m t nhm nh s n ph m ch c ch n l m t s l a ch n t t. Bao gi cng v y, response-caching b qua m l nh c a b n, khi n n tr nn khng t cch n u phng th c web c a b n c n th c hi n cc hnh ng khc (ch ng h n ghi nh t k), hay phng th c web c a b n ph thu c vo m t s thng tin khc ngoi cc i s c a vo (ch ng h n thng tin xc th c c a ng i dng hay d li u trong phin lm vi c). M t h n ch c a response-caching l n ch cho php b n s d ng l i d li u trong ph m vi c a m t phng th c web. N u b n mu n s d ng l i d li u trong nhi u phng th c web khc nhau, k thu t data-caching s hi u qu hn.

12.3 S dng k thut data-caching trong dch v Web


XML
B n c n ch y phng th c web c a b n nhng v n s d ng m t s thng tin c lu. Ho c, b n mu n nng cao hi u nng c a d ch v Web XML b ng cch lu tr m t s d li u, v c n s d ng l i d li u ny trong m t s phng th c. B n c th lu b t c i t ng no vo cache b ng phng th c Insert c a i t ng System.Web.Caching.Cache. B n c th truy xu t cache thng qua thu c tnh tnh HttpContext.Current. Cch th c lm vi c c a data-caching v i m t d ch v Web XML cng gi ng nh v i m t trang web. B n c th lu tr d li u vo cache b ng m trang web v l y n v trong m t d ch v Web XML, hay ng c l i. c thm thng tin v data-caching v cc ki u chnh sch h t hi u l c (expiration policy) m n h tr , b n hy tham kh o m c 7.15. i m khc bi t duy nh t gi a caching trong m t d ch v Web XML v caching trong m t trang web l: Trong d ch v Web XML, b n khng th thu l y i t ng Cache nh m t thu c tnh n i t i; thay vo , b n c n truy xu t cache thng qua thu c tnh tnh HttpContext.Current. V d d i y trnh by m t d ch v Web XML v i hai phng th c web:
GetProductCatalog: Tr v m t DataSet v i cc thng tin v s n ph m. DataSet ny c

th

c l y t cache ho c c sinh t

ng (n u c n) b ng hm GetCustomerDataSet.

GetProductList: Cng s d ng DataSet v hm GetCustomerDataSet nhng ch l y m t ph n thng tin (tn s n ph m).

C hai phng th c web trn u c th s d ng chung d li u c lu, i u ny lm gi m nh gnh n ng t ln c s d li u.


using using using using using System; System.Data; System.Data.SqlClient; System.Web.Services; System.Web;

380 Chng 12: D ch v Web XML v Remoting 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, n u c th ). return GetCustomerDataSet(); } [WebMethod()] public string[] GetProductList() { // Truy xu t b ng khch hng (t cache, n u c th ). DataTable dt = GetCustomerDataSet().Tables[0]; // T o m ng ch a tn khch hng string[] names = new string[dt.Rows.Count]; // d li u vo m ng. int i = 0; foreach (DataRow row in dt.Rows) { names[i] = row["ProductName"].ToString(); i += 1; } return names; } private DataSet GetCustomerDataSet() { // Ki m tra item c trong cache cha. DataSet ds = HttpContext.Current.Cache["Products"] as DataSet; if (ds == null) { string SQL = "SELECT * FROM Products"; // T o cc i t ng ADO.NET. SqlConnection con = new SqlConnection(connectionString); SqlCommand com = new SqlCommand(SQL, con); SqlDataAdapter adapter = new SqlDataAdapter(com); ds = new DataSet(); // Th c thi cu truy v n. 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; }

381 Chng 12: D ch v Web XML v Remoting }

12.4

To phng thc web h tr giao dch

B n mu n th c thi t t c cc hnh ng c a m t phng th c web trong ng c nh c a m t phin giao d ch COM+ sao cho chng ch c hai kh nng: ho c l thnh cng ho c l th t b i. Kch ho t m t phin giao d ch t ng b ng cch ch n m t gi tr thu c ki u li t k System.EnterpriseServices.TransactionOption v p d ng n cho thu c tnh TransactionOption c a c tnh WebMethod. Trong ASP.NET, d ch v Web XML h tr cc phin giao d ch t ng (c th c kch ho t trn m i phng th c). Khi c kch ho t, b t k ngu n d li u no c h tr giao d ch COM+ s t ng c a vo phin giao d ch hi n hnh khi n c s d ng trong m l nh c a b n. Phin giao d ch s t ng c commit khi phng th c web hon t t. Phin giao d ch ny c roll-back khi c b t k ngo i l cha- c-th -l no x y ra ho c b n g i phng th c SetAbort c a l p System.EnterpriseServices.ContextUtil. kch ho t vi c h tr giao d ch cho m t phng th c web, b n c n thi t l p thu c tnh c tnh WebMethod l RequiresNew. V d , phng th c web (h tr giao d ch) d i y s xa cc b n ghi trong m t c s d li u v r i h y b phin giao d ch ny. s d ng o n m ny, b n ph i thm m t tham chi u n System.EnterpriseServices.dll.
TransactionOption c a using using using using System; System.Data.SqlClient; System.Web.Services; 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() { // T o k t n i. SqlConnection con = new SqlConnection(connectionString); // T o cu truy v n SQL. SqlCommand cmd = new SqlCommand("DELETE * FROM Customers", con); // Th c thi cu truy v n. Tc v ny s t ng // ng k nh m t ph n trong phin giao d ch. con.Open(); cmd.ExecuteNonQuery(); con.Close(); // G i m t phng th c no khc. DoSomething(); // N u khng c l i x y ra, cc thay i trong c s d li u c

382 Chng 12: D ch v Web XML v Remoting // s } private void DoSomething() { // H y b phin giao d ch. ContextUtil.SetAbort(); } c commit y khi phng th c ny k t thc.

B n c th s d ng ti n ch Component Service (trong ph n Administrative Tools c a Control Panel) theo di phin giao d ch trn. Trong ti n ch ny, b n hy ch n m c Distributed Transaction Coordinator c a my tnh hi n hnh, v xem Transaction Statistics. Hnh 12.2 cho th y m t phin giao d ch khng thnh cng khi ch y o n m trn.

Hnh 12.2 Theo di m t phin giao d ch khng thnh cng


[

V b n ch t phi tr ng thi (stateless) c a giao th c HTTP, nn m t phng th c web ch c th gp ph n lm g c c a m t phin giao d ch; ngha l b n khng th a nhi u hn m t phng th c web vo cng m t phin giao d ch. M c d thu c tnh TransactionOption ch p nh n t t c cc gi tr TransactionOption chu n, nhng cc gi tr ny khng mang ngha nh mong i. V d , Disabled, NotSupported, v Supported u c cng tc d ng l v hi u vi c h tr giao d ch. Tng t , c Required v RequiresNew u kch ho t vi c h tr giao d ch v kh i ch y m t phin giao d ch m i. B n nn s d ng RequiresNew trong cc phng th c web v tn c a n tng x ng v i hnh vi th t s (!). Cc giao d ch COM+ lm vi c m t cch trong su t v i h u h t cc ngu n d li u v chng cung c p cc b qu n l ti nguyn tng thch. Nhng lun nh r ng, n u b n tng tc v i m t ti nguyn khng h tr giao d ch, m l nh s khng c roll-back. M t s ho t ng khng ph i l giao d ch: ghi file, t thng tin vo

383 Chng 12: D ch v Web XML v Remoting

tr ng thi phin lm vi c, v truy xu t m t thi t b ph n c ng (nh my in). M t khc, cc thao tc d li u v i h u h t cc h c s d li u Enterprise (bao g m Microsoft SQL Server v Oracle) u l tng thch COM+.

12.5 Thit lp thng tin xc thc cho dch v Web XML


B n mu n g i cc thng tin ng nh p t authentication. S client c a d ch v Web XML n IIS d ng thu c tnh Credentials c a l p proxy. B n c th t o m t i t ng NetworkCredential m i ch a username v password; ho c s d ng CredentialCache l y cc thng tin xc th c c a ng i dng hi n hnh. Cng gi ng nh trang web, d ch v Web XML c th c s d ng cng v i IIS authentication. Nh ng g b n c n lm l t d ch v Web XML vo m t th m c o h n ch vi c truy xu t n c danh. Tuy nhin, n u ng i dng c th cung c p cc thng tin nh x n m t ti kho n ng i dng h p l , ng i dng ny s c xc th c v b n c th l y cc thng tin xc th c ny thng qua i t ng WebService.User. thu l y thng tin Khc v i trang web, d ch v Web XML khng c s n phng th c no xc th c t client v d ch v Web XML c th c thi b i cc ng d ng khc, ch khng ph i b i ng i dng. Do , ng d ng ang tng tc v i d ch v Web XML s ch u trch nhi m nh p b t k thng tin xc th c c n thi t no. V d sau m ph ng m t d ch v Web XML c th c hi n xc th c ng i dng. GetIISUser tr v ng i dng c IIS xc th c. N u truy xu t n c danh c php th k t qu s l m t chu i r ng. N u truy xu t n c danh b t ch i th k t qu s l m t chu i c d ng [DomainName]\[UserName] hay [ComputerName]\[UserName].
public class AuthenticationTest : System.Web.Services.WebService { // L y thng tin v ng i dng [WebMethod()] public string GetIISUser() { return User.Identity.Name; } } c IIS xc th c.

B c cu i cng l t o m t client c th cung c p cc thng tin xc th c. Cc thng tin ny c nh p thng qua thu c tnh Credentials c a i t ng proxy (thi t l p thu c tnh ny tng t nh thi t l p thu c tnh WebRequest.Credentials khi l y v m t trang webtham kh o m c 11.3). o n m d i y trnh by cch truy xu t m t d ch v Web XML s d ng Basic authentication (xc th c c b n):
// T o proxy. localhost.AuthenticationTest proxy = new localhost.AuthenticationTest(); // T o thng tin xc th c. proxy.Credentials = new System.Net.NetworkCredential( "myUserName", "myPassword"); Console.WriteLine(proxy.GetIISUser());

384 Chng 12: D ch v Web XML v Remoting

o n m d i y trnh by cch truy xu t m t d ch v Web XML s Windows authentication (xc th c c tch h p v i Windows):

d ng Integrated

// T o proxy. localhost.AuthenticationTest proxy = new localhost.AuthenticationTest(); // Gn thng tin xc th c c a ng i dng hi n hnh cho l p proxy. proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; Console.WriteLine(proxy.GetIISUser());

12.6

Gi bt ng b mt phng thc web


chng trnh c a

B n c n g i m t phng th c web trong m t ti u trnh khc b n c th th c hi n cc tc v khc trong khi ch p ng.

S d ng cc phng th c b t ng b c s n trong l p proxy. Cc phng th c ny c tn l BeginXXX v EndXXX v i XXX l tn c a phng th c ng b g c. L p proxy ( c t o t ng) c cc tnh nng c b n m b n c n g i b t k phng th c web no m t cch b t ng b . V d , phng th c web d i y c ch c nng t m d ng m t kho ng th i gian ng u 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; } }

V i o n m trn, l p proxy tng ng s g m ba phng th c: Wait, BeginWait v EndWait. Phng th c Wait g i phng th c web m t cch ng b . Phng th c BeginWait kh i ch y phng th c web trong m t ti u trnh ring v tr v ngay l p t c. Phng th c BeginXXX lun nh n nhi u hn phng th c g c hai i s v tr v m t i t ng IAsyncState. Hai i s ny c s d ng nh p thng tin tr ng thi v m t callback. i t ng IAsyncState cho php b n xc nh khi no l i g i k t thc. V d , b n c th nh k ki m tra thu c tnh IAsyncState.IsComplete xc nh l i g i phng th c hon t t cha. Khi n hon t t, b n nh p i t ng IAsyncState vo phng th c EndWait nh n gi tr tr v t phng th c web. N u b n g i EndWait tr c khi phng th c web hon t t, m l nh c a b n s i cho n khi n hon t t. C hai m u b t phng th c b t ng b ph bi n dng cho d ch v Web XML. Cch th nh t l g i vi ng b m t l t, r i i chng hon t t. Cch ny cho php b n gi m th i

385 Chng 12: D ch v Web XML v Remoting

gian i t ng c ng, v n lm vi c t t nh t v i d d i y g i phng th c Wait ba l n:


using System; using System.Threading; public class WaitClient { [MTAThread] private static void Main() {

i t ng System.Threading.WaitHandle. V

localhost.WaitService proxy = new localhost.WaitService(); DateTime startDate = DateTime.Now; // G i ba phng th c m t cch b t 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 th c hon t t. WaitHandle.WaitAll(waitHandle); int totalDelay = proxy.EndWait(handle1) + proxy.EndWait(handle2) + proxy.EndWait(handle3); TimeSpan elapsedTime = DateTime.Now - startDate; Console.WriteLine("Completed after " + elapsedTime.ToString()); Console.WriteLine("Total delay time: " + totalDelay.ToString()); } }

Trong tr ng h p ny, th i gian tri qua nh hn th i gian tr hon t ng c ng:


Completed after 00:00:20.2591312 Total delay time: 47

Cch th hai l s d ng callback. B n c n nh p m t y nhi m ch nh m t phng th c c th trong m l nh. Khi phng th c web hon t t, y nhi m ny s c g i v i i s l m t i t ng IAsyncResult thch h p. D i y l o n m g i phng th c BeginWait (cng v i m t callback):
AsyncCallback callback = new AsyncCallback(Callback); // G i phng th c m t cch b t ng b . proxy.BeginWait(callback, proxy);

V y l callback (s

c kch ho t khi thao tc hon t t):

public static void Callback(IAsyncResult handle) { localhost.WaitService proxy = (localhost.WaitService)handle.AsyncState; int result = proxy.EndWait(handle); Console.WriteLine("Waited " + result.ToString()); }

386 Chng 12: D ch v Web XML v Remoting

12.7

To lp kh-truy-xut-t-xa

B n mu n t o m t l p c th c truy xu t t m t ng d ng khc hay t m t my tnh khc trn m ng. Tuy v y, b n khng c n tnh tng thch xuyn-n n v b n mu n c hi u nng t i u. Lm cho l p ny tr thnh kh -truy-xu t-t -xa (remotable) b ng cch d n xu t t l p System.MarshalByRefObject, v t o m t host ng k l p ny v i ki n trc .NET Remoting. Remoting cho php b n lm cho m t i t ng tr nn truy xu t c qua cc bin my v bin ti n trnh. Trong khi d ch v Web XML l gi i php l t ng khi b n c n chia s cc ch c nng qua cc n n hay cc bin tin c y, Remoting l l a ch n t t nh t cho m t h th ng m trong t t c cc thnh ph n u c xy d ng trn n n .NET v h i u hnh Windows. s d ng .NET Remoting, b n c n cc ph n sau (m i ph n ph i thu c v m t assembly ring bi t): L p kh -truy-xu t-t -xaL p ny c th c truy xu t t cc ng d ng v cc my tnh khc, v ph i d n xu t t System.MarshalByRefObject. ng d ng host ng d ng ny ng k ki u kh -truy-xu t-t -xa v i ki n trc .NET Remoting b ng l p RemotingConfiguration (thu c khng gian tn System.Runtime.Remoting). Mi n l ng d ng host ang ch y, cc client xa c th t o ra cc th hi n c a l p kh -truy-xu t-t -xa. ng d ng client ng d ng ny c th t o ra cc th hi n c a l p kh -truy-xu t-t -xa trong ti n trnh c a host v tng tc v i chng. Client s d ng l p RemotingConfiguration ng k cc ki u m n mu n truy xu t t xa.

Hnh sau m t s tng tc gi a ba ph n trn. Trong v d ny, ch c m t client. Tuy nhin, cng c th c nhi u client t o ra cc th hi n c a l p kh -truy-xu t-t -xa cng m t lc. Trong tr ng h p ny, m i client s c m t i t ng kh -truy-xu t-t -xa c a chnh n, v t t c cc i t ng ny s thu c v mi n ng d ng c a host.

Ordinary Object

Remotable Object

Client

Cross-application call

Component host

Hnh 12.3 S d ng m t l p kh -truy-xu t-t -xa

B c u tin l t o l p kh -truy-xu t-t -xa. V d , l p kh -truy-xu t-t -xa d i y tr v m t DataSet; v i cch ny, m t client c th truy xu t thng tin t c s d li u m khng ph i tr c ti p k t n i n c s d li u pha server.
using System; using System.Data; using System.Data.SqlClient;

387 Chng 12: D ch v Web XML v Remoting 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"; // T o cc i t ng ADO.NET. SqlConnection con = new SqlConnection(connectionString); SqlCommand com = new SqlCommand(SQL, con); SqlDataAdapter adapter = new SqlDataAdapter(com); DataSet ds = new DataSet(); // Th c thi cu truy v n. try { con.Open(); adapter.Fill(ds, "Products"); } catch (Exception err) { Console.WriteLine(err.ToString()); } finally { con.Close(); } return ds.Tables[0]; } // Phng th c ny ki m tra Remoting c ho t ng hay khng. public string GetHostLocation() { return AppDomain.CurrentDomain.FriendlyName; } }

L p ny c

nh ngha trong m t Class Library Assembly c tn l RemoteObject.dll.

m c l t ng, i t ng xa s khng gi l i b t k tr ng thi no. Tnh ch t ny cho php b n s d ng ch kch ho t g i m t l n (single-call activation), trong i t ng s c t o ra ngay u m i l i g i phng th c v s c gi i phng khi k t thc (gi ng nh trong d ch v Web XML). i u ny b o m cc i t ng khng chi m nhi u ti nguyn c a server v vi c qu n l th i gian s ng c a chng tr nn d dng hn. K n, b n ph i t o host y l ng d ng pha server qu n l t t c cc th hi n c a l p kh -truy-xu t-t -xa. B n c th s d ng b t k ki u ng d ng .NET no lm host (bao g m: ng d ng d a-trn-Windows, d ch v Windows, v ng d ng Console). D i y l m t host n gi n d ng Console:
using System; using System.Runtime.Remoting; public class Server { private static void Main() { // ng k cc l p kh -truy-xu t-t -xa v i .NET Remoting. RemotingConfiguration.Configure("Server.exe.config");

388 Chng 12: D ch v Web XML v Remoting // Mi n l ng d ng ny ang ch y, cc i t ng xa // s l kh truy xu t. Console.WriteLine("Press a key to shut down the server."); Console.ReadLine(); } }

Chng trnh trn s d ng file c u hnh (app.config) c u hnh cc l p m n s h tr , cc c ng m n s h tr cho giao ti p m ng, v a ch URI (Uniform Resource Identifier) m client s s d ng truy xu t i t ng. D i y l m t file c u hnh n gi n ng k l p RemoteObjects.RemoteObject t RemoteObject.dll v i a ch c ng l 9080 thng qua giao th c TCP/IP. Assembly ny ph i n m trong GAC (Global Assembly Cache) ho c trong cng th m c v i ng d ng server. File c u hnh cng c u hnh i t ng xa dng ch kch ho t g i-m t-l n.
<configuration> <system.runtime.remoting> <application> <!-nh ngha i t ng kh -truy-xu t-t -xa. --> <service> <wellknown mode = "SingleCall" type="RemoteObject.ProductsDB, RemoteObject" objectUri="RemoteObject" /> </service> <!-nh ngha giao th c dng cho truy xu t m ng. B n c th s d ng knh tcp hay http. --> <channels> <channel ref="tcp" port="9080" /> </channels>

</application> </system.runtime.remoting> </configuration>

Host khng bao gi tng tc tr c ti p t i cc i t ng xa, nh ng g n lm ch l ng k cc ki u thch h p v i ki n trc .NET Remoting. Sau th i i m , ng d ng client c th t o ra cc i t ng ny, v ng d ng server c th ti p t c th c hi n cc cng vi c khc. Tuy nhin, khi host b ng, t t c cc i t ng s b h y, v khng th t o i t ng c n a. ng d ng client s d ng file c u hnh tng t nh trn c a i t ng xa. a ch URL c nh d ng nh sau:
[Protocol]://[Server]:[PortNumber]/[ObjectURI]

nh ngha

a ch URL v ki u

D i y l file c u hnh pha client:


<configuration> <system.runtime.remoting> <application> <! nh ngha i t ng m ng d ng ny mu n truy xu t t xa. --> <client> <wellknown type="RemoteObject.ProductsDB, RemoteObject" url="tcp://localhost:9080/RemoteObject" /> </client>

389 Chng 12: D ch v Web XML v Remoting <!-nh ngha giao th c dng cho truy xu t m ng. Giao th c ny ph i kh p v i giao th c c nh ngha pha server, nhng a ch c ng c th khc. a ch c ng 0 ngha l "l y b t k m t a ch c ng no cn tr ng". --> <channels> <channel ref="tcp" port="0" /> </channels>

</application> </system.runtime.remoting> </configuration>

ng d ng client s d ng phng th c RemotingConfiguration.Configure ng k cc i t ng m n mu n g i. Sau khi ng k xong, client c th t o i t ng ny gi ng nh t o i t ng c c b m c d n th t s n m trong mi n ng d ng c a host. o n m d i y trnh by cc b c ny:
using using using using System; System.Runtime.Remoting; System.Data; RemoteObject;

public class Client { private static void Main() { // ng k cc l p s c truy xu t t xa. RemotingConfiguration.Configure("Client.exe.config"); // Tng tc v i i t ng xa thng qua proxy. ProductsDB proxy = new ProductsDB(); // Hi n th tn mi n ng d ng c a host. Console.WriteLine("Object executing in: " + proxy.GetHostLocation()); // L y DataSet v hi n th n i dung c a n. DataTable dt = proxy.GetProducts(); foreach (DataRow row in dt.Rows) { Console.WriteLine(row[1]); } Console.ReadLine(); } }

t o m t i t ng xa, client c n m t tham chi u n assembly m l p ny c nh ngha trong . i u ny c n thm m t b c tri n khai n a, b n c th trnh i b ng cch s d ng m t giao di n c nh ngha cc ch c nng c h tr . chuy n d li u n i t ng xa (ho c chuy n d li u t i t ng xa v ), cc ki u d li u dng cho cc tham s v gi tr tr v ph i l kh -tu n-t -ha (serializablet t c cc ki u c b n u c tnh ch t ny). N u mu n s d ng cc l p ty bi n chuy n d li u, b n ph i lm cho cc l p ny tr thnh kh -tu n-

390 Chng 12: D ch v Web XML v Remoting

t -ha b ng cch p d ng ti t).

c tnh Serializable (xem m c 16.1

bi t thm chi

12.8

ng k tt c cc lp kh-truy-xut-t-xa trong mt assembly

B n mu n ng k t t c cc l p kh -truy-xu t-t -xa c assembly m khng ph i ch nh chng trong file c u hnh.

nh ngha trong m t

N p assembly (c ch a cc l p kh -truy-xu t-t -xa) b ng c ch ph n chi u (reflection). Duy t qua t t c cc ki u trong v s d ng phng th c RemotingConfiguration.RegisterWellKnownServiceType ng k m i l p kh truy-xu t-t -xa. .NET cho php b n ng k cc l p kh -truy-xu t-t -xa m t cch d dng thng qua vi c vi t file c u hnh ho c vi t m chng trnh. Xt v d trong m c 12.7. ng k b ng m chng trnh, tr c h t b n ph i g b nh ng khai bo l p trong file c u hnh trn server nh sau:
<configuration> <system.runtime.remoting> <application> <channels> <channel ref="tcp" port="9080" /> </channels> </application> </system.runtime.remoting> </configuration>

d ng k thu t ph n chi u k t h p v i phng th c RegisterWellKnownServiceType ng k t t c cc l p kh -truy-xu t-t -xa. Tuy nhin, b n c n thm m t tham chi u n System.Runtime.Remoting.dll. o n m d i y tm cc l p kh -truy-xu t-t -xa trong RemoteObject.dll v ng k m i l p:
using using using using using System; System.Runtime.Remoting; System.Runtime.Remoting.Channels; System.Runtime.Remoting.Channels.Tcp; System.Reflection;

By gi , b n c th

public class Server { private static void Main() { // S d ng file c u hnh nh ngha cc ty ch n v RemotingConfiguration.Configure("Server.exe.config"); // L y knh Remoting c ng k. TcpChannel channel = (TcpChannel)ChannelServices.RegisteredChannels[0]; m ng.

391 Chng 12: D ch v Web XML v Remoting // N p RemoteObject.dll. Assembly assembly = Assembly.LoadFrom("RemoteObject.dll"); // X l t t c cc ki u trong RemoteObject.dll. foreach (Type type in assembly.GetTypes()) { // Ki m tra ki u c ph i l kh -truy-xu t-t -xa hay khng. if (type.IsSubclassOf(typeof(MarshalByRefObject))) { // ng k ki u (tn ki u l a ch URI). Console.WriteLine("Registering " + type.Name); RemotingConfiguration.RegisterWellKnownServiceType( type, type.Name, WellKnownObjectMode.SingleCall); // Xc nh a ch URL (ki u c publish t i y). string[] urls = channel.GetUrlsForUri(type.Name); Console.WriteLine(urls[0]); } } Console.WriteLine("Press a key to shut down the server."); Console.ReadLine(); } }

12.9

Qun l cc i tng xa trong IIS


c th s d ng

B n mu n t o m t i t ng kh -truy-xu t-t -xa trong IIS ( SSL hay IIS authentication) thay cho m t host chuyn bi t. t file c u hnh v assembly vo m t th m c o, v thay thc b ng .rem hay .soap.

i URI sao cho n k t

Thay v t o m t host chuyn bi t, b n c th qu n l m t l p kh -truy-xu t-t -xa trong IIS (Internet Information Services). i u ny cho php b n b o m cc l p kh -truy-xu t-t -xa s lun c hi u l c, v cho php b n s d ng cc tnh nng c a IIS nh SSL Encryption v Integrated Windows authentication. qu n l m t l p kh -truy-xu t-t -xa trong IIS, tr c h t b n ph i t o m t th m c o. Th m c ny ch a hai th : file c u hnh dng ng k cc l p kh -truy-xu t-t -xa v th m c bin dng ch a Class Library Assembly tng ng (ho c ci t assembly vo GAC). File c u hnh ny hon ton tng t v i file c u hnh m b n s d ng cho m t host ty bi n. Tuy nhin, b n ph i tun theo cc quy t c: B n ph i s d ng knh HTTP (m c d c th s d ng Binary formatter th c thng i p nh hn). i v i cc kch

B n khng th ch c th a ch c ng. IIS l ng nghe t t c cc c ng b n c u hnh trong IIS Manager (c ng 80 v 443). URI ph i k t thc b ng .rem hay .soap. File c u hnh ph i c tn l Web.config, n u khng n s b b qua. ng k l p c trnh by trong m c 12.7:

File Web.config d i y s
<configuration>

392 Chng 12: D ch v Web XML v Remoting <system.runtime.remoting> <application> <service> <wellknown mode="SingleCall" type="RemoteObject.ProductsDB, RemoteObject" objectUri="RemoteObject.rem" /> </service> <channels> <channel ref="http"> <!-- G b ch thch d i y s thay cho SOAP formatter (m c <!-<serverProviders> <formatter ref="binary"/> </serverProviders> --> </channel> </channels> </application> </system.runtime.remoting> </configuration> d ng Binary formatter nh). -->

Client c th s d ng i t ng c qu n l trong IIS gi ng nh i t ng c qu n l trong m t host ty bi n. Tuy nhin, tn th m c o s l m t ph n c a URI. V d , n u file Web.config v a trnh by trn c t trong th m c o http://localhost/RemoteObjects th URL y s l http://localhost/RemoteObjects/RemoteObject.rem. Khi qu n l m t i t ng v i IIS, ti kho n c s d ng th c thi i t ng l ti kho n ASP.NET ( c nh ngha trong file machine.config). N u ti kho n ny khng c quy n truy xu t c s d li u (l tr ng thi m c nh), b n s g p l i khi ch y v d ny. gi i quy t v n ny, b n hy xem m c 7.17.

12.10

Pht sinh s kin trn knh truy xut t xa


i t ng xa pht sinh.

B n c n t o m t client c th nh n m t s ki n do

Ph i ch c r ng b n ang s d ng cc knh hai chi u (bidirectional channel). T o m t i t ng kh -truy-xu t-t -xa bn client (c th nh n s ki n t server). M c d c php th l s ki n khng h thay c n t o m t client c th th l s ki n t m t i khi b n s d ng .NET Remoting, nhng b n i t ng xa. D i y l cc yu c u chnh:

L p kh -truy-xu t-t -xa ph i s d ng ch c-client-kch-ho t (client-activated) hay ch kch ho t n-nh t (singleton activation)khng ph i ch kch ho t g im t-l n (single-call activation). i u ny b o m i t ng v n cn s ng gi a cc l n g i phng th c, cho php n pht sinh s ki n n client. Client ph i s d ng knh hai chi u n c th nh n cc k t n i do server kh i t o. n c th c chuy n qua cc bin i t ng EventArgs ph i l kh -tu n-t -ha mi n ng d ng.

393 Chng 12: D ch v Web XML v Remoting

Client ph i s d ng m t i t ng kh -truy-xu t-t -xa nh n s ki n ( c g i l listener). Theo , listener s d ng m t s ki n c c b m client c th x l c. i t ng xa khng th tr c ti p pht sinh s ki n n m t l p bnh th ng v l p bnh th ng khng th c truy xu t t cc mi n ng d ng khc. B n ph i thay i cc file c u hnh c a client v server ( i u ny khng c n thi t v i .NET 1.0). cho php full serialization

D i y l l p kh -truy-xu t-t -xa m b n c th s d ng pht sinh m t s ki n n client. L p ny cung c p phng th c StartTask kh i ch y m t b nh th i, pht sinh sau m t th i gian ng n (kho ng 10 giy). Khi b nh th i pht sinh, i t ng kh -truy-xu t-t xa d ng ln s ki n 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() { return null; } } [Serializable()] public class TaskCompleteEventArgs : EventArgs { public string Result; public TaskCompleteEventArgs(string result) { this.Result = result; } }

B c k ti p l nh ngha m t l p kh -truy-xu t-t -xa ch y trn client v c th nh n s ki n ny. Theo , l p ny c th ti p xc v i client. L p EventListener d i y trnh by m t v d nh th n ch n gi n d ng ln s ki n th hai, m client c th tr c ti p x l. Cng

394 Chng 12: D ch v Web XML v Remoting

nh t t c cc i t ng kh -truy-xu t-t -xa, n s ch c truy xu t trong 5 pht, tr khi b n thay i chnh sch lease (s c m t trong m c 12.11). C m t cch l chp phng th c InitializeLifetimeService cho php i t ng c s ng vnh vi n:
public class EventListener : MarshalByRefObject { public event RemoteObject.TaskCompleted TaskComplete; // Th l s ki n xa. public void OnTaskComplete(object sender, RemoteObject.TaskCompleteEventArgs e) { TaskComplete(sender, e); } public override object InitializeLifetimeService() { return null; } }

Listener ph i c nh ngha trong m t assembly ring n c th c tham chi u b i ng d ng client v l p kh -truy-xu t-t -xa (c hai u c n tng tc v i n). By gi ng d ng client c th kh i ch y tc v b t ng b thng qua l p RemoteObject v th l s ki n thng qua l p EventListener. o n m d i y trnh by m t client ch n gi n hi n th thng bo khi nh n c s ki n:
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 ph n 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) { // K t n i phng th c th l s ki n xa. remoteObj.TaskComplete += new RemoteObject.TaskCompleted(listener.OnTaskComplete); // K t n i phng th c th l s ki n c c b . listener.TaskComplete += new RemoteObject.TaskCompleted(TaskComplete); remoteObj.StartTask(); MessageBox.Show("Task has been started."); }

395 Chng 12: D ch v Web XML v Remoting // nh ngha phng th c th l s ki n c c b . private void TaskComplete(object sender, RemoteObject.TaskCompleteEventArgs e) { MessageBox.Show("Event received: " + e.Result); } }

c th lm vi c, b n ph i ch c r ng client ang s d ng cc knh hai chi u. Do , th


<channel> trong file c u hnh ph i trng gi ng nh sau: <channel ref="tcp" port="0" />

V khng c gi ng nh cc v d d i y:
<channel ref="tcp server" port="0" /> <channel ref="tcp client" port="0" />

Ngoi ra, b n ph i kch ho t vi c h tr full serialization. N u khng, server s khng c php nh n y nhi m cho phng th c Listener.TaskCompleted, v s khng th k t n i n phng th c th l s ki n xa. kch ho t vi c h tr full serialization bn server, b n c n thay i file c u hnh c a 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 ho t vi c h tr full serialization bn client, b n c n thay client nh sau:


<configuration> <system.runtime.remoting> <application name="SimpleServer" >

i file c u hnh c a

<service> <activated type="RemoteObject.RemoteObject, RemoteObject"/> </service> <channels> <channel ref="tcp" port="9080"> <serverProviders> <formatter ref="binary" typeFilterLevel="Full" /> </serverProviders> </channel> </channels>

396 Chng 12: D ch v Web XML v Remoting </application> </system.runtime.remoting> </configuration>

12.11 Kim sot thi gian sng ca mt i tng xa


B n mu n c u hnh th i gian s ng c a m t kch-ho t khi n khng cn c s d ng. i t ng n-nh t hay c-clientCh nh cc thi t l p m c nh v th i gian s ng trong file c u hnh c a host; chp phng th c InitializeLifetimeService trong l p xa; ho c hi n th c m t c ch ki m sot th i gian s ng bn client. N u m t i t ng s d ng ch kch ho t g i m t l n (single-call activation), n s t ng b h y vo cu i m i l i g i phng th c. i u ny khc v i cc i t ng c-clientkch-ho t (client-activated) v n-nh t (singleton), cc i t ng ny c th i gian s ng lu hn v tun theo lifetime lease (t m d ch l h p ng cho thu th i gian s ng). V i cc thi t l p m c nh, m t i t ng xa s t ng b h y n u n khng ho t ng trong hai pht, mi n l n t n t i t nh t nm pht. Host, i t ng xa, v client u c th thay i cc thi t l p v th i gian s ng. Host c th ch nh cc thi t l p m c nh v th i gian s ng trong file c u hnh. Cc thi t l p ny s p d ng cho t t c cc i t ng xa m n qu n l. L p xa c th chp phng th c GetLifetimeService lease ban u b ng i t ng ILease. i u ch nh cc thi t l p

Client c th g i phng th c MarshalByRefObject.GetLifetimeService v i m t i t ng xa c th thu l y m t th hi n ILease. K ti p, client c th g i phng th c ILease.Renew ch nh l ng th i gian t i thi u m i t ng s s ng.

V d d i y s d ng cch ti p c n th nh t (dng th <lifetime> trong file c u hnh c a host). Cc thi t l p lease p d ng cho t t c cc i t ng xa do host t o ra. S d ng M ch pht hay S ch giy. i t ng xa c th i gian s ng ban u l 10 pht. Khi client truy xu t i t ng, th i gian s ng c a n t ng c lm m i t nh t 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>

397 Chng 12: D ch v Web XML v Remoting </system.runtime.remoting> </configuration>

M t cch ti p c n khc l chp phng th c InitializeLifetimeService m t i t ng xa t ki m sot th i gian s ng c a n. B n c th thm o n m d i y vo l p xa n c th i gian s ng m c nh l 10 pht v th i gian lm m i l 5 pht:
public override object InitializeLifetimeService() { ILease lease = MyBase.InitializeLifetimeService(); // Lease ch c th c c u hnh n u n ang tr ng thi ban if (lease.CurrentState == LeaseState.Initial) { lease.InitialLeaseTime = TimeSpan.FromMinutes(10); lease.RenewOnCallTime = TimeSpan.FromMinutes(5); } return lease; } u.

N u mu n i t ng c th i gian s ng v h n, b n ch c n tr v m t tham chi u null thay v l i t ng ILease. Tr ng h p thng th ng nh t l b n mu n t o m t i t ng n-nh t ch y c l p (v lu di) ngay c khi client khng s d ng n.

12.12

Kim sot phin bn ca cc i tng xa


i t ng. i t ng vo GAC, v ng k m i phin b n t i

B n mu n t o m t host c th qu n l nhi u phin b n c a m t Ci t t t c cc phin b n c a m t endpoint URI khc bi t.

.NET Remoting khng c s h tr n i t i no cho vi c nh phin b n. Khi m t client t o m t i t ng xa, host t ng s d ng phin b n trong th m c c c b ho c, trong tr ng h p l m t assembly dng chung, phin b n m i nh t trong GAC. h tr nhi u phin b n, b n c ba l a ch n: T o cc ng d ng host ring bi t. M i host s c m t phin b n khc nhau c a assembly i t ng xa v s ng k phin b n c a n v i m t URI khc nhau. Cch ny bu c b n ph i ch y nhi u ng d ng host cng m t lc v thi t th c nh t khi b n ang s d ng IIS ( c m t trong m c 12.9). T o m t assembly i t ng xa hon ton m i (thay v thay i phin b n). Theo , b n c th ng k cc l p trong hai assembly t i cc URI khc nhau, s d ng cng host. Ci t t t c cc phin b n c a assembly i t ng xa vo GAC. Theo , b n c th t o m t host nh x cc URI khc nhau n cc phin b n c th c a assembly i t ng xa.

Ty ch n cu i cng l linh ho t nh t trong tr ng h p b n c n h tr nhi u phin b n. V d , file c u hnh d i y ng k hai phin b n c a RemoteObjects t i hai endpoint khc nhau. B n c n ghi r s phin b n v token kha cng khai khi s d ng cc assembly trong GAC. B n c th tm th y thng tin ny b ng cch xem assembly trong Windows Explorer GAC plug-in (vo th m c C:\Windows\Assembly).

398 Chng 12: D ch v Web XML v Remoting <configuration> <system.runtime.remoting> <application> <service> <!-- Thng tin type c chia thnh ba hng cho h p v i bin trang. Trong file c u hnh, thng tin ny ph i c t trn m t hng. --> <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 c u hnh c a client khng ph i thay i g h t (tr vi c c p nh t URI, n u c n). Client ch n phin b n m n mu n s d ng b ng URI tng ng.

Hnh 12.4 Th m c C:\Windows\Assembly

12.13

To phng thc mt chiu vi dch v Web XML hay Remoting

B n mu n m t phng th c web hay m t thnh ph n xa th c hi n m t tc v ko di, v b n khng mu n b t client ph i i trong lc m l nh ang th c thi.

399 Chng 12: D ch v Web XML v Remoting

T o m t phng th c web m t chi u b ng cch p d ng c tnh SoapDocumentMethod hay SoapRpcMethod v thi t l p thu c tnh OneWay c a c tnh ny l true. T o m t phng th c Remoting m t chi u b ng cch p d ng c tnh OneWay thu c khng gian tn System.Runtime.Remoting.Messaging. V i cc phng th c m t chi u, client g i m t thng i p yu c u, v server p ng t c th cho bi t r ng phng th c b t u qu trnh x l. Cch lm vi c ny c cc h qu sau: Client khng c n i trong lc m l nh ang th c thi. Phng th c khng th tr v thng tin no cho client (thng qua m t gi tr tr v hay m t thng s ByRef). N u phng th c nm m t ngo i l cha- c-th -l, n s khng c truy n v cho client.

R rng l cc phng th c m t chi u khng ph h p khi client c n nh n thng tin t server. Tuy nhin, chng l i l t ng khi c n kh i ch y m t ki u tc v no pha server (ch ng h n, b t u m t cng vi c x l b). t o m t phng th c web m t chi u, b n c n p d ng c tnh SoapDocumentMethod (thu c khng gian tn System.Web.Services.Protocols) cho phng th c thch h p v thi t l p thu c tnh OneWay l true. V d d i y l m t d ch v Web XML c hai phng th c, m i phng th c u gy tr hon 10 giy. M t trong hai phng th c ny s d ng c tnh SoapDocumentMethod ( client khng ph i i 10 giy).
using System; using System.Web.Services; using System.Web.Services.Protocols; public class OneWayTestWebService { [WebMethod()] public void DoLongTaskWithWait() { // (B t u m t tc v ko di v khi n client ph i Delay(10); }

i.)

[WebMethod, SoapDocumentMethod(OneWay=true)] public void DoLongTaskWithoutWait() { // (B t u m t tc v ko di nhng khng khi n client ph i Delay(10); }

i.)

private void Delay(int seconds) { DateTime currentTime = DateTime.Now; while (DateTime.Now.Subtract(currentTime).TotalSeconds < seconds) {} } }

V d trn gi nh d ch v Web XML v client ang s d ng SOAP document (m c nh). N u ang s d ng Remote Procedure Call (RPC), b n hy s d ng c tnh tng ng l SoapRpcMethod nh d u phng th c m t chi u. t o m t phng th c m t chi u trong m t thnh ph n trn Remoting, b n c n p d ng c tnh OneWay (thu c khng gian tn System.Runtime.Remoting.Messaging) cho phng th c thch h p. o n m d i y trnh by m t v d gi ng nh trn nhng v i m t thnh ph n xa:

400 Chng 12: D ch v Web XML v Remoting using System; using System.Runtime.Remoting.Messaging; public class OneWayTestRemoting : MarshalByRefObject { public void DoLongTaskWithWait() { // (B t u m t tc v ko di v khi n client ph i Delay(10); } i.)

[OneWay()] public void DoLongTaskWithoutWait() { // (B t u m t tc v ko di nhng khng khi n client ph i Delay(10); }

i.)

private void Delay(int seconds) { DateTime currentTime = DateTime.Now; while (DateTime.Now.Subtract(currentTime).TotalSeconds < seconds) {} } }

Phng th c m t chi u khng ph i l cch duy nh t lo i b vi c tr hon client. B n cng c th i u ch nh client g i phng th c web m t cch b t ng b . Trong tr ng h p ny, client s i d ch v Web XML hon t t, nhng n s i trn m t ti u trnh khc, v do client c th ti p t c v i cc cng vi c khc. Vi c g i phng th c b t ng b c m t trong m c 12.6.

401

Chng 13: B O M T

13

402

403 Chng 13: B o m t

c tiu chnh c a Microsoft .NET Framework l lm cho vi c l p trnh tr nn an ton hn c bi t lu tm n vi c s d ng mobile code1 v cc h th ng phn tn. H u h t cc h i u hnh hi n i (bao g m Microsoft Windows) u h tr b o m t d a-trn-ng i-dng (User-Based Security), cho php b n ki m sot cc hnh ng v cc ti nguyn m m t ng i dng truy xu t n. Tuy nhin, do s pht tri n c a m ng my tnh, c bi t l Internet, s b o m t n u ch d a vo nh danh c a ng i dng trn h th ng l cha . Khi quan tm n b o m t, m l nh khng nn t ng nh n m c tin c y nh m c tin c y m b n n nh cho ng i ang ch y m l nh ny. .NET Framework k t h p hai m hnh b o m t b sung l n nhau (th c hi n nhi u v n quan n b o m t ng i dng v m l nh): CAS (Code Access SecurityB o m t truy xu t m l nh) RBS (Role-Based SecurityB o m t d a-trn-vai-tr) lin

CAS v RBS khng thay th hay sao l i cc phng ti n b o m t do h i u hnh n m d i cung c p. Chng l cc c ch c l p n n, c p thm cc kh nng b o m t nng cao tnh b o m t t ng th trong cc gi i php c-qu n-l. CAS s d ng cc thng tin v ngu n g c c a m t assembly c thu th p lc th c thi y l ch ng c (evidence) xc nh xem m l nh c th truy xu t cc hnh ng v ti nguyn no y l quy n (permission). Chnh sch b o m t c a .NET Frameworkm t t p h p phn c p cc quy t c c u hnh nh ngha php nh x gi a ch ng c v quy n. Th vi n l p .NET Framework s d ng cc yu c u quy n (permission demand hay permission request) b o v cc ch c nng quan tr ng nh t c a n khng b truy xu t tri php. M t yu c u bu c b th c thi b o m r ng: n u mu n g i m t phng th c c-b o-v th m l nh ph i c m t quy n c th no . CAS b o m r ng: kh nng th c thi c a m l nh ty thu c vo m c tin c y c a b n i v i ng i t o ra m v ngu n g c c a n, ch khng ph i m c tin c y i v i ng i dng ang ch y m. Cc m c lin quan n CAS trong chng ny th o lu n cc v n sau: Cho php m l nh c- -tin-c y-m t-ph n (partially trusted code) truy xu t cc assembly tn m nh c a b n (m c 13.1). V hi u hon ton CAS (m c 13.2) ho c ch v hi u vi c ki m tra quy n th c thi (m c 13.3). Yu c u cc quy n truy xu t m l nh c th v xc nh xem b th c thi c p cc quy n no cho m l nh c a b n (m c 13.4, 13.5, 13.6, v 13.7). Ki m sot s th a k v chp thnh vin b ng CAS (m c 13.8). Xem xt v x l ch ng c c a assembly (m c 13.9 v 13.10). X l b o m t b th c thi b ng mi n ng d ng (m c 13.11 v 13.12). RBS cho php b n th c hi n cc quy t nh lc th c thi (runtime decision) d a trn nh danh (identity) v cc vai tr (role) c a ng i dng m ng d ng ang ch y trn danh ngha ng i dng ny. Trn h i u hnh Windows, y chnh l vi c th c hi n cc quy t nh d a trn tn ng i dng Windows v cc nhm Windows m ng i dng thu c v . Tuy nhin, RBS
Mobile code l ph n m m c truy n qua m t h th ng m ng v sau c th c thi trn h th ng c cb .
1

404 Chng 13: B o m t

cung c p m t c ch b o m t chung khng l thu c vo h i u hnh n m d i, cho php b n tch h p vo b t k h th ng ti kho n ng i dng no. Cc m c trong chng ny th o lu n cc v n sau y c a .NET RBS: Tch h p RBS v i cc ti kho n ng i dng Windows v xc nh xem m t ng i dng c l thnh vin c a m t nhm Windows no hay khng (m c 13.13). Ki m sot vi c truy xu t n cc ch c nng c a ng d ng d a trn ng i dng hi n hnh v cc vai tr m ng i dng ny l m t thnh vin (m c 13.14). Gi nh n m t ng i dng Windows ngha ng i dng (m c 13.15). th c hi n cc tc v h i u hnh trn danh

Cc m c lin quan n RBS v CAS trong chng ny trnh by m t s cng vi c thng th ng m b n s c n th c hi n trong cc ng d ng, nhng chng ch m t m t ph n nh hi u r hn, b n hy tham kh o m t trong cc kh nng b o m t c a .NET Framework. quy n sch khc chuyn v b o m t trong .NET Framework.

13.1

Cho php m lnh c--tin-cy-mt-phn s dng assembly tn mnh ca bn

B n c n vi t m t assembly chia s sao cho n l kh truy xu t i v i m l nh c-tin-c y-m t-ph n (theo m c nh, b th c thi khng cho php m l nh c- tin-c y-m t-ph n truy xu t cc ki u v cc thnh vin n m trong m t assembly tn m nh). p d ng c tnh System.Security.AllowPartiallyTrustedCallersAttribute cho assembly chia s c a b n. gi m thi u cc nguy c b o m t do m l nh nguy hi m by ra, b th c thi khng cho php cc assembly c- -tin-c y-m t-ph n truy xu t n cc assembly tn m nh. H n ch ny lm gi m nguy c m l nh nguy hi m t n cng vo h th ng c a b n, nhng i v i m t cch ti p c n p ch nh th c n ph i c l i gi i thch. Theo quy t c, cc assembly tn m nh c ci t trong Global Assembly Cache (GAC) v ch a cc ch c nng quan tr ng c dng chung gi a nhi u ng d ng. i u ny hon ton ng v i cc assembly c u thnh th vi n l p .NET Framework. Cc assembly tn m nh khc t cc s n ph m c-phn-b -r ng-ri cng s n m trong GAC v l kh truy xu t i v i cc ng d ng c-qu n-l. Kh nng hi n di n trong GAC cao, tnh kh truy xu t d dng, v t m quan tr ng i v i nhi u ng d ng khc nhau khi n cho cc assembly tn m nh l m c tiu c kh nng nh t i v i b t c hnh ng ph ho i no c a m l nh nguy hi m cqu n-l. Thng th ng, m l nh c kh nng nguy hi m l m c n p t cc ni xanh Internet b n c t (hay khng c) s ki m sot no. V i chnh sch b o m t m c nh, t t c m l nh ch y t my c c b u c tin c y ton ph n (full trust), trong khi m l nh c n p t cc ni xa ch c tin c y m t ph n (partial trust). Ngn m l nh c- -tin-c y-m t-ph n truy xu t n cc assembly tn m nh; ngha l m l nh c- -tin-c y-m t-ph n khng c c h i s d ng cc tnh nng c a assembly cho cc m c ch nguy hi m, v khng th kh o st

405 Chng 13: B o m t

assembly tm cc l h ng c th khai thc c. D nhin, l thuy t ny gi nh r ng b n qu n l chnh sch b o m t m t cch ph h p. N u b n gn t t c m l nh c tin c y ton ph n, khng ch b t k assembly no cng c th truy xu t assembly tn m nh c a b n, m m l nh ny cn c th truy xu t t t c cc ch c nng c a .NET Framework. i u ny s l m t tai h a b o m t! N u b n thi t k , hi n th c, v th nghi m assembly chia s c a b n m t cch ph h p b ng CAS gi i h n vi c truy xu t n cc thnh vin quan tr ng, b n khng c n p t m t h n ch bao trm ngn m l nh c- -tin-c y-m t-ph n s d ng assembly c a b n. Tuy nhin, i v i m t assembly b t k, khng th ch ng minh r ng khng c l h ng b o m t no m nguy hi m c th l i d ng. Do , b n nn xem xt c n th n nhu c u cho php m l nh c- -tin-c y-m tph n truy xu t assembly tn m nh tr c khi p d ng c tnh AllowPartiallyTrustedCallersAttribute. B th c thi ngn m l nh c- -tin-c y-m t-ph n truy xu t cc assembly tn m nh b ng cch t LinkDemand vo t p quy n FullTrust trn m i thnh vin cng-khai (public) v c-b ov (protected) c a m i ki u kh -truy-xu t-cng-khai c nh ngha trong assembly. i u ny c ngha l ch nh ng assembly c c p cc quy n tng ng v i t p quy n FullTrust th m i c th truy xu t cc ki u v thnh vin trong assembly tn m nh. Vi c p d ng AllowPartiallyTrustedCallersAttribute vo assembly tn m nh bo v i b th c thi khng bu c LinkDemand c hi u l c trn cc thnh vin v cc ki u bn trong. B th c thi ch u trch nhi m bu c cc ho t ng b o m t ng m LinkDemand c hi u l c b o v cc assembly tn m nh; C# assembler khng sinh ra cc l nh khai bo LinkDemand lc bin d ch. o n m d i y trnh by m t ng d ng c s d ng c tnh
AllowPartiallyTrustedCallersAttribute. Ch r ng, b n ph i s d ng ti n t assembly:

bo v i trnh bin d ch r ng ch c a c tnh ny l assembly (cn c g i l c tnh ton c cglobal attribute). Ngoi ra, khng c n thm ph n Attribute vo tn c a c tnhm c d b n c th thm vo n u mu n. V b n nh m n assembly nn c tnh ny ph i c t sau cc l nh using m c trn, nhng tr c cc khai bo khng gian tn v ki u.
using System.Security; [assembly:AllowPartiallyTrustedCallers] public class AllowPartiallyTrustedCallersExample { }

Th c t , t t c cc c tnh ton c c u n m trong m t file c l p v i ph n m l nh cn l i c a ng d ng. Microsoft Visual Studio .NET s d ng cch ti p c n ny: t o m t file c tn l AssemblyInfo.cs ch a t t c cc c tnh ton c c. N u sau khi p d ng AllowPartiallyTrustedCallersAttribute cho assembly, b n mu n m l nh c- -tin-c y-m t-ph n ch g i c m t s thnh vin no , b n c n b sung LinkDemand cho t p quy n FullTrust trn cc thnh vin c n thi t, nh c trnh by trong o n m d i y:

406 Chng 13: B o m t [System.Security.Permissions.PermissionSetAttribute (System.Security.Permissions.SecurityAction.LinkDemand, Name="FullTrust")] public void SomeMethod() { }

13.2
B n c n v hi u CAS.

V hiu bo mt truy xut m lnh

Thi t l p thu c tnh SecurityEnabled c a l p System.Security.SecurityManager l false v lu l i b ng phng th c SecurityManager.SavePolicy. B n cng c th s d ng cng c Code Access Security Policy (Caspol.exe) v th c thi l nh caspol s off. CAS l ph n then ch t trong m hnh b o m t c a b th c thi .NET, v cng l ph n c trng c a n n t ng .NET m nhi u n n t ng khc khng c. M c d CAS c xy d ng v i tiu ch m b o hi u nng th c thi cao nh t v c s d ng m t cch c n tr ng trong th vi n l p .NET, nhng v n c m t chi ph cho m i yu c u b o m t (security demand) v stack walk (k t qu ) m b th c thi ph i th c hi n. i lc, b o m t m c-m-l nh c th khng l i u b n b n tm, ho c nhu c u hi u nng c th v t qu nhu c u CAS. Trong cc tr ng h p ny, b n c th v hi u hon ton CAS v lo i b chi ph cho vi c ki m tra b o m t m c-m-l nh. V hi u CAS c tc d ng trao cho m l nh kh nng th c hi n b t k hnh ng no m .NET Framework h tr (tng ng v i t p quy n FullTrust), bao g m kh nng n p m l nh khc, g i cc th vi n nguyn sinh, v s d ng con tr tr c ti p truy xu t b nh . B n ch nn v hi u CAS v cc l do hi u nng sau khi tiu h t t t c cc ch ng m c c th khc t c cc c i m hi u nng m ng d ng c a b n i h i. Vi c l p profile cho m l nh th ng s nh n bi t nh ng vng m b n c th c i thi n ng k hi u nng nhng khng ph i v hi u CAS. Ngoi ra, b n c n b o m cc ti nguyn h th ng c b o v b ng cc c ch b o m t c a h i u hnh (nh Windows ACLs) tr c khi v hi u CAS. Caspol.exe l m t ti n ch c c p cng v i .NET Framework, cho php b n c u hnh chnh sch b o m t truy xu t m l nh t dng l nh. Khi b n nh p l nh caspol s off ho c caspol s on, ti n ch ny s xc l p thu c tnh SecurityEnabled c a l p SecurityManager. L p SecurityManager cung c p t p cc phng th c tnh truy xu t d li u v ch c nng b o m t quan tr ng. o n m d i y trnh by cch s d ng thu c tnh SecurityEnabled v hi u v kch ho t CAS:
// V hi u CAS. System.Security.SecurityManager.SecurityEnabled = false; // Lu c u hnh. System.Security.SecurityManager.SavePolicy(); // Kch ho t CAS. System.Security.SecurityManager.SecurityEnabled = true;

407 Chng 13: B o m t // Lu c u hnh. System.Security.SecurityManager.SavePolicy();

hi u

CAS,

l nh

c a

b n

ph i

System.Security.Permissions.SecurityPermission.

c ph n t ControlPolicy c a kch ho t CAS, b n khng c n ph i

c quy n c th no. Thay i SecurityEnabled s khng nh h ng n ho t ng c a CAS trong cc ti n trnh hi n c, v cng khng nh h ng n cc ti n trnh m i cho n khi b n g i phng th c SavePolicy lu tr ng thi c a SecurityEnabled vo Windows Registry. ng ti c, .NET Framework khng b o m nh ng thay i c a SecurityEnabled s tc ng ng n ho t ng c a CAS trong ti n trnh hi n hnh. Do , b n ph i thay i SecurityEnabled r i m m t ti n trnh m i c c ho t ng ng nh mong mu n.

Hnh 13.1 Registry Editor (CAS b v hi u)

Tr ng thi hi n hnh c a CAS (on/off) c lu trong kha HKEY_ LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\Security\Policy c a Windows Registry. N u kha ny khng t n t i, m c nh CAS l on.

13.3
Thi t l p thu c

V hiu vic kim tra quyn thc thi

B n c n ngn b th c thi ki m tra m i assembly c n p vo c quy n th c thi (execution permission) hay khng. tnh
CheckExecutionRights

c a

l p

System.Security.

SecurityManager l false r i lu l i b ng phng th c SecurityManager. SavePolicy. B n cng c th

d ng cng c (Caspol.exe) v th c thi l nh caspol e off.

Code Access Security Policy

M i khi n p assembly, b th c thi b o m grant-set c a assembly ny c ch a ph n t Execution c a SecurityPermission. B th c thi hi n th c m t qu trnh phn gi i chnh sch l i (lazy policy resolution process), ngha l grant-set c a m t assembly khng c tnh cho n khi c m t yu c u b o m t (security demand) c th c hi n trn assembly ny. Vi c ki m tra quy n th c thi khng ch bu c b th c thi ki m tra m i assembly c quy n th c thi hay khng, m cn gin ti p t o ra vi c phn gi i chnh sch i v i m i assembly c

408 Chng 13: B o m t

n p, ph nh n l i ch c a vi c phn gi i chnh sch l i. Cc y u t ny c th gy ra s tr hon ng k khi cc assembly c n p, c bi t khi b th c thi n p nhi u assembly cng m t lc. Trong nhi u tr ng h p, vi c cho php m l nh n p v ch y khng ph i l m t nguy c ng k mi n l t t c cc ho t ng v cc ti nguyn quan tr ng khc c b o v b ng CAS v b ng c ch b o m t c a h i u hnh. B th c thi .NET cho php b n v hi u vi c t ng ki m tra cc quy n th c thi ngay bn trong m l nh, hay b ng cng c Caspol.exe. Khi b n nh p l nh caspol e off ho c caspol e on, Caspol.exe s xc l p thu c tnh CheckExecutionRights c a l p SecurityManager. B n c th th c hi n cng vi c ny bn trong m l nh nh sau:
// V hi u vi c ki m tra quy n th c thi. System.Security.SecurityManager.CheckExecutionRights = false; // Lu c u hnh. System.Security.SecurityManager.SavePolicy(); // Kch ho t vi c ki m tra quy n th c thi. System.Security.SecurityManager.CheckExecutionRights = true; // Lu c u hnh. System.Security.SecurityManager.SavePolicy();

i gi tr c a CheckExecutionRights th m l nh c a b n ph i c ph n t i ny s c tc d ng v i ti n trnh hi n hnh ngay t c th, cho php b n n p cc assembly trong lc th c thi m b th c thi khng ph i ki m tra chng c quy n th c thi hay khng. Tuy nhin, thay i ny s khng nh h ng n cc ti n trnh hi n c. Do v y, b n ph i lu thay i vo Windows Registry (b ng phng th c SavePolicy) n c tc d ng v i cc ti n trnh m i.
ControlPolicy c a SecurityPermission. Thay

thay

13.4

Bo m b thc thi cp cho assembly mt s quyn no

B n c n b o m b th c thi c p cho assembly c a b n cc quy n truy xu t m l nh (code access permission) m cc quy n ny quy t nh s thnh cng trong ho t ng c a ng d ng. S d ng cc yu c u quy n (permission request) ch nh cc quy n truy xu t m l nh m assembly c n ph i c. B n khai bo cc yu c u quy n b ng cc c tnh quy n truy xu t m l nh m c assembly. Cc yu c u quy n cho bi t cc quy n m m l nh ph i c th m i c th ch y c. V d , n u b n vi t m t trnh xem phim sao cho ng i dng c th s d ng n t i v xem phim t m t server, th t tai h i n u chnh sch b o m t c a ng i dng khng cho php chng trnh ny m m t k t n i m ng n server. Chng trnh c a b n s n p v ch y, nhng khi ng i dng k t n i n server xem phim, chng trnh s crash v i ngo i l System.Security.SecurityException. Gi i php l a vo assembly yu c u quy n c n thi t

409 Chng 13: B o m t

m t k t n i m ng n server (System.Net.WebPermission hay System.Net.SocketPermission, ty thu c vo ki u k t n i b n c n m ). B th c thi th c hi n cc yu c u quy n v i nguyn t c: khoan n p m l nh, i u ny t t hn l n p m l nh v th t b i sau khi th c hi n m t hnh ng m n khng c quy n. V v y, n u sau qu trnh phn gi i chnh sch b o m t, b th c thi xc nh c grant-set c a assembly khng th p ng cc yu c u quy n c a assembly, n s khng n p assembly v nm ngo i l System.Security.Policy.PolicyException. khai bo m t yu c u quy n, b n ph i s d ng b n sao c tnh (attribute counterpart) c a quy n truy xu t m l nh b n c n. T t c cc quy n truy xu t m l nh u c m t b n sao c tnh m b n c th s d ng t o ra cc l nh b o m t khai bo (declarative security statement)bao g m cc yu c u quy n. V d , b n sao c tnh c a SocketPermission l SocketPermissionAttribute, v b n sao c tnh c a WebPermission l WebPermissionAttributeT t c cc quy n v cc b n sao c tnh c a chng cng theo quy c t tn v l cc thnh vin c a cng khng gian tn. ng d ng PermissionRequestExample d i y c hai yu c u quy n: m t cho
SocketPermission v m t cho SecurityPermission. B n c n nh cc i u sau:

c th

B n ph i khai bo yu c u quy n sau b t k l nh using m c trn no nhng tr c b t k khai bo ki u hay khng gian tn no. c tnh ph i nh m n assembly nn b n ph i thm ti n t assembly: vo tn c tnh. Khng c n thm ph n Attribute vo tn mu n. c tnhm c d b n c th thm vo n u is u tin c a c tnhgi

B n ph i ch nh SecurityAction.RequestMinimum l tr ny cho bi t y l m t yu c u quy n.

B n ph i c u hnh c tnh m t quy n truy xu t m l nh m b n c n b ng cc bi t thm thu c tnh c a c tnh. B n hy tham kh o ti li u .NET Framework SDK chi ti t v cc thu c tnh do m i c tnh b o m t truy xu t m l nh hi n th c. Cc l nh yu c u quy n khng c k t thc b ng d u ch m ph y (;). t o nhi u yu c u quy n, ch c n thm nhi u l nh yu c u quy n nh c trnh by trong v d d i y:
using System.Net; using System.Security.Permissions; // Yu c u SocketPermission (cho php m m t k t n i // TCP n host v port c ch nh). [assembly:SocketPermission(SecurityAction.RequestMinimum, Access = "Connect", Host = "www.fabrikam.com", Port = "3538", Transport = "Tcp")] // Yu c u ph n t UnmanagedCode c a SecurityPermission, // (ki m sot kh nng th c thi m l nh khng- c-qu n-l). [assembly:SecurityPermission(SecurityAction.RequestMinimum, UnmanagedCode = true)] public class PermissionRequestExample { public static void Main() { // Lm g ... } }

410 Chng 13: B o m t

N u b n th c thi ng d ng PermissionRequestExample v chnh sch b o m t khng c p cho assembly ny cc quy n c yu c u, b n s nh n c ngo i l PolicyException nh d i y v ng d ng s khng th c thi. Khi s d ng chnh sch b o m t m c nh, i u ny s x y ra n u b n ch y assembly t m t m ng dng chung v cc assembly c n p t Intranet khng c c p SocketPermission.
Unhandled Exception: System.Security.Policy.PolicyException: Required permission cannot be acquired.

Khi b n n p m t assembly t bn trong m l nh (t ng hay b ng tay), v assembly ny c ch a cc yu c u quy n m chnh sch b o m t khng p ng th phng th c m b n s d ng n p assembly s nm ngo i l PolicyException, do b n ph i th l sao cho ph h p.

13.5

Gii hn cc quyn c cp cho assembly

B n c n h n ch cc quy n truy xu t m l nh c c p cho assembly c a b n, m b o ng i khc v ph n m m khc khng th bi n m l nh c a b n thnh m t c ch m thng qua th c hi n cc hnh ng nguy hi m hay khng mong mu n. S d ng cc l nh b o m t khai bo (declarative security statement) ch nh cc yu c u quy n ty ch n (optional permission request) v cc yu c u lo i tr quy n (permission refusal request) trong assembly c a b n. Cc yu c u quy n ty ch n nh ngha t p t i a cc quy n m b th c thi s c p cho assembly. Cc yu c u lo i tr quy n ch nh cc quy n c th m b th c thi s khng c p cho assembly. N u quan tm n b o m t, th t l t ng khi m l nh c a b n ch c cc quy n truy xu t m l nh c n thi t th c hi n ch c nng c a n. i u ny gi m thi u nguy c ng i khc v m l nh khc s d ng m l nh c a b n th c hi n cc hnh ng nguy hi m hay khng mong mu n. V n l, b th c thi phn gi i cc quy n c a m t assembly b ng chnh sch b o m t (do m t ng i dng no hay ng i qu n tr c u hnh). Chnh sch b o m t c th khc nhau t i m i ni m ng d ng ch y, v b n khng th ki m sot cc quy n m chnh sch b o m t n nh cho m l nh c a b n. M c d b n khng th ki m sot chnh sch b o m t t i t t c cc ni m m l nh ch y, nhng .NET Framework cung c p hai c ch m thng qua , b n c th lo i b cc quy n c c p cho assembly c a b n: yu c u lo i tr (refuse request) v yu c u ty ch n (optional request). Yu c u lo i tr cho php b n ch ra cc quy n c th m b n khng mu n b th c thi c p cho assembly. Sau qu trnh phn gi i chnh sch, n u grant-set c a m t assembly ch a b t k quy n no c ch nh trong m t yu c u lo i tr , b th c thi s lo i b quy n . Yu c u ty ch n nh ngha t p t i a cc quy n m b th c thi c th c p cho assembly. N u grant-set c a m t assembly ch a b t k quy n no khc v i cc quy n c ch nh trong yu c u ty ch n, b th c thi s lo i b quy n . Khc v i yu c u quy n t i thi u ( c th o lu n trong m c 13.4), b th c thi s khng t ch i n p assembly c a b n n u n khng th c p t t c cc quy n c ch nh trong yu c u ty ch n.

411 Chng 13: B o m t

B n c th coi yu c u lo i tr v yu c u ty ch n l cc cch ch n l a thu c cng k t qu ; cch m b n s d ng ty thu c vo s l ng quy n b n mu n lo i b . N u mu n lo i b m t s t quy n, b n hy ch n yu c u lo i tr . Tuy nhin, n u mu n lo i b nhi u quy n, b n hy ch n yu c u ty ch n (yu c u ny g m m t s quy n b n c n, ph n quy n cn l i s t ng b lo i b ). B n thm cc yu c u ty ch n v yu c u lo i tr vo m l nh b ng cc l nh b o m t khai bo v i c php gi ng nh cc yu c u quy n t i thi u c th o lu n trong m c 13.4. i m khc bi t duy nh t l gi tr c a System.Security.Permissions.SecurityAction m b n truy n cho phng th c kh i d ng c a c tnh quy n. S d ng SecurityAction.RequestOptional khai bo m t yu c u ty ch n v SecurityAction.RequestRefuse khai bo m t yu c u lo i tr . Cng gi ng nh cc yu c u quy n t i thi u, b n ph i khai bo cc yu c u ty ch n v yu c u lo i tr l cc c tnh ton c c b ng cch thm ti n t assembly: vo tn c tnh. Ngoi ra, t t c cc yu c u ph i xu t hi n sau b t k l nh using m c trn no nhng tr c b t k khai bo ki u hay khng gian tn no. V d d i y minh h a m t yu c u quy n ty ch n cho t p quy n Internet. y l t p quy n c nh ngha b i chnh sch b o m t m c nh. Khi b th c thi n p OptionalRequestExample, n s khng c p cho assembly ny b t c quy n no khng n m trong t p quy n Internet (tham kh o ti li u .NET Framework SDK bi t thm chi ti t v cc quy n trong t p quy n Internet).
using System.Security.Permissions; [assembly:PermissionSet(SecurityAction.RequestOptional, Name = "Internet")] public class OptionalRequestExample { public static void Main() { // Lm g } } ...

Tri v i OptionalRequestExample, v d d i y s d ng m t yu c u lo i tr quy n System.Security.Permissions.FileIOPermission (m t quy n truy xu t ghi a C):


using System.Security.Permissions; [assembly:FileIOPermission(SecurityAction.RequestRefuse, Write = @"C:\")] public class RefuseRequestExample { public static void Main() { // Lm g } } ...

lo i b iv i

412 Chng 13: B o m t

13.6

Xem cc yu cu quyn c to bi mt assembly

B n c n xem cc cc lo i tr v cc yu c u quy n khai bo c t o bn trong m t assembly c th c u hnh chnh sch b o m t m t cch ph h p, ho c n m c cc m t h n ch c a m t th vi n m b n mu n g i t m l nh c a b n. S d ng cng c Permissions View (Permview.exe c c p cng v i .NET Framework SDK). c m l i u b n. vi n u hnh chnh sch b o m t m t cch ph h p, b n c n bi t cc nhu c u quy n truy xu t nh (code access permission requirements) c a cc assembly m b n d nh s ch y. ny ng cho c cc th vi n v cc assembly th c thi c truy xu t t ng d ng c a i v i th vi n, b n c n bi t assembly lo i b nh ng quy n no khng s d ng th ny th c hi n m t hnh ng b h n ch (s d n n ngo i l System.Security.SecurityException).

Cng c Permview.exe cung c p m t c ch n gi n m thng qua , b n c th xem cc yu c u quy n khai bo (declarative permission request) c t o bn trong m t assembly bao g m yu c u t i thi u (minimum request), yu c u ty ch n (optional request), v yu c u lo i tr (refusal request). V d , l p d i y khai bo m t c u t i thi u, m t yu c u ty ch n, v m t yu c u lo i tr :
using System.Net; using System.Security.Permissions; // Yu c u quy n t i thi u: SocketPermission. [assembly:SocketPermission(SecurityAction.RequestMinimum, Unrestricted = true)] // Yu c u quy n ty ch n: SecurityPermission. [assembly:SecurityPermission(SecurityAction.RequestOptional, Unrestricted = true)] // Yu c u lo i tr quy n: FileIOPermission. [assembly:SecurityPermission(SecurityAction.RequestRefuse, Unrestricted = true)] public class PermissionViewExample { public static void Main() { // Lm g ... } }

Th c thi l nh permview PermissionViewExample.exe s sinh ra k t xu t nh sau. M c d khng m y thn thi n nhng b n v n c th c k t xu t xc nh cc yu c u quy n c t o b i assembly. M i ki u trong ba ki u yu c u quy nt i thi u, ty ch n, v lo i tr c li t k d i m t tiu ring v c k t c u d ng XML c a m t i t ng System.Security.PermissionSet.
Microsoft (R) .NET Framework Permission Request Viewer. Version 1.1.4322.510 Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.

413 Chng 13: B o m t 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>

B ng cch ch nh i s /decl khi ch y ti n ch Permview.exe, b n c th xem t t c cc l nh b o m t khai bo (declarative security statement) n m trong m t assembly. Vi c ny cho th y r nh ng g assembly th c hi n bn trong v cho php b n c u hnh chnh sch b o m t m t cch ph h p. Tuy nhin, Permview.exe khng hi n th cc thao tc b o m t b t bu c (imperative security operation) n m trong m t assembly. Hi n khng c cch no trch v t ng k t cc thao tc b o m t b t bu c c th c thi bn trong m t assembly.

13.7 Xc nh m lnh c quyn no lc thc thi hay


khng
B n c n xc khng. nh assembly c a b n c m t quy n c th no lc th c thi hay

T o v c u hnh quy n m b n mu n ki m tra r i truy n n cho phng th c tnh IsGranted c a l p System.Security.SecurityManager. S d ng yu c u quy n t i thi u, b n c th b o m r ng b th c thi c p cho assembly t p cc quy n c ch nh; n u m l nh c a b n ang ch y, b n c th ch c r ng n c cc quy n t i thi u c yu c u. Tuy nhin, b n c th mu n hi n th c m t ch c nng c tnh c h i sao cho ng d ng c th cung c p ch c nng ch khi b th c thi c p cho assembly c a b n cc quy n ph h p. Cch ti p c n ny c chnh th c ha m t ph n b ng cc yu c u quy n ty ch n, cho php b n nh ngha m t t p cc quy n m m l nh c a b n c th t n d ng n u chnh sch b o m t c p chng, nhng l i khng thi t y u i v i s v n hnh thnh cng c a m l nh (m c 13.5 trnh by chi ti t v cc yu c u quy n ty ch n). V n i v i cc yu c u quy n ty ch n l b th c thi khng c kh nng bo cho assembly r ng n c p nh ng quy n no. B n c th s d ng m t thao tc c-b o-v v th t b i m t cch m xui khi l i g i ny d n n ngo i l

414 Chng 13: B o m t

nh xem b n c cc quy n c n thi t hay khng. Sau , b n c th xy d ng logic vo trong m l nh trnh g i ph i cc thnh vin c-b o-v m s gy ra stack walk v d ng nn cc ngo i l b o m t. o n m d i y trnh by cch s d ng phng th c IsGranted xc nh xem assembly hi n t i c quy n ghi vo th m c C:\Data hay khng. B n c th t o m t l i g i nh th m i khi b n c n ki m tra quy n, nhng s hi u qu hn n u s d ng m t gi tr lu n l thi t l p m t c c u hnh cho bi t c cho php ng i dng lu file hay khng.
// nh ngha m t bi n lu n l cho bi t assembly c quy n // truy xu t ghi i v i th m c C:\Data hay khng. bool canWrite = false; // T o v c u hnh m t i t ng FileIOPermission m t quy n // truy xu t ghi i v i th m c C:\Data. System.Security.Permissions.FileIOPermission fileIOPerm = new System.Security.Permissions.FileIOPermission( System.Security.Permissions.FileIOPermissionAccess.Write, @"C:\Data"); // Ki m tra assembly hi n t i c quy n c ch nh hay khng. canWrite = System.Security.SecurityManager.IsGranted(fileIOPerm);

System.Security.SecurityException. Tuy nhin, s hi u qu hn khi xc

13.8

Hn ch ai tha k cc lp ca bn v chp cc thnh vin lp

B n c n ki m sot nh ng ai c th th a k cc l p c a b n thng qua s th a k (inheritance) v m t l p d n xu t c th chp nh ng thnh vin no. S d ng cc l nh b o m t khai bo (declarative security statement) p d ng thnh vin SecurityAction.InheritanceDemand vo ph n khai bo c a cc l p v cc thnh vin b n c n b o v . Cc modifier nh sealed, public, private, v virtual cho php b n ki m sot kh nng c a cc l p khc khi cc l p ny th a k l p c a b n v chp cc thnh vin c a n. Tuy nhin, cc modifier ny khng linh ho t, khng c kh nng ch n l c khi gi i h n nh ng m l nh no c th th a k m t l p ho c chp cc thnh vin c a n. V d , b n mu n ch nh ng m l nh do cng ty hay khoa c a b n vi t th m i c th th a k cc l p nghi p v quan tr ng, ho c ch nh ng m l nh c n p t my c c b th m i c th th a k cc phng th c no . B ng cch p d ng InheritanceDemand vo khai bo l p hay thnh vin, b n c th ch nh cc quy n (lc th c thi) m m t l p ph i c th m i c th th a k l p c a b n ho c chp cc thnh vin c th no . Nh r ng, cc quy n c a m t l p l cc quy n c a assembly m l p ny c khai bo trong . M c d b n c th yu c u b t k quy n hay t p quy n no trong InheritanceDemand, nhng thng th ng l yu c u cc quy n nh danh (identity permission). Quy n nh danh m t ch ng c (evidence) do m t assembly a cho b th c thi. N u m t assembly a ra cc ki u ch ng c no lc n p, b th c thi s t ng gn cho assembly ny quy n nh danh ph h p. Quy n nh danh cho php b n s d ng cc l nh b o m t b t bu c v khai bo tr c ti p ra cc quy t nh b o m t (security (imperative v declarative security statement)

415 Chng 13: B o m t

decision) cn c trn nh danh m (code identity) m khng c n tr c ti p nh gi cc i t ng ch ng c . B ng 13-1 li t k ki u quy n nh danh c t o cho m i ki u ch ng c (ki u ch ng c l thnh vin c a khng gian tn System.Security.Policy, ki u quy n nh danh l thnh vin c a khng gian tn System.Security.Permissions).
B ng 13.1 Cc l p ch ng c v cc quy n
L p ch ng c ApplicationDirectory Hash Publisher Site StrongName Url Zone

nh danh
Quy n nh danh

Khng Khng PublisherIdentityPermission SiteIdentityPermission StrongNameIdentityPermission UrlIdentityPermission ZoneIdentityPermission

B th c thi gn cc quy n nh danh cho m t assembly d a trn ch ng c do assembly ny a ra. B n khng th gn thm quy n nh danh cho m t assembly thng qua vi c c u hnh chnh sch b o m t. B n ph i s d ng c php b o m t khai bo (declarative security syntax) hi n th c m t InheritanceDemand, nn b n ph i s d ng b n sao c tnh (attribute counterpart) c a l p quy n m b n mu n yu c u. T t c cc l p quy n u c m t b n sao c tnh t o cc l nh b o m t khai bobao g m InheritanceDemand. V d , b n sao c tnh c a PublisherIdentityPermission l PublisherIdentityPermissionAttribute, v b n sao c tnh c a StrongNameIdentityPermission l StrongNameIdentityPermissionAttributet t c cc quy n v cc b n sao c tnh c a chng cng theo quy c t tn v l cc thnh vin c a cng khng gian tn. ki m sot nh ng m l nh no c th th a k l p c a b n, hy p d ng InheritanceDemand khi khai bo l p. o n m d i y trnh by m t l p c b o v b ng InheritanceDemand. Theo , ch nh ng l p bn trong cc assembly c k b i publisher-certificate (n m trong file pubcert.cer) th m i c th th a k l p InheritanceDemandExample. N i dung c a file pubcert.cer c c lc bin d ch, v cc thng tin ch ng th c c n thi t c g n vo assembly.
[PublisherIdentityPermission(SecurityAction.InheritanceDemand, CertFile = @"I:\CSharp\Chuong13\pubcert.cer")] public class InheritanceDemandExample { }

ki m sot nh ng m l nh no c th chp cc thnh vin no , b n hy p d ng o n m d i y, ch nh ng l p c c p t p quy n FullTrust th m i c th chp phng th c SomeProtectedMethod.


InheritanceDemand khi khai bo thnh vin. Xt [PermissionSet(SecurityAction.InheritanceDemand, Name="FullTrust")] public void SomeProtectedMethod () { }

416 Chng 13: B o m t

13.9

Kim tra chng c ca mt assembly

B n c n ki m tra ch ng c m b th c thi gn cho m t assembly. Thu l y i t ng System.Reflection.Assembly m t assembly m b n quan tm. L y t p h p System.Security.Policy.Evidence t thu c tnh Evidence c a i t ng Assembly, r i truy xu t cc i t ng ch ng c bn trong b ng phng th c GetEnumerator, GetHostEnumerator, hay GetAssemblyEnumerator c a l p Evidence. L p Evidence m t m t t p h p cc i t ng ch ng c . Thu c tnh ch - c Evidence c a l p Assembly tr v m t i t ng t p h p Evidence ch a t t c cc i t ng ch ng c m b th c thi gn cho assembly khi assembly ny c n p. Th t ra, l p Evidence ch a hai t p h p, m t hai ki u ch ng c khc nhau: ch ng c host v ch ng c assembly. Ch ng c host bao g m cc i t ng ch ng c c gn cho assembly b i b th c thi hay m l nh n p assembly (m l nh ny l ng tin c y). Ch ng c assembly m t cc i t ng ch ng c ty bi n c nhng vo assembly lc t o d ng. L p Evidence hi n th c ba phng th c sau y li t k cc i t ng ch ng c bn trong:
GetEnumerator GetHostEnumerator GetAssemblyEnumerator

Phng th c GetEnumerator tr v m t System.Collections.IEnumerator dng li t k t t c cc i t ng ch ng c bn trong t p h p Evidence. Phng th c GetHostEnumerator v GetAssemblyEnumerator tr v m t th hi n IEnumerator li t k ch cc i t ng ch ng c t t p h p tng ng. V d d i y trnh by cch hi n th ch ng c host v ch ng c assembly c a m t assembly. Ch r ng, t t c cc l p ch ng c chu n u chp phng th c Object.ToString bi u di n tr ng thi c a i t ng ch ng c . M c d c lin quan nhng khng ph i lc no v d ny cng hi n th ch ng c m m t assembly s c khi c n p t bn trong chng trnh c a b n. Runtime host (nh Microsoft ASP.NET hay Microsoft Internet Explorer runtime host) c th t gn thm ch ng c host khi n n p m t assembly.
using using using using System; System.Reflection; System.Collections; System.Security.Policy;

public class ViewEvidenceExample { public static void Main(string[] args) { // N p assembly c ch nh. Assembly a = Assembly.LoadFrom(args[0]); // Thu l y t p h p Evidence t Evidence e = a.Evidence; assembly c n p.

// Hi n th ch ng c host. IEnumerator x = e.GetHostEnumerator(); Console.WriteLine("HOST EVIDENCE COLLECTION:"); while(x.MoveNext()) { Console.WriteLine(x.Current.ToString());

417 Chng 13: B o m t } // Hi n th ch ng c assembly. x = e.GetAssemblyEnumerator(); Console.WriteLine("ASSEMBLY EVIDENCE COLLECTION:"); while(x.MoveNext()) { Console.WriteLine(x.Current.ToString()); } } }

T t c cc l p ch ng c chu n do .NET Framework c p u b t bi n, b n khng th thay i cc gi tr c a chng sau khi b th c thi t o ra r i gn chng cho assembly. Ngoi ra, b n khng th thm hay lo i b cc item trong lc ang li t k m t t p h p b ng IEnumerator, n u khng, phng th c MoveNext s nm ngo i l System.InvalidOperationException.

13.10

X l chng c khi np mt assembly


tc ng n cc quy n m b

B n c n x l ch ng c khi n p m t assembly th c thi c p cho assembly.

T o cc i t ng ch ng c m b n mu n gn cho assembly, sau thm chng vo m t th hi n c a l p System.Security.Policy.Evidence, r i truy n t p h p Evidence cho phng th c dng n p assembly. Ch ng c ( c chi m h u b i m t assembly) nh ngha nh danh (identity) c a assembly v xc nh b th c thi c p cc quy n no cho assembly. B n p assembly (Assembly Loader) ch u trch nhi m chnh trong vi c xc nh gn ch ng c g cho m t assembly, nhng m t host ng tin c y (nh ASP.NET hay Internet Explorer runtime host) cng c th gn ch ng c cho m t assembly. M l nh c a b n c th gn ch ng c khi n p m t assembly n u m l nh ny c ph n t ControlEvidence c a SecurityPermission. N u b n n p m t assembly vo m t mi n ng d ng hai l n nhng gn ch ng c khc vo assembly ny m i l n nh th , b th c thi s nm ngo i l System.IO.FileLoadException. C nhi u phng th c th c hi n vi c gn ch ng c khi n p m t assembly. M t c i m m t t c cc phng th c ny th ng c l nh n m t t p h p Evidence lm i s l p Evidence l m t b ch a cho cc i t ng ch ng c . B n ph i t t ng i t ng ch ng c m b n mu n gn cho assembly vo m t t p h p Evidence v truy n n cho phng th c n p assembly. N u b n gn ch ng c m i xung t v i ch ng c c gn b i b n p assembly, ch ng c m i s thay th ch ng c c. B ng 13-2 li t k cc l p v cc phng th c c a chng tr c ti p hay gin ti p n p m t assembly. M i phng th c cung c p m t hay nhi u phin b n n p ch ng ch p nh n m t t p h p Evidence.
B ng 13.2 Cc l p v cc phng th c c a chng cho php b n gn ch ng c cho m t assembly L p/Phng th c M t

L p System.Activator

Cc phng th c ny nh h ng hi n hnh.

n mi n ng d ng

418 Chng 13: B o m t CreateInstance CreateInstanceFrom

T o m t ki u trong mi n assembly c ch nh.

ng d ng hi n hnh t

L p System.AppDomain
CreateInstance CreateInstanceAndUnwrap CreateInstanceFrom CreateInstanceFromAndUnwrap

Cc phng th c ny nh h ng n mi n ng d ng c m t b i i t ng AppDomain (phng th c c g i trn ).

T o m t ki u t assembly c ch

nh.

T o
DefineDynamicAssembly

m t

t ng

System.Reflection.Emit.

AssemblyBuilder, b n c th

s d ng n

t o

ng

m t assembly trong b nh .
ExecuteAssembly Load

N p v th c thi m t assembly c i m nh p c nh ngha (phng th c Main). N p assembly c ch nh. n mi n ng d ng

L p System.Reflection.Assembly
Load LoadFile LoadFrom LoadWithPartialName

Cc phng th c ny nh h ng hi n hnh.

N p assembly c ch

nh.

o n m d i y trnh by cch s d ng phng th c Assembly.Load n p m t assembly vo mi n ng d ng hi n hnh. Tr c khi g i Load, o n m ny t o m t t p h p Evidence v s d ng phng th c AddHost c a n thm cc i t ng ch ng c Site v Zone (cc thnh vin c a khng gian tn System.Security.Policy).
// T o cc i t ng ch ng c Site v Zone m i. 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); // T o m t t p h p Evidence m i. System.Security.Policy.Evidence evidence = new System.Security.Policy.Evidence(); // Thm cc i t ng ch ng c Site v Zone vo t p h p Evidence // b ng phng th c AddHost. evidence.AddHost(siteEvidence); evidence.AddHost(zoneEvidence); // N p assembly c tn l "SomeAssembly" v gn cc i t ng Site v // Zone cho n. Cc i t ng ny s chp cc i t ng Site v Zone // do b n p assembly gn. System.Reflection.Assembly assembly = System.Reflection.Assembly.Load("SomeAssembly", evidence);

419 Chng 13: B o m t

13.11

X l bo mt b thc thi bng chng c ca min ng dng

B n c n bu c m t gi i h n trn (upper limit) ln cc quy n ang c hi u l c v i t t c cc assembly c n p vo m t mi n ng d ng c th . C u hnh chnh sch b o m t c p cc quy n ph h p d a trn ch ng c m b nd nh gn cho mi n ng d ng. Khi t o mi n ng d ng b ng phng th c tnh CreateDomain c a l p System.AppDomain, b n hy cung c p m t t p h p System.Security.Policy.Evidence ch a cc i t ng ch ng c c a mi n ng d ng. Sau , n p cc assembly m b n mu n gi i h n cc quy n c a chng bn trong mi n ng d ng ny. ng nh b th c thi gn quy n cho assembly d a trn ch ng c m assembly ny a ra lc n p, b th c thi cng gn quy n cho cc mi n ng d ng d a trn ch ng c c a chng. B th c thi khng gn ch ng c cho cc mi n ng d ng theo cch nh n gn cho cc assembly v khng c g ch ng c t a vo. Thay vo , m l nh t o mi n ng d ng ph i gn ch ng c khi c n. B th c thi ch s d ng cc m c chnh sch cng ty (enterprise), my (machine), v tnh cc quy n c a m t mi n ng d ng; cc chnh sch b o ng i dng (user) m t c a cc mi n ng d ng hi n c khng gi vai tr g c . M c 13.12 s th o lu n chnh sch b o m t mi n ng d ng. Cc mi n ng d ng khng c ch ng c l trong su t i v i cc c ch b o m t truy xu t m l nh c a b th c thi. Cc mi n ng d ng c gn ch ng c c m t grant-set d a trn chnh sch b o m t v ng m t vai tr quan tr ng trong vi c phn gi i cc yu c u b o m t CAS. Khi qu trnh th c thi ng d ng xuyn qua m t bin mi n ng d ng, b th c thi ghi l i vi c chuy n ti p trn call stack. Khi m t yu c u b o m t gy nn m t stack walk, b n ghi chuy n ti p mi n ng d ng c x l gi ng nh cc b n ghi stack khcb th c thi nh gi grantset k t giao v i b n ghi stack b o m n ch a cc quy n c yu c u. i u ny ngha l cc quy n c a m t mi n ng d ng nh h ng n t t c m l nh c n p vo mi n ng d ng. Th c t , mi n ng d ng thi t l p m t gi i h n trn ln cc kh nng c a t t c m l nh c n p vo n. M t v d quan tr ng trong s d ng ch ng c mi n ng d ng l Microsoft Internet Explorer. Internet Explorer t o m t mi n ng d ng cho m i site m n download cc i u ki m cqu n-l t . T t c cc i u ki m c download t m t site cho tr ccng nh cc assembly m chng n pch y trong cng mi n ng d ng. Khi Internet Explorer t o mi n ng d ng cho m t site, n gn ch ng c System.Security.Policy.Site cho mi u ng d ng ny. i u ny b o m r ng, n u cc i u ki m c download n p m t assembly (ngay c t a c c b ), cc hnh ng c a assembly ny b rng bu c b i cc quy n c c p cho mi n ng d ng d a trn ch ng c Site v chnh sch b o m t. Tr khi b n gn ch ng c cho mi n ng d ng m t cch t ng minh khi t o n, mi n ng d ng ny khng nh h ng g n cc yu c u b o m t (security demand).

420 Chng 13: B o m t

gn ch ng c cho m t mi n ng d ng, b n hy t o m t t p h p Evidence v thm cc i t ng ch ng c c n thi t vo b ng phng th c Evidence.AddHost. Khi t o mi n ng d ng m i, b n truy n t p h p Evidence cho m t trong cc phin b n n p ch ng c a phng th c tnh CreateDomain. Qu trnh phn gi i chnh sch th ng k c a b th c thi s xc nh grant-set c a mi n ng d ng. ng d ng d i y trnh by cch gn ch ng c cho m t mi n ng d ng. Trong , ng d ng n p m l nh t m t publisher c th vo m t mi n ng d ng publisher c th . B ng cch gn cho mi u ng d ng ch ng c System.Security.Policy.Publisher m t publisher c a ph n m m, v d ny h n ch cc kh nng c a m l nh c n p vo mi n ng d ng. S d ng chnh sch b o m t, b n c th gn m l nh c a publisher m t t p quy n c c i tng x ng v i m c tin c y b n t vo publisher.
using System; using System.Security.Policy; using System.Security.Cryptography.X509Certificates; public class AppDomainEvidenceExample { public static void Main() { // T o m t mi n ng d ng m i cho m i publisher m ng d ng ny // s n p m l nh c a n. Truy n cho phng th c CreateAppDomain // tn cng ty, v tn c a file ch a ch ng ch X.509v3 // c a cng ty ny. AppDomain appDom1 = CreateAppDomain("Litware", "litware.cer"); AppDomain appDom2 = CreateAppDomain("Fabrikam", "fabrikam.cer"); // N p m l nh t // th c thi. } // Phng th c ny t o m t mi n ng d ng m i n p v ch y m l nh // trong t m t publisher c th . i s name ch nh tn c a // mi n ng d ng. i s certFile ch nh tn c a file ch a // m t ch ng ch X.509v3 cho publisher m m l nh c a n s // c ch y trong mi n ng d ng m i. private static AppDomain CreateAppDomain(string name, string certFile){ // T o m t i t ng X509Certificate m i t ch ng ch // n m trong file c ch nh. X509Certificate cert = X509Certificate.CreateFromCertFile(certFile); X.509v3 cc publisher vo mi n ng d ng ph h p

// T o ch ng c Publisher m i t i t ng X509Certificate. Publisher publisherEvidence = new Publisher(cert); // T o m t t p h p Evidence m i. Evidence evidence = new Evidence(); // Thm ch ng c Publisher vo t p h p Evidence. evidence.AddHost(publisherEvidence); // T o m t mi n ng d ng m i v i t p h p Evidence // ch a ch ng c Publisher v tr v mi n ng d ng // v a c t o ra.

421 Chng 13: B o m t return AppDomain.CreateDomain(name, evidence); } }

13.12

X l bo mt b thc thi bng chnh sch bo mt ca min ng dng

B n c n ki m sot (b ng m l nh) cc quy n c c p cho cc assembly. C u hnh (b ng m l nh) chnh sch b o m t c a mi n ng d ng m b n n p cc assembly vo . Chnh sch b o m t (security policy) bao g m b n m c chnh sch: cng ty (enterprise), my (machine), ng i dng (user), v mi n ng d ng (application domain). B th c thi quy t nh nh ng quy n no c p cho m t assembly b ng cch xc nh t p quy n c c p b i m i m c chnh sch r i tnh php giao (php AND lu n l) c a b n t p quy n. Cc quy n n m trong t p giao l grant-set cu i cng c a assembly. Ngay c khi cc m c chnh sch cng ty, my, hay ng i dng ch nh code group LevelFinal (ch th b th c thi khng nh gi cc m c chnh sch th p hn), b th c thi lun s d ng m c chnh sch c a mi n ng d ng tnh grant-set c a m t assembly. Ch cc m c chinh sch cng ty, my, v ng i dng l c c u hnh tnh b ng Administrative Tools. V mi n ng d ng khng t n t i bn ngoi ng c nh c a b th c thi nn khng th c u hnh tnh chnh sch mi n ng d ng c. c u hnh chnh sch b o m t c a m t mi n ng d ng, b n ph i t o m t m c chnh sch (b ng m l nh) r i gn n cho mi n ng d ng. Xy d ng m t m c chnh sch b ng m l nh c th l m t cng vi c lu di, ty thu c vo ph c t p c a chnh sch b o m t m b n c n di n t . L p System.Security.Policy.PolicyLevel m t m t m c chnh sch b o m t. Bn trong m i i t ng PolicyLevel, b n ph i t o d ng m t c u trc phn c p cc code group, nh ngha cc i u ki n thnh vin, cc t p quy n, v cc c tnh c a m i code group. C r t nhi u ki u c s d ng t o d ng m c chnh sch, v th o lu n v cc ki u ny l v t qu ph m vi quy n sch ny. L p trnh b o m t .NET, nh c p tr c y, cung c p thng tin chi ti t v m i l p ny v trnh by cch xy d ng m t m c chnh sch b ng m l nh. Thng th ng, b n s pht tri n m t cng c tr gip vi c t o m t m c chnh sch v ghi nh ngha m c chnh sch ra file; sau , b n c th n p nh ngha ny t a khi c n. L p PolicyLevel c hai phng th c nh m n gi n ha qu trnh ny: ToXml a m t i t ng PolicyLevel v d ng d lu tr , v FromXml xy d ng l i m t i t ng PolicyLevel t d ng c lu tr . M t khi c i t ng PolicyLevel m t chnh sch b o m t nh mong mu n, b n c th gn n cho m t mi n ng d ng. Thu l y tham chi u System.AppDomain n mi n ng d ng m b n mu n c u hnh, v truy n i t ng PolicyLevel cho phng th c AppDomain.SetAppDomainPolicy. M l nh c a b n ph i c ph n t ControlDomainPolicy c a

422 Chng 13: B o m t

g i SetAppDomainPolicy. B n ch c th g i SetAppDomainPolicy m t l n trn m i mi n ng d ng; n u b n g i SetAppDomainPolicy l n th hai, n s nm ngo i l System.Security.Policy.PolicyException. B n khng ph i gn i t ng PolicyLevel cho m t mi n ng d ng tr c khi n p cc assembly vo mi n ng d ng ny. Cc assembly c n p tr c khi b n thi t l p chnh sch b o m t mi n ng d ng c cc grant-set ch d a trn cc m c chnh sch: cng ty, my, v ng i dng. Chnh sch mi n ng d ng ch p d ng cho cc assembly c n p sau khi n c c u hnh. Thng th ng, b n s d ng kh nng ny n p cc assembly chia s ngtin-c y vo mi n ng d ng m khng b rng bu c b i chnh sch mi n ng d ng. ng d ng d i y trnh by qu trnh t o m t m c chnh sch v gn n cho m t mi n ng d ng. M c chnh sch ny c p cc quy n d a trn publisher c a m t assembly c th hi n trong cc kho n c a ch ng c System.Security.Policy.Publisher.
using using using using System; System.Security; System.Security.Policy; System.Security.Cryptography.X509Certificates;

SecurityPermission th m i c th

public class AppDomainPolicyExample { public static void Main() { // T o m t mi n ng d ng m i ( n p cc assembly vo AppDomain domain = AppDomain.CreateDomain("modules"); // N p cc assembly vo mi n ng d ng m b n khng mu n // b rng bu c b i chnh sch b o m t mi n ng d ng. // C u hnh chnh sch b o m t cho SetDomainPolicy(domain); // N p cc assembly vo mi n } // Phng th c ny c u hnh chnh sch b o m t c a i t ng // AppDomain c truy n cho n. Chnh sch b o m t s gn cc // quy n khc nhau cho m i assembly d a trn publisher c a // assembly. Nh ng assembly t cc publisher v danh khng c // c p quy n no c . private static void SetDomainPolicy(AppDomain domain) { // T o m t PolicyLevel m i cho mi n ng d ng. PolicyLevel policy = PolicyLevel.CreateAppDomainLevel(); // T o m t FirstMatchCodeGroup m i dng lm nt g c c a h // th ng phn c p code group. C u hnh group ny sao cho // n trng kh p v i t t c code. i u ny ngha l t t c // cc assembly u kh i u v i m t grant-set r ng cho // m c chnh sch mi n ng d ng. policy.RootCodeGroup = new FirstMatchCodeGroup( new AllMembershipCondition(), new PolicyStatement(policy.GetNamedPermissionSet("Nothing")) ); // T o t p cc code group xc nh cc quy n no s c c p ng d ng i t ng AppDomain. c b o v . ).

423 Chng 13: B o m t // // // // // // cho m t assembly do m t publisher t o ra. V code group g c l m t FirstMatchCodeGroup, nn qu trnh phn gi i chnh sch ch so trng assembly trn cc group con cho n khi tm th y trng kh p u tin. M i code group c t o v i c tnh Exclusive b o m r ng assembly khng l y thm quy n no t cc code group khc.

// T o code group c p t p quy n FullTrust cho cc // assembly c pht hnh b i Microsoft. X509Certificate microsoftCert = X509Certificate.CreateFromCertFile("microsoft.cer"); policy.RootCodeGroup.AddChild(new UnionCodeGroup( new PublisherMembershipCondition(microsoftCert), new PolicyStatement(policy.GetNamedPermissionSet("FullTrust"), PolicyStatementAttribute.Exclusive) )); // T o code group c p t p quy n Internet cho cc // assembly c pht hnh b i Litware, Inc. X509Certificate litwareCert = X509Certificate.CreateFromCertFile("litware.cer"); policy.RootCodeGroup.AddChild(new UnionCodeGroup( new PublisherMembershipCondition(litwareCert), new PolicyStatement(policy.GetNamedPermissionSet("Internet"), PolicyStatementAttribute.Exclusive) )); // T o code group c p t p quy n Execution cho cc // assembly c pht hnh b i Fabrikam, Inc. X509Certificate fabrikamCert = X509Certificate.CreateFromCertFile("fabrikam.cer"); policy.RootCodeGroup.AddChild(new UnionCodeGroup( new PublisherMembershipCondition(fabrikamCert), new PolicyStatement(policy.GetNamedPermissionSet("Execution"), PolicyStatementAttribute.Exclusive) )); // Thm m t code group sau cng b t t t c cc assembly // khng kh p v i publisher no. Gn group ny v i t p quy n // Nothing. V group ny l Exclusive nn assembly s khng // nh n quy n no t cc group khc, ngay c t cc // m c chnh sch cao hn (cng ty, my, v ng i dng). policy.RootCodeGroup.AddChild(new UnionCodeGroup( new AllMembershipCondition(), new PolicyStatement(policy.GetNamedPermissionSet("Nothing"), PolicyStatementAttribute.Exclusive) )); // Gn chnh sch cho mi n ng d ng. domain.SetAppDomainPolicy(policy); } }

424 Chng 13: B o m t

13.13 Xc nh ngi dng hin hnh c l thnh vin


ca mt nhm Windows no hay khng
B n c n xc nh ng i dng hi n hnh c a ng d ng c ph i l thnh vin c a m t nhm ng i dng Windows no hay khng. Thu l y i t ng System.Security.Principal.WindowsIdentity m t ng i dng hi n hnh b ng phng th c tnh WindowsIdentity.GetCurrent. K ti p, truy n i t ng WindowsIdentity cho phng th c kh i d ng c a l p System.Security.Principal.WindowsPrincipal thu l y i t ng WindowsPrincipal. Cu i cng, g i phng th c IsInRole c a i t ng WindowsPrincipal xc nh ng i dng ny c n m trong m t nhm Windows no hay khng. C ch RBS c a .NET Framework tr u t ng ha cc tnh nng b o m t d a-trn-ng i-dng c a h i u hnh n m d i thng qua hai giao di n chnh sau y:

System.Security.Principal.IIdentity System.Security.Principal.IPrincipal

Giao di n IIdentity m t th c th m m l nh hi n ang ch y trn danh ngha c a th c th ny, ch ng h n m t ng i dng ho c ti kho n d ch v (service account). Giao di n IPrincipal m t IIdentity c a th c th v t p cc vai tr m th c th ny thu c v . M t vai tr ch l m t s phn lo i, dng nhm cc th c th v i cc kh nng b o m t tng t nhau, ch ng h n m t nhm ng i dng Windows. tch h p RBS v i b o m t ng i dng Windows, .NET Framework cung c p hai l p sau y (hi n th c giao di n IIdentity v IPrincipal):

System.Security.Principal.WindowsIdentity System.Security.Principal.WindowsPrincipal

L p WindowsIdentity hi n th c giao di n IIdentity v m t m t ng i dng Windows. L p WindowsPrincipal hi n th c IPrincipal v m t t p cc nhm Windows m ng i dng ny thu c v . V .NET RBS l m t gi i php chung c thi t k sao cho c l p n n, b n khng th truy xu t cc tnh nng v cc kh nng c a ti kho n ng i dng Windows thng qua giao di n IIdentity v IPrincipal, b n ph i s d ng tr c ti p cc i t ng WindowsIdentity v WindowsPrincipal. xc nh ng i dng hi n hnh c ph i l thnh vin c a m t nhm Windows no hay khng, tr c tin b n ph i g i phng th c tnh WindowsIdentity.GetCurrent. Phng th c ny tr v m t i t ng WindowsIdentity m t ng i dng Windows m ti u trnh hi n ang ch y trn danh ngha c a ng i dng ny. K ti p, t o m t i t ng WindowsPrincipal m i v truy n i t ng WindowsIdentity cho phng th c kh i d ng. Cu i cng, g i phng th c IsInRole c a i t ng WindowsPrincipal ki m tra xem ng i dng ny c n m trong m t nhm (vai tr) c th no hay khng. IsInRole tr v true n u ng i dng ny l thnh vin c a nhm c ch nh, ng c l i tr v false.

425 Chng 13: B o m t

B n c th thu l y tham chi u IPrincipal b ng thu c tnh tnh CurrentPrincipal c a nhin, k thu t ny ty thu c vo c u hnh d ng hi n hnh; m c 13.14 s th o lu n v n Phng th c IsInRole c ba phin b n n p ch ng:

n m t i t ng WindowsPrincipal l p System.Threading.Thread. Tuy chnh sch principal c a mi n ng ny chi ti t hn.

Phin b n th nh t nh n m t chu i ch a tn c a nhm c n ki m tra. Tn nhm ph i c d ng [DomainName]\[GroupName] i v i cc nhm d a-trn-mi n v ph i c d ng [MachineName]\[GroupName] i v i cc nhm c nh ngha c c b . N u mu n ki m tra t cch thnh vin c a m t nhm Windows chu n, b n hy s d ng d ng BUILTIN\[GroupName]. IsInRole th c hi n ki m tra c phn bi t ch hoa-th ng i v i tn nhm c ch nh. Phin b n th hai nh n m t s nguyn (int), s ny ch nh m t Windows Role Identifier (RID). RID cung c p m t c ch nh n bi t cc nhm, khng ph thu c vo ngn ng (language) v s b n a ha (localization). ki u li t k nh ngha cc thnh vin m t cc nhm Windows c s n. B ng 13.3 li t k tn, RID, v gi tr WindowsBuiltInRole cho m i nhm Windows chu n.
System.Security.Principal.WindowsBuiltInRole. Ki u li t k ny

Phin

b n

th

ba

nh n

m t

thnh

vin

thu c

B ng 13.3 Tn, RID, v gi tr WindowsBuiltInRole c a cc ti kho n c s n Tn ti kho n 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

L p WindowsIdentity cung c p cc phng th c kh i d ng n p ch ng cho php b n thu l y i t ng WindowsIdentity m t m t ng i dng no (khi ch y trn Microsoft Windows Server 2003 tr v sau). B n c th s d ng i t ng ny v phng php c m t trong m c ny xc nh xem ng i dng c ph i l thnh vin c a m t nhm Windows no hay khng.

426 Chng 13: B o m t

N u b n s d ng m t trong cc phng th c kh i d ng ny khi ch y trn m t phin b n Windows c, n s nm ngo i l System.ArgumentException. Trn cc n n Windows tr c Windows Server 2003, b n ph i s d ng m l nh nguyn sinh (native code) thu l y Windows access token m t ng i dng c n thi t. K , b n c th s d ng access token ny t o i t ng WindowsIdentity; m c 13.15 s trnh by cch thu l y Windows access token cho nh ng ng i dng c th . ng d ng WindowsGroupExample d i y trnh by cch ki m tra ng i dng hi n hnh c l thnh vin c a m t t p cc nhm Windows c nu tn hay khng. Cc nhm ny c ch nh trong cc i s dng l nh; b n nh t tn my tnh, tn mi n, hay BUILTIN ( i v i cc nhm Windows chu n) vo tr c tn nhm.
using System; using System.Security.Principal; public class WindowsGroupExample { public static void Main (string[] args) { // Thu l y i t ng WindowsIdentity // m t ng i dng hi n hnh. WindowsIdentity identity = WindowsIdentity.GetCurrent(); // T o i t ng WindowsPrincipal m t cc kh nng b o m t // c a i t ng WindowsIdentity c ch nh. WindowsPrincipal principal = new WindowsPrincipal(identity); // Duy t qua cc i s dng l nh (tn nhm) v ki m tra xem // ng i dng hi n hnh c l thnh vin c a m i nhm hay khng. foreach (string role in args) { Console.WriteLine("Is {0} a member of {1}? = {2}", identity.Name, role, principal.IsInRole(role)); } } }

N u b n ch y v d ny v i t cch ng i dng c tn l nnbphuong81 trn m t my tnh c tn l MACHINE b ng l nh WindowsGroupExample BUILTIN\Administrators BUILTIN\Users MACHINE\Accountants, k t xu t 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

13.14

Hn ch nhng ngi dng no thc thi m lnh ca bn

B n c n h n ch nh ng ng i dng no truy xu t cc ph n t trong m l nh c a b n d a trn tn ng i dng hay cc vai tr m ng i dng ny l thnh vin.

427 Chng 13: B o m t

S d ng l p System.Security.Permissions.PrincipalPermission v b n sao tnh System.Security.Permissions.PrincipalPermissionAttribute c a l p ny b o v cc ph n t trong chng trnh c a b n v i cc yu c u RBS.

.NET Framework h tr c yu c u RBS b t bu c (imperative RBS demand) v yu c u RBS khai bo (declarative RBS demand). L p PrincipalPermission h tr cc l nh b o m t b t bu c, v b n sao c tnh PrincipalPermissionAttribute c a l p ny h tr cc l nh b o m t khai bo. Cc yu c u RBS s d ng c php gi ng nh cc yu c u CAS, nhng cc yu c u RBS ch r tn m ng i dng hi n hnh ph i c, ho c thng th ng hn l cc vai tr m ng i dng ny l thnh vin. M t yu c u RBS l nh cho b th c thi xt tn v cc vai tr c a ng i dng hi n hnh, v n u chng khng t yu c u, b th c thi s nm ngo i l System.Security.SecurityException. o n m d i y trnh by c php c a m t yu c u b o m t b t bu c:
// C php c a m t yu c u b o m t b t bu c d a-trn-vai-tr. public static void SomeMethod() { PrincipalPermission perm = new PrincipalPermission("UserName", "RoleName"); perm.Demand(); }

Tr c tin, b n ph i t o m t i t ng PrincipalPermission ch nh tn ng i dng v tn vai tr m b n yu c u, r i g i phng th c Demand c a n. B n ch c th ch nh m t tn ng i dng v tn vai tr cho m i yu c u. N u tn ng i dng ho c tn vai tr l null, b t k gi tr no cng s th a mn yu c u. Khc v i cc quy n truy xu t m l nh, m t yu c u RBS khng cho k t qu trong m t stack walk; b th c thi ch nh gi tn ng i dng v cc vai tr c a ng i dng hi n hnh. o n m d i y trnh by c php c a m t yu c u b o m t khai bo:
// C php c a m t yu c u b o m t khai bo d a-trn-vai-tr. [PrincipalPermission(SecurityAction.Demand, Name = "UserName", Role = "RoleName")] public static void SomeMethod() { /*...*/}

B n c th thay cc yu c u RBS khai bo m c l p hay m c thnh vin. Cc yu c u m cl p p d ng cho t t c cc thnh vin c a l p tr khi c m t yu c u m c-thnh-vin chp yu c u m c-l p. Ni chung, b n c th t ch n hi n th c cc yu c u RBS b t bu c hay khai bo. Tuy nhin, cc yu c u b o m t b t bu c cho php b n tch h p cc yu c u RBS v i logic c a m l nh th c hi n nh ng yu c u RBS ph c t p. Ngoi ra, n u khng bi t vai tr hay tn ng i dng yu c u lc bin d ch, b n ph i s d ng cc yu c u b t bu c. Cc yu c u RBS khai bo c thu n l i l chng c l p v i logic c a m l nh v d nh n bi t hn. Ngoi ra, b n c th xem cc yu c u RBS khai bo b ng cng c Permview.exe ( c th o lu n trong m c 13.6). Cho d hi n th c yu c u RBS b t bu c hay khai bo, b n cng ph i ch c r ng b th c thi c th truy xu t tn v cc vai tr c a ng i dng hi n hnh nh gi yu c u m t cch ph h p.

428 Chng 13: B o m t

L p System.Threading.Thread m t m t ti u trnh c a h i u hnh (ch y m l nh cqu n-l). Thu c tnh tnh CurrentPrincipal c a l p Thread ch a m t th hi n IPrincipal m t ng i dng m ti u trnh hi n ang ch y trn danh ngha c a ng i ny. m c h i u hnh, m i ti u trnh cng c m t Windows access token k t giaom t ti kho n Windows m ti u trnh hi n ang ch y trn danh ngha c a ti kho n ny. B n c n hi u r ng th hi n IPrincipal v Windows access token l hai th c th ring bi t. Windows s d ng access token th c hi n c ch b o m t h i u hnh, trong khi b th c thi .NET s d ng th hi n IPrincipal nh gi cc yu c u RBS m c ng d ng. M c d chng c th m t cng m t ng i dng, nhng i u ny khng c ngha l lun lun nh v y. Theo m c nh, thu c tnh Thread.CurrentPrincipal l khng xc nh. V vi c thu l y cc thng tin lin quan n ng i dng c th m t nhi u th i gian, v ch m t ph n nh trong s cc ng d ng s d ng thng tin ny, cc nh thi t k .NET ch n cch kh i d ng "l i" i v i thu c tnh CurrentPrincipal. Tr c tin, m l nh thu l y thu c tnh Thread.CurrentPrincipal, b th c thi gn m t th hi n IPrincipal cho thu c tnh ny theo logic sau y: 1. N u mi n ng d ng m ti u trnh hi n hnh ang th c thi c m t principal m c th b th c thi s gn principal ny cho thu c tnh Thread.CurrentPrincipal. nh,

Theo m c nh, mi n ng d ng khng c principal m c nh. B n c th thi t l p principal m c nh c a m t mi n ng d ng b ng cch g i phng th c SetThreadPrincipal trn m t i t ng System.AppDomain m t mi n ng d ng b n mu n c u hnh. g i SetPrincipalPolicy, m l nh c a b n ph i c ph n t ControlPrincipal c a SecurityPermission. B n ch c th thi t l p principal m c nh m t l n cho m i mi n ng d ng; l i g i SetThreadPrincipal th hai d n n ngo i l System.Security.Policy.PolicyException. 2. N u mi n ng d ng khng c principal m c nh, chnh sch principal c a mi n ng d ng s xc nh hi n th c IPrincipal no s c t o ra v gn n cho Thread.CurrentPrincipal. c u hnh chnh sch principal cho m t mi n ng d ng, b n c n thu l y i t ng mi n ng d ng v g i phng th c SetPrincipalPolicy c a i t ng ny. Phng th c SetPrincipalPolicy nh n vo m t thnh vin thu c ki u li t k System.Security.Principal.PrincipalPolicy, gi tr ny cho bi t ki u c a i t ng IPrincipal s c gn cho Thread.CurrentPrincipal. g i SetPrincipalPolicy, m l nh c a b n ph i c ph n t ControlPrincipal c a SecurityPermission. B ng 13.4 li t k cc gi tr c a PrincipalPolicy; gi tr m c nh l UnauthenticatedPrincipal.
AppDomain m t

3.

N u m l nh c a b n c ph n t ControlPrincipal c a SecurityPermission, b n c th t t o ra i t ng IPrincipal v tr c ti p gn n cho thu c tnh Thread.CurrentPrincipal. Vi c ny s ngn b th c thi gn cc i t ng IPrincipal m c nh ho c t o ra cc i t ng m i d a trn chnh sch principal.
B ng 13.4 Cc thnh vin thu c ki u li t k PrincipalPolicy Tn thnh vin M t

429 Chng 13: B o m t

NoPrincipal

Khng c i t ng IPrincipal no c t o ra, Thread.CurrentPrincipal tr v m t tham chi u null. M t i t ng System.Security.Principal.


GenericPrincipal r ng c t o ra v c gn

UnauthenticatedPrincipal

cho Thread.CurrentPrincipal.
WindowsPrincipal

M t i t ng WindowsPrincipal (m t ng i dng Windows ng nh p) c t o ra v c gn cho Thread.CurrentPrincipal.

B t k s d ng phng php no thi t l p IPrincipal cho ti u trnh hi n hnh, b n cng ph i lm nh th tr c khi s d ng cc yu c u b o m t RBS, n u khng thng tin v ng i dng (IPrincipal) s khng c hi u l c b th c thi c th x l yu c u. Bnh th ng, khi ch y trn n n Windows, b n thi t l p chnh sch principal c a m t mi n ng d ng l PrincipalPolicy.WindowsPrincipal thu l y thng tin v ng i dng Windows:
// Thu l y m t tham chi u n mi n ng d ng hi n hnh. AppDomain appDomain = System.AppDomain.CurrentDomain; // C u hnh mi n ng d ng hi n hnh sao cho s d ng cc // principal d a-trn-Windows. appDomain.SetPrincipalPolicy( System.Security.Principal.PrincipalPolicy.WindowsPrincipal);

File RoleBasedSecurityExample.cs (trong a CD nh km) minh h a cch s d ng cc yu c u RBS b t bu c v khai bo. Ph n th nh t trnh by ba phng th c c b o v b ng cc yu c u RBS b t bu c. N u i t ng Thread.CurrentPrincipal khng th a cc i h i v tn ng i dng v t cch thnh vin, yu c u s nm ngo i l SecurityException.
public static void ProtectedMethod1() { // M t yu c u b o m t b t bu c d a-trn-vai-tr: principal // hi n hnh m t m t nh danh v i tn l "nnbphuong81", // cc vai tr c a principal l khng quan tr ng. System.Security.Permissions.PrincipalPermission perm = new System.Security.Permissions.PrincipalPermission (@"MACHINE\nnbphuong81", null); perm.Demand(); } public static void ProtectedMethod2() { // M t yu c u b o m t b t bu c d a-trn-vai-tr: principal // hi n t i l m t thnh vin c a vai tr "Managers" hay // "Developers". Khi s d ng PrincipalPermission, b n ch c th di n // t m i quan h OR. l v phng th c PrincipalPolicy.Intersect // lun tr v m t quy n r ng tr khi hai input l nh nhau. // Tuy nhin, b n c th s d ng lgic c a m l nh hi n th c // cc i u ki n ph c t p hn. Trong tr ng h p ny, tn c a nh // danh l khng quan tr ng. System.Security.Permissions.PrincipalPermission perm1 = new System.Security.Permissions.PrincipalPermission (null, @"MACHINE\Managers");

430 Chng 13: B o m t System.Security.Permissions.PrincipalPermission perm2 = new System.Security.Permissions.PrincipalPermission (null, @"MACHINE\Developers"); perm1.Union(perm2).Demand(); } public static void ProtectedMethod3() { // M t yu c u b o m t b t bu c d a-trn-vai-tr: principal // hi n t i m t m t nh danh v i tn l "nnbphuong81" v // l m t thnh vin c a vai tr "Managers". System.Security.Permissions.PrincipalPermission perm = new System.Security.Permissions.PrincipalPermission (@"MACHINE\nnbphuong81", @"MACHINE\Managers"); perm.Demand(); }

Ph n th hai trnh by ba phng th c c b o v b ng cc yu c u RBS khai bo, tng ng v i cc yu c u RBS b t bu c v a c trnh by trn:
// M t yu c u b o m t khai bo d a-trn-vai-tr: principal hi n t i // m t m t nh danh v i tn l "nnbphuong81", cc vai tr c a // principal l khng quan tr ng. [PrincipalPermission(SecurityAction.Demand, Name = @"MACHINE\nnbphuong81")] public static void ProtectedMethod1() { /*...*/} // M t yu c u b o m t khai bo d a-trn-vai-tr: principal hi n t i // l m t thnh vin c a vai tr "Managers" hay "Developers". B n ch // c th di n t m i quan h OR (khng th di n t m i quan h AND). // Tn c a nh danh l khng quan tr ng. [PrincipalPermission(SecurityAction.Demand, Role = @"MACHINE\Managers")] [PrincipalPermission(SecurityAction.Demand, Role = @"MACHINE\Developers")] public static void ProtectedMethod2() { /*...*/} // M t yu c u b o m t khai bo d a-trn-vai-tr: principal hi n t i // m t m t nh danh v i tn l "nnbphuong81" v l m t thnh vin // c a vai tr "Managers". [PrincipalPermission(SecurityAction.Demand, Name = @"MACHINE\nnbphuong81", Role = @"MACHINE\Managers")] public static void ProtectedMethod3() { /*...*/}

13.15

Gi nhn ngi dng Windows

B n mu n m l nh c a b n ch y trong ng c nh c a m t ng i dng Windows no ch khng ph i ti kho n ng i dng hi n ang tch c c. Thu l y i t ng System.Security.Principal.WindowsIdentity m t ng i dng Windows m b n c n gi nh n, r i g i phng th c Impersonate c a i t ng WindowsIdentity.

431 Chng 13: B o m t

M i ti u trnh Windows u c m t access token k t giaom t ti kho n Windows m ti u trnh hi n ang ch y trn danh ngha c a ti kho n ny. H i u hnh Windows s d ng access token xc nh m t ti u trnh c cc quy n thch ng th c hi n cc thao tc c-b o-v trn danh ngha c a ti kho n ny hay khng, nh c/ghi file, kh i ng l i h th ng, v thay i th i gian h th ng. Theo m c nh, m t ng d ng c-qu n-l ch y trong ng c nh c a ti kho n Windows th c thi ng d ng. i u ny l hon ton bnh th ng, nhng i lc b n mu n ch y ng d ng trong ng c nh c a m t ti kho n Windows khc. i u ny ng trong tr ng h p cc ng d ng pha server c n x l phin giao d ch d a trn danh ngha c a cc ng i dng k t n i n server. Thng th ng, m t ng d ng server ch y trong ng c nh c a ti kho n Windows c t o ring cho ng d ng y l ti kho n d ch v (service account). Ti kho n d ch v ny s c cc quy n t i thi u truy xu t cc ti nguyn h th ng, lm cho ng d ng ho t ng nh th l ng i dng k t n i cho php ng d ng truy xu t cc ho t ng v ti nguyn ph h p v i quy n h n c a ng i dng . Khi m t ng d ng n m l y nh danh c a m t ng i dng khc, y l s gi nh n (impersonation). N u c hi n th c ng, s gi nh n s n gi n ha vi c qu n tr b o m t v thi t k ng d ng, trong khi v n duy tr vi c gi i trnh ng i dng. Nh th o lu n trong m c 13.14, Windows access token v .NET principal c a m t ti u trnh l cc th c th ring bi t v c th m t nh ng ng i dng khc nhau. K thu t gi nh n c m t trong m c ny ch thay i Windows access token c a ti u trnh hi n hnh, ch khng thay i principal c a ti u trnh ny. thay i principal c a ti u trnh, m l nh c a b n ph i c ph n t ControlPrincipal c a SecurityPermission v gn m t i t ng System.Security.Principal.IPrincipal m i vo thu c tnh CurrentPrincipal c a System.Threading.Thread hi n hnh. L p System.Security.Principal.WindowsIdentity cung c p cc ch c nng m thng qua , b n c th th c hi n s gi nh n. Tuy nhin, qu trnh ny ty thu c vo ng d ng c a b n ang ch y trn phin b n Windows no. Trn Windows Server 2003 tr v sau, l p WindowsIdentity h tr cc phin b n n p c a ch ng phng th c kh i d ng, cho php t o ra cc i t ng WindowsIdentity d a trn tn ti kho n c a ng i dng c n gi nh n. Trn t t c cc phin b n Windows tr c , tr c h t b n ph i thu l y System.IntPtr ch a tham chi u n Windows access token m t ng i dng c n gi nh n. thu l y tham chi u ny, b n c n s d ng m t phng th c nguyn sinh nh LogonUser c a Win32 API. V n ch y u khi th c hi n s gi nh n trn Windows 2000 v Windows NT l m t ti kho n ph i c c quy n SE_TCB_NAME th m i c th th c thi LogonUser. i u ny i h i b n c u hnh chnh sch b o m t c a Windows v c p cho ti kho n quy n Act as part of operating system (m c tin c y r t cao). B n ng bao gi tr c ti p c p c quy n SE_TCB_NAME cho cc ti kho n ng i dng. M t khi c i t ng WindowsIdentity m t ng i dng c n gi nh n, b n hy g phng th c Impersonate c a n. T lc ny, t t c cc hnh ng m m l nh c a b n th hi n u di n ra trong ng c nh c a ti kho n Windows c gi nh n. Phng th Impersonate tr v i t ng System.Security.Principal.WindowsSecurityContext, i c c i

432 Chng 13: B o m t

t ng ny m t ti kho n tch c c tr c khi gi nh n. tr v ti kho n c, b n c n g i phng th c Undo c a i t ng WindowsSecurityContext ny. ng d ng d i y trnh by s gi nh n c a m t ng i dng Windows. ng d ng ny c n hai i s dng l nh: tn ti kho n c a ng i dng c n gi nh n v password c a ti kho n. ng d ng ny s d ng hm LogonUser c a Win32 API thu l y Windows access token cho ng i dng c ch nh, gi nh n ng i dng ny, r i tr v ng c nh c a ng i dng c. V d , l nh ImpersonationExample nnbphuong81 password s gi nh n ng i dng nnbphuong81 n u ng i dng t n t i trong c s d li u ti kho n c c b .
using using using using using System; System.IO; System.Security.Principal; System.Security.Permissions; System.Runtime.InteropServices;

// B o m assembly c quy n truy xu t m l nh khng- c-qu n-l // v c quy n ki m sot principal c a ti u trnh. [assembly:SecurityPermission(SecurityAction.RequestMinimum, UnmanagedCode=true, ControlPrincipal=true)] public class ImpersonationExample { // nh ngha cc h ng s c s d ng cng v i hm LogonUser. const int LOGON32_PROVIDER_DEFAULT = 0; const int LOGON32_LOGON_INTERACTIVE = 2; // Nh p hm Win32 LogonUser t advapi32.dll. Ch nh // "SetLastError = true" c th truy xu t cc m l i c a 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) { // T o m t IntPtr m i gi l y access token // do hm LogonUser tr v . IntPtr accessToken = IntPtr.Zero; // G i LogonUser thu l y access token cho ng i dng // c ch nh. Bi n accessToken c truy n cho LogonUser // b ng tham chi u v s ch a tham chi u n Windows access token // n u LogonUser thnh cng. int result = LogonUser( args[0], // tn ng i dng ng nh p ".", // s d ng CSDL ti kho n c c b args[1], // password c a ng i dng LOGON32_LOGON_INTERACTIVE, // t o m t interactive login LOGON32_PROVIDER_DEFAULT, // s d ng logon provider m c nh ref accessToken // nh n access token handle ); // N u l i x y ra (LogonUser tr if (result == 0) { v zero), hi n th l i v thot.

Console.WriteLine("LogonUser returned error {0}", Marshal.GetLastWin32Error()); } else {

433 Chng 13: B o m t // T o m t WindowsIdentity m i t Windows access token. WindowsIdentity identity = new WindowsIdentity(accessToken); // Hi n th nh danh ang tch c c (tr c khi gi nh n). Console.WriteLine("Identity before impersonation = {0}", WindowsIdentity.GetCurrent().Name); // Gi nh n ng i dng c ch nh. i t ng // WindowsImpersonationContext ch a cc thng tin // c n thi t tr v ng c nh c a ng i dng c. WindowsImpersonationContext impContext = identity.Impersonate(); // Hi n th nh danh ang tch c c (trong lc gi nh n). Console.WriteLine("Identity during impersonation = {0}", WindowsIdentity.GetCurrent().Name); // *************************************************************** // Th c hi n cc hnh ng v i danh ngha ng i dng c gi nh n // *************************************************************** // Tr v ng i dng Windows c b ng // WindowsImpersonationContext. impContext.Undo();as i t ng

// Hi n th nh danh ang tch c c (sau khi gi Console.WriteLine("Identity after impersonation WindowsIdentity.GetCurrent().Name); } } }

nh n). = {0}",

434

Chng 14: M T M

14

435

436 Chng 14: M t m

t m (cryptography) l m t trong nh ng m t ph c t p nh t c a qu trnh pht tri n ph n m m m b t k nh pht tri n no cng s s d ng. L thuy t k thu t m t m hi n i c c k kh hi u v i h i m t m c ki n th c ton h c m tng i t ng i c c. May m n l th vi n l p .NET Framework cung c p cc hi n th c d s d ng cho h u h t cc k thu t m t m thng d ng v h tr cc gi i thu t ph bi n nh t. Chng ny s bn v cc v n sau: T o s ng u nhin (m c 14.1). T o v xc minh cc m bm m t m v cc m bm c kha (m c 14.2, 14.3, 14.4, v 14.5). S d ng gi i thu t (m c 14.6 v 14.8). i x ng v khng i x ng m t ha v gi i m t ha d li u

Tm l i, lu tr , v chuy n

i cc kha m t m (m c 14.7, 14.9, v 14.10).

Khi ngh cch p d ng cc k thu t trong chng ny vo m l nh, b n nn nh r ng m t m ch ng ph i l ci m b n hi n th c n l . M t m khng ngang b ng v i b o m t (security); s d ng m t m ch l m t ph n nh trong vi c t o m t gi i php an ton. i v i nh ng ai cha quen thu c v i m t m, d i y l tr ng: nh ngha c a m t s t quan m i

Encrypt ( ng t , t m d ch l m t ha) l m ha thng tin theo cch no ng i khng th c c n, tr nh ng ai c kha. Decrypt ( ng t , t m d ch l gi i m t ha) l gi i m thng tin - c-m t-ha. m t ha v gi i m t ha thng tin. Key l chu i cc bit dng

Plaintext l text cha- c-m t-ha hay - c-gi i-m t-ha. Ciphertext l text - c-m t-ha.

14.1

To s ngu nhin

B n c n t o m t s ng u nhin dng cho cc ng d ng m t m v b o m t. S d ng m t b t o s ng u nhin m t m (cryptographic random number generator), ch ng h n System.Security.Cryptography.RNGCryptoServiceProvider. L p System.Random l m t b t o s gi ng u nhin, n s d ng m t gi i thu t ton h c m ph ng vi c t o s ng u nhin. Th c ra, gi i thu t ny l t t nh (deterministic), ngha l b n lun c th tnh c s k ti p s l g d a trn s c t o tr c . i u ny ngha l cc s c t o b i l p Random s khng ph h p khi tnh b o m t c u tin, ch ng h n t o kha m t ha v password. Khi c n m t s ng u nhin khng t t nh (nondeterministic) dng trong cc ng d ng lin quan n m t m hay b o m t, b n ph i s d ng b t o s ng u nhin d n xu t t l p System.Security.Cryptography.RandomNumberGenerator. y l m t l p tr u t ng m t t c cc b t o s ng u nhin c th u s th a k t n. Hi n t i, ch c m t hi n th c l l p RNGCryptoServiceProvider. L p ny cung c p m t v b c c-qu n-l cho hm

437 Chng 14: M t m CryptGenRandom c a Win32 CryptoAPI, v b n c th s

d ng

vo m t m ng byte cc

gi tr byte ng u nhin. Cc s do RNGCryptoServiceProvider sinh ra khng th t s ng u nhin. Tuy nhin, chng ng u nhin p ng yu c u cho cc ng d ng m t m v b o m t trong h u h t cc mi tr ng chnh ph v thng m i. L p c s RandomNumberGenerator l m t factory cho cc l p hi n th c d n xu t t . G i
RandomNumberGenerator.Create("System.Security.Cryptography.RNGCryptoServiceProvider")

s tr v m t th hi n c a RNGCryptoServiceProvider, v b n c th s d ng n t os ng u nhin. Ngoi ra, v RNGCryptoServiceProvider l hi n th c duy nh t nn n s l l p m c nh c t o ra khi b n g i phng th c Create khng c i s : RandomNumberGenerator.Create(). V d d i y t o m t i t ng RNGCryptoServiceProvider v s d ng n t o cc gi tr ng u nhin. Phng th c GetBytes vo m t m ng byte cc gi tr byte ng u nhin. B n c th s d ng phng th c GetNonZeroBytes n u c n d li u ng u nhin khng ch a gi tr zero.
using System; using System.Security.Cryptography; public class SecureRandomNumberExample { public static void Main() { // T o m ng byte dng lu tr byte[] number = new byte[32]; d li u ng u nhin.

// T o b t o s ng u nhin m c nh. RandomNumberGenerator rng = RandomNumberGenerator.Create(); // T o d li u ng u nhin. rng.GetBytes(number); // Hi n th d li u ng u nhin. Console.WriteLine(BitConverter.ToString(number)); } }

Nh ng n

l c tnh ton c n thi t t o m t s ng u nhin v i RNGCryptoServiceProvider l n hn nhi u so v i Random. i v i m c ch th ng ngy, s d ng RNGCryptoServiceProvider l qu m c c n thi t. B n nn xem xt s l ng s ng u nhin c n t o v m c ch c a cc s ny tr c khi quy t nh s d ng RNGCryptoServiceProvider. S d ng l p RNGCryptoServiceProvider qu m c v khng c n thi t c th nh h ng ng k ln hi u nng c a ng d ng.

14.2

Tnh m bm ca password
b n c th s d ng

B n c n lu tr password c a ng i dng m t cch an ton n xc th c ng i dng trong tng lai.

438 Chng 14: M t m

ng lu tr password c a ng i dng d ng plaintext v y l m t nguy c b o m t l n. Thay vo , hy t o v lu tr m t m bm c a password b ng m t l p gi i thu t bm d n xu t t l p System.Security.Cryptography.HashAlgorithm. Khi xc th c, t o m bm c a password v so snh n v i m bm c lu tr . Cc gi i thu t bm l cc hm m t m m t chi u, nh n plaintext c chi u di thay i v t o m t gi tr s c kch th c c nh. Chng l m t chi u v g n nh khng th tm l i plaintext g c t m bm. Cc gi i thu t bm l t t nh (deterministic); p d ng cng gi i thu t bm cho m t m u plaintext lun t o ra cng m bm. i u ny khi n m bm tr nn h u ch cho vi c xc nh hai kh i plaintext (trong tr ng h p ny l password) c gi ng nhau hay khng. M c ch c a cc gi i thu t bm b o m r ngm c d khng ph i khng x y rakh nng hai m u plaintext khc nhau t o ra cng m bm l c c k nh . Ngoi ra, khng c m i tng quan no gi a s gi ng nhau c a hai m u plaintext v m bm c a chng; m t khc bi t nh trong plaintext cng c th gy ra khc bi t ng k trong m bm. Khi s d ng password xc th c m t ng i dng, b n khng quan tm n n i dung c a password do ng i dng nh p vo. B n ch c n bi t r ng password c nh p trng kh p v i password m b n ghi l i cho ng i dng trong c s d li u ti kho n. B n ch t c a cc gi i thu t bm khi n chng tr nn l t ng trong vi c lu tr password m t cch an ton. Khi ng i dng cung c p m t password m i, b n ph i t o m bm c a password v lu tr m bm ny, r i lo i b password d ng text. M i khi ng i dng xc th c v i ng d ng c a b n, tnh m bm c a password do ng i cung c p v so snh n v i m bm m b n lu tr . Ng i ta th ng h i cch thu l y password t m t m bm. V cu tr l i l khng th . M c ch c a m bm l ng vai tr nh m t token v b n c th ty lu tr n m khng sinh ra l h ng b o m t no. N u ng i dng qun password, b n khng th tm l i n t m bm c lu tr ; b n ph i reset ti kho n ny thnh gi tr m c nh no , ho c t o m t password m i cho ng i dng. L p tr u t ng HashAlgorithm cung c p l p c s t t c cc hi n th c gi i thu t bm c th d n xu t t . Th vi n l p .NET Framework c su hi n th c gi i thu t bm c th ( c li t k trong b ng 14.1), m i l p hi n th c l m t thnh vin c a khng gian tn System.Security.Cryptography. Cc l p v i ph n ui l CryptoServiceProvider b c l y cc ch c nng do Win32 CryptoAPI cung c p, trong khi cc l p v i ph n ui l Managed c hi n th c hon ton b ng m l nh c-qu n-l.
B ng 14.1 Cc hi n th c gi i thu t bm Tn gi i thu t Tn l p MD5CryptoServiceProvider SHA1CryptoServiceProvider SHA1Managed SHA256Managed Kch th c m bm (bit)

MD5 SHA hay SHA1 SHA1Managed SHA256 hay SHA-256

128 160 160 256

439 Chng 14: M t m

SHA384 hay SHA-384 SHA512 hay SHA-512

SHA384Managed SHA512Managed

384 512

M c d b n c th tr c ti p t o ra th hi n c a cc l p gi i thu t bm, l p c s HashAlgorithm l m t factory cho cc l p hi n th c d n xu t t n. G i phng th c tnh HashAlgorithm.Create v i i s l tn gi i thu t s tr v m t i t ng thu c ki u c ch nh. S d ng factory cho php b n ghi m l nh t ng qut v m l nh ny c th lm vi c v i b t k hi n th c gi i thu t bm no. M t khi b n c i t ng HashAlgorithm, phng th c ComputeHash c a n nh n m t m ng byte ch a plaintext v tr v m t m ng byte m i ch a m bm c t o ra. B ng 14.1 cho bi t kch th c c a m bm (tnh b ng bit) c t o ra b i m i l p gi i thu t bm. L p HashPasswordExample d i y trnh by cch t o m bm t m t chu i (password ch ng h n). ng d ng ny c n hai i s dng l nh: tn c a gi i thu t bm c n s d ng v chu i c n t o m bm. V phng th c HashAlgorithm.ComputeHash yu c u m t m ng byte nn tr c h t b n ph i m ha chu i nh p b ng l p System.Text.Encoding (l p ny cung c p cc c ch dng chuy n chu i thnh/t cc nh d ng m ha k t khc nhau).
using System; using System.Text; using System.Security.Cryptography; public class HashPasswordExample { public static void Main(string[] args) { // T o HashAlgorithm c a ki u c ch nh b i // i s dng l nh th nh t. using (HashAlgorithm hashAlg = HashAlgorithm.Create(args[0])) { // Chuy n chu i password ( i s dng l nh th hai) // thnh m t m ng byte. byte[] pwordData = Encoding.Default.GetBytes(args[1]); // T o m bm c a password. byte[] hash = hashAlg.ComputeHash(pwordData); // Hi n th m bm c a password. Console.WriteLine(BitConverter.ToString(hash)); } } }

Ch y l nh HashPasswordExample SHA1 ThisIsMyPassword s hi n 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

14.3
B n c n xc nh n i dung c a m t file c thay

Tnh m bm ca file
i theo th i gian hay khng.

T o m bm cho n i dung c a file b ng phng th c ComputeHash c a l p System.Security.Cryptography.HashAlgorithm. Lu tr m bm ny sau ny so snh v i cc m bm c t o m i.

440 Chng 14: M t m

Ngoi vi c cho php b n lu tr password m t cch an ton ( c th o lu n trong m c 14.2), m bm cn cung c p m t phng cch r t hay xc nh m t file c thay i hay khng. B ng cch tnh ton v lu tr m bm c a m t file, sau ny b n c th tnh l i m bm c a file ny xc nh file c thay i trong th i gian chuy n ti p hay khng. Gi i thu t bm s sinh ra m t m bm r t khc ngay c ch v i m t thay i r t nh trong file, nn kh nng hai file khc nhau cho ra cng m bm l c c k nh . Cc m bm chu n khng ph h p khi g i cng v i m t file b o m tnh ton v n c a n i dung file. N u ai ch n c file trn ng i, ng i ny c th d dng thay i file v tnh l i m bm. Chng ta s th o lu n m t bi n th c a m bm trong m c 14.5 (m bm c kha), m bm ny ph h p cho vi c b o m tnh ton v n c a file trn ng i. D dng t o c m bm c a m t file v i l p HashAlgorithm. Tr c h t, th hi n ha m t trong cc hi n th c gi i thu t bm d n xu t t l p HashAlgorithm (b n c n truy n tn gi i thu t bm cho phng th c HashAlgorithm.Createxem tn cc gi i thu t bm h p l trong b ng 14.1). K ti p, thay v truy n m t m ng byte cho phng th c ComputeHash, b n hy truy n m t i t ng System.IO.Stream m t file c n c t o m bm. i t ng HashAlgorithm x l qu trnh c d li u t Stream v tr v m t m ng byte ch a m bm cho file. L p HashStreamExample d i y trnh by cch t o m bm t m t file. B n ph i ch nh tn gi i thu t bm v tn file lm i s dng l nh, v d HashStreamExample SHA1 HashStreamExample.cs.
using System; using System.IO; using System.Security.Cryptography; public class HashStreamExample { public static void Main(string[] args) { // T o m t HashAlgorithm v i ki u c ch nh trong // i s dng l nh th nh t. using (HashAlgorithm hashAlg = HashAlgorithm.Create(args[0])) { // M m t FileStream cho file c ch nh trong // i s dng l nh th hai. using (Stream file = new FileStream(args[1], FileMode.Open)) { // T o m bm cho n i dung c a file. byte[] hash = hashAlg.ComputeHash(file); // Hi n th m bm. Console.WriteLine(BitConverter.ToString(hash)); } } } }

441 Chng 14: M t m

14.4

Kim tra m bm
i b ng

B n c n xc minh m t password ho c xc nh n m t file v n khng thay cch so snh hai m bm.

Chuy n c m bm c v m i thnh chu i th p l c phn, chu i Base64, hay m ng byte v so snh chng. B n c th s d ng m bm xc nh hai m u d li u c gi ng nhau hay khng, khng ph i lu tr hay duy tr vi c truy xu t n d li u g c. xc nh d li u c thay i theo th i gian hay khng, b n ph i t o v lu tr m bm c a d li u g c. Sau , hy t o m t m bm khc cho d li u ny r i so snh m bm c v m i cho th y c thay i no x y ra hay khng. nh d ng c a m bm g c s xc nh cch th c ph h p nh t ki m tra m bm m i c t o. Nhi u m c trong chng ny s d ng phng th c ToString c a l p System.BitConverter chuy n m ng byte thnh gi tr chu i th p l c phn khi hi n th . M c d d s d ng v thch h p cho m c ch hi n th , b n c th nh n th y cch ny khng ph h p khi lu tr m bm v n t d u g ch n i (-) gi a m i gi tr byte (v d , 4D-79-3A-C9-). Ngoi ra, l p BitConverter khng cung c p phng th c no phn tch m t bi u di n chu i nh th tr v m t m ng byte. d ng chu i th p l c phn (v d , c m ha theo Base64 (v d , idIiExcKnP8Jo5LwDixsTtwbDvk=). M bm cng c th c lu tr trong c s d li u d ng gi tr byte th. B t k b n lu tr m bm theo cch no, b c u tin khi so snh m bm c v m i l a chng v m t d ng chung.
89D22213170A9CFF09A392F00E2C6C4EDC1B0EF9) ho c chu i

M bm th ng

c lu tr

trong file text

o n m d i y chuy n m bm m i (m ng byte) thnh chu i th p l c phn khi so snh v i m bm c. Ngoi phng th c BitConverter.ToString m chng ta th o lu n trn, th vi n l p .NET Framework khng cung c p phng th c no chuy n m t m ng byte thnh chu i th p l c phn. B n ph i vi t m t vng l p i qua cc ph n t c a m ng byte, chuy n m i byte thnh chu i, v g n chu i ny vo bi u di n chu i th p l c phn c a m bm. S d ng System.Text.StringBuilder s trnh t o ra cc chu i m i khng c n thi t m i khi vng l p g n gi tr byte k ti p vo chu i k t qu (xem m c 2.1 bi t thm chi ti t).
// Phng th c dng so snh m bm m i v i // m bm c s n ( c bi u di n d ng chu i th p l c phn). private static bool VerifyHexHash(byte[] hash, string oldHashString) { // T o bi u di n chu i cho m bm m i. System.Text.StringBuilder newHashString = new System.Text.StringBuilder(hash.Length); foreach (byte b in hash) { newHashString.AppendFormat("{0:X2}", b); } // So snh bi u di n chu i c a m bm c v m i, // v tr v k t qu . return (oldHashString == newHashString.ToString());

442 Chng 14: M t m }

Trong o n m d i y, m bm m i l m t m ng byte v m bm c l m t chu i c m ha theo Base64. o n m ny s m ha m bm m i thnh chu i Base64 r i th c hi n php so snh chu i.
// Phng th c dng so snh m bm m i v i // m bm c s n ( c bi u di n d ng chu i Base64). private static bool VerifyB64Hash(byte[] hash, string oldHashString) { // T o bi u di n chu i Base64 cho m bm m i. string newHashString = System.Convert.ToBase64String(hash); // So snh bi u di n chu i c a m bm c v m i, // r i tr v k t qu . return (oldHashString == newHashString); }

Cu i cng, o n m d i y so snh hai m bm c bi u di n d ng m ng byte. Th vi n l p .NET Framework khng c phng th c no th c hi n ki u so snh ny, do b n ph i vi t m t vng l p so snh cc ph n t c a hai m ng. o n m ny c s d ng m t vi k thu t khng t n nhi u th i gian nh: b o m cc m ng byte c cng chi u di tr c khi b t u so snh chng, v tr v false khi tm th y khc bi t u tin.
// Phng th c dng so snh m bm m i v i // m bm c s n ( c bi u di n d ng m ng byte). private static bool VerifyByteHash(byte[] hash, byte[] oldHash) { // N u m t m ng l null, ho c hai m ng c chi u di khc nhau // th chng khng b ng nhau. if (hash == null || oldHash == null || hash.Length != oldHash.Length) return false; // Duy t qua m ng byte v so snh m i gi tr byte. for (int count = 0; count < hash.Length; count++) { if (hash[count] != oldHash[count]) return false; } // Hai m bm b ng nhau. return true; }

14.5

Bo m tnh ton vn d liu bng m bm c kha

B n c n chuy n m t file cho ai v c p cho ng i ny m t phng cch minh tnh ton v n c a file.

xc

C p cho ng i nh n m t kha b m t (key). Kha ny c th l m t s c sinh ng u nhin, nhng n cng c th l m t nhm t m b n v ng i nh n th a thu n. S d ng kha cng v i m t trong nh ng l p gi i thu t bm c kha d n t o m bm c xu t t l p System.Security.Cryptography.KeyedHashAlgorithm kha. G i m bm ny cng v i file. Khi nh n c file, ng i nh n s t o m

443 Chng 14: M t m

bm c kha cho file ny b ng kha. N u hai m bm gi ng nhau, ng i nh n s bi t r ng file ny do b n g i n v n khng b thay i trong qu trnh chuy n giao. M bm r t h u ch khi so snh hai m u d li u xc nh chng c gi ng nhau hay khng (c khi b n khng th truy xu t c d li u g c). Tuy nhin, b n khng th s d ng m bm cam oan v i ng i nh n v tnh ton v n c a d li u. N u c ai ch n c d li u, ng i ny c th thay th d li u v t o m bm m i. Khi ng i nh n ki m tra m bm, n c v ng nhng th c t d li u khng gi ng v i nh ng g b n g i lc ban u. M t gi i php n gi n v hi u qu cho v n ton v n d li u l m bm c kha (keyed hash code). M bm c kha cng tng t nh m bm bnh th ng ( c th o lu n trong m c 14.2 v 14.3); tuy nhin, m bm c kha k t h p thm m t ph n t d li u b m t (kha), ph n t ny ch c ng i g i v ng i nh n bi t. N u khng c kha, khng ai c th t o c m bm ng t t p d li u cho tr c. Kha ph i c gi b m t. N u ai bi t kha th c th t o ra m bm c kha h p l , ngha l b n s khng th xc nh h c thay i n i dung c a ti li u hay khng. V l do ny, b n khng nn chuy n giao hay lu tr kha cng v i ti li u c n c b o v tnh ton v n. M c 14.10 s cung c p m t c ch m b n c th s d ng trao i kha m t cch an ton. nh t o m bm bnh th ng v l p tr u t ng m r ng l p System.Security.Cryptography.HashAlgorithm. L p KeyedHashAlgorithm cung c p m t l p c s t t c cc gi i thu t bm c kha d n xu t t . Th vi n l p .NET Framework c hai hi n th c gi i thu t bm c kha c li t k trong b ng 14.2; m i hi n th c l m t thnh vin c a khng gian tn System.Security.Cryptography.
System.Security.Cryptography.KeyedHashAlgorithm B ng 14.2 Cc hi n th c gi i thu t bm c kha Gi i thu t/Tn l p HMACSHA1 MACTripleDES Kch th c kha (bit) Kch th c m bm (bit)

T o m bm c kha cng tng t

b t k 64, 128, 192

160 64

Cng nh cc gi i thu t bm chu n, b n c th tr c ti p t o ra cc i t ng gi i thu t bm c kha, ho c b n c th s d ng phng th c tnh KeyedHashAlgorithm.Create v i i s l tn gi i thu t. S d ng factory cho php b n vi t m l nh t ng qut v m l nh ny c th lm vi c v i b t k hi n th c gi i thu t bm c kha no, nhng theo b ng 14.2, m i l p h tr cc chi u di kha khc nhau nn b n ph i cung c p gi tr ny trong m l nh t ng qut. N u s d ng phng th c kh i d ng t o i t ng bm c kha, b n c th truy n kha cho phng th c ny. Khi s d ng factory, b n ph i thi t l p kha b ng thu c tnh Key ( c th a k t l p KeyedHashAlgorithm). M t khi c u hnh kha, g i phng th c ComputeHash v i i s l m t m ng byte hay m t i t ng System.IO.Stream. Gi i thu t bm c kha s x l d li u nh p v tr v m t m ng byte ch a m bm c kha. B ng 14.2 cho th y kch th c c a m bm do m i gi i thu t bm c kha sinh ra.

444 Chng 14: M t m

L p KeyedHashStreamExample d i y trnh by cch t o m bm c kha t m t file. B n ph i ch nh tn file v m t kha lm i s dng l nh. ng d ng ny s d ng l p HMACSHA1 t o m bm c kha v r i hi n th n ra c a s Console.
using using using using System; System.IO; System.Text; System.Security.Cryptography;

public class KeyedHashStreamExample { public static void Main(string[] args) { // T o m ng byte t chu i key (l i s dng l nh th byte[] key = Encoding.Unicode.GetBytes(args[1]); // T o m t i t ng HMACSHA1 // (truy n key cho phng th c kh i d ng). using (HMACSHA1 hashAlg = new HMACSHA1(key)) { // M m t FileStream c file (tn file // c ch nh trong i s dng l nh th nh t). using (Stream file = new FileStream(args[0], FileMode.Open)) { // T o m bm c kha cho n i dung file. byte[] hash = hashAlg.ComputeHash(file); // Hi n th m bm c kha ra c a s Console. Console.WriteLine(BitConverter.ToString(hash)); } } } } hai).

L nh 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 d ng KeyedHashMessageExample.cs (c trong a CD nh km) trnh by cch t o m t m bm c kha t m t chu i. ng d ng ny yu c n hai i s dng l nh: m t thng i p v m t kha, v s t o ra m bm c kha cho chu i thng i p b ng kha ny. V d , l nh 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

14.6

Bo v file bng php mt ha i xng


i x ng (symmetric encryption).

B n c n m t ha m t file b ng gi i thu t m t ha

Tr c h t, b n ph i th hi n ha m t trong cc l p gi i thu t i x ng c th d n xu t t l p System.Security.Cryptography.SymmetricAlgorithm. Sau , g i phng th c CreateEncryptor hay CreateDecryptor c a i t ng SymmetricAlgorithm thu l y m t i t ng c hi n th c giao di n

445 Chng 14: M t m System.Security.Cryptography.ICryptoTransform.

d ng i t ng ICryptoTransform ny k t h p v i m t i t ng System.Security.Cryptography.CryptoStream m t ha hay gi i m t ha d li u c t m t file ( c truy xu t b ng m t i t ng System.IO.FileStream). L p tr u t ng SymmetricAlgorithm cung c p m t l p c s t t c cc hi n th c gi i thu t i x ng c th d n xu t t . Th vi n l p .NET Framework c b n hi n th c gi i thu t i x ng c th c li t k trong b ng 14.3, m i l p l m t thnh vin c a khng gian tn System.Security.Cryptography. Cc l p c ui l CryptoServiceProvider b c l y cc ch c nng do Win32 CryptoAPI cung c p, trong khi cc l p c ui l Managed (hi n t i ch c RijndaelManaged) c hi n th c hon ton b ng m l nh c-qu n-l. B ng ny cng cho th y chi u di kha m m i gi i thu t h tr (chi u di m c nh c in m). Ni chung, kha cng di, cng kh gi i m t ha ciphertext n u khng c kha, nhng cng c nhi u y u t khc c n xem xt.
B ng 14.3 Cc hi n th c gi i thu t Tn gi i thu t i x ng Tn l p DESCryptoServiceProvider TripleDESCryptoServiceProvider Chi u di kha (bit)

DES TripleDES hay 3DES RC2 Rijndael

64 128, 192 40, 48 56, 64, 72, 80, 88, 96, 104, 112, 120, 128 128, 192, 256

RC2CryptoServiceProvider

RijndaelManaged

M c d b n c th t o ra cc th hi n c a cc l p gi i thu t i x ng m t cch tr c ti p, l p c s SymmetricAlgorithm l m t factory cho cc l p hi n th c c th d n xu t t . G i phng th c tnh SymmetricAlgorithm.Create v i i s l tn gi i thu t s tr v m t i t ng thu c ki u c ch nh. S d ng factory cho php b n vi t m l nh t ng qut, v m l nh ny c th lm vi c v i b t k hi n th c gi i thu t i x ng no:
string algName = "3DES"; SymmetricAlgorithm alg = SymmetricAlgorithm.Create(algName);

N u b n g i SymmetricAlgorithm.Create v khng ch nh tn gi i thu t, SymmetricAlgorithm s tr v m t i t ng RijndaelManaged. N u b n ch nh m t gi tr khng h p l , SymmetricAlgorithm s tr v null. B n c th c u hnh cc nh x tn/l p m i b ng file c u hnh (xem ti li u .NET Framework SDK bi t thm chi ti t). Tr c khi m t ha d li u v i m t trong cc l p gi i thu t i x ng, b n c n m t kha (key) v m t vect kh i ng (initialization vector). Kha l thng tin b m t dng m t ha v gi i m t ha d li u. Vect kh i ng l d li u ng u nhin c truy n cho gi i thu t m t ha. B n ph i s d ng cng kha v vect kh i ng cho c m t ha v gi i m t ha d li u. Tuy nhin, ch c kha l c n ph i c gi b m t, b n c th lu tr hay g i vect kh i ng cng v i d li u - c-m t-ha.

446 Chng 14: M t m

Kha cho m i l p d n xu t t SymmetricAlgorithm c th c truy xu t thng qua thu c tnh Key, v vect kh i ng c th c truy xu t thng qua thu c tnh IV. Cch n gi n nh t v t l i nh t t o kha v vect kh i ng m i l l p t t o chng gim b n. Sau khi t o m t i t ng gi i thu t i x ng, n u b n khng thi t l p cc thu c tnh Key v IV cho n, i t ng ny s t ng t o ra cc gi tr m i ngay khi b n cho g i m t thnh vin c s d ng cc gi tr Key v IV. M t khi c thi t l p, i t ng gi i thu t i x ng s ti p t c s d ng cc gi tr Key v IV ny. thay i gi tr c a Key v IV, b n c th gn tr c ti p cc gi tr m i ho c g i phng th c GenerateKey v GenerateIV (bu c i t ng gi i thu t i x ng t o ra cc gi tr ng u nhin m i). B n khng th tr c ti p th c hi n m t ha v gi i m t ha v i m t i t ng gi i thu t i x ng. M t khi t o v c u hnh i t ng gi i thu t i x ng, b n ph i g i phng th c CreateEncryptor hay CreateDecryptor c a n thu l y m t i t ng c hi n th c giao di n System.Security.Cryptography.ICryptoTransform. K , b n c th s d ng cc m t ha v gi i m t ha d li u. Tuy phng th c c a i t ng ICryptoTransform ny nhin, i t ng ICryptoTransform yu c u b n truy n d li u theo t ng kh i (c kch th c c nh) v l p (b ng tay) kh i d li u cu i cng v kh i ny t khi c kch th c ng. Giao di n ICryptoTransform khng qu kh s d ng, nhng khng m y thn thi n; do v y .NET Framework km thm l p System.Security.Cryptography.CryptoStream. y l l p d n xu t t System.IO.Stream, dng n gi n ha vi c m t ha v gi i m t ha d li u c c t cc i t ng Stream khc. L p ny cho php b n m t ha v gi i m t ha d li u t cc file v cc k t n i m ng m t cch d dng b ng m t m hnh x l quen thu c, v n cung c p cho b n t t c cc ti n ch quen thu c khi truy xu t d li u d a-vo-Stream. Phng th c kh i d ng c a CryptoStream yu c u ba i s : m t Stream n m d i, m t th hi n c a ICryptoTransform, v m t gi tr thu c ki u li t k System.Security.Cryptography.CryptoStreamMode. Gi tr CryptoStreamMode cho bi t ch c a i t ng CryptoStream m i; cc gi tr h p l l Read v Write. Khi b n g i phng th c Read hay Write c a CryptoStream, CryptoStream s s d ng th hi n ICryptoTransform m t ha v gi i m t ha d li u ang truy n qua CryptoStream. i t ng CryptoStream b o m kch th c kh i dng cho th hi n ICryptoTransform lun ng. C u hnh c a m t i t ng CryptoStream c tnh linh ho t cao, nhng c th hi kh hi u. B ng 14.4 m t ho t ng c a m t i t ng CryptoStream d a trn ch c a CryptoStream v ki u th hi n ICryptoTransform c s d ng trong phng th c kh i d ng c a CryptoStream.
B ng 14.4 Ho t
Ch c a CryptoStream

ng c a

i t ng CryptoStream
M t

Ch th c a ICryptoTransform

Read

M t ha Gi i m t ha M t ha

Stream

n m

d i

ch a

CryptoStream.Read ghi ciphertext ra b

plaintext ngu n. m xu t.

Read

Stream n m d i ch a ciphertext ngu n. CryptoStream.Read ghi plaintext ra b m xu t. CryptoStream.Write ch nh plaintext c n m t ha. Stream n m d i nh n ciphertext - c-m t-ha.

Write

447 Chng 14: M t m CryptoStream.Write ch nh ciphertext c n gi i m t ha. Stream n m d i nh n plaintext - c-gi im t-ha.

Write

Gi i m t ha

L p SymmetricEncryptionExample d i y trnh by cch s d ng gi i thu t Triple DES m t ha m t file v r i gi i m t ha file . Phng th c Main nh n tn c a file c n m t ha lm i s dng l nh. Tr c tin, n s t o kha v vect kh i ng; sau , g i phng th c EncryptFile, k ti p l phng th c DecryptFile, v sinh ra hai file: file th nh t ch a phin b n - c-m t-ha c a file ngu n, file th hai ch a phin b n - c-gi i-m t-ha c a file - c-m t-ha (gi ng file ngu n).
using System; using System.IO; using System.Security.Cryptography; public class SymmetricEncryptionExample { public static void Main(string[] args) { // T o m t gi i thu t Triple DES m i thu l y kha dng cho // v d ny. Kha ny s c dng chung trong cc phng th c // EncryptFile v DecryptFile. Bnh th ng, kha c // th a thu n gi a ng i g i v ng i nh n, ho c c g i // (b i ng i g i) cng v i file - c-m t-ha. byte[] key; byte[] iv; using(SymmetricAlgorithm alg = SymmetricAlgorithm.Create("3DES")){ key = alg.Key; iv = alg.IV; } // M t ha file. Ti n t "encrypted" s c thm vo tn file // ngu n v c s d ng lm tn c a file - c-m t-ha. EncryptFile(args[0], "encrypted"+args[0], (byte[])key.Clone(), (byte[])iv.Clone()); // Gi i m t ha file - c-m t-ha. Ti n t "decrypted" s c // thm vo tn file g c v c s d ng lm tn c a file // - c-gi i-m t-ha. DecryptFile("encrypted"+args[0], "decrypted"+args[0], key, iv); } // Phng th c dng m t ha m t file (b ng gi i thu t Triple DES) // v i key v iv cho tr c. private static void EncryptFile(string srcFileName, string destFileName, byte[] key, byte[] iv) { // T o cc stream truy xu t file ngu n v file ch. Stream srcFile = new FileStream(srcFileName, FileMode.Open, FileAccess.Read); Stream destFile = new FileStream(destFileName, FileMode.Create, FileAccess.Write); // T o m t gi i thu t Triple DES m i using(SymmetricAlgorithm alg = m t ha file.

448 Chng 14: M t m SymmetricAlgorithm.Create("3DES")){ // C u hnh thu c tnh Key v IV c a gi i thu t. alg.Key = key; alg.IV = iv; // T o m t CryptoStream m t ha n i dung c a // Stream ngu n khi n c c. G i phng th c // CreateEncryptor c a SymmetricAlgorithm // nh n th hi n ICryptoTransform v // truy n n cho CryptoStream. CryptoStream cryptoStream = new CryptoStream(srcFile, alg.CreateEncryptor(), CryptoStreamMode.Read); // Khai bo b m dng c d li u t file ngu n // thng qua CryptoStream v ghi n ra file ch. int bufferLength; byte[] buffer = new byte[1024]; // c file ngu n (t ng kh i 1024 byte) v ghi phin b n // - c-m t-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 li u b m t. destFile.Flush(); Array.Clear(key,0,key.Length); Array.Clear(iv,0,iv.Length); cryptoStream.Clear(); cryptoStream.Close(); srcFile.Close(); destFile.Close(); } } // Phng th c dng gi i m t ha m t file - c-m t-ha b ng // gi i thu t Triple DES v i key v iv cho tr c. private static void DecryptFile(string srcFileName, string destFileName, byte[] key, byte[] iv) { // T o cc stream truy xu t file ngu n v file ch. Stream srcFile = new FileStream(srcFileName, FileMode.Open, FileAccess.Read); Stream destFile = new FileStream(destFileName, FileMode.Create, FileAccess.Write); // T o m t gi i thu t Triple DES m i using(SymmetricAlgorithm alg = SymmetricAlgorithm.Create("3DES")){ gi i m t ha file.

// C u hnh thu c tnh Key v IV c a gi i thu t. alg.Key = key; alg.IV = iv; // T o m t CryptoStream gi i m t ha n i dung c a d li u // - c-m t-ha khi n c ghi. G i phng th c // CreateDecryptor c a SymmetricAlgorithm nh n th hi n // ICryptoTransform v truy n n cho CryptoStream.

449 Chng 14: M t m CryptoStream cryptoStream = new CryptoStream(destFile, alg.CreateDecryptor(), CryptoStreamMode.Write); // Khai bo b m dng c d li u t file - c// m t-ha v ghi ra file ch thng qua CryptoStream. int bufferLength; byte[] buffer = new byte[1024]; // c file - c-m t-ha (t ng kh i 1024 byte) v ghi // phin b n - c-gi i-m t-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 li u b m t. cryptoStream.FlushFinalBlock(); Array.Clear(key,0,key.Length); Array.Clear(iv,0,iv.Length); cryptoStream.Clear(); cryptoStream.Close(); srcFile.Close(); destFile.Close(); } } }

14.7

Truy li kha i xng t password


ng i dng ch c n nh t o kha i

B n c n t o m t kha i x ng t m t password password v khng c n lu tr kha.

S d ng l p System.Security.Cryptography.PasswordDeriveBytes x ng t chu i password.

Hi m c ng i no nh c gi tr c a m t kha i x ng, v khng th c t khi b t ng i dng nh p cc s di nh th b ng tay. i u ny ngha l kha ph i c lu tr m t d ng an ton sao cho ng d ng c th truy xu t c (trong smart card, a m m, c s d li u hay file). V n lin quan v i vi c c p, phn b , truy xu t, v lu tr kha l m t trong nh ng m t kh nh t trong qu trnh hi n th c b t k gi i php m t m no (v n ny c quy chung v qu n l kha). Khi c n ghi nh m t b m t (kha), b n khng ch lo b o v d li u m cn ph i lo b o v cc b m t dng b o v d li u! M t cch lu tr kha l c p cho ng i dng m t password d nh hn v s d ng m t giao th c truy l i kha (key derivation protocol) t o m t kha i x ng t password. Theo , m i khi c n m t ha hay gi i m t ha d li u, ng i dng ch c n nh p password v my tnh s t o ra kha (n u ng i dng nh p cng password, giao th c ny s t o ra cng kha). Truy l i kha t nh ng t hay nhm t d nh lm gi m ng k tnh ng u nhin c a kha, d n n gi m tnh b o m t c c p b i nh ng hm m t m c s d ng kha . Trong tr ng h p t i t nh t, hacker c th on c password, v crack d li u c a b n thng qua vi c gi i m m t m (cryptanalysis).

450 Chng 14: M t m

Th vi n l p .NET Framework c m t hi n th c truy l i kha i x ng: PasswordDeriveBytes. L p ny s d ng m t gi i thu t bm c p d ng l p i l p l i cho m t password t o ra m t kha v i chi u di nh mong mu n. Khi c u hnh m t i t ng PasswordDeriveBytes, b n c th ch nh tn gi i thu t bm cng nh s l n l p (m c nh, SHA-1 c p d ng 100 l n). Ngoi ra, b n cng c n cung c p gi tr salt. Salt l d li u ng u nhin m qu trnh truy l i kha s s d ng lm cho kha tm c tr nn b n v ng hn i v i cc d ng t n cng b ng m t m. B n khng c n gi b m t cho gi tr salt; b n ph i lu tr v s d ng n khi truy l i kha t password sau ny (n u khng c gi tr salt ng, b n s khng th truy l i kha ng v khng th gi i m t ha c). B n khng th t o kha b t i x ng b ng giao th c truy l i kha. Gi i thu t m t ha b t i x ng (asymmetric encryption) d a vo cc m i lin h ton c th gi a cc thnh ph n kha cng khai (public key) v kha ring (private key). Nh th , m i gi i thu t m t ha b t i x ng yu c u b n ph i tun theo m t quy trnh ring c th t o ra cc kha m i. V d d i y trnh by cch s d ng l p PasswordDeriveBytes t o m t kha i x ng g m 64 bit t m t chu i password. V d ny yu c u hai i s dng l nh: tn gi i thu t bm v password (tn c a cc gi i thu t bm c li t k trong b ng 14.1).
using System; using System; using System.Security.Cryptography; public class DerivedKeyExample { public static void Main(string[] args) { // S d ng m t b t o s ng u nhin t o gi tr byte[] salt = new byte[8]; RandomNumberGenerator.Create().GetBytes(salt); salt.

// T o m t i t ng PasswordDeriveBytes t o kha t // password. C n cung c p password ngu n (l i s dng // l nh th hai) v salt. PasswordDeriveBytes pdb = new PasswordDeriveBytes(args[1], salt); // Thi t l p gi i thu t bm dng t o kha, tn // gi i thu t c ch nh trong i s dng l nh th // Gi i thu t c s d ng m c nh l SHA-1. pdb.HashName = args[0]; nh t.

// Thi t l p s l n l p l 200 ( y l s l n gi i thu t bm // c p d ng cho password t o kha). M c nh l 100. pdb.IterationCount = 200; // T o m t kha g m 8 byte (64 bit) t password. // Chi u di c a kha b gi i h n b i chi u di c a // m bm - 160 bit i v i SHA-1. byte[] key = pdb.GetBytes(8); // Hi n th kha v salt. Console.WriteLine("Key = {0}", BitConverter.ToString(key)); Console.WriteLine("Salt = {0}", BitConverter.ToString(salt)); } }

451 Chng 14: M t m

Ch y l nh DerivedKeyExample SHA1 S0meVereeStr@ngeP@$$w0rd (s d ng gi i thu t bm SHA-1 truy l i m t kha g m 8 byte t chu i "S0meVereeStr@ngeP@$$w0rd") s sinh ra k t xu t tng t nh sau:
Key = 53-72-74-5B-A4-88-A4-80 Salt = 70-82-79-F4-3B-F9-DF-D2

Ch r ng, m i khi b n ch y cng m l do tc d ng c a salt. N u b n b i m trong o n m trn), sau bin v d ny lun t o ra cng m t kha v

t l nh, DerivedKeyExample sinh ra kha khc nhau. dng l nh gn m t gi tr ng u nhin vo salt ( c in d ch l i v ch y DerivedKeyExample, b n s nh n th y i m t password cho tr c.

14.8
Th

Gi mt b mt bng php mt ha bt i xng


i x ng (asymmetric encryption) g i m t b

B n c n s d ng php m t ha b t m t.

hi n ha l p gi i thu t b t i x ng System.Security.Cryptography. RSACryptoServiceProvider. S d ng phng th c RSACryptoServiceProvider. Encrypt v kha cng khai (public key) c a ng i nh n m t ha thng i p. Sau o, ng i nh n s s d ng phng th c RSACryptoServiceProvider.Decrypt v kha ring (private key) gi i m t ha b m t - c-m t-ha. .NET Framework nh ngha m t h th ng phn c p theo l p cho cc gi i thu t b t i x ng tng t nh nh ngha cho cc gi i thu t i x ng ( c th o lu n trong m c 14.6). T t c cc gi i thu t b t i x ng ph i th a k m t l p c s tr u t ng chung c tn l System.Security.Cryptography.AsymmetricAlgorithm. C hai hi n th c gi i thu t b t i x ng c th :
System.Security.Cryptography.RSACryptoServiceProvider System.Security.Cryptography.DSACryptoServiceProvider

V c ui l CryptoServiceProvider nn c hai l p ny u b c l y cc ch c nng do Win32 CryptoAPI cung c p. Tuy nhin, ch c l p RSACryptoServiceProvider l h tr vi c m t ha d li u. L p DSACryptoServiceProvider hi n th c Digital Signature Algorithm (DSA), b n c th s d ng gi i thu t ny ch t o ch k s (xem Federal Information Processing bi t thm chi ti t v DSA). Standard [FIPS] 186-2 t i [http://www.itl.nist.gov/fipspubs] M c d b n c th t o m t i t ng gi i thu t b t i x ng b ng phng th c tnh Create c a l p c s AsymmetricAlgorithm, nhng b l i b n s ph i tr gi cht t cho vi c ny. L p AsymmetricAlgorithm khng khai bo cc phng th c m RSACryptoServiceProvider s d ng m t ha v gi i m t ha d li u. Thay vo , b n ph i tr c ti p th hi n ha l p RSACryptoServiceProvider b ng m t trong cc phng th c kh i d ng c a n. Tr c khi m t ha hay gi i m t ha d li u v i i t ng RSACryptoServiceProvider, b n c n truy xu t cc kha thch h p. Kha c a gi i thu t b t i x ng khc nhi u so v i kha c a gi i thu t i x ng. Th nh t, n c hai thnh ph n: kha cng khai (public key) v kha ring (private key). Th hai, thay v ch l m t dy cc byte c sinh ng u nhin, kha b t i x ng c t o theo m t cch th c c bi t. C m t m i quan h ton c bi t gi a kha cng khai v kha ring; m i quan h ny cho php gi i thu t b t i x ng m t ha d li u

452 Chng 14: M t m

b ng m t kha v gi i m t ha d li u b ng m t kha khc. M i gi i thu t b t i x ng s d ng cch th c t o kha c a chnh n, v cc l p hi n th c c th ng gi cc ch c nng c n thi t t o ra cc kha m i. Kha cng khai khng c n c gi b m t v ch s h u c th ty g i n cho b n thng qua e-mail, ho c post n ln m t website hay m t server phn ph i kha m i ng i cng th y. Nh ng ai mu n g i b m t th s d ng kha cng khai m t ha b m t. Sau , ng i nh n s d ng kha ring gi i m t ha b m t. Kha ring ph i c gi b m t; nh ng ai s h u kha ring u c th gi i m t ha d li u - c-m t-ha b ng kha cng khai. t o m t b m t c-m t-ha-b t- i-x ng, b n ph i c kha cng khai c a ng i nh n v n p n vo m t i t ng RSACryptoServiceProvider. C hai cch n p kha cng khai: S d ng phng th c RSACryptoServiceProvider.ImportParameters nh p m t c u trc System.Security.Cryptography.RSAParameters, c u trc ny ch a thng tin kha cng khai c a ng i nh n. Ch s h u c th t o c u trc RSAParameters b ng phng th c RSACryptoServiceProvider.ExportParameters v g i n cho b n. Tuy nhin, ng i ny c th g i cho b n kha cng khai d ng byte, v b n ph i t n p gi tr ny vo c u trc RSAParameters. S d ng phng th c RSACryptoServiceProvider.FromXmlString n p d li u kha cng khai t m t chu i XML. Ch s h u c th t o d li u XML ny b ng phng th c RSACryptoServiceProvider.ToXmlString v g i n cho b n. C v ToXmlString c a l p u nh n m t i s lu n l, n u l true, i t ng RSACryptoServiceProvider s xu t c kha cng khai v kha ring. B n ch nh gi tr ny l false khi c n xu t kha cho m c ch phn ph i hay lu tr .
ExportParameters RSACryptoServiceProvider

phng

th c

M t khi n p kha cng khai c a ng i nh n vo i t ng RSACryptoServiceProvider, b n c th m t ha d li u. Gi i thu t b t i x ng ch m hn gi i thu t i x ng khi m t ha v gi i m t ha d li u. V l do ny, b n khng nn s d ng gi i thu t b t i x ng m t ha l ng d li u l n. Thng th ng, n u c n m t ha l ng d li u l n, b n nn s d ng gi i thu t i x ng v r i m t ha kha i x ng b ng gi i thu t b t i x ng b n c th g i kha i x ng cng v i d li u. M c 14.10 s th o lu n v v n ny. b o m tnh nh t qun trong vi c s d ng, l p RSACryptoServiceProvider khng h tr m hnh m t ha v gi i m t ha d a-trn-System.IO.Stream ( c s d ng trong m c 14.6). m t ha d li u v i i t ng RSACryptoServiceProvider, b n hy g i phng th c
Encrypt, truy n cho n m t m ng byte ch a plaintext; Encrypt s tr v m t m ng byte ch a

ciphertext. Phng th c Encrypt cng mh n m t i s lu n l cho bi t ki u padding m i t ng RSACryptoServiceProvider s s d ng. Padding cho bi t i t ng b t i x ng s x l plaintext nh th no tr c khi m t ha. Padding b o m gi i thu t b t i x ng khng c n x l t ng kh i d li u, v b o v ciphertext i v i cc d ng t n cng b ng m t m. Di n gi i cc d ng padding v t qu ph m vi c a quy n sch ny. Ni chung, n u ang s d ng Microsoft Windows XP tr v sau, b n nn ch nh i s padding l true; n u khng, b n ph i ch nh i s padding l l false (n u khng th Encrypt s nm ngo i l System.Security.Cryptography.CryptographicException). Gi i m t ha d li u cng n gi n nh m t ha d li u. Ng i nh n c n t o m t i t ng RSACryptoServiceProvider v n p n cng v i kha ring. Thng th ng, kha ny s c

453 Chng 14: M t m

lu tr trong m t kho ch a kha (key container) do CryptoAPI qu n l (s c th o lu n k hn trong m c 14.9). Ng i nh n g i RSACryptoServiceProvider.Decrypt v truy n cho n ciphertext m b n g i. Ng i nh n ph i ch nh c ch padding, v n cng ph i gi ng nh khi m t ha d li u. Phng th c Decrypt tr v m t m ng byte ch a plaintext - cgi i-m t-ha. N u plaintext m t m t chu i, ng i nh n ph i chuy n m ng byte thnh gi tr chu i thch h p b ng l p System.Text.Encoding. L p RSACryptoServiceProvider th a k cc phng th c c tn l EncryptValue v DecryptValue t l p cha c a n l System.Security.Cryptography.RSA. L p RSACryptoServiceProvider khng hi n th c cc phng th c ny v nm ngo i l System.NotSupportedException n u b n g i chng. L p
AsymmetricEncryptionExample RSACryptoServiceProvider

d i y trnh by cch m t ha m t chu i v r i gi i m t ha:

d ng

l p

using System; using System.Text; using System.Security.Cryptography; public class AsymmetricEncryptionExample { public static void Main(string[] args) { // Khai bo m t bi n RSAParameters, bi n ny s // thng tin PUBLIC KEY c a ng i nh n. RSAParameters recipientsPublicKey; ch a

// Khai bo m t bi n CspParameters, bi n ny s cho bi t // PRIVATE KEY c lu tr trong kho ch a kha no. // Thng th ng, ch c ng i nh n m i c th truy xu t // thng tin ny. V i m c ch minh h a, chng ta s t o // m t c p kha ngay u v d v s d ng cc kha ny // cho c bn g i v bn nh n. CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = "MyKeys"; // T o c p kha b t i x ng b ng l p RSACryptoServiceProvider. // Lu cc kha ny vo m t kho ch a kha c tn l "MyKeys" // v trch thng tin PUBLIC KEY vo bi n recipientsPublicKey. using (RSACryptoServiceProvider rsaAlg = new RSACryptoServiceProvider(cspParams)) { // C u hnh cho gi i thu t lu kha vo kho ch a kha. rsaAlg.PersistKeyInCsp = true; // Trch PUBLIC KEY. recipientsPublicKey = rsaAlg.ExportParameters(false); } // Hi n th thng i p plaintext g c. Console.WriteLine("Original message = {0}", args[0]); // Chuy n thng i p g c thnh m ng byte. T t nh t l khng // truy n cc thng tin b m t d ng chu i gi a cc phng th c. byte[] plaintext = Encoding.Unicode.GetBytes(args[0]); // M t ha thng i p b ng phng th c EncryptMessage. // Phng th c ny c n PUBLIC KEY c a ng i nh n. byte[] ciphertext = EncryptMessage(plaintext,

454 Chng 14: M t m recipientsPublicKey); // Hi n th ciphertext do phng th c EncryptMessage tr v . // S d ng phng th c BitConverter.ToString method cho n gi n // m c d n chn d u g ch n i (-) vo gi a cc gi tr byte // (khng ng v i bi u di n d li u trong b nh ). Console.WriteLine("Formatted Ciphertext = {0}", BitConverter.ToString(ciphertext)); // Gi i m t ha thng i p ( - c-m t-ha) b ng phng th c // DecryptMessage. Phng th c ny c n truy xu t PRIVATE KEY // c a ng i nh n (ch c ng i nh n m i c th truy xu t c). // Chng ta s truy n cho n m t i t ng CspParameters // (cho bi t PRIVATE KEY c lu tr trong kho ch a kha no). // Gi i php ny an ton hn l truy n PRIVATE KEY th // gi a cc phng th c. byte[] decData = DecryptMessage(ciphertext, cspParams); // Chuy n thng i p - c-gi i-m t-ha t m ng byte // thnh chu i v hi n th n ra c a s Console. Console.WriteLine("Decrypted message = {0}", Encoding.Unicode.GetString(decData)); // Nh n Enter k t thc. Console.ReadLine(); } // Phng th c dng m t ha (theo RSA) m t thng i p b ng // PUBLIC KEY (n m trong m t c u trc RSAParameters). private static byte[] EncryptMessage(byte[] plaintext, RSAParameters rsaParams) { // Khai bo m ng byte ch a ciphertext. byte[] ciphertext = null; // T o m t th hi n c a gi i thu t RSA. using (RSACryptoServiceProvider rsaAlg = new RSACryptoServiceProvider()) { rsaAlg.ImportParameters(rsaParams); // M t ha plaintext b ng OAEP padding // (ch c h tr trn Windows XP tr v sau). ciphertext = rsaAlg.Encrypt(plaintext, true); } // Xa cc gi tr c gi trong m ng byte ch a plaintext. // i u ny b o m d li u b m t khng cn trong b nh // sau khi b n gi i phng tham chi u n n. Array.Clear(plaintext, 0, plaintext.Length); return ciphertext; } // Phng th c dng gi i m t ha m t thng i p ( - c-m t-ha// theo-RSA) b ng PRIVATE KEY (do i t ng CspParameters ch nh). private static byte[] DecryptMessage(byte[] ciphertext, CspParameters cspParams ) { // Khai bo m ng byte ch a plaintext ( - c-gi i-m t-ha). byte[] plaintext = null; // T o m t th hi n c a gi i thu t RSA.

455 Chng 14: M t m using (RSACryptoServiceProvider rsaAlg = new RSACryptoServiceProvider(cspParams)) { // Gi i m t ha plaintext b ng OAEP padding. plaintext = rsaAlg.Decrypt(ciphertext, true); } return plaintext; } }

L nh AsymmetricEncryptionExample "I love you!" s sinh ra k t xu t 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!

N u b n ch y v d ny nhi u l n v i cng thng i p v kha, ciphertext s khc nhau. l v c ch padding sinh ra d li u ng u nhin trnh cc d ng t n cng b ng m t m. M c d hi r c r i nhng y chnh l cch hnh x m ta mong i.

14.9

Lu tr kha bt i xng mt cch an ton


i x ng vo m t ni an ton ng d ng c a b n

B n c n lu tr c p kha b t c th truy xu t c d dng.

D a vo ch c nng lu tr kha do hai l p gi i thu t b t i x ng cung c p (RSACryptoServiceProvider v DSACryptoServiceProviderthu c khng gian tn System.Security.Cryptography). thu t b t i x ngRSACryptoServiceProvider v u b c l y cc ch c nng do CSP (Cryptographic Service Providerm t thnh ph n c a Win32 CryptoAPI) hi n th c. Ngoi cc d ch v nh m t ha, gi i m t ha, v ch k s , m i CSP cn cung c p m t kho ch a kha (key container).
DSACryptoServiceProvider

hai

l p

gi i

Kho ch a kha l vng lu tr dnh cho cc kha m CSP qu n l; CSP s d ng c ch b o m t c a h i u hnh v php m t ha m nh b o v n i dung c a kho ch a kha. Kho ch a kha cho php ng d ng d dng truy xu t kha m khng nh h ng n tnh b o m t c a kha. Khi g i cc hm c a m t CSP, ng d ng c n ch nh tn c a kho ch a kha v CSP s truy xu t cc kha c n thi t. V kha khng truy n t CSP n ng d ng nn ng d ng khng th lm h i tnh b o m t c a kha. L p RSACryptoServiceProvider v DSACryptoServiceProvider cho php b n c u hnh hi n th c CSP n m d i b ng m t th hi n c a l p System.Security.Cryptography. CspParameters. c u hnh cho m t i t ng RSACryptoServiceProvider hay DSACryptoServiceProvider s d ng m t kho ch a kha c th , b n ph i hon t t cc b c d i y:

456 Chng 14: M t m

1. 2. 3.

T om t

i t ng CspParameters.

Thi t l p tr ng KeyContainerName c a i t ng CspParameters l m t gi tr chu i m t tn c a kho ch a kha c n s d ng; chu i c th ch a kho ng tr ng. T o m t i t ng RSACryptoServiceProvider hay DSACryptoServiceProvider, v truy n i t ng CspParameters lm i s cho phng th c kh i d ng.

N u kho ch a kha t n t i bn trong t m v c c a CSP v ch a cc kha thch h p, CSP s s d ng cc kha ny khi th c hi n cc thao tc m t m. N u kho ch a kha hay kha khng t n ng t o kha m i. bu c CSP lu tr cc kha m i c t o vo kho ch a t i, CSP s t kha, b n ph i thi t l p thu c tnh PersistKeyInCsp (c a i t ng RSACryptoServiceProvider hay DSACryptoServiceProvider) l true. Phng th c LoadKeys d i y l m t o n trch trong file StoreAsymmetricKeyExample.cs (xem a CD nh km). LoadKeys t o m t i t ng RSACryptoServiceProvider v c u hnh cho n s d ng m t kho ch a kha c tn l MyKeys. B ng cch ch nh PersistKeyInCsp l true, gi i thu t s t ng lu tr cc kha m i c t o vo kho ch a kha ny.
// Phng th c ny t o m t i t ng RSACryptoServiceProvider // v n p cc kha t m t kho ch a kha n u chng t n t i; n u khng, // RSACryptoServiceProvider s t ng t o cc kha m i v lu // chng vo kho ch a kha s d ng sau ny. public static void LoadKeys(string container) { // T o m t i t ng CspParameters v thi t l p tr ng // KeyContainerName l tn c a kho ch a kha. System.Security.Cryptography.CspParameters cspParams = new System.Security.Cryptography.CspParameters(); cspParams.KeyContainerName = container; // T o m t i t ng gi i thu t RSA v truy n i t ng // CspParameters lm i s trong phng th c kh i d ng. using (System.Security.Cryptography.RSACryptoServiceProvider rsaAlg = new System.Security.Cryptography.RSACryptoServiceProvider(cspParams)){ // C u hnh cho i t ng RSACryptoServiceProvider // lu tr kha vo kho ch a kha. rsaAlg.PersistKeyInCsp = true; // Hi n th PUBLIC KEY. System.Console.WriteLine(rsaAlg.ToXmlString(false)); } }

L p RSACryptoServiceProvider v DSACryptoServiceProvider khng cung c p phng th c no tr c ti p g b kho ch a kha. xa cc kha c lu tr , b n hy thi t l p gi tr c a PersistKeyInCsp l false v g i phng th c Clear hay Dispose c a i t ng RSACryptoServiceProvider hay DSACryptoServiceProvider. Phng th c DeleteKeys d i y s trnh by k thu t ny:
// Phng th c ny t o m t i t ng RSACryptoServiceProvider // v xa cc kha hi n c kh i kho ch a kha. public static void DeleteKeys(string container) { // T o m t i t ng CspParameters v thi t l p tr ng // KeyContainerName l tn c a kho ch a kha c n xa.

457 Chng 14: M t m System.Security.Cryptography.CspParameters cspParams = new System.Security.Cryptography.CspParameters(); cspParams.KeyContainerName = container; // T o m t i t ng gi i thu t RSA v truy n i t ng // CspParameters lm i s trong phng th c kh i d ng. using (System.Security.Cryptography.RSACryptoServiceProvider rsaAlg = new System.Security.Cryptography.RSACryptoServiceProvider(cspParams)){ // C u hnh cho i t ng RSACryptoServiceProvider // khng lu tr kha vo kho ch a kha. rsaAlg.PersistKeyInCsp = false; // Hi n th PUBLIC KEY. V chng ta g i Dispose() // sau l i g i ny nn cc kha hi n c s khng thay // cho n khi phng th c c g i l n th hai. System.Console.WriteLine(rsaAlg.ToXmlString(false)); // // // // // } } i

V m l nh n m trong kh i "using" nn Dispose c g i trn i t ng RSACryptoServiceProvider. V i t ng ny c c u hnh l khng lu tr kha nn kho ch a kha s b xa. Thay v g i Dispose(), g i rsaAlg.Clear() s c cng tc d ng, v n gin ti p g i Dispose().

Win32 CryptoAPI h tr c user-key-store v machine-key-store. H i u hnh Windows b o m m t user-key-store ch c th c truy xu t b i ng i t o ra n, nhng m t machinekey-store c th c truy xu t b i b t k ng i dng no c a my. Theo m c nh, l p RSACryptoServiceProvider v DSACryptoServiceProvider s s d ng user-key-store. B n c th ch nh s d ng machine-key-store b ng cch thi t l p thu c tnh tnh UseMachineKeyStore c a l p RSACryptoServiceProvider hay DSACryptoServiceProvider l true. i u ny s c tc d ng v i t t c m l nh ang ch y trong mi n ng d ng hi n hnh. N u mu n ki m sot ch t ch hn, b n c th thi t l p thu c tnh CspParameters.Flags l gi tr System.Security.Cryptography.CspProviderFlags.UseMachineKeyStore tr c khi t o i t ng m t ha b t i x ng. B n nn xt cc yu c u b o m t m t cch c n th n tr c khi ch n s d ng machine-key-store. Th c t l ng i dng no c quy n truy xu t my u c th ginh c quy n truy xu t cc kha trong kho lu tr , i u ny ph nh h u h t cc l i ch do php m t ha b t i x ng mang l i.

14.10 Trao i kha phin i xng mt cch an ton


B n c n trao php an ton S i d li u - c-m t-ha- i-x ng v i ai , v b n c n m t bi n phn b kha phin (session key) i x ng cng v i d li u. trao i kha do l p System.Security.Cryptography. i x ng s c m t ha b t i x ng b ng kha cng khai (public key) c a ng i nh n. Theo , b n c th g i kha i x ng - c-m t-ha cng v i d li u - c-m t-ha. Ng i nh n ph i gi i m t ha kha i x ng b ng kha ring (private key), r i m i ti n hnh gi i m t ha d li u.
RSACryptoServiceProvider hi n th c. Theo c ch ny, kha

d ng c ch

458 Chng 14: M t m

M i khi m t ha d li u (b ng gi i thu t i x ng) chuy n giao, b n nn t o m t kha m i, c g i l kha phin (session key). S d ng kha phin c hai l i ch chnh: N u ai (khng c php) l y c nhi u kh i ciphertext c m t ha b ng cng m t kha i x ng, kh nng ng i gi i c d li u s tng cao. N u ai tm c kha phin c a b n, ng i ny ch c th truy xu t c m t t p d li u no - c-m t-ha, ch khng ph i t t c cc b m t c a b n qu kh v tng lai.

V n i v i kha phin l phn b v b o m t kha. M t gi i php l th a thu n m t l ng l n kha phin v i nh ng ng i m b n c n trao i d li u v i h . Th t khng may, vi c ny nhanh chng tr nn kh qu n l; v th c t l t t c cc kha c a b n trong tng lai u c lu tr t i m t ni no , i u ny tng kh nng chng s b xm h i. Cch t t hn l g i kha phin theo m t d ng c m t ha m nh cng v i d li u m b n m t ha v i kha qu trnh ny c g i l trao i kha (key exchange). Qu trnh trao i kha s d ng php m t ha b t i x ng m t ha kha phin i x ng. N u mu n g i d li u cho ai , b n t o m t kha phin i x ng, m t ha d li u, v r i m t ha kha phin b ng kha cng khai c a ng i nh n. Khi nh n c d li u, ng i nh n gi i m t ha kha phin b ng kha ring c a h , v r i gi i m t ha d li u. Quan tr ng l vi c trao i kha cho php b n trao i cc l ng d li u l n ( - c-m t-ha) v i b t c ai, th m ch nh ng ng i b n cha t ng ti p xc tr c y, mi n l b n c th truy xu t kha cng khai i x ng c a h . M t cch l t ng, b n s d ng m t gi i thu t b t i x ng m t ha t t c d li u, nh th trnh c nhu c u trao i cc kha i x ng. Tuy nhin, t c c a cc gi i thu t b t i x ng khi m t ha v gi i m t ha d li u khi n chng khng th c t cho vi c s d ng v i cc l ng l n d li u. S d ng cc gi i thu t b t i x ng m t ha cc kha phin i x ng l m t gi i php tuy ph c t p hn, nhng l t t nh t c hai m t: tnh linh ho t v tnh nhanh chng. Th vi n l p .NET Framework h tr vi c trao i kha ch v i gi i thu t RSA, nhng b n ph i l a ch n gi a hai formatting scheme: Optimal Asymmetric Encryption Padding (OAEP) v PKCS #1 v 1.5. Bn v cc formatting scheme ny v t qu ph m vi c a quy n sch ny. Ni chung, b n nn s d ng OAEP formatting tr khi b n c nhu c u giao ti p v i m t h th ng c c s d ng PKCS formatting. Hai l p d i y hi n th c c ch trao i kha, m i c ch ng v i m t formatting scheme:
System.Security.Cryptography.RSAOAEPKeyExchangeFormatter System.Security.Cryptography.RSAPKCS1KeyExchangeFormatter

chu n b m t kha i x ng dng cho trao i, b n ph i t o m t i t ng formatter v i ki u nh mong mu n v r i n nh m t i t ng gi i thu t b t i x ng (RSACryptoServiceProvider) cho formatter b ng phng th c SetKey c a formatter. B n ph i c u hnh cho gi i thu t b t i x ng s d ng kha cng khai c a ng i nh n. Khi c u hnh xong, g i phng th c CreateKeyExchange c a formatter v truy n m t m ng byte ch a kha phin i x ng m b n c n nh d ng. Phng th c CreateKeyExchange tr v m t m ng byte ch a d li u b n s g i i.

459 Chng 14: M t m

Gi i nh d ng cho kha ng c v i qu trnh v i m t formatting scheme.

nh d ng. C hai l p deformatter, m i l p ng

System.Security.Cryptography.RSAOAEPKeyExchangeDeformatter System.Security.Cryptography.RSAPKCS1KeyExchangeDeformatter

gi i nh d ng m t kha phin c nh d ng, hy t o m t i t ng deformatter v i n nh m t i t ng gi i thu t b t i ki u ph h p r i g i phng th c SetKey c a n x ng. B n ph i n p kha ring c a b n vo gi i thu t b t i x ng. Cu i cng, g i phng th c DecryptKeyExchange v i i s l d li u trao i. Phng th c ny tr v m t m ng byte ch a kha phin i x ng g c. File KeyExchangeExample.cs ch a v d minh h a cho vi c trao i kha. Phng th c Main m ph ng vi c t o, nh d ng, trao i, v gi i nh d ng m t kha phin i x ng. N s t o m t c p kha b t i x ng s d ng cho c v d ny. Th c t , ng i g i (ng i t o kha i x ng) ch c kha cng khai c a ng i nh n; ng i nh n c kha ring ( c gi b m t). Cng nh nn s d ng m t kha i x ng c chi u di ph h p v i tnh b m t c a d li u ang c b o v , b n nn m t ha kha phin b ng m t gi i thu t b t i x ng v chi u di kha t nh t cng ph i tng ng v i kha i x ng. N u kha b t i x ng y u hn kha i x ng, c kh nng k t n cng s ph v gi i thu t b t i x ng v thu l y kha i x ng thay v c gi i m t ha d li u - c-m t-ha- i-x ng. Xem [http://www.ietf.org/rfc/rfc3766.txt] (c trong a CD nh km) bi t chi ti t v s tng ng gi a chi u di kha i x ng v b t i x ng. K , phng th c Main g i phng th c FormatKeyExchange v i i s l m t m ng byte ch a kha i x ng v m t i t ng RSAParameters ch a kha cng khai c a ng i nh n. Phng th c FormatKeyExchange tr v m t m ng byte ch a kha i x ng - c-m t-ha v - c- nh-d ng, chu n b g i i. K ti p, phng th c Main g i phng th c DeformatKeyExchange v i i s l d li u trao i c nh d ng v i t ng CspParameters ch a m t tham chi u n kho ch a kha MyKeys (ch a kha ring c a ng i nh n). Trong su t qu trnh ny, phng th c Main s hi n th kha phin g c, d li u trao i c nh d ng, v cu i cng l kha phin c gi i nh d ng.
using System; using System.Text; using System.Security.Cryptography; public class KeyExchangeExample { public static void Main() { // Khai bo m t bi n RSAParameters, bi n ny s // ch a thng tin PUBLIC KEY c a ng i nh n. RSAParameters recipientsPublicKey; // // // // // // Khai bo m t bi n CspParameters, bi n ny s cho bi t PRIVATE KEY c lu tr trong kho ch a kha no. Thng th ng, ch c ng i nh n m i c th truy xu t thng tin ny. V i m c ch minh h a, chng ta s t o m t c p kha ngay u v d v s d ng cc kha ny cho c bn g i v bn nh n.

460 Chng 14: M t m CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = "MyKeys"; // T o c p kha b t i x ng b ng l p RSACryptoServiceProvider. // Lu cc kha ny vo m t kho ch a kha c tn l "MyKeys" // v trch thng tin PUBLIC KEY vo bi n recipientsPublicKey. using (RSACryptoServiceProvider rsaAlg = new RSACryptoServiceProvider(cspParams)) { // C u hnh cho gi i thu t lu kha vo kho ch a kha. rsaAlg.PersistKeyInCsp = true; // Trch PUBLIC KEY. recipientsPublicKey = rsaAlg.ExportParameters(false); } // T o gi i thu t i x ng Triple-DES v s // kha c sinh t ng lm kha phin. using (SymmetricAlgorithm symAlg = SymmetricAlgorithm.Create("3DES")) { d ng

// Hi n th kha phin g c. Console.WriteLine("Session Key at Source = {0}\n\r", BitConverter.ToString(symAlg.Key)); // Chu n b kha phin i x ng dng cho trao i // (s d ng phng th c FormatKeyExchange, phng th c // ny c n kha dng m t ha v PUBLIC KEY // c a ng i nh n). byte[] exchangeData = FormatKeyExchange(symAlg.Key, recipientsPublicKey); // Hi n th kha phin - c-m t-ha (do phng th c // FormatKeyExchange tr v ). Console.WriteLine("Exchange Data = {0}\n\r", BitConverter.ToString(exchangeData)); // ****** G I KHA ****** // By gi , kha phin c th c g i // knh giao ti p bnh th ng. i b ng cc

// Trch kha phin t d li u trao i b ng // phng th c DeformatKeyExchange. byte[] sessionKey = DeformatKeyExchange(exchangeData, cspParams); // Hi n th kha phin v a c trch. Console.WriteLine("Session Key at Destination = {0}\n\r", BitConverter.ToString(sessionKey)); // Nh n Enter k t thc. Console.ReadLine(); } } // Phng th c dng m t ha v nh d ng kha phin i x ng. // m t ha kha phin, chng ta c n truy xu t PUBLIC KEY // c a ng i nh n (trong c u trc RSAParameters). private static byte[] FormatKeyExchange(byte[] sessionKey, RSAParameters rsaParams) {

461 Chng 14: M t m // T o m t gi i thu t b t i x ng RSA. using (RSACryptoServiceProvider asymAlg = new RSACryptoServiceProvider()) { // N p PUBLIC KEY c a ng i nh n. asymAlg.ImportParameters(rsaParams); // T o m t RSA OAEP formatter nh d ng d RSAOAEPKeyExchangeFormatter formatter = new RSAOAEPKeyExchangeFormatter(); // Ch nh gi i thu t RSA dng formatter.SetKey(asymAlg); li u trao i.

m t ha kha phin.

// M t ha v nh d ng kha phin r i tr v k t qu . return formatter.CreateKeyExchange(sessionKey); } } // Phng th c dng gi i m t ha d li u trao i v trch kha phin // i x ng. gi i m t ha d li u trao i, chng ta c n truy xu t // PRIVATE KEY (t kho ch a kha do i s cspParams ch nh). private static byte[] DeformatKeyExchange(byte[] exchangeData, CspParameters cspParams) { // T o m t gi i thu t b t i x ng RSA. using (RSACryptoServiceProvider asymAlg = new RSACryptoServiceProvider(cspParams)) { // T o m t RSA OAEP deformatter trch kha phin // t d li u trao i. RSAOAEPKeyExchangeDeformatter deformatter = new RSAOAEPKeyExchangeDeformatter(); // Ch nh gi i thu t RSA dng deformatter.SetKey(asymAlg); gi i m t ha d li u trao i.

// Gi i m t ha d li u trao i v tr v kha phin. return deformatter.DecryptKeyExchange(exchangeData); } } }

Ch y KeyExchangeExample s sinh ra k t xu t 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

462

Chng 15: KH NNG LIN TC M L NH KHNG C-QU N-L

15

463

464 Chng 15: Kh nng lin tc m l nh khng- c-qu n-l

icrosoft .NET Framework l m t n n c c k cao v ng, l s k t h p c a m t ngn ng m i (C#), m t b th c thi c-qu n-l (CLR), m t n n cho cc ng d ng Web (Microsoft ASP.NET), v m t th vi n l p r t l n xy d ng t t c cc ki u ng d ng. Tuy nhin, .NET Framework khng l p l i cc tnh nng c trong m l nh khng- c-qu n-l. Hi n th i, .NET Framework khng bao g m m i hm c trong Win32 API, trong khi nhi u doanh nghi p ang s d ng cc gi i php ph c t p c xy d ng v i cc ngn ng d a-trn-COM nh Microsoft Visual Basic 6 v Microsoft Visual C++ 6. May m n l Microsoft khng c nh ng doanh nghi p b i n n t ng m l nh m h xy d ng khi chuy n sang n n .NET. Thay vo , .NET Framework c trang b v i cc tnh nng interoperability (kh nng lin tc), cho php b n s d ng l i m l nh c (legacy code) trong cc ng d ng .NET Framework v truy xu t cc assembly .NET nh th chng l cc thnh ph n COM. Chng ny s th o lu n cc v n sau:

Cch g i cc hm thu c DLL khng- c-qu n-l (m c 15.1

n 15.5). n 15.8).

Cch s d ng thnh ph n COM trong ng d ng .NET Framework (m c 15.6 Cch s d ng i u ki m ActiveX trong ng d ng .NET Framework (m c 15.9).

Cch t o m t thnh ph n .NET sao cho m t COM-client c th s d ng n (m c 15.10).

15.1 Gi mt hm trong mt DLL khng-c-qun-l


B n c n g i m t hm C trong m t DLL. ho c do b n vi t. y c th l m t hm c a Win32 API Khai bo m t phng th c trong m C# m b n s s d ng truy xu t hm khng- c-qu n-l. Khai bo phng th c ny l static v extern, p d ng c tnh System.Runtime.InteropServices.DllImportAttribute ch nh file DLL v tn c a hm c n dng. s d ng m t hm C t m t th vi n ngoi, b n ch c n khai bo n m t cch thch h p. CRL s t ng m trch ph n vi c cn l i, bao g m vi c t i DLL vo b nh khi hm c g i v chuy n cc thng s t ki u d li u .NET thnh ki u d li u C. D ch v .NET h tr vi c th c thi xuyn-n n ny c tn l PInvoke (Platform Invoke), v qu trnh ny th ng l trong su t i v i ng i s d ng. Th nh tho ng, b n s c n th c hi n thm m t s vi c, ch ng h n c n h tr c u trc trong-b -nh (in-memory structure), callback, hay chu i c th thay i (mutable string). PInvoke th ng c s d ng truy xu t cc hm Win32 API, c bi t l cc tnh nng khng c trong cc l p c-qu n-l thu c .NET Framework. Cc v d c trnh by trong chng ny s s d ng PInvoke theo cch ny. C ba th vi n chnh trong Win32 API: kernel32.dllg m cc hm c-trng-h - i u-hnh nh n p ti n trnh, chuy n ng c nh, nh p/xu t file v b nh . user32.dllg m cc hm dng thao tc c a s , trnh n, h p tho i, bi u t ng, v tr c ti p ln c a s , trnh n, b m t gdi32.dllg m cc hm h a dng i u ki m, cng nh in n.

465 Chng 15: Kh nng lin tc m l nh khng- c-qu n-l

V d , xt cc hm Win32 API dng c v ghi cc file INI, ch ng h n GetPrivateProfileString v WritePrivateProfileString trong kernell32.dll. .NET Framework khng c l p no b c l y ch c nng ny. Tuy nhin, c th nh p cc hm ny b ng 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 th c WritePrivateProfileString ph i tng thch v i hm trong DLL, n u khng s c l i khi g i n. V phng th c WritePrivateProfileString c khai bo tham chi u n m t hm trong DLL nn b n khng c vi t m cho n. Ph n EntryPoint trong c tnh DllImportAttribute trong v d ny l ty ch n, v tn phng th c c khai bo trng v i tn c a hm trong th vi n ngoi. Trong v d sau, l p IniFileWrapper khai bo cc phng th c ring tham chi u t i cc hm Win32 API, sau g i chng t cc phng th c cng khai khc d a trn file c ch nh:
using using using using System; System.Text; System.Runtime.InteropServices; 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")] private static extern bool WritePrivateProfileString( string lpAppName, string lpKeyName, string lpString, string lpFileName); // B n hm sau khng c s d ng 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);

466 Chng 15: Kh nng lin tc m l nh khng- c-qu n-l [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; } } public bool WriteIniValue(string section, string key, string value) { return WritePrivateProfileString(section, key, value, filename); } }

Phng th c GetPrivateProfileString c m t thng s thu c ki u StringBuilder (lpReturnedString). l v chu i ny ph i l kh ikhi l i g i hm hon t t, n s ch a thng tin c a file INI. B t c khi no c n chu i kh i, b n ph i s d ng StringBuilder thay cho String. Thng th ng, b n c n t o StringBuilder v i m tb m k t c kch th c xc nh, r i truy n kch th c ny (nSize) cho phng th c. B n c th ch nh s l ng k t trong phng th c kh i d ng c thm thng tin v StringBuilder). c a StringBuilder (xem m c 2.1 th nghi m l p IniFileWrapper, b n hy t o m t file INI ch a thng tin sau:
[SampleSection] Key1=Value1 Key2=Value2 Key3=Value3

V th c thi o n m sau
public class IniTest {

c v ghi m t gi tr trong file INI.

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(); } }

467 Chng 15: Kh nng lin tc m l nh khng- c-qu n-l

15.2

Ly handle ca mt iu kim, ca s, hoc file

B n c n g i m t hm khng- c-qu n-l, v hm ny c n handle c a m t i u ki m, c a s , ho c file. Nhi u l p, bao g m l p FileStream v t t c l p d n xu t t Control, tr v handle (thu c c u trc IntPtr) thng qua thu c tnh Handle. Cng c l p tr v thng tin tng t ; v d , l p System.Diagnostics.Process c thm thu c tnh Process.MainWindowHandle ngoi thu c tnh Handle. .NET Framework khng che d u cc chi ti t n m d i, ch ng h n handle dng cho c a s v i u ki m. M c d khng th ng s d ng thng tin ny, b n c th l y n khi c n g i m t hm khng- c-qu n-l v hm ny c n n n. Xt ng d ng d i y, form chnh lun hi n th trn t t c cc c a s khc b t k n c focus hay khng (c c ch c nng ny b ng cch thi t l p thu c tnh Form.TopMost l true). Form cn c m t Timer nh k g i cc hm khng- c-qu n-l GetForegroundWindow v GetWindowText l y thng tin c a c a s hi n ang c focus. Ngoi ra, handle c a form chnh c l y thng qua thu c tnh Form.Handle, r i c so snh v i handle c a form hi n ang tch c c ki m tra form chnh ang c focus hay khng.

Hnh 15.1 Thng tin v c a s using using using using System; System.Windows.Forms; System.Runtime.InteropServices; System.Text;

ang tch c c

public class ActiveWindowInfo : System.Windows.Forms.Form { // (B private private private private qua ph n m designer.) System.Windows.Forms.Timer System.Windows.Forms.Label System.Windows.Forms.Label System.Windows.Forms.Label tmrRefresh; lblCurrent; lblHandle; 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;

468 Chng 15: Kh nng lin tc m l nh khng- c-qu n-l 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 c a form c qu n l m t cch trong su t i v i ng i dng. Thay i thu c tnh no c a form c th khi n cho CRL t o m t handle m i. Do , b n nn lun truy xu t handle ngay tr c khi s d ng n (khng nn gi n trong m t bi n s d ng trong m t th i gian di).

15.3 Gi mt hm khng-c-qun-l c s dng cu


trc
B n c n g i m t hm khng- c-qu n-l c thng s l m t c u trc. nh nh byte. Trong m C# thu n ty, b n khng c kh nng tr c ti p ki m sot vi c c p b nh . Thay vo t i u ha ho t ng. i u ny , CRL s quy t nh khi no c n a d li u vo b nh gy r c r i khi lm vi c v i cc hm C, v c u trc ph i c tr lin t c trong b nh . May m n l .NET gi i quy t v n ny b ng c tnh StructLayoutAttribute, cho php b n ch nh cc thnh vin c a m t l p hay m t c u trc cho tr c s c s p x p trong b nh nh th no. V d , xt hm GetVersionEx trong th vi n kernel32.dll. Hm ny nh n m t con tr ch t i tr v thng tin phin b n c a h i u hnh. s c u trc OSVERSIONINFO v s d ng n d ng c u trc OSVERSIONINFO trong m C#, b n ph i nh ngha n v i c tnh StructLayoutAttribute nh sau:
[StructLayout(LayoutKind.Sequential)] public class OSVersionInfo { public public public public int int int int dwOSVersionInfoSize; dwMajorVersion; dwMinorVersion; dwBuildNumber;

ngha cho c u

c u trc.

trc S

trong d ng

m phng

C#.

System.Runtime.InteropServices.StructLayoutAttribute System.Runtime.Interop.Marshal n u mu n xc

d ng c tnh c u hnh vi c c p b th c tnh SizeOf c a l p nh kch th c c a c u trc theo

469 Chng 15: Kh nng lin tc m l nh khng- c-qu n-l public int dwPlatformId; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)] public String szCSDVersion; }

Ch r ng, c u trc ny cng s d ng c tnh System.Runtime.InteropServices. (c n cho cc chu i c kch th c khng i). y, MarshalAsAttribute ch nh chu i s c truy n b ng tr v s ch a m t b m g m 128 k t c ch nh trong c u trc OSVersionInfo. Trong v d ny, LayoutKind.Sequential c s d ng, ngha l cc ki u d li u trong c u trc c b tr theo th t m chng c li t k trong c u trc ho c l p.
MarshalAsAttribute

Ngoi LayoutKind.Sequential, b n c th s d ng LayoutKind.Explicit. Trong tr ng h p ny, b n ph i s d ng FieldOffsetAttribute nh ngha d i c a cc tr ng. Cch ny h u ch khi b n mu n lu tr cc tr ng m t cch linh ng hn, ho c b n mu n b qua (khng s d ng) tr ng no . V d sau nh ngha l p OSVersionInfo v i LayoutKind.Explicit.
[StructLayout(LayoutKind.Explicit)] public class OSVersionInfo { [FieldOffset(0)] public int dwOSVersionInfoSize; [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 c u trc c s d ng b i hm GetVersionEx, b n c th khai bo hm ny v s d ng n. ng d ng d i y s trnh by ton b m l nh c n thi t. Ch , InAttribute v OutAttribute c p d ng cho OSVersionInfo bi t r ng marshalling s c th c hi n trn c u trc ny khi n c truy n cho hm v khi n c tr v t hm. Ngoi ra, phng th c Marshal.SizeOf c s d ng tnh kch th c c a c u trc trong b nh .
using System; using System.Runtime.InteropServices; public class CallWithStructure { // (B qua l p 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);

470 Chng 15: Kh nng lin tc m l nh khng- c-qu n-l Console.WriteLine("Platform: " + Environment.OSVersion.Platform); Console.WriteLine( "Version: " + Environment.OSVersion.Version); Console.ReadLine(); } }

N u ch y ng d ng ny trn h th ng Windows XP, b n s th y 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

15.4

Gi mt hm khng-c-qun-l c s dng callback

B n c n g i m t hm khng- c-qu n-l v cho php n g i m t hm khc. T o m t y nhi m cho callback. S d ng y nhi m ny khi hm khng- c-qu n-l. nh ngha v s d ng

Nhi u hm c a Win32 API s d ng callback. V d , n u mu n l y tn c a t t c cc c a s ang m , b n c th s d ng hm EnumWindows trong th vi n user32.dll . Khi g i EnumWindows, b n c n truy n cho n m t con tr ch n m t hm khc trong m l nh c a b n. H i u hnh Windows sau s g i hm ny m i khi tm th y m t c a s ang m , v truy n handle c a c a s cho n. .NET Framework cho php b n qu n l vi c s d ng callback m khng c n cc con tr v cc kh i m khng an ton. Thay vo , b n c th nh ngha v s d ng m t y nhi m ch n hm callback. Khi b n truy n y nhi m cho hm EnumWindows, CLR s t ng marshal y nhi m thnh con tr hm khng- c-qu n-l nh mong mu n. V d d i y s d ng EnumWindows cng v i m t callback 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-qu n-l s kch ho t callback // khi duy t qua cc c a 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);

hi n th tn c a t t c cc c a

471 Chng 15: Kh nng lin tc m l nh khng- c-qu n-l private static void Main() { CallBack callBack = new CallBack(DisplayWindowInfo); // Yu c u h i u hnh duy t qua cc c a s ang m , // kch ho t callback v i handle c a m i c a s . EnumWindows(callBack, 0); Console.ReadLine(); } // Hm s nh n callback. Thng s th hai // khng c s d ng nhng ph i c khai bo // tng thch v i ch k c a 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; } }

15.5

Ly thng tin li khng-c-qun-l

B n c n truy xu t thng tin l i (m l i ho c thng i p m t l i) gi i thch t i sao m t l i g i Win32 API th t b i. Trong ph n khai bo c a hm khng- c-qu n-l, thi t l p tr ng SetLastError c a c tnh DllImportAttribute l true. N u c l i khi th c thi, g i phng th c tnh Marshal.GetLastWin32Error truy xu t m l i. l y thng i p m t m t m l i c th , s d ng hm khng- c-qu n-l FormatMessage. B n khng th tr c ti p l y thng tin l i b ng hm khng- c-qu n-l GetLastError. V n l, m l i do GetLastError tr v c th khng ph n nh l i do hm khng- c-qu n-l gy ra. Thay vo , n c th c thi t l p b i cc l p .NET Framework khc ho c CLR. B n c th l y thng tin l i m t cch an ton b ng phng th c tnh Marshal.GetLastWin32Error. Phng th c ny c n c g i ngay sau l i g i hm khng c-qu n-l, v n s tr v thng tin l i ch m t l n (cc l n g i GetLastWin32Error sau s tr v m l i 127). Ngoi ra, b n ph i thi t l p tr ng SetLastError c a c tnh DllImportAttribute l true, cho bi t nh ng l i do hm ny sinh ra s c ghi nh n.
[DllImport("user32.dll", SetLastError=true)]

Sau , b n c th s d ng hm FormatMessage trong th vi n kernel32.dll m t l i t m l i Win32.

l y thng i p

V d , ng d ng d i y mu n hi n th m t MessageBox, nhng l i s d ng handle khng ng. M l i c l y b ng Marshal.GetLastWin32Error, v thng i p m t l i c l y b ng FormatMessage.


using System; using System.Runtime.InteropServices;

472 Chng 15: Kh nng lin tc m l nh khng- c-qu n-l 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)); Console.ReadLine(); } // GetErrorMessage tr v thng i p l i // tng ng v i m l i 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 k t xu t c a ng d ng:
1400 Invalid window handle.

15.6

S dng thnh phn COM trong .NET-client

B n c n s d ng thnh ph n COM trong m t .NET-client. S d ng m t Primary Interop Assembly, n u c. N u khng, t o m t Runtime Callable Wrapper b ng Type Library Importer (Tlbimp.exe), ho c tnh nng Add Reference trong Visual Studio .NET.

473 Chng 15: Kh nng lin tc m l nh khng- c-qu n-l

.NET Framework h tr kh nng lin tc v i COM. cho php .NET-client tng tc v i m t thnh ph n COM, .NET s d ng m t Runtime Callable Wrapper (RCW)m t l p proxy c bi t ng vai tr trung gian gi a m .NET v thnh ph n COM. RCW s x l t t c chi ti t, bao g m vi c marshal cc ki u d li u, s d ng cc giao di n COM truy n th ng, v x l cc s ki n COM. B n c ba ty ch n khi s d ng m t RCW: L y RCW t tc gi c a thnh ph n COM. Trong tr ng h p ny, RCW c g i l m t Primary Interop Assembly (PIA). T o RCW b ng ti n ch dng l nh Tlbimp.exe ho c b ng Visual Studio .NET. t o RCW thng qua cc ki u trong khng gian tn System.Runtime. InteropServices (cch ny c c k di dng v ph c t p). T

N u mu n s d ng Visual Studio .NET t o RCW, b n ch c n ch n Project | Add Reference v sau ch n thnh ph n thch h p trong th COM. Interop Assembly s c t o ra v c kh o st thm vo cc tham chi u c a d n. Sau , b n c th s d ng Object Browser cc khng gian tn v cc l p c trong thnh ph n ny.
[

Hnh 15.2 S d ng Object Browser xem cc khng gian tn v cc l p c trong thnh ph n COM

N u khng s d ng Visual Studio .NET, b n c th t o m t Wrapper Assembly b ng cng c Tlbimp.exe, ch c n truy n cho n tn file ch a thnh ph n COM. V d , dng l nh sau y s t o m t RCW v i tn file v khng gian tn m c nh, gi s file MyCOMComponent.dll ang n m trong th m c hi n hnh.
tlbimp MyCOMComponent.dll

Gi s MyCOMComponent ch a m t th vi n ki u c tn l MyClasses, file RCW s c tn l MyClasses.dll v s trng cc l p c a n thng qua m t khng gian tn c tn l MyClasses. B n c th c u hnh cc ty ch n ny b ng cc i s dng l nh ( c m t chi ti t trong ti li u MSDN). V d , b n c th s d ng /out:[Filename] ch nh tn file assemby, s d ng /namespace:[Namespace] ch nh khng gian tn. B n cng c th s d ng /keyfile[keyfilename] t o tn m nh cho assembly, v t n vo Global Assembly Cache (GAC). S d ng /primary t o m t PIA.

474 Chng 15: Kh nng lin tc m l nh khng- c-qu n-l

N u c th , b n nn s d ng PIA thay v t o RCW. PIA ho t ng ng tin c y hn v c t o ra b i nh pht hnh thnh ph n, v cng c th ch a m t s tnh nng nng cao. N u m t PIA c ng k v i h th ng cho m t thnh ph n COM th Visual Studio .NET s t ng s d ng PIA khi b n thm m t tham chi u n thnh ph n COM. V d , adodb.dll (c trong .NET Framework) cho php b n s d ng cc i t ng ADO truy n th ng. N u b n thm m t tham chi u n thnh ph n Microsoft ActiveX Data Objects, Interop Assembly ny s t ng c s d ng, m khng sinh ra m t RCW m i. Tng t , Microsoft Office XP cung c p m t PIA nng cao s h tr .NET cho Office Automation (b n c th t i PIA ny t i a ch [http://msdn.microsoft.com/downloads/list/office.asp]). V d sau minh h a cch s d ng COM Interop trong ng d ng .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(); } }

truy xu t cc

i t ng ADO truy n th ng

15.7

Gii phng nhanh thnh phn COM

B n c n b o m m t thnh ph n COM c xa kh i b nh ngay t c th, khng ph i ch b thu gom rc (Garbage Collector) lm vi c. Ho c b n mu n b o m cc i t ng COM c gi i phng theo m t th t xc nh. S d ng phng th c tnh Marshal.ReleaseComObject v truy n RCW thch h p gi i phng tham chi u n i t ng COM n m d i. COM s m cc tham chi u n i t ng xc nh khi no i t ng s c gi i phng. Khi b n s d ng m t RCW, tham chi u s c gi c khi bi n i t ng v t kh i t m v c. Tham chi u ny ch c gi i phng khi b thu gom rc gi i phng i t ng RCW. Do , b n khng th ki m sot vi c cc i t ng COM s c gi i phng khi no ho c theo th t no.

475 Chng 15: Kh nng lin tc m l nh khng- c-qu n-l

v t qua h n ch ny, b n c th s d ng phng th c Marshal.ReleaseComObject. Trong v d m c 15.6, b n hy thm hai dng sau vo cu i m l nh gi i phng i t ng Recordset v Connection n m d i.
Marshal.ReleaseComObject(rs); Marshal.ReleaseComObject(con);

V m t k thu t, phng th c ReleaseComObject khng th c s gi i phng i t ng COM, n ch gi m s l ng tham chi u n i t ng. N u s tham chi u l 0, i t ng COM s c gi i phng. Tuy nhin, n u cng th hi n c a m t i t ng COM c s d ng t i nhi u m u m l nh, n ph i c gi i phng cc ni tr c khi c gi i phng kh i b nh .

15.8
S d ng tr ng Type.Missing.

S dng thng s ty chn

B n c n g i m t phng th c trong thnh ph n COM m khng ph i truy n t t c cc thng s c n thi t. H u h t cc phng th c trong .NET Framework u c n p ch ng nhi u l n b n c th g i phin b n yu c u ch nh ng thng s do b n cung c p. M t khc, COM khng h tr vi c n p ch ng phng th c. Thay vo , cc thnh ph n COM th ng s d ng cc phng th c v i m t danh sch di cc thng s ty ch n. Khng may l, C# khng h tr thng s ty ch n, ngha l ng i pht tri n ph i cung c p thm cc gi tr khng c n thi t khi truy xu t m t thnh ph n COM. V v cc thng s COM th ng c truy n b ng tham chi u nn m l nh c a b n khng th truy n m t tham chi u null, m ph i khai bo m t bi n i t ng v r i truy n bi n . gi m nh v n n m t ch ng m c no b ng cch cung c p tr ng khi no mu n b qua m t thng s ty ch n. N u c n truy n m t thng s b ng tham chi u, b n ch c n khai bo m t bi n i t ng, thi t l p n l Type.Missing, v s d ng n trong m i tr ng h p:
Type.Missing b t c private static object n = Type.Missing;

B n c th

V d d i y s d ng i t ng Word t o v hi n th m t ti li u. Trong , c nhi u phng th c yu c u cc thng s ty ch n ( c truy n b ng tham chi u). Vi c s d ng tr ng Type.Missing n gi n ha m l nh r t nhi u.
using System; public class OptionalParameters { private static object n = Type.Missing; private static void Main() { // Ch y Word pha n n. Word.ApplicationClass app = new Word.ApplicationClass(); app.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone; // T o m t ti li u m i (khng kh ki n i v i ng i dng). Word.Document doc = app.Documents.Add(ref n, ref n, ref n,

476 Chng 15: Kh nng lin tc m l nh khng- c-qu n-l ref n); Console.WriteLine(); Console.WriteLine("Creating new document."); Console.WriteLine(); // Thm m t 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; // Hi n th Print Preview, lm cho Word tr doc.PrintPreview(); app.Visible = true; Console.ReadLine(); } } nn kh ki n.

15.9
B nc n

S dng iu kim ActiveX trong .NET-client


t m t i u ki m ActiveX trn m t c a s ng d ng .NET Framework.

S d ng m t RCW (cng gi ng nh v i m t thnh ph n COM bnh th ng). lm vi c v i i u ki m ActiveX khi thi t k , thm n vo h p cng c c a Visual Studio .NET. .NET Framework h tr nh nhau i v i t t c cc thnh ph n COM, bao g m i u ki m ActiveX. i u khc nhau c b n l l p RCW (cho i u ki m ActiveX) d n xu t t ki u .NET c bi t System.Windows.Forms.AxHost. V m t k thu t, b n thm AxHost vo form, v n s giao ti p v i i u ki m ActiveX pha h u tr ng. V d n xu t t System.Windows.Forms.Control, nn AxHost cng c cc thu c tnh, phng th c, v s ki n chu n nh Location, Size, Anchor,.. N u RCW c sinh t ng, cc l p AxHost lun b t u b ng Ax. B n c th t o m t RCW cho m t i u ki m ActiveX cng gi ng nh cho b t c thnh ph n COM no khc b ng cng c Tlbimp.exe ho c tnh nng Add Reference trong Visual Studio t o i u ki m. Tuy nhin, m t cch ti p c n d hn trong Visual .NET, sau l p trnh Studio .NET l thm i u ki m ActiveX vo h p cng c (xem m c 11.4 bi t thm chi ti t). Ch ng c g x y ra khi b n thm m t i u ki m ActiveX vo h p cng c . Tuy nhin, b n c th s d ng bi u t ng trong h p cng c thm m t th hi n c a i u ki m vo form. L n u b n lm vi c ny, Visual Studio .NET s t o m t Interop Assembly v thm n vo d n c a b n. V d , n u b n thm i u ki m Microsoft Masked Edit (khng c i u ki m .NET tng ng), Visual Studio .NET s t o m t RCW Assembly c tn l AxInterop.MSMask.dll. D i y l o n m trong vng designer dng t o m t th hi n c a i u ki m ny v thm n vo form:
this.axMaskEdBox1 = new AxMSMask.AxMaskEdBox(); ((System.ComponentModel.ISupportInitialize)(this.axMaskEdBox1)).

477 Chng 15: Kh nng lin tc m l nh khng- c-qu n-l BeginInit(); // // axMaskEdBox1 // this.axMaskEdBox1.Location = new System.Drawing.Point(16, 12); this.axMaskEdBox1.Name = "axMaskEdBox1"; this.axMaskEdBox1.OcxState = ((System.Windows.Forms.AxHost.State) (resources.GetObject("axMaskEdBox1.OcxState"))); this.axMaskEdBox1.Size = new System.Drawing.Size(112, 20); this.axMaskEdBox1.TabIndex = 0; this.Controls.Add(this.axMaskEdBox1);

Ch r ng, cc thu c tnh ty bi n c a i u ki m ActiveX khng c p d ng tr c ti p thng qua cc l nh thi t l p thu c tnh. Thay vo , chng s c thi t l p theo nhm khi thu c tnh OcxState c thi t l p. Tuy nhin, m l nh c a b n c th s d ng cc thu c tnh ny m t cch tr c ti p.

15.10

To thnh phn .NET dng cho COM-client

B n c n t o m t thnh ph n .NET sao cho m t COM-client c th g i n. T o m t assembly theo cc ch d n trong m c ny. T o m t th vi n ki u cho assembly ny b ng ti n ch dng l nh Type Library Exporter (Tlbexp.exe). .NET Framework h tr vi c COM-client s d ng thnh ph n .NET. Khi COM-client t o m t i t ng .NET, CLR s t o m t i t ng c-qu n-l v m t COM Callable Wrapper (CCW) b c l y i t ng ny. COM-client s tng tc v i i t ng thng qua CCW. CLR ch t o m t CCW cho m t i t ng c-qu n-l, b t ch p c bao nhiu COM-client ang s d ng n. Cc ki u c n c truy xu t b i COM-client ph i th a mn cc yu c u sau: Cc ki u c-qu n-l (l p, giao di n, c u trc, ho c ki u li t k) ph i c khai bo l public. N u COM-client c n t o i t ng, n ph i c m t phng th c kh i d ng m c public. COM khng h tr cc phng th c kh i d ng c ch a thng s . nh

Cc thnh vin c a ki u c n c truy xu t ph i l cc thnh vin public. COM-client khng truy xu t c cc thnh vin private, protected, internal, v static. Khng nn t o cc quan h th a k gi a cc l p, v cc quan h ny s khng kh ki n i v i COM-client (m c d .NET gi l p quan h ny b ng cch khai bo m t giao di n l p c s dng chung). Cc l p m b n trng ra nn hi n th c m t giao di n. V i m c ch ki m sot phin b n, b n c th s d ng c tnh System.Runtime.InteropServices.GuidAttribute ch nh GUID s c gn cho giao di n. Nn t o tn m nh cho assembly chung cho nhi u client. n c th c ci t vo GAC v c dng

Ngoi ra, b n nn tun theo cc kinh nghi m sau:

478 Chng 15: Kh nng lin tc m l nh khng- c-qu n-l

t o m t i t ng .NET, COM-client c n m t th vi n ki u (file .tlb). File th vi n ki u c th c t o t m t assembly b ng ti n ch dng l nh Tlbexp.exe. V d :


tlbexp ManagedLibrary.dll

M t khi t o ra th vi n ki u, b n c th tham chi u n t m t cng c pht tri n khng c-qu n-l. V i Visual Basic 6, b n tham chi u file .tlb t h p tho i Project | Reference. Trong Visual C++ 6, b n c th s d ng l nh #import nh p cc nh ngha ki u t th vi n ki u.

479

Chng 16: CC GIAO DI N V M U THNG D NG

16

480

481 Chng 16: Cc giao di n v m u thng d ng

hng ny trnh by cch hi n th c cc m u (pattern) s c s d ng th ng xuyn trong qu trnh pht tri n cc ng d ng Microsoft .NET Framework. M t s m u c chu n ha b ng cc giao di n c nh ngha trong th vi n l p .NET Framework. M t s khc th t c ng nh c hn, nhng v n yu c u b n th c hi n cc cch ti p c n c th thi t k v hi n th c cc ki u c a b n. Cc m c trong chng ny m t cch: T o cc ki u kh -tu n-t -ha b n c th d dng lu tr vo a, g i qua m ng, ho c truy n b ng tr qua cc bin mi n ng d ng (m c 16.1). Cung c p m t c ch dng 16.2). t o b n sao y v chnh xc c a i t ng (m c

Hi n th c cc ki u sao cho d dng so snh v s p x p (m c 16.3). H tr vi c li t k cc ph n t trong cc t p h p ty bi n (m c 16.4). B o m r ng m t ki u c s d ng cc ti nguyn khng- c-qu n-l s gi i phng cc ti nguyn khi khng cn c n n chng n a (m c 16.5). Hi n th d ng chu i c a cc i t ng bi n i d a trn format specifier (m c 16.6). Hi n th c cc ki u i s s ki n v ngo i l ty bi n (b n s th ng xuyn s d ng chng trong qu trnh pht tri n ng d ng) (m c 16.7 v 16.8). Hi n th c cc m u thi t k thng d ng Singleton v Observer b ng cc tnh nng c s n c a C# v th vi n l p .NET Framework (m c 16.9 v 16.10).

16.1 Hin thc kiu kh-tun-t-ha (serializable type)


B n c n hi n th c m t ki u ty bi n kh -tu n-t -ha, cho php b n: Lu tr cc th hi n c a ki u vo kho lu tr (file hay c s d li u). Chuy n cc th hi n c a ki u qua m ng. Truy n cc th hi n c a ki u b ng tr qua cc bin mi n ng d ng. i v i vi c tu n t ha cc ki u

n gi n, hy p d ng c tnh i v i cc ki u ph c t p hn, ho c ki m sot n i dung v c u trc c a d li u c-tu n-t -ha, hy hi n th c giao di n System.Runtime.Serialization.ISerializable.
System.SerializableAttribute vo khai bo ki u.

M c 2.12 trnh by cch tu n t ha v gi i tu n t ha m t i t ng b ng cc l p formatter ( c c p cng v i th vi n l p .NET Framework). Tuy nhin, theo m c nh th cc ki u khng l kh -tu n-t -ha. hi n th c m t ki u ty bi n l kh -tu n-t -ha, b n ph i p d ng c tnh SerializableAttribute vo khai bo ki u. Khi t t c cc tr ng d li u trong ki u u l kh -tu n-t -ha, vi c p d ng SerializableAttribute l t t c nh ng g c n lm khi n cho ki u ty bi n c a b n l kh -tu n-t -ha. N u b n hi n th c m t l p ty bi n d n xu t t m t l p c s , l p c s cng ph i l kh -tu n-t -ha. M i l p formatter ch a logic c n thi t tu n t ha cc ki u c g n v i c tnh SerializableAttribute v s tu n t ha t t c cc tr ng public, protected, v private. o n m d i y trnh by cc khai bo ki u v khai bo tr ng c a m t l p kh -tu n-t ha c tn l Employee.

482 Chng 16: Cc giao di n v m u thng d ng using System; [Serializable] public class Employee { private string name; private int age; private string address; }

Cc l p d n xu t t

m t ki u kh -tu n-t -ha khng th a k c tnh khi n cho cc ki u d n xu t l kh -tu n-t -ha, b n ph i khai bo chng l kh -tu n-t -ha b ng cch p d ng c tnh SerializableAttribute.
SerializableAttribute.

B n c th tr ng sau:

ngn vi c tu n t

ha m t tr ng no

System.NonSerializedAttribute cho tr ng ny. B n nn ngn vi c tu n t

b ng cch p d ng c tnh ha i v i cc

Ch a cc ki u d li u khng-kh -tu n-t -ha. Ch a cc gi tr c th khng h p l khi i t ng c gi i tu n t ha, v d : k t n i c s d li u, a ch b nh , ID c a ti u trnh, v handle c a ti nguyn khng- cqu n-l. Ch a cc thng tin nh y c m hay ring t, v d : m t kh u, kha m t ha, v cc chi ti t ring v ng i hay t ch c. Ch a cc d li u d dng ti t o hay thu l y c t cc ngu n khc c bi t khi d li u l n.

N u ngn vi c tu n t ha m t s tr ng, b n ph i hi n th c ki u sao cho b l i vi c nh ng d li u no s khng hi n di n khi m t i t ng c gi i tu n t ha. ng ti c, b n khng th t o hay thu l y cc tr ng d li u b m t trong m t phng th c kh i d ng v formatter khng g i phng th c kh i d ng trong qu trnh gi i tu n t ha i t ng. Gi i php thng th ng nh t l hi n th c m u Lazy Initialization, trong ki u c a b n s t o hay thu l y d li u ngay l n u tin c n n. o n m d i y trnh by m t phin b n c ch nh s a c a l p Employee v i c tnh
NonSerializedAttribute c p d ng cho tr ng address, ngha l formatter s khng tu n

t ha gi tr c a tr ng ny. L p Employee hi n th c cc thu c tnh cng khai dng truy xu t cc thnh vin d li u ring, l ni thu n ti n hi n th c Lazy Initialization cho tr ng address.
using System; [Serializable] public class Employee { private string name; private int age; [NonSerialized] private string address;

483 Chng 16: Cc giao di n v m u thng d ng // Phng th c kh i d ng n gi n. public Employee(string name, int age, string address) { this.name = name; this.age = age; this.address = address; } // Thu c tnh cng khai dng public string Name { get { return name; } set { name = value; } } // Thu c tnh cng khai dng public int Age { get { return age; } set { age = value; } } truy xu t tn c a nhn vin.

truy xu t tu i c a nhn vin.

// Thu c tnh cng khai dng truy xu t a ch c a nhn vin. // S d ng "Lazy Initialization" thi t l p a ch v // i t ng c-gi i-tu n-t -ha s khng c gi tr a ch . public string Address { get { if (address == null) { // N p a ch t kho lu tr . } return address; } set { address = value; } } }

i v i ph n l n cc ki u ty bi n, vi c s d ng c tnh SerializableAttribute v p ng nhu c u tu n t ha c a b n. N u c n ki m sot qu trnh tu n t ha, b n c n hi n th c giao di n ISerializable. Cc l p formatter s d ng logic khc nhau khi tu n t ha v gi i tu n t ha th hi n c a cc ki u c hi n th c ISerializable. hi n th c ng ISerializable, b n ph i:
NonSerializedAttribute s

Khai bo r ng ki u c a b n c hi n th c giao di n ISerializable. p d ng c tnh SerializableAttribute vo khai bo ki u nh v a c m t ; khng s d ng NonSerializedAttribute v n s khng c tc d ng. Hi n th c phng th c ISerializable.GetObjectData ( c s d ng trong qu trnh tu n t ha), phng th c ny nh n cc ki u i s sau: System.Runtime.Serialization.SerializationInfo System.Runtime.Serialization.StreamingContext Hi n th c m t phng th c kh i d ng khng cng khai ( c s d ng trong qu trnh gi i tu n t ha), phng th c ny nh n cng i s nh phng th c GetObjectData. Nh r ng, n u b n c nh d n xu t m t s l p t l p kh -tu n-t -ha th phng th c kh i d ng ny ph i l protected.

484 Chng 16: Cc giao di n v m u thng d ng

N u b n t o m t l p kh -tu n-t -ha t m t l p c s cng c hi n th c ISerializable, th phng th c GetObjectData v phng th c kh i d ng (dng gi i tu n t ha) c a b n ph i g i cc phng th c tng ng trong l p cha.

Trong qu trnh tu n t ha, formatter s g i phng th c GetObjectData v truy n cho n cc tham chi u SerializationInfo v StreamingContext. li u c n tu n t ha vo i t ng SerializationInfo. L p SerializationInfo cung c p phng th c AddValue dng thm d li u. V i m i l n g i AddValue, b n ph i ch nh tn d li u (tn ny s c s d ng trong qu trnh gi i tu n t ha thu l y d li u). Phng th c AddValue c n 16 phin b n n p ch ng, cho php b n thm nhi u ki u d li u khc nhau vo i t ng SerializationInfo. i t ng StreamingContext cung c p cc thng tin v ch nh v ch c a d li u c-tu n-t -ha, cho php b n ch n tu n t ha d li u no. V d , b n c th c n tu n t ha d li u ring n u n c dnh cho m t mi n ng d ng khc trong cng ti n trnh, nhng khng c n n u d li u s c ghi ra file. B n ph i d

Trong qu trnh gi i tu n t ha, formatter s g i phng th c kh i d ng vi c gi i tu n t ha, l i truy n cho n cc tham chi u SerializationInfo v StreamingContext. Ki u c a b n ph i trch d li u - c-tu n-t -ha t i t ng SerializationInfo b ng m t trong cc phng th c SerializationInfo.Get*, v d : GetString, GetInt32, hay GetBoolean. i t ng StreamingContext cung c p cc thng tin v ngu n g c c a d li u - ctu n-t -ha, ph n nh logic m b n hi n th c cho vi c tu n t ha. Trong qu trnh tu n t ha chu n, formatter khng s d ng kh nng c a i t ng StreamingContext cho bi t cc chi ti t v ngu n g c, ch, v ch nh c a d li u c-tu n-t -ha. Tuy nhin, n u mu n th c hi n qu trnh tu n t ha ty bi n, b n c th c u hnh i t ng StreamingContext c a formatter tr c khi b t u qu trnh tu n t ha v gi i tu n t ha. Tham kh o ti li u .NET c thm thng tin v l p StreamingContext. Framework SDK V d d i y trnh by phin b n c di n ISerializable. Trong phin b n ny, l n u i t ng StreamingContext ch nh r Phng th c Main s gi i thch vi c tu n t Employee.
using System; using System.Runtime.Serialization; [Serializable] public class Employee : ISerializable { private string name; private int age; private string address; // Phng th c kh i d ng n gi n. public Employee(string name, int age, string address) {

ch nh s a c a l p Employee, c hi n th c giao p Employee khng tu n t ha tr ng address ng ch c a d li u c-tu n-t -ha l file. ha v gi i tu n t ha c a m t i t ng

485 Chng 16: Cc giao di n v m u thng d ng this.name = name; this.age = age; this.address = address; } // Phng th c kh i d ng dng kch ho t formatter th c hi n vi c // gi i tu n t ha m t i t ng Employee. B n nn khai bo // phng th c kh i d ng ny l private, hay t nh t cng l // protected b o m n khng b g i qu m c c n thi t. private Employee(SerializationInfo info, StreamingContext context) { // Trch xu t tn v tu i c a Employee (s lun hi n di n // trong d li u - c-tu n-t -ha b t ch p gi tr // c a StreamingContext). name = info.GetString("Name"); age = info.GetInt32("Age"); // Th c hi n trch xu t a ch c a Employee // (th t b i n u khng c). try { address = info.GetString("Address"); } catch (SerializationException) { address = null; } } // Cc thu c tnh Name, Age, v Address ( trnh by trn).

// c khai bo b i giao di n ISerializable, phng th c // GetObjectData cung c p c ch formatter thu l y // d li u s - c-tu n-t -ha. public void GetObjectData(SerializationInfo inf, StreamingContext con){ // Lun tu n t ha tn v tu i c a Employee. inf.AddValue("Name", name); inf.AddValue("Age", age); // Khng tu n t ha a ch c a Employee n u StreamingContext // cho bi t r ng d li u c-tu n-t -ha s c ghi ra file. if ((con.State & StreamingContextStates.File) == 0) { inf.AddValue("Address", address); } } // Chp Object.ToString tr v public override string ToString() { chu i m t Employee.

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) {

486 Chng 16: Cc giao di n v m u thng d ng // T o m t i t ng Employee m t Phuong. Employee phuong = new Employee("Phuong", 23, "HCM"); // Hi n th Phuong. Console.WriteLine(phuong); // Tu n t ha Phuong v i ch l m t mi n ng d ng khc. // a ch c a Phuong s c tu n t ha. Stream str = File.Create("phuong.bin"); BinaryFormatter bf = new BinaryFormatter(); bf.Context = new StreamingContext(StreamingContextStates.CrossAppDomain); bf.Serialize(str, phuong); str.Close(); // Gi i tu n t ha v hi n th Phuong. str = File.OpenRead("phuong.bin"); bf = new BinaryFormatter(); phuong = (Employee)bf.Deserialize(str); str.Close(); Console.WriteLine(phuong); // Tu n t ha Phuong v i ch l file. Trong tr ng h p ny, // a ch c a Phuong s khng c tu n t ha. str = File.Create("phuong.bin"); bf = new BinaryFormatter(); bf.Context = new StreamingContext(StreamingContextStates.File); bf.Serialize(str, phuong); str.Close(); // Gi i tu n t ha v hi n th Phuong. str = File.OpenRead("phuong.bin"); bf = new BinaryFormatter(); phuong = (Employee)bf.Deserialize(str); str.Close(); Console.WriteLine(phuong); Console.ReadLine(); } }

16.2

Hin thc kiu kh-sao-chp (cloneable type)


n gi n l p trnh vin t o

B n c n t o m t ki u ty bi n cung c p m t c ch b n sao cho cc th hi n c a ki u. Hi n th c giao di n System.ICloneable.

Khi gn m t ki u gi tr sang m t ki u gi tr khc l b n t o m t b n sao c a gi tr . Khng c m i lin h no gi a hai gi tr m t thay i trn gi tr ny s khng nh h ng n gi tr kia. Tuy nhin, khi gn m t ki u tham chi u sang m t ki u tham chi u khc (ngo i tr chu i c b th c thi x l c bi t), b n khng t o m t b n sao m i c a ki u tham chi u. Thay vo , c hai ki u tham chi u u ch n cng m t i t ng, v nh ng thay i trn gi tr c a i t ng u c ph n nh trong c hai tham chi u. t o m t b n sao th t c a m t ki u tham chi u, b n ph i nhi l i i t ng m n ch n.

487 Chng 16: Cc giao di n v m u thng d ng

Giao di n ICloneable nh n d ng m t ki u l kh -sao-chp v khai bo phng th c Clone l m t c ch m thng qua , b n c th thu l y b n sao c a m t i t ng. Phng th c Clone khng nh n i s no v tr v m t System.Object, b t ch p ki u ang hi n th c l g. i u ny ngha l m t khi sao m t i t ng, b n ph i p b n sao v ng ki u. Cch hi n th c phng th c Clone cho m t ki u ty bi n ty thu c vo cc thnh vin d li u c khai bo bn trong ki u. N u ki u ty bi n ch ch a cc thnh vin d li u ki u gi tr (int, byte...) v System.String, b n c th hi n th c phng th c Clone b ng cch t o m t i t ng m i v thi t l p cc thnh vin d li u c a n c gi tr gi ng nh i t ng hi n t i. L p Object (t t c cc ki u u d n xu t t y) ch a phng th c MemberwiseClone dng t ng ha qu trnh ny. V d d i y trnh by m t l p n gi n c tn l Employee, ch ch a cc thnh vin chu i. Do , phng th c Clone d a vo phng th c t o b n sao. th a k MemberwiseClone
using System; public class Employee : ICloneable { public string Name; public string Title; // Phng th c kh i d ng n gi n. public Employee(string name, string title) { Name = name; Title = title; } // T o m t b n sao b ng phng th c Object.MemberwiseClone // v l p Employee ch ch a cc tham chi u chu i. public object Clone() { return MemberwiseClone(); } }

N u ki u ty bi n c a b n c ch a cc thnh vin d li u ki u tham chi u, b n ph i quy t nh xem phng th c Clone c a b n s th c hi n m t b n sao c n (shallow copy) hay m t b n sao su (deep copy). B n sao c n ngha l b t k thnh vin d li u ki u tham chi u no trong b n sao u s ch n i t ng gi ng nh thnh vin d li u ki u tham chi u tng ng trong i t ng g c. B n sao su ngha l b n ph i sao ton b th i t ng (object graph) cc thnh vin d li u ki u tham chi u c a b n sao ch n cc b n sao ( c l p v m t v t l) c a cc i t ng c tham chi u b i i t ng g c. D dng hi n th c m t b n sao c ns d ng phng th c MemberwiseClone v a c m t . Tuy nhin, m t b n sao su th ng l ci m l p trnh vin mong i khi l n u tin sao m t i t ngnhng hi m khi l ci h l y. i u ny c bi t ng i v i cc l p t p h p trong khng gian tn System.Collections, t t c u hi n th c b n sao c n trong cc phng th c Clone c a chng. M c d s c ch n u cc t p h p ny hi n th c b n sao su, c hai l do chnh cc ki u ( c bi t l cc l p t p h p) khng hi n th c b n sao su: Vi c t o b n sao c a m t th i t ng l n s t n nhi u b nh v th i gian x l. Cc t p h p thng th ng c th ch a cc th i t ng su v r ng, bao g m b t k ki u i t ng no. Vi c t o m t hi n th c b n sao su ph c v nhi u th nh th l

488 Chng 16: Cc giao di n v m u thng d ng

khng kh thi v m t s i t ng trong t p h p c th khng ph i l kh -sao-chp, v m t s khc c th ch a cc tham chi u vng, khi n qu trnh sao chp tr thnh m t vng l p v t n. i v i cc t p h p ki u m nh, trong b n ch t c a cc ph n t c hi u v c ki m sot th m t b n sao su c th l m t tnh nng r t h u ch. V d , System.Xml.XmlNode hi n th c m t b n sao su trong phng th c Clone, i u ny cho php b n t o ng b n sao c a ton b h th ng phn c p i t ng XML ch v i m t l nh n. N u c n sao m t i t ng khng hi n th c ICloneable nhng l i l kh -tu n-t ha, b n c th tu n t ha r i gi i tu n t ha i t ng c c cng k t qu nh khi sao chp. Tuy nhin, qu trnh tu n t ha c th khng tu n t ha t t c cc thnh vin d li u (nh c th o lu n trong m c 16.1). Cng v y, n u t o m t ki u kh -tu n-t -ha ty bi n, b n c th s d ng qu trnh tu n t ha v a c m t th c hi n m t b n sao su bn trong phng th c ICloneable.Clone. sao m t i t ng kh -tu n-t -ha, b n hy s d ng l p System.Runtime.Serialization.Formatters.Binary.BinaryFormatter tu n t ha i t ng ny thnh m t i t ng System.IO.MemoryStream, v r i gi i tu n t ha i t ng ny t System.IO.MemoryStream. L p Team d i y hi n th c phng th c Clone th c hi n m t b n sao su. L p Team ch a m t t p h p cc i t ng Employe m t m t nhm ng i. Khi b n g i phng th c Clone c a m t i t ng Team, phng th c ny s t o b n sao c a m i i t ng Employee v thm n vo i t ng Team c sao. L p Team cung c p m t phng th c kh i d ng private n gi n ha m l nh trong phng th c Clone (s d ng phng th c kh i d ng l cch thng th ng n gi n ha qu trnh sao chp).
using System; using System.Collections; public class Team : ICloneable { public ArrayList TeamMembers = new ArrayList(); public Team() { } // Phng th c kh i d ng private c phng th c Clone g i // t o m t i t ng Team m i v vo ArrayList c a n // b n sao c a cc i t ng Employee t m t ArrayList c tr c. private Team(ArrayList members) { foreach (Employee e in members) { TeamMembers.Add(e.Clone()); } } // Thm m t i t ng Employee vo Team. public void AddMember(Employee member) { TeamMembers.Add(member); } public object Clone() {

489 Chng 16: Cc giao di n v m u thng d ng // T o m t b n sao su c a Team b ng cch g i phng th c // kh i d ng Team v truy n cho n ArrayList ch a // cc thnh vin c a Team. return new Team(this.TeamMembers); // L nh ny s t o m t b n sao c n c a Team: // return MemberwiseClone(); } }

16.3

Hin thc kiu kh-so-snh (comparable type)

B n c n m t c ch dng so snh cc ki u ty bi n, cho php b n d dng s p x p t p h p ch a cc th hi n c a ki u ny.


System.IComparable.

cung c p m t c ch so snh chu n cho m t ki u, hi n th c giao di n h tr nhi u d ng so snh, t o ring t ng ki u tr gip (helper) v cc ki u ny hi n th c giao di n System.Collections.IComparer.

N u mu n s p x p ki u c a b n ch theo m t th t no (nh ID tng d n, hay tn theo th t alphabet), b n nn hi n th c giao di n IComparable. Giao di n ny nh ngha phng th c CompareTo nh sau:
int CompareTo(object obj);

i t ng (obj) c truy n cho phng th c ph i cng ki u v i i t ng ang g i, n u khng CompareTo s nm ngo i l System.ArgumentException. Gi tr do CompareTo tr v c tnh nh sau: N u N u N u i t ng hi n t i nh hn obj, tr v m t s m (ch ng h n, -1). i t ng hi n t i c cng gi tr nh obj, tr v zero. i t ng hi n t i l n hn obj, tr v m t s dng (ch ng h n, 1).

Php so snh ny th c hi n i u g l ty thu c vo ki u hi n th c giao di n IComparable. V d , n u mu n s p x p d a theo tn, b n c n th c hi n php so snh chu i (String). Tuy nhin, n u mu n s p x p d a theo ngy sinh, b n c n th c hi n php so snh ngy (System.DateTime). h tr nhi u d ng s p x p cho m t ki u c th , b n ph i hi n th c ring r t ng ki u tr gip v cc ki u ny hi n th c giao di n IComparer. Giao di n ny nh ngha phng th c Compare nh sau:
int Compare(object x, object y);

Ki u tr gip ph i ng gi logic c n thi t trn logic nh sau: N u x c cng gi tr nh y, tr v zero.

so snh hai

i t ng v tr v m t gi tr d a

N u x nh hn y, tr v m t s m (ch ng h n, -1). N u x l n hn y, tr v m t s dng (ch ng h n, 1).

L p Newspaper d i y hi n th c c giao di n IComparable v IComparer. Phng th c Newspaper.CompareTo th c hi n php so snh khng phn bi t ch hoa-th ng hai i t ng

490 Chng 16: Cc giao di n v m u thng d ng Newspaper d a trn tr ng name c a chng. M t l p private l ng bn trong c tn l AscendingCirculationComparer hi n th c IComparer v so snh hai i t ng Newspaper d a trn tr ng circulation c a chng. i t ng AscendingCirculationComparer c thu l y b ng thu c tnh tnh Newspaper.CirculationSorter. using System; using System.Collections; public class Newspaper : IComparable { private string name; private int circulation; private class AscendingCirculationComparer : IComparer { int IComparer.Compare(object x, object y) { // X l cc tham chi u null. // Null c coi nh nh hn b t c gi tr if (x == null && y == null) return 0; else if (x == null) return -1; else if (y == null) return 1; // Tr ng h p x v y tham chi u if (x == y) return 0; n cng m t no khc.

i t ng.

// B o m x v y u l cc th hi n c a 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 r ng: // tr v m t s m n u x < y // tr v zero n u x = y // tr v m t s dng n u x > y // D dng hi n th c logic ny b ng php tnh s nguyn. return newspaperX.circulation - newspaperY.circulation; } } public Newspaper(string name, int circulation) { this.name = name; this.circulation = circulation; } // Khai bo m t thu c tnh ch - c, tr v m t th hi n c a // AscendingCirculationComparer. public static IComparer CirculationSorter{ get { return new AscendingCirculationComparer(); } }

491 Chng 16: Cc giao di n v m u thng d ng public override string ToString() { return string.Format("{0}: Circulation = {1}", name, circulation); } // Phng th c CompareTo so snh hai i t ng Newspaper d a trn // php so snh tr ng name (khng phn bi t ch hoa-th ng). public int CompareTo(object obj) { // M t i t ng lun c coi nh l n hn null. if (obj == null) return 1; // Tr ng h p i t ng kia l m t tham chi u if (obj == this) return 0; // p i t ng kia v Newspaper. Newspaper other = obj as Newspaper; // // // if N u "other" l null, n khng ph i l m t th hi n c a Newspaper. Trong tr ng h p ny, CompareTo ph i nm ngo i l System.ArgumentException. (other == null) { throw new ArgumentException("Invalid object type", "obj"); } else { // Tnh gi tr tr v b ng cch th c hi n php so snh // tr ng name (khng phn bi t ch hoa-th ng). // V name l chu i nn cch d nh t l d a vo kh nng // so snh c a l p String (th c hi n php so snh chu i // c phn bi t b n a). return string.Compare(this.name, other.name, true); } } } n i t ng ny.

Phng th c Main minh h a php so snh v kh nng s p x p nh c hi n th c giao di n IComparable v IComparer. Phng th c ny s t o m t t p h p System.Collections.ArrayList ch a nm i t ng Newspaper, sau s p x p ArrayList hai l n b ng phng th c ArrayList.Sort. L n u, thao tc Sort s d ng c ch so snh m c nh c a Newspaper (thng qua phng th c IComparable.CompareTo). L n sau, thao tc Sort s d ng i t ng AscendingCirculationComparer (thng qua phng th c IComparer.Compare).
public static void Main() { ArrayList newspapers = new ArrayList(); newspapers.Add(new newspapers.Add(new newspapers.Add(new newspapers.Add(new newspapers.Add(new Newspaper("Tuoi Tre", 125780)); Newspaper("Echip", 55230)); Newspaper("Thanh Nien", 235950)); Newspaper("Phu Nu", 88760)); Newspaper("Tiep Thi", 5670));

Console.WriteLine("Unsorted newspaper list:"); foreach (Newspaper n in newspapers) { Console.WriteLine(n); }

492 Chng 16: Cc giao di n v m u thng d ng Console.WriteLine(Environment.NewLine); Console.WriteLine("Newspaper list sorted by name (default order):"); newspapers.Sort(); foreach (Newspaper n in newspapers) { Console.WriteLine(n); } Console.WriteLine(Environment.NewLine); Console.WriteLine("Newspaper list sorted by circulation:"); newspapers.Sort(Newspaper.CirculationSorter); foreach (Newspaper n in newspapers) { Console.WriteLine(n); } }

Ch y phng th c Main s sinh ra k t 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

16.4

Hin thc kiu kh-lit-k (enumerable type)


c li t k b ng

B n c n t o m t ki u t p h p sao cho n i dung c a n c th l nh foreach.

Hi n th c giao di n System.IEnumerable trong ki u t p h p c a b n. Phng th c GetEnumerator c a giao di n IEnumerable tr v m t enumeratorm t i t ng c hi n th c giao di n System.IEnumerator. Giao di n IEnumerator nh ngha cc phng th c s c l nh foreach s d ng ki t k t p h p. M t b ch m c b ng s (numerical indexer) cho php b n duy t qua cc ph n t c a m t t p h p b ng vng l p for. Tuy nhin, k thu t ny khng cung c p m c tr u t ng ph h p v i cc c u trc d li u phi tuy n, nh cy v t p h p a chi u. L nh foreach cung c p m t c ch duy t qua cc i t ng c a m t t p h p m khng quan tm c u trc bn trong c a chng l g.

493 Chng 16: Cc giao di n v m u thng d ng

ngha foreach, i t ng ch a t p h p ph i hi n th c giao di n System.IEnumerable. Giao di n ny khai bo m t phng th c c tn l GetEnumerator, phng th c ny khng nh n i s v tr v m t i t ng System.IEnumerator:
IEnumerator GetEnumerator();

tr

ng

i t ng h tr vi c li t k cc ph n t c a t p h p. Giao di n c, ch -ti n (read-only, forward-only cursor) dng truy xu t cc thnh vin c a t p h p n m d i. B ng 16.1 m t cc thnh vin c a giao di n IEnumerator.
IEnumerator cung c p m t con ch y ch B ng 16.1 Cc thnh vin c a giao di n IEnumerator Thnh vin M t

i t ng IEnumerator l

Current

Thu c tnh ny tr v ph n t d li u hi n t i. Khi enumerator c t o ra, Current ch n v tr ng tr c ph n t d li u u tin, ngha l b n ph i g i MoveNext tr c khi s d ng Current. N u Current c g i v enumerator ang ng tr c ph n t u tin ho c sau ph n t cu i cng trong t p h p d li u, Current s nm ngo i l System.InvalidOperationException. Phng th c ny d ch chuy n enumerator sang ph n t d li u k ti p trong t p h p; tr v true n u cn ph n t , tr v false n u khng cn ph n t . N u ngu n d li u n m d i thay i trong th i gian s ng c a enumerator, MoveNext s nm ngo i l InvalidOperationException. Phng th c ny d ch chuy n enumerator v v tr ng tr c ph n t u tin trong t p h p d li u. N u ngu n d li u n m d i thay i trong nm ngo i l th i gian s ng c a enumerator, Reset s InvalidOperationException.

MoveNext

Reset

Cc l p TeamMember, Team, v TeamMemberEnumerator minh h a vi c hi n th c giao di n IEnumerable v IEnumerator. L p TeamMember m t m t thnh vin c a m t i:
// L p TeamMember m t m t thnh vin trong public class TeamMember { public string Name; public string Title; // Phng th c kh i d ng n gi n. public TeamMember(string name, string title) { Name = name; Title = title; } // Tr v chu i m t TeamMember. public override string ToString() { return string.Format("{0} ({1})", Name, Title); } } i.

494 Chng 16: Cc giao di n v m u thng d ng

L p Team (m t m t i) l m t t p h p cc i t ng TeamMember. L p ny hi n th c giao di n IEnumerable v khai bo m t l p c tn l TeamMemberEnumerator cung c p ch c nng li t k. Thng th ng, cc l p t p h p s tr c ti p hi n th c c giao di n IEnumerable v IEnumerator. Tuy nhin, s d ng m t l p enumerator ring bi t l cch n gi n nh t cho php nhi u enumeratorv nhi u ti u trnhli t k ng th i cc ph n t c a Team. d ng cc thnh vin s ki n v y nhi m bo cho t t c cc i t ng TeamMemberEnumerator bi t Team n m d i c thay i hay khng (xem m c 16.10 c thm thng tin v m u Observer). L p TeamMemberEnumerator l m t l p private l ng bn trong nn b n khng th t o cc th hi n c a n, tr khi thng qua phng th c Team.GetEnumerator. D i y l ph n m cho l p Team v TeamMemberEnumerator:
// L p Team m t t p h p cc i t ng TeamMember. Hi n th c giao di n // IEnumerable h tr vi c li t k cc i t ng TeamMember. public class Team : IEnumerable { // TeamMemberEnumerator l m t l p private l ng bn trong, cung c p // ch c nng li t k cc i t ng TeamMember trong t p h p // Team. V l l p l ng bn trong nn TeamMemberEnumerator // c th truy xu t cc thnh vin private c a l p Team. private class TeamMemberEnumerator : IEnumerator { private Team sourceTeam; // Gi tr lu n l cho bi t Team n m d i c thay private bool teamInvalid = false; // Gi tr nguyn cho bi t TeamMember hi n t i (ch // trong ArrayList). Gi tr ban u l -1. private int currentMember = -1; // Phng th c kh i d ng (nh n m t tham chi u internal TeamMemberEnumerator(Team team) { this.sourceTeam = team; sourceTeam.TeamChange += new TeamChangedEventHandler(this.TeamChange); } // Hi n th c thu c tnh IEnumerator.Current. public object Current { get { // N u TeamMemberEnumerator ng tr c ph n t u tin // ho c sau ph n t cu i cng th nm ngo i l . if (currentMember == -1 || currentMember > (sourceTeam.teamMembers.Count-1)) { throw new InvalidOperationException(); } // N u khng, tr v TeamMember hi n t i. return sourceTeam.teamMembers[currentMember]; } } i hay khng. s Team hi n th c m u Observer b ng cch s

n Team).

495 Chng 16: Cc giao di n v m u thng d ng // Hi n th c phng th c IEnumerator.MoveNext. public bool MoveNext() { // N u Team n m d i b t h p l , nm ngo i l . if (teamInvalid) { throw new InvalidOperationException("Team modified"); } // N u khng, ti n currentMember++; n TeamMember k ti p.

// Tr v false n u ta d ch qua kh i TeamMember cu i cng. if (currentMember > (sourceTeam.teamMembers.Count-1)) { return false; } else { return true; } } // Hi n th c phng th c IEnumerator.Reset. Phng th c ny // reset v tr c a TeamMemberEnumerator v u t p h p Team. public void Reset() { // N u Team n m d i b t h p l , nm ngo i l . if (teamInvalid) { throw new InvalidOperationException("Team modified"); } // D ch con tr currentMember v currentMember = -1; } // Phng th c th l s ki n t p h p Team n m d i thay internal void TeamChange(Team t, EventArgs e) { // Bo hi u Team n m d i hi n teamInvalid = true; } } // y nhi m dng ch nh ch k m t t c // cc phng th c th l s ki n ph i hi n th c. public delegate void TeamChangedEventHandler(Team t, EventArgs e); // ArrayList dng ch a cc private ArrayList teamMembers; i t ng TeamMember. ang b t h p l . i. tr c ph n t u tin.

// S ki n dng bo cho TeamMemberEnumerator // bi t Team thay i. public event TeamChangedEventHandler TeamChange; // Phng th c kh i d ng Team. public Team() { teamMembers = new ArrayList(); } // Hi n th c phng th c IEnumerable.GetEnumerator. public IEnumerator GetEnumerator() {

496 Chng 16: Cc giao di n v m u thng d ng return new TeamMemberEnumerator(this); } // Thm m t i t ng TeamMember vo Team. public void AddMember(TeamMember member) { teamMembers.Add(member); if (TeamChange != null) { TeamChange(this, null); } } }

N u l p t p h p c a b n ch a nhi u ki u d li u khc nhau v b n mu n li t k chng m t cch ring r , vi c hi n th c giao di n IEnumerable trn l p t p h p ny th v n cn thi u. Trong tr ng h p ny, b n c n hi n th c m t s thu c tnh tr v cc th hi n khc nhau c a IEnumerator. V d , n u l p Team m t c cc thnh vin v cc my tnh trong i, b n c th hi n th c cc thu c tnh ny nh sau:
// Thu c tnh dng li t k cc thnh vin trong public IEnumerator Members { get { return new TeamMemberEnumerator(this); } } // Thu c tnh dng li t k cc computer trong public IEnumerator Computers { get { return new TeamComputerEnumerator(this); } } i. i.

Khi , b n c th s d ng cc enumerator ny nh sau:


Team team = new Team(); foreach(TeamMember in team.Members) { // Lm g ... } foreach(TeamComputer in team.Computers) { // Lm g ... }

L nh foreach cng h tr cc ki u c hi n th c m t m u tng ng v i m u c nh ngha b i giao di n IEnumerable v IEnumerator, m c d ki u khng hi n th c cc giao di n ny. Tuy nhin, m l nh c a b n s r rng hn v d hi u hn n u b n hi n th c giao di n IEnumerable. B n hy xem C# Language Specification bi t chi ti t v cc yu c u c a l nh foreach [http://msdn.microsoft. com/net/ecma].

497 Chng 16: Cc giao di n v m u thng d ng

16.5

Hin thc lp kh-hy (disposable class)

B n c n t o m t l p c tham chi u n cc ti nguyn khng- c-qu n-l v cung c p m t c ch ng i dng gi i phng cc ti nguyn m t cch t t nh. Hi n th c giao di n System.IDisposable, v gi i phng cc ti nguyn khng- cqu n-l khi m client g i phng th c IDisposable.Dispose. M t i t ng khng c tham chi u n v n t n t i trn vng nh ng (heap) v tiu th cc ti nguyn cho n khi b thu gom rc (Garbage Collector) gi i phng i t ng v cc ti nguyn. B thu gom rc s t ng gi i phng cc ti nguyn c-qu n-l (nh b nh ), nhng n s khng gi i phng cc ti nguyn khng- c-qu n-l (nh file handle v k t n i c s d li u) c tham chi u b i cc i t ng c-qu n-l. N u m t i t ng ch a cc thnh vin d li u tham chi u n cc ti nguyn khng- c-qu n-l, i t ng ny ph i gi i phng cc ti nguyn . M t gi i php l khai bo m t destructorhay finalizercho l p. Tr c khi gi i phng ph n b nh do m t th hi n c a l p s d ng, b thu gom rc s g i finalizer c a i t ng ny. Finalizer c th th c hi n cc b c c n thi t gi i phng cc ti nguyn khng- c-qu nl. V b thu gom rc ch s d ng m t ti u trnh th c thi t t c cc finalizer, vi c s d ng finalizer c th b t l i trong qu trnh thu gom rc v nh h ng n hi u nng c a ng d ng. Ngoi ra, b n khng th ki m sot khi b th c thi gi i phng cc ti nguyn khng- cqu n-l v b n khng th tr c ti p g i finalizer c a m t i t ng, v b n ch c quy n ki m sot h n ch trn cc ho t ng c a b thu gom rc b ng l p System.GC. B ng cch s d ng finalizer, .NET Framework nh ngha m u Dispose nh m t phng ti n cung c p quy n ki m sot khi b th c thi gi i phng cc ti nguyn khng- c-qu n-l. hi n th c m u Dispose, l p ph i hi n th c giao di n IDisposable. Giao di n ny khai bo m t phng th c c tn l Dispose; trong , b n ph i hi n th c ph n m c n thi t gi i phng cc ti nguyn khng- c-qu n-l. Cc th hi n c a cc l p c hi n th c m u Dispose c g i l cc i t ng kh -h y (disposable object). Khi m l nh hon t t v i m t i t ng kh -h y, n s g i phng th c Dispose c a i t ng gi i phng cc ti nguyn khng- c-qu n-l, v n d a vo b thu gom rc gi i phng cc ti nguyn c-qu n-l c a i t ng. C n hi u r ng b th c thi khng b t bu c h y cc i t ng; vi c g i phng th c Dispose l nhi m v c a client. Tuy nhin, v th vi n l p .NET Framework s d ng m u Dispose r ng kh p nn C# cung c p l nh using n gi n ha vi c s d ng cc i t ng kh -h y. o n m sau trnh by c u trc c a l nh using:
using (FileStream fileStream = new FileStream("SomeFile.txt", FileMode.Open)) { // Lm g v i i t ng fileStream... }

D i y l m t s

i m c n lu khi hi n th c m u Dispose:

M client nn c kh nng g i i g i l i phng th c Dispose m khng gy ra cc nh h ng b t l i.

498 Chng 16: Cc giao di n v m u thng d ng

Trong cc ng d ng h -tr - a-ti u-trnh, i u quan tr ng l ch c m t ti u trnh th c thi phng th c Dispose. Thng th ng, b o m s ng b ti u trnh l nhi m v c a m client, m c d b n c th hi n th c s ng b bn trong phng th c Dispose. Phng th c Dispose khng nn nm ngo i l . V phng th c Dispose d n d p t t c nn khng c n g i finalizer c a Phng th c Dispose c a b n nn g i phng th c GC.SuppressFinalize finalizer khng c g i trong qu trnh thu gom rc. i t ng. b o m

Hi n th c m t finalizer sao cho phng th c Dispose s c n g i theo m t c ch an ton trong tr ng h p m client g i Dispose khng ng. Tuy nhin, nn trnh tham chi u n cc i t ng c-qu n-l trong finalizer v khng r tr ng thi c a i t ng. N u m t l p kh -h y th a k m t l p kh -h y khc, phng th c Dispose c a l p con ph i g i phng th c Dispose c a l p cha. Gi ph n m c a l p con trong m t kh i try v g i phng th c Dispose c a l p cha trong m t m nh finally b o m vi c th c thi. Cc phng th c v thu c tnh khc c a l p nn nm ngo i l i
System.ObjectDisposedException n u m client th c thi m t phng th c trn m t

t ng b h y. L p DisposeExample d i y minh h a m t hi n th c ph bi n c a m u Dispose:


using System; // Hi n th c giao di n IDisposable. public class DisposeExample : IDisposable { // Ph n t d li u private dng // i t ng b h y hay cha. bool isDisposed = false; bo hi u

// Ph n t d li u private dng lu gi // handle c a ti nguyn khng- c-qu n-l. private IntPtr resourceHandle; // Phng th c kh i d ng. public DisposeExample() { // Thu l y tham chi u n ti nguyn khng- c-qu n-l. // resourceHandle = ... } // Destructor/Finalizer. ~DisposeExample() { // G i phin b n n p ch ng protected c a Dispose // v truy n gi tr "false" cho bi t r ng // Dispose ang c g i trong qu trnh thu gom rc, // ch khng ph i b i m consumer. Dispose(false); } // Hi n th c public c a phng th c IDisposable.Dispose, c g i // b i consumer c a i t ng gi i phng cc ti nguyn khng// c-qu n-l m t cch t t nh.

499 Chng 16: Cc giao di n v m u thng d ng public void Dispose() { // G i phin b n n p ch ng protected c a Dispose v truy n // gi tr "true" cho bi t r ng Dispose ang c g i // b i m consumer, ch khng ph i b i b thu gom rc. Dispose(true); // V phng th c Dispose th c hi n t t c vi c d n d p c n // thi t nn b o m b thu gom rc khng g i destructor c a l p. GC.SuppressFinalize(this); } // Phin b n n p ch ng protected c a phng th c Dispose. i s // disposing cho bi t phng th c c g i b i m consumer (true), // hay b i b thu gom rc (false). protected virtual void Dispose(bool disposing) { if (!isDisposed) { if (disposing) { // Phng th c ny c g i b i m consumer. G i // phng th c Dispose c a cc thnh vin d li u // c-qu n-l c hi n th c giao di n IDisposable. // } // Gi i phng t t c cc ti nguyn khng- c-qu n-l // v thi t l p gi tr c a cc thnh vin d li u // c-qu n-l thnh null. // Close(resourceHandle); } // Bo r ng i t ng ny isDisposed = true; } // Tr c khi th c thi b t k ch c nng no, b o // Dispose cha c th c thi trn i t ng. public void SomeMethod() { // Nm m t ngo i l if (isDisposed) { } // Th c thi ch c nng c a phng th c... // } public static void Main() { // L nh using b o m phng th c Dispose c g i // c khi ngo i l x y ra. using (DisposeExample d = new DisposeExample()) { // Lm g } } } v i d... n u i t ng b h y. m r ng b h y.

throw new ObjectDisposedException("DisposeExample");

500 Chng 16: Cc giao di n v m u thng d ng

16.6

Hin thc kiu kh-nh-dng (formattable type)

B n c n hi n th c m t ki u c th c s d ng theo cc format string, v c th t o ra nh ng bi u di n chu i khc nhau cho n i dung c a n d a vo format specifier. Hi n th c giao di n System.IFormattable. o n m d i y minh h a cch s d ng format specifier (ph n in
WriteLine c a l p 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);

m) trong phng th c

Khi ch y trn my v i thi t l p b n a l English (U.K.), o n m ny s cho k t xu t nh sau (thay i n i dung c a format specifier s thay i nh d ng c a k t xu t m t cch ng k m c d d li u v n khng thay i):
a = 345678.5678, b = 12000, and c = 254 a = 345,679, b = 12,000.0000, and c = 000fe

kch ho t vi c h tr format specifier, b n ph i hi n th c giao di n IFormattable. Giao di n ny khai bo m t phng th c c tn l ToString v i ch k nh sau:
string ToString(string format, IFormatProvider formatProvider);

i s format l m t System.String ch a format string (chu i nh d ng). Format string l ph n format specifier pha sau d u hai ch m. V d , trong format specifier {2,10:x5} ( v d trn), "x5" l format string. Format string ch a nh ng ch th m th hi n IFormattable s s d ng khi t o ra d ng chu i cho n i dung c a n. Ti li u .NET Framework pht bi u r ng: nh ng ki u c hi n th c IFormattable th ph i h tr format string "G" (general), nhng nh ng format string c h tr khc th ph thu c vo hi n th c. i s format l null n u format specifier khng ch a ph n format string, v d {0} hay {1,20}. i s formatProvider l tham chi u n m t th hi n System.IFormatProvider (dng truy xu t cc thng tin b n abao g m cc d li u nh bi u t ng ti n t hay s l ng ch s th p phn). Theo m c nh, formatProvider l null, ngha l b n s s d ng cc thi t l p b n a c a ti u trnh hi n hnh (c th l y c thng qua phng th c tnh CurrentCulture c a l p System.Globalization.CultureInfo). .NET Framework ch y u s d ng IFormattable h tr vi c nh d ng cc ki u gi tr , nhng n c th c s d ng cho b t k ki u no. V d , l p Person d i y c hi n th c giao di n IFormattable. L p ny ch a danh hi u v tn c a m t ng i, v s tr v tn theo cc nh d ng khc nhau ty vo format string. L p Person khng s d ng cc thi t l p b n a do i s formatProvider cung c p.
using System; public class Person : IFormattable { // Cc thnh vin private dng lu tr danh hi u

501 Chng 16: Cc giao di n v m u thng d ng // v tn c a m t ng i. private string title; private string[] names; // Phng th c kh i d ng dng thi t l p danh hi u v tn. public Person(string title, params string[] names) { this.title = title; this.names = names; } // Chp phng th c Object.ToString // tn theo nh d ng general. public override string ToString() { return ToString("G", null); } tr v

// Hi n th c phng th c IFormattable.ToString tr v // tn theo cc d ng khc nhau d a trn format string. public string ToString(string format, IFormatProvider formatProvider) { string result = null; // S d ng nh d ng general n u format = null. if (format == null) format = "G"; // N i dung c a format string cho bi t switch (format.ToUpper()[0]) { nh d ng c a tn.

case 'S': // S d ng d ng short: first-initial v surname. result = names[0][0] + ". " + names[names.Length-1]; break; case 'P': // S d ng d ng 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 d ng d ng informal: ch result = names[0]; break; c first-name.

case 'G': default: // S d ng d ng m c nh/general: first-name v surname. result = names[0] + " " + names[names.Length-1]; break; } return result; } }

502 Chng 16: Cc giao di n v m u thng d ng

o n m d i y trnh by cch s d ng kh nng

nh d ng c a l p Person:

// T o m t i t ng Person m t m t ng i c tn l // Mr. Richard Glen David Peters. Person person = new Person("Mr", "Richard", "Glen", "David", "Peters"); // Hi n th tn b ng nhi u 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 th c thi, o n m ny sinh ra k t xu t nh sau:


Dear Dear Dear Dear Dear Richard Peters, Mr. R. G. D. Peters, Richard, Richard Peters, R. Peters,

16.7

Hin thc lp ngoi l ty bin

B n c n t o m t l p ngo i l ty bi n sao cho b n c th s d ng c ch th l ngo i l c a b th c thi th l cc ngo i l c-trng- ng-d ng. T o m t l p kh -tu n-t -ha, th a k l p System.ApplicationException v hi n th c cc phng th c kh i d ng v i ch k nh sau:
public CustomException() : base() {} public CustomException(string message) : base(message) {} public CustomException(string message, Exception inner) : base(message, inner) {}

Thm b t c thnh vin d li u ty bi n no m ngo i l c n n, bao g m cc phng th c kh i d ng v cc thu c tnh c n thi t thao tc cc thnh vin d li u. Cc l p ngo i l l duy nh t, b n khng c khai bo cc l p m i hi n th c ch c nng m i hay m r ng. C ch th l ngo i l c a b th c thi ( c trng ra b i cc l nh: try, catch, v finally) lm vi c d a trn ki u ngo i l b nm, ch khng ph i cc thnh vin ch c nng hay d li u c hi n th c b i ngo i l b nm. N u c n nm m t ngo i l , b n nn s d ng m t l p ngo i l c s n trong th vi n l p .NET Framework (n u t n t i m t l p ph h p). D i y l m t s ngo i l h u ch:
System.ArgumentNullExceptionkhi m l nh truy n m t gi tr

i s null cho m t

phng th c khng h tr tr

i s null.

System.ArgumentOutOfRangeExceptionkhi m l nh truy n cho phng th c m t gi

i s khng ph h p (l n qu hay nh qu). i s


String

System.FormatExceptionkhi m l nh truy n cho phng th c m t

ch a d li u khng c

nh d ng ng.

N u khng c l p ngo i l no p ng c nhu c u c a b n, ho c b n c m th y ng d ng c a b n s c l i t vi c s d ng cc ngo i l c-trng- ng-d ng, b n c th t o m t l p

503 Chng 16: Cc giao di n v m u thng d ng

ngo i l cho mnh. tch h p ngo i l ty bi n v i c ch th l ngo i l c a b th c thi v v n gi tnh nh t qun v i m u c hi n th c b i cc l p ngo i l c s n, b n c n: t m t tn c ngha cho l p ngo i l ty bi n, k t thc b ng t Exception, ch ng h n, TypeMismatchException hay RecordNotFoundException. Th a k l p ApplicationException. V c b n, l p ngo i l ty bi n ph i th a k l p System.Exception, n u khng trnh bin d ch s d ng ln l i khi b n nm ngo i l . ApplicationException th a k Exception v c ngh lm l p s s cho t t c cc l p ngo i l c-trng- ng-d ng. nh d u l p ngo i l ty bi n l sealed n u b n khng mu n cc l p ngo i l khc c th th a k n. Hi n th c thm cc thu c tnh v cc thnh vin d li u m l p ngo i l ny cung c p. h tr cc thng tin ty bi n m

Hi n th c ba phng th c kh i d ng public v i ch k nh d i y v b o chng g i phng th c kh i d ng c a l p c s :


public CustomException() : base() {} public CustomException(string message): base(message) {} public CustomException(string message, Exception inner) : base(message, inner) {}

Lm cho l p ngo i ty bi n tr nn kh -tu n-t -ha b th c thi c th marshal cc th hi n c a n qua cc bin mi n ng d ng v bin my. p d ng c tnh System.SerializableAttribute th ng l cho cc l p ngo i l khng hi n th c cc thnh vin d li u ty bi n. Tuy nhin, v Exception hi n th c giao di n System.Runtime.Serialization.ISerializable nn n u ngo i l c a b n c khai bo cc thnh vin d li u ty bi n, b n ph i chp phng th c ISerializable.GetObjectData c a l p Exception cng nh hi n th c m t phng th c kh i d ng gi i tu n t ha v i ch k nh d i y. N u l p ngo i l c a b n l sealed, nh d u phng th c kh i d ng gi i tu n t ha l private; n u khng th nh d u n l protected.
private CustomException(SerializationInfo info, StreamingContext context) {}

Phng th c GetObjectData v phng th c kh i d ng gi i tu n t ha ph i g i phng th c tng ng trong l p c s cho php l p c s th c hi n tu n t ha v gi i tu n t ha d li u c a n m t cch ng n (xem m c 16.1 bi t cch lm cho m t l p tr nn kh -tu n-t -ha). D i y l m t l p ngo i l ty bi n c tn l CustomException (th a k l p ApplicationException). L p ny khai bo hai thnh vin d li u ty bi n: m t chu i c tn l stringInfo v m t gi tr lu n l c tn l booleanInfo.
using System; using System.Runtime.Serialization; // nh d u CustomException l Serializable (kh -tu n-t -ha). [Serializable] public sealed class CustomException : ApplicationException { // Cc thnh vin d li u ty bi n cho CustomException.

504 Chng 16: Cc giao di n v m u thng d ng private string stringInfo; private bool booleanInfo; // Ba phng th c kh i d ng chu n; ch c n g i phng th c // kh i d ng c a l p c s (System.ApplicationException). public CustomException() : base() {} public CustomException(string message): base(message) {} public CustomException(string message, Exception inner) : base(message, inner) {} // Phng th c kh i d ng gi i tu n t ha (c n cho giao di n // ISerialization). V CustomException l sealed nn phng th c // kh i d ng ny l private. N u CustomException khng ph i l // sealed th phng th c kh i d ng ny nn c khai bo l // protected cc l p d n xu t c th g i n trong qu trnh // gi i tu n t ha. private CustomException(SerializationInfo info, StreamingContext context) : base (info, context) { // Gi i tu n t ha m i thnh vin d li u ty bi n. stringInfo = info.GetString("StringInfo"); booleanInfo = info.GetBoolean("BooleanInfo"); } // Cc phng th c kh i d ng cho php m l nh thi t l p // cc thnh vin d li u ty bi n. 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 thu c tnh ch - c cho php truy xu t // thnh vin d li u ty bi n. public string StringInfo { get { return stringInfo; } } public bool BooleanInfo { get { return booleanInfo; } } // Phng th c GetObjectData ( c khai bo trong giao di n // ISerializable) c s d ng trong qu trnh tu n t ha // CustomException. V CustomException c khai bo cc thnh // vin d li u ty bi n nn n ph i chp hi n th c // GetObjectData c a l p c s . public override void GetObjectData(SerializationInfo info, StreamingContext context) { // Tu n t ha cc thnh vin d li u ty bi n. info.AddValue("StringInfo", stringInfo); info.AddValue("BooleanInfo", booleanInfo); n cc

505 Chng 16: Cc giao di n v m u thng d ng // G i l p c s tu n t ha cc thnh vin c a n. base.GetObjectData(info, context); } // Chp thu c tnh Message c a l p c s ( km cc // thnh vin d li u ty bi n vo). public override string Message { get { string message = base.Message; if (stringInfo != null) { message += Environment.NewLine + stringInfo + " = " + booleanInfo; } return message; } } }

Trong cc ng d ng l n, b n s th ng xuyn hi n th c m t vi l p ngo i l ty bi n. B n c n lu tm n cch t ch c cc ngo i l ty bi n v m l nh s s d ng chng nh th no. Ni chung, trnh t o ra cc l p ngo i l m i tr khi m l nh c n n l c b t ngo i l ; s d ng cc thnh vin d li u thu thng tin, ch khng ph i cc l p ngo i l . Ngoi ra, trnh phn c p l p theo chi u su m nn phn c p c n, theo chi u r ng.

16.8

Hin thc i s s kin ty bin


c-trng-s -ki n cho

Khi d ng ln m t s ki n, b n c n truy n m t tr ng thi cc phng th c th l s ki n.

T o m t l p i s s ki n ty bi n d n xu t t l p System.EventArg. Khi d ng ln s ki n, hy t o m t th hi n c a l p i s s ki n v truy n n cho cc phng th c th l s ki n. Khi khai bo cc ki u s ki n, thng th ng b n s c n truy n tr ng thi c-trng-s -ki n cho cc phng th c th l s ki n. t o m t l p i s s ki n ty bi n tun theo m u Event do .NET Framework nh ngha, b n c n: D n xu t l p i s s ki n ty bi n t l p EventArgs. L p EventArgs khng ch a d li u v c s d ng cng v i cc s ki n khng c n truy n tr ng thi. t m t tn c ngha cho l p i s s ki n ty bi n, k t thc b ng t EventArgs; ch ng h n, DiskFullEventArgs hay MailReceivedEventArgs. nh d u l p i s s ki n l sealed n u b n khng mu n cc l p c th th a k n. i s s ki n khc

Hi n th c thm cc thu c tnh v cc thnh vin d li u h tr tr ng thi s ki n m b n c n truy n cho cc phng th c th l s ki n. T t nh t l lm cho tr ng thi s ki n tr nn b t bi n (immutable), nh v y b n nn s d ng cc thnh vin d li u private readonly v s d ng cc thu c tnh public cho php truy xu t ch - c n cc thnh vin d li u ny.

506 Chng 16: Cc giao di n v m u thng d ng

Hi n th c m t phng th c kh i d ng public h tr c u hnh ban ki n.

u c a tr ng thi s

Lm cho l p i s s ki n c a b n tr nn kh -tu n-t -ha (serializable) b th c thi c th marshal cc th hi n c a n qua cc bin mi n ng d ng v bin my. p d ng c tnh System.SerializableAttribute th ng l cho cc l p i s s ki n. Tuy nhin, n u l p i s s ki n c cc yu c u tu n t ha c bi t, b n ph i hi n th c giao di n System.Runtime.Serialization.ISerializable (xem m c 16.1 bi t cch lm cho m t l p tr nn kh -tu n-t -ha).

o n m d i y trnh by m t l p i s s ki n ty bi n c tn l MailReceivedEventArgs. Gi s c m t mail-server truy n cc th hi n c a l p MailReceivedEventArgs cho cc phng th c th l s ki n nh n m t thng i p e-mail. L p ny ch a cc thng tin v ng i g i v ch c a thng i p e-mail.
using System; [Serializable] public sealed class MailReceivedEventArgs : EventArgs { // Cc thnh vin private readonly gi tr ng thi s ki n // ( c phn b cho t t c cc phng th c th l s ki n). // L p MailReceivedEventArgs s cho bi t ai g i mail // v ch l g. private readonly string from; private readonly string subject; // Phng th c kh i d ng (kh i t o tr ng thi s ki n). public MailReceivedEventArgs(string from, string subject) { this.from = from; this.subject = subject; } // Cc thu c tnh ch - c cho php truy xu t // tr ng thi s ki n. public string From { get { return from; } } public string Subject { get { return subject; } } }

16.9

Hin thc mu Singleton

B n c n b o m ch c m t th hi n c a m t ki u t n t i m t th i i m cho tr c v th hi n l kh -truy-xu t i v i t t c cc ph n t c a ng d ng. Hi n th c ki u ny theo m u Singleton nh sau: Hi n th c m t thnh vin tnh private ki u. gi m t tham chi u n th hi n c a

Hi n th c m t thu c tnh tnh kh -truy-xu t-cng-khai ch - c n th hi n. Hi n th c m t phng th c kh i d ng private cc th hi n c a ki u.

cho php truy xu t

m l nh khng th t o thm

507 Chng 16: Cc giao di n v m u thng d ng

Trong t t c cc m u c bi t n, c l m u Singleton c bi t n nhi u nh t v th ng c s d ng nh t. M c ch c a m u Singleton l b o m ch c m t th hi n c a m t ki u t n t i m t th i i m cho tr c v cho php truy xu t ton c c n cc ch c nng c a th hi n . o n m d i y trnh by m t hi n th c c a m u Singleton cho m t l p c tn l SingletonExample:
public class SingletonExample { // Thnh vin tnh dng gi m t tham chi u private static SingletonExample instance; n th hi n singleton.

// Phng th c kh i d ng tnh dng t o th hi n singleton. // M t cch khc l s d ng "Lazy Initialization" trong // thu c tnh Instance. static SingletonExample () { instance = new SingletonExample(); } // Phng th c kh i d ng private dng // cc th hi n c a ki u singleton. private SingletonExample () {} ngn m l nh t o thm

// Thu c tnh public cho php truy xu t n th public static SingletonExample Instance { get { return instance; } }

hi n singleton.

// Cc phng th c public cung c p ch c nng c a singleton. public void SomeMethod1 () { /*..*/ } public void SomeMethod2 () { /*..*/ } }

g i cc ch c nng c a l p SingletonExample, b n c th l y v m t tham chi u n singleton b ng thu c tnh Instance v r i g i cc phng th c c a n. B n cng c th tr c ti p th c thi cc thnh vin c a singleton thng qua thu c tnh Instance. o n m d i y trnh by c hai cch ny:
// Thu l y tham chi u n singleton v g i m t phng th c c a n. SingletonExample s = SingletonExample.Instance; s.SomeMethod1(); // Th c thi ch c nng c a singleton m khng c n tham chi u. SingletonExample.Instance.SomeMethod2();

16.10

Hin thc mu Observer


i

B n c n hi n th c m t c ch hi u qu m t i t ng (subject) bo v i cc t ng khc (observer) v nh ng thay i tr ng thi c a n.

Hi n th c m u Observer b ng cc ki u y nhi m ( ng vai tr l cc con tr hm an-ton-v -ki u-d -li utype-safe function pointer) v cc ki u s ki n. Cch truy n th ng khi hi n th c m u Observer l hi n th c hai giao di n: m t m t observer (IObserver) v m t m t subject (ISubject). Cc i t ng c hi n th c

508 Chng 16: Cc giao di n v m u thng d ng

ng k v i subject, cho bi t chng mu n c thng bo v cc s ki n quan tr ng (nh thay i tr ng thi) tc ng n subject. Subject ch u trch nhi m qu n l danh sch cc observer ng k v thng bo v i chng khi p ng cc s ki n tc ng n subject. Subject th ng thng bo v i observer b ng phng th c Notify ( c khai bo trong giao di n IObserver). Subject c th truy n d li u cho observer trong phng th c Notify, ho c observer c th c n g i m t phng th c c khai bo trong giao di n ISubject thu l y thm cc chi ti t v s ki n. M c d b n c th hi n th c m u Observer b ng C# theo cch v a c m t , nhng v m u Observer qu ph bi n trong cc gi i php ph n m m hi n i nn C# v .NET Framework cung c p cc ki u s ki n v y nhi m n gi n ha hi n th c c a n. S d ng s ki n v y nhi m ngha l b n khng c n khai bo giao di n IObserver v ISubject. Ngoi ra, b n khng c n hi n th c cc logic c n thi t qu n l v thng bo v i cc observer ng k y chnh l ph n d x y ra l i nh t khi vi t m. .NET Framework s d ng m t hi n th c cho m u Observer d a-trn-s -ki n v d a-trn- ynhi m th ng xuyn n n i n c t m t ci tn: m u Event. File ObserverExample.cs ch a m t hi n th c cho m u Event. V d ny bao g m: L p Thermostat (subject)theo di nhi t s thay i nhi t . L p
TemperatureChangeEventArgsl System.EventArgs, c s d ng

IObserver s

hi n t i v thng bo v i observer khi c l p

m t hi n th c ty bi n c a ng gi d li u c n phn b cho observer.

y nhi m TemperatureEventHandler nh ngha ch k c a phng th c m t t c cc observer c a i t ng Thermostat ph i hi n th c, v i t ng Thermostat s g i phng th c ny trong s ki n thay i nhi t . L p TemperatureChangeObserver v TemperatureAverageObserverl cc observer c a l p Thermostat.
TemperatureChangeEventArgs

L p

( c trnh by bn d i) d n xu t t l p ch a t t c cc d li u c n thi t subject truy n cho cc observer khi n thng bo v i chng v m t s ki n. N u khng c n truy n d li u, b n khng ph i nh ngha m t l p i s m i (b n ch c n truy n i s null khi d ng nn s ki n). Xem m c 16.8 bi t r hn v cch hi n th c l p i s s ki n ty bi n.
System.EventArgs. L p ny s // L p i s s ki n ch a thng tin v s ki n thay i nhi t . // M t th hi n c a l p ny s c truy n cng v i m i s ki n. public class TemperatureChangeEventArgs : System.EventArgs { // Cc thnh vin d li u ch a nhi t c v m i. private readonly int oldTemperature, newTemperature; // Phng th c kh i d ng (nh n gi tr nhi t c v m i). public TemperatureChangeEventArgs(int oldTemp, int newTemp) { oldTemperature = oldTemp; newTemperature = newTemp; } // Cc thu c tnh dng truy xu t cc gi tr nhi t . public int OldTemperature { get { return oldTemperature; } } public int NewTemperature { get { return newTemperature; } }

509 Chng 16: Cc giao di n v m u thng d ng }

o n m d i y trnh by cch khai bo y nhi m TemperatureEventHandler. D a trn khai bo ny, t t c cc observer ph i hi n th c m t phng th c (tn khng quan tr ng), tr v void v nh n hai i s : m t i t ng Thermostat v m t i t ng TemperatureChangeEventArgs. Trong qu trnh thng bo, i s Thermostat ch n i t ng Thermostat d ng nn s ki n, v i s TemperatureChangeEventArgs ch a cc d li u v nhi t c v m i.
// y nhi m cho bi t ch k m t t c cc phng th c // th l s ki n ph i hi n th c. public delegate void TemperatureEventHandler(Thermostat s, TemperatureChangeEventArgs e);

L p Thermostat l i t ng b gim st trong m u Observer (Event) ny. Theo l thuy t, m t thi t b gim st thi t l p nhi t hi n t i b ng cch g i thu c tnh Temperature trn m t i t ng Thermostat. Khi , i t ng Thermostat d ng nn s ki n TemperatureChange v g i m t i t ng TemperatureChangeEventArgs n m i observer. D i y l m l nh cho l p Thermostat:
// L p m t m t b n nhi t, l ngu n g c c a cc s ki n thay i // nhi t . Trong m u Observer, i t ng Thermostat l subject. public class Thermostat { // Tr ng private dng gi private int temperature = 0; nhi t hi n t i.

// S ki n dng duy tr danh sch cc y nhi m observer v // d ng nn s ki n thay i nhi t . public event TemperatureEventHandler TemperatureChange; // Phng th c protected dng d ng nn s ki n TemperatureChange. // V s ki n ch c th c pht sinh bn trong ki u ch a n nn // vi c s d ng phng th c protected cho php cc l p d n xu t // c cch hnh x ty bi n v v n c th d ng nn s ki n // c a l p c s . virtual protected void RaiseTemperatureEvent (TemperatureChangeEventArgs e) { if (TemperatureChange != null) { TemperatureChange(this, e); } } // Thu c tnh public dng l y v thi t l p nhi t hi n t i. // Pha "set" ch u trch nhi m d ng nn s ki n thay i nhi t // thng bo v i t t c cc observer v thay i ny. public int Temperature { get { return temperature; } set { // T o m t i t ng i s s ki n m i ch a // nhi t c v m i. TemperatureChangeEventArgs e = new TemperatureChangeEventArgs(temperature, value); // C p nh t nhi t hi n t i. temperature = value;

510 Chng 16: Cc giao di n v m u thng d ng // D ng nn s ki n thay RaiseTemperatureEvent(e); } } } i nhi t .

Observer, v d ny c hai ki u observer: trung bnh m i khi m t s ki n thay i nhi t x y ra) v TemperatureChangeObserver (hi n th thng tin v s thay i m i khi m t s ki n thay i nhi t x y ra). D i y l m l nh cho hai l p ny:
TemperatureAverageObserver (hi n th nhi t // Observer hi n th thng tin v s thay i nhi t // khi c m t s ki n thay i nhi t x y ra. public class TemperatureChangeObserver { // Phng th c kh i d ng (nh n m t tham chi u n i t ng // Thermostat c n c TemperatureChangeObserver gim st). public TemperatureChangeObserver(Thermostat t) { // T o m t th hi n y nhi m TemperatureEventHandler v // ng k n v i Thermostat c ch nh. t.TemperatureChange += new TemperatureEventHandler(this.TemperatureChange); } // Phng th c th l s ki n thay i nhi t . 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 hi n th thng tin v nhi t d trung bnh // khi c m t s ki n thay i nhi t x y ra. public class TemperatureAverageObserver { // Sum ch a t ng cc gi tr nhi t // Count ch a s l n s ki n thay private int sum = 0, count = 0; . i nhi t x y ra.

V i

m c

ch

minh

h a

m u

// Phng th c kh i d ng (nh n m t tham chi u n i t ng // Thermostat c n c TemperatureAverageObserver gim st). public TemperatureAverageObserver (Thermostat t) { // T o m t th hi n y nhi m TemperatureEventHandler v // ng k n v i Thermostat c ch nh. t.TemperatureChange += new TemperatureEventHandler(this.TemperatureChange); } // Phng th c th l s ki n thay i nhi t . public void TemperatureChange(Thermostat sender, TemperatureChangeEventArgs temp) { count++; sum += temp.NewTemperature;

511 Chng 16: Cc giao di n v m u thng d ng System.Console.WriteLine ("AverageObserver: Average={0:F}", (double)sum/(double)count); } }

L p Thermostat nh ngha m t phng th c Main ( c trnh by bn d i) ch y v d ny. Sau khi t o m t i t ng Thermostat v hai i t ng observer, phng th c Main s nh c b n nh p vo m t nhi t . M i khi b n nh p m t nhi t m i, i t ng Thermostat s bo cho observer hi n th thng tin ra c a s Console.
public static void Main() { // T o m t i t ng Thermostat. Thermostat t = new Thermostat(); // T o hai observer. new TemperatureChangeObserver(t); new TemperatureAverageObserver(t); // L p l y nhi t // no khng ph i s do { t ng i dng. B t c gi tr nguyn s khi n vng l p k t thc.

System.Console.Write("\n\rEnter current temperature: "); try { // Chuy n u vo c a ng i dng thnh m t s // nguyn v s d ng n thi t l p nhi t // hi n t i c a b n nhi t. t.Temperature = System.Int32.Parse(System.Console.ReadLine()); } catch (System.Exception) { // S d ng i u ki n ngo i l k t thc vng l p. System.Console.WriteLine("Terminating ObserverExample."); return; } } while (true); }

D i y l k t xu t khi ch y ObserverExample.cs (cc gi tr in


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

m l do b n nh p vo):

512 Chng 16: Cc giao di n v m u thng d ng

513

Chng 17: S

HA H P V I MI TR NG WINDOWS

17

514

515 Chng 17: S ha h p v i mi tr ng Windows

Hi n t i, .NET Framework c th ch y trn cc h i u hnh: Microsoft Windows, FreeBSD, Linux, v Mac OS X. Tuy nhin, nhi u b n hi n th c v n cha hon ch nh hay cha c ch p nh n r ng ri. Microsoft Windows hi n l h i u hnh m .NET Framework c ci t nhi u nh t. Do , cc m c trong chng ny t p trung vo cc tc v c trng cho h i u hnh Windows, bao g m: L y cc thng tin mi tr ng Windows (m c 17.1 v 17.2). Ghi vo nh t k s ki n Windows (m c 17.3). Truy xu t Windows Registry (m c 17.4). T o v ci t d ch v Windows (m c 17.5 v 17.6). T o shortcut trn Desktop hay trong Start menu c a Windows (m c 17.7). Ph n l n cc ch c nng c th o lu n trong chng ny c CLR b o v b ng cc quy n b o m t truy xu t m l nh (Code Access Security). Xem chng 13 v b o m t truy xu t m l nh, v xem ti li u .NET Framework SDK v cc quy n c n thi t th c thi t ng b ph n.

icrosoft .NET Framework c thi t k sao cho c th ch y trn nhi u h i u hnh khc nhau, nng cao tnh kh chuy n c a m l nh (code mobility) v n gi n ha vi c tch h p xuyn-n n (cross-platform integration).

17.1

Truy xut thng tin mi trng

B n c n truy xu t cc thng tin v mi tr ng th c thi m ng d ng ang ch y trong . S d ng cc thnh vin c a l p System.Environment. L p Environment cung c p m t t p cc thnh vin tnh dng l y (v trong m t s tr ng h p, s a i) thng tin v mi tr ng m m t ng d ng ang ch y trong . B ng 17.1 m t cc thnh vin th ng dng nh t.
B ng 17.1 Cc thnh vin th ng dng c a l p Environment Thnh vin Thu c tnh CommandLine M t

L y chu i ch a dng l nh th c thi ng d ng hi n t i, g m c tn ng d ng; xem chi ti t m c 1.5. L y v thi t l p chu i ch a th m c hi n hnh c a ng d ng. Ban u, thu c tnh ny ch a tn c a th m c m ng d ng ch y trong . L y m t gi tr lu n l cho bi t CRL b t u t t, ho c mi n ng d ng b t u gi i phng hay cha. L y chu i ch a tn my.

CurrentDirectory

HasShutdownStarted MachineName

516 Chng 17: S ha h p v i mi tr ng Windows

OSVersion

L y m t i t ng System.OperatingSystem ch a cc thng tin v n n v phin b n c a h i u hnh n m d i. Xem chi ti t bn d i b ng. L y chu i ch a ng d n th ng. y c a th m c h

SystemDirectory

TickCount

L y m t gi tr ki u int cho bi t th i gian (tnh b ng mili-giy) t khi h th ng kh i ng. L y chu i ch a tn mi n c a ng i dng hi n hnh. Thu c tnh ny s gi ng v i thu c tnh MachineName n u y l my c l p. L y m t gi tr lu n l cho bi t ng d ng c ang ch y trong ch tng tc v i ng i dng hay khng. Tr v false khi ng d ng l m t d ch v ho c ng d ng Web. L y chu i ch a tn ng i dng kh i ch y ti u trnh hi n hnh. L y m t i t ng System.Version ch a thng tin v phin b n c a CRL.

UserDomainName

UserInteractive

UserName

Version Phng th c ExpandEnvironmentVariables

Thay tn c a cc bi n mi tr ng trong m t chu i b ng gi tr c a bi n; xem chi ti t m c 17.2. Tr v m t m ng ki u chu i ch a t t c cc ph n t dng l nh dng th c thi ng d ng hi n t i, g m c tn ng d ng; xem chi ti t m c 1.5. Tr v chu i ch a gi tr c a m t bi n mi tr ng; xem chi ti t m c 17.2. Tr v m t System.Collections.Idictionary ch a t t c cc bi n mi tr ng v cc gi tr c a chng; xem chi ti t m c 17.2 Tr v chu i ch a ng d n n m t th m c h th ng c bi t, c xc nh b i ki u li t k System.Environment.SpecialFolder (bao g m cc th m c cho Internet cache, Cookie, History, Desktop, v Favourite; xem ti li u .NET Framework SDK c danh sch t t c cc gi tr ny). Tr v m ng ki u chu i ch a tn c a t t c cc lu n l. a

GetCommandLineArgs

GetEnvironmentVariable

GetEnvironmentVariables

GetFolderPath

GetLogicalDrives

517 Chng 17: S ha h p v i mi tr ng Windows

i t ng OperatingSystem (do OSVersion tr v ) c hai thu c tnh: Platform v Version. Thu c tnh Platform tr v m t gi tr thu c ki u li t k System.PlatformIDxc nh n n hi n hnh; cc gi tr h p l l Win32NT, Win32S, Win32Windows, v WinCE. Thu c tnh Version tr v m t i t ng System.Versionxc nh phin b n c a h i u hnh. xc nh chnh xc tn h i u hnh, b n ph i s d ng c thng tin n n v phin b n, b ng 17.2 d i y s li t k m t s thng tin chi ti t.
B ng 17.2 Xc PlatformID Win32Windows Win32Windows Win32NT Win32NT Win32NT Win32NT nh h i u hnh Major Version Minor Version H i u 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 hi n th

L p AccessEnvironmentExample trong v d d i y s d ng l p Environment thng tin v mi tr ng hi n hnh.


using System; public class AccessEnvironmentExample { public static void Main() { // Dng l nh. Console.WriteLine("Command line : " + Environment.CommandLine); // Thng tin v phin b n h i u hnh v mi tr ng th c 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 ng i dng, my, v mi n. Console.WriteLine("User Name : " + Environment.UserName); Console.WriteLine("Domain Name : " + Environment.UserDomainName); Console.WriteLine("Machine name : " + Environment.MachineName); // Cc thng tin mi tr ng khc. Console.WriteLine("Is interactive ? : " + Environment.UserInteractive); Console.WriteLine("Shutting down ? : " + Environment.HasShutdownStarted); Console.WriteLine("Ticks since startup : " + Environment.TickCount); // Hi n th tn c a t t c cc a lu n l. foreach (string s in Environment.GetLogicalDrives()) { Console.WriteLine("Logical drive : " + s); }

518 Chng 17: S ha h p v i mi tr ng Windows // Thng tin v cc th m c chu n. Console.WriteLine("Current folder : " + Environment.CurrentDirectory); Console.WriteLine("System folder : " + Environment.SystemDirectory); // Li t k t t c cc th m c c bi t. foreach (Environment.SpecialFolder s in Enum.GetValues(typeof(Environment.SpecialFolder))) { Console.WriteLine("{0} folder : {1}", s, Environment.GetFolderPath(s)); } // Nh n Enter k t thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

17.2
S

Ly gi tr ca mt bin mi trng
s d ng cho ng d ng c a b n. d ng cc phng th c GetEnvironmentVariable, GetEnvironmentVariables, v

B n c n l y gi tr c a m t bi n mi tr ng

ExpandEnvironmentVariables c a l p Environment.

Phng th c GetEnvironmentVariable tr v chu i ch a gi tr c a m t bi n mi tr ng, cn phng th c GetEnvironmentVariables tr v m t Idictionary ch a tn v gi tr c a t t c cc bi n mi tr ng d i d ng chu i. Phng th c ExpandEnvironmentVariables cung c p m t c ch n gi n thay tn bi n mi tr ng b ng gi tr c a n bn trong m t chu i, b ng cch t tn bi n mi tr ng gi a d u ph n trm (%). V d sau minh h a cch s d ng ba phng th c trn:
using System; using System.Collections; public class VariableExample { public static void Main () { // L y m t bi n mi tr ng thng qua tn. Console.WriteLine("Path = " + Environment.GetEnvironmentVariable("Path")); Console.WriteLine(); // Thay tn bi n mi tr ng b ng gi tr c a n. Console.WriteLine(Environment.ExpandEnvironmentVariables( "The Path on %computername% is %Path%")); Console.WriteLine(); // L y t t c cc bi n mi tr ng. Hi n th gi tr // c a cc bi n mi tr ng b t u b ng k t 'P'. IDictionary vars = Environment.GetEnvironmentVariables(); foreach (string s in vars.Keys) {

519 Chng 17: S ha h p v i mi tr ng Windows if (s.ToUpper().StartsWith("P")) { Console.WriteLine(s + " = " + vars[s]); } } Console.WriteLine(); // Nh n Enter k t thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

17.3

Ghi mt s kin vo nht k s kin Windows

B n c n ghi m t s ki n vo nh t k s ki n Windows. S d ng cc thnh vin c a l p System.Diagnostics.EventLog t o m t nh t k (n u c n), ng k m t ngu n s ki n (event source), v ghi s ki n. B n c th ghi vo nh t k s ki n Windows b ng cc phng th c tnh c a l p EventLog, ho c c th t o m t i t ng EventLog v s d ng cc thnh vin c a n. D ch n cch no, tr c khi ghi b n c n ph i quy t nh s s d ng nh t k no v ng k m t ngu n s ki n cho nh t k . Ngu n s ki n n gi n ch l m t chu i (duy nh t) nh n di n ng d ng c a b n. M t ngu n s ki n ch c th c ng k cho m t nh t k t i m t th i i m. Theo m c nh, nh t k s ki n g m ba lo i: Application, System, v Security. Thng th ng, b n s ghi vo nh t k Application, nhng cng c th ghi vo m t nh t k ty bi n. B n khng c n ph i tr c ti p t o ra nh t k ty bi n; khi b n ng k m t ngu n s ki n cho m t nh t k, n u nh t k ny khng t n t i, n s c t o m t cch t ng. M t khi ch n nh t k ch v ng k ngu n s ki n tng ng cho n, b n c th b t u ghi cc entry nh t k b ng phng th c WriteEntry. Phng th c ny cung c p cc phin b n n p ch ng cho php b n ch nh m t vi ho c t t c cc gi tr sau: Chu i ch a ngu n s ki n cho entry nh t k (ch c Chu i ch a thng i p cho entry nh t k. Gi tr thu c ki u li t k System.Diagnostics.EventLogEntryType, ch nh ki u c a entry nh t k. Cc gi tr h p l l Error, FailureAlert, Information, SuccessAudit, v Warning. Gi tr ki u int ch Gi tr ki u short ch nh ID c a entry nh t k. nh category c a entry nh t k. cc phng th c tnh).

M ng ki u byte ch a d li u th tng ng v i entry nh t k.

L p EventLogExample trong v d d i y trnh by cch s d ng cc phng th c tnh c a l p EventLog ghi m t entry vo nh t k s ki n c a my c c b . L p EventLog cng cung c p cc phng th c n p ch ng ghi vo nh t k s ki n c a cc my xa (xem ti li u .NET Framework SDK bi t thm chi ti t).
using System; using System.Diagnostics; public class EventLogExample {

520 Chng 17: S ha h p v i mi tr ng Windows public static void Main () { // // // // if } // Ghi m t s ki n vo nh t k s ki n. EventLog.WriteEntry( "EventLogExample", // Ngu n s ki n ng k "A simple test event.", // Thng i p cho s ki n EventLogEntryType.Information, // Ki u s ki n 1, // ID c a s ki n 0, // Category c a s ki n new byte[] {10, 55, 200} // D li u c a s ki n ); // Nh n Enter k t thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } } N u ngu n s ki n khng t n t i, ng k n v i nh t k Application trn my c c b . ng k m t ngu n s ki n t n t i s sinh ra ngo i l System.ArgumentException. (!EventLog.SourceExists("EventLogExample")) { EventLog.CreateEventSource("EventLogExample","Application");

17.4
B nc n S
RegistryKey m t

Truy xut Windows Registry


c thng tin t Registry ho c ghi thng tin vo Registry.

d ng l p Microsoft.Win32.Registry l y v i t ng Microsoft.Win32. m t kha m c-c-s . S d ng cc thnh vin c a i t ng RegistryKey duy t cy phn c p; c, s a, v t o kha v gi tr .

B n khng th truy xu t tr c ti p cc kha v cc gi tr n m trong Registry. Tr c h t b n ph i thu l y i t ng RegistryKey m t m t kha m c-c-s , sau duy t qua cy phn c p c a i t ng ny n kha c n tm. L p Registry hi n th c b y tr ng tnh, cc tr ng ny u tr v i t ng RegistryKey m t kha m c-c-s . B ng 17.3 trnh by cc kha m c-c-s ng v i cc tr ng ny.
B ng 17.3 Cc tr ng tnh c a l p Registry Tr ng ClassesRoot CurrentConfig CurrentUser DynData LocalMachine PerformanceData ng v i

HKEY_CLASSES_ROOT HKEY_CURRENT_CONFIG HKEY_CURRENT_USER HKEY_DYN_DATA HKEY_LOCAL_MACHINE HKEY_PERFORMANCE_DATA

521 Chng 17: S ha h p v i mi tr ng Windows Users

HKEY_USERS

Phng th c tnh RegistryKey.OpenRemoteBaseKey cho php b n m m t kha m c-c-s trn m t my xa (xem chi ti t trong ti li u .NET Framework SDK). M t khi c i t ng RegistryKey m t kha m c-c-s , b n ph i duy t qua cy phn c p n kha c n tm. h tr vi c duy t cy, l p RegistryKey cung c p cc thnh vin d i y: Thu c tnh SubKeyCountTr v s kha con. Phng th c GetSubKeyNamesTr v m t m ng ki u chu i ch a tn c a t t c cc kha con. Phng th c OpenSubKeyTr v tham chi u n m t kha con. Phng th c ny c hai phin b n n p ch ng: phng th c th nh t m kha trong ch ch - c; phng th c th hai nh n m t i s ki u bool, n u l true th cho php ghi.

M t khi c i t ng RegistryKey m t kha c n tm, b n c th t o, c, c p nh t, ho c xa cc kha con v cc gi tr b ng cc phng th c trong b ng 17.4. Cc phng th c s a i n i dung c a kha i h i b n ph i c i t ng RegistryKey cho php ghi.
B ng 17.4 Cc phng th c c a RegistryKey dng gi tr Registry Phng th c t o, c, c p nh t, v xa cc kha v cc M t

CreateSubKey

T o m t kha m i v i tn c ch nh v tr v i t ng RegistryKey cho php ghi. N u kha t n t i, phng th c ny s tr v m t tham chi u cho php ghi n kha t n t i. Xa kha v i tn c ch nh, kha ny ph i khng c kha con (nhng c th c gi tr ); n u khng, ngo i l System.InvalidOperationException s b nm. Xa kha v i tn c ch n. nh cng v i t t c cc kha con c a nh kh i kha hi n t i.

DeleteSubKey

DeleteSubKeyTree DeleteValue

Xa m t gi tr v i tn c ch

GetValue

Tr v gi tr v i tn c ch nh t kha hi n t i. Gi tr tr v l m t i t ng, b n ph i p n v ki u thch h p. D ng n gi n nh t c a GetValue tr v null n u gi tr khng t n t i. Ngoi ra cn c m t phin b n n p ch ng cho php ch nh gi tr tr v m c nh (thay cho null) n u gi tr khng t n t i. Tr v m ng ki u chu i ch a tn c a t t c cc gi tr trong kha hi n t i. T o (ho c c p nh t) gi tr v i tn c ch nh. B n khng th ch nh ki u d li u Registry dng lu tr d li u; SetValue s t ng ch n ki u d a trn ki u d li u c lu tr .

GetValueNames

SetValue

522 Chng 17: S ha h p v i mi tr ng Windows

L p RegistryKey c hi n th c giao di n IDisposable; b n nn g i phng th c IDisposable.Dispose gi i phng cc ti nguyn c a h i u hnh khi hon t t v i i t ng RegistryKey. L p RegistryExample trong v d sau nh n m t i s dng l nh v duy t quy cy c g c l CurrentUser tm cc kha c tn trng v i i s dng l nh. Khi tm c m t kha, RegistryExample s hi n th t t c cc gi tr ki u chu i n m trong kha ny. L p RegistryExample cng gi m t bi n 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) { // C p nh t bi n m. UpdateUsageCounter(root); // Duy t quy tm kha v i tn cho tr c. SearchSubKeys(root, args[0]); } } // Nh n Enter k t thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } public static void UpdateUsageCounter(RegistryKey root) { // T o m t kha lu tr bi n m, // ho c l y tham chi u n kha c. RegistryKey countKey = root.CreateSubKey("RegistryExample"); // c gi tr c a bi n m hi n t i, v ch nh // gi tr m c nh l 0. p i t ng v ki u Int32, // v gn vo m t gi tr int. int count = (Int32)countKey.GetValue("UsageCount", 0); // Ghi bi n m c c p nh t tr l i Registry, // ho c t o m t gi tr m i n u n cha t n t i. countKey.SetValue("UsageCount", ++count); } public static void SearchSubKeys(RegistryKey root, String searchKey) { // L p qua t t c cc kha con trong kha hi n t i. foreach (string keyname in root.GetSubKeyNames()) { try { using (RegistryKey key = root.OpenSubKey(keyname)) { if (keyname == searchKey) PrintKeyValues(key);

523 Chng 17: S ha h p v i mi tr ng Windows SearchSubKeys(key, searchKey); } } catch (System.Security.SecurityException) { // B qua SecurityException v i ch nh c a v d ny. // M t s kha con c a HKEY_CURRENT_USER c b o m t // v s nm SecurityException khi c m . } } } public static void PrintKeyValues(RegistryKey key) { // Hi n th tn c a kha c tm th y, // v s l ng gi tr c a n. Console.WriteLine("Registry key found : {0} contains {1} values", key.Name, key.ValueCount); // Hi n 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 th c thi trn my ch y Windows XP v i dng l nh RegistryExample Environment, v d ny s cho k t xu t 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\

17.5

To mt dch v Windows

B n c n t o m t ng d ng ng vai tr l m t d ch v Windows. T o m t l p th a k t l p System.ServiceProcess.ServiceBase. S d ng cc thu c tnh th a k i u khi n hnh vi c a d ch v , v chp cc phng th c th a k hi n th c cc ch c nng c n thi t. Hi n th c phng th c Main, trong t o m t th hi n c a l p d ch v v truy n n cho phng th c tnh ServiceBase.Run. N u ang s d ng Microsoft Visual C# .NET, b n c th dng m u d n Windows Service t o m t d ch v Windows. M u ny cung c p s n cc m l nh c b n c n cho m t l p d ch v , v b n c th hi n th c thm cc ch c nng ty bi n. t o m t d ch v Windows b ng tay, b n ph i hi n th c m t l p d n xu t t ServiceBase. L p ServiceBase cung c p cc ch c nng c b n cho php Windows Service Control

524 Chng 17: S ha h p v i mi tr ng Windows

Manager (SCM) c u hnh d ch v , thi hnh d ch v d i n n, v i u khi n th i gian s ng c a d ch v . SCM cng i u khi n vi c cc ng d ng khc c th i u khi n d ch v nh th no. L p ServiceBase c nh ngha trong System.Serviceprocess, do thm m t tham chi u n assembly ny khi xy d ng l p d ch v . b n ph i

Hnh 17.1 M u d n Windows Service

i u khi n d ch v c a b n, SDM s d ng b y phng th c protected th a k t l p ServiceBase (xem b ng 17.5). B n c n chp cc phng th c ny hi n th c cc ch c nng v cch th c ho t ng c a d ch v . Khng ph i t t c d ch v u h tr t t c cc thng i p i u khi n. Cc thu c tnh th a k t l p ServiceBase s bo v i SCM r ng d ch v c a b n h tr cc thng i p i u khi n no; thu c tnh i u khi n m i ki u thng i p c ghi r trong b ng 17.5.
B ng 17.5 Cc phng th c dng Phng th c i u khi n s ho t ng c a m t d ch v M t

OnStart

T t c cc d ch v u ph i h tr phng th c OnStart, SCM g i phng th c ny kh i ng d ch v . SCM truy n cho d ch v m t m ng ki u chu i ch a cc i s c n thi t. N u OnStart khng tr v trong 30 giy th SCM s khng ch y d ch v . c SCM g i d ng m t d ch v SCM ch g i OnStop n u thu c tnh CanStop l true. c SCM g i t m d ng m t d ch v SCM ch g i OnPause n u thu c tnh CanPauseAndContinue l true. c SCM g i ti p t c m t d ch v b t m d ngSCM ch g i
OnContinue n u thu c tnh CanPauseAndContinue l true.

OnStop

OnPause

OnContinue

525 Chng 17: S ha h p v i mi tr ng Windows

OnShutdown

c SCM g i khi h th ng ang t tSCM ch g i OnShutDown n u thu c tnh CanShutdown l true. c SCM g i khi tr ng thi ngu n m c-h -th ng thay i, ch ng h n m t laptop chuy n sang ch suspend. SCM ch g i OnPowerEvent n u thu c tnh CanHandlePowerEvent l true. Cho php m r ng c ch i u khi n d ch v v i cc thng i p i u khi n ty bi n; xem chi ti t trong ti li u .NET Framework SDK.

OnPowerEvent

OnCustomCommand

Nh c c p trong b ng 17.5, phng th c OnStart ph i tr v trong vng 30 giy, do b n khng nn s d ng OnStart th c hi n cc thao tc kh i ng t n nhi u th i gian. M t l p d ch v nn hi n th c m t phng th c kh i d ng th c hi n cc thao tc kh i ng, bao g m vi c c u hnh cc thu c tnh th a k t l p ServiceBase. Ngoi cc thu c tnh khai bo cc thng i p i u khi n no c d ch v h tr , l p ServiceBase cn hi n th c ba thu c tnh quan tr ng khc:
ServiceNameL tn c SCM s

d ng

nh n d ng d ch v , v ph i c thi t l p

tr c khi d ch v ch y.
AutoLog i u khi n vi c d ch v c t ng ghi vo nh t k s ki n hay khng khi nh n thng i p i u khi n OnStart, OnStop, OnPause, v OnContinue.

i t ng EventLog c c u hnh tr c v i tn ngu n s ki n (event source) trng v i thu c tnh ServiceName c ng k v i nh t k Application (xem m c 17.3 c thm thng tin v l p EventLog).

EventLogTr v m t

B c cu i cng trong vi c t o m t d ch v l hi n th c phng th c tnh Main. Phng th c ny ph i t o m t th hi n c a l p d ch v v truy n n cho phng th c tnh ServiceBase.Run. N u mu n ch y nhi u d ch v trong m t ti n trnh, b n ph i t o m t m ng cc i t ng ServiceBase v truy n n cho phng th c ServiceBase.Run. M c d cc l p d ch v u c phng th c Main nhng b n khng th th c thi m l nh d ch v m t cch tr c ti p; b n s nh n c h p thng bo nh hnh 17.2 n u tr c ti p ch y m t l p d ch v . M c 17.6 s trnh by cch ci t d ch v tr c khi th c thi.

Hnh 17.2 H p thng bo Windows Service Start Failure

L p ServiceExample trong v d d i y s d ng m t System.Timers.Timer entry vo nh t k s ki n Windows theo nh k.


using System; using System.Timers; using System.ServiceProcess; public class ServiceExample : ServiceBase { // Timer i u khi n khi no ServiceExample ghi vo nh t k s private System.Timers.Timer timer; ki n.

ghi m t

526 Chng 17: S ha h p v i mi tr ng Windows public ServiceExample() { // Thi t l p thu c tnh ServiceBase.ServiceName. ServiceName = "ServiceExample"; // C u hnh cc thng i p i u khi n. CanStop = true; CanPauseAndContinue = true; // C u hnh vi c ghi cc s // nh t k Application. AutoLog = true; } // Phng th c s c th c thi khi Timer h t // hi u l c ghi m t entry vo nh t k Application. private void WriteLogEntry(object sender, ElapsedEventArgs e) { // S d ng i t ng EventLog ghi vo nh t k s ki n. EventLog.WriteEntry("ServiceExample active : " + e.SignalTime); } protected override void OnStart(string[] args) { // L y chu k ghi s ki n t i s // M c nh l 5000 mili-giy, // v t i thi u l 1000 mili-giy. double interval; th nh t. ki n quan tr ng vo

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)); // T o, c u hnh, v kh i ng m t System.Timers.Timer // g i phng th c WriteLogEntry theo nh k. // Cc phng th c Start v Stop c a l p System.Timers.Timer // gip th c hi n cc ch c nng kh i ng, t m d ng, ti p t c, // v d ng d ch 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(); // Gi i phng ti nguyn h timer.Dispose(); timer = null; } th ng do Timer s d ng.

527 Chng 17: S ha h p v i mi tr ng Windows 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() { // T o m t th hi n c a l p ServiceExample ghi m t // entry vo nh t k Application. Truy n i t ng ny // cho phng th c tnh ServiceBase.Run. ServiceBase.Run(new ServiceExample()); } }

17.6

To mt b ci t dch v Windows
t n.

B n t o m t ng d ng d ch v Windows v c n ci

Th a k l p System.Configuration.Install.Installer t o m t l p ci t g m nh ng thng tin c n thi t ci t v c u hnh l p d ch v c a b n. S d ng cng c Installutil.exe th c hi n vi c ci t. Nh c p trong m c 17.5, b n khng th ch y cc l p d ch v m t cch tr c ti p. V d ch v c tch h p m c cao v i h i u hnh Windows v thng tin c gi trong Registry nn d ch v ph i c ci t tr c khi ch y. N u ang s d ng Microsoft Visual Studio .NET, b n c th t o m t b ci t cho d ch v m t cch t ng b ng cch nh p ph i vo khung thi t k c a l p d ch v v ch n Add Installer t menu ng c nh. B ci t ny c th c g i b i cc d n tri n khai ho c cng ci t d ch v . c Installutil.exe B n cng c th t t o m t b ci 1. 2. 3. p d ng t. t cho d ch v Windows theo cc b c sau: T o m t l p th a k t l p Installer. c tnh System.ComponentModel.RunInstallerAttribute(true) cho l p ci

t, t o m t th hi n c a l p System.ServiceProcess.ServiceProcessInstaller. Thi t l p cc thu c tnh Account, UserName, v Password c a i t ng ServiceProcessInstaller c u hnh ti kho n m d ch v s ch y. Cng trong phng th c kh i d ng c a l p ci t, t o m t th hi n c a l p System.ServiceProcess.ServiceInstaller cho m i d ch v c n ci t. S d ng cc

Trong phng th c kh i d ng c a l p ci

4.

528 Chng 17: S ha h p v i mi tr ng Windows

thu c tnh c a bao g m:

i t ng ServiceInstaller

c u hnh cc thng tin v m i d ch v ,

ServiceNameCh nh tn m Windows s d ng nh n d ng d ch v . Tn ny ph i trng v i gi tr c gn cho thu c tnh ServiceBase.ServiceName. DisplayNameCh StartTypeS

nh tn thn thi n cho d ch v .

d ng cc gi tr thu c ki u li t k System.ServiceProcess. i u khi n vi c d ch v c kh i ng t ng hay b ng ServiceStartMode tay, hay b v hi u.


ServiceDependsUponl y m t m ng ki u chu i ch a tn cc d ch v ph i c ch y tr c khi d ch v hi n hnh ch y.

5.

S d ng thu c tnh Installers th a k t l p c s Installer l y m t i t ng System.Configuration.Install.InstallerCollection. Thm cc i t ng ServiceProcessInstaller v t t c cc i t ng ServiceInstaller vo t p h p ny.

L p ServiceInstallerExample d i y l m t b ci t cho l p ServiceExample trong m c 17.5. D n m u cho m c ny ch a c hai l p ServiceExample v ServiceInstallerExample, v t o ra file th c thi ServiceInstallerExample.exe.
using System.ServiceProcess; using System.Configuration.Install; using System.ComponentModel; [RunInstaller(true)] public class ServiceInstallerExample : Installer { public ServiceInstallerExample() { // T o v c u hnh i t ng ServiceProcessInstaller. ServiceProcessInstaller ServiceExampleProcess = new ServiceProcessInstaller(); ServiceExampleProcess.Account = ServiceAccount.LocalSystem; // T o v c u hnh i t ng ServiceInstaller. ServiceInstaller ServiceExampleInstaller = new ServiceInstaller(); ServiceExampleInstaller.DisplayName = "C# Service Example"; ServiceExampleInstaller.ServiceName = "ServiceExample"; ServiceExampleInstaller.StartType = ServiceStartMode.Automatic; // Thm i t ng ServiceProcessInstaller v ServiceInstaller // vo t p h p Installers (th a k t l p c s Installer). Installers.Add(ServiceExampleInstaller); Installers.Add(ServiceExampleProcess); } }

ci t ServiceExample, b n c n t o d ng d n, chuy n n th m c ch a file ServiceInstallerExample.exe (m c nh l bin\debug), r i th c thi l nh Installutil ServiceInstallerExample.exe. Sau , b n c th s d ng Windows Computer Management xem v i u khi n d ch v . M c d StartType c ch nh l Automatic, d ch v ny v n khng c kh i ng sau khi ci t. B n ph i kh i ng d ch v b ng tay (ho c kh i ng l i my) tr c khi d ch v ghi cc entry vo nh t k s ki n. M t khi d ch v ch y, b n c

529 Chng 17: S ha h p v i mi tr ng Windows

th xem cc entry m n ghi vo nh t k Application b ng Event Viewer. g ServiceExample, b n hy th c thi l nh Installutil /u ServiceInstallerExample.exe.

Hnh 17.3 Windows Computer Management

17.7

To shortcut trn Desktop hay trong Start menu

B n c n t o m t shortcut trn Desktop hay trong Start menu c a ng i dng.

530 Chng 17: S ha h p v i mi tr ng Windows

S d ng COM Interop truy xu t cc ch c nng c a Windows Script Host. T o v c u hnh m t th hi n IWshShortcut tng ng v i shortcut. Th m c ch a shortcut s xc nh shortcut xu t hi n trn Desktop hay trong Start menu. Th vi n l p .NET Framework khng c ch c nng t o shortcut trn Desktop hay trong Start menu; tuy nhin, vi c ny c th c th c hi n d dng b ng thnh ph n Windows Script Host ( c truy xu t thng qua COM Interop). Cch t o Interop Assembly truy xu t m t thnh ph n COM c trnh by trong m c 15.6. N u ang s d ng Visual Studio .NET, b n hy thm m t tham chi u n Windows Script Host Object Model ( c li t k trong th COM c a h p tho i Add Reference). N u khng c Visual Studio .NET, b n hy s d ng cng c Type Library Importer (Tlbimp.exe) t o m t Interop Assembly cho file wshom.ocx (file ny th ng n m trong th m c Windows\System32). B n c th l y phin b n m i nh t c a Windows Script Host t i [http://msdn.microsoft.com/scripting].

Hnh 17.4 Ch n Windows Script Host Object Model trong h p tho i Add Reference

M t khi t o v nh p Interop Assembly vo d n, b n hy th c hi n cc b c sau: 1. 2. T om t i t ng WshShell truy xu t vo Windows shell. S d ng thu c tnh SpecialFolders c a i t ng WshShell xc nh ng d n n th m c s ch a shortcut. Tn c a th m c ng vai tr l index i v i thu c tnh SpecialFolders. V d , ch nh gi tr Desktop t o shortcut trn Desktop, v ch nh gi tr StartMenu t o shortcut trong Start menu. Thu c tnh SpecialFolders cn c th c s d ng l y ng d n n m i th m c c bi t c a h th ng; cc gi tr th ng dng khc l AllUsersDesktop v AllUsersStartMenu. G i phng th c CreateShortcut c a i t ng WshShell, v truy n ng d n y c a file shortcut c n t o (c ph n m r ng l .lnk). Phng th c ny s tr v m t th hi n IWshShortcut.

3.

531 Chng 17: S ha h p v i mi tr ng Windows

4.

S d ng cc thu c tnh c a th hi n IWshShortcut c u hnh shortcut. V d , b n c th c u hnh file th c thi c shortcut tham chi u, bi u t ng dng cho shortcut, l i m t , v phm nng. G i phng th c Save c a th hi n IWshShortcut ghi shortcut vo a. Shortcut s n m trn Desktop hay trong Start menu (hay m t ni no khc) ty vo ng d n c ch nh khi t o th hi n IWshShortcut.

5.

L p ShortcutExample trong v d d i y t o shortcut cho Notepad.exe trn Desktop v trong Start menu c a ng i dng hi n hnh. ShortcutExample t o hai shortcut ny b ng phng th c CreateShortcut v ch nh hai th m c khc nhau cho file shortcut. Cch ny gip b n t o file shortcut trong b t k th m c c bi t no c tr v t thu c tnh WshShell.SpecialFolders.
using System; using IWshRuntimeLibrary; public class ShortcutExample { public static void Main() { // T o shortcut cho Notepad trn Desktop. CreateShortcut("Desktop"); // T o shortcut cho Notepad trong Start menu. CreateShortcut("StartMenu"); // Nh n Enter k t thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } public static void CreateShortcut(string destination) { // T o m t i t ng WshShell truy xu t // cc ch c nng c a Windows shell. WshShell wshShell = new WshShell(); // L y ng d n s ch a file Notepad.lnk. B n c th // s d ng phng th c System.Environment.GetFolderPath // l y ng d n, nhng s d ng WshShell.SpecialFolders // s truy xu t c nhi u th m c hn. B n c n t o m t // i t ng t m tham chi u n chu i destination // th a mn yu c u c a phng th c Item. object destFolder = (object)destination; string fileName = (string)wshShell.SpecialFolders.Item(ref destFolder) + @"\Notepad.lnk"; // T o i t ng shortcut. Tuy nhin, ch ng c g c // t o ra trong th m c cho n khi shortcut c lu. IWshShortcut shortcut = (IWshShortcut)wshShell.CreateShortcut(fileName); // C u hnh ng d n file th c thi. // S d ng l p Environment cho n gi n. shortcut.TargetPath = Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\notepad.exe";

532 Chng 17: S ha h p v i mi tr ng Windows // Thi t l p th m c lm vi c l Personal (My Documents). shortcut.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal); // Cung c p l i m t cho shortcut. shortcut.Description = "Notepad Text Editor"; // Gn phm nng cho shortcut. shortcut.Hotkey = "CTRL+ALT+N"; // C u hnh c a s Notepad lun phng to khi kh i shortcut.WindowStyle = 3; ng.

// C u hnh shortcut hi n th icon u tin trong notepad.exe. shortcut.IconLocation = "notepad.exe, 0"; // Lu file shortcut. shortcut.Save(); } }

533

PH M TS

L CA

CNG C .NET

GI I THI U

P
PH L C A: GI I THI U M T S CNG C .NET

h n ph l c ny gi i thi u m t s cng c nh (h u h t l mi n ph) nhng r t t t cho cc nh pht tri n .NET, trong c nh ng cng c gip pht tri n ng d ng nhanh hn v c nh ng cng c c th lm thay i cch th c vi t m l nh c a b n.

Bin d ch cc o n m ng n v i Snippet Compiler Xy d ng bi u th c chnh quy v i Regulator Sinh m v i CodeSmith Vi t ki m th n v v i NUnit Ki m sot m l nh v i FxCop Kh o st assembly v i .NET Reflector L p ti li u m l nh v i NDoc T o d ng gi i php v i NAnt Cc cng c chuy n i: ASP.NET Version Switcher, Visual Studio .NET Project Converter, VB.NET to C# Converter, v Convert C# to VB.NET Xy d ng website qu n tr c s d li u v i ASP.NET Maker 1.1

A.1 Bin d ch cc o n m ng n v i Snippet Compiler Snippet Compiler l m t ng d ng nh dng vi t, bin d ch, v ch y m l nh. Cng c ny h u ch khi b n c nh ng o n m ng n v b n khng mu n ph i t o ton b d n Visual Studio .NET (cng v i cc file i km) cho chng. L y v d , gi s b n mu n ch y m t ng d ng no t Microsoft .NET Framework. Trong Snippet Compiler, b n hy t o m t ng d ng Console m i. Ph n m l nh c th c t o bn trong phng th c Main c a ng d ng ny. o n m d i y trnh by cch t o m t th hi n c a Notepad t .NET Framework:
using System; using System.Collections; public class MyClass { public static void Main()

534 Ph l c A: Gi i thi u m t s cng c .NET { 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 th y o n m ny trong Snippet Compiler. th nghi m o n m ny, b n ch g r i. o n m ny s sinh vi c nh n nt Play (hnh tam gic xanh), v n s ch y ch ra m t c a s pop-up ( ng d ng Console), v Notepad s xu t hi n. Khi b n ng Notepad, ng d ng Console cng s ng. Snippet Compiler c vi t b i Jeff Key v c th [http://www.sliver.com/dotnet/SnippetCompiler]. A.2 Xy d ng bi u th c chnh quy v i Regulator Regulator l m t cng c v i y tnh nng dng xy d ng v ki m tra cc bi u th c chnh quy. Bi u th c chnh quy c s d ng nh ngha cc m u trong nh ng chu i d a trn k t , t n s xu t hi n, v th t k t . Chng th ng c s d ng nhi u nh t lm phng ti n xc nh n tnh tnh h p l c a u vo do ng i dng cung c p ho c tm m t chu i k t bn trong m t chu i l n hnch ng h n, khi tm ki m m t a ch URL hay email trn m t trang web. c download t i

535 Ph l c A: Gi i thi u m t s cng c .NET

Regulator cho php b n nh p m t bi u th c chnh quy v m t u vo no (b n s ch y bi u th c chnh quy d a trn u vo ny). B ng cch ny, b n c th th y cch th c lm vi c c a bi u th c chnh quy v k t qu tr v tr c khi hi n th c n trong ng d ng c a mnh. Hnh A-2 cho th y Regulator v i m t bi u th c chnh quy n gi n.

Hnh A-2 Regulator v i m t bi u th c chnh quy n gi n

Ph n document ch a bi u th c chnh quy, trong v d ny l [0-9]*, bi u th c ny trng kh p v i b t k dy ch s no. H p pha d i ph i ch a u vo cho bi u th c chnh quy, v h p pha d i tri hi n th nh ng trng kh p m bi u th c chnh quy tm th y bn trong cc u vo. Vi t v ki m tra cc bi u th c chnh quy trong m t ng d ng c l p nh th ny th d hn nhi u so v i thao tc chng trong ng d ng c a b n. M t trong nh ng tnh nng hay nh t c a Regulator l kh nng tm ki m th vi n bi u th c chnh quy tr c tuy n t i [http://regexlib.com]. V d , n u nh p chu i "phone" vo h p tm ki m, b n s tm th y hn 20 bi u th c chnh quy khc nhau trng kh p v i cc s i n tho i, bao g m cc bi u th c cho Anh, c, v nhi u s i n tho i khc. Regulator c vi t b i Roy Osherove v c th [http://regex.osherove.com]. A.3 Sinh m v i CodeSmith CodeSmith l m t cng c sinh m d a-trn-template (khun m u), s d ng m t c php tng t nh ASP.NET k t sinh b t k ki u m hay text no. Khc v i nhi u cng c sinh m khc, CodeSmith khng yu c u b n m t m t b n thi t k hay ki n trc ng d ng c th . Khi s d ng CodeSmith, b n c th k t sinh m i th , t m t t p h p n gi n, c- nhki u-m nh n ton b m t ng d ng. Khi xy d ng m t ng d ng, b n th ng ph i l p i l p l i nh ng tc v no , ch ng h n vi t m truy xu t d li u hay xy d ng cc t p h p ty bi n. CodeSmith c bi t h u ch trong nh ng tnh hu ng nh v y, v b n c th vi t cc template t ng ha cc tc v ny, i u ny khng ch c i thi n hi u nng m cn gip b n b t nhm chn. c download t i

536 Ph l c A: Gi i thi u m t s cng c .NET

CodeSmith c s n m t s template, bao g m nh ng template cho t t c cc ki u t p h p .NET cng nh nh ng template sinh th t c t n tr , nhng s c m nh th c s c a cng c ny chnh l kh nng t o cc template ty bi n. Template c a CodeSmith ch l file vn b n n thu n (c th th o vn b n b t k), v i ph n m r ng l .cst. c t o b ng cng c so n

Template c gi i thi u d i y s nh n m t chu i v r i xy d ng m t l p d a vo chu i . B c u tin l vi t ph n header, ph n ny khai bo ngn ng c a template, ngn ng ch, v m t v n t t v template:
<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Car Template" %>

Ph n k ti p c a template l cc khai bo thu c tnh, cc thu c tnh ny s khi template ch y. V d d i y khai bo m t thu c tnh chu i:
<%@ Property Name="ClassName" Type="String" Category="Context" Description="Class Name" %>

c ch

nh m i

Khai bo ny s lm cho thu c tnh ClassName xu t hi n trong c a s CodeSmith n c th c ch nh khi template ch y.

thu c tnh c a

B c ti p theo l xy d ng ph n thn c a template (v i m l nh tng t nh ASP.NET). Nh b n c th th y, template ny nh n chu i nh p v sinh ra m t l p v i tn . Trong ph n thn c a template, cc th ng v m c s d ng nh trong ASP.NET. Trong template ny, ta ch chn gi tr thu c tnh, nhng cng c th s d ng b t k ki u m .NET no bn trong cc th ny.
public sealed { private private private class <%= ClassName %> static volatile <%= ClassName %> _instance; <%= ClassName %>() {} static readonly object _syncRoot = new object();

public static <%= ClassName %> Value { get { if (_instance == null) { lock(_syncRoot) { if (_instance == null) { _instance = new <%= ClassName %>(); } } } return _instance; } } }

M t khi template hon t t, b n hy n p n vo CodeSmith (xem hnh A-3). B n c th nh n th y thu c tnh pha bn tri l thu c tnh m chng ta khai bo trong template.

537 Ph l c A: Gi i thi u m t s cng c .NET

N u b n nh p SingletonClass lm tn l p v nh p nt Generate, CodeSmith s sinh ra l p d i y:


public sealed { private private private class SingletonClass static volatile SingletonClass _instance; SingletonClass() {} static readonly object _syncRoot = new object();

public static SingletonClass Value { get { if (_instance == null) { lock(_syncRoot) { if (_instance == null) { _instance = new SingletonClass(); } } } return _instance; } } }

Hnh A-3 N p template vo CodeSmith

CodeSmith tng i d s d ng v c th sinh ra nh ng k t qu tuy t v i n u c p d ng m t cch ng n. M t trong nh ng ph n ph bi n nh t c n c sinh m l t ng truy xu t d li u. CodeSmith c m t assembly c bi t v i tn l SchemaExplorer, assembly ny c th c s d ng sinh ra cc template t b ng, th t c t n tr , hay h u nh b t k i t ng SQL Server no khc. CodeSmith c vi t b i Eric J. Smith v c th c download (b n dng th ) t i
[http://www.ericjsmith.net/codesmith/download.aspx].

538 Ph l c A: Gi i thi u m t s cng c .NET

A.4 Vi t ki m th

n v v i NUnit

NUnit l b khung ki m th n v c xy d ng cho .NET Framework, cho php b n vi t cc phng th c ki m th theo ngn ng do b n ch n ki m tra m t hm c th c a chng trnh. ng d ng NUnit cung c p m t b khung vi t cc ki m th n v , cng nh m t giao di n h a ch y cc ki m th n v v xem k t qu . xc V d , chng ta c n ki m tra ch c nng c a l p Hashtable trong .NET Framework nh hai i t ng c th c thm vo v l y ra hay khng. B c u tin l tham chi u n assembly NUnit.Framework c th truy xu t cc thu c tnh v phng th c c a b khung NUnit. B c k ti p l t o m t l p v nh d u n v i c tnh [TestFixture] NUnit bi t l p ny c ch a phng th c ki m th .
using System; using System.Collections; using NUnit.Framework; namespace NUnitExample { [TestFixture] public class HashtableTest { public HashtableTest() { } } }

K ti p, chng ta t o m t phng th c v nh d u n v i c tnh [Test] NUnit bi t y l phng th c ki m th . Trong phng th c ny, chng ta s thi t l p m t Hashtable v a vo hai gi tr , sau s d ng phng th c Assert.AreEqual xem chng ta c th thu l y 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!"); }

ch y phng th c ki m th ny, b n c n t o m t d n NUnit, m assembly c sinh ra bn trn v nh p nt Run. Hnh A-4 cho th y k t qu . Trn y ch l m t ki m th n gi n, nhng cho th y kh nng c a NUnit. C r t nhi u ki u ki m th , cng nh nhi u phng th c Assert, c th c s d ng ki m th m i ph n trong m l nh c a b n. M t ki m th n v c th lu v ch y l i m i khi b n s a i m l nh, i u ny gip b n pht hi n l i d dng hn v m b o pht tri n ng d ng t t hn. NUnit l m t d n m ngu n m v c th c download t i [http://www.nunit.org].

539 Ph l c A: Gi i thi u m t s cng c .NET

Hnh A-4 NUnit

Cng c m t b n add-in c a NUnit cho Visual Studio .NET, add-in ny cho php b n tr c ti p ch y cc phng th c ki m th n v t Visual Studio .NET (c th c download t i [http://sourceforge.net/projects/nunitaddin]). c thm thng tin v NUnit v v tr c a n trong vi c pht tri n test-driven (v n hnh theo ki m th ), b n hy xem bi vi t Test-Driven C#: Improve the Design and Flexibility of Your Project with Extreme Programming Techniques trong a CD nh km. A.5 Ki m sot m l nh v i FxCop .NET Framework r t m nh, c ngha kh nng t o ra nh ng ng d ng tuy t v i l r t cao, nhng kh nng t o ra nh ng chng trnh t i cng l r t cao. FxCop l m t trong nh ng cng c c th c s d ng tr gip t o ra nh ng ng d ng t t hn b ng vi c cho php b n kh o st m t assembly v ki m tra tnh tng thch c a n v i m t s quy lu t. FxCop ch a t p cc quy lu t do Microsoft t o ra, nhng b n cng c th t o ra nh ng quy lu t cho mnh. Ch ng h n, n u mu n t t c cc l p u c m t phng th c kh i d ng m c nh khng i s , b n c th vi t m t quy lu t ki m tra phng th c kh i d ng trn m i l p c a assembly. c thm thng tin v vi c t o nh ng quy lu t ty bi n, b n hy vo [http://msdn.microsoft.com/msdnmag/issues/04/06/bugslayer]. V d , chng ta hy xem FxCop pht hi n ra l i g trong assembly NUnitExample ( c trnh by m c A.4). Tr c tin, b n c n t o m t d n FxCop v a assembly ny vo. Sau , b n hy nh n Analyze, FxCop s kh o st assembly ny v a ra cc thng bo l i (xem hnh A-5). FxCop nh n th y m t s v n v i assembly ny. B n c th nh p p ln m t l i chi ti t, bao g m l i m t quy lu t v ni m b n c th tm th y nhi u thng tin hn. xem

FxCop c th gip b n t o m l nh t t hn, nh t qun hn, nhng n khng th s a ch a vi c thi t k t i hay l p trnh km. FxCop cng khng ph i l m t s thay th cho vi c ki m tra m l nh (code review), nhng v n c th b t nhi u l i tr c khi ki m tra m l nh nn b n c th dnh nhi u th i gian cho cc v n h tr ng hn l ph i lo l ng v cc quy c t tn.

540 Ph l c A: Gi i thi u m t s cng c .NET

Hnh A-5 FxCop a ra cc thng bo khi kh o st NUnitExample

FxCop c pht tri n b i Microsoft v c th [http://www.gotdotnet.com/team/fxcop]. A.6 Kh o st assembly v i .NET Reflector

c download t i

.NET Reflector l m t trnh duy t l p (class browser) v trnh d ch ng c (decompiler), n c th kh o st m t assembly v cho b n th y t t c cc b m t trong . .NET Framework kh o st b t k m l nh no d a-trn-.NET, cho d a ra c ch ph n chi u (reflection) n l m t l p n hay ton b m t assembly. C ch ph n chi u cng c th c s d ng thu l y thng tin v cc l p, phng th c, v thu c tnh khc nhau trong m t assembly no . S d ng .NET Reflector, b n c th duy t cc l p v cc phng th c c a m t assembly, b n c th kh o st ngn ng trung gian (Microsoft Intermediate LanguageMSIL) do cc l p v phng th c ny sinh ra, v b n c th d ch ng c cc l p v phng th c sang C# hay Visual Basic .NET. V d , chng ta s s d ng .NET Reflector kh o st assembly NUnitExample ( c trnh by m c A.4). Hnh A-6 th hi n assembly ny khi c n p vo .NET Reflector. Bn trong .NET Reflector cn c nh ng cng c m b n c th s d ng kh o st thm assembly ny. xem MSIL c a m t phng th c, b n hy nh p vo phng th c ny v ch n Disassembler. Ngoi vi c xem MSIL, b n cng c th xem phng th c d ng C# b ng cch ch n Decompiler t trnh n Tools. B n cng c th xem phng th c ny c d ch ng c sang Visual Basic .NET hay Delphi b ng cch thay i ty ch n trong trnh n Languages. D i y l o n m do .NET Reflector sinh ra:

541 Ph l c A: Gi i thi u m t s cng c .NET 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!"); }

Hnh A-6 Kh o st NUnitExample v i .NET Reflector

o n m trn r t gi ng v i o n m m chng ta vi t:
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!"); }

M c d c m t vi khc bi t nh v m l nh nhng chng gi ng h t nhau v ch c nng. Cng d ng hay nh t c a .NET Reflector l kh o st cc assembly v phng th c c a .NET Framework. .NET Framework cung c p nhi u cch khc nhau th c hi n cc thao tc tng t nhau. V d , n u b n c n c m t t p d li u t XML, c nhi u cch khc nhau th c hi n i u ny: s d ng XmlDocument, XPathNavigator, hay XmlReader. B ng cch s d ng .NET Reflector, b n c th xem Microsoft s d ng g khi vi t phng th c ReadXml c a DataSet, ho c h lm g khi c d li u t file c u hnh. .NET Reflector cng r t c ch khi

542 Ph l c A: Gi i thi u m t s cng c .NET

tm hi u cch t o cc i t ng nh HttpHandlers; v qua , b n bi t c cch th c m nhm pht tri n c a Microsoft xy d ng cc i t ng trong Framework. .NET Reflector c vi t b i Lutz Roeder v c th [http://www.aisto.com/roeder/dotnet]. A.7 L p ti li u m l nh v i NDoc Vi c l p ti li u m l nh g n nh l m t cng vi c khng m y h ng th. y khng ni v ti li u thi t k m l ti li u cho t ng phng th c v thu c tnh c a l p. Cng c NDoc s s t ng sinh ti li u cho m l nh c a b n b ng cch s d ng c ch ph n chi u kh o st assembly v s d ng file XML c sinh t cc ch thch XML C# (cc ch thch XML ch c hi u l c cho C#, nhng c m t Visual Studio .NET Power Toy v i tn l VBCommenter cng s th c hi n gi ng nh v y i v i Visual Basic .NET). V i NDoc, b n v n c l p ti li u cho m l nh, nhng l p khi vi t m (trong cc ch thch XML). B c u tin khi s d ng NDoc l m ch c nng sinh ch thch XML i v i assembly c a b n. Nh p ph i vo d n v ch n Properties | Configuration Properties | Build, r i nh p m t ng d n lu file XML trong ty ch n XML Documentation File (xem hnh A-7). Khi d n c t o d ng, m t file XML s c sinh ra v i t t c cc ch thch XML i km. c download t i

Hnh A-7 Ch n ng d n

lu ti li u XML

D i y l phng th c

m c 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() { // Ph n thn phng th c y. }

543 Ph l c A: Gi i thi u m t s cng c .NET

Ph n ch thch XML cho phng th c ny s

c trch xu t 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. </summary> </member> </members> </doc>

B c k ti p l n p assembly v file XML vo NDoc. Sau , nh p nt Build Documentation ch y qu trnh sinh ti li u (xem hnh A-8). Hnh A-9 l ti li u CHM do NDoc sinh ra.

Hnh A-8 NDoc

544 Ph l c A: Gi i thi u m t s cng c .NET

Hnh A-9 Ti li u CHM do NDoc sinh ra

NDoc l m t d n m ngu n m v c th [http://ndoc.sourceforge.net]. A.8 T o d ng gi i php v i NAnt

c download t i

NAnt l m t cng c t o d ng d a-trn-.NET, gip b n vi t m t quy trnh t o d ng d n cho mnh. Khi c nhi u nh pht tri n cng lm vi c trn m t d n, b n khng th ph thc vi c t o d ng cho t ng ng i. B n cng khng mu n ph i th ng xuyn t o d ng d n m t cch th cng. Thay vo , b n vi t m t quy trnh t o d ng t ng ch y m i m. NAnt cho php b n t o d ng gi i php, chp file, ch y cc ki m tra NUnit, g i e-mail, v nhi u n a. ng ti c, NAnt thi u giao di n h a, nhng n c m t ng d ng Console v cc file XML ch nh cc tc v no s c hon thnh trong qu trnh t o d ng. Lu r ng MSBuild, m t n n t o d ng m i trong trong phin b n Visual Studio 2005, cng c tnh nng tng t nh NAnt. V d , chng ta c n vi t file t o d ng NAnt cho d n NUnitExample m c A.4. Tr c tin, b n hy t o m t file XML v i ph n m r ng l .build, v t n trong th m c g c c a 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"/> </sources> </csc> </target> </project>

Th project c s d ng c n c nh ng th con sau:

t tn cho d n, target m c

nh, v th m c c s . Th ny

Th description c s d ng

t m t m t ng n g n v d n.

545 Ph l c A: Gi i thi u m t s cng c .NET

Th property c s d ng lu tr m t thi t l p sao cho n c th c truy xu t t b t c u trong file t o d ng. V d ny t o m t thu c tnh v i tn l debug, v thi t l p n l true hay false ty vo b n c mu n d n c bin d ch c u hnh g r i hay khng (thu c tnh ny khng nh h ng g n cch th c t o d ng d n; n ch l m t bi n s m b n c th thi t l p v s c thu v khi b n th t s xc nh cch th c t o d ng d n). K ti p l th target. M t d n c th c nhi u target (c th c ch nh khi NAnt ch y). N u khng c target no c ch nh, target m c nh s c s d ng (ta thi t l p n trong th project). Trong v d ny, target m c nh l build. Bn trong th target, b n c n thi t l p tn c a target v m t nh ng g m target ny s th c hi n. Th csc c s d ng ch nh nh ng g s c truy n cho trnh bin d ch C#. Tr c tin, b n ph i thi t l p target cho th csc. Do c n t o file .dll nn v d ny thi t l p target l library. K ti p, b n ph i thi t l p output cho th csc, y l ni m file .dll s c t o. Cu i cng, b n c n thi t l p thu c tnh debug, cho bi t d n c c bin d ch ch g r i hay khng. V t o m t thu c tnh tr c lu tr gi tr truy xu t gi tr c a thu c tnh. ny, ta c th s d ng chu i ${debug} Th csc cng c n c cc th con: th references cho bi t nh ng assembly no c n c tham chi u; v th sources cho bi t nh ng file no i km. V d ny tham chi u n assembly NUnit.Framework.dll v ch a file NUnitExample.cs.

(xem hnh A-10). t o d ng, b n c n n th m c g c c a d n v th c thi NAnt.exe N u t o d ng thnh cng, b n c th tm th y file cc .dll v .pdb trong th m c bin c a d n.

Hnh A-10 Th c thi Nant.exe t i th m c g c c a d n

Tuy khng d dng nh vi c nh p Build trong Visual Studio, nhng NAnt l m t cng c r t m nh khi xy d ng quy trnh t o d ng ch y t ng theo l ch bi u. NAnt cng c cc tnh nng h u ch nh ch y cc ki m th n v hay chp cc file i km (cc tnh nng ny khng c quy trnh t o d ng c a Visual Studio 2003 h tr ). NAnt l m t d n m ngu n m v c th [http://sourceforge.net/projects/nant]. c download t i

546 Ph l c A: Gi i thi u m t s cng c .NET

A.9 Chuy n

i phin b n ASP.NET v i ASP.NET Version Switcher

Khi th l m t yu c u, IIS xem ph n m r ng c a file c yu c u; v r i d a vo cc nh x ph n m r ng (extension mapping) cho th m c o hay website, n y nhi m yu c u cho m t ph n m r ng ISAPI ho c t th l n. y l cch ASP.NET lm vi c; cc nh x ph n n m r ng c ng k cho t t c cc ph n m r ng ASP.NET v h ng chng aspnet_isapi.dll. Khi b n ci t ASP.NET 1.1, nh x ph n m r ng c nng c p sang phin b n m i c a aspnet_isapi.dll. i u ny gy ra l i khi m t ng d ng c t o d ng trn ASP.NET 1.0 l i ch y trn phin b n 1.1. gi i quy t v n ny, b n c th chuy n t t c cc nh x ph n m r ng tr v phin b n 1.0 c a aspnet_isapi.dll, nhng v i 18 nh x ph n m r ng th qu l v t v n u lm th cng. y chnh l ni ASP.NET Version Switcher tr nn h u d ng. Ti n ch nh ny c th c s d ng chuy n phin b n .NET Framework c a b t k ng d ng ASP.NET no. S d ng cng c ny r t n gi n: b n hy ch n m t ng d ng v r i ch n phin b n .NET Framework m b n mu n ng d ng ny s d ng (xem hnh A-11). Sau , cng c ny s s d ng ti n ch dng l nh aspnet_regiis.exe chuy n ng d ng v phin b n .NET Framework c ch n. Cng c ny cng h u ch khi c thm cc phin b n ASP.NET v .NET Framework m i trong tng lai.

Hnh A-11 ASP.NET Version Switcher

ASP.NET Version Switcher c vi t b i Denis Bauer v c th A.10 Chuy n

c download t i

[http://www.denisbauer.com/NETTools/ASPNETVersionSwitcher.aspx].

i phin b n d n v i Visual Studio .NET Project Converter

Visual Studio .NET Project Converter (xem hnh A-12) c s d ng chuy n i phin b n c a m t file d n Visual Studio. M c d ch c m t t khc bi t gi a phin b n 1.0 v 1.1 c a .NET Framework, nhng m t khi file d n c chuy n t Visual Studio .NET 2002 sang Visual Studio .NET 2003 th khng th chuy n ng c l i. i khi vi c chuy n ng c l i c n thi t. Cng c ny c th chuy n b t k file gi i php hay d n no t Visual Studio 7.1 (Visual Studio .NET 2003) v Visual Studio 7.0 (Visual Studio .NET 2002), v ng c l i.

547 Ph l c A: Gi i thi u m t s cng c .NET

Hnh A-12 Visual Studio .NET Project Converter

Visual Studio .NET Project Converter c vi t b i Dacris Software v c th download t i [http://www.codeproject.com/macro/vsconvert.asp]. A.11 Chuy n m ngu n VB.NET sang C# v i VB.NET to C# Converter

VB.NET to C# Converter c s d ng chuy n ton b m t d n VB.NET sang d n C#. Chng trnh ny c th chuy n c m t s i m m cc chng trnh khc khng th c hi n c; ch ng h n nh cc l nh ReDim, cc bi n dng chung c c b , c ch th l s ki n, cc l nh Case ph c t p, cc l i g i API
[

Hnh A-13 VB.NET to C# Converter


[

548 Ph l c A: Gi i thi u m t s cng c .NET

VB.NET to C# Converter l trnh chuy n i m ngu n sang m ngu n. Sau khi chuy n i, m l nh c a b n v n gi l i tnh d c v n c (bao g m cc tn bi n v cc ch thch). Tnh tin c y c a chng trnh cng r t cao, chnh xc trn 99% trong h u h t cc l n th nghi m. VB.NET to C# Converter c pht tri n b i VBConversions v c th (b n dng th ) t i [http://www.vbconversions.com]. A.12 Chuy n m ngu n C# sang VB.NET v i Convert C# to VB.NET Ng c v i VB.NET to C# Converter, Convert C# to VB.NET c s d ng ngu n C# sang VB.NET. chuy n m c download

Hnh A-14 Convert C# to VB.NET

Convert C# to VB.NET c vi t b i Kamal Patel v c th [http://www.kamalpatel.net].

c download t i

A.13 Xy d ng website qu n tr c s d li u v i ASP.NET Maker 1.1 ASP.NET Maker l m t b sinh m r t m nh nhng l i r t d s d ng, gip b n nhanh chng t o cc trang qu n tr ASP.NET (ngn ng C# hay VB.NET) t m t ngu n d li u (cc c s d li u c h tr : Microsoft Access, Microsoft SQL Server, Oracle, b t k c s d li u no v i k t n i ADO hay ODBC). ASP.NET Maker c trang b r t nhi u tnh nng h u ch nh khung nhn drill-down, c ch b o m t cao c p, tch h p v i CSS v Visual Studio .NET

549 Ph l c A: Gi i thi u m t s cng c .NET

Gi s b n c n xy d ng m t website dng cho qu n tr c s Server). D i y l cc b c c b n:

li u pubs (trong SQL

Tr c tin, vo th Database, nh d u ch n Connection String v nh p chu i Provider=SQLOLEDB;Initial Catalog=pubs;Data Source=127.0.0.1; User ID=sa;Password=sa (khng c d u ngo c kp), r i nh p nt Connect. Danh sch cc b ng v khung nhn s c n p v hi n th pha tri (xem hnh A-15). Khi , b n c th ty ch nh m i tr ng trong cc b ng v khung nhn sao cho ph h p.

Hnh A-15 N p c s d li u pubs vo ASP.NET Maker

K ti p, vo th ASP.NET, r i vo th .NET Specific Options, ch n phin b n .NET Framework v ngn ng (VB.NET hay C#).

Hnh A-16 Th ASP.NET | .NET Specific Options

550 Ph l c A: Gi i thi u m t s cng c .NET

K ti p, vo th Security, nh d u ch n Administrator Login, nh p Login Name v Password. y l ti kho n qu n tr (s c vi t m c ng).

Hnh A-17 Th Security

Cu i cng, vo th Generate v nh p nt Generate. Sau khi xy d ng thnh cng, b n hy vo http://localhost/pubs xem k t qu .

Hnh A-18 Th Generate

ASP.NET Maker c pht tri n b i e.World v c th t i [http://www.hkvstore.com].

c download (b n dng th )

551

PH L C B: THU T NG ANH - VI T

PH

L CB

A N H VI T
Absolute [adj] .................................................................................................... Tuy t i Abstract [adj] .................................................................................................. Tr u t ng Access [v] ...........................................................................................................Truy xu t Access modifier ..............................................................T kha thay i t m truy xu t Accessibility....................................................................................... Kh nng truy xu t Account ............................................................................................................. Ti kho n ACL [Access Control List].............................................Danh sch i u khi n truy xu t Administrator .............................................................................................Ng i qu n tr Aggregate function .......................................................................................Hm t p h p Algorithm ...........................................................................................................Gi i thu t API [Application Programming Interface] ....................... Giao di n l p trnh ng d ng Application ........................................................................................................ ng d ng is Application domain ..................................................................................Mi n ng d ng Argument................................................................................................................. Arithmetic ...............................................................................................................S h c Array......................................................................................................................... M ng Assembly........................................................................................................ Gi k t h p Asymmetric [adj] ..........................................................................................B t Asynchronous [adj] .......................................................................................B t Attribute ............................................................................................................... i x ng ng b c tnh

THU T NG

Authentication................................................................................................ S xc th c Authorization ............................................................................................ S phn quy n Availability................................................................................................. Tnh kh d ng Binary ..................................................................................................................Nh phn Block ..........................................................................................................................Kh i Bound .......................................................................................................................... C n Boundary ..................................................................................... ng bin / Ranh gi i Breakpoint ....................................................................................................... i m d ng Browser ...........................................................................................................Trnh duy t Buffer..................................................................................................................... B m Built-in [adj] ...........................................................................................................N i t i

552 Ph l c B: Thu t ng

Anh - Vi t

Cache .................................................................................... Kho ch a (truy xu t nhanh) Caching...................................................................................................... C ch lu gi CAS [Code Access Security] ................................................ B o m t truy xu t m l nh Certificate..........................................................................................................Ch ng ch Channel...................................................................................................................... Knh Character ...................................................................................................................K t Class ............................................................................................................................ L p Client .............................................................................................................. Trnh khch Clone [v].............................................................................................................. Sao chp Cloneable [adj].............................................................................................Kh sao chp CLR [Common Language Runtime]...................................B th c thi ngn ng chung Code...................................................................................................................... M l nh Collection ............................................................................................................. T p h p Column ......................................................................................................................... C t Command ...................................................................................................................L nh Communication.............................................................................................. S giao ti p Comparable [adj] ...........................................................................................Kh so snh Compare [v]........................................................................................................... So snh Compatibility ......................................................................................... Tnh tng thch Compile [v] ........................................................................................................ Bin d ch Compiler....................................................................................................Trnh bin d ch Component ..................................................................................................... Thnh ph n Component tray......................................................................................Khay thnh ph n Configuration ...................................................................................................... C u hnh Connection .............................................................................................................K t n i Constant..................................................................................................................... H ng Constructor.................................................................................. Phng th c kh i d ng Context ............................................................................................................... Ng c nh Context-sensitive help ................................................................Tr gip c m-ng -c nh Control............................................................................................................... i u ki m Convert [v] ...................................................................................................... Chuy n Convertible [adj]...................................................................................... Kh chuy n i i

Cryptography ........................................................................................................ M t m Culture......................................................................................................... Mi n vn ha Custom [adj] ....................................................................................................... Ty bi n Data ........................................................................................................................D li u Data binding ...................................................................................... K thu t k t d li u Database .......................................................................................................C s d li u De-compile [v] ................................................................................................D ch ng c De-serialize [v]........................................................................................ Gi i tu n t ha Decrypt [v] ....................................................................................................Gi i m t ha Decryption................................................................................................ S gi i m t ha Debug [v]................................................................................................................. G r i Debugger ........................................................................................................ Trnh g r i Default ................................................................................................................ M c nh

Ph l c B: Thu t ng

553 Anh - Vi t

Delegate..................................................................................................... y nhi m hm Deploy [v].......................................................................................................... Tri n khai Destructor ...............................................................................................Phng th c h y Device.................................................................................................................... Thi t b Derive [v] ............................................................................................................ D n xu t Dictionary.............................................................................................................. T i n Digital signature................................................................................................ Ch k s Directive ..................................................................................................................Ch th Directory.............................................................................................................. Th m c Disposable [adj] ...................................................................................................Kh h y Dispose [v] ..................................................................................................................H y Distributed [adj]......................................................................................C tnh phn tn Document .............................................................................................................. Ti li u Domain ...................................................................................................................... Mi n Edit [v]..............................................................................................................Hi u ch nh Editor ........................................................................................................ Trnh so n th o Encapsulation .................................................................................................S ng gi Encode [v] ............................................................................................................. M ha Encoding........................................................................................................Php m ha Encrypt [v]............................................................................................................ M t ha Encryption ....................................................................................................... S m t ha Entry ................................................................................................................Kho n m c Enumeration ....................................................................................................Ki u li t k Environment.................................................................................................... Mi tr ng Error.............................................................................................................................. L i Event...................................................................................................................... S ki n Event hander ......................................................................... Phng th c th l s ki n Event log ..................................................................................................Nh t k s ki n Evidence .............................................................................................................Ch ng c Exception................................................................................................................. Bi t l Exception hander .................................................................... Phng th c th l bi t l Expiration .................................................................................................. S h t hi u l c Export [v] ................................................................................................................... Xu t Expression ..........................................................................................................Bi u th c Feature ............................................................................................................... Tnh nng Field........................................................................................................................Tr ng File .......................................................................................................................... T p tin Filter ........................................................................................................................ B l c Flag ................................................................................................................................ C Flexibility ....................................................................................................Tnh linh ho t Form ................................................................................................................... Bi u m u Format ............................................................................................................... nh d ng FTP [File Transfer Protocol] ...........................................................Giao th c truy n file Function...................................................................................................................... Hm Functionality .................................................................................................... Ch c nng

554 Ph l c B: Thu t ng

Anh - Vi t

GAC [Global Assembly Cache]..................................... Kho ch a gi k t h p ton c c GC [Garbage Collector] ...........................................................................B thu gom rc Generalization .....................................................................................Tnh t ng qut ha Global [adj] .........................................................................................................Ton c c Globalization............................................................................................S ton c u ha Graphics ................................................................................................................. GUI [Graphical User Interface] ........................................Giao di n ng i dng GUID [Globally Unique Identifier] ................................... h a h a Group........................................................................................................................Nhm nh danh duy nh t ton c c

Handle [v]................................................................................................................ Th l Handle ............................................................................................................... M c qu n Hash [v] ...................................................................................................................... Bm Hash code ............................................................................................................. M bm Hashtable........................................................................................................... B ng bm Help ......................................................................................................................Tr gip HTML [HyperText Markup Language]......................Ngn ng nh d u siu vn b n Hyperlink.......................................................................................................Siu kin k t IDE [Integrated Development Environment] .................Mi tr ng pht tri n tch h p Identifier .................................................................................................................Di n t Imperson [v] ........................................................................................................ Gi nh n Impersonation ................................................................................................ S gi nh n Implement [v].....................................................................................................Hi n th c Implementation ........................................................................................... B n hi n th c Import [v] .................................................................................................................. Nh p Index..................................................................................................................... Ch m c Indexer............................................................................................................. B ch m c Inheritance........................................................................................................ S th a k Initialize [v] ..........................................................................................................Kh i t o Input.............................................................................................. u vo / D li u nh p t Insert [v] .................................................................................................................... Chn Install [v] ................................................................................................................ Ci Instance................................................................................................................ Th hi n Integration ....................................................................................................... S tch h p Interface..............................................................................................................Giao di n Interoperability...................................................................................... Kh nng lin tc IP [Internet Protocol] ...........................................................................Giao th c Internet Item.................................................................................................................... M c ch n JIT [just-in-time]........................................................................ T c th i / V a ng lc Key ............................................................................................................................ Kha Keyword ............................................................................................................... T kha Language ........................................................................................................... Ngn ng Length................................................................................................................. Chi u di Library ................................................................................................................. Th vi n Lifetime ..................................................................................................... Th i gian s ng Link ...................................................................................................................... Lin k t

Ph l c B: Thu t ng

555 Anh - Vi t

List .....................................................................................................................Danh sch Literal .................................................................................................................Tr c ki n Load [v] ....................................................................................................................... N p Local [adj] .............................................................................................................. C c b Locale .................................................................................................................... B n Localization............................................................................................... S b n a a ha

Lock............................................................................................................................ Ch t Logic............................................................................................. M thi hnh ch c nng Loop.....................................................................................................................Vng l p Managed [adj] ............................................................................................. c qu n l Management..................................................................................................... S qu n l Mapping .........................................................................................................Php nh x Member ........................................................................................................... Thnh vin Membership ....................................................................................... T cch thnh vin Memory ..................................................................................................................B nh Menu.................................................................................................................. Trnh n Message ........................................................................................................... Thng i p Metacharacter.................................................................................................... Siu k t Metadata ......................................................................................................... Siu d li u Method ..........................................................................................................Phng th c Model....................................................................................................................M hnh Module .................................................................................................................. n th MSIL [Microsoft Intermediate Language] .....................................Ngn ng trung gian Multilingual [adj].......................................................................................... a ngn ng Multithreading................................................................................L p trnh a ti u trnh Native [adj] ................................................................................................... Nguyn sinh Namespace ................................................................................................Khng gian tn Network .................................................................................................................... M ng Node .............................................................................................................................Nt Object ................................................................................................................ Object-oriented programming ............................................... L p trnh h ng Operating system ......................................................................................... H Output..................................................................................................... i t ng i t ng i u hnh

Operator................................................................................................................. Ton t u ra / K t xu t Overload .................................................................................................... B n n p ch ng Override [v] .......................................................................................................... Chp Parameter.............................................................................................................Thng s Password ............................................................................................................ M t kh u Path .................................................................................................................. ng d n Pattern.................................................................................................................Ki u m u Performance ...................................................................................................... Hi u nng Permission ............................................................................................................... Quy n Pixel.................................................................................................................... i m nh Platform ....................................................................................................................... N n Pointer ................................................................................................................... Con tr

556 Ph l c B: Thu t ng

Anh - Vi t

Policy................................................................................................................Chnh sch Polymorphisme ............................................................................................. Tnh a hnh Pool...................................................................................................................Kho d tr Pooling ........................................................................................................ C ch d tr POP3 [Post Office Protocol 3] ..................................................... Giao th c nh n mail 3 Port ............................................................................................................................ C ng Postfix...................................................................................................................... H u t Prefix ...................................................................................................................... Ti n t Private [adj].............................................................................................................. Ring Privilege ........................................................................................................... c quy n Procedure............................................................................................................... Th t c Process................................................................................................................Ti n trnh Processor ..............................................................................................................B x l Project.......................................................................................................................D n Property ............................................................................................................ Thu c tnh Protected [adj]............................................................................................... c b o v Protocol ..............................................................................................................Giao th c Public [adj]........................................................................................................ Cng khai Query ................................................................................................................... Truy v n Queue ..................................................................................................................Hng i Random ........................................................................................................... Ng u nhin RBS [Role-Based Security]......................................................B o m t d a-trn-vai-tr Record ................................................................................................... B n ghi / M u tin Recursion........................................................................................................... S quy Reference........................................................................................................ Tham chi u Reflection ............................................................................................ C ch ph n chi u Register [v] ........................................................................................................... ng k Regular expression............................................................................Bi u th c chnh quy Relationship .................................................................................................. M i quan h Relative [adj] ....................................................................................................Tng i Remotable [adj] ................................................................................. Kh truy xu t t xa Resource .......................................................................................................... Ti nguyn Reusability ......................................................................................Kh nng ti s d ng Role ........................................................................................................................ Vai tr Routine ......................................................................................................... Th ng trnh Row ...............................................................................................................Hng / Dng Runtime ............................................................................................................B th c thi Schema ...................................................................................................L c / Khun Script ................................................................................................................... K ch b n Security............................................................................................................ S b o m t Serialize [v] .................................................................................................... Tu n t ha Serializable [adj]......................................................................................Kh tu n t ha Serialization ............................................................................................... S tu n t ha Server .................................................................................................................Trnh ch Service ...................................................................................................................D ch v

Ph l c B: Thu t ng

557 Anh - Vi t

Session....................................................................................................... Phin lm vi c Setting.................................................................................................................. Thi t l p Shared [adj]........................................................................... c chia s / Dng chung Signature.................................................................................................................Ch k SMTP [Simple Mail Transfer Protocol] ....................... Giao th c truy n mail n gi n SOAP [Simple Object Access Protocol].......... Giao th c truy xu t i t ng n gi n Solution ..............................................................................................................Gi i php Specialization ......................................................................................... Tnh chuyn ha SQL [Structured Query Language] .................................Ngn ng truy v n c c u trc Stack ............................................................................................................... Ngn ch ng State ................................................................................................................... Tr ng thi State | Stateless [adj]........................................................... C tr ng thi | Phi tr ng thi Statement........................................................................................... Cu l nh / Khai bo Static [adj] .................................................................................................................. Tnh Stored procedure ....................................................................................... Th t c t n tr Stream............................................................................................................... Dng ch y String ........................................................................................................................Chu i Strong name ...................................................................................................... Tn m nh Strong type .......................................................................................................Ki u m nh Strongly-named [adj]....................................................................... c Strongly-typed [adj]....................................................................... c nh tn m nh nh ki u m nh i x ng ng b ha ng b

Structure ...............................................................................................................C u trc Symmetric [adj] ................................................................................................. Synchronization ....................................................................................... S Synchronous [adj]................................................................................................

System .................................................................................................................H th ng System tray.................................................................................................Khay h th ng Table .......................................................................................................................... B ng Tag ................................................................................................................................Th Task .........................................................................................................................Tc v Template..........................................................................................................Khun m u Thread.................................................................... Ti u trnh / M ch trnh / Tuy n o n Thread-safe.......................................................................................An ton v ti u trnh Throw [v].................................................................................................................... Nm Timestamp...................................................................................................Tem th i gian Tool....................................................................................................................... Cng c Toolbox ......................................................................................................... H p cng c Transaction ............................................................................................... Phin giao d ch Type............................................................................................................................ Ki u Type-safe..................................................................................... An ton v ki u d li u Unmanaged [adj] ............................................................................. Khng c qu n l Update ................................................................................................................. C p nh t URI [Uniform Resource Identifier]....................... B nh n d ng ti nguyn URL [Uniform Resource Locator] .............................. B nh v ti nguyn ng d ng ng d ng

User................................................................................................................. Ng i dng

558 Ph l c B: Thu t ng

Anh - Vi t

Utility ................................................................................................................... Ti n ch Validation .................................................................................... S xc nh n tnh h p l Value ....................................................................................................................... Gi tr Variable ...................................................................................................................... Bi n Version ...............................................................................................................Phin b n Virtual [adj]................................................................................................................... o Visible [adj] ........................................................................................................ Kh ki n Visual [adj] ....................................................................................................... Tr c quan Wildcard ..................................................................................................... K t i di n Window ...................................................................................................................C a s Worker......................................................................................................................... Th Wrapper.................................................................................................................. V b c WSDL [Web Services Description Language]................ Ngn ng m t d ch v Web XML [Extensible Markup Language]............................... Ngn ng nh d u m r ng

559

TI LI U THAM KH O

TI LI U THAM KH O
CC GI I PHP L P TRNH C#
[1] Allen Jones. C# Programmer's Cookbook. Microsoft Press, 2004. [2] John Connell. Coding Techniques for Microsoft Visual Basic .NET. Microsoft Press, 2002. [3] Harvey M. Deitel, Paul J. Deitel, & Tem R. Nieto. Visual Basic .NET How to Program, Second Edition. Prentice Hall, 2002. [4] Jose Mojica. C# and VB .NET Conversion Pocket Reference. O'Reilly, 2002. [5] James Avery. Ten Must-Have Tools Every Developer Should Download Now. MSDN Magazine, 2004. [6] Karl Moore. The Ultimate VB.NET and ASP.NET Code Book. Apress, 2003. [7] Matthew MacDonald. Microsoft Visual Basic .NET Programmer's Cookbook. Microsoft Press, 2003. [8] Mark Schmidt & Simon Robinson. Microsoft Visual C# .NET 2003 Developer's Cookbook. Sams Publishing, 2003. [9] Dng Quang Thi n. L p trnh Visual C# th no? Nh xu t b n T ng H p TP. H Ch Minh, 2005. [10] Nguy n Ng c Bnh Phng & L Tr n Nh t Qunh. Cc gi i php l p trnh Visual Basic .NET. Nh xu t b n Giao thng V n t i, 2006. [11] Thi Thanh Phong & Nguy n Ng c Bnh Phng. S tay tra c u VB.NET. Nh xu t b n Giao thng V n t i, 2004. [12] V m t 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...

GII CC GII PHP LP TRNH C#


Nguyn Ph ng Nguyn Ngc Bnh Phng Thi Thanh Phong
tng hp & bin dch

Chu trch nhim xut bn

Nguyn TS. Nguyn Xun Thy


Bin tp

H Nguyn Th Thanh Thy


Trnh by ba

Nguyn Nguyn Th Thanh Thy


Ch bn & Sa bn in

Nguyn Phng Nguyn Ngc Bnh Phng

561

In 1000 cu n, kh 19x27cm, t i XN in S 05. S ng k KHXB 180-230/XB-QLXB do C c Xu t B n c p ngy 03 thng 03 nm 2005. In xong v n p lu chi u thng 09 nm 2006.

You might also like