Professional Documents
Culture Documents
Cac Giai Phap Lap Trinh C - Sharp
Cac Giai Phap Lap Trinh C - Sharp
Cac Giai Phap Lap Trinh C - Sharp
net
t ng h p v bin d ch
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
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#.
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
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
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
23
24
NG D NG
25
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).
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),
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); } }
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"); } }
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.
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";
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"); } }
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.
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
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 .
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:
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
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
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
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).
ng d ng
1.5
B n c n truy xu t cc is
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); } } }
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.
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
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.
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.
nh ngha. Tng c nh
!=
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.
&&
||
()
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.
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
.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
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
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.
39 ng d ng
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
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
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
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
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.
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
ng d ng
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved. Assembly 'HelloWorld.exe' is valid
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
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.
ng d ng
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
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
ng d ng
1.13
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
47 ng d ng
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
-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.
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
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
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.
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
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
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).
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.
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
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
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)
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 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
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));
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
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
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
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.
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
^\d{4}$
^\w{6,8}$
62 Chng 2: Thao tc d
li u
S th tn d ng
^\d{4}-?\d{4}-?\d{4}?\d{4}$
a ch e-mail
^[\w-]+@([\w]+\.)+[\w-]+$
^https?://([\w]+\.)+[\w-]+(/[\w- ./ ?%=]*)?$
i t ng
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
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
ti t
Optionsm t gi tr RegexOptions xc
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
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.
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 (<)
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
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
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
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
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
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
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 , 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.
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
Chng 2: Thao tc d
73 li u
74
Chng 3: MI N
75
76 Chng 3: Mi n
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
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
77 li u
DisallowPublisherPolicy
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.
3.2
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
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.
Chng 3: Mi n
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
khi ph c m t cho ph h p, v d :
3.4
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
li u
c danh sch
cc l p d n xu t t
3.5
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.
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
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
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
li u
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
Chng 3: Mi n
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
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
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
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
87 li u
3.8
B n c n m t c ch mi n ng d ng.
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
li u ng d ng m i.
li u c a mi n
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
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
89 li u
u gi i phng cc
i t ng trong ; ng c l i, tr v
3.10
B n mu n thu l y
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
li u
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
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
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
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 . }
3.12
B nc nt om t
92 Chng 3: Mi n
li u
Thu l y
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.
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
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 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
95 li u
ValidOn
v tr
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
li u
3.14
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
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
NG B
99
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
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:
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.
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(); } }
103 ng b
4.2
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:
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; }
105 ng b
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.
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 .
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
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.
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
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
ng b
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.");
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)); }
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
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
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 {
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(); } }
115 ng b
4.6
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
ng b
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.
ng b
4.7
Cch d
nh t
ki m tra m t ti u trnh
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(); } }
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
ng b
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.
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 .
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
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.
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.
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:
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
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.
[
125 ng b
Cc
i s dng
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
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();
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
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
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
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.
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.
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
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
.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
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
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 .
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); } } }
5.2
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
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
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 ).
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 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.
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
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.
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
d ng d u hoa th (*) vo
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
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(); } }
142 Chng 5: XML ord:order ord:orderItem ord:orderItem http://mycompany/OrderML 3211 1155 http://mycompany/ClientML
5.6
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
/Order/Items/Item ch n t t c
B t
//
u m t ng d n tng
Ch n m t
/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
nh) hi n hnh.
..
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
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
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.
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
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(); } }
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:
Cc ph n t v
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" />
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.");
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>
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.
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
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
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.
c tu n t ha thnh
m t
c tnh (khng ph i ph n t ), v ch
nh tn
c tnh.
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).
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
u tin c a cc ch u tin c a ch
d someOtherName
5.10
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
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
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
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
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>
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); } }
.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
159
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
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
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).
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);
6.2
Lu tr m t tham chi u M il th s khng lu tr n
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"); } }
6.3
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.)
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
.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; }
B n c th s d ng o n m tng t
// G b i t ng form. OpenForms.MainForm = null; }
ng.
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(); }
6.5
.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.)
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
6.6
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
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); }
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
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; } }
n trang cu i cng
6.8
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 :
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
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).
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;
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); } } } }
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.
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
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
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.
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).
.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.
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.
Hnh 6.8 Satellite assembly cho b n using using using using System; System.Windows.Forms; System.Threading; System.Globalization;
a Vietnamese
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.
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
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),
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.
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
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.
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
c nh p vo m t
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
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
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; } }
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 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
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
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
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.
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
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.
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
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
192
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
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
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
i t ng Cache,
i t ng ny cung c p kho lu tr t m i
View state
Query string
D li u chu i.
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.
Session state
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).
Cookie
D li u chu i.
Applicatio n state
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.
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.
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.)
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);
7.3
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
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
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 .
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);
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
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.
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.
hi n th c a s pop-
7.6
B n c n ch ng i dng.
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
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
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
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; } } } }
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
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).
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.
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
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
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
T o trang
ng nh p, v thm logic xc th c c a b n vo (s
d ng l p
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. -->
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>
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).
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;
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.
7.10
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
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."; } } }
7.11
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.
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; }
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).
ng
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;
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,
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;
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.
7.13
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;
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;
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
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
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" %>
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.
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
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
c a b n thay ng khc.
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
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.
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"
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.
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:
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.
7.17
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>.
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;
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).
8.2
Ki m tra
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;
// 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
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
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
8.4
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:
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.
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
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
.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.
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.)
Chng 8:
247 h a, a phng ti n, v in n
8.7
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.
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
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
.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).
8.10
B n c n chi m t file WAV ho c MP3.
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
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);
253 h a, a phng ti n, v in n
hi n th file video (s
c trnh by trong m c
8.11
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.
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)
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
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
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;
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.
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
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
// 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
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;
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; } }
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
.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
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:
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 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.
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();
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."); }
} } }
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.
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
[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;
275 h a, a phng ti n, v in n
Hnh 8.16
276
277
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
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
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
FileInfo v DirectoryInfo
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
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.
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(); } }
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
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
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.
[
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 .
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
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
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)); } } }
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
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.
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; } }
9.5
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(); } }
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;
D i y l ph n m cho form:
using using using using
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.
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
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
.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.
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() {
// 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.
9.10
S
GetFiles nh n m t bi u th c l c v tr v m t m ng cc
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(); } }
9.11
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.
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.
9.12
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
ch
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, 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 .
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
9.14
S
Lm vic vi ng dn tng i
c th s d ng ng d n tng
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(); } }
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.
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
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).
9.17
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).
[
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.
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 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.
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
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
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
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.
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
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
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:
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
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. }
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
li u
10.2
S dng connection-pooling
c i thi n hi u nng v i t ng
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
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
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.
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...
li u
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
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
[
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.");
li u
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.
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
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
li u
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()) { } }
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.
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
Item
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 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
li u
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
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
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
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
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(); } }
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
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).
li u
10.7
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.
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).
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.
T thanh trnh n chnh c a IDE, ch n Project | Add New Item Add New Item (xem hnh 10.4).
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.
li u
5.
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
li u
7.
8.
Thm b ng Categories v Products vo danh sch Selected Item(s) (xem hnh 10.9). Nh p Next.
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.
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
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).
nh
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
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!
li u
10.10
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.
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.
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.
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.
li u
5.
c k t n i. Ch n c
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.
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
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.
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
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).
Chng 10: C s d
343 li u
c thm vo d n.
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).
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
11
346
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
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(); }
11.2
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.
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; } }
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.
11.3
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
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.)
11.4
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.
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
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.
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
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(); } }
11.6
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(); } }
11.7
Ping mt a ch IP
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).
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
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.
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(); } }
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
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;
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
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.
Ch r ng,
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) {} }
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()); } } } }
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
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.
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 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.");
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
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
V y l transcript tng ng
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).
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!";
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
g i thng
SmptMail.Send.
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).
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
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
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].
374
12
375
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.
12.1
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).
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"
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).
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
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.
th
c l y t cache ho c c sinh t
ng (n u c n) b ng hm GetCustomerDataSet.
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; }
12.4
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.
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
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+.
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());
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
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
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()); } }
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
public static void Callback(IAsyncResult handle) { localhost.WaitService proxy = (localhost.WaitService)handle.AsyncState; int result = proxy.EndWait(handle); Console.WriteLine("Waited " + result.ToString()); }
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
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
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>
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
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>
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-
bi t thm chi
12.8
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
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.
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
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.
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
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); } }
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>
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>
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>
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
.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.
12.13
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.
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.)
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
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
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
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
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:
13.2
B n c n v hi u CAS.
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;
hi u
CAS,
l nh
c a
b n
ph i
System.Security.Permissions.SecurityPermission.
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.
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
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.
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
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
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
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 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 ... } }
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
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.
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 } } ...
lo i b iv i
13.6
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.
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
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);
13.8
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)
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
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 { }
13.9
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.
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
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
ng d ng hi n hnh t
L p System.AppDomain
CreateInstance CreateInstanceAndUnwrap CreateInstanceFrom CreateInstanceFromAndUnwrap
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
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);
13.11
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).
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.
13.12
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
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); } }
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.
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:
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
[
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.
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
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.
.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.
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
NoPrincipal
UnauthenticatedPrincipal
cho Thread.CurrentPrincipal.
WindowsPrincipal
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
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.
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
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.
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
nh n). = {0}",
434
Chng 14: M T M
14
435
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
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
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.
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
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)
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)); } } }
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.
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)); } } } }
14.4
Kim tra m bm
i b ng
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
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());
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
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
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)
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.
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).
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
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
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)
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.
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
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
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).
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)); } }
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
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
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
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 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; } }
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
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:
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.
d ng c ch
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.
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.
462
15
463
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:
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).
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 {
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(); } }
15.2
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).
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
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(); } }
15.4
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
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)]
l y thng i p
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
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.
.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.
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
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.
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.
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 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
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
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
16
480
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).
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
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.
// 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.
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) {
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
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.
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
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
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);
so snh hai
i t ng v tr v m t gi tr d a
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));
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); } }
16.4
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.
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.
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.
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].
16.5
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:
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
// 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.
16.6
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; } }
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);
16.7
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.
ch a d li u khng c
nh d ng 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
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
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.
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
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
m l nh khng th t o thm
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
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
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
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; } }
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;
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;
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); }
m l do b n nh p vo):
513
Chng 17: S
HA H P V I MI TR NG WINDOWS
17
514
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
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
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
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
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
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
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).
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
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_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
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)); } } } }
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
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
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
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.
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.
i t ng ServiceInstaller
5.
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
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.
17.7
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.
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 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
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.
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
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
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.
public static SingletonClass Value { get { if (_instance == null) { lock(_syncRoot) { if (_instance == null) { _instance = new SingletonClass(); } } } return _instance; } } }
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].
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].
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.
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!"); }
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
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. }
<?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.
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>
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.
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.
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
A.9 Chuy n
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.
c download t i
[http://www.denisbauer.com/NETTools/ASPNETVersionSwitcher.aspx].
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.
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
[
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
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
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.
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#).
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...
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.