You are on page 1of 706

1

2
tng hp v bin dch
Nguyn Ngc Bnh Phng - Thi Thanh Phong Nguyn Ngc Bnh Phng - Thi Thanh Phong
cng s cng tc ca
Nguyn Thanh Nhn - Trn L Vnh Phong Nguyn Thanh Nhn - Trn L Vnh Phong
Nguyn Quang Nam - inh Phan Ch Tm Nguyn Quang Nam - inh Phan Ch Tm
Bi Minh Khoa - L Ngc Sn Bi Minh Khoa - L Ngc Sn
Thi Kim Phung - L Trn Nht Quynh Thi Kim Phung - L Trn Nht Quynh
Chju trch nhim xut bn: TS. Nguyn Xun Thy TS. Nguyn Xun Thy
Bin tp: H Nguyn Thj Thanh Thy H Nguyn Thj Thanh Thy
Trnh by ba: Nguyn Thj Thanh Thy Nguyn Thj Thanh Thy
Ch bn & Sa bn in: Nguyn Ngc Bnh Phng Nguyn Ngc Bnh Phng
Nh sch t Vi t Nh sch t Vi t
ja chi: 225 Nguyn Tri Phng, Q.5, TP. H Ch Minh 225 Nguyn Tri Phng, Q.5, TP. H Ch Minh
in thoai: (08) 2 652 039 (08) 2 652 039
E-mail: datviet@dvpub.com.vn datviet@dvpub.com.vn
3
Website: www.dvpub.com.vn www.dvpub.com.vn
4
Nguyn Ngc Bnh Phng - Thi
Nguyn Ngc Bnh Phng - Thi

Thanh Phong
Thanh Phong
tng hop & bin djch tng hop & bin djch
http://www.dvpub.com.vn/dv/details.aspx?itemid=243 http://www.dvpub.com.vn/dv/details.aspx?itemid=243


5
NH XUT BN GAO THNG VAN T
NH XUT BN GAO THNG VAN T
6
7
LI NI U
c gii php lp trnh C# kho st chiu rng ca th vin lp
.NET Framework v cung cp gii php c th cho cc vn
thng g!p. "#i gii php $c tr%nh &' th(o )*ng +vn ,gii
php- .t cch ng/n g0n v k1. th(o l cc v2 ) .3u.
C
Cc gii php lp trnh C# kh4ng nh5. .c 2ch hng )3n &*n cch l6p
tr%nh C#. 7u' v6'8 nga' c khi .i l. 9u(n vi l6p tr%nh :ng )ng $c
;<' )=ng tr>n .NET Framework vi C#8 &*n c?ng s@ nh6n th' 9u'n sch
n' l .t ti ngu'>n v4 gi.
A .:c lB tCng8 khi &*n Di .!t vi .t vn 8 9u'n sch n' s@ cung cp
.t gii phpEha' 2t nht nF s@ g$i cho &*n hng i Gng. Hga' c nIu
&*n chJ .uDn .C rng kiIn th:c ca .%nh v th vin lp .NET8 Cc gii
php lp trnh C# c?ng l .t ti liu rt hKu 2ch.
L*n kh4ng th trC n>n thnh th*o C# v cc lp trong th vin lp .NET nIu
chJ Mn thuNn 0c v chGng8 &*n phi sO )ng v thO nghi. chGng &5ng
cch viIt th6t nhiu chMng tr%nh. Pu trGc v ni )ung ca 9u'n sch n'
c?ng nh t2nh kh thi trong thI gii th=c ca cc gii php $c a ra s@
cung cp i. khCi Nu hon ho8 tQ F l. &n *p cho vic thO nghi.
ca ch2nh &*n.
RhNn .S lnh trong 9u'n sch n' S $c viIt v ch*' thO nghi. tr>n
phi>n &n 1.1 ca .NET Framework. 7rong nhiu trng h$p8 &*n s@ nh6n
th' v2 ) .3u n' c?ng s@ ch*' tr>n phi>n &n 1.0 ha' 2.0 ca .NET
Framework8 tu' nhi>n iu n' cha $c thO nghi..
PhGng t4i ;in ch<n thnh c. Mn cc &*n Nguyn Thanh Nhn8 Trn L
Vnh Phong8 Nguyn uang Nam8 !"nh Phan Ch# Tm8 $%" &"nh 'hoa8 L
Ng() *+n8 Th," '"m Ph-ng8 v L Trn Nh./ u0nh S cF nhKng Fng gFp
LI NI U
8
9uB &u cho 9u'n schT c. Mn Nh1 2u3/ 45n 6"ao /h7ng V.n /5" v Nh1
8,)h !3/ V"9/ S t*o iu kin cho 9u'n sch n' In vi &*n 0c.
Uo lNn Nu ti>n ;ut &n n>n 9u'n sch n' khF trnh khVi nhKng thiIu sFt.
Wt .ong nh6n $c B kiIn Fng gFp v nh6n ;Xt ca cc &*n lNn ti &n
sau $c hon thin hMn.
7r<n tr0ng c. Mn
9
10
CU TRC CA SCH
Yu'n sch n' $c chia thnh Z[ chMng8 .#i chMng t6p trung vo .t
ch c th trong 9u tr%nh t*o cc gii php C#.
CU TRC CA SCH
PhMng Z\ PHT TRIN NG DNG
PhMng ]\ THAO TC D LIU
PhMng ^\ MIN NG DNG, C CH PHN CHIU,
V SIU D LIU
PhMng _\ TIU TRNH, TIN TRNH, V S !"NG #$
PhMng `\ %ML
PhMng a\ &INDO&S 'ORM
PhMng [\ ASP(N)T V &)# 'ORM
PhMng b\ !" H*A, !A PH+NG TIN, V IN ,N
PhMng c\ 'IL), TH+ MC, V I-O
PhMng Zd\ C S. D LIU
PhMng ZZ\ L/P TRNH M0NG
PhMng Z]\ D1CH V &)# %ML V R)MOTING
PhMng Z^\ #O M/T
PhMng Z_\ M/T M2
PhMng Z`\ 3H N4NG LIN TC M2 LNH
3H5NG6!+7C68UN6L9
PhMng Za\ CC GIAO DIN V M:U TH5NG DNG
PhMng Z[\ S H;A H7P V<I M5I TR+=NG &INDO&S
11
12
QUY C
Yu'n sch n' sO )ng cc 9u' c nh sau\
V font ch
C>? @A AB>@CABEUeng cho t>n ri>ng8 t>n fil( v th
.c8 v 4i khi nhn .*nh.
C>? DE@ FG HIAB JK LMA> gfont Cour"e NewhEUeng cho
cc o*n chMng tr%nh8 v cho cc phNn tO .S lnh nh
c<u lnh8 te' ch0n8 &iIn8 !c t2nh8 khFa8 h.8 kiu8 lp8
kh4ng gian t>n8 phMng th:c8 .o)ul(8 thuc t2nh8 th4ng
sD8 gi tri8 Di t$ng8 s= kin8 phMng th:c th lB s= kin8
thj :&L8 thj ;T&L8 ni )ung fil(8 v kIt ;ut tQ cc c<u
lnh.
C>? @A LNO DE@ FG HIAB JK LMA>EUeng trong cc o*n
chMng tr%nh n>u &6t .t phNn 9uan tr0ng ca .S lnh
ho!c )eng cho cc )kng lnh8 c<u lnh *L.
V !" h#$%
Vn Th thut
QUY C
13
Gii php Ghi ch
14
15
Y&U CU V' H( TH)N*
l ch*' $c nhKng v2 ) .3u i k1. 9u'n sch n'8 &*n s@ cNn
nhKng phNn .. sau <'\
Microsoft .NET Framework S! "ersion #.#
Microsoft $is%al St%&io .NET '(()
Microsoft *in&ows '(((8 *in&ows +,8
ho!c Microsoft *in&ows Ser"er '(()
Microsoft S-. Ser"er '((( ho!c MSE
Di vi cc .c trong chMng Zd
Microsoft /nternet /nformation Ser"ices 0//S1
Di vi .t sD .c trong chMng [ v chMng Z]
m>u cNu tDi thiu v phNn c:ng l & vi ;O lB Pen/"um << _`d "no8
vi )ung l$ng =>& tDi thiu l Z]b "L nIu &*n ang sO )ng
&")ro8o?/ @"nAow8 20008 v l ]`a "L nIu &*n ang sO )ng
@"nAow8 :P8 @"nAow8 2000 *erBer8 ha' @"nAow8 *erBer 200C. L*n
cNn khong ` pL )ung l$ng qa c:ng ckn trDng ci !t V"8uaD
*/uA"o .NET 200C. HhKng gi tri n' l .:c tDi thiu8 9u tr%nh pht
trin s@ )r )ng hMn tr>n .t h thDng vi )ung l$ng =>& ln v
qa c:ng ckn trDng nhiu.
"!c )e &n hin th=c .NET Framework cho @"nAow8 ca &")ro8o?/
l ti>u i. ca 9u'n sch n'8 .t .c ti>u 9uan tr0ng l cp .t
Y&U CU V' H( TH)N*
16
ti ngu'>n hKu 2ch cho nhKng l6p tr%nh vi>n C# kh4ng 9uan t<. In
nn . h0 ang l. vic ho!c c4ng c . h0 tru' ;ut. Hgoi
nhKng ch !c &it kh4ng $c h# tr$ tr>n tt c nn .NET gnh
@"nAow8 Form8 >EF.NET8 v >*P.NETh8 nhiu v2 ) .3u trong
9u'n sch n' u h$p l tr>n tt c &n hin th=c .NET.
17
18
CCH S+ ,-N* .A C,
S lnh $c cp C )*ng t6p cc gii php v )= n
V"8uaD */uA"o .NET 200C8 $c ts ch:c th(o chMng v
sD .c. "#i chMng l .t gii php c l6p8 v
.#i .c l .t )= n c l6p &>n trong gii php ca chMng.
"t vi .c trong chMng ZZ v chMng Z] tr%nh &' v l6p tr%nh
.*ng gt. nhKng )= n c l6p cF ch:a cc phNn cli(nt v s(rv(r
trong gii php ca .c.
"
"!c )e tt c nhKng v2 ) .3u $c cp C )*ng )= n V"8uaD */uA"o
.NET8 nhng hNu hIt u &ao gt. .t fil( ngutn Mn . &*n cF th
&i>n )ich v ch*' c l6p vi V"8uaD */uA"o .NET. HIu kh4ng sO
)ng V"8uaD */uA"o .NET 200C8 &*n cF th inh vi .S ngutn cho .t
.c c th &5ng cch )u't cu trGc th .c ca v2 ) .3u. u2
)8 t%. .S ngutn cho .c _.^8 &*n s@ t%. nF trong th .c
Chuong0GH0GI0C. HIu sO )ng tr%nh &i>n )ich )kng lnh th% phi
&o . r5ng &*n S th>. tha. chiIu In tt c cc ass(.&l' cNn
thiIt.
"t sD :ng )ng .3u '>u cNu cc Di sD )kng lnh gs@ $c .4 t
trong phNn vvn &n ca .ch. HIu sO )ng V"8uaD */uA"o .NET8
&*n cF th nh6p cc Di sD n' trong ProJe)/ ProKer/"e8 g.c
Ee4ugg"ng ca phNn Con?"gura/"on ProKer/"e8h. Hh r5ng8 nIu cNn
nh6p t>n th .c ha' fil( cF ch:a khong tr/ng th% &*n cNn !t t>n
N' trong )u nh' kXp.
7t c v2 ) tru' ;ut )K liu >EF.NET $c t*o vi *L *erBer
2000. PhGng c?ng cF th $c sO )ng vi *L *erBer L v &*EE.
CCH S+ ,-N* .A C,
19
V"8uaD */uA"o .NET cF ch:a cc kich &n *L ci !t cc cM sC
)K liu .3u Nor/hw"nA v Pu48 nIu chGng cha hin )in gcc fil(
"n8/nwnA.8MD v "n8/Ku48.8MD trong th .c CNHProgram
F"De8H&")ro8o?/ V"8uaD */uA"o .NET 200CH*E'H B1.1H*amKDe8H*e/uKh.
L*n cF th ch*' cc kich &n n' &5ng uery >naDyOer gvi *L
*erBerh ha' F*L.e2e gvi &*EEh.
l sO )ng cc .c trong chMng [ v chMng Z]8 &*n cNn chXp
chGng vo th .c <NHC*harKH gng )3n n' l .S c:ng trong cc
fil( )= n V"8uaD */uA"o .NETh. L*n c?ng s@ cNn t*o .t th .c o
cF t>n l C*harK nh ;* In <NHC*harK. L*n cF th ci !t phXp nh
;* n' &5ng <<* &anager. 7h=c hin th(o cc &c )i <'\
Z. whCi ch*' <<* &anager gch0n */ar/ P Con/roD PaneD P
>Am"n"8/ra/"Be TooD8 P <n/erne/ <n?orma/"on *erB")e8h.
]. whCi ch*' V"r/uaD E"re)/ory @"OarA trong <<* &anager &5ng
cch nh/p phi vo Ee?auD/ @e4 *"/e v ch0n New P V"r/uaD
E"re)/ory tQ .(nu ngK cnh.
^. Hh/p Ne2/ &/t Nu. "xu th4ng tin Nu ti>n l &2 )anh
C*harK. Hh/p Ne2/ tiIp tc.
_. "xu th4ng tin th: hai l th .c v6t lB <NHC*harK. Hh/p Ne2/
tiIp tc.
`. POa ss thu6t sq cuDi ceng cho phXp &*n iu chJnh 9u'n cho
th .c o. L*n n>n sO )ng cc thiIt l6p .!c inh. Hh/p
Ne2/.
a. Hh/p F"n"8h kIt thGc tr%nh thu6t sq. L*n s@ th' th .c o
n' trong phNn c<' ca <<* &anager.
[. whai trin th .c o C*harK trong <<* thnh th .c n5.
trong C*harKHChuong0LH0LI01.
b. Hh/p phi vo th .c n'8 ch0n ProKer/"e88 rti nh/p vo
nGt Crea/e trong thj E"re)/ory chu'n th .c n' thnh
th .c :ng )ng @e4.
c. y!p l*i &c b cho .#i .c trong chMng [.
Zd. 7h(o tr%nh t= S $c tr%nh &' trong cc &c [zc8 t*o th
.c :ng )ng @e4 cho cc .c Z].]8 Z].^8 Z]._8 v Z].a
trong chMng Z].

20
/-C L-C
!" N#" $%& '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 7
()& T*+( (,- ./(0 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 10
1&2 34( ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 12
25& (%& 67 08 T09N: '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 15
(/(0 .; <=N: $>- (< ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 18
?=( =( '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 20
(hng 1@ P0/T T*"AN BN: <=N: 29
1. Tao ng dung Console ........................................................................................... 31
2. Tao ng dung dua-trn-Windows ........................................................................... 33
3. Tao v s dung module .......................................................................................... 37
4. Tao v s dung th vin ......................................................................................... 39
5. Truy xut cc di s dng lnh ............................................................................... 40
6. Chn bin djch mt khi m vo file thuc thi .......................................................... 42
7. Truy xut mt phn t chng trnh
c tn trng vi mt t kha ........................................................................................ 45
/-C L-C
21
8. Tao v qun l cp kha tn manh ......................................................................... 45
9. Tao tn manh cho assembly ................................................................................... 47
10. Xc minh mt assembly tn manh khng bj sa di ............................................ 49
11. Hon vic k assembly ......................................................................................... 50
12. K assembly vi ch k s Authenticode ............................................................. 52
13. Tao v thit lp tin tng mt SPC th nghim ................................................... 54
14. Qun l Global Assembly Cache .......................................................................... 56
15. Ngn ngi khc djch ngoc m ngun ca ban ................................................ 56
(hng 2@ T0-C T/( <D "8& 59
1. Thao tc chui mt cch hiu qu .......................................................................... 61
2. M ha chui bng cc kiu m ha k tu ............................................................. 62
3. Chuyn cc kiu gi trj c bn thnh mng kiu byte ............................................ 65
4. M ha d liu nhj phn thnh vn bn ................................................................. 67
5. S dung biu thc chnh quy d kim tra d liu nhp .......................................... 70
6. S dung biu thc chnh quy d doc bin djch .................................................... 72
7. Tao ngy v gi t chui ........................................................................................ 75
8. Cng, tr, so snh ngy gi ................................................................................... 76
9. Sp xp mt mng hoc mt ArrayList ................................................................... 78
10. Chp mt tp hop vo mt mng ......................................................................... 79
11. Tao mt tp hop kiu manh .................................................................................. 80
12. Lu mt di tong kh-tun-tu-ha vo file ......................................................... 81
(hng 3@ ?"7N BN: <=N:E (F (0G P0HN (0"G&E 6I ."5& <D "8& 86
1. Tao min ng dung ................................................................................................. 88
2. Chuyn cc di tong qua lai cc min ng dung ................................................. 90
3. Trnh nap cc assembly khng cn thit vo min ng dung ............................... 91
4. Tao kiu khng th vot qua bin min ng dung ................................................. 92
5. Nap assembly vo min ng dung hin hnh ........................................................ 92
6. Thuc thi assembly min ng dung khc ............................................................. 94
7. Th hin ha mt kiu trong min ng dung khc ................................................. 95
8. Truyn d liu gia cc min ng dung ............................................................... 101
9. Gii phng assembly v min ng dung .............................................................. 103
10. Truy xut thng tin Type ..................................................................................... 104
11. Kim tra kiu ca mt di tong ......................................................................... 106
12. Tao mt di tong bng c ch phn chiu ....................................................... 107
13. Tao mt dc tnh ty bin .................................................................................... 110
14. S dung c ch phn chiu d kim tra
cc dc tnh ca mt phn t chng trnh ............................................................... 113
(hng 4@ T"A& T*JN0E T"GN T*JN0E 6I .K $LN: BM 115
1. Thuc thi phng thc vi thread-pool .................................................................. 117
2. Thuc thi phng thc mt cch bt dng b ....................................................... 121
3. Thuc thi phng thc bng Timer ........................................................................ 129
4. Thuc thi phng thc bng cch ra hiu di tong WaitHandle ......................... 132
5. Thuc thi phng thc bng tiu trnh mi ............................................................ 135
6. iu khin qu trnh thuc thi ca mt tiu trnh .................................................... 137
22
7. Nhn bit khi no mt tiu trnh kt thc .............................................................. 142
8. ng b ha qu trnh thuc thi ca nhiu tiu trnh .............................................. 143
9. Tao mt di tong tp hop c tnh cht an-ton-v-tiu-trnh .............................. 148
10. Khi chay mt tin trnh mi ............................................................................... 149
11. Kt thc mt tin trnh ......................................................................................... 152
12. Bo dm chi c th chay
mt th hin ca ng dung tai mt thi dim ............................................................ 154
(hng 5@ N? 157
1. Hin thj cu trc ca mt ti liu XML trong TreeView ......................................... 159
2. Chn thm nt vo ti liu XML ............................................................................ 164
3. Chn thm nt vo ti liu XML mt cch nhanh chng ...................................... 166
4. Tm mt nt khi bit tn ca n ............................................................................. 169
5. Thu ly cc nt XML trong mt khng gian tn XML cu th ................................. 170
6. Tm cc phn t vi biu thc XPath ................................................................... 172
7. c v ghi XML m khng phi nap ton b ti liu vo b nh ......................... 175
8. Xc nhn tnh hop l ca mt ti liu XML dua trn mt Schema ....................... 178
9. S dung XML Serialization vi cc di tong ty bin ........................................ 184
10. Tao XML Schema cho mt lp .NET .................................................................. 188
11. Tao lp t mt XML Schema .............................................................................. 188
12. Thuc hin php bin di XSL .............................................................................. 189
(hng 6@ O"N<CO. PC*? 193
1. Thm diu kim vo form lc thuc thi ................................................................... 195
2. Lin kt d liu vo diu kim .............................................................................. 197
3. X l tt c cc diu kim trn form ..................................................................... 199
4. Theo vt cc form kh kin trong mt ng dung .................................................. 200
5. Tm tt c cc form trong ng dung M .............................................................. 201
6. Lu tr kch thc v vj tr ca form .................................................................... 203
7. Buc ListBox cun xung ...................................................................................... 205
8. Chi cho php nhp s vo TextBox ...................................................................... 206
9. S dung ComboBox c tnh nng auto-complete ................................................. 207
10. Sp xp ListView theo ct bt ky ........................................................................ 211
11. Lin kt menu ng cnh vo diu kim .............................................................. 213
12. S dung mt phn menu chnh cho menu ng cnh ......................................... 214
13. Tao form da ngn ng ........................................................................................ 217
14. Tao form khng th di chuyn doc ................................................................... 219
15. Lm cho form khng dng vin c th di chuyn doc ................................... 220
16. Tao mt icon dng trong khay h thng ............................................................. 222
17. Xc nhn tnh hop l ca du vo cho mt diu kim ........................................ 223
18. Thuc hin thao tc ko-v-th ............................................................................ 226
19. S dung tro gip cm-ng-cnh ......................................................................... 228
20. p dung phong cch Windows XP ...................................................................... 229
21. Thay di d duc ca form .................................................................................... 231
(hng 7@ -.P'NQT 6I OQB PC*? 234
23
1. Chuyn hng ngi dng sang trang khc ........................................................ 236
2. uy tr trang thi gia cc yu cu ca trang ....................................................... 237
3. Tao cc bin thnh vin c trang thi cho trang ................................................... 243
4. p ng cc su kin pha client vi avaScript ................................................... 244
5. Hin thj ca s pop-up vi avaScript .................................................................. 247
6. Thit lp focus cho diu kim ................................................................................ 249
7. Cho php ngi dng upload file .......................................................................... 250
8. S dung S authentication .................................................................................... 253
9. S dung orms authentication .............................................................................. 257
10. Thuc hin xc nhn tnh hop l c-chn-lua ...................................................... 260
11. Thm dng diu kim vo Web orm ................................................................. 263
12. Tr v dng mt bc hnh ................................................................................... 266
13. Nap diu kim ngi dng bng m lnh ........................................................... 270
14. S dung page-caching v fragment-caching ...................................................... 275
15. ng lai d liu vi ASP.NET Cache ................................................................. 276
16. Kch hoat vic g ri ng dung Web .................................................................. 280
17. Thay di quyn d cp cho m ASP.NET .......................................................... 284
(hng 8@ $L 0R-E $- P03FN: T"8NE 6I "N )N 287
1. Tm tt c cc font d doc ci dt ...................................................................... 289
2. Thuc hin hit testing vi shape .......................................................................... 291
3. Tao form c hnh dang ty bin ............................................................................ 295
4. Tao diu kim c hnh dang ty bin .................................................................... 297
5. Thm tnh nng cun cho mt bc hnh ............................................................... 301
6. Thuc hin chup mn hnh esktop ....................................................................... 303
7. S dung double buffering d tng tc d v lai .................................................. 305
8. Hin thj hnh dang thumbnail ............................................................................. 308
9. Pht ting beep ca h thng ............................................................................. 310
10. Chi file audio ..................................................................................................... 311
11. Chi file video ..................................................................................................... 313
12. Ly thng tin v cc my in d doc ci dt ...................................................... 317
13. n vn bn dn gin ............................................................................................ 321
14. n vn bn c nhiu trang .................................................................................... 324
15. n text dang wrapping .......................................................................................... 328
16. Hin thj print-preview .......................................................................................... 330
17. Qun l tc vu in ................................................................................................. 333
18. S dung Microsoft Agent .................................................................................... 338
(hng 9@ P"QE T03 ?=(E 6I "SC 346
1. Truy xut cc thng tin v file hay th muc .......................................................... 348
2. Thit lp cc thuc tnh ca file v th muc ......................................................... 353
3. Chp, chuyn, xa file hay th muc ..................................................................... 354
4. Tnh kch thc ca th muc ................................................................................ 357
5. Truy xut thng tin phin bn ca file ................................................................... 359
6. S dung TreeView d hin thj cy th muc ust-in-time ...................................... 360
7. c v ghi file vn bn .......................................................................................... 363
8. c v ghi file nhj phn ......................................................................................... 365
24
9. c file mt cch bt dng b ............................................................................... 367
10. Tm file ph hop mt biu thc wildcard ............................................................. 370
11. Kim tra hai file c trng nhau hay khng ........................................................... 371
12. Thao tc trn dng dn file ............................................................................... 373
13. Xc djnh dng dn tng ng vi mt file hay th muc ................................. 374
14. Lm vic vi dng dn tng di .................................................................... 375
15. Tao file tam ......................................................................................................... 376
16. Ly dung long da cn trng ............................................................................. 377
17. Hin thj cc hp thoai file .................................................................................... 379
18. S dung khng gian lu tr ring ....................................................................... 382
19. Theo di h thng file d pht hin thay di ....................................................... 384
20. Truy xut cng COM ........................................................................................... 386
(hng 10@ (F .T <D "8& 389
1. Kt ni c s d liu ............................................................................................. 392
2. S dung connection-pooling ................................................................................. 394
3. Thuc thi cu lnh SQL hoc th tuc tn tr .......................................................... 397
4. S dung thng s trong cu lnh SQL hoc th tuc tn tr ................................. 400
5. X l kt qu ca truy vn SQL bng data-reader ............................................... 403
6. Thu ly ti liu XML t truy vn SQL Server ........................................................ 407
7. Nhn bit tt c cc th hin SQL Server 2000 trn mang .................................. 411
8. c file Excel vi AO.NET ................................................................................. 413
9. S dung ata orm Wizard .................................................................................. 415
10. S dung Crystal eport Wizard .......................................................................... 424
(hng 11@ UP T*JN0 ?VN: 435
1. ownload file thng qua HTTP ............................................................................. 437
2. ownload v x l file bng stream ...................................................................... 438
3. Ly trang HTML t mt website c yu cu xc thuc .......................................... 440
4. Hin thj trang web trong ng dung dua-trn-Windows ......................................... 442
5. Ly dja chi P ca my tnh hin hnh .................................................................. 446
6. Phn gii tn min thnh dja chi P ...................................................................... 447
7. Ping mt dja chi P .............................................................................................. 448
8. Giao tip bng TCP ............................................................................................... 452
9. Ly dja chi P ca client t kt ni socket ............................................................. 457
10. Thit lp cc ty chn socket .............................................................................. 459
11. Tao mt TCP-server h-tro-da-tiu-trnh ............................................................ 460
12. S dung TCP mt cch bt dng b .................................................................. 463
13. Giao tip bng UP ............................................................................................ 467
14. Gi e-mail thng qua SMTP ............................................................................... 470
15. Gi v nhn e-mail vi MAP ............................................................................. 471
(hng 12@ <W(0 6= OQB N? 6I *Q?CT"N: 474
1. Trnh vit m cng cho dja chi UL ca djch vu Web XML ................................ 477
2. S dung k thut response-caching trong djch vu Web XML ............................... 478
3. S dung k thut data-caching trong djch vu Web XML ....................................... 479
25
4. Tao phng thc web h tro giao djch ............................................................... 482
5. Thit lp thng tin xc thuc cho djch vu Web XML ............................................... 485
6. Gi bt dng b mt phng thc web ................................................................ 486
7. Tao lp kh-truy-xut-t-xa .................................................................................. 488
8. ng k tt c cc lp kh-truy-xut-t-xa trong mt assembly .......................... 494
9. Qun l cc di tong xa trong S .................................................................... 496
10. Pht sinh su kin trn knh truy xut t xa ....................................................... 497
11. Kim sot thi gian sng ca mt di tong xa ............................................. 502
12. Kim sot phin bn ca cc di tong xa ..................................................... 504
13. Tao phng thc mt chiu
vi djch vu Web XML hay emoting .......................................................................... 506
(hng 13@ BHC ?UT 509
1. Cho php m lnh c-d-tin-cy-mt-phn
s dung assembly tn manh ca ban ........................................................................ 512
2. V hiu bo mt truy xut m lnh ....................................................................... 514
3. V hiu vic kim tra quyn thuc thi ..................................................................... 516
4. Bo dm b thuc thi cp cho assembly mt s quyn no d ............................. 517
5. Gii han cc quyn doc cp cho assembly ....................................................... 519
6. Xem cc yu cu quyn doc tao bi mt assembly ........................................... 520
7. Xc djnh m lnh c quyn no d lc thuc thi hay khng .................................. 522
8. Han ch ai d tha k cc lp ca ban
v chp d cc thnh vin lp ................................................................................... 523
9. Kim tra chng c ca mt assembly .................................................................. 525
10. X l chng c khi nap mt assembly .............................................................. 527
11. X l bo mt b thuc thi bng chng c ca min ng dung ......................... 529
12. X l bo mt b thuc thi
bng chnh sch bo mt ca min ng dung ........................................................... 531
13. Xc djnh ngi dng hin hnh c l thnh vin
ca mt nhm Windows no d hay khng ............................................................... 535
14. Han ch nhng ngi dng no d thuc thi m lnh ca ban ........................... 538
15. Gi nhn ngi dng Windows .......................................................................... 543
(hng 14@ ?UT ?X 548
1. Tao s ngu nhin ................................................................................................ 550
2. Tnh m bm ca password .................................................................................. 552
3. Tnh m bm ca file ............................................................................................. 554
4. Kim tra m bm ................................................................................................... 555
5. Bo dm tnh ton vn d liu bng m bm c kha ......................................... 558
6. Bo v file bng php mt ha di xng .............................................................. 560
7. Truy lai kha di xng t password ..................................................................... 566
8. Gi mt b mt bng php mt ha bt di xng ................................................. 568
9. Lu tr kha bt di xng mt cch an ton ....................................................... 574
10. Trao di kha phin di xng mt cch an ton ................................................. 577
(hng 15@ Y0H NZN: "5N T/( ?X 8N0 Y0[N:-$3\(-1&HN-] 584
1. Gi mt hm trong mt LL khng-doc-qun-l ................................................ 586
2. Ly handle ca mt diu kim, ca s, hoc file .................................................. 590
26
3. Gi mt hm khng-doc-qun-l c s dung cu trc ....................................... 591
4. Gi mt hm khng-doc-qun-l c s dung callback ....................................... 594
5. Ly thng tin li khng-doc-qun-l ................................................................... 595
6. S dung thnh phn COM trong .NET-client ........................................................ 597
7. Gii phng nhanh thnh phn COM ..................................................................... 600
8. S dung thng s ty chn ................................................................................... 600
9. S dung diu kim ActiveX trong .NET-client ....................................................... 602
10. Tao thnh phn .NET dng cho COM-client ....................................................... 603
(hng 16@ (/( :"-C <"8N 6I ?^& T0[N: <=N: 605
1. Hin thuc kiu kh-tun-tu-ha (serializable type) ............................................... 607
2. Hin thuc kiu kh-sao-chp (cloneable type) ..................................................... 614
3. Hin thuc kiu kh-so-snh (comparable type) .................................................... 617
4. Hin thuc kiu kh-lit-k (enumerable type) ....................................................... 622
5. Hin thuc lp kh-hy (disposable class) ............................................................. 629
6. Hin thuc kiu kh-djnh-dang (formattable type) .................................................. 633
7. Hin thuc lp ngoai l ty bin ............................................................................. 636
8. Hin thuc di s su kin ty bin ......................................................................... 640
9. Hin thuc mu Singleton ....................................................................................... 642
10. Hin thuc mu Observer ..................................................................................... 643
(hng 17@ .K 0_- 0\P 64" ?[" T*3!N: O"N<CO. 651
1. Truy xut thng tin mi trng .............................................................................. 653
2. Ly gi trj ca mt bin mi trng ...................................................................... 657
3. Ghi mt su kin vo nht k su kin Windows ..................................................... 658
4. Truy xut Windows egistry ................................................................................. 659
5. Tao mt djch vu Windows ..................................................................................... 663
6. Tao mt b ci dt djch vu Windows .................................................................... 668
7. Tao shortcut trn esktop hay trong Start menu .................................................. 671
P0= =( -@ :"4" T0"8& ?MT .9 ([N: (= 'NQT ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 676
A.1 Bin djch cc doan m ngn vi Snippet Compiler ............................................ 676
A.2 Xy dung biu thc chnh quy vi egulator ..................................................... 678
A.3 Sinh m vi CodeSmith ....................................................................................... 679
A.4 Vit kim th dn vj vi NUnit ............................................................................ 681
A.5 Kim sot m lnh vi xCop ............................................................................ 683
A.6 Kho st assembly vi .NET eflector ............................................................... 684
A.7 Lp ti liu m lnh vi Noc .............................................................................. 686
A.8 Tao dung gii php vi NAnt ............................................................................... 689
A.9 Chuyn di phin bn ASP.NET vi ASP.NET Version Switcher ....................... 691
A.10 Chuyn di phin bn du n vi Visual Studio .NET Proect Converter ........... 692
A.11 Chuyn m ngun VB.NET sang C vi VB.NET to C Converter .................. 693
A.12 Chuyn m ngun C sang VB.NET vi Convert C to VB.NET ..................... 693
A.13 Xy dung website qun trj c s d liu vi ASP.NET Maker 1.1 ................... 694
P0= =( B@ T0&UT N:D -N0 - 6"8T ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 697
27
TI" "8& T0-? Y0HC '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 705

28
1
29
Ch01n2 345HT TRI6N 7N* ,-N*
30
31
Chng 1: Ph` `aibn cng deng
hMng n' tr%nh &' .t sD kiIn th:c nn tng8 cNn thiIt trong 9u tr%nh pht trin .t
:ng )ng C#. Pc .c trong chMng s@ tr%nh &' chi tiIt cc vn sau <'\ P
{<' )=ng cc :ng )ng Con8oDe v @"nAow8 Form g.c Z.Z v Z.]h.
7*o v sO )ng Mn th .S lnh v th vin .S lnh g.c Z.^ v Z._h.
7ru' ;ut Di sD )kng lnh tQ &>n trong :ng )ng g.c Z.`h.
|O )ng cc chJ thi &i>n )ich te' &iIn vic &i>n )ich .S ngutn g.c Z.ah.
7ru' ;ut cc phNn tO chMng tr%nh g$c ;<' )=ng trong ng4n ngK khch cF t>n ;ung
t vi cc tQ khFa C# g.c Z.[h.
7*o v ;c .inh t>n .*nh cho ass(.&l' g.c Z.b8 Z.c8 Z.Zd8 v Z.ZZh.
wB .t ass(.&l' &5ng chK kB sD &")ro8o?/ >u/hen/")oAe g.c Z.Z] v Z.Z^h.
Yun lB nhKng ass(.&l' chia sj $c lu trK trong 6Do4aD >88em4Dy Ca)he g.c
Z.Z_h.
Hgvn ngi )eng )ich ng$c ass(.&l' ca &*n g.c Z.Z`h.
TPQ JR JSJ JTAB JU LVWJ Q>RX YZNA QHXAB J>V[AB A\] LGZ J^ QHXAB Microsoft
.NET Framework >X_J .NET Framework S!(
CSJ JTAB JU Q>ZIJ Framework A`O QHXAB Q>V OUJ J>aA> Jbc d>@CA FRA
Framework O\ FeA LcAB fg hUAB iO_J LMA> Y\ 2*/N3*S2Microsoft.NET2
Framework2"#.#.4)'' AjZ FeA fg hUAB .NET Framework "ersion #.#k( 8ZS QHlA>
J\@ L_Q (NET fm Qn LIAB Q>CO Q>V OUJ A\] D\X LVoAB hpA OT@ QHVoAB Jbc >q
Q>KAB(
CSJ JTAB JU LVWJ JZAB JPd JrAB DE@ S! A`O QHXAB Q>V OUJ 5in Jbc Q>V OUJ J\@
L_Q S! iO_J LMA> Y\ 2,rogram Files2Microsoft $is%al St%&io .NET '(()2
S!2"#.#25ink( T>V OUJ A\] s>TAB LVWJ Q>CO D\X LVoAB hpA OIQ JSJ> Qn LIAB,
Dl DN] FeA d>R@ Qn Q>CO A^ D\X Lt hu h\AB QHZ] vZPQ JSJ JTAB JU A\](
HwZ >jQ JSJ JTAB JU QHCA LGZ >x QHW >c@ heAB LK@ fK hyAB YqA>z AB{A D\ h\@(
C>V[AB A\] YZTA QHlA> F\] heAB h\@ Dl hu >@tZ >[A iA>VAB Fr Ye@ FeA d>R@ B|
A>@GZ >[Ak( !K@ DE@ heAB AB{A, FeA >}] Q>cO s>RX Q\@ Y@qZ QV[AB ~AB QHXAB (NET
Framework S!(
1'
1' T o ng d ng Console T o ng d ng Console
#eA OZKA v] hnAB OIQ ~AB hUAB s>TAB JwA B@cX h@qA ABVo@ hrAB L >c
i67/k, Q>c] D\X L^ >@tA Q>M sjQ ZR D\ LJ h? Y@qZ A>Nd Q hyAB YqA>(
H@qA Q>nJ OIQ d>V[AB Q>~J QA> J^ QCA Y\ Main hVE@ JSJ heAB fcZ QHXAB aQ A>PQ
OIQ @Y O} ABZAz
public static void Main();
public static void Main(string[] args);
public static int Main();
32
Chng 1: Ph` `aibn cng deng
public static int Main(string[] args);
Sg hUAB LK@ fK /target:exe s>@ F@CA hMJ> cffOFY] Jbc FeA F`AB QHlA> F@CA hMJ>
C# icsc.e8ek(
"!c inh tr%nh &i>n )ich C# s@ ;<' )=ng .t :ng )ng Con8oDe trQ khi &*n chJ inh lo*i
khc. u% lB )o n'8 kh4ng cNn chJ inh /target.exe8 nhng th>. nF vo s@ r} rng hMn8 hKu
2ch khi t*o cc kich &n &i>n )ich s@ $c sO )ng &Ci cc :ng )ng khc ho!c s@ $c sO
)ng l!p i l!p l*i trong .t thi gian. u2 ) sau .inh h0a .t lp cF t>n l ConsoleUtils
g$c inh nghqa trong fil( Con8oDeQ/"D8.)8h\
using System;
public class ConsoleUtils {

// Phng thc hin th li nhc v doc dp ng tu console.
public static string ReadString(string msg) {

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

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

System.Console.WriteLine(msg);
}

// Phng thc Main dung d thu nghim lp ConsoleUtils.
public static void Main() {
// Yu cu ngi dung nhp tn.
string name = ReadString("Please enter your name : ");

// Hin th thng dip cho mung.
WriteString("Welcome to Microsoft .NET Framework, " + name);
}
}
33
Chng 1: Ph` `aibn cng deng
l ;<' )=ng lp ConsoleUtils thnh .t :ng )ng Con8oDe cF t>n l Con8oDeQ/"D8.e2e8 sO
)ng lnh\
csc /target:exe ConsoleUtils.cs
L*n cF th ch*' fil( th=c thi tr=c tiIp tQ )kng lnh. whi ch*'8 phMng th:c Main ca :ng )ng
Con8oDeQ/"D8.e2e '>u cNu &*n nh6p t>n v sau F hin thi th4ng ip cho .Qng nh sau\
Please enter your name : Binh Phuong
Welcome to Microsoft .NET Framework, Binh Phuong
7h=c tI8 :ng )ng hiI. khi chJ gt. .t fil( .S ngutn. u2 )8 lp HelloWorld )i <' sO
)ng lp ConsoleUtils hin thi th4ng ip +;eDDoR worDA- l>n .n h%nh gHelloWorld n5.
trong fil( ;eDDo@orDA.)8h.
public class HelloWorld {
public static void Main() {

ConsoleUtils.WriteString("Hello, world");
}
}
l ;<' )=ng .t :ng )ng Con8oDe gt. nhiu fil( .S ngutn8 &*n phi chJ inh tt c cc fil(
.S ngutn n' trong Di sD )kng lnh. u2 )8 lnh sau <' ;<' )=ng :ng )ng
&yF"r8/>KK.e2e tQ cc fil( .S ngutn ;eDDo@orDA.)8 v Con8oDeQ/"D8.)8\
csc /target:exe /main:Helloorld /out:M!"irst#pp.exe
Helloorld.cs ConsoleUtils.cs
lDi sD /out chJ inh t>n ca fil( th=c thi s@ $c t*o ra. HIu kh4ng $c chJ inh8 t>n ca fil(
th=c thi s@ l t>n ca fil( .S ngutn Nu ti>nEtrong v2 ) tr>n l ;eDDo@orDA.)8. u% c hai lp
HelloWorld v ConsoleUtils u cF phMng th:c Main8 tr%nh &i>n )ich kh4ng th t= ng
9u'It inh <u l i. nh6p cho fil( th=c thi. L*n phi sO )ng Di sD /main chJ inh t>n
ca lp ch:a i. nh6p cho :ng )ng ca &*n.
2' 2' T o ng d ng d a-trn-Windows T o ng d ng d a-trn-Windows
#eA JwA v] hnAB OIQ ~AB hUAB JZAB JPd B@cX h@qA ABVo@ hrAB L >c i67/k
hnc6QHCA6*in&ows Form(
H@qA Q>nJ OIQ d>V[AB Q>~J QA> Main QHXAB aQ A>PQ OIQ @Y O} ABZA( THXAB
Main, QeX OIQ Q>t >@qA Jbc OIQ YEd Q>c sj Q YEd $!stem.indo%s."orms."orm
iL] Y\ XHO J>aA> Jbc ~AB hUABk( THZ]GA LK@ QVWAB A\] J>X d>V[AB Q>~J QA>
&un Jbc YEd $!stem.indo%s."orms.#pplication( Sg hUAB LK@ fK /target:%inexe
s>@ F@CA hMJ> cffOFY] Jbc FeA F`AB QHlA> F@CA hMJ> C# icsc.e8ek(
uic ;<' )=ng .t :ng )ng cF giao )in ngi )eng t h0a @"nAow8 Mn gin hon ton
khc ;a vic pht trin .t :ng )ng )=aztr>nz@"nAow8 hon chJnh. 7u' nhi>n8 &t k viIt
34
Chng 1: Ph` `aibn cng deng
.t :ng )ng Mn gin nh ;eDDo @orDA ha' viIt phi>n &n kI tiIp cho &")ro8o?/ @orA8 &*n
c?ng phi th=c hin nhKng vic sau\
7*o .t lp thQa kI tQ lp System.Windows.Forms.Form cho .#i for. cNn cho :ng
)ng.
7rong .#i lp for.8 khai &o cc thnh vi>n .4 t cc iu ki. tr>n for.8 v2 )
Button8 Label8 ListBox8 TextBox. Pc thnh vi>n n' n>n $c khai &o l private
ho!c 2t nht c?ng l protected cc phNn tO khc ca chMng tr%nh kh4ng tru' ;ut
tr=c tiIp chGng $c. HIu .uDn cho phXp tru' ;ut cc iu ki. n'8 hin th=c cc
thnh vi>n cNn thiIt trong lp for. cung cp vic tru' ;ut gin tiIp gki. sot
$ch In cc iu ki. n5. trong.
7rong lp for.8 khai &o cc phMng th:c th lB cc s= kin )o cc iu ki. tr>n
for. sinh ra8 ch~ng h*n vic nh/p vo Button8 vic nhn ph2. khi .t TextBox ang
t2ch c=c. Pc phMng th:c n' n>n $c khai &o l private ho!c protected v tu<n
th(o .3u s= kin .NET chuxn gs@ $c .4 t trong .c Za.Zdh. 7rong cc phMng th:c
n' gho!c trong cc phMng th:c $c g0i &Ci cc cc phMng th:c n'h8 &*n s@ inh
nghqa cc ch:c nvng ca :ng )ng.
whai &o .t phMng th:c khCi )=ng cho lp for. t*o cc iu ki. tr>n for. v
cu h%nh tr*ng thi &an Nu ca chGng gk2ch thc8 .u8 ni )ungh. RhMng th:c
khCi )=ng n' c?ng n>n li>n kIt cc phMng th:c th lB s= kin ca lp vi cc s= kin
tMng :ng ca .#i iu ki..
whai &o phMng th:c tqnh MainEthng l .t phMng th:c ca lp tMng :ng vi
for. ch2nh ca :ng )ng. RhMng th:c n' l i. &/t Nu ca :ng )ng v cF cc
)*ng nh S $c c6p C .c Z.Z. 7rong phMng th:c Main8 t*o .t th hin ca
for. ch2nh v tru'n nF cho phMng th:c tqnh Application.Run. RhMng th:c Run hin
thi for. ch2nh v khCi ch*' .t vkng l!p th4ng ip chuxn trong tiu tr%nh hin hnh8
chu'n cc tc ng tQ ngi )eng gnhn ph2.8 nh/p chuth thnh cc s= kin gOi
In :ng )ng.
yp WelcomeForm trong v2 ) )i <' .inh h0a cc k thu6t tr>n. whi ch*'8 nF '>u cNu ngi
)eng nh6p vo t>n rti hin thi .t MessageBox cho .Qng.
using System.Windows.Forms;
public class WelcomeForm : Form {
// Cc thnh vin private gi tham chiu dn cc diu kim.
private Label label1;
private TextBox textBox1;
private Button button1;
// Phng thc khoi dng (tao mt th hin form
35
Chng 1: Ph` `aibn cng deng
// v cu hnh cc diu kim trn form).
public WelcomeForm() {
// Tao cc diu kim trn form.
this.label1 = new Label();
this.textBox1 = new TextBox();
this.button1 = new Button();
// Tam hon layout logic cua form trong khi
// chng ta cu hnh v b tr cc diu kim.
this.SuspendLayout();
// Cu hnh cc Label (hin th yu cu).
this.label1.Location = new System.Drawing.Point(16, 36);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(128, 16);
this.label1.TabIndex = 0;
this.label1.Text = "Please enter your name:";
// Cu hnh TextBox (nhn thng tin tu ngi dung).
this.textBox1.Location = new System.Drawing.Point(152, 32);
this.textBox1.Name = "textBox1";
this.textBox1.TabIndex = 1;
this.textBox1.Text = "";
// Cu hnh Buton (ngi dung nhn vo sau khi nhp tn).
this.button1.Location = new System.Drawing.Point(109, 80);
this.button1.Name = "button1";
this.button1.TabIndex = 2;
this.button1.Text = "Enter";
this.button1.Click += new System.EventHandler(this.button1_Click);
// Cu hnh WelcomeForm v thm cc diu kim.
this.ClientSize = new System.Drawing.Size(292, 126);
this.Controls.Add(this.button1);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.label1);
this.Name = "form1";
36
Chng 1: Ph` `aibn cng deng
this.Text = "Microsoft .NET Framework";
// Phc hi layout logic cua form ngay khi
// tt ca cc diu kim d doc cu hnh.
this.ResumeLayout(false);
}
// im nhp cua ng dng (tao mt th hin form, chay vng lap
// thng dip chun trong tiu trnh hin hnh - vng lap chuyn
// cc tc dng tu ngi dung thnh cc s kin dn ng dng).
public static void Main() {
Application.Run(new WelcomeForm());
}
// Phng thc th l s kin
// (doc goi khi ngi dung nhp vo nt Enter).
private void button1_Click(object sender, System.EventArgs e) {
// Ghi ra Console.
System.Console.WriteLine("User entered: " + textBox1.Text);
// Hin th li cho trong MessageBox.
MessageBox.Show("Welcome to Microsoft .NET Framework, "
+ textBox1.Text, "Microsoft .NET Framework");
}
}
37
Chng 1: Ph` `aibn cng deng
0nh 1'1 Mt ng dung Windows orm dn gin
l ;<' )=ng lp WelcomeForm gtrong fil( @eD)omeForm.)8h thnh .t :ng )ng8 sO )ng
lnh\
csc /target:%inexe elcome"orm.cs
lDi sD /target:%inexe &o cho tr%nh &i>n )ich &iIt <' l :ng )ng )=aztr>nz@"nAow8. Uo
F8 tr%nh &i>n )ich s@ ;<' )=ng fil( th=c thi sao cho kh4ng cF cOa ss Con8oDe no $c t*o ra
khi &*n ch*' :ng )ng. HIu &*n sO )ng /target:exe khi ;<' )=ng .t :ng )ng @"nAow8
Form tha' cho /target:%inexe th% :ng )ng v3n l. vic tDt8 nhng s@ t*o ra .t cOa ss
Con8oDe khi ch*'. "!c )e iu n' kh4ng $c a chung trong .t :ng )ng hon chJnh8
cOa ss Con8oDe v3n hKu 2ch nIu &*n cNn ghi ra cc th4ng tin g rDi ho!c vng nh6p khi ang
pht trin v thO nghi. .t :ng )ng @"nAow8 Form. L*n cF th ghi ra Con8oDe &5ng
phMng th:c Write v WriteLine ca lp System.Console.
ng )ng @eD)omeForm.e2e trong h%nh Z.Z hin thi li cho ngi )eng cF t>n l $"nh
Phuong. Rhi>n &n n' ca :ng )ng $c ;<' )=ng &5ng Di sD /target:exe8 n>n cF cOa ss
Con8oDe hin thi kIt 9u ca )kng lnh Console.WriteLine trong phMng th:c th lB s=
kin button1_Click .
V@qJ v] hnAB OIQ ~AB hUAB 67/ L fI Q>VoAB QKA A>@GZ Q>o@ B@cA hX d>R@ QeX
LK@ QVWAB, JPZ >lA> D\ Y@CA sjQ A>@GZ XHO D\ L@GZ s@tO( N>VAB Oc] O{A Y\
Microsoft $is%al St%&io .NET Qn LIAB >^c >wZ >jQ JSJ >XeQ LIAB A\]( NjZ s>TAB
J^ JTAB JU A>V Microsoft $is%al St%&io .NET Q>l D@qJ v] hnAB OIQ ~AB hUAB L
>c L fI fm HPQ YZ, A>\O J>SA D\ hu f@A> Hc Yx@(
3'
3' T o v s d ng module T o v s d ng module
#eA JwA Q>nJ >@qA JSJ JTAB D@qJ fcZz
TAB >@qZ ZR Q>nJ Q>@ D\ fg hUAB FI A>E Jbc ~AB hUAB F`AB JSJ> FRX
LRO H`AB FI Q>nJ Q>@ Aed JSJ s@tZ aQ LVWJ fg hUAB J> s>@ A\X JwA
Q>@jQ(
38
Chng 1: Ph` `aibn cng deng
#@CA hMJ> JSJ s@tZ LVWJ D@jQ QHXAB C# Q>\A> OIQ heAB J^ Q>t fg hUAB Ye@
LVWJ QHXAB JSJ ABTA AB? (NET s>SJ(
Sg hUAB JSJ s@tZ LVWJ d>SQ QH@tA F`AB OIQ ABTA AB? s>SJ FCA QHXAB ~AB
hUAB C# Jbc FeA(
Sg hUAB LK@ fK /target:module iJbc QHlA> F@CA hMJ> C#k Lt v] hnAB O} ABZA
C# Jbc FeA Q>\A> OIQ OXhZY( Sg hUAB LK@ fK /addmodule Lt sjQ >Wd JSJ OXhZY
>@qA J^ D\X cffOFY] Jbc FeA(
"o)ul( l cc khDi cM &n t*o )=ng n>n cc ass(.&l' .NET. "o)ul( &ao gt. .t fil( Mn
ch:a\
"S ng4n ngK trung gian g&")ro8o?/ <n/ermeA"a/e LanguageE&*<Lh\ l$c t*o tQ .S
ngutn C# trong 9u tr%nh &i>n )ich.
|i>u )K liu gme/aAa/ah\ "4 t cc kiu n5. trong .o)ul(.
Pc ti ngu'>n gre8our)eh\ Ph~ng h*n icon v string ta&l(8 $c sO )ng &Ci cc kiu
trong .o)ul(.
ss(.&l' gt. .t ha' nhiu .o)ul( v .t .anif(st. whi chJ cF .t .o)ul(8 .o)ul( v
.anif(st thng $c ;<' )=ng thnh .t fil( cho thu6n tin. whi cF nhiu .o)ul(8 ass(.&l'
l .t nhF. lu6n lB ca nhiu fil( $c trin khai nh .t th thDng nht. 7rong trng h$p
n'8 .anif(st cF th n5. trong .t fil( ri>ng ha' chung vi .t trong cc .o)ul(.
uic ;<' )=ng .t ass(.&l' tQ nhiu .o)ul( g<' khF khvn cho vic 9un lB v trin khai
ass(.&l'T nhng trong .t sD trng h$p8 cch n' cF nhiu l$i 2ch8 &ao gt.\
L th=c thi s@ chJ n*p .t .o)ul( khi cc kiu inh nghqa trong .o)ul( n' $c '>u
cNu. Uo F8 khi cF .t t6p cc kiu . :ng )ng 2t khi )eng8 &*n cF th !t chGng
trong .t .o)ul( ri>ng . & th=c thi chJ n*p khi cNn. uic n' cF cc l$i 2ch sau\
- 7vng hiu 9u th=c thi8 !c &it khi :ng )ng $c n*p 9ua .*ng.
- pi. thiu nhu cNu sO )ng & nh.
wh nvng sO )ng nhiu ng4n ngK khc nhau viIt cc :ng )ng ch*' tr>n & th=c thi
ng4n ngK chung gCommon Language =un/"meECL=h l .t thI .*nh ca .NET
Framework. 7u' nhi>n8 tr%nh &i>n )ich C# kh4ng th &i>n )ich .S ngutn $c viIt
&5ng &")ro8o?/ V"8uaD $a8") .NET ha' CF$FL .NET trong ass(.&l' ca &*n. L*n phi
sO )ng tr%nh &i>n )ich ca ng4n ngK F &i>n )ich .S ngutn thnh &*<L th(o .t cu
trGc . tr%nh &i>n )ich C# cF th hiu $cEF l .o)ul(. 7Mng t=8 nIu .uDn l6p
tr%nh vi>n ca cc ng4n ngK khc sO )ng cc kiu $c pht trin &5ng C#8 &*n phi
;<' )=ng chGng thnh .t .o)ul(.
l &i>n )ich fil( ngutn Con8oDeQ/"D8.)8 thnh .t .o)ul(8 sO )ng lnh\
csc /target:module ConsoleUtils.cs
ynh n' s@ cho kIt 9u l .t fil( cF t>n l Con8oDeQ/"D8.ne/moAuDe. RhNn .C rng
ne/moAuDe l phNn .C rng .!c inh cho .o)ul(8 v t>n fil( treng vi t>n fil( ngutn C#.
39
Chng 1: Ph` `aibn cng deng
L*n c?ng cF th ;<' )=ng .t .o)ul( tQ nhiu fil( ngutn8 cho kIt 9u l .t fil( g.o)ul(h
ch:a &*<L v si>u )K liu cho cc kiu ch:a trong tt c fil( ngutn. u2 )8 lnh\
csc /target:module ConsoleUtils.cs indo%sUtils.cs
&i>n )ich hai fil( ngutn Con8oDeQ/"D8.)8 v @"nAow8Q/"D8.)8 thnh .t .o)ul( cF t>n l
Con8oDeQ/"D8.ne/moAuDe.
7>n ca .o)ul( $c !t th(o t>n fil( ngutn Nu ti>n trQ khi &*n chJ inh c th &5ng Di sD
/out. u2 )8 lnh\
csc /target:module /out:Utilities.netmodule
ConsoleUtils.cs indo%sUtils.cs
s@ cho kIt 9u l fil( Q/"D"/"e8.ne/moAuDe.
l ;<' )=ng .t ass(.&l' gt. nhiu .o)ul(8 sO )ng Di sD /addmodule. u2 )8 ;<'
)=ng fil( th=c thi &yF"r8/>KK.e2e tQ hai .o)ul(\ @"nAow8Q/"D8.ne/moAuDe v
Con8oDeQ/"D8.ne/moAuDe v hai fil( ngutn\ *our)eFne.)8 v *our)eTwo.)88 sO )ng lnh\
csc /out:M!"irst#pp.exe /target:exe
/addmodule:indo%sUtils.netmodule'ConsoleUtils.netmodule
$ource(ne.cs $ource)%o.cs
ynh n' s@ cho kIt 9u l .t ass(.&l' gt. cc fil( sau\
&yF"r8/>KK.e2e\ Ph:a .anif(st c?ng nh &*<L cho cc kiu $c khai &o trong hai
fil( ngutn *our)eFne.)8 v *our)eTwo.)8.
Con8oDeQ/"D8.ne/moAuDe v @"nAow8Q/"D8.ne/moAuDe\ pi <' l .t phNn ca
ass(.&l' nhng kh4ng tha' si sau khi &i>n )ich. gHIu &*n ch*' &yF"r8/>KK.e2e .
kh4ng cF cc fil( ne/moAuDe8 ngo*i l System.IO.FileNotFoundException s@ &i nX.h.
4' 4' T o v s d ng th vi n T o v s d ng th vi n
#eA JwA v] hnAB OIQ QNd JSJ J>~J AAB Q>\A> OIQ Q>V D@qA Lt A^ J^ Q>t LVWJ
Q>cO J>@jZ D\ QS@ fg hUAB F@ A>@GZ ~AB hUAB(
!t QeX Q>V D@qA, fg hUAB LK@ fK /target:librar! s>@ F@CA hMJ> cffOFY] Jbc FeA
F`AB QHlA> F@CA hMJ> C# icsc.e8ek( !t Q>cO J>@jZ Q>V D@qA, fg hUAB LK@ fK
/re*erence D\ J> LMA> QCA Jbc Q>V D@qA s>@ F@CA hMJ> ~AB hUAB(
"c Z.Z .inh h0a cch ;<' )=ng :ng )ng &yF"r8/>KK.e2e tQ hai fil( .S ngutn
Con8oDeQ/"D8.)8 v ;eDDo@orDA.)8. il( Con8oDeQ/"D8.)8 ch:a lp ConsoleUtils8 cung cp cc
phMng th:c Mn gin hFa s= tMng tc vi Con8oDe. Pc ch:c nvng n' ca lp ConsoleUtils
c?ng cF th hKu 2ch cho cc :ng )ng khc. l sO )ng l*i lp n'8 tha' v% gp c .S ngutn
ca nF vo .#i :ng )ng8 &*n cF th ;<' )=ng nF thnh .t th vin8 khiIn cc ch:c nvng
n' cF th tru' ;ut $c &Ci nhiu :ng )ng.
l ;<' )=ng fil( Con8oDeQ/"D8.)8 thnh .t th vin8 sO )ng lnh\
csc /target:librar! ConsoleUtils.cs
ynh n' sinh ra .t fil( th vin cF t>n l Con8oDeQ/"D8.ADD.
40
Chng 1: Ph` `aibn cng deng
l t*o .t th vin tQ nhiu fil( .S ngutn8 lit k> t>n cc fil( n' C cuDi )kng lnh. L*n cF
th sO )ng Di sD /out chJ inh t>n th vin8 nIu kh4ng8 t>n th vin $c !t th(o t>n
ca fil( .S ngutn Nu ti>n. u2 )8 t*o th vin &yF"r8/L"4rary.ADD tQ hai fil( .S ngutn
Con8oDeQ/"D8.)8 v @"nAow8Q/"D8.)88 sO )ng lnh\
csc /out:M!"irst+ibrar!.dll /target:librar!
ConsoleUtils.cs indo%sUtils.cs
7rc khi ph<n phDi th vin cho ngi khc sO )ng8 &*n n>n t*o t>n .*nh g8/rongInameh
kh4ng ai cF th chJnh sOa ass(.&l' ca &*n. uic !t t>n .*nh cho th vin ckn cho phXp
ngi khc ci !t nF vo 6Do4aD >88em4Dy Ca)he8 giGp vic ti sO )ng )r )ng hMn g;(.
.c Z.c v cch !t t>n .*nh cho th vin ca &*n v .c Z.Z_ v cch ci !t .t th vin
cF t>n .*nh vo 6Do4aD >88em4Dy Ca)heh. Hgoi ra8 &*n cF th nh )u th vin ca &*n vi
chK kB >u/hen/")oAe ngi )eng &iIt &*n l tc gi ca th vin g;(. .c Z.Z] v cch
nh )u th vin vi >u/hen/")oAeh.
l &i>n )ich .t ass(.&l' cF sO )ng cc kiu $c khai &o trong cc th vin khc8 &*n
phi &o cho tr%nh &i>n )ich &iIt cNn tha. chiIu In th vin no &5ng Di sD /re*erence. u2
)8 &i>n )ich fil( ;eDDo@orDA.)8 gtrong .c Z.Zh trong trng h$p lp ConsoleUtils n5.
trong th vin Con8oDeQ/"D8.ADD8 sO )ng lnh\
csc /re*erence:ConsoleUtils.dll Helloorld.cs
L*n cNn chG B &a i. sau\
HIu tha. chiIu nhiu hMn .t th vin8 &*n cNn ph<n cch t>n cc th vin &5ng )u
phx' ho!c ch. phx'8 nhng kh4ng sO )ng khong tr/ng. u2 )\
/re*erence:ConsoleUtils.dll'indo%sUtils.dll
HIu th vin kh4ng n5. ceng th .c vi fil( .S ngutn8 &*n cNn sO )ng Di sD /lib
chJ inh th .c ch:a th vin. u2 )\
/lib:c:,Common+ibraries'c:,-ev,).ird/art!+ibs
HIu th vin cNn tha. chiIu l .t ass(.&l' gt. nhiu fil(8 &*n cNn tha. chiIu fil(
cF ch:a .anif(st g;(. th4ng tin v ass(.&l' gt. nhiu fil( trong .c Z.^h.
5' 5' Truy xu t cc i s dng l nh Truy xu t cc i s dng l nh
#eA JwA QHZ] vZPQ JSJ LK@ fK LVWJ J> LMA> QHCA hyAB YqA> s>@ Q>nJ Q>@ ~AB hUAB(
Sg hUAB OIQ heAB Jbc d>V[AB Q>~J Main, QHXAB L^ A>NA LK@ fK hyAB YqA> hVE@
heAB OIQ ORAB J>Zx@( NBX\@ Hc, J^ Q>t QHZ] vZPQ LK@ fK hyAB YqA> Q FPQ J~ LZ
QHXAB O} ABZA Jbc FeA F`AB JSJ Q>\A> D@CA QA> Jbc YEd $!stem.0nvironment(
whai &o phMng th:c Main thuc .t trong cc )*ng sau tru' ;ut Di sD )kng lnh )i
)*ng .t .ng chu#i\
public static void Main(string[] args) {}
41
Chng 1: Ph` `aibn cng deng
public static int Main(string[] args) {}
whi ch*'8 Di sD args s@ ch:a .t chu#i cho .#i gi tri $c nh6p tr>n )kng lnh v n5. sau
t>n :ng )ng. RhMng th:c Main trong v2 ) )i <' s@ )u't 9ua .#i Di sD )kng lnh $c
tru'n cho nF v hin thi chGng ra cOa ss Con8oDe\
public class CmdLineArgExample {
public static void Main(string[] args) {

// Duyt qua cc di s dng lnh.
foreach (string s in args) {
System.Console.WriteLine(s);
}
}
}
whi th=c thi CmAL"ne>rgE2amKDe vi lnh\
Cmd+ine#rg0xample 1one ,1t%o,1 t.ree1 *our 2*ive six2
:ng )ng s@ t*o ra kIt ;ut nh sau\
one "two" three
four
'five
six'
PhG B r5ng8 khc vi C v CSS8 t>n ca :ng )ng kh4ng n5. trong .ng ch:a cc Di sD.
7t c kB t= n5. trong )u nh' kXp g3h $c ;(. nh .t Di sD8 nhng )u nh' Mn g2h
chJ $c ;(. nh kB t= &%nh thng. HIu .uDn sO )ng )u nh' kXp trong Di sD8 !t kB t=
v*ch ng$c g,h trc nF. 7t c cc khong tr/ng u &i &V 9ua trQ khi chGng n5. trong )u
nh' kXp.
HIu .uDn tru' ;ut Di sD )kng lnh C nMi khc gkh4ng phi trong phMng th:c Mainh8 &*n
cNn ;O lB cc Di sD )kng lnh trong phMng th:c Main v lu trK chGng sO )ng sau n'.
Hgoi ra8 &*n cF th sO )ng lp System.Environment8 lp n' cung cp hai thnh vi>n tqnh
tr v th4ng tin )kng lnh\ CommandLine v GetCommandLineArgs.
7huc t2nh CommandLine tr v .t chu#i ch:a ton & )kng lnh. 7e' thuc vo h
iu hnh :ng )ng ang ch*' . th4ng tin ng )3n cF :ng trc t>n :ng )ng ha'
kh4ng. Pc h iu hnh @"nAow8 NT G.08 @"nAow8 20008 v @"nAow8 :P kh4ng ch:a
th4ng tin ng )3n8 trong khi @"nAow8 TU v @"nAow8 &E th% l*i ch:a.
RhMng th:c GetCommandLineArgs tr v .t .ng chu#i ch:a cc Di sD )kng lnh.
"ng n' cF th $c ;O lB giDng nh .ng $c tru'n cho phMng th:c Main8 tu'
nhi>n phNn tO Nu ti>n ca .ng n' l t>n :ng )ng.
42
Chng 1: Ph` `aibn cng deng
6'
6' Ch n !in d ch m t "h i m# vo $ile th c thi Ch n !in d ch m t "h i m# vo $ile th c thi
#eA JwA J>A OIQ fK d>wA O} ABZA fm LVWJ F@CA hMJ> QHXAB @Y Q>nJ Q>@(
Sg hUAB JSJ J> Q>M Q@GA vg Y 4i*, 4eli*, 4else, D\ 4endi* Lt J> LMA> s>K@ O}
A\X fm LVWJ F@CA hMJ> QHXAB @Y Q>nJ Q>@( Sg hUAB L_J QaA> $!stem.-iagnostics.
Conditional#ttribute Lt J> LMA> JSJ d>V[AB Q>~J O\ fm J> LVWJ B@ Qr] Q>X
L@GZ s@qA( !@GZ s>@tA D@qJ J>A JSJ s>K@ O} F`AB JSJ J> Q>M 4de*ine D\ 4unde*
QHXAB O} ABZA, >X_J fg hUAB LK@ fK /de*ine s>@ J>e] QHlA> F@CA hMJ> C#(
HIu .uDn :ng )ng ca &*n ho*t ng khc nhau te' vo cc 'Iu tD nh nn ho!c .4i
trng . :ng )ng ch*'8 &*n cF th ki. tra iu kin khi ch*' &>n trong .S ngutn v k2ch
ho*t cc ho*t ng cNn thiIt. 7u' nhi>n8 cch n' l. .S ngutn ln l>n v nh hCng In
hiu nvng. "t cch tiIp c6n khc l ;<' )=ng nhiu phi>n &n ca :ng )ng h# tr$ cc
nn v .4i trng khc nhau. "!c )e cch n' kh/c phc $c cc vn v ln ca .S
ngutn v vic gi. hiu nvng8 nhng nF kh4ng phi l gii php tDt khi phi giK .S ngutn
khc nhau cho .#i phi>n &n. u% v6'8 C# cung cp cc t2nh nvng cho phXp &*n ;<' )=ng cc
phi>n &n te' &iIn ca :ng )ng chJ tQ .t .S ngutn.
Pc chJ thi tin ;O lB cho phXp &*n chJ inh cc khDi .S s@ $c &i>n )ich vo fil( th=c thi
chJ nIu cc kB hiu c th $c inh nghqa lGc &i>n )ich. Pc kB hiu ho*t ng nh cc
+c4ng t/c- on,off8 chGng kh4ng cF gi tri . chJ l +S $c inh nghqa- ha' +cha $c inh
nghqa-. l inh nghqa .t kB hiu8 &*n cF th sO )ng chJ thi #define trong .S ngutn ho!c
sO )ng Di sD tr%nh &i>n )ich /de*ine. wB hiu $c inh nghqa &5ng #define cF tc )ng
In cuDi fil( inh nghqa nF. wB hiu $c inh nghqa &5ng /de*ine cF tc )ng trong tt c
cc fil( ang $c &i>n )ich. l &V .t kB hiu S inh nghqa &5ng /de*ine8 C# cung cp chJ
thi #undef8 hKu 2ch khi &*n .uDn &o . .t kB hiu kh4ng $c inh nghqa trong cc fil(
ngutn c th. Pc chJ thi #define v #undef phi n5. nga' Nu fil( .S ngutn8 tr>n c cc chJ
thi using. Pc kB hiu cF ph<n &it chK hoazthng.
7rong v2 ) sau8 &iIn platformName $c gn gi tri te' vo cc kB hiu winXP8 win20008
winNT8 ho!c win98 cF $c inh nghqa ha' kh4ng. RhNn Nu ca .S ngutn inh nghqa cc kB
hiu win2000 v released gkh4ng $c sO )ng trong v2 ) n'h8 v &V kB hiu win98 trong
trng h$p nF $c inh nghqa tr>n )kng lnh tr%nh &i>n )ich.
#define win2000
#define release
#undef win98
using System;
public class ConditionalExample {
public static void Main() {
43
Chng 1: Ph` `aibn cng deng

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

#if winXP // Bin dch cho Windows XP
platformName = "Microsoft Windows XP";
#elif win2000 // Bin dch cho Windows 2000
platformName = "Microsoft Windows 2000";
#elif winNT // Bin dch cho Windows NT
platformName = "Microsoft Windows NT";
#elif win98 // Bin dch cho Windows 98
platformName = "Microsoft Windows 98";
#else // Nn khng doc nhn bit
platformName = "Unknown";
#endif

Console.WriteLine(platformName);
}
}
l ;<' )=ng lp ConditionalExample gch:a trong fil( ConA"/"onaDE2amKDe.)8h v inh nghqa
cc kB hiu winXP v DEBUG gkh4ng $c sO )ng trong v2 ) n'h8 sO )ng lnh\
csc /de*ine:%in5/;-06U7 Conditional0xample.cs
Pu trGc #if .. #endif nh gi cc .nh #if v #elif chJ In khi t%. th' .t .nh
Gng8 nghqa l nIu cF nhiu kB hiu $c inh nghqa gch~ng h*n8 winXP v win2000h8 th: t=
cc .nh l 9uan tr0ng. 7r%nh &i>n )ich chJ &i>n )ich o*n .S n5. trong .nh Gng.
HIu kh4ng cF .nh no Gng8 tr%nh &i>n )ich s@ &i>n )ich o*n .S n5. trong .nh
#else.
L*n c?ng cF th sO )ng cc ton tO lu6n lB &i>n )ich cF iu kin )=a tr>n nhiu kB hiu.
Lng Z.Z tF. t/t cc ton tO $c h# tr$.
Bfng 1'1 Cc ton t lun l doc h tro bi chi thj if .. endif
Ton `g 6h de ?i `f
== #if winXP == true
L5ng. lGng nIu winXP $c inh nghqa. 7Mng
Mng vi #if winXP.
!= #if winXP != true
wh4ng &5ng. lGng nIu winXP kh4ng $c inh
nghqa. 7Mng Mng vi #if !winXP.
&& #if winXP && release
RhXp >NE lu6n lB. lGng nIu winXP v release $c
inh nghqa.
44
Chng 1: Ph` `aibn cng deng
|| #if winXP || release
RhXp F= lu6n lB. lGng nIu winXP ho!c release
$c inh nghqa.
()
#if (winXP ||
win2000) && release
Uu ngo!c Mn cho phXp nhF. cc &iu th:c. lGng
nIu winXP ho!c win2000 $c inh nghqa8 tng thi
release c?ng $c inh nghqa.
#eA s>TAB ACA YeO hUAB JSJ J> Q>M F@CA hMJ> J^ L@GZ s@qA D\ s>TAB ACA D@jQ JSJ
F@tZ Q>~J L@GZ s@qA ZS d>~J Qed AjZ s>TAB, O} ABZA Jbc FeA fm QH ACA hu
A>wO YpA D\ s>^ ZRA YL_J F@qQ s>@ hn SA Jbc FeA J\AB YEA(
"t cch khc kh4ng linh ho*t nhng ha' hMn chJ thi tin ;O lB #if l sO )ng !c t2nh
System.Diagnostics.ConditionalAttribute. HIu &*n p )ng ConditionalAttribute cho
.t phMng th:c8 tr%nh &i>n )ich s@ &V 9ua .0i li g0i phMng th:c F nIu kB hiu )o
ConditionalAttribute chJ inh kh4ng $c inh nghqa t*i i. g0i. 7rong o*n .S sau8
ConditionalAttribute ;c inh r5ng phMng th:c DumpState chJ $c &i>n )ich vo fil( th=c
thi nIu kB hiu DEBUG $c inh nghqa khi &i>n )ich.
[System.Diagnostics.Conditional("DEBUG")]
public static void DumpState() {//...}
uic sO )ng ConditionalAttribute giGp !t cc iu kin g0i .t phMng th:c t*i nMi khai
&o nF . kh4ng cNn cc chJ thi #if. 7u' nhi>n8 &Ci v% tr%nh &i>n )ich th6t s= &V 9ua cc li
g0i phMng th:c8 n>n .S ca &*n kh4ng th ph thuc vo cc gi tri tr v tQ phMng th:c.
liu n' cF nghqa l &*n cF th p )ng ConditionalAttribute chJ vi cc phMng th:c tr
v void.
L*n cF th p )ng nhiu th hin ConditionalAttribute cho .t phMng th:c8 tMng Mng
vi phXp F= lu6n lB. Pc li g0i phMng th:c DumpState )i <' chJ $c &i>n )ich nIu
DEBUG ho!c TEST $c inh nghqa.
[System.Diagnostics.Conditional("DEBUG")]
[System.Diagnostics.Conditional("TEST")]
public static void DumpState() {//...}
uic th=c hin phXp >NE lu6n lB cNn sO )ng phMng th:c iu kin trung gian8 khiIn cho
.S trC n>n 9u ph:c t*p8 khF hiu v khF &o tr%. u2 ) )i <' cNn phMng th:c trung gian
DumpState2 inh nghqa c hai kB hiu DEBUG v TEST.
[System.Diagnostics.Conditional("DEBUG")]
public static void DumpState() {
DumpState2();
}
[System.Diagnostics.Conditional("TEST")]
public static void DumpState2() {//...}
45
Chng 1: Ph` `aibn cng deng
CSJ YEd -ebug D\ )race Q>ZIJ s>TAB B@cA QCA $!stem.-iagnostics fg hUAB L_J
QaA> Conditional#ttribute QHXAB A>@GZ d>V[AB Q>~J Jbc J>AB( CSJ d>V[AB
Q>~J Jbc YEd -ebug Qr] Q>ZIJ D\X D@qJ LMA> AB>c s >@qZ -06U7, JyA JSJ d>V[AB
Q>~J Jbc YEd )race Qr] Q>ZIJ D\X D@qJ LMA> AB>c s >@qZ )&#C0(
7' 7' Truy xu t m t %h n t ch ng tr&nh Truy xu t m t %h n t ch ng tr&nh
c' tn tr(ng v i m t t "h'a c' tn tr(ng v i m t t "h'a
#eA JwA QHZ] vZPQ OIQ Q>\A> D@CA Jbc OIQ s@tZ, A>VAB QCA s@tZ >X_J QCA Q>\A>
D@CA A\] QHrAB DE@ OIQ Q s>^c Jbc C#(
!_Q s >@qZ 8 D\X QHVEJ JSJ QCA QHrAB DE@ Q s>^c(
.NET Framework cho phXp &*n sO )ng cc thnh phNn phNn .. g8o?/ware )omKonen/h
$c pht trin &5ng cc ng4n ngK .NET khc &>n trong :ng )ng C# ca &*n. "#i ng4n ngK
u cF .t t6p tQ khFa gho!c tQ )nh ri>ngh cho nF v cF cc h*n chI khc nhau Di vi cc
t>n . l6p tr%nh vi>n cF th gn cho cc phNn tO chMng tr%nh nh kiu8 thnh vi>n8 v &iIn.
Uo F8 cF kh nvng .t thnh phNn $c pht trin trong .t ng4n ngK khc t%nh c sO )ng
.t tQ khFa ca C# !t t>n cho .t phNn tO no F. wB hiu @ cho phXp &*n sO )ng .t
tQ khFa ca C# l. inh )anh v kh/c phc vic ng t>n. lo*n .S sau t*o .t Di t$ng
kiu operator v thiIt l6p thuc t2nh volatile ca nF l true gc operator v volatile u l
tQ khFa ca C#h\
// Tao di tong operator.
@operator Operator1 = new @operator();

// Thit lp thuc tnh volatile cua operator.
Operator1.@volatile = true;
8' 8' T o v )u n l* c % "h'a tn m nh T o v )u n l* c % "h'a tn m nh
#eA JwA QeX OIQ J_d s>^c JTAB s>c@ D\ s>^c H@CAB ip%9lic ke: D\ pri"ate ke:k Lt
BSA QCA OeA> J>X cffOFY](
Sg hUAB JTAB JU Strong Name isn.e8ek Lt QeX J_d s>^c D\ YVZ QH? J>AB QHXAB
OIQ @Y >X_J QHXAB OIQ s>X J>~c s>^c Cr:ptographic Ser"ice ,ro"i&er(
Cr:ptographic Ser"ice ,ro"i&er iCS,k Y\ OIQ d>wA Qg Jbc *in)' Cr:pto;,/, JZAB
JPd JSJ hMJ> DU A>V ONQ >^c, B@R@ ONQ >^c D\ QeX J>? s fK( CS, JyA JZAB JPd
JSJ Q@qA aJ> J>X s>X J>~c s>^c ike: containerk A>V fg hUAB B@R@ Q>ZNQ ONQ >^c
OeA> D\ JSJ F@qA d>Sd FRX ONQ Jbc >q L@GZ >\A> Lt FRX Dq AI@ hZAB Jbc s>X
J>~c s>^c( CS, D\ Cr:pto;,/ s>TAB LVWJ LG JNd Lw] Lb QHXAB Z]tA fSJ> A\],
FeA >}] Q>cO s>RX Q>CO QHXAB Q\@ Y@qZ S!(
l t*o .t c!p khFa .i v lu trK chGng trong fil( cF t>n l &y'ey.8nk8 th=c thi lnh sn 9:
M!;e!.sn: gphNn .C rng .8nk thng $c sO )ng cho cc fil( ch:a khFa t>n .*nhh. il(
46
Chng 1: Ph` `aibn cng deng
$c t*o ra ch:a c khFa c4ng khai v khFa ri>ng. L*n cF th sO )ng lnh sn 9tp M!;e!.sn:
;(. khFa c4ng khai8 lnh n' cho kIt ;ut nh sau\
Microsoft (R) .NET Framework Strong Name Utility Version 1.1.4322.53
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
Public key is
0020000002400005253413200040000010001008bb302ef9180bf1ace00d50dd649821f24ed58
fdccf1bc401308659c12650204bc4010fdd1905df1c2292349d9c2de33e49bd991a0a5bc9b69e
5fd95bafad658a5b8236c5bd9a43be022a20a52c2bd8145448332d5f85e9ca641c26a4036165f2f35
3942b643b10db46c82d6dbbc210d5ac5aca84dacb52cc165459c62aa34988...
Public key token is f241505b81b5ddc
7ok(n ca khFa c4ng khai l b &'t( cuDi ca .S &v. $c t2nh ra tQ khFa c4ng khai. u% khFa
c4ng khai 9u )i n>n .NET sO )ng tok(n cho .c 2ch hin thi8 v l .t cM chI ng/n g0n
cho cc ass(.&l' khc tha. chiIu khFa c4ng khai gchMng Z_ s@ tho lu6n tsng 9ut v .S
&v.h.
Hh t>n g0i ca nF8 khFa c4ng khai gho!c tok(n ca khFa c4ng khaih kh4ng cNn $c giK &2
.6t. whi &*n t*o t>n .*nh cho ass(.&l' g$c tho lu6n trong .c Z.ch8 tr%nh &i>n )ich s@ sO
)ng khFa ri>ng t*o .t chK kB sD g.t .S &v. Sz$cz.6tzhFah ca ass(.&l' .anif(st.
7r%nh &i>n )ich nhGng chK kB sD v khFa c4ng khai vo ass(.&l' ngi )eng cF th ki.
tra chK kB sD.
uic giK &2 .6t khFa ri>ng l cNn thiIt v% ngi tru' ;ut vo khFa ri>ng ca &*n cF th tha'
si ass(.&l' v t*o .t t>n .*nh .iEkhiIn cho khch hng ca &*n kh4ng &iIt .S ngutn
S &i sOa si. wh4ng cF cM chI no lo*i &V cc khFa t>n .*nh S &i tsn h*i. HIu khFa
ri>ng &i tsn h*i8 &*n phi t*o khFa .i v ph<n phDi phi>n &n .i ca ass(.&l' g$c !t
t>n .*nh &5ng cc khFa .ih. L*n c?ng cNn th4ng &o cho khch hng &iIt l khFa S &i tsn
h*i v h0 n>n sO )ng phi>n &n noEtrong trng h$p n'8 &*n &i .t c tin &*c v u' t2n.
PF nhiu cch &o v khFa ri>ng ca &*nT sO )ng cch no l te' vo cc 'Iu tD nh\
Pu trGc v tN. c ca ts ch:c.
Yu tr%nh pht trin v ph<n phDi :ng )ng.
RhNn .. v phNn c:ng hin cF.
m>u cNu ca khch hng.
T>TAB Q>VoAB, OIQ A>^O A> JSJ JS A>A LSAB Q@A JN] iLVWJ B@ Y\ signing
a%thorit:k fm J^ QHSJ> A>@qO LRO FRX cA QX\A J>X JSJ s>^c QCA OeA> Jbc JTAB Q]
D\ s O@ cffOFY] QHVEJ s>@ J>AB LVWJ d>A d>K@( 3>R AAB QHl >X}A s
cffOFY] ifm LVWJ Q>RX YZNA OUJ (k QeX L@GZ s@qA Q>ZNA YW@ J>X D@qJ ~AB
hUAB OT >lA> A\] D\ QHSA> LVWJ D@qJ FeA d>R@ d>A d>K@ s>^c H@CAB J>X O@
Q>\A> D@CA Jbc A>^O d>SQ QH@tA(
47
Chng 1: Ph` `aibn cng deng
P4ng c */rong Name ckn cung cp t2nh nvng sO )ng kho ch:a khFa C*P Mn gin hFa
vic &o .6t cc khFa t>n .*nh. "t khi S t*o .t c!p khFa trong .t fil(8 &*n cF th ci
!t cc khFa n' vo kho ch:a khFa C*P v ;Fa fil( i. u2 )8 lu trK c!p khFa n5. trong
fil( &y'ey.8nk vo .t kho ch:a khFa C*P cF t>n l */rongName'ey88 sO )ng lnh sn <i
M!;e!s.sn: $trong=ame;e!s g.c Z.c s@ gii th2ch cch sO )ng cc khFa t>n .*nh $c lu
trK trong .t kho ch:a khFa C*Ph.
"t kh2a c*nh 9uan tr0ng ca kho ch:a khFa C*P l cF cc kho ch:a khFa )=azth(o ngiz
)eng v cF cc kho ch:a khFa )=azth(oz.'. PM chI &o .6t ca @"nAow8 &o . ngi
)eng chJ tru' ;ut $c kho ch:a khFa )=azth(ozngiz)eng ca ch2nh h0. 7u' nhi>n8 &t k
ngi )eng no ca .' u cF th tru' ;ut kho ch:a khFa )=azth(oz.'.
7h(o .!c inh8 c4ng c */rong Name sO )ng kho ch:a khFa )=azth(oz.'8 nghqa l .0i
ngi vng nh6p vo .' v &iIt t>n ca kho ch:a khFa u cF th kB .t ass(.&l' &5ng cc
khFa t>n .*nh ca &*n. l c4ng c */rong Name sO )ng kho ch:a khFa )=azth(ozngiz
)eng8 sO )ng lnh sn 9m nT khi .uDn trC l*i kho ch:a khFa )=azth(oz.'8 sO )ng lnh sn 9
m !. ynh sn 9m s@ cho &iIt c4ng c */rong Name hin $c cu h%nh l sO )ng kho ch:a
khFa )=azth(ozngiz)eng ha' )=azth(oz.'.
l ;Fa cc khFa t>n .*nh tQ kho */rongName'ey8 gc?ng nh ;Fa c kho n'h8 sO )ng lnh
sn 9d $trong=ame;e!s.
9' 9' T o tn m nh cho assem!ly T o tn m nh cho assem!ly
#eA JwA QeX QCA OeA> J>X OIQ cffOFY] Lt A^z
C^ OIQ LMA> hcA> hZ] A>PQ, J>X d>d BSA JSJ Z]GA JU Q>t D\X cffOFY]
s>@ JPZ >lA> Co&e ;ccess Sec%rit: ,olic: iJ>aA> fSJ> FRX ONQ J>X D@qJ
QHZ] vZPQ O} YqA>k(
3>TAB Q>t FM fgc L@ D\ fcZ L^ OeX A>NA Y\ ABZ]CA FRA(
Hx QHW D@qJ LSA> fK d>@CA FRA D\ JSJ J>aA> fSJ> DG d>@CA FRA i"ersion
polic:k(
C^ Q>t LVWJ J>@c f QHXAB A>@GZ ~AB hUAB, D\ LVWJ J\@ L_Q QHXAB 6lo9al
;ssem9l: Cache i6;Ck(
Sg hUAB JSJ L_J QaA> iattri9%tek O~J6cffOFY] Lt J> LMA> A[@ J>~c J_d s>^c QCA
OeA>, D\ J^ Q>t J> LMA> Q>CO fK d>@CA FRA D\ Q>TAB Q@A FRA LMc J>X cffOFY](
THlA> F@CA hMJ> fm QeX QCA OeA> J>X cffOFY] QHXAB ZS QHlA> v] hnAB(
l t*o t>n .*nh cho .t ass(.&l' &5ng tr%nh &i>n )ich C#8 &*n cNn cc 'Iu tD sau\
"t c!p khFa t>n .*nh n5. trong .t fil( ho!c .t kho ch:a khFa C*P g;(. .c Z.b
v cch t*o c!p khFa t>n .*nhh.
|O )ng cc !c t2nh .:czass(.&l' chJ inh nMi tr%nh &i>n )ich cF th t%. th' c!p
khFa t>n .*nh F.
- HIu c!p khFa n5. trong .t fil(8 p )ng !c t2nh System.Reflection.
AssemblyKeyFileAttribute cho ass(.&l' v chJ inh t>n fil( ch:a cc khFa.
48
Chng 1: Ph` `aibn cng deng
- HIu c!p khFa n5. trong .t kho ch:a khFa C*P8 p )ng !c t2nh
System.Reflection.AssemblyKeyNameAttribute cho ass(.&l' v chJ inh t>n ca
kho ch:a khFa.
Hgoi ra8 &*n cF th te' ch0n\
p )ng !c t2nh System.Reflection.AssemblyCultureAttribute cho ass(.&l' chJ
inh th4ng tin &n ia . ass(.&l' h# tr$ gL*n kh4ng th chJ inh &n ia cho cc
ass(.&l' th=c thi v% ass(.&l' th=c thi chJ h# tr$ &n ia trung l6ph.
p )ng !c t2nh System.Reflection.AssemblyVersionAttribute cho ass(.&l' chJ
inh phi>n &n ca ass(.&l'.
lo*n .S )i <' gtrong fil( ;eDDo@orDA.)8h .inh h0a cch sO )ng cc !c t2nh gphNn in
6.h chJ inh khFa8 &n ia8 v phi>n &n cho ass(.&l'\
using System;
using System.Reflection;
[assembl!:#ssembl!;e!=ame(1M!;e!s1)]
[assembl!:#ssembl!Culture(11)]
[assembl!:#ssembl!>ersion(1?.@.@.@1)]
public class HelloWorld {
public static void Main() {
Console.WriteLine("Hello, world");
}
}
l t*o .t ass(.&l' t>n .*nh tQ o*n .S tr>n8 t*o cc khFa t>n .*nh v lu trK chGng trong
fil( &y'eyF"De &5ng lnh sn <: M!;e!"ile.sn:. |au F8 sO )ng lnh sn <i M!;e!"ile.sn:
M!;e!s ci !t cc khFa vo .t kho ch:a khFa C*P cF t>n l &y'ey8. PuDi ceng8 sO )ng
lnh csc Helloorld.cs &i>n )ich fil( ;eDDo@orDA.)8 thnh .t ass(.&l' t>n .*nh.
#eA JAB J^ Q>t fg hUAB JTAB JU ;ssem9l: .inker ial.e8ek Lt QeX cffOFY] QCA
OeA>, JSJ> A\] J>X d>d J> LMA> JSJ Q>TAB Q@A QCA OeA> QHCA hyAB YqA> Q>c] Dl
fg hUAB JSJ L_J QaA> QHXAB O} ABZA( CSJ> A\] >?Z aJ> s>@ FeA s>TAB OZKA
A>AB JSJ L_J QaA> QCA OeA> D\X @Y ABZA D\ s>@ FeA fg hUAB sMJ> FRA Lt v]
hnAB A>?AB J] O} ABZA L fI( %O Q>CO Q>TAB Q@A DG ;ssem9l: .inker QHXAB
Q\@ Y@qZ (NET Framework S!(
49
Chng 1: Ph` `aibn cng deng
10'
10' +c minh m t assem!ly tn m nh "h,ng ! s a i +c minh m t assem!ly tn m nh "h,ng ! s a i
#eA JwA vSJ O@A> H`AB OIQ cffOFY] QCA OeA> J>Vc >G FM fgc L@ fcZ s>@ A^
LVWJ F@CA hMJ>(
Sg hUAB JTAB JU Strong Name isn.e8ek Lt vSJ O@A> QCA OeA> Jbc cffOFY](
"#i khi n*p .t ass(.&l' t>n .*nh8 & th=c thi .NET l' .S &v. Sz$cz.6tzhFa g$c
nhGng trong ass(.&l'h v gii .6t hFa vi khFa c4ng khai gc?ng $c nhGng trong
ass(.&l'h. |au F8 & th=c thi t2nh .S &v. ca ass(.&l' .anif(st v so snh nF vi .S &v.
vQaz$czgiiz.6tzhFa. Yu tr%nh ;c .inh n' s@ nh6n &iIt ass(.&l' cF &i tha' si sau khi
&i>n )ich ha' kh4ng.
HIu .t 9u tr%nh ;c .inh t>n .*nh tht &*i vi .t ass(.&l' th=c thi8 & th=c thi s@ hin
thi hp tho*i nh h%nh Z.]. HIu cD n*p .t ass(.&l' S tht &*i trong 9u tr%nh ;c .inh8 &
th=c thi s@ nX. ngo*i l System.IO.FileLoadException vi th4ng ip +*/rong name
BaD"Aa/"on ?a"DeA-.
0nh 1'2 Li khi c thuc thi mt assembly tn manh d bj sa di
Hgoi vic t*o v 9un lB cc khFa t>n .*nh gS $c tho lu6n trong .c Z.bh8 c4ng c
*/rong Name ckn cho phXp ;c .inh cc ass(.&l' t>n .*nh. l ;c .inh ass(.&l' t>n .*nh
;eDDo@orDA.e2e kh4ng &i sOa si8 sO )ng lnh sn <v* Helloorld.exe. lDi sD <v '>u cNu
c4ng c */rong Name ;c .inh t>n .*nh ca .t ass(.&l' ;c inh8 Di sD <* &uc th=c hin
vic ;c .inh t>n .*nh nga' c nF S &i v4 hiu trc F cho .t ass(.&l' no F. gL*n cF
th sO )ng Di sD <>r v4 hiu vic ;c .inh t>n .*nh Di vi .t ass(.&l'8 v2 ) sn <>r
Helloorld.exeT .c Z.ZZ s@ tr%nh &' lB )o t*i sao cNn v4 hiu vic ;c .inh t>n .*nhh.
HIu ass(.&l' n' $c ;c .inh l kh4ng si8 &*n s@ th' kIt ;ut nh sau\
Microsoft (R) .NET Framework Strong Name Utility Version 1.1.4322.53
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
Assembly 'HelloWorld.exe' is valid
7u' nhi>n8 nIu ass(.&l' n' S &i sOa si8 &*n s@ th' kIt ;ut nh sau\
Microsoft (R) .NET Framework Strong Name Utility Version 1.1.4322.53
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
Failed to verify assembly -- Unable to format error message 8013141A
50
Chng 1: Ph` `aibn cng deng
11'
11' -o#n vi c "* assem!ly -o#n vi c "* assem!ly
#eA JwA QeX OIQ cffOFY] QCA OeA>, A>VAB s>TAB OZKA O@ Q>\A> D@CA QHXAB
A>^O d>SQ QH@tA QHZ] vZPQ s>^c H@CAB Jbc J_d s>^c QCA OeA>(
THaJ> vZPQ D\ d>A d>K@ s>^c JTAB s>c@ Jbc J_d s>^c QCA OeA>( L\O Q>X
>VEAB hpA QHXAB OUJ ( Lt QeX QCA OeA> J>X cffOFY]( d hUAB L_J QaA>
$!stem.&e*lection.#ssembl!-ela!$ign#ttribute J>X cffOFY] Lt J> LMA> A^ Y\
cffOFY] fm LVWJ s fcZ( Sg hUAB LK@ fK <>r Jbc JTAB JU Strong Name isn.e8ek
Lt DT >@qZ D@qJ vSJ O@A> QCA OeA> J>X cffOFY] A\](
Pc ass(.&l' tha. chiIu In ass(.&l' t>n .*nh s@ ch:a tok(n ca ass(.&l' $c tha.
chiIu8 nghqa l ass(.&l' $c tha. chiIu phi $c t*o t>n .*nh trc khi $c tha. chiIu.
7rong .t .4i trng pht trin . ass(.&l' thng ;u'>n $c ;<' )=ng l*i8 .#i ngi
pht trin v ki. thO u cNn cF 9u'n tru' ;ut c!p khFa t>n .*nh ca &*nE<' l .t
ngu' cM &o .6t ch 'Iu.
7ha' v% ph<n phDi khFa ri>ng cho .0i thnh vi>n ca nhF. pht trin8 .NET Framework cung
cp cM chI hoSn vic kB .t ass(.&l' g$c g0i l AeDay 8"gn"ngh8 th(o F &*n cF th t*o t>n
.*nh kh4ng hon chJnh cho ass(.&l' gt*. g0i l t>n .*nh &n phNnh. 7>n .*nh &n phNn
n' chJ ch:a khFa c4ng khai v tok(n ca khFa c4ng khai gcNn thiIt tha. chiIu ass(.&l'h8
nhng chQa ch# cho chK kB s@ $c t*o ra tQ khFa ri>ng sau n'.
whi 9u tr%nh pht trin hon tt8 8"gn"ng au/hor"/y gngi chiu trch nhi. v vic &o .6t v
vic sO )ng c!p khFa t>n .*nhh s@ kB l*i ass(.&l' S &i hoSn trc F hon thnh t>n
.*nh cho nF. PhK kB $c t2nh ton )=a tr>n khFa ri>ng v $c nhGng vo ass(.&l'8 v gi
<' &*n S cF th ph<n phDi ass(.&l'.
whi hoSn vic kB .t ass(.&l'8 &*n chJ cNn tru' ;ut khFa c4ng khai ca c!p khFa t>n .*nh.
wh4ng cF ngu' cM &o .6t no tQ vic ph<n phDi khFa c4ng khai8 v 8"gn"ng au/hor"/y phi
ph<n phDi khFa c4ng khai In .0i thnh vi>n ca nhF. pht trin. l tr2ch ;ut khFa c4ng
khai tQ fil( &y'ey8.8nk v ghi nF vo fil( &yPu4D")'ey.8nk8 sO )ng lnh sn <p M!;e!s.sn:
M!/ublic;e!.sn:. HIu &*n lu trK c!p khFa t>n .*nh trong .t kho ch:a khFa C*P cF t>n l
&y'ey88 sO )ng lnh sn <pc M!;e!s M!/ublic;e!.sn: tr2ch ;ut khFa c4ng khai ra rti
lu trK nF vo fil( &yPu4D")'ey.8nk.
u2 ) )i <' p )ng cc !c t2nh S $c tho lu6n trong .c Z.c khai &o phi>n &n8
&n ia8 v nMi ch:a khFa c4ng khai. ltng thi p )ng !c t2nh AssemblyDelaySign(true)
cho ass(.&l' &o cho tr%nh &i>n )ich &iIt &*n .uDn tr% hoSn vic kB ass(.&l'.
using System;
using System.Reflection;
[assembl!:#ssembl!;e!"ile(1M!/ublic;e!.sn:1)]
[assembl!:#ssembl!Culture(11)]
[assembl!:#ssembl!>ersion(1?.@.@.@1)]
51
Chng 1: Ph` `aibn cng deng
[assembl!:#ssembl!-ela!$ign(true)]
public class HelloWorld {
public static void Main() {

Console.WriteLine("Hello, world");
}
}
whi cD n*p .t ass(.&l' &i hoSn kB8 & th=c thi s@ nh6n ra ass(.&l' n' cF t>n .*nh v cD
;c .inh ass(.&l' gnh $c tho lu6n trong .c Z.Zdh. Hhng v% kh4ng cF chK kB sD n>n
&*n phi v4 hiu ch:c nvng ;c .inh n' &5ng lnh sn <>r Helloorld.exe.
whi 9u tr%nh pht trin hon tt8 &*n cNn kB l*i ass(.&l' hon thnh t>n .*nh cho
ass(.&l'. P4ng c */rong Name cho phXp th=c hin iu n' . kh4ng cNn tha' si .S
ngutn ho!c &i>n )ich l*i ass(.&l'8 tu' nhi>n8 &*n phi cF 9u'n tru' ;ut khFa ri>ng ca c!p
khFa t>n .*nh. l kB l*i ass(.&l' cF t>n l ;eDDo@orDA.e2e vi c!p khFa n5. trong fil(
&y'ey8.8nk8 sO )ng lnh sn <& Helloorld.exe M!;e!s.sn:. HIu c!p khFa $c lu trK
trong .t kho ch:a khFa C*P cF t>n l &y'ey88 sO )ng lnh sn <&c Helloorld.exe
M!;e!s.
|au khi S kB l*i ass(.&l'8 &*n phi .C ch:c nvng ;c .inh t>n .*nh cho ass(.&l' &5ng Di
sD <>u ca c4ng c */rong Name8 v2 ) sn <>u Helloorld.exe. l k2ch ho*t l*i vic ;c
.inh t>n .*nh cho tt c cc ass(.&l' S &i &*n v4 hiu trc F8 sO )ng lnh sn 9>x. |O
)ng lnh sn <>l ;(. )anh sch cc ass(.&l' S &i v4 hiu ch:c nvng n'.
3>@ fg hUAB cffOFY] s fcZ, FeA ACA fX fSA> JSJ YwA v] hnAB s>SJ A>cZ Jbc
cffOFY] Lt FRX LRO J>AB J> s>SJ A>cZ J>? s( !@GZ A\] J> J^ Q>t Q>nJ
>@qA LVWJ AjZ cffOFY] L} LVWJ s Ye@ F`AB LK@ fK <& Jbc JTAB JU Strong Name(
Sg hUAB YqA> sn <- assembl!? assembl!A Lt fX fSA> >c@ cffOFY](
0nh 1'3 Tam hon vic k assembly
52
Chng 1: Ph` `aibn cng deng
0nh 1'4 K lai assembly
12'
12' .* assem!ly v i ch "* s /uthenticode .* assem!ly v i ch "* s /uthenticode
#eA JwA s OIQ cffOFY] F`AB ;%thentico&e Lt ABVo@ hrAB F@jQ FeA J>aA> Y\
ABVo@ d>SQ >\A> ip%9lisherk D\ cffOFY] s>TAB FM fgc L@ fcZ s>@ s(
Sg hUAB JTAB JU File Signing isignco&e.e8ek Lt s cffOFY] DE@ Software
,%9lisher Certificate iS,Ck Jbc FeA(
7>n .*nh cung cp .t inh )anh )u' nht c?ng nh ch:ng .inh t2nh ton vn ca .t
ass(.&l'8 nhng nF kh4ng ;c .inh ai l ngi pht hnh ass(.&l' n'. Uo F8 .NET
Framework cung cp k thu6t >u/hen/")oAe kB ass(.&l'. liu n' cho phXp ngi )eng
&iIt &*n l ngi pht hnh v ;c nh6n t2nh ton vn ca ass(.&l'. PhK kB >u/hen/")oAe ckn
$c sO )ng l. ch:ng c: geB"Aen)eh cho ass(.&l' khi cu h%nh ch2nh sch &o .6t tru'
;ut .S lnh gCoAe >))e88 *e)ur"/y PoD")yE;(. .c Z^.c v Z^.Zdh.
l kB .t ass(.&l' vi chK kB >u/hen/")oAe8 &*n cNn .t *PC )o .t Cer/"?")a/e >u/hor"/y g
C>h cp. C> $c trao 9u'n cp *PC gceng vi nhiu kiu ch:ng chJ khch cho cc c
nh<n ho!c c4ng t' sO )ng. 7rc khi cp .t ch:ng chJ8 C> cF trch nhi. ;c nh6n nhKng
ngi '>u cNu v &o . h0 kB kIt kh4ng sO )ng sai cc ch:ng chJ )o C> cp.
l cF $c .t *PC8 &*n n>n ;(. &")ro8o?/ =oo/ Cer/"?")a/e Program &em4er8 t*i
8htt94::;<=n>;#c?o<oft>co;:@#A?B?C:=DfB%@t>B<9E%?@F:@#A?B?C:DnG%<:=n<Dc%?D:ht;@:?ootcD?t9?o2>B<9H.
A <'8 &*n cF th t%. th' )anh sch cc C>8 nhiu C> trong sD F cF th cp cho &*n .t
*PC. ui .c 2ch thO nghi.8 &*n cF th t*o .t *PC thO nghi. th(o 9u tr%nh s@ $c
.4 t trong .c Z.Z^. 7u' nhi>n8 &*n kh4ng th ph<n phDi phNn .. $c kB vi ch:ng chJ
thO nghi. n'. u% .t *PC thO nghi. kh4ng )o .t C> ng tin c6' cp8 n>n hNu hIt
ngi )eng s@ kh4ng tin tCng ass(.&l' $c kB &5ng *PC thO nghi. n'.
whi S cF .t *PC8 sO )ng c4ng c F"De *"gn"ng kB ass(.&l' ca &*n. P4ng c F"De
*"gn"ng sO )ng khFa ri>ng ca *PC t*o .t chK kB sD v nhGng chK kB n' ceng phNn
53
Chng 1: Ph` `aibn cng deng
c4ng khai ca *PC vo ass(.&l' g&ao gt. khFa c4ng khaih. whi ;c .inh .t ass(.&l'8
ngi )eng sO )ng khFa c4ng khai gii .6t hFa .S &v. Sz$cz.6tzhFa8 t2nh ton l*i
.S &v. ca ass(.&l'8 v so snh hai .S &v. n' &o . chGng l nh nhau. whi hai .S
&v. n' treng nhau8 ngi )eng cF th ch/c ch/n r5ng &*n S kB ass(.&l'8 v nF kh4ng &i
tha' si tQ khi &*n kB.
u2 )8 kB .t ass(.&l' cF t>n l &y>88em4Dy.e2e vi .t *PC n5. trong fil( &yCer/.8K)
v khFa ri>ng n5. trong fil( &yPr"Ba/e'ey.KBk8 sO )ng lnh\
signcode <spc M!Cert.spc <v M!/rivate;e!.pv: M!#ssembl!.exe
7rong v2 ) n'8 c4ng c F"De *"gn"ng s@ hin thi .t hp tho*i nh h%nh Z.`8 '>u cNu &*n
nh6p .6t khxu g$c sO )ng &o v khFa ri>ng trong fil( &yPr"Ba/e'ey.KBkh.
0nh 1'5 Cng cu ile Signing yu cu nhp mt khu khi truy xut file cha kha ring
L*n c?ng cF th tru' ;ut khFa v ch:ng chJ trong cc kho ch:a. Lng Z.] lit k> cc Di sD
thng )eng nht ca c4ng c F"De *"gn"ng. L*n hS' tha. kho ti liu .NET Framework
*E' ;(. tt c cc Di sD.
Bfng 1'2 Cc di s thng dng ca cng cu ile Signing
$ji kj ?i `f
<:
PhJ inh t>n ca kho ch:a khFa ri>ng *PC
<s
PhJ inh t>n ca kho ch:a *PC
<spc
PhJ inh t>n fil( ch:a *PC
<v
PhJ inh t>n fil( ch:a khFa ri>ng *PC
l kB .t ass(.&l' gt. nhiu fil(8 &*n cNn chJ inh t>n fil( ch:a ass(.&l' .anif(st. HIu
.uDn sO )ng c t>n .*nh v >u/hen/")oAe cho ass(.&l'8 &*n phi t*o t>n .*nh cho
ass(.&l' trc g;(. cch t*o t>n .*nh cho ass(.&l' trong .c Z.ch.
l ki. tra t2nh h$p l ca .t fil( $c kB vi chK kB >u/hen/")oAe8 sO )ng c4ng c
Cer/"?")a/e Ver"?")a/"on g)hk/ru8/.e2eh. u2 )8 sO )ng lnh c.:trust M!#ssembl!.exe ki.
tra fil( &y>88em4Dy.e2e. HIu cha cu h%nh cho h thDng nF tin tCng *PC )eng kB
ass(.&l'8 &*n s@ th' hp tho*i tMng t= nh h%nh Z.a8 hin thi th4ng tin v ngi pht hnh
v cho &*n ch0n l cF tin tCng ngi pht hnh F ha' kh4ng gch:ng chJ trong h%nh Z.a l
.t ch:ng chJ thO nghi. $c t*o th(o 9u tr%nh $c .4 t trong .c Z.Z^h.
54
Chng 1: Ph` `aibn cng deng
HIu &*n nh/p Ve88 ho!c trc F S ch0n l lu4n tin tCng *PC8 c4ng c Cer/"?")a/e
Ver"?")a/"on ;c nh6n t2nh h$p l ca chK kB v ass(.&l'.
0nh 1'6 Cng cu Certificate Verification
13'
13' T o v thi t l % tin t ng m t 01C th nghi m T o v thi t l % tin t ng m t 01C th nghi m
#eA JwA QeX OIQ S,C Lt Q>g AB>@qO(
Sg hUAB JTAB JU Certificate Creation imakecert.e8ek Lt QeX OIQ J>~AB J> +.<(=
D\ fg hUAB JTAB JU Software ,%9lisher Certificate icert'spc.e8ek Lt QeX OIQ S,C
Q J>~AB J> +.<(= A\]( T>@jQ YNd Q@A QVAB J>~AB J> Q>g AB>@qO F`AB JTAB JU
Set >egistr: isetreg.e8ek(
l t*o .t *PC thO nghi. cho .t nh pht hnh phNn .. cF t>n l *Muare Nguyen8 trc
hIt sO )ng c4ng c Cer/"?")a/e Crea/"on t*o .t ch:ng chJ :.W0T. ynh\
ma:ecert <n 1C=B$Cuare =gu!en1 <s: M!;e!s )estCerti*icate.cer
s@ t*o .t fil( cF t>n l Te8/Cer/"?")a/e.)er ch:a .t ch:ng chJ :.W0T8 v lu trK khFa ri>ng
tMng :ng trong .t kho ch:a khFa C*P cF t>n l &y'ey8 g$c t*o t= ng nIu cha ttn
t*ih. L*n c?ng cF th ghi khFa ri>ng vo fil( &5ng cch tha' <s: &5ng <sv. u2 )8 ghi khFa
ri>ng vo .t fil( cF t>n l Pr"Ba/e'ey8.KBk8 sO )ng lnh\
ma:ecert <n 1C=B$Cuare =gu!en1 <sv /rivate;e!.pv: )estCerti*icate.cer
55
Chng 1: Ph` `aibn cng deng
0nh 1'7 Cng cu Certificate Creation nhc nhp mt khu d bo v file cha kha ring
HIu &*n ghi khFa ri>ng vo fil(8 c4ng c Cer/"?")a/e Crea/"on s@ nh/c &*n nh6p .6t khxu
&o v fil( n' g;(. h%nh Z.[h.
P4ng c Cer/"?")a/e Crea/"on h# tr$ nhiu Di sD8 &ng Z.^ lit k> .t vi Di sD thng )eng.
{(. th>. ti liu .NET Framework *E' v c4ng c Cer/"?")a/e Crea/"on.
Bfng 1'3 Cc di s thng dng ca cng cu Certificate Creation
$ji kj ?i `f
<e
PhJ inh ng' ch:ng chJ kh4ng ckn hiu l=c.
<m
PhJ inh khong thi gian gt2nh &5ng thngh . ch:ng chJ ckn hiu l=c.
<n
PhJ inh .t t>n :.W00 tMng :ng vi ch:ng chJ. l<' l t>n ca ngi
pht hnh phNn .. . ngi )eng th' khi h0 ;(. chi tiIt ca *PC t*o
ra.
<s:
PhJ inh t>n C*P giK khFa ri>ng.
<ss
PhJ inh t>n kho ch:ng chJ gc4ng c Cer/"?")a/e Crea/"on s@ lu ch:ng chJ
:.W0T trong Fh.
<sv
PhJ inh t>n fil( giK khFa ri>ng.
whi S t*o .t ch:ng chJ :.W0T &5ng c4ng c Cer/"?")a/e Crea/"on8 cNn chu'n ch:ng chJ n'
thnh .t *PC &5ng c4ng c *o?/ware Pu4D"8her Cer/"?")a/e Te8/ g)er/28K).e2eh. l chu'n
Te8/Cer/"?")a/e.)er thnh .t *PC8 sO )ng lnh\
certAspc )estCerti*icate.cer )estCerti*icate.spc
P4ng c *o?/ware Pu4D"8her Cer/"?")a/e Te8/ kh4ng cF Di sD te' ch0n no.
Lc cuDi ceng sO )ng *PC thO nghi. l thiIt l6p tin tCng C> thO nghi. gDc groo/
/e8/ C>hT <' l ngi pht hnh .!c inh cc ch:ng chJ thO nghi.. Lc n' chJ cNn lnh
setreg ? true ca c4ng c *e/ =eg"8/ry g8e/reg.e2eh. whi kIt thGc thO nghi. *PC8 &V thiIt
l6p tin tCng Di vi C> thO nghi. &5ng lnh setreg ? *alse. L<' gi8 &*n cF th sO )ng
*PC thO nghi. kB ass(.&l' vi >u/hen/")oAe nh 9u tr%nh .4 t C .c Z.Z].
56
Chng 1: Ph` `aibn cng deng
14'
14' 2u n l* 3lo!al /ssem!ly Cache 2u n l* 3lo!al /ssem!ly Cache
#eA JwA Q>CO >X_J YXe@ F cffOFY] Q 6lo9al ;ssem9l: Cache i6;Ck(
Sg hUAB JTAB JU 6lo9al ;ssem9l: Cache igac%til.e8ek Q hyAB YqA> Lt vO AI@
hZAB Jbc 6;C, JAB A>V Q>CO >X_J YXe@ F cffOFY](
7rc khi $c ci !t vo 6>C8 ass(.&l' phi cF t>n .*nh g;(. .c Z.c v cch t*o t>n
.*nh cho ass(.&l'h. l ci !t ass(.&l' cF t>n l *ome>88em4Dy.ADD vo 6>C8 sO )ng lnh
gacutil /i $ome#ssembl!.dll.
l lo*i &V *ome>88em4Dy.ADD ra khVi 6>C8 sO )ng lnh gacutil /u $ome#ssembl!. PhG B
kh4ng sO )ng phNn .C rng .ADD nFi In ass(.&l' .t khi nF S $c ci !t vo 6>C.
l ;(. cc ass(.&l' S $c ci !t vo 6>C8 sO )ng lnh gacutil /l. ynh n' s@ lit k>
tt c cc ass(.&l' S $c ci !t trong 6>C8 c?ng nh )anh sch cc ass(.&l' S $c
&i>n )ich trc sang )*ng nhi ph<n v ci !t trong HpH cach(. |O )ng lnh gacutil /l
$ome#ssembl! trnh phi t%. hIt )anh sch ;(. .t ass(.&l' S $c ci !t cha.
(NET Framework fg hUAB 6;C J> s>@ Q>nJ Q>@, QHlA> F@CA hMJ> C# fm s>TAB QlO
QHXAB 6;C FPQ s Q>cO J>@jZ ABXe@ A\X O\ cffOFY] Jbc FeA Q>cO J>@jZ LjA(
THXAB ZS QHlA> d>SQ QH@tA, QHlA> F@CA hMJ> C# d>R@ QHZ] vZPQ LVWJ OIQ FRA fcX
JUJ FI Jbc FPQ s cffOFY] J>@c f A\X LVWJ Q>cO J>@jZ LjA( #eA J^ Q>t J>d
cffOFY] J>@c f D\X Q>V OUJ O} ABZA Jbc FeA, >X_J fg hUAB LK@ fK /lib Jbc
QHlA> F@CA hMJ> C# Lt J> LMA> Q>V OUJ O\ QHlA> F@CA hMJ> J^ Q>t QlO Q>P] JSJ
cffOFY] JwA Q>@jQ QHXAB L^(
15' 15' Ng4n ng i "hc d ch ng c m# ngu n c a ! n Ng4n ng i "hc d ch ng c m# ngu n c a ! n
#eA OZKA FRX LRO cffOFY] (NET Jbc FeA s>TAB FM hMJ> ABVWJ(
%] hnAB JSJ B@R@ d>Sd hnc6QHCA6fHDH AjZ J^ Q>t Lt ABVo@ hrAB s>TAB QHZ]
vZPQ cffOFY] LVWJ( NjZ FeA d>R@ d>A d>K@ cffOFY] Q>l s>TAB J^ JSJ> A\X Lt
ABA ABVo@ hrAB hMJ> ABVWJ J>AB( CSJ> QKQ A>PQ J^ Q>t Y\O Y\ fg hUAB s
Q>ZNQ o9f%scation D\ JSJ Q>\A> d>wA L} LVWJ F@CA hMJ> Q>\A> O} YqA> ABZ]CA
f@A> inati"e co&ek Lt cffOFY] s>^ FM hMJ> ABVWJ >[A(
u% ass(.&l' .NET &ao gt. .t t6p cc .S lnh v si>u )K liu $c chuxn hFa8 c l6p nn
tng .4 t cc kiu n5. trong ass(.&l'8 n>n chGng tMng Di )r &i )ich ng$c. liu n' cho
phXp cc tr%nh )ich ng$c )r )ng t*o $c .S ngutn rt giDng vi .S gDc8 <' s@ l vn
khF gii 9u'It nIu .S ca &*n cF ch:a cc th4ng tin ho!c thu6t ton cNn giK &2 .6t.
Pch )u' nht . &o ngi )eng kh4ng th )ich ng$c ass(.&l' l kh4ng cho h0 l'
$c ass(.&l'. HIu cF th8 hin th=c cc gii php )=aztr>nzs(rv(r nh cc :ng )ng
&")ro8o?/ >*P.NET v )ich v @e4 :&L. ui .t ch2nh sch &o .6t tDt C s(rv(r8 kh4ng ai
cF th tru' ;ut ass(.&l'8 )o F kh4ng th )ich ng$c chGng.
57
Chng 1: Ph` `aibn cng deng
HIu vic ;<' )=ng cc gii php )=aztr>nzs(rv(r l kh4ng phe h$p8 &*n cF hai te' ch0n sau
<'\
|O )ng .t o4?u8)a/or khiIn cho ass(.&l' ca &*n khF &i )ich ng$c gV"8uaD
*/uA"o .NET 200C cF ch:a phi>n &n Commun"/y ca .t o4?u8)a/orR cF t>n l
Eo/?u8)a/orh. F4?u8)a/or sO )ng nhiu k thu6t khc nhau khiIn cho ass(.&l' khF &i
)ich ng$cT ngu'>n lB ca cc k thu6t n' l\
- lsi t>n cc trng v cc phMng th:c Kr"Ba/e nh5. g<' khF khvn cho vic 0c v
hiu .c 2ch ca .S lnh.
- Ph1n cc lnh )kng iu khin khiIn cho ngi khc khF cF th lNn th(o logic ca
:ng )ng.
Phu'n nhKng phNn ca :ng )ng . &*n .uDn giK &2 .6t thnh cc Di t$ng CF&
ha' cc ELL ngu'>n sinh8 sau F sO )ng PX<nBoke ho!c CF& <n/eroK g0i chGng tQ
:ng )ng $cz9unzlB ca &*n g;(. chMng Z` v cch g0i .S lnh kh4ngz$cz
9unzlBh.
wh4ng cF cch tiIp c6n no ngvn $c nhKng ngi cF k nvng v 9u'It t<. )ich ng$c .S
ngutn ca &*n8 nhng chGng s@ l. cho c4ng vic n' trC n>n khF khvn ng k v ngvn
$c hNu hIt nhng kj tk .k th4ng thng.
Hgu' cM .t :ng )ng &i )ich ng$c kh4ng chJ ri>ng cho C# ha' .NET. "t ngi 9u'It t<.
cF th )ich ng$c &t k phNn .. no nIu anh ta cF k nvng v thi gian.
58
Chng 1: Ph` `aibn cng deng

2
59
Ch01n2 I4THAJ TC ,K LI(U
60
61
Chng 2: Thao `c dl minu
Nu hIt cc :ng )ng u cNn thao tc tr>n .t lo*i )K liu no F. &")ro8o?/ .NET
Framework cung cp nhiu k thu6t Mn gin hFa ha' n<ng cao hiu 9u cc
thao tc )K liu th4ng )ng. PhMng n' s@ c6p cc k thu6t sau\ n
7hao tc chu#i .t cch hiu 9u g.c ].Zh.
"4 t cc kiu )K liu cM sC &5ng cc kiu .S hFa khc nhau g.c ].]8 ].^8 v ]._h.
|O )ng &iu th:c ch2nh 9u' ;c nh6n t2nh h$p l v thao tc chu#i g.c ].` v
].ah.
y. vic vi ng' v gi g.c ].[ v ].bh.
y. vic vi .ng v t6p h$p g.c ].c8 ].Zd8 v ].ZZh.
7uNn t= hFa tr*ng thi Di t$ng v lu nF vo fil( g.c ].Z]h.
1' 1' Thao tc chu i m t cch hi u )u Thao tc chu i m t cch hi u )u
#eA JwA Q>cX QSJ QHCA AI@ hZAB Jbc OIQ LK@ QVWAB $tring D\ QHSA> J>@ d>a Jbc
D@qJ Qn LIAB QeX JSJ LK@ QVWAB $tring OE@ hX QaA> s>TAB L@ Jbc LK@ QVWAB
$tring(
Sg hUAB YEd $!stem.)ext.$tring6uilder Lt Q>nJ >@qA JSJ Q>cX QSJ, fcZ L^ J>Z]tA
sjQ ZR Q>\A> $tring F`AB d>V[AB Q>~J $tring6uilder.)o$tring(
Pc Di t$ng String trong .NET l kh4ng si8 nghqa l .t khi S $c t*o th% chGng kh4ng
th &i tha' si. u2 )8 nIu &*n t*o .t String &5ng cch nDi .t sD kB t= ho!c chu#i8 th% khi
th>. .t phNn tO .i vo cuDi String hin cF8 & th=c thi s@ t*o ra .t String .i ch:a kIt
9u gch: kh4ng phi String c? &i tha' sih. Uo F s@ n' sinh chi ph2 ng k nIu :ng )ng
ca &*n thng ;u'>n thao tc tr>n String.
yp StringBuilder kh/c phc vn n' &5ng cch cung cp .t & . kB t=8 v cho phXp
thao tc tr>n ni )ung ca nF . & th=c thi kh4ng phi t*o Di t$ng .i ch:a kIt 9u
sau .#i lNn tha' si. L*n cF th t*o .t Di t$ng StringBuilder r#ng ho!c $c khCi t*o l
ni )ung ca .t String hin cF. |au F8 thao tc tr>n ni )ung ca StringBuilder n' &5ng
cc phMng th:c n*p chtng gcho phXp &*n ch1n8 th>. )*ng chu#i ca cc kiu )K liu khc
nhauh. PuDi ceng8 g0i StringBuilder.ToString chu'n ni )ung hin t*i ca
StringBuilder thnh .t String.
whi &*n th>. )K liu .i vo chu#i8 cF hai thuc t2nh 9uan tr0ng nh hCng In ho*t ng
ca StringBuilder l Capacity v Length. Capacity .4 t k2ch thc ca & .
StringBuilder8 ckn Length .4 t k2ch thc ca chu#i kB t= trong & .. HIu vic th>. )K
liu .i vo StringBuilder l. k2ch thc chu#i gLengthh v$t 9u k2ch thc & .
gCapacityh th% StringBuilder s@ cp pht & . .i ch:a chu#i. HIu thiIu cxn th6n8 vic
cp pht & . n' cF th ph inh l$i 2ch ca vic sO )ng StringBuilder. Uo F8 nIu &iIt
ch2nh ;c k2ch thc ca chu#i8 ho!c &iIt k2ch thc tDi a ca chu#i8 &*n cF th trnh vic
cp pht & . 9u .:c cNn thiIt &5ng cch thiIt l6p thuc t2nh Capacity ho!c chJ inh k2ch
thc & . lGc t*o StringBuilder. whi thiIt l6p cc thuc t2nh Capacity v Length8 cNn chG
B cc i. sau\
62
Chng 2: Thao `c dl minu
HIu &*n thiIt l6p gi tri Capacity nhV hMn gi tri Length8 thuc t2nh Capacity s@ nX.
ngo*i l System.ArgumentOutOfRangeException.
HIu &*n thiIt l6p gi tri Length nhV hMn k2ch thc ca chu#i hin cF trong & .8
chu#i s@ &i c/t &t phNn ln hMn.
HIu &*n thiIt l6p gi tri Length ln hMn k2ch thc ca chu#i8 & . s@ $c lp
th>. cc khong tr/ng cho &5ng vi Length. uic thiIt l6p gi tri Length ln hMn gi tri
Capacity s@ t= ng iu chJnh Capacity cho &5ng vi Length.
RhMng th:c ReverseString )i <' .inh h0a cch sO )ng lp StringBuilder o .t
chu#i. HIu kh4ng sO )ng lp StringBuilder th=c hin thao tc n' th% s@ tDn chi ph2 ng
k8 !c &it khi chu#i ngutn )i. uic khCi t*o StringBuilder vi k2ch thc &5ng chu#i
ngutn &o . kh4ng cNn phi cp pht l*i & . trong 9u tr%nh o chu#i.
public static string ReverseString(string str) {

// Kim tra cc trng hop khng cn dao chui.
if (str == null || str.Length == 1) {
return str;
}

// Tao mt StringBuilder vi sc cha cn thit.
System.Text.StringBuilder revStr =
new System.Text.StringBuilder(str.Length);
// Duyt ngoc chui ngun tung k t mt
// v thm tung k t doc doc vo StringBuilder.
for (int count = str.Length-1; count -1; count--) {
revStr.Append(str[count]);
}
// Tra v chui d doc dao.
return revStr.ToString();
}
2'
2' 5# h'a chu i ! ng cc "i u m# h'a "* t 5# h'a chu i ! ng cc "i u m# h'a "* t
#eA JwA QHcX L@ h? Y@qZ heAB s Qn DE@ JSJ >q Q>KAB fg hUAB s@tZ O} >^c s>SJ
DE@ 7TF?#@ is@tZ O} >^c A\] LVWJ fg hUAB F@ C>.k(
63
Chng 2: Thao `c dl minu
Sg hUAB YEd $!stem.)ext.0ncoding D\ JSJ YEd JXA Jbc A^ Lt J>Z]tA L@ s Qn
B@?c JSJ s@tZ O} >^c s>SJ A>cZ(
Qn")oAe kh4ng phi l kiu .S hFa )u' nht8 c?ng nh QTFI1Y kh4ng phi cch )u' nht
&iu )irn kB t= Qn")oAe. whi :ng )ng cNn trao si )K liu kB t= vi cc h thDng &>n ngoi
g!c &it l cc h thDng c?h8 )K liu cNn phi $c chu'n si giKa QTFI1Y v kiu .S hFa
. h thDng F h# tr$.
yp trQu t$ng Encoding8 v cc lp con ca nF cung cp cc ch:c nvng chu'n kB t= 9ua
l*i giKa nhiu kiu .S hFa khc nhau. "#i th hin ca lp con h# tr$ vic chu'n si giKa
QTFI1Y v .t kiu .S hFa khc. RhMng th:c tqnh Encoding.GetEncoding nh6n vo t>n ho!c
sD hiu trang .S g)oAe Kage num4erh ca .t kiu .S hFa v tr v th hin ca lp .S hFa
tMng :ng.
Lng ].Z lit k> .t vi kiu .S kB t= v sD hiu trang .S . &*n phi tru'n cho phMng
th:c GetEncoding t*o ra th hin ca lp .S hFa tMng :ng. Lng n' c?ng cung cp cc
thuc t2nh tqnh ca lp Encoding *i )in cho phMng th:c GetEncoding tMng :ng.
Bfng 2'1 Cc lp m ha k tu
Yibu op hqa rs .g deng
>*C<<
ASCIIEncoding
GetEncoding(2012)
ha' thuc t2nh ASCII
"!c inh Zk"[u m\ h]a
h"9n h1nh /rn h9 /h^ng_
Encoding
GetEncoding(0)
ha' thuc t2nh Default
QTFIL
UTFEncoding
GetEncoding(65000)
ha' thuc t2nh UTF
QTFIU
UTF8Encoding
GetEncoding(65001)
ha' thuc t2nh UTF8
QTFI1Y Z$"g EnA"an_
UnicodeEncoding
GetEncoding(1201)
ha' thuc t2nh BigEndianUnicode
QTFI1Y ZL"//De EnA"an_
UnicodeEncoding
GetEncoding(1200)
ha' thuc t2nh Unicode
@"nAow8 F*
Encoding GetEncoding(1252)
|au khi S l' $c Di t$ng lp Encoding h# tr$ kiu .S hFa th2ch h$p8 sO )ng phMng
th:c GetBytes chu'n chu#i ngutn g$c .S hFa th(o QTFI1Yh thnh .ng kiu &'t( ch:a
cc kB t= $c .S hFa th(o kiu cNn chu'n8 v sO )ng GetString chu'n .ng &'t(
thnh chu#i 2ch. u2 ) )i <' tr%nh &' cch sO )ng .t vi lp .S hFa\
using System;
using System.IO;
using System.Text;
public class CharacterEncodingExample {
64
Chng 2: Thao `c dl minu
public static void Main() {

// Tao file gi cc kt qua.
using (StreamWriter output = new StreamWriter("output.txt")) {
// Tao v ghi ra file mt chui cha k hiu cua s PI.
string srcString = "Area = u03A0r2";
output.WriteLine("Source Text : " + srcString);
// Ghi cc byte doc m ha theo UTF-16
// cua chui ngun ra file.
byte[] utf16String = Encoding.Unicode.GetBytes(srcString);
output.WriteLine("UTF-16 Bytes: {0}",
BitConverter.ToString(utf16String));
// Chuyn chui ngun doc m ha theo UTF-16
// thnh UTF-8 v ASCII
byte[] utf8String = Encoding.UTF8.GetBytes(srcString);
byte[] asciiString = Encoding.ASCII.GetBytes(srcString);

// Ghi mang cc byte doc m ha theo UTF-8 v ASCII ra file.
output.WriteLine("UTF-8 Bytes: {0}",
BitConverter.ToString(utf8String));
output.WriteLine("ASCII Bytes: {0}",
BitConverter.ToString(asciiString));
// Chuyn cc byte doc m ha theo UTF-8 v ASCII
// thnh chui doc m ha theo UTF-16 v ghi ra file.
output.WriteLine("UTF-8 Text : {0}",
Encoding.UTF8.GetString(utf8String));
output.WriteLine("ASCII Text : {0}",
Encoding.ASCII.GetString(asciiString));
// Ghi d liu xung file v dng file.
output.Flush();
65
Chng 2: Thao `c dl minu
output.Close();
}
}
}
Ph*' CharacterEncodingExample s@ t*o ra fil( ou/Ku/./2/. "C fil( n' trong .t tr%nh so*n
tho cF h# tr$ Qn")oAe8 &*n s@ th' kIt 9u nh sau\
Source Text : Area = r2
UTF-16 Bytes: 41-00-2-00-65-00-61-00-20-00-3D-00-20-00-#@<@D-2-00-5E-00-32-00
UTF-8 Bytes: 41-2-65-61-20-3D-20-C0<#@-2-5E-32
ASCII Bytes: 41-2-65-61-20-3D-20-D"-2-5E-32
UTF-8 Text : Area = r2
ASCII Text : Area = r2
PhG B r5ng8 nIu sO )ng QTFI1Y th% .#i kB t= $c .S hFa &Ci ] &'t(8 nhng v% hNu hIt cc
kB t= u l kB t= chuxn n>n &'t( cao l 0 gnIu sO )ng D"//DeIenA"an th% &'t( thp viIt trch.
Uo F8 hNu hIt cc kB t= u $c .S hFa &Ci nhKng sD giDng nhau trong &a kiu .S hFa8
ngo*i trQ kB hiu P< $c .S hFa khc g$c in 6. trong kIt 9u C tr>nh. l .S hFa P< cNn
] &'t(8 ki hVi n' $c QTFIU h# tr$ n>n th hin $c `8 trong khi F >*C<< chJ sO )ng
.t &'t( n>n tha' P< &5ng .S CF8 <' l .S ca )u hVi gah.
NjZ J>Z]tA JSJ s Qn 7nico&e fcAB ;SC// >X_J OIQ s@tZ O} >^c s>SJ Q>l J^ Q>t
OPQ h? Y@qZ( #PQ s s Qn 7nico&e A\X J^ O} s Qn s>TAB F@tZ h@uA LVWJ QHXAB
s@tZ O} >^c LaJ> fm FM F Zc s>@ J>Z]tA L@(
yp Encoding c?ng cung cp phMng th:c tqnh Covert Mn gin hFa vic chu'n .t .ng
&'t( tQ kiu .S hFa n' sang kiu .S hFa khc kh4ng phi 9ua trung gian QTFI1Y. u2 )8
)kng .S sau chu'n tr=c tiIp cc &'t( trong .ng asciiString tQ >*C<< sang QTFIU\
byte[] utf8String = Encoding.Convert(Encoding.ASCII, Encoding.UTF8,
asciiString);
3' 3' Chuy n cc "i u gi tr c ! n thnh m ng "i u !yte Chuy n cc "i u gi tr c ! n thnh m ng "i u !yte
#eA JwA J>Z]tA JSJ s@tZ B@S QHM J[ FRA Q>\A> ORAB s@tZ F]Q(
LEd $!stem.6itConverter JZAB JPd JSJ d>V[AB Q>~J QA> HPQ Q@qA YW@ J>X D@qJ
J>Z]tA L@ Zc Ye@ B@?c JSJ ORAB s@tZ F]Q D\ >wZ >jQ JSJ s@tZ B@S QHM J[ FRA
QH s@tZ decimal( !t J>Z]tA OIQ B@S QHM s@tZ decimal fcAB ORAB s@tZ F]Q, FeA
JwA fg hUAB LK@ QVWAB $!stem.E(.6inar!riter Lt B>@ B@S QHM L^ D\X OIQ Q>t >@qA
$!stem.E(.Memor!$tream, fcZ L^ B@ d>V[AB Q>~J Memor!stream.)o#rra!( !t J^
OIQ B@S QHM decimal Q OIQ ORAB s@tZ F]Q, FeA JwA QeX OIQ LK@ QVWAB
Memor!$tream Q ORAB s@tZ F]Q, fcZ L^ fg hUAB Q>t >@qA $!stem.E(.6inar!&eader
Lt LJ B@S QHM A\] Q Memor!$tream(
66
Chng 2: Thao `c dl minu
RhMng th:c tqnh GetBytes ca lp BitConverter cung cp nhiu phi>n &n n*p chtng cho
phXp chu'n hNu hIt cc kiu gi tri cM &n sang .ng kiu &'t(. Pc kiu $c h# tr$ l
bool8 char8 double8 short8 int8 long8 float8 ushort8 uint8 v ulong. yp BitConverter c?ng
cung cp cc phMng th:c tqnh cho phXp chu'n cc .ng kiu &'t( thnh cc kiu gi tri
chuxn nh ToBoolean8 ToUInt328 ToDouble8... u2 ) sau .inh h0a cch chu'n cc gi tri bool
v int thnh .ng kiu &'t(8 v ng$c l*i. lDi sD th: hai trong ToBoolean v ToUInt32 cho
&iIt vi tr2 gt2nh tQ dh trong .ng &'t( . BitConverter s@ l' cc &'t( k tQ F t*o gi tri
)K liu.
byte[] b = null;
// Chuyn mt gi tr bool thnh mang kiu byte v hin th.
b = BitConverter.GetBytes(true);
Console.WriteLine(BitConverter.ToString(b));
// Chuyn mt mang kiu byte thnh gi tr bool v hin th.
Console.WriteLine(BitConverter.ToBoolean(b,0));
// Chuyn mt gi tr int thnh mang kiu byte v hin th.
b = BitConverter.GetBytes(368);
Console.WriteLine(BitConverter.ToString(b));
// Chuyn mt mang kiu byte thnh gi tr int v hin th.
Console.WriteLine(BitConverter.ToInt32(b,0));
lDi vi kiu decimal8 lp BitConverter kh4ng h# tr$8 n>n &*n phi sO )ng th>.
MemoryStream v BinaryWriter.
// Tao mang kiu byte tu gi tr decimal.
public static byte[] DecimalToByteArray (decimal src) {
// Tao mt MemoryStream lm b dm cha d liu nh phn.
using (MemoryStream stream = new MemoryStream()) {
// Tao mt BinaryWriter d ghi d liu nh phn vo stream.
using (BinaryWriter writer = new BinaryWriter(stream)) {
// Ghi gi tr decimal vo BinaryWriter/MemoryStream.
writer.Write(src);
67
Chng 2: Thao `c dl minu
// Tra v mang kiu byte.
return stream.ToArray();
}
}
}
l chu'n .t .ng kiu &'t( thnh .t gi tri decimal8 sO )ng BinaryReader 0c tQ
MemoryStream.
// Tao gi tr decimal tu mang kiu byte.
public static decimal ByteArrayToDecimal (byte[] src) {
// Tao mt MemoryStream cha mang.
using (MemoryStream stream = new MemoryStream(src)) {
// Tao mt BinaryReader d doc tu stream.
using (BinaryReader reader = new BinaryReader(stream)) {
// oc v tra v gi tr decimal tu
// BinaryReader/MemoryStream.
return reader.ReadDecimal();
}
}
}
LEd 6itConverter JAB JZAB JPd d>V[AB Q>~J )o$tring Lt QeX OIQ $tring J>~c
B@S QHM ORAB( G@ )o$tring D\ QHZ]GA LK@ fK Y\ OIQ ORAB F]Q fm QHR DG OIQ
$tring J>~c B@S QHM Q>Nd YUJ d>A Jbc JSJ F]Q QHXAB ORAB, JSJ B@S QHM A\] JSJ>
A>cZ F@ hPZ BeJ> AK@, Da hU )4?;A?'C( TZ] A>@CA, s>TAB J^ d>V[AB Q>~J A\X
QeX OIQ ORAB s@tZ F]Q Q OIQ J>Zx@ Q>X LMA> heAB A\](
4' 4' 5# h'a d li u nh %h6n thnh v4n ! n 5# h'a d li u nh %h6n thnh v4n ! n
#eA JwA J>Z]tA h? Y@qZ A>M d>A fcAB OIQ heAB fcX J>X J^ Q>t LVWJ YVZ QH?
QHXAB OIQ @Y DA FRA ;SC// iJ>AB >eA @Y +M.k, >X_J LVWJ B@ L@ QHXAB 6
Oc@Y(
Sg hUAB JSJ d>V[AB Q>~J QA> )o6aseFG$tring D\ "rom6aseFG$tring Jbc YEd
$!stem.Converter Lt J>Z]tA L@ Zc Ye@ B@?c h? Y@qZ A>M d>A D\ J>Zx@ LVWJ O}
>^c Q>X 5ase@4(
68
Chng 2: Thao `c dl minu
$a8eYG l .t kiu .S hFa cho phXp &*n .4 t )K liu nhi ph<n nh .t )S' cc kB t= >*C<<
nF cF th $c ch1n vo .t fil( vvn &n ho!c .t (z.ail8 . C F )K liu nhi ph<n kh4ng
$c cho phXp. $a8eYG l. vic tr>n ngu'>n t/c sO )ng _ &'t( ch:a ^ &'t( )K liu ngutn
v . &o .#i &'t( chJ sO )ng [ &it thp ch:a )K liu. liu n' cF nghqa l .#i &'t( )K
liu $c .S hFa th(o $a8eYG cF )*ng giDng nh .t kB t= >*C<<8 n>n cF th $c lu trK
ho!c tru'n i &t c: nMi <u cho phXp kB t= >*C<<.
yp Convert cung cp hai phMng th:c ToBase64String v FromBase64String .S hFa v
gii .S $a8eYG. 7u' nhi>n8 trc khi .S hFa $a8eYG8 &*n phi chu'n )K liu thnh .ng
kiu &'t(T v sau khi gii .S8 &*n phi chu'n .ng kiu &'t( trC v kiu )K liu th2ch h$p
g;(. l*i .c ].] v ].^h.
u2 ) sau .inh h0a cch sO )ng lp Convert .S hFa v gii .S $a8eYG vi chu#i
Qn")oAe8 gi tri int8 gi tri decimal. lDi vi gi tri decimal8 &*n phi sO )ng l*i cc phMng
th:c ByteArrayToDecimal v DecimalToByteArray trong .c ].^.
// M ha Base64 vi chui Unicode.
public static string StringToBase64 (string src) {
// Chuyn chui thnh mang kiu byte.
byte[] b = Encoding.Unicode.GetBytes(src);
// Tra v chui doc m ha theo Base64.
return Convert.ToBase64String(b);
}
// Giai m mt chui Unicode doc m ha theo Base64.
public static string Base64ToString (string src) {
// Giai m vo mang kiu byte.
byte[] b = Convert.FromBase64String(src);
// Tra v chui Unicode.
return Encoding.Unicode.GetString(b);
}
// M ha Base64 vi gi tr decimal.
public static string DecimalToBase64 (decimal src) {
// Chuyn gi tr decimal thnh mang kiu byte.
69
Chng 2: Thao `c dl minu
byte[] b = DecimalToByteArray(src);
// Tra v gi tr decimal doc m ha theo Base64.
return Convert.ToBase64String(b);
}
// Giai m mt gi tr decimal doc m ha theo Base64.
public static decimal Base64ToDecimal (string src) {
// Giai m vo mang kiu byte.
byte[] b = Convert.FromBase64String(src);
// Tra v gi tr decimal.
return ByteArrayToDecimal(b);
}
// M ha Base64 vi gi tr int.
public static string IntToBase64 (int src) {
// Chuyn gi tr int thnh mang kiu byte.
byte[] b = BitConverter.GetBytes(src);
// Tra v gi tr int doc m ha theo Base64.
return Convert.ToBase64String(b);
}
// Giai m mt gi tr int doc m ha theo Base64.
public static int Base64ToInt (string src) {
// Giai m vo mang kiu byte.
byte[] b = Convert.FromBase64String(src);
// Tra v gi tr int.
return BitConverter.ToInt32(b,0);
}
70
Chng 2: Thao `c dl minu
5'
5' 0 d ng !i u th c ch7nh )uy "i m tra d li u nh % 0 d ng !i u th c ch7nh )uy "i m tra d li u nh %
#eA JwA s@tO QHc h? Y@qZ A>Nd D\X J^ LAB DE@ JPZ QHJ D\ AI@ hZAB LVWJ Z]
LMA> QHVEJ >c] s>TAB( Va hU, FeA OZKA FRX LRO ABVo@ hrAB A>Nd LMc J> /,, fK
L@qA Q>Xe@, >c] LMc J> 6Oc@Y >Wd Yq(
Sg hUAB F@tZ Q>~J J>aA> Z] Lt FRX LRO h? Y@qZ A>Nd LAB JPZ QHJ D\ J> J>~c
JSJ s Qn LVWJ Z] LMA> QHVEJ LK@ DE@ QAB heAB Q>TAB Q@A(
whi :ng )ng nh6n )K liu tQ ngi )eng ho!c 0c )K liu tQ fil(8 &*n n>n gi inh )K liu
n' l cha ch2nh ;c v cNn $c ki. tra l*i. "t nhu cNu ki. tra kh phs &iIn l ;c inh
cc sD in tho*i8 sD thj t2n )ng8 ia chJ (z.ail cF Gng )*ng ha' kh4ng. uic ki. tra cu
trGc v ni )ung ca )K liu kh4ng . &o )K liu l ch2nh ;c nhng giGp lo*i &V nhiu )K
liu sai v Mn gin hFa vic ki. tra sau n'. Liu th:c ch2nh 9u' greguDar e2Kre88"onh cung
cp .t cM chI rt tDt ki. tra .t chu#i cF Gng vi cu trGc 9u' inh trc ha' kh4ng8
)o F &*n cF th l$i )ng t2nh nvng n' cho .c 2ch ki. tra )K liu nh6p.
7rc ti>n8 &*n phi ;c inh cG php ca &iu th:c ch2nh 9u' cho phe h$p vi cu trGc v
ni )ung ca )K liu cNn ki. tra8 <' l phNn khF nht khi sO )ng &iu th:c ch2nh 9u'. Liu
th:c ch2nh 9u' $c ;<' )=ng tr>n hai 'Iu tD\ tr=c kin gD"/eraDh v si>u kB t=
gme/a)hara)/erh. 7r=c kin .4 t cc kB t= cF th ;ut hin trong .3u . &*n .uDn so trengT
si>u kB t= h# tr$ vic so treng cc kB t= *i )in gil)car)h8 tN. tri8 nhF.8 l!p8 iu kin8 v
cc cM chI iu khin khc. A <' kh4ng tho lu6n N' v cG php &iu th:c ch2nh 9u'
gtha. kho ti liu .NET *E' hiu th>. v &iu th:c ch2nh 9u'h8 nhng &ng ].] s@ .4 t
cc si>u kB t= thng )eng.
Bfng 2'2 Cc siu k tu thng dng
.itu uv `w ?i `f
.
"0i kB t= trQ kB t= ;uDng )kng gnh.
d
wB t= chK sD th6p ph<n g)igith.
D
wB t= kh4ng phi chK sD gnonz)igith.
s
wB t= hit(spac( gnh khong tr/ng8 ta&...h.
S
wB t= nonzhit(spac(.
w
wB t= or) ggt. .3u t=8 chK sD8 v )u g*ch )ih.
W
wB t= nonzor).

L/t Nu .t chu#i ho!c )kng.


A
L/t Nu .t chu#i.

wIt thGc .t chu#i ho!c )kng.


z
wIt thGc .t chu#i.
71
Chng 2: Thao `c dl minu
|
Hgvn cch cc &iu th:c cF th so treng8 v2 ) AAA|ABA|ABB s@ so treng vi
AAA8 ABA8 ho!c ABB gcc &iu th:c $c so treng tQ tri sangh.
[abc]
|o treng vi .t trong cc kB t= trong nhF.8 v2 ) [AbC] s@ so treng vi A8
b8 ho!c C.
[abc]
|o treng vi &t c: kB t= no kh4ng thuc cc kB t= trong nhF.8 v2 )
[AbC] s@ kh4ng so treng vi A8 b8 or C nhng so treng vi B8 F8
[a-z]
|o treng vi &t k kB t= no thuc khong n'8 v2 ) [A-C] s@ so treng vi
A8 B8 ho!c C.
( )
{c inh .t &iu th:c con sao cho nF $c ;(. nh .t 'Iu tD Mn lj
Di vi cc 'Iu tD $c tr%nh &' trong &ng n'.

{c inh cF .t ho!c kh4ng cF kB t= ho!c &iu th:c con :ng trc nF8 v2
) AB so treng vi B8 AB8 nhng kh4ng so treng vi AAB.

{c inh kh4ng cF ho!c cF nhiu kB t= ho!c &iu th:c con :ng trc nF8
v2 ) AB so treng vi B8 AB8 AAB8 AAAB8
+
{c inh cF .t ho!c cF nhiu kB t= ho!c &iu th:c con :ng trc nF8 v2
) A+B so treng vi AB8 AAB8 AAAB8 nhng kh4ng so treng vi B.
{n}
{c inh cF Gng n kB t= ho!c &iu th:c con :ng trc nF8 v2 ) A{2} chJ
so treng vi AA.
{n,}
{c inh cF 2t nht n kB t= ho!c &iu th:c con :ng trc nF8 v2 ) A{2,}
so treng vi AA8 AAA8 AAAA8 nhng kh4ng so treng vi A.
{n, m}
{c inh cF tQ n In m kB t= :ng trc nF8 v2 ) A{2,4} so treng vi AA8
AAA8 v AAAA nhng kh4ng so treng vi A ho!c AAAAA.
whi )K liu cNn ki. tra cng ph:c t*p th% cG php ca &iu th:c ch2nh 9u' c?ng cng ph:c
t*p. u2 )8 )r )ng ki. tra )K liu nh6p chJ ch:a sD ha' cF chiu )i tDi thiu8 nhng ki.
tra .t Q=L kh ph:c t*p. Lng ].^ lit k> .t sD &iu th:c ch2nh 9u' )eng ki. tra cc
kiu )K liu th4ng )ng.
Bfng 2'3 Mt s biu thc chnh quy thng dung
Yibu dl minu nhxs ?i `f Bibu `hcc chhnh yuy
|D
PhJ ch:a cc chK sD th6p ph<nT v2 )
58 ho!c 56838464.
d+
P<N
Ph:a _ chK sD th6p ph<n8
v2 ) 1234.
d{4}
"6t khxu Mn gin
Ph:a tQ a In b kB t=T v2 ) ghtd6f
ho!c b8chogh.
w{6,8}
|D thj t2n )ng
Ph:a )K liu phe h$p vi cu trGc
ca hNu hIt cc lo*i sD thj t2n )ng8
v2 ) 4921835221552042 ho!c 4921-
8352-2155-2042.
d{4}-d{4}-d{4}-
d{4}
72
Chng 2: Thao `c dl minu
lia chJ (z.ail
[w-]+ nghqa l ch:a .t
ho!c nhiu kB t= or)
ho!c )u g*ch ngang8 v2 )
some-body@adatum.com
[w-]+@([w- ]
+.)+[w-]+
;TTP ho!c ;TTP*
Q=L
UK liu l .t Q=L )=aztr>nz;TTP
ha' )=aztr>nz;TTP*8 v2 )
http://www.microsoft.com
https://([w- ]
+.)+[w-]+(/[w- ./
=])
"t khi S &iIt cG php ca &iu th:c ch2nh 9u'8 &*n t*o .t Di t$ng
System.Text.RegularExpression.Regex &5ng cch tru'n cho phMng th:c khCi )=ng ca nF
chu#i ch:a &iu th:c ch2nh 9u'. |au F8 g0i phMng th:c IsMatch ca Di t$ng Regex v
tru'n chu#i cNn ki. tra8 phMng th:c n' tr v .t gi tri lu6n lB cho &iIt chu#i cF h$p l
kh4ng. PG php ca &iu th:c ch2nh 9u' s@ chJ inh Regex so treng ton & chu#i ha' chJ so
treng .t phNn ca chu#i g;(. 8 A8 8 v z trong &ng ].]h
RhMng th:c ValidateInput )i <' .inh h0a cch ki. tra chu#i nh6p &5ng &iu th:c
ch2nh 9u'\
public static bool ValidateInput(string regex, string input) {
// Tao di tong Regex da trn biu thc chnh quy.
Regex r = new Regex(regex);
// Kim tra d liu nhp c trung vi biu thc chnh quy hay khng.
return r.IsMatch(input);
}
L*n cF th sO )ng Di t$ng Regex ki. tra nhiu chu#i8 nhng kh4ng th tha' si &iu
th:c ch2nh 9u' $c g/n cho nFT &*n phi t*o .t Di t$ng Regex .i tMng :ng vi .t
cu trGc .i. RhMng th:c ValidateInput C tr>n t*o ra .t Di t$ng Regex .i .#i lNn $c
g0i8 tha' vo F &*n cF th sO )ng phMng th:c tqnh n*p chtng IsMatch.
public static bool ValidateInput(string regex, string input) {
// Kim tra d liu nhp c trung vi biu thc chnh quy hay khng.
return Regex.IsMatch(input, regex);
}
6'
6' 0 d ng !i u th c ch7nh )uy # c !in d ch 0 d ng !i u th c ch7nh )uy # c !in d ch
#eA JwA B@RO Q>@tZ JSJ QSJ LIAB YCA >@qZ AAB Jbc ~AB hUAB s>@ JSJ F@tZ Q>~J
J>aA> Z] d>~J Qed LVWJ fg hUAB Q>VoAB vZ]CA(
73
Chng 2: Thao `c dl minu
3>@ s>@ QeX LK@ QVWAB $!stem.)ext.&egular0xpressions.&egex, >}] QHZ]GA Q>CO
Qr] J>A Compiled Q>ZIJ s@tZ Y@qQ sC $!stem.)ext.&egular0xpressions.
&egex(ptions Lt F@CA hMJ> F@tZ Q>~J J>aA> Z] Q>\A> Microsoft /nterme&iate
.ang%age iMS/.k(
7h(o .!c inh8 khi &*n t*o Di t$ng Regex8 .3u &iu th:c ch2nh 9u' )o &*n ;c inh trong
phMng th:c khCi )=ng $c &i>n )ich thnh .t )*ng trung gian gkh4ng phi &*<Lh. "#i
lNn &*n sO )ng Di t$ng Regex8 & th=c thi phi>n )ich )*ng trung gian n' v p )ng nF
ki. tra chu#i. ui cc &iu th:c ch2nh 9u' ph:c t*p $c sO )ng thng ;u'>n8 vic phi>n
)ich l!p l!p i l*i cF th g<' tc ng ;u l>n hiu nvng ca :ng )ng.
whi te' ch0n RegexOptions.Compiled $c chJ inh8 & th=c thi s@ &i>n )ich &iu th:c ch2nh
9u' thnh &*<L. &*<L n' $c g0i l .S ustzinzti.( gb<Th8 $c &i>n )ich thnh .S .'
ngu'>n sinh trong lNn th=c thi Nu ti>n8 giDng nh .S ass(.&l' th4ng thng. Liu th:c
ch2nh 9u' $c &i>n )ich c?ng $c sO )ng giDng nh Di t$ng Regex8 vic &i>n )ich chJ
giGp th=c thi nhanh hMn.
7u' nhi>n8 vic &i>n )ich &iu th:c ch2nh 9u' c?ng cF vi nh$c i.. 7rc ti>n8 tr%nh &i>n
)ich b<T phi l. vic nhiu hMn8 )3n In ch6. 9u tr%nh &i>n )ich8 !c &it khi t*o &iu th:c
ch2nh 9u' $c &i>n )ich khi :ng )ng khCi ng. 7h: hai8 &iu th:c ch2nh 9u' $c &i>n
)ich v3n ttn t*i trong & nh khi kh4ng ckn $c sO )ng nKa8 nF kh4ng &i & thu go. rc
g6ar4age CoDDe)/orh ;Fa i nh cc &iu th:c ch2nh 9u' th4ng thng. ueng nh &i chiI. chJ
$c gii phFng khi chMng tr%nh kIt thGc8 ho!c khi &*n gii phFng .in :ng )ng.
Ukng .S sau .inh h0a cch t*o .t Di t$ng Regex $c &i>n )ich thnh &*<L\
Regex reg = new Regex(@"[w-]+@([w-]+.)+[w-]+",
RegexOptions.Compiled);
Hgoi ra8 phMng th:c tqnh Regex.CompileToAssembly cho phXp &*n t*o .t &iu th:c ch2nh
9u' $c &i>n )ich v ghi nF vo .t ass(.&l' khc. Hghqa l &*n cF th t*o .t ass(.&l'
ch:a cc &iu th:c ch2nh 9u' sO )ng cho nhiu :ng )ng sau n'. l &i>n )ich .t &iu
th:c ch2nh 9u' v lu nF vo .t ass(.&l'8 th=c hin cc &c sau\
Z. 7*o .t .ng System.Text.RegularExpressions.RegexCompilationInfo ln
ch:a cc Di t$ng RegexCompilationInfo8 .#i Di t$ng :ng vi .t &iu th:c ch2nh
9u' cNn $c &i>n )ich.
]. 7*o .t Di t$ng RegexCompilationInfo cho .#i &iu th:c ch2nh 9u' v tru'n Di sD
cho phMng th:c khCi )=ng ;c inh cc thuc t2nh ca &iu th:c ch2nh 9u' n'.
Pc thuc t2nh th4ng )ng l\
IsPublic gi tri bool ;c inh lp &iu th:c ch2nh 9u' $c t*o ra cF tN. v=c
l c4ng khai ha' kh4ng.
Name .t String ;c inh t>n ca lp.
Namespace .t String ;c inh kh4ng gian t>n ca lp.
Pattern .t String ;c inh .3u . &iu th:c ch2nh 9u' s@ so treng g;(. chi
tiIt C .c ].`h.
Options .t gi tri thuc kiu lit k> System.Text.RegularExpressions.
RegexOptions ;c inh cc te' ch0n cho &iu th:c ch2nh 9u'.
74
Chng 2: Thao `c dl minu
^. 7*o .t Di t$ng System.Reflection.AssemblyName ;c inh t>n ca ass(.&l' .
phMng th:c Regex.CompileToAssembly s@ t*o ra.
_. p0i phMng th:c Regex.CompileToAssembly8 tru'n cc Di sD l .ng
RegexCompilationInfo v Di t$ng AssemblyName.
Yu tr%nh tr>n t*o ra .t ass(.&l' ch:a cc khai &o lp cho tQng &iu th:c ch2nh 9u' $c
&i>n )ich8 .#i lp )3n ;ut tQ Regex. l sO )ng .t &iu th:c ch2nh 9u' S $c &i>n )ich
trong ass(.&l'8 &*n cNn t*o Di t$ng &iu th:c ch2nh 9u' n' v g0i cc phMng th:c ca nF
giDng nh khi t*o nF vi phMng th:c khCi )=ng Regex &%nh thng. L*n nh th>. tha.
chiIu ti ass(.&l' khi sO )ng cc lp &iu th:c ch2nh 9u' n5. trong nF.
lo*n .S sau .inh h0a cch t*o .t ass(.&l' cF t>n l &y=ege2.ADD8 ch:a hai &iu th:c ch2nh
9u' cF t>n l PinRegex v CreditCardRegex\
using System.Text.RegularExpressions;
using System.Reflection;
public class CompiledRegexExample {
public static void Main() {
// Tao mang cha cc di tong RegexCompilationInfo.
RegexCompilationInfo[] regexInfo = new RegexCompilationInfo[2];
// Tao di tong RegexCompilationInfo cho PinRegex.
regexInfo[0] = new RegexCompilationInfo(@"d{4}",
RegexOptions.Compiled, "PinRegex", "", true);
// Tao di tong RegexCompilationInfo cho CreditCardRegex.
regexInfo[1] = new RegexCompilationInfo(
@"d{4}-d{4}-d{4}-d{4}",
RegexOptions.Compiled, "CreditCardRegex", "", true);
// Tao di tong AssemblyName d dnh ngha assembly.
AssemblyName assembly = new AssemblyName();
assembly.Name = "MyRegEx";
// Tao cc biu thc chnh quy doc bin dch.
Regex.CompileToAssembly(regexInfo, assembly);
75
Chng 2: Thao `c dl minu
}
}
7'
7' T o ngy v gi t chu i T o ngy v gi t chu i
#eA JwA QeX OIQ Q>t >@qA $!stem.-ate)ime OT QR B@o, AB\] LVWJ J> LMA> QHXAB
OIQ J>Zx@(
Sg hUAB d>V[AB Q>~J /arse >X_J /arse0xact Jbc YEd -ate)ime(
PF nhiu cch .4 t ng'8 giT v2 ) 18/ bune 200G8 1XYX200G8 YX1X200G8 1IbunI200G ceng chJ
.t ng'T 1YNGC v GNGC P& ceng chJ .t gi. yp DateTime cung cp phMng th:c tqnh
Parse rt linh ho*t8 cho phXp t*o th hin DateTime tQ nhiu cch .4 t khc nhau trong
chu#i.
RhMng th:c Parse rt .*nh trong vic t*o Di t$ng DateTime tQ .t chu#i cho trc. HF cF
th ;O lB .t chu#i chJ ch:a .t phNn th4ng tin ha' ch:a th4ng tin sai8 v tha' thI cc gi tri
thiIu &5ng cc gi tri .!c inh. Hg' .!c inh l ng' hin t*i8 gi .!c inh l 12N00N00
>&. HIu sau .0i cD g/ng8 Parse kh4ng th t*o Di t$ng DateTime8 nF s@ nX. ngo*i l
System.FormatException. u2 ) sau .inh h0a t2nh linh ho*t ca Parse\
// 01/09/2004 12:00:00 AM
DateTime dt1 = DateTime.Parse("Sep 2004");
// 05/09/2004 02:15:33 PM
DateTime dt2 = DateTime.Parse("Sun 5 September 2004 14:15:33");
// 05/09/2004 12:00:00 AM
DateTime dt3 = DateTime.Parse("5,9,04");
// 05/09/2004 02:15:33 PM
DateTime dt4 = DateTime.Parse("5/9/2004 14:15:33");
// 0/10/2004 02:15:00 PM (gia su ngy hin tai l 0/10/2004)
DateTime dt5 = DateTime.Parse("2:15 PM");
RhMng th:c Parse linh ho*t v cF th t= sOa l#i. 7u' nhi>n8 .:c linh ho*t n' kh4ng cNn
thiIt trong trng h$p &*n .uDn &o . cc chu#i phi th(o .t inh )*ng nht inh. whi
F8 sO )ng phMng th:c ParseExact tha' cho Parse. U*ng Mn gin nht ca ParseExact
nh6n &a Di sD\ chu#i ch:a ng' gi8 chu#i inh )*ng ;c inh cu trGc . chu#i ch:a ng'
gi phi tu<n th(o8 v .t tha. chiIu IFormatProvider cung cp th4ng tin !c the v &n ia.
HIu IFormatProvider l null8 th4ng tin v &n ia ca tiu tr%nh g/hreaAh hin hnh s@ $c
sO )ng.
HIu ng' gi trong chu#i ang ;Xt kh4ng Gng vi inh )*ng 9u' inh8 ParseExact s@ nX.
ngo*i l System.FormatException. Phu#i inh )*ng $c sO )ng tMng t= nh khi &*n chJ
76
Chng 2: Thao `c dl minu
inh chu#i *i )in cho .t Di t$ng DateTime. liu n' cF nghqa l &*n cF th sO )ng c
inh )*ng chuxn l3n inh )*ng te' &iIn. 7ha. kho phNn ti liu cho lp
System.Globalization.DateTimeFormatInfo trong ti liu .NET Framework *E' cF th4ng
tin N' v tt c cc kiu inh )*ng.
// Ch phn tch cc chui cha LongTimePattern.
DateTime dt6 = DateTime.ParseExact("2:13:30 PM",
"h:mm:ss tt", null);
// Ch phn tch cc chui cha RFC1123Pattern.
DateTime dt = DateTime.ParseExact(
"Sun, 05 Sep 2004 14:13:30 GMT",
"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'", null);
// Ch phn tch cc chui cha MonthDayPattern.
DateTime dt8 = DateTime.ParseExact("September 03",
"MMMM dd", null);
8'
8' C ng8 tr 8 so snh ngy gi C ng8 tr 8 so snh ngy gi
#eA JwA Q>nJ >@qA JSJ d>d QaA> fK >J J[ FRA >c] d>d fX fSA> QHCA AB\], B@o(
Sg hUAB JSJ JPZ QHJ -ate)ime D\ )ime$pan i>x QHW JSJ QXSA Qg fK >J D\ fX fSA>k(
"t Di t$ng DateTime .4 t .t thi i. ;c inh gch~ng h*n _\Z` "8 ng' ]Z thng d_
nv. Zcbdh8 trong khi Di t$ng TimeSpan .4 t .t khong thi gian gch~ng h*n ] gi8 ^`
phGth. L*n cF th cng8 trQ8 so snh cc Di t$ng TimeSpan v DateTime.
7h=c cht8 c DateTime v TimeSpan u sO )ng tick .4 t thi gianEZ tick &5ng Zdd
nanozgi<' g.t nanozgi<' &5ng .t phNn t gZd
zc
h gi<'h. TimeSpan lu khong thi gian ca
nF l sD tick &5ng khong thi gian F8 DateTime lu sD /")k S tr4i 9ua k tQ Z]\dd\dd khu'a
ng' Z thng Z nv. dddZ sau c4ng ngu'>n. Pch tiIp c6n n' v vic sO )ng ton tO n*p
chtng giGp DateTime v TimeSpan )r )ng h# tr$ cc phXp t2nh sD h0c v so snh. Lng ]._
tF. t/t cc ton tO . hai cu trGc n' h# tr$.
Bfng 2'4 Cc ton t doc cung cp bi ateTime v TimeSpan
Ton `g Tioz.san <a`zTioz
pn g=h
u% TimeSpan l .t cu trGc n>n
phXp gn tr v .t &n sao8
kh4ng phi .t tha. chiIu.
u% DateTime l .t cu trGc n>n
phXp gn tr v .t &n sao8 kh4ng
phi .t tha. chiIu.
77
Chng 2: Thao `c dl minu
Png g+h Png hai Di t$ng TimeSpan.
Png .t TimeSpan vo .t
DateTime.
7rQ g-h 7rQ hai Di t$ng TimeSpan.
7rQ .t DateTime cho .t
DateTime ho!c .t TimeSpan.
L5ng g==h
|o snh hai Di t$ng TimeSpan v
tr v true nIu &5ng nhau.
|o snh hai Di t$ng DateTime v
tr v true nIu &5ng nhau.
wh4ng &5ng
g!=h
|o snh hai Di t$ng TimeSpan v
tr v true nIu kh4ng &5ng nhau.
|o snh hai Di t$ng DateTime v
tr v true nIu kh4ng &5ng nhau.
yn hMn gh
{c inh .t Di t$ng TimeSpan
cF ln hMn .t Di t$ng
TimeSpan khc ha' kh4ng.
{c inh .t Di t$ng DateTime
cF ln hMn .t Di t$ng DateTime
khc ha' kh4ng.
yn ho!c &5ng
g=h
{c inh .t Di t$ng TimeSpan
cF ln hMn ho!c &5ng .t Di
t$ng TimeSpan khc ha' kh4ng.
{c inh .t Di t$ng DateTime
cF ln hMn ho!c &5ng .t Di
t$ng DateTime khc ha' kh4ng.
HhV hMn gh
{c inh .t Di t$ng TimeSpan
cF nhV hMn .t Di t$ng
TimeSpan khc ha' kh4ng.
{c inh .t Di t$ng DateTime
cF nhV hMn .t Di t$ng DateTime
khc ha' kh4ng.
HhV ho!c &5ng
g=h
{c inh .t Di t$ng TimeSpan
cF nhV hMn ho!c &5ng .t Di
t$ng TimeSpan khc ha' kh4ng.
{c inh .t Di t$ng DateTime
cF nhV hMn ho!c &5ng .t Di
t$ng DateTime khc ha' kh4ng.
. g-h
7r v .t gi tri o )u ca .t
TimeSpan.
wh4ng h# tr$.
UMng g+h 7r v ch2nh TimeSpan. wh4ng h# tr$.
Pu trGc DateTime c?ng hin th=c cc phMng th:c AddTicks8 AddMilliseconds8 AddSeconds8
AddMinutes8 AddHours8 AddDays8 AddMonths8 v AddYears. "#i phMng th:c n' cho phXp &*n
cng gho!c trQ &5ng cc gi tri <.h phNn tO thi gian th2ch h$p vi Di t$ng DateTime. Pc
phMng th:c n' v cc ton tO $c lit k> trong &ng ]._ kh4ng l. tha' si DateTime gDc
Etha' vo F chGng s@ t*o .t Di t$ng .i vi gi tri S $c tha' si. lo*n .S )i <'
tr%nh &' cch sO )ng cc ton tO thao tc cc cu trGc DateTime v TimeSpan\
// Tao mt TimeSpan m ta 2.5 ngy.
TimeSpan timespan1 = new TimeSpan(2,12,0,0);
// Tao mt TimeSpan m ta 4.5 ngy.
TimeSpan timespan2 = new TimeSpan(4,12,0,0);
// Tao mt TimeSpan m ta 1 tun.
TimeSpan oneWeek = timespan1 + timespan2;
// Tao mt DateTime vi ngy gi hin tai.
DateTime now = DateTime.Now;
78
Chng 2: Thao `c dl minu
// Tao mt DateTime m ta 1 tun trc dy.
DateTime past = now - oneWeek;
// Tao mt DateTime m ta 1 tun trong tng lai.
DateTime future = now + oneWeek;
9'
9' 0 % x % m t m ng ho c m t /rray9ist 0 % x % m t m ng ho c m t /rray9ist
#eA JwA f{d vjd JSJ d>wA Qg QHXAB OIQ ORAB >X_J OIQ #rra!+ist(
Sg hUAB d>V[AB Q>~J #rra!+ist.$ort Lt f{d vjd #rra!+ist D\ d>V[AB Q>~J QA>
#rra!.$ort Lt f{d vjd ORAB(
U*ng Mn gin nht ca Sort l s/p ;Ip cc Di t$ng n5. trong .t .ng ho!c ArrayList
khi cc Di t$ng n' cF hin th=c giao )in System.Icomparable v cF kiu giDng nhauEtt
c cc kiu )K liu cM &n u hin th=c Icomparable. lo*n .S )i <' .inh h0a cch sO
)ng phMng th:c Sort\
// Tao mt mang mi v thm phn tu vo.
int[] array = {4, 2, 9, 3};
// Sp xp mang.
Array.Sort(array);
// Hin th ni dung cua mang d doc sp xp.
foreach (int i in array) { Console.WriteLine(i);}
// Tao mt ArrayList mi v thm phn tu vo.
ArrayList list = new ArrayList(4);
list.Add("Phong");
list.Add("Phuong");
list.Add("Khoa");
list.Add("Tam");
// Sp xp ArrayList.
list.Sort();
// Hin th ni dung cua ArrayList d doc sp xp.
foreach (string s in list) { Console.WriteLine(s);}
79
Chng 2: Thao `c dl minu
l s/p ;Ip cc Di t$ng kh4ng hin th=c IComparable8 &*n cNn tru'n cho phMng th:c Sort
.t Di t$ng hin th=c giao )in System.Collections.IComparer. nin th=c ca IComparer
phi cF kh nvng so snh cc Di t$ng n5. trong .ng ho!c ArrayList g;(. .c Za.^
&iIt cch hin th=c IComparable v IComparerh.
10'
10' Ch:% m t t % h % vo m t m ng Ch:% m t t % h % vo m t m ng
#eA JwA J>d AI@ hZAB Jbc OIQ QNd >Wd D\X OIQ ORAB(
Sg hUAB d>V[AB Q>~J ECollection.Cop!)o iLVWJ >@qA Q>nJ F@ QPQ JR JSJ YEd QNd
>Wdk, >X_J fg hUAB d>V[AB Q>~J )o#rra! iLVWJ >@qA Q>nJ F@ JSJ QNd >Wd
#rra!+ist, $tac:, Hueuek(
Pc phMng th:c ICollection.CopyTo v ToArray cF ceng ch:c nvng8 chGng chXp cc phNn tO
trong .t t6p h$p vo .t .ng. |= khc &it n5. C ch# CopyTo chXp vo .t .ng S cF8
trong khi ToArray t*o ra .t .ng .i rti chXp vo F.
CopyTo nh6n hai Di sD\ .t .ng v .t chJ sD. "ng n' l 2ch ca 9u tr%nh sao chXp v
phi cF kiu tMng th2ch vi cc phNn tO ca t6p h$p. HIu kiu kh4ng tMng th2ch ha' kh4ng
cF s= chu'n si ngN. tQ kiu phNn tO ca t6p h$p sang kiu phNn tO ca .ng th% ngo*i l
System.InvalidCastException s@ &i nX.. PhJ sD l .t vi tr2 trong .ng . &/t Nu tQ F cc
phNn tO ca t6p h$p s@ $c chXp vo. HIu chJ sD n' ln hMn ho!c &5ng chiu )i ca .ng8
ho!c sD phNn tO ca t6p h$p v$t 9u s:c ch:a ca .ng th% ngo*i l
System.ArgumentException s@ &i nX.. lo*n .S sau .inh h0a cch sO )ng CopyTo chXp
ni )ung ca .t ArrayList vo .t .ng\
// Tao mt ArrayList mi v thm phn tu vo.
ArrayList list = new ArrayList(5);
list.Add("Phuong");
list.Add("Phong");
list.Add("Nam");
list.Add("Tam");
list.Add("Nhan");
// Tao mt string[] v su dng ICollection.CopyTo
// d chp ni dung cua ArrayList.
string[] array1 = new string[5];
list.CopyTo(array1,0);
Pc lp ArrayList8 Stack8 v ueue c?ng hin th=c phMng th:c ToArray8 phMng th:c n' t=
ng t*o .t .ng vi k2ch thc ch:a cc phNn tO ca ca t6p h$p. HIu &*n kh4ng
tru'n Di sD cho ToArray8 nF s@ tr v .t object[] &t chp kiu ca cc Di t$ng trong
t6p h$p. 7u' nhi>n8 &*n cF th tru'n .t Di t$ng System.Type chJ inh kiu ca .ng
gL*n phi Xp .ng kiu .*nh v Gng kiuh. u2 ) sau .inh h0a cch sO )ng ToArray cho
ArrayList C tr>n\
80
Chng 2: Thao `c dl minu
// Su dng ArrayList.ToArray d tao mt object[]
// tu ni dung cua tp hop.
object[] array2 = list.ToArray();
// Su dng ArrayList.ToArray d tao mt string[] kiu manh
// tu ni dung cua tp hop.
string[] array3 =
(string[])list.ToArray(System.Type.GetType("System.String"));
11'
11' T o m t t % h % "i u m nh T o m t t % h % "i u m nh
#eA JwA QeX OIQ QNd >Wd J> J>~c JSJ d>wA Qg Q>ZIJ OIQ s@tZ A>PQ LMA>(
TeX OIQ YEd hpA vZPQ Q YEd $!stem.Collections.Collection6ase >c]
$!stem.Collections.-ictionar!6ase, D\ >@qA Q>nJ JSJ d>V[AB Q>~J cA6QX\A6DG6
s@tZ6h?6Y@qZ it:pe?safek Lt Q>cX QSJ QHCA QNd >Wd(
Pc lp CollectionBase v DictionaryBase cF th Fng vai trk cc lp cM sC )3n ;ut ra
cc lp t6p h$p anztonzkiu . kh4ng phi hin th=c l*i cc giao )in chuxn\ IDictionary8
IList8 ICollection8 v IEnumerable.
CollectionBase )eng cho cc t6p h$p )=aztr>nzIlist gnh ArrayListh. 7h=c cht8
CollectionBase )u' tr% t6p h$p &5ng .t Di t$ng ArrayList chuxn8 cF th $c tru'
;ut th4ng 9ua thuc t2nh &o v List.
DictionaryBase )eng cho cc t6p h$p )=aztr>nzIDictionary gnh Hashtableh. 7h=c
cht8 DictionaryBase )u' tr% t6p h$p &5ng .t Di t$ng Hashtable chuxn8 cF th $c
tru' ;ut th4ng 9ua thuc t2nh &o v Dictionary.
lo*n .S sau hin th=c .t t6p h$p t>n .*nh g)=a tr>n lp CollectionBaseh th hin .t
)anh sch cc Di 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) {
81
Chng 2: Thao `c dl minu
this.List.Remove(value);
}
public AssemblyName this[int index] {
get {
return (AssemblyName)this.List[index];
}
set {
this.List[index] = value;
}
}
public bool Contains(AssemblyName value) {
return this.List.Contains(value);
}
public void Insert(int index, AssemblyName value) {
this.List.Insert(index, value);
}
}
P hai lp CollectionBase v DictionaryBase u hin th=c .t t6p cc phMng th:c $cz
&ozv cF tiIp Nu ngK On. Pc phMng th:c n' gch~ng h*n OnClear8 OnClearComplete8
OnGet8 OnGetComplete8h thng $c chXp 1 C cc lp )3n ;ut nh5. cho phXp &*n hin
th=c cc ch:c nvng te' &iIn cNn thiIt 9un lB t6p h$p kiu .*nh. Pc lp CollectionBase
v DictionaryBase s@ g0i phMng th:c phe h$p trc v sau khi vic chJnh sOa $c th=c
hin tr>n t6p h$p n5. )i th4ng 9ua thuc t2nh List ha' Dictionary.
12' 12' 9 u m t i t ng "h -tu n-t -h'a vo $ile 9 u m t i t ng "h -tu n-t -h'a vo $ile
#eA JwA YVZ OIQ LK@ QVWAB s>R6QZwA6Qn6>^c D\ JSJ QHeAB Q>S@ Jbc A^ D\X @Y, fcZ
L^ B@R@ QZwA Qn >^c s>@ JwA(
Sg hUAB OIQ formatter Lt QZwA Qn >^c LK@ QVWAB D\ B>@ A^ D\X OIQ
$!stem.E(."ile$tream( 3>@ JwA QHZ] vZPQ LK@ QVWAB, fg hUAB formatter JrAB s@tZ
Lt LJ h? Y@qZ LVWJ6QZwA6Qn6>^c Q @Y D\ B@R@ QZwA Qn >^c LK@ QVWAB( T>V D@qA
82
Chng 2: Thao `c dl minu
YEd .NET Framework JZAB JPd JSJ >@qA Q>nJ formatter fcZ L] Lt QZwA Qn >^c
LK@ QVWAB Q>X heAB A>M d>A >c] S3;,z
$!stem.&untime.$erialiIation."ormatters.6inar!.6inar!"ormatter
$!stem.&untime.$erialiIation."ormatters.$oap.$oap"ormatter
yp BinaryFormatter v SoapFormatter cF th $c sO )ng tuNn t= hFa .t Di t$ng
ca &t k kiu no $c g/n vi !c t2nh System.SerializableAttribute. BinaryFormatter
sinh ra .t str(a. )K liu nhi ph<n .4 t Di t$ng v tr*ng thi ca nF8 trong khi
SoapFormatter sinh ra .t ti liu *F>P.
P hai lp BinaryFormatter v SoapFormatter u hin th=c giao )in System.Runtime.
Serialization.IFormatter8 giao )in n' inh nghqa hai phMng th:c\ Serialize v
Deserialize.
Serialize nh6n .t tha. chiIu System.Object v .t tha. chiIu System.IO.Stream
l. Di sD8 tuNn t= hFa Object v ghi nF vo Stream.
Deserialize nh6n .t tha. chiIu Stream l. Di sD8 0c )K liu ca Di t$ng $cz
tuNnzt=zhFa tQ Stream8 v tr v .t tha. chiIu Object In Di t$ng $czgiiztuNnz
t=zhFa. L*n phi Xp tha. chiIu Object n' v kiu th2ch h$p.
l g0i cc phMng th:c Serialize v Deserialize ca lp BinaryFormatter8 .S lnh ca &*n
phi $c cp phNn tO SerializationFormatter ca lp System.Security.Permissions.
SecurityPermission.
l g0i cc phMng th:c Serialize v Deserialize ca lp SoapFormatter8 .S lnh ca &*n
phi $c cp 9u'n +tin tCng tu't Di- g?uDD /ru8/h v% ass(.&l' *y8/em.=un/"me.
*er"aD"Oa/"on.Forma//er8.*oaK.ADD glp SoapFormatter $c khai &o &>n trong ass(.&l' n'h
kh4ng cho phXp cc .S lnh chJ $cztinzc6'z.tzphNn gKar/"aDDy /ru8/eA )aDDerh sO )ng nF.
7ha. kho .c Z^.Z cF th>. th4ng tin v .S lnh $cztinzc6'z.tzphNn.
yp BinarySerializationExample )i <' .inh h0a cch sO )ng lp BinaryFormatter
tuNn t= hFa .t System.Collections.ArrayList ch:a )anh sch t>n ngi vo .t fil(. |au
F8 ArrayList $c gii tuNn t= hFa tQ fil( v ni )ung ca nF s@ $c hin thi trong cOa ss
Con8oDe.
using System.IO;
using System.Collections;
using System.Runtime.Serialization.Formatters.Binary;
public class BinarySerializationExample {
public static void Main() {

// Tao v cu hnh ArrayList d tun t ha.
ArrayList people = new ArrayList();
people.Add("Phuong");
83
Chng 2: Thao `c dl minu
people.Add("Phong");
people.Add("Nam");
// Tun t ha di tong ArrayList.
FileStream str = File.Create("people.bin");
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(str, people);
str.Close();

// Giai tun t ha di tong ArrayList.
str = File.OpenRead("people.bin");
bf = new BinaryFormatter();
people = (ArrayList)bf.Deserialize(str);
str.Close();

// Hin th ni dung cua di tong ArrayList
// d-doc-giai-tun-t-ha.
foreach (string s in people) {

System.Console.WriteLine(s);
}
}
}
L*n cF th sO )ng lp SoapFormatter th(o cch nh $c tr%nh &' trong lp
BinarySerializationExample C tr>n8 chJ cNn tha' .#i th hin ca lp BinaryFormatter &5ng
th hin ca lp SoapFormatter v tha' si chJ thi using nh6p kh4ng gian t>n
System.Runtime.Serialization.Formatters.Soap. Hgoi ra8 &*n cNn th>. .t tha. chiIu
In *y8/em.=un/"me.*er"aD"Oa/"on.Forma//er8.*oaK.ADD khi &i>n )ich .S. il(
*oaK*er"aD"Oa/"onE2amKDe.)8 trong qa PU 2nh k1. s@ tr%nh &' cch sO )ng lp
SoapFormatter.
n%nh ].Z v ].] )i <' .inh h0a hai kIt 9u khc nhau khi sO )ng lp BinaryFormatter v
SoapFormatter. n%nh ].Z tr%nh &' ni )ung ca fil( KeoKDe.4"n $c t*o ra khi sO )ng
BinaryFormatter8 h%nh ].] tr%nh &' ni )ung ca fil( KeoKDe.2mD $c t*o ra khi sO )ng
SoapFormatter.
84
Chng 2: Thao `c dl minu
0nh 2'1 Ni dung file people.bin
0nh 2'2 Ni dung file people.xml

85
Chng 2: Thao `c dl minu
3
86
Ch01n2 L4/I'N 7N* ,-N*M CN CHO 5HPN CHIOUM VQ
SI&U ,K LI(U
87
88
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
:c .*nh v t2nh linh ho*t ca &")ro8o?/ .NET Framework $c n<ng cao &Ci kh nvng
ki. tra v thao tc cc kiu v si>u )K liu lGc th=c thi. Pc .c trong chMng n' s@
tr%nh &' cc kh2a c*nh th4ng )ng ca .in :ng )ng gaKKD")a/"on Aoma"nh8 cM chI
phn chiIu gre?De)/"onh8 v si>u )K liu gme/aAa/ah8 &ao gt.\
|
7*o v h' cc .in :ng )ng g.c ^.Z v ^.ch.
y. vic vi cc kiu v cc Di t$ng khi sO )ng nhiu .in :ng )ng g.c ^.]8
^.^8 ^._8 v ^.bh.
y. vic vi th4ng tin Type g.c ^.Zd v ^.ZZh.
7*o ng cc Di t$ng v n*p ng cc ass(.&l' lGc th=c thi g.c ^.`8 ^.a8 ^.[8 v
^.Z]h.
7*o v ki. tra cc !c t2nh te' &iIn gcc .c ^.Z^ v ^.Z_h.
1' 1' T o mi n ng d ng T o mi n ng d ng
#eA JwA QeX OIQ O@GA ~AB hUAB OE@(
Sg hUAB d>V[AB Q>~J QA> Create-omain Jbc YEd $!stem.#pp-omain(
U*ng th:c Mn gin nht ca phMng th:c CreateDomain nh6n .t Di sD kiu string chJ inh
t>n th<n thin cho .in :ng )ng .i. Pc )*ng th:c khc cho phXp &*n chJ inh ch:ng c:
geB"Aen)eh v cc thiIt l6p cu h%nh cho .in :ng )ng .i. Ph:ng c: $c chJ inh &5ng Di
t$ng System.Security.Policy.EvidenceT .c Z^.ZZ tr%nh &' cc tc ng ca ch:ng c: khi
&*n t*o .t .in :ng )ng. Pc thiIt l6p cu h%nh $c chJ inh &5ng Di t$ng
System.AppDomainSetup.
yp AppDomainSetup ch:a cc th4ng tin cu h%nh cho .t .in :ng )ng. Lng ^.Z kit k>
cc thuc t2nh thng $c sO )ng nht ca lp AppDomainSetup khi t*o cc .in :ng )ng.
Pc thuc t2nh n' cF th $c tru' ;ut sau khi t*o th4ng 9ua cc thnh vi>n ca Di t$ng
AppDomain8 v .t sD cF th tha' si lGc th=c thiT &*n hS' tha. kho ti liu .NET
Framework *E' v lp AppDomain hiu chi tiIt hMn.
Bfng 3'1 Cc thuc tnh thng dung ca lp AppomainSetup
Thuc `hnh ?i `f
ApplicationBase
7h .c . C=L s@ ;Xt trong 9u tr%nh )k t%. cc ass(.&l'
ri>ng. w thu6t )k t%. gKro4"ngh s@ $c tho lu6n trong .c
^.`. 7h=c tI8 ApplicationBase l th .c gDc cho :ng )ng
ang th=c thi. 7h(o .!c inh8 <' l th .c ch:a ass(.&l'.
PF th 0c $c thuc t2nh n' sau khi t*o .in :ng )ng
&5ng thuc t2nh AppDomain.BaseDirectory.
89
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
ConfigurationFile
7>n ca fil( cu h%nh8 $c sO )ng &Ci .S S $c n*p vo
.in :ng )ng. PF th 0c $c thuc t2nh n' sau khi t*o
.in :ng )ng &5ng phMng th:c AppDomain.GetData vi
khFa APP_CONFIG_FILE.
DisallowPublisherPolicy
Yu' inh phNn Ku4D"8her KoD")y ca fil( cu h%nh :ng )ng
cF $c ;Xt In ha' kh4ng khi ;c inh phi>n &n ca .t
ass(.&l' t>n .*nh nDi kIt. Pu4D"8her KoD")y s@ $c tho
lu6n trong .c ^.`.
PrivateBinPath
Uanh sch cc th .c cch nhau &Ci )u ch. phx' . &
th=c thi s@ sO )ng khi )k t%. cc ass(.&l' ri>ng. Pc th
.c n' cF vi tr2 tMng Di so vi th .c $c chJ inh
trong ApplicationBase. PF th 0c $c thuc t2nh n' sau
khi t*o .in :ng )ng &5ng thuc t2nh
AppDomain.RelativeSearchPath. PF th tha' si thuc t2nh
n' lGc th=c thi &5ng phMng th:c AppendPrivatePath v
ClearPrivatePath.
u2 ) )i <' tr%nh &' cch t*o v cu h%nh .t .in :ng )ng\
// Khoi tao mt di tong cua lp AppDomainSetup.
AppDomainSetup setupInfo = new AppDomainSetup();
// Cu hnh cc thng tin ci dat cho min ng dng.
setupInfo.ApplicationBase = @"C:MyRootDirectory";
setupInfo.ConfigurationFile = "MyApp.config";
setupInfo.PrivateBinPath = "bin;plugins;external";
// Tao mt min ng dng mi (truyn null lm di s chng c).
// Nh lu mt tham chiu dn AppDomain mi v n
// khng th doc thu ly theo bt k cch no khc.
AppDomain newDomain = AppDomain.CreateDomain(
"My New AppDomain",
new System.Security.Policy.Evidence(),
setupInfo);
#eA d>R@ hZ] QHl OIQ Q>cO J>@jZ LjA LK@ QVWAB #pp-omain Dc QeX F@ Dl s>TAB
J^ J[ J>j A\X Lt Y@qQ sC JSJ O@GA ~AB hUAB >@qA J^ Q FCA QHXAB O} LVWJ6ZRA6
Y(
90
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
2'
2' Chuy n cc i t ng )ua l i cc mi n ng d ng Chuy n cc i t ng )ua l i cc mi n ng d ng
#eA JwA J>Z]tA JSJ LK@ QVWAB Zc Ye@ B@?c JSJ O@GA ~AB hUAB A>V JSJ LK@ fK >c]
JSJ B@S QHM QHR DG(
Sg hUAB JSJ LK@ QVWAB marshal?9:?"al%e >c] marshal?9:?reference(
n thDng .NET =emo/"ng gs@ $c tho lu6n trong chMng Z]h giGp vic gCi cc Di t$ng 9ua
-NET =emo/"ng8 kIt
9u cF th rt khc so vi .ong $i. 7h=c ra8 vn g<' khF khvn khi )eng nhiu .in :ng
)ng l s= tMng tc vi .NET =emo/"ng v cch th:c lu<n chu'n Di t$ng 9ua cc .in
:ng )ng.
7t c cc kiu )K liu cF th chia thnh &a lo*i\ nonremo/a4De8 mar8haDI4yIBaDue g&$Vh8 v
mar8haDI4yIre?eren)e g&$=h. wiu nonremo/a4De kh4ng th v$t 9ua &i>n .in :ng )ng v
kh4ng th )eng l. cc Di sD ha' cc gi tri tr v ca cc li g0i trong .4i trng li>n .in
:ng )ng. wiu nonremo/a4De s@ $c tho lu6n trong .c ^._.
wiu &$V l kiu khztuNnzt=zhFa. whi .t Di t$ng kiu &$V $c chu'n 9ua .t .in
:ng )ng khc nh l Di sD ha' gi tri tr v8 h thDng .NET =emo/"ng s@ tuNn t= hFa tr*ng
thi hin t*i ca Di t$ng8 chu'n )K liu F sang .in :ng )ng 2ch8 v t*o .t &n sao
ca Di t$ng vi ceng tr*ng thi nh Di t$ng gDc. wIt 9u l ttn t*i &n sao ca Di t$ng
C c hai .in :ng )ng. nai Di t$ng n' &an Nu giDng nhau hon ton8 nhng c l6p
nhau8 n>n vic tha' si Di t$ng n' kh4ng nh hCng In Di t$ng kia. Ui <' l v2 )
.t kiu khztuNnzt=zhFa cF t>n l Employee8 $c chu'n 9ua .t .in :ng )ng khc &5ng
tri g;(. .c Za.Z &iIt cch t*o kiu khztuNnzt=zhFah.
[System.Serializable]
public class Employee {

// Hin thc cc thnh vin o dy.

}
wiu &$= l lp )3n ;ut tQ lp System.MarshalByRefObject. whi .t Di t$ng kiu &$=
$c chu'n 9ua .t .in :ng )ng khc nh Di sD ha' gi tri tr v8 h thDng .NET
=emo/"ng s@ t*o .t Di t$ng pro;' cho Di t$ng &$V cNn chu'n trong .in :ng )ng
2ch. lDi t$ng *i )in th=c hin cc hnh vi hon ton giDng vi Di t$ng &$= . nF *i
)in. 7h=c ra8 khi th=c hin .t hnh vi tr>n Di t$ng *i )in8 h thDng .NET =emo/"ng
th=c hin ngN. vic chu'n li g0i v cc Di sD cNn thiIt In .in :ng )ng ngutn8 v t*i
F th=c hin li g0i h. tr>n Di t$ng &$= gDc. wIt 9u $c tr v th4ng 9ua Di t$ng
*i )in. Ui <' l .t phi>n &n khc ca lp Employee8 $c chu'n 9ua .t .in :ng
)ng khc &5ng tha. chiIu tha' v% &5ng tri g;(. .c Z].[ &iIt chi tiIt v cch t*o kiu
&$=h.
public class Employee : System.MarshalByRefObject {
91
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
// Hin thc cc thnh vin o dy.

}
3' 3' Trnh n % cc assem!ly "h,ng c n thi t vo mi n ng d ng Trnh n % cc assem!ly "h,ng c n thi t vo mi n ng d ng
#eA JwA J>Z]tA OIQ Q>cO J>@jZ LK@ QVWAB Zc Ye@ B@?c JSJ O@GA ~AB hUAB s>SJ
A>cZ QZ] A>@CA, FeA s>TAB OZKA C.> Aed f@CZ h? Y@qZ OT QR s@tZ Jbc LK@
QVWAB D\X JSJ O@GA ~AB hUAB QHZAB B@cA(
!^AB B^@ Q>cO J>@jZ LK@ QVWAB QHXAB OIQ $!stem.&untime.&emoting.(bJectHandle
D\ s>@ JwA QHZ] vZPQ LK@ QVWAB Q>l s>T@ d>UJ Ye@(
whi &*n tru'n .t Di t$ng mar8haDI4yIBaDue g&$Vh 9ua cc .in :ng )ng8 & th=c thi s@
t*o .t th hin .i ca Di t$ng n' trong .in :ng )ng 2ch. liu n' cF nghqa l &
th=c thi phi n*p ass(.&l' ch:a si>u )K liu .4 t kiu ca Di t$ng vo cc .in :ng )ng.
Uo F8 vic tru'n cc tha. chiIu &$V 9ua cc .in :ng )ng trung gian s@ )3n In vic &
th=c thi n*p cc ass(.&l' kh4ng cNn thiIt vo cc .in :ng )ng n'. "t khi S $c n*p
th% cc ass(.&l' thQa n' s@ kh4ng $c gii phFng khVi .in :ng )ng nIu kh4ng gii
phFng c .in :ng )ng ch:a chGng g;(. .c ^.ch.
yp ObjectHandle cho phXp &*n Fng gFi tha. chiIu Di t$ng tru'n 9ua cc .in :ng
)ng . & th=c thi kh4ng phi n*p th>. ass(.&l'. whi Di t$ng n' In .in :ng )ng
2ch8 &*n cF th kh4i phc tha. chiIu Di t$ng8 & th=c thi s@ n*p cc ass(.&l' cNn thiIt v
cho phXp &*n tru' ;ut In Di t$ng nh &%nh thng. l Fng gFi .t Di t$ng gv2 )
System.Data.DataSeth8 &*n cF th th=c hin nh sau\
// Tao mt DataSet mi.
System.Data.DataSet data1 = new System.Data.DataSet();
// Cu hnh/thm d liu cho DataSet.

// ng gi DataSet.
System.Runtime.Remoting.ObjectHandle objHandle =
new System.Runtime.Remoting.ObjectHandle(data1);
l kh4i phc .t Di t$ng8 sO )ng phMng th:c ObjectHandle.Unwrap v Xp kiu tr v cho
phe h$p8 v2 )\
// Khi phc DataSet tu ObjectHandle.
System.Data.DataSet data2 =
(System.Data.DataSet)objHandle.Unwrap();
92
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
4'
4' T o "i u "h,ng th v t )ua !in mi n ng d ng T o "i u "h,ng th v t )ua !in mi n ng d ng
#eA JwA QeX OIQ s@tZ h? Y@qZ fcX J>X JSJ Q>t >@qA Jbc s@tZ A\] s>TAB Q>t LVWJ
QHZ] vZPQ Q O} YqA> JSJ O@GA ~AB hUAB s>SJ(
P>R@ J>{J J>{A s@tZ h? Y@qZ Q>ZIJ heAB nonremota9le, Q~J Y\ s>TAB Q>t QZwA Qn
>^c JAB A>V s>TAB hpA vZPQ Q YEd Mars.al6!&e*(bJect(
l4i khi &*n .uDn kiu )K liu no F chJ $c gii h*n tru' ;ut trong ph*. vi ca .in :ng
)ng. l t*o kiu )K liu )*ng nonremo/a4De8 phi ch/c r5ng kiu n' kh4ng phi l khz
tuNnzt=zhFa v c?ng kh4ng )3n ;ut gtr=c tiIp ha' gin tiIph tQ lp MarshalByRefObject.
HhKng iu kin n' s@ . &o r5ng tr*ng thi ca Di t$ng kh4ng th $c tru' ;ut tQ
cc .in :ng )ng khc gcc Di t$ng n' kh4ng th $c sO )ng l. Di sD ha' gi tri tr
v trong cc li g0i phMng th:c li>n .in :ng )ngh.
liu kin kiu )K liu kh4ng phi l khztuNnzt=zhFa $c th=c hin )r )ng )o .t lp
kh4ng thQa kI kh nvng tuNn t= hFa tQ lp cha ca nF. l &o . .t kiu kh4ng phi l
khztuNnzt=zhFa8 &*n phi ch/c ch/n r5ng !c t2nh System.SerializableAttribute kh4ng
$c p )ng khi khai &o kiu.
L*n cNn lu B khi . &o .t lp kh4ng $c tru'n &5ng tha. chiIu. Hhiu lp trong th
vin lp .NET )3n ;ut tr=c tiIp ha' gin tiIp tQ MarshalByRefObjectT &*n phi cxn th6n
kh4ng )3n ;ut lp ca &*n tQ cc lp n'. HhKng lp cM sC th4ng )ng )3n ;ut tQ
MarshalByRefObject &ao gt.\ System.ComponentModel.Component8 System.IO.Stream8
System.IO.TextReader8 System.IO.TextWriter8 System.NET.WebRequest8 v System.Net.
WebResponse g;(. ti liu .NET Framework *E' cF )anh sch cc lp )3n ;ut tQ
MarshalByRefObjecth.
5'
5' N % assem!ly vo mi n ng d ng hi n hnh N % assem!ly vo mi n ng d ng hi n hnh
#eA JwA Aed OIQ cffOFY] D\X O@GA ~AB hUAB YJ Q>nJ Q>@(
Sg hUAB d>V[AB Q>~J QA> +oad >c] +oad"rom Jbc YEd
$!stem.&e*lection.#ssembl!(
L th=c thi t= ng n*p cc ass(.&l' . ass(.&l' ca &*n tha. chiIu In lGc &i>n )ich. 7u'
nhi>n8 &*n c?ng cF th chJ thi cho & th=c thi n*p ass(.&l'. Pc phMng th:c Load v
LoadFrom u th=c hin .t c4ng vic l n*p .t ass(.&l' vo .in :ng )ng hin hnh8 v
c hai u tr v .t Di t$ng Assembly .4 t ass(.&l' vQa $c n*p. |= khc &it giKa hai
phMng th:c l )anh sch cc Di sD $c cung cp nh6n )*ng ass(.&l' cNn n*p8 v cch
th:c & th=c thi inh vi ass(.&l' n'.
RhMng th:c Load cung cp nhiu )*ng th:c cho phXp chJ inh ass(.&l' cNn n*p8 &*n cF th
sO )ng .t trong nhKng )*ng sau\
"t string ch:a t>n N' ha' t>n nh6n )*ng ass(.&l'.
93
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
"t System.Reflection.AssemblyName .4 t chi tiIt v ass(.&l'.
"t .ng &'t( ch:a )K liu ass(.&l'.
7h4ng thng8 t>n ca ass(.&l' $c sO )ng n*p ass(.&l'. 7>n N' ca .t
ass(.&l' &ao gt.\ t>n8 phi>n &n8 8 v tok(n khFa c4ng khai8 $c ph<n cch &Ci )u
phx' gv2 )\ System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=
ba5c561934e089h. l chJ inh .t ass(.&l' kh4ng cF t>n .*nh8 sO )ng
PublicKeyToken=null. L*n c?ng cF th sO )ng t>n ng/n nh6n )*ng .t ass(.&l' nhng 2t
nht phi cung cp t>n ca ass(.&l' gkh4ng cF phNn .C rngh. lo*n .S )i <' tr%nh &'
cc cch sO )ng phMng th:c Load\
// Nap assembly System.Data dung tn dy du.
string name1 = "System.Data,Version=1.0.5000.0," +
"Culture=neutral,PublicKeyToken=ba5c561934e089";
Assembly a1 = Assembly.Load(name1);
// Nap assembly System.Xml dung 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[] {0xb,0xa,0x5c,0x56,0x19,0x34,0xe0,0x89});
Assembly a2 = Assembly.Load(name2);
// Nap assembly SomeAssembly dung tn ngn.
Assembly a3 = Assembly.Load("SomeAssembly");
whi phMng th:c Load $c g0i8 & th=c thi th=c hin 9u tr%nh inh vi v n*p ass(.&l'. Ui
<' s@ tF. t/t 9u tr%nh n'T &*n tha. kho ti liu .NET Framework *E' &iIt th>. chi
tiIt.
Z. HIu &*n chJ inh ass(.&l' t>n .*nh8 phMng th:c Load s@ p )ng Ber8"on KoD")y
gch2nh sch phi>n &nh v Ku4D"8her KoD")y gch2nh sch nh pht hnhh
Ver8"on KoD")y $c
chJ inh trong fil( cu h%nh .' t2nh ha' :ng )ng ca &*n &5ng phNn tO
bindingRedirect. Pu4D"8her KoD")y $c chJ inh trong cc $c
ci !t &>n trong 6>C g6Do4aD >88em4Dy Ca)heh.
]. "t khi S ;c inh Gng phi>n &n ca ass(.&l' cNn sO )ng8 & th=c thi s@ cD g/ng
n*p cc ass(.&l' t>n .*nh tQ 6>C.
^. HIu ass(.&l' kh4ng cF t>n .*nh ho!c kh4ng $c t%. th' trong 6>C8 & th=c thi s@
t%. phNn tO codeBase trong cc fil( cu h%nh .' t2nh v :ng )ng. RhNn tO
codeBase nh ;* t>n ca ass(.&l' thnh .t fil( ha' .t Q=L. HIu ass(.&l' cF t>n
.*nh8 codeBase cF th chJ In &t k vi tr2 no k c cc Q=L )=aztr>nznt(rn(tT nIu
94
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
kh4ng8 codeBase phi chJ In .t th .c - tMng Di so vi th .c :ng
)ng. HIu ass(.&l' kh4ng ttn t*i trong vi tr2 $c chJ inh8 phMng th:c Load s@ nX.
ngo*i l System.IO.FileNotFoundException.
_. HIu kh4ng cF phNn tO codeBase tMng :ng vi ass(.&l'8 & th=c thi s@ t%. ass(.&l'
&5ng k thu6t Kro4"ng. Yu tr%nh Kro4"ng s@ t%. fil( Nu ti>n cF t>n ca ass(.&l' gvi
phNn .C rng l .ADD ha' .e2eh trong cc vi tr2\
7h .c gDc ca :ng )ng.
Pc th .c th .c gDc phe h$p vi t>n v ca ass(.&l'.

RhMng th:c Load l cch )r nht t%. v n*p cc ass(.&l'8 nhng c?ng cF th tDn nhiu
chi ph2 cho vic )k trong nhiu th .c t%. cc ass(.&l' cF t>n 'Iu. RhMng th:c
LoadFrom cho phXp &*n n*p ass(.&l' tQ .t vi tr2 ;c inh8 nIu kh4ng t%. th' nF s@ nX.
ngo*i l FileNotFoundException. L th=c thi s@ kh4ng cD t%. ass(.&l' nh phMng th:c Load
EphMng th:c LoadFrom kh4ng h# tr$ 6>C8 KoD")y8 phNn tO codeBase ha' Kro4"ng. Ui
<' l o*n .S tr%nh &' cch sO )ng LoadFrom n*p )NH8hareAH&y*hareA>88em4Dy.ADD. yu
B r5ng8 khc vi Load8 LoadFrom '>u cNu &*n chJ inh phNn .C rng ca fil( ass(.&l'.
// Nap assembly c tn l c:sharedMySharedAssembly.dll
Assembly a4 = Assembly.LoadFrom(@"c:sharedMySharedAssembly.dll");
6' 6' Th c thi assem!ly mi n ng d ng "hc Th c thi assem!ly mi n ng d ng "hc
#eA JwA Q>nJ Q>@ OIQ cffOFY] OIQ O@GA ~AB hUAB s>SJ O@GA ~AB hUAB
>@qA >\A>(
G@ d>V[AB Q>~J 0xecute#ssembl! Jbc LK@ QVWAB #pp-omain O@GA
~AB hUAB, D\ J> LMA> QCA Jbc cffOFY] JwA Q>nJ Q>@(
HIu &*n cF .t ass(.&l' khzth=czthi v .uDn n*p th=c thi nF trong .t .in :ng )ng8
phMng th:c ExecuteAssembly s@ giGp &*n. RhMng th:c ExecuteAssembly cF &Dn )*ng th:c
khc nhau. U*ng th:c Mn gin nht chJ nh6n vo .t kiu string ch:a t>n ca ass(.&l' cNn
th=c thiT &*n cF th chJ inh .t fil( cc & ha' .t Q=L. "t )*ng th:c khc cho phXp &*n
chJ inh ch:ng c: geB"Aen)eh cho ass(.&l' g;(. .c Z^.Zdh v cc Di sD tru'n In i.
nh6p ca ass(.&l' gtMng Mng vi cc Di sD )kng lnhh.
RhMng th:c ExecuteAssembly n*p ass(.&l' $c chJ inh v th=c thi phMng th:c $c inh
nghqa trong si>u )K liu l i. nh6p ca ass(.&l' gthng l phMng th:c Mainh. HIu
ass(.&l' $c chJ inh kh4ng cF kh nvng th=c thi8 ExecuteAssembly s@ nX. ngo*i l
System.Runtime.InteropServices.COMException. L th=c thi kh4ng th=c thi ass(.&l' trong
.t tiu tr%nh .i8 v% thI 9u'n ki. sot s@ kh4ng tr v cho In khi 9u tr%nh th=c thi ca
ass(.&l' kIt thGc. Uo ExecuteAssembly n*p .t ass(.&l' &5ng t>n gchJ cF t>n
fil(h8 CL= s@ kh4ng )eng 6>C ha' Kro4"ng t%. ass(.&l' g;(. .c ^.` &iIt th>. chi
tiIth.
95
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
u2 ) )i <' tr%nh &' cch sO )ng phMng th:c ExecuteAssembly n*p v th=c thi .t
ass(.&l'. yp ExecuteAssemblyExample t*o .t AppDomain v th=c thi ch2nh nF trong
AppDomain &5ng phMng th:c ExecuteAssembly. wIt 9u l cF hai &n sao ca
ExecuteAssemblyExample $c n*p vo hai .in :ng )ng khc nhau.
using System;
public class ExecuteAssemblyExample {
public static void Main(string[] args) {
// Nu assembly dang thc thi trong mt AppDomain
// c tn thn thin l "NewAppDomain"
// th khng tao AppDomain mi. iu ny s
// trnh mt vng lap v tn tao AppDomain.
if (AppDomain.CurrentDomain.FriendlyName != "NewAppDomain") {
// Tao min ng dng mi c tn l "NewAppDomain".
AppDomain domain = AppDomain.CreateDomain("NewAppDomain");
// Thc thi assembly ny trong AppDomain mi v
// truyn mang cc di s dng lnh.
domain.ExecuteAssembly("ExecuteAssemblyExample.exe",
null, args);
}
// Hin th cc di s dng lnh ln mn hnh
// cung vi tn thn thin cua AppDomain.
foreach (string s in args) {
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName +
" : " + s);
}
}
}
7'
7' Th hi n h'a m t "i u trong mi n ng d ng "hc Th hi n h'a m t "i u trong mi n ng d ng "hc
#eA JwA Q>t >@qA >^c OIQ s@tZ QHXAB OIQ O@GA ~AB hUAB s>SJ O@GA ~AB
hUAB >@qA >\A>(
96
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
G@ d>V[AB Q>~J CreateEnstance >c] CreateEnstance"rom Jbc LK@ QVWAB
#pp-omain O@GA ~AB hUAB LaJ>(
uic sO )ng phMng th:c ExecuteAssembly gS $c tho lu6n trong .c ^.ah kh4ng .'
khF khvnT nhng khi pht trin cc :ng )ng ph:c t*p cF sO )ng nhiu .in :ng )ng8 ch/c
ch/n &*n .uDn ki. sot 9u tr%nh n*p cc ass(.&l'8 t*o cc kiu )K liu8 v triu g0i cc
thnh vi>n ca Di t$ng &>n trong .in :ng )ng.
Pc phMng th:c CreateInstance v CreateInstanceFrom cung cp nhiu phi>n &n n*p
chtng giGp &*n ki. sot 9u tr%nh t*o Di t$ng. Pc phi>n &n Mn gin nht sO )ng
phMng th:c khCi )=ng .!c inh ca kiu8 nhng c hai phMng th:c n' u thiIt !t cc
phi>n &n cho phXp &*n cung cp Di sD sO )ng &t k phMng th:c khCi )=ng no.
RhMng th:c CreateInstance n*p .t ass(.&l' cF t>n ;c inh vo .in :ng )ng &5ng 9u
tr%nh S $c .4 t cho phMng th:c Assembly.Load trong .c ^.`. |au F8 CreateInstance
t*o Di t$ng cho kiu v tr v .t tha. chiIu In Di t$ng .i $c Fng gFi trong
ObjectHandle g$c .4 t trong .c ^.^h. 7Mng t= nh thI Di vi phMng th:c
CreateInstanceFromT tu' nhi>n8 CreateInstanceFrom n*p ass(.&l' vo .in :ng )ng &5ng
9u tr%nh S $c .4 t cho phMng th:c Assembly.LoadFrom trong .c ^.`.
#pp-omain JAB JZAB JPd >c@ d>V[AB Q>~J HPQ Q@qA YW@ J^ QCA Y\
CreateEnstance#ndUn%rap D\ CreateEnstance"rom#ndUn%rap, J>AB fm Qn LIAB s>T@
d>UJ Q>cO J>@jZ LjA LK@ QVWAB L} LVWJ QeX Q LK@ QVWAB (bJectHandle FeA d>R@
d LK@ QVWAB QHR DG J>X LAB s@tZ QHVEJ s>@ fg hUAB(
HIu &*n sO )ng CreateInstance ha' CreateInstanceFrom t*o Di t$ng kiu &$V trong
.t .in :ng )ng khc8 Di t$ng s@ $c t*o nhng tha. chiIu tr v s@ kh4ng chJ In Di
t$ng F. Uo cch th:c Di t$ng &$V v$t 9ua &i>n .in :ng )ng8 tha. chiIu n' s@ chJ
In .t &n sao ca Di t$ng $c t*o t= ng trong .in :ng )ng cc &. PhJ khi &*n t*o
.t kiu &$= th% tha. chiIu tr v .i chJ In Di t$ng trong .in :ng )ng khc g;(.
.c ^.] &iIt th>. chi tiIt v kiu &$V v &$=h.
w thu6t chung Mn gin hFa vic 9un lB cc .in :ng )ng l sO )ng lp iu khin
g)on/roDDer )Da88h. "t lp iu khin l .t kiu &$= te' &iIn. L*n hS' t*o .t .in :ng
)ng rti t*o Di t$ng lp iu khin trong .in :ng )ng n' &5ng phMng th:c
CreateInstance. yp iu khin hin th=c cc ch:c nvng cNn thiIt cho :ng )ng thao tc
.in :ng )ng v cc ni )ung ca nF. Pc ch:c nvng n' cF th &ao gt.\ n*p ass(.&l'8 t*o
th>. .in :ng )ng8 )0n )p trc khi ;Fa .in :ng )ng8 ha' lit k> cc phNn tO chMng
tr%nh g&*n kh4ng th th=c hin C &>n ngoi .in :ng )ngh.
u2 ) )i <' tr%nh &' cch sO )ng .t lp iu khin cF t>n l PluginManager. whi S
$c t*o trong .t .in :ng )ng8 PluginManager cho phXp &*n t*o Di t$ng ca cc lp cF
hin th=c giao )in IPlugin8 ch*' v )Qng cc plugzin F8 v tr v )anh sch cc plugzin hin
$c n*p.
using System;
using System.Reflection;
97
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
using System.Collections;
using System.Collections.Specialized;
// Giao din chung cho tt ca cc plug-in.
public interface IPlugin {
void Start();
void Stop();
}
// Mt hin thc dn gian cho giao din Iplugin
// d minh hoa lp diu khin PluginManager.
public class SimplePlugin : IPlugin {
public void Start() {
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName +
": SimplePlugin starting...");
}
public void Stop() {
98
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName +
": SimplePlugin stopping...");
}
}
// Lp diu khin, quan l vic nap v thao tc
// cc plug-in trong min ng dng cua n.
public class PluginManager : MarshalByRefObject {
// ListDictionary gi tham chiu dn cc plug-in.
private ListDictionary plugins = new ListDictionary();
// Phng thc khoi dng mac dnh.
public PluginManager() {}
// Phng thc khoi dng nhn danh sch cc plug-in.
public PluginManager(ListDictionary pluginList) {
// Nap cc plug-in d doc ch dnh.
foreach (string plugin in pluginList.Keys) {
this.LoadPlugin((string)pluginList[plugin], plugin);
}
}
// Nap assembly v tao plug-in doc ch dnh.
public bool LoadPlugin(string assemblyName, string pluginName) {
try {
// Nap assembly.
Assembly assembly = Assembly.Load(assemblyName);
// Tao plug-in mi.
IPlugin plugin =
99
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
(IPlugin)assembly.CreateInstance(pluginName, true);
if (plugin != null) {
// Thm plug-in mi vo ListDictionary.
plugins[pluginName] = plugin;
return true;
} else {
return false;
}
} catch {
return false;
}
}
public void StartPlugin(string plugin) {
// Ly mt plug-in tu ListDictionary v
// goi phng thc Start.
((IPlugin)plugins[plugin]).Start();
}
100
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
public void StopPlugin(string plugin) {
// Ly mt plug-in tu ListDictionary v
// goi phng thc Stop.
((IPlugin)plugins[plugin]).Stop();
}
public ArrayList GetPluginList() {
// Tra v danh sch cc plug-in.
return new ArrayList(plugins.Keys);
}
}
public class CreateInstanceExample {
public static void Main() {
// Tao mt min ng dng mi.
AppDomain domain1 = AppDomain.CreateDomain("NewAppDomain1");
// Tao mt PluginManager trong min ng dng mi
// bng phng thc khoi dng mac dnh.
PluginManager manager1 =
(PluginManager)domain1.CreateInstanceAndUnwrap(
"CreateInstanceExample", "PluginManager");
// Nap mt plug-in mi vo NewAppDomain1.
manager1.LoadPlugin("CreateInstanceExample", "SimplePlugin");
// Chay v dung plug-in trong NewAppDomain1.
manager1.StartPlugin("SimplePlugin");
manager1.StopPlugin("SimplePlugin");
// Tao mt min ng dng mi.
AppDomain domain2 = AppDomain.CreateDomain("NewAppDomain2");
101
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
// Tao mt ListDictionary cha cc plug-in.
ListDictionary pluginList = new ListDictionary();
pluginList["SimplePlugin"] = "CreateInstanceExample";
// Tao mt PluginManager trong min ng dng mi
// v ch dnh danh sch cc plug-in.
PluginManager manager2 =
(PluginManager)domain1.CreateInstanceAndUnwrap(
"CreateInstanceExample", "PluginManager", true, 0,
null, new object[] {pluginList}, null, null, null);
// Hin th cc plug-in d doc nap vo NewAppDomain2.
Console.WriteLine("Plugins in NewAppDomain2:");
foreach (string s in manager2.GetPluginList()) {
Console.WriteLine(" - " + s);
}
// Nhn Enter d thot.
Console.ReadLine();
}
}
8'
8' Truy n d li u gi a cc mi n ng d ng Truy n d li u gi a cc mi n ng d ng
#eA JwA OIQ J[ J>j L[A B@RA Lt QHZ]GA h? Y@qZ QHeAB Q>S@ >c] JPZ >lA> B@?c JSJ
O@GA ~AB hUAB(
DrAB JSJ d>V[AB Q>~J $et-ata D\ 7et-ata Jbc YEd #pp-omain(
UK liu cF th $c tru'n 9ua cc .in :ng )ng nh Di sD ha' tri tr v khi &*n cho g0i
cc thnh vi>n ca cc Di t$ng hin cF trong cc .in :ng )ng. uic tru'n )K liu 9ua
cc .in :ng )ng $c th=c hin )r )ng giDng nh tru'n )K liu trong ceng .t .in :ng
)ng.
"0i .in :ng )ng u )u' tr% .t -. )K liu gAa/a )a)heh ch:a .t t6p cc c!p
+t>n,gi tri-. nNu hIt ni )ung ca -. )K liu phn nh cc thiIt l6p cu h%nh ca .in
:ng )ng8 nh cc gi tri tQ Di t$ng AppDomainSetup $c cung cp trong 9u tr%nh t*o
.in :ng )ng g;(. .c ^.Zh. . )K liu n' cF th $c sO )ng trao si )K liu
giKa cc .in :ng )ng ha' lu trK cc gi tri t*. thi )eng trong ceng .t .in :ng )ng.
RhMng th:c SetData th=c hin vic kIt h$p .t khFa )*ng chu#i vi .t Di t$ng v lu
trK nF vo veng . )K liu ca .in :ng )ng. RhMng th:c GetData th=c hin c4ng vic
ng$c l*i l l' l*i Di t$ng tQ veng . )K liu th4ng 9ua khFa. HIu .S lnh trong .t
102
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
.in :ng )ng g0i phMng th:c SetData ha' GetData tru' ;ut -. )K liu ca .in
:ng )ng khc8 th% Di t$ng )K liu phi h# tr$ ngK nghqa mar8haDI4yIBaDue ha' mar8haDI4yI
re?eren)e8 nIu kh4ng th% ngo*i l System.Runtime.Serialization.SerializationException
s@ &i nX. g;(. .c ^.^ &iIt th>. chi tiIt v cch tru'n Di t$ng 9ua cc .in :ng
)ngh. lo*n .S sau tr%nh &' cch sO )ng phMng th:c SetData v GetData tru'n .t
System.Collections.ArrayList giKa hai .in :ng )ng.
using System;
using System.Reflection;
using System.Collections;
public class ListModifier {
public ListModifier () {
// Nhn danh sch tu dm d liu.
ArrayList list =
(ArrayList)AppDomain.CurrentDomain.GetData("People");
// Thay di danh sch.
list.Add("Tam");
}
}
public class PassDataExample {
public static void Main() {
// Tao mt min ng dng mi.
AppDomain domain = AppDomain.CreateDomain("Test");
// Tao mt ArrayList v thm thng tin vo.
ArrayList list = new ArrayList();
list.Add("Phuong");
list.Add("Phong");
list.Add("Nam");
// at danh sch vo vung dm d liu cua min ng dng mi.
domain.SetData("People", list);
103
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
// Tao mt ListModifier trong min ng dng mi
// s thay di ni dung cua list trong vung dm d liu.
domain.CreateInstance("03-08", "ListModifier");
// Nhn lai danh sch v hin th ni dung cua n.
foreach (string s in (ArrayList)domain.GetData("People")) {
Console.WriteLine(s);
}
// Nhn Enter d thot.
Console.ReadLine();
}
}
9' 9' 3i i %h'ng assem!ly v mi n ng d ng 3i i %h'ng assem!ly v mi n ng d ng
#eA JwA B@R@ d>^AB JSJ cffOFY] >c] JSJ O@GA ~AB hUAB YJ Q>nJ Q>@(
3>TAB J^ JSJ> A\X Lt B@R@ d>^AB JSJ cffOFY] H@CAB Y( #eA J^ Q>t B@R@ d>^AB
QX\A FI OIQ O@GA ~AB hUAB F`AB d>V[AB Q>~J QA> #pp-omain.Unload, LAB Q>o@
DE@ D@qJ B@R@ d>^AB O@GA ~AB hUAB Y\ QPQ JR JSJ cffOFY] L} LVWJ Aed D\X O@GA
~AB hUAB L^ JAB LVWJ B@R@ d>^AB(
Pch )u' nht gii phFng .t ass(.&l' l gii phFng c .in :ng )ng . nF S $c
n*p vo. lng tiIc8 vic gii phFng .t .in :ng )ng c?ng s@ gii phFng lu4n tt c cc
ass(.&l' S $c n*p vo F. l<' l .t gii h*n '>u cNu &*n phi ts ch:c v 9un lB tDt cu
trGc .in :ng )ng v ass(.&l'.
whi gii phFng .t .in :ng )ng &5ng phMng th:c tqnh AppDomain.Unload8 &*n cNn tru'n
cho nF .t tha. chiIu AppDomain In .in :ng )ng cNn gii phFng. L*n kh4ng th gii
phFng .in :ng )ng .!c inh )o CL= t*o lGc startup. lo*n .S )i <' tr%nh &' cch sO
)ng phMng th:c Unload.
// Tao mt min ng dng mi.
AppDomain newDomain = AppDomain.CreateDomain("New Domain");
// Nap assembly vo min ng dng my.

// Giai phng min ng dng.


AppDomain.Unload(newDomain);
RhMng th:c Unload ch!n cc tiu tr%nh .i i vo .in :ng )ng $c chJ inh v g0i
phMng th:c Thread.Abort tr>n tt c cc tiu tr%nh hin ang ch*' trong .in :ng )ng n'.
HIu tiu tr%nh g0i phMng th:c Unload hin ang ch*' trong .in :ng )ng cNn gii phFng th%
.t tiu tr%nh khc s@ $c khCi ch*' th=c hin 9u tr%nh gii phFng. HIu cF vn trong
104
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
vic gii phFng .in :ng )ng8 ngo*i l System.CannotUnloadAppDomainException s@ &i nX.
&Ci tiu tr%nh th=c hin 9u tr%nh gii phFng.
7rong khi .in :ng )ng ang $c gii phFng8 CL= g0i th=c thi cc phMng th:c gii phFng
ca tt c cc Di t$ng trong .in :ng )ng. 7e' thuc vo sD l$ng Di t$ng v &n cht
ca cc phMng th:c gii phFng . 9u tr%nh n' cF th .t .t khong thi gian no F.
RhMng th:c AppDomain.IsFinalizingForUnload tr v true nIu .in :ng )ng ang $c
gii phFng v CL= S &/t Nu gii phFng cc Di t$ng trong FT ng$c l*i8 tr v false.
10' 10' Truy xu t th,ng tin Ty%e Truy xu t th,ng tin Ty%e
#eA OZKA Q>Z YP] LK@ QVWAB $!stem.)!pe OT QR OIQ s@tZ h? Y@qZ A>PQ LMA>(
Sg hUAB OIQ QHXAB JSJ JSJ> fcZz
TXSA Qg t!peo*
P>V[AB Q>~J QA> 7et)!pe Jbc YEd $!stem.)!pe
P>V[AB Q>~J 7et)!pe Q>ZIJ OIQ Q>t >@qA Jbc s@tZ
P>V[AB Q>~J 7et=ested)!pe >c] 7et=ested)!pes Jbc YEd )!pe
P>V[AB Q>~J 7et)!pe >c] 7et)!pes Jbc YEd #ssembl!
P>V[AB Q>~J 7et)!pe, 7et)!pes, >c] "ind)!pes Jbc YEd $!stem.&e*lection.
Module
lDi t$ng Type cung cp .t i. khCi Nu l. vic vi cc kiu )K liu &5ng cM chI
phn chiIu. "t Di t$ng Type cho phXp &*n ki. tra si>u )K liu ca kiu8 thu l' cc thnh
vi>n ca kiu8 v t*o cc Di t$ng ca kiu. Uo tN. 9uan tr0ng ca nF8 .NET Framework
cung cp nhiu cM chI l' tha. chiIu In cc Di t$ng Type.
RhMng php hiu 9u nht thu l' Di t$ng Type cho .t kiu c th l sO )ng ton tO
typeof\
System.Type t1 = typeof(System.Text.StringBuilder);
7>n kiu kh4ng $c !t trong )u nh' kXp v -tr%nh &i>n )ich. u%
tha. chiIu $c ph<n gii lGc &i>n )ich n>n ass(.&l' ch:a kiu n' trC thnh phNn ph thuc
tqnh ass(.&l' v s@ $c lit k> trong ass(.&l' .anif(st ca &*n.
"t cch khc l sO )ng phMng th:c tqnh Type.GetType8 nh6n vo .t chu#i ch:a t>n kiu.
u% sO )ng chu#i chJ inh kiu n>n &*n cF th tha' si nF lGc th=c thi8 .C ra cnh
cOa In vi thI gii l6p tr%nh ng &5ng cM chI phn chiIu g;(. .c ^.Z]h. HIu &*n chJ inh
t>n kiu8 & th=c thi phi t%. kiu n' trong .t ass(.&l' S $c n*p. L*n c?ng cF th chJ
inh .t t>n kiu gtha. kho ti liu .NET Framework *E' v
phMng th:c Type.GetType &iIt cch kIt cu t>n kiu h. Pc lnh
sau tr%nh &' cch sO )ng phMng th:c GetType\
// C phn bit ch hoa-thng, tra v null nu khng tm thy.
Type t2 = Type.GetType("System.String");
105
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
// C phn bit ch hoa-thng,
// nm ngoai l TypeLoadException nu khng tm thy.
Type t3 = Type.GetType("System.String", true);
// Khng phn bit ch hoa-thng,
// nm ngoai l TypeLoadException nu khng tm thy.
Type t4 = Type.GetType("system.string", true, true);
// Tn kiu ssmbly.
Type t5 = Type.GetType("System.Data.DataSet,System.Data," +
"Version=1.0.5000.0,Culture=neutral,
PublicKeyToken=ba5c561934e089");
l thu l' Di t$ng Type .4 t kiu ca .t Di t$ng hin cF8 hS' sO )ng phMng th:c
GetType8 $c hin th=c &Ci Object v $c thQa kI &Ci tt c cc kiu )K liu. Ui <' l
.t v2 )\
System.Text.StringBuilder sb = new System.Text.StringBuilder();
Type t6 = sb.GetType();
Lng ^.] tF. t/t cc phMng th:c khc c?ng cung cp kh nvng tru' ;ut Di t$ng Type.
Bfng 3'2 Cc phng thc tr v di tong Type
Phng `hcc ?i `f
Type.GetNestedType
y' Di t$ng Type .4 t .t kiu ltng &>n trong Di t$ng
Type hin cF
Type.GetNestedTypes
y' .t .ng cc Di t$ng Type .4 t cc kiu ltng &>n trong
Di t$ng Type hin cF
Assembly.GetType
y' Di t$ng Type .4 t .t kiu $c khai &o &>n trong
ass(.&l'
Assembly.GetTypes
y' .t .ng cc Di t$ng Type .4 t cc kiu $c khai &o
&>n trong ass(.&l'
Module.GetType
y' Di t$ng Type .4 t .t kiu $c khai &o &>n trong
.o)ul(
Module.GetTypes
y' .t .ng cc Di t$ng Type .4 t cc kiu $c khai &o
&>n trong .o)ul(
Module.FindTypes
y' .t .ng S $c l0c8 ch:a cc Di t$ng Type .4 t cc
kiu $c khai &o &>n trong .o)ul(Ecc kiu n' $c l0c
&5ng .t AeDega/e g;c inh ;(. .#i Type cF ;ut hin trong
.ng 2ch ha' kh4ngh
106
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
11'
11' .i m tra "i u c a m t i t ng .i m tra "i u c a m t i t ng
#eA OZKA s@tO QHc s@tZ Jbc OIQ LK@ QVWAB(
Sg hUAB d>V[AB Q>~J Q>c sj (bJect.7et)!pe Lt Q>Z YP] )!pe J>X LK@ QVWAB A\](
THXAB D\@ QHVoAB >Wd, FeA JAB J^ Q>t fg hUAB QXSA Qg is D\ as Lt s@tO QHc s@tZ
Jbc OIQ LK@ QVWAB(
7t c cc kiu )K liu u thQa kI phMng th:c GetType tQ lp cM sC Object. Hh S $c
tho lu6n trong .c ^.Zd8 phMng th:c n' tr v .t tha. chiIu Type .4 t kiu ca Di
t$ng. L th=c thi )u' tr% .t Di t$ng Type cho .#i kiu $c n*p v tt c cc tha. chiIu
cho kiu n' ceng chJ In Di t$ng n'. liu n' nghqa l &*n cF th so snh hai tha. chiIu
kiu .t cch hiu 9u. u2 ) )i <' tr%nh &' cch ki. tra .t Di t$ng cF phi l
System.IO.StringReader ha' kh4ng\
// Tao mt StringReader d thu nghim.
Object someObject =
new StringReader("This is a StringReader");
// Kim tra xem someObject c phai l mt StringReader hay khng
// bng cch thu ly v so snh tham chiu Type (su dng ton tu typeof).
if (typeof(System.IO.StringReader) == someObject.GetType()) {
// Lm g d.

}
C# cung cp ton tO is th=c hin nhanh vic ki. tra nh tr>n. Hgoi ra8 is s@ tr v true
nIu Di t$ng cNn ki. tra )3n ;ut tQ lp $c chJ inh. lo*n .S )i <' ki. tra ;(.
someObject l .t th hin ca System.IO.TextReader8 ha' .t lp )3n ;ut tQ TextReader
gnh StringReaderh\
// Kim tra xem someObject l TextReader,
// hay dn xut tu TextReader bng ton tu is.
if (someObject is System.IO.TextReader) {
// Lm g d.

}
P hai cch n' u ki hVi kiu )eng vi ton tO typeof v is phi l kiu S &iIt v kh
ph<n gii lGc &i>n )ich. "t cch khc linh ho*t hMn gnhng ch6. hMnh l sO )ng phMng
th:c Type.GetType tr v .t tha. chiIu Type cho kiu $c chJ inh. 7ha. chiIu Type
kh4ng $c ph<n gii cho In khi th=c thi8 vic n' nh hCng In hiu nvng8 nhng cho
phXp &*n tha' si phXp so snh kiu lGc th=c thi )=a tr>n gi tri ca .t chu#i. RhMng th:c
IsType )i <' s@ tr v true nIu Di t$ng thuc kiu $c chJ inh v sO )ng phMng
107
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
th:c Type.IsSubclassOf ki. tra Di t$ng n' cF phi l .t lp con ca kiu $c chJ
inh ha' kh4ng.
public static bool IsType(object obj, string type) {
Type t = Type.GetType(type, true, true);
return t == obj.GetType() || obj.GetType().IsSubclassOf(t);
}
PuDi ceng8 &*n cF th sO )ng ton tO as Xp &t k Di t$ng no sang kiu $c chJ inh.
HIu Di t$ng kh4ng th &i Xp sang kiu $c chJ inh8 ton tO as s@ tr v null. liu n'
cho phXp &*n th=c hin cc phXp Xp kiu an ton g8a?e )a8/h8 nhng kiu $c so snh phi l
kh ph<n gii lGc th=c thi. Ui <' l .t v2 )\
// Su dng ton tu as d thc hin mt php p kiu an ton.
StringReader reader = someObject as System.IO.StringReader;
if (reader != null) {
// Lm g d.

}
P>V[AB Q>~J QA> 7etUnderl!ing)!pe Jbc YEd $!stem.0num J>X d>d FeA Q>Z YP]
s@tZ Jbc OIQ s@tZ Y@qQ sC(
12'
12' T o m t i t ng ! ng c ch %h n chi u T o m t i t ng ! ng c ch %h n chi u
#eA JwA QeX OIQ LK@ QVWAB F`AB J[ J>j d>RA J>@jZ(
T>Z YP] LK@ QVWAB )!pe OT QR s@tZ Jbc LK@ QVWAB JwA QeX, B@ d>V[AB Q>~J
7etConstructor Jbc A^ Lt J^ LVWJ LK@ QVWAB $!stem.&e*lection.ConstructorEn*o
OT QR d>V[AB Q>~J s>@ hnAB JwA hrAB, fcZ L^ Q>nJ Q>@ d>V[AB Q>~J
ConstructorEn*o.Envo:e(
Lc Nu ti>n trong vic t*o .t Di t$ng &5ng cM chI phn chiIu l thu l' Di t$ng Type
.4 t kiu ca Di t$ng cNn t*o g;(. .c ^.Zd &iIt th>. chi tiIth. whi cF $c Di t$ng
Type8 hS' g0i phMng th:c GetConstructor thu l' Di t$ng ConstructorInfo .4 t .t
trong cc phMng th:c khCi )=ng ca kiu n'. U*ng th:c th4ng )ng nht ca phMng th:c
GetConstructor l nh6n .t .ng Type l. Di sD8 v tr v Di t$ng ConstructorInfo .4
t phMng th:c khCi )=ng nh6n cc Di sD $c chJ inh trong .ng Type. l thu l' Di
t$ng ConstructorInfo .4 t phMng th:c khCi )=ng .!c inh gkh4ng cF Di sDh8 &*n hS'
tru'n cho phMng th:c GetConstructor .t .ng Type r#ng gsO )ng trng tqnh
Type.EmptyTypeshT Qng sO )ng null8 nIu kh4ng GetConstructor s@ nX. ngo*i l
System.ArgumentNullException. HIu GetConstructor kh4ng t%. th' phMng th:c khCi )=ng
no cF chK kB phe h$p vi cc Di sD $c chJ inh th% nF s@ tr v null.
108
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
"4t khi S cF Di t$ng ConstructorInfo nh .ong .uDn8 hS' g0i phMng th:c Invoke ca
nF. L*n phi cung cp .t .ng ch:a cc Di sD . &*n .uDn tru'n cho phMng th:c khCi
)=ng. RhMng th:c Invoke s@ t*o Di t$ng .i v tr v .t tha. chiIu In Di t$ng F
g&*n phi Xp v kiu phe h$ph. Ui <' l o*n .S tr%nh &' cch t*o .t Di t$ng
System.Text.StringBuilder8 chJ inh ni )ung &an Nu cho StringBuilder v s:c ch:a ca
nF.
// Thu ly di tong Type cho lp StringBuilder.
Type type = typeof(System.Text.StringBuilder);
// Tao Type[] cha cc di tong Type cho mi di s
// cua phng thc khoi dng (mt chui v mt s nguyn).
Type[] argTypes = new Type[] {typeof(System.String),
typeof(System.Int32)};
// Thu ly di tong ConstructorInfo.
ConstructorInfo cInfo = type.GetConstructor(argTypes);
// Tao object[] cha cc di s cho phng thc khoi dng.
object[] argVals = new object[] {"Some string", 30};
// Tao di tong v p n v kiu StringBuilder.
StringBuilder sb = (StringBuilder)cInfo.Invoke(argVals);
Ph:c nvng phn chiIu thng $c sO )ng hin th=c cc ?a)/ory. 7rong F8 &*n sO )ng
cM chI phn chiIu th hin hFa cc lp thQa kI .t lp cM sC phs &iIn ha' hin th=c .t
giao )in phs &iIn. 7h4ng thng8 c lp cM sC chung v giao )in chung u $c sO )ng.
yp cM sC trQu t$ng s@ hin th=c giao )in v &t k ch:c nvng chung no8 sau F .#i hin
th=c s@ thQa kI lp cM sC.
wh4ng cF cM chI no khai &o r5ng .#i lp phi hin th=c cc phMng th:c khCi
)=ng vi cc chK kB c th. HIu .uDn ngi khc ghSng th: &ah hin th=c cc lp th%
&*n phi chJ r} gtrong ti liu hng )3nh chK kB ca phMng th:c khCi )=ng . ?a)/ory ca
&*n g0i. Pch th4ng thng trnh vn n' l sO )ng phMng th:c khCi )=ng .!c inh
gkh4ng cF Di sDh8 sau F cu h%nh Di t$ng &5ng phMng th:c v thuc t2nh. u2 ) )i <'
s@ hin th=c .t ?a)/ory )eng t*o cc Di t$ng cF hin th=c giao )in IPlugin.
using System;
using System.Reflection;
// Giao din chung m tt ca cc plug-in phai hin thc.
public interface IPlugin {
string Description { get; set; }
109
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
void Start();
void Stop();
}
// Lp c so truu tong m tt ca cc plug-in phai dn xut tu dy.
public abstract class AbstractPlugin : IPlugin {
// Chui cha li m ta plug-in.
private string description = "";
// Thuc tnh dung d ly li m ta plug-in.
public string Description {
get { return description; }
set { description = value; }
}
// Khai bo cc thnh vin cua giao din IPlugin.
public abstract void Start();
public abstract void Stop();
}
// Mt hin thc dn gian cho giao din IPlugin
// d minh hoa lp PluginFactory.
public class SimplePlugin : AbstractPlugin {
// Hin thc phng thc Start.
public override void Start() {
Console.WriteLine(Description + ": Starting...");
}
// Hin thc phng thc Stop.
public override void Stop() {
Console.WriteLine(Description + ": Stopping...");
}
}
// Factory dung d tao cc di tong cua IPlugin.
public sealed class PluginFactory {
public static IPlugin CreatePlugin(string assembly,
110
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
string pluginName, string description) {
// Thu ly di tong Type cho plug-in doc ch dnh.
Type type = Type.GetType(pluginName + ", " + assembly);
// Thu ly di tong ConstructorInfo.
ConstructorInfo cInfo = type.GetConstructor(Type.EmptyTypes);
// Tao di tong v p n v kiu StringBuilder.
IPlugin plugin = (IPlugin)cInfo.Invoke(null);
// Cu hnh IPlugin mi.
plugin.Description = description;
return plugin;
}
}
P<u lnh sau <' s@ t*o Di t$ng SimplePlugin &5ng lp PluginFactory\
IPlugin plugin = PluginFactory.CreatePlugin(
"CreateObjectExample", // Tn assembly
"SimplePlugin", // Tn lp plug-in
"A Simple Plugin" // Li m ta plug-in
);
LEd $!stem.#ctivator JZAB JPd >c@ d>V[AB Q>~J QA> CreateEnstance D\
CreateEnstance"rom hrAB Lt QeX JSJ LK@ QVWAB hnc QHCA LK@ QVWAB )!pe >c] J>Zx@
J>~c QCA s@tZ( %O Q\@ Y@qZ (NET Framework S! Lt F@jQ Q>CO J>@ Q@jQ(
13'
13' T o m t c t7nh t(y !i n T o m t c t7nh t(y !i n
#eA JwA QeX Hc OIQ L_J QaA> Q>X FeA(
TeX OIQ YEd hpA vZPQ Q YEd J[ f QHZ QVWAB $!stem.#ttribute( H@qA Q>nJ JSJ
d>V[AB Q>~J s>@ hnAB, JSJ QHVoAB, D\ JSJ Q>ZIJ QaA> Lt J>X d>d ABVo@ hrAB
JPZ >lA> L_J QaA>( Sg hUAB $!stem.#ttributeUsage#ttribute Lt LMA> AB>cz
N>?AB d>wA Qg J>V[AB QHlA> A\X Y\ LaJ> Jbc L_J QaA>
#eA J^ Q>t Sd hUAB A>@GZ Q>t >@qA Jbc L_J QaA> J>X OIQ d>wA Qg J>V[AB
QHlA> >c] s>TAB
111
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
!_J QaA> J^ LVWJ Q>c sj F@ JSJ s@tZ hpA vZPQ >c] s>TAB
l!c t2nh cung cp .t cM chI tsng 9ut cho vic kIt h$p th4ng tin khai &o gsi>u )K liuh vi
cc phNn tO chMng tr%nh. |i>u )K liu n' n5. trong ass(.&l' S $c &i>n )ich8 cho phXp
cc chMng tr%nh thu l' nF th4ng 9ua cM chI phn chiIu lGc th=c thi g;(. .c ^.Z_.h Pc
chMng tr%nh khc8 !c &it l CL=8 sO )ng th4ng tin n' ;c inh cch th:c tMng tc v
9un lB cc phNn tO chMng tr%nh.
l t*o .t !c t2nh te' &iIn th% hS' )3n ;ut .t lp tQ lp cM sC trQu t$ng
System.Attribute. Pc lp !c t2nh te' &iIn phi l public v cF t>n kIt thGc &5ng
+Attribute-. "t !c t2nh te' &iIn phi cF 2t nht .t phMng th:c khCi )=ng c4ng khai. Pc
ca phMng th:c khCi )=ng s@ trC thnh cc vi tr2 gKo8"/"onaD Karame/erh ca !c
t2nh. Hh vi &t k lp no khc8 &*n cF th khai &o nhiu phMng th:c khCi )=ng8 cho
phXp ngi )eng te' ch0n sO )ng cc t6p khc nhau ca cc Di vi tr2 khi p )ng !c
t2nh. Lt k thuc t2nh v trng 0c,ghi c4ng khai no )o !c t2nh khai &o u trC thnh Di
$c n>u t>n gnameA Karame/erh.
l iu khin cch th:c ngi )eng p )ng !c t2nh8 p )ng !c t2nh
AttributeUsageAttribute cho !c t2nh te' &iIn ca &*n. l!c t2nh AttributeUsageAttribute
h# tr$ .t Di vi tr2 v hai Di $c n>u t>n8 $c .4 t trong &ng ^.^. Pc gi tri .!c
inh chJ inh gi tri s@ $c p )ng cho !c t2nh te' &iIn ca &*n nIu &*n kh4ng p )ng
AttributeUsageAttribute ho!c kh4ng chJ inh gi tri cho .t th4ng sD.
Bfng 3'3 Cc thnh vin thuc kiu lit k AttributeUsage
Thing kj Yibu ?i `f ?c nh
ValidOn
vi tr2
"t thnh vi>n thuc kiu lit k>
System.AttributeTargets8 chJ inh
phNn tO chMng tr%nh . !c t2nh s@
cF hiu l=c tr>n F.
AttributeTargets.All
AllowMultiple
$c n>u
t>n
l!c t2nh cF th $c chJ inh nhiu
lNn cho .t phNn tO ha' kh4ng.
false
Inherited
$c n>u
t>n
l!c t2nh cF $c thQa kI &Ci cc lp
)3n ;ut ha' cc thnh vi>n $c
chXp 1 ha' kh4ng.
true
u2 ) )i <' tr%nh &' cch t*o .t !c t2nh te' &iIn cF t>n l AuthorAttribute8 cho phXp
&*n ;c inh t>n v c4ng t' ca ngi t*o ra lp ha' ass(.&l'. AuthorAttribute khai &o .t
phMng th:c khCi )=ng c4ng khai8 nh6n .t chu#i ch:a t>n tc gi. liu n' '>u cNu ngi
sO )ng AuthorAttribute phi lu4n cung cp .t Di vi tr2 ch:a t>n tc gi. Company l
thuc t2nh c4ng khai gcF th )eng l. Di $c n>u t>nh8 Name l thuc t2nh chJz0c gkh4ng
th )eng l. Di $c n>u t>nh.
using System;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly,
AllowMultiple = true, Inherited = false)]
public class AuthorAttribute : System.Attribute {
112
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
private string company; // Cng ty cua tc gia
private string name; // Tn tc gia
// Khai bo phng thc khoi dng cng khai.
public AuthorAttribute(string name) {
this.name = name;
company = "";
}
// Khai bo thuc tnh Company c quyn set/get.
public string Company {
get { return company; }
set { company = value; }
}
// Khai bo thuc tnh Name ch-doc.
public string Name{
get { return name;}
}
}
Ui <' l cch sO )ng AuthorAttribute\
// Khai bo Square Nguyen l tc gia cua assembly.
[assembly:Author("Square Nguyen", Company = "Goldsoft Ltd.")]
// Khai bo Square Nguyen l tc gia cua lp.
[Author("Square Nguyen", Company = "Goldsoft Ltd.")]
public class SomeClass {

}
// Khai bo Stephen Chow l tc gia cua lp.
[Author("Stephen Chow")]
public class SomeOtherClass {

113
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
}
14' 14' 0 d ng c ch %h n chi u "i m tra 0 d ng c ch %h n chi u "i m tra
cc c t7nh c a m t %h n t ch ng tr&nh cc c t7nh c a m t %h n t ch ng tr&nh
#eA OZKA fg hUAB J[ J>j d>RA J>@jZ Lt s@tO QHc JSJ L_J QaA> Qr] F@jA L} LVWJ
Sd hUAB J>X OIQ d>wA Qg J>V[AB QHlA>(
G@ d>V[AB Q>~J 7etCustom#ttributes Jbc LK@ QVWAB hpA vZPQ Q YEd
$!stem.&e*lection.MemberEn*o iLK@ QVWAB A\] OT QR d>wA Qg J>V[AB QHlA> JwA
s@tO QHck(
7t c cc lp .4 t cc phNn tO chMng tr%nh u )3n ;ut tQ lp MemberInfo. yp n' &ao
gt. Type8 EventInfo8 FieldInfo8 PropertyInfo8 v MethodBase. MethodBase cF th>. hai lp
con\ ConstructorInfo v MethodInfo. L*n cF th g0i phMng th:c GetCustomAttributes nIu
cF $c &t k% Di t$ng no ca cc lp n'. RhMng th:c n' s@ tr v .ng ch:a cc !c
t2nh te' &iIn S $c p )ng cho phNn tO chMng tr%nh. PhG B l .ng n' chJ ch:a cc !c
t2nh te' &iIn ch: kh4ng ch:a cc !c t2nh cF sn trong th vin cc lp cM sC ca .NET
Framework.
RhMng th:c GetCustomAttributes cF hai )*ng th:c. U*ng Nu ti>n nh6n .t Di sD bool
;c inh phMng th:c n' cF tr v cc !c t2nh $c thQa kI tQ cc lp cha ha' kh4ng. U*ng
th: hai nh6n th>. .t Di sD Type cF vai trk nh .t & l0c8 kIt 9u tr v l cc !c t2nh
thuc kiu S $c chJ inh &Ci Type.
u2 ) sau sO )ng !c t2nh te' &iIn AuthorAttribute S $c khai &o trong .c ^.Z^ v p
)ng nF vo lp GetCustomAttributesExample. RhMng th:c Main s@ g0i phMng th:c
GetCustomAttributes8 l0c cc !c t2nh kIt 9u tr v chJ cF cc th hin ca
AuthorAttribute. L*n cF th th=c hin Xp kiu an ton cc !c t2nh n' v tha. chiIu
AuthorAttribute v tru' ;ut cc thnh vi>n ca chGng . kh4ng cNn sO )ng cM chI phn
chiIu.
using System;
[Author("Stephen Chau")]
[Author("Square Nguyen", Company = "Goldsoft Ltd.")]
public class GetCustomAttributesExample {
public static void Main() {
// Ly di tong Type cho chnh lp ny.
Type type = typeof(GetCustomAttributesExample);
// Ly cc dac tnh cho kiu ny. Su dng b loc d
// kt qua tra v ch c cc th hin cua AuthorAttribute.
114
Chng 3: ?i{n cng dengE c ch| shfn chi|uE }~ kitu dl minu
object[] attrs =
type.GetCustomAttributes(typeof(AuthorAttribute), true);
// Lit k cc dac tnh.
foreach (AuthorAttribute a in attrs) {
Console.WriteLine(a.Name + ", " + a.Company);
}
// Nhn Enter d kt thc.
Console.ReadLine();
}
}
4
115
Ch01n2 R4TI6U TRSNHM TION TRSNHM VQ ST UN* VW
116

117
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
t trong nhKng i. .*nh ca h iu hnh &")ro8o?/ @"nAow8 l cho phXp
nhiu chMng tr%nh gtiIn tr%nhEKro)e88h ch*' tng thi v cho phXp .#i tiIn
tr%nh th=c hin nhiu tc v tng thi g&5ng nhiu tiu tr%nhE/hreaAh. PhMng
n' s@ tr%nh &' cch ki. sot cc tiIn tr%nh v cc tiu tr%nh trong cc :ng )ng )=a vo cc
t2nh nvng )o th vin lp .NET Framework cung cp. Pc .c trong chMng n' s@ tr%nh &'
cch th=c hin cc vn sau\
"
|O )ng cc k thu6t v cc t2nh nvng khc nhau ca .NET Framework t*o cc tiu
tr%nh .i g.c _.Z In _.`h.
wi. sot 9u tr%nh th=c thi ca .t tiu tr%nh &iIt $c khi no nF kIt thGc g.c
_.a v _.[h.
ltng & hFa 9u tr%nh th=c thi ca nhiu tiu tr%nh g.c _.b v _.ch.
Ph*' v )Qng cc tiIn tr%nh .i g.c _.Zd v _.ZZh.
Lo . r5ng t*i .t thi i. chJ cF th ch*' .t th hin ca :ng )ng g.c _.Z]h.
1'
1' Th c thi %h ng th c v i thread-%ool Th c thi %h ng th c v i thread-%ool
#eA JwA Q>nJ Q>@ OIQ d>V[AB Q>~J F`AB OIQ Q@tZ QHlA> QHXAB Q>Hch6dXXY Jbc FI
Q>nJ Q>@(
3>c@ FSX OIQ d>V[AB Q>~J J>~c O} YqA> JwA Q>nJ Q>@ d>V[AB Q>~J A\] d>R@ QHR
DG void D\ J> A>NA OIQ LK@ fK( ScZ L^, QeX OIQ Q>t >@qA Jbc b] A>@qO
$!stem.).reading.aitCallbac: Q>cO J>@jZ LjA d>V[AB Q>~J A\]( T@jd QUJ, B@
d>V[AB Q>~J QA> HueueUseror:Etem Jbc YEd $!stem.).reading.).read/ool, D\
QHZ]GA Q>t >@qA b] A>@qO L} QeX Y\O LK@ fK( #I Q>nJ Q>@ fm vjd Q>t >@qA b] A>@qO
A\] D\X >\AB LW@ D\ Q>nJ Q>@ A^ s>@ OIQ Q@tZ QHlA> QHXAB Q>Hch6dXXY fA f\AB(
HIu :ng )ng sO )ng nhiu tiu tr%nh cF thi gian sDng ng/n ha' )u' tr% .t sD l$ng ln
cc tiu tr%nh tng thi th% hiu nvng cF th gi. sGt &Ci cc chi ph2 cho vic t*o8 v6n hnh v
h' cc tiu tr%nh. Hgoi ra8 trong .t h thDng h#ztr$zaztiuztr%nh8 cc tiu tr%nh thng C
tr*ng thi r#i suDt .t khong thi gian )i ch iu kin th=c thi phe h$p. uic sO )ng
thr(a)zpool s@ cung cp .t gii php chung nh5. ci thin t2nh 9u' .4 v hiu nvng ca cc
h thDng h#ztr$zaztiuztr%nh.
.NET Framework cung cp .t hin th=c Mn gin cho thr(a)zpool . chGng ta cF th tru'
;ut th4ng 9ua cc thnh vi>n tqnh ca lp ThreadPool. RhMng th:c ueueUserWorkItem cho
phXp &*n th=c thi .t phMng th:c &5ng .t tiu tr%nh trong thr(a)zpool g!t c4ng vic vo
hng $ih. "#i c4ng vic $c .4 t &Ci .t th hin ca ' nhi. WaitCallback gtha.
chiIu In phMng th:c cNn th=c thih. whi .t tiu tr%nh trong thr(a)zpool sn sng8 nF nh6n
c4ng vic kI tiIp tQ hng $i v th=c thi c4ng vic n'. whi S hon tt c4ng vic8 tha' v% kIt
thGc8 tiu tr%nh n' 9ua' v thr(a)zpool v nh6n c4ng vic kI tiIp tQ hng $i.
uic sO )ng thr(a)zpool ca & th=c thi giGp Mn gin hFa vic l6p tr%nh h#ztr$zaztiuztr%nh.
7u' nhi>n8 cNn lu B <' l thr(a)zpool $c hin th=c Mn gin8 chJ nh5. .c 2ch sO )ng
chung. 7rc khi 9u'It inh sO )ng thr(a)zpool n'8 cNn ;(. ;Xt cc i. sau\
118
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
L th=c thi 9u' inh sD tiu tr%nh tDi a $c cp cho thr(a)zpoolT &*n kh4ng th tha'
si sD tDi a n' &5ng cc tha. sD cu h%nh ha' tQ &>n trong .S $cz9unzlB. pii
h*n .!c inh l ]` tiu tr%nh cho .#i CPQ trong h thDng. |D tiu tr%nh tDi a trong
thr(a)zpool kh4ng gii h*n sD cc c4ng vic ang ch trong hng $i.
P?ng nh vic cho phXp &*n sO )ng thr(a)zpool th=c thi .S lnh .t cch tr=c
tiIp8 & th=c thi ckn sO )ng thr(a)zpool cho nhiu .c 2ch &>n trong8 &ao gt. vic
th=c thi phMng th:c .t cch &t tng & g;(. .c _.]h v th=c thi cc s= kin inh
thi g;(. .c _.^h. 7t c cc c4ng vic n' cF th )3n In s= tranh chp giKa cc tiu
tr%nh trong thr(a)zpoolT nghqa l hng $i cF th trC n>n rt )i. "!c )e )i tDi a
ca hng $i chJ &i gii h*n &Ci sD l$ng & nh ckn l*i cho tiIn tr%nh ca & th=c thi8
nhng hng $i 9u )i s@ l. kXo )i 9u tr%nh th=c thi ca cc c4ng vic trong hng
$i.
L*n kh4ng n>n sO )ng thr(a)zpool th=c thi cc tiIn tr%nh ch*' trong .t thi gian
)i. u% sD tiu tr%nh trong thr(a)zpool l cF gii h*n8 n>n chJ .t sD 2t tiu tr%nh thuc
cc tiIn tr%nh lo*i n' c?ng s@ nh hCng ng k In ton & hiu nvng ca thr(a)z
pool. l!c &it8 &*n n>n trnh !t cc tiu tr%nh trong thr(a)zpool vo tr*ng thi $i
trong .t thi gian 9u )i.
L*n kh4ng th iu khin lich tr%nh ca cc tiu tr%nh trong thr(a)zpool8 c?ng nh
kh4ng th tha' si u ti>n ca cc c4ng vic. 7hr(a)zpool ;O lB cc c4ng vic th(o
th: t= nh khi &*n th>. chGng vo hng $i.
"t khi c4ng vic S $c !t vo hng $i th% &*n kh4ng th h' ha' )Qng nF.
u2 ) )i <' tr%nh &' cch sO )ng lp ThreadPool th=c thi .t phMng th:c cF t>n l
DisplayMessage. u2 ) n' s@ tru'n DisplayMessage In thr(a)zpool hai lNn8 lNn Nu kh4ng
cF Di sD8 lNn sau cF Di sD l Di t$ng MessageInfo gcho phXp ki. sot th4ng tin . tiu
tr%nh s@ hin thih.
using System;
using System.Threading;
// Lp dung d truyn d liu cho phng thc DisplayMessage
// khi n doc thc thi bng thread-pool.
public class MessageInfo {
private int iterations;
private string message;
// Phng thc khoi dng nhn cc thit lp cu hnh cho tiu trnh.
public MessageInfo(int iterations, string message) {
this.iterations = iterations;
119
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
this.message = message;
}
// Cc thuc tnh dung d ly cc thit lp cu hnh.
public int Iterations { get { return iterations; } }
public string Message { get { return message; } }
}
public class ThreadPoolExample {
// Hin th thng tin ra cua s Console.
public static void DisplayMessage(object state) {
// p di s state sang MessageInfo.
MessageInfo config = state as MessageInfo;
// Nu di s config l null, khng c di s no doc
// truyn cho phng thc ThreadPool.ueueUserWorkItem;
// su dng cc gi tr mac dnh.
if (config == null) {
// Hin th mt thng bo ra cua s Console ba ln.
for (int count = 0; count 3; count++) {
Console.WriteLine("A thread-pool example.");
// Vo trang thi ch, dung cho mc dch minh hoa.
// Trnh da cc tiu trnh cua thread-pool
// vo trang thi ch trong cc ng dng thc t.
Thread.Sleep(1000);
}
} else {
// Hin th mt thng bo doc ch dnh trc
// vi s ln cng doc ch dnh trc.
for (int count = 0; count config.Iterations; count++) {
120
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
Console.WriteLine(config.Message);
// Vo trang thi ch, dung cho mc dch minh hoa.
// Trnh da cc tiu trnh cua thread-pool
// vo trang thi ch trong cc ng dng thc t.
Thread.Sleep(1000);
}
}
}
public static void Main() {
// Tao mt di tong uy nhim, cho php chng ta
// truyn phng thc DisplayMessage cho thread-pool.
WaitCallback workMethod =
new WaitCallback(ThreadPoolExample.DisplayMessage);
// Thc thi DisplayMessage bng thread-pool (khng c di s).
ThreadPool.ueueUserWorkItem(workMethod);
// Thc thi DisplayMessage bng thread-pool (truyn mt
// di tong MessageInfo cho phng thc DisplayMessage).
MessageInfo info =
new MessageInfo(5, "A thread-pool example with arguments.");
ThreadPool.ueueUserWorkItem(workMethod, info);
// Nhn Enter d kt thc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
}
121
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
2'
2' Th c thi %h ng th c m t cch ! t ng ! Th c thi %h ng th c m t cch ! t ng !
#eA JwA Q>nJ Q>@ OIQ d>V[AB Q>~J D\ Q@jd QUJ Q>nJ >@qA JSJ JTAB D@qJ s>SJ QHXAB
s>@ d>V[AB Q>~J A\] DpA J>e] QHXAB OIQ Q@tZ QHlA> H@CAB F@qQ( ScZ s>@ d>V[AB
Q>~J L} >X\A QPQ, FeA JwA YP] QHM QHR DG Jbc A^(
3>c@ FSX OIQ b] A>@qO J^ J>? s B@KAB A>V d>V[AB Q>~J JwA Q>nJ Q>@( ScZ L^,
QeX OIQ Q>t >@qA Jbc b] A>@qO Q>cO J>@jZ LjA d>V[AB Q>~J A\]( T@jd Q>X, B@
d>V[AB Q>~J 6eginEnvo:e Jbc Q>t >@qA b] A>@qO Lt Q>nJ Q>@ d>V[AB Q>~J Jbc
FeA( 3j LjA, fg hUAB d>V[AB Q>~J 0ndEnvo:e Lt s@tO QHc QHeAB Q>S@ Jbc d>V[AB
Q>~J JAB A>V Q>Z YP] QHM QHR DG Jbc A^ AjZ L} >X\A QPQ(
whi cho g0i .t phMng th:c8 chGng ta thng th=c hin .t cch tng &T nghqa l .S lnh
th=c hin li g0i phi i vo tr*ng thi )Qng g&lockh cho In khi phMng th:c $c th=c hin
;ong. l<' l cch cNn thiIt khi .S lnh '>u cNu 9u tr%nh th=c thi phMng th:c phi hon tt
trc khi nF cF th tiIp tc. 7u' nhi>n8 trong .t sD trng h$p8 &*n l*i cNn th=c thi phMng
th:c .t cch &t tng &T nghqa l &*n cho th=c thi phMng th:c n' trong .t tiu tr%nh
ri>ng trong khi v3n tiIp tc th=c hin cc c4ng vic khc.
.NET Framework h# tr$ chI th=c thi &t tng &8 cho phXp &*n th=c thi &t k phMng
th:c no .t cch &t tng & &5ng .t ' nhi.. whi khai &o v &i>n )ich .t ' nhi.8
tr%nh &i>n )ich s@ t= ng sinh ra hai phMng th:c h# tr$ chI th=c thi &t tng &\
BeginInvoke v EndInvoke. whi &*n g0i phMng th:c BeginInvoke ca .t th hin ' nhi.8
phMng th:c $c tha. chiIu &Ci ' nhi. n' $c ;Ip vo hng $i th=c thi &t tng
&. Yu'n ki. sot 9u tr%nh th=c thi $c tr v cho .S g0i BeginInvoke nga' sau F8 v
phMng th:c $c tha. chiIu s@ th=c thi trong ngK cnh ca tiu tr%nh sn sng trc ti>n
trong thr(a)zpool.
Pc Di sD ca phMng th:c BeginInvoke gt. cc Di sD $c chJ inh &Ci ' nhi.8 cng
vi hai Di sD )eng khi phMng th:c th=c thi &t tng & kIt thGc. nai Di sD n' l\
"t th hin ca ' nhi. System.AsyncCallback tha. chiIu In phMng th:c . &
th=c thi s@ g0i khi phMng th:c th=c thi &t tng & kIt thGc. RhMng th:c n' s@ $c
th=c thi trong ngK cnh ca .t tiu tr%nh trong thr(a)zpool. 7ru'n gi tri null cho Di
sD n' nghqa l kh4ng cF phMng th:c no $c g0i v &*n phi sO )ng .t cM chI
khc ;c inh khi no phMng th:c th=c thi &t & kIt thGc gs@ $c tho lu6n &>n
)ih.
"t tha. chiIu Di t$ng . & th=c thi s@ li>n kIt vi 9u tr%nh th=c thi &t tng &.
RhMng th:c th=c thi &t tng & kh4ng th sO )ng ha' tru' ;ut In Di t$ng n'8
nhng .S lnh ca &*n cF th sO )ng nF khi phMng th:c n' kIt thGc8 cho phXp &*n
li>n kIt th4ng tin tr*ng thi vi 9u tr%nh th=c thi &t tng &. u2 )8 Di t$ng n' cho
phXp &*n nh ;* cc kIt 9u vi cc thao tc &t tng & S $c khCi t*o trong trng
h$p &*n khCi t*o nhiu thao tc &t tng & nhng sO )ng chung .t phMng th:c
call&ack ;O lB vic kIt thGc.
RhMng th:c EndInvoke cho phXp &*n l' tri tr v ca phMng th:c th=c thi &t tng &8
nhng trc hIt &*n phi ;c inh khi no nF kIt thGc. Ui <' l &Dn k thu6t )eng ;c
inh .t phMng th:c th=c thi &t tng & S kIt thGc ha' cha\
122
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
5lockingE)Qng 9u tr%nh th=c thi ca tiu tr%nh hin hnh cho In khi phMng th:c
th=c thi &t tng & kIt thGc. liu n' rt giDng vi s= th=c thi tng &. 7u' nhi>n8
nIu linh ho*t ch0n thi i. ch2nh ;c a .S lnh ca &*n vo tr*ng thi )Qng
g&lockh th% &*n v3n ckn cM hi th=c hin th>. .t sD vic trc khi .S lnh i vo
tr*ng thi n'.
,ollingEl!p i l!p l*i vic ki. tra tr*ng thi ca phMng th:c th=c thi &t tng &
;c inh nF kIt thGc ha' cha. l<' l .t k thu6t rt Mn gin8 nhng -
. L*n n>n trnh cc vkng l!p ch!t l. lSng ph2 thi gian
ca & ;O lBT tDt nht l n>n !t tiu tr%nh th=c hin polling vo tr*ng thi nghJ gsl((ph
trong .t khong thi gian &5ng cch sO )ng Thread.Sleep giKa cc lNn ki. tra
tr*ng thi. -
tiu tr%nh-.
*aitingEsO )ng .t Di t$ng )3n ;ut tQ lp System.Threading.WaitHandle &o
hiu khi phMng th:c th=c thi &t tng & kIt thGc. aiting l .t ci tiIn ca k thu6t
polling8 nF cho phXp &*n ch nhiu phMng th:c th=c thi &t tng & kIt thGc. L*n
c?ng cF th chJ inh cc gi tri ti.(zout cho phXp tiu tr%nh th=c hin aiting )Qng l*i
nIu phMng th:c th=c thi &t tng & S )irn ra 9u l<u8 ho!c &*n .uDn c6p nh6t inh
k & chJ tr*ng thi.
Call9acksEPall&ack l .t phMng th:c . & th=c thi s@ g0i khi phMng th:c th=c
thi &t tng & kIt thGc. "S lnh th=c hin li g0i kh4ng cNn th=c hin &t k thao tc
ki. tra no8 nhng v3n cF th tiIp tc th=c hin cc c4ng vic khc. Pall&ack rt linh
ho*t nhng c?ng rt ph:c t*p8 !c &it khi cF nhiu phMng th:c th=c thi &t tng &
ch*' tng thi nhng sO )ng ceng .t call&ack. 7rong nhKng trng h$p nh thI8
&*n phi sO )ng cc Di t$ng tr*ng thi th2ch h$p so treng cc phMng th:c S
hon tt vi cc phMng th:c S khCi t*o.
yp AsyncExecutionExample trong v2 ) )i <' .4 t cM chI th=c thi &t tng &. HF sO
)ng .t ' nhi. cF t>n l AsyncExampleDelegate th=c thi &t tng & .t phMng th:c
cF t>n l LongRunningMethod. RhMng th:c LongRunningMethod sO )ng Thread.Sleep .4
phVng .t phMng th:c cF thi gian th=c thi )i.
// Uy nhim cho php ban thc hin vic thc thi bt dng b
// cua AsyncExecutionExample.LongRunningMethod.
public delegate DateTime AsyncExampleDelegate(int delay, string name);
// Phng thc c thi gian thc thi di.
public static DateTime LongRunningMethod(int delay, string name) {
Console.WriteLine("{0} : {1} example - thread starting.",
DateTime.Now.ToString("HH:mm:ss.ffff"), name);
123
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
// M phong vic xu l tn nhiu thi gian.
Thread.Sleep(delay);
Console.WriteLine("{0} : {1} example - thread finishing.",
DateTime.Now.ToString("HH:mm:ss.ffff"), name);
// Tra v thi gian hon tt phng thc.
return DateTime.Now;
}
AsyncExecutionExample ch:a nv. phMng th:c )irn *t cc cch tiIp c6n khc nhau v vic
kIt thGc phMng th:c th=c thi &t tng &. Ui <' s@ .4 t v cung cp .S lnh cho cc
phMng th:c F.
Z. P>V[AB Q>~J 6loc:ing0xample
RhMng th:c BlockingExample th=c thi &t tng & phMng th:c LongRunningMethod v
tiIp tc th=c hin c4ng vic ca nF trong .t khong thi gian. whi ;O lB ;ong c4ng
vic n'8 BlockingExample chu'n sang trang thi )Qng g&lockh cho In khi phMng
th:c LongRunningMethod kIt thGc. l vo tr*ng thi )Qng8 BlockingExample th=c thi
phMng th:c EndInvoke ca th hin ' nhi. AnsyncExampleDelegate. HIu phMng
th:c LongRunningMethod kIt thGc8 EndInvoke tr v nga' l6p t:c8 nIu kh4ng8
BlockingExample chu'n sang tr*ng thi )Qng cho In khi phMng th:c
LongRunningMethod kIt thGc.
public static void BlockingExample() {
Console.WriteLine(Environment.NewLine +
" Running Blocking Example ");
// Goi LongRunningMethod mt cch bt dng b. Truyn null cho
// ca uy nhim callback v di tong trang thi bt dng b.
AsyncExampleDelegate longRunningMethod =
new AsyncExampleDelegate(LongRunningMethod);
IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000,
"Blocking", null, null);
// Thc hin cng vic khc cho dn khi
// san sng di vo trang thi dung.
for (int count = 0; count 3; count++) {
Console.WriteLine("{0} : Continue processing until " +
"ready to block...",
124
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
DateTime.Now.ToString("HH:mm:ss.ffff"));
Thread.Sleep(200);
}
// i vo trang thi dung cho dn khi phng thc
// thc thi bt dng b kt thc v thu ly kt qua.
Console.WriteLine("{0} : Blocking until method is " +
"complete...", DateTime.Now.ToString("HH:mm:ss.ffff"));
DateTime completion =
longRunningMethod.EndInvoke(asyncResult);
// Hin th thng tin kt thc.
Console.WriteLine("{0} : Blocking example complete.",
completion.ToString("HH:mm:ss.ffff"));
}
]. P>V[AB Q>~J /olling0xample
RhMng th:c PollingExample th=c thi &t tng & phMng th:c LongRunningMethod v
sau F th=c hin vkng l!p KoDD"ng cho In khi LongRunningMethod kIt thGc.
PollingExample ki. tra thuc t2nh IsComplete ca th hin IAsyncResult g$c tr v
&Ci BeginInvokeh ;c inh phMng th:c LongRunningMethod S kIt thGc ha' cha8
nIu cha8 PollingExample s@ g0i Thread.Sleep.
public static void PollingExample() {
Console.WriteLine(Environment.NewLine +
" Running Polling Example ");
// Goi LongRunningMethod mt cch bt dng b. Truyn null cho
// ca uy nhim callback v di tong trang thi bt dng b.
AsyncExampleDelegate longRunningMethod =
new AsyncExampleDelegate(LongRunningMethod);
IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000,
"Polling", null, null);
// Thc hin polling d kim tra phng thc thc thi
// bt dng b kt thc hay cha. Nu cha kt thc
125
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
// th di vo trang thi ch trong 300 mini-giy
// trc khi thc hin polling ln na.
Console.WriteLine("{0} : Poll repeatedly until method is " +
"complete...", DateTime.Now.ToString("HH:mm:ss.ffff"));
while(!asyncResult.IsCompleted) {
Console.WriteLine("{0} : Polling...",
DateTime.Now.ToString("HH:mm:ss.ffff"));
Thread.Sleep(300);
}
// Thu ly kt qua cua phng thc thc thi bt dng b.
DateTime completion =
longRunningMethod.EndInvoke(asyncResult);
// Hin th thng tin kt thc.
Console.WriteLine("{0} : Polling example complete.",
completion.ToString("HH:mm:ss.ffff"));
}
^. P>V[AB Q>~J aiting0xample
RhMng th:c WaitingExample th=c thi &t tng & phMng th:c LongRunningExample v
sau F ch cho In khi LongRunningMethod kIt thGc. WaitingExample sO )ng thuc
t2nh AsyncWaitHandle ca th hin IAsyncResult g$c tr v &Ci BeginInvokeh cF
$c .t WaitHandle v sau F g0i phMng th:c WaitOne ca WaitHandle. uic sO )ng
gi tri ti.(zout cho phXp WaitingExample )Qng 9u tr%nh $i th=c hin c4ng vic
khc ho!c )Qng hon ton nIu phMng th:c th=c thi &t tng & )irn ra 9u l<u.
public static void WaitingExample() {
Console.WriteLine(Environment.NewLine +
" Running Waiting Example ");
// Goi LongRunningMethod mt cch bt dng b. Truyn null cho
// ca uy nhim callback v di tong trang thi bt dng b.
AsyncExampleDelegate longRunningMethod =
new AsyncExampleDelegate(LongRunningMethod);
IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000,
"Waiting", null, null);
126
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
// oi phng thc thc thi bt dng b kt thc.
// Time-out sau 300 mili-giy v hin th trang thi ra
// cua s Console trc khi tip tc doi.
Console.WriteLine("{0} : Waiting until method is complete...",
DateTime.Now.ToString("HH:mm:ss.ffff"));
while(!asyncResult.AsyncWaitHandle.WaitOne(300, false)) {
Console.WriteLine("{0} : Wait timeout...",
DateTime.Now.ToString("HH:mm:ss.ffff"));
}
// Thu ly kt qua cua phng thc thc thi bt dng b.
DateTime completion =
longRunningMethod.EndInvoke(asyncResult);
// Hin th thng tin kt thc.
Console.WriteLine("{0} : Waiting example complete.",
completion.ToString("HH:mm:ss.ffff"));
}
_. P>V[AB Q>~J ait#ll0xample
RhMng th:c WaitAllExample th=c thi &t tng & phMng th:c LongRunningMethod
nhiu lNn v sau F sO )ng .ng cc Di t$ng WaitHandle $i cho In khi tt c
cc phMng th:c kIt thGc.
public static void WaitAllExample() {
Console.WriteLine(Environment.NewLine +
" Running WaitAll Example ");
// Mt ArrayList cha cc th hin IAsyncResult
// cho cc phng thc thc thi bt dng b.
ArrayList asyncResults = new ArrayList(3);
// Goi ba ln LongRunningMethod mt cch bt dng b.
// Truyn null cho ca uy nhim callback v di tong
// trang thi bt dng b. Thm th hin IAsyncResult
// cho mi phng thc vo ArrayList.
AsyncExampleDelegate longRunningMethod =
127
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
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));
// Tao mt mang cc di tong WaitHandle,
// s doc su dng d doi tt ca cc phng thc
// thc thi bt dng b kt thc.
WaitHandle[] waitHandles = new WaitHandle[3];
for (int count = 0; count 3; count++) {
waitHandles[count] =
((IAsyncResult)asyncResults[count]).AsyncWaitHandle;
}
// oi ca ba phng thc thc thi bt dng b kt thc.
// Time-out sau 300 mili-giy v hin th trang thi ra
// cua s Console trc khi tip tc doi.
Console.WriteLine("{0} : Waiting until all 3 methods are " +
"complete...", DateTime.Now.ToString("HH:mm:ss.ffff"));
while(!WaitHandle.WaitAll(waitHandles, 300, false)) {
Console.WriteLine("{0} : WaitAll timeout...",
DateTime.Now.ToString("HH:mm:ss.ffff"));
}
// Kim tra kt qua cua mi phng thc v xc dnh
// thi gian phng thc cui cung kt thc.
DateTime completion = DateTime.MinValue;
foreach (IAsyncResult result in asyncResults) {
128
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
DateTime time = longRunningMethod.EndInvoke(result);
if ( time completion) completion = time;
}
// Hin th thng tin kt thc.
Console.WriteLine("{0} : WaitAll example complete.",
completion.ToString("HH:mm:ss.ffff"));
}
`. P>V[AB Q>~J Callbac:0xample
RhMng th:c CallbackExample th=c thi &t tng & phMng th:c LongRunningMethod v
tru'n .t th hin ' nhi. AsyncCallback gtha. chiIu In phMng th:c
CallbackHandlerh cho phMng th:c BeginInvoke. RhMng th:c CallbackHandler s@
$c g0i .t cch t= ng khi phMng th:c LongRunningMethod kIt thGc8 kIt 9u l
phMng th:c CallbackExample v3n tiIp tc th=c hin c4ng vic.
public static void CallbackExample() {
Console.WriteLine(Environment.NewLine +
" Running Callback Example ");
// Goi LongRunningMethod mt cch bt dng b. Truyn mt
// th hin uy nhim AsyncCallback tham chiu dn
// phng thc CallbackHandler. CallbackHandler s
// t dng doc goi khi phng thc thc thi bt dng b
// kt thc. Truyn mt tham chiu dn th hin uy nhim
// AsyncExampleDelegate nh mt trang thi bt dng b;
// nu khng, phng thc callback khng th truy xut
// th hin uy nhim d goi EndInvoke.
AsyncExampleDelegate longRunningMethod =
new AsyncExampleDelegate(LongRunningMethod);
IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000,
"Callback", new AsyncCallback(CallbackHandler),
longRunningMethod);
// Tip tc vi cng vic khc.
for (int count = 0; count 15; count++) {
129
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
Console.WriteLine("{0} : Continue processing...",
DateTime.Now.ToString("HH:mm:ss.ffff"));
Thread.Sleep(200);
}
}
// Phng thc xu l vic kt thc bt dng b bng callbacks.
public static void CallbackHandler(IAsyncResult result) {
// Trch tham chiu dn th hin AsyncExampleDelegate
// tu th hin IAsyncResult.
AsyncExampleDelegate longRunningMethod =
(AsyncExampleDelegate)result.AsyncState;
// Thu ly kt qua cua phng thc thc thi bt dng b.
DateTime completion = longRunningMethod.EndInvoke(result);
// Hin th thng tin kt thc.
Console.WriteLine("{0} : Callback example complete.",
completion.ToString("HH:mm:ss.ffff"));
}
3' 3' Th c thi %h ng th c ! ng Timer Th c thi %h ng th c ! ng Timer
#eA JwA Q>nJ Q>@ OIQ d>V[AB Q>~J QHXAB OIQ Q@tZ QHlA> H@CAB Q>X J>Z s >c]
OIQ Q>o@ L@tO vSJ LMA>(
3>c@ FSX OIQ d>V[AB Q>~J QHR DG void D\ J> A>NA OIQ LK@ QVWAB Y\O LK@ fK( ScZ
L^, QeX OIQ Q>t >@qA b] A>@qO $!stem.).reading.)imerCallbac: Q>cO J>@jZ LjA
d>V[AB Q>~J A\]( T@jd Q>X, QeX OIQ LK@ QVWAB $!stem.).reading.)imer D\
QHZ]GA A^ J>X Q>t >@qA b] A>@qO )imerCallbac: JrAB DE@ OIQ LK@ QVWAB QHeAB
Q>S@ O\ )imer fm QHZ]GA J>X d>V[AB Q>~J Jbc FeA s>@ )imer >jQ >@qZ YnJ( #I Q>nJ
Q>@ fm J>o J>X LjA s>@ )imer >jQ >@qZ YnJ D\ fcZ L^ B@ d>V[AB Q>~J Jbc FeA F`AB
OIQ Q@tZ QHlA> QHXAB Q>Hch6dXXY(
7h4ng thng8 rt hKu 2ch khi th=c thi .t phMng th:c C .t thi i. ;c inh ha' C
nhKng thi khong ;c inh. u2 )8 &*n cNn sao lu )K liu lGc Z\dd " .#i ng' ha' ;Fa
veng . )K liu .#i ]d phGt. yp Timer giGp vic inh thi th=c thi .t phMng th:c trC
n>n )r )ng8 cho phXp &*n th=c thi .t phMng th:c $c tha. chiIu &Ci ' nhi.
TimerCallback C nhKng thi khong nht inh. RhMng th:c $c tha. chiIu s@ th=c thi
trong ngK cnh ca .t tiu tr%nh trong thr(a)zpool.
130
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
whi t*o .t Di t$ng Timer8 &*n cNn chJ inh hai thi khong gthi khong cF th $c chJ
inh l cc gi tri kiu int8 long8 uint8 ha' System.TimeSpanh\
pi tri Nu ti>n l thi gian trr gt2nh &5ng .ilizgi<'h phMng th:c ca &*n $c th=c
thi lNn Nu ti>n. PhJ inh gi tri 0 th=c thi phMng th:c nga' l6p t:c8 v chJ inh
System.Threading.Timeout.Infinite t*o Timer C tr*ng thi cha &/t Nu
gun8/ar/eAh.
pi tri th: hai l khong thi gian . Timer s@ l!p l*i vic g0i phMng th:c ca &*n sau
lNn th=c thi Nu ti>n. HIu &*n chJ inh gi tri 0 ha' Timeout.Infinite th% Timer chJ th=c
thi phMng th:c .t lNn )u' nht gvi iu kin thi gian trr &an Nu kh4ng phi l
Timeout.Infiniteh. lDi sD th: hai cF th cung cp &5ng cc tri kiu int8 long8 uint8
ha' System.TimeSpan.
|au khi t*o Di t$ng Timer8 &*n c?ng cF th tha' si cc thi khong $c sO )ng &Ci Timer
&5ng phMng th:c Change8 nhng &*n kh4ng th tha' si phMng th:c s@ $c g0i. whi S
)eng ;ong Timer8 &*n n>n g0i phMng th:c Timer.Depose gii phFng ti ngu'>n h thDng
&i chiI. giK &Ci Timer. uic h' Timer c?ng h' lu4n phMng th:c S $c inh thi th=c
thi.
yp TimerExample )i <' tr%nh &' cch sO )ng Timer g0i .t phMng th:c cF t>n l
TimerHandler. Lan Nu8 Timer $c cu h%nh g0i TimerHandler sau hai gi<' v l!p l*i sau
.t gi<'. u2 ) n' c?ng tr%nh &' cch sO )ng phMng th:c Timer.Change tha' si cc
thi khong.
using System;
using System.Threading;
public class TimerExample {
// Phng thc s doc thc khi Timer ht hiu lc.
// Hin th mt thng bo ra cua s Console.
private static void TimerHandler(object state) {
Console.WriteLine("{0} : {1}",
DateTime.Now.ToString("HH:mm:ss.ffff"), state);
}
public static void Main() {
// Tao mt th hin uy nhim TimerCallback mi
// tham chiu dn phng thc tnh TimerHandler.
// TimerHandler s doc goi khi Timer ht hiu lc.
131
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
TimerCallback handler = new TimerCallback(TimerHandler);
// Tao mt di tong trang thi, di tong ny s doc
// truyn cho phng thc TimerHandler.
// Trong trng hop ny, mt thng bo s doc hin th.
string state = "Timer expired.";
Console.WriteLine("{0} : Creating Timer.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
// Tao mt Timer, pht sinh ln du tin sau hai giy
// v sau d l mi giy.
using (Timer timer = new Timer(handler, state, 2000, 1000)) {
int period;
// oc thi khoang mi tu Console cho dn khi
// ngi dung nhp 0. Cc gi tr khng hop l
// s su dng gi tr mac dnh l 0 (dung v d).
do {
try {
period = Int32.Parse(Console.ReadLine());
} catch {
period = 0;
}
// Thay di Timer vi thi khoang mi.
if (period 0) timer.Change(0, period);
} while (period 0);
}
// Nhn Enter d kt thc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
}
132
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
"!c )e Timer thng $c sO )ng g0i th=c thi cc phMng th:c C nhKng thi khong8
nhng nF c?ng cung cp cch th:c th=c thi .t phMng th:c C .t thi i. ;c inh.
L*n cNn phi t2nh ton khong thi gian tQ thi i. hin t*i In thi i. cNn th=c thi. u2 )
)i <' s@ th=c hin iu n'\
public static void RunAt(DateTime execTime) {
// Tnh khoang thi gian tu thi dim hin tai
// dn thi dim cn thc thi.
TimeSpan waitTime = execTime - DateTime.Now;
if (waitTime new TimeSpan(0)) waitTime = new TimeSpan(0);
// Tao mt th hin uy nhim TimerCallback mi
// tham chiu dn phng thc tnh TimerHandler.
// TimerHandler s doc goi khi Timer ht hiu lc.
TimerCallback handler = new TimerCallback(TimerHandler);
// Tao mt Timer ch pht sinh mt ln tai thi dim
// doc ch dnh. Ch dnh thi khoang th hai l -1
// d ngan Timer thc thi lap lai phng thc.
new Timer(handler, null, waitTime, new TimeSpan(-1));
}
4' 4' Th c thi %h ng th c ! ng cch ra hi u i t ng Wait-andle Th c thi %h ng th c ! ng cch ra hi u i t ng Wait-andle
#eA OZKA Q>nJ Q>@ OIQ >c] A>@GZ d>V[AB Q>~J OIQ JSJ> Qn LIAB s>@ OIQ LK@
QVWAB hpA vZPQ Q YEd $!stem.).reading.aitHandle L@ D\X QHeAB Q>S@ signale&(
TeX OIQ Q>t >@qA b] A>@qO $!stem.).reading.ait(r)imerCallbac: Q>cO J>@jZ
LjA d>V[AB Q>~J JwA Q>nJ Q>@( ScZ L^, LAB s Q>t >@qA b] A>@qO D\ LK@ QVWAB
aitHandle DE@ Q>Hch6dXXY F`AB d>V[AB Q>~J QA> ).read/ool.
&egisterait"or$ingle(bJect(
L*n cF th sO )ng cc lp )3n ;ut tQ WaitHandle gS $c tho lu6n trong .c _.]h g0i
th=c thi .t phMng th:c. L5ng phMng th:c RegisterWaitForSingleObject ca lp
ThreadPool8 &*n cF th vng kB th hin ' nhi. WaitOrTimerCallback vi thr(a)zpool khi
.t Di t$ng )3n ;ut tQ WaitHandle i vo tr*ng thi 8"gnaDeA. L*n cF th cu h%nh thr(a)z
pool th=c thi phMng th:c chJ .t lNn ha' t= ng vng kB l*i phMng th:c .#i khi
WaitHandle i vo tr*ng thi 8"gnaDeA. HIu WaitHandle S C tr*ng thi 8"gnaDeA khi &*n g0i
RegisterWaitForSingleObject8 phMng th:c s@ th=c thi nga' l6p t:c. RhMng th:c
133
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
Unregister ca Di t$ng System.Threading.RegisteredWaitHandle g$c tr v &Ci phMng
th:c RegisterWaitForSingleObjecth $c sO )ng h' &V vic vng kB.
yp thng $c )eng l. & k2ch ho*t l AutoResetEvent8 nF s@ t= ng chu'n sang tr*ng
thi un8"gnaDeA sau khi C tr*ng thi 8"gnaDeA. 7u' nhi>n8 &*n c?ng cF th tha' si tr*ng thi
8"gnaDeA th(o B .uDn &5ng lp ManualResetEvent ha' Mutex. u2 ) )i <' tr%nh &' cch sO
)ng .t AutoResetEvent k2ch ho*t th=c thi .t phMng th:c cF t>n l EventHandler.
using System;
using System.Threading;
public class EventExecutionExample {
// Phng thc s doc thc thi khi AutoResetEvent di vo trang
// thi signaled hoac qu trnh doi ht thi gian (time-out).
private static void EventHandler(object state, bool timedout) {
// Hin th thng bo thch hop ra cua s Console
// tuy vo qu trnh doi d ht thi gian hay
// AutoResetEvent d o trang thi signaled.
if (timedout) {

Console.WriteLine("{0} : Wait timed out.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
} else {
Console.WriteLine("{0} : {1}",
DateTime.Now.ToString("HH:mm:ss.ffff"), state);
}
}
public static void Main() {
// Tao mt AutoResetEvent o trang thi unsignaled.
AutoResetEvent autoEvent = new AutoResetEvent(false);
// Tao mt th hin uy nhim WaitOrTimerCallback
// tham chiu dn phng thc tnh EventHandler.
// EventHandler s doc goi khi AutoResetEvent di vo
// trang thi signaled hay qu trnh doi ht thi gian.
134
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
WaitOrTimerCallback handler =
new WaitOrTimerCallback(EventHandler);
// Tao di tong trang thi (doc truyn cho phng thc
// th l s kin khi n doc kch hoat). Trong trng hop
// ny, mt thng bo s doc hin th.
string state = "AutoResetEvent signaled.";
// ang k th hin uy nhim d doi AutoResetEvent di vo
// trang thi signaled. Thit lp gi tr time-out l 3 giy.
RegisteredWaitHandle handle =
ThreadPool.RegisterWaitForSingleObject(autoEvent, handler,
state, 3000, false);
Console.WriteLine("Press ENTER to signal the AutoResetEvent" +
" or enter "Cancel" to unregister the wait operation.");
while (Console.ReadLine().ToUpper() != "CANCEL") {
// Nu "Cancel" khng doc nhp vo Console,
// AutoResetEvent s di vo trang thi signal,
// v phng thc EventHandler doc thc thi.
// AutoResetEvent s t dng tro v trang thi unsignaled.
autoEvent.Set();
}
// Huy bo vic dang k qu trnh doi.
Console.WriteLine("Unregistering wait operation.");
handle.Unregister(null);
// Nhn Enter d kt thc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
}
135
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
5'
5' Th c thi %h ng th c ! ng ti u tr&nh m i Th c thi %h ng th c ! ng ti u tr&nh m i
#eA OZKA Q>nJ Q>@ O} YqA> QHXAB OIQ Q@tZ QHlA> H@CAB, D\ OZKA s@tO fXSQ >X\A
QX\A ZS QHlA> Q>nJ Q>@ D\ QHeAB Q>S@ Jbc Q@tZ QHlA> L^(
3>c@ FSX OIQ d>V[AB Q>~J QHR DG void D\ s>TAB J^ LK@ fK( ScZ L^, QeX OIQ Q>t
>@qA b] A>@qO $!stem.).reading.).read$tart Q>cO J>@jZ LjA d>V[AB Q>~J A\](
T@jd Q>X, QeX OIQ LK@ QVWAB $!stem.).reading.).read OE@, D\ QHZ]GA Q>t >@qA b]
A>@qO J>X d>V[AB Q>~J s>@ hnAB Jbc A^( 3j LjA, B@ d>V[AB Q>~J
).read.$tart Lt F{Q LwZ Q>nJ Q>@ d>V[AB Q>~J Jbc FeA(
l tvng linh ho*t v .:c ki. sot khi hin th=c cc :ng )ng h#ztr$zaztiuztr%nh8 &*n
phi tr=c tiIp t*o v 9un lB cc tiu tr%nh. l<' l cch tiIp c6n ph:c t*p nht trong vic l6p
tr%nh h#ztr$zaztiuztr%nh8 nhng F c?ng l cch )u' nht v$t 9ua nhKng h*n chI cD hKu
trong cc cch tiIp c6n sO )ng cc tiu tr%nh trong thr(a)zpool8 nh S $c tho lu6n trong
&Dn .c trc. yp Thread cung cp .t cM chI . 9ua F &*n cF th t*o v ki. sot cc
tiu tr%nh. l t*o v ch*' .t tiu tr%nh .i8 &*n hS' tiIn hnh th(o cc &c sau\
Z. 7*o .t Di t$ng ' nhi. ThreadStart tha. chiIu In phMng th:c ch:a .S lnh
. &*n .uDn )eng .t tiu tr%nh .i ch*' nF. piDng nh cc ' nhi. khc8
ThreadStart cF th tha. chiIu In .t phMng th:c tqnh ha' phMng th:c ca .t Di
t$ng. RhMng th:c $c tha. chiIu phi tr v void v kh4ng cF Di sD.
]. 7*o .t Di t$ng Thread8 v tru'n th hin ' nhi. ThreadStart cho phMng th:c
khCi )=ng ca nF. 7iu tr%nh .i cF tr*ng thi &an Nu l Unstarted g.t thnh vi>n
thuc kiu lit k> System.Threading.ThreadStateh.
^. p0i th=c thi phMng th:c Start ca Di t$ng Thread chu'n tr*ng thi ca nF sang
ThreadState.Running v &/t Nu th=c thi phMng th:c $c tha. chiIu &Ci th hin '
nhi. ThreadStart gnIu &*n g0i phMng th:c Start 9u .t lNn8 nF s@ nX. ngo*i l
System.Threading.ThreadStateExceptionh.
u% ' nhi. ThreadStart khai &o kh4ng cF Di sD8 &*n kh4ng th tru'n )K liu tr=c tiIp cho
phMng th:c $c tha. chiIu. l tru'n )K liu cho tiu tr%nh .i8 &*n phi cu h%nh )K liu
l kh tru' ;ut Di vi .S lnh ang ch*' trong tiu tr%nh .i. Pch tiIp c6n th4ng thng l
t*o .t lp Fng gFi c )K liu cNn cho tiu tr%nh v phMng th:c $c th=c thi &Ci tiu tr%nh.
whi .uDn ch*' .t tiu tr%nh .i8 &*n hS' t*o .t Di t$ng ca lp n'8 cu h%nh tr*ng thi
cho nF8 v rti ch*' tiu tr%nh. Ui <' l .t v2 )\
using System;
using System.Threading;
public class ThreadExample {
// Cc bin gi thng tin trang thi.
private int iterations;
private string message;
private int delay;
136
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
public ThreadExample(int iterations, string message, int delay) {
this.iterations = iterations;
this.message = message;
this.delay = delay;
}
public void Start() {
// Tao mt th hin uy nhim ThreadStart
// tham chiu dn DisplayMessage.
ThreadStart method = new ThreadStart(this.DisplayMessage);
// Tao mt di tong Thread v truyn th hin uy nhim
// ThreadStart cho phng thc khoi dng cua n.
Thread thread = new Thread(method);
Console.WriteLine("{0} : Starting new thread.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
// Khoi chay tiu trnh mi.
thread.Start();
}
private void DisplayMessage() {
// Hin th thng bo ra cua s Console vi s ln
// doc ch dnh (iterations), ngh gia mi thng bo
// mt khoang thi gian doc ch dnh (delay).
for (int count = 0; count iterations; count++) {
Console.WriteLine("{0} : {1}",
DateTime.Now.ToString("HH:mm:ss.ffff"), message);
Thread.Sleep(delay);
}
}
137
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
public static void Main() {
// Tao mt di tong ThreadExample.
ThreadExample example =
new ThreadExample(5, "A thread example.", 500);
// Khoi chay di tong ThreadExample.
example.Start();
// Tip tc thc hin cng vic khc.
for (int count = 0; count 13; count++) {
Console.WriteLine("{0} : Continue processing...",
DateTime.Now.ToString("HH:mm:ss.ffff"));
Thread.Sleep(200);
}
// Nhn Enter d kt thc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
}
6'
6' i u "hi n )u tr&nh th c thi c a m t ti u tr&nh i u "hi n )u tr&nh th c thi c a m t ti u tr&nh
#eA JwA A{O Z]GA L@GZ s>@tA s>@ OIQ Q@tZ QHlA> J>e] D\ hAB, D\ J^ Q>t QeO
hAB ZS QHlA> Q>nJ Q>@ Jbc OIQ Q@tZ QHlA>(
Sg hUAB JSJ d>V[AB Q>~J #bort, Enterrupt, &esume, $tart, D\ $uspend Jbc ).read
O\ FeA JwA L@GZ s>@tA(
Pc phMng th:c ca lp Thread $c tF. t/t trong &ng _.Z cung cp .t cM chI iu khin
.:c cao l>n 9u tr%nh th=c thi ca .t tiu tr%nh. "#i phMng th:c n' trC v tiu tr%nh ang
g0i nga' l6p t:c. 7u' nhi>n8 tr*ng thi ca tiu tr%nh hin hnh Fng vai trk 9uan tr0ng trong
kIt 9u ca li g0i phMng th:c8 v tr*ng thi ca .t tiu tr%nh cF th tha' si nhanh chFng.
wIt 9u l8 &*n phi viIt .S &/t v th lB cc ngo*i l cF th &i nX. khi &*n cD iu khin
9u tr%nh th=c thi ca .t Thread.
yp ThreadControlExample )i <' tr%nh &' cch sO )ng cc phMng th:c $c lit k>
trong &ng _.Z. u2 ) n' khCi ch*' .t tiu tr%nh th: hai8 hin thi inh k .t th4ng &o ra
cOa ss Con8oDe v rti i vo tr*ng thi nghJ g8DeeKh. L5ng cch nh6p cc lnh t*i )u nh/c
lnh8 &*n cF th gin o*n8 t*. hoSn8 phc hti8 v h' &V tiu tr%nh th: hai.
138
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
Bfng 4'1 iu khin qu trnh thuc thi ca mt tiu trnh
Phng `hcc ?i `f
Abort
wIt thGc .t tiu tr%nh &5ng cch nX. ngo*i l System.Threading.
ThreadAbortException trong .S lnh ang $c ch*'. "S lnh ca tiu
tr%nh &i h' cF th &/t ngo*i l ThreadAbortException th=c hin vic
)0n )p8 nhng & th=c thi s@ t= ng nX. ngo*i l n' lNn nKa &o
. tiu tr%nh kIt thGc8 trQ khi ResetAbort $c g0i. Abort trC v nga'
l6p l:c8 nhng & th=c thi ;c inh ch2nh ;c khi no ngo*i l &i nX.8
)o F &*n kh4ng th cho r5ng tiu tr%nh S kIt thGc &Ci Abort S trC v.
L*n n>n sO )ng cc k thu6t $c .4 t trong .c _.[ nIu cNn ;c
inh khi no tiu tr%nh n' th6t s= kIt thGc. "t khi S h' .t tiu
tr%nh8 &*n kh4ng th khCi ch*' l*i nF.
Interrupt
HX. ngo*i l System.Threading.ThreadInterruptedException gtrong
.S lnh ang $c ch*'h lGc tiu tr%nh ang C tr*ng thi WaitSleepJoin.
liu n' nghqa l tiu tr%nh n' S g0i Sleep8 Join g.c _.[hT ho!c ang
$i WaitHandle ra hiu g i vo tr*ng thi 8"gnaDeAh ha' ang $i .t
Di t$ng )eng cho s= tng & tiu tr%nh g.c _.bh. HIu tiu tr%nh n'
kh4ng C tr*ng thi WaitSleepJoin8 ThreadInterruptedException s@ &i
nX. sau khi tiu tr%nh i vo tr*ng thi WaitSleepJoin.
Resume
Rhc hti 9u tr%nh th=c thi ca .t tiu tr%nh S &i t*. hoSn g;(.
phMng th:c Suspendh. uic g0i Resume tr>n .t tiu tr%nh cha &i t*.
hoSn s@ sinh ra ngo*i l System.Threading.ThreadStateException trong
tiu tr%nh ang g0i.
Start
whCi ch*' tiu tr%nh .iT ;(. .c _.` &iIt cch sO )ng phMng
th:c Start.
Suspend
7*. hoSn 9u tr%nh th=c thi ca .t tiu tr%nh cho In khi phMng th:c
Resume $c g0i. uic t*. hoSn .t tiu tr%nh S &i t*. hoSn s@ kh4ng
cF hiu l=c8 nhng vic g0i Suspend tr>n .t tiu tr%nh cha khCi ch*'
ho!c S kIt thGc s@ sinh ra ngo*i l ThreadStateException trong tiu
tr%nh ang g0i.
using System;
using System.Threading;
public class ThreadControlExample {
private static void DisplayMessage() {
// Lap di lap lai vic hin th mt thng bo ra cua s Console.
139
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
while (true) {
try {
Console.WriteLine("{0} : Second thread running. Enter"
+ " (S)uspend, (R)esume, (I)nterrupt, or (E)xit.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
// Ngh 2 giy.
Thread.Sleep(2000);
} catch (ThreadInterruptedException) {
// Tiu trnh d b gin doan. Vic bt ngoai l
// ThreadInterruptedException cho php v d ny
// thc hin hnh dng phu hop v tip tc thc thi.
Console.WriteLine("{0} : Second thread interrupted.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
} catch (ThreadAbortException abortEx) {
// i tong trong thuc tnh
// ThreadAbortException.ExceptionState doc cung cp
// boi tiu trnh d goi Thread.Abort.
// Trong trng hop ny, n cha mt chui
// m ta l do cua vic huy bo.
Console.WriteLine("{0} : Second thread aborted ({1})",
DateTime.Now.ToString("HH:mm:ss.ffff"),
abortEx.ExceptionState);
// Mac du ThreadAbortException d doc th l,
// b thc thi s nm n ln na d bao dam
// tiu trnh kt thc.
}
}
}
public static void Main() {
140
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
// Tao mt di tong Thread v truyn cho n mt th hin
// uy nhim ThreadStart tham chiu dn DisplayMessage.
Thread thread = new Thread(new ThreadStart(DisplayMessage));
Console.WriteLine("{0} : Starting second thread.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
// Khoi chay tiu trnh th hai.
thread.Start();
// Lap v xu l lnh do ngi dung nhp.
char command = ' ';
do {
string input = Console.ReadLine();
if (input.Length 0) command = input.ToUpper()[0];
else command = ' ';
switch (command) {
case 'S':
// Tam hon tiu trnh th hai.
Console.WriteLine("{0} : Suspending second thread.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
thread.Suspend();
break;
case 'R':
// Phc hi tiu trnh th hai.
try {
Console.WriteLine("{0} : Resuming second " +
"thread.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
thread.Resume();
141
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
} catch (ThreadStateException) {
Console.WriteLine("{0} : Thread wasn't " +
"suspended.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
}
break;
case 'I':
// Gin doan tiu trnh th hai.
Console.WriteLine("{0} : Interrupting second " +
"thread.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
thread.Interrupt();
break;
case 'E':
// Huy bo tiu trnh th hai v truyn mt di tong
// trang thi cho tiu trnh dang b huy,
// trong trng hop ny l mt thng bo.
Console.WriteLine("{0} : Aborting second thread.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
thread.Abort("Terminating example.");
// oi tiu trnh th hai kt thc.
thread.Join();
break;
}
} while (command != 'E');
// Nhn Enter d kt thc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
}
142
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
7'
7' Nh n !i t "hi no m t ti u tr&nh " t th;c Nh n !i t "hi no m t ti u tr&nh " t th;c
#eA OZKA F@jQ s>@ A\X OIQ Q@tZ QHlA> L} sjQ Q>J(
Sg hUAB Q>ZIJ QaA> Es#live >c] d>V[AB Q>~J Koin Jbc YEd ).read(
Pch )r nht ki. tra .t tiu tr%nh S kIt thGc ha' cha l ki. tra thuc t2nh
Thread.IsAlive. 7huc t2nh n' tr v true nIu tiu tr%nh S $c khCi ch*' nhng cha kIt
thGc ha' &i h'.
7h4ng thng8 &*n s@ cNn .t tiu tr%nh $i .t tiu tr%nh khc hon tt vic ;O lB ca nF.
7ha' v% ki. tra thuc t2nh IsAlive trong .t vkng l!p8 &*n cF th sO )ng phMng th:c
Thread.Join. RhMng th:c n' khiIn tiu tr%nh ang g0i )Qng l*i g&lockh cho In khi tiu
tr%nh $c tha. chiIu kIt thGc. L*n cF th te' ch0n chJ inh .t khong thi gian ggi tri int
ha' TimeSpanh . sau khong thi gian n'8 Join s@ hIt hiu l=c v 9u tr%nh th=c thi ca tiu
tr%nh ang g0i s@ phc hti l*i. HIu &*n chJ inh .t gi tri ti.(zout8 Join tr v true nIu tiu
tr%nh S kIt thGc8 v false nIu Join S hIt hiu l=c.
u2 ) )i <' th=c thi .t tiu tr%nh th: hai v rti g0i Join $i tiu tr%nh th: hai kIt thGc.
u% tiu tr%nh th: hai .t ` gi<' th=c thi8 nhng phMng th:c Join chJ inh gi tri ti.(zout
l ^ gi<'8 n>n Join s@ lu4n hIt hiu l=c v v2 ) n' s@ hin thi .t th4ng &o ra cOa ss
Con8oDe.
using System;
using System.Threading;
public class ThreadFinishExample {
private static void DisplayMessage() {
// Hin th mt thng bo ra cua s Console 5 ln.
for (int count = 0; count 5; count++) {
Console.WriteLine("{0} : Second thread",
DateTime.Now.ToString("HH:mm:ss.ffff"));
// Ngh 1 giy.
Thread.Sleep(1000);
}
}
143
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
public static void Main() {
// Tao mt th hin uy nhim ThreadStart
// tham chiu dn DisplayMessage.
ThreadStart method = new ThreadStart(DisplayMessage);
// Tao mt di tong Thread v truyn th hin uy nhim
// ThreadStart cho phng thc khoi dng cua n.
Thread thread = new Thread(method);
Console.WriteLine("{0} : Starting second thread.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
// Khoi chay tiu trnh th hai.
thread.Start();
// Dung cho dn khi tiu trnh th hai kt thc,
// hoac Join ht hiu lc sau 3 giy.
if (!thread.Join(3000)) {
Console.WriteLine("{0} : Join timed out !!",
DateTime.Now.ToString("HH:mm:ss.ffff"));
}
// Nhn Enter d kt thc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
}
8' 8' ng ! h'a )u tr&nh th c thi c a nhi u ti u tr&nh ng ! h'a )u tr&nh th c thi c a nhi u ti u tr&nh
#eA JwA d>K@ >Wd JSJ >XeQ LIAB Jbc A>@GZ Q@tZ QHlA> Lt FRX LRO fg hUAB >@qZ
ZR JSJ Q\@ ABZ]CA hrAB J>ZAB, D\ FeA s>TAB Y\O fc@ YeJ h? Y@qZ hrAB J>ZAB s>@
OIQ d>d J>Z]tA AB? JRA> Q@tZ QHlA> ithrea& conte8t switchk vR] Hc QHXAB ZS
QHlA> Q>c] L@ h? Y@qZ(
Sg hUAB JSJ YEd Monitor, #uto&eset0vent, Manual&eset0vent, D\ Mutex iQ>ZIJ
s>TAB B@cA QCA $!stem.).readingk(
144
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
7hch th:c ln nht trong vic viIt .t :ng )ng h#ztr$zaztiuztr%nh l &o . cc tiu
tr%nh l. vic trong s= hka h$p. uic n' thng $c g0i l +tng & hFa tiu tr%nh- v &ao
gt.\
Lo . cc tiu tr%nh tru' ;ut cc Di t$ng v )K liu )eng chung .t cch phe h$p
kh4ng g<' ra sai l*c.
Lo . cc tiu tr%nh chJ th=c thi khi th6t s= cNn thiIt v phi . &o r5ng chGng chJ
$c th=c thi vi chi ph2 tDi thiu khi chGng r#i.
PM chI tng & hFa th4ng )ng nht l lp Monitor. yp n' cho phXp .t tiu tr%nh Mn thu
l' chDt gDo)kh tr>n .t Di t$ng &5ng cch g0i phMng th:c tqnh Monitor.Enter. L5ng cch
thu l' chDt trc khi tru' ;ut .t ti ngu'>n ha' )K liu )eng chung8 ta ch/c ch/n r5ng chJ
cF .t tiu tr%nh cF th tru' ;ut ti ngu'>n F ceng lGc. "t khi S hon tt vi ti ngu'>n8
tiu tr%nh n' s@ gii phFng chDt tiu tr%nh khc cF th tru' ;ut nF. whDi .S th=c hin
c4ng vic n' thng $c g0i l veng hnh cvng g)r"/")aD 8e)/"onh.
L*n cF th sO )ng &t k Di t$ng no Fng vai trk l. chDt8 v sO )ng tQ khFa this
thu l' chDt tr>n Di t$ng hin t*i. li. ch2nh l tt c cc tiu tr%nh khi tru' ;ut .t ti
ngu'>n )eng chung phi thu l' ceng .t chDt. Pc tiu tr%nh khc khi thu l' chDt tr>n ceng
.t Di t$ng s@ &lock gi vo tr*ng thi WaitSleepJoinh v $c th>. vo hng sn sng
greaAy Mueueh ca chDt n' cho In khi tiu tr%nh ch gii phFng nF &5ng phMng th:c tqnh
Monitor.Exit. whi tiu tr%nh ch g0i Exit8 .t trong cc tiu tr%nh tQ hng sn sng s@ thu l'
chDt. HIu tiu tr%nh ch kh4ng gii phFng chDt &5ng Exit8 tt c cc tiu tr%nh khc s@ &lock
v4 h*n inh. u% v6'8 cNn !t li g0i Exit &>n trong khDi finally &o . nF $c g0i c
khi ngo*i l ;' ra.
u% Monitor thng ;u'>n $c sO )ng trong cc :ng )ng h#ztr$zaztiuztr%nh n>n C# cung
cp h# tr$ .:czng4nzngK th4ng 9ua lnh lock. whDi .S $c gFi trong lnh lock tMng
Mng vi g0i Monitor.Enter khi i vo khDi .S n'8 v g0i Monitor.Exit khi i ra khDi .S
n'. Hgoi ra8 tr%nh &i>n )ich t= ng !t li g0i Monitor.Exit trong khDi finally &o .
chDt $c gii phFng khi .t ngo*i l &i nX..
7iu tr%nh ch gsC hKu chDth cF th g0i Monitor.Wait gii phFng chDt v !t tiu tr%nh n'
vo hng ch gwa"/ Mueueh. Pc tiu tr%nh trong hng ch c?ng cF tr*ng thi l WaitSleepJoin
v s@ tiIp tc &lock cho In khi tiu tr%nh ch g0i phMng th:c Pulse ha' PulseAll ca lp
Monitor. RhMng th:c Pulse )i chu'n .t trong cc tiu tr%nh tQ hng ch vo hng sn
sng8 ckn phMng th:c PulseAll th% )i chu'n tt c cc tiu tr%nh. whi .t tiu tr%nh S $c
)i chu'n tQ hng ch vo hng sn sng8 nF cF th thu l' chDt trong lNn gii phFng kI tiIp.
PNn hiu r5ng cc tiu tr%nh thuc hng ch s@ kh4ng thu $c chDt8 chGng s@ $i v4 h*n inh
cho In khi &*n g0i Pulse ha' PulseAll )i chu'n chGng vo hng sn sng. |O )ng Wait
v Pulse l cch phs &iIn khi thr(a)zpool $c sO )ng ;O lB cc it(. tQ .t hng $i
)eng chung.
yp ThreadSyncExample )i <' tr%nh &' cch sO )ng lp Monitor v lnh lock. u2 ) n'
khCi ch*' &a tiu tr%nh8 .#i tiu tr%nh glNn l$th thu l' chDt ca .t Di t$ng cF t>n l
consoleGate. wI F8 .#i tiu tr%nh g0i phMng th:c Monitor.Wait. whi ngi )eng nhn
En/er lNn Nu ti>n8 Monitor.Pulse s@ $c g0i gii phFng .t tiu tr%nh ang ch. yNn th:
145
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
hai ngi )eng nhn En/er8 Monitor.PulseAll s@ $c g0i gii phFng tt c cc tiu tr%nh
ang ch ckn 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 ly cht trn di tong consoleGate.
try {
Monitor.Enter(consoleGate);
Console.WriteLine("{0} : {1}",
DateTime.Now.ToString("HH:mm:ss.ffff"),
"Acquired consoleGate lock, waiting...");
// oi cho dn khi Pulse doc goi trn di tong consoleGate.
Monitor.Wait(consoleGate);
Console.WriteLine("{0} : Thread pulsed, terminating.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
} finally {
Monitor.Exit(consoleGate);
}
}
public static void Main() {
146
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
// Thu ly cht trn di tong consoleGate.
lock (consoleGate) {
// Tao v khoi chay ba tiu trnh mi
// (chay phng thc DisplayMesssage).
for (int count = 0; count 3; count++) {
(new Thread(new ThreadStart(DisplayMessage))).Start();
}
}
Thread.Sleep(1000);
// nh thc mt tiu trnh dang ch.
Console.WriteLine("{0} : {1}",
DateTime.Now.ToString("HH:mm:ss.ffff"),
"Press Enter to pulse one waiting thread.");
Console.ReadLine();
// Thu ly cht trn di tong consoleGate.
lock (consoleGate) {

// Pulse mt tiu trnh dang ch.
Monitor.Pulse(consoleGate);
}
// nh thc tt ca cc tiu trnh dang ch.
Console.WriteLine("{0} : {1}",
DateTime.Now.ToString("HH:mm:ss.ffff"),
"Press Enter to pulse all waiting threads.");
Console.ReadLine();
// Thu ly cht trn di tong consoleGate.
147
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
lock (consoleGate) {

// Pulse tt ca cc tiu trnh dang ch.
Monitor.PulseAll(consoleGate);
}
// Nhn Enter d kt thc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
}
Pc lp th4ng )ng khc )eng tng & hFa tiu tr%nh l cc lp con ca lp
System.Threading.WaitHandle8 &ao gt. AutoResetEvent8 ManualResetEvent8 v Mutex. 7h
hin ca cc lp n' cF th C tr*ng thi 8"gnaDeA ha' un8"gnaDeA. Pc tiu tr%nh cF th sO )ng
cc phMng th:c ca cc lp $c lit k> trong &ng _.] g$c thQa kI tQ lp WaitHandleh
i vo tr*ng thi WaitSleepJoin v $i tr*ng thi ca .t ha' nhiu Di t$ng )3n ;ut tQ
WaitHandle &iIn thnh 8"gnaDeA.
Bfng 4'2 Cc phng thc ca WaitHandle dng d dng b ha qu trnh thuc thi ca cc tiu
trnh
Phng `hcc ?i `f
WaitAny
7iu tr%nh g0i phMng th:c tqnh n' s@ i vo tr*ng thi WaitSleepJoin
v $i &t k .t trong cc Di t$ng WaitHandle thuc .t .ng
WaitHandle &iIn thnh 8"gnaDeA. L*n c?ng cF th chJ inh gi tri ti.(z
out.
WaitAll
7iu tr%nh g0i phMng th:c tqnh n' s@ i vo tr*ng thi WaitSleepJoin
v $i tt c cc Di t$ng WaitHandle trong .t .ng WaitHandle &iIn
thnh 8"gnaDeA. L*n c?ng cF th chJ inh gi tri ti.(zout. RhMng th:c
WaitAllExample trong .c _.] S tr%nh &' cch sO )ng phMng th:c
WaitAll.
WaitOne
7iu tr%nh g0i phMng th:c n' s@ i vo tr*ng thi WaitSleepJoin v
$i .t Di t$ng WaitHandle c th &iIn thnh 8"gnaDeA. RhMng th:c
WaitingExample trong .c _.] S tr%nh &' cch sO )ng phMng th:c
WaitOne.
li. khc &it ch2nh giKa cc lp AutoResetEvent8 ManualResetEvent8 v Mutex l cch th:c
chGng chu'n tr*ng thi tQ 8"gnaDeA thnh un8"gnaDeA8 v t2nh kh kiIn gB"8"4"D"/yh ca chGng.
yp AutoResetEvent v ManualResetEvent l cc & Di vi .t tiIn tr%nh. l ra hiu .t
AutoResetEvent8 &*n hS' g0i phMng th:c Set ca nF8 phMng th:c n' chJ gii phFng .t
tiu tr%nh ang $i s= kin. AutoResetEvent s@ t= ng trC v tr*ng thi un8"gnaDeA. u2 )
trong .c _._ S tr%nh &' cch sO )ng lp AutoResetEvent.
148
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
yp ManualResetEvent phi $c chu'n si 9ua l*i giKa 8"gnaDeA v un8"gnaDeA &5ng
phMng th:c Set v Reset ca nF. p0i Set tr>n .t ManualResetEvent s@ !t tr*ng thi ca nF
l 8"gnaDeA8 gii phFng tt c cc tiu tr%nh ang $i s= kin. PhJ khi g0i Reset .i l. cho
ManualResetEvent trC thnh un8"gnaDeA.
"t Mutex l 8"gnaDeA khi nF kh4ng thuc sC hKu ca &t k tiu tr%nh no. "t tiu tr%nh
ginh 9u'n sC hKu Mutex lGc khCi )=ng ho!c sO )ng .t trong cc phMng th:c $c lit
k> trong &ng _.]. Yu'n sC hKu Mutex $c gii phFng &5ng cch g0i phMng th:c
Mutex.ReleaseMutex gra hiu Mutex v cho phXp .t tiu tr%nh khc thu l' 9u'n sC hKu
n'h. 7hu6n l$i ch2nh ca Mutex l &*n cF th sO )ng chGng tng & hFa cc tiu tr%nh 9ua
cc &i>n tiIn tr%nh. "c _.Z] S tr%nh &' cch sO )ng Mutex.
Hgoi cc ch:c nvng vQa $c .4 t8 i. khc &it ch2nh giKa cc lp WaitHandle v lp
Monitor l lp Monitor $c hin th=c hon ton &5ng .S lnh $cz9unzlB8 trong khi cc
lp WaitHandle cung cp vV &0c cho cc ch:c nvng &>n )i ca ca h iu hnh. liu n'
)3n In h 9u l\
|O )ng lp Monitor tng nghqa vi vic .S lnh ca &*n s@ kh chu'n hMn v% kh4ng
&i l thuc vo kh nvng ca h iu hnh &>n )i.
L*n cF th sO )ng cc lp )3n ;ut tQ WaitHandle tng & hFa vic th=c thi ca cc
tiu tr%nh $cz9unzlB v kh4ngz$cz9unzlB8 trong khi lp Monitor chJ cF th tng
& hFa cc tiu tr%nh $cz9unzlB.
9'
9' T o m t i t ng t % h % c' t7nh ch t an-ton-v -ti u-tr&nh T o m t i t ng t % h % c' t7nh ch t an-ton-v -ti u-tr&nh
#eA OZKA A>@GZ Q@tZ QHlA> J^ Q>t LAB Q>o@ QHZ] vZPQ AI@ hZAB Jbc OIQ QNd >Wd
OIQ JSJ> cA QX\A(
Sg hUAB YqA> loc: Lt LAB FI >^c JSJ Q@tZ QHlA> QHZ] vZPQ LjA QNd >Wd, >X_J QHZ]
vZPQ QNd >Wd Q>TAB Zc OIQ D FJ J^ QaA> J>PQ cA6QX\A6DG6Q@tZ6QHlA> ithrea&?
safek(
7h(o .!c inh8 cc lp t6p h$p chuxn thuc kh4ng gian t>n System.Collections v
System.Collections.Specialized s@ h# tr$ vic nhiu tiu tr%nh tng thi 0c ni )ung ca
t6p h$p. 7u' nhi>n8 nIu .t ha' nhiu tiu tr%nh n' sOa si t6p h$p8 nht inh &*n s@ g!p r/c
rDi. lF l v% h iu hnh cF th l. :t 9uSng cc hnh ng ca tiu tr%nh trong khi t6p h$p
chJ .i $c sOa si .t phNn. liu n' s@ a t6p h$p vo .t tr*ng thi v4 inh8 ch/c
ch/n khiIn cho .t tiu tr%nh khc tru' ;ut t6p h$p tht &*i8 tr v )K liu sai8 ho!c l. hVng
t6p h$p.
Sg hUAB LAB FI >^c Q@tZ QHlA> fm f@A> Hc OIQ J>@ d>a >@qZ AAB( C~ Lt QNd
>Wd Y\ s>TAB6cA6QX\A6DG6Q@tZ6QHlA> inon?threa&?safek A>V O_J LMA> fm J>X >@qZ
AAB QKQ >[A LK@ DE@ JSJ QHVoAB >Wd J^ A>@GZ Q@tZ QHlA> s>TAB LVWJ hrAB LjA(
7t c cc t6p h$p th4ng )ng nht u hin th=c .t phMng th:c tqnh cF t>n l
SynchronizedT &ao gt. cc lp\ ArrayList8 Hashtable8 ueue8 SortedList8 v Stack gthuc
kh4ng gian t>n System.Collectionsh. RhMng th:c Synchronized nh6n .t Di t$ng t6p h$p
149
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
gvi kiu phe h$ph l. Di sD v tr v .t Di t$ng cung cp .t vV &0c $cztngz&zhFa
g8yn)hron"OeA wraKKerh &ao l' Di t$ng t6p h$p S $c chJ inh. lDi t$ng vV &0c n' cF
ceng kiu vi t6p h$p gDc8 nhng tt c cc phMng th:c v thuc t2nh )eng 0c v ghi t6p
h$p &o . r5ng chJ .t tiu tr%nh cF kh nvng tru' ;ut ni )ung ca t6p h$p ceng lGc.
lo*n .S )i <' tr%nh &' cch t*o .t Hashtable cF t2nh cht anztonzvztiuztr%nh g&*n cF
th ki. tra .t t6p h$p cF phi l anztonzvztiuztr%nh ha' kh4ng &5ng thuc t2nh
IsSynchronizedh.
// Tao mt Hashtable chun.
Hashtable hUnsync = new Hashtable();
// Tao mt vo boc doc-dng-b-ha.
Hashtable hSync = Hashtable.Synchronized(hUnsync);
Pc lp t6p h$p nh HybridDictionary8 ListDictionary8 v StringCollection gthuc kh4ng
gian t>n System.Collections.Specializedh kh4ng hin th=c phMng th:c Synchronized. l
cung cp kh nvng tru' ;ut anztonzvztiuztr%nh In th hin ca cc lp n'8 &*n phi hin
th=c 9u tr%nh tng & hFa gsO )ng Di t$ng $c tr v tQ thuc t2nh SyncRooth nh $c
tr%nh &' trong o*n .S )i <'\
// Tao mt NameValueCollection.
NameValueCollection nvCollection = new NameValueCollection();
// Thu ly cht trn NameValueCollection trc khi thc hin sua di.
lock (((ICollection)nvCollection).SyncRoot) {
// Sua di NameValueCollection...
}
PhG B r5ng lp NameValueCollection )3n ;ut tQ lp NameObjectCollectionBase8 lp cM sC
n' sO )ng cM chI hin th=c giao )in tng .inh hin th=c thuc t2nh
ICollection.SyncRoot. Hh S $c tr%nh &'8 &*n phi Xp NameValueCollection v
ICollection trc khi tru' ;ut thuc t2nh SyncRoot. uic Xp kiu l kh4ng cNn thiIt Di vi
cc lp t6p h$p chu'>n &it nh HybridDictionary8 ListDictionary8 v StringCollection
gcc lp n' kh4ng sO )ng cM chI hin th=c giao )in tng .inh hin th=c SyncRooth.
HIu cNn sO )ng rng kh/p lp t6p h$p S $c tng & hFa8 &*n cF th Mn gin hFa .S
lnh &5ng cch t*o .t lp .i )3n ;ut tQ lp t6p h$p cNn sO )ng. wI tiIp8 chXp 1 cc
thnh vi>n ca lp cM sC cung cp kh nvng tru' ;ut ni )ung ca t6p h$p v th=c hin tng
& hFa trc khi g0i thnh vi>n lp cM sC tMng Mng. L*n cF th sO )ng lnh lock .t
cch &%nh thng tng & hFa Di t$ng $c tr v &Ci thuc t2nh SyncRoot ca lp cM sC
nh S $c tho lu6n C tr>n. 7u' nhi>n8 &5ng cch t*o lp )3n ;ut8 &*n cF th hin th=c cc
k thu6t tng & hFa cao cp hMn8 ch~ng h*n sO )ng System.Threading.ReaderWriterLock
cho phXp nhiu tiu tr%nh 0c nhng chJ .t tiu tr%nh ghi.
10' 10' .h i ch y m t ti n tr&nh m i .h i ch y m t ti n tr&nh m i
#eA JwA Q>nJ Q>@ OIQ ~AB hUAB QHXAB OIQ Q@jA QHlA> OE@(
150
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
Sg hUAB LK@ QVWAB $!stem.-iagnostics./rocess$tartEn*o Lt J> LMA> JSJ J>@ Q@jQ
J>X ~AB hUAB JwA J>e]( ScZ L^, QeX LK@ QVWAB $!stem.-iagnostics./rocess Lt OT
QR Q@jA QHlA> OE@, BSA LK@ QVWAB /rocess$tartEn*o J>X Q>ZIJ QaA> $tartEn*o Jbc
LK@ QVWAB /rocess, D\ H@ s>@ J>e] ~AB hUAB F`AB JSJ> B@ /rocess.$tart(
yp Process cung cp .t )*ng &iu )irn $cz9unzlB cho .t tiIn tr%nh ca h iu hnh
v cung cp .t cM chI Mn gin . th4ng 9ua F8 &*n cF th th=c thi c :ng )ng $cz
9unzlB l3n kh4ngz$cz9unzlB. yp Process hin th=c &Dn phi>n &n n*p chtng cho
phMng th:c Start g&*n cF th sO )ng phMng th:c n' khCi ch*' .t tiIn tr%nh .ih.
nai trong sD n' l cc phMng th:c tqnh8 cho phXp &*n chJ inh t>n v cc Di sD cho tiIn
tr%nh .i. u2 )8 hai lnh )i <' u th=c thi No/eKaA trong .t tiIn tr%nh .i\
// Thc thi notepad.exe, khng c di s.
Process.Start("notepad.exe");
// Thc thi notepad.exe, tn file cn mo l di s.
Process.Start("notepad.exe", "SomeFile.txt");
nai )*ng khc ca phMng th:c Start '>u cNu &*n t*o Di t$ng ProcessStartInfo $c cu
h%nh vi cc chi tiIt ca tiIn tr%nh cNn ch*'T vic sO )ng Di t$ng ProcessStartInfo cung
cp .t cM chI iu khin tDt hMn tr>n cc hnh vi v cu h%nh ca tiIn tr%nh .i. Lng _.^
tF. t/t .t vi thuc t2nh th4ng )ng ca lp ProcessStartInfo.

Bfng 4'3 Cc thuc tnh ca lp ProcessStartnfo


Thuc `hnh ?i `f
Arguments
Pc Di sD )eng tru'n cho tiIn tr%nh .i.
ErrorDialog
HIu Process.Start kh4ng th khCi ch*' tiIn tr%nh S $c chJ inh8
nF s@ nX. ngo*i l System.ComponentModel.Win32Exception. HIu
ErrorDialog l true8 Start s@ hin thi .t th4ng &o l#i trc khi
nX. ngo*i l.
FileName
7>n ca :ng )ng. L*n c?ng cF th chJ inh &t k kiu fil( no .
&*n S cu h%nh :ng )ng kIt giao vi nF. u2 )8 nIu &*n chJ inh
.t fil( vi phNn .C rng l .Ao) ha' .2D88 &")ro8o?/ @orA ha'
&")ro8o?/ E2)eD s@ ch*'.
WindowStyle
"t thnh vi>n thuc kiu lit k> System.Diagnostics.
ProcessWindowStyle8 iu khin cch th:c hin thi ca cOa ss. Pc
gi tri h$p l &ao gt.\ Hidden8 Maximized8 Minimized8 v Normal.
WorkingDirectory
7>n N' ca th .c l. vic.
whi S hon tt vi .t Di t$ng Process8 &*n n>n h' nF gii phFng cc ti ngu'>n h
thDngEg0i Close8 Dispose8 ho!c t*o Di t$ng Process &>n trong tN. v=c ca lnh using.
uic h' .t Di t$ng Process kh4ng nh hCng l>n tiIn tr%nh h thDng n5. )i8 tiIn tr%nh
n' v3n s@ tiIp tc ch*'.
151
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
u2 ) )i <' sO )ng Process th=c thi No/eKaA trong .t cOa ss C tr*ng thi phFng to v
.C .t fil( cF t>n l CNHTemKH?"De./2/. |au khi t*o8 v2 ) n' s@ g0i phMng th:c
Process.WaitForExit )Qng tiu tr%nh ang ch*' cho In khi tiIn tr%nh kIt thGc ho!c gi tri
ti.(zout g$c chJ inh trong phMng th:c n'h hIt hiu l=c.
using System;
using System.Diagnostics;
public class StartProcessExample {
public static void Main () {
// Tao mt di tong ProcessStartInfo v cu hnh cho n
// vi cc thng tin cn thit d chay tin trnh mi.
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "notepad.exe";
startInfo.Arguments = "file.txt";
startInfo.WorkingDirectory = @"C:Temp";
startInfo.WindowStyle = ProcessWindowStyle.Maximized;
startInfo.ErrorDialog = true;
// Tao mt di tong Process mi.
using (Process process = new Process()) {
// Gn ProcessStartInfo vo Process.
process.StartInfo = startInfo;
try {
// Khoi chay tin trnh mi.
process.Start();
// oi tin trnh mi kt thc trc khi thot.
Console.WriteLine("Waiting 30 seconds for process to" +
" finish.");
process.WaitForExit(30000);
} catch (Exception ex) {
152
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
Console.WriteLine("Could not start process.");
Console.WriteLine(ex);
}
}
// Nhn Enter d kt thc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
}
11'
11' . t th;c m t ti n tr&nh . t th;c m t ti n tr&nh
#eA OZKA sjQ Q>J OIQ Q@jA QHlA> iOIQ ~AB hUAB >c] OIQ hMJ> DUk(
T>Z YP] LK@ QVWAB /rocess OT QR Q@jA QHlA> >q L@GZ >\A> JwA sjQ Q>J( !K@ DE@ JSJ
~AB hUAB hnc6QHCA6*in&ows, >}] B@ d>V[AB Q>~J /rocess.CloseMainindo% Lt
Bg@ OIQ Q>TAB L@qd LjA Jgc f J>aA> Jbc ~AB hUAB( !K@ DE@ JSJ ~AB hUAB hnc6
QHCA6*in&ows F Zc CloseMainindo%, >c] LK@ DE@ JSJ ~AB hUAB s>TAB6hnc6
QHCA6*in&ows, B@ d>V[AB Q>~J /rocess.;ill(
HIu khCi ch*' .t tiIn tr%nh .i tQ .S lnh $cz9unzlB &5ng lp Process gS $c tho
lu6n trong .c _.Zdh8 &*n cF th kIt thGc tiIn tr%nh .i &5ng Di t$ng Process .4 t tiIn
tr%nh n'. L*n c?ng cF th thu l' cc Di t$ng Process chJ In cc tiIn tr%nh khc hin ang
ch*' &5ng cc phMng th:c tqnh ca lp Process g$c tF. t/t trong &ng _._h.
Bfng 4'4 Cc phng thc dng d thu ly cc tham chiu Process
Phng `hcc ?i `f
GetCurrentProcess
7r v Di t$ng Process .4 t tiIn tr%nh hin ang t2ch c=c.
GetProcessById
7r v Di t$ng Process .4 t tiIn tr%nh vi <E $c chJ inh.
GetProcesses
7r v .ng cc Di t$ng Process .4 t tt c cc tiIn tr%nh
hin ang t2ch c=c.
GetProcessesByName
7r v .ng cc Di t$ng Process .4 t tt c cc tiIn tr%nh
hin ang t2ch c=c vi t>n th<n thin $c chJ inh. 7>n th<n
thin l t>n ca fil( th=c thi kh4ng t2nh phNn .C rng v ng
)3nT v2 )8 no/eKaA ha' )aD).
"t khi S cF Di t$ng Process .4 t tiIn tr%nh cNn kIt thGc8 &*n cNn g0i phMng th:c
CloseMainWindow ha' phMng th:c Kill. RhMng th:c CloseMainWindow gOi .t th4ng ip
In cOa ss ch2nh ca :ng )ng )=aztr>nz@"nAow8. RhMng th:c n' cF ceng tc )ng nh th
153
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
ngi )eng Fng cOa ss ch2nh &5ng tr%nh Mn h thDng8 v nF cho cM hi :ng )ng th=c hin
vic t/t .t cch &%nh thng. CloseMainWindow s@ kh4ng kIt thGc cc :ng )ng kh4ng cF cOa
ss ch2nh ho!c cc :ng )ng cF cOa ss ch2nh &i v4 hiu gcF th v% .t hp tho*i hin ang
$c .Ch. ui nhKng t%nh huDng nh thI8 CloseMainWindow s@ tr v false.
CloseMainWindow tr v true nIu th4ng ip $c gOi thnh c4ng8 nhng kh4ng &o . tiIn
tr%nh th6t s= kIt thGc. u2 )8 cc :ng )ng )eng so*n tho )K liu thng s@ cho cM hi
ngi )eng lu l*i cc )K liu cha $c lu nIu nh6n $c th4ng ip n'. Hgi )eng
thng cF cM hi h' &V vic Fng cOa ss vi nhKng t%nh huDng nh thI. liu n' nghqa l
CloseMainWindow s@ tr v true8 nhng :ng )ng v3n c: ch*' khi ngi )eng h' &V. L*n cF
th sO )ng phMng th:c Process.WaitForExit &o hiu vic kIt thGc tiIn tr%nh v thuc
t2nh Process.HasExited ki. tra tiIn tr%nh S kIt thGc ha' cha. u &*n c?ng cF th sO
)ng phMng th:c Kill.
RhMng th:c Kill kIt thGc .t tiIn tr%nh nga' l6p t:cT ngi )eng kh4ng cF cM hi )Qng vic
kIt thGc8 v tt c cc )K liu cha $c lu s@ &i .t. Kill l te' ch0n )u' nht kIt thGc
cc :ng )ng )=aztr>nz@"nAow8 kh4ng p l*i CloseMainWindow v kIt thGc cc :ng )ng
kh4ngz)=aztr>nz@"nAow8.
u2 ) )i <' khCi ch*' .t th hin .i ca No/eKaA8 $i ` gi<'8 sau F kIt thGc tiIn tr%nh
No/eKaA. 7rc ti>n8 v2 ) n' kIt thGc tiIn tr%nh &5ng CloseMainWindow. HIu
CloseMainWindow tr v false8 ho!c tiIn tr%nh No/eKaA v3n c: ch*' sau khi CloseMainWindow
$c g0i8 v2 ) n' s@ g0i Kill v &uc tiIn tr%nh No/eKaA kIt thGcT &*n cF th &uc
CloseMainWindow tr v false &5ng cch &V .!c hp tho*i F"De FKen .C.
using System;
using System.Threading;
using System.Diagnostics;
public class TerminateProcessExample {
public static void Main () {
// Tao mt Process mi v chay notepad.exe.
using (Process process = Process.Start("notepad.exe")) {
// oi 5 giy v kt thc tin trnh Notepad.
Console.WriteLine("Waiting 5 seconds before terminating" +
" notepad.exe.");
Thread.Sleep(5000);
// Kt thc tin trnh Notepad.
Console.WriteLine("Terminating Notepad with " +
"CloseMainWindow.");
// Gui mt thng dip dn cua s chnh.
154
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
if (!process.CloseMainWindow()) {
// Khng gui doc thng dip. Kt thc Notepad bng Kill.
Console.WriteLine("CloseMainWindow returned false - " +
" terminating Notepad with Kill.");
process.Kill();
} else {
// Thng dip doc gui thnh cng; doi 2 giy
// d chng thc vic kt thc trc khi vin dn Kill.
if (!process.WaitForExit(2000)) {
Console.WriteLine("CloseMainWindow failed to" +
" terminate - terminating Notepad with Kill.");
process.Kill();
}
}
}
// Nhn Enter d kt thc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
}
12' 12' < o m ch c' th ch y ! < 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 m t th hi n c a ng d ng t i m t th i i m
#eA JwA FRX LRO H`AB, Qe@ OIQ Q>o@ L@tO J> J^ Q>t J>e] OIQ Q>t >@qA Jbc ~AB
hUAB(
TeX OIQ LK@ QVWAB $!stem.).reading.Mutex D\ FRX ~AB hUAB Q>Z YP] Z]GA f
>?Z LK@ QVWAB A\] YJ s>@ LIAB(
Mutex cung cp .t cM chI tng & hFa 9u tr%nh th=c thi ca cc tiu tr%nh v$t 9ua &i>n
tiIn tr%nh v ckn cung cp .t cM chI tin l$i &o r5ng chJ .t th hin ca :ng )ng ang
ch*'. L5ng cch cD thu l' 9u'n sC hKu .t Di t$ng Mutex lGc khCi ng v thot nIu
155
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
kh4ng th thu $c Mutex8 &*n cF th &o . r5ng chJ .t th hin ca :ng )ng ang ch*'.
u2 ) )i <' sO )ng .t Mutex cF t>n l MutexExample &o . chJ .t th hin ca v2
) cF th th=c thi.
using System;
using System.Threading;
public class MutexExample {
public static void Main() {
// Gi tr lun l cho bit ng dng ny
// c quyn so hu Mutex hay khng.
bool ownsMutex;
// Tao v ly quyn so hu mt Mutex c tn l MutexExample.
using (Mutex mutex =
new Mutex(true, "MutexExample", out ownsMutex)) {
// Nu ng dng so hu Mutex, n c th tip tc thc thi;
// nu khng, ng dng s thot.
if (ownsMutex) {
Console.WriteLine("This application currently owns the" +
" mutex named MutexExample. Additional instances" +
" of this application will not run until you" +
" release the mutex by pressing Enter.");
Console.ReadLine();
// Giai phng Mutex.
mutex.ReleaseMutex();
} else {
Console.WriteLine("Another instance of this" +
" application already owns the mutex named" +
" MutexExample. This instance of the" +
" application will terminate.");
156
Chng 4: Tibu `anhE `i|n `anhE }~ kw ng
}
}
// Nhn Enter d kt thc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
}


5
157
Ch01n2 X4Y/L
158
159
Chng 5: N?
t trong nhKng kh2a c*nh ng chG B nht ca &")ro8o?/ .NET Framework l s=
t2ch h$p s<u s/c vi :&L. 7rong nhiu :ng )ng .NET8 &*n s@ kh4ng nh6n th'
r5ng .%nh ang sO )ng cc k thu6t :&LEchGng s@ $c sO )ng ph2a h6u
trng khi &*n tuNn t= hFa .t &")ro8o?/ >EF.NET Ea/a*e/8 g0i .t )ich v @e4 :&L8
ho!c 0c cc thiIt l6p :ng )ng trong .t fil( cu h%nh @e4.)on?"g. 7rong cc trng h$p
khc8 &*n s@ .uDn l. vic tr=c tiIp vi kh4ng gian t>n System.Xml thao tc )K liu :&L.
Pc tc v :&L th4ng thng kh4ng chJ ph<n t2ch .t fil( :&L . ckn ;c nh6n t2nh h$p l
ca nF )=a tr>n .t :&L *)hema8 p )ng phXp &iIn si :*L t*o .t ti liu ha' trang
;T&L .i8 v t%. kiI. .t cch th4ng .inh vi :Pa/h. Pc .c trong chMng n' tr%nh
&' cc vn sau\
"
Pc k thu6t )eng 0c8 ph<n t2ch8 v thao tc )K liu :&L g.c `.Z8 `.]8 `.^8 v
`.[h.
Uu't .t ti liu :&L t%. cc nGt c th th(o t>n g.c `._h8 th(o kh4ng gian t>n
g.c `.`h8 ha' th(o &iu th:c :Pa/h g.c `.ah.
{c nh6n t2nh h$p l ca .t ti liu :&L )=a tr>n .t :&L *)hema g.c `.bh.
7uNn t= hFa .t Di t$ng thnh :&L g.c `.ch8 t*o :&L *)hema cho .t lp g.c
`.Zdh8 v t*o .S ngutn cho lp )=a tr>n .t :&L *)hema g.c `.ZZh.
LiIn si .t ti liu :&L thnh .t ti liu khc &5ng :*LT 8/yDe8hee/ g.c `.Z]h.
1'
1' -i n th c u tr;c c a m t ti li u +59 trong TreeView -i n th c u tr;c c a m t ti li u +59 trong TreeView
#eA JwA >@tA Q>M JPZ QHJ D\ AI@ hZAB Jbc OIQ Q\@ Y@qZ +M. QHXAB OIQ ~AB hUAB
hnc6QHCA?*in&ows(
Ned Q\@ Y@qZ +M. F`AB YEd $!stem.5ml.5ml-ocument( ScZ L^, D@jQ OIQ d>V[AB
Q>~J Lt J>Z]tA OIQ 5ml=ode Q>\A> OIQ $!stem.indo%s."orms.)ree=ode, H@ B@
A^ OIQ JSJ> Lq Z] Lt hZ]qQ Zc QX\A FI Q\@ Y@qZ(
.NET Framework cung cp nhiu cch khc nhau ;O lB cc ti liu :&L. Pch . &*n sO
)ng te' thuc vo tc v cNn l6p tr%nh. "t trong sD F l lp XmlDocument. yp n' cung
cp .t )*ng &iu )irn trongz&znh cho .t ti liu :&L8 tu<n th(o @CC Eo)umen/ F4Je)/
&oAeD gEF&hT cho phXp &*n )u't 9ua cc nGt th(o &t k hng no8 ch1n v lo*i &V nGt8 v
tha' si ng cu trGc lGc ch*'. L*n hS' vo 8htt94::ZZZ>ZLc>o?2H &iIt th>. chi tiIt v
EF&.
l sO )ng lp XmlDocument8 &*n chJ vic t*o .t th hin ca lp n' rti g0i phMng th:c
Load ceng vi .t t>n fil(8 .t Stream8 .t TextReader8 ha' .t XmlReader g&*n c?ng cF th
cung cp .t Q=L chJ In .t ti liu :&Lh. 7h hin XmlDocument s@ ch:a tt c cc nGt
g)*ng c<'h cF trong ti liu ngutn. li. nh6p gen/ry Ko"n/h )eng tru' ;ut cc nGt n' l
phNn tO gDc8 $c cp th4ng 9ua thuc t2nh XmlDocument.DocumentElement. l<' l .t Di
t$ng XmlElement8 cF th ch:a nhiu Di t$ng XmlNode ltng &>n trong8 cc Di t$ng n' cF
th ch:a nhiu Di t$ng XmlNode nKa8 v c: tiIp tc nh thI. "t XmlNode l phNn cu thnh
cM &n ca .t fil( :&L. "t nGt :&L cF th l .t phNn tO geDemen/h8 .t !c t2nh
ga//r"4u/eh8 li chG th2ch8 ha' t(;t.
160
Chng 5: N?
whi l. vic vi XmlNode ha' .t lp )3n ;ut tQ F gnh XmlElement ha' XmlAttributeh8
&*n cF th sO )ng cc thuc t2nh cM &n sau <'\
ChildNodes l t6p h$p cc nGt ltng &>n trong C .:c Nu ti>n.
Name l t>n ca nGt.
NodeType l .t thnh vi>n thuc kiu lit k> System.Xml.XmlNodeType8 cho &iIt kiu
ca nGt gphNn tO8 !c t2nh8 t(;t...h.
Value l ni )ung ca nGt8 nIu F l nGt t(;t ha' nGt CE>T>.
Attributes l t6p h$p cc nGt .4 t cc !c t2nh $c p )ng cho phNn tO.
InnerText l chu#i ch:a gi tri gt(;th ca nGt hin hnh v tt c cc nGt ltng &>n trong.
InnerXml l chu#i ch:a thj nh )u :&L cho tt c cc nGt ltng &>n trong.
OuterXml l chu#i ch:a thj nh )u :&L cho nGt hin hnh v tt c cc nGt ltng &>n
trong.
u2 ) )i <' )u't 9ua tt c cc nGt ca .t XmlDocument g&5ng thuc t2nh ChildNodes v
.t phMng th:c 9u'h rti hin thi chGng trong .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;
// (Bo qua phn m designer.)
private void cmdLoad_Click(object sender, System.EventArgs e) {

// Xa cy.
treeXml.Nodes.Clear();
// Nap ti liu XML.
XmlDocument doc = new XmlDocument();
try {
doc.Load(txtXmlFile.Text);
}catch (Exception err) {
161
Chng 5: N?
MessageBox.Show(err.Message);
return;
}
// d liu vo TreeView.
ConvertXmlNodeToTreeNode(doc, treeXml.Nodes);
// Mo rng tt ca cc nt.
treeXml.Nodes[0].ExpandAll();
}
private void ConvertXmlNodeToTreeNode(XmlNode xmlNode,
TreeNodeCollection treeNodes) {
// Thm mt TreeNode m ta XmlNode ny.
TreeNode newTreeNode = treeNodes.Add(xmlNode.Name);
// Tuy bin phn text cho TreeNode da vo
// kiu v ni dung cua XmlNode.
switch (xmlNode.NodeType) {

case XmlNodeType.ProcessingInstruction:
case XmlNodeType.XmlDeclaration:
newTreeNode.Text = "" + xmlNode.Name + " " +
xmlNode.Value + "";
break;
case XmlNodeType.Element:
newTreeNode.Text = "" + xmlNode.Name + "";
break;
case XmlNodeType.Attribute:
newTreeNode.Text = "ATTRIBUTE: " + xmlNode.Name;
break;
case XmlNodeType.Text:
case XmlNodeType.CDATA:
newTreeNode.Text = xmlNode.Value;
break;
case XmlNodeType.Comment:
newTreeNode.Text = "!--" + xmlNode.Value + "--";
162
Chng 5: N?
break;
}
// Goi phng thc ny mt cch d quy cho mi dac tnh
// (XmlAttribute l mt lp con cua XmlNode).
if (xmlNode.Attributes != null) {
foreach (XmlAttribute attribute in xmlNode.Attributes) {
ConvertXmlNodeToTreeNode(attribute, newTreeNode.Nodes);
}
}
// Goi phng thc ny mt cch d quy cho mi nt con.
foreach (XmlNode childNode in xmlNode.ChildNodes) {
ConvertXmlNodeToTreeNode(childNode, newTreeNode.Nodes);
}
}
}
{Xt fil( :&L )i <' gProAu)/Ca/aDog.2mDh\
xml version="1.0"
productCatalog
catalogNameJones and Jones Unique Catalog 2004/catalogName
expiryDate2005-01-01/expiryDate
products
product id="1001"
productNameGourmet Coffee/productName
descriptionThe finest beans from rare Chilean
plantations./description
productPrice0.99/productPrice
inStocktrue/inStock
/product
product id="1002"
productNameBlue China Tea Pot/productName
descriptionA trendy update for tea drinkers./description
productPrice102.99/productPrice
inStocktrue/inStock
163
Chng 5: N?
/product
/products
/productCatalog
0nh 5'1 Cu trc ca mt ti liu XML

0nh 5'2 nnerText ca phn t gc


0nh 5'3 nnerXml ca phn t gc
164
Chng 5: N?
0nh 5'4 OuterXml ca phn t gc
2' 2' Ch=n thm n;t vo ti li u +59 Ch=n thm n;t vo ti li u +59
#eA JwA L@GZ J>A> OIQ Q\@ Y@qZ +M. F`AB JSJ> J>A D\X h? Y@qZ OE@, >X_J FeA
OZKA QeX OIQ Q\@ Y@qZ >X\A QX\A OE@ QHXAB FI A>E(
TeX AQ F`AB OIQ d>V[AB Q>~J Jbc 5ml-ocument iA>V Create0lement,
Create#ttribute, Create=ode(((k( 3j Q@jd, J>A A^ D\X F`AB OIQ d>V[AB Q>~J Jbc
5ml=ode iA>V Ensert#*ter, Ensert6e*ore, >c] #ppendC.ildk(
Ph1n .t nGt vo XmlDocument &ao gt. hai &c\ t*o nGt rti ch1n nF vo vi tr2 th2ch h$p. |au
F8 &*n cF th g0i XmlDocument.Save lu l*i nhKng tha' si.
l t*o .t nGt8 &*n sO )ng .t trong cc phMng th:c ca XmlDocument &/t Nu &5ng tQ
Create8 te' thuc vo kiu ca nGt. uic n' &o . nGt s@ cF ceng kh4ng gian t>n nh phNn
ckn l*i ca ti liu g&*n c?ng cF th cung cp .t kh4ng gian t>n l. Di sDh. wI tiIp8 &*n
phi t%. .t nGt phe h$p v sO )ng .t trong cc phMng th:c ch1n ca nF th>. nGt .i
vo.
u2 ) )i <' tr%nh &' k thu6t n' &5ng cch t*o .t ti liu :&L .i\
using System;
using System.Xml;
public class GenerateXml {
private static void Main() {
// Tao mt ti liu mi rng.
XmlDocument doc = new XmlDocument();
XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
doc.AppendChild(docNode);
// Tao v chn mt phn tu mi.
165
Chng 5: N?
XmlNode productsNode = doc.CreateElement("products");
doc.AppendChild(productsNode);
// Tao mt phn tu lng bn trong (cung vi mt dac tnh).
XmlNode productNode = doc.CreateElement("product");
XmlAttribute productAttribute = doc.CreateAttribute("id");
productAttribute.Value = "1001";
productNode.Attributes.Append(productAttribute);
productsNode.AppendChild(productNode);
// Tao v thm cc phn tu con cho nt product ny
// (cung vi d liu text).
XmlNode nameNode = doc.CreateElement("productName");
nameNode.AppendChild(doc.CreateTextNode("Gourmet Coffee"));
productNode.AppendChild(nameNode);
XmlNode priceNode = doc.CreateElement("productPrice");
priceNode.AppendChild(doc.CreateTextNode("0.99"));
productNode.AppendChild(priceNode);
// Tao v thm mt nt product khc.
productNode = doc.CreateElement("product");
productAttribute = doc.CreateAttribute("id");
productAttribute.Value = "1002";
productNode.Attributes.Append(productAttribute);
productsNode.AppendChild(productNode);
nameNode = doc.CreateElement("productName");
nameNode.AppendChild(doc.CreateTextNode("Blue China Tea Pot"));
productNode.AppendChild(nameNode);
priceNode = doc.CreateElement("productPrice");
priceNode.AppendChild(doc.CreateTextNode("102.99"));
productNode.AppendChild(priceNode);
// Lu ti liu.
doc.Save(Console.Out);
Console.ReadLine();
}
}
166
Chng 5: N?
7i liu $c t*o ra tr4ng giDng nh sau\
xml version="1.0" encoding="UTF-8"
products
product id="1001"
productNameGourmet Coffee/productName
productPrice0.99/productPrice
/product
product id="1002"
productNameBlue China Tea Pot/productName
productPrice102.99/productPrice
/product
/products
3' 3' Ch=n thm n;t vo ti li u +59 m t cch nhanh ch'ng Ch=n thm n;t vo ti li u +59 m t cch nhanh ch'ng
#eA JwA J>A Q>CO AQ D\X OIQ Q\@ Y@qZ +M. O\ s>TAB d>R@ hrAB LjA O} YqA>
h\@ hyAB(
V@jQ JSJ d>V[AB Q>~J QHW B@d iA>NA D\X QCA Q> D\ AI@ hZAB Jbc AQk Lt J>A
AQ D\X Q\@ Y@qZ +M.( CSJ> s>SJ, fg hUAB d>V[AB Q>~J 5ml-ocument.Clone=ode
Lt fcX Ye@ JSJ A>SA> Jbc OIQ 5ml-ocument(
Ph1n .t nGt vo XmlDocument cNn nhiu .S lnh. PF nhiu cch thu ng/n .S lnh n'. "t
cch l t*o .t lp tr$ giGp gheDKerh gt. cc phMng th:c .:czcao ch1n nGt vo ti liu.
u2 )8 &*n cF th viIt phMng th:c AddElement t*o .t phNn tO .i8 ch1n nF vo8 v th>.
t(;t g<' l &a thao tc cNn thiIt khi ch1n phNn tOh.
u2 ) )i <' l .t lp tr$ giGp nh thI\
using System;
using System.Xml;
public class XmlHelper {
public static XmlNode AddElement(string tagName,
string textContent, XmlNode parent) {
XmlNode node = parent.OwnerDocument.CreateElement(tagName);
parent.AppendChild(node);
167
Chng 5: N?
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;
}
}
L<' gi &*n cF th viIt .S lnh t*o .t ti liu :&L ggiDng .c `.]h vi cG php Mn gin
hMn nh sau\
public class GenerateXml {
private static void Main() {
// Tao ti liu.
XmlDocument doc = new XmlDocument();
XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
doc.AppendChild(docNode);
XmlNode products = doc.CreateElement("products");
doc.AppendChild(products);
// Thm hai product.
XmlNode product = XmlHelper.AddElement("product", null,
products);
XmlHelper.AddAttribute("id", "1001", product);
XmlHelper.AddElement("productName", "Gourmet Coffee", product);
168
Chng 5: N?
XmlHelper.AddElement("productPrice", "0.99", product);
product = XmlHelper.AddElement("product", null, products);
XmlHelper.AddAttribute("id", "1002", product);
XmlHelper.AddElement("productName", "Blue China Tea Pot",
product);
XmlHelper.AddElement("productPrice", "102.99", product);
// Lu ti liu.
doc.Save(Console.Out);
Console.ReadLine();
}
}
L*n c?ng cF th l' cc phMng th:c tr$ giGp gnh AddAttribute v AddElementh l. cc
phMng th:c th hin trong .t lp te' &iIn )3n ;ut tQ XmlDocument.
"t cch khc Mn gin hFa vic viIt :&L l sao l*i cc nGt &5ng phMng th:c
XmlNode.CloneNode. RhMng th:c n' nh6n .t Di sD lu6n lB. HIu gi tri n' l true8
CloneNode s@ sao l*i ton & nhnh8 vi tt c cc nGt ltng &>n trong.
u2 ) )i <' t*o .t nGt product .i &5ng cch sao l*i nGt Nu ti>n\
// (Thm nt product du tin.)
// Tao mt product mi da vo product hin c.
product = product.CloneNode(true);
// iu chnh d liu.
product.Attributes[0].Value = "1002";
product.ChildNodes[0].ChildNodes[0].Value = "Blue China Tea Pot";
product.ChildNodes[1].ChildNodes[0].Value = "102.99";
// Thm phn tu mi.
products.AppendChild(product);
PhG B trong trng h$p n'8 cF .t sD gi inh $c p !t l>n cc nGt hin cF gv2 )8 gi
inh con Nu ti>n ca nGt lu4n l productName8 v con th: hai lu4n l productPriceh. HIu gi
inh n' kh4ng &o . Gng8 &*n cNn phi ;Xt t>n ca nGt.
169
Chng 5: N?
4'
4' T&m m t n;t "hi !i t tn c a n' T&m m t n;t "hi !i t tn c a n'
#eA JwA Q>Z YP] OIQ AQ JU Q>t QHXAB OIQ 5ml-ocument, D\ FeA F@jQ QCA Jbc A^
A>VAB s>TAB F@jQ DM QHa Jbc A^(
Sg hUAB d>V[AB Q>~J 5ml-ocument.7et0lements6!)ag=ame, d>V[AB Q>~J A\] fm hy
QlO QX\A FI Q\@ Y@qZ D\ QHR DG QNd >Wd $!stem.5ml.5ml=ode+ist J>~c JSJ AQ LVWJ
fX QHrAB(
yp XmlDocument cung cp phMng th:c GetElementsByTagName )eng t%. ra cc nGt cF t>n
cho trc. HF tr v kIt 9u l .t t6p h$p cc Di t$ng XmlNode.
lo*n .S )i <' tr%nh &' cch sO )ng GetElementsByTagName t2nh tsng gi cc it(.
trong .t )anh .c &5ng cch thu l' tt c cc phNn tO cF t>n l productPrice\
using System;
using System.Xml;
public class FindNodesByName {
private static void Main() {
// Nap ti liu.
XmlDocument doc = new XmlDocument();
doc.Load("ProductCatalog.xml");
// Thu ly tt ca price.
XmlNodeList prices = doc.GetElementsByTagName("productPrice");
decimal totalPrice = 0;
foreach (XmlNode price in prices) {
// Ly phn text bn trong cua mi phn tu doc so trung.
totalPrice += Decimal.Parse(price.ChildNodes[0].Value);
}
Console.WriteLine("Total catalog value: " +
totalPrice.ToString());
Console.ReadLine();
}
}
L*n c?ng cF th )k t%. .t phNn ti liu :&L &5ng phMng th:c
XmlElement.GetElementsByTagName gphMng th:c n' s@ )k tt c cc nGt con t%. ra nGt
170
Chng 5: N?
treng khph. l sO )ng phMng th:c n'8 trc hIt l' .t XmlNode tMng :ng vi .t phNn
tO8 kI F Xp Di t$ng n' thnh .t XmlElement. u2 ) )i <' tr%nh &' cch t%. nGt price
&>n )i phNn tO product Nu ti>n\
// Thu ly tham chiu dn product du tin.
XmlNode product = doc.GetElementsByTagName("products")[0];
// Tm nt price bn di product ny.
XmlNode price =
((XmlElement)product).GetElementsByTagName("productPrice")[0];
Console.WriteLine("Price is " + price.InnerText);
HIu cc phNn tO ca &*n cF ch:a !c t2nh ID8 &*n c?ng cF th sO )ng .t phMng th:c cF t>n
l GetElementById thu l' phNn tO cF gi tri ID treng khp.
5'
5' Thu l y cc n;t +59 trong m t "h,ng gian tn +59 c th Thu l y cc n;t +59 trong m t "h,ng gian tn +59 c th
#eA JwA Q>Z YP] JSJ AQ QHXAB OIQ s>TAB B@cA QCA JU Q>t F`AB OIQ 5ml-ocument(
Sg hUAB d>@CA FRA Aed J>AB Jbc d>V[AB Q>~J 5ml-ocument.
7et0lements6!)ag=ame i]CZ JwZ OIQ QCA s>TAB B@cA QCA Y\O LK@ fKk( NBX\@ Hc, Sd
hUAB hPZ >Xc Q>M iLk D\X LK@ fK QCA Q> AjZ FeA OZKA fX QHrAB QPQ JR JSJ Q>(
Hhiu ti liu :&L ch:a cc nGt thuc nhiu kh4ng gian t>n khc nhau. u2 )8 ti liu :&L
.4 t .t &i &o khoa h0c cF th sO )ng .t kiu nh )u ri>ng &iu thi cc phMng
tr%nh ton h0c v cc &iu t v(ctor. no!c .t ti liu :&L vi cc th4ng tin v !t hng cF
th kIt h$p cc th4ng tin v khch hng v Mn !t hng ceng vi .t ht sM v6n chu'n.
7Mng t=8 .t ti liu :&L .4 t .t giao )ich thMng .*i cF th &ao gt. nhKng phNn
thuc c hai c4ng t'8 v nhKng phNn n' $c viIt th(o ng4n ngK nh )u ri>ng.
"t tc v th4ng thng trong l6p tr%nh :&L l thu l' cc phNn tO thuc .t kh4ng gian t>n
c th. L*n cF th th=c hin tc v n' vi phi>n &n n*p chtng ca phMng th:c
XmlDocument.GetElementsByTagName g'>u cNu .t t>n kh4ng gian t>n l. Di sDh. L*n cF th
sO )ng phMng th:c n' t%. cc thj th(o t>n8 ho!c t%. tt c cc thj trong kh4ng gian t>n
S $c chJ inh nIu &*n p )ng )u hoa thi vo Di sD t>n thj.
u2 )8 ti liu :&L ph:c h$p )i <' &ao gt. cc th4ng tin v Mn !t hng v khch hng
trong hai kh4ng gian t>n khc nhau l http://mycompany/OrderML v
http://mycompany/ClientML.
xml version="1.0"
ord:order xmlns:ord="http://mycompany/OrderML"
xmlns:cli="http://mycompany/ClientML"
cli:client
171
Chng 5: N?
cli:firstNameSally/cli:firstName
cli:lastNameSergeyeva/cli:lastName
/cli:client
ord:orderItem itemNumber="3211"/
ord:orderItem itemNumber="1155"/
/ord:order
u chMng tr%nh )i <' s@ ch0n tt c cc thj trong kh4ng gian t>n
http://mycompany/OrderML\
using System;
using System.Xml;
public class SelectNodesByNamespace {
private static void Main() {
// Nap ti liu.
XmlDocument doc = new XmlDocument();
doc.Load("Order.xml");
// Thu ly tt ca cc the dat hng.
XmlNodeList matches = doc.GetElementsByTagName("",
"http://mycompany/OrderML");
// Hin th thng tin.
Console.WriteLine("Element tAttributes");
Console.WriteLine(" t");
foreach (XmlNode node in matches) {
Console.Write(node.Name + "t");
foreach (XmlAttribute attribute in node.Attributes) {
Console.Write(attribute.Value + " ");
}
Console.WriteLine();
}
172
Chng 5: N?

Console.ReadLine();
}
}
wIt ;ut ca chMng tr%nh n' nh sau\
Element Attributes

ord:order http://mycompany/OrderML http://mycompany/ClientML
ord:orderItem 3211
ord:orderItem 1155
6' 6' T&m cc %h n t v i !i u th c +1ath T&m cc %h n t v i !i u th c +1ath
#eA JwA hZ]qQ OIQ Q\@ Y@qZ +M. Lt QlO JSJ AQ Q>X OIQ Q@CZ J>ZA QlO s@jO JPd
JcX( Va hU, FeA J^ Q>t OZKA hZ]qQ OIQ A>SA> JU Q>t Jbc OIQ Q\@ Y@qZ +M. Lt QlO
JSJ AQ J^ JSJ L_J QaA> A\X L^ >X_J J>~c OIQ fK YVWAB AQ JXA YAB FCA QHXAB(
T>nJ Q>@ OIQ F@tZ Q>~J +,ath F`AB d>V[AB Q>~J $elect=odes >c]
$elect$ingle=ode Jbc YEd 5ml-ocument(
yp XmlNode inh nghqa hai phMng th:c )eng t%. kiI. )=a vo &iu th:c :Ka/h l
SelectNodes v SelectSingleNode. nai phMng th:c n' thao tc tr>n tt c cc nGt con. u%
XmlDocument thQa kI tQ XmlNode n>n &*n cF th g0i XmlDocument.SelectNodes )k t%. ton
& .t ti liu.
{Xt ti liu :&L .4 t .t Mn !t hng gt. hai it(.\
xml version="1.0"
Order id="2004-01-30.195496"
Client id="ROS-930252034"
NameRemarkable Office Supplies/Name
/Client
Items
Item id="1001"
NameElectronic Protractor/Name
Price42.99/Price
/Item
Item id="1002"
NameInvisible Ink/Name
173
Chng 5: N?
Price200.25/Price
/Item
/Items
/Order
PG php ca :Pa/h sO )ng kB hiu giDng nh ng )3n. u2 )8 ng )3n
/Order/Items/Item cho &iIt phNn tO Item ltng &>n trong phNn tO Items8 v phNn tO
Items ltng &>n trong phNn tO gDc Order. u2 ) )i <' sO )ng .t ng )3n tu't Di
t%. t>n ca tt c cc it(. trong .t Mn !t hng\
using System;
using System.Xml;
public class XPathSelectNodes {
private static void Main() {
// Nap ti liu.
XmlDocument doc = new XmlDocument();
doc.Load("orders.xml");
// Thu ly tn cua tt ca cc item.
// Vic ny khng th hon tt d dng vi phng thc
// GetElementsByTagName(), v cc phn tu Name doc su dng
// bn trong cc phn tu Item v cc phn tu Client, v do d
// ca hai kiu ny du s doc tra v.
XmlNodeList nodes = doc.SelectNodes("/Order/Items/Item/Name");

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

Console.ReadLine();
}
}
wIt ;ut ca chMng trJnh n' nh sau\
Electronic Protractor
Invisible Ink
:Pa/h cung cp .t cG php t%. kiI. .*nh. Uo kh4ng th gii th2ch tt c cc &iIn th ca
nF chJ trong .t .c ng/n nh thI n'8 n>n &ng `.Z chJ tr%nh &' cc phNn ch2nh trong .t
174
Chng 5: N?
&iu th:c :Pa/h v cc v2 ) .4 t cch l. vic ca chGng vi ti liu :&L C tr>n. l hiu
chi tiIt hMn8 &*n hS' tha. kho ti liu @CC :Pa/h t*i 8htt94::ZZZ>ZL>o?2:TR:[9BthH.
Bfng 5'1 C php ca biu thc XPath
Bibu `hcc ?i `f
/
L/t Nu .t ng )3n tu't Di gch0n tQ nGt gDch.
/Order/Items/Item ch0n tt c cc phNn tO Item l con ca .t phNn tO
Items8 . &n th<n Items l con ca phNn tO gDc Order.
//
L/t Nu .t ng )3n tMng Di gch0n nGt &t c: <uh.
//Item/Name ch0n tt c cc phNn tO Name l con ca .t phNn tO Item8 &t
chp chGng ;ut hin C <u trong ti liu.
@
Ph0n .t !c t2nh ca .t nGt.
/Order/@id ch0n !c t2nh cF t>n l id tQ phNn tO gDc Order.

Ph0n &t c: phNn tO no trong ng )3n.


/Order/ ch0n nGt Items v Client v% c hai u n5. trong phNn tO gDc
Order.
|
wIt h$p nhiu ng )3n.
/Order/Items/Item/Name|Order/Client/Name ch0n cc nGt Name )eng
.4 t .t Client v cc nGt Name )eng .4 t .t Item.
.
Pho &iIt nGt g.!c inhh hin hnh.
HIu nGt hin hnh l .t Order8 &iu th:c ./Items chJ In cc it(. li>n
9uan vi Mn !t hng F.
..
Pho &iIt nGt cha.
//Name/.. ch0n phNn tO l cha ca .t Name8 gt. cc phNn tO Client v
Item.
[ ]
linh nghqa ti>u chuxn ch0n l=a g8eDe)/"on )r"/er"ah8 cF th ki. tra gi tri
ca .t nGt &>n trong ha' ca .t !c t2nh.
/Order[@id="2004-01-30.195496"] ch0n cc phNn tO Order vi gi tri !c
t2nh cho trc.
/Order/Items/Item[Price 50] ch0n cc sn phx. cF gi tr>n `d.
/Order/Items/Item[Price 50 and Name="Laser Printer"] ch0n cc sn
phx. treng khp vi c hai ti>u chuxn.
starts-with
n. n' thu l' cc phNn tO )=a vo phNn t(;t khCi Nu ca phNn tO n5.
&>n trong.
/Order/Items/Item[starts-with(Name,"C")] t%. tt c cc phNn tO Item
cF phNn tO Name &/t Nu &5ng .3u t= C.
175
Chng 5: N?
position
n. n' thu l' cc phNn tO )=a vo vi tr2.
/Order/Items/Item[position()=2] ch0n phNn tO Item th: hai.
count
n. n' I. sD phNn tO. L*n cNn chJ inh t>n ca phNn tO con cNn I.
ho!c )u hoa thi gh cho tt c cc phNn tO con.
/Order/Items/Item[count(Price)=1] thu l' cc phNn tO Item cF Gng .t
phNn tO Price ltng &>n trong.
#@tZ Q>~J +,ath D\ QPQ JR QCA d>wA Qg D\ L_J QaA> O\ FeA fg hUAB QHXAB L^ YZTA
J^ d>A F@qQ J>? >Xc6Q>VoAB, Dl FRA Q>A +M. J^ d>A F@qQ J>? >Xc6Q>VoAB(
7'
7' c v ghi +59 m "h,ng %h i n % ton ! ti li u vo ! nh c v ghi +59 m "h,ng %h i n % ton ! ti li u vo ! nh
#eA JwA LJ +M. Q OIQ fQHcO, >X_J B>@ A^ Hc OIQ fQHcO( TZ] A>@CA, FeA
OZKA vg Y QAB AQ OIQ, s>TAB d>R@ Aed QX\A FI D\X FI A>E DE@ OIQ
5ml-ocument(
!t B>@ +M., >}] QeX OIQ 5ml)extriter FJ YP] OIQ fQHcO D\ fg hUAB JSJ
d>V[AB Q>~J rite iA>V rite$tart0lement D\ rite0nd0lementk( !t LJ +M.,
>}] QeX OIQ 5ml)ext&eader FJ YP] OIQ fQHcO D\ B@ d>V[AB Q>~J &ead Lt hMJ>
J>Z]tA Q AQ A\] fcAB AQ s>SJ(
yp XmlTextWriter v XmlTextReader 0c,ghi :&L tr=c tiIp tQ str(a. tQng nGt .t. Pc lp
n' kh4ng cung cp cc t2nh nvng )eng )u't v thao tc ti liu :&L nh XmlDocument8
nhng hiu nvng cao hMn v vIt & nh nhV hMn8 !c &it khi &*n l. vic vi cc ti liu
:&L c=c k ln.
l ghi :&L ra &t k str(a. no8 &*n cF th sO )ng XmlTextWriter. yp n' cung cp cc
phMng th:c Write )eng ghi tQng nGt .t8 &ao gt.\
WriteStartDocumentEghi phNn khCi Nu ca ti liuT v WriteEndDocument8 Fng &t
k phNn tO no ang .C C cuDi ti liu.
WriteStartElementEghi .t thj .C goKen"ng /agh cho phNn tO &*n chJ inh. wI F8
&*n cF th th>. nhiu phNn tO ltng &>n trong phNn tO n'8 ho!c &*n cF th g0i
WriteEndElement ghi thj Fng g)Do8"ng /agh.
WriteElementStringEghi .t phNn tO8 ceng vi .t thj .C8 .t thj Fng8 v ni
)ung t(;t.
WriteAttributeStringEghi .t !c t2nh cho phNn tO ang .C gNn nht8 ceng vi t>n
v gi tri.
|O )ng cc phMng th:c n' thng cNn 2t .S lnh hMn l t*o .t XmlDocument &5ng ta'8
nh $c tr%nh &' trong .c `.] v `.^.
l 0c :&L8 &*n sO )ng phMng th:c Read ca XmlTextReader. RhMng th:c n' tiIn r(a)(r
In nGt kI tiIp8 v tr v true. HIu kh4ng ckn nGt no nKa8 nF s@ tr v false. L*n cF th thu
l' th4ng tin v nGt hin t*i th4ng 9ua cc thuc t2nh ca XmlTextReader g&ao gt. Name8
Value8 v NodeTypeh.
176
Chng 5: N?
l nh6n &iIt .t phNn tO cF cc !c t2nh ha' kh4ng8 &*n phi ki. tra thuc t2nh
HasAttributes v rti sO )ng phMng th:c GetAttribute thu l' cc !c t2nh th(o t>n ha'
th(o chJ sD. yp XmlTextReader chJ cF th tru' ;ut .t nGt t*i .t thi i.8 v nF kh4ng
th )ich chu'n ng$c ha' nh' sang .t nGt &t k. Uo F8 t2nh linh ho*t ca nF kX. hMn
lp XmlDocument.
ng )ng )i <' ghi v 0c .t ti liu :&L &5ng lp XmlTextWriter v XmlTextReader.
7i liu n' giDng vi ti liu S $c t*o trong .c `.] v `.^ &5ng lp XmlDocument.
using System;
using System.Xml;
using System.IO;
using System.Text;
public class ReadWriteXml {
private static void Main() {
// Tao file v writer.
FileStream fs = new FileStream("products.xml", FileMode.Create);
XmlTextWriter w = new XmlTextWriter(fs, Encoding.UTF8);
// Khoi dng ti liu.
w.WriteStartDocument();
w.WriteStartElement("products");
// Ghi mt product.
w.WriteStartElement("product");
w.WriteAttributeString("id", "1001");
w.WriteElementString("productName", "Gourmet Coffee");
w.WriteElementString("productPrice", "0.99");
w.WriteEndElement();
// Ghi mt product khc.
w.WriteStartElement("product");
w.WriteAttributeString("id", "1002");
w.WriteElementString("productName", "Blue China Tea Pot");
w.WriteElementString("productPrice", "102.99");
177
Chng 5: N?
w.WriteEndElement();
// Kt thc ti liu.
w.WriteEndElement();
w.WriteEndDocument();
w.Flush();
fs.Close();
Console.WriteLine("Document created. " +
"Press Enter to read the document.");
Console.ReadLine();
fs = new FileStream("products.xml", FileMode.Open);
XmlTextReader r = new XmlTextReader(fs);
// oc tt ca cc nt.
while (r.Read()) {

if (r.NodeType == XmlNodeType.Element) {
Console.WriteLine();
Console.WriteLine("" + r.Name + "");
if (r.HasAttributes) {
for (int i = 0; i r.AttributeCount; i++) {
Console.WriteLine("tATTRIBUTE: " +
r.GetAttribute(i));
}
}
}
else if (r.NodeType == XmlNodeType.Text) {
Console.WriteLine("tVALUE: " + r.Value);
}
}
Console.ReadLine();
}
178
Chng 5: N?
}
8' 8' +c nh n t7nh h % l c a m t ti li u +59 d a trn m t +c nh n t7nh h % l c a m t ti li u +59 d a trn m t
0chema 0chema
#eA JwA vSJ A>NA QaA> >Wd Yq Jbc OIQ Q\@ Y@qZ +M. F`AB JSJ> FRX LRO A^ QZA
Q>X OIQ +M. Schema(
Sg hUAB YEd $!stem.5ml.5ml>alidating&eader( TeX OIQ Q>t >@qA Jbc YEd A\], Aed
Schema D\X QNd >Wd 5ml>alidating&eader.$c.emas, hMJ> J>Z]tA Zc QAB AQ
OIQ F`AB JSJ> B@ 5ml>alidating&eader.&ead, D\ F{Q FPQ J~ ABXe@ Yq A\X( !t QlO
QPQ JR JSJ Yx@ QHXAB OIQ Q\@ Y@qZ O\ s>TAB d>R@ F{Q ABXe@ Yq, >}] Q>U Y fn s@qA
>alidation0ventHandler(
"t :&L *)hema ggin t :&Lh inh nghqa cc 9u' t/c . .t kiu ti liu :&L cho trc
phi tu<n th(o. Pc 9u' t/c n' inh nghqa\
Pc phNn tO v !c t2nh cF th ;ut hin trong ti liu.
Pc kiu )K liu cho phNn tO v !c t2nh.
Pu trGc ca ti liu8 &ao gt. cc phNn tO no l con ca cc phNn tO khc.
7h: t= v sD l$ng cc phNn tO con ;ut hin trong ti liu.
Pc phNn tO no l r#ng8 cF th ch:a t(;t8 ha' ki hVi cc gi tri cD inh.
Ln s<u v cc ti liu :&L *)hema v$t 9u ph*. vi ca chMng n'8 nhng &*n cF th t%.
hiu nF th4ng 9ua .t v2 ) Mn gin. "c n' s@ sO )ng ti liu :&L .4 t )anh .c sn
phx. S $c tr%nh &' trong .c `.Z.
A .:c cM &n nht8 :&L *)hema Ee?"n"/"on g:*Eh $c sO )ng inh nghqa cc phNn tO
cF th ;ut hin trong ti liu :&L. Ln th<n ti liu :*E $c viIt th(o )*ng :&L8 v &*n sO
)ng .t phNn tO S $c inh nghqa trc gcF t>n l elementh chJ inh cc phNn tO s@
cNn thiIt trong ti liu 2ch. l!c t2nh type cho &iIt kiu )K liu. u2 ) )i <' l t>n sn
phx.\
xsd:element name="productName" type="xsd:string" /
u v2 ) )i <' l gi sn phx.\
xsd:element name="productPrice" type="xsd:decimal" /
L*n cF th t%. hiu cc kiu )K liu *)hema t*i 8htt94::ZZZ>ZL>o?2:TR:[;@<chD;BGIH. PhGng
nh ;* In cc kiu )K liu .NET v &ao gt. string8 int8 long8 decimal8 float8 dateTime8
boolean8 base64Binary...
P productName v productPrice u l cc kiu Mn gin v% chGng chJ ch:a )K liu )*ng kB
t=. Pc phNn tO cF ch:a cc phNn tO ltng &>n trong $c g0i l cc kiu ph:c t*p. L*n cF th
ltng chGng vo nhau &5ng thj sequence gnIu th: t= l 9uan tr0ngh ha' thj all gnIu th: t=
l kh4ng 9uan tr0ngh. Ui <' l cch l/p phNn tO product vo )anh .c sn phx.. PhG B
179
Chng 5: N?
r5ng8 cc !c t2nh lu4n $c khai &o sau cc phNn tO8 v chGng kh4ng $c nhF. vi thj
sequence ha' all v% th: t= kh4ng 9uan tr0ng.
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
7h(o .!c inh8 .t phNn tO cF th ;ut hin Gng .t lNn trong .t ti liu. Hhng &*n cF
th cu h%nh iu n' &5ng cch chJ inh cc !c t2nh maxOccurs v minOccurs. u2 ) )i <'
kh4ng gii h*n sD l$ng sn phx. trong )anh .c\
xsd:element name="product" type="product" maxOccurs="unbounded" /
Ui <' l *)hema cho )anh .c sn phx.\
xml version="1.0"
xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
!-- nh ngha product (kiu phc). --
xsd:complexType name="product"
xsd:sequence
xsd:element name="productName" type="xsd:string"/
xsd:element name="productPrice" type="xsd:decimal"/
xsd:element name="inStock" type="xsd:boolean"/
/xsd:sequence
xsd:attribute name="id" type="xsd:integer"/
/xsd:complexType
!-- y l cu trc m ti liu phai tun theo.
Bt du vi phn tu productCatalog. --
xsd:element name="productCatalog"
xsd:complexType
xsd:sequence
xsd:element name="catalogName" type="xsd:string"/
xsd:element name="expiryDate" type="xsd:date"/
xsd:element name="products"
180
Chng 5: N?
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
yp XmlValidatingReader th=c thi tt c cc 9u' t/c *)hema n'E&o . ti liu l h$p l
Ev nF c?ng ki. tra ti liu :&L S $c chJnh )*ng ha' cha gnghqa l kh4ng cF cc kB t=
&t h$p l8 tt c cc thj .C u cF .t thj Fng tMng :ng8 v.v...h. l ki. tra .t ti liu8
hS' )eng phMng th:c XmlValidatingReader.Read )u't 9ua tQng nGt .t. HIu t%. th'
l#i8 XmlValidatingReader )=ng l>n s= kin ValidationEventHandler vi cc th4ng tin v l#i.
HIu .uDn8 &*n cF th th lB s= kin n' v tiIp tc ki. tra ti liu t%. th>. l#i. HIu &*n
kh4ng th lB s= kin n'8 ngo*i l XmlException s@ $c )=ng l>n khi &/t g!p l#i Nu ti>n v
9u tr%nh ki. tra s@ &i &V )C. l ki. tra .t ti liu S $c chJnh )*ng ha' cha8 &*n cF
th sO )ng XmlValidatingReader . kh4ng cNn In *)hema.
u2 ) kI tiIp tr%nh &' .t lp tin 2ch )eng hin thi tt c cc l#i trong .t ti liu :&L
khi phMng th:c ValidateXml $c g0i. Pc l#i s@ $c hin thi trong .t cOa ss Con8oDe8 v
.t &iIn lu6n lB $c tr v cho &iIt 9u tr%nh ki. tra thnh c4ng ha' tht &*i.
using System;
using System.Xml;
using System.Xml.Schema;
public class ConsoleValidator {
// Thit lp thnh true nu tn tai t nht mt li.
private bool failed;
public bool Failed {
get {return failed;}
}
181
Chng 5: N?
public bool ValidateXml(string xmlFilename, string schemaFilename) {
// Tao validator.
XmlTextReader r = new XmlTextReader(xmlFilename);
XmlValidatingReader validator = new XmlValidatingReader(r);
validator.ValidationType = ValidationType.Schema;
// Nap Schema vo validator.
XmlSchemaCollection schemas = new XmlSchemaCollection();
schemas.Add(null, schemaFilename);
validator.Schemas.Add(schemas);
// Thit lp phng thc th l s kin validation.
validator.ValidationEventHandler +=
new ValidationEventHandler(ValidationEventHandler);

failed = false;
try {
// oc tt ca d liu XML.
while (validator.Read())
{}
}catch (XmlException err) {
// iu ny xay ra khi ti liu XML c cha k t bt
// hop l hoac cc the lng nhau hay dng khng dng.
Console.WriteLine("A critical XML error has occurred.");
Console.WriteLine(err.Message);
failed = true;
}finally {
validator.Close();
}
return !failed;
}
private void ValidationEventHandler(object sender,
ValidationEventArgs args) {
182
Chng 5: N?
failed = true;
// Hin th li validation.
Console.WriteLine("Validation error: " + args.Message);
Console.WriteLine();
}
}
Ui <' l cch sO )ng lp n' ;c nh6n t2nh h$p l ca )anh .c sn phx.\
using System;
public class ValidateXml {
private static void Main() {
ConsoleValidator consoleValidator = new ConsoleValidator();
Console.WriteLine("Validating ProductCatalog.xml.");
bool success = consoleValidator.ValidateXml("ProductCatalog.xml",
"ProductCatalog.xsd");
if (!success) {
Console.WriteLine("Validation failed.");
}else {
Console.WriteLine("Validation succeeded.");
}
Console.ReadLine();
}
}
HIu ti liu h$p l th% s@ kh4ng cF th4ng &o no ;ut hin8 v &iIn success s@ $c thiIt l6p
thnh true. Hhng ;Xt ;(. iu g% s@ ;' ra nIu &*n sO )ng .t ti liu ph v cc 9u' t/c
*)hema8 ch~ng h*n fil( ProAu)/Ca/aDogc<nBaD"A.2mD nh sau\
xml version="1.0"
productCatalog
catalogNameAcme Fall 2003 Catalog/catalogName
expiryDateJan 1, 2004/expiryDate
183
Chng 5: N?
products
product id="1001"
productNameMagic Ring/productName
productPrice342.10/productPrice
inStocktrue/inStock
/product
product id="1002"
productNameFlying Carpet/productName
productPrice982.99/productPrice
inStockYes/inStock
/product
/products
/productCatalog
HIu &*n ki. tra ti liu n'8 &iIn success s@ $c thiIt l6p thnh false v kIt ;ut s@ cho
&iIt cc l#i\
Validating ProductCatalog_Invalid.xml.
Validation error: The 'expiryDate' element has an invalid value according to its
data type. An error occurred at file:///I:/CSharp/Chuong05/05-08/
bin/Debug/ProductCatalog_Invalid.xml, (4, 30).
Validation error: The 'productPrice' element has an invalid value according to its
data type. An error occurred at file:///I:/CSharp/Chuong05/05-08/
bin/Debug/ProductCatalog_Invalid.xml, (9, 36).
Validation error: The 'inStock' element has an invalid value according to its data
type. An error occurred at file:///I:/CSharp/Chuong05/05-08/
bin/Debug/ProductCatalog_Invalid.xml, (15, 2).
Validation failed.
PuDi ceng8 nIu .uDn ;c nh6n t2nh h$p l ca .t ti liu :&L v rti ;O lB nF8 &*n cF th sO
)ng XmlValidatingReader 9uXt ti liu khi nF $c 0c vo .t XmlDocument trongz&z
nh\
XmlDocument doc = new XmlDocument();
XmlTextReader r = new XmlTextReader("ProductCatalog.xml");
XmlValidatingReader validator = new XmlValidatingReader(r);
// Nap Schema vo validator.
validator.ValidationType = ValidationType.Schema;
184
Chng 5: N?
XmlSchemaCollection schemas = new XmlSchemaCollection();
schemas.Add(null, "ProductCatalog.xsd");
validator.Schemas.Add(schemas);
// Nap v kim tra ti liu cung mt lc.
try {
doc.Load(validator);
// (Validation thnh cng.)
}catch (XmlSchemaException err) {
// (Validation tht bai.)
}
9' 9' 0 d ng +59 0eriali>ation v i cc i t ng t(y !i n 0 d ng +59 0eriali>ation v i cc i t ng t(y !i n
#eA JwA fg hUAB +M. A>V OIQ LMA> heAB QZwA Qn >^c iserialiBation formatk( TZ]
A>@CA, FeA s>TAB OZKA vg Y +M. QHnJ Q@jd QHXAB O} YqA>, O\ OZKA QV[AB QSJ
DE@ h? Y@qZ F`AB JSJ LK@ QVWAB Qr] F@jA(
Sg hUAB YEd $!stem.5ml.$erialiIation.5ml$erialiIer Lt J>Z]tA h? Y@qZ Q LK@
QVWAB Jbc FeA fcAB +M., D\ ABVWJ Ye@( #eA JAB J^ Q>t LSA> hPZ O} YqA> Jbc
YEd F`AB JSJ L_J QaA> Lt Qr] F@jA F@tZ h@uA +M. Jbc A^(
yp XmlSerializer cho phXp chu'n cc Di t$ng thnh )K liu :&L8 v ng$c l*i. yp n'
th4ng .inh t*o Gng cc .ng khi nF t%. th' cc phNn tO ltng &>n trong.
Pc '>u cNu khi sO )ng XmlSerializer\
XmlSerializer chJ tuNn t= hFa cc thuc t2nh v cc &iIn c4ng khai.
Pc lp cNn tuNn t= hFa phi ch:a .t phMng th:c khCi )=ng .!c inh kh4ng cF Di
sD. XmlSerializer s@ sO )ng phMng th:c khCi )=ng n' khi t*o Di t$ng .i trong
9u tr%nh gii tuNn t= hFa.
Pc thuc t2nh ca lp phi l khz0c greaAa4Deh v khzghi gwr"/a4Deh. lF l v%
XmlSerializer sO )ng h. tru' ;ut thuc t2nh ge/ l' th4ng tin v h. tru' ;ut
thuc t2nh 8e/ phc hti )K liu sau khi gii tuNn t= hFa.
#eA JAB J^ Q>t YVZ QH? JSJ LK@ QVWAB Q>X LMA> heAB hnc6QHCA6+M. F`AB JSJ>
fg hUAB .NET SerialiBation D\ $!stem.&untime.$erialiIation."ormatters.$oap.
$oap"ormatter( THXAB QHVoAB >Wd A\], FeA J> JwA Y\O J>X YEd Jbc FeA QH
Q>\A> s>R6QZwA6Qn6>^c, s>TAB JwA JZAB JPd d>V[AB Q>~J s>@ hnAB O_J LMA>
>c] FRX LRO QPQ JR JSJ Q>ZIJ QaA> Y\ s>R B>@( TZ] A>@CA, JSJ> A\] s>TAB J>X FeA
Z]GA s@tO fXSQ QHCA LMA> heAB +M. L}6LVWJ6QZwA6Qn6>^c(
185
Chng 5: N?
l sO )ng :&L 8er"aD"Oa/"on8 trc hIt &*n phi nh )u cc Di t$ng )K liu vi cc !c
t2nh cho &iIt phXp nh ;* sang :&L. Pc !c t2nh n' thuc kh4ng gian t>n
System.Xml.Serialization v &ao gt.\
XmlRootEcho &iIt t>n phNn tO gDc ca fil( :&L. 7h(o .!c inh8 XmlSerializer s@ sO
)ng t>n ca lp. l!c t2nh n' cF th $c p )ng khi khai &o lp.
XmlElementEcho &iIt t>n phNn tO )eng cho .t thuc t2nh ha' &iIn c4ng khai. 7h(o
.!c inh8 XmlSerializer s@ sO )ng t>n ca thuc t2nh ha' &iIn c4ng khai.
XmlAttributeEcho &iIt .t thuc t2nh ha' &iIn c4ng khai s@ $c tuNn t= hFa thnh
.t !c t2nh gkh4ng phi phNn tOh8 v chJ inh t>n !c t2nh.
XmlEnumEcu h%nh phNn t(;t s@ $c sO )ng khi tuNn t= hFa cc gi tri lit k>. HIu
&*n kh4ng sO )ng XmlEnum8 t>n ca h5ng lit k> s@ $c sO )ng.
XmlIgnoreEcho &iIt .t thuc t2nh ha' &iIn c4ng khai s@ kh4ng $c tuNn t= hFa.
u2 )8 ;Xt )anh .c sn phx. S $c tr%nh &' trong .c `.Z. L*n cF th .4 t ti liu
:&L n' &5ng cc Di t$ng ProductCatalog v Product nh sau\
using System;
using System.Xml.Serialization;
[XmlRoot("productCatalog")]
public class ProductCatalog {
[XmlElement("catalogName")]
public string CatalogName;

// Su dng kiu d liu ngy (bo qua phn gi).
[XmlElement(ElementName="expiryDate", DataType="date")]
public DateTime ExpiryDate;

// Cu hnh tn the.
[XmlArray("products")]
[XmlArrayItem("product")]
public Product[] Products;
public ProductCatalog() {
// Phng thc khoi dng mac dnh (dung khi giai tun t ha).
}
public ProductCatalog(string catalogName, DateTime expiryDate) {
this.CatalogName = catalogName;
186
Chng 5: N?
this.ExpiryDate = expiryDate;
}
}
public class Product {
[XmlElement("productName")]
public string ProductName;

[XmlElement("productPrice")]
public decimal ProductPrice;

[XmlElement("inStock")]
public bool InStock;

[XmlAttributeAttribute(AttributeName="id", DataType="integer")]
public string Id;
public Product() {
// Phng thc khoi dng mac dnh (dung khi giai tun t ha).
}
public Product(string productName, decimal productPrice) {
this.ProductName = productName;
this.ProductPrice = productPrice;
}
}
PhG B r5ng8 cc lp n' sO )ng cc !c t2nh :&L *er"aD"Oa/"on si t>n phNn tO gsO )ng
kiu kB hiu Pa8)aD
Z
trong t>n thnh vi>n lp8 v kiu kB hiu lng l*c
]
trong t>n thj :&Lh8
cho &iIt cc kiu )K liu kh4ng r} rng8 v chJ inh cc phNn tO product s@ $c ltng &>n
trong productCatalog nh thI no.
L5ng cch sO )ng cc lp te' &iIn n' v Di t$ng XmlSerializer8 &*n cF th chu'n :&L
thnh cc Di t$ng v ng$c l*i. lo*n .S )i <' t*o .t Di t$ng ProductCatalog .i8
Z
Pa8)aD )a8"ng\ "3u t= Nu ti>n ca cc chK u viIt hoa8 v2 ) SomeOtherName
]
CameD )a8"ng\ "3u t= Nu ti>n ca chK Nu viIt thng8 .3u t= Nu ti>n ca cc chK i sau viIt hoa8 v2
) someOtherName
187
Chng 5: N?
tuNn t= hFa Di t$ng thnh ti liu :&L8 gii tuNn t= hFa ti liu thnh Di t$ng8 v rti hin
thi ti liu n'\
using System;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
public class SerializeXml {
private static void Main() {
// Tao danh mc san phm.
ProductCatalog catalog = new ProductCatalog("New Catalog",
DateTime.Now.AddYears(1));
Product[] products = new Product[2];
products[0] = new Product("Product 1", 42.99m);
products[1] = new Product("Product 2", 202.99m);
catalog.Products = products;
// Tun t ha danh mc ra file.
XmlSerializer serializer =
new XmlSerializer(typeof(ProductCatalog));
FileStream fs =
new FileStream("ProductCatalog.xml", FileMode.Create);
serializer.Serialize(fs, catalog);
fs.Close();
catalog = null;
// Giai tun t ha danh mc tu file.
fs = new FileStream("ProductCatalog.xml", FileMode.Open);
catalog = (ProductCatalog)serializer.Deserialize(fs);
// Tun t ha danh mc ra cua s Console.
serializer.Serialize(Console.Out, catalog);
Console.ReadLine();
}
188
Chng 5: N?
}
10' 10' T o +59 0chema cho m t l % ?N@T T o +59 0chema cho m t l % ?N@T
#eA JwA QeX OIQ +M. Schema hnc QHCA OIQ >c] A>@GZ YEd C#( !@GZ A\] J>X
d>d FeA s@tO QHc QaA> >Wd Yq Jbc JSJ Q\@ Y@qZ +M. QHVEJ s>@ B@R@ QZwA Qn >^c
J>AB DE@ 5ml$erialiIer(
Sg hUAB Q@qA aJ> hyAB YqA> +M. Schema efinition Tool i8s&.e8eL@ sO DE@
(NET Frameworkk( C> LMA> QCA Jbc cffOFY] Y\O LK@ fK hyAB YqA>, D\ Q>CO LK@
fK /t:[TypeName] Lt J>X F@jQ s@tZ JwA J>Z]tA L@(
"c `.c S tr%nh &' cch sO )ng XmlSerializer tuNn t= hFa Di t$ng .NET thnh :&L8
v gii tuNn t= hFa :&L thnh Di t$ng .NET. Hhng nIu .uDn sO )ng :&L nh .t
phMng cch tMng tc vi cc :ng )ng khc8 9u' tr%nh nghip v8 ha' cc :ng )ng phiz
Framework8 &*n s@ cNn ;c nh6n t2nh h$p l ca :&L trc khi gii tuNn t= hFa nF. L*n c?ng
s@ cNn t*o .t ti liu :&L *)hema inh nghqa cu trGc v cc kiu )K liu $c sO )ng
trong inh )*ng :&L ca &*n8 cc :ng )ng khc cF th l. vic vi nF. "t gii php l
sO )ng tin 2ch )kng lnh 28A.e2e.
7in 2ch 28A.e2e i k1. vi .NET Framework. HIu S ci !t &")ro8o?/ V"8uaD */uA"o .NET8
&*n s@ t%. th' nF trong th .c CNHProgram F"De8H&")ro8o?/ V"8uaD */uA"o
.NETHFramework*E'H$"n. 7in 2ch 28A.e2e cF th t*o ra :&L *)hema tQ .t ass(.&l' S
$c &i>n )ich. L*n chJ cNn cung cp t>n fil( v cho &iIt lp .4 t ti liu :&L vi Di sD
/t:[TypeName].
u2 )8 ;Xt cc lp ProductCatalog v Product S $c tr%nh &' trong .c `.c. L*n cF th t*o
:&L *)hema cho .t )anh .c sn phx. vi )kng lnh sau\
xsd @M<@N.exe /t:/roductCatalog
L*n chJ cNn chJ inh lp ProductCatalog tr>n )kng lnh8 v% lp n' .4 t ti liu :&L. :&L
*)hema $c t*o ra trong v2 ) n' gcF t>n .!c inh l 8)hema0.28Ah s@ .4 t N' .t
)anh .c sn phx.8 vi cc it(. sn phx. ltng &>n trong. L<' gi8 &*n cF th sO )ng
XmlValidatingReader gS $c tr%nh &' trong .c `.bh ki. tra t2nh h$p l ca ti liu
:&L )=a vo :&L *)hema n'.
11' 11' T o l % t m t +59 0chema T o l % t m t +59 0chema
#eA JwA QeX OIQ >c] A>@GZ YEd C# hnc QHCA OIQ +M. Schema Lt fcZ L^, FeA J^
Q>t QeX OIQ Q\@ Y@qZ +M. Q>X LMA> heAB d>r >Wd F`AB JSJ LK@ QVWAB A\] D\
5ml$erialiIer(
Sg hUAB Q@qA aJ> hyAB YqA> 8s&.e8e iL@ sO DE@ .NET Frameworkk( C> LMA> QCA
@Y Schema Y\O LK@ fK hyAB YqA>, D\ Q>CO LK@ fK /c Lt J>X F@jQ FeA OZKA QeX O}
YqA> J>X YEd(
189
Chng 5: N?
"c `.Zd S gii thiu tin 2ch )kng lnh 28A.e2e8 tin 2ch n' cF th $c sO )ng t*o
:&L *)hema )=a tr>n inh nghqa lp. Yu tr%nh ng$c l*i gt*o .S lnh C# )=a tr>n .t ti
liu :&L *)hemah c?ng cF th ;' ra. uic n' hKu 2ch khi &*n .uDn ghi .t inh )*ng
:&L no F8 nhng l*i kh4ng .uDn t*o ti liu n' &5ng cch ghi tQng nGt .t vi lp
XmlDocument ha' XmlTextWriter. 7ha' vo F8 &5ng cch sO )ng 28A.e2e8 &*n cF th t*o ra
.t t6p N' cc Di t$ng .NET. wI F8 &*n cF th tuNn t= hFa cc Di t$ng n' thnh
&iu )irn :&L &5ng XmlSerializer8 nh $c .4 t trong .c `.c.
l t*o .S lnh tQ .t :&L *)hema8 &*n chJ cNn cung cp t>n fil( *)hema v th>. Di sD /c
cho &iIt &*n .uDn t*o ra lp. u2 )8 ;Xt :&L *)hema S $c tr%nh &' trong .c `.b.
L*n cF th t*o .S lnh C# tQ *)hema n' vi )kng lnh sau\
xsd /roductCatalog.xsd /c
ynh n' s@ t*o ra .t fil( gProAu)/Ca/aDog.)8h gt. hai lp\ Product v productCalalog. nai
lp n' tMng t= vi hai lp S $c t*o trong .c `.c.
12' 12' Th c hi n %h:% !i n i +09 Th c hi n %h:% !i n i +09
#eA JwA F@jA L@ OIQ Q\@ Y@qZ +M. Q>\A> OIQ Q\@ Y@qZ s>SJ F`AB +S.T st:lesheet(
Sg hUAB YEd $!stem.5ml.5sl.5sl)rans*orm( Ned +S.T st:lesheet F`AB d>V[AB
Q>~J 5sl)rans*orm.+oad, D\ QeX Q\@ Y@qZ sjQ vZPQ F`AB d>V[AB Q>~J )rans*orm iJwA
JZAB JPd Q\@ Y@qZ ABZAk(
:*LT gha' :*L Tran8?orm8h l .t ng4n ngK )=aztr>nz:&L8 $c thiIt kI &iIn si .t ti
liu :&L thnh .t ti liu khc. :*LT cF th $c sO )ng t*o .t ti liu :&L .i vi
ceng )K liu nhng $c s/p ;Ip th(o .t cu trGc khc ho!c ch0n .t t6p con )K liu
trong .t ti liu. HF c?ng cF th $c sO )ng t*o .t kiu ti liu cF cu trGc khc.
:*LT thng $c sO )ng th(o cch n' inh )*ng .t ti liu :&L thnh .t trang
;T&L.
:*LT l .t ng4n ngK a nvng8 v vic t*o :*L Tran8?orm8 v$t 9u ph*. vi 9u'n sch
n'. 7u' nhi>n8 &*n cF th h0c cch t*o cc ti liu :*LT Mn gin &5ng cch ;(. .t v2 )
cM &n. "c n' s@ &iIn si ti liu orAer8.2mD gS $c tr%nh &' trong .c `.ah thnh .t
ti liu ;T&L v rti hin thi kIt 9u. l th=c hin phXp &iIn si n'8 &*n s@ cNn :*LT
8/yDe8hee/ 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"
htmlbodyp
Order bxsl:value-of select="Client/@id"//b
for xsl:value-of select="Client/Name"//p
table border="1"
190
Chng 5: N?
tdID/tdtdName/tdtdPrice/td
xsl:apply-templates select="Items/Item"/
/table/body/html
/xsl:template

xsl:template match="Items/Item"
tr
tdxsl:value-of select="@id"//td
tdxsl:value-of select="Name"//td
tdxsl:value-of select="Price"//td
/tr
/xsl:template
/xsl:stylesheet
u cM &n8 .0i :*L 8/yDe8hee/ gt. .t t6p cc t(.plat(. "#i t(.plat( so treng vi cc phNn
tO trong ti liu ngutn v rti .4 t cc phNn tO $c so treng t*o n>n ti liu kIt 9u. l
so treng t(.plat(8 ti liu :*LT sO )ng &iu th:c :Pa/h8 nh $c .4 t trong .c `.a.
*/yDe8hee/ vQa tr%nh &' C tr>n gorAer8.28D/h gt. hai t(.plat( gl cc con ca phNn tO
8/yDe8hee/ gDch. 7(.plat( Nu ti>n treng khp vi phNn tO Order gDc. whi & ;O lB :*LT t%.
th' .t phNn tO Order8 nF s@ ghi ra cc thj cNn thiIt &/t Nu .t &ng ;T&L vi cc ti>u
ct th2ch h$p v ch1n )K liu v khch hng &5ng lnh value<o* gghi ra kIt 9u )*ng t(;t
ca .t &iu th:c :Pa/hh. 7rong trng h$p n'8 cc &iu th:c :Pa/h gClient/@id v
Client/Nameh treng vi !c t2nh id v phNn tO Name.
wI tiIp8 lnh appl!<templates $c sO )ng ph<n nhnh v ;O lB cc phNn tO Item n5.
trong. liu n' l cNn thiIt v% cF th cF nhiu phNn tO Item. "#i phNn tO Item $c so treng
&5ng &iu th:c Items/Item gnGt gDc Order kh4ng $c chJ inh v% Order ch2nh l nGt hin t*ih.
PuDi ceng8 cc thj cNn thiIt s@ $c ghi ra kIt thGc ti liu ;T&L.
HIu th=c thi phXp &iIn si n' tr>n fil( orAer8.2mD gS tr%nh &' trong .c `.ah8 &*n s@ nh6n
$c kIt 9u gti liu ;T&Lh nh sau\
html
body
p
Order bROS-930252034/b
for Remarkable Office Supplies/p
table border="1"
tdID/td
tdName/td
191
Chng 5: N?
tdPrice/td
tr
td1001/td
tdElectronic Protractor/td
td42.99/td
/tr
tr
td1002/td
tdInvisible Ink/td
td200.25/td
/tr
/table
/body
/html
l p )ng .t :*LT 8/yDe8hee/ trong .NET8 &*n cNn sO )ng lp XslTransform. ng )ng
)i <' p )ng phXp &iIn si v rti hin thi fil( S $c &iIn si trong cOa ss tr%nh )u't
(&. 7rong v2 ) n'8 .S lnh S sO )ng phi>n &n n*p chtng ca phMng th:c Transform
lu tr=c tiIp ti liu kIt 9u ra qa8 .!c )e &*n cF th thu l' v ;O lB nF nh .t str(a.
&>n trong :ng )ng ca &*n.
using System;
using System.Windows.Forms;
using System.Xml.Xsl;
public class TransformXml : System.Windows.Forms.Form {
private AxSHDocVw.AxWebBrowser webBrowser;
// (Bo qua phn m designer.)
private void TransformXml_Load(object sender, System.EventArgs e) {
XslTransform transform = new XslTransform();

// Nap XSL stylesheet.
transform.Load("orders.xslt");

// Bin di orders.xml thnh orders.html.
transform.Transform("orders.xml", "orders.html", null);
192
Chng 5: N?
object var = null;
webBrowser.Navigate(
"file:///" + Application.StartupPath + @"orders.html",
ref var, ref var, ref var, ref var);
}
}
0nh 5'5 Kt xut stylesheet cho orders.xml
(NET Framework s>TAB J^ L@GZ s@tO A\X hrAB Lt Q>t >@qA AI@ hZAB CTM.( TZ]
A>@CA, J>~J AAB A\] J^ Q>t J^ LVWJ Q>TAB Zc s>R AAB Y@CA QSJ C3M AjZ FeA
fg hUAB L@GZ s@tO ;cti"e+ *e9 5rowser iL@ JrAB Microsoft /nternet E8plorer D\
>q L@GZ >\A> Microsoft *in&owsk( Cgc f A\] J^ Q>t >@tA Q>M JSJ @Y CTM. JUJ
FI >c] vc, D\ >x QHW Da"aScript, $5Script, D\ QPQ JR JSJ dYZB6@A J>X /nternet
E8plorer ivO OUJ ( Lt F@jQ JSJ> Q>CO L@GZ s@tO *e9 5rowser D\X hn SAk(
6
193
Ch01n2 \4]IN,J]S ^JR/
194
195
Chng 6: Oindok Poao
")ro8o?/ .NET Framework ch:a .t t6p phong phG cc lp )eng t*o cc :ng
)ng )=aztr>nz@"nAow8 tru'n thDng trong kh4ng gian t>n System.Windows.
Forms. Pc lp n' cF ph*. vi tQ cc phNn cM &n nh cc lp TextBox8 Button8 v
MainMenu In cc iu ki. chu'>n &it nh TreeView8 LinkLabel8 v NotifyIcon. Hgoi ra8
&*n s@ t%. th' tt c cc c4ng c cNn thiIt 9un lB cc :ng )ng giao )in a ti liu
g&uD/"KDe Eo)umen/ <n/er?a)eE&E<h8 t2ch h$p vic tr$ giGp c.zngKzcnh8 v nga' c t*o
cc giao )in ngi )eng a ng4n ngKEtt c u kh4ng cNn vin In s= ph:c t*p ca @"nC2
>P<.
&
nNu hIt cc nh pht trin C# cF th t= n/. &/t nhanh chFng .4 h%nh l6p tr%nh @"nAow8
Form. 7u' nhi>n8 cF .t sD th thu6t v k thu6t kh4ng tDn nhiu thi gian cF th l. cho
vic l6p tr%nh @"nAow8 hiu 9u hMn. PhMng n' s@ tr%nh &' cc vn sau <'\
Pch khai thc trit cc iu ki.8 &ao gt. th>. chGng vo for. lGc th=c thi g.c
a.Zh8 li>n kIt chGng vi )K liu no F g.c a.]h8 v ;O lB chGng .t cch tsng 9ut
g.c a.^h.
Pch l. vic vi for.8 &ao gt. th(o vIt chGng trong .t :ng )ng g.c a._h8 sO
)ng &E< g.c a.`h8 v lu trK th4ng tin v k2ch thc v vi tr2 g.c a.ah. L*n c?ng s@
&iIt cch t*o for. a ng4n ngK g.c a.Z^h v for. kh4ng ng vin g.c a.Z_ v
a.Z`h.
"t sD th thu6t khi l. vic vi cc iu ki. th4ng )ng nh ListBox g.c a.[h8
TextBox g.c a.bh8 ComboBox g.c a.ch8 ListView g.c a.Zdh8 v Menu g.c a.ZZ v
.c a.Z]h.
Pch t*o .t icon ng trong kha' h thDng g.c a.Zah.
Pc khi ni. . &*n cF th p )ng cho nhiu kiu iu ki.8 &ao gt. ;c nh6n t2nh
h$p l g.c a.Z[h8 kXozvzth g.c a.Zbh8 tr$ giGp c.zngKzcnh g.c a.Zch8 phong
cch @"nAow8 :P g.c a.]dh8 v c ca for. g.c a.]Zh.
HwZ >jQ JSJ OUJ QHXAB J>V[AB A\] fg hUAB JSJ YEd L@GZ s@tO, YZTA LVWJ LMA>
AB>c QHXAB s>TAB B@cA QCA $!stem.indo%s."orms( 3>@ LVc D\X JSJ YEd A\], QCA
s>TAB B@cA QCA Lw] Lb s>TAB LVWJ J> LMA>, D\ $!stems.indo%s."orms LVWJ
Q>c A>NA(
1' 1' Thm i u "i m vo $orm l;c th c thi Thm i u "i m vo $orm l;c th c thi
#eA JwA Q>CO OIQ L@GZ s@tO D\X XHO YJ Q>nJ Q>@, s>TAB d>R@ YJ Q>@jQ sj(
TeX OIQ LK@ QVWAB Jbc YEd L@GZ s@tO Q>aJ> >Wd( 3j L^, Q>CO LK@ QVWAB A\] D\X
OIQ XHO >X_J OIQ L@GZ s@tO JXAQc@AH F`AB d>V[AB Q>~J #dd Jbc
ControlCollection(
7rong .t :ng )ng )=aztr>nz@"nAow8 .NET8 kh4ng cF s= khc &it no giKa vic t*o iu
ki. lGc thiIt kI v vic t*o iu ki. lGc th=c thi. whi &*n t*o .t iu ki. lGc thiIt kI gsO
)ng c4ng c &")ro8o?/ V"8uaD */uA"o .NETh8 o*n .S cNn thiIt s@ $c th>. vo lp for.8 c
th l trong .t phMng th:c !c &it cF t>n l InitializeComponent. L*n cF th sO )ng
196
Chng 6: Oindok Poao
o*n .S giDng nh v6' trong :ng )ng ca &*n t*o iu ki.. L*n cNn th=c hin cc &c
sau\
Z. 7*o .t Di t$ng ca lp iu ki. th2ch h$p.
]. Pu h%nh cc thuc t2nh ca iu ki. g!c &it l k2ch thc v t0a vi tr2h.
^. 7h>. iu ki. n' vo for. ho!c iu ki. contain(r.
_. Hgoi ra8 nIu cNn th lB cc s= kin cho iu ki. .i8 &*n cF th g/n chGng vo cc
phMng th:c hin cF.
"#i iu ki. u cung cp thuc t2nh Controls tha. chiIu In ControlCollection ch:a
tt c cc iu ki. con ca nF. l th>. .t iu ki. con8 &*n cNn g0i phMng th:c
ControlCollection.Add. u2 ) sau <' s@ l. r} iu n' &5ng cch t*o ng .t )anh sch
cc CheckBox. "t CheckBox $c th>. vo cho .#i it(. trong .t .ng. 7t c cc
CheckBox $c th>. vo .t Panel gPanel cF thuc t2nh AutoScroll l true cF th cun
9ua )anh sch cc CheckBoxh.
0nh 6'1 anh sch cc CheckBox doc-tao-dng
using System;
using System.Windows.Forms;
public class DynamicCheckBox : System.Windows.Forms.Form {
// (Bo qua phn m designer.)
private void DynamicCheckBox_Load(object sender,
System.EventArgs e) {

// Tao mang.
string[] foods = {"Grain", "Bread", "Beans", "Eggs",
"Chicken", "Milk", "Fruit", "Vegetables",
197
Chng 6: Oindok Poao
"Pasta", "Rice", "Fish", "Beef"};
int topPosition = 10;
foreach (string food in foods)
{
// Tao mt CheckBox mi.
CheckBox checkBox = new CheckBox();
checkBox.Left = 10;
checkBox.Top = topPosition;
topPosition += 30;
checkBox.Text = food;
// Thm CheckBox vo form.
panel.Controls.Add(checkBox);
}
}
}
2' 2' 9in " t d li u vo i u "i m 9in " t d li u vo i u "i m
#eA JwA Y@CA sjQ OIQ LK@ QVWAB D\X OIQ L@GZ s@tO JU Q>t iJ^ Q>t Y\ Lt YVZ QH? D\@
Q>TAB Q@A A\X L^ Y@CA ZcA LjA OIQ @QO J>X QHVEJk(
LVZ QH? OIQ Q>cO J>@jZ LjA LK@ QVWAB QHXAB Q>ZIJ QaA> )ag Jbc L@GZ s@tO(
"0i lp )3n ;ut tQ System.Windows.Forms.Control u cung cp thuc t2nh Tag v &*n cF
th sO )ng nF lu trK .t tha. chiIu In &t k kiu Di t$ng no. 7huc t2nh Tag
kh4ng $c iu ki. ha' &")ro8o?/ .NET Framework sO )ng . nF $c )nh l. nMi
lu trK cc th4ng tin !c the ca :ng )ng. Hgoi ra8 .t vi lp khc kh4ng )3n ;ut tQ
Control c?ng cung cp thuc t2nh Tag8 ch~ng h*n cc lp ListViewItem v TreeNode gtr%nh
&' cc it(. trong .t ListView ho!c TreeViewh. "t lp kh4ng cung cp thuc t2nh Tag l
MenuItem.
7huc t2nh Tag $c inh nghqa l .t kiu Object8 nghqa l &*n cF th sO )ng nF lu trK
&t k kiu gi tri ho!c kiu tha. chiIu no8 tQ .t sD ho!c chu#i Mn gin cho In .t Di
t$ng te' &iIn )o &*n inh nghqa. whi l' )K liu tQ thuc t2nh Tag8 &*n s@ cNn Xp gkiuh Di
t$ng thnh kiu gDc ca nF.
u2 ) sau <' th>. )anh sch cc fil( vo .t ListView. lDi t$ng FileInfo tMng :ng vi
.#i fil( $c lu trK trong thuc t2nh Tag. whi ngi )eng nh/p Gp vo .t trong cc it(.8
:ng )ng s@ l' Di t$ng FileInfo tQ thuc t2nh Tag v hin thi k2ch thc fil( trong .t
MessageBox g;(. h%nh a.]h.
using System;
using System.Windows.Forms;
198
Chng 6: Oindok Poao
using System.IO;
public class TagPropertyExample : System.Windows.Forms.Form (
// (Bo qua phn m designer.)
private void TagPropertyExample_Load(object sender,
System.EventArgs e) {

// Ly tt ca cc file trong th mc gc da C.
DirectoryInfo directory = new DirectoryInfo("C:");
FileInfo[] files = directory.GetFiles();
// Hin th tt ca cc file trong ListView.
foreach (FileInfo file in files) {

ListViewItem item = listView.Items.Add(file.Name);
item.ImageIndex = 0;
item.Tag = file;
}
}
private void listView_ItemActivate(object sender,
System.EventArgs e) {

// Ly kch thc file.
ListViewItem item = ((ListView)sender).SelectedItems[0];
FileInfo file = (FileInfo)item.Tag;
string info = file.FullName + " is " + file.Length + " bytes.";
// Hin th kch thc file.
MessageBox.Show(info, "File Information");
}
}
199
Chng 6: Oindok Poao
0nh 6'2 Lu tr d liu trong thuc tnh Tag
3'
3' + l* t t c cc i u "i m trn $orm + l* t t c cc i u "i m trn $orm
#eA JwA Q>nJ >@qA OIQ QSJ DU J>ZAB J>X QPQ JR JSJ L@GZ s@tO QHCA XHO iDa hU,
YP] >c] v^c Q>ZIJ QaA> )ext Jbc J>AB, Q>c] L@ O\Z >c] Q>c] L@ saJ> Q>VEJ Jbc
J>ABk(
DZ]qQ iLq Z]k Zc QNd >Wd JSJ L@GZ s@tO( TV[AB QSJ DE@ Ox@ L@GZ s@tO F`AB
JSJ Q>ZIJ QaA> D\ d>V[AB Q>~J Jbc YEd Control J[ f(
L*n cF th )u't 9ua cc iu ki. tr>n for. &5ng t6p h$p Form.Controls8 t6p n' ch:a tt
c cc iu ki. n5. tr=c tiIp tr>n & .!t for.. 7u' nhi>n8 nIu vi iu ki. trong sD F l
iu ki. contain(r gnh GroupBox8 Panel8 ho!c TabPageh8 chGng cF th ch:a nhiu iu ki.
nKa. Uo F8 cNn sO )ng k thu6t 9u' ki. tra t6p h$p Controls.
u2 ) sau <' tr%nh &' .t for. th=c hin k thu6t 9u' t%. .0i TextBox cF tr>n for.
v ;Fa i ton & t(;t trong F. or. s@ ki. tra .#i iu ki. ;c inh ;(. nF cF phi l
TextBox ha' kh4ng &5ng ton tO typeof.
using System;
using System.Windows.Forms;
public class ProcessAllControls : System.Windows.Forms.Form {
// (Bo qua phn m designer.)
private void cmdProcessAll_Click(object sender, System.EventArgs e) {
ProcessControls(this);
}
private void ProcessControls(Control ctrl) {
200
Chng 6: Oindok Poao

// Bo qua diu kim tru khi n l TextBox.
if (ctrl.GetType() == typeof(TextBox)) {
ctrl.Text = "";
}

// Xu l cc diu kim mt cch d quy.
// iu ny cn thit khi c mt diu kim cha nhiu
// diu kim khc (v d, khi ban su dng Panel,
// GroupBox, hoac diu kim container no khc).
foreach (Control ctrlChild in ctrl.Controls) {
ProcessControls(ctrlChild);
}
}
}
4' 4' Theo v t cc $orm "h "i n trong m t ng d ng Theo v t cc $orm "h "i n trong m t ng d ng
#eA OZKA B@? Ye@ DjQ Jbc QPQ JR XHO >@qA LcAB LVWJ >@tA Q>M( !] Y\ QHVoAB >Wd
Q>VoAB B_d s>@ FeA OZKA OIQ XHO J^ Q>t QV[AB QSJ DE@ OIQ XHO s>SJ(
TeX OIQ YEd B@? JSJ Q>cO J>@jZ LjA JSJ LK@ QVWAB "orm( LVZ QH? JSJ Q>cO J>@jZ
A\] F`AB F@jA QA>(
.NET kh4ng cung cp cch ;c inh for. no ang $c hin thi trong .t :ng )ng gngo*i
trQ :ng )ng &E<8 s@ $c .4 t trong .c a.`h. HIu .uDn ;c inh for. no ang ttn t*i8
for. no ang $c hin thi8 ho!c &*n .uDn .t for. cF th g0i cc phMng th:c v thiIt l6p
cc thuc t2nh ca .t for. khc th% &*n cNn phi giK l*i vIt ca cc Di t$ng for..
l th=c hin '>u cNu tr>n8 hS' t*o .t lp gt. cc thnh vi>n tqnhT lp n' cF th th(o vIt
cc for. ang .C &5ng .t t6p h$p8 ha' cc thuc t2nh chu'>n &it. u2 )8 lp )i <' cF
th th(o vIt hai for.\
public class OpenForms {
public static Form MainForm;
public static Form SecondaryForm;
}
whi for. ch2nh ho!c for. ph $c hin thi8 chGng s@ t= vng kB vi lp OpenForms. HMi h$p
lB !t o*n .S n' l trong phMng th:c th lB s= kin Form.Load.
private void MainForm_Load(object sender, EventArgs e) {
201
Chng 6: Oindok Poao
// ang k di tong form vua doc tao.
OpenForms.MainForm = this;
}
L*n cF th sO )ng o*n .S tMng t= g &V tha. chiIu khi for. &i Fng.
private void MainForm_Unload(object sender, EventArgs e) {
// G bo di tong form.
OpenForms.MainForm = null;
}
L<' gi8 .t for. khc cF th tMng tc vi for. n' th4ng 9ua lp OpenForms. u2 )8 )i
<' l cch for. ch2nh l. xn for. ph\
if (OpenForms.SecondaryForm != null) {
OpenForms.SecondaryForm.Hide();
}
7rong cch tiIp c6n n'8 chGng ta gi sO .0i for. $c t*o chJ .t lNn. HIu &*n cF .t :ng
)ng )=aztr>nztizliu gAo)umen/I4a8eA aKKD")a/"onh8 trong F8 ngi )eng cF th t*o nhiu
Di t$ng ca ceng .t for.8 &*n cNn th(o vIt cc for. n' &5ng .t t6p h$p. 76p h$p
ArrayList )i <' l .t v2 )\
public class OpenForms {
public static Form MainForm;
public static ArrayList DocForms = new ArrayList();
}
7h(o F8 for. cF th t= th>. vo t6p h$p khi cNn8 nh $c tr%nh &' trong o*n .S sau <'\
private void DocForm_Load(object sender, EventArgs e) {
// ang k di tong form vua doc tao.
OpenForms.DocForms.Add(this);
}
5'
5' T&m t t c cc $orm trong ng d ng 5AB T&m t t c cc $orm trong ng d ng 5AB
#eA JwA QlO QPQ JR JSJ XHO >@qA LcAB LVWJ >@tA Q>M QHXAB OIQ ~AB hUAB B@cX
h@qA Lc Q\@ Y@qZ iM%ltiple oc%ment /nterfacek(
DZ]qQ Zc JSJ XHO QHXAB QNd >Wd MdiC.ildren Jbc XHO M/ J>c(
.NET Framework cF hai +lDi t/t- thu6n l$i cho vic 9un lB cc :ng )ng &E<\ thuc t2nh
MdiChildren v MdiParent ca lp Form. L*n cF th ;Xt thuc t2nh MdiParent ca &t k for.
202
Chng 6: Oindok Poao
&E< con no t%. for. cha. L*n cF th sO )ng t6p h$p MdiChildren ca for. &E< cha
t%. tt c cc for. con.
u2 ) sau <' g;(. h%nh a.^h s@ hin thi tt c cc for. con. "#i for. con gt. .t Label
gch:a th4ng tin v ng' gih8 v .t Button. whi ngi )eng nh/p vo Button8 phMng th:c
th lB s= kin s@ )u't 9ua tt c cc for. con v hin thi )kng chK trong Label gvi thuc
t2nh chJz0ch.
Ui <' l phNn .S cho for. con\
public class MDIChild : System.Windows.Forms.Form {
private System.Windows.Forms.Button cmdShowAllWindows;
private System.Windows.Forms.Label label;
// (Bo qua phn m designer.)
public string LabelText {

get {
return label.Text;
}
}
private void cmdShowAllWindows_Click(object sender,
System.EventArgs e) {
// Duyt qua tp hop cc form con.
foreach (Form frm in this.MdiParent.MdiChildren) {

// p kiu tham chiu Form thnh MDIChild.
MDIChild child = (MDIChild)frm;
MessageBox.Show(child.LabelText, frm.Text);
}
}
private void MDIChild_Load(object sender, System.EventArgs e){
label.Text = DateTime.Now.ToString();
}
203
Chng 6: Oindok Poao
}
PhG B r5ng8 khi o*n .S )u't 9ua t6p h$p cc for. con8 nF phi chu'n gXp kiuh tha.
chiIu Form thnh MDIChild cF th sO )ng thuc t2nh LabelText.
0nh 6'3 Ly thng tin t cc form M con
6'
6' 9 u tr "7ch th c v v tr7 c a $orm 9 u tr "7ch th c v v tr7 c a $orm
#eA JwA YVZ QH? saJ> Q>VEJ D\ DM QHa Jbc OIQ XHO iJ^ Q>t Q>c] L@ saJ> Q>VEJ
LVWJk D\ d>UJ >@ A^ Ye@ QHXAB YwA >@tA Q>M XHO sj Q@jd(
LVZ QH? JSJ Q>ZIJ QaA> +e*t, )op, idt., D\ Heig.t Jbc XHO QHXAB *in&ows
>egistr:(
@"nAow8 =eg"8/ry l nMi lB tCng lu trK th4ng tin v vi tr2 v k2ch thc cho for.. P th8
&*n s@ lu trK th4ng tin v .#i for. trong .t khFa c l6p gcF th sO )ng t>n ca for. l.
khFah. Pc khFa n' s@ $c lu trK nga' )i khFa :ng )ng.
L*n cNn t*o .t lp chu'>n &it lu v l' cc thiIt l6p cho for.. yp FormSettingStore
$c tr%nh &' )i <' cung cp hai phMng th:c\ SaveSettingsEnh6n vo .t for. v ghi
th4ng tin v k2ch thc v vi tr2 ca nF vo =eg"8/ryT v ApplySettingsEnh6n vo .t for.
v p )ng cc thiIt l6p tQ =eg"8/ry. lng )3n ca khFa v t>n ca khFa con $c lu trK
thnh cc &iIn thnh vi>n lp.
using System;
using System.Windows.Forms;
using Microsoft.Win32;
public class FormSettingStore {
private string regPath;
private string formName;
private RegistryKey key;
204
Chng 6: Oindok Poao
public string RegistryPath {
get {return regPath;)
}
public string FormName {
get {return formName;}
}
public FormSettingStore(string registryPath, string formName) {

this.regPath = registryPath;
this.formName = formName;
// Tao kha nu n cha tn tai.
key = Registry.LocalMachine.CreateSubKey(
registryPath + formName);
}
public void SaveSettings(System.Windows.Forms.Form form) {

key.SetValue("Height", form.Height);
key.SetValue("Width", form.Width);
key.SetValue("Left", form.Left);
key.SetValue("Top", form.Top);
}
public void ApplySettings(System.Windows.Forms.Form form) {

form.Height = (int)key.GetValue("Height", form.Height);
form.Width = (int)key.GetValue("Width", form.Width);
form.Left = (int)key.GetValue("Left", form.Left);
form.Top = (int)key.GetValue("Top", form.Top);
}
}
205
Chng 6: Oindok Poao
l sO )ng lp FormSettingStore8 &*n chJ cNn th>. o*n .S th lB s= kin )i <' vo &t
k for. no. lo*n .S n' s@ lu cc thuc t2nh ca for. khi for. Fng v phc hti chGng
khi for. $c n*p.
private FormSettingStore formSettings;
private void Form1_Load(object sender, System.EventArgs e) {
formSettings = new FormSettingStore(@"SoftwareMyApp", this.Name);
formSettings.ApplySettings(this);
}
private void Form1_Closed(object sender, System.EventArgs e) {
formSettings.SaveSettings(this);
}
N>E H`AB, D@qJ QHZ] vZPQ >egistr: J^ Q>t FM B@E@ >eA JA J~ D\X Q\@ s>XRA ABVo@
hrAB >@qA >\A> D\ J>aA> fSJ> FRX ONQ QHZ] vZPQ O} YqA> iCo&e ;ccess Sec%rit:
,olic:k( 3>@ FeA QeX OIQ ~AB hUAB ]CZ JwZ QHZ] vZPQ >egistr:, cffOFY] fm ]CZ
JwZ QHZ] vZPQ >egistr: F`AB ]CZ JwZ Z]GA QK@ Q>@tZ iminim%m permission
reE%estfm LVWJ OT QR QHXAB OUJ -(k(
7' 7' <u c <u c 9ist<ox 9ist<ox cu n xu ng cu n xu ng
#eA JwA JZIA OIQ +ist6ox iF`AB O} YqA>k Lt A>?AB @QO A\X L^ QHXAB hcA>
fSJ> J^ Q>t LVWJ A>lA Q>P](
T>@jQ YNd Q>ZIJ QaA> +ist6ox.)opEndex iQ>@jQ YNd @QO LVWJ A>lA Q>P] LwZ Q@CAk(
7rong vi trng h$p8 &*n cF .t ListBox lu trK .t l$ng th4ng tin ng k ho!c .t
ListBox . &*n phi th>. th4ng tin vo .t cch inh k. 7hng th% th4ng tin .i nht
g$c th>. vo cuDi )anh schh l*i l th4ng tin 9uan tr0ng hMn th4ng tin C Nu )anh sch.
"t gii php l cun ListBox cF th nh%n th' cc it(. vQa .i th>. vo.
or. )i <' ggt. .t ListBox v .t Buttonh s@ th>. ]d it(. vo )anh sch rti cun In
trang cuDi ceng &5ng thuc t2nh TopIndex g;(. h%nh a._h\
using System;
using System.Windows.Forms;
public class ListBoxScrollTest : System.Windows.Forms.Form {
// (Bo qua phn m designer.)
206
Chng 6: Oindok Poao
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;
}
}
0nh 6'4 Cun ListBox dn trang cui cng
8'
8' Ch cho %h:% nh % s vo ! Ch cho %h:% nh % s vo ! Text<ox Text<ox
#eA JwA QeX OIQ )ext6ox fcX J>X )ext6ox A\] F Zc QPQ JR JSJ J A>PA d>aO
s>TAB d>R@ fK(
T>CO d>V[AB Q>~J Q>U Y fn s@qA )ext6ox.;e!/ress( THXAB d>V[AB Q>~J A\],
Q>@jQ YNd Q>ZIJ QaA> ;e!/ress0vent#rgs.Handled Y\ true Lt F Zc J A>PA d>aO
s>TAB >Wd Yq(
Pch tDt nht hiu chJnh Nu vo &t h$p l l kh4ng cho nF $c nh6p nga' tQ Nu. liu
n' )r )ng hin th=c vi TextBox v% nF cung cp s= kin KeyPress8 s= kin n' ;' ra sau
khi cG nhn ph2. $c tiIp nh6n nhng trc khi nF $c hin thi. L*n cF th sO )ng th4ng
207
Chng 6: Oindok Poao
sD s= kin KeyPressEventArgs h' &V cG nhn ph2. kh4ng h$p l &5ng cch !t thuc t2nh
Handled l true.
l Nu vo chJ l sD8 &*n cNn cho phXp .t cG nhn ph2. chJ khi nF tMng :ng vi .t sD gd
In ch ho!c .t ph2. iu khin !c &it gnh ph2. )(l(t( ho!c .?i t>nh. wB t= vQa nhn
$c cp cho s= kin KeyPress th4ng 9ua thuc t2nh KeyPressEventArgs.KeyChar. L*n cF th
sO )ng hai phMng th:c tqnh ca lp System.Char l IsDigit v IsControl ki. tra nhanh
kB t=.
Ui <' l phMng th:c th lB s= kin . &*n s@ sO )ng ngvn Nu vo kh4ng phi sD\
private void textBox1_KeyPress(object sender,
System.Windows.Forms.KeyPressEventArgs e) {
if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar)) {
e.Handled = true;
}
}
PhG B r5ng o*n .S n' &V 9ua )u ph<n cch th6p ph<n. l cho phXp kB t= n'8 &*n cNn sOa
l*i o*n .S nh sau\
// Ly k t phn cch thp phn trn nn ny
// ("." di vi US-English).
string decimalString =
Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
char decimalChar = Convert.ToChar(decimalString);
if (Char.IsDigit(e.KeyChar) || Char.IsControl(e.KeyChar)) {}
else if (e.KeyChar == decimalString &&
textBox1.Text.IndexOf(decimalString) == -1) {}
else {
e.Handled = true;
}
lo*n .S n' chJ cho phXp .t )u ph<n cch th6p ph<n8 nhng nF kh4ng gii h*n sD chK sD
cF th $c )eng. HF c?ng kh4ng cho phXp nh6p sD <. g&*n cF th tha' si iu n' &5ng
cch cho phXp )u trQ +z- l kB t= Nu ti>nh. Hh r5ng8 o*n .S n' c?ng gi inh &*n S
nh6p kh4ng gian t>n System.Threading.
9'
9' 0 d ng 0 d ng Com!o<ox Com!o<ox c' t7nh n4ng auto-com%lete c' t7nh n4ng auto-com%lete
#eA JwA QeX OIQ Combo6ox Qn LIAB >X\A QPQ A>?AB Bl ABVo@ hrAB B| D\X hnc QHCA
hcA> fSJ> JSJ @QO Jbc A^(
208
Chng 6: Oindok Poao
#eA J^ Q>t >@qA Q>nJ OIQ Combo6ox J^ QaA> AAB cZQX6JXOdYQ F`AB JSJ> QeX OIQ
L@GZ s@tO Qr] F@jA J>d L d>V[AB Q>~J (n;e!/ress D\ (n)extC.anged(
PF nhiu &iIn th khc nhau Di vi iu ki. cF t2nh nvng autozco.pl(t(. l4i lGc8 iu ki.
lp N' cc gi tri )=a tr>n )anh sch cc phNn vQa ch0n gnh &")ro8o?/ E2)eD thng l. khi
&*n nh6p gi tri cho c(llh ho!c ;s ;uDng .t )anh sch cc gi tri gNn giDng gnh &")ro8o?/
<n/erne/ E2KDorer thng l. khi &*n g} Q=Lh. L*n cF th t*o .t ComboBox cF t2nh nvng
autozco.pl(t( &5ng cch th lB s= kin KeyPress v TextChanged8 ho!c &5ng cch t*o .t lp
te' &iIn )3n ;ut tQ ComboBox v chXp 1 phMng th:c OnKeyPress v OnTextChanged.
7rong phMng th:c OnKeyPress8 ComboBox ;c inh cF th=c hin .t tha' thI autozco.pl(t(
ha' kh4ng. HIu ngi )eng nhn .t ph2. kB t= g.t .3u t= ch~ng h*nh th% vic tha' thI cF
th $c th=c hin8 nhng nIu ngi )eng nhn .t ph2. iu khin gph2. &ackspac( ho!c
ph2. .?i t>n ch~ng h*nh th% kh4ng th=c hin g% c. RhMng th:c OnTextChanged th=c hin
vic tha' thI sau khi vic ;O lB ph2. hon tt. RhMng th:c n' t%. it(. treng khp Nu ti>n
Di vi phNn t(;t hin thi8 rti th>. vo phNn ckn l*i ca t(;t treng khp. |au khi t(;t $c
th>. vo8 ComboBox s@ ch0n g&4i (nh cc kB t= giKa i. ch1n hin t*i v i. cuDi ca t(;t.
uic n' cho phXp ngi )eng tiIp tc g} v tha' thI autozco.pl(t( nIu nF kh4ng phi l
nhKng g% ngi )eng .uDn.
Ui <' l phNn .S cho lp AutoCompleteComboBox\
using System;
using System.Windows.Forms;
public class AutoCompleteComboBox : ComboBox {
// Bin c dung khi mt phm dac bit doc nhn
// (trong trng hop ny, thao tc thay th text s b bo qua).
private bool controlKey = false;
// Xc dnh xem phm dac bit c doc nhn hay khng.
protected override void OnKeyPress(
System.Windows.Forms.KeyPressEventArgs e) {
base.OnKeyPress(e);
if (e.KeyChar == (int)Keys.Escape) {

// Xa text.
this.SelectedIndex = -1;
this.Text = "";
controlKey = true;
209
Chng 6: Oindok Poao
}
else if (Char.IsControl(e.KeyChar)) {

controlKey = true;
}
else {

controlKey = false;
}
}
// Thc hin thay th text.
protected override void OnTextChanged(System.EventArgs e) {

base.OnTextChanged(e);
if (this.Text != "" && !controlKey) {

// Tm kim item trung khp.
string matchText = this.Text;
int match = this.FindString(matchText);
// Nu tm thy th chn n vo.
if (match != -1) {

this.SelectedIndex = match;
// Chon (bi den) phn text vua thm vo d
// n c th doc thay th nu ngi dung kip tc g.
this.SelectionStart = matchText.Length;
this.SelectionLength =
this.Text.Length - this.SelectionStart;
}
}
}
}
l thO nghi. AutoCompleteComboBox8 &*n cF th t*o .t cli(nt Mn gin\ th>. ComboBox vo
for. v th>. .t sD tQ gor)h vo ComboBox. 7rong v2 ) n'8 cc tQ $c l' tQ .t fil( t(;t
v ComboBox $c th>. vo for. &5ng .S lnh. L*n c?ng cF th &i>n )ich lp
210
Chng 6: Oindok Poao
AutoCompleteComboBox thnh .t CDa88 L"4rary >88em4Dy c l6p rti th>. nF vo hp c4ng
c8 thI l &*n cF th th>. nF vo for. lGc thiIt kI.
using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
public class AutoCompleteComboBoxTest : System.Windows.Forms.Form {
// (Bo qua phn m designer.)
private void AutoCompleteComboBox_Load(object sender,
System.EventArgs e) {

// Thm ComboBox vo form.
AutoCompleteComboBox combo = new AutoCompleteComboBox();
combo.Location = new Point(10,10);
this.Controls.Add(combo);
// Thm mt s tu (tu mt file text) vo ComboBox.
FileStream fs = new FileStream("words.txt", FileMode.Open);
using (StreamReader r = new StreamReader(fs)) {
while (r.Peek() -1) {

string word = r.ReadLine();
combo.Items.Add(word);
}
}
}
}
211
Chng 6: Oindok Poao
0nh 6'5 ComboBox c tnh nng auto-complete
10'
10' 0 % x % 0 % x % 9istView 9istView theo c t ! t "C theo c t ! t "C
#eA JwA f{d vjd OIQ +ist>ie%, A>VAB d>V[AB Q>~J AI@ Qe@ +ist>ie%.$ort J> f{d
vjd JA J~ QHCA JIQ LwZ Q@CA(
TeX OIQ >@qA Q>nJ J>X B@cX h@qA $!stem.Collections.EComparer Lt J^ Q>t f{d vjd
JSJ LK@ QVWAB +ist>ie%Etem is@tZ EComparer J^ Q>t f{d vjd hnc QHCA FPQ s Q@CZ
J>ZA A\X FeA OZKAk( T>@jQ YNd Q>ZIJ QaA> +ist>ie%.+ist>ie%Etem$orter DE@ OIQ
LK@ QVWAB Jbc s@tZ EComparer QHVEJ s>@ B@ d>V[AB Q>~J +ist>ie%.$ort(
ListView cung cp phMng th:c Sort s/p cc it(. th(o th: t= alpha&(t )=a tr>n phNn t(;t
trong ct Nu ti>n. HIu .uDn s/p ;Ip )=a tr>n cc gi tri ct khc ho!c s/p th: t= cc it(.
th(o &t k cch no khc8 &*n cNn t*o .t hin th=c te' &iIn ca giao )in IComparer.
piao )in IComparer inh nghqa .t phMng th:c cF t>n l Compare8 phMng th:c n' nh6n
vo hai Di t$ng v ;c inh Di t$ng no s@ $c s/p trc. yp te' &iIn
ListViewItemComparer )i <' hin th=c giao )in IComparer v cp th>. hai thuc t2nh\
Column v Numeric. 7rong F8 Column cho &iIt ct no s@ $c sO )ng s/p ;IpT v Numeric
l .t c Boolean8 $c thiIt l6p l true nIu .uDn th=c hin vic so snh th(o th: t= sD tha'
v% so snh th(o th: t= alpha&(t.
using System;
using System.Collections;
using System.Windows.Forms;
public class ListViewItemComparer : IComparer {
private int column;
private bool numeric = false;
public int Column {

get {return column;}
set {column = value;}
}

public bool Numeric {

get {return numeric;}
set {numeric = value;}
}
212
Chng 6: Oindok Poao

public ListViewItemComparer(int columnIndex) {

Column = columnIndex;
}
public int Compare(object x, object y) {

ListViewItem listX = (ListViewItem)x;
ListViewItem listY = (ListViewItem)y;
if (Numeric) {

// Chuyn text thnh s trc khi so snh.
// Nu chuyn di tht bai, su dng gi tr 0.
decimal listXVal, listYVal;
try {
listXVal = Decimal.Parse(listX.SubItems[Column].Text);
}
catch {
listXVal = 0;
}
try {
listYVal = Decimal.Parse(listY.SubItems[Column].Text);
}
catch {
listYVal = 0;
}
return Decimal.Compare(listXVal, listYVal);
}
else {

// Gi nguyn text o dnh dang chui
// v thc hin so snh theo th t alphabetic.
213
Chng 6: Oindok Poao
string listXText = listX.SubItems[Column].Text;
string listYText = listY.SubItems[Column].Text;
return String.Compare(listXText, listYText);
}
}
}
L<' gi8 s/p ;Ip ListView8 &*n cNn t*o .t Di t$ng ListViewItemComparer8 cu h%nh cho
nF .t cch h$p lB8 v rti thiIt l6p nF vo thuc t2nh ListView.ListViewItemSorter trc khi
g0i phMng th:c ListView.Sort.
or. )i <' tr%nh &' .t thO nghi. Mn gin cho ListViewItemComparer. "#i khi ngi
)eng nh/p vo h(a)(r ca .t ct trong ListView th% ListViewItemComparer s@ $c t*o ra
v $c sO )ng s/p ;Ip )anh sch )=a tr>n ct F.
using System;
using System.Windows.Forms;
public class ListViewItemSort : System.Windows.Forms.Form {
// (Bo qua phn m designer.)
private void ListView1_ColumnClick(object sender,
System.Windows.Forms.ColumnClickEventArgs e) {

ListViewItemComparer sorter = new ListViewItemComparer(e.Column);
ListView1.ListViewItemSorter = sorter;
ListView1.Sort();
}
}
11'
11' 9in " t menu ng c nh vo i u "i m 9in " t menu ng c nh vo i u "i m
#eA JwA Y@CA sjQ OIQ OAZ AB? JRA> D\X Ox@ L@GZ s@tO QHCA XHO iJSJ OAZ A\]
s>SJ A>cZk( TZ] A>@CA, FeA s>TAB OZKA D@jQ A>@GZ d>V[AB Q>~J Q>U Y fn s@qA
H@CAB Hm Lt >@tA Q>M OAZ AB? JRA> J>X Ox@ L@GZ s@tO(
V@jQ OIQ d>V[AB Q>~J Q>U Y fn s@qA J>ZAB Lt Q>Z YP] LK@ QVWAB ContextMenu
LVWJ sjQ >Wd DE@ L@GZ s@tO, D\ H@ >@tA Q>M OAZ A\] QHCA L@GZ s@tO(
L*n cF th li>n kIt .t iu ki. vi .t .(nu ngK cnh &5ng cch thiIt l6p thuc t2nh
ContextMenu ca iu ki.. 7u' nhi>n8 <' chJ l .t thu6n l$iE hin thi .(nu ngK cnh8
&*n phi thu l' .(nu v g0i phMng th:c Show ca nF. 7h4ng thng8 &*n hin th=c logic
n' trong phMng th:c th lB s= kin MouseDown.
214
Chng 6: Oindok Poao
7h=c ra8 logic )eng hin thi .(nu ngK cnh hon ton giDng nhau8 kh4ng 9uan t<. In
iu ki. g%. "0i iu ki. u h# tr$ thuc t2nh ContextMenu g$c thQa kI tQ lp cM sC
Controlh8 nghqa l &*n cF th )r )ng viIt $c .t phMng th:c th lB s= kin chung hin
thi cc .(nu ngK cnh cho tt c cc iu ki..
u2 )8 ;Xt .t for. gt. .t Label8 .t PictureBox8 v .t TextBox. L*n cF th viIt .t
phMng th:c th lB s= kin MouseDown cho tt c cc Di t$ng n'. lo*n .S )i <' kIt nDi
tt c cc s= kin n' vo .t phMng th:c th lB s= kin t>n 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);
RhNn .S th lB s= kin hon ton $c )eng chung. HF chJ Xp kiu sender thnh Control8
ki. tra .(nu ngK cnh8 v hin thi nF.
private void Control_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e) {
if (e.Button == MouseButtons.Right) {

// Ly diu kim ngun.
Control ctrl = (Control)sender;
if (ctrl.ContextMenu != null) {

// Hin th menu ng canh.
ctrl.ContextMenu.Show(ctrl, new Point(e.X, e.Y));
}
}
}
12' 12' 0 d ng m t %h n menu ch7nh cho menu ng c nh 0 d ng m t %h n menu ch7nh cho menu ng c nh
#eA JwA QeX OIQ OAZ AB? JRA> >@tA Q>M JSJ @QO B@KAB DE@ OIQ fK @QO QHXAB
OAZ J>aA> Jbc ~AB hUAB(
Sg hUAB d>V[AB Q>~J CloneMenu Jbc YEd MenuEtem Lt fcX Ye@ OIQ d>wA Jbc OAZ
J>aA>(
215
Chng 6: Oindok Poao
7rong nhiu :ng )ng8 .(nu ngK cnh ca .t iu ki. sao l*i .t phNn ca .(nu ch2nh.
7u' nhi>n8 .NET kh4ng cho phXp &*n t*o .t Di t$ng MenuItem ceng lGc n5. trong nhiu
.(nu.
pii php l t*o &n sao ca .t phNn .(nu ch2nh &5ng phMng th:c CloneMenu. RhMng th:c
n' kh4ng chJ chXp cc it(. MenuItem gv cc su&.(nuh8 . ckn vng kB .#i Di t$ng
MenuItem vi ceng phMng th:c th lB s= kin. Uo F8 khi ngi )eng nh/p vo .t it(.
trong .(nu ngK cnh g&n saoh8 phMng th:c th lB s= kin tMng :ng s@ $c th=c thi nh
th ngi )eng nh/p vo it(. F trong .(nu ch2nh.
u2 )8 ;Xt :ng )ng thO nghi. trong h%nh a.a. 7rong v2 ) n'8 .(nu ngK cnh cho TextBox
hin thi cc it(. giDng nh trong .(nu F"De. l<' ch2nh l &n sao ca cc Di t$ng
MenuItem8 nhng khi ngi )eng nh/p vo .t it(.8 phMng th:c th lB s= kin tMng :ng s@
$c th=c thi.
0nh 6'6 Chp mt phn menu chnh vo menu ng cnh
Ui <' l phNn .S cho for. t*o v2 ) n'. HF s@ sao l*i cc it(. trong .(nu ch2nh khi
for. $c n*p gng tiIc l kh4ng th thao tc vi cc it(. &n sao lGc thiIt kIh.
using System;
using System.Windows.Forms;
using System.Drawing;
public class ContextMenuCopy : System.Windows.Forms.Form {
// (Bo qua phn m designer.)
private void ContextMenuCopy_Load(object sender,
System.EventArgs e) {

ContextMenu mnuContext = new ContextMenu();
216
Chng 6: Oindok Poao
// Chp cc item tu menu File vo menu ng canh.
foreach (MenuItem mnuItem in mnuFile.MenuItems) {
mnuContext.MenuItems.Add(mnuItem.CloneMenu());
}
// Gn menu ng canh vo TextBox.
TextBox1.ContextMenu = mnuContext;
}
private void TextBox1_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e) {

if (e.Button == MouseButtons.Right){
TextBox1.ContextMenu.Show(TextBox1, new Point(e.X, e.Y));
}
}
private void mnuOpen_Click(object sender, System.EventArgs e) {

MessageBox.Show("This is the event handler for Open.");
}
private void mnuSave_Click(object sender, System.EventArgs e) {

MessageBox.Show("This is the event handler for Save.");
}
private void mnuClick_Click(object sender, System.EventArgs e) {

MessageBox.Show("This is the event handler for Exit.");
}
}
217
Chng 6: Oindok Poao
13'
13' T o $orm a ng,n ng T o $orm a ng,n ng
#eA JwA QeX OIQ XHO J^ Q>t FRA LMc >^c ilocaliBa9le formk AB>c Y\ XHO A\] J^
Q>t LVWJ QH@tA s>c@ A>@GZ ABTA AB? s>SJ A>cZ(
LVZ QH? QPQ JR JSJ Q>TAB Q@A FRA LMc L_J Q>r QHXAB JSJ @Y HfXZHJ iJSJ @Y A\]
fm LVWJ F@CA hMJ> Q>\A> Satellite ;ssem9l:k(
.NET Framework h# tr$ s= &n ia hFa gDo)aD"Oa/"onh th4ng 9ua vic sO )ng fil( r(sourc(.
tCng cM &n l lu trK cc th4ng tin &n ia !c the gch~ng h*n8 phNn t(;t ca .t Buttonh
trong .t fil( r(sourc(. |au F8 &*n cF th t*o nhiu fil( r(sourc( cho nhiu &n ia khc nhau
rti &i>n )ich chGng thnh *a/eDD"/e >88em4Dy. whi ch*' :ng )ng8 .NET s@ t= ng sO )ng
Gng *a/eDD"/e >88em4Dy )=a tr>n cc thiIt l6p &n ia gDo)aDe 8e//"ngh ca .' t2nh hin hnh.
L*n cF th 0c v ghi cc fil( r(sourc( &5ng .S lnh. 7u' nhi>n8 V"8uaD */uA"o .NET c?ng h#
tr$ vic thiIt kI cc for. $c &n ia hFa\
Z. 7rc ti>n8 thiIt l6p thuc t2nh Localizable ca for. l true trong cOa ss ProKer/"e8.
]. 7hiIt l6p thuc t2nh Language ca for. l &n ia &*n .uDn nh6p th4ng tin cho nF g;(.
h%nh a.[h. wI F8 cu h%nh cc thuc t2nh cF th &n ia hFa ca tt c cc iu ki.
tr>n for.. 7ha' v% lu trK nhKng tha' si n' trong phNn .S thiIt kI for.8 V"8uaD
*/uA"o .NET t*o .t fil( r(sourc( .i lu trK )K liu ca &*n.
^. y!p l*i &c ] cho .#i ng4n ngK &*n .uDn h# tr$. "#i lNn nh thI8 .t fil( r(sourc(
.i s@ $c t*o ra. HIu &*n tha' si thuc t2nh Language thnh &n ia . &*n S cu
h%nh th% cc thiIt l6p trc F s@ ;ut hin trC l*i8 v &*n cF th chJnh sOa chGng.
0nh 6'7 Chn mt ngn ng d bn dja ha form
218
Chng 6: Oindok Poao
L<' gi8 &*n cF th &i>n )ich v thO nghi. :ng )ng tr>n cc h thDng &n ia khc nhau.
V"8uaD */uA"o .NET s@ t*o .t th .c v .t *a/eDD"/e >88em4Dy ri>ng &it Di vi .#i fil(
r(sourc( trong )= n. L*n cF th ch0n ProJe)/ *how >DD F"De8 tQ thanh tr%nh Mn ca V"8uaD
*/uA"o .NET ;(. cc fil( n' $c &D tr2 nh thI no g;(. h%nh a.bh.
L*n c?ng cF th &uc :ng )ng chp nh6n .t &n ia c th &5ng cch tha' si thuc t2nh
Thread.CurrentUICulture. 7u' nhi>n8 &*n phi tha' si thuc t2nh n' trc khi for. $c
n*p.
0nh 6'8 Satellite assembly cho bn dja Vietnamese
using System;
using System.Windows.Forms;
using System.Threading;
using System.Globalization;
public class MultiLingualForm : System.Windows.Forms.Form {
private System.Windows.Forms.Label label1;
// (Bo qua phn m designer.)
static void Main() {
219
Chng 6: Oindok Poao
Thread.CurrentThread.CurrentUICulture = new CultureInfo("vi");
Application.Run(new MultiLingualForm());
}
}
#eA JAB J^ Q>t fg hUAB Q@qA aJ> *in>es.e8e iA`O QHXAB Q>V OUJ 2,rogram
Files2Microsoft $is%al St%&io .NET '(()2S!2"#.#25ink Lt fXeA Q>RX Q>TAB Q@A
HfXZHJ( N^ JZAB JPd QHlA> fXeA Q>RX XHO Q>Z A> A>VAB s>TAB J^ J>~J AAB
J>A> fgc O} ABZA, HPQ >?Z hUAB J>X JSJ A>\ d>@CA hMJ> D\ JSJ J>Z]CA B@c d>@
YNd QHlA> JwA A>Nd JSJ Q>TAB Q@A FRA LMc L_J Q>r(
0nh 6'9 Tin ch Windows esource Localization Editor
NBX\@ Q@qA aJ> QHCA, FeA JAB J^ Q>t fg hUAB JSJ J>V[AB QHlA> J>Z]CA hrAB FRA
LMc >^c JSJ ~AB hUAB, J>AB >eA >C?*inTrans iFeA J^ Q>t QR@ FRA hrAB Q>g Qe@
[http://www.schaudin.com]k( C>V[AB QHlA> A\] J>X d>d FeA d>SQ QH@tA JSJ hn
SA d>wA OGO Lc ABTA AB? >c] FRA LMc >^c JSJ ~AB hUAB J^ fA QHCA AGA *in)',
(NET, D\ Da"a(
14'
14' T o $orm "h,ng th di chuy n c T o $orm "h,ng th di chuy n c
#eA OZKA QeX OIQ XHO J>@jO B@? OIQ DM QHa JK LMA> QHCA O\A >lA> D\ s>TAB Q>t
h@ J>Z]tA LVWJ(
TeX OIQ XHO s>TAB LVoAB D@GA F`AB JSJ> Q>@jQ YNd Q>ZIJ QaA> "orm6order$t!le
Jbc XHO Y\ =one(
L*n cF th t*o .t for. kh4ng ng vin &5ng cch thiIt l6p thuc t2nh FormBorderStyle l
None. Pc for. n' kh4ng th )i chu'n $c. u chGng c?ng kh4ng cF kiu ng vinE
nIu .uDn cF ng vin ;anh8 &*n phi t= th>. vo &5ng cch viIt .S ho!c sO )ng h%nh
nn.
220
Chng 6: Oindok Poao
Pkn .t cch khc t*o for. kh4ng th )i chu'n $c v cF kiu ng vin giDng iu
ki.. 7rc ti>n8 thiIt l6p cc thuc t2nh ControlBox8 MinimizeBox8 v MaximizeBox ca for.
l false. wI tiIp8 thiIt l6p thuc t2nh Text l chu#i r#ng. whi F8 for. s@ cF ng vin nsi
.u ;. ho!c ng kj .u (n gte' thuc vo te' ch0n FormBorderStyle . &*n sO )ngh8
tMng t= nh Button.
15'
15' 9m cho $orm "h,ng ng vi n c' th di chuy n c 9m cho $orm "h,ng ng vi n c' th di chuy n c
#eA OZKA QeX OIQ XHO s>TAB J^ LVoAB D@GA A>VAB DpA J^ Q>t h@ J>Z]tA LVWJ(
!@GZ A\] J^ Q>t B_d QHXAB QHVoAB >Wd FeA JwA QeX OIQ Jgc f Qr] F@jA J^ >lA>
hSAB LIJ A>PQ DT A>M iDa hU, JSJ ~AB hUAB BcO >X_J Oh@c dYc]Hk(
TeX OIQ L@GZ s@tO LSd ~AB J>X JSJ fn s@qA Mouse-o%n, MouseUp, D\ MouseMove D\
D@jQ O} Lt h@ J>Z]tA XHO(
Hgi )eng thng sO )ng thanh ti>u )i chu'n for.. 7u' nhi>n8 for. kh4ng cF
ng vin c?ng kh4ng cF thanh ti>u . L*n cF th &e vo thiIu ht n' &5ng cch th>. .t
iu ki. vo for. phc v ceng .c 2ch. u2 )8 for. trong h%nh a.Zd ch:a .t Label
h# tr$ vic kXo r>. Hgi )eng cF th nh/p vo Label n'8 v rti kXo r> for. In .t vi tr2
khc tr>n .n h%nh trong lGc giK chut. whi ngi )eng )i chu'n chut8 for. t= ng $c
)i chu'n tMng :ng gfor. $c +g/n- vi con trV chuth.
0nh 6'10 orm khng c dng vin nhng vn c th di chuyn doc
l hin th=c gii php n'8 &*n cNn th=c hin cc &c sau\
Z. 7*o .t &iIn c .:czfor. )eng th(o vIt for. gfor. hin cF $c kXo r> ha'
kh4ngh.
]. whi ngi )eng nh/p vo Label8 c s@ $c thiIt l6p cho &iIt for. ang C chI
kXo r>. Peng lGc n'8 vi tr2 hin thi ca chut $c ghi l*i. L*n cNn th>. logic n'
vo phMng th:c th lB s= kin Label.MouseDown.
^. whi ngi )eng )i chu'n chut tr>n Label8 for. $c )i chu'n tMng :ng vi tr2
ca chut tr>n Label v3n kh4ng tha' si. L*n cNn th>. logic n' vo phMng th:c th
lB s= kin Label.MouseMove.
_. whi ngi )eng th chut8 chI kXo r> $c chu'n thnh off. L*n cNn th>. logic
n' vo phMng th:c th lB s= kin Label.MouseUp.
Ui <' l phNn .S hon chJnh cho for.\
221
Chng 6: Oindok Poao
using System;
using System.Windows.Forms;
using System.Drawing;
public class DragForm : System.Windows.Forms.Form {
// (Bo qua phn m designer.)
// Bin c dung d theo vt form.
// Nu dang o ch d ko r, vic di chuyn chut
// trn Label s doc chuyn thnh vic di chuyn form.
private bool dragging;
// Lu tr offset (v tr doc nhp vo trn Label).
private Point pointClicked;
private void lblDrag_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e) {

if (e.Button == MouseButtons.Left) {

dragging = true;
pointClicked = new Point(e.X, e.Y);
}
else {

dragging = false;
}
}
private void lblDrag_MouseMove(object sender,
System.Windows.Forms.MouseEventArgs e) {

if (dragging) {

Point pointMoveTo;
// Tm v tr hin tai cua chut trong toa d mn hnh.
pointMoveTo = this.PointToScreen(new Point(e.X, e.Y));
222
Chng 6: Oindok Poao
pointMoveTo.Offset(-pointClicked.X, -pointClicked.Y);
// Di chuyn form.
this.Location = pointMoveTo;
}
}
private void lblDrag_MouseUp(object sender,
System.Windows.Forms.MouseEventArgs e) {

dragging = false;
}
private void cmdClose_Click(object sender, System.EventArgs e) {

this.Close();
}
}
16' 16' T o m t icon ng trong "hay h th ng T o m t icon ng trong "hay h th ng
#eA JwA QeX OIQ @JXA LIAB QHXAB s>c] >q Q>KAB iJ>AB >eA, J>X F@jQ QlA> QHeAB
Jbc OIQ QSJ DU LcAB J>e]k(
TeX D\ >@tA Q>M =oti*!Econ( Sg hUAB OIQ )imer, )imer A\] fm d>SQ f@A> OIQ JSJ>
LMA> s iOx@ B@] J>AB >eAk D\ JNd A>NQ Q>ZIJ QaA> =oti*!Econ.Econ(
ui .NET Framework th% rt )r )ng hin thi .t icon trong kha' h thDng &5ng
NotifyIcon. L*n chJ cNn th>. iu ki. n' vo for.8 cung cp h%nh icon &5ng thuc t2nh
Icon. L*n c?ng cF th th>. .t .(nu ngK cnh vo iu ki. n' &5ng thuc t2nh
ContextMenu gte' ch0nh. wh4ng giDng vi cc iu ki. khc8 NotifyIcon s@ t= ng hin thi
.(nu ngK cnh khi nF $c nh/p phi.
L*n cF th l. ng icon trong kha' h thDng &5ng cch tha' si icon inh k. u2 )8 chMng
tr%nh sau sO )ng t. icon8 th hin h%nh .!t trvng tQ khu'It In N'. L5ng cch )ich chu'n
tQ h%nh n' sang h%nh khc8 o gic v h%nh ng s@ $c t*o ra.
using System;
using System.Windows.Forms;
using System.Drawing;
223
Chng 6: Oindok Poao
public class AnimatedSystemTrayIcon : System.Windows.Forms.Form {
// (Bo qua phn m designer.)
Icon[] images;
int offset = 0;
private void Form1_Load(object sender, System.EventArgs e) {

// Nap 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("moon0.ico");
images[] = new Icon("moon08.ico");
}
private void timer_Elapsed(object sender,
System.Timers.ElapsedEventArgs e) {

// Thay di icon.
// Phng thc th l s kin ny pht sinh mi giy mt ln.
notifyIcon.Icon = images[offset];
offset++;
if (offset ) offset = 0;
}
}
17'
17' +c nh n t7nh h % l c a u vo cho m t i u "i m +c nh n t7nh h % l c a u vo cho m t i u "i m
#eA JwA JRA> FSX J>X ABVo@ hrAB s>@ J^ h? Y@qZ s>TAB >Wd Yq LVWJ A>Nd D\X
OIQ L@GZ s@tO iA>V )ext6oxk(
Sg hUAB 0rror/rovider Lt >@tA Q>M @JXA Yx@ sj FCA L@GZ s@tO J^ Yx@( 3@tO QHc Yx@
QHVEJ s>@ J>X d>d ABVo@ hrAB Q@jd QUJ(
224
Chng 6: Oindok Poao
PF .t sD cch &*n cF th th=c hin vic ;c nh6n t2nh h$p l trong .t :ng )ng )=az
tr>nz@"nAow8. "t cch tiIp c6n l p :ng cc s= kin iu khin vic ;c nh6n t2nh h$p l
v kh4ng cho ngi )eng tha' si focus tQ iu ki. n' sang iu ki. khc nIu l#i ;' ra.
"t cch tiIp c6n khc l )=ng c cho iu ki. cF l#i th(o .t cch no F ngi )eng
cF th nh%n th' tt c l#i .t l$t. L*n cF th sO )ng cch tiIp c6n n' trong .NET vi iu
ki. ErrorProvider.
ErrorProvider l .t iu ki. provi)(r !c &it8 $c sO )ng hin thi icon l#i kI &>n
iu ki. cF l#i. L*n cF th hin thi icon l#i kI &>n .t iu ki. &5ng cch sO )ng phMng
th:c ErrorProvider.SetError8 v chJ inh iu ki. th2ch h$p v .t chu#i th4ng &o l#i.
ErrorProvider s@ hin thi icon l#i .t cch t= ng C &>n phi iu ki.. whi ngi )eng
a chut l>n icon l#i8 s@ ;ut hin th4ng &o chi tiIt g;(. h%nh a.ZZh.
PhJ cNn th>. ErrorProvider vo for.8 &*n cF th sO )ng nF hin thi icon l#i kI &>n .t
iu ki. &t k. l th>. ErrorProvider8 &*n cF th kXo nF vo kha' thnh phNn
g)omKonen/ /rayh ho!c t*o nF &5ng .S. lo*n .S )i <' ki. tra ni )ung ca TextBox .#i
khi .t ph2. $c nhn8 ;c nh6n t2nh h$p l ca TextBox n' &5ng .t &iu th:c ch2nh 9u'
gki. tra ni )ung trong TextBox cF tMng :ng vi .t ia chJ (z.ail h$p l ha' kh4ngh. HIu
ni )ung n' kh4ng h$p l8 ErrorProvider $c sO )ng hin thi th4ng &o l#i. HIu ni
)ung n' h$p l8 th4ng &o l#i hin cF trong ErrorProvider s@ &i ;Fa. PuDi ceng8 phMng
th:c th lB s= kin Click cho nGt F' s@ )u't 9ua tt c cc iu ki. tr>n for. v ;c nh6n
r5ng kh4ng iu ki. no cF l#i trc khi cho phXp :ng )ng tiIp tc.
0nh 6'11 orm doc xc nhn tnh hop l vi ErrorProvider
using System;
using System.Windows.Forms;
using System.Text.RegularExpressions;
public class ErrorProviderValidation : System.Windows.Forms.Form {
// (Bo qua phn m designer.)
private void txtEmail_TextChanged(object sender,
System.EventArgs e) {

225
Chng 6: Oindok Poao
Regex regex;
regex = new Regex(@"S+@S+.S+");
Control ctrl = (Control)sender;
if (regex.IsMatch(ctrl.Text)) {
errProvider.SetError(ctrl, "");
}
else {
errProvider.SetError(ctrl,
"This is not a valid e-mail address.");
}
}
private void cmdOK_Click(object sender, System.EventArgs e) {

string errorText = "";
bool invalidInput = false;
foreach (Control ctrl in this.Controls) {

if (errProvider.GetError(ctrl) != "")
{
errorText += " " + errProvider.GetError(ctrl) + "n";
invalidInput = true;
}
}

if (invalidInput) {

MessageBox.Show(
"The form contains the following unresolved errors:nn" +
errorText, "Invalid Input", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
}
else {
this.Close();
}
226
Chng 6: Oindok Poao
}
}
18'
18' Th c hi n thao tc ":o-v-th Th c hi n thao tc ":o-v-th
#eA JwA fg hUAB QaA> AAB sX6D\6Q>R Lt QHcX L@ Q>TAB Q@A B@?c >c@ L@GZ s@tO
iJAB J^ Q>t QHXAB JSJ Jgc f >X_J JSJ ~AB hUAB s>SJ A>cZk
3>@ LIAB Q>cX QSJ sX6D\6Q>R F`AB d>V[AB Q>~J -o-rag-rop Jbc YEd Control, D\
LSd ~AB J>X fn s@qA -rag0nter D\ -rag-rop(
7hao tc kXozvzth cho phXp ngi )eng chu'n th4ng tin tQ nMi n' In nMi khc &5ng cch
nh/p vo .t it(. v r> nF In .t vi tr2 khc. 7hao tc kXozvzth gt. &a &c cM &n sau
<'\
Z. Hgi )eng nh/p vo iu ki.8 giK chut8 v &/t Nu r>. HIu iu ki. h# tr$ t2nh
nvng kXozvzth8 nF s@ thiIt l6p ri>ng .t vi th4ng tin.
]. Hgi )eng r> chut l>n .t iu ki. khc. HIu iu ki. n' chp nh6n kiu ni
)ung $c r> In8 con trV chut s@ si thnh h%nh .?i t>n vi trang gi' . HIu
kh4ng8 con trV chut s@ si thnh h%nh trkn vi .t v*ch th~ng &>n trong .
^. whi ngi )eng th chut8 )K liu $c gOi In iu ki.8 v iu ki. n' cF th ;O
lB nF .t cch th2ch h$p.
l h# tr$ t2nh nvng kXozvzth8 &*n phi th lB cc s= kin DragEnter8 DragDrop8 v
MouseDown. u2 ) n' sO )ng hai TextBox8 <' l o*n .S g/n cc phMng th:c th lB s= kin
. chGng ta s@ sO )ng\
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);
l &/t Nu .t thao tc kXozvzth8 &*n hS' g0i phMng th:c DoDragDrop ca iu ki.
ngutn. yGc n'8 &*n cNn cung cp )K liu v chJ inh kiu ho*t ng s@ $c h# tr$ gchXp8 )i
chu'nh. u2 ) )i <' s@ khCi t*o .t thao tc kXozvzth khi ngi )eng nh/p vo .t
TextBox\
private void TextBox_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e) {
TextBox txt = (TextBox)sender;
227
Chng 6: Oindok Poao
txt.SelectAll();
txt.DoDragDrop(txt.Text, DragDropEffects.Copy);
}
l cF th nh6n )K liu $c r> In8 iu ki. phi cF thuc t2nh AllowDrop l true. liu
ki. n' s@ nh6n s= kin DragEnter khi chut r> )K liu l>n nF. yGc n'8 &*n cF th ki. tra
)K liu ang $c r> In8 9u'It inh ;(. iu ki. cF th chp nh6n vic th ha' kh4ng8 v
thiIt l6p thuc t2nh DragEventArgs.Effect tMng :ng8 nh $c tr%nh &' trong o*n .S )i
<'\
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;
}
}
Lc cuDi ceng l p :ng cho s= kin DragDrop8 s= kin n' ;' ra khi ngi )eng th
chut\
private void TextBox_DragDrop(object sender,
System.Windows.Forms.DragEventArgs e) {
TextBox txt = (TextBox)sender;
txt.Text = (string)e.Data.GetData(DataFormats.Text);
}
|O )ng cc o*n .S tr>n8 &*n cF th t*o .t :ng )ng thO nghi. t2nh nvng kXozvzth Mn
gin g;(. h%nh a.Z]h8 cho phXp t(;t $c r> tQ TextBox n' In TextBox khc. L*n c?ng cF
th r> t(;t tQ .t :ng )ng khc v th nF vo .t trong hai TextBox n'.
0nh 6'12 Mt ng dung th nghim tnh nng ko-v-th
228
Chng 6: Oindok Poao
19'
19' 0 d ng tr gi;% c m-ng -c nh 0 d ng tr gi;% c m-ng -c nh
#eA OZKA >@tA Q>M OIQ J>b LG JU Q>t QHXAB @Y QHW B@d hnc QHCA L@GZ s@tO >@qA
LcAB LVWJ J>A(
Sg hUAB Q>\A> d>wA $!stem.indo%s."orms.Help/rovider, D\ Q>@jQ YNd JSJ Q>ZIJ
QaA> O HIAB ie8ten&er propert:k Help;e!%ord D\ Help=avigator J>X Ox@ L@GZ
s@tO(
.NET h# tr$ t2nh nvng tr$ giGp c.zngKzcnh g)on/e2/I8en8"/"Be heDKh th4ng 9ua lp
HelpProvider. yp n' l .t iu ki. .C rng !c &it. whi &*n th>. nF vo kha' thnh
phNn g)omKonen/ /rayh8 nF s@ th>. .t sD thuc t2nh vo tt c cc iu ki. tr>n for.. u2
)8 h%nh a.Z^ tr%nh &' .t for. gt. hai iu ki. v .t HelpProvider. ListBox ghin ang
$c ch0nh cF th>. cc thuc t2nh HelpKeyword8 HelpNavigator8 v HelpString g)o
HelpProvider cph.
l sO )ng tr$ giGp c.zngKzcnh vi HelpProvider8 &*n cNn th=c hin &a &c sau <'\
Z. 7hiIt l6p thuc t2nh HelpProvider.HelpNamespace l t>n ca fil( tr$ giGp gch~ng h*n8
myhelp.chmh.
]. lDi vi .#i iu ki. '>u cNu tr$ giGp c.zngKzcnh8 hS' thiIt l6p thuc t2nh .C rng
HelpNavigator l HelpNavigator.Topic.
^. lDi vi .#i iu ki. '>u cNu tr$ giGp c.zngKzcnh8 hS' thiIt l6p thuc t2nh .C rng
HelpKeyword l t>n ca ch li>n kIt vi iu ki. n' gt>n ch phi cF trong fil(
tr$ giGp v cF th $c cu h%nh trong cc c4ng c t*o fil( tr$ giGph.
0nh 6'13 Cc thuc tnh m rng do HelpProvider cp cho ListBox
HIu ngi )eng nhn ph2. F1 trong khi .t iu ki. no F ang nh6n focus8 fil( tr$ giGp
s@ $c .C .t cch t= ng v ch li>n kIt vi iu ki. n' s@ $c hin thi trong cOa
229
Chng 6: Oindok Poao
ss tr$ giGp. HIu ngi )eng nhn ph2. F1 trong khi ang C tr>n .t iu ki. kh4ng cF ch
tr$ giGp gv2 )8 GroupBox ho!c Panelh8 cc thiIt l6p tr$ giGp cho iu ki. n5. &>n trong
s@ $c sO )ng. HIu kh4ng cF iu ki. no n5. &>n trong ho!c iu ki. n5. &>n trong
kh4ng cF thiIt l6p tr$ giGp no8 cc thiIt l6p tr$ giGp cho for. s@ $c sO )ng. HIu cc thiIt
l6p tr$ giGp cho for. c?ng kh4ng cF8 HelpProvider s@ .C &t k fil( tr$ giGp no $c inh
nghqa C .:c )= n. L*n c?ng cF th sO )ng cc phMng th:c ca HelpProvider thiIt l6p
ho!c sOa si nh ;* tr$ giGp c.zngKzcnh lGc th=c thi.
20' 20' D% d ng %hong cch Windows +1 D% d ng %hong cch Windows +1
#eA OZKA JSJ L@GZ s@tO OcAB hSAB hPd >@qA Le@ Jbc *in&ows +, QHCA >q Q>KAB
*in&ows +,(
T>@jQ YNd Q>ZIJ QaA> "lat$t!le Y\ "lat$t!le.$!stem J>X QPQ JR JSJ L@GZ s@tO J^ >x
QHW Q>ZIJ QaA> A\]( THXAB (NET Framework d>@CA FRA #.(, FeA d>R@ QeX OIQ @Y
OcA@fQ( CyA QHXAB (NET Framework d>@CA FRA #.#, FeA J> JwA B@ d>V[AB
Q>~J #pplication.0nable>isual$t!les(
Rhong cch @"nAow8 :P t= ng $c p )ng cho veng nonzcli(nt ca for. gnh ng
vin8 cc nGt .ini.io( v .a;i.io(h. 7u' nhi>n8 chGng s@ kh4ng $c p )ng cho cc
iu ki. nh Button v GroupBox trQ khi &*n th=c hin th>. .t vi &c nKa.
7rc hIt8 &*n phi cu h%nh tt c cc iu ki. )*ng nGt tr>n for. gnh Button8 CheckBox8
v RadioButtonh. Pc iu ki. n' cung cp thuc t2nh FlatStyle8 . thuc t2nh n' phi
$c thiIt l6p l System.
Lc kI tiIp te' thuc vo phi>n &n .NET &*n ang sO )ng. HIu ang sO )ng .NET
Framework phi>n &n 1.18 &*n chJ cNn g0i phMng th:c Application.EnableVisualStyles
trc khi cho hin thi for.. u2 )8 &*n cF th khCi t*o :ng )ng vi phMng th:c Main nh
sau\
public static void Main() {
// Kch hoat visual styles.
Application.EnableVisualStyles();
// Hin th main form.
Application.Run(new StartForm)
}
HIu ang sO )ng .NET Framework phi>n &n 1.08 &*n kh4ng cF s= tr$ giGp ca phMng th:c
Application.EnableVisualStyles. 7u' nhi>n8 &*n v3n cF th sO )ng phong cch n' &5ng
cch t*o .t fil( .anif(st cho :ng )ng ca &*n. il( .anif(st n' gchJ l .t fil( vvn &n
th4ng thng vi ni )ung :&Lh s@ &o vi @"nAow8 :P r5ng :ng )ng ca &*n '>u cNu
phi>n &n .i ca fil( )om)/DC2.ADD gfil( n' cF tr>n tt c cc .' t2nh @"nAow8 :Ph.
@"nAow8 :P s@ 0c v p )ng cc thiIt l6p tQ fil( .anif(st .t cch t= ng8 nIu fil(
.anif(st $c !t trong th .c :ng )ng v cF t>n treng vi t>n fil( th=c thi :ng )ng ceng
230
Chng 6: Oindok Poao
phNn .C rng l .man"?e8/ gv2 )8 The>KK.e2e s@ cF fil( .anif(st l The>KK.e2e.man"?e8/E
.!c )e nF tr4ng giDng cF hai phNn .C rngh.
Ui <' l .t fil( .anif(st. L*n cF th chXp fil( n' cho cc :ng )ng ca &*nEchJ cNn
si t>n nF cho phe h$p. L*n c?ng cNn si gi tri name gin 6.h thnh t>n :ng )ng8 .!c )e
iu n' kh4ng th6t s= cNn thiIt.
xml version="1.0" encoding="UTF-8" standalone="yes"
assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"
assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name=").e#pp"
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
Rhong cch @"nAow8 :P s@ kh4ng ;ut hin trong .4i trng thiIt kI ca V"8uaD */uA"o
.NET. Uo F8 thO nghi. k thu6t n'8 &*n cNn phi ch*' :ng )ng. 7u' nhi>n8 &*n v3n cF
th l. cho .4i trng thiIt kI ca V"8uaD */uA"o .NET hin thi th(o phong cch @"nAow8 :P
&5ng cch th>. fil( AeBenB.e2e.man"?e8/ vo th .c HProgram F"De8H&")ro8o?/ V"8uaD */uA"o
.NET 200CHCommonLH<EE.
231
Chng 6: Oindok Poao

0nh 6'14 Phong cch Windows XP v phong cch kinh din
NjZ FeA Sd hUAB @Y OcA@fQ J>X OIQ ~AB hUAB LcAB J>e] QHCA d>@CA FRA
*in&ows QHVEJ *in&ows +,, A^ fm FM F Zc, D\ d>XAB JSJ> s@A> L@tA fm LVWJ fg
hUAB( Vl Y hX A\], FeA ACA Q>g AB>@qO ~AB hUAB Jbc FeA JR s>@ J^ D\ s>TAB J^
@Y OcA@fQ(
21'
21' Thay i c c a $orm Thay i c c a $orm
#eA OZKA Q>c] L@ LI LUJ Jbc XHO Lt A^ QHXAB fZKQ >[A s>@ vZPQ >@qA
T>@jQ YNd Q>ZIJ QaA> (pacit! Jbc XHO DE@ OIQ B@S QHM A`O B@?c (F D\ #((F(
7huc t2nh Opacity ca .t for. ki. sot .:c c ha' trong ca .t cOa ss. A .:c
100d8 for. ;ut hin vi tr*ng thi .!c inh8 nghqa l kh4ng cF cc veng trong suDt tr>n
for.. A .:c 0d8 for. hon ton trong suDt8 c?ng cF nghqa &*n kh4ng th tMng tc vi for.
$c nKa.
whi tha' si c ca .t for. &5ng .S lnh8 &*n phi sO )ng .t sD th=c n5. giKa 0.0
v 1.0\
private void Form1_MouseEnter(object sender, System.EventArgs e)
{
this.Opacity = 1.0;
}
private void Form1_MouseLeave(object sender, System.EventArgs e)
{
this.Opacity = 0.8;
}
232
Chng 6: Oindok Poao
HIu chJ .uDn trong suDt nhKng veng no F tr>n for.8 &*n hS' sO )ng thuc t2nh
TransparencyKey. L*n inh nghqa thuc t2nh n' l .t .u no F. HIu &t k phNn no ca
for. treng vi .u F8 nF s@ trC n>n trong suDt. n%nh a.Z` tr%nh &' .t for. vi c
U0d. PhGng ta !t .t iu ki. Panel l>n for. v thiIt l6p .u nn ca Panel l .u . ta
S inh nghqa trong thuc t2nh TransparencyKey ca for.. Hh thI8 for. s@ trong suDt tr>n
veng thuc Panel.
0nh 6'15 Mt form vi d duc 80
v mt Panel c mu nn ging vi thuc tnh TransparencyKey ca form
L*n cF th &/t g!p .t sD :ng )ng )eng h%nh &it.ap l. giao )in ngi )eng8 nht l cc
kiu .()ia pla'(r. L*n cF th t*o kiu giao )in thI n' &5ng cch t*o .t h%nh &it.ap vi
nhKng veng no F cF .u l .u . &*n .uDn trong suDt. wI tiIp8 thiIt l6p thuc t2nh
BackgroundImage ca for. l fil( &it.ap . &*n S t*o. PuDi ceng8 thiIt l6p thuc t2nh
TransparencyKey ca for. l .u . &*n .uDn trong suDt trong h%nh &it.ap.
Bitmap Img = ((Bitmap)(Bitmap.FromFile("C:Example.bmp")));
// Mu tai Pixel(10,10) doc su dng lm mu trong sut.
Img.MakeTransparent(Img.GetPixel(10, 10));
this.BackgroundImage = Img;
this.TransparencyKey = Img.GetPixel(10, 10);
L*n c?ng cF th g &V thanh ti>u ca for. &5ng cch thiIt l6p FormBorderStyle l None
g;(. .c a.Z_h. l for. cF th )i chu'n $c trong trng h$p n'8 &*n hS' p )ng .c
233
Chng 6: Oindok Poao
a.Z`. 7r>n <' l .t cch t*o for. cF h%nh )ng &t thng8 .t cch khc s@ $c tr%nh
&' trong .c b.^.
7
234
Ch01n2 _4AS5>N`T VQ ]`V ^JR/
235
236
Chng 7: -.P'NQT }~ Oz Poao
")ro8o?/ >*P.NET l .t nn )eng pht trin cc :ng )ng @e48 v nF l .t
phNn ca &")ro8o?/ .NET Framework. >*P.NET cho phXp &*n viIt )ich v @e4
:&L gs@ $c tho lu6n trong chMng Z]h v pht trin (&sit( g$c tho lu6n
trong chMng n'h. Pc trang >*P.NET sO )ng .4 h%nh iu ki. )=aztr>nzs=zkin8 khiIn
cho vic viIt .S cho chGng c?ng tMng t= nh viIt .S cho cc :ng )ng )=aztr>nz@"nAow8
th4ng thng. 7u' nhi>n8 s= tMng t= n' cF th l gi t*o. Hh hNu hIt cc nh pht trin
>*P.NET ch:ng th=c8 cc :ng )ng @e4 cF cch )irn *t ri>ng ca chGng. u2 )8 &*n s@ cNn
th=c hin th>. cc &c )u' tr% tr*ng thi8 chu'n th4ng tin giKa cc trang8 th lB nhKng s=
kin ph2a cli(nt8 th=c hin ;c th=c8 v &o . hiu nvng tDi u khi sO )ng cM sC )K liu.
PhMng n' s@ ;(. ;Xt tt c cc vn n'.
&
C>V[AB A\] fm s>TAB B@E@ Q>@qZ DG ;S,.NET( T>c] D\X L^, J>V[AB A\] fm B@d
A>?AB A>\ d>SQ QH@tA ;S,.NET QHZAB JPd B@R@ Z]jQ A>?AB DPA LG Q>VoAB B_d(
!t QlO >@tZ JA FRA DG ;S,.NET, >}] D\X QHcAB [http://www.asp.net] >X_J
Q>cO s>RX JSJ Q\@ Y@qZ s>SJ J>Z]CA DG ;S,.NET(
Pc .c trong chMng n' tr%nh &' cc vn sau <'\
Phu'n hng cc '>u cNu ca ngi )eng g.c [.Zh.
Uu' tr% tr*ng thi giKa cc '>u cNu trang g.c [.] v [.^h.
|O )ng baBa*)r"K/ ci tiIn giao )in vi cc t2nh nvng ph2a cli(nt g.c [._8 [.`8 v
[.ah.
Pho phXp ngi )eng uploa) fil( g.c [.[h.
{c th=c cli(nt th(o hai cch\ {c th=c t2ch h$p vi @"nAow8 g.c [.bh v ;c th=c
)=aztr>nzfor. g.c [.ch.
{c nh6n t2nh h$p l ca Nu vo . kh4ng sO )ng iu ki. vali)ator ca >*P.NET
g.c [.Zdh.
7*o ng iu ki. (& g.c [.ZZh8 h%nh nh g.c [.Z]h8 v iu ki. ngi )eng
g.c [.Z^h.
Pi thin hiu nvng vi outputzcaching g.c [.Z_h v )atazcaching g.c [.Z`h.
pii 9u'It th4ng &o l#i +Qna4De /o 8/ar/ Ae4ugg"ng on /he @e4 8erBer- g.c [.Zah.
7ha' si ngK cnh ti khon @"nAow8 . .t :ng )ng >*P.NET ch*' trong F g.c
[.Z[h.
PhMng n' sO )ng cc lp (& cM &n thuc kh4ng gian t>n System.Web v cc lp iu
ki. (& thuc kh4ng gian t>n System.Web.UI.WebControls. whi sO )ng cc lp trong cc
kh4ng gian t>n n'8 t>n lp N' s@ kh4ng $c chJ inh.
1' 1' Chuy n h ng ng i d(ng sang trang "hc Chuy n h ng ng i d(ng sang trang "hc
#eA JwA J>Z]tA fn Q>nJ Q>@ Q OIQ QHcAB ;S,.NET fcAB OIQ QHcAB s>SJ, >X_J
FeA OZKA J>Z]tA ABVo@ hrAB LjA OIQ f@Q >X\A QX\A s>SJ(
237
Chng 7: -.P'NQT }~ Oz Poao
Sg hUAB d>V[AB Q>~J Http&esponse.&edirect Lt J>Z]tA ABVo@ hrAB LjA OIQ
7>. OE@, >X_J fg hUAB d>V[AB Q>~J Http$erverUtilit!.)rans*er iA>cA> >[Ak
Lt J>Z]tA ABVo@ hrAB LjA OIQ *e9 Form ;S,.NET s>SJ QHCA JrAB fHDH(
Pch )r nht chu'n ngi )eng tQ .t trang n' In .t trang khc l sO )ng phMng
th:c HttpResponse.Redirect v cp .t Q=L .i. L*n cF th tru' ;ut Di t$ng
HttpResponse hin t*i th4ng 9ua Di t$ng HttpContext ho!c sO )ng thuc t2nh Reponse ca
Di t$ng Page ho!c Control. RhMng th:c th lB s= kin )i <' gp :ng cho .t cG nh/p
chut vo Buttonh s@ chu'n ngi )eng In .t trang >*P.NET .i\
private void cmdRedirect_Click(object sender, System.EventArgs e) {
Response.Redirect("newpage.aspx");
}
RhMng th:c Redirect cF th l. vic vi Q=L tMng Di gchJ In nhKng ti ngu'>n trong
ceng th .c oh8 v vi Q=L N' . Q=L cF th chJ In trang >*P.NET khc8 kiu ti liu
khc gnh trang ;T&L ho!c h%nh nhh8 v (&zs(rv(r khc.
RhMng th:c Redirect gOi chJ thi chu'n hng In tr%nh )u't. wI F8 tr%nh )u't s@ '>u cNu
trang .i. wIt 9u l tr%nh )u't phi th=c hin hai chu'In In (&zs(rv(r8 v (&zs(rv(r
phi ;O lB th>. .t '>u cNu nKa. "t te' ch0n hiu 9u hMn l sO )ng phMng th:c
HttpServerUtility.Transfer8 phMng th:c n' s@ chu'n s= th=c thi In .t trang >*P.NET
khc tr>n ceng (&zs(rv(r. u2 )\
private void cmdRedirect_Click(object sender, System.EventArgs e) {
Server.Transfer("newpage.aspx");
}
RhMng th:c Transfer kh4ng cNn th>. .t chu'In In cli(nt8 nhng nF s@ kh4ng l. vic
nIu &*n cNn chu'n s= th=c thi In .t s(rv(r khc ho!c .t kiu ti ngu'>n khc vi @e4
Form g&ao gt. trang >*P cs inh.
2'
2' Auy tr& tr ng thi gi a cc yu c u c a trang Auy tr& tr ng thi gi a cc yu c u c a trang
#eA JwA YVZ QH? D\@ Q>TAB Q@A L_J Q>r Jbc ABVo@ hrAB B@?c JSJ YwA dXfQFcJs Jbc
QHcAB(
Sg hUAB "iew state iQHeAB Q>S@ A>lAk, E%er: string arg%ment iLK@ fK J>Zx@ QHZ]
DPAk, session state iQHeAB Q>S@ d>@CA Y\O D@qJk, >X_J cookie, Qr] Q>ZIJ D\X A>Z JwZ
Jbc FeA(
>*P.NET l .t .4 h%nh l6p tr%nh phi tr*ng thi g8/a/eDe88 Krogramm"ng moAeDh. "#i khi .t
post&ack $c pht sinh8 .S s@ n*p vo & nh8 th=c thi8 v $c gii phFng khVi & nh.
HIu .uDn giK l*i vIt ca th4ng tin sau khi .S S hon tt vic ;O lB8 &*n phi sO )ng cc
kiu 9un lB tr*ng thi g8/a/e managemen/h.
238
Chng 7: -.P'NQT }~ Oz Poao
>*P.NET cung cp nhiu cch lu trK th4ng tin8 ha' tr*ng thi8 giKa cc '>u cNu greMue8/h.
wiu tr*ng thi . &*n sO )ng cho &iIt\ th4ng tin s@ sDng &ao l<u8 s@ $c lu trK C <u8 v
s@ $c &o .6t nh thI no. Lng [.Z lit k> nhKng te' ch0n tr*ng thi khc nhau $c cp
&Ci >*P.NET. Lng n' kh4ng ch:a Di t$ng Cache8 Di t$ng n' cung cp kho lu trK t*.
thi v s@ $c .4 t trong .c [.`.
PG php cho cc phMng php lu trK )K liu l nh nhau. UK liu $c lu trK trong .t Di
t$ng t6p h$p v $c nh chJ .c &5ng .t t>n chu#i.
Bfng 7'1 Cc kiu qun l trang thi
Yibu
`ang `hi
<l minu
c shs
6 `ah mu `al Thi gian kjng Bfo ox`
V"ew 8/a/e
7t c cc
kiu )K liu
khztuNnz
t=zhFa
.NET.
"t trng xn
trong trang (&
hin hnh.
Li .t khi ngi
)eng chu'n sang
.t trang khc.
"!c inh l kh4ng
an ton. 7u' nhi>n8
&*n cF th sO )ng
cc chJ thi trang
th=c hin .6t hFa
v &v. ngvn )K
liu &i ph.
uery
8/r"ng
UK liu
chu#i.
Phu#i Q=L ca
tr%nh )u't.
Li .t khi ngi
)eng nh6p .t Q=L
.i ho!c Fng tr%nh
)u't. 7u' nhi>n8 nF
cF th $c lu trK
trong .t
&ook.ark.
Hgi )eng cF th
nh%n th' $c v
chJnh sOa )r )ng.
*e88"on
8/a/e
7t c cc
kiu )K liu
khztuNnz
t=zhFa
.NET.
L nh s(rv(r
gcF th $c cu
h%nh cho .t
tiIn tr%nh ho!c
cM sC )K liu
&>n ngoih.
nIt hiu l=c sau .t
khong thi gian
$c inh nghqa
trc gthng l ]d
phGt8 nhng khong
thi gian n' cF th
tha' si $ch.
n ton v% )K liu
kh4ng &ao gi $c
chu'n cho cli(nt.
Cook"e
UK liu
chu#i.
"' t2nh cli(nt
gtrong & nh
ho!c .t fil(
t(;t8 te' thuc
vo cc thiIt l6p
cho thi gian
sDng ca nFh.
l$c thiIt l6p &Ci
l6p tr%nh vi>n. PF
th $c sO )ng
trong nhiu trang v
cF th v3n ckn giKa
cc lNn viIng thv..
wh4ng an ton8 v
cF th &i ngi
)eng chJnh sOa.
239
Chng 7: -.P'NQT }~ Oz Poao
>KKD")a/"o
n 8/a/e
7t c cc
kiu )K liu
khztuNnz
t=zhFa
.NET.
L nh s(rv(r.
7hi gian sDng ca
:ng )ng gcho In
khi s(rv(r $c khCi
ng l*ih. wh4ng
giDng vi cc
phMng php khc8
)K liu :ng )ng l
ton cc Di vi tt
c cc ngi )eng.
n ton v% )K liu
kh4ng &ao gi $c
chu'n cho cli(nt.
n%nh [.Z tr%nh &' .t trang (& thO nghi. cc kiu 9un lB tr*ng thi khc nhau. whi
ngi )eng nh/p vo nGt */ore Ea/a8 .t Di t$ng System.DateTime s@ $c t*o ra v $c
lu trK trong B"ew 8/a/e8 8e88"on 8/a/e8 v .t )ook"e te' &iIn. whi ngi )eng nh/p vo nGt
6e/ Ea/a8 th4ng tin n' s@ $c l' ra v hin thi. PuDi ceng8 nGt CDear Ea/a s@ ;Fa th4ng tin
n' trong tt c cc tr*ng thi.
0nh 7'1 Th nghim cc kiu qun l trang thi
Ui <' l phNn .S cho trang\
using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.SessionState;
public class TestState : System.Web.UI.Page {
protected System.Web.UI.WebControls.Button cmdClear;
protected System.Web.UI.WebControls.Button cmdStore;
240
Chng 7: -.P'NQT }~ Oz Poao
protected System.Web.UI.WebControls.Button cmdGetData;
protected System.Web.UI.WebControls.Label lblData;
// (Bo qua phn m designer.)
private void cmdStore_Click(object sender, System.EventArgs e) {
// Tao di tong thu nghim.
DateTime now = DateTime.Now;
// Lu tr di tong trong view state.
ViewState["TestData"] = now;
// Lu tr di tong trong session state.
Session["TestData"] = now;
// Lu tr di tong trong mt cookie tuy bin.
// Kim tra xem cookie d tn tai hay cha (c tn l 0-02).
if (Request.Cookies["0-02"] == null) {
// Tao cookie.
HttpCookie cookie = new HttpCookie("0-02");
// Cookie ch c th lu tr d liu chui.
// N c th lu tr nhiu gi tr,
// mi gi tr ng vi mt kha khc nhau.
cookie["TestData"] = now.ToString();

// (Ban c th chnh sua cc thuc tnh
// cua cookie d thay di ngy ht hiu lc.)
// Gn cookie vo dp ng.
// N s doc cung cp vi tt ca cc yu cu dn
// site ny cho dn khi ht hiu lc.
Response.Cookies.Add(cookie);
241
Chng 7: -.P'NQT }~ Oz Poao
}
}
private void cmdGetData_Click(object sender, System.EventArgs e) {
lblData.Text = "";
// Kim tra thng tin trong view state.
if (ViewState["TestData"] != null) {
DateTime data = (DateTime)ViewState["TestData"];
lblData.Text += "bView state data:/b " +
data.ToString() + "br";
}else {
lblData.Text += "No view state data found.br";
}

// Kim tra thng tin trong session state.
if (Session["TestData"] != null) {
DateTime data = (DateTime)Session["TestData"];
lblData.Text += "bSession state data:/b " +
data.ToString() + "br";
}else {
lblData.Text += "No session data found.br";
}
// Kim tra thng tin trong cookie tuy bin.
HttpCookie cookie = Request.Cookies["0-02"];
if (cookie != null) {
string cookieData = (string)cookie["TestData"];
lblData.Text += "bCookie data:/b " +
242
Chng 7: -.P'NQT }~ Oz Poao
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;
// (Ban cng c th su dng Session.Abandon d xa tt ca
// thng tin trong session state.)
// xa cookie, ban phai thay n thnh
// mt cookie d vot qu ngy ht hiu lc.
HttpCookie cookie = new HttpCookie("0-02");
cookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(cookie);
}
}
"t kiu tr*ng thi . trang n' kh4ng th hin l Muery 8/r"ng gchu#i tru' vnh. uery 8/r"ng
ki hVi .t chu'n hng trang8 lB tCng cho vic chu'n th4ng tin tQ trang n' In trang
khc. l thiIt l6p th4ng tin8 &*n phi chu'n hng ngi )eng In .t trang .i v th>.
cc Di sD Muery 8/r"ng vo cuDi Q=L. L*n cF th sO )ng phMng th:c
HttpServerUtility.UrlEncode v UrlDecode &o . )K liu chu#i l Q=L h$p l.
DateTime now = DateTime.Now;
string data = Server.UrlEncode(now.ToString());
Response.Redirect("newPage.aspxTestData=" + data);
l l' th4ng tin n'8 &*n cF th sO )ng t6p h$p HttpResponse.ueryString\
// Kim tra thng tin trong query string.
if (Request.ueryString["TestData"] != null) {
string data = Request.ueryString["TestData"];
data = Server.UrlDecode(data);
243
Chng 7: -.P'NQT }~ Oz Poao
lblData.Text += "bFound query string data:/b " + data + "br";
}
3'
3' T o cc !i n thnh vin c' tr ng thi cho trang T o cc !i n thnh vin c' tr ng thi cho trang
#eA JwA QeX JSJ F@jA Q>\A> D@CA QHXAB YEd QHcAB D\ FRX LRO JSJ B@S QHM Jbc
J>AB LVWJ B@? Ye@ s>@ QHcAB LVWJ dXfQ6FcJs(
P>RA ~AB DE@ fn s@qA /age./re&ender, D\ B>@ QPQ JR JSJ F@jA Q>\A> D@CA D\X "iew
state( P>RA ~AB DE@ fn s@qA /age.+oad, D\ YP] QPQ JR JSJ B@S QHM Jbc JSJ F@jA Q>\A>
D@CA Q "iew state( P>wA O} JyA Ye@ Jbc FeA B@o L] J^ Q>t QV[AB QSJ DE@ JSJ F@jA
A\] O\ s>TAB d>R@ YX Y{AB JSJ DPA LG DG QHeAB Q>S@(
>*P.NET cung cp nhiu cM chI tr*ng thi8 nh S $c .4 t trong .c [.]. 7u' nhi>n8 &*n
kh4ng th sO )ng chGng .t cch t= ngEtt c u ki hVi .t o*n .S !t th4ng tin
vo v l' th4ng tin ra. L*n cF th th=c hin cc c4ng vic n' .t lNn. whi F8 phNn .S ckn
l*i ca &*n cF th tMng tc tr=c tiIp vi &iIn thnh vi>n.
l cch tiIp c6n n' cF th l. vic $c8 &*n cNn 0c cc gi tri ca &iIn vo Nu .#i
post&ack. |= kin Page.Load l .t ch0n l=a lB tCng cho o*n .S n' v% nF lu4n pht sinh
trc &t c: s= kin iu khin no khc. L*n cF th sO )ng phMng th:c th lB s= kin
Page.Load khCi )=ng tt c cc &iIn. Hgoi ra8 &*n cNn lu trK tt c cc &iIn trc khi
trang $c gOi cho ngi )eng8 sau khi tt c vic ;O lB S hon tt. 7rong trng h$p n'8
&*n cF th p :ng cho s= kin Page.PreRender8 v% s= kin n' pht sinh sau tt c cc
phMng th:c th lB s= kin khc8 chJ trc khi trang $c chu'n thnh ;T&L v gOi cho
cli(nt.
7rang v2 ) sau <' tr%nh &' cch )u' tr% .t &iIn thnh vi>n ca trang cF t>n l
memberValue\
using System;
using System.Web;
using System.Web.UI.WebControls;
public class StatefulMembers : System.Web.UI.Page {
// (Bo qua phn m designer.)
private int memberValue = 0;
private void Page_Load(object sender, System.EventArgs e) {
// Nap lai tt ca cc bin thnh vin.
if (ViewState["memberValue"] != null) {
memberValue = (int)ViewState["memberValue"];
244
Chng 7: -.P'NQT }~ Oz Poao
}
}
private void StatefulMembers_PreRender(object sender,
System.EventArgs e) {
// Lu tt ca cc bin thnh vin.
ViewState["memberValue"] = memberValue;
// Hin th gi tr.
lblCurrent.Text = memberValue.ToString();
}
// (Cc phng thc th l s kin khc gi dy
// c th lm vic trc tip vi memberValue.)
}
4'
4' % ng cc s "i n %h7a client v i Eava0cri%t % ng cc s "i n %h7a client v i Eava0cri%t
#eA JwA Q>CO O} Da"aScript D\X OIQ *e9 Form(
!MA> AB>c >\O Da"aScript QHXAB OIQ J>Zx@, D\ fg hUAB d>V[AB Q>~J
/age.&egisterClient$cript6loc: Lt J>A >\O Da"aScript D\X QHcAB LVWJ QHR DG(
3>@ L^, FeA J^ Q>t Q>CO JSJ L_J QaA> L@GZ s>@tA Lt B@ JSJ >\O A\](
>*P.NET l .t .4 h%nh l6p tr%nh a nvng. lng tiIc8 .t khi trang S $c tr v )*ng
;T&L8 &*n kh4ng th th=c thi &t k .S .NET no nKa . kh4ng phi pht sinh post&ack In
s(rv(r. n*n chI n' l. gi. t2nh hiu 9u ca cc trang (& cF t2nh tMng tc gch~ng h*n8
;c nh6n t2nh h$p l ca Nu voh.
Uq nhi>n8 kh4ng cF lB )o g% khiIn &*n kh4ng th trn ch:c nvng baBa*)r"K/ ph2a cli(nt vo .S
.NET. "!c )e .NET kh4ng ch:a &t k giao )in Di t$ng no t*o baBa*)r"K/8 nhng &*n
cF th ch1n nF vo trang &5ng ta'. PF .t cch th=c hin vic n' l thiIt l6p !c t2nh iu
khin. u2 )8 TextBox )i <' s@ hin thi .t MessageBox khi nF .t focus\
TextBox1.Attributes.Add("onBlur",
"alert('The TextBox has lost focus!');");
7hj TextBox s@ $c tr v )*ng ;T&L nh sau\
input name="TextBox1" type="text" id="TextBox1"
onBlur="alert('The text box has lost focus!');" ... /
245
Chng 7: -.P'NQT }~ Oz Poao
7rong trng h$p n'8 &*n sO )ng h. baBa*)r"K/ alert gni t*ih v s= kin baBa*)r"K/
onBlur gpht sinh khi .t iu ki. .t focush. nNu hIt cc phNn tO ;T&L u h# tr$ cc s=
kin sau <'\
onFocus ;' ra khi .t iu ki. nh6n focus.
onBlur ;' ra khi .t iu ki. .t focus.
onClick ;' ra khi ngi )eng nh/p vo .t iu ki..
onChange ;' ra khi ngi )eng tha' si gi tri ca iu ki. no F.
onMouseOver ;' ra khi ngi )eng )i chu'n con trV chut tr>n .t iu ki..
"t cch khc ch1n .S baBa*)r"K/ l inh nghqa .t h. baBa*)r"K/ trong .t &iIn chu#i
rti lnh cho >*P.NET ch1n nF vo trang (& $c tr v. HIu l. th(o cch n'8 &t k iu
ki. no c?ng cF th g0i h. p :ng cho .t s= kin baBa*)r"K/.
u2 ) )i <' s@ l. r} k thu6t n' &5ng .t trang (& gt. .t &ng v .t &:c h%nh
g;(. h%nh [.]h. whi ngi )eng )i chu'n chut l>n cc 4 trong &ng th% hai h. baBa*)r"K/
te' &iIn s@ $c sO )ng\ .t t*o highlight cho 4 hin t*i v .t g &V highlight khVi 4 trc
F. Hgoi ra8 h. t*o highlight ckn tha' si Q=L ca &:c h%nh te' thuc vo ct no ang
$c ch0n. HIu ngi )eng a chut l>n ct th: nht8 h%nh .!t ci s@ $c hin thi. HIu
ngi )eng a chut l>n ct th: hai ho!c th: &a8 h%nh 9u'n sch vi )u ch. hVi nhp
nh' s@ $c hin thi.
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;
// (Bo qua phn m designer.)
private void Page_Load(object sender, System.EventArgs e) {
// nh ngha cc hm JavaScript.
string highlightScript =
"script language=JavaScript " +
"function HighlightCell(cell) {" +
"cell.bgColor = '#C0C0C0';" +
"if (cell.cellIndex == 0) {" +
"document.Form1.Image1.src='happy_animation.gif';}" +
"else {" +
"document.Form1.Image1.src='question_animation.gif';}" +
246
Chng 7: -.P'NQT }~ Oz Poao
";}" +
"/script";
string unhighlightScript =
"script language=JavaScript " +
"function UnHighlightCell(cell) {" +
"cell.bgColor = '#FFFFFF';" +
"}" +
"/script";
// Chn hm JavaScript vo trang (n s xut hin
// ngay sau the form runat=server).
// Ch rng mi khi kch ban doc kt hop vi mt tn chui.
// iu ny cho php nhiu diu kim dang k cung khi kch ban,
// trong khi vn bao dam n s doc tra v ch mt ln
// trong trang cui cung.
if (!this.IsClientScriptBlockRegistered("Highlight")) {
Page.RegisterClientScriptBlock("Highlight", highlightScript);
}
if (!this.IsClientScriptBlockRegistered("UnHighlight")) {
Page.RegisterClientScriptBlock("UnHighlight",
unhighlightScript);
}
// Thit lp dac tnh cho mi trong bang.
foreach (TableRow row in Table1.Rows) {
foreach (TableCell cell in row.Cells) {
cell.Attributes.Add("onMouseOver", "HighlightCell(this);");
cell.Attributes.Add("onMouseOut", "UnHighlightCell(this);");
}
}
}
247
Chng 7: -.P'NQT }~ Oz Poao
0nh 7'2 Hm avaScript tao highlight cho hin tai
#eA JwA >@tZ H| QaA> FRX ONQ Jbc Da"aScript( TPQ JR O} Da"aScript LVWJ QHR DG
QHnJ Q@jd QHXAB QHcAB CTM., D\ ABVo@ hrAB J^ Q>t vO vQ A^( DX L^, FeA LAB
FcX B@o L_Q FPQ s B@R@ Q>ZNQ >X_J Q>TAB Q@A Fa ONQ A\X D\X O} Da"aScript( NBX\@
Hc, FeA fg hUAB Da"aScript Lt s@tO QHc QaA> >Wd Yq J> Y\ OIQ Q@tZ vRX, s>TAB
d>R@ Y\ OIQ d>V[AB JSJ> Lt ABA JSJ >\A> LIAB s>TAB >Wd Yq, F@ ABVo@ hrAB
J^ Q>t DT >@qZ >X_J d>S >AB Da"aScript QHXAB QHlA> hZ]qQ Jbc >(
5'
5' -i n th c a s %o%-u% v i Eava0cri%t -i n th c a s %o%-u% v i Eava0cri%t
#eA JwA >@tA Q>M OIQ Jgc f dXd6Zd Lt LSd ~AB J>X OIQ >\A> LIAB Jbc ABVo@
hrAB(
!AB s OIQ >\O Da"aScript i>X_J Q>CO OIQ L_J QaA> L@GZ s>@tA fn s@qAk, D\ fg
hUAB >\O Da"aScript %indo%.open(
u% tt c .S >*P.NET th=c thi tr>n s(rv(r n>n kh4ng cF cch no hin thi .t cOa ss .i
tQ .S C#. L*n cF th th>. si>u li>n kIt vo .t trang sao cho nF t= ng .C trong .t cOa
ss .i &5ng cch thiIt l6p !c t2nh target ca thj a l _blank8 nhng cch n' v3n kh4ng
cung cp kh nvng iu khin k2ch thc ho!c kiu ca cOa ss.
pii php .C cOa ss popzup l sO )ng .S baBa*)r"K/. POa ss popzup cF th l .t trang
;T&L8 .t trang >*P.NET8 .t fil( h%nh8 ho!c &t k kiu ti ngu'>n no cF th $c .C
trong tr%nh )u't ca cli(nt. l .C .t cOa ss popzup8 &*n cNn sO )ng h. window.open v
chJ inh &a th4ng sD. 7h4ng sD th: nht l li>n kIt In trang .i8 th4ng sD th: hai l t>n
fra.( ca cOa ss8 v th4ng sD th: &a l .t chu#i cc !c t2nh gph<n cch &5ng )u phx'h cu
h%nh kiu v k2ch thc ca cOa ss popzup. Pc !c t2nh n' &ao gt.\
l!c t2nh height v widthE$c thiIt l6p l cc gi tri t2nh th(o pi;(l.
248
Chng 7: -.P'NQT }~ Oz Poao
l!c t2nh toolbar8 menubar8 v scrollbarsEcF th $c thiIt l6p l yes ha' no8 te'
thuc vo &*n .uDn hin thi cc phNn tO n' ha' kh4ng.
l!c t2nh resizableEcF th $c thiIt l6p l yes ha' no8 te' thuc vo &*n .uDn
ng vin cOa ss l cD inh ha' cF th tha' si k2ch thc $c.
u2 ) )i <' tr%nh &' cch .C .t trang >*P.NET th: hai trong .t cOa ss popzup khi
ngi )eng nh/p vo .t Button.
0nh 7'3 Hin thj ca s pop-up
L*n cNn th>. o*n .S n' vo phMng th:c th lB s= kin Page.Load.
string popupScript = "window.open('PopUp.aspx', " +
"'CustomPopUp', " +
"'width=200, height=200, menubar=yes, resizable=no')";
cmdPopUp.Attributes.Add("onClick", popupScript);
u <' l o*n .S gtrong phMng th:c th lB s= kin Page.Loadh )eng hin thi cOa ss popz
up .t cch t= ng khi trang $c hin thi\
string popupScript = "script language='javascript'" +
"window.open('PopUp.aspx', " +
"'CustomPopUp', " +
"'width=200, height=200, menubar=yes, resizable=no')" +
"/script";
249
Chng 7: -.P'NQT }~ Oz Poao
Page.RegisterStartupScript("PopupScript", popupScript);
6'
6' Thi t l % $ocus cho i u "i m Thi t l % $ocus cho i u "i m
#eA JwA J> LMA> L@GZ s@tO A\X fm A>NA XJZf s>@ QHcAB LVWJ QHR DG D\ Bg@ J>X
ABVo@ hrAB(
TeX OIQ YqA> Da"aScript Lt Q>@jQ YNd XJZf, D\ Q>CO A^ D\X QHcAB F`AB d>V[AB
Q>~J /age.&egister$tartup$cript(
liu ki. (& >*P.NET kh4ng cung cp cch thiIt l6p focus cho iu ki.8 . chJ cung
cp thuc t2nh TabIndex thiIt l6p th: t= ta&. Hhng thuc t2nh n' chJ p )ng cho
&")ro8o?/ <n/erne/ E2KDorer v kh4ng th $c sO )ng thiIt l6p focus cho iu ki. )o
&*n ch0n. l v$t 9ua h*n chI n'8 &*n cNn sO )ng In .S baBa*)r"K/.
RhMng th:c )i <' s@ th=c hin c4ng vic n'. HF nh6n vo .t tha. chiIu In &t k Di
t$ng iu ki. no8 thu l' ClientID kIt giao g.S baBa*)r"K/ phi sO )ng <E n' t%.
In iu ki.h8 rti t*o )=ng v vng kB kich &n thiIt l6p focus.
private void SetFocus(Control ctrl) {
// nh ngha lnh JavaScript.
// Di chuyn focus dn diu kim ban mun.
string setFocus = "script language='javascript'" +
"document.getElementById('" + ctrl.ClientID +
"').focus();/script";
// Thm m JavaScript vo trang.
this.RegisterStartupScript("SetFocus", setFocus);
}
HIu th>. phMng th:c n' vo .t @e4 Form8 &*n cF th g0i SetFocus khi cNn. u2 ) )i
<' s@ thiIt l6p focus khi trang n*p lNn Nu ti>n\
private void Page_Load(object sender,
System.EventArgs e) {
if (!this.IsPostBack) {
// Chuyn focus dn mt TextBox c th.
SetFocus(TextBox1);
}
}
250
Chng 7: -.P'NQT }~ Oz Poao
7'
7' Cho %h:% ng i d(ng u%load $ile Cho %h:% ng i d(ng u%load $ile
#eA JwA QeX OIQ QHcAB J>X d>d ABVo@ hrAB ZdYXch OIQ @Y(
Sg hUAB L@GZ s@tO HtmlEnput"ile, Q>@jQ YNd s@tZ O} >^c Jbc XHO Y\
multipart/*orm<data, D\ YVZ @Y F`AB d>V[AB Q>~J HtmlEnput"ile./osted"ile.
$ave#s(
u% >*P.NET th=c thi tr>n s(rv(r n>n kh4ng cF cch no tru' ;ut cc ti ngu'>n tr>n .'
cli(nt8 &ao gt. fil(. 7u' nhi>n8 &*n cF th sO )ng iu ki. System.Web.UI.
HtmlControls.HtmlInputFile cho phXp ngi )eng uploa) .t fil(. liu ki. n' tr v
phNn tO ;T&L input type="file"8 hin thi .t nGt $row8e v .t hp ch:a t>n fil(.
Hgi )eng nh/p vo nGt $row8e v ch0n .t fil(. Lc n' )irn ra .t cch t= ng v
kh4ng ki hVi &t k o*n .S te' &iIn no. |au F8 ngi )eng phi nh/p vo .t nGt khc
g&*n phi t*o nGt n'h &/t Nu 9u tr%nh uploa).
l t*o .t trang cho phXp uploa) fil(8 &*n cNn th=c hin cc &c sau <'\
7hiIt l6p kiu .S hFa ca for. l multipart/form-data. l th=c hin tha' si n'8 t%.
thj form trong fil( .a8K2 v iu chJnh nh sau\
form id="Form1" enct!peB1multipart/*orm<data1 runat="server"
7h>. iu ki. HtmlInputFile vo trang. 7rong &")ro8o?/ V"8uaD */uA"o .NET8 &*n s@
t%. th' iu ki. n' )i thj ;T&L ca hp c4ng c8 vi t>n l F"De F"eDA. "t khi
S th>. iu ki. n'8 &*n nh/p phi vo nF v ch0n =un >8 *erBer Con/roD t*o thj
input type="file" runat="server".
7h>. .t Button khc &/t Nu 9u tr%nh chu'n giao fil( S $c chJ inh g&5ng
phMng th:c HtmlInputFile.PostedFile.SaveAsh.
Ui <' l phNn .S cho trang uploa) fil(\
using System;
using System.Web;
using System.Web.UI.WebControls;
using System.IO;
public class UploadPage : System.Web.UI.Page {
protected System.Web.UI.WebControls.Label lblInfo;
protected System.Web.UI.WebControls.Button cmdUpload;
protected System.Web.UI.HtmlControls.HtmlInputFile FileInput;
// (Bo qua phn m designer.)
251
Chng 7: -.P'NQT }~ Oz Poao
private void cmdUpload_Click(object sender, System.EventArgs e) {
if (FileInput.PostedFile.FileName == "") {
// Khng file no doc ch dnh.
lblInfo.Text = "No file specified.";
} else {
try {
if (FileInput.PostedFile.ContentLength 104856) {
// Cm cc file ln hn 1 megabyte.
lblInfo.Text = "File is too large.";
}else {

// File doc lu vn gi lai tn file gc cua n.
string fileName =
Path.GetFileName(FileInput.PostedFile.FileName);
// Tin trnh ASP.NET phai c quyn di vi
// v tr n thc hin lu file, nu khng
// ngoai l "access denied" s xay ra.
FileInput.PostedFile.SaveAs(fileName);
lblInfo.Text = "File " + fileName + " uploaded.";
}
}catch (Exception err) {
lblInfo.Text = err.Message;
}
}
}
}
252
Chng 7: -.P'NQT }~ Oz Poao
0nh 7'4 Trang th nghim upload file
L*n cF th ki. tra cc thuc t2nh ca fil( $c chJ inh g&ao gt. k2ch thc ca nFh trc
khi lu ngvn kiu tn c4ng tQ chDi )ich v glQa :ng )ng >*P.NET uploa) cc fil( ln
l. N' qa c:ngh. 7u' nhi>n8 o*n .S n' kh4ng ngvn ngi )eng su&.it fil( nga' tQ Nu8
iu n' v3n cF th l. ch6. s(rv(r v $c sO )ng .C .t kiu tn c4ng tQ chDi )ich
v khcEn/. l' tt c cc tiu tr%nh th$ >*P.NET ang rnh. l ngvn ch!n kiu tn c4ng
n'8 &*n hS' sO )ng thj httpruntime trong fil( @e4.)on?"g chJ inh k2ch thc tDi a
ca fil( gt2nh th(o kilo&'t(h\
xml version="1.0" encoding="utf-8"
configuration
system.web
O.ttp&untime max&eCuest+engt.B1G@NF1 /P
!-- Bo qua cc thit lp khc. --
/system.web
/configuration
HIu &*n kh4ng chJ inh k2ch thc tDi a8 gi tri .!c inh _dca g_ .(ga&'t(h s@ p )ng.
HIu ngi )eng cung cp .t fil( 9u ln8 .t ngo*i l s@ pht sinh nga' khi trang $c
postz&ack.
C^ OIQ JSJ> s>SJ Lt Bg@ @Y Q JY@AQ YCA F6fHDH Y\ fg hUAB hMJ> DU *e9
+M. ;S,.NET( #eA JwA d>SQ QH@tA OIQ ~AB hUAB hnc6QHCA6*in&ows J>X d>d
ABVo@ hrAB J>A OIQ @Y D\ H@ B@cX Q@jd DE@ OIQ hMJ> DU *e9 +M. Lt J>Z]tA
B@cX Q>TAB Q@A(
253
Chng 7: -.P'NQT }~ Oz Poao
8'
8' 0 d ng BB0 authentication 0 d ng BB0 authentication
#eA JwA ABA ABVo@ hrAB QHZ] vZPQ JSJ QHcAB A\X L^ QH s>@ > L} LVWJ vSJ
Q>nJ hnc D\X *in&ows %ser acco%nt iQ\@ s>XRA ABVo@ hrAB *in&owsk QHCA
fHDH(
Sg hUAB //S *in&ows a%thentication( C>A d>V[AB d>Sd vSJ Q>nJ O\ FeA Q>aJ>,
D\ Q J>K@ QHZ] vZPQ A_J hcA> LjA Q>V OUJ RX F`AB //S Manager( #eA J^ Q>t YP]
Q>TAB Q@A DG ABVo@ hrAB L} LVWJ vSJ Q>nJ Q Q>ZIJ QaA> /age.User >X_J YEd
HttpContext(
<<* v >*P.NET sO )ng .4 h%nh &o .6t $c s/p lp gDayereA 8e)ur"/y moAeDh. whi ngi
)eng '>u cNu .t trang >*P.NET tr>n ;TTP8 cc &c )i <' s@ )irn ra\
Z. <<* th=c hin vic ;c th=c ngi )eng. HIu >nonymou8 a))e88 $c k2ch ho*t8 <<* s@
t= ng vng nh6p ngi )eng vi ti khon n!c )anh g<Q*=ce*erBerNamefh. HIu
kh4ng8 nF s@ '>u cNu th4ng tin ;c th=c vng nh6p ngi )eng vi .t ti khon
@"nAow8 khc.
]. HIu <<* ;c th=c ngi )eng thnh c4ng8 nF s@ chu'n '>u cNu In >*P.NET ceng vi
th4ng tin v ngi )eng S $c ;c th=c. 7h(o F8 >*P.NET cF th sO )ng cc )ich
v &o .6t ca nF )=a vo cc thiIt l6p trong fil( @e4.)on?"g gv2 )8 kh4ng cho ngi
)eng ho!c nhF. c th tru' ;ut In cc trang ho!c th .c no Fh. Hgoi ra8 .S ca
&*n cF th h*n chI cc hnh ng &5ng cch ki. tra th4ng tin v ngi )eng.
^. HIu .S >*P.NET tru' ;ut &t k ti ngu'>n h thDng no gv2 )8 .C .t fil( ho!c kIt
nDi In .t cM sC )K liuh8 h iu hnh @"nAow8 s@ th=c hin nhKng ki. tra &o .6t
ca nF. 7h4ng thng8 .S :ng )ng >*P.NET kh4ng th=c s= ch*' )i ti khon ca
ngi )eng S $c ;c th=c. Hh thI8 nhKng ki. tra &o .6t n' $c th=c hin )=a
tr>n ti khon tiIn tr%nh >*PNET g$c cu h%nh &5ng fil( ma)h"ne.)on?"gh.
l sO )ng <<* au/hen/")a/"on8 &c Nu ti>n l v4 hiu >nonymou8 a))e88 cho th .c o.
L*n cNn khCi ng <<* &anager gvo */ar/ P Con/roD PaneD P >Am"n"8/ra/"Be TooD8 P <n/erne/
<n?orma/"on *erB")e8h. wI tiIp8 nh/p phi vo .t th .c o ho!c .t th .c con &>n
trong th .c o8 v ch0n ProKer/"e8. Ph0n thj E"re)/ory *e)ur"/y g;(. h%nh [.`h.
254
Chng 7: -.P'NQT }~ Oz Poao
0nh 7'5 irectory Security
wI tiIp8 nh/p nGt EA"/. POa ss nh h%nh [.a s@ ;ut hin. 7rong nOa )i ca cOa ss8 &*n cF
th k2ch ho*t .t trong cc phMng php ;c th=c. 7u' nhi>n8 kh4ng phMng php no $c
sO )ng trQ khi &*n ;Fa )u ch0n >nonymou8 a))e88.
0nh 7'6 irectory authentication
L*n cF th k2ch ho*t nhiu phMng php ;c th=c8 trong trng h$p n' cli(nt s@ sO )ng
phMng php $c h# tr$ .*nh nht. HIu >nonymou8 a))e88 $c k2ch ho*t th% nF lu4n $c
sO )ng. Pc phMng php ;c th=c khc nhau $c .4 t trong &ng [.].
Bfng 7'2 Cc kiu xc thuc
255
Chng 7: -.P'NQT }~ Oz Poao
(h| ?i `f
>nonymou8
Pli(nt kh4ng cNn cung cp &t k th4ng tin no. Hgi )eng $c vng
nh6p &5ng ti khon n!c )anh cF sn g<Q*=ce*erBerNamefh.
$a8")
$a8") au/hen/")a/"on l .t phNn ca chuxn ;TTP 1.08 v nF $c hNu hIt
cc tr%nh )u't v (&zs(rv(r h# tr$. whi sO )ng $a8") au/hen/")a/"on8
tr%nh )u't '>u cNu ngi )eng nh6p us(rna.( v passor). 7h4ng tin n'
$c chu'n cho <<*8 v nF $c so treng vi @"nAow8 u8er a))oun/ cc
&. $a8") au/hen/")a/"on n>n lu4n $c phDi h$p vi **L v% nF kh4ng &o
.6t th4ng tin vng nh6p trc khi chu'n giao.
E"ge8/
E"ge8/ au/hen/")a/"on gOi .t A"ge8/ gt:c .S &v. .6t .Sh tr>n .*ng. Uo
F8 nF an ton hMn $a8") au/hen/")a/"on v% th4ng tin vng nh6p nIu &i ch!n
c?ng kh4ng th )eng l*i $c. Lt l$i ch 'Iu l E"ge8/ au/hen/")a/"on chJ
$c h# tr$ tr>n <n/erne/ E2KDorer W.0 trC l>n. P?ng v6'8 (&zs(rv(r ca
&*n cNn sO )ng >)/"Be E"re)/ory ho!c cF th tru' ;ut In .t >)/"Be
E"re)/ory 8erBer.
<n/egra/eA
whi sO )ng <n/egra/eA au/hen/")a/"on th% <n/erne/ E2KDorer gOi logon
tok(n cho ngi )eng hin hnh .t cch t= ng8 .irn l nF C tr>n .t
.in ng tin c6'. <n/egra/eA au/hen/")a/"on chJ $c h# tr$ tr>n <n/erne/
E2KDorer 2.0 trC l>n v kh4ng th l. vic tr>n cc pro;'zs(rv(r.
"t khi S k2ch ho*t cc thiIt l6p &o .6t cho th .c o th2ch h$p8 &*n c?ng n>n &o .
fil( @e4.)on?"g $c thiIt l6p l sO )ng @"nAow8 au/hen/")a/"on. 7rong .t )= n V"8uaD
*/uA"o .NET8 <' l thiIt l6p .!c inh.
configuration
system.web
!-- Bo qua cc thit lp khc. --
Oaut.entication modeB1indo%s1 /P
/system.web
/configuration
uo lGc n'8 th .c o ca &*n s@ '>u cNu ;c th=c ngi )eng v :ng )ng @e4 s@ cF th
l' th4ng tin v ngi )eng. Hgoi ra8 &*n cF th th>. cc 9u' t/c ph<n 9u'n gau/hor"Oa/"on
ruDeh ngvn ngi )eng ho!c nhF. no F tru' ;ut cc trang (& ho!c th .c con. L*n
th=c hin iu n' &5ng cch th>. thj allow v deny vo phNn authorization ca fil(
@e4.)on?"g. u2 )8 &*n cF th t*o .t th .c con vi ni )ung fil( @e4.)on?"g nh sau\
configuration
system.web
authorization
deny roles="Guest,Associate" /
allow users="nnbphuong81" /
deny users="" /
256
Chng 7: -.P'NQT }~ Oz Poao
/authorization
/system.web
/configuration
>*P.NET ;Xt 9ua cc 9u' t/c ph<n 9u'n th(o th: t= chGng ;ut hin v )Qng khi t%. th'
.t treng khp. 7rong v2 ) n'8 ngi )eng trong cc nhF. Guest ho!c Associate s@ t=
ng &i tQ chDi. Hgi )eng nnbphuong81 s@ $c phXp gtrQ khi anh ta l thnh vi>n ca .t
trong hai nhF. &i c. C tr>nh. 7t c cc ngi )eng khc s@ &i tQ chDi. 7rong trng h$p
n'8 <' l cc nhF. v ti khon ngi )eng cc &. HIu .uDn nFi In .t ti khon .in8
&*n hS' sO )ng cG php [DomainName][UserName].
l B trong v2 ) n'8 fil( @e4.)on?"g kh4ng ch:a phNn authentication. lF l v% phNn n'
S $c cu h%nh trong fil( @e4.)on?"g thuc th .c :ng )ng @e4. Pc th .c con cF th
thiIt l6p cc 9u' t/c ph<n 9u'n ca chGng8 nhng chGng kh4ng th tha' si chI ;c th=c.
"t te' ch0n khc kh4ng cho tru' ;ut In cc trang c th l sO )ng !c t2nh location\
configuration
system.web
!-- Bo qua cc thit lp khc. --
/system.web
Olocation pat.B1$ecure/age.aspx1P
Os!stem.%ebP
Oaut.oriIationP
Oden! rolesB17uest1 /P
O/aut.oriIationP
O/s!stem.%ebP
O/locationP
/configuration
PuDi ceng8 &*n cF th viIt logic ;c th=c &5ng cch ki. tra i)(ntit' ca ngi )eng trong
phNn .S trang (& gsO )ng thuc t2nh Page.User8 thuc t2nh n' cung cp Di t$ng
WindowsPrincipalh. L*n cF th l' t>n ngi )eng tQ thuc t2nh
WindowsPrincipal.Identity.Name8 v &*n cF th ki. tra vai trk thnh vi>n trong nhF. &5ng
phMng th:c WindowsPrincipal.IsInRole. RhNn .S cho trang (& )i <' s@ tr%nh &' cc
k thu6t n'\
using System;
using System.Web;
using System.Web.UI.WebControls;
257
Chng 7: -.P'NQT }~ Oz Poao
using System.Web.Security.Principal;
public class WindowsSecurityTest : System.Web.UI.Page {
protected System.Web.UI.WebControls.Label lblMessage;
// (Bo qua phn m designer.)
private void Page_Load(object sender, System.EventArgs e) {
// Thu ly identity d doc IIS xc thc.
WindowsIdentity identity = (WindowsIdentity)User.Identity;
// Kim tra xem n c phai l mt Administrator hay khng.
bool isAdmin = User.IsInRole(@"BUILTINAdministrators");
// Hin th mt vi thng tin v identity.
lblMessage.Text = "You have reached the secured page, " +
User.Identity.Name + "." +
"brbrAuthentication Type: " +
identity.AuthenticationType.ToString() +
"brAnonymous: " + identity.IsAnonymous.ToString() +
"brAuthenticated: " + identity.IsAuthenticated.ToString() +
"brGuest: " + identity.IsGuest.ToString() +
"brSystem: " + identity.IsSystem.ToString() +
"brAdministrator: " + isAdmin.ToString();
}
}
9'
9' 0 d ng Forms authentication 0 d ng Forms authentication
#eA JwA ABA ABVo@ hrAB QHZ] vZPQ JSJ QHcAB A\X L^ QH s>@ > Qn vSJ Q>nJ
QHVEJ DE@ OIQ QHcAB LAB A>Nd Qr] F@jA(
H@qA Q>nJ Forms a%thentication F`AB JSJ> JPZ >lA> Q> Oaut.enticationP QHXAB
@Y *e9.config Jbc ~AB hUAB( #eA d>R@ QeX QHcAB LAB A>Nd, A>VAB ;S,.NET fm
B@? Ye@ QHeAB Q>S@ vSJ Q>nJ Jbc ABVo@ hrAB(
Form8 au/hen/")a/"on l .t .4 h%nh &o .6t linh ho*t8 cho phXp ngvn ngi )eng cha $c
;c th=c tru' ;ut vo trang no F. L*n cNn viIt .S th=c hin ;c th=c8 v >*P.NET cp
258
Chng 7: -.P'NQT }~ Oz Poao
.t )ook"e cho ngi )eng S $c ;c th=c. Hgi )eng kh4ng cF )ook"e s@ &i chu'n
hng sang trang vng nh6p khi tru' ;ut .t trang $c &o v.
l hin th=c Form8 au/hen/")a/"on8 &*n phi th=c hin cc &c sau <'\
Pu h%nh Form8 au/hen/")a/"on &5ng thj authentication trong fil( @e4.)on?"g ca
:ng )ng.
|O )ng cc thiIt l6p trong fil( @e4.)on?"g h*n chI ngi )eng n!c )anh tru' ;ut
vo .t trang ho!c th .c c th.
7*o trang vng nh6p8 v th>. logic ;c th=c ca &*n vo gsO )ng lp
FormsAuthentication thuc kh4ng gian t>n System.Web.Securityh.
Lc Nu ti>n l cu h%nh fil( @e4.)on?"g trong th .c gDc ca :ng )ng k2ch ho*t
Form8 au/hen/")a/"on8 nh $c tr%nh &' trong o*n .S )i <'. L*n c?ng cNn chJ inh
trang vng nh6p te' &iIn gngi )eng cha $c ;c th=c s@ &i chu'n hng sang trang n'h
v thi gian trr gsau thi gian n'8 )ook"e s@ &i lo*i &Vh. >u/hen/")a/"on )ook"e t= ng $c
l. .i vi .#i '>u cNu (&.
configuration
system.web
!-- Bo qua cc thit lp khc. --
Oaut.entication modeB1"orms1P
O*orms loginUrlB1login.aspx1 timeoutB1D@1 /P
O/aut.enticationP
/system.web
/configuration
wI In8 &*n cNn th>. 9u' t/c ph<n 9u'n tQ chDi ngi )eng n!c )anh. Pch )r nht
&o ton cc trang l t*o .t th .c con ceng vi fil( @e4.)on?"g ca nF. il( @e4.)on?"g
n' s@ tQ chDi vic tru' ;ut ca cc ngi )eng n!c )anh8 nh $c tr%nh &' )i <'\
configuration
system.web
Oaut.oriIationP
Oden! usersB1Q1 /P
O/aut.oriIationP
!-- Bo qua cc thit lp khc. --
/system.web
/configuration
259
Chng 7: -.P'NQT }~ Oz Poao
L<' gi8 >*P.NET s@ t= ng gOi cc '>u cNu cha $c ;c th=c gDi vi cc trang trong th
.c conh In trang vng nh6p te' &iIn.
"t te' ch0n khc kh4ng cho tru' ;ut In cc trang c th trong th .c hin thi l sO
)ng thj location\
configuration
system.web
!-- Bo qua cc thit lp khc. --
/system.web
Olocation pat.B1$ecure/age.aspx1P
Os!stem.%ebP
Oaut.oriIationP
Oden! usersB1Q1 /P
O/aut.oriIationP
O/s!stem.%ebP
O/locationP
/configuration
L*n c?ng cF th tQ chDi cc ngi )eng c th &5ng cch nh6p )anh sch t>n ngi )eng
gph<n cch &5ng )u phx'h tha' vo kB t= +- g+- nghqa l +tt c cc ngi )eng n!c )anh-h.
wI tiIp8 &*n cNn t*o trang vng nh6p. 7rang vng nh6p cF th ;c th=c ngi )eng &5ng
passor) $c viIt c:ng gphe h$p cho cc thO nghi. Mn ginh8 cM sC )K liu ph2a s(rv(r8
ho!c &t k kiu logic ;c th=c te' &iIn no. "t khi ngi )eng S $c ;c th=c thnh
c4ng8 &*n cNn g0i phMng th:c tqnh FormsAuthentication.RedirectFromLoginPage. RhMng
th:c n' s@ thiIt l6p au/hen/")a/"on )ook"e v chu'n hng ngi )eng In trang $c '>u
cNu lGc Nu.
Ui <' l trang vng nh6p sM &8 chJ ki. tra .t passor) c th khi ngi )eng nh/p
vo nGt Log"n\
using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.Security;
public class LoginPage : System.Web.UI.Page {
protected System.Web.UI.WebControls.Label lblStatus;
protected System.Web.UI.WebControls.Button cmdLogin;
protected System.Web.UI.WebControls.TextBox txtPassword;
protected System.Web.UI.WebControls.TextBox txtName;
260
Chng 7: -.P'NQT }~ Oz Poao
// (Bo qua phn m designer.)
private void cmdLogin_Click(object sender, System.EventArgs e){
if (txtPassword.Text.ToLower() == "secret") {
FormsAuthentication.RedirectFromLoginPage(
txtName.Text, false);
}else {
lblStatus.Text = "Try again.";
}
}
}
l thO nghi. trang vng nh6p tr>n8 &*n hS' '>u cNu trang *e)urePage.a8K2 gn5. trong th
.c *e)ureAh. L*n s@ &i chu'n hng sang trang Dog"n.a8K28 v nIu nh6p Gng passor)8
&*n s@ $c tr v trang *e)urePage.a8K2.
0nh 7'7 Trang dng nhp ty bin
10'
10' Th c hi n xc nh n t7nh h % l c'-ch n-l a Th c hi n xc nh n t7nh h % l c'-ch n-l a
#eA JwA fg hUAB JSJ L@GZ s@tO DcY@hcQXH Jbc ;S,.NET( TZ] A>@CA, FeA OZKA
s@tO QHc F`AB O} YqA> Lt J^ Q>t vSJ A>NA QaA> >Wd Yq J> JSJ L@GZ s@tO >c] QNd
JSJ L@GZ s@tO A\X L^, >X_J J^ Q>t Qr] F@jA JSJ Q>TAB FSX Yx@ hnc QHCA LwZ D\X
s>TAB >Wd Yq(
VT >@qZ Q>ZIJ QaA> 0nableClient$cript Jbc O@ L@GZ s@tO DcY@hcQXH Lt QHcAB J^
Q>t LVWJ dXfQ6FcJs( 3j L^, fg hUAB d>V[AB Q>~J /age.>alidate Lt vSJ A>NA QaA>
261
Chng 7: -.P'NQT }~ Oz Poao
>Wd Yq Jbc QHcAB >X_J d>V[AB Q>~J 6ase>alidator.>alidate Lt vSJ A>NA QaA>
>Wd Yq Jbc QAB L@GZ s@tO H@CAB Hm(
liu ki. vali)ator ca >*P.NET l gii php lB tCng ;c nh6n t2nh h$p l ca for. .t
cch nhanh chFng. ui iu ki. vali)ator8 &*n cF th ;c nh6n t2nh h$p l ca ton & trang
ceng .t lGc. HIu .uDn ;c nh6n t2nh h$p l chJ .t phNn for.8 ho!c .uDn 9u'It inh ;(.
cF cNn ;c inh t2nh h$p l .t iu ki. no F ha' kh4ng g)=a tr>n gi tri ca .t iu
ki. khc ch~ng h*nh8 &*n s@ cNn th=c hin thao tc ;c nh6n t2nh h$p l cFzch0nzl=a.
Lc Nu ti>n trong thao tc n' l v4 hiu thuc t2nh EnableClientScript ca .0i iu ki.
vali)ator tr>n trang. HIu kh4ng8 vic ki. tra s@ $c th=c hin t*i cli(nt th4ng 9ua
baBa*)r"K/8 trang s@ kh4ng $c postz&ack nIu nF ch:a cc gi tri kh4ng h$p l8 v phNn .S
th lB s= kin s@ kh4ng $c th=c thi. "t khi S th=c hin tha' si n'8 &*n cF th ;c nh6n
t2nh h$p l tQng iu ki. .t &5ng phMng th:c BaseValidator.Validate8 ho!c ;c nh6n
t2nh h$p l ton & trang &5ng phMng th:c Page.Validate.
u2 ) )i <' th=c hin ki. tra ph2a s(rv(r vi hai vali)ator\ RangeValidator v
RegularExpressionValidator g;c nh6n t2nh h$p l .t ia chJ (z.ailh. HIu ki. tra tht &*i8
o*n .S n' s@ )u't 9ua t6p h$p cc vali)ator tr>n for. &5ng thuc t2nh Page.Validators.
"#i khi t%. th' .t vali)ator cF l#i8 nF s@ t%. iu ki. tMng :ng &5ng phMng th:c
Page.FindControl rti hin thi gi tri 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;
// (Bo qua phn m designer.)
private void cmdValidate_Click(object sender, System.EventArgs e) {

// Xc nhn tnh hop l cua trang.
this.Validate();
262
Chng 7: -.P'NQT }~ Oz Poao
if (!Page.IsValid) {

lblCustomSummary.Text = "";
foreach (BaseValidator validator in this.Validators) {

if (!validator.IsValid) {

TextBox invalidControl = (TextBox)
this.FindControl(validator.ControlToValidate);
lblCustomSummary.Text +=
"The page contains the following error: b" +
validator.ErrorMessage + "/b.br" +
"The invalid input is: b" +
invalidControl.Text + "/b." + "brbr";
}
}
}else {
lblCustomSummary.Text = "Validation succeeded.";
}
}
}
263
Chng 7: -.P'NQT }~ Oz Poao
0nh 7'8 Thuc hin thao tc xc nhn tnh hop l ty bin
11' 11' Thm ng i u "i m vo We! Form Thm ng i u "i m vo We! Form
#eA JwA Q>CO OIQ L@GZ s@tO F D\X OIQ QHcAB F YJ Q>nJ Q>@ D\ Q>U Y JSJ fn
s@qA Jbc A^(
TeX OIQ LK@ QVWAB L@GZ s@tO, Q>CO A^ D\X QNd >Wd Controls Jbc OIQ L@GZ s@tO
JXAQc@AH, D\ fg hUAB YqA> #ddHandler Lt sjQ AK@ FPQ s d>V[AB Q>~J Q>U Y fn
s@qA A\X( #eA d>R@ QeX L@GZ s@tO fcZ Ox@ YwA dXfQFcJs(
w thu6t th>. iu ki. (& vo trang (& tMng t= nh k thu6t th>. iu ki. @"nAow8
vo for.8 nhng cF .t vi i. khc8 &ao gt.\
Pc iu ki. $czt*ozng chJ ttn t*i In lNn post&ack kI tiIp. HIu cNn chGng8 &*n
phi ti t*o l*i khi trang $c tr v. 7u' nhi>n8 ki hVi n' kh4ng ngvn &*n viIt .S
th lB cc s= kin ca chGng.
uic inh vi cc iu ki. $czt*ozng kh4ng .' )r )ng. L*n n>n sO )ng iu
ki. tr=c kin gD"/eraD )on/roDh ch:a .S ;T&L gnh brh ph<n cch cc iu ki.
$czt*ozng.
Pc iu ki. $czt*ozng n>n $c !t trong .t iu ki. contain(r gnh Panelh
hMn l !t tr=c tiIp l>n trang. liu n' khiIn cho vic inh vi chGng )r )ng hMn.
HIu .uDn tMng tc vi iu ki. sau n'8 &*n n>n cho nF .t inh )anh g<Eh )u'
nht. L*n cF th sO )ng <E n' thu l' nF tQ t6p h$p Controls ca iu ki.
contain(r.
HMi tDt nht t*o cc iu ki. .i l trong phMng th:c th lB s= kin Page.Load g&o .
iu ki. s@ $c t*o .#i khi trang $c p :ngh. Hgoi ra8 nIu &*n th>. .t iu ki.
264
Chng 7: -.P'NQT }~ Oz Poao
nh6p ginputh sO )ng B"ew 8/a/e8 th4ng tin B"ew 8/a/e s@ $c tr l*i cho iu ki. sau khi s=
kin Page.Load pht sinh. 7Mng t=8 v% s= kin Page.Load lu4n pht sinh trc khi s= kin no
khc )irn ra8 &*n cF th ti t*o .t iu ki. )=ng n>n cc s= kin ph2a s(rv(r8 v phNn .S
th lB s= kin ca nF s@ )irn ra nga' sau s= kin Page.Load.
u2 ) )i <' g;(. h%nh [.ch s@ t*o ng &a iu ki. ghai Button v .t TextBoxh v inh
vi chGng &5ng iu ki. tr=c kin gFng vai trk l )u ph<n cchh. nai Button $c kIt nDi
vi cc phMng th:c th lB s= kin ri>ng &it. TextBox $c cp .t inh )anh )u' nht
phNn t(;t ca nF cF th $c thu l' sau n' gtrong p :ng cho cG nh/p chut vo Buttonh.
0nh 7'9 Cc diu kim doc-tao-dng
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
public class DynamicControls : System.Web.UI.Page {
protected System.Web.UI.WebControls.Label lblMessage;
protected System.Web.UI.WebControls.Panel pnl;
// (Bo qua phn m designer.)
265
Chng 7: -.P'NQT }~ Oz Poao
private void Page_Load(object sender, System.EventArgs e) {

// Tao Button.
Button dynamicButton = new Button();
dynamicButton.Text = "Dynamic Button A";
// Kt ni phng thc th l s kin.
dynamicButton.Click += new EventHandler(cmdDynamicA_Click);
// Thm Button vo Panel.
pnl.Controls.Add(dynamicButton);

// Thm du ngt dng.
pnl.Controls.Add(new LiteralControl("br"));
// Tao Button th hai.
dynamicButton = new Button();
dynamicButton.Text = "Dynamic Button B";
dynamicButton.Click += new EventHandler(cmdDynamicB_Click);
pnl.Controls.Add(dynamicButton);
// Thm du ngt dng.
pnl.Controls.Add(new LiteralControl("brbr"));
// Tao TextBox.
TextBox dynamicText = new TextBox();
pnl.Controls.Add(dynamicText);
// Gn ID cho TextBox.
dynamicText.ID = "DynamicText";
}
private void cmdDynamicA_Click(object sender, System.EventArgs e) {

lblMessage.Text = "Clicked A";
GetText();
}
266
Chng 7: -.P'NQT }~ Oz Poao

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

lblMessage.Text = "Clicked B";
GetText();
}
private void GetText(){
lblMessage.Text += "brbr";
foreach (Control ctrl in pnl.Controls){
if (ctrl.ID == "DynamicText"){
lblMessage.Text += "TextBox contains: " +
((TextBox)ctrl).Text;
}
}
}
}
HIu cNn t*o ng cc la'out ph:c t*p ggt. cc nhF. iu ki. $c t*o )=ng trch8 &*n cF
th chu'n sang sO )ng iu ki. ngi )eng v n*p ng chGng vo trang. w thu6t n' s@
$c tr%nh &' trong .c [.Z^.
12'
12' Tr v ng m t ! c h&nh Tr v ng m t ! c h&nh
#eA JwA QHR DG LIAB OIQ F~J >lA> iJ>AB >eA, Lt QeX hnAB sjQ vZPQ heAB F@tZ L
>X_J L Q>Mk(
TeX hnAB F~J >lA> F`AB 6/ D\ OIQ LK@ QVWAB $!stem.-ra%ing.6itmap QHXAB6
FI6A>E( 3j L^, FeA J^ Q>t B>@ A^ Hc hyAB sjQ vZPQ io%tp%t streamk, >X_J YVZ A^
D\X Lc J~AB Jbc fHDH D\ >@tA Q>M A^ DE@ L@GZ s@tO F Emage(
L*n cF th v@ ng cc &:c h%nh trong .t :ng )ng @e4 &5ng cch sO )ng ceng o*n .S
6E<S S sO )ng trong .t :ng )ng )=aztr>nz@"nAow8. PhJ cF i. khc l cch th:c &*n
tr v &:c h%nh cuDi ceng nh thI no. u cM &n8 cF hai cch tiIp c6n . &*n cF th sO )ng\
L*n cF th a tr=c tiIp ni )ung nhi ph<n ca &:c h%nh vo thuc t2nh OutputStream
ca Di t$ng HttpResponse. l<' l .t cch tiIp c6n ha' nIu &*n kh4ng .uDn l.
N' s qa c:ng ca s(rv(r vi cc fil( h%nh kh4ng h $c sO )ng l*i. l<' c?ng l s=
l=a ch0n tDt nht nIu &*n cNn t*o ng cc &:c h%nh $c thiIt kI phe h$p vi Nu
vo ca ngi )eng.
267
Chng 7: -.P'NQT }~ Oz Poao
L*n cF th lu &:c h%nh vo h thDng fil( ca (&zs(rv(r v sO )ng thj ;T&L img
hin thi nF. l<' l s= l=a ch0n tDt nIu &*n cNn t*o .t &:c h%nh s@ $c sO )ng l*i8
v% trnh $c chi ph2 ca vic ti t*o h%nh li>n tc.
"c n' kho st c hai cch tiIp c6n tr>n. 7rc ti>n8 hS' ;Xt cch t*o ng .t h%nh .
kh4ng lu nF ra fil(. 7rong v2 ) n'8 .c 2ch l t*o .t &ann(r Mn gin g;(. h%nh [.Zdh.
0nh 7'10 Mt banner doc-tao-dng
l B r5ng chJ cF phNn t(;t ca &ann(r l )o ngi )eng cung cp gth4ng 9ua chu#i tru' vnh.
ont8 .u8 v k2ch thc $c viIt .S c:ng g.!c )e chGng cF th $c thiIt l6p )r )ng )=a
vo cc Di sD chu#i tru' vn khc ho!c )=a vo fil( @e4.)on?"gh.
lo*n .S )i <' s@ tr%nh &' cch tiIp c6n n'\
using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Drawing.Drawing2D;
public class DynamicGraphic : System.Web.UI.Page {
// (Bo qua phn m designer.)
private void Page_Load(object sender, System.EventArgs e) {

// Ly text tu chui truy vn.
// Nu khng c text, chon mac dnh.
string text = "";
if (Request.ueryString["image"] == null) {
268
Chng 7: -.P'NQT }~ Oz Poao

Response.Redirect(Request.Url + "image=" +
Server.UrlEncode("This is a test image"));
}
else {
text = Server.UrlDecode(Request.ueryString["image"]);
}
// Tao mt hnh bitmap trong-b-nh
// (rng 300 pixel v cao 200 pixel).
int width = 300, height = 200;
Bitmap bitmap = new Bitmap(width, height);
// Ly graphics context cua hnh bitmap.
Graphics graphics = Graphics.FromImage(bitmap);
// Thit lp mu nn v cht long hnh.
// Mu ny s tro thnh dng vin.
graphics.Clear(Color.OrangeRed);
graphics.SmoothingMode = SmoothingMode.AntiAlias;
// V mt hnh ch nht.
graphics.FillRectangle(new SolidBrush(Color.Olive), 5, 5,
width - 10, height - 10);
// Chon font v alignment cho text.
Font fontBanner = new Font("Verdana", 24, FontStyle.Bold);
StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
// V text.
graphics.DrawString(text, fontBanner,
new SolidBrush(Color.LightYellow),
new Rectangle(0, 0, width, height), stringFormat);
269
Chng 7: -.P'NQT }~ Oz Poao
// Lu bc hnh vo dng kt xut.
bitmap.Save(Response.OutputStream,
System.Drawing.Imaging.ImageFormat.Gif);
graphics.Dispose();
bitmap.Dispose();
}
}
whi lu &:c h%nh vo )kng kIt ;ut8 &*n s@ thI ch# &t k kIt ;ut no khc. u% thI8 &*n
kh4ng th sO )ng k thu6t n' vi .t trang c?ng cF ch:a @e4 )on/roD8 ho!c ni )ung
;T&L tqnh. 7h(o F8 nIu .uDn sO )ng .t trang phDi h$p cc &:c h%nh $czt*ozng v
cc iu ki. (&8 &*n cNn +&0c- &:c h%nh $czt*ozng trong .t iu ki. ho!c ghi &:c
h%nh ra s qa c:ng trc khi hin thi nF.
HIu .uDn lu fil( vo s qa c:ng8 &*n cNn chu'n phNn .S t*o )=ng &:c h%nh thnh .t
phMng th:c c l6p8 . chGng ta s@ !t t>n l GenerateBanner. wI F8 trong phMng th:c th
lB s= kin Page.Load8 &*n ki. tra ;(. fil( S ttn t*i cha gsO )ng phMng th:c tqnh
File.Existsh. HIu fil( cha ttn t*i8 &*n t*o nF trong & nh &5ng phMng th:c
GenerateBanner v lu nF &5ng phMng th:c Bitmap.Save. HIu fil( S ttn t*i8 &*n chJ cNn n*p
th~ng &:c h%nh n'.
lo*n .S )i <' s@ tr%nh &' cch tiIp c6n n'\
using System;
using System.IO;
using System.Web;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Drawing.Drawing2D;
public class DynamicGraphic : System.Web.UI.Page {
protected System.Web.UI.WebControls.Image imageControl;
// (Bo qua phn m designer.)
private Bitmap GenerateBanner() {

// Tao dng bc hnh, su dng phn m trong v d o trn.
}
private void Page_Load(object sender, System.EventArgs e) {
270
Chng 7: -.P'NQT }~ Oz Poao

// Thit lp tn file.
// Gia su chui truy vn cha cc k t hop l cho tn file.
string fileName = Request.ueryString["image"] + ".gif";
Bitmap bitmap = null;
// Kim tra bc hnh vi phn text ny d tn tai hay cha.
if (File.Exists(fileName)) {
// Nap bc hnh hin c.
try {
bitmap = new Bitmap(fileName);
}catch {
bitmap = GenerateBanner();
}
}
else {
bitmap = GenerateBanner();
// Lu bc hnh.
bitmap.Save(fileName,
System.Drawing.Imaging.ImageFormat.Gif);
}
// Hin th bc hnh.
imageControl.ImageUrl = fileName;
}
}
13' 13' N % i u "i m ng i d(ng ! ng m# l nh N % i u "i m ng i d(ng ! ng m# l nh
#eA JwA QeX hnAB LIAB B@cX h@qA ABVo@ hrAB i%ser interfacek J>X OIQ QHcAB Q
OIQ >X_J A>@GZ L@GZ s@tO ABVo@ hrAB i%ser controlk.
Sg hUAB d>V[AB Q>~J /age.+oadControl Lt QeX LK@ QVWAB L@GZ s@tO Q @Y (asc8,
D\ H@ Q>CO A^ D\X QNd >Wd Controls Jbc OIQ L@GZ s@tO JXAQc@AH(
271
Chng 7: -.P'NQT }~ Oz Poao
liu ki. ngi )eng l cc nhF. iu ki. c l6p. Hh @e4 Form8 iu ki. ngi )eng
&ao gt. phNn la'out inh nghqa cc iu ki. &>n trong gfil( .a8)2h v phNn co)(z&(hin)
ceng vi logic th lB s= kin gfil( .)8h. liu ki. ngi )eng cho phXp &*n sO )ng l*i cc
phNn tO giao )in th4ng thng tr>n nhiu trang v t*o )=ng cc giao )in ph:c t*p tQ cc
khDi nhV hMn. "t !c i. hKu 2ch ca iu ki. ngi )eng l chGng cF th $c n*p &5ng
.S lnh8 iu n' cho phXp &*n t*o .t giao )in cu h%nh cao )o &*n thiIt kI ng ' th(o
ngi )eng. L*n chJ cNn n*p iu ki.8 cu h%nh cc thuc t2nh ca nF8 v rti th>. nF vo
.t iu ki. contain(r.
u2 )8 ;Xt trang (& S t*o ng cc &:c h%nh trong .c [.Z]. "t gii php th(o cch hng
Di t$ng hMn cF th hin th=c $c l t*o .t iu ki. ngi )eng te' &iIn Fng gFi &:c
h%nh $czt*ozng. liu ki. ngi )eng n' cho phXp trang thiIt l6p t(;t8 font8 .u...
th4ng 9ua cc thuc t2nh khc nhau.
using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Drawing.Drawing2D;
public class DynamicGraphicControl : System.Web.UI.UserControl {
// (Bo qua phn m designer.)
private string imageText = "";
public string ImageText {
get {
return imageText;
}
set {
imageText = value;
}
}
private Font textFont;
public Font TextFont {
get {
return textFont;
}
set {
textFont = value;
}
272
Chng 7: -.P'NQT }~ Oz Poao
}
private Size imageSize;
public Size ImageSize {
get {
return imageSize;
}
set {
imageSize = value;
}
}
private Color foreColor;
public Color ForeColor {
get {
return foreColor;
}
set {
foreColor = value;
}
}
private Color backColor;
public Color BackColor {
get {
return backColor;
}
set {
backColor = value;
}
}
private Color borderColor;
public Color BorderColor {
get {
273
Chng 7: -.P'NQT }~ Oz Poao
return borderColor;
}
set {
borderColor = value;
}
}
private void Page_Load(object sender, System.EventArgs e) {
if (ImageText == "")
return;
// Tao mt hnh bitmap trong-b-nh.
Bitmap bitmap = new Bitmap(ImageSize.Width, ImageSize.Height);
// ly graphics context cua hnh bitmap.
Graphics graphics = Graphics.FromImage(bitmap);
// Thit lp mu nn v cht long hnh.
// Mu ny s tro thnh dng vin.
graphics.Clear(BorderColor);
graphics.SmoothingMode = SmoothingMode.AntiAlias;
// V mt hnh ch nht.
graphics.FillRectangle(new SolidBrush(BackColor), 5, 5,
ImageSize.Width - 10, ImageSize.Height - 10);
// Thit lp alignment cho text.
StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
// V text.
graphics.DrawString(ImageText, TextFont,
new SolidBrush(ForeColor),
new Rectangle(0, 0, ImageSize.Width, ImageSize.Height),
stringFormat);
274
Chng 7: -.P'NQT }~ Oz Poao
// Lu bc hnh vo dng kt xut.
bitmap.Save(Response.OutputStream,
System.Drawing.Imaging.ImageFormat.Gif);
graphics.Dispose();
bitmap.Dispose();
}
}
@e4 Form n*p iu ki. ngi )eng n' trong phMng th:c th lB s= kin Page.Load. liu
ki. ngi )eng $c !t trong .t Panel. RhMng th:c LoadControl tr v .t Di t$ng
Control8 v nF $c Xp kiu thnh lp iu ki. ngi )eng th2ch h$p.
using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Drawing;
public class DynamicControlTest : System.Web.UI.Page {
protected System.Web.UI.WebControls.Panel pnl;
// (Bo qua phn m designer.)
private void Page_Load(object sender, System.EventArgs e) {
// Nap diu kim.
DynamicGraphicControl ctrl;
ctrl = (DynamicGraphicControl)
Page.LoadControl("DynamicGraphicControl.ascx");
// Cu hnh cc thuc tnh cua diu kim.
ctrl.ImageText = "This is a new banner test";
ctrl.ImageSize = new Size(300, 200);
ctrl.TextFont = new Font("Verdana", 24, FontStyle.Bold);
ctrl.BackColor = Color.Olive;
ctrl.ForeColor = Color.LightYellow;
ctrl.BorderColor = Color.OrangeRed;
275
Chng 7: -.P'NQT }~ Oz Poao
// Thm diu kim vo Panel.
pnl.Controls.Add(ctrl);
}
}
7rong V"8uaD */uA"o .NET8 lp iu ki. ngi )eng lu4n cF hiu l=c v% cc lp S $c &i>n
)ich thnh .ADD. 7u' nhi>n8 nIu iu ki. ngi )eng kh4ng phi .t & ph6n ca )= n8 &*n
s@ kh4ng cF lp iu ki. ngi )eng v &*n s@ kh4ng th tru' ;ut &t k thuc t2nh ha'
phMng th:c no ca iu ki. ngi )eng. l kh/c phc vn n'8 &*n cF th t*o .t lp
cM sC ho!c .t giao )in inh nghqa cc ch:c nvng cM &n cF th tru' ;ut vo &t k iu
ki. ngi )eng te' &iIn no.
!t QlO >@tZ s >[A DG s Q>ZNQ A\], FeA >}] hXAYXch /5%:Sp: portal case st%&:
Qe@ [http://www.asp.net/!"#$o%ta&]( N^ QHlA> F\] OIQ Yc]XZQ s>R6Qr]6F@jA6JcX
LVWJ QeX hnAB >X\A QX\A Q JSJ L@GZ s@tO ABVo@ hrAB LVWJ6Aed6LIAB(
14' 14' 0 d ng %age-caching v $ragment-caching 0 d ng %age-caching v $ragment-caching
#eA JwA QAB >@qZ AAB F`AB JSJ> YVZ B@? JSJ QHcAB LVWJ QHR DG(
T>CO J> Q>M (utputCac.e D\X QHcAB >X_J L@GZ s@tO ABVo@ hrAB, D\ J> LMA>
QHcAB fm LVWJ B@? QHXAB JcJ> FcX YZ iQaA> Q>X B@]k(
uic sO )ng caching vQa phi cF th gi. &t hiu :ng th/t cs chai gch~ng h*n8 tru' ;ut cM
sC )K liuh v tvng ton & hiu nvng ca .t (&sit(. Paching cF hiu 9u ln trong .t sit(
cF lu l$ng cao. u2 )8 ;Xt ;(. iu g% s@ ;' ra khi &*n lu giK .t trang hin thi kIt 9u
ca .t tru' vn cM sC )K liu. HIu &*n lu giK trang n' trong Z phGt8 v trang n' nh6n
$c Zd '>u cNu trong khong thi gian F8 &*n s@ gi. $c Zd lNn chi ph2 tru' ;ut cM sC
)K liu.
L*n cF th hin th=c caching .t cch )r )ngEchJ cNn th>. chJ thi OutputCache vo trang
(&. PhJ thi n' phi $c th>. vo fil( .a8K28 ch: kh4ng phi fil( .)8. u2 ) )i <' lu
giK .t trang trong ]d gi<'\
@ OutputCache Duration="20" VaryByParam="None"
u v2 ) )i <' lu giK .t trang trong ]d gi<' nhng v3n )u' tr% cc &n sao te' vo gi
tri ca cc Di sD chu#i tru' vn\
@ OutputCache Duration="20" VaryByParam=""
L*n cF th thO nghi. caching &5ng .t trang hin thi ng' v gi tr>n s(rv(r. L*n s@ nh6n
th' r5ng cc '>u cNu In sau gDi vi trang n'h kh4ng khiIn cho thi gian $c t*o .i.
7h(o F8 thi gian c? s@ $c hin thi cho In khi trang hIt hiu l=c.
utputzcaching kh4ng hiu 9u trong cc trng h$p sau <'\
7rang ca &*n cNn t= te' &iIn ' th(o cc thiIt l6p !c the ca ngi )eng nh th4ng tin
;c th=c gDi t$ng Userh ho!c tr*ng thi gDi t$ng Sessionh. 7rong trng h$p n'8
nF kh4ng t*o c. gic sO )ng l*i ceng .t trang cho tt c cc ngi )eng.
276
Chng 7: -.P'NQT }~ Oz Poao
7rang ca &*n ch:a cc iu ki. postz&ack v )=ng n>n cc s= kin ph2a s(rv(r.
7rang ca &*n cNn th=c hin .t hnh ng khc gnh ghi ra fil( nh6t kB8 nh6p th4ng
tin vo cM sC )K liu8 ho!c tha' si .t &iIn :ng )ngh. "t trang $c lu giK s@ sO
)ng l*i ton & ;T&L S $c tr vT phNn .S cho trang &i &V 9ua.
7rang ca &*n cF ch:a cc )K liu cNn phi $c t*o ceng vi cc )K liu hin hnh.
l<' l trng h$p Di vi t%. kiI. sn phx.8 nhng kh4ng phi l trng h$p Di vi
)anh .c sn phx..
7rong cc trng h$p n'8 &*n cF th sO )ng .t )*ng caching linh ho*t hMn. L*n cF th sO
)ng )atazcaching gs@ $c .4 t trong .c [.Z`h lu giK .t Di t$ng c th. no!c &*n
cF th sO )ng frag.(ntzcaching lu giK .t phNn ca trang. l sO )ng frag.(ntz
caching8 &*n cNn t*o .t iu ki. ngi )eng ch:a tt c ni )ung cF th $c lu giK v
th>. chJ thi OutputCache vo iu ki. ngi )eng. whi F8 &*n cF th sO )ng iu ki.
ngi )eng n' trong .t trang (&. RhNn .S cho trang (& v3n s@ ch*'8 nhng phNn iu
ki. ngi )eng cF th $c lu giK.
15'
15' A(ng l i d li u v i /01?N@T A(ng l i d li u v i /01?N@T Cache Cache
#eA JwA fg hUAB JcJ>@AB, A>VAB FeA s>TAB Q>t YVZ B@? QX\A FI OIQ QHcAB Dl A^
J>~c OIQ fK O} JwA d>R@ J>e] >X_J OIQ fK AI@ hZAB JwA d>R@ LVWJ QeX LIAB(
Sg hUAB d>V[AB Q>~J Cac.e.Ensert Lt YVZ B@? FPQ s LK@ QVWAB A\X DE@ J>aA>
fSJ> >jQ >@qZ YnJ QHVWQ isli&ing e8pirationk >X_J >jQ >@qZ YnJ QZ]qQ LK@ ia9sol%te
e8pirationk(
lDi t$ng Cache cho phXp &*n lu giK hNu nh &t k Di t$ng .NET no &5ng .t khFa
chu#i ceng vi ch2nh sch hIt hiu l=c )o &*n inh nghqa. >*P.NET )u' tr% cach( .t cch t=
ng8 g &V cc Di t$ng khi chGng hIt hiu l=c ho!c khi c*n & nh.
PF hai kiu ch2nh sch hIt hiu l=c &*n cF th sO )ng khi lu giK )K liu trong cach(. nIt
hiu l=c tu't Di ga48oDu/e e2K"ra/"onh l. .t hiu l=c cc it(. S $c lu giK sau .t
khong thi gian cD inh8 gNn giDng vi outputzcaching. nIt hiu l=c tu't Di l cch tiIp
c6n tDt nht nIu &*n .uDn lu giK cc th4ng tin cNn $c l. tMi inh k gnh )anh .c sn
phN.h.
// Lu gi ObjectToCache trong 10 pht (vi kha l "Catalog").
// TimeSpan.Zero cho bit "khng su dng sliding expiration".
Cache.Insert("Catalog", ObjectToCache, null,
DateTime.Now.AddMinutes(10), TimeSpan.Zero);
nIt hiu l=c tr$t g8D"A"ng e2K"ra/"onh g &V cc Di t$ng sau .t khong thi gian kh4ng
)eng In. 7rong trng h$p n'8 .#i khi Di t$ng $c tru' ;ut8 thi gian sDng ca nF s@
$c r(s(t. nIt hiu l=c tr$t l. vic tDt khi &*n cF cc th4ng tin lu4n cF hiu l=c nhng
lu4n kh4ng $c sO )ng gnh )K liu thuc v 9u kh:h. 7h4ng tin n' kh4ng cNn $c l.
tMi8 nhng kh4ng n>n giK nF trong cach( nIu nF kh4ng $c sO )ng.
277
Chng 7: -.P'NQT }~ Oz Poao
// Lu gi ObjectToCache nu n doc su dng t nht
// mt ln mi 10 pht (vi kha l "Catalog").
// DateTime.MaxValue cho bit "khng su dng absolute expiration".
Cache.Insert("Catalog", ObjectToCache, null,
DateTime.MaxValue, TimeSpan.FromMinutes(10));
L*n cF th l' cc it(. tQ cach( &5ng t>n khFa. 7u' nhi>n8 &*n phi lu4n ki. tra trc ;(.
it(. cF ttn t*i ha' kh4ng v rti Xp nF thnh kiu nh .ong .uDn.
whi th>. cc Di t$ng vo cach(8 cch tDt nht l t*o .t h. c l6p cF th ti t*o Di
t$ng khi cNn. u2 )8 nIu ang lu giK .t DataSet8 &*n cNn t*o .t h. ki. tra cach( v
chJ tru' vn l*i cM sC )K liu khi kh4ng t%. th' DataSet. liu n' cho phXp &*n trnh i
phNn ;O lB tDn nhiu thi gian nhtEtru' vn cM sC )K liuEtrong khi v3n cho phXp .S lnh
ca &*n tha' si hin thi gch~ng h*n8 ngi )eng '>u cNu s/p th: t=h ho!c th=c hin cc hnh
ng khc.
u2 ) )i <' s@ hin thi .t &ng ch:a th4ng tin v khch hng $c l' tQ .t DataSet.
RhNn th(n chDt l lp CustomerDatabase8 Fng gFi cc ch:c nvng cNn thiIt s )K liu vo
DataSet v 9un lB cach(. u% lp n' kh4ng thQa kI tQ Page n>n nF cNn sO )ng thuc t2nh
tqnh HttpContext.Current l' tha. chiIu In Di t$ng Cache.
using System;
using System.Data;
using System.Web;
using System.Configuration;
using System.Diagnostics;
using System.Web.Caching;
using System.Data.SqlClient;
public class CustomerDatabase {
private string connectionString;
// Ly tham chiu dn di tong Cache.
private Cache cache = HttpContext.Current.Cache;
public CustomerDatabase() {

// Ly chui kt ni tu file Web.config.
connectionString =
ConfigurationSettings.AppSettings["NorthwindCon"];
}
278
Chng 7: -.P'NQT }~ Oz Poao
public DataSet GetCustomers() {

DataSet customersDS;
// Kim tra item c nm trong cache hay khng.
if (cache["Customers"] == null) {

// Ly DataSet tu c so d liu.
customersDS = GetCustomersFromDatabase();

// Lu gi item trong cache
// cung vi sliding expiration l 60 giy.
cache.Insert("Customers", customersDS, null,
DateTime.MaxValue, TimeSpan.FromSeconds(60));
// Hin th thng dip trong cua s Debug.
Debug.WriteLine("DataSet created from data source.");
}else {

// Hin th thng dip trong cua s Debug.
Debug.WriteLine("DataSet retrieved from cache.");

// Ly item.
customersDS = (DataSet)cache["Customers"];
}
// Tra v DataSet.
return customersDS;
}
private DataSet GetCustomersFromDatabase() {

// Tao DataSet.
DataSet customersDS = new DataSet();
279
Chng 7: -.P'NQT }~ Oz Poao

// d liu vo DataSet.
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("SELECT FROM Customers", con);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
try {
con.Open();
adapter.Fill(customersDS, "Customers");
}catch {
customersDS = null;
}
finally {
con.Close();
}
Lc kI tiIp l t*o .t trang (& sO )ng lp CustomerDatabase. 7rang (& )i <' gt.
.t DataGrid v .t Button. "#i khi ngi )eng nh/p vo Button8 trang s@ g0i phMng th:c
CustomerDatabase.GetCustomers. 7h4ng tin $c l' tQ cach( nIu v3n ckn hiu l=c ho!c
$c tru' vn l*i nIu ad gi<' S tr4i 9ua. L*n cF th nh6n &iIt DataSet cF $c l' tQ cach(
ha' kh4ng &5ng cch nh%n vo kIt ;ut trong cOa ss Ee4ug.
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;
// (Bo qua phn m designer.)
private void cmdGetData_Click(object sender, System.EventArgs e){
CustomerDatabase custDB = new CustomerDatabase();
DataGrid1.DataSource = custDB.GetCustomers();
DataGrid1.DataBind();
}
280
Chng 7: -.P'NQT }~ Oz Poao
}
16' 16' .7ch ho t vi c g r i ng d ng We! " .7ch ho t vi c g r i ng d ng We! "
3>@ Q>nJ >@qA B HK@ OIQ ~AB hUAB *e9 DE@ $is%al St%&io .NET, FeA A>NA LVWJ
Yx@ 7na9le to start &e9%gging on the *e9 ser"er(
#RX LRO /nternet /nformation Ser"ices i//Sk LVWJ J\@ L_Q LAB, //S LVWJ J\@ L_Q
QHVEJ Microsoft .NET Framework, D\ /ntegrate& *in&ows a%thentication LVWJ
saJ> >XeQ J>X Q>V OUJ J>~c ~AB hUAB *e9(
0nh 7'11 Li Unable to start debugging on the Web server
y#i +Qna4De /o 8/ar/ Ae4ugg"ng on /he @e4 8erBer- cho &iIt r5ng V"8uaD */uA"o .NET cF th
&i>n )ich :ng )ng @e4 nhng kh4ng th th=c thi nF C chI g rDi gAe4ug moAeh. un
n' pht sinh v% nhiu lB )o\
<<* cha $c ci !t ho!c ci !t kh4ng Gng.
Hgi )eng ang ch*' V"8uaD */uA"o .NET kh4ng phi l thnh vi>n ca nhF.
Ee4ugger Q8er8 tr>n (&zs(rv(r.
Hgi )eng ang ch*' V"8uaD */uA"o .NET kh4ng cF 9u'n gKerm"88"onh g rDi tiIn
tr%nh >*P.NET. u2 )8 nIu tiIn tr%nh >*P.NET ang ch*' )i ti khon h thDng cc
&8 ngi )eng phi cF !c 9u'n >Am"n"8/ra/or th% .i cF th g rDi nF.
(&zs(rv(r ang ch*' tr>n phi>n &n @"nAow8 kh4ng h# tr$ g rDi8 nh &")ro8o?/
@"nAow8 NT v @"nAow8 :P ;ome EA"/"on g@"nAow8 20008 @"nAow8 :P Pro?e88"onaD8
@"nAow8 :P *erBer8 v @"nAow8 *erBer 200C u h# tr$ g rDih.
ng )ng @e4 kh4ng cF fil( @e4.)on?"g8 ho!c fil( @e4.)on?"g kh4ng k2ch ho*t g rDi.
L*n ang ch*' V"8uaD */uA"o .NET8 v &*n kh4ng k2ch ho*t <n/egra/eA @"nAow8
au/hen/")a/"on cho th .c o.
Lc Nu ti>n &*n cNn th=c hin khi chxn on lB )o kh4ng th g rDi .t :ng )ng @e4 l
ki. tra vic ci !t <<* tr>n (&zs(rv(r. l th=c hin iu n'8 &*n hS' .C
htt94::@ocB@ho<t:@ocB@<tB?t>B<9 trong tr%nh )u't g@ocB@ho<t l .t &2 )anh cho .' t2nh hin
hnhh. HIu trang thO nghi. n' kh4ng ;ut hin th% cF nghqa l <<* kh4ng $c ci !t ho!c
kh4ng $c k2ch ho*t. L*n c?ng cF th &/t Nu :ng )ng @e4 . kh4ng th=c hin g rDi
&5ng cch ch0n Ee4ug */ar/ @"/hou/ Ee4ugg"ng tQ thanh tr%nh Mn ca V"8uaD */uA"o .NET.
HIu thO nghi. n' thnh c4ng th% cF nghqa l <<* S $c ci !t Gng.
281
Chng 7: -.P'NQT }~ Oz Poao
HIu ci !t <<* sau khi ci !t V"8uaD */uA"o .NET ho!c .NET Framework8 &*n cNn phi sOa
.NET Framework &5ng qa ci !t gDc. l &/t Nu 9u tr%nh n'8 &*n hS' g} lnh sau <' vo
cOa ss )kng lnh gho!c cOa ss =unh8 nIu ang )eng phi>n &n UuU ca V"8uaD */uA"o .NET\
DVD Drive:wcudotNetFrameworkdotnetfx.exe /t:c:temp
/c:"msiexec.exe /fvecms c:tempnetfx.msi"
HIu ang )eng phi>n &n PU ca V"8uaD */uA"o .NET8 &*n hS' sO )ng )kng lnh sau <'
ceng vi qa @"nAow8 ComKonen/ QKAa/e\
CD Drive:dotNetFrameworkdotnetfx.exe /t:c:temp
/c:"msiexec.exe /fvecms c:tempnetfx.msi"
HIu <<* $c ci !t Gng8 &c kI tiIp l ;c nh6n t2nh h$p l ca fil( @e4.)on?"g. il(
@e4.)on?"g phi cF cu trGc nh sau\
configuration
system.web
Ocompilation de*ault+anguageB1c41
debugB1true1 P
!-- Bo qua cc thit lp khc. --
/system.web
/configuration
7h(o .!c inh8 V"8uaD */uA"o .NET th>. thj compilation vo fil( @e4.)on?"g g$c t*o t=
ngh vi !c t2nh debug $c thiIt l6p l true.
Lc kI tiIp l ki. tra cu h%nh <<*. un s@ ;' ra nIu &*n 9u>n t*o th .c o cho :ng
)ng ho!c nIu &*n ch*' .t :ng )ng sau khi S g &V ho!c chJnh sOa th .c o ca nF. l
kh/c phc cc vn n'8 &*n hS' hiu chJnh cc thiIt l6p cho th .c o trong <<* &anager
&5ng cch ch0n Con/roD PaneD >Am"n"8/ra/"Be TooD8 <n/erne/ <n?orma/"on *erB")e8 tQ */ar/
&enu. L*n cNn ki. tra ;(. th .c o S ttn t*i v $c cu h%nh l .t :ng )ng @e4
ha' cha g&*n cF th ;(. cc thiIt l6p cho th .c o &5ng cch nh/p phi vo nF v ch0n
ProKer/"e8h. u2 )8 th .c o F&*/o)k8L g;(. h%nh [.Z]h S ttn t*i nhng cha $c cu
h%nh l .t :ng )ng @e4. l gii 9u'It vn n'8 &*n chJ cNn nh/p vo nGt Crea/e trong
phNn >KKD")a/"on *e//"ng8.
282
Chng 7: -.P'NQT }~ Oz Poao
0nh 7'12 Mt th muc o khng phi l mt ng dung Web
"t vn khc v cu h%nh <<* cF th ;' ra trong V"8uaD */uA"o .NET l kh4ng th=c hin
;c th=c. V"8uaD */uA"o .NET tru' ;ut (&zs(rv(r cc & &5ng <n/egra/eA @"nAow8
au/hen/")a/"on8 nga' c khi &*n S k2ch ho*t >nonymou8 au/hen/")a/"on cho th .c o. liu
n' nghqa l th .c o ca &*n phi cho phXp c >nonymou8 au/hen/")a/"on v <n/egra/eA
@"nAow8 au/hen/")a/"on. l cho phXp c hai phMng php n'8 &*n cNn th=c hin cc &c
sau <'\
Z. 7rong <<* &anager8 nh/p phi vo th .c o cho :ng )ng ca &*n v ch0n
ProKer/"e8 g&*n cF th cu h%nh kiu ;c th=c cho tt c cc th .c nIu nh/p phi vo
th .c @e4 *"/e8 v ch0n ProKer/"e8h.
]. Ph0n thj E"re)/ory *e)ur"/y g;(. h%nh [.Z^h.
^. 7rong phNn >nonymou8 a))e88 anA au/hen/")a/"on )on/roD8 nh/p nGt EA"/.
_. 7rong hp tho*i >u/hen/")a/"on &e/hoA88 &>n )i >u/hen/")a/eA a))e888 ch0n
<n/egra/eA @"nAow8 au/hen/")a/"on g;(. h%nh [.Z_h.
`. Hh/p F'.
283
Chng 7: -.P'NQT }~ Oz Poao
0nh 7'13 irectory Security
0nh 7'14 Kch hoat ntegrated Windows authentication
284
Chng 7: -.P'NQT }~ Oz Poao
17'
17' Thay i )uy n # c % cho m# /01?N@T Thay i )uy n # c % cho m# /01?N@T
#eA JwA JPd J>X d>wA O} Jbc QHcAB F >X_J hMJ> DU *e9 Jbc FeA A>@GZ L_J
Z]GA *in&ows >[A iA>V JSJ Z]GA J>X @Y, Q>@jQ YNd >egistr:, J[ f h? Y@qZ, D\
JSJ Q\@ ABZ]CA s>SJk, >X_J FeA JwA >eA J>j JSJ L_J Z]GA >@qA J^(
#eA J^ Q>t BSA QHnJ Q@jd JSJ L_J Z]GA J>X Q\@ s>XRA ;S,NET JUJ FI, >X_J J^
Q>t JPZ >lA> O} ;S,.NET Jbc FeA Lt fg hUAB OIQ Q\@ s>XRA >X\A QX\A s>SJ
F`AB JSJ> J>A> fgc Q> OprocessModelP QHXAB @Y machine.config( #eA JAB J^
Q>t fg hUAB s Q>ZNQ B@R A>NA iimpersonationk Lt OIQ LXeA O} Q>nJ Q>@ DE@ JSJ
Z]GA Jbc ABVo@ hrAB L} LVWJ //S vSJ Q>nJ(
"S >*P.NET kh4ng ch*' )i ti khon ngi )eng S $c <<* ;c th=c ho!c ti khon n!c
)anh <Q*=ce*erBerNamef. "t phNn lB )o l ti khon n' thng kh4ng cF !c 9u'n
Di vi .S >*P.NET gcF th t*o v ;Fa cc fil( t*. 9un lB tiIn tr%nh &i>n )ich trang (&h.
7h(o .!c inh8 cc trang >*P.NET ch*' &5ng ti khon >*PNET cc &8 ti khon n' cF
.t t6p cc !c 9u'n &i gii h*n. HIu cNn .S >*P.NET ca &*n th=c hin iu g% F kh4ng
$c phXp th(o .!c inh Di vi ti khon cc & gch~ng h*n8 ghi ra s qa c:ng tr>n s(rv(rh8
&*n cF th cp cc 9u'n n' cho tiIn tr%nh >*PNET. L*n c?ng cF th tha' si thiIt l6p n'
&5ng cch .C fil( ma)h"ne.)on?"g gn5. trong th .c g@"nAow8 A"re)/oryhH&")ro8o?/.NETH
FrameworkHgBer8"onhHCFNF<6Hh v chJnh sOa thj processModel.
0nh 7'15 ile machine.config
L*n cF th thiIt l6p cc !c t2nh userName v password cho .t ngi )eng &t k8 ho!c &*n
cF th a vo sO )ng tiIn tr%nh >*PNET cc & gthiIt l6p userName l machine v password
l AutoGenerateh ho!c ti khon h thDng cc & gthiIt l6p userName l SYSTEM v password l
AutoGenerateh. u% ti khon h thDng cc & cF cF N' 9u'n tr>n .' t2nh n>n Qng &ao
gi sO )ng ti khon n' ngo*i trQ .c 2ch thO nghi.. Pc thiIt l6p v ti khon >*P.NET
l ton cc v tt c cc :ng )ng @e4 s@ chia sj ti khon . &*n chJ inh.
285
Chng 7: -.P'NQT }~ Oz Poao
L*n c?ng cF th tha' si ti khon )eng th=c thi cc :ng )ng ho!c o*n .S no F &5ng
k thu6t gi nh6n. u2 )8 cu h%nh .t :ng )ng @e4 ch*' )i .t ti khon ngi )eng
khc8 &*n cNn th>. thj identity vo fil( @e4.)on?"g nh sau\
configuration
system.web
!-- Bo qua cc thit lp khc. --
Oidentit! impersonateB1true1 nameB1domain,user1 pass%ordB1p%d1/P
/system.web
/configuration
L*n c?ng cF th chJ thi :ng )ng @e4 sO )ng i)(ntit' S $c <<* ;c th=c8 F s@ l ti
khon n!c )anh <Q*=ce*erBerNamef nIu &*n kh4ng sO )ng @"nAow8 au/hen/")a/"on gS
$c tho lu6n trong .c [.bh. L*n chJ cNn th>. thj identity . kh4ng phi th>. &t c:
th4ng tin ;c th=c no\
identity impersonate="true"/
Hh r5ng8 Di vi kiu gi nh6n n'8 ti khon ngi )eng s@ '>u cNu tru' ;ut 0c,ghi In
th .c TemKorary >*P.NET F"De8 gnMi lu trK cc fil( >*P.NET S $c &i>n )ichE$c
inh vi t*i He@"nAow8E"re)/oryfH&")ro8o?/.NETHFrameworkH eBer8"onfHTemKorary >*P.NET
F"De8h.
PuDi ceng8 &*n c?ng cF th sO )ng k thu6t gi nh6n &5ng .S lnh gvn n' s@ $c .4
t chi tiIt trong .c Z^.Z`h. 7u' v6'8 v2 ) )i <' s@ l. vic ceng vi @"nAow8
au/hen/")a/"on. HIu <<* S ;c th=c ngi )eng g$c .4 t trong .c [.bh8 i)(ntit' F s@
$c thQa nh6n khi sO )ng phMng th:c WindowsIdentity.Impersonate. l sO )ng o*n
.S n'8 &*n phi nh6p kh4ng gian t>n System.Security.Principal.
if (User.GetType() == typeof(WindowsPrincipal)) {
WindowsIdentity id = (WindowsIdentity)User.Identity;
WindowsImpersonationContext impersonate = id.Impersonate();
// (Thc hin cc tc v vi ID ny.)
// Tra lai ID.
impersonate.Undo();
} else {
// Ngi dung khng doc xc thc.
// Nm li hoac thc hin cc bc khc.
}
286
Chng 7: -.P'NQT }~ Oz Poao
8
287
Ch01n2 a4U HbAM A 5HNN* TI(NM VQ IN N
288
289
Chng 8: $ haE a shng `innE }~ in n
t h0a8 vi)(o8 au)io8 v in n l nhKng )u hiu ti>u chuxn ca .t cli(nt a nvng
tru'n thDng tr>n h iu hnh &")ro8o?/ @"nAow8. whi tiIn In a phMng tin8
&")ro8o?/ .NET Framework h# tr$ cho vi !c t2nh n'8 trong khi &V 9ua cc !c
t2nh khc. u2 )8 &*n s@ t%. th' .t t6p ph:c t*p cc c4ng c )eng th=c hin vic v@
trong kh4ng gian hai chiu v vic in )=aztr>nzs=zkin vi 6E< v cc kiu thuc kh4ng
gian t>n System.Drawing. Pc lp n' h# tr$ cc h. 6raKh")8 EeB")e <n/er?a)e g6E<h
ngu'>n sinh trong @"nAow8 >P<T khiIn cho vic v@ cc h%nh )*ng ph:c t*p8 l. vic vi t0a
v phXp &iIn h%nh8 v ;O lB nh )r )ng hMn. "!t khc8 nIu &*n .uDn chMi .t fil( au)io8
hin thi .t fil( vi)(o8 ho!c l' th4ng tin v cc tc v in hin thi8 &*n s@ cNn phi v$t ra
ngoi .NET Framework.
l
Pc .c trong chMng n' tr%nh &' cch sO )ng cc !c t2nh ni t*i .NET v cc th vin
@"nC2 ngu'>n sinh th4ng 9ua PX<nBoke ho!c CF& <n/eroK. "t vi k thu6t s@ $c c6p\
7%. v sO )ng cc font S $c ci !t g.c b.Zh8 v@ h%nh cun $c g.c b.`h v
thu.&nail g.c b.bh8 c?ng nh th=c hin chp .n h%nh &5ng @"nC2 >P< g.c b.ah.
y. vic vi cc iu ki. te' &iIn on(rz)ran g.c b.^ v b._h v ;O lB cc Di
t$ng t h0a tr>n .n h%nh g.c b.] v b.[h.
PhMi cc fil( au)io v vi)(o g&ao gt. @>V8 &PC8 v &PE6h &5ng th vin uar/O cF
trong @"nAow8 &eA"a PDayer g.c b.c8 b.Zd8 v b.ZZh.
n cc vvn &n Mn gin v ph:c t*p g.c b.Z^ v b.Z_h8 in t(;t vi rapping g.c
b.Z`h8 t*o print pr(vi( g.c b.Zah8 v l' th4ng tin v .' in g.c b.Z]h v hng $i
in &5ng @&< g.c b.Z[h.
1' 1' T&m t t c cc $ont # c ci t T&m t t c cc $ont # c ci t
#eA JwA YP] hcA> fSJ> QPQ JR JSJ XAQ L} LVWJ J\@ L_Q QHCA OS] QaA> >@qA >\A>(
TeX LK@ QVWAB $!stem.-ra%ing.)ext.Enstalled"ontCollection, QNd >Wd A\] J>~c
JSJ LK@ QVWAB "ont"amil! OT QR QPQ JR JSJ XAQ L} LVWJ J\@ L_Q(
yp InstalledFontCollection cho phXp &*n l' th4ng tin v cc font S $c ci !t. lo*n
.S )i <' )u't 9ua t6p h$p font vQa $c t*oT .#i khi t%. th' .t font8 nF s@ t*o .t
Label .i hin thi t>n font vi )in .*o cho trc gk2ch thc Z_ pointh. Label $c th>.
vo .t Panel cun $c8 cho phXp ngi )eng cun 9ua )anh sch cc font hin cF.
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Text;
public class ListFonts : System.Windows.Forms.Form {
private System.Windows.Forms.Panel pnlFonts;
290
Chng 8: $ haE a shng `innE }~ in n
// (Bo qua phn m designer.)
private void ListFonts_Load(object sender, System.EventArgs e) {

// Tao tp hop font.
InstalledFontCollection fontFamilies =
new InstalledFontCollection();

// Duyt qua tt ca cc font.
int offset = 10;
foreach (FontFamily family in fontFamilies.Families) {

try {

// Tao mt Label d hin th text (vit o font ny).
Label fontLabel = new Label();
fontLabel.Text = family.Name;
fontLabel.Font = new Font(family, 14);
fontLabel.Left = 10;
fontLabel.Width = pnlFonts.Width;
fontLabel.Top = offset;
// Thm Label vo Panel cun doc.
pnlFonts.Controls.Add(fontLabel);
offset += 30;

}catch {

// Li s xay ra nu font doc chon khng
// h tro normal style (mac dnh doc su dng khi
// tao di tong Font). Vn d ny c th
// doc bo qua m khng sao ca.
}
}
}
}
291
Chng 8: $ haE a shng `innE }~ in n
0nh 8'1 anh sch cc font d doc ci dt
2'
2' Th c hi n Ghit testingH v i sha%e Th c hi n Ghit testingH v i sha%e
#eA JwA A>NA F@jQ ABVo@ hrAB J^ A>{d D\X QHXAB OIQ f>cd >c] s>TAB(
3@tO QHc L@tO O\ ABVo@ hrAB L} A>{d D\X F`AB JSJ d>V[AB Q>~J A>V
&ectangle.Contains D\ &egion.Es>isible iQ>ZIJ s>TAB B@cA QCA $!stem.-ra%ingk,
>X_J 7rap.ics/at..Es>isible iQ>ZIJ s>TAB B@cA QCA $!stem.-ra%ing.-ra%ingA-k,
Qr] D\X s@tZ Jbc f>cd(
7h4ng thng8 nIu sO )ng 6E<S v@ shap( tr>n for.8 cF th &*n s@ cNn ;c inh ;(. khi
no ngi )eng nh/p vo trong .t shap( cho trc. .NET Framework cung cp &a phMng
th:c cF th th=c hin c4ng vic n'\
RhMng th:c Rectangle.ContainsEnh6n vo .t i. v tr v true nIu i. n'
n5. &>n trong h%nh chK nh6t cho trc. 7rong nhiu trng h$p8 &*n cF th l' $c
h%nh chK nh6t Di vi .t kiu shap( khc. u2 )8 &*n cF th sO )ng Image.GetBounds
l' h%nh chK nh6t .4 t ng &i>n ca shap(. Pu trGc Rectangle l thnh vi>n ca
kh4ng gian t>n System.Drawing.
RhMng th:c GraphicsPath.IsVisibleEnh6n vo .t i. v tr v true nIu i.
n' n5. &>n trong .t veng $c inh nghqa &Ci GraphicsPath khXp k2n. u% .t
GraphicsPath cF th ch:a nhiu lin(8 shap(8 v figur( n>n cch n' rt hKu 2ch nIu &*n
.uDn ki. tra .t i. cF n5. &>n trong .t veng kh4ng phi h%nh chK nh6t ha'
kh4ng. yp GraphicsPath l .t thnh vi>n ca kh4ng gian t>n
System.Drawing.Drawing2D.
RhMng th:c Region.IsVisibleEnh6n vo .t i. v tr v true nIu i. n' n5.
&>n trong .t veng $c inh nghqa &Ci Region. P?ng giDng nh GraphicsPath8 Region
cF th .4 t .t shap( kh4ng phi h%nh chK nh6t. Region l .t thnh vi>n ca kh4ng
gian t>n System.Drawing.
292
Chng 8: $ haE a shng `innE }~ in n
u2 ) sau <' s@ t*o .t Rectangle v .t GraphicsPath. 7h(o .!c inh8 hai shap( n' cF
nn .u ;anh nh*t. 7u' nhi>n8 phMng th:c th lB s= kin Form.MouseMove s@ ki. tra ;(.
con trV chut cF n5. trong .t trong hai shap( n' ha' kh4ng8 v c6p nh6t .u nn thnh
htng tMi nIu con trV C F.
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
public class HitTesting : System.Windows.Forms.Form {
// (Bo qua phn m designer.)
// nh ngha cc shape s doc su dng.
private GraphicsPath path;
private Rectangle rectangle;
// nh ngha cc c d theo vt con tro chut.
private bool inPath = false;
private bool inRectangle = false;
// nh ngha cc bt v.
Brush highlightBrush = Brushes.HotPink;
Brush defaultBrush = Brushes.LightBlue;
private void HitTesting_Load(object sender, System.EventArgs e) {

// Tao cc shape.
path = new GraphicsPath();
path.AddEllipse(10, 10, 100, 60);
path.AddCurve(new Point[] {new Point(50, 50),
new Point(10,33), new Point(80,43)});
path.AddLine(50, 120, 250, 80);
path.AddLine(120, 40, 110, 50);
path.CloseFigure();
293
Chng 8: $ haE a shng `innE }~ in n
rectangle = new Rectangle(100, 10, 220, 120);
}
private void HitTesting_Paint(object sender,
System.Windows.Forms.PaintEventArgs e) {

Graphics g = e.Graphics;
// V shape da trn phn chon hin tai.
if (inPath) {

g.FillPath(highlightBrush, path);
g.FillRectangle(defaultBrush, rectangle);
}else if (inRectangle) {

g.FillRectangle(highlightBrush, rectangle);
g.FillPath(defaultBrush, path);
}else {

g.FillPath(defaultBrush, path);
g.FillRectangle(defaultBrush, rectangle);
}
g.DrawPath(Pens.Black, path);
g.DrawRectangle(Pens.Black, rectangle);
}
private void HitTesting_MouseMove(object sender,
System.Windows.Forms.MouseEventArgs e) {

Graphics g = this.CreateGraphics();
// Thc hin "hit testing" vi hnh ch nht.
if (rectangle.Contains(e.X, e.Y)) {

if (!inRectangle) {
294
Chng 8: $ haE a shng `innE }~ in n

inRectangle = true;
// i mu nn hnh ch nht.
g.FillRectangle(highlightBrush, rectangle);
g.DrawRectangle(Pens.Black, rectangle);
}
}else if (inRectangle) {

inRectangle = false;
// Phc hi hnh ch nht.
g.FillRectangle(defaultBrush, rectangle);
g.DrawRectangle(Pens.Black, rectangle);
}
// Thc hin "hit testing" vi path.
if (path.IsVisible(e.X, e.Y)) {

if (!inPath) {

inPath = true;
// i mu nn path.
g.FillPath(highlightBrush, path);
g.DrawPath(Pens.Black, path);
}
}else if (inPath) {

inPath = false;
// Phc hi path.
g.FillPath(defaultBrush, path);
295
Chng 8: $ haE a shng `innE }~ in n
g.DrawPath(Pens.Black, path);
}
g.Dispose();
}
}
0nh 8'2 Thuc hin hit testing vi di tong ectangle v GraphicsPath
PhG B r5ng ho*t ng n' )irn ra tr=c tiIp &>n trong phMng th:c th lB s= kin MouseMove.
uic v@ chJ $c th=c hin nIu phNn ch0n hin t*i tha' si. lDi vi .t o*n .S Mn gin8
&*n cF th l. .t hiu l=c ton & for. .#i khi con trV chut )i chu'n vo trong ho!c ra
khVi .t veng v th lB tt c vic v@ trong phMng th:c th lB s= kin Form.Paint8 nhng
iu n' )3n In vic phi v@ nhiu hMn v t*o n>n hin t$ng rung h%nh g?D")kerh khi ton &
for. $c v@ l*i.
3' 3' T o $orm c' h&nh d ng t(y !i n T o $orm c' h&nh d ng t(y !i n
#eA JwA QeX OIQ XHO >X_J L@GZ s@tO s>TAB d>R@ >lA> J>? A>NQ(
TeX OIQ LK@ QVWAB $!stem.-ra%ing.&egion J^ >lA> heAB A>V FeA OZKA, D\ BSA
A^ D\X Q>ZIJ QaA> "orm.&egion >X_J Control.&egion(
l t*o .t for. ho!c iu ki. kh4ng phi h%nh chK nh6t8 trc hIt &*n cNn inh nghqa h%nh
)*ng .%nh .uDn. Pch tiIp c6n )r nht l sO )ng Di t$ng
System.Drawing.Drawing2D.GraphicsPath8 nF cF th iu tiIt &t k s= kIt h$p no ca cc
h%nh (llips(8 chK nh6t8 v cung khXp k2n. L*n cF th th>. cc shap( vo .t Di t$ng
GraphicsPath &5ng cc phMng th:c nh AddEllipse8 AddRectangle8 v AddClosedCurve. "t
khi S hon tt vic inh nghqa h%nh )*ng nh .ong .uDn8 &*n cF th t*o .t Di t$ng
Region tQ GraphicsPath n'EchJ cNn tr%nh ra GraphicsPath trong phMng th:c khCi )=ng ca
296
Chng 8: $ haE a shng `innE }~ in n
lp Region. PuDi ceng8 &*n cF th gn Region vo thuc t2nh Form.Region ho!c
Control.Region.
u2 ) )i <' tr%nh &' cch t*o .t for. cF h%nh )ng &t thng g;(. h%nh b.^h &5ng hai
cung trkn ghai cung n' $c chu'n thnh .t figur( khXp k2n &5ng phMng th:c
GraphicsPath.CloseAllFiguresh.
0nh 8'3 orm khng phi hnh ch nht
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
public class IrregularForm : System.Windows.Forms.Form {
private System.Windows.Forms.Button cmdClose;
private System.Windows.Forms.Label label1;
// (Bo qua phn m designer.)
private void IrregularForm_Load(object sender, System.EventArgs e) {

GraphicsPath path = new GraphicsPath();
Point[] pointsA = new Point[] {new Point(0, 0),
new Point(40, 60), new Point(this.Width - 100, 10)};
path.AddCurve(pointsA);
297
Chng 8: $ haE a shng `innE }~ in n
Point[] pointsB = new Point[]
{new Point(this.Width - 40, this.Height - 60),
new Point(this.Width, this.Height),
new Point(10, this.Height)};
path.AddCurve(pointsB);
path.CloseAllFigures();
this.Region = new Region(path);
}
private void cmdClose_Click(object sender, System.EventArgs e) {

this.Close();
}
}
lDi vi v2 ) t*o iu ki. kh4ng phi h%nh chK nh6t8 &*n hS' tha. kho .c b._.
4' 4' T o i u "i m c' h&nh d ng t(y !i n T o i u "i m c' h&nh d ng t(y !i n
#eA JwA QeX OIQ f>cd O\ ABVo@ hrAB J^ Q>t Q>cX QSJ DE@ A^ QHCA XHO A>V sX
HC, Q>c] L@ saJ> Q>VEJ((((
TeX OIQ L@GZ s@tO Qr] F@jA, D\ J>d L dc@AQ@AB YXB@J Lt Dm f>cd( GSA f>cd
Jbc FeA D\X Q>ZIJ QaA> Control.&egion( 3j L^, FeA J^ Q>t fg hUAB &egion A\] Lt
Q>nJ >@qA >@Q QfQ@AB(
HIu .uDn t*o .t giao )in ngi )eng ph:c t*p kIt h$p nhiu phNn tO $c v@ te' &iIn8 &*n
cNn cF phMng cch th(o vIt cc phNn tO n' v cho phXp ngi )eng tMng tc vi chGng.
Pch tiIp c6n )r nht trong .NET l t*o .t iu ki. chu'>n &it &5ng cch )3n ;ut .t
lp tQ System.Windows.Forms.Control. wI F8 &*n cF th te' &iIn phMng cch . iu ki.
n' $c v@ )=a th(o t6p cc s= kin cM &n ca nF.
liu ki. $c tr%nh &' )i <' .4 t .t h%nh (llips( Mn gin tr>n for.. 7t c cc iu
ki. u $c li>n h$p vi .t veng chK nh6t tr>n for.8 )o F iu ki. EllipseShape s@
t*o .t (llips( l/p N' cc ng &i>n n' g$c cp th4ng 9ua thuc t2nh
Control.ClientRectangleh. "t khi shap( S $c t*o8 thuc t2nh Control.Region $c thiIt
l6p )=a th(o &i>n tr>n (llips(. liu n' &o . cc s= kin nh MouseMove8 MouseDown8
Click... s@ ;' ra chJ khi chut C tr>n (llips(8 ch: kh4ng phi ton & h%nh chK nh6t.
Ui <' l phNn .S N' ca lp EllipseShape\
using System;
using System.Windows.Forms;
using System.Drawing;
298
Chng 8: $ haE a shng `innE }~ in n
using System.Drawing.Drawing2D;
public class EllipseShape : System.Windows.Forms.Control {
private GraphicsPath path = null;
private void RefreshPath() {

// Tao GraphicsPath cho shape v p dng n vo
// diu kim bng cch thit lp thuc tnh Region.
path = new GraphicsPath();
path.AddEllipse(this.ClientRectangle);
this.Region = new Region(path);
}
protected override void OnResize(System.EventArgs e) {

base.OnResize(e);
RefreshPath();
this.Invalidate();
}
protected override void OnPaint
(System.Windows.Forms.PaintEventArgs e) {

base.OnPaint(e);
if (path != null) {

e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.FillPath(new SolidBrush(this.BackColor), path);
e.Graphics.DrawPath(new Pen(this.ForeColor, 4), path);
}
}
}
L*n cF th inh nghqa iu ki. EllipseShape trong .t CDa88 L"4rary >88em4Dy c l6p
nF cF th $c th>. vo hp c4ng c ca &")ro8o?/ V"8uaD */uA"o .NET v $c sO )ng lGc
299
Chng 8: $ haE a shng `innE }~ in n
thiIt kI. 7u' nhi>n8 nga' c kh4ng th=c hin &c n'8 c?ng )r )ng t*o $c .t :ng )ng
thO nghi. Mn gin. u2 ) )i <' t*o hai (llips( v cho phXp ngi )eng kXo r> c hai
vkng 9uanh for. &5ng cch giK chut ;uDng v )i chu'n con trV.
0nh 8'4 Ko r cc diu kim c hnh dang ty bin trn form
public class SpriteTest : System.Windows.Forms.Form {
// (Bo qua phn m designer.)
// Cc c dung d theo vt chut khi ch d ko r doc kch hoat.
private bool isDraggingA = false;
private bool isDraggingB = false;
// Cc diu kim c hnh dang ellipse.
private EllipseShape ellipseA, ellipseB;
private void SpriteTest_Load(object sender, System.EventArgs e) {

// Tao v cu hnh ca hai ellipse.
ellipseA = new EllipseShape();
ellipseA.Width = ellipseA.Height = 100;
ellipseA.Top = ellipseA.Left = 30;
ellipseA.BackColor = Color.Red;
this.Controls.Add(ellipseA);
ellipseB = new EllipseShape();
ellipseB.Width = ellipseB.Height = 100;
ellipseB.Top = ellipseB.Left = 130;
300
Chng 8: $ haE a shng `innE }~ in n
ellipseB.BackColor = Color.Azure;
this.Controls.Add(ellipseB);
// Gn ca hai ellipse vo cung tp cc phng thc
// th l s kin.
ellipseA.MouseDown += new MouseEventHandler(Ellipse_MouseDown);
ellipseA.MouseUp += new MouseEventHandler(Ellipse_MouseUp);
ellipseA.MouseMove += new MouseEventHandler(Ellipse_MouseMove);
ellipseB.MouseDown += new MouseEventHandler(Ellipse_MouseDown);
ellipseB.MouseUp += new MouseEventHandler(Ellipse_MouseUp);
ellipseB.MouseMove += new MouseEventHandler(Ellipse_MouseMove);
}
private void Ellipse_MouseDown(object sender, MouseEventArgs e) {

// Thu ly ellipse gy ra s kin ny.
Control control = (Control)sender;
if (e.Button == MouseButtons.Left) {

control.Tag = new Point(e.X, e.Y);
if (control == ellipseA) {
isDraggingA = true;
}else {
isDraggingB = true;
}
}
}
private void Ellipse_MouseUp(object sender, MouseEventArgs e) {

isDraggingA = false;
isDraggingB = false;
301
Chng 8: $ haE a shng `innE }~ in n
}
private void Ellipse_MouseMove(object sender, MouseEventArgs e) {

// Thu ly ellipse gy ra s kin ny.
Control control = (Control)sender;
if ((isDraggingA && control == ellipseA) ||
(isDraggingB && control == ellipseB)) {

// Ly offset.
Point point = (Point)control.Tag;
// Di chuyn diu kim.
control.Left = e.X + control.Left - point.X;
control.Top = e.Y + control.Top - point.Y;
}
}
}
5' 5' Thm t7nh n4ng cu n cho m t ! c h&nh Thm t7nh n4ng cu n cho m t ! c h&nh
#eA JwA QeX OIQ F~J >lA> J^ Q>t JZIA LVWJ iF~J >lA> J^ AI@ hZAB LIABk(
TeX s>R AAB JZIA Qn LIAB J>X $!stem.indo%s."orms./anel F`AB JSJ> Q>@jQ YNd
/anel.#uto$croll Y\ true D\ L_Q OIQ $!stem.indo%s."orms./icture6ox J>~c AI@
hZAB F~J >lA> D\X QHXAB /anel(
whi &*n thiIt l6p Panel.AutoScroll l true8 nIu iu ki. no F trong Panel v$t 9u
ng &i>n ca nF8 Panel s@ hin thi thanh cun cho phXp ngi )eng chu'n tiIp ni )ung.
Pch n' !c &it tDt Di vi cc &:c h%nh ln. L*n cF th n*p ho!c t*o &:c h%nh trong &
nh8 gn nF vo .t PictureBox gkh4ng cF s= h# tr$ ni t*i no cho vic cun PictureBoxh8
v rti hin thi PictureBox &>n trong Panel. PhJ cF .t vn . &*n cNn nh l phi thiIt l6p
k2ch thc ca PictureBox &5ng vi k2ch thc th6t ca &:c h%nh &*n .uDn hin thi.
u2 ) sau <' t*o .t &:c h%nh .4 t .t vvn &n. L:c h%nh $c t*o tQ .t h%nh &it.ap
trongz&znh8 v nhiu )kng t(;t $c th>. vo &5ng phMng th:c Graphics.DrawString. wI
F8 &:c h%nh $c kIt vi PictureBox gPictureBox n' $c hin thi trong .t Panel cun
$cE;(. h%nh b.`h.
302
Chng 8: $ haE a shng `innE }~ in n
0nh 8'5 Thm tnh nng cun cho bc hnh vi ni dung ty bin
using System;
using System.Windows.Forms;
using System.Drawing;
public class PictureScroll : System.Windows.Forms.Form {
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Panel panel1;
// (Bo qua phn m designer.)
private void PictureScroll_Load(object sender, System.EventArgs e) {

string text = "The quick brown fox jumps over the lazy dog.";
Font font = new Font("Tahoma", 20);
// Tao mt hnh bitmap trong-b-nh.
Bitmap b = new Bitmap(600, 600);
Graphics g = Graphics.FromImage(b);
g.FillRectangle(Brushes.White, new Rectangle(0, 0, b.Width,
b.Height));
// V nhiu dng text ln hnh bitmap.
for (int i=0; i 10; i++) {
303
Chng 8: $ haE a shng `innE }~ in n
g.DrawString(text, font, Brushes.Black, 50, 50 + i60);
}
// Hin th hnh bitmap trong PictureBox.
pictureBox1.BackgroundImage = b;
pictureBox1.Size = b.Size;
}
}
6'
6' Th c hi n ch % mn h&nh Aes"to% Th c hi n ch % mn h&nh Aes"to%
#eA JwA YP] RA> J>Ud Jbc O\A >lA> esktop >@qA Q>o@(
Sg hUAB JSJ Yo@ B@ *in)' ;,/ 7et-es:topindo%, 7et-C, D\ &elease-C QHXAB Q>V
D@qA %ser)'.&ll( NBX\@ Hc, fg hUAB 7etCurrent(bJect QHXAB Q>V D@qA g&i)'.&ll(
.NET Framework kh4ng cung cp lp no th=c hin vic chp ton & .n h%nh gthng $c
c6p l cOa ss Ee8k/oKh. 7u' nhi>n8 &*n cF th tru' ;ut cc !c t2nh n' &5ng cch sO )ng
PX<nBoke vi @"nC2 >P<.
Lc Nu ti>n l t*o .t lp Fng gFi cc h. @"nC2 >P< &*n cNn sO )ng. yp )i <' s@
khai &o cc h. n' v sO )ng chGng trong phMng th:c c4ng khai Capture tr v .t
Di t$ng .NET Image ch:a cOa ss Ee8k/oK\
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class DesktopCapture {
[DllImport("user32.dll")]
private extern static IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
private extern static IntPtr GetDC(IntPtr windowHandle);
[DllImport("gdi32.dll")]
private extern static IntPtr GetCurrentObject(IntPtr hdc,
ushort objectType);
[DllImport("user32.dll")]
private extern static void ReleaseDC( IntPtr hdc );
304
Chng 8: $ haE a shng `innE }~ in n
const int OBJ_BITMAP = ;
public static Bitmap Capture() {

// Ly Device Context cua cua s Desktop.
IntPtr desktopWindow = GetDesktopWindow();
IntPtr desktopDC = GetDC( desktopWindow );
// Ly GDI handle cua bc hnh.
IntPtr desktopBitmap = GetCurrentObject(desktopDC, OBJ_BITMAP);
// Su dng handle d tao di tong .NET Image.
Bitmap desktopImage = Image.FromHbitmap( desktopBitmap );
// Giai phng Device Context v tra v bc hnh.
ReleaseDC(desktopDC);
return desktopImage;
}
}
0nh 8'6 Chup mn hnh esktop
305
Chng 8: $ haE a shng `innE }~ in n
Lc kI tiIp l t*o .t cli(nt cF th sO )ng ch:c nvng n'. or. )i <' g;(. h%nh b.ah s@
hin thi &:c h%nh chp $c trong .t PictureBox gn5. trong .t Panel cun $c8 nh S
$c .4 t trong .c b.`h.
public class ScreenCapture : System.Windows.Forms.Form {
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Panel panel1;
// (Bo qua phn m designer.)
private void cmdCapture_Click(object sender, System.EventArgs e) {

pictureBox1.Image = DesktopCapture.Capture();
pictureBox1.Size = pictureBox1.Image.Size;
}
}
7'
7' 0 d ng Gdou!le !u$$eringH t4ng t c v l i # 0 d ng Gdou!le !u$$eringH t4ng t c v l i #
#eA JwA QK@ VZ Q>cX QSJ Dm LK@ DE@ OIQ XHO Q>VoAB vZ]CA LVWJ Y\O QV[@, D\ FeA
OZKA B@RO >@qA QVWAB HZAB >lA> iflickerk(
#@tZ h@uA >lA> RA> heAB >lA> F@QOcd QHXAB6FI6A>E, H@ J>d >lA> F@QOcd L}
>X\A J>A> D\X XHO(
7rong .t vi :ng )ng8 &*n thng ;u'>n phi v@ l*i for. ho!c iu ki.. liu n' thng
g!p khi th hin ani.ation gh%nh ngh. u2 )8 &*n cF th sO )ng Timer l. .t hiu l=c
for. .#i gi<'. whi F8 o*n .S th=c hin thao tc v@ cF th v@ l*i .t &:c h%nh t*i .t vi tr2
.i8 t*o c. gic ng. Pch tiIp c6n n' cF .t vn \ .#i lNn &*n l. .t hiu l=c for.8
@"nAow8 s@ v@ l*i nn cOa ss g;Fa for.h8 v rti ch*' o*n .S th=c hin thao tc v@. liu n'
cF th g<' ra rung h%nh ng k.
+Uou&l( &uff(ring- l .t k thu6t &*n cF th hin th=c gi. hin t$ng rung h%nh. ui
+)ou&l( &uff(ring-8 logic v@ s@ ghi .t h%nh &it.ap trongz&znh8 v h%nh n' $c chXp l>n
for. vo cuDi 9u tr%nh v@ &5ng .t thao tc v@ l*i Mn lj trong suDt8 nh F . hin t$ng
rung h%nh gi. .t cch ng k.
Lc Nu ti>n khi hin th=c +)ou&l( &uff(ring- l phi &o . nn ca for. kh4ng t= ng
$c v@ l*i khi for. &i .t hiu l=c. l<' l ngu'>n nh<n ln nht g<' ra rung h%nh v% nF tha'
thI &:c h%nh ca &*n &5ng .t fra.( trDng ggi ) chJ l .t phNn nhV ca .t gi<'h. l
ngvn vic v@ nn8 &*n cNn chXp 1 phMng th:c OnPaintBackground ca for. nF kh4ng
nh6n hnh ng no. Lc th: hai l sOa si o*n .S th=c hin thao tc v@ nF v@ &:c h%nh
thnh .t h%nh &it.ap trongz&znh. whi hon tt8 h%nh &it.ap $c chXp vo for.. Pch
tiIp c6n n' &o . l. tMi l .t thao tc v@ l*i Mn lj8 v )raing logic tDn nhiu thi
gian F s@ kh4ng g<' ra hin t$ng rung h%nh.
306
Chng 8: $ haE a shng `innE }~ in n
u2 ) sau <' tr%nh &' .t &:c h%nh gC <' l logo ca @"nAow8 :Ph lu<n phi>n ln l>n v
nhV l*i tr>n for.. Uraing logic $c th=c hin trong phMng th:c th lB s= kin Form.Paint8
v .t Timer $c sO )ng l. .t hiu l=c for. .#i Zd .ilizgi<' &:c h%nh cF th
$c v@ l*i. Hgi )eng cF th k2ch ho*t +)ou&l( &uff(ring- th4ng 9ua .t CheckBox tr>n
for.. HIu kh4ng cF +)ou&l( &uff(ring-8 for. &i rung ng k. 7u' nhi>n8 khi +)ou&l(
&uff(ring- $c k2ch ho*t8 &:c h%nh ln l>n v nhV l*i .t cch .$t .8 kh4ng ckn rung
nKa.
using System;
using System.Drawing;
using System.Drawing2D;
using System.Windows.Forms;
public class DoubleBuffering : System.Windows.Forms.Form {
private System.Windows.Forms.CheckBox chkUseDoubleBuffering;
private System.Windows.Forms.Timer tmrRefresh;
// (Bo qua phn m designer.)
// Theo di kch thc bc hnh,
// v kiu animation (ln ln hoac nho lai).
private bool isShrinking = false;
private int imageSize = 0;
// Lu tr logo s doc v ln form.
private Image image;
private void DoubleBuffering_Load(object sender,
System.EventArgs e) {

// Nap bc hnh logo tu file.
image = Image.FromFile("image.bmp");
// Khoi dng Timer d lm mt hiu lc form.
tmrRefresh.Start();
}
private void tmrRefresh_Tick(object sender, System.EventArgs e) {
307
Chng 8: $ haE a shng `innE }~ in n

// Thay di kch thc bc hnh da vo kiu animation.
if (isShrinking) {
imageSize--;
}else {
imageSize++;
}
// i hng thay di kch thc nu dn gn bin cua form.
if (imageSize (this.Width - 150)) {
isShrinking = true;
}else if (imageSize 1) {
isShrinking = false;
}
// V lai form.
this.Invalidate();
}
private void DoubleBuffering_Paint(object sender,
System.Windows.Forms.PaintEventArgs e) {

Graphics g;
Bitmap drawing = null;
if (chkUseDoubleBuffering.Checked) {

// "Double buffering" dang doc su dng.
// Tao mt bitmap trong-b-nh m ta b mat cua form.
drawing = new Bitmap(this.Width, this.Height, e.Graphics);
g = Graphics.FromImage(drawing);
}else {

// "Double buffering" khng doc su dng.
308
Chng 8: $ haE a shng `innE }~ in n
// V trc tip ln form.
g = e.Graphics;
}
g.SmoothingMode = SmoothingMode.Highuality;
// V nn.
g.FillRectangle(Brushes.Yellow,
new Rectangle(new Point(0, 0), this.ClientSize));
// V bc hnh logo.
g.DrawImage(image, 50, 50, 50 + imageSize, 50 + imageSize);
// Nu su dng "double buffering", chp hnh bitmap
// d hon tt trong b nh vo form.
if (chkUseDoubleBuffering.Checked) {

e.Graphics.DrawImageUnscaled(drawing, 0, 0);
g.Dispose();
}
}
protected override void OnPaintBackground(
System.Windows.Forms.PaintEventArgs pevent) {

// Khng lm g ca.
}
}
8'
8' -i n th h&nh d ng thum!nail -i n th h&nh d ng thum!nail
#eA JwA >@tA Q>M JSJ F~J >lA> QHXAB OIQ Q>V OUJ heAB Q>ZOFAc@Y(
!J F~J >lA> Q @Y F`AB d>V[AB Q>~J QA> "rom"ile Jbc YEd
$!stem.-ra%ing.Emage( 3j L^, FeA J^ Q>t Q>Z YP] >lA> Q>ZOFAc@Y F`AB d>V[AB
Q>~J Emage.7et).umbnailEmage(
309
Chng 8: $ haE a shng `innE }~ in n
yp Image cung cp ch:c nvng t*o thu.&nail th4ng 9ua phMng th:c GetThumbnailImage. L*n
chJ cNn tru'n chiu rng v chiu cao ca h%nh thu.&nail &*n .uDn gt2nh &5ng pi;(lh8 v lp
Image s@ t*o .t Di t$ng Image .i phe h$p vi ti>u chuxn n'. uic khO .Xo )*ng rvng
ca gan/"aD"a8"ngh $c sO )ng khi thu nhV &:c h%nh &o . cht l$ng &:c h%nh tDt nht
cF th $c8 .!c )e .t sD vIt . v thiIu ht .t vi tiu tiIt l kh4ng th trnh khVi gkhO
.Xo )*ng rvng ca l 9u tr%nh lo*i &V cc r%a lC. chC.8 thng cF trong cc &:c h%nh S
$c tha' si k2ch thc8 &5ng cch t4 &Fng vi .t .u trung gianh. Hgoi ra8 &*n cF th
cung cp .t call&ack t*o thu.&nail .t cch &t tng &.
whi t*o .t thu.&nail8 vic 9uan tr0ng l phi &o . tJ sD giKa hai chiu v3n nh c? gh5ng
sDh. u2 )8 nIu &*n thu nhV .t &:c h%nh k2ch thc ]dd;Zdd thnh .t thu.&nail k2ch thc
`d;`d8 chiu rng s@ &i nXn ckn .t phNn t v chiu cao &i nXn ckn .t nOa8 iu n' l.
.Xo &:c h%nh. l &o . tJ l n' v3n nh c?8 &*n cF th tha' si chiu rng ho!c chiu cao
thnh .t k2ch thc cD inh rti iu chJnh chiu ckn l*i cho c<n ;:ng.
u2 ) )i <' 0c .t fil( &it.ap v t*o .t thu.&nail k2ch thc kh4ng ln hMn `d;`d
gv3n &o ton tJ l gDch\
using System;
using System.Drawing;
using System.Windows.Forms;
public class Thumbnails : System.Windows.Forms.Form {
// (Bo qua phn m designer.)
Image thumbnail;
private void Thumbnails_Load(object sender, System.EventArgs e) {

Image img = Image.FromFile("test.jpg");
int thumbnailWidth = 0, thumbnailHeight = 0;
// iu chnh chiu ln hn l 50 pixel.
// Vic ny bao dam thumbnail s khng ln hn 50x50 pixel.
// Nu mun hin th nhiu thumbnail, ban s phai dung
// mt hnh vung 50x50 pixel cho mi thumbnail.
if (img.Width img.Height) {

thumbnailWidth = 50;
thumbnailHeight = Convert.ToInt32(((50F / img.Width)
img.Height));
310
Chng 8: $ haE a shng `innE }~ in n
}else {

thumbnailHeight = 50;
thumbnailWidth = Convert.ToInt32(((50F / img.Height)
img.Width));
}
thumbnail = img.GetThumbnailImage(thumbnailWidth,
thumbnailHeight, null, IntPtr.Zero);
}
private void Thumbnails_Paint(object sender,
System.Windows.Forms.PaintEventArgs e) {

e.Graphics.DrawImage(thumbnail, 10, 10);
}
}
9'
9' 1ht ti ng G!ee%H c a h th ng 1ht ti ng G!ee%H c a h th ng
#eA JwA d>SQ OIQ O Q>cA> L[A B@RA, J>AB >eA Q@jAB Fd Jbc >q Q>KAB(
Sg hUAB OIQ >\O s>TAB6LVWJ6ZRA6Y *in)' ;,/ A>V 6eep >c] snd/la!$ound,
>X_J B@ >\O 6eep Jbc Microsoft $is%al 5asic .NET(
.NET Framework kh4ng ch:a &t k lp $cz9unzlB no th=c hin vic chMi cc fil( <.
thanh8 nga' c tiIng +&((p- ca h thDng c?ng kh4ng. 7u' nhi>n8 &*n cF th )r )ng v$t 9ua
trC ng*i n' &5ng @"nC2 >P< ho!c V"8uaD $a8") .NET gcp h. Beep th4ng 9ua lp
Microsoft.VisualBasic.Interactionh. 7rong trng h$p th: hai8 &*n phi th>. .t tha.
chiIu In &")ro8o?/.V"8uaD$a8").ADD gcF trong tt c cc phi>n &n ca .NET Frameworkh.
u2 ) sau <' sO )ng c h. >P< Beep v h. V"8uaD $a8") Beep. PhG B l h. >P< sO )ng
loa g/n trong ca .' t2nh v pht <. thanh vi tNn sD gt2nh &5ng n(rto8 n5. trong khong tQ
^[ In ^]8[a[h v thi gian gt2nh &5ng .ilizgi<'h cho trc. Pch n' s@ kh4ng pht &t k
<. thanh no nIu .' t2nh kh4ng cF loa g/n trong. "!t khc8 h. V"8uaD $a8") Beep pht
tiIng +&((p- chuxn ca h thDng gl .t fil( @>Vh. Pch n' s@ kh4ng pht &t k <. thanh
no nIu .' t2nh kh4ng cF car) <. thanh8 nIu car) <. thanh kh4ng $c kIt nDi vi loa g/n
ngoi8 ho!c nIu @"nAow8 $c cu h%nh l kh4ng pht <. thanh gth4ng 9ua phNn *ounA8 anA
>uA"o EeB")e8 trong Con/roD PaneDh.
311
Chng 8: $ haE a shng `innE }~ in n
using System;
using System.Runtime.InteropServices;
using Microsoft.VisualBasic;
public class BeepTest {
[DllImport("kernel32.dll")]
private static extern bool Beep(int freq, int dur);
[STAThread]
private static void Main(string[] args) {

// Pht ting "beep" tn s 440 Hz trong 100 mili-giy
// trn internal speaker.
Console.WriteLine("Win32 API beep test.");
Beep(440, 100);
Console.ReadLine();
// Pht ting "beep" mac dnh cua h thng (file WAV).
Console.WriteLine("VB beep test.");
Interaction.Beep();
Console.ReadLine();
}
}
L*n c?ng cF th sO )ng cc h. @"nC2 >P< chMi .t fil( <. thanh )o &*n ch0n. w thu6t
n' $c .4 t trong .c b.Zd.
10'
10' Ch i $ile audio Ch i $ile audio
#eA JwA J>[@ OIQ @Y *;$ >X_J M,)(
Sg hUAB >\O ;,/ snd/la!$ound i>x QHW @Y *;$k, >X_J fg hUAB Q>\A> d>wA
;cti"eMo"ie J^ QHXAB *in&ows Me&ia ,la:er i>x QHW @Y *;$ D\ M,)k
l chMi &t k <. thanh no trong .t :ng )ng .NET8 &*n cNn nh6n s= giGp ca .t th
vin &>n ngoi ho!c li g0i h thDng. "a' ./n tha'8 c hai te' ch0n n' u )r )ng th=c
hin $c.
312
Chng 8: $ haE a shng `innE }~ in n
7h vin w"nmm.ADD gcF trong @"nAow8h ch:a h. sndPlaySound nh6n vo t>n ca .t
fil( @>V v .t th4ng sD chJ inh cch chMi. L*n cF th ch0n chMi <. thanh .t cch
tng & ggin o*n vic th=c thi ca chMng tr%nh cho In khi <. thanh S hon tth8
&t tng &8 ho!c trong .t vkng l!p ch*' ph2a nn.
7h vin uar/O cung cp .t thnh phNn CF& cF th chMi nhiu kiu fil( au)io8 gt.
cc inh )*ng @>V v &PC. 7h vin uar/O $c cp th4ng 9ua Muar/O.ADD v nF l
.t phNn ca &")ro8o?/ E"re)/: cho @"nAow8 &eA"a PDayer v h iu hnh @"nAow8.
7rong v2 ) n'8 chGng ta s@ sO )ng cch tiIp c6n th: hai. Lc Nu ti>n l t*o .t lp
<n/eroK cF th 9un lB s= tMng tc giKa :ng )ng .NET v th vin uar/O. L*n cF th t*o
.t lp C# ceng vi o*n .S <n/eroK n' &5ng tin 2ch TyKe L"4rary <mKor/er g/D4"mK.e2eh v
)kng lnh sau <' g[WindowsDir] l ng )3n ca th .c ci !t @"nAow8h\
tlbimp [WindowsDir],s!stemDA,CuartI.dll /out:HuartI)!pe+ib.dll
L*n cF th sO )ng V"8uaD */uA"o .NET t*o lp <n/eroK &5ng cch th>. vo .t tha.
chiIu. PhJ cNn nh/p phi vo )= n ca &*n trong *oDu/"on E2KDorer8 v ch0n >AA =e?eren)e
tQ .(nu ngK cnh. wI tiIp8 ch0n thj CF&8 v cun ;uDng ch0n >)/"Be&oB"e )on/roD /yKe
D"4rary g;(. h%nh b.[h.
"t khi lp <n/eroK S $c t*o8 &*n cF th l. vic vi giao )in IMediaControl. L*n cF th
chJ inh fil( . &*n .uDn chMi &5ng RenderFile8 v cF th iu khin pla'&ack &5ng cc
phMng th:c nh Run8 Stop8 v Pause. Rla'&ack )irn ra tr>n .t tiu tr%nh c l6p8 nh thI nF
s@ kh4ng &lock o*n .S ca &*n.
313
Chng 8: $ haE a shng `innE }~ in n
0nh 8'7 Chn ActiveMovie control type library trong hp thoai Add eference
u2 )8 tin 2ch Con8oDe )i <' s@ chMi fil( au)io $c chJ inh trong Di sD )kng lnh Nu
ti>n\
using System;
class PlayAudio {
public static void Main(string[] args) {

// Ly tn file doc ch dnh trong di s du tin.
string filename = args[0];

// Truy xut giao din IMediaControl.
uartzTypeLib.FilgraphManager graphManager =
new uartzTypeLib.FilgraphManager();
uartzTypeLib.IMediaControl mc =
(uartzTypeLib.IMediaControl)graphManager;
// Ch dnh tn file.
mc.RenderFile(filename);
// Bt du chi file audio bt dng b.
mc.Run();
Console.WriteLine("Press Enter to continue.");
Console.ReadLine();
mc.Stop();
}
}
L*n c?ng cF th sO )ng th vin uar/O hin thi fil( vi)(o gs@ $c tr%nh &' trong .c
b.ZZh.
11'
11' Ch i $ile video Ch i $ile video
#eA JwA J>[@ OIQ @Y D@hX iA>V M,E6, ;$/, >X_J *M$k ABc] QHCA XHO(
Sg hUAB Q>\A> d>wA ;cti"eMo"ie J^ QHXAB Me&ia ,la:er( G{A sjQ vZPQ D@hX D\X
OIQ /icture6ox QHCA XHO F`AB JSJ> Q>@jQ YNd Q>ZIJ QaA> E>ideoindo%.(%ner Y\
Q>ZIJ QaA> /icture6ox.Handle(
314
Chng 8: $ haE a shng `innE }~ in n
.NET Framework kh4ng ch:a &t k lp $cz9unzlB no tMng tc vi cc fil( vi)(o8
nhng &*n cF th sO )ng ch:c nvng E"re)/*how ca th vin uar/O )=aztr>nzCF& gcF
trong @"nAow8 &eA"a PDayer v h iu hnh @"nAow8h. l &iIt cch t*o .t <n/eroK
>88em4Dy cho th vin uar/O8 &*n hS' tha. kho .c b.Zd.
"t khi S t*o <n/eroK >88em4Dy8 &*n cF th sO )ng giao )in IMediaControl n*p v chMi
.t fil( vi)(o. u cM &n8 k thu6t n' giDng nh k thu6t S tr%nh &' trong .c b.Zd vi
fil( au)io. 7u' nhi>n8 nIu .uDn hin thi cOa ss vi)(o nga' &>n trong giao )in :ng )ng ca
&*n ghMn l trong .t cOa ss c l6ph8 &*n phi sO )ng giao )in IVideoWindow. lDi t$ng
FilgraphManager cF th $c Xp kiu thnh giao )in IMediaControl v IVideoWindowEv
nhiu giao )in khc c?ng $c h# tr$ nh IBasicAudio gcho phXp &*n cu h%nh cc thiIt l6p
&alanc( v volu.(h. ui giao )in IVideoWindow8 &*n cF th g/n kIt ;ut vi)(o vo .t Di
t$ng tr>n for. nh Panel ho!c PictureBox. l l. $c nh v6'8 &*n cNn thiIt l6p thuc
t2nh IVideoWindow.Owner l han)l( ca iu ki. F g&*n cF th l' $c han)l( n' &5ng
thuc t2nh Control.Handleh. wI tiIp8 g0i IVideoWindow.SetWindowPosition thiIt l6p k2ch
thc v vi tr2 ca cOa ss. RhMng th:c n' c?ng cF th $c g0i tha' si k2ch thc vi)(o
trong 9u tr%nh pla'&ack gch~ng h*n8 khi for. &i tha' si k2ch thch.
u2 ) )i <' cho phXp ngi )eng .C &t k fil( vi)(o no v chMi nF trong .t
PictureBox. PictureBox &i n(o In tt c cc c*nh ca for.8 nh thI nF c?ng tha' si k2ch
thc khi for. &i tha' si k2ch thc. lo*n .S p :ng cho s= kin PictureBox.SizeChanged
s@ tha' si k2ch thc ca cOa ss vi)(o tMng :ng.
using System;
using uartzTypeLib;
using System.Windows.Forms;
public class ShowMovie : System.Windows.Forms.Form {
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Button cmdOpen;
// (Bo qua phn m designer.)
// nh ngha cc hng dung d ch dnh window style.
private const int WM_APP = 0x8000;
private const int WM_GRAPHNOTIFY = WM_APP + 1;
private const int EC_COMPLETE = 0x01;
private const int WS_CHILD = 0x40000000;
private const int WS_CLIPCHILDREN = 0x2000000;
315
Chng 8: $ haE a shng `innE }~ in n
// Gi tham chiu mc-form dn giao din Media Control,
// d doan m c th diu khin playback cho
// movie doc nap hin tai.
private IMediaControl mc = null;
// Gi tham chiu mc-form dn cua s video trong
// trng hop n cn doc thay di kch thc.
private IVideoWindow videoWindow = null;
private void cmdOpen_Click(object sender, System.EventArgs e) {

// Cho php ngi dung chon file.
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter =
"Media Files|.mpg;.avi;.wma;.mov;" +
".wav;.mp2;.mp3|All Files|.";
if (DialogResult.OK == openFileDialog.ShowDialog()) {

// Dung playback di vi movie hin tai, nu n tn tai.
if (mc != null) mc.Stop();
// Nap file movie.
FilgraphManager graphManager = new FilgraphManager();
graphManager.RenderFile(openFileDialog.FileName);
// Gn cua s video vo PictureBox trn form.
try {

videoWindow = (IVideoWindow)graphManager;
videoWindow.Owner = (int) pictureBox1.Handle;
videoWindow.WindowStyle = WS_CHILD | WS_CLIPCHILDREN;
videoWindow.SetWindowPosition(
pictureBox1.ClientRectangle.Left,
pictureBox1.ClientRectangle.Top,
pictureBox1.ClientRectangle.Width,
pictureBox1.ClientRectangle.Height);
316
Chng 8: $ haE a shng `innE }~ in n
} catch {

// Li c th xay ra nu file khng c
// video source (chang han, file MP3).
// Ban c th bo qua li ny v vn cho php
// playback tip tc (khng c hnh).
}
// Bt du playback (bt dng b).
mc = (IMediaControl)graphManager;
mc.Run();
}
}
private void pictureBox1_SizeChanged(object sender,
System.EventArgs e) {

if (videoWindow != null) {

try {
videoWindow.SetWindowPosition(
pictureBox1.ClientRectangle.Left,
pictureBox1.ClientRectangle.Top,
pictureBox1.ClientRectangle.Width,
pictureBox1.ClientRectangle.Height);
} catch {
// Bo qua ngoai l (b nm khi thay di kch thc form)
// khi file khng c video source.
}
}
}
317
Chng 8: $ haE a shng `innE }~ in n
private void ShowMovie_Closing(object sender,
System.ComponentModel.CancelEventArgs e) {

if (mc != null) mc.Stop();
}
}
0nh 8'8 Chi file video trong PictureBox trn form
12'
12' 9 y th,ng tin v cc my in # c ci t 9 y th,ng tin v cc my in # c ci t
#eA JwA YP] hcA> fSJ> JSJ OS] @A LcAB J^ >@qZ YnJ QHCA OS] QaA>(
!J QCA JSJ OS] @A L} LVWJ J\@ L_Q QHXAB QNd >Wd Enstalled/rinters Jbc YEd
$!stem.-ra%ing./rinting./rinter$ettings(
yp PrinterSettings .4 t cc thiIt l6p cho .t .' in v th4ng tin v .' in F. u2 )8
&*n cF th sO )ng lp PrinterSettings ;c inh cc khs gi' gKaKer 8"Oeh8 cc ngutn
gi' gKaKer 8our)eh8 v cc ph<n gii gre8oDu/"onh $c h# tr$ v ki. tra kh nvng in .u
ho!c in hai .!t. Hgoi ra8 &*n cF th l' cc thiIt l6p trang .!c inh cho l gmarg"nh8 hng
trang gor"en/a/"onh...
yp PrinterSettings cung cp t6p h$p tqnh InstalledPrinters8 t6p h$p n' ch:a t>n ca tt
c cc .' in S $c ci !t tr>n .' t2nh. HIu .uDn t%. th>. th4ng tin v cc thiIt l6p cho
.t .' in c th8 &*n cNn t*o .t Di t$ng PrinterSettings v thiIt l6p thuc t2nh
PrinterName cho phe h$p.
ng )ng Con8oDe )i <' s@ t%. tt c cc .' in S $c ci !t tr>n .' t2nh v hin thi
th4ng tin v khs gi' v ph<n gii $c h# tr$ &Ci .#i .' in.
using System;
using System.Drawing.Printing;
318
Chng 8: $ haE a shng `innE }~ in n
public class ListPrinters {
private static void Main(string[] args) {

foreach (string printerName in
PrinterSettings.InstalledPrinters) {

// Hin th tn my in.
Console.WriteLine("Printer: {0}", printerName);
// Ly cc thit lp my in.
PrinterSettings printer = new PrinterSettings();
printer.PrinterName = printerName;
// Kim tra tnh hop l cua my in.
// (Bc ny cn thit trong trng hop ban doc tn my in
// tu mt gi tr do ngi dung cp hoac mt thit lp trong
// file registry hay configuration.)
if (printer.IsValid) {

// Hin th danh sch cc d phn giai hop l.
Console.WriteLine("Supported Resolutions:");
foreach (PrinterResolution resolution in
printer.PrinterResolutions) {
Console.WriteLine(" {0}", resolution);
}
Console.WriteLine();
// Hin th danh sch cc kh giy hop l.
Console.WriteLine("Supported Paper Sizes:");

foreach (PaperSize size in printer.PaperSizes) {

if (Enum.IsDefined(size.Kind.GetType(), size.Kind)) {
319
Chng 8: $ haE a shng `innE }~ in n
Console.WriteLine(" {0}", size);
}
}
Console.WriteLine();
}
}
Console.ReadLine();
}
}
Ui <' l kIt ;ut . :ng )ng n' cF th hin thi\
Printer: SnagIt
Supported Resolutions:
[PrinterResolution High]
[PrinterResolution Medium]
[PrinterResolution Low]
[PrinterResolution Draft]
[PrinterResolution X=600 Y=600]
[PrinterResolution X=300 Y=300]
[PrinterResolution X=200 Y=200]
[PrinterResolution X=100 Y=100]
Supported Paper Sizes:
[PaperSize Letter Kind=Letter Height=1100 Width=850]
[PaperSize Legal Kind=Legal Height=1400 Width=850]
[PaperSize Executive Kind=Executive Height=1050 Width=25]
[PaperSize A4 Kind=A4 Height=1169 Width=82]
[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=50 Width=38]
Printer: Adobe PDF
Supported Resolutions:
[PrinterResolution High]
[PrinterResolution Medium]
[PrinterResolution Low]
320
Chng 8: $ haE a shng `innE }~ in n
[PrinterResolution Draft]
[PrinterResolution X=2 Y=2]
[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=100 Width=1100]
[PaperSize Ledger Kind=Ledger Height=1100 Width=100]
[PaperSize Legal Kind=Legal Height=1400 Width=850]
[PaperSize Executive Kind=Executive Height=1050 Width=25]
[PaperSize A3 Kind=A3 Height=1654 Width=1169]
[PaperSize A4 Kind=A4 Height=1169 Width=82]
[PaperSize A2 Kind=A2 Height=2339 Width=1654]
[PaperSize 11 x 1 Kind=Custom Height=100 Width=1100]
[PaperSize Screen Kind=Custom Height=518 Width=650]
[PaperSize ANSI C Kind=Custom Height=2200 Width=100]
[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]
...
L*n kh4ng cNn th=c hin cch l. n' khi t*o .t :ng )ng cung cp ch:c nvng in. 7h(o
.c b.Z^8 &*n cF th sO )ng PrintDialog nh/c ngi )eng ch0n .t .' in v cc thiIt
l6p cho nF. yp PrintDialog cF th t= ng p )ng cc thiIt l6p ca nF cho PrintDocument
. kh4ng cNn viIt th>. .S lnh.
#eA J^ Q>t @A OIQ DA FRA QHXAB FPQ s s@tZ ~AB hUAB A\X( TZ] A>@CA, ~AB hUAB
Jbc FeA d>R@ J>~c OIQ Q>cO J>@jZ LjA S:stem.rawing.&ll( NjZ LcAB fg hUAB
OIQ s@tZ hn SA QHXAB $is%al St%&io .NET s>TAB J^ Q>cO J>@jZ A\] iA>V ~AB
hUAB Consolek, FeA JwA d>R@ Q>CO A^ D\X(
321
Chng 8: $ haE a shng `innE }~ in n
13'
13' Bn v4n ! n n gi n Bn v4n ! n n gi n
#eA JwA @A QvQ >X_J >lA>(
T>U Y fn s@qA /rint-ocument./rint/age, D\ fg hUAB JSJ d>V[AB Q>~J -ra%$tring
D\ -ra%Emage Jbc YEd 7rap.ics Lt @A h? Y@qZ Hc QHcAB(
.NET sO )ng .4 h%nh in )=aztr>nzs=zkin &t tng & ga8yn)hronou8 eBen/I4a8eA Kr"n/"ng
moAeDh. l in .t vvn &n8 &*n cNn t*o .t Di t$ng
System.Drawing.Printing.PrintDocument8 cu h%nh cc thuc t2nh ca nF8 v rti g0i phMng
th:c Print th=c hin tc v in. L th=c thi s@ pht sinh cc s= kin BeginPrint8 PrintPage8
v EndPrint ca lp PrintDocument tr>n .t tiu tr%nh .i. L*n th lB cc s= kin n' v sO
)ng Di t$ng System.Drawing.Graphics ;ut )K liu ra trang. n%nh v t(;t $c ghi ra
trang th(o ceng cch nh &*n v@ l>n cOa ss &5ng 6E<. 7u' nhi>n8 &*n cF th cNn phi th(o
vIt vi tr2 ca &*n tr>n trang8 v% .0i phMng th:c ca lp Graphics u '>u cNu t0a chJ inh
nMi cNn v@.
Pc thiIt l6p cho .' in $c cu h%nh th4ng 9ua cc thuc t2nh
PrintDocument.PrinterSettings v PrintDocument.DefaultPageSettings. 7huc t2nh
PrinterSettings tr v .t Di t$ng PrinterSettings gS $c .4 t trong .c b.Z]h cho
&iIt .' in s@ $c sO )ng. 7huc t2nh DefaultPageSettings cung cp Di t$ng
PageSettings cho &iIt ph<n gii gre8oDu/"onh8 l gmarg"nh8 hng trang gor"en/a/"onh... L*n
cF th cu h%nh cc thuc t2nh n' trong .S lnh8 ho!c &*n cF th sO )ng lp
System.Windows.Forms.PrintDialog ngi )eng th=c hin cc tha' si th4ng 9ua hp
tho*i in chuxn ca @"nAow8 g;(. h%nh b.ch. 7rong hp tho*i in8 ngi )eng cF th ch0n .t
.' in v ch0n sD l$ng &n in gnum4er o? )oK"e8h. Hgi )eng c?ng cF th nh/p vo nGt
ProKer/"e8 cu h%nh cc thiIt l6p n<ng cao nh cch &D tr2 trang gDayou/h v ph<n gii
.' in gre8oDu/"onh. PuDi ceng8 ngi )eng cF th chp thu6n ho!c h' &V thao tc in &5ng
cch nh/p F' ho!c Can)eD.
0nh 8'9 Hp thoai Print
322
Chng 8: $ haE a shng `innE }~ in n
7rc khi sO )ng lp PrintDialog8 &*n phi g/n nF vo Di t$ng PrintDocument &5ng cch
thiIt l6p thuc t2nh PrintDialog.Document. 7h(o F8 &t k s= tha' si no )o ngi )eng
th=c hin trong hp tho*i in s@ t= ng $c p )ng vo Di t$ng PrintDocument.
u2 ) )i <' l .t for. chJ ch:a .t nGt lnh. whi ngi )eng nh/p vo nGt n'8 :ng
)ng s@ t*o .t Di t$ng PrintDocument .i8 cho phXp ngi )eng cu h%nh cc thiIt l6p in8
v rti &/t Nu thao tc in &t tng &. RhMng th:c th lB s= kin p :ng cho s= kin
PrintPage s@ ghi ra nhiu )kng t(;t v .t &:c h%nh.
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Printing;
public class SimplePrint : System.Windows.Forms.Form {
private System.Windows.Forms.Button cmdPrint;
// (Bo qua phn m designer.)
private void cmdPrint_Click(object sender, System.EventArgs e) {

// Tao mt van ban v gn vo phng thc th l s kin.
PrintDocument doc = new PrintDocument();
doc.PrintPage += new PrintPageEventHandler(this.Doc_PrintPage);
// Cho php ngi dung chon mt my in
// v ch dnh cc thit lp khc.
PrintDialog dlgSettings = new PrintDialog();
dlgSettings.Document = doc;
// Nu ngi dung nhp OK th in van ban.
if (dlgSettings.ShowDialog() == DialogResult.OK) {

// Phng thc ny tra v tc th, trc khi tc v in
// bt du. S kin PrintPage s pht sinh bt dng b.
doc.Print();
}
323
Chng 8: $ haE a shng `innE }~ in n
}
private void Doc_PrintPage(object sender, PrintPageEventArgs e) {

// nh ngha font.
Font font = new Font("Tahoma", 30);
// Xc dnh v tr trn trang.
// Trong trng hop ny, chng ta doc cc thit lp l
// (mac du khng c g ngan chng ta vot qua bin l).
float x = e.MarginBounds.Left;
float y = e.MarginBounds.Top;
// Xc dnh chiu cao cua mt dng (da trn font doc su dng).
float lineHeight = font.GetHeight(e.Graphics);
// In nam dng text.
for (int i=0; i 5; i++) {

// V text vi bt v den, su dng font v
// toa d m chng ta d xc dnh.
e.Graphics.DrawString("Thp Din Mai Phc " + i.ToString(),
font, Brushes.Black, x, y);
// Dch xung mt dng.
y += lineHeight;
}
y += lineHeight;
// V hnh.
e.Graphics.DrawImage(Image.FromFile(Application.StartupPath +
"test.bmp"), x, y);
}
}
u2 ) n' cF .t h*n chI l nF chJ in .t trang Mn. l in cc vvn &n ph:c t*p v nhiu
trang hMn8 &*n cNn phi t*o .t lp chu'>n &it Fng gFi cc th4ng tin v vvn &n8 trang
hin hnh... w thu6t n' s@ $c tr%nh &' trong .c b.Z_.
324
Chng 8: $ haE a shng `innE }~ in n
0nh 8-10 Vn bn d doc in (s dung my in Adobe P)
14' 14' Bn v4n ! n c' nhi u trang Bn v4n ! n c' nhi u trang
#eA JwA @A JSJ DA FRA d>~J Qed BO A>@GZ QHcAB D\ @A A>@GZ DA FRA s>SJ A>cZ
JrAB OIQ YJ(
!_Q Q>TAB Q@A OZKA @A D\X OIQ YEd Qr] F@jA hpA vZPQ Q /rint-ocument, D\ Q>@jQ
YNd Q>ZIJ QaA> /rint/age0vent#rgs.HasMore/ages Y\ true QHXAB s>@ DpA JyA QHcAB
Lt @A(
|= kin PrintDocument.PrintPage cho phXp &*n chJ in .t trang Mn. HIu .uDn in nhiu
trang hMn8 &*n cNn thiIt l6p thuc t2nh PrintPageEventArgs.HasMorePages l true trong
phMng th:c th lB s= kin PrintPage. 7rong khi HasMorePages l true8 lp PrintDocument
v3n tiIp tc pht sinh cc s= kin PrintPage g.t s= kin cho .t trangh. 7u' nhi>n8 &*n cNn
&iIt l ang in In trang th: .'8 )K liu g% s@ $c in tr>n .#i trang... l th=c hin iu
n'8 cch ha' nht l t*o .t lp te' &iIn.
yp TextDocument )i <' thQa kI tQ PrintDocument v th>. &a thuc t2nh\ Text lu trK .t
.ng cc )kng t(;t8 PageNumber cho &iIt trang vQa $c in8 v Offset cho &iIt )kng vQa $c
in gtrong .ng Texth.
public class TextDocument : PrintDocument {
private string[] text;
325
Chng 8: $ haE a shng `innE }~ in n
private int pageNumber;
private int offset;
public string[] Text {
get {return text;}
set {text = value;}
}
public int PageNumber {
get {return pageNumber;}
set {pageNumber = value;}
}
public int Offset {
get {return offset;}
set {offset = value;}
}
public TextDocument(string[] text) {
this.Text = text;
}
}
7e' thuc vo kiu ti liu .uDn in8 &*n cF th chJnh sOa lp n'. u2 )8 &*n cF th lu trK
.t .ng gt. cc )K liu h%nh8 .t vi ni )ung s@ $c sO )ng l. h(a)(r ho!c foot(r
tr>n .#i trang8 th4ng tin v font8 ho!c t>n ca fil( . &*n .uDn 0c th4ng tin tQ nF. pFi cc
th4ng tin n' vo .t lp Mn s@ khiIn cho vic in nhiu vvn &n ceng .t lGc )r )ng hMn.
RhNn .S khCi Nu c?ng giDng nh .c b.Z^8 chJ khc l &<' gi t*o Di t$ng TextDocument
gtha' v% t*o Di t$ng PrintDocumenth. RhMng th:c th lB s= kin PrintPage giK vIt ca )kng
hin hnh v ki. tra cF ckn ch# trDng tr>n trang ha' kh4ng trc khi th=c hin in )kng kI
tiIp. HIu cNn trang .i8 thuc t2nh HasMorePages $c thiIt l6p l true v s= kin PrintPage
pht sinh lNn nKa cho trang kI tiIp. HIu kh4ng8 thao tc in ;(. nh hon tt.
RhNn .S N' cho for. $c tr%nh &' )i <'\
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Printing;
public class MultiPagePrint : System.Windows.Forms.Form {
326
Chng 8: $ haE a shng `innE }~ in n
private System.Windows.Forms.Button cmdPrint;
// (Bo qua phn m designer.)
private void cmdPrint_Click(object sender, System.EventArgs e) {

// Tao van ban gm 100 dng.
string[] printText = new string[100];
for (int i=0; i 100; i++) {

printText[i] = i.ToString();
printText[i] +=
": Thp Din Mai Phc (House of Flying Daggers)";
}
PrintDocument doc = new TextDocument(printText);
doc.PrintPage += new PrintPageEventHandler(this.Doc_PrintPage);
PrintDialog dlgSettings = new PrintDialog();
dlgSettings.Document = doc;
// Nu ngi dung nhp OK th in van ban.
if (dlgSettings.ShowDialog() == DialogResult.OK) {
doc.Print();
}
}
private void Doc_PrintPage(object sender, PrintPageEventArgs e) {

// Thu ly van ban d gui s kin ny.
TextDocument doc = (TextDocument)sender;

// nh ngha font v xc dnh chiu cao.
Font font = new Font("Tahoma", 10);
float lineHeight = font.GetHeight(e.Graphics);
327
Chng 8: $ haE a shng `innE }~ in n
// Tao cc bin lu gi v tr trn trang.
float x = e.MarginBounds.Left;
float y = e.MarginBounds.Top;
// Tang bin dm cho trang (cho bit s trang d doc in).
doc.PageNumber += 1;
// In tt ca thng tin vua kht trn trang.
// Vng lap ny kt thc khi dng k tip vot qu bin l,
// hoac khng cn dng no d in.
while ((y + lineHeight) e.MarginBounds.Bottom &&
doc.Offset = doc.Text.GetUpperBound(0)) {

e.Graphics.DrawString(doc.Text[doc.Offset], font,
Brushes.Black, x, y);
// Dch dn dng d liu k tip.
doc.Offset += 1;
// Dch xung mt dng trn trang.
y += lineHeight;
}

if (doc.Offset doc.Text.GetUpperBound(0)) {

// Vn cn t nht mt trang na.
// Cho bit s kin ny s pht sinh ln na.
e.HasMorePages = true;
}else {

// Thao tc in d hon tt.
doc.Offset = 0;
}
}
}
328
Chng 8: $ haE a shng `innE }~ in n
15'
15' Bn text d ng wra%%ing Bn text d ng wra%%ing
#eA JwA d>A QaJ> OIQ s>K@ QvQ YEA Q>\A> JSJ hyAB H@CAB F@qQ fcX J>X Dc s>aQ
QHCA OIQ QHcAB(
Sg hUAB d>V[AB Q>~J Aed J>AB 7rap.ics.-ra%$tring id>V[AB Q>~J A\] A>NA
D\X OIQ >lA> J>? A>NQ F@CAk(
7h4ng thng8 &*n s@ cNn ph .t khDi t(;t ln thnh cc )kng ri>ng &it cF th in l>n
trang tQng )kng .t. .NET Framework cF th th=c hin c4ng vic n' .t cch t= ng &5ng
.t phi>n &n ca phMng th:c Graphics.DrawString gnh6n vo .t h%nh chK nh6t &i>nh. L*n
cNn chJ inh h%nh chK nh6t .4 t nMi &*n .uDn t(;t s@ hin thi. 7h(o F8 t(;t s@ $c rap
.t cch t= ng cho vQa kh2t &>n trong ng &i>n n'.
lo*n .S )i <' th=c hin cch tiIp c6n n'\
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Printing;
public class WrappedPrint : System.Windows.Forms.Form {
private System.Windows.Forms.Button cmdPrint;
// (Bo qua phn m designer.)
private void cmdPrint_Click(object sender, System.EventArgs e) {

// Tao mt van ban v gn n vo phng thc th l s kin.
string text =
"Windows Server 2003 builds on the core strengths " +
"of the Windows family of operating systems--security, " +
"manageability, reliability, availability, and scalability. " +
"Windows Server 2003 provides an application environment to " +
"build, deploy, manage, and run XML Web services. " +
"Additionally, advances in Windows Server 2003 provide many " +
"benefits for developing applications.";
PrintDocument doc = new ParagraphDocument(text);
doc.PrintPage += new PrintPageEventHandler(this.Doc_PrintPage);
329
Chng 8: $ haE a shng `innE }~ in n
// Cho php ngi dung chon mt my in
// v ch dnh cc thit lp khc.
PrintDialog dlgSettings = new PrintDialog();
dlgSettings.Document = doc;
// Nu ngi dung nhp OK th in van ban.
if (dlgSettings.ShowDialog() == DialogResult.OK) {
doc.Print();
}
}
private void Doc_PrintPage(object sender, PrintPageEventArgs e) {

// Thu ly van ban d gui s kin ny.
ParagraphDocument doc = (ParagraphDocument)sender;
// nh ngha font v text.
Font font = new Font("Arial", 15);
e.Graphics.DrawString(doc.Text, font, Brushes.Black,
e.MarginBounds, StringFormat.GenericDefault);
}
}
public class ParagraphDocument : PrintDocument {
private string text;
public string Text {
get {return text;}
set {text = value;}
}
public ParagraphDocument(string text) {
this.Text = text;
}
}
330
Chng 8: $ haE a shng `innE }~ in n
0nh 8'11 Vn bn d doc in (s dung my in Adobe P)
16' 16' -i n th %rint-%review -i n th %rint-%review
#eA JwA fg hUAB dH@AQ6dHD@ Lt F@jQ LVWJ DA FRA s>@ LVWJ @A Hc fm QHTAB A>V
Q>j A\X(
Sg hUAB /rint/revie%-ialog >X_J /rint/revie%Control iJR >c@ LGZ Q>ZIJ s>TAB
B@cA QCA $!stem.indo%s."ormsk(
.NET cung cp hai iu ki. cF th nh6n vo .t Di t$ng PrintDocument8 ch*' o*n .S
th=c hin thao tc in8 v sO )ng nF t*o printzpr(vi( tr>n .n h%nh. nai iu ki. n' l\
PrintPreviewDialogEhin thi printzpr(vi( trong .t cOa ss c l6p.
PrintPreviewControlEhin thi printzpr(vi( trong .t for. te' &iIn.
l sO )ng cOa ss printzpr(vi( c l6p8 &*n cNn t*o Di t$ng PrintPrevewDialog8 n inh
vvn &n8 v g0i phMng th:c PrintPreviewDialog.Show.
PrintPreviewDialog dlgPreview = new PrintPreviewDialog();
dlgPreview.Document = doc;
dlgPreview.Show();
POa ss printzpr(vi( g;(. h%nh b.Z]h cung cp tt c cc iu khin cNn thiIt )i chu'n tQ
trang n' sang trang khc8 thu phFng trang... POa ss n' c?ng cung cp nGt Pr"n/ cho phXp
ngi )eng gOi tr=c tiIp vvn &n In .' in. L*n cF th &iIn si cOa ss n' &5ng cch chJnh
sOa cc thuc t2nh ca PrintPrevewDialog.
L*n c?ng cF th th>. PrintPreviewControl vo &t k for. no hin thi printzpr(vi( kI
&>n cc th4ng tin khc. 7rong trng h$p n'8 &*n kh4ng cNn g0i phMng th:c Show. Hga' khi
&*n thiIt l6p thuc t2nh PrintPreviewControl.Document th% pr(vi( $c t*o ra. l ;Fa
pr(vi(8 cNn thiIt l6p thuc t2nh Document l null8 v l. tMi pr(vi(8 cNn gn l*i thuc
t2nh Document. PrintPreviewControl chJ hin thi cc trang pr(vi(8 kh4ng cF th>. iu khin
no khc. 7u' nhi>n8 &*n cF th th>. cc iu ki. th=c hin thu phFng trang8 lt nhiu
trang... L*n chJ cNn iu chJnh cc thuc t2nh ca PrintPreviewControl cho phe h$p.
331
Chng 8: $ haE a shng `innE }~ in n
u2 )8 ;Xt for. $c tr%nh &' trong h%nh b.Z^. HF sp nh6p .t PrintPreviewControl v cho
phXp ngi )eng ch0n thiIt l6p cho ooo. gthu phFng trangh.
0nh 8'12 S dung PrintPreviewialog d hin thj print-preview trong mt ca s dc lp
0nh 8'13 S dung PrintPreviewControl d hin thj print-preview trong mt ca s ty bin
Ui <' l phNn .S cho for.\
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Printing;
public class PrintPreview : System.Windows.Forms.Form {
332
Chng 8: $ haE a shng `innE }~ in n
private System.Windows.Forms.PrintPreviewControl printPreviewControl;
private System.Windows.Forms.Button cmdPreview;
private System.Windows.Forms.ListBox lstZoom;
private System.Windows.Forms.Label label1;
// (Bo qua phn m designer.)
private PrintDocument doc;
// (Bo qua phn m cho phng thc th l s kin
// PrintDocument.PrintPage - Xem mc 8.14)
private void PrintPreview_Load(object sender, System.EventArgs e) {

// Thit lp cc zoom doc php.
for (int i=1; i = 10; i++) {
lstZoom.Items.Add((i 10).ToString());
}
// Tao van ban gm 100 dng.
string[] printText = new string[100];
for (int i=0; i 100; i++) {
printText[i] = i.ToString();
printText[i] +=
": The quick brown fox jumps over the lazy dog.";
}
doc = new TextDocument(printText);
doc.PrintPage += new PrintPageEventHandler(this.Doc_PrintPage);
lstZoom.Text = "100";
printPreviewControl.Zoom = 1;
printPreviewControl.Document = doc;
printPreviewControl.Rows = 2;
333
Chng 8: $ haE a shng `innE }~ in n
}
private void cmdPreview_Click(object sender, System.EventArgs e) {

// Thit lp zoom.
printPreviewControl.Zoom = Single.Parse(lstZoom.Text) / 100;
// Hin th ca hai trang, trang ny o trn trang kia.
printPreviewControl.Rows = 2;
// Gn lai PrintDocument d lm ti preview.
printPreviewControl.Document = doc;
}
}
// (Bo qua phn m cho lp TextDocument - Xem mc 8.14)
17'
17' 2u n l* tc v in 2u n l* tc v in
#eA JwA QeO hAB >X_J d>UJ >@ OIQ QSJ DU @A >X_J OIQ >\AB LW@ @A(
Sg hUAB *in&ows Management /nstr%mentation( #eA J^ Q>t YP] Q>TAB Q@A Q
>\AB LW@ @A F`AB OIQ QHZ] DPA DE@ YEd inDAR/rintKob, D\ FeA J^ Q>t fg hUAB JSJ
d>V[AB Q>~J /ause D\ &esume Jbc JSJ YEd inDAR/rintKob D\ inDAR/rinter Lt
ZRA Y >\AB LW@(
@"nAow8 &anagemen/ <n8/rumen/a/"on g@&<h cho phXp &*n l' .t l$ng ln cc th4ng tin
h thDng &5ng .t cG php giDng tru' vn. "t trong cc c4ng vic . &*n cF th th=c hin
vi @&< l l' )anh sch cc tc v in ang ch8 ceng vi th4ng tin v .#i tc v. L*n c?ng
cF th th=c hin cc thao tc nh in v phc hti .t tc v ho!c tt c cc tc v cho .t .'
in. l sO )ng @&<8 &*n cNn th>. .t tha. chiIu In *y8/em.&anagemen/.ADD.
ng )ng )i <' th=c hin .t tru' vn @&< l' )anh sch tt c cc tc v in ang ch
tr>n .' t2nh v hin thi <E cho .#i tc v trong .t ListBox. whi ngi )eng ch0n .t
it(.8 .t tru' vn N' hMn s@ $c th=c hin8 v cc chi tiIt v tc v in n' $c hin thi
trong .t TextBox. PuDi ceng8 ngi )eng cF th nh/p nGt Pau8e v =e8ume sau khi ch0n .t
tc v tha' si tr*ng thi ca nF.
using System;
using System.Windows.Forms;
using System.Management;
using System.Collections;
334
Chng 8: $ haE a shng `innE }~ in n
public class PrintueueTest : System.Windows.Forms.Form {
private System.Windows.Forms.ListBox lstJobs;
private System.Windows.Forms.Button cmdRefresh;
private System.Windows.Forms.TextBox txtJobInfo;
private System.Windows.Forms.Button cmdPause;
private System.Windows.Forms.Button cmdResume;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
// (Bo qua phn m designer.)
private void PrintueueTest_Load(object sender, System.EventArgs e) {

cmdRefresh_Click(null, null);
}
private void cmdRefresh_Click(object sender, System.EventArgs e) {

// Chon tt ca cc tc v in dang ch.
string query = "SELECT FROM Win32_PrintJob";
ManagementObjectSearcher jobuery =
new ManagementObjectSearcher(query);
ManagementObjectCollection jobs = jobuery.Get();
// Thm cc tc v trong hng doi vo ListBox.
lstJobs.Items.Clear();
txtJobInfo.Text = "";
foreach (ManagementObject job in jobs) {
lstJobs.Items.Add(job["JobID"]);
}
}
// Phng thc ny thc hin truy vn WMI v tra v
// tc v WMI cho item hin dang doc chon trong ListBox.
private ManagementObject GetSelectedJob() {
335
Chng 8: $ haE a shng `innE }~ in n
try {
// Chon tc v in phu hop.
string query = "SELECT FROM Win32_PrintJob " +
"WHERE JobID='" + lstJobs.Text + "'";
ManagementObjectSearcher jobuery =
new ManagementObjectSearcher(query);
ManagementObjectCollection jobs = jobuery.Get();
IEnumerator enumerator = jobs.GetEnumerator();
enumerator.MoveNext();
return (ManagementObject)enumerator.Current;
}catch (InvalidOperationException){
// Thuc tnh Current cua enumerator khng hop l
return null;
}
}
private void lstJobs_SelectedIndexChanged(object sender,
System.EventArgs e) {

ManagementObject job = GetSelectedJob();
if (job == null) {
txtJobInfo.Text = "";
return;
}
// Hin th thng tin v tc v.
string jobInfo = "Document: " + job["Document"].ToString();
jobInfo += Environment.NewLine;
jobInfo += "DriverName: " + job["DriverName"].ToString();
jobInfo += Environment.NewLine;
jobInfo += "Status: " + job["Status"].ToString();
jobInfo += Environment.NewLine;
jobInfo += "Owner: " + job["Owner"].ToString();
336
Chng 8: $ haE a shng `innE }~ in n
jobInfo += Environment.NewLine;
jobInfo += "PagesPrinted: " +
job["PagesPrinted"].ToString();
jobInfo += Environment.NewLine;
jobInfo += "TotalPages: " + job["TotalPages"].ToString();
if (job["JobStatus"] != null) {
txtJobInfo.Text += Environment.NewLine;
txtJobInfo.Text += "JobStatus: " +
job["JobStatus"].ToString();
}
if (job["StartTime"] != null) {
jobInfo += Environment.NewLine;
jobInfo += "StartTime: " + job["StartTime"].ToString();
}
txtJobInfo.Text = jobInfo;
}
private void cmdPause_Click(object sender, System.EventArgs e) {

if (lstJobs.SelectedIndex == -1) return;
ManagementObject job = GetSelectedJob();
if (job == null) return;

// Tam dung tc v.
int returnValue = Int32.Parse(
job.InvokeMethod("Pause", null).ToString());
// Hin th thng tin v gi tr tra v.
if (returnValue == 0) {
MessageBox.Show("Successfully paused job.");
}else {
MessageBox.Show(
"Unrecognized return value when pausing job.");
337
Chng 8: $ haE a shng `innE }~ in n
}
}
private void cmdResume_Click(object sender, System.EventArgs e) {

if (lstJobs.SelectedIndex == -1) return;
ManagementObject job = GetSelectedJob();
if (job == null) return;

if ((Int32.Parse(job["StatusMask"].ToString()) & 1) == 1) {

// Phc hi tc v.
int returnValue = Int32.Parse(
job.InvokeMethod("Resume", null).ToString());
// Hin th thng tin v gi tr tra v.
if (returnValue == 0) {
MessageBox.Show("Successfully resumed job.");
}else if (returnValue == 5) {
MessageBox.Show("Access denied.");
}else {
MessageBox.Show(
"Unrecognized return value when resuming job.");
}
}
}
}
338
Chng 8: $ haE a shng `innE }~ in n
0nh 8'14 Ly thng tin t hng doi in
Hh r5ng cc 9u'n @"nAow8 cF th ngvn &*n t*. )Qng ho!c g &V .t tc v in )o .t
ngi )eng khc t*o ra. 7h=c ra8 cc 9u'n n' ckn cF th ngvn &*n l' th4ng tin tr*ng thi
v cF th g<' ra ngo*i l.
CSJ d>V[AB Q>~J *M/ s>SJ O\ FeA J^ Q>t fg hUAB QHXAB OIQ sMJ> FRA @A FcX
BO #dd/rinterConnection, $et-e*ault/rinter, Cancel#llKobs, D\ /rint)est/age,
QPQ JR LGZ Y\O D@qJ DE@ YEd inDAR/rinter( !t J^ Q>CO Q>TAB Q@A DG *M/, FeA >}]
Q>cO s>RX Q\@ Y@qZ MSN Qe@ LMc J> [http://msdn.mic%oso't.com/&i(%a%)/en*
us/wmisd+/ wmi/compute%#s)stem#ha%dwa%e#c&asses.asp](
18'
18' 0 d ng 5icroso$t /gent 0 d ng 5icroso$t /gent
#eA OZKA ~AB hUAB Jbc OlA> J^ fn QHW B@d Jbc A>?AB A>A DNQ >XeQ >lA> A>V
QHXAB Microsoft *or&, Microsoft E8cel(((
Sg hUAB L@GZ s@tO Microsoft ;gent(
&")ro8o?/ >gen/ l .t k thu6t )eng th>. cc nh<n v6t ho*t h%nh cF t2nh tMng tc vo
:ng )ng ha' trang (&. 72nh tMng tc l ch:c nvng ch2nh 'Iu ca k thu6t &")ro8o?/ >gen/\
cc nh<n v6t &")ro8o?/ >gen/ cF th nFi v p l*i Nu vo ca ngi )eng th4ng 9ua vic
nh6n )*ng v tsng h$p gi0ng nFi. &")ro8o?/ sO )ng k thu6t n' trong cc :ng )ng nh
@orA8 E2)eD8 v PowerPo"n/T giGp ngi )eng t%. c<u tr li cho nhKng c<u hVi v hiu cch
th:c ho*t ng ca :ng )ng. &")ro8o?/ cung cp th4ng tin v k thu6t &")ro8o?/ >gen/ t*i
8ZZZ>;#c?o<oft>co;:;<B2DntH>
liu ki. &")ro8o?/ >gen/ cho phXp ngi )eng tMng tc vi cc :ng )ng v trang (&
th4ng 9ua gi0ng nFiE)*ng giao tiIp t= nhi>n nht ca con ngi. whi ngi )eng nFi vo
.icro8 iu ki. n' sO )ng .t & .' nh6n )*ng gi0ng nFiE<' l :ng )ng )ich <.
thanh Nu vo tQ .icro thnh ng4n ngK . .' t2nh hiu $c. liu ki. &")ro8o?/ >gen/
339
Chng 8: $ haE a shng `innE }~ in n
c?ng sO )ng .t & .' t(;tztozsp((chE<' l :ng )ng )ich cc tQ )o ngi )eng nh6p
vo thnh <. thanh cF th ngh( $c 9ua loa.
liu ki. &")ro8o?/ >gen/ cho phXp &*n tru' ;ut &Dn nh<n v6t S $c inh nghqa snE
6en"e gvi thNnh8 &erD"n gthu6t sqh8 PeeAy gcon vth v =o44y gngi .'h. "#i nh<n v6t cF
.t t6p cc hnh ng . &*n cF th sO )ng trong :ng )ng nh5. .inh h0a cc 9uan i.
ha' ch:c nvng khc nhau. Ph~ng h*n8 t6p cc hnh ng ca PeeAy gt. cc )*ng &a' khc
nhau . &*n cF th sO )ng )ich chu'n PeeAy tr>n .n h%nh. L*n c?ng cF th t= t*o cho
.%nh cc nh<n v6t ho*t h%nh vi s= tr$ giGp ca &")ro8o?/ >gen/ Chara)/er EA"/or v
&")ro8o?/ L"ngu"8/") *ounA EA"/"ng TooD gcF trong qa PU 2nh k1.h.
u2 ) )i <' .inh h0a cch ;<' )=ng .t :ng )ng Mn gin vi iu ki. &")ro8o?/
>gen/. ng )ng n' gt. hai ComboBox )eng ch0n .t nh<n v6t v .t hnh ng. whi
ngi )eng ch0n cc ComboBox n'8 nh<n v6t $c ch0n s@ ;ut hin v th=c hin hnh ng
$c ch0n. ng )ng n' sO )ng vic nh6n )*ng v tsng h$p gi0ng nFi iu khin cc
hnh ng ca nh<n v6t\ ngi )eng cF th &o nh<n v6t th=c hin hnh ng &5ng cch nhn
ph2. *)roDD Lo)k v rti 0c t>n hnh ng vo .icro. u2 ) n' c?ng cho phXp ngi )eng
chu'n sang .t nh<n v6t .i &5ng cch g0i t>n nh<n v6t8 v ckn t*o th>. .t lnh te' &iIn
l &oBeTo&ou8e. Hgoi ra8 nh<n v6t c?ng s@ 0c &t c: t(;t no . ngi )eng nh6p vo
TextBox. 7rc khi ch*' v2 ) n'8 &*n phi ci !t iu ki. &")ro8o?/ >gen/8 & .' nh6n
)*ng gi0ng nFi8 & .' t(;tztozsp((ch8 v cc inh nghqa nh<n v6t gcF trong qa PU 2nh
k1.h.
l cF th th>. iu ki. &")ro8o?/ >gen/ vo )= n8 &*n hS' nh/p phi vo hp c4ng c v
ch0n >AAX=emoBe </em8. wI F8 vo thj CF& ComKonen/88 v ch0n &")ro8o?/ >gen/ 2.0. Hh
thI8 &")ro8o?/ >gen/ s@ $c th>. vo vo hp c4ng c. whi &*n th iu ki. n' l>n for.8
cc <n/eroK >88em4Dy cNn thiIt s@ $c sinh ra v $c th>. vo )= n.
0nh 8'15 Chn Microsoft Agent Control 2.0 trong ca s Customize Toolbox
public class FrmAgent : System.Windows.Forms.Form
340
Chng 8: $ haE a shng `innE }~ in n
{
// (Bo qua phn m designer.)
// i tong agent hin tai.
private AgentObjects.IAgentCtlCharacter mSpeaker;
// Phng thc th l s kin KeyDown cua txtLocation.
private void txtLocation_KeyDown(object sender,
System.Windows.Forms.KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
// Thit lp ni lu tr nhn vt vo txtLocation.
string location = txtLocation.Text;
// Khoi tao cc nhn vt.
try
{
// Nap cc nhn vt vo di tong agent.
mainAgent.Characters.Load("Genie", location & "Genie.acs")
mainAgent.Characters.Load("Merlin", location + "Merlin.acs");
mainAgent.Characters.Load("Peedy", location & "Peedy.acs")
mainAgent.Characters.Load("Robby", location & "Robby.acs")
// V hiu txtLocation v kch hoat cc diu kim khc.
txtLocation.Enabled = false;
txtSpeech.Enabled = true;
cmdSpeak.Enabled = true;
characterCombo.Enabled = true;
actionsCombo.Enabled = true;

// Thit lp nhn vt hin tai l Merlin v hin nhn vt ny.
mSpeaker = mainAgent.Characters["Merlin"];
GetAnimationNames(); // Thu ly danh sch hnh dng.
341
Chng 8: $ haE a shng `innE }~ in n
mSpeaker.Show(0);
}
catch (FileNotFoundException)
{
MessageBox.Show("Invalid character location", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
// Phng thc th l s kin Click cua nt Speak.
private void cmdSpeak_Click(System.Object sender, System.EventArgs e)
{
// Nu txtSpeech rng, nhn vt nhc ngi dung nhp text vo txtSpeech.
if (txtSpeech.Text == "")
{
mSpeaker.Speak("Please type the words you want me to speak", "");
}
else
{
mSpeaker.Speak(txtSpeech.Text, "");
}
}
// Phng thc th l s kin Click cua agent.
private void mainAgent_ClickEvent(object sender,
AxAgentObjects._AgentEvents_ClickEvent e)
{
mSpeaker.Play("Confused");
mSpeaker.Speak("Why are you poking me", "");
mSpeaker.Play("RestPose");
}
// Phng thc th l s kin SelectedIndexChanged cua characterCombo
// (ngi dung chon nhn vt mi).
private void characterCombo_SelectedIndexChanged(System.Object sender,
System.EventArgs e)
342
Chng 8: $ haE a shng `innE }~ in n
{
ChangeCharacter(characterCombo.Text);
}
// An nhn vt hin tai v hin nhn vt mi.
private void ChangeCharacter(string name)
{
mSpeaker.Hide(0);
mSpeaker = mainAgent.Characters[name];
GetAnimationNames(); // Sinh lai danh sch hnh dng.
mSpeaker.Show(0);
}
// Thu ly tn cc hnh dng v da vo actionsCombo.
private void GetAnimationNames()
{
// Bao dam tnh an ton v tiu trnh.
object synclockObject = (this);
Monitor.Enter(synclockObject);
try
{
// Ly tn cc hnh dng.
IEnumerator enumerator =
mainAgent.Characters.Character(mSpeaker.Name).
AnimationNames.GetEnumerator();
string voiceString;
// Xa actionsCombo.
actionsCombo.Items.Clear();
mSpeaker.Commands.RemoveAll();
// Thm tt ca cc hnh dng (cho php ra lnh bng giong ni).
while (enumerator.MoveNext())
{
voiceString = Convert.ToString(enumerator.Current);
343
Chng 8: $ haE a shng `innE }~ in n
voiceString = voiceString.Replace("_", "underscore");
actionsCombo.Items.Add(enumerator.Current);
mSpeaker.Commands.Add(Convert.ToString(enumerator.Current), ""
voiceString, true, false);
}
// Thm lnh tuy bin.
mSpeaker.Commands.Add("MoveToMouse", "MoveToMouse",
"Move To Mouse", true, true);
}
finally
{
Monitor.Exit(synclockObject);
}
}
// Phng thc th l s kin SelectedIndexChanged cua actionsCombo
// (ngi dung chon hnh dng mi).
private void actionsCombo_SelectedIndexChanged(System.Object sender,
System.EventArgs e)
{
mSpeaker.Stop(null);
mSpeaker.Play(actionsCombo.Text);
mSpeaker.Play("RestPose");
}
// Phng thc th l s kin Command cua agent.
private void mainAgent_Command(System.Object sender,
AxAgentObjects._AgentEvents_CommandEvent e)
{
AgentObjects.IAgentCtlUserInput command =
((AgentObjects.IAgentCtlUserInput)(e.userInput));
// i nhn vt nu ngi dung doc tn nhn vt.
if (command.Voice == "Peedy" || command.Voice == "Robby" ||
command.Voice == "Merlin" || command.Voice == "Genie")
344
Chng 8: $ haE a shng `innE }~ in n
{
ChangeCharacter(command.Voice);
return;
}
// Gui agent dn chut.
if (command.Name == "MoveToMouse")
{
mSpeaker.MoveTo(Convert.ToInt16(Cursor.Position.X - 60),
Convert.ToInt16(Cursor.Position.Y - 60), null);
return;
}
// Thc hin hnh dng mi.
mSpeaker.Stop(null);
mSpeaker.Play(command.Name);
}
}
345
Chng 8: $ haE a shng `innE }~ in n
0nh 8'16 ng dung th nghim Microsoft Agent
9
346
Ch01n2 c4^IL`M TH /-CM VQ I:J
347
348
Chng 9: PimzE `h oecE }~ "SC
c lp <XF ca &")ro8o?/ .NET gt. hai lo*i ch2nh. yo*i th: nht tru' ;ut th4ng tin
tQ h thDng fil( v cho phXp th=c hin cc thao tc tr>n h thDng fil( gnh chXp fil(8
chu'n th .ch. nai lp ti>u &iu l FileInfo v DirectoryInfo. yo*i th: hai 9uan
tr0ng hMn8 gt. rt nhiu lp cho phXp 0c v ghi )K liu tQ .0i kiu str(a.. |tr(a. cF th
tMng :ng vi .t fil( nhi ph<n ha' vvn &n8 .t fil( trong kh4ng gian lu trK ri>ng8 .t kIt
nDi .*ng8 ho!c .t veng . & nh. 7rong .0i trng h$p8 cch th:c tMng tc vi str(a.
u nh nhau. 7rong chMng n'8 chGng ta s@ ;(. ;Xt cc lp h thDng fil( v cc lp )=az
tr>nzstr(a..
P
Pc .c trong chMng n' tr%nh &' cc vn sau\
7ru' ;ut v sOa si cc th4ng tin ca .t fil( ha' .t th .c gcc .c c.Z8 c.]8 c._8
c.`8 v c.Zah.
PhXp8 )i chu'n8 ;Fa fil( ha' th .c g.c c.^h.
nin thi ng .t c<' th .c trong .t :ng )ng )=aztr>nz@"nAow8 g.c c.ah v sO
)ng cc hp tho*i fil( g.c c.Z[h.
l0c v ghi fil( vvn &n g.c c.[h v fil( nhi ph<n g.c c.bh8 c?ng nh t*o fil( t*.
g.c c.Z`h v fil( trong .t kh4ng gian lu trK ri>ng ca ngi )eng g.c c.Zbh.
l0c fil( .t cch &t tng & g.c c.ch.
7%. fil( g.c c.Zdh v ki. tra hai fil( cF treng nhau ha' kh4ng g.c c.ZZh.
y. vic vi cc chu#i cF ch:a th4ng tin ng )3n g.c c.Z] In c.Z_h.
7h(o )}i s= tha' si ca h thDng fil( g.c c.Zch.
phi ra csng CF& g.c c.]dh.
1'
1' Truy xu t cc th,ng tin v $ile hay th m c Truy xu t cc th,ng tin v $ile hay th m c
#eA JwA QHZ] vZPQ JSJ Q>TAB Q@A DG OIQ @Y >c] OIQ Q>V OUJ, J>AB >eA AB\] QeX
>c] JSJ Q>ZIJ QaA> Jbc J>AB(
TeX LK@ QVWAB $!stem.E(."ileEn*o J>X @Y >c] LK@ QVWAB
$!stem.E(.-irector!En*o J>X Q>V OUJ( ScZ L^, QHZ]GA LVoAB hpA QE@ @Y >c] Q>V
OUJ L^ QHXAB d>V[AB Q>~J s>@ hnAB( CSJ Q>TAB Q@A JwA Q>@jQ fm LVWJ QHZ] vZPQ
Q>TAB Zc JSJ Q>ZIJ QaA> Jbc LK@ QVWAB(
l t*o .t Di t$ng FileInfo ha' DirectoryInfo8 &*n cNn tru'n ng )3n tMng Di ha'
N' trong phMng th:c khCi )=ng ca nF. L*n cF th l' cc th4ng tin v fil( ha' th .c
th4ng 9ua cc thuc t2nh ca Di t$ng tMng :ng. Lng c.Z lit k> cc thnh vi>n ca lp
FileInfo v DirectoryInfo\
Bfng 9'1 Cc thnh vin ca ilenfo v irectorynfo
Th~nh }itn Thuc mrs ?i `f
349
Chng 9: PimzE `h oecE }~ "SC
Exists
FileInfo v
DirectoryInfo
7r v true ha' false8 te' thuc vo fil( ha'
th .c cF ttn t*i C ng )3n $c chJ inh
ha' kh4ng.
Attributes
FileInfo v
DirectoryInfo
7r v .t ho!c nhiu gi tri thuc kiu lit
k> System.IO.FileAttributes8 cho &iIt cc
thuc t2nh ca fil( ha' th .c.
CreationTime8
LastAccessTime8 v
LastWriteTime
FileInfo v
DirectoryInfo
7r v cc th hin System.DateTime cho &iIt
khi no .t fil( ha' th .c $c t*o ra8 tru'
;ut lNn cuDi8 v c6p nh6t lNn cuDi.
FullName8 Name8 v
Extension
FileInfo v
DirectoryInfo
7r v .t chu#i ch:a t>n N' 8 t>n th .c
ha' t>n fil( gceng phNn .C rngh8 v phNn .C
rng.
Length FileInfo
7r v k2ch thc fil( gt2nh th(o &'t(h.
DirectoryName v
Directory
FileInfo
DirectoryName tr v chu#i ch:a t>n ca th
.c chaT Directory tr v Di t$ng
DirectoryInfo .4 t th .c cha8 cho phXp
&*n tru' ;ut th>. th4ng tin v nF.
Parent v Root
DirectoryInfo
7r v Di t$ng DirectoryInfo .4 t th
.c cha ha' th .c gDc.
CreateSubdirectory DirectoryInfo
7*o .t th .c &>n trong th .c $c .4
t &Ci Di t$ng DirectoryInfo8 t>n th .c
cNn t*o $c tru'n cho phMng th:c. 7r v
Di t$ng DirectoryInfo .4 t th .c con
vQa t*o.
GetDirectories DirectoryInfo
7r v .ng cc Di t$ng DirectoryInfo8
.#i Di t$ng .4 t .t th .c con trong
th .c n'.
GetFiles DirectoryInfo
7r v .ng cc Di t$ng FileInfo8 .#i Di
t$ng .4 t .t fil( trong th .c n'.
PhG B hai i. 9uan tr0ng khi sO )ng cc Di t$ng FileInfo v DirectoryInfo\
7t c cc thuc t2nh ca Di t$ng FileInfo v DirectoryInfo $c 0c nga' lNn Nu
ti>n &*n tru' ;ut .t thuc t2nh no F. HIu fil( ha' th .c tha' si sau thi i.
n'8 &*n phi g0i phMng th:c Refresh c6p nh6t cc thuc t2nh.
|@ kh4ng cF l#i nIu &*n chJ inh .t ng )3n kh4ng tMng :ng vi .t fil( ha' th
.c ang ttn t*i khi t*o .t Di t$ng FileInfo ha' DirectoryInfo. 7ha' vo F8 &*n
s@ nh6n $c .t Di t$ng .4 t fil( ha' th .c kh4ng ttn t*iEthuc t2nh Exists
ca nF cF gi tri false. L*n cF th sO )ng Di t$ng n' t*o fil( ha' th .c &5ng
cch g0i phMng th:c Create ca nF. HIu &*n tru' ;ut thuc t2nh khc8 ngo*i l
FileNotFoundException ha' DirectoryNotFoundException s@ &i nX..
350
Chng 9: PimzE `h oecE }~ "SC
ng )ng Con8oDe )i <' nh6n .t ng )3n fil( tQ )kng lnh8 v rti hin thi th4ng tin v
fil( v th .c ch:a fil(.
351
Chng 9: PimzE `h oecE }~ "SC
using System;
using System.IO;
public class FileInformation {
private static void Main(string[] args) {
if (args.Length == 0) {
Console.WriteLine("Please supply a file name:);
return;
}
FileInfo file = new FileInfo(args[0]);
// Hin th thng tin file.
Console.WriteLine("Checking file: " + file.Name);
Console.WriteLine("File exists: " + file.Exists.ToString());
if (file.Exists) {
Console.Write("File created: ");
Console.WriteLine(file.CreationTime.ToString());
Console.Write("File last updated: ");
Console.WriteLine(file.LastWriteTime.ToString());
Console.Write("File last accessed: ");
Console.WriteLine(file.LastAccessTime.ToString());
Console.Write("File size (bytes): ");
Console.WriteLine(file.Length.ToString());
Console.Write("File attribute list: ");
Console.WriteLine(file.Attributes.ToString());
}
Console.WriteLine();
// Hin th thng tin th mc.
DirectoryInfo dir = file.Directory;
352
Chng 9: PimzE `h oecE }~ "SC

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();
}
}
HIu &*n th=c thi lnh "ileEn*ormation c:,%indo%s,%in.ini8 kIt ;ut cF th nh sau\
Checking file: win.ini
File exists: True
File created: 2001-08-23 8:00:00 AM
File last updated: 2003-03-22 9:55:16 AM
File last accessed: 2003-05-26 2:21:53 PM
File size (bytes): 2128
File attribute list: Archive
Checking directory: windows
In directory: c:
Directory exists: True
Directory created: 2000-01-01 8:03:33 AM
353
Chng 9: PimzE `h oecE }~ "SC
Directory last updated: 2003-05-26 2:25:25 PM
Directory last accessed: 2003-05-26 2:25:25 PM
Directory attribute list: Directory
Directory contains: 14 files
#eA J^ Q>t fg hUAB JSJ d>V[AB Q>~J QA> Jbc YEd "ile D\ -irector! Q>c] J>X JSJ
d>V[AB Q>~J Jbc YEd "ileEn*o D\ -irector!En*o, A>VAB FeA d>R@ QHZ]GA QCA @Y
>c] LVoAB hpA Ox@ YwA B@( THXAB QHVoAB >Wd Q>nJ >@qA A>@GZ Q>cX QSJ DE@ JrAB
OIQ @Y >c] Q>V OUJ Q>l fg hUAB JSJ YEd "ileEn*o D\ -irector!En*o A>cA> >[A,
Dl J>AB Q>nJ >@qA s@tO QHc FRX ONQ J> OIQ YwA(
2'
2' Thi t l % cc thu c t7nh c a $ile v th m c Thi t l % cc thu c t7nh c a $ile v th m c
#eA JwA s@tO QHc >c] Q>c] L@ JSJ Q>ZIJ QaA> Jbc @Y >c] Q>V OUJ(
TeX LK@ QVWAB $!stem.E(."ileEn*o J>X @Y >c] QeX LK@ QVWAB
$!stem.E(.-irector!En*o J>X Q>V OUJ( ScZ L^, fg hUAB JSJ QXSA Qg ;N iSk D\
3> iTk Lt Q>c] L@ B@S QHM Jbc Q>ZIJ QaA> #ttributes(
Pc thuc t2nh FileInfo.Attributes v DirectoryInfo.Attributes .4 t cc thuc t2nh ca
fil( nh ar)h"Be8 8y8/em8 h"AAen8 reaAIonDy8 )omKre88eA8 v en)ryK/eA gtha. kho th>. trong
ti liu &*ENh. u% .t fil( cF th cF nhiu thuc t2nh n>n Attributes l .t t6p cc gi tri
kiu lit k>. l ki. tra ha' tha' si .t thuc t2nh Mn lj8 &*n cNn sO )ng cc phXp ton
tr>n &it.
u2 ) sau nh6n vo .t fil( v ki. tra thuc t2nh reaAIonDy\
using System;
using System.IO;
public class Attributes {
private static void Main() {
// Gia su file ny c thuc tnh archive v read-only.
FileInfo file = new FileInfo("data.txt");
// Lnh ny s hin th chui "ReadOnly, Archive".
Console.WriteLine(file.Attributes.ToString());
// iu kin di dy sai, v cn c thuc tnh khc
// d doc thit lp.
if (file.Attributes == FileAttributes.ReadOnly) {
Console.WriteLine("File is read-only (faulty test).");
354
Chng 9: PimzE `h oecE }~ "SC
}
// iu kin di dy dng, v n ch loc ra
// thuc tnh read-only.
if ((file.Attributes & FileAttributes.ReadOnly) ==
FileAttributes.ReadOnly) {
Console.WriteLine("File is read-only (correct test).");
}
Console.ReadLine();
}
}
!t >@tZ LVWJ Da hU QHCA, FeA JwA F@jQ H`AB #ttributes LVWJ QeX Q>\A> i heAB
A>M d>Ak F@ OIQ h}] JSJ J>? fK ( D\ #, J>AB >eA (((#((##( Mx@ J>? fK # J>X
F@jQ OIQ Q>ZIJ QaA> LVWJ Q>@jQ YNd, Ox@ J>? fK ( J>X F@jQ OIQ Q>ZIJ QaA> s>TAB
LVWJ Q>@jQ YNd( 3>@ FeA fg hUAB d>d ;N, A^ fm fX fSA> Ox@ J>? fK A\] DE@ Ox@
J>? fK QV[AB ~AB QHXAB B@S QHM Y@qQ sC( Va hU, AjZ FeA ;N B@S QHM ((#((((# iOT
QR Q>ZIJ QaA> archi"e D\ rea&?onl:k DE@ B@S QHM Y@qQ sC (((((((# iOT QR Q>ZIJ QaA>
rea&?onl:k, sjQ ZR fm Y\ (((((((# iJ> J^ LVWJ J>? fK # s>@ JR >c@ DM QHa QV[AB
~AB LGZ Y\ #k(
whi thiIt l6p .t thuc t2nh8 &*n c?ng phi sO )ng phXp ton tr>n &it. 7rong trng h$p n'8
&*n cNn cxn th6n kh4ng v4 B ;Fa cc thuc t2nh khc.
// Ch thm thuc tnh read-ony.
file.Attributes = file.Attributes | FileAttributes.ReadOnly;
// Ch xa thuc tnh read-only.
file.Attributes = file.Attributes & ~FileAttributes.ReadOnly;
3'
3' Ch:%8 chuy n8 x'a $ile hay th m c Ch:%8 chuy n8 x'a $ile hay th m c
#eA JwA J>d, J>Z]tA, v^c OIQ @Y >c] Q>V OUJ
TeX LK@ QVWAB $!stem.E(."ileEn*o J>X @Y >c] LK@ QVWAB
$!stem.E(.-irector!En*o J>X Q>V OUJ, QHZ]GA LVoAB hpA J>X d>V[AB Q>~J s>@
hnAB( Sg hUAB JSJ d>V[AB Q>~J Jbc LK@ QVWAB Lt J>d, J>Z]tA, v^c(
Pc lp FileInfo v DirectoryInfo cung cp nhiu phMng th:c )eng thao tc tr>n fil( v
th .c. Lng c.] v c.^ tr%nh &' cc phMng th:c ca lp FileInfo v DirectoryInfo.

Bfng 9'2 Cc phng thc dng d thao tc di tong ilenfo


Phng `hcc ?i `f
355
Chng 9: PimzE `h oecE }~ "SC
CopyTo
PhXp .t fil( sang ng )3n .i8 t>n fil( $c chJ inh
trong Di sD. HF c?ng tr v .t Di t$ng FileInfo .4 t fil(
.i $c chXp. L*n cF th tru'n th>. .t th4ng sD te' ch0n
cF gi tri true cho phXp chXp 1.
Create v CreateText
Create t*o fil( $c chJ inh v tr v .t Di t$ng
FileStream )eng ghi ra fil(. CreateText c?ng th=c hin nh
thI8 nhng tr v Di t$ng StreamWriter gFi l' str(a.. {(.
.c c.[ v c.b cF th>. th4ng tin v vic ghi fil(.
Open8 OpenRead8 OpenText8
v OpenWrite
"C .t fil( gnIu nF ttn t*ih. OpenRead v OpenText .C fil(
trong chI chJz0c8 tr v .t Di t$ng FileStream ha'
StreamReader. OpenWrite .C fil( trong chI chJzghi8 tr v
.t Di t$ng FileStream. {(. th>. .c c.[ v c.b cF
th>. th4ng tin v vic 0c fil(.
Delete
{Fa fil( gnIu nF ttn t*ih.
MoveTo
Phu'n .t fil( In ng )3n .i8 t>n fil( $c chJ inh
trong Di sD. MoveTo c?ng $c sO )ng si t>n .t fil( .
kh4ng chu'n ch#.
Bfng 9'3 Cc phng thc dng d thao tc di tong irectorynfo
Phng `hcc ?i `f
Create
7*o th .c $c chJ inh. HIu ng )3n chJ inh nhiu th
.c cha ttn t*i8 tt c s@ $c t*o .t l$t.
CreateSubdirectory
7*o .t th .c vi t>n c th &>n trong th .c $c .4 t
&Ci Di t$ng DirectoryInfo. HF c?ng tr v .t Di t$ng
DirectoryInfo .4 t th .c con.
Delete
{Fa .t th .c gnIu nF ttn t*ih. HIu .uDn ;Fa .t th .c
cF ch:a cc th .c khc8 &*n phi sO )ng phMng th:c n*p
chtng Delete chp nh6n .t th4ng sD cF t>n l recursive v
thiIt l6p nF l true.
MoveTo
Phu'n .t th .c In ng )3n .i. MoveTo cF th $c
sO )ng si t>n .t th .c . kh4ng chu'n ch#.
yp DirectoryInfo kh4ng cF phMng th:c no )eng sao chXp th .c. 7u' nhi>n8 &*n cF
th )r )ng viIt $c .t phMng th:c nh thI )=a tr>n k thu6t 9u' v phMng th:c
CopyTo ca Di t$ng FileInfo\
using System;
using System.IO;
public class FileSystemUtil {
356
Chng 9: PimzE `h oecE }~ "SC
public static void CopyDirectory(DirectoryInfo source,
DirectoryInfo destination) {
if (!destination.Exists) {
destination.Create();
}
// Chp tt ca file.
FileInfo[] files = source.GetFiles();
foreach (FileInfo file in files) {
file.CopyTo(Path.Combine(destination.FullName, file.Name));
}
// Xu l cc th mc con.
DirectoryInfo[] dirs = sourceDir.GetDirectories();
foreach (DirectoryInfo dir in dirs) {
// Ly th mc dch.
string destinationDir = Path.Combine(destination.FullName,
dir.Name);
// Goi d quy CopyDirectory().
CopyDirectory(dir, new DirectoryInfo(destinationDir));
}
}
}
u2 ) sau sO )ng phMng th:c vQa viIt C tr>n chXp th .c8 ng )3n cc th .c $c
tru'n 9ua )kng lnh\
public class CopyDir {
private static void Main(string[] args) {
if (args.Length != 2) {
357
Chng 9: PimzE `h oecE }~ "SC
Console.WriteLine("usage: " +
"CopyDir [sourcePath] [destinationPath]");
return;
}
DirectoryInfo sourceDir = new DirectoryInfo(args[0]);
DirectoryInfo destinationDir = new DirectoryInfo(args[1]);
FileSystemUtil.CopyDirectory(new DirectoryInfo(sourceDir),
new DirectoryInfo(destinationDir));
Console.WriteLine("Copy complete.");
Console.ReadLine();
}
}
4' 4' T7nh "7ch th c c a th m c T7nh "7ch th c c a th m c
#eA JwA QaA> saJ> Q>VEJ Jbc QPQ JR @Y A`O QHXAB OIQ Q>V OUJ i>X_J JR QHXAB
JSJ Q>V OUJ JXA Jbc A^k(
DZ]qQ Zc QPQ JR @Y QHXAB Q>V OUJ, QaA> QAB JSJ Q>ZIJ QaA> "ileEn*o.+engt. Jbc
J>AB( Sg hUAB s Q>ZNQ Lq Z] Lt QaA> J>X JR JSJ @Y A`O QHXAB JSJ Q>V OUJ
JXA(
yp DirectoryInfo kh4ng cF thuc t2nh no tr v th4ng tin k2ch thc. 7u' nhi>n8 &*n cF th
)r )ng t2nh $c k2ch thc ca tt c cc fil( n5. trong .t th .c &5ng thuc t2nh
FileInfo.Length.
RhMng th:c )i <' sO )ng k thu6t tr>n v cF th te' ch0n )u't 9u' 9ua cc th .c
con\
using System;
using System.IO;
public class FileSystemUtil {
public static long CalculateDirectorySize(DirectoryInfo directory,
bool includeSubdirectories) {
long totalSize = 0;
// Duyt tt ca cc file trong th mc.
358
Chng 9: PimzE `h oecE }~ "SC
FileInfo[] files = directory.GetFiles();
foreach (FileInfo file in files) {
totalSize += file.Length;
}
// Duyt tt ca cc th mc con.
if (includeSubdirectories) {
DirectoryInfo[] dirs = directory.GetDirectories();
foreach (DirectoryInfo dir in dirs) {
totalSize += CalculateDirectorySize(dir, true);
}
}
return totalSize;
}
}
u )i <' l :ng )ng thO nghi. phMng th:c tr>n\
using System;
using System.IO;
public class CalculateDirSize {
private static void Main(string[] args) {
if (args.Length == 0) {
Console.WriteLine("Please supply a directory path.");
return;
}
DirectoryInfo dir = new DirectoryInfo(args[0]);
Console.WriteLine("Total size: " +
FileSystemUtil.CalculateDirectorySize(dir, true).ToString() +
" bytes.");
Console.ReadLine();
359
Chng 9: PimzE `h oecE }~ "SC
}
}
5'
5' Truy xu t th,ng tin %hin ! n c a $ile Truy xu t th,ng tin %hin ! n c a $ile
#eA JwA QHZ] vZPQ JSJ Q>TAB Q@A DG d>@CA FRA Jbc @Y A>V p%9lisher, re"ision
n%m9er, comment
Sg hUAB d>V[AB Q>~J QA> 7et>ersionEn*o Jbc YEd $!stem.-iagnostics.
"ile>ersionEn*o(
.NET Framework cho phXp &*n tru' ;ut cc th4ng tin v fil( . kh4ng cNn )=a vo
@"nAow8 >P<. L*n chJ cNn sO )ng lp FileVersionInfo v g0i phMng th:c GetVersionInfo
vi Di sD l t>n fil(. wI F8 &*n cF th tru' ;ut th4ng tin th4ng 9ua cc thuc t2nh ca
FileVersionInfo.
using System;
using System.Diagnostics;
public class VersionInfo {
private static void Main(string[] args) {
if (args.Length == 0) {
Console.WriteLine("Please supply a file name.");
return;
}
FileVersionInfo info = FileVersionInfo.GetVersionInfo(args[0]);
// Hin th cc thng tin v phin ban.
Console.WriteLine("Checking File: " + info.FileName);
Console.WriteLine("Product Name: " + info.ProductName);
Console.WriteLine("Product Version: " + info.ProductVersion);
Console.WriteLine("Company Name: " + info.CompanyName);
Console.WriteLine("File Version: " + info.FileVersion);
Console.WriteLine("File Description: " + info.FileDescription);
Console.WriteLine("Original Filename: " + info.OriginalFilename);
Console.WriteLine("Legal Copyright: " + info.LegalCopyright);
Console.WriteLine("InternalName: " + info.InternalName);
Console.WriteLine("IsDebug: " + info.IsDebug);
360
Chng 9: PimzE `h oecE }~ "SC
Console.WriteLine("IsPatched: " + info.IsPatched);
Console.WriteLine("IsPreRelease: " + info.IsPreRelease);
Console.WriteLine("IsPrivateBuild: " + info.IsPrivateBuild);
Console.WriteLine("IsSpecialBuild: " + info.IsSpecialBuild);

Console.ReadLine();
}
}
Ui <' l kIt ;ut khi &*n ch*' lnh >ersionEn*o c:,%indo%s,explorer.exe\
Checking File: c:windowsexplorer.exe
Product Name: Microsoft Windows Operating System
Product Version: 6.00.2600.0000
Company Name: Microsoft Corporation
File Version: 6.00.2600.0000 (xpclient.01081-1148)
File Description: Windows Explorer
Original Filename: EXPLORER.EXE
Legal Copyright: Microsoft Corporation. All rights reserved.
InternalName: explorer
IsDebug: False
IsPatched: False
IsPreRelease: False
IsPrivateBuild: False
IsSpecialBuild: False
6' 6' 0 d ng TreeView hi n th c6y th m c Iust-in-time 0 d ng TreeView hi n th c6y th m c Iust-in-time
#eA JwA >@tA Q>M OIQ J] Q>V OUJ QHXAB )ree>ie%( TZ] A>@CA, D@qJ YPd Lw] JPZ
QHJ J] Q>V OUJ s>@ s>@ LIAB QKA ZS A>@GZ Q>o@ B@cA(
T>CO JPd Q>V OUJ LwZ Q@CA D\X )ree>ie%, D\ Q>CO OIQ AQ B@R iAk D\X Ox@
A>SA>( P>RA ~AB Ye@ fn s@qA )ree>ie%.6e*ore0xpand Lt Q>CO JSJ Q>V OUJ JXA D\X
OIQ A>SA> QHVEJ s>@ A^ LVWJ >@tA Q>M(
L*n cF th sO )ng k thu6t 9u' ;<' )=ng ton & c<' th .c. 7u' nhi>n8 vic 9uXt h
thDng fil( th(o cch n' cF th ch6.8 !c &it Di vi cc s qa ln. u% lB )o n'8 cc phNn
.. 9un lB fil( chu'>n nghip g&ao gt. @"nAow8 E2KDorerh sO )ng .t k thu6t khc\ chJ
hin thi nhKng th4ng tin no ngi )eng cNn In.
361
Chng 9: PimzE `h oecE }~ "SC
TreeView rt th2ch h$p vi cch tiIp c6n n' v% nF cung cp s= kin BeforeExpand gs= kin
n' pht sinh trc khi .t cp .i $c hin thih. L*n cF th sO )ng .t KDa)ehoDAer gnh
)u hoa thi ha' nGt r#ngh trong tt c cc nhnh cha $c th>. vo. liu n' cho phXp &*n
th>. vo cc phNn ca c<' th .c khi chGng $c hin thi.
l sO )ng kiu gii php n'8 &*n cNn &a 'Iu tD sau\
RhMng th:c FillEth>. .t cp .i vo .t th .c. L*n s@ sO )ng phMng th:c
n' th>. vo cc cp khi chGng $c .C rng.
RhMng th:c th lB s= kin Form.LoadEsO )ng Fill t*o c<' vi cp Nu ti>n.
RhMng th:c th lB s= kin TreeView.BeforeExpandEphn :ng khi ngi )eng .C
rng .t nGt v g0i Fill nIu th4ng tin ca th .c n' cha $c th>..
Ui <' l phNn .S cho for.\
using System;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
public class DirectoryTree : System.Windows.Forms.Form {
private System.Windows.Forms.TreeView treeDirectory;
// (Bo qua phn m designer.)
private void Fill(TreeNode dirNode) {
DirectoryInfo dir = new DirectoryInfo(dirNode.FullPath);

// Mt ngoai l c th b nm nu ban khng c
// du quyn thao tc trn file hay th mc.
// Ban c th bt v bo qua ngoai l ny.
foreach (DirectoryInfo dirItem in dir.GetDirectories()) {
// Thm nt gia cho th mc.
TreeNode newNode = new TreeNode(dirItem.Name);
dirNode.Nodes.Add(newNode);
newNode.Nodes.Add("");
}
}
private void DirectoryTree_Load(object sender, System.EventArgs e) {
362
Chng 9: PimzE `h oecE }~ "SC
// Thit lp nt du tin.
TreeNode rootNode = new TreeNode("C:");
treeDirectory.Nodes.Add(rootNode);
// Thm cp th nht v mo rng n.
Fill(rootNode);
treeDirectory.Nodes[0].Expand();
}
private void treeDirectory_BeforeExpand(object sender,
System.Windows.Forms.TreeViewCancelEventArgs e) {
// Nu tm thy mt nt gia, xa n v doc cc th mc tht.
if (e.Node.Nodes[0].Text == "") {
e.Node.Nodes.Clear();
Fill(e.Node);
}
}
}
0nh 9'1 Mt cy th muc vi TreeView
363
Chng 9: PimzE `h oecE }~ "SC
7'
7' c v ghi $ile v4n ! n c v ghi $ile v4n ! n
#eA JwA B>@ h? Y@qZ D\X OIQ @Y DA FRA Q>X s@tZ O} >^c ;SC//, 7nico&e, >c]
7TF?G(
TeX OIQ LK@ QVWAB $!stem.E(."ile$tream Q>cO J>@jZ LjA @Y( !t B>@ @Y, >}] B^@
"ile$tream QHXAB OIQ $!stem.E(.$treamriter D\ fg hUAB d>V[AB Q>~J Aed
J>AB rite( !t LJ @Y, >}] B^@ "ile$tream QHXAB OIQ $!stem.E(.$tream&eader
D\ fg hUAB d>V[AB Q>~J &ead >c] &ead+ine(
.NET cho phXp &*n ghi ha' 0c vvn &n &5ng lp StreamWriter v StreamReader. whi ghi )K
liu vi StreamWriter8 hS' sO )ng phMng th:c StreamWriter.Write. RhMng th:c n' $c
n*p chtng h# tr$ tt c cc kiu )K liu th4ng thng trong C# .NET8 &ao gt. chu#i8 kB
t=8 sD ngu'>n8 sD th=c )u ch. ng8 sD th6p ph<n8... 7u' nhi>n8 phMng th:c Write lu4n
chu'n )K liu thnh vvn &n. HIu .uDn chu'n vvn &n n' trC v kiu &an Nu th% &*n n>n
sO )ng WriteLine &o . .#i gi tri $c !t tr>n .t )kng ri>ng.
PF nhiu cch .4 t .t chu#i )i )*ng nhi ph<n8 te' thuc vo cch .S hFa. Pc kiu .S
hFa th4ng thng l\
>*C<<EsO )ng [ &it .S hFa .#i kB t= trong chu#i. UK liu $c .S hFa th(o
>*C<< kh4ng th ch:a cc kB t= Qn")oAe .C rng. whi sO )ng kiu .S hFa >*C<<
trong .NET8 cc &it $c . th>. .ng &'t( kIt 9u s@ cF Z &'t( cho .#i kB t=.
FuDD Qn")oAe8 ha' QTFI1YEsO )ng Za &it .S hFa .#i kB t= trong chu#i8 n>n .ng
&'t( kIt 9u s@ cF ] &'t( cho .#i kB t=.
QTFIL Qn")oAeEsO )ng [ &it cho cc kB t= >*C<< &%nh thng v nhiu c!p [ &it cho
cc kB t= .C rng. wiu .S hFa n' ch 'Iu )eng cho cc giao th:c [ &it8 ch~ng h*n
ma"D.
QTFIU Qn")oAeEsO )ng b &it cho cc kB t= >*C<< &%nh thng v nhiu c!p b &it cho
cc kB t= .C rng. "ng &'t( kIt 9u s@ cF Z &'t( cho .#i kB t= ggi sO kh4ng cF kB
t= .C rngh.
.NET cung cp .t lp cho .#i kiu .S hFa trong kh4ng gian t>n System.Text. whi sO )ng
StreamReader v StreamWriter8 &*n cF th chJ inh kiu .S hFa ho!c sO )ng kiu .!c inh
l QTFIU.
whi 0c th4ng tin8 sO )ng phMng th:c Read ha' ReadLine ca lp StreamReader. RhMng
th:c Read 0c .t kB t=8 ha' sD kB t= )o &*n chJ inh8 v tr v .t kB t= ha' .ng kB t=.
RhMng th:c ReadLine tr v .t chu#i ch:a ton & ni )ung .t hng.
ng )ng Con8oDe )i <' .inh h0a vic ghi v 0c .t fil( vvn &n\
using System;
using System.IO;
using System.Text;
public class TextFileTest {
364
Chng 9: PimzE `h oecE }~ "SC
private static void Main() {
// Tao file mi.
FileStream fs = new FileStream("test.txt", FileMode.Create);
// Tao mt writer v ch dnh kiu m ha.
// Kiu mac dnh (UTF-8) h tro k t Unicode,
// nhng m ha cc k t chun ging nh ASCII
StreamWriter w = new StreamWriter(fs, Encoding.UTF8);
// Ghi mt s thp phn, mt chui, v mt k t.
w.WriteLine(124.23M);
w.WriteLine("Test string");
w.WriteLine('!');
// Bao dam tt ca d liu doc ghi tu buffer.
w.Flush();
// ng file.
w.Close();
fs.Close();
Console.WriteLine("Press Enter to read the information.");
Console.ReadLine();
// Mo file trong ch d ch-doc.
fs = new FileStream("test.txt", FileMode.Open);
StreamReader r = new StreamReader(fs, Encoding.UTF8);
// oc d liu v chuyn n v kiu thch hop.
Console.WriteLine(Decimal.Parse(r.ReadLine()));
Console.WriteLine(r.ReadLine());
Console.WriteLine(Char.Parse(r.ReadLine()));
r.Close();
fs.Close();
365
Chng 9: PimzE `h oecE }~ "SC
Console.ReadLine();
}
}
8'
8' c v ghi $ile nh %h6n c v ghi $ile nh %h6n
#eA JwA B>@ h? Y@qZ D\X @Y A>M d>A DE@ s@tZ h? Y@qZ OeA>(
TeX OIQ LK@ QVWAB $!stem.E(."ile$tream Q>cO J>@jZ LjA @Y( !t B>@ @Y, >}] B^@
"ile$tream QHXAB OIQ $!stem.E(.6inar!riter D\ fg hUAB d>V[AB Q>~J Aed
J>AB rite( !t LJ @Y, >}] B^@ "ile$tream QHXAB OIQ $!stem.E(.6inar!&eader
D\ fg hUAB d>V[AB Q>~J &ead d>r >Wd DE@ s@tZ h? Y@qZ(
.NET cho phXp &*n ghi ha' 0c )K liu nhi ph<n &5ng lp BinaryWriter v BinaryReader. whi
ghi )K liu vi BinaryWriter8 hS' sO )ng phMng th:c BinaryWriter.Write. RhMng th:c
n' $c n*p chtng h# tr$ tt c kiu )K liu th4ng thng trong C# .NET8 &ao gt. chu#i8
kB t=8 sD ngu'>n8 sD th=c )u ch. ng8 sD th6p ph<n8... 7h4ng tin sau F $c .S hFa thnh
.t )S' cc &'t( v ghi vo fil(. L*n cF th chJ inh kiu .S hFa cho chu#i &5ng .t phMng
th:c khCi )=ng n*p chtng nh6n .t Di t$ng System.Text.Encoding l. Di sD gS $c .4
t trong .c c.[h.
|O )ng fil( nhi ph<n thao tc vi cc kiu )K liu th% kh ph:c t*p8 v% khi tru' ;ut th4ng
tin8 &*n phi sO )ng .t trong nhKng phMng th:c Read kiu .*nh ca BinaryReader. u2 )\
.uDn tru' ;ut )K liu )*ng th6p ph<n th% phi sO )ng ReadDecimalT ckn .uDn 0c .t
chu#i th% phi sO )ng ReadString gBinaryWriter lu4n ghi l*i chiu )i ca chu#i khi ghi
chu#i vo fil( trnh l#ih.
ng )ng Con8oDe )i <' .inh h0a vic ghi v 0c .t fil( nhi ph<n\
using System;
using System.IO;
public class BinaryFileTest {
private static void Main() {
// Tao file v tao writer.
FileStream fs = new FileStream("test.txt", FileMode.Create);
BinaryWriter w = new BinaryWriter(fs);
// Ghi mt s thp phn, hai chui, v mt k t.
w.Write(124.23M);
w.Write("Test string");
366
Chng 9: PimzE `h oecE }~ "SC
w.Write("Test string 2");
w.Write('!');
// Bao dam tt ca d liu doc ghi tu buffer.
w.Flush();
// ng file.
w.Close();
fs.Close();
Console.WriteLine("Press Enter to read the information.");
Console.ReadLine();
// Mo file trong ch d ch-doc.
fs = new FileStream("test.txt", FileMode.Open);
// Hin th d liu th trong file.
StreamReader sr = new StreamReader(fs);
Console.WriteLine(sr.ReadToEnd());
Console.WriteLine();
// oc d liu v chuyn n v kiu thch hop.
fs.Position = 0;
BinaryReader br = new BinaryReader(fs);
Console.WriteLine(br.ReadDecimal());
Console.WriteLine(br.ReadString());
Console.WriteLine(br.ReadString());
Console.WriteLine(br.ReadChar());
fs.Close();
Console.ReadLine();
}
}
367
Chng 9: PimzE `h oecE }~ "SC
9'
9' c $ile m t cch ! t ng ! c $ile m t cch ! t ng !
#eA JwA LJ h? Y@qZ Q OIQ @Y O\ s>TAB d>R@ hAB ZS QHlA> Q>nJ Q>@ O} YqA>
Jbc FeA( 3 Q>ZNQ A\] Q>VoAB LVWJ fg hUAB s>@ @Y LVWJ YVZ QH? QHXAB OIQ A[@
J^ QKJ LI QHZ] vZPQ J>NO iJ>AB >eA OIQ Lc OeABk(
TeX OIQ YEd Lt LJ @Y OIQ JSJ> FPQ LAB FI( #{Q LwZ LJ OIQ s>K@ h? Y@qZ F`AB
d>V[AB Q>~J "ile$tream.6egin&ead, D\ QHZ]GA d>V[AB Q>~J JcYYFcJs( 3>@
JcYYFcJs LVWJ saJ> >XeQ, B@ "ile$tream.0nd&ead Lt QHZ] vZPQ h? Y@qZ, vg Y A^,
D\ LJ s>K@ h? Y@qZ sj Q@jd DE@ 6egin&ead(
FileStream h# tr$ ho*t ng &t tng & th4ng 9ua phMng th:c BeginRead v EndRead. |O
)ng cc phMng th:c n'8 &*n cF th 0c .t khDi )K liu tr>n .t trong cc tiu tr%nh )o
thr(a)zpool cung cp . kh4ng cNn sO )ng tr=c tiIp cc lp tiu tr%nh trong kh4ng gian t>n
System.Threading.
whi 0c fil( .t cch &t tng &8 &*n cNn ;c inh k2ch thc khDi )K liu trong .t lNn
0c. 7e' trng h$p8 &*n cF th .uDn 0c .t khDi )K liu nhV gv2 )8 chXp tQng khDi .t
sang fil( khch ho!c khDi )K liu tMng Di ln gv2 )8 &*n cNn .t l$ng th4ng tin nht inh
trc khi ;O lB vic g% Fh. L*n chJ inh k2ch thc khDi khi g0i BeginRead8 v tru'n .t &
. ch:a )K liu. u% BeginRead v EndRead cNn tru' ;ut nhiu .xu th4ng tin giDng nhau
gch~ng h*n FileStream8 & .8 k2ch thc khDi8...h8 &*n n>n Fng gFi .S lnh 0c fil( &t
tng & trong .t lp.
ui lp AsyncProcessor trong v2 ) )i <'8 phMng th:c c4ng khai StartProcess &/t Nu
9u tr%nh 0c &t tng &. "#i khi 9u tr%nh 0c hon tt8 OnCompletedRead $c k2ch ho*t v
khDi )K liu $c ;O lB. HIu ckn )K liu trong fil(8 .t 9u tr%nh 0c &t tng & .i s@
$c khCi ch*'. w2ch thc khDi & nh l ] wL g]d_b &'t(h.
using System;
using System.IO;
using System.Threading;
public class AsyncProcessor {
private Stream inputStream;
// Kch thc mi khi d liu l 2 KB.
private int bufferSize = 2048;
public int BufferSize {
get {return bufferSize;}
set {bufferSize = value;}
}
368
Chng 9: PimzE `h oecE }~ "SC
// B dm cha d liu.
private byte[] buffer;

public AsyncProcessor(string fileName) {
buffer = new byte[bufferSize];
// Mo file, truyn gi tr true d h tro truy xut bt dng b.
inputStream = new FileStream(fileName, FileMode.Open,
FileAccess.Read, FileShare.Read, bufferSize, true);
}
public void StartProcess() {
// Bt du qu trnh doc bt dng b.
inputStream.BeginRead(buffer, 0, buffer.Length,
new AsyncCallback(OnCompletedRead), null);
}
private void OnCompletedRead(IAsyncResult asyncResult) {
// Mt khi d doc doc. Truy xut d liu.
int bytesRead = inputStream.EndRead(asyncResult);
// Nu khng doc doc byte no, stream dang o cui file.
if (bytesRead 0) {
// Tam dung d gia lp vic xu l d liu.
Console.WriteLine("t[ASYNC READER]: Read one block.");
Thread.Sleep(TimeSpan.FromMilliseconds(20));
// Bt du doc khi k tip.
inputStream.BeginRead(buffer, 0, buffer.Length,
new AsyncCallback(OnCompletedRead), null);
}else {
369
Chng 9: PimzE `h oecE }~ "SC
// Kt thc.
Console.WriteLine("t[ASYNC READER]: Complete.");
inputStream.Close();
}
}
}
u2 ) )i sO )ng AsyncProcessor 0c .t fil( cF k2ch thc Z "L.
public class AsynchronousIO {
public static void Main() {
// Tao file thu nghim c kch thc 1MB.
FileStream fs = new FileStream("test.txt", FileMode.Create);
fs.SetLength(1000000);
fs.Close();
// Bt du xu l bt dng b trn mt tiu trnh khc.
AsyncProcessor asyncIO = new AsyncProcessor("test.txt");
asyncIO.StartProcess();
// Cung thi dim ny, thc hin cng vic khc.
// O dy chng ta s lap trong 10 giy.
DateTime startTime = DateTime.Now;
while (DateTime.Now.Subtract(startTime).TotalSeconds 10) {
Console.WriteLine("[MAIN THREAD]: Doing some work.");
// Tam dung d gia lp mt thao tc tn nhiu thi gian.
Thread.Sleep(TimeSpan.FromMilliseconds(100));
}
Console.WriteLine("[MAIN THREAD]: Complete.");
Console.ReadLine();
// Xa file thu.
File.Delete("test.txt");
}
370
Chng 9: PimzE `h oecE }~ "SC
}
u <' l kIt ;ut khi ch*' :ng )ng thO nghi.\
[MAIN THREAD]: Doing some work.
[ASYNC READER]: Read one block.
[ASYNC READER]: Read one block.
[MAIN THREAD]: Doing some work.
[ASYNC READER]: Read one block.
[ASYNC READER]: Read one block.
[ASYNC READER]: Read one block.
[ASYNC READER]: Read one block.
[MAIN THREAD]: Doing some work.
[ASYNC READER]: Read one block.
[ASYNC READER]: Read one block.
[ASYNC READER]: Read one block.
. . .
10'
10' T&m $ile %h( h % m t !i u th c wildcard T&m $ile %h( h % m t !i u th c wildcard
#eA JwA vg Y A>@GZ @Y J^ L@tO J>ZAB, hnc D\X F@tZ Q>~J YJ A>V H.&ll >c]
m:sheet'(II.8ls(
Sg hUAB d>@CA FRA Aed J>AB Jbc d>V[AB Q>~J $!stem.E(.-irector!En*o.
7et"iles A>NA OIQ F@tZ Q>~J YJ D\ QHR DG OIQ ORAB JSJ LK@ QVWAB "ileEn*o(
Pc Di t$ng DirectoryInfo v Directory u cho phXp )k trong th .c hin hnh t%.
cc fil( phe h$p vi .t &iu th:c l0c. Pc &iu th:c n' thng sO )ng cc kB t= il)car)
nh a v i. L*n c?ng cF th sO )ng k thu6t tMng t= l' cc th .c phe h$p vi .t
.3u nht inh &5ng phMng th:c n*p chtng DirectoryInfo.GetDirectories.
u2 ) )i <' s@ l' t>n ca tt c cc fil( trong .t th .c phe h$p vi .t &iu th:c l0c.
7h .c v &iu th:c l0c $c tru'n 9ua )kng lnh.
using System;
using System.IO;
public class WildcardTest {
private static void Main(string[] args) {
if (args.Length != 2) {
Console.WriteLine(
371
Chng 9: PimzE `h oecE }~ "SC
"USAGE: WildcardTest [directory] [filterExpression]");
return;
}
DirectoryInfo dir = new DirectoryInfo(args[0]);
FileInfo[] files = dir.GetFiles(args[1]);

// Hin th tn v kch thc file.
foreach (FileInfo file in files) {
Console.Write("Name: " + file.Name + " ");
Console.WriteLine("Size: " + file.Length.ToString());
}
Console.ReadLine();
}
}
HIu .uDn t%. trong th .c con8 &*n cNn sO )ng 9u'. Hhiu .c trong chMng sO )ng
k thu6t 9u' ;O lB fil(8 ch~ng h*n c.^ v c._.
11'
11' .i m tra hai $ile c' tr(ng nhau hay "h,ng .i m tra hai $ile c' tr(ng nhau hay "h,ng
#eA JwA fX fSA> AI@ hZAB Jbc >c@ @Y D\ vSJ LMA> J>AB J^ QHrAB A>cZ >c]
s>TAB(
TaA> O} FO Jbc Ox@ @Y F`AB YEd $!stem.$ecurit!.Cr!ptograp.!.Has.#lgorit.m
H@ fX fSA> JSJ O} FO(
PF nhiu cch so snh nhiu fil(. u2 )8 cF th ;Xt .t phNn ca fil( ;(. cF giDng nhau8
ho!c 0c c fil( so snh tQng &'t(. P hai cch tr>n u Gng8 nhng trong .t sD trng h$p8
sO )ng .S &v. thu6n tin hMn.
"t gii thu6t &v. sinh ra .t )*ng nhi ph<n !c trng gvi k2ch thc nhV8 thng khong
]d &'t(h cho fil(. PF kh nvng hai fil( khc nhau cF ceng .S &v.8 nhng kh nvng n' hNu
nh kh4ng ;' ra. 7h=c tI8 c nhKng tha' si nhV nht gch~ng h*n8 chJ tha' si .t &it ca
fil( ngutnh c?ng cF `d kh nvng tha' si cc &it ca .S &v.. Uo F8 .S &v. thng $c
sO )ng pht hin )K liu &i sOa si g.S &v. s@ $c c6p chi tiIt hMn trong chMng Z_h.
l t*o .t .S &v.8 trc hIt &*n phi t*o .t Di t$ng HashAlgorithm &5ng phMng th:c
tqnh HashAlgorithm.Create. |au F g0i HashAlgorithm.ComputeHash nh6n .t .ng &'t(
ch:a .S &v..
u2 ) )i <' 0c hai t>n fil( tQ Di sD )kng lnh v ki. tra hai fil( n' cF treng nhau ha'
kh4ng\
using System;
using System.IO;
372
Chng 9: PimzE `h oecE }~ "SC
using System.Security.Cryptography;
public class CompareFiles {
private static void Main(string[] args) {
if (args.Length != 2) {
Console.WriteLine("USAGE: CompareFiles [fileName] " +
[fileName]");
return;
}
Console.WriteLine("Comparing " + args[0] + " and " + args[1]);
// Tao di tong bam.
HashAlgorithm hashAlg = HashAlgorithm.Create();
// Tnh m bam cho file th nht.
FileStream fsA = new FileStream(args[0], FileMode.Open);
byte[] hashBytesA = hashAlg.ComputeHash(fsA);
fsA.Close();
// Tnh m bam cho file th hai.
FileStream fsB = new FileStream(args[1], FileMode.Open);
byte[] hashBytesB = hashAlg.ComputeHash(fsB);
fsB.Close();
// So snh m bam.
if (BitConverter.ToString(hashBytesA) ==
BitConverter.ToString(hashBytesB)) {
Console.WriteLine("Files match.");
}else {
Console.WriteLine("No match.");
}
373
Chng 9: PimzE `h oecE }~ "SC

Console.ReadLine();
}
}
Pc .S &v. $c so snh &5ng cch chu'n chGng thnh chu#i. L*n c?ng cF th )u't 9ua
.ng v so snh tQng &'t(. Pch n' nhanh hMn .t 2t8 nhng vic chu'n ]d &'t( thnh
chu#i kh4ng tDn nhiu chi ph2 n>n kh4ng cNn thiIt.
12'
12' Thao tc trn ng d n $ile $ Thao tc trn ng d n $ile $
#eA JwA YP] OIQ d>wA LVoAB hpA @Y >X_J s@tO QHc OIQ LVoAB hpA @Y J^
heAB J>ZA >c] s>TAB(
%g Y LVoAB hpA F`AB YEd $!stem.E(./at.( #eA J^ Q>t fg hUAB /at..7et"ile=ame
Lt YP] QCA @Y Q LVoAB hpA, /at..C.ange0xtension Lt Q>c] L@ d>wA O HIAB Jbc
LVoAB hpA, D\ /at..Combine Lt QeX LVoAB hpA Lw] Lb O\ s>TAB JwA ZcA QO
Q>V OUJ Jbc FeA L} J^ s Qn d>A JSJ> Q>V OUJik >c] J>Vc(
7hng khF thao tc vi cc ng )3n fil( v% cF v4 sD cch .4 t .t th .c. u2 )8
&*n cF th sO )ng ng )3n tu't Di gCNHTemKh8 ng )3n QNC
gHH&y*erBerHH&y*hareHTemKh8 ho!c .t trong cc ng )3n tMng Di gCNHTemKH&yF"De8H..H
ha' CNHTemKH&yF"De8H..H..HTemKh.
Pch )r nht ;O lB cc ng )3n fil( l sO )ng cc phMng th:c tqnh ca lp Path &o
. cF th4ng tin Gng. u2 )8 o*n .S sau tr2ch t>n fil( tQ .t ng )3n fil(\
string filename = @"..SystemMyFile.txt";
filename = Path.GetFileName(filename);
// filename by gi l "MyFile.txt".
u o*n .S sau sO )ng Path.Combine th>. t>n fil( vo ng )3n th .c\
string filename = @"....myfile.txt";
string fullPath = @"c:Temp";
filename = Path.GetFileName(filename);
fullPath = Path.Combine(fullPath, filename);
// fullPath by gi l "c:Tempmyfile.txt".
Pch n' cF u i. l kB t= ph<n cch th .c gh s@ t= ng $c th>. vo ng )3n nIu
cNn thiIt.
yp Path c?ng cung cp cc phMng th:c hKu 2ch sau <' thao tc tr>n th4ng tin ng
)3n\
ChangeExtensionEtha' si phNn .C rng ca fil(. HIu phNn .C rng .i kh4ng $c
chJ inh8 phNn .C rng hin t*i s@ &i ;Fa.
374
Chng 9: PimzE `h oecE }~ "SC
GetDirectoryNameEtr v th4ng tin ca cc th .c n5. giKa kB t= ph<n cch th .c
gh Nu v cuDi.
GetFileNameWithoutExtensionEtMng t= nh GetFileName8 nhng &V phNn .C rng.
GetFullPathEkh4ng cF tc )ng Di vi ng )3n tu't Di8 v nF sO )ng th .c
hin hnh si .t ng )3n tMng Di thnh ng )3n tu't Di. u2 )8 nIu
CNHTemKH l th .c hin hnh8 g0i GetFullPath cho fil( /e8/./2/ s@ tr v CNHTemKH
/e8/./2/.
GetPathRootEtr v chu#i ch:a th .c gDc gv2 )8 CNHh. lDi vi ng )3n tMng
Di8 nF tr v tha. chiIu r#ng.
HasExtensionEtr v true nIu ng )3n kIt thGc vi phNn .C rng.
IsPathRootedEtr v true nIu ng )3n l tu't Di8 false nIu ng )3n l tMng
Di.
THXAB >wZ >jQ QHVoAB >Wd, OIQ ABXe@ Yq fm FM AO AjZ FeA QHZ]GA LVoAB hpA
s>TAB >Wd Yq J>X OIQ QHXAB JSJ d>V[AB Q>~J A\] iJ>AB >eA, LVoAB hpA J^
J>~c JSJ s Qn s>TAB >Wd Yqk( TZ] A>@CA, A>?AB LVoAB hpA s>TAB >Wd Yq hX
J>~c JSJ s Qn @YhJcHh fm s>TAB Y\O f@A> Hc ABXe@ Yq(
13' 13' +c nh ng d n t ng ng v i m t $ile hay th m c $ +c nh ng d n t ng ng v i m t $ile hay th m c $
#eA J^ OIQ LVoAB hpA i heAB J>Zx@k, D\ JwA vSJ LMA> A^ QV[AB ~AB DE@ OIQ Q>V
OUJ >c] OIQ @Y(
3@tO QHc LVoAB hpA DE@ d>V[AB Q>~J -irector!.0xists D\ "ile.0xists(
P hai lp System.IO.Directory v System.IO.File u cF phMng th:c Exists.
Directory.ExistsEtr v true nIu ng )3n gtMng Di ho!c tu't Dih tMng :ng
vi .t th .c ang ttn t*i.
File.ExistsEtr v true nIu ng )3n tMng :ng vi .t fil( ang ttn t*i.
|O )ng hai phMng th:c n'8 &*n cF th nhanh chFng ;c inh .t ng )3n cF tMng :ng
vi .t fil( ha' th .c ha' kh4ng8 nh v2 ) sau\
using System;
using System.IO;
public class FileOrPath {
private static void Main(string[] args) {
foreach (string arg in args) {
375
Chng 9: PimzE `h oecE }~ "SC
Console.Write(arg);
if (Directory.Exists(arg)) {
Console.WriteLine(" is a directory");
}
else if (File.Exists(arg)) {
Console.WriteLine(" is a file");
}
else {
Console.WriteLine(" does not exist");
}
}
Console.ReadLine();
}
}
14'
14' 9m vi c v i ng d n t ng i $ 9m vi c v i ng d n t ng i $
#eA JwA Q>@jQ YNd Q>V OUJ Y\O D@qJ >@qA >\A> Lt J^ Q>t fg hUAB LVoAB hpA
QV[AB LK@ QHXAB O} YqA> Jbc FeA(
Sg hUAB d>V[AB Q>~J QA> 7etCurrent-irector! D\ $etCurrent-irector! Jbc YEd
$!stem.E(.-irector!(
lng )3n tMng Di t= ng $c )irn )ich )=a tr>n 9uan h vi th .c hin hnh. L*n cF
th l' th .c hin hnh &5ng phMng th:c Directory.GetCurrentDirectory ho!c tha' si
nF &5ng phMng th:c Directory.SetCurrentDirectory. Hgoi ra8 &*n cF th sO )ng phMng
th:c tqnh GetFullPath ca lp System.IO.Path chu'n ng )3n tMng Di thnh ng
)3n tu't Di.
Ui <' l .t v2 ) .inh h0a\
using System;
using System.IO;
public class RelativeDirTest {
private static void Main() {
Console.WriteLine("Using: " + Directory.GetCurrentDirectory());
Console.WriteLine("The relative path 'file.txt' " +
"will automatically become: '" +
376
Chng 9: PimzE `h oecE }~ "SC
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();
}
}
wIt ;ut ca :ng )ng n' cF th nh sau gnIu &*n ch*' :ng )ng trong th .c CNHTemKh\
Using: C:Temp
The relative path 'file.txt' will automatically become 'C:Tempfile.txt'
Changing current directory to C:
The relative path 'file.txt' will automatically become 'C:file.txt'
NjZ fg hUAB LVoAB hpA QV[AB LK@, FeA ACA Q>@jQ YNd Q>V OUJ Y\O D@qJ s>@ F{Q
LwZ QV[AB QSJ DE@ @Y( NjZ s>TAB, J^ Q>t RA> >VAB LjA fn cA QX\A Jbc >q Q>KAB
AjZ ABVo@ hrAB JK Q>c] L@ Q>V OUJ Y\O D@qJ Lt ~AB hUAB Jbc FeA QHZ] vZPQ
>X_J B>@ L @Y >q Q>KAB(
15'
15' T o $ile t m T o $ile t m
#eA JwA QeX OIQ @Y fm LVWJ L_Q QHXAB Q>V OUJ QeO Jbc ABVo@ hrAB JU Q>t D\ fm
J^ QCA hZ] A>PQ, Lt A^ s>TAB LUAB LI DE@ JSJ @Y QeO LVWJ f@A> Hc F@ JSJ
J>V[AB QHlA> s>SJ(
Sg hUAB d>V[AB Q>~J QA> 7et)emp"ile=ame Jbc YEd $!stem.E(./at., d>V[AB Q>~J
A\] QHR DG OIQ LVoAB hpA sjQ >Wd LVoAB hpA LjA Q>V OUJ QeO DE@ OIQ QCA @Y
LVWJ QeX A>pZ A>@CA(
PF nhiu cch t*o fil( t*.. 7rong cc trng h$p Mn gin8 &*n chJ cNn t*o .t fil( trong
th .c :ng )ng8 cF th sO )ng .t 6Q<E ho!c .t t(. thi gian kIt h$p vi .t gi tri
ng3u nhi>n l. t>n fil(. 7u' nhi>n8 lp Path h# tr$ .t phMng th:c giGp &*n tDn c4ng
hMn. HF s@ t*o ra .t fil( vi t>n )u' nht trong th .c t*. ca ngi )eng hin hnh8
ch~ng h*n CNHEo)umen/8 anA *e//"ng8Hu8ernameHLo)aD *e//"ng8HTemKH/mKa)T./mK.
377
Chng 9: PimzE `h oecE }~ "SC
using System;
using System.IO;
public class TemporaryFile {
private static void Main() {
string tempFile = Path.GetTempFileName();
Console.WriteLine("Using " + tempFile);
FileStream fs = new FileStream(tempFile, FileMode.Open);
// (Ghi d liu.)
fs.Close();
// Xa file.
File.Delete(tempFile);
Console.ReadLine();
}
}
16'
16' 9 y dung l ng Ja cn tr ng 9 y dung l ng Ja cn tr ng
#eA JwA vQ OIQ Lc D\ vSJ LMA> JyA FcX A>@CZ F]Q QHKAB(
Sg hUAB >\O s>TAB6LVWJ6ZRA6Y *in)' ;,/ 7et-is:"ree$pace0x, i>\O A\]
LVWJ s>c@ FSX QHXAB kernell)'.&llk(
wh4ng lp no trong cc lp v h thDng fil( ca .NET cho phXp ;c inh )ung l$ng qa ckn
trDng. 7u' nhi>n8 &*n cF th )r )ng l' $c th4ng tin n' &5ng h. @"nC2 >P<
GetDiskFreeSpaceEx. n. n' s@ tr v )ung l$ng tsng cng8 )ung l$ng ckn trDng8 v
)ung l$ng ckn trDng cF th sO )ng $c gnh 9un tri cF th sO )ng E"8k uo/a
&anagemen/ h*n chI )ung l$ng . ngi )eng cF th sO )ng $ch.
378
Chng 9: PimzE `h oecE }~ "SC
0nh 9'2 isk Quota Management
ng )ng Con8oDe )i <' .inh h0a k thu6t n'\
using System;
using System.Runtime.InteropServices;
public class GetFreeSpace {
[DllImport("kernel32.dll", EntryPoint="GetDiskFreeSpaceExA" )]
private static extern long GetDiskFreeSpaceEx(
string lpDirectoryName, out long lpFreeBytesAvailableToCaller,
out long lpTotalNumberOfBytes, out long lpTotalNumberOfFreeBytes);
private static void Main() {
long result, total, free, available;
result = GetDiskFreeSpaceEx("c:", out available, out total,
out free);
379
Chng 9: PimzE `h oecE }~ "SC
if (result != 0) {
Console.WriteLine("Total Bytes: {0:N}", total);
Console.WriteLine("Free Bytes: {0:N}", free);
Console.WriteLine("Available Bytes: {0:N}", available);
}
Console.ReadLine();
}
}
17' 17' -i n th cc h % tho i $ile -i n th cc h % tho i $ile
#eA JwA >@qA JSJ >Id Q>Xe@ *in&ows J>ZA Lt O, YVZ @Y, D\ Lt J>A Q>V OUJ(
Sg hUAB JSJ YEd (pen"ile-ialog, $ave"ile-ialog, D\ "older6ro%ser-ialog Q>ZIJ
s>TAB B@cA QCA $!stem.indo%s."orms( G@ d>V[AB Q>~J $.o%-ialog Lt >@tA Q>M
>Id Q>Xe@, vQ B@S QHM QHR DG Lt vSJ LMA> ABVo@ hrAB L} A>PA 3! >c] Cancel, D\
YP] Q>TAB Q@A Q Q>ZIJ QaA> "ile=ame >c] $elected/at.(
.NET cung cp cc Di t$ng &0c l' nhiu hp tho*i @"nAow8 chuxn8 &ao gt. cc hp tho*i
)eng .C v lu fil(8 v ch0n th .c. 7t c cc lp n' u thQa kI tQ
System.Windows.Forms.CommonDialog8 &ao gt.\
OpenFileDialogEcho phXp ngi )eng ch0n .t fil(. 7>n fil( v ng )3n cF th
$c l' tQ thuc t2nh FileName gha' t6p h$p FileNames8 nIu &*n cho phXp ch0n nhiu
fil( &5ng cch thiIt l6p Multiselect l trueh. Hgoi ra8 &*n cF th sO )ng thuc t2nh
Filter ch0n inh )*ng fil( v thiIt l6p thuc t2nh CheckFileExists ki. tra t2nh
h$p l g;(. h%nh c.^h.

380
Chng 9: PimzE `h oecE }~ "SC
0nh 9'3 Openileialog
SaveFileDialogEcho phXp ngi )eng chJ inh .t fil( .i. 7>n fil( v ng )3n cF
th $c l' tQ thuc t2nh FileName. L*n cF th sO )ng thuc t2nh Filter ch0n inh
)*ng fil( v thiIt l6p cc thuc t2nh CreatePrompt v OverwritePrompt hin thi th4ng
&o ;c nh6n khi ngi )eng ch0n .t fil( .i ha' fil( S ttn t*i.
FolderBrowserDialogEcho phXp ngi )eng ch0n gv t*oh .t th .c. lng )3n S
ch0n cF th $c l' tQ thuc t2nh SelectedPath. Hgoi ra8 &*n cF th thiIt l6p thuc
t2nh ShowNewFolderButton hin thi nGt &ake New FoDAer g;(. h%nh c._h.
0nh 9'4 olderBrowserialog
whi sO )ng OpenFileDialog ha' SaveFileDialog8 &*n cNn thiIt l6p chu#i l0c gchJ inh cc
phNn .C rng $c phXph. Phu#i l0c $c ph<n cch &Ci kB t= th(o inh )*ng\ Nh\n
Eanh 8,)h ),) Khn mj rkng lmn) Khn ),)h 4j" A3u )h3m Khoy Nh\n Eanh 8,)h ),)
Khn mj rkng lmn) Khn ),)h 4j" A3u )h3m Khoy .... L*n c?ng cF th thiIt l6p thuc t2nh
Title gti>u h v InitialDirectory gth .c &an Nuh.
ng )ng )i <' cho phXp ngi )eng n*p ti liu vo .t RichTextBox8 sOa ni )ung8 v
lu ti liu S $c sOa gsO )ng lp OpenFileDialog v SaveFileDialog .C v lu ti
liuh.
using System;
using System.Drawing;
using System.Windows.Forms;
public class SimpleEditForm : System.Windows.Forms.Form {
private System.Windows.Forms.MenuItem mnuFile;
private System.Windows.Forms.MenuItem mnuOpen;
381
Chng 9: PimzE `h oecE }~ "SC
private System.Windows.Forms.MenuItem mnuSave;
private System.Windows.Forms.MenuItem mnuExit;
private System.Windows.Forms.RichTextBox rtDoc;
// (Bo qua phn m designer.)
private void mnuOpen_Click(object sender, System.EventArgs e) {
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "Rich Text Files (.rtf)|.RTF|" +
"All files (.)|.";
dlg.CheckFileExists = true;
dlg.InitialDirectory = Application.StartupPath;
if (dlg.ShowDialog() == DialogResult.OK) {
rtDoc.LoadFile(dlg.FileName);
rtDoc.Enabled = true;
}
}
private void mnuSave_Click(object sender, System.EventArgs e) {
SaveFileDialog dlg = new SaveFileDialog();
dlg.Filter = "RichText Files (.rtf)|.RTF|Text Files (.txt)|
.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();
}
382
Chng 9: PimzE `h oecE }~ "SC
}
18' 18' 0 d ng "h,ng gian l u tr ring 0 d ng "h,ng gian l u tr ring
#eA JwA YVZ h? Y@qZ D\X @Y, A>VAB ~AB hUAB Jbc FeA s>TAB LVWJ JPd
"ileE(/ermission Lt fg hUAB Lc J~AB(
Sg hUAB JSJ YEd Esolated$torage"ile D\ Esolated$torage"ile$tream Q>ZIJ s>TAB
B@cA QCA $!stem.E(.Esolated$torage( CSJ YEd A\] J>X d>d ~AB hUAB B>@ h? Y@qZ
D\X OIQ @Y QHXAB Q>V OUJ Jbc OIQ ABVo@ hrAB JU Q>t O\ s>TAB JwA LVWJ JPd
d>d QHZ] vZPQ QHnJ Q@jd Lc J~AB JUJ FI(
.NET Framework h# tr$ kh4ng gian lu trK ri>ng8 t:c l cho phXp &*n 0c v ghi vo h thDng
fil( o ca ngi )eng c th . CL= 9un lB. whi &*n t*o cc fil( lu trK ri>ng8 )K liu t=
ng $c lu vo .t nMi )u' nht trong ng )3n profil( ca ngi )eng gth4ng thng
ng )3n n' cF )*ng CNHEo)umen/8 anA *e//"ng8Heu8ernamefHLo)aD *e//"ng8H>KKD")a/"on
Ea/aH<8oDa/eA*/orageH egu"Ac"Aen/"?"erfh.
"t lB )o sO )ng kh4ng gian lu trK ri>ng l trao cho .t :ng )ng cFzztin c6'z.tz
phNn cF kh nvng h*n chI khi lu trK )K liu g;(. .c Z^.Z cF th>. th4ng tin v .S lnh
cFzztinzc6'z.tzphNnh. u2 )8 ch2nh sch &o .6t CL= .!c inh cp cho .S lnh cc & cF
FileIOPermission kh4ng h*n chI8 t:c l cF 9u'n 0c v ghi &t k fil( no. "S lnh th=c thi
tQ .t .' ch C ;a tr>n .*ng ntran(t cc & t= ng $c cp 2t 9u'n hMnEthiIu .t
FileIOPermission8 nhng cF IsolatedStoragePermission8 t:c l cF kh nvng sO )ng kh4ng
gian lu trK ri>ng gch2nh sch &o .6t c?ng h*n chI )ung l$ng tDi a cF th $c sO )ng
trong kh4ng gian lu trK ri>ngh. "t lB )o khc sO )ng kh4ng gian lu trK ri>ng l &o v
)K liu tDt hMn. u2 )8 Di vi )K liu trong kh4ng gian lu trK ri>ng ca .t ngi )eng8
nhKng ngi )eng khc kh4ng phi l nh 9un tri s@ kh4ng $c 9u'n tru' ;ut.
lo*n .S )i <' .inh h0a cch tru' ;ut kh4ng gian lu trK ri>ng\
using System;
using System.IO;
using System.IO.IsolatedStorage;
public class IsolatedStoreTest {
private static void Main() {
// Tao khng gian lu tr ring cho ngi dung hin hnh.
IsolatedStorageFile store =
IsolatedStorageFile.GetUserStoreForAssembly();
383
Chng 9: PimzE `h oecE }~ "SC
// Tao mt th mc tai gc cua khng gian lu tr ring.
store.CreateDirectory("MyFolder");
// Tao mt file trong khng gian lu tr ring.
Stream fs = new IsolatedStorageFileStream(
"MyFile.txt", FileMode.Create, store);
StreamWriter w = new StreamWriter(fs);
// Ghi file nh bnh thng.
w.WriteLine("Test");
w.Flush();
fs.Close();
Console.WriteLine("Current size: " + store.CurrentSize.ToString());
Console.WriteLine("Scope: " + store.Scope.ToString());
Console.WriteLine("Contained files include:");
string [] files = store.GetFileNames(".");
foreach (string file in files) {
Console.WriteLine(file);
}
Console.ReadLine();
}
}
7h(o .!c inh8 .#i kh4ng gian lu trK ri>ng $c tch &it &Ci ngi )eng v ass(.&l'.
liu n' cF nghqa l khi ceng .t ngi ch*' ceng .t :ng )ng8 :ng )ng n' s@ tru' ;ut
)K liu trong ceng kh4ng gian lu trK ri>ng. 7u' nhi>n8 &*n cF th tch &it th>. &Ci .in
:ng )ng nhiu th hin ca ceng .t :ng )ng nh6n cc kh4ng gian lu trK ri>ng khc
nhau8 nh v2 ) sau\
// Truy xut khng gian lu tr ring cua ngi dung
// v assembly hin tai (tng t v d trn).
store = IsolatedStorageFile.GetStore(IsolatedStorageScope.User |
IsolatedStorageScope.Assembly, null, null);
// Truy xut khng gian lu tr ring cua ngi dung, assembly,
// v min ng dng hin hnh. Ni cch khc, d liu ny ch doc
384
Chng 9: PimzE `h oecE }~ "SC
// truy xut boi th hin hin tai cua ng dng.
store = IsolatedStorageFile.GetStore(IsolatedStorageScope.User |
IsolatedStorageScope.Assembly | IsolatedStorageScope.Domain,
null, null);
il( $c lu trK nh .t phNn profil( ca ngi )eng8 v% v6' ngi )eng cF th tru' ;ut
cc fil( n' tQ &t k .' no trong .*ng L>N nIu roa.ing profil(
^
S $c cu h%nh gtrong
trng h$p n'8 phi thiIt l6p c IsolatedStorageFile.Roaming khi t*o kh4ng gian lu trKh.
L5ng cch .NET Framework v CL= cung cp cc .:c cch l'8 &*n kh4ng phi )u' tr% s=
tch &it giKa cc fil(8 v kh4ng phi lo vic kh4ng hiu r} cM chI l. vic s@ g<' .t )K liu
9uan tr0ng.
19' 19' Theo dKi h th ng $ile %ht hi n thay i Theo dKi h th ng $ile %ht hi n thay i
#eA JwA d>RA ~AB s>@ >q Q>KAB @Y Q>c] L@ Qe@ OIQ LVoAB hpA JU Q>t iJ>AB
>eA fgc >c] QeX @Yk(
Sg hUAB Q>\A> d>wA $!stem.E(."ile$!stematc.er, J> LMA> @Y >X_J LVoAB hpA
JwA Q>X h|@, D\ Q>U Y JSJ fn s@qA Created, -eleted, &enamed, D\ C.anged(
whi li>n kIt nhiu :ng )ng v cc 9u tr%nh nghip v8 thng cNn t*o .t chMng tr%nh th
ng v chJ trC n>n t2ch c=c khi .t fil( $c t*o ra ho!c &i tha' si. L*n cF th t*o kiu
chMng tr%nh thI n' &5ng cch 9uXt inh k 9ua .t th .c8 nhng l*i g!p phi vn c<n
&5ng. YuXt cng thng ;u'>n8 cng tDn ti ngu'>n h thDng. YuXt cng 2t8 cng l<u pht hin
$c tha' si. Pch tin nht l sO )ng lp FileSystemWatcher phn :ng tr=c tiIp cc s=
kin fil( ca @"nAow8.
l sO )ng FileSystemWatcher8 &*n phi t*o .t th hin v thiIt l6p cc thuc t2nh sau\
PathEchJ inh ng )3n cNn th(o )}i.
FilterEchJ inh kiu fil( cNn th(o )}i.
NotifyFilterEchJ inh kiu tha' si cNn th(o )}i.
FileSystemWatcher sinh ra &Dn s= kin ch2nh\ Created8 Deleted8 Renamed8 v Changed. Pc s=
kin n' cung cp th4ng tin 9ua Di sD FileSystemEventArgs8 &ao gt. t>n fil( gNameh8 ng
)3n N' gFullPathh8 kiu tha' si gChangeTypeh. |= kin Renamed cung cp th hin
RenamedEventArgs )3n ;ut tQ FileSystemEventArgs8 v th>. th4ng tin v t>n fil( &an Nu
gOldName v OldFullPathh. HIu cNn8 &*n cF th v4 hiu cc s= kin n' &5ng cch thiIt l6p
thuc t2nh FileSystemWatcher.EnableRaisingEvents l false. Ur )ng th lB cc s= kin
Created8 Deleted8 v Renamed. Hhng nIu .uDn sO )ng s= kin Changed8 &*n cNn sO )ng
thuc t2nh NotifyFilter chJ inh kiu tha' si cNn th(o )}i. L5ng kh4ng8 chMng tr%nh ca
&*n cF th &i sa lN' &Ci .t lo*t cc s= kin khi fil( &i tha' si.
^
Woa.ing profil( $c t*o &Ci ngi 9un tri h thDng v $c lu trK tr>n .t s(rv(r. Rrofil( n' cF
sn .#i khi &*n vng nh6p vo &t k .' t2nh no tr>n .*ng. Lt c: tha' si no c?ng khiIn roa.ing
profil( $c c6p nh6t l*i tr>n s(rv(r.
385
Chng 9: PimzE `h oecE }~ "SC
7huc t2nh NotifyFilter cF th $c thiIt l6p &5ng cch kIt h$p cc gi tri thuc kiu lit k>
System.IO.NotifyFilters\ Attributes8 CreationTime8 DirectoryName8 FileName8 LastWrite8
LastAccess8 Security8 v Size.
u2 ) )i <' th lB s= kin Created v Deleted. u thO nghi. cc s= kin n' &5ng cch
t*o ra .t fil( thO nghi..
using System;
using System.IO;
using System.Windows.Forms;
public class FileWatcherTest {
private static void Main() {
// Cu hnh FileSystemWatcher.
FileSystemWatcher watch = new FileSystemWatcher();
watch.Path = Application.StartupPath;
watch.Filter = ".";
watch.IncludeSubdirectories = true;
// ang k cc phng thc th l s kin.
watch.Created += new FileSystemEventHandler(OnCreatedOrDeleted);
watch.Deleted += new FileSystemEventHandler(OnCreatedOrDeleted);
watch.EnableRaisingEvents = true;
Console.WriteLine("Press Enter to create a file.");
Console.ReadLine();
if (File.Exists("test.bin")) {
File.Delete("test.bin");
}
FileStream fs = new FileStream("test.bin", FileMode.Create);
fs.Close();
Console.WriteLine("Press Enter to terminate the application.");
Console.WriteLine();
Console.ReadLine();
}
386
Chng 9: PimzE `h oecE }~ "SC
// Pht sinh khi mt file mi doc tao ra
// trong th mc cn theo di.
private static void OnCreatedOrDeleted(object sender,
FileSystemEventArgs e) {
// Hin th thng bo.
Console.WriteLine("tNOTIFICATION: " + e.FullPath +
"' was " + e.ChangeType.ToString());
Console.WriteLine();
}
}
20'
20' Truy xu t c ng CL5 Truy xu t c ng CL5
#eA JwA Bg@ h? Y@qZ QHnJ Q@jd LjA OIQ JAB QZwA Qn iserial portk(
*in)' ;,/ JZAB JPd JSJ >\O s>TAB6LVWJ6ZRA6Y QHXAB Q>V D@qA kernell)'.&ll
Lt QHnJ Q@jd LJ D\ B>@ JSJ F]Q LjA JAB QZwA Qn( #eA J^ Q>t A>Nd JSJ >\O A\]
D\X ~AB hUAB >X_J fg hUAB Microft Comm%nications ;cti"e+ control
iMSComm.oc8J^ QHXAB Microsoft $is%al St%&io @k(
.NET kh4ng cung cp &t k giao )in $cz9unzlB no thao tc vi cc csng tuNn t=. Uo
F8 nhKng ai cNn ch:c nvng n' s@ phi l. vic vi cc cM chI tMng Di ph:c t*p.
"t hng gii 9u'It l t*o .t vV &0c .NET cho &")ro8o?/ Commun")a/"on8 Con/roD
g&*Comm.o)2h. liu ki. n' cung cp .t .4 h%nh Di t$ng .:czcao l. vic vi
csng tuNn t=. 7u' nhi>n8 &*n phi thu l' iu ki. n' th4ng 9ua V"8uaD */uA"o Y g&*n cF th
chJ ch0n ci !t cc thnh phNn >)/"Be: khi ci !t V"8uaD */uA"o Y8 tDn khong `"Lh. l cF
th>. th4ng tin8 &*n hS' tha. kho ti liu V"8uaD */uA"o Y.
"t hng gii 9u'It khc l nh6p cc h. >P< tQ th vin kerneDDC2.ADD. PNn cxn th6n khi sO
)ng phMng php n' v% &*n phi sO )ng Gng kiu )K liu C# v )u' tr% la'out ca cc cu
trGc & nh. "a' ./n l8 vn n' S $c bu8/"n ;arreDD gdhB??D@@eBc#<<>co;h gii 9u'It vi
.t lp C# te' &iIn cF t>n l ComPort. "S lnh ca lp n' kh )i8 &*n hS' ;(. trong qa
PU 2nh k1..
L*n cF th th>. lp ComPort vo :ng )ng ca &*n v sO )ng o*n .S sau tMng tc vi
.t csng CF&.
ComPort port = new ComPort();
try {
// Cu hnh cho cng.
387
Chng 9: PimzE `h oecE }~ "SC
port.BaudRate = 9600;
port.Parity = 0;
port.PortNum = 1;
port.ReadTimeout = 10;
port.StopBits = 1;
port.ByteSize = 1;
// Mo cng.
port.Open();
// Ghi d liu.
port.Write(new byte[1]);
// ng cng.
port.Close();
}catch (ApplicationException err) {
Console.WriteLine(err.Message);
}
388
Chng 9: PimzE `h oecE }~ "SC
10
389
Ch01n2 3f4CN Sg ,K LI(U
390
391
Chng 10: ( k dl minu
rong &")ro8o?/ .NET Framework8 vic tru' ;ut In cc lo*i )atazsourc( gngutn )K
liuh $c cho phXp th4ng 9ua .t nhF. cc lp cF t>n l &")ro8o?/ >EF.NET. "#i
lo*i )atazsourc( $c h# tr$ th4ng 9ua .t )atazprovi)(r g& cung cp )K liuh. "#i
)atazprovi)(r gt. t6p cc lp kh4ng chJ hin th=c t6p giao )in chuxn8 . ckn cung cp ch:c
nvng )u' nht ca )atazsourc( . nF h# tr$. Pc lp n' .4 t v kIt nDi8 c<u lnh8 th4ng sD8
)ataza)apt(r g& iu h$p )K liuh8 v )atazr(a)(r g& 0c )K liuh . 9ua F8 &*n cF th
tMng tc vi .t lo*i )atazsourc(. Lng Zd.Z lit k> cc hin th=c )atazprovi)(r trong .NET.
7
Bfng 10'1 Cc hin thuc data-provider trong .NET ramework
<a`a-sao}idza ?i `f
.NET Framework
Ea/a ProB"Aer
?or FE$C
Pung cp kIt nDi In .0i )atazsourc( cF hin th=c giao )in FE$CT
&ao gt. &")ro8o?/ *L *erBer8 Fra)De8 v &")ro8o?/ >))e88. Pc lp
)atazprovi)(r n5. trong kh4ng gian t>n System.Data.Odbc v cF tin
tD Odbc.
.NET Framework
Ea/a ProB"Aer
?or FLE E$
Pung cp kIt nDi In .0i )atazsourc( cF hin th=c giao )in FLE E$T
&ao gt. &")ro8o?/ *L *erBer8 &*EE8 Fra)De8 v be/. Pc lp )ataz
provi)(r n5. trong kh4ng gian t>n System.Data.OleDb v cF tin tD
OleDb.
.NET Framework
Ea/a ProB"Aer
?or Fra)De
Pung cp kIt nDi In Fra)De. Pc lp )atazprovi)(r n5. trong kh4ng
gian t>n System.Data.OracleClient v cF tin tD Oracle.
.NET Framework
Ea/a ProB"Aer
?or *L *erBer
Pung cp kIt nDi In &")ro8o?/ *L *erBer phi>n &n [ v .i hMn
ggt. c &*EEh &5ng cch li>n l*c tr=c tiIp vi *L *erBer . kh4ng
cNn sO )ng FE$C ha' FLE E$. Pc lp )atazprovi)(r n5. trong
kh4ng gian t>n System.Data.SqlClient v cF tin tD Sql.
.NET ComKa)/
Framework Ea/a
ProB"Aer ?or *L
*erBer CE
Pung cp kIt nDi In &")ro8o?/ *L *erBer CE. Pc lp )atazprovi)(r
n5. trong kh4ng gian t>n System.Data.SqlServerCe v cF tin tD
SqlCe.
PhMng n' .4 t .t vi kh2a c*nh thng $c sO )ng nht ca >EF.NET. 7u' nhi>n8
>EF.NET l .t phNn con .C rng ca th vin lp .NET Framework v ch:a .t l$ng ln
cc ch:c nvng cao cp. Uo F8 cF th hiu r} hMn v >EF.NET8 &*n n>n t%. 0c .t
9u'n sch khc chu'>n v >EF.NET. HhKng .c trong chMng n' tr%nh &' cc vn
sau\
Pch t*o8 cu h%nh8 .C8 v Fng kIt nDi cM sC )K liu g.c Zd.Zh.
Pch sO )ng conn(ctionzpooling ci thin hiu nvng v t2nh 9u' .4 ca cc :ng
)ng cF sO )ng kIt nDi cM sC )K liu g.c Zd.]h.
Pch th=c thi cc c<u lnh *L v cc th tc ttn trK g*/oreA Pro)eAureh8 v cch sO
)ng cc th4ng sD ci thin t2nh linh ho*t ca chGng g.c Zd.^ v Zd._h.
Pch ;O lB kIt 9u $c tr v tQ tru' vn cM sC )K liu g.c Zd.` v Zd.ah.
Pch nh6n &iIt tt c cc Di t$ng *L *erBer ang cF hiu l=c tr>n .*ng g.c Zd.[h.
392
Chng 10: ( k dl minu
l0c fil( E2)eD vi >EF.NET g.c Zd.bh.
Pch sO )ng Ea/a Form @"OarA g.c Zd.ch v Cry8/aD =eKor/ @"OarA g.c Zd.Zdh.
N>?AB LG OUJ QHXAB J>V[AB A\] fg hUAB J[ f h? Y@qZ OpZ Northwin& ihX
Microsoft JPdk Lt Y\O H| A>?AB s Q>ZNQ LVWJ Q>RX YZNA(
1'
1' . t n i c s d li u . t n i c s d li u
#eA JwA O OIQ sjQ AK@ LjA OIQ J[ f h? Y@qZ(
TeX OIQ LK@ QVWAB sjQ AK@ d>r >Wd DE@ s@tZ J[ f h? Y@qZ O\ FeA JwA sjQ AK@ QPQ
JR JSJ LK@ QVWAB sjQ AK@ LGZ >@qA Q>nJ B@cX h@qA $!stem.-ata.E-bConnection( CPZ
>lA> LK@ QVWAB sjQ AK@ F`AB JSJ> Q>@jQ YNd Q>ZIJ QaA> Connection$tring Jbc A^(
M sjQ AK@ F`AB JSJ> B@ d>V[AB Q>~J (pen Jbc LK@ QVWAB sjQ AK@(
Lc Nu ti>n trong vic tru' ;ut cM sC )K liu l .C .t .t kIt nDi In cM sC )K liu. piao
)in IDbConnection .4 t .t kIt nDi cM sC )K liu8 v .#i )atazprovi)(r ch:a .t hin th=c
)u' nht. Ui <' l )anh sch cc hin th=c IDbConnection cho nv. )atazprovi)(r chuxn\
System.Data.Odbc.OdbcConnection
System.Data.OleDb.OleDbConnection
System.Data.OracleClient.OracleConnection
System.Data.SqlServerCe.SqlCeConnection
System.Data.SqlClient.SqlConnection
L*n cu h%nh .t Di t$ng kIt nDi &5ng .t chu#i kIt nDi. Phu#i kIt nDi l .t t6p cc c!p
gi tri t>n $c ph<n cch &5ng )u ch. phx'. L*n cF th cung cp .t chu#i kIt nDi l.
Di sD trong phMng th:c khCi )=ng ho!c &5ng cch thiIt l6p thuc t2nh ConnectionString ca
Di t$ng kIt nDi trc khi .C kIt nDi. "#i hin th=c lp kIt nDi '>u cNu &*n cung cp nhKng
th4ng tin khc nhau trong chu#i kIt nDi. L*n hS' tha. kho ti liu v thuc t2nh
ConnectionString Di vi .#i hin th=c &iIt $c nhKng gi tri . &*n cF th chJ inh.
Ui <' l .t sD thiIt l6p\
7>n s(rv(r cM sC )K liu 2ch
7>n cM sC )K liu cNn .C vo lGc Nu
pi tri ti.(out ca kIt nDi
PM chI conn(ctionzpooling g;(. .c Zd.]h
PM chI ;c th=c )eng khi kIt nDi In cc cM sC )K liu $c &o .6t8 &ao gt. vic
cung cp us(rna.( v passor)
"t khi S $c cu h%nh8 g0i phMng th:c Open ca Di t$ng kIt nDi .C kIt nDi In cM
sC )K liu. wI F8 &*n cF th sO )ng Di t$ng kIt nDi th=c thi nhKng c<u lnh )=a vo
)atazsourc( gs@ $c tho lu6n trong .c Zd.^h. Pc thuc t2nh ca Di t$ng kIt nDi c?ng
393
Chng 10: ( k dl minu
cho phXp &*n l' th4ng tin v tr*ng thi ca .t kIt nDi v nhKng thiIt l6p $c sO )ng
.C kIt nDi. whi S hon tt .t kIt nDi8 &*n n>n g0i phMng th:c Close gii phFng cc ti
ngu'>n h thDng v kIt nDi cM sC )K liu n5. )i. IDbConnection $c thQa kI tQ
System.IDisposable8 nghqa l .#i lp kIt nDi s@ hin th=c phMng th:c Dispose. RhMng th:c
n' s@ t= ng g0i Close8 cho n>n lnh using l .t cch rt r} rng v hiu 9u khi sO )ng
Di t$ng kIt nDi trong .S lnh.
l *t $c hiu nvng tDi u trong vic tru' c6p )K liu th% phi .C kIt nDi cM sC )K liu
cng ch6. cng tDt8 v khi S hon tt th% ng/t kIt nDi cng s. cng tDt. uic n' &o .
r5ng8 &*n kh4ng tru' ;ut ti kIt nDi cM sC )K liu trong .t thi gian )i v .S lnh cF cM
hi cao nht giK l' kIt nDi. liu n' !c &it 9uan tr0ng nIu &*n ang sO )ng
conn(ctionzpooling.
lo*n .S )i <' tr%nh &' cch sO )ng lp SqlConnection .C .t kIt nDi In *L
*erBer ang ch*' tr>n .' cc & cF sO )ng <n/egra/eA @"nAow8 *e)ur"/y g&o .6t t2ch h$p
vi @"nAow8h. l tru' ;ut In .t .' tQ ;a8 chJ cNn tha' si )atazsourc( tQ localhost
thnh t>n ca Di t$ng cM sC )K liu.
// Tao di tong SqlConnection rng.
using (SqlConnection con = new SqlConnection()) {
// Cu hnh chui kt ni cua di tong SqlConnection.
con.ConnectionString =
"Data Source = localhost;"+ // i tong SL Server cc b
"Database = Northwind;" + // C so d liu mu Northwind
"Integrated Security=SSPI"; // Integrated Windows Security
// Mo kt ni c so d liu.
con.Open();
// Hin th thng tin v kt ni.
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.");
394
Chng 10: ( k dl minu
Console.WriteLine(" Connection State = " + con.State);
}
// Cui khi using, Dispose s goi Close.
}
lo*n .S )i <' tr%nh &' .t chu#i kIt nDi )eng .C .t kIt nDi In cM sC )K liu C
tr>n gnIu &*n ang sO )ng FLE E$ Ea/a ProB"Aer th=c hin kIt nDih\
// Tao mt di tong OleDbConnection rng.
using (OleDbConnection con = new OleDbConnection()) {
// Cu hnh chui kt ni cua di tong OleDbConnection.
con.ConnectionString =
"Provider = SLOLEDB;" + // OLE DB Provider for SL Server
"Data Source = localhost;" + // i tong SL Server cc b
"Initial Catalog = Northwind;" + // C so d liu mu Northwind
"Integrated Security=SSPI"; // Integrated Windows Security
// Mo kt ni c so d liu.
con.Open();

}
2' 2' 0 d ng connection-%ooling 0 d ng connection-%ooling
#eA OZKA hZ] QHl OIQ dXXY J>~c JSJ sjQ AK@ LcAB O Lt JR@ Q>@qA >@qZ AAB D\
QaA> Z] OT J>X OIQ >q Q>KAB YEA(
CPZ >lA> dXXY F`AB JSJ> fg hUAB JSJ Q>@jQ YNd QHXAB J>Zx@ sjQ AK@ Jbc LK@ QVWAB
sjQ AK@(
Ponn(ctionzpooling l. gi. ng k tsng ph2 li>n h$p vi vic t*o v h' kIt nDi cM sC )K
liu. Ponn(ctionzpooling c?ng ci thin t2nh 9u' .4 ca cc gii php &5ng cch gi. sD
l$ng kIt nDi tng thi . .t cM sC )K liu phi )u' tr%Ea sD thng +ngti kh4ng- suDt
.t phNn ng k thuc thi gian sDng ca chGng. ui conn(ctionzpooling8 tha' v% t*o v .C
.t Di t$ng kIt nDi .i .#i khi cNn8 &*n cF th l' kIt nDi S .C tQ pool. whi &*n S hon
tt vic sO )ng kIt nDi8 tha' v% Fng nF8 &*n tr nF v cho pool v cho phXp o*n .S khc sO
)ng nF.
7h(o .!c inh8 *L *erBer v Fra)De Ea/a ProB"Aer cung cp ch:c nvng conn(ctionzpooling.
"t pool s@ hin )in Di vi .#i chu#i kIt nDi )o &*n chJ inh khi .C .t kIt nDi .i. "#i
khi &*n .C .t kIt nDi .i vi chu#i kIt nDi S $c sO )ng 9ua8 nF s@ $c l' tQ pool
395
Chng 10: ( k dl minu
hin cF. PhJ khi &*n chJ inh .t chu#i kIt nDi khc th% )atazprovi)(r .i t*o .t pool .i.
L*n cF th iu khin cc !c t2nh ca pool &5ng cch sO )ng cc thiIt l6p trong chu#i kIt
nDi $c .4 t trong &ng Zd.].
MIQ s>@ L} LVWJ QeX, dXXY fm QA Qe@ J>X LjA s>@ Q@jA QHlA> sjQ Q>J(
Bfng 10'2 Cc thit lp trong chui kt ni dng d diu khin Connection Pooling
Thi|` mxs ?i `f
Connection
Lifetime
PhJ inh thi gian tDi a gt2nh &5ng gi<'h . .t kIt nDi $c phXp sDng
trong pool trc khi nF &i Fng. +7usi- ca .t kIt nDi $c ki. tra
chJ khi kIt nDi $c tr v cho pool. 7hiIt l6p n' cNn thiIt trong vic
thu nhV k2ch thc pool nIu pool kh4ng $c sO )ng nhiu v c?ng &o
. t2nh c<n &5ng ti $c th=c hin tDi u trong .4i trng cM sC )K
liu go. t. pi tri .!c inh l d8 cF nghqa l kIt nDi ttn t*i trong thi
gian sDng ca tiIn tr%nh hin thi.
Connection
Reset
PhJ $c *L *erBer Ea/a ProB"Aer h# tr$. PhJ inh kIt nDi cF $c
r(s(t ha' kh4ng khi chGng $c l' tQ pool. pi tri True &o . tr*ng
thi ca kIt nDi $c r(s(t nhng cNn phi th4ng &o cho cM sC )K liu.
pi tri .!c inh l True.
Pooling
7hiIt l6p l False cF $c kIt nDi kh4ng l' tQ pool. pi tri .!c inh
l True.
Max Pool Size
PhJ inh sD l$ng kIt nDi tDi a cNn cF trong pool. Pc kIt nDi $c t*o
v th>. vo pool khi $c '>u cNu cho In khi *t In con sD n'. HIu
.t '>u cNu kIt nDi $c th=c hin nhng kh4ng ckn kIt nDi trDng th% li
g0i s@ &lock cho In khi cF .t kIt nDi cF hiu l=c. pi tri .!c inh l
Zdd.
Min Pool Size
PhJ inh sD l$ng kIt nDi tDi thiu cNn cF trong pool. yGc t*o pool th% sD
kIt nDi n' $c t*o v th>. vo pool. 7rong 9u tr%nh )u' tr% inh k
ho!c khi .t kIt nDi $c '>u cNu8 cc kIt nDi s@ $c th>. vo pool
&o . sD l$ng kIt nDi tDi thiu cF hiu l=c. pi tri .!c inh l d.
lo*n .S )i <' .4 t cu h%nh ca .t pool\ ch:a tDi thiu ` kIt nDi v tDi a Z` kIt nDi8
kIt nDi s@ hIt hiu l=c sau Zd phGt gadd gi<'h v $c r(s(t .#i khi .t kIt nDi $c l' tQ
pool.
// Thu ly pooled connection.
using (SqlConnection con = new SqlConnection()) {
// Cu hnh chui kt ni cua di tong SqlConnection.
con.ConnectionString =
"Data Source = localhost;" + // i tong SL Server cc b
"Database = Northwind;" + // C so d liu mu Northwind
"Integrated Security = SSPI;" + // Integrated Windows Security
396
Chng 10: ( k dl minu
"Min Pool Size = 5;" + // Kch thc ti thiu cua pool
"Max Pool Size = 15;" + // Kch thc ti da cua pool
"Connection Reset = True;" + // Reset kt ni mi khi su dng
"Connection Lifetime = 600"; // Thi gian sng ti da
// Mo kt ni c so d liu.
con.Open();
// Truy xut c so d liu...

// Cui khi using, Dispose s goi Close,
// tra kt ni v cho pool d ti su dng.
}
lo*n .S )i <' .4 t cch sO )ng thiIt l6p Pooling cF $c .t Di t$ng kIt nDi
kh4ng phi l' tQ pool. liu n' cNn thiIt khi :ng )ng ca &*n sO )ng .t kIt nDi Mn
sDng l<u.
// Thu ly non-pooled connection.
using (SqlConnection con = new SqlConnection()) {
// Cu hnh chui kt ni cua di tong SqlConnection.
con.ConnectionString =
"Data Source = localhost;" + // i tong SL Server cc b
"Database = Northwind;" + // C so d liu mu Northwind
"Integrated Security = SSPI;" + // Integrated Windows Security
"Pooling = False"; // Ch dnh non-pooled connection
// Mo kt ni c so d liu.
con.Open();
// Truy xut c so d liu...

// Cui khi using, Dispose s goi Close,
// dng non-pooled connection.
}
397
Chng 10: ( k dl minu
FE$C v FLE E$ Ea/a ProB"Aer c?ng h# tr$ conn(ctionzpooling8 nhng chGng kh4ng hin
th=c conn(ctionzpooling &>n trong cc lp .NET8 n>n &*n kh4ng th cu h%nh pool th(o cch
nh *L *erBer ha' Fra)De Ea/a ProB"Aer. Ponn(ctionzpooling trong FE$C $c 9un lB
&Ci FE$C Er"Ber &anager v $c cu h%nh &5ng c4ng c FE$C Ea/a *our)e
>Am"n"8/ra/or trong Con/roD PaneD. Ponn(ctionzpooling trong FLE E$ $c 9un lB &Ci hin
th=c FLE E$ ngu'>n sinhT &*n cF th l. .t hiu l=c pooling &5ng cch th>. thiIt l6p +OLE
DB Services=-4;- vo chu#i kIt nDi. *L *erBer CE Ea/a ProB"Aer kh4ng h# tr$ conn(ctionz
pooling8 v% t*i .t thi i. *L *erBer CE chJ h# tr$ .t kIt nDi.
3'
3' Th c thi c6u l nh 029 ho c th t c t n tr Th c thi c6u l nh 029 ho c th t c t n tr
#eA JwA Q>nJ Q>@ OIQ JZ YqA> S-. >X_J OIQ Q>b QUJ QA QH? QHCA OIQ J[ f h?
Y@qZ(
TeX OIQ LK@ QVWAB JZ YqA> d>r >Wd DE@ s@tZ J[ f h? Y@qZ O\ FeA LMA> fg hUAB
QPQ JR JSJ LK@ QVWAB JZ YqA> LGZ >@qA Q>nJ B@cX h@qA $!stem.-ata.E-bCommand(
CPZ >lA> LK@ QVWAB JZ YqA> F`AB JSJ> Q>@jQ YNd JSJ Q>ZIJ QaA> Command)!pe D\
Command)ext Jbc A^( T>nJ Q>@ JZ YqA> F`AB OIQ QHXAB JSJ d>V[AB Q>~J
0xecute=onHuer!, 0xecute&eader, >c] 0xecute$calar Qr] Q>ZIJ D\X s@tZ JZ YqA>
D\ sjQ ZR Jbc A^(
piao )in IDbCommand .4 t .t c<u lnh cM sC )K liu8 v .#i )atazprovi)(r ch:a .t hin
th=c )u' nht. Ui <' l )anh sch cc hin th=c IDbCommand cho nv. )atazprovi)(r chuxn\
System.Data.Odbc.OdbcCommand
System.Data.OleDb.OleDbCommand
System.Data.OracleClient.OracleCommand
System.Data.SqlServerCe.SqlCeCommand
System.Data.SqlClient.SqlCommand
l th=c thi .t c<u lnh )=a tr>n .t cM sC )K liu8 &*n phi cF .t kIt nDi ang .C gS
$c tho lu6n trong .c Zd.Zh v .t Di t$ng c<u lnh S $c cu h%nh phe h$p vi kiu
cM sC )K liu ang tru' ;ut. L*n cF th t*o Di t$ng c<u lnh .t cch tr=c tiIp &5ng
phMng th:c khCi )=ng8 nhng cch Mn gin hMn l sO )ng phMng th:c CreateCommand ca
Di t$ng kIt nDi. RhMng th:c CreateCommand tr v .t Di t$ng c<u lnh gGng kiu )ataz
provi)(rh v cu h%nh nF vi cc th4ng tin cM sC $c l' tQ kIt nDi . &*n S sO )ng t*o
c<u lnh. 7rc khi th=c thi c<u lnh8 &*n phi cu h%nh cc thuc t2nh $c .4 t trong &ng
Zd.^

Bfng 10'3 Cc thuc tnh thng dung ca di tong cu lnh


Thuc `hnh ?i `f
CommandText
Phu#i ch:a c<u lnh *L ho!c t>n ca th tc ttn trK. Hi )ung ca
thuc t2nh CommandText phi tMng th2ch vi gi tri &*n chJ inh trong
thuc t2nh CommandType.
398
Chng 10: ( k dl minu
CommandTimeout
|D ngu'>n ginth chJ inh sD gi<' $i c<u lnh tr v trc khi hIt thi
gian v ngo*i l ;' ra. "!c inh l ^d gi<'.
CommandType
"t gi tri thuc kiu lit k> System.Data.CommandType8 chJ inh kiu
c<u lnh $c .4 t &Ci Di t$ng c<u lnh. lDi vi hNu hIt cc )ataz
provi)(r8 gi tri h$p l l StoredProcedure gkhi &*n .uDn th=c thi .t
th tc ttn trKh8 v Text gkhi &*n .uDn th=c thi .t c<u lnh *L )*ng
t(;th. HIu ang sO )ng FLE E$ Ea/a ProB"Aer8 &*n cF th chJ inh
TableDirect khi .uDn tr v ton & ni )ung ca .t ho!c nhiu
&ngT hS' tha. kho ti liu .NET Framework *E' &iIt th>. chi
tiIt. "!c inh l Text.
Connection
lDi t$ng IDbConnection8 cung cp kIt nDi In cM sC )K liu . &*n
s@ th=c thi c<u lnh tr>n F. HIu &*n t*o c<u lnh &5ng phMng th:c
IDbConnection.CreateCommand8 thuc t2nh n' s@ t= ng $c thiIt
l6p thnh Di t$ng IDbConnection . &*n S t*o c<u lnh tQ nF.
Parameters
lDi t$ng System.Data.IDataParameterCollection8 ch:a t6p cc
th4ng sD tha' thI vo c<u lnh g;(. .c Zd._ &iIt cch sO )ng
th4ng sDh.
Transaction
lDi t$ng System.Data.IDbTransaction8 .4 t phi>n giao )ich . c<u
lnh $c a vo F g;(. ti liu .NET Framework *E' &iIt th>.
chi tiIt v phi>n giao )ichh.
"t khi &*n S cu h%nh Di t$ng c<u lnh th% cF nhiu cch th=c thi nF8 te' thuc vo
&n cht ca c<u lnh8 kiu )K liu )o c<u lnh tr v8 v &*n .uDn ;O lB )K liu th(o inh
)*ng no.
l th=c thi .t c<u lnh nh E=$0&)8 -0+0)08 ho!c C&0#)0 )#6+0 gkh4ng tr v )K liu trong
cM sC )K liuh8 &*n hS' g0i ExecuteNonuery. lDi vi cc c<u lnh U/-#)08 E=$0&)8 v -0+0)08
phMng th:c ExecuteNonuery tr v .t sD ngu'>n cho &iIt sD hng &i tc ng &Ci c<u lnh.
lDi vi cc c<u lnh khc nh C&0#)0 )#6+08 ExecuteNonuery tr v zZ. u2 ) )i <' sO
)ng U/-#)0 chJnh sOa .t &n ghi.
public static void ExecuteNonueryExample(IDbConnection con) {
// Tao v cu hnh cu lnh mi.
IDbCommand com = con.CreateCommand();
com.CommandType = CommandType.Text;
com.CommandText = "UPDATE Employees SET Title = 'Sales Director'" +
" WHERE EmployeeId = '5'";
// Thc thi cu lnh v xu l kt qua.
int result = com.ExecuteNonuery();
399
Chng 10: ( k dl minu
if (result == 1) {
Console.WriteLine("Employee title updated.");
} else {
Console.WriteLine("Employee title not updated.");
}
}
l th=c thi .t c<u lnh tr v .t t6p kIt 9u nh lnh $0+0C) ho!c th tc ttn trK8 &*n hS'
sO )ng phMng th:c ExecuteReader. RhMng th:c n' tr v .t Di t$ng IDataReader gs@
$c tho lu6n trong .c Zd.`h . 9ua nF &*n cF th tru' ;ut In )K liu kIt 9u. nNu hIt
cc )atazprovi)(r c?ng cho phXp &*n th=c thi nhiu c<u lnh *L trong .t li g0i phMng
th:c ExecuteReaderT v2 ) trong .c Zd.` s@ gii th2ch iu n' v tr%nh &' cch tru' ;ut
.#i t6p kIt 9u.
lo*n .S )i <' sO )ng phMng th:c ExecuteReader th=c thi th tc ttn trK +Ten &o8/
E2Ken8"Be ProAu)/8- g.i sn phx. /t nhth tQ cM sC )K liu Nor/hw"nA v hin thi kIt 9u
trong cOa ss Con8oDe\
public static void ExecuteReaderExample(IDbConnection con) {
// Tao v cu hnh cu lnh mi.
IDbCommand com = con.CreateCommand();
com.CommandType = CommandType.StoredProcedure;
com.CommandText = "Ten Most Expensive Products";
// Thc thi cu lnh v xu l kt qua.
using (IDataReader reader = com.ExecuteReader()) {
Console.WriteLine("Price of the Ten Most Expensive Products.");
while (reader.Read()) {
// Hin th chi tit v san phm.
Console.WriteLine(" {0} = {1}",
reader["TenMostExpensiveProducts"],
reader["UnitPrice"]);
}
}
}
400
Chng 10: ( k dl minu
HIu .uDn th=c thi .t tru' vn8 nhng chJ cNn gi tri thuc ct Nu ti>n ca hng Nu ti>n
trong )K liu kIt 9u8 &*n hS' sO )ng phMng th:c ExecuteScalar. pi tri tr v l .t tha.
chiIu Di t$ng v &*n cNn Xp nF v Gng kiu. Ui <' l v2 )\
public static void ExecuteScalarExample(IDbConnection con) {
// Tao v cu hnh cu lnh mi.
IDbCommand com = con.CreateCommand();
com.CommandType = CommandType.Text;
com.CommandText = "SELECT COUNT() FROM Employees";
// Thc thi cu lnh v p kiu kt qua.
int result = (int)com.ExecuteScalar();
Console.WriteLine("Employee count = " + result);
}
CSJ >@qA Q>nJ E-bCommand QHXAB 3racle D\ S-. ata ,ro"i&er J^ >@qA Q>nJ JSJ
d>V[AB Q>~J Q>nJ Q>@ JZ YqA> F fZAB( MUJ ( fm OT QR JSJ> fg hUAB d>V[AB
Q>~J 0xecute5ml&eader hX YEd $ClCommand JZAB JPd( #eA >}] Q>cO s>RX Q\@ Y@qZ
.NET Frameworks S! Lt F@jQ Q>CO J>@ Q@jQ DG JSJ d>V[AB Q>~J F fZAB
0xecute(racle=onHuer! D\ 0xecute(racle$calar hX YEd (racleCommand JZAB JPd(
4' 4' 0 d ng th,ng s trong c6u l nh 029 ho c th t c t n tr 0 d ng th,ng s trong c6u l nh 029 ho c th t c t n tr
#eA JwA Q>@jQ YNd JSJ LK@ fK Jbc OIQ Q>b QUJ QA QH? >X_J fg hUAB JSJ Q>TAB fK
QHXAB OIQ JZ YqA> S-. Lt JR@ Q>@qA QaA> Y@A> >XeQ(
TeX LK@ QVWAB Q>TAB fK d>r >Wd DE@ s@tZ LK@ QVWAB JZ YqA> O\ FeA hn LMA>
Q>nJ Q>@ QPQ JR JSJ LK@ QVWAB Q>TAB fK LGZ >@qA Q>nJ B@cX h@qA
$!stem.-ata.E-ata/arameter( CPZ >lA> s@tZ h? Y@qZ, B@S QHM, D\ >VEAB Jbc LK@
QVWAB Q>TAB fK D\ Q>CO J>AB D\X QNd >Wd Q>TAB fK Jbc LK@ QVWAB JZ YqA> F`AB
d>V[AB Q>~J E-bCommand./arameters.#dd(
7t c cc Di t$ng c<u lnh u h# tr$ vic sO )ng th4ng sD8 )o F &*n cF th th=c hin cc
c4ng vic sau\
7hiIt l6p cc Di sD ca th tc ttn trK
y' cc gi tri tr v tQ th tc ttn trK
lsi cc gi tri thnh cc c<u lnh t(;t lGc th=c thi
piao )in IDataParameter .4 t .t th4ng sD v .#i )atazprovi)(r ch:a .t hin th=c )u'
nht. Ui <' l )anh sch cc hin th=c IDataParameter cho nv. )atazprovi)(r chuxn\
401
Chng 10: ( k dl minu
System.Data.Odbc.OdbcParameter
System.Data.OleDb.OleDbParameter
System.Data.OracleClient.OracleParameter
System.Data.SqlServerCe.SqlCeParameter
System.Data.SqlClient.SqlParameter
Pc thuc t2nh ca Di t$ng th4ng sD .4 t nhKng th: . .t Di t$ng c<u lnh cNn khi
th=c thi .t c<u lnh )=a tr>n )atazsourc(. Lng Zd._ .4 t cc thuc t2nh thng $c sO
)ng khi cu h%nh cho th4ng sD.
Bfng 10'4 Cc thuc tnh ca di tong thng s
Thuc `hnh ?i `f
DbType
pi tri thuc kiu lit k> System.Data.DbType8 chJ inh kiu )K liu
ch:a trong th4ng sD. Pc gi tri thng $c sO )ng l String8 Int328
DateTime8 v Currency.
Direction
pi tri thuc kiu lit k> System.Data.ParameterDirection8 cho &iIt
hng tru'n )K liu cho th4ng sD. Pc gi tri h$p l l Input8
InputOutput8 Output8 v ReturnValue.
IsNullable
pi tri bool8 cho &iIt th4ng sD cF chp nh6n gi tri null ha' kh4ng.
ParameterName
Phu#i ch:a t>n th4ng sD.
Value
lDi t$ng ch:a gi tri ca th4ng sD.
l sO )ng th4ng sD vi .t c<u lnh t(;t8 &*n phi cho &iIt vi tr2 cNn tha' thI gi tri th4ng sD
&>n trong c<u lnh. FE$C8 FLE E$8 v *L *erBer CE Ea/a ProB"Aer h# tr$ cc th4ng sD vi
tr2 gKo8"/"onaD Karame/erhT vi tr2 ca .#i th4ng sD $c nh6n &iIt &5ng )u ch. hVi gh. u2
)8 c<u lnh )i <' cho &iIt cF hai vi tr2 cNn $c tha' thI &5ng cc gi tri th4ng sD\
UPDATE Employees SET Title = WHERE EmployeeId =
*L *erBer v Fra)De Ea/a ProB"Aer h# tr$ cc th4ng sD $c !t t>n gnameA Karame/erh8
cho phXp &*n chJ inh .#i vi tr2 th4ng sD &5ng .t t>n vi &iu t$ng @ :ng trc. Ui <'
l c<u lnh tMng Mng nh tr>n nhng sO )ng th4ng sD $c !t t>n\
UPDATE Employees SET Title = @title WHERE EmployeeId = @id
l chJ inh cc gi tri th4ng sD tha' thI vo .t c<u lnh8 &*n phi t*o cc Di t$ng
th4ng sD Gng kiu v th>. chGng vo t6p h$p th4ng sD ca Di t$ng lnh gcF th $c tru'
;ut th4ng 9ua thuc t2nh Parametersh. L*n cF th th>. cc th4ng sD $c !t t>n th(o th: t=
&t k8 nhng &*n phi th>. cc th4ng sD vi tr2 th(o Gng th: t= . chGng ;ut hin trong c<u
lnh t(;t. whi &*n th=c thi c<u lnh8 gi tri ca .#i th4ng sD s@ $c tha' thI vo trong chu#i
lnh trc khi c<u lnh $c th=c thi )=a tr>n )atazsourc(.
RhMng th:c ParameterizedCommandExample $c tr%nh &' C <' .4 t cch sO )ng th4ng
sD trong lnh U/-#)0 ca *L *erBer. Pc Di sD ca phMng th:c
ParameterizedCommandExample gt. .t SqlConnection ang .C v hai chu#i. pi tri ca hai
chu#i n' $c tha' thI vo trong lnh U/-#)0 &5ng th4ng sD. u2 ) sau <' tr%nh &' hai
402
Chng 10: ( k dl minu
cch t*o Di t$ng th4ng sD\ phMng th:c IDbCommand.CreateParameter8 v phMng th:c
IDbCommand.Parameters. L*n c?ng cF th t*o cc Di t$ng th4ng sD &5ng phMng th:c khCi
)=ng v cu h%nh chGng &5ng cc Di sD ca phMng th:c khCi )=ng ho!c th4ng 9ua vic thiIt
l6p cc thuc t2nh ca chGng.
public static void ParameterizedCommandExample(SqlConnection con,
string employeeID, string title) {
// Tao v cu hnh mt cu lnh mi cha 2 thng s doc dat tn.
SqlCommand com = con.CreateCommand();
com.CommandType = CommandType.Text;
com.CommandText = "UPDATE Employees SET Title = @title" +
" WHERE EmployeeId = @id";
// Tao di tong SqlParameter cho thng s title.
SqlParameter p1 = com.CreateParameter();
p1.ParameterName = "@title";
p1.SqlDbType = SqlDbType.VarChar;
p1.Value = title;
com.Parameters.Add(p1);
// Su dng c php tc k d thm thng s id.
com.Parameters.Add("@id",SqlDbType.Int).Value = employeeID;
// Thc thi cu lnh v xu l kt qua.
int result = com.ExecuteNonuery();

}
whi sO )ng th4ng sD th=c thi th tc ttn trK8 &*n phi cung cp cc Di t$ng th4ng sD p
:ng cho .#i Di sD )o th tc ttn trK '>u cNuEgt. c Di sD input v output. L*n phi thiIt
l6p thuc t2nh Direction ca .#i th4ng sD nh $c .4 t trong &ng Zd._ g.!c inh l
Inputh. HIu th tc ttn trK cF gi tri tr v8 th4ng sD giK gi tri tr v gvi thuc t2nh
Direction l ReturnValueh phi l th4ng sD Nu ti>n $c th>. vo t6p h$p th4ng sD. u2 )
)i <' sO )ng th4ng sD th=c thi th tc ttn trK\
public static void StoredProcedureExample(SqlConnection con,
string category, string year) {
// Tao v cu hnh mt cu lnh mi.
403
Chng 10: ( k dl minu
SqlCommand com = con.CreateCommand();
com.CommandType = CommandType.StoredProcedure;
com.CommandText = "SalesByCategory";
// Tao di tong SqlParameter cho thng s category.
com.Parameters.Add("@CategoryName",SqlDbType.NVarChar).Value
= category;
// Tao di tong SqlParameter cho thng s year.
com.Parameters.Add("@OrdYear",SqlDbType.NVarChar).Value = year;
// Thc thi cu lnh v xu l kt qua.
using (IDataReader reader = com.ExecuteReader()) {

}
}
5'
5' + l* " t )u c a truy v n 029 ! ng data-reader + l* " t )u c a truy v n 029 ! ng data-reader
#eA JwA vg Y h? Y@qZ J>~c QHXAB LK@ QVWAB $!stem.-ata.E-ata&eader iLK@ QVWAB
A\] LVWJ QHR DG s>@ FeA Q>nJ Q>@ d>V[AB Q>~J E-bCommand.0xecute&eaderL}
LVWJ Q>RX YZNA QHXAB OUJ (-k(
Sg hUAB JSJ Q>\A> D@CA Jbc LK@ QVWAB E-ata&eader Lt hZ]qQ QZwA Qn JSJ >\AB
QHXAB QNd sjQ ZR D\ QHZ] vZPQ JSJ @QO h? Y@qZ J>~c QHXAB Ox@ >\AB(
piao )in IDataReader .4 t .t )atazr(a)(r8 <' l .t cM chI chJztiIn8 chJz0c g?orwarAI
onDy8 reaAIonDyh tru' ;ut kIt 9u ca tru' vn *L. "#i )atazprovi)(r ch:a .t hin th=c
IDataReader )u' nht. Ui <' l )anh sch cc hin th=c IDataReader cho nv. )ataz
provi)(r chuxn\
System.Data.Odbc.OdbcDataReader
System.Data.OleDb.OleDbDataReader
System.Data.OracleClient.OracleDataReader
System.Data.SqlServerCe.SqlCeDataReader
System.Data.SqlClient.SqlDataReader
piao )in IDataReader thQa kI giao )in System.Data.IDataRecord. Pc giao )in n' khai
&o cc ch:c nvng tru' ;ut )K liu v cu trGc ca )K liu cF trong t6p kIt 9u. Lng Zd.`
.4 t vi thnh vi>n th4ng )ng ca giao )in IDataReader v IDataRecord.
Hgoi cc thnh vi>n $c lit k> trong &ng Zd.`8 )atazr(a)(r ckn cung cp .t t6p cc
phMng th:c th=c hin vic l' )K liu S $c inh kiu tQ hng hin t*i. "#i phMng th:c
sau <' nh6n vo .t Di sD ngu'>n cho &iIt chJ sD gnh tQ dh ca ct . )K liu s@ $c tr
404
Chng 10: ( k dl minu
v tQ ct n'\ GetBoolean8 GetByte8 GetBytes8 GetChar8 GetChars8 GetDateTime8 GetDecimal8
GetDouble8 GetFloat8 GetGuid8 GetInt168 GetInt328 GetInt648 GetString8 GetValue8 v
GetValues.
405
Chng 10: ( k dl minu
Bfng 10'5 Cc thnh vin thng dung ca cc lp data-reader
Th~nh }itn ?i `f
Thuc `hnh
FieldCount
y' sD ct trong hng hin t*i.
IsClosed
7r v true nIu IDataReader &i FngT false nIu nF hin ang .C.
Item
7r v .t Di t$ng .4 t gi tri ca ct c th trong hng hin t*i.
Pt cF th $c chJ inh &5ng .t chJ sD ngu'>n gnh sD tQ dh ho!c
.t chu#i ch:a t>n ct. L*n phi Xp gi tri tr v thnh kiu phe h$p.
l<' l & chJ .c g"nAe2erh cho cc lp )atazr(a)(r.
Phng `hcc
GetDataTypeName
y' t>n ca kiu )K liu Di vi .t ct c th.
GetFieldType
y' Di t$ng System.Type .4 t kiu )K liu ca gi tri ch:a trong
ct c th gct n' $c chJ inh &5ng .t chJ sD ngu'>nEnh sD
tQ dh.
GetName
y' t>n ca ct c th gct n' $c chJ inh &5ng .t chJ sD
ngu'>nEnh sD tQ dh.
GetOrdinal
y' sD th: t= ct gnh sD tQ dh :ng vi .t t>n ct c th.
GetSchemaTable
7r v Di t$ng System.Data.DataTable ch:a si>u )K liu .4 t cc
ct cF trong IDataReader.
IsDBNull
7r v true nIu gi tri trong ct c th ch:a gi tri nullT nIu kh4ng
th% tr v false.
NextResult
HIu IDataReader ch:a nhiu t6p kIt 9u v% cF nhiu lnh $c th=c
thi8 NextResult s@ )i chu'n In cc t6p kIt 9u kI tiIp. 7h(o .!c
inh8 IDataReader $c &D tr2 t*i t6p kIt 9u Nu ti>n.
Read
Uich r(a)(r In &n ghi kI tiIp. W(a)(r lu4n &/t Nu t*i &n ghi Nu
ti>n.
Uatazr(a)(r *erBer B1 Fra)De c?ng ch:a cc phMng th:c th=c hin vic l' )K liu thuc cc
kiu )K liu !c trng ca )atazsourc(. u2 )8 SqlDataReader ch:a cc phMng th:c nh
GetSqlByte8 GetSqlDecimal8 v GetSqlMoney8 v OracleDataReader ch:a cc phMng th:c nh
GetOracleLob8 GetOracleNumber8 v GetOracleMonthSpan. L*n hS' tha. kho ti liu .NET
Framework *E' &iIt th>. chi tiIt.
whi S hon tt vi )atazr(a)(r8 &*n n>n g0i phMng th:c Close cF th sO )ng l*i kIt nDi
cM sC )K liu. IDataReader thQa kI System.IDisposableT nghqa l .#i lp )atazr(a)(r u
hin th=c phMng th:c Dispose. RhMng th:c n' s@ t= ng g0i Close8 cho n>n lnh using l
.t cch rt r} rng v hiu 9u khi sO )ng )atazr(a)(r.
406
Chng 10: ( k dl minu
u2 ) )i <' .4 t cch sO )ng )atazr(a)(r ;O lB ni )ung ca hai t6p kIt 9u $c tr
v &Ci vic th=c thi .t tru' vn gt. hai lnh SELECT. 76p kIt 9u Nu ti>n $c lit k> v
hin thi trong cOa ss Con8oDe. 76p kIt 9u th: hai $c )u't 9ua t%. v hin thi th4ng tin
si>u )K liu.
using System;
using System.Data;
using System.Data.SqlClient;
public class DataReaderExample {
public static void Main() {
// Tao di tong SqlConnection mi.
using (SqlConnection con = new SqlConnection()) {
// Cu hnh chui kt ni cua di tong SqlConnection.
con.ConnectionString = "Data Source = localhost;" +
"Database = Northwind; Integrated Security=SSPI";
// Tao v cu hnh cu lnh mi.
SqlCommand com = con.CreateCommand();
com.CommandType = CommandType.Text;
com.CommandText = "SELECT BirthDate,FirstName,LastName " +
"FROM Employees ORDER BY BirthDate; " +
"SELECT FROM Employees";
// Mo kt ni c so d liu v thc thi cu lnh.
con.Open();
// Thc thi cu lnh v thu ly SqlReader.
using (SqlDataReader reader = com.ExecuteReader()) {
// Xu l tp kt qua du tin
// v hin th ni dung cua tp kt qua.
Console.WriteLine("Employee Birthdays (By Age).");
407
Chng 10: ( k dl minu
while (reader.Read()) {
Console.WriteLine("{0,18:D} - {1} {2}",
reader.GetDateTime(0), // Ly d liu dnh kiu
reader["FirstName"], // Su dng ch s chui
reader[2]); // Su dng ch s th t
}
// Xu l tp kt qua th hai v hin th chi tit
// v cc ct v cc kiu d liu trong tp kt qua.
reader.NextResult();
Console.WriteLine("Employee Table Metadata.");
for (int field = 0; field reader.FieldCount; field++) {
Console.WriteLine(" Column Name:{0} Type:{1}",
reader.GetName(field),
reader.GetDataTypeName(field));
}
}
}
Console.ReadLine();
}
}
6' 6' Thu l y ti li u +59 t truy v n 029 0erver Thu l y ti li u +59 t truy v n 029 0erver
#eA JwA Q>nJ Q>@ OIQ QHZ] DPA hnc QHCA S-. Ser"er '((( >X_J MSE D\ YP] JSJ
sjQ ZR heAB +M.(
Sg hUAB OqA> LG "(& 5M+ QHXAB QHZ] DPA S-. Lt QHR DG sjQ ZR heAB +M.(
T>nJ Q>@ JZ YqA> F`AB d>V[AB Q>~J $ClCommand.0xecute5ml&eader, sjQ ZR QHR
DG Y\ OIQ LK@ QVWAB $!stem.5ml.5ml&eader O\ Q>TAB Zc A^ FeA J^ Q>t QHZ] vZPQ
h? Y@qZ +M.(
*L *erBer 2000 v &*EE tr=c tiIp h# tr$ :&L. L*n chJ cNn th>. .nh FOR XML AUTO
vo cuDi tru' vn *L cho &iIt r5ng cc kIt 9u s@ $c tr v C )*ng :&L. 7h(o .!c
inh8 )*ng :&L n' kh4ng phi l .t ti liu :&L N' . 7ha' vo F8 nF tr v kIt 9u
ca .#i &n ghi th(o tQng phNn tO geDemen/h ri>ng r@8 vi tt c cc trng g?"eDAh u l !c
t2nh ga//r"4u/eh. u2 )8 tru' vn sau <'\
SELECT CustomerID, CompanyName FROM Customers FOR XML AUTO
408
Chng 10: ( k dl minu
s@ tr v :&L vi cu trGc nh sau\
Customers CustomerID="ALFKI" CompanyName="Alfreds Futterkiste"/
Customers CustomerID="ANTON" CompanyName="Antonio Moreno Taquera"/
Customers CustomerID="GOURL" CompanyName="Gourmet Lanchonetes"/

L*n cF th th>. tQ khFa ELEMENTS vo cuDi tru' vn inh )*ng kIt 9u th(o cc phNn tO
ltng nhau. u2 )8 tru' vn sau <'\
SELECT CustomerID, CompanyName FROM Customers FOR XML AUTO, ELEMENTS
s@ tr v :&L vi cu trGc nh sau\
Customers
CustomerIDALFKI/CustomerID
CompanyNameAlfreds Futterkiste/CompanyName
/Customers
Customers
CustomerIDANTON/CustomerID
CompanyNameAntonio Moreno Taquera/CompanyName
/Customers
Customers
CustomerIDGOURL/CustomerID
CompanyNameGourmet Lanchonetes/CompanyName
/Customers

#eA JAB J^ Q>t LMA> heAB sjQ ZR OIQ JSJ> J>@ Q@jQ >[A F`AB J d>Sd "(& 5M+
05/+ECE)( Va hU, J d>Sd A\] J>X d>d FeA J>Z]tA OIQ D\@ QHVoAB ifiel&k Q>\A>
L_J QaA> iattri9%tek D\ JSJ QHVoAB s>SJ Q>\A> d>wA Qg ielementk( #eA >}] Q>cO
s>RX OIQ Z]tA fSJ> J>Z]CA DG S-. Ser"er Lt F@jQ Q>CO J>@ Q@jQ(
u2 ) )i <' tr%nh &' cch l' kIt 9u )*ng :&L &5ng .nh FOR XML v phMng th:c
ExecuteXmlReader. PhG B r5ng8 kIt nDi kh4ng th $c sO )ng cho &' k c<u lnh no khc
trong khi XmlReader ang .C. L*n n>n ;O lB kIt 9u cng nhanh cng tDt v phi lu4n Fng
XmlReader l*i gPhMng ` cF rt nhiu v2 ) tr%nh &' cch sO )ng lp XmlReaderh.
using System;
using System.Xml;
using System.Data;
using System.Data.SqlClient;
public class XmlueryExample {
409
Chng 10: ( k dl minu
public static void Main() {
// Tao di tong SqlConnection mi.
using (SqlConnection con = new SqlConnection()) {
// Cu hnh chui kt ni cua di tong SqlConnection.
con.ConnectionString = "Data Source = localhost;" +
"Database = Northwind; Integrated Security=SSPI";
// Tao v cu hnh cu lnh mi c cha FOR XML AUTO.
SqlCommand com = con.CreateCommand();
com.CommandType = CommandType.Text;
com.CommandText = "SELECT CustomerID, CompanyName" +
" FROM Customers FOR XML AUTO";
// Khai bo XmlReader d n c th doc tham chiu trong
// khi finally (bao dam dng n lai sau khi su dng).
XmlReader reader = null;
try {
// Mo kt ni c so d liu.
con.Open();
// Thc thi cu lnh v ly XmlReader
// d truy xut cc kt qua.
reader = com.ExecuteXmlReader();
while (reader.Read()) {
Console.Write("Element: " + reader.Name);
if (reader.HasAttributes) {
for (int i = 0; i reader.AttributeCount; i++) {
reader.MoveToAttribute(i);
Console.Write(" {0}: {1}",
reader.Name, reader.Value);
}
410
Chng 10: ( k dl minu
reader.MoveToElement();
Console.WriteLine();
}
}
} catch (Exception ex) {
Console.WriteLine(ex.ToString());
} finally {
// Bao dam reader d dng.
if (reader != null) reader.Close();
}
}
Console.ReadLine();
}
}
Ui <' l .t vi kIt ;ut tQ :ng )ng thO nghi. n'\
Element: Customers CustomerID: ALFKI CompanyName: Alfreds Futterkiste
Element: Customers CustomerID: ANTON CompanyName: Antonio Moreno Taquera
Element: Customers CustomerID: GOURL CompanyName: Gourmet Lanchonetes
...
7ha' v% l. vic vi XmlReader v tru' ;ut )K liu .t cch tuNn t=8 &*n cF th 0c )K liu
:&L vo System.Xml.XmlDocument. 7h(o cch n'8 tt c )K liu $c l' vo & nh8 v kIt
nDi cM sC )K liu cF th Fng l*i. wI F8 &*n cF th tiIp tc tMng tc vi ti liu :&L
gPhMng ` cF rt nhiu v2 ) tr%nh &' cch sO )ng lp XmlDocumenth. Ui <' l o*n .S
. &*n s@ cNn\
XmlDocument doc = new XmlDocument();
// Tao di tong SqlConnection mi.
using (SqlConnection con = new SqlConnection()) {
// Cu hnh chui kt ni cua di tong SqlConnection.
con.ConnectionString = "Data Source = localhost;" +
"Database = Northwind; Integrated Security=SSPI";
411
Chng 10: ( k dl minu
// Tao v cu hnh cu lnh mi c cha FOR XML AUTO.
SqlCommand com = con.CreateCommand();
com.CommandType = CommandType.Text;
com.CommandText =
"SELECT CustomerID, CompanyName FROM Customers FOR XML AUTO";
// Mo kt ni c so d liu.
con.Open();
// Load d liu XML vo XmlDocument. Cn phai tao trc mt
// phn tu gc d c th dat mi phn tu hng kt qua vo d.
XmlReader reader = com.ExecuteXmlReader();
doc.LoadXml("results/results");
// Tao XmlNode tu phn tu XML k tip (doc doc tu reader).
XmlNode newNode = doc.ReadNode(reader);
while (newNode != null) {
doc.DocumentElement.AppendChild(newNode);
newNode = doc.ReadNode(reader);
}
}
// Xu l XmlDocument d ngt kt ni.
Console.WriteLine(doc.OuterXml);

7'
7' Nh n !i t t t c cc th hi n 029 0erver MNNN trn m ng Nh n !i t t t c cc th hi n 029 0erver MNNN trn m ng
#eA JwA YP] hcA> fSJ> QPQ JR JSJ Q>t >@qA Jbc S-. Ser"er '((( J^ Q>t QHZ] vZPQ
LVWJ QHCA OeAB(
Sg hUAB C3M /nterop Lt QHZ] vZPQ J>~J AAB Jbc Microsoft S-.M3 39Ject
.i9rar:( TeX OIQ LK@ QVWAB #pplication H@ B@ d>V[AB Q>~J
+ist#vailable$H+$ervers Jbc A^( +ist#vailable$H+$ervers fm QHR DG LK@ QVWAB
=ame+ist, Y\ OIQ QNd >Wd J>~c QCA Jbc Ox@ LK@ QVWAB S-. Ser"er '((( LVWJ QlO
Q>P] QHCA OeAB(
412
Chng 10: ( k dl minu
7h vin lp .NET Framework kh4ng cF ch:c nvng t%. cc *L *erBer cha &iItT tu' nhi>n8
c4ng vic n' kh4ng .' khF khvn vi &")ro8o?/ *LE&F F4Je)/ L"4rary g$c tru' ;ut
9ua CF& <n/eroKh. "c Z`.a s@ tr%nh &' chi tiIt cch t*o .t <n/eroK >88em4Dy th=c hin
vic tru' ;ut In .t thnh phNn CF&. HIu ang sO )ng &")ro8o?/ V"8uaD */uA"o .NET8
&*n hS' th>. .t tha. chiIu In &")ro8o?/ *LE&F F4Je)/ L"4rary $c lit k> trong thj
CF& ca hp tho*i >AA =e?eren)e g;(. h%nh Zd.Zh.
0nh 10'1 Chn Microsoft SQLMO Obect Library trong hp thoai Add eference
HIu kh4ng cF V"8uaD */uA"o .NET8 &*n hS' sO )ng TyKe L"4rary <mKor/er g/D4"mK.e2eh t*o
.t <n/eroK >88em4Dy cho fil( 8MDAmo.ADD gthng n5. trong th .c HProgram
F"De8H&")ro8o?/ *L *erBerHU0HTooD8H$"nnh.
C^ OIQ DPA LG L} LVWJ QlO Q>P] QHXAB FRA BKJ S-.M3 39Ject .i9rar:( !t J^
Q>t J>e] LVWJ hn SA A\], FeA JwA d>R@ J\@ L_Q S-. Ser"er Ser"ice ,ack ' >X_J
OE@ >[A(
pi sO &*n sO )ng cc thiIt l6p .!c inh khi t*o <n/eroK >88em4Dy cho .%nh8 trc hIt &*n
cNn nh6p kh4ng gian t>n SLDMO. l l' $c )anh sch cc *L *erBer ang cF hiu l=c8 &*n
hS' t*o .t Di t$ng SLDMO.Application v g0i phMng th:c ListAvailableSLServers ca
nF. "#i chu#i trong Di t$ng tr v SLDMO.NameList l t>n ca .t *L *erBer ang cF hiu
l=c. L*n cF th sO )ng cc t>n n' trong chu#i kIt nDi ho!c hin thi chGng trong .t )anh
413
Chng 10: ( k dl minu
sch cho ngi )eng ch0n. u2 ) )i <' s@ hin thi t>n ca tt c cc *L *erBer cF th
tru' ;ut $c trong cOa ss Con8oDe\
using System;
using SLDMO;
public class SLDMOExample {
public static void Main() {
// Thu ly danh sch tt ca cc SL Server c hiu lc.
SLDMO.Application app = new SLDMO.Application();
SLDMO.NameList names = app.ListAvailableSLServers();
// Xu l tp hop NameList.
if (names.Count == 0) {
Console.WriteLine("No SL Servers visible on the network.");
} else {
// Hin th danh sch cc SL Server c hiu lc.
Console.WriteLine("SL Servers visible : " + names.Count);
foreach (string name in names) {
Console.WriteLine(" Name : " + name);
}
}
Console.ReadLine();
}
}
8'
8' c $ile @xcel v i /AL?N@T c $ile @xcel v i /AL?N@T
#eA OZKA Q>Z YP] >c] J>A h? Y@qZ D\X OIQ Q\@ Y@qZ Microsoft E8cel F`AB
;3.NET(
Sg hUAB 35C .NET pro"i&er sjQ >Wd DE@ Microsoft E8cel 35C ri"er(
414
Chng 10: ( k dl minu
wh4ng cF FLE E$ KroB"Aer ha' provi)(r $cz9unzlB no cho E2)eD. 7u' nhi>n8 &*n cF th
sO )ng &")ro8o?/ E2)eD FE$C Er"Ber g$c ci !t .!c inh ceng vi E2)eDh kIt h$p vi
FE$C .NET KroB"Aer gi k1. vi .NET Framework 1.1 v V"8uaD */uA"o .NET 200Ch.
7rong chu#i kIt nDi8 &*n cNn chJ inh )riv(r . &*n ang sO )ng v t>n fil( E2)eD. u2 )
)i <' chJ In fil( /e8/.2D8 trong th .c startup ca :ng )ng\
private string ConnectionString = "Driver={Microsoft Excel Driver
(.xls)};DriverId=90;Dbq=" + Application.StartupPath + "test.xls;";
|au khi kIt nDi8 &*n cF th th=c hin hai kiu thao tc\ $0+0C) ha' E=$0&). 7ha' v% sO )ng
&ng8 &*n ch0n ha' ch1n )=a vo t>n sh((t. 7>n sh((t phi kIt thGc &5ng )u 4 la gh v $c
!t trong )u ngo!c vu4ng gnIu kh4ng8 s@ sinh ra l#i cG phph. linh )*ng &i &V 9ua8 v hng
Nu ti>n t= ng $c sO )ng l. cc t>n ct.
u2 ) )i <' tr2ch v hin thi tt c cc hng trong *hee/1. n%nh Zd.] l fil( E2)eD gDc. n%nh
Zd.^ l )K liu $c tr%nh &' tr>n for..
private void ExcelView_Load (System.Object sender, System.EventArgs e)
{
OdbcConnection Con = new OdbcConnection(ConnectionString);
OdbcDataAdapter Adapter = new OdbcDataAdapter("SELECT FROM [Sheet1]",
Con);
DataSet Ds = new DataSet();
try
{
Con.Open();
Adapter.Fill(Ds, "Sheet1");
}
catch (Exception Err)
{
MessageBox.Show(Err.ToString());
}
finally
{
Con.Close();
}
grid.DataSource = Ds.Tables["Sheet1"];
}
415
Chng 10: ( k dl minu
0nh 10'2 ile Excel gc 0nh 10'3 liu Excel
trong ng dung .NET
MIQ JSJ> Q@jd JNA s>SJ Y\ fg hUAB ;%tomation Lt DNA >\A> E8cel Q>TAB Zc JSJ
B@cX h@qA C3M hX A^ JZAB JPd( CSJ> A\] Ly@ >@ FeA fg hUAB C3M /nterop D\
JSJ LK@ QVWAB Jbc E8cel, D\ J> Y\O D@qJ s>@ E8cel L} LVWJ J\@ L_Q QHCA OS] QaA>(
TZ] DN], A^ JZAB JPd HPQ A>@GZ J>~J AAB J>X D@qJ QV[AB QSJ DE@ h? Y@qZ FRAB
QaA>(
9'
9' 0 d ng Aata Form Wi>ard 0 d ng Aata Form Wi>ard
#eA OZKA v] hnAB OIQ ~AB hUAB J[ f h? Y@qZ DE@ Lw] Lb J>~J AAB A>VAB
s>TAB d>R@ D@jQ FPQ J~ hyAB O} A\X(
Sg hUAB ata Form *iBar&(
l sO )ng Ea/a Form @"OarA8 &*n hS' th=c hin cc &c )i <'\
Z. 7*o .t )= n .i8 ch0n .3u EmK/y ProJe)/. l!t t>n )= n l Ea/aForm@"O. Hh/p
F'.
]. 7Q thanh tr%nh Mn ch2nh ca <EE8 ch0n ProJe)/ P >AA New </em hin thi hp tho*i
>AA New </em g;(. h%nh Zd._h.
416
Chng 10: ( k dl minu
0nh 10'4 Hp thoai Add New tem
^. Ph0n Ea/a Form @"OarA8 v giK ngu'>n t>n .!c inh Ea/aForm1.)8. Hh/p FKen
th>. Ea/a Form @"OarA vo )= n. Hga' khi &*n nh/p FKen8 Ea/a Form @"OarA s@
khCi ch*'. Hh/p Ne2/.
_. l!t t>n cho t6p )K liu .i l A8Ea/a@"OarA g;(. h%nh Zd.`h. Hh/p Ne2/.
0nh 10'5 Tao mt tp d liu mi vi tn l dsataWizard
417
Chng 10: ( k dl minu
`. 7*o .t kIt nDi .i &5ng cch nh/p nGt New Conne)/"on g;(. h%nh Zd.ah.
0nh 10'6 Nhp nt New Connection d tao kt ni mi
a. wIt nDi In cM sC )K liu Nor/hw"nA ca *L *erBer trong hp tho*i Ea/a L"nk
ProKer/"e8 g;(. h%nh Zd.[h. Hh/p F'.

418
Chng 10: ( k dl minu
0nh 10'7 Hp thoai ata Link Properties
419
Chng 10: ( k dl minu
[. Ph0n kIt nDi vQa t*o g;(. h%nh Zd.bh. Hh/p Ne2/.
0nh 10'8 Chn kt ni Northwind va mi tao
b. 7h>. &ng Ca/egor"e8 v ProAu)/8 vo )anh sch *eDe)/eA </emZ8_ g;(. h%nh Zd.ch.
Hh/p Ne2/.
420
Chng 10: ( k dl minu
0nh 10'9 Thm bng Categories v Products
c. PhGng ta cNn !t t>n cho 9uan h giKa cc &ng. p} Ca/egor"e8ProAu)/8 vo hp
Name. Ca/egor"e8 l &ng cha vi khFa ch2nh l Ca/egory<E. ProAu)/8 l &ng con vi
khFa ngo*i l Ca/egory<E g;(. h%nh Zd.Zdh. Hh/p nGt h th>. 9uan h n' vo hp
=eDa/"on8 &>n phi. Hh/p Ne2/.
421
Chng 10: ( k dl minu
0nh 10'10 Tao quan h

Zd. 7rong cOa ss kI8 chGng ta ch0n cc &ng v cc trng )K liu cNn hin thi. piK ngu'>n
tt c cc trng )K liu trQ trng P")/ure thuc &ng Ca/egor"e8 g;(. h%nh Zd.ZZh.
Hh/p Ne2/.
0nh 10'11 Chn cc bng v cc trng d liu cn hin thj
422
Chng 10: ( k dl minu
ZZ. PhGng ta .uDn hin thi tt c cc &n ghi trong .t khung li8 cho n>n giK ngu'>n
cc thiIt l6p .!c inh g;(. h%nh Zd.Z]h. Hh/p F"n"8h kIt thGc tr%nh thu6t sq. |au vi
gi<'8 Ea/aForm .i s@ $c kIt sinh v hin thi g;(. h%nh Zd.Z^h.
0nh 10'12 Gi nguyn cc thit lp hin thj mc djnh
423
Chng 10: ( k dl minu
0nh 10'13 ataorm1.vb
Z]. PuDi ceng8 &*n phi &o cho :ng )ng &iIt for. Ea/a Form @"OarA s@ l Di t$ng
startup. Hh/p phi vo )= n trong *oDu/"on E2KDorer8 v ch0n ProKer/"e8. Ph0n
Ea/aForm@"O.Ea/aForm1 tQ )anh sch */ar/uK o4Je)/. Hh/p F'.
0nh 10'14 Chn ataormWiz.ataorm1 t danh sch Startup obect
Hhn FW ch*' chMng tr%nh. Hh/p nGt LoaA thiIt l6p kIt nDi cM sC )K liu v thu l' )K
liu g;(. h%nh Zd.Z`h. Pun &ng Ca/egor"e88 v ch0n .t .t &n ghi. l B r5ng &ng
ProAu)/8 &>n )i tha' si th(o 9uan h . chGng ta S ;<' )=ng. L*n cF th tha' si &t c:
trng )K liu no trong &t k &n ghi no. HIu nGt QKAa/e $c nh/p vo8 tt c nhKng tha'
si $c th=c hin trong cc khung li )K liu s@ $c tru'n v ngutn )K liu Nor/hw"nA.
u &*n kh4ng phi viIt &t k )kng .S no
424
Chng 10: ( k dl minu
0nh 10'15 u n ata orm Wizard
10'
10' 0 d ng Crystal Oe%ort Wi>ard 0 d ng Crystal Oe%ort Wi>ard
#eA OZKA QeX Cr:stal >eport Q OIQ ABZA h? Y@qZ(
%] hnAB OIQ FRA FSX JSX F`AB Cr:stal >eport *iBar&( ScZ L^, fg hUAB L@GZ
s@tO Cr!stal&eport>ie%er Lt QHlA> F\] FRA FSX JSX A\] QHCA XHO(
Cry8/aD =eKor/8 ?or V"8uaD */uA"o .NET l c4ng c &o co chuxn )nh cho V"8uaD */uA"o
.NET. L*n cF th tiIp 9un nhKng &o co n' tr>n nn @e4 v @"nAow88 v ph<n &s chGng C
)*ng )ich v @e4 tr>n .t s(rv(r.
"c n' s@ tr%nh &' tQng &c .t cch sinh &o co tQ .t ngutn )K liu. 7rc ti>n8 &*n
hS' t*o .t )= n :ng )ng @"nAow8 .i vi t>n l Cry8/aDE2amKDe.
l cF th hin thi Cry8/aD =eKor/R &*n cNn th=c hin hai &c ch2nh\ th: nht l ;<' )=ng .t
&n &o co8 v th: hai l th>. .t iu ki. CrystalReportViewer vo for. tr%nh &'
&o co.
uic ;<' )=ng .t &n &o co $c .4 t trong ZZ &c nhV )i <'\
Z. 7Q thanh tr%nh Mn ch2nh ca <EE8 ch0n ProJe)/ P >AA New </em v ch0n Cry8/aD =eKor/
g;(. h%nh Zd.Zah. Hh/p FKen.
425
Chng 10: ( k dl minu
0nh 10'16 Thm Crystal eport vo du n
]. Cry8/aD =eKor/ @"OarA s@ nh/c ta ch0n kiu &o co cNn ;<' )=ng g;(. h%nh Zd.Z[h.
piK ngu'>n &o co chuxn .!c inh8 rti nh/p F'.
0nh 10'17 Gi nguyn bo co chun mc djnh
^. Cry8/aD =eKor/ @"OarA hin thi hp tho*i */anAarA =eKor/ E2Ker/ g;(. h%nh Zd.Zbh.
Hh/p vo )u cng kI th .c FLE E$ Z>EF_ trong hp )anh sch >Ba"Da4De Ea/a
*our)e8.
426
Chng 10: ( k dl minu
0nh 10'18 Hp thoai Standard eport Expert
_. L*n s@ th' hp tho*i FLE E$ Z>EF_ g;(. h%nh Zd.Zch. Ph0n &")ro8o?/ FLE E$
ProB"Aer ?or *L *erBer8 rti nh/p Ne2/.
427
Chng 10: ( k dl minu
0nh 10'19 Chn Microsoft OLE B Provider for SQL Server
`. wI tiIp8 chGng ta cNn &o vi tr%nh thu6t sq cM sC )K liu no s@ $c kIt nDi. Ph0n cM
sC )K liu Nor/hw"nA g;(. h%nh Zd.]dh. Hh/p Ne2/.
0nh 10'20 Chn c s d liu Northwind
a. Cry8/aD =eKor/ @"OarA hin thi hp tho*i >ABan)eA <n?orma/"on. PhGng ta kh4ng cNn
tha' si th4ng tin no cho v2 ) n'8 cho n>n nh/p F"n"8h. 7rong cOa ss */anAarA
=eKor/ E2Ker/8 ch0n &ng Ca/egor"e8 v ProAu)/8 cho &n &o co ca chGng ta g;(.
h%nh Zd.]Zh. Hh/p Ne2/.
428
Chng 10: ( k dl minu
0nh 10'21 Chn bng Categories v Products
[. 7rong thj L"nk8 ca hp tho*i */anAarA =eKor/ E2Ker/8 giK ngu'>n cc .!c inh nh
h%nh Zd.]]. L*n cF th th' tr%nh thu6t sq nh ;* khFa ch2nh trong Ca/egor"e8 In khFa
ngo*i trong ProAu)/8. Hh/p Ne2/ hin thi thj F"eDA8.
429
Chng 10: ( k dl minu
0nh 10'22 Kha chnh trong Categories doc nh xa dn kha ngoai trong Products
b. 7Q &ng Ca/egor"e88 ch0n Ca/egoryName v Ee8)r"K/"on. 7Q &ng ProAu)/88 ch0n
ProAu)/Name8 uan/"/yPerQn"/8 Qn"/Pr")e8 v Qn"/8<n*/o)k g;(. h%nh Zd.]^h. Hh/p
Ne2/ hin thi thj 6rouK.
0nh 10'23 Chn cc trng d liu cn hin thj
430
Chng 10: ( k dl minu
c. Ph0n Ca/egoryName v ProAu)/Name ph<n nhF. g;(. h%nh Zd.]_h.
0nh 10'24 Chn CategoryName v ProductName d phn nhm
Zd. Hh/p Ne2/ nhiu lNn chp nh6n cc thiIt l6p .!c inh cho cc thj To/aD8 ToK N8
Char/8 v *eDe)/. whi In thj cuDi ceng gthj */yDeh8 g} ti>u Ca/egory I ProAu)/
=eKor/ g;(. h%nh Zd.]`h.
431
Chng 10: ( k dl minu
0nh 10'25 G tiu d Category - Product eport
ZZ. Hh/p F"n"8h. il( Cry8/aD=eKor/1.rK/ g;(. h%nh Zd.]ah s@ $c th>. vo )= n.
0nh 10'26 Bn bo co d doc thit k
432
Chng 10: ( k dl minu
PhGng ta S ;<' )=ng ;ong &n &o co. Lc th: hai l thiIt l6p .t cM chI ;(. &n &o
co n'. Lc n' kh )r )ng. L*n hS' kXo iu ki. CrystalReportViewer tQ hp c4ng c
vo for. .!c inh.
Hh/p phi vo CrystalReportViewer8 v ch0n ProKer/"e8. 7%. thuc t2nh Dock v ch0n Fill
g;(. h%nh Zd.][h. 7e' ch0n n' s@ khiIn CrystalReportViewer lp N' veng cli(nt ca for..
wI tiIp8 t%. thuc t2nh ReportSource8 v nh/p $row8e. Ph0n fil( Cry8/aD=eKor/1.rK/ .
chGng ta vQa ;<' )=ng. L<' gi8 &*n hS' ch*' chMng tr%nh ;(. kIt 9u g;(. h%nh Zd.]ch.
0nh 10'27 Tm thuc tnh ock v chn ill
433
Chng 10: ( k dl minu
0nh 10'28 orm bo co hon chinh
0nh 10'29 Trnh by bo co vi Crystal eport
Hh &*n cF th th'8 iu ki. CrystalReportViewer kh tinh vi. L*n cF th sO )ng cc
ch:c nvng cF sn ph<n trang v in &o co. L*n cF th nh/p nGt E2Kor/ =eKor/ gh%nh phong
&% vi .?i t>n Vh ;ut &o co thnh .t fil( >Ao4e >)ro4a/ Z.KA?_8 &")ro8o?/ E2)eD Z.2D8_8
&")ro8o?/ @orA Z.Ao)_8 ha' =")h Te2/ Eo)umen/ Z.r/?_. L*n c?ng cF th phFng to &n &o co
ho!c t%. kiI. t(;t &>n trong &n &o co.
7r%nh thu6t sq n' n' .*nh In n#i &*n kh4ng phi viIt )kng .S no c. "t fil( .S ngutn
&o co8 ch:a .t lp &o co cho &n &o co n'8 t= ng $c sinh ra. yp &o co n' cF
lp cM sC l ReportClass.
434
Chng 10: ( k dl minu
11
435
Ch01n2 334Lh5 TRSNH /iN*
436
437
Chng 11: xs `anh ong
")ro8o?/ .NET Framework &ao gt. .t t6p cc lp )eng l6p tr%nh .*ng thuc
hai kh4ng gian t>n\ System.Net v System.Net.Sockets. Pc lp n' h# tr$ .0i
th:8 tQ l6p tr%nh )=aztr>nzsock(t vi TCPX<P cho In )onloa) fil( v trang
;T&L tQ (& th4ng 9ua ;TTP. nai kh4ng gian t>n n' c?ng l nn tng cho hai nn
n(torking cp cao hMnE=emo/"ng v )ich v @e4 :&L. nai nn n' s@ $c c6p chi tiIt
trong chMng Z]. PhMng n' s@ tr%nh &' cc vn sau\
&
y' ti ngu'>n tQ (& th4ng 9ua ;TTP g.c ZZ.Z8 ZZ.]8 v ZZ.^h.
nin thi .t trang (& trong .t :ng )ng )=aztr>nz@"nAow8 &5ng iu ki. @e4
$row8er g.c ZZ._h.
y' ia chJ <P v th4ng tin EN* v .' t2nh hin hnh v cc .in khc tr>n @orDA
@"Ae @e4 g.c ZZ.` v ZZ.ah.
pOi th4ng ip +ping- g.c ZZ.[h v giao tiIp &5ng giao th:c TCP v QEP g.c ZZ.b
In ZZ.Z^h.
pOi v nh6n (z.ail g.c ZZ.Z_ v ZZ.Z`h.
1'
1' Aownload $ile th,ng )ua -TT1 Aownload $ile th,ng )ua -TT1
#eA JwA OIQ JSJ> Q>NQ A>cA> D\ L[A B@RA Lt hXAYXch OIQ @Y Q OIQ Ff@Q
Q>TAB Zc CTT,(
Sg hUAB d>V[AB Q>~J QA> -o%nload"ile Jbc YEd $!stem.=et.ebClient(
.NET Framework cung cp vi cM chI )eng gOi )K liu th4ng 9ua ;TTP. "t trong nhKng
cch )r nht l sO )ng lp System.Net.WebClient. HF cung cp nhKng phMng th:c .:czcao
nh DownloadFile v UploadFile. Pc phMng th:c n' kh4ng cF s= h# tr$ ni t*i no cho
giao tiIp &t tng &8 ha' ;c th=c. HIu cNn cc t2nh nvng n'8 &*n cF th sO )ng cc ch:c
nvng ph:c t*p hMn )o lp WebRequest v WebResponse cung cp gs@ $c .4 t trong .c
ZZ.] v ZZ.^h.
PhMng tr%nh v2 ) )i <' s@ )onloa) fil( w"n:P.g"? tQ @ocB@ho<t v lu vo qa.
using System;
using System.Net;
using System.IO;
public class Download {
private static void Main() {
string remoteUri =
"http://localhost/winXP.gif";
string localFileName = "winXP.gif";
WebClient client = new WebClient();
438
Chng 11: xs `anh ong
Console.WriteLine("Downloading file " +
remoteUri + " to " + Path.GetFullPath(localFileName));
// Thc hin download.
client.DownloadFile(remoteUri, localFileName);
Console.WriteLine("Download complete.");
Console.ReadLine();
}
}
2' 2' Aownload v x l* $ile ! ng stream Aownload v x l* $ile ! ng stream
#eA JwA YP] OIQ @Y Q OIQ Ff@Q, A>VAB s>TAB OZKA YVZ QHnJ Q@jd D\X Lc(
T>c] D\X L^, FeA OZKA vg Y ABc] QHXAB ~AB hUAB Jbc OlA>(
Sg hUAB YEd eb&eCuest Lt QeX ]CZ JwZ, YEd eb&esponse Lt A>NA LSd ~AB Q F6
fHDH, D\ OIQ fK heAB HchH i$tream&eader LK@ DE@ h? Y@qZ CTM. >c] QvQ, >X_J
6inar!&eader LK@ DE@ h? Y@qZ A>M d>Ak Lt d>A QaJ> LSd ~AB L^(
Uonloa) .t fil( cNn &Dn &c cM &n sau\
Z. |O )ng phMng th:c tqnh Create ca lp System.Net.WebRequest chJ inh trang
&*n cNn. RhMng th:c n' tr v .t Di t$ng )3n ;ut tQ WebRequest8 ph thuc vo
kiu Qn"?orm =e8our)e <Aen/"?"er gQ=<h &*n sO )ng. u2 )8 nIu ti ngu'>n l ;TTP
gvi c. tQ htt94::h8 nF s@ t*o ra Di t$ng HttpWebRequestT nIu ti ngu'>n l fil( gvi
c. tQ f#@D4::h8 nF s@ t*o ra Di t$ng FileWebRequest. L*n cF th thiIt l6p thi gian trr
th4ng 9ua thuc t2nh WebRequest.Timeout.
]. |O )ng phMng th:c GetResponse ca Di t$ng WebRequest8 phMng th:c n' tr v
.t Di t$ng WebResponse cho trang. HIu '>u cNu v$t 9ua thi gian trr th% ngo*i l
WebException s@ &i nX..
^. 7*o .t StreamReader ho!c .t BinaryReader cho WebResponse.
_. P4ng vic cuDi ceng l ;O lB str(a. n'8 ch~ng h*n ghi nF ra fil( rti hin thi trong :ng
)ng ca &*n...
lo*n .S )i <' s@ l' v hin thi .t fil( nh v ni )ung ;T&L ca .t trang (&.
using System;
using System.Net;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
439
Chng 11: xs `anh ong
public class DownloadForm : System.Windows.Forms.Form {
private System.Windows.Forms.PictureBox picBox;
private System.Windows.Forms.TextBox textBox;
// (Bo qua phn m designer.)
private void DownloadForm_Load(object sender, System.EventArgs e) {
string picUri =
"http://localhost/winXP.gif";
string htmlUri =
"http://localhost/iishelp/iis/misc/default.asp";
// Tao yu cu.
WebRequest requestPic = WebRequest.Create(picUri);
WebRequest requestHtml = WebRequest.Create(htmlUri);
// Nhn dp ng. Cng vic ny s mt nhiu
// thi gian, dac bit khi file cn ly qu ln.
WebResponse responsePic = requestPic.GetResponse();
WebResponse responseHtml = requestHtml.GetResponse();
// oc response stream.
Image downloadedImage =
Image.FromStream(responsePic.GetResponseStream());
StreamReader r =
new StreamReader(responseHtml.GetResponseStream());
string htmlContent = r.ReadToEnd();
r.Close();
// Hin th anh.
picBox.Image = downloadedImage;
// Hin th ni dung dang text cua trang HTML.
textBox.Text = htmlContent;
}
}
440
Chng 11: xs `anh ong
0nh 11'1 ownload ni dung ca mt trang web
l )onloa) fil( ln .t cch hiu 9u8 &*n cF th sO )ng k thu6t &t tng & S $c .4
t trong chMng _. L*n c?ng cF th sO )ng phMng th:c WebRequest.BeginGetResponse8
phMng th:c n' kh4ng ch!n .S lnh ca &*n v s@ g0i th tc call&ack khi nh6n $c p
:ng.
3'
3' 9 y trang -T59 t m t we!site c' yu c u xc th c 9 y trang -T59 t m t we!site c' yu c u xc th c
#eA JwA Q>Z YP] OIQ @Y Q OIQ Ff@Q, A>VAB Ff@Q L^ ]CZ JwZ OIQ fK Q>TAB
Q@A vSJ Q>nJ(
Sg hUAB YEd eb&eCuest D\ eb&esponse L} LVWJ OT QR QHXAB OUJ (( TZ]
A>@CA, QHVEJ s>@ Bg@ ]CZ JwZ, FeA d>R@ JPZ >lA> Q>ZIJ QaA>
eb&eCuest.Credentials DE@ JSJ Q>TAB Q@A vSJ Q>nJ(
"t sD (&sit( '>u cNu th4ng tin ;c th=c tQ ngi )eng. whi kIt nDi th4ng 9ua tr%nh )u't8
th4ng tin n' cF th $c cung cp .t cch trong suDt gv2 )8 .t intran(tzsit( cc & cF sO
)ng <n/egra/eA @"nAow8 au/hen/")a/"onh8 ho!c tr%nh )u't cF th '>u cNu th4ng tin n' th4ng
9ua .t hp tho*i vng nh6p. whi tru' ;ut .t trang (& &5ng l6p tr%nh th% .S lnh ca &*n
cNn phi cung cp cc th4ng tin n'.
441
Chng 11: xs `anh ong
Pch tiIp c6n . &*n sO )ng te' thuc vo kiu ;c th=c . (&sit( sO )ng.
HIu (&sit( sO )ng $a8") au/hen/")a/"on ha' E"ge8/ au/hen/")a/"on8 &*n cNn gOi kIt
h$p us(rna.( v passor)8 &5ng cch t*o .t Di t$ng System.Net.
NetworkCredential v gn nF vo thuc t2nh WebRequest.Credentials.
HIu (&sit( sO )ng <n/egra/eA @"nAow8 au/hen/")a/"on8 &*n th=c hin tMng t= nh
tr>n. L*n cF th l' cc th4ng tin vng nh6p ca ngi )eng hin hnh tQ Di t$ng
System.Net.CredentialCache.
HIu (&sit( ki hVi ch:ng chJ8 &*n cNn n*p ch:ng chJ tQ .t fil( &5ng lp
System.Security.Cryptography.X509Certificates.X509Certificate8 v th>. nF vo
t6p h$p HttpWebRequest.ClientCertificates.
Ui <' l o*n .S v2 ) cho c &a cch tiIp c6n tr>n\
using System;
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class DownloadWithAuthentication {
private static void Main() {
string uriBasic, uriIntegrated, uriCertificate;
// Xc thc username v password vi Basic authentication.
WebRequest requestA = WebRequest.Create(uriBasic);
requestA.Credentials =
new NetworkCredential("userName", "password");
requestA.PreAuthenticate = true;
// ang nhp ngi dung hin hnh vi
// Integrated Windows authentication.
WebRequest requestB = WebRequest.Create(uriIntegrated);
requestB.Credentials = CredentialCache.DefaultCredentials;
requestB.PreAuthenticate = true;
// Xc thc ngi dung bng ch k din tu.
HttpWebRequest requestC = (HttpWebRequest)
WebRequest.Create(uriCertificate);
X509Certificate cert =
X509Certificate.CreateFromCertFile(@"c:user.cer");
442
Chng 11: xs `anh ong
requestC.ClientCertificates.Add(cert);
// (By gi bt du ly v xu l dp ng.)
}
}
N>E H`AB, AjZ OZKA fg hUAB s@tZ vSJ Q>nJ J>~AB J>, FeA d>R@ Aed J>~AB J>
Q @Y( 3>TAB J^ JSJ> A\X Lt QeX LK@ QVWAB 5M@NCerti*icate Q OIQ J>~AB J>
QHXAB s>X J>~AB J> Jbc OS] QaA>(
4'
4' -i n th trang we! trong ng d ng d a-trn-Windows -i n th trang we! trong ng d ng d a-trn-Windows
#eA JwA >@tA Q>M OIQ QHcAB CTM. i>c] FPQ s s@tZ Q\@ Y@qZ A\X O\ Microsoft
/nternet E8plorer >x QHWk QHXAB OIQ ~AB hUAB hnc6QHCA6*in&ows(
Sg hUAB L@GZ s@tO ;cti"e+ *e9 5rowser iL@ JrAB DE@ /nternet E8plorerk(
.NET Framework kh4ng cung cp iu ki. no )eng )ich ni )ung ;T&L. 7u' nhi>n8
ch:c nvng n' l*i rt cNn thiIt cho vic hin thi .t ni )ung ;T&L cc & gk c nhKng ti
liu ;T&L Fng gFi th(o inh )*ng fil( tr$ giGp ca @"nAow8h c?ng nh cc th4ng tin no F
tQ (&.
l hin thi .t trang ;T&L8 &*n cF th th>. .t cOa ss <n/erne/ E2KDorer vo :ng )ng
)=aztr>nz@"nAow8. POa ss n' kh4ng chJ h# tr$ ;T&L8 . ckn h# tr$ baBa*)r"K/8 &")ro8o?/
V"8uaD $a8") *)r"K/"ng EA"/"on gV$*)r"K/h8 >)/"Be: )on/roD8 v rt nhiu plugzin khc8 te'
thuc vo cu h%nh h thDng ca &*n gcF th gt. c &")ro8o?/ @orA8 &")ro8o?/ E2)eD8 v
>Ao4e >)ro4a/ =eaAerh. L*n ckn cF th sO )ng iu ki. @e4 $row8er )u't .t th
.c trong s qa cc &8 ha' hin thi cc fil( tr>n .t FTP gF"De Tran8?er Pro/o)oDh 8"/e.
l th>. @e4 $row8er vo .t )= n trong &")ro8o?/ V"8uaD */uA"o .NET8 &*n hS' nh/p phi
vo hp c4ng c v ch0n >AAX=emoBe </em8. |au F8 ch0n thj CF& ComKonen/88 v ch0n
&")ro8o?/ @e4 $row8er g;(. h%nh ZZ.]h. 7h(o F8 iu ki. &")ro8o?/ @e4 $row8er s@ $c
th>. vo hp c4ng c. whi &*n th iu ki. n' vo for.8 cc <n/eroK >88em4Dy cNn thiIt s@
$c t*o ra v th>. vo )= n ca &*n.
443
Chng 11: xs `anh ong
0nh 11'2 Chn Microsoft Web Browser trong hp thoai Customize Toolbox
HIu kh4ng sO )ng V"8uaD */uA"o .NET8 &*n cNn t*o ra .t vV &0c &5ng tin 2ch TyKe L"4rary
<mKor/er gTD4"mK.e2eh8 s@ $c gii th2ch trong .c Z`.a.
whi sO )ng iu ki. @e4 $row8er8 &*n thng cNn cc phMng th:c sau\
Navigate gv Navigate2h Phu'n trang sang Q=L )o &*n chJ inh.
GoBack v GoForward yi sang cc trang trong )anh sch histor'.
GoHome yi sang trang .!c inh gho.(h $c thiIt l6p tr>n .' t2nh hin hnh8 v
GoSearch nin thi trang t%. kiI..
Hgi )eng cF th vo .t trang .i &5ng cch nh/p vo .t li>n kIt no F trong trang
hin hnh gnIu nF ttn t*ih. L*n cF th l' Q=L hin hnh tQ thuc t2nh LocationURL v ;c
inh iu ki. v3n ckn ;O lB trang F ha' kh4ng &5ng cch ki. tra thuc t2nh Busy. Hgoi
ra8 &*n cF th phn :ng vi nhiu s= kin khc nhau.
444
Chng 11: xs `anh ong
0nh 11'3 S dung diu kim Web Browser
using System;
using System.Drawing;
using System.Windows.Forms;
public class WebBrowser : System.Windows.Forms.Form {
private AxSHDocVw.AxWebBrowser explorer;
private System.Windows.Forms.Button cmdBack;
private System.Windows.Forms.Button cmdHome;
private System.Windows.Forms.Button cmdForward;
// (Bo qua phn m designer.)
445
Chng 11: xs `anh ong
private void WebBrowser_Load(object sender, System.EventArgs e) {
object nullObject = null;
object uri = "http://www.dvpub.com.vn";
explorer.Navigate2(ref uri, ref nullObject, ref nullObject,
ref nullObject, ref nullObject);
}
private void cmdHome_Click(object sender, System.EventArgs e) {
explorer.GoHome();
}
private void cmdForward_Click(object sender, System.EventArgs e) {
try {
explorer.GoForward();
} catch {
MessageBox.Show("Already on last page.");
}
}
private void cmdBack_Click(object sender, System.EventArgs e) {
try {
explorer.GoBack();
} catch {
MessageBox.Show("Already on first page.");
}
}
}
nNu hIt cc phMng th:c ca iu ki. @e4 $row8er u '>u cNu .t vi th4ng sD. u% cc
phMng th:c n' kh4ng $c n*p chtng8 v v% C# kh4ng h# tr$ tha. sD te' ch0n8 n>n &*n
phi cung cp gi tri cho .0i tha. sD. L*n kh4ng th sO )ng tha. chiIu null $c8 v% chGng
l cc th4ng sD ref. 7ha' vo F8 &*n hS' t*o ra .t &iIn Di t$ng ch:a tha. chiIu null8
sau F cung cp nF cho cc th4ng sD . &*n kh4ng cNn sO )ng. w thu6t n' s@ $c .4 t
chi tiIt trong .c Z`.b.
446
Chng 11: xs `anh ong
5'
5' 9 y a ch B1 c a my t7nh hi n hnh ! 9 y a ch B1 c a my t7nh hi n hnh !
#eA JwA YP] LMc J> /, Jbc OS] QaA> >@qA >\A>, J^ Q>t Y\ Lt fg hUAB fcZ A\]
QHXAB O} YqA> AQXHs@AB(
Sg hUAB d>V[AB Q>~J 7etHost=ame D\ 7etHost6!=ame Jbc YEd $!stem.=et.-ns(
yp Dns cung cp cc )ich v ph<n gii t>n .in. L*n cF th g0i phMng th:c GetHostName
l' v t>n host ca .' t2nh hin hnh. |au F8 &*n cF th )ich t>n n' sang ia chJ <P &5ng
phMng th:c GetHostByName. l<' l .t v2 )\
using System;
using System.Net;
public class GetIPAddress {
private static void Main() {
// Ly tn host cua my tnh hin hnh.
string hostName = Dns.GetHostName();
// Ly da ch IP trung khp du tin.
string ipAddress =
Dns.GetHostByName(hostName).AddressList[0].ToString();
Console.WriteLine("Host name: " + hostName);
Console.WriteLine("IP address: " + ipAddress);
Console.ReadLine();
}
}
RhMng th:c GetHostByName tr v )anh sch cc ia chJ <P cF hiu l=c. 7rong rt nhiu
trng h$p8 )anh sch n' chJ cF .t phNn tO.
3>@ fg hUAB LMc J> /, QHXAB B@cX Q@jd OeAB, FeA J^ Q>t fg hUAB LMc J>
,-.././., Lt J> LjA OS] QaA> >@qA >\A> Q>c] J>X LMc J> /, Q>nJ Qj Jbc A^(
447
Chng 11: xs `anh ong
6'
6' 1h6n gi i tn mi n thnh a ch B1 ! 1h6n gi i tn mi n thnh a ch B1 !
#eA OZKA vSJ LMA> LMc J> /, Jbc OIQ OS] QaA> hnc D\X QCA O@GA Jbc A^ F`AB
JSJ> Q>nJ >@qA OIQ QHZ] DPA omain Name S:stem iNSk (
Sg hUAB d>V[AB Q>~J 7etHost6!=ame Jbc YEd $!stem.=et.-ns DE@ LK@ fK Y\ QCA
O@GA(
7r>n (&8 cc ia chJ <P cF th tru' ;ut c4ng khai thng $c nh ;* In t>n .in )r
nh hMn. u2 )8 ia chJ If_>3_3>3aX>3\ $c nh ;* In t>n .in ZZZ>B;Bjon>co;. l ;c
inh ia chJ <P khi cF t>n .in8 .' t2nh cNn li>n l*c vi .t EN*Is(rv(r.
Yu tr%nh ph<n gii t>n .in $c th=c hin .t cch trong suDt khi &*n sO )ng lp
System.Net.Dns. yp n' cho phXp l' ia chJ <P ca .t t>n .in &5ng phMng th:c
GetHostByName. Ui <' l o*n .S tr%nh &' cch l' )anh sch cc ia chJ <P $c nh ;*
In t>n .in ZZZ>;#c?o<oft>co;.
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();
}
}
whi ch*' o*n .S tr>n8 &*n s@ th' kIt ;ut nh sau\
InterNetwork: 20.46.249.222
InterNetwork: 20.46.134.222
InterNetwork: 20.46.249.2
InterNetwork: 20.46.134.155
InterNetwork: 20.46.249.190
448
Chng 11: xs `anh ong
7'
7' G1ingH m t a ch B1 ! G1ingH m t a ch B1 !
#eA OZKA s@tO QHc OIQ OS] QaA> J^ XAY@A >c] s>TAB D\ LX Q>o@ B@cA LSd ~AB
iresponse timek Jbc A^(
Gg@ OIQ Q>TAB L@qd d@AB( T>TAB L@qd A\] LVWJ Bg@ F`AB B@cX Q>~J /nternet
Control Message ,rotocol i/CM,k DE@ OIQ Hc6fXJsQ(
"t th4ng ip +ping- giao tiIp vi .t thiIt &i t*i .t ia chJ <P c th8 gOi .t th4ng ip
thO nghi.8 v '>u cNu thiIt &i n' p :ng l*i. l o thi gian kIt nDi giKa hai .' t2nh8 &*n
cF th o thi gian cho .t p :ng.
"!c )e th4ng ip +ping- Mn gin hMn cc kiu giao tiIp khc8 nhng hin th=c .t tin 2ch
+ping- trong .NET ki hVi .t l$ng ln .S lnh n(torking .:czthp v ph:c t*p. 7h vin
lp .NET kh4ng cF sn gii php noEtha' vo F8 &*n phi sO )ng razsock(t v .t sD
.S lnh c=c k )i.
7u' nhi>n8 S cF 2t nht .t nh pht trin gii 9u'It $c vn +ping-. Ui <' l .S
lnh )o Lan)e FD8on8 .t nh pht trin ca &")ro8o?/8 cung cp. "S lnh n' cho phXp
+ping- .t host &5ng t>n ha' ia chJ <P v o l$ng .ilizgi<' cho .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;
// Tao mt raw-socket.
Socket socket = new Socket(AddressFamily.InterNetwork,
SocketType.Raw, ProtocolType.Icmp);
// Ly IPEndPoint cua server, v chuyn n thnh EndPoint.
IPHostEntry serverHE = Dns.GetHostByName(host);
IPEndPoint ipepServer =
new IPEndPoint(serverHE.AddressList[0], 0);
EndPoint epServer = (ipepServer);
449
Chng 11: xs `anh ong
// Thit lp endpoint cho my client.
IPHostEntry fromHE = Dns.GetHostByName(Dns.GetHostName());
IPEndPoint ipEndPointFrom =
new IPEndPoint(fromHE.AddressList[0], 0);
EndPoint EndPointFrom = (ipEndPointFrom);
// Tao 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)'#';
PacketSize = PingData + 8;
Byte [] icmp_pkt_buffer = new Byte [PacketSize];
int index = 0;
index = Serialize(packet,
icmp_pkt_buffer, PacketSize, PingData);
// Tnh checksum cho packet.
double double_length = Convert.ToDouble(index);
double dtemp = Math.Ceiling(double_length / 2);
int cksum_buffer_length = Convert.ToInt32(dtemp);
UInt16[] cksum_buffer = new UInt16[cksum_buffer_length];
int icmp_header_buffer_index = 0;
for (int i = 0; i cksum_buffer_length; i++) {
450
Chng 11: xs `anh ong
cksum_buffer[i] = BitConverter.ToUInt16(icmp_pkt_buffer,
icmp_header_buffer_index);
icmp_header_buffer_index += 2;
}
UInt16 u_cksum = checksum(cksum_buffer, cksum_buffer_length);
packet.CheckSum = u_cksum;

// Tun t ha packet.
byte[] sendbuf = new byte[PacketSize];
index = Serialize(packet, sendbuf, PacketSize, PingData);
// Bt du tnh gi.
dwStart = System.Environment.TickCount;
socket.SendTo(sendbuf, PacketSize, 0, epServer);
// Nhn dp ng, v ngung tnh gi.
byte[] ReceiveBuffer = new byte[256];
socket.ReceiveFrom(ReceiveBuffer, 256, 0, ref EndPointFrom);
dwStop = System.Environment.TickCount - dwStart;
}
// Don dep v tra v thi gian "ping" (tnh theo giy).
socket.Close();
return (int)dwStop;
}
private static int Serialize(IcmpPacket packet, byte[] buffer,
int packetSize, int pingData) {
// (Bo qua phng thc private dung d tun t ha packet.)
}
private static UInt16 checksum(UInt16[] buffer, int size) {
451
Chng 11: xs `anh ong
// (Bo qua phng thc private dung d tnh checksum.)
}
}
public class IcmpPacket {
public byte Type;
public byte SubCode;
public UInt16 CheckSum;
public UInt16 Identifier;
public UInt16 SequenceNumber;
public byte[] Data;
}
L*n cF th sO )ng phMng th:c tqnh Pinger.GetPingTime vi .t ia chJ <P ha' .t t>n
.in. RhMng th:c GetPingTime tr v l$ng .ilizgi<' tr4i 9ua trc khi .t p :ng $c
tiIp nh6n. Ui <' l o*n .S thO nghi. tr>n &a (&sit(\
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("12.0.0.1").ToString());
Console.ReadLine();
}
}
7hO nghi. +ping- cho phXp &*n ;c .inh cc .' t2nh khc cF onlin( ha' kh4ng. HF c?ng
cF th hKu 2ch khi :ng )ng ca &*n cNn nh gi nhKng .' t2nh khc nhau gC ;ah nhng
cho ceng ni )ung ;c inh .' no cF thi gian giao tiIp .*ng thp nht.
MIQ ]CZ JwZ d@AB J^ Q>t s>TAB Q>\A> JTAB AjZ FM @HcYY ABA Ye@( Va hU,
A>@GZ f@Q F Zc ]CZ JwZ d@AB Dl fW FM fc D\X OIQ YZAB d@AB JrAB OIQ YJ
fm Y\O JRA QH fHDH iQ>nJ J>PQ Y\ OIQ QPA JTAB Q J>K@ hMJ> DUk(
452
Chng 11: xs `anh ong
8'
8' 3iao ti % ! ng TC1 3iao ti % ! ng TC1
#eA JwA Bg@ h? Y@qZ B@?c >c@ OS] QaA> QHCA OIQ AQXHs F`AB sjQ AK@ TC,K/,(
MIQ OS] QaA> ifHDHk d>R@ Y{AB AB> F`AB YEd $!stem.=et.$oc:ets.)cp+istener(
Mx@ s>@ OIQ sjQ AK@ LVWJ Q>@jQ YNd, JR >c@ OS] QaA> LGZ J^ Q>t B@cX Q@jd F`AB YEd
$!stem.=et.$oc:ets.)cp+istener(
TCP l .t giao th:c ng tin c6' )=aztr>nzkItznDi8 cho phXp hai .' t2nh giao tiIp th4ng 9ua
.t n(tork. l t*o .t kIt nDi TCP8 .t .' t2nh phi Fng vai trk l s(rv(r v &/t Nu
l/ng ngh( tr>n .t (n)point c th g(n)point $c inh nghqa l .t ia chJ <P8 cho &iIt .'
t2nh v sD porth. "t .' t2nh khc phi Fng vai trk l cli(nt v gOi .t '>u cNu kIt nDi In
(n)point . .' t2nh th: nht ang l/ng ngh( tr>n F. "t khi kIt nDi $c thiIt l6p8 hai .'
t2nh cF th trao si cc th4ng ip vi nhau. P hai .' t2nh chJ Mn gin 0c,ghi tQ .t
System.Net.Sockets.NetworkStream.
M_J hr OIQ sjQ AK@ TC, YZTA JwA J^ OIQ fHDH D\ OIQ JY@AQ, A>VAB s>TAB Y
hX Bl OIQ ~AB hUAB s>TAB Q>t Y\ JR >c@( Va hU, QHXAB OIQ ~AB hUAB peer6to6peer,
OIQ Q@tZ QHlA> LVWJ fg hUAB Y{AB AB> JSJ ]CZ JwZ LjA iL^AB Dc@ QHy Y\ OIQ
fHDHk QHXAB s>@ OIQ Q@tZ QHlA> s>SJ LVWJ fg hUAB Lt s>@ QeX JSJ sjQ AK@ L@
iL^AB Dc@ QHy Y\ OIQ JY@AQk( THXAB Da hU L@ sO OUJ A\], JY@AQ D\ fHDH Y\ JSJ
~AB hUAB H@CAB Hm D\ LVWJ L_Q QHXAB JSJ Q>V OUJ JXA H@CAB(
"t khi kIt nDi TCP $c thiIt l6p8 hai .' t2nh cF th gOi &t k kiu )K liu no &5ng cch
ghi )K liu F ra NetworkStream. 7u' nhi>n8 B tCng ha' l &/t Nu thiIt kI .t :ng )ng
.*ng &5ng cch inh nghqa giao th:c .:cz:ngz)ng . cli(nt v s(rv(r s@ sO )ng giao
tiIp. piao th:c n' ch:a cc h5ng .4 t cc lnh $c phXp8 &o . .S lnh ca :ng )ng
kh4ng ch:a cc chu#i giao tiIp $c viIt 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";
}
}
453
Chng 11: xs `anh ong
7rong v2 ) n'8 &ng tQ v=ng $c inh nghqa sn chJ l cM &n. L*n cF th th>. nhiu h5ng
hMn nKa te' thuc vo kiu :ng )ng. u2 )8 trong .t :ng )ng tru'n fil(8 cli(nt cF th gOi
.t th4ng ip '>u cNu .t fil(. |au F8 s(rv(r cF th p l*i &5ng .t acknol()g.(nt
g>C'h v tr v cc chi tiIt ca fil( gk2ch thc fil( ch~ng h*nh. HhKng h5ng n' s@ $c &i>n
)ich thnh .t CDa88 L"4rary >88em4Dy ri>ng8 v c cli(nt v s(rv(r u phi tha. chiIu In
ass(.&l' n'.
lo*n .S )i <' l .t khu4n )*ng cho .t TCPIs(rv(r cM &n. HF l/ng ngh( tr>n .t port
cD inh8 nh6n kIt nDi In Nu ti>n v rti $i cli(nt '>u cNu ngQng kIt nDi. 7*i thi i. n'8
s(rv(r cF th g0i phMng th:c TcpListener.AcceptTcpClient lNn nKa $i cli(nt kI tiIp.
Hhng tha' vo F8 nF s@ Fng l*i.
using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
using SharedComponent;
public class TcpServerTest {
private static void Main() {
// Tao listener trn port 8000.
TcpListener listener =
new TcpListener(IPAddress.Parse("12.0.0.1"), 8000);

Console.WriteLine("About to initialize port.");
listener.Start();
Console.WriteLine("Listening for a connection...");

try {
// oi yu cu kt ni, v tra v TcpClient.
TcpClient client = listener.AcceptTcpClient();
Console.WriteLine("Connection accepted.");

// Thu ly network stream.
NetworkStream stream = client.GetStream();
// Tao BinaryWriter d ghi ra stream.
BinaryWriter w = new BinaryWriter(stream);
454
Chng 11: xs `anh ong

// Tao BinaryReader d doc tu stream.
BinaryReader r = new BinaryReader(stream);

if (r.ReadString() == ClientMessages.RequestConnect) {
w.Write(ServerMessages.AcknowledgeOK);
Console.WriteLine("Connection completed.");

while (r.ReadString() != ClientMessages.Disconnect)
{}
Console.WriteLine();
Console.WriteLine("Disconnect request received.");
w.Write(ServerMessages.Disconnect);
} else {
Console.WriteLine("Could not complete connection.");
}
// ng socket.
client.Close();
Console.WriteLine("Connection closed.");
// ng socket nm di (ngung lng nghe yu cu mi).
listener.Stop();
Console.WriteLine("Listener stopped.");
} catch (Exception err) {
Console.WriteLine(err.ToString());
}

Console.ReadLine();
}
}
lo*n .S )i <' l .t khu4n )*ng cho .t TCPIcli(nt cM &n. HF tiIp ;Gc vi s(rv(r t*i
ia chJ <P v port $c chJ inh. 7rong v2 ) n'8 ia chJ loop&ack g3I_>f>f>3EchJ In .'
t2nh hin hnhh $c sO )ng. Hh r5ng kIt nDi TCP '>u cNn hai port\ .t t*i s(rv(r v .t
455
Chng 11: xs `anh ong
t*i cli(nt. 7u' nhi>n8 chJ cNn chJ inh port t*i s(rv(r8 ckn port t*i cli(nt cF th $c ch0n ng
lGc th=c thi tQ cc port cF sn.
using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
using SharedComponent;
public class TcpClientTest {
private static void Main() {
TcpClient client = new TcpClient();
try {
Console.WriteLine("Attempting to connect to the server " +
"on port 8000.");
client.Connect(IPAddress.Parse("12.0.0.1"), 8000);
Console.WriteLine("Connection established.");
// Thu ly network stream.
NetworkStream stream = client.GetStream();
// Tao BinaryWriter d ghi ra stream.
BinaryWriter w = new BinaryWriter(stream);

// Tao BinaryReader d doc tu stream.
BinaryReader r = new BinaryReader(stream);

w.Write(ClientMessages.RequestConnect);
if (r.ReadString() == ServerMessages.AcknowledgeOK) {
Console.WriteLine("Connected.");
Console.WriteLine("Press Enter to disconnect.");
Console.ReadLine();
Console.WriteLine("Disconnecting...");
456
Chng 11: xs `anh ong
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();
}
}
Ui <' l transcript ph2a s(rv(r\
About to initialize port.
Listening for a connection...
Connection accepted.
Connection completed.
Disconnect request received.
Connection closed.
Listener stopped.
u )i <' l transcript ph2a cli(nt\
Attempting to connect to the server on port 8000.
Connection established.
Connected.
Press Enter to disconnect.
Disconnecting...
Port closed.
457
Chng 11: xs `anh ong
9'
9' 9 y a ch B1 c a client t " t n i soc"et ! 9 y a ch B1 c a client t " t n i soc"et !
AB hUAB fHDH JwA vSJ LMA> LMc J> /, Jbc JY@AQ fcZ s>@ A^ J>Pd A>NA OIQ sjQ
AK@(
Sg hUAB d>V[AB Q>~J #ccept$oc:et Jbc YEd )cp+istener Lt YP] YEd O~J6Q>Pd Y\
$!stem.=et.$oc:ets.$oc:et Q>c] Dl Y\ )cpClient( Sg hUAB Q>ZIJ QaA>
$oc:et.&emote0nd/oint Lt YP] LMc J> /, Jbc JY@AQ(
yp TcpClient kh4ng cho phXp &*n thu l' sock(t n5. )i ha' &t c: th4ng tin no v port
v ia chJ <P ca cli(nt. yp n' cF cung cp thuc t2nh Socket8 nhng thuc t2nh n' l
$cz&ozv gprotectedh v )o F kh4ng th tru' ;ut $c tQ cc lp phi )3n ;ut. l tru'
;ut sock(t n5. )i8 &*n cF hai te' ch0n\
7*o .t lp te' &iIn )3n ;ut tQ TcpClient. yp n' cF th tru' ;ut thuc t2nh $cz
&ozv Socket v trng nF ra th4ng 9ua .t thuc t2nh .i. |au F8 &*n phi sO )ng
lp te' &iIn n' tha' cho TcpClient.
LV 9ua lp TcpClient &5ng cch sO )ng phMng th:c TcpListener.AcceptSocket. L*n
v3n cF th sO )ng cc lp .:czcao l BinaryReader v BinaryWriter 0c,ghi )K
liu8 nhng &*n cNn phi t*o NetworkStream trc gsO )ng sock(th.
"c n' sO )ng cch th: hai. Ui <' l phi>n &n sOa si ca s(rv(r trong .c ZZ.b\
using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
using SharedComponent;
public class TcpServerTest {
private static void Main() {
// Tao listener trn port 8000.
TcpListener listener =
new TcpListener(IPAddress.Parse("12.0.0.1"), 8000);

Console.WriteLine("About to initialize port.");
listener.Start();
Console.WriteLine("Listening for a connection...");

try {
458
Chng 11: xs `anh ong
// UVi !Wu cXu :Yt nZi' v[ tr\ v] m^t $oc:et.
$oc:et soc:et B listener.#ccept$oc:et();
Console.WriteLine("Connection accepted.");

// )_o net%or: stream.
=et%or:$tream stream B ne% =et%or:$tream(soc:et);
// Tao BinaryWriter d ghi ra stream.
BinaryWriter w = new BinaryWriter(stream);

// Tao BinaryReader d doc tu stream.
BinaryReader r = new BinaryReader(stream);

if (r.ReadString() == ClientMessages.RequestConnect) {
w.Write(ServerMessages.AcknowledgeOK);
Console.WriteLine("Connection completed.");

// +`! aba c.c E/ cda client.
Console.rite+ine(1).e client is *rom E/ address: 1 e
((E/0nd/oint)soc:et.&emote0nd/oint).#ddress.)o$tring());
Console.rite(1).e client uses local port: 1 e
((E/0nd/oint)soc:et.&emote0nd/oint)./ort.)o$tring());

while (r.ReadString() != ClientMessages.Disconnect)
{}
Console.WriteLine();
Console.WriteLine("Disconnect request received.");
w.Write(ServerMessages.Disconnect);
} else {
Console.WriteLine("Could not complete connection.");
}
// Ufng soc:et.
soc:et.Close();
459
Chng 11: xs `anh ong
Console.WriteLine("Connection closed.");
// ng socket nm di (ngung lng nghe yu cu mi).
listener.Stop();
Console.WriteLine("Listener stopped.");
} catch (Exception err) {
Console.WriteLine(err.ToString());
}

Console.ReadLine();
}
}
10'
10' Thi t l % cc t(y ch n soc"et Thi t l % cc t(y ch n soc"et
#eA JwA Q>@jQ YNd JSJ Qr] J>A fXJsQ O~J6Q>Pd, J>AB >eA JSJ Qr] J>A J>X F@jQ
sen& timeo%t D\ recei"e timeo%t(
Sg hUAB d>V[AB Q>~J $oc:et.$et$oc:et(ption( #eA J^ Q>t Q>@jQ YNd JSJ Q>ZIJ
QaA> Jbc fXJsQ LVWJ fg hUAB Lt Y{AB AB> JSJ ]CZ JwZ >X_J JSJ Q>ZIJ QaA> Jbc
fXJsQ LVWJ fg hUAB J>X OIQ d>@CA JY@AQ JU Q>t(
L*n cF th sO )ng phMng th:c Socket.SetSocketOption thiIt l6p .t sD thuc t2nh
sock(t .:czthp. whi g0i phMng th:c n'8 &*n cNn cung cp &a Di sD sau <'\
"t gi tri thuc kiu lit k> SocketOptionLevel8 cho &iIt kiu sock(t . thiIt l6p n'
s@ p )ng cho nF g&ao gt. IP8 IPv68 Socket8 Tcp8 Udph.
"t gi tri thuc kiu lit k> SocketOptionName8 cho &iIt thiIt l6p sock(t . &*n .uDn
tha' si g;(. )anh sch cc gi tri ca SocketOptionName trong ti liu .NET
Frameworkh.
"t gi tri .4 t thiIt l6p .i. pi tri n' thng l .t sD ngu'>n8 nhng c?ng cF th
l .t .ng &'t( ha' .t kiu Di t$ng.
u2 ) )i <' s@ thiIt l6p s(n)zti.(out ca sock(t\
// Thao tc gui s ht hiu lc nu khng nhn doc
// thng tin xc nhn trong vng 1000 mili-giy.
socket.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.SendTimeout, 1000);
PhG B r5ng8 tru' ;ut sock(t .4 t .t kIt nDi cli(nt,s(rv(r8 &*n phi sO )ng phMng th:c
TcpListener.AcceptSocket tha' cho phMng th:c TcpListener.AcceptTcpClient gS $c
tho lu6n trong .c ZZ.ch.
L*n c?ng cF th thiIt l6p cc te' ch0n cho sock(t $c sO )ng &Ci TcpListener th(o )}i
cc '>u cNu kIt nDi. 7u' nhi>n8 &*n phi th=c hin th>. .t vi &c nKa. yp TcpListener
460
Chng 11: xs `anh ong
cung cp thuc t2nh Socket8 nhng kh nvng tru' ;ut ca nF l protected8 nghqa l &*n
kh4ng th tru' ;ut nF .t cch tr=c tiIp. 7ha' vo F8 &*n phi )3n ;ut .t lp .i tQ
TcpListener\
public class CustomTcpListener : TcpListener {
public Socket Socket {
get {return base.Server;}
}
public CustomTcpListener(IPAddress ip, int port) : base(ip, port) {}
}
L<' gi8 &*n cF th sO )ng lp n' khi t*o .t TcpListener. u2 ) )i <' sO )ng cch
tiIp c6n n' thiIt l6p .t te' ch0n sock(t\
CustomTcpListener listener =
new CustomTcpListener(IPAddress.Parse("12.0.0.1"), 8000);
listener.Socket.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout, 1000);
// (Su dng CustomTcpListener ging nh d su dng TcpListener.)
11'
11' T o m t TC1-server h -tr -a-ti u-tr&nh T o m t TC1-server h -tr -a-ti u-tr&nh
#eA OZKA QeX OIQ TC,?fHDH J^ Q>t JrAB YJ vg Y A>@GZ TC,?JY@AQ(
Sg hUAB d>V[AB Q>~J #ccept)cpClient Jbc YEd )cp+istener( Mx@ s>@ J^ OIQ
JY@AQ OE@ sjQ AK@ LjA, s>@ J>e] OIQ Q@tZ QHlA> OE@ Lt vg Y ]CZ JwZ D\ B@
)cp+istener.#ccept)cpClient YwA A?c(
"t (n)point TCP gia chJ <P v porth cF th phc v nhiu kIt nDi. 7h=c ra8 h iu hnh
. Mng phNn ln c4ng vic gie. &*n. HhKng g% &*n cNn l. l t*o .t Di t$ng th$
gworker o4Je)/h tr>n s(rv(r ;O lB .#i kIt nDi trong .t tiu tr%nh ri>ng.
{Xt lp TCPIcli(nt v TCPIs(rv(r S $c tr%nh &' trong .c ZZ.b. L*n cF th )r )ng
chu'n s(rv(r n' thnh .t s(rv(r h#ztr$zaztiuztr%nh th=c hin nhiu kIt nDi ceng .t
lGc. 7rc hIt8 t*o .t lp tMng tc vi .t cli(nt\
using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
461
Chng 11: xs `anh ong
using System.Threading;
using SharedComponent;
public class ClientHandler {
private TcpClient client;
private string ID;
public ClientHandler(TcpClient client, string ID) {
this.client = client;
this.ID = ID;
}
public void Start() {
// Thu ly network stream.
NetworkStream stream = client.GetStream();
// Tao BinaryWriter d ghi ra stream.
BinaryWriter w = new BinaryWriter(stream);
// Tao BinaryReader d doc tu stream.
BinaryReader r = new BinaryReader(stream);
if (r.ReadString() == ClientMessages.RequestConnect) {
w.Write(ServerMessages.AcknowledgeOK);
Console.WriteLine(ID + ": Connection completed.");
while (r.ReadString() != ClientMessages.Disconnect) {}
Console.WriteLine(ID + ": Disconnect request received.");
w.Write(ServerMessages.Disconnect);
}else {
Console.WriteLine(ID + ": Could not complete connection.");
}
462
Chng 11: xs `anh ong
// ng socket.
client.Close();
Console.WriteLine(ID + ": Client connection closed.");
Console.ReadLine();
}
}
wI tiIp8 tha' si .S lnh ca s(rv(r sao cho nF l!p li>n tc8 t*o ra cc th hin ClientHandler
.i khi cNn v ch*' chGng trong cc tiu tr%nh .i. Ui <' l .S lnh S $c sOa si\
public class TcpServerTest {
private static void Main() {
TcpListener listener =
new TcpListener(IPAddress.Parse("12.0.0.1"), 8000);
Console.WriteLine("Server: About to initialize port.");
listener.Start();
Console.WriteLine("Server: Listening for a connection...");

int clientNum = 0;
while (true) {
try {
// oi yu cu kt ni, v tra v mt TcpClient.
TcpClient client = listener.AcceptTcpClient();
Console.WriteLine("Server: Connection accepted.");
// Tao mt di tong mi d xu l kt ni ny.
clientNum++;
ClientHandler handler =
new ClientHandler(client, "Client " +
clientNum.ToString());
// Khoi dng di tong ny lm vic trong
463
Chng 11: xs `anh ong
// mt tiu trnh khc.
Thread handlerThread =
new Thread(new ThreadStart(handler.Start));
handlerThread.IsBackground = true;
handlerThread.Start();
// (Ban cng c th thm Handler v HandlerThread vo
// mt tp hop d theo di cc phin client.)
}catch (Exception err) {
Console.WriteLine(err.ToString());
}
}
}
}
Ui <' l transcript ph2a s(rv(r ca .t phi>n l. vic vi hai cli(nt\
Server: About to initialize port.
Server: Listening for a connection...
Server: Connection accepted.
Client 1: Connection completed.
Server: Connection accepted.
Client 2: Connection completed.
Client 2: Disconnect request received.
Client 2: Client connection closed.
Client 1: Disconnect request received.
Client 1: Client connection closed.
L*n cF th th>. .S lnh vo s(rv(r nF th(o vIt cc Di t$ng th$ hin hnh trong .t t6p
h$p. y. nh thI s@ cho phXp s(rv(r h' &V cc tc v n' nIu nF cNn phi Fng v chJ $c
phXp .t sD tDi a cli(nt ceng .t lGc.
12' 12' 0 d ng TC1 m t cch ! t ng ! 0 d ng TC1 m t cch ! t ng !
#eA JwA B>@ h? Y@qZ Hc AQXHs6fQHcO QAB s>K@ OIQ, O\ s>TAB d>R@ FYXJs
d>wA O} YqA> JyA Ye@( 3 Q>ZNQ A\] J^ Q>t LVWJ fg hUAB AjZ FeA OZKA fQHcO
OIQ @Y YEA QHCA OeAB(
TeX OIQ YEd H@CAB Lt vg Y s Q>ZNQ fQHcO@AB FPQ LAB FI( #eA J^ Q>t F{Q LwZ
fQHcO OIQ s>K@ h? Y@qZ F`AB d>V[AB Q>~J =et%or:$tream.6eginrite D\ JZAB
JPd OIQ d>V[AB Q>~J JcYYFcJs( 3>@ JcYYFcJs LVWJ saJ> >XeQ Q>l Bg@ s>K@ sj Q@jd(
464
Chng 11: xs `anh ong
yp NetworkStream h# tr$ vic sO )ng &t tng & th4ng 9ua phMng th:c BeginRead v
BeginWrite. |O )ng cc phMng th:c n'8 &*n cF th gOi ha' nh6n .t khDi )K liu tr>n .t
trong cc tiu tr%nh )o thr(a)zpool ca & th=c thi .NET cung cp8 . kh4ng &lock .S lnh
ca &*n. "c n' tr%nh &' k thu6t ghi &t tng &.
whi gOi )K liu .t cch &t tng &8 &*n phi gOi )K liu nhi ph<n th4 g.t .ng &'t(h. u
&*n cNn ch0n k2ch thc .#i lNn gOi ha' nh6n. u2 ) )i <' viIt l*i s(rv(r tQ .c ZZ.ZZ
sao cho .#i lp ClientHandler gOi .t l$ng ln )K liu $c 0c tQ .t fil(. UK liu n'
$c gOi .t cch &t tng &8 nghqa l ClientHandler cF th tiIp tc th=c hin cc tc v
khc gtrong v2 ) n'8 nF chJ vic l' cc th4ng ip $c gOi tQ cli(nth.
"t thu6n l$i ca cch tiIp c6n n' l ton & ni )ung ca fil( ch~ng &ao gi n5. trong &
nh .t l$t. 7ha' vo F8 nF $c thu l' nga' trc khi .t khDi .i $c gOi. "t thu6n
l$i khc nKa l s(rv(r cF th h' &V thao tc vo &t c: lGc no. u2 )8 nIu cli(nt chJ 0c In
khDi )K liu th: &a th% ng/t kIt nDi8 s(rv(r s@ thiIt l6p .t &iIn thnh vi>n lu6n lB cF t>n l
fileStop &o cho call&ack kh4ng gOi )K liu nKa.
Ui <' l lp ClientHandler S $c sOa si glp TcpServerTest kh4ng cNn tha' si g%h\
using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
using SharedComponent;
public class ClientHandler {
private TcpClient client;
private string ID;
// Kch thc mt khi d liu (2 KB).
private int bufferSize = 2048;
// B dm dung d cha d liu.
private byte[] buffer;
// Dung d doc d liu tu mt file.
private FileStream fileStream;
// Dung d giao tip vi client.
private NetworkStream networkStream;
// Du hiu ngung gui d liu.
private bool fileStop = false;
465
Chng 11: xs `anh ong
public ClientHandler(TcpClient client, string ID) {
this.buffer = new byte[bufferSize];
this.client = client;
this.ID = ID;
}
public void Start() {
// Thu ly network stream.
networkStream = client.GetStream();
// Tao cc di tong dung d gui v nhn text.
BinaryWriter w = new BinaryWriter(networkStream);
BinaryReader r = new BinaryReader(networkStream);
if (r.ReadString() == ClientMessages.RequestConnect) {
w.Write(ServerMessages.AcknowledgeOK);
Console.WriteLine(ID + ": Connection completed.");
string message = "";
while (message != ClientMessages.Disconnect) {
message = r.ReadString();
if (message == ClientMessages.RequestData) {
// Tn file c th do client cung cp, nhng
// trong v d ny, file thu nghim l m cng.
fileStream =
new FileStream("test.bin", FileMode.Open);
// Gui kch thc file.
w.Write(fileStream.Length.ToString());
// Khoi chay thao tc bt dng b.
StreamData(null);
}
466
Chng 11: xs `anh ong
}
fileStop = true;
Console.WriteLine(ID + ": Disconnect request received.");
} else {
Console.WriteLine(ID + ": Could not complete connection.");
}
// ng kt ni.
client.Close();
Console.WriteLine(ID + ": Client connection closed.");
Console.ReadLine();
}
private void StreamData(IAsyncResult asyncResult) {
// Huy bo nu client ngung kt ni.
if (fileStop == true) {
fileStop = false;
return;
}
if (asyncResult != null) {
// Mt khi d doc ghi mt cch bt dng b.
networkStream.EndWrite(asyncResult);
}
// Ly khi k tip tu file.
int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
// Nu khng doc doc byte no, stream d dn cui file.
if (bytesRead 0) {
Console.WriteLine("Streaming new block.");
// Ghi khi k tip ra network stream.
networkStream.BeginWrite(buffer, 0, buffer.Length,
467
Chng 11: xs `anh ong
new AsyncCallback(StreamData), null);
} else {
// Kt thc thao tc.
Console.WriteLine("File streaming complete.");
fileStream.Close();
}
}
}
L*n cF th sO )ng .t .3u tMng t= 0c )K liu .t cch &t tng & ph2a cli(nt.
13' 13' 3iao ti % ! ng PA1 3iao ti % ! ng PA1
#eA JwA Bg@ h? Y@qZ B@?c >c@ OS] QaA> QHCA OIQ AQXHs F`AB 7ser atagram
,rotocol 07,1 stream(
Sg hUAB YEd $!stem.=et.$oc:ets.UdpClient, D\ fg hUAB >c@ Q@tZ QHlA>z OIQ Lt Bg@
h? Y@qZ D\ OIQ Lt A>NA h? Y@qZ(
QEP l .t giao th:c phi kIt nDi8 kh4ng cF &t k iu khin )kng ch' ha' ki. tra l#i no.
whc vi TCP8 QEP s@ kh4ng $c sO )ng C nhKng nMi cNn In giao tiIp ng tin c6'. 7u'
nhi>n8 v% chi ph2 thp hMn8 QEP thng $c sO )ng cho cc :ng )ng chatt'8 t*i F chp
nh6n .t .t vi th4ng ip. u2 )8 gi sO &*n .uDn t*o .t n(tork . trong F8 cc cli(nt
gOi th4ng tin v nhit hin thi t*i vi tr2 ca chGng In .t s(rv(r .#i vi phGt. L*n cF th
sO )ng QEP trong trng h$p n' v% tNn sD giao tiIp cao v thit h*i )o .t pack(t l kh4ng
ng k gv% s(rv(r cF th tiIp tc sO )ng nhit nh6n $c cuDi cengh.
ng )ng )i <' sO )ng hai tiu tr%nh\ .t nh6n th4ng ip v .t gOi th4ng ip.
l thO nghi. :ng )ng n'8 hS' n*p hai th hin ceng .t lGc. 7r>n .' t2nh >8 cho &iIt
ia chJ <P ca .' t2nh $. 7r>n .' t2nh $8 cho &iIt ia chJ <P ca .' t2nh >. 7h(o F8 &*n
cF th gOi 9ua l*i th4ng ip )*ng t(;t g&*n cF th .4 phVng thO nghi. n' tr>n .t .'
Mn &5ng cch sO )ng hai port khc nhau v ia chJ loop&ackh.
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
public class UdpTest {
private static int localPort;
private static void Main() {
468
Chng 11: xs `anh ong
// nh ngha endpoint (thng dip doc gui tai dy).
Console.Write("Connect to IP: ");
string IP = Console.ReadLine();
Console.Write("Connect to port: ");
int port = Int32.Parse(Console.ReadLine());
IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse(IP),
port);
// nh ngha endpoint cc b (thng dip doc nhn tai dy).
Console.Write("Local port for listening: ");
localPort = Int32.Parse(Console.ReadLine());
Console.WriteLine();
// Tao mt tiu trnh mi d nhn thng dip dn.
Thread receiveThread = new Thread(
new ThreadStart(ReceiveData));
receiveThread.IsBackground = true;
receiveThread.Start();
UdpClient client = new UdpClient();
try {
string text;
do {
text = Console.ReadLine();
if (text != "") {
// M ha d liu thnh dang nh phn
// bng php m ha UTF8.
byte[] data = Encoding.UTF8.GetBytes(text);
// Gui text dn client o xa.
client.Send(data, data.Length, remoteEndPoint);
469
Chng 11: xs `anh ong
}
} while (text != "");
} catch (Exception err) {
Console.WriteLine(err.ToString());
}
Console.ReadLine();
}
private static void ReceiveData() {
UdpClient client = new UdpClient(localPort);
while (true) {
try {
// Nhn d liu (byte).
IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
byte[] data = client.Receive(ref anyIP);
// Chuyn byte thnh text bng php m ha UTF8.
string text = Encoding.UTF8.GetString(data);
// Hin th text thu doc.
Console.WriteLine(" " + text);
} catch (Exception err) {
Console.WriteLine(err.ToString());
}
}
}
}
PhG B r5ng8 cc :ng )ng QEP kh4ng th sO )ng NetworkStream nh cc :ng )ng TCP.
7ha' vo F8 chGng phi chu'n tt c )K liu thnh .t str(a. &5ng .t lp .S hFa8 nh S
$c .4 t trong .c ].].
L*n cF th thO nghi. :ng )ng n' vi cc cli(nt tr>n .' cc & &5ng cch sO )ng hai
port khc nhau v ia chJ loop&ack. u2 )8 gi sO cF hai QEPIcli(nt\ cli(nt > v cli(nt $. Ui
<' l transcript Di vi cli(nt >\
Connect to IP: 12.0.0.1
Connect to port: 8001
Local port for listening: 8080
470
Chng 11: xs `anh ong
Hi there!
u <' l transcript tMng :ng Di vi cli(nt $ gceng vi th4ng ip nh6n $ch\
Connect to IP: 12.0.0.1
Connect to port: 8080
Local port for listening: 8001
Hi there!
14'
14' 3 i e-mail th,ng )ua 05T1 3 i e-mail th,ng )ua 05T1
#eA JwA Bg@ 6Oc@Y LjA OIQ LMc J> 6Oc@Y F`AB OIQ SMT,?fHDH iSimple Mail
Transfer ,rotocol ser"erk(
Sg hUAB YEd $mtpMail D\ MailMessage Q>ZIJ s>TAB B@cA QCA $!stem.eb.Mail(
Pc lp trong kh4ng gian t>n System.Web.Mail cung cp .t vV &0c cho thnh phNn
CoDDa4ora/"on Ea/a F4Je)/8 ?or @"nAow8 2000 gCEF*V*h. PhGng cho phXp &*n so*n v gOi
th4ng ip (z.ail &5ng *&TP.
Ur )ng sO )ng cc kiu n'. L*n chJ cNn t*o .t Di t$ng MailMessage8 cho &iIt ia chJ (z
.ail ca ngi gOi v ngi nh6n8 v !t ni )ung ca th4ng ip trong thuc t2nh 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!";
HIu .uDn8 &*n cF th gOi .t th4ng ip ;T&L &5ng cch tha' si inh )*ng ca th4ng ip
v sO )ng cc thj ;T&L.
myMessage.BodyFormat = MailFormat.Html;
myMessage.Body = @"HTMLHEAD/HEAD" +
@"BODYThis is the message!/BODY/HTML";
L*n cF th th>. fil( 2nh k1. &5ng t6p h$p MailMessage.Attachments v lp
MailAttachment.
MailAttachment myAttachment = new MailAttachment("c:mypic.gif");
myMessage.Attachments.Add(myAttachment);
l gOi th4ng ip8 &*n chJ cNn cho &iIt t>n ca *&TPIs(rv(r v g0i phMng th:c
SmptMail.Send.
471
Chng 11: xs `anh ong
SmtpMail.SmtpServer = "test.mailserver.com";
SmtpMail.Send(myMessage);
7u' nhi>n8 cF .t vi vn khi sO )ng lp SmtpMail gOi .t th4ng ip (z.ail. yp n'
cNn .t *&TPIs(rv(r cc & ha' .t r(la'zs(rv(r tr>n .*ng. Hgoi ra8 lp SmtpMail kh4ng
h# tr$ vic ;c th=c8 )o F8 nIu *&TPIs(rv(r '>u cNu us(rna.( v passor)8 &*n s@ kh4ng
th gOi &t k .ail no. l kh/c phc vn n'8 &*n cF th tr=c tiIp sO )ng thnh phNn
CEF*V* th4ng 9ua CF& <n/eroK ggi sO &*n cF phi>n &n s(rv(r ca @"nAow8 ha' &")ro8o?/
E2)hangeh.
N>E H`AB, B@cX Q>~J SMT, s>TAB LVWJ fg hUAB Lt YP] 6Oc@Y( !K@ DE@ JTAB D@qJ
A\], FeA JwA B@cX Q>~J ,3,) >c] /M;,, JR >c@ B@cX Q>~J A\] LGZ s>TAB J^ QHXAB
(NET Framework(
!t J^ Q>CO Q>TAB Q@A DG JSJ> fg hUAB D\ JPZ >lA> SMT,?fHDH, FeA >}] Q>cO
s>RX JSJ Z]tA fSJ> J>Z]CA DG //S(
15'
15' 3 i v nh n e-mail v i 5/1B 3 i v nh n e-mail v i 5/1B
#eA OZKA Bg@ OIQ Q>TAB L@qd 6Oc@Y, A>VAB SMT,?fHDH iSimple Mail Transfer
,rotocol ser"erk J>Vc LVWJ JPZ >lA> QHCA OS] QaA>(
Sg hUAB Simple M;,/ iMessaging ;pplication ,rogramming /nterfacek F`AB
JSJ> A>Nd >\O JwA Q>@jQ Q Q>V D@qA >q Q>KAB s>TAB6LVWJ6ZRA6Y Mapi)'.&ll(
&>P< l giao )in cho phXp &*n tMng tc vi cc t2nh nvng .ailing $c t2ch h$p trong h
iu hnh @"nAow8. L*n cF th sO )ng &>P< gth4ng 9ua cc h. >P< kh4ngz$cz9unzlB8
ho!c th4ng 9ua thnh phNn &>P< i ceng vi V"8uaD */uA"o Yh tMng tc vi .ailzcli(nt
.!c inh gthng l &")ro8o?/ Fu/Dook ha' Fu/Dook E2Kre88h. Pc tc v &ao gt.\ l' th4ng
tin contact tQ ss ia chJ8 l' th4ng ip trong <n4o28 so*n v gOi th4ng ip. lng tiIc8 kh4ng
cF lp no sO )ng &>P< trong .NET Framework. 7u' nhi>n8 &*n cF th sO )ng th vin
kh4ngz$cz9unzlB &aK"C2.ADD.
7hch th:c ch2nh khi sO )ng *"mKDe &>P< trong .NET l .arshal cc cu trGc $c sO )ng
trong .NET thnh cc cu trGc . *"mKDe &>P< cNn8 sau F .arshal cc cu trGc )o *"mKDe
&>P< tr v cho :ng )ng .NET. l<' kh4ng phi l .t c4ng vic Mn gin. 7u' nhi>n8
&")ro8o?/ cung cp .t gii php ton vn trong .t thnh phNn C# tsng 9ut gcF th ti .irn
ph2h. L*n cF th sO )ng hai )= n )i <'\
"t thnh phNn th vin lp gCDa88 L"4rary ComKonen/h &0c l' cc h. *"mKDe &>P<
v l. cho chGng cF hiu l=c th4ng 9ua cc phMng th:c ca lp.
"t chMng tr%nh gthO nghi.h sO )ng thnh phNn n' vng nh6p8 vng ;ut8 0c
.ail8 gOi .ail...
"S lnh ca c hai )= n n' kh4ng .' ph:c t*p8 nhng rt )i n>n kh4ng tr%nh &' C <'
g&*n hS' ;(. trong qa PU 2nh k1.h.
!K@ DE@ OIQ Da hU d>~J Qed >[A iv] hnAB QHCA Q>V D@qA Simple M;,/ Jbc
Microsoft Lt QeX OIQ ~AB hUAB *in&ows Formk, OIQ hn SA C# OpZ iJ^ Q>t QR@
472
Chng 11: xs `anh ong
O@uA d>ak LVWJ Thomas Schei&egger JZAB JPd Qe@
[http://www.codep%o0ect.com/ csha%p/simp&emapidotnet.asp](
473
Chng 11: xs `anh ong
12
474
Ch01n2 3I4,kCH V- ]`V Y/L VQ R`/JTIN*
475
476
Chng 12: <ch }e Oz N? }~ *zoo`ing
")ro8o?/ .NET Framework h# tr$ hai .4 h%nh l6p tr%nh ph<n tn cp cao l
=emo/"ng v )ich v @e4 :&L. "!c )e c hai c4ng ngh n' cF nhiu i.
tMng tng gv2 )8 c hai ceng trQu t$ng hFa li g0i giKa cc tiIn tr%nh ha' giKa
cc .' t2nh khc nhau thnh li g0i phMng th:c ca cc Di t$ng C ;ah8 nhng chGng c?ng
cF vi i. khc nhau cM &n.
&
Uich v @e4 :&L $c ;<' )=ng &5ng cc chuxn ;u'>nznn v )=a vo khi ni. :&L
me88ag"ng. Uich v @e4 :&L $c th=c thi &Ci & th=c thi >*P.NETT nghqa l chGng cF $c
cc t2nh nvng ca >*P.NET nh outputzcaching. liu n' c?ng cF nghqa l )ich v @e4 :&L
thuc )*ng phi tr*ng thi g8/a/eDe88h. HFi chung8 )ich v @e4 :&L th2ch h$p nht khi &*n cNn
;u'>n &i>n nn gv2 )8 .t baBaIcli(nt g0i .t )ich v @e4 >*P.NETh ha' &i>n tin c6' gv2
)8 trong cc phi>n giao )ich thMng .*ih. 7rong chMng n'8 chGng ta s@ &n .t sD .c
li>n 9uan In )ich v @e4 :&L sau\
H<ng cao t2nh linh ho*t ca cc lp pro;' &5ng cch kh4ng viIt .S c:ng cho ia chJ
ca )ich v @e4 :&L g.c Z].Zh.
|O )ng k thu6t caching n<ng cao hiu nvng v kh nvng phc v gt2nh 9u' .4h
ca )ich v @e4 :&L g.c Z].] v Z].^h.
7*o phMng th:c giao )ich cho )ich v @e4 :&L g.c Z]._h.
7ru'n th4ng tin ;c th=c cho .t )ich v @e4 :&L &5ng pro;' g.c Z].`h.
p0i &t tng & .t phMng th:c ca )ich v @e4 :&L g.c Z].ah.
=emo/"ng l .t c4ng ngh !c trng ca .NET )nh cho cc Di t$ng ph<n tn v $c ;(.
nh l .t h6u )u ca c4ng ngh ECF&. P4ng ngh n' lB tCng cho cc h thDng inz
hous(
_
T trong F8 tt c cc :ng )ng u $c ;<' )=ng tr>n nn .NET8 ch~ng h*n &ack&on(
ca .t h thDng ;O lB hFa Mn. =emo/"ng cho phXp cc chuxn giao tiIp khc nhau8 ch~ng h*n
cc th4ng ip nhi ph<n nhV g0n v cc kIt nDi TCPX<P hiu 9u hMn . )ich v @e4 :&L
kh4ng h# tr$. Hgoi ra8 =emo/"ng ckn l c4ng ngh )u' nht h# tr$ cc Di t$ng cF tr*ng
thi8 v giao tiIp hai chiu th4ng 9ua call&ack. HF c?ng l c4ng ngh )u' nht cho phXp gCi
cc Di t$ng .NET te' &iIn 9ua .*ng. 7rong chMng n'8 chGng ta s@ &n .t sD .c li>n
9uan In =emo/"ng sau\
7*o cc Di t$ng khztru'z;utztQz;aT vng kB v 9un lB chGng tr>n <<* g.c Z].[8
Z].b8 v Z].ch.
Rht sinh s= kin tr>n cc k>nh tru' ;ut tQ ;a g.c Z].Zdh.
wi. sot thi gian sDng v phi>n &n ca cc Di t$ng khztru'z;utztQz;a g.c
Z].ZZ v Z].Z]h.
nin th=c cc phMng th:c .t chiu trong cc Di t$ng khztru'z;utztQz;a g.c
Z].Z^h.
_
inzhous( s'st(.\ n thDng c4ng ngh th4ng tin )o phkng 7 ca .t c4ng t' ;<' )=ng n>n.
477
Chng 12: <ch }e Oz N? }~ *zoo`ing
C>V[AB A\] J> LVc Hc OIQ fK s Q>ZNQ >?Z hUAB QHXAB D@qJ fg hUAB hMJ> DU
*e9 +M. D\ >emoting( !t >@tZ fZ >[A, FeA JwA Q>cO s>RX JSJ fSJ> J>Z]CA DG
LG Q\@ A\](
1'
1' Trnh vi t m# c ng cho a ch PO9 c a d ch v We! ! Trnh vi t m# c ng cho a ch PO9 c a d ch v We! ! +59 +59
#eA JwA fg hUAB OIQ hMJ> DU *e9 +M. LVWJ L_Q Qe@ OIQ LMc J> 7>. O\ LMc J>
A\] J^ Q>t Q>c] L@ fcZ s>@ FeA QH@tA s>c@ ~AB hUAB JY@AQ(
Sg hUAB LMc J> 7>. LIAB J>X hMJ> DU *e9 +M.( 3>@ L^, LMc J> LIAB A\] LVWJ
YP] OIQ JSJ> Qn LIAB Q @Y JPZ >lA> Jbc ~AB hUAB JY@AQ( THXAB Microsoft
$is%al St%&io .NET, FeA J^ Q>t JPZ >lA> LMc J> 7>. LIAB F`AB JSJ> Q>c] L@
Qr] J>A 7>. 5eha"ior Jbc *e9 >eference( #eA JAB J^ Q>t fg hUAB JTAB JU
*e9 Ser"ices escription .ang%age i*s&l.e8ek DE@ LK@ fK /appsettingurl:e!(
7h(o .!c inh8 khi &*n t*o .t lp pro;' th% ia chJ Q=L ca )ich v @e4 :&L l .S c:ng
trong phMng th:c khCi )=ng ca lp pro;' n'. L*n cF th chXp 1 thiIt l6p n' trong .S
lnh &5ng cch iu chJnh thuc t2nh Url ca lp pro;' sau khi t*o .t th hin ca nF. 7u'
nhi>n8 cF .t te' ch0n khc\ cu h%nh cho lp pro;' sO )ng .t ia chJ Q=L ng.
7rong V"8uaD */uA"o .NET8 &*n cF th th=c hin iu n' &5ng cch ch0n @e4 =e?eren)e trong
cOa ss *oDu/"on E2KDorer v tha' si te' ch0n Q=L $ehaB"or trong cOa ss ProKer/"e8 g;(.
h%nh Z].Zh.
0nh 12'1 Cu hnh dja chi UL cho djch vu Web XML
|au khi &*n tha' si nh tr>n8 ia chJ Q=L ca )ich v @e4 :&L s@ t= ng $c th>. vo
fil( cu h%nh ca :ng )ng cli(nt. il( cu h%nh n' cF t>n l @e4.)on?"g Di vi cc :ng )ng
@e48 v e>KKNamef.e2e.)on?"g Di vi cc :ng )ng khc glu B8 ngutn ;ut hin trong .4i
trng thiIt kI chJ l >KK.)on?"g8 nhng sau F s@ $c V"8uaD */uA"o .NET si t>n .t cch
t= ngh. u2 ) )i <' l thiIt l6p $c sinh t= ng trong fil( cu h%nh\
xml version="1.0" encoding="utf-8"
478
Chng 12: <ch }e Oz N? }~ *zoo`ing
configuration
appSettings
Oadd :e!B1#pp=ame.$erver=ame.$ervice=ame1
valueB1.ttp://local.ost/eb$ervices/M!$ervice.asmx1/P
/appSettings
/configuration
L*n c?ng cF th sO )ng ia chJ Q=L ng )o c4ng c @8AD.e2e sinh ra. 7rong trng h$p
n'8 &*n sO )ng Di sD /appsettingurl:e! cho &iIt t>n ca thiIt l6p cu h%nh . Q=L s@
$c lu trK C F. L*n phi t*o fil( cu h%nh &5ng ta'.
%sdl /out:/rox!.cs .ttp://local.ost/eb$ervices/M!$ervice.asmxQ$-+
/appsettingurl:e!:M!$ervice
7rong c hai trng h$p8 .S lnh ca lp pro;' s@ $c sOa si 0c ia chJ Q=L tQ fil(
cu h%nh. HIu kh4ng t%. th' gi tri cNn thiIt8 nF s@ .!c inh sO )ng ia chJ Q=L $c sO
)ng trong 9u tr%nh pht trin :ng )ng. Pch tiIp c6n n' cho phXp &*n si ia chJ Q=L ca
)ich v @e4 :&L sau khi S &i>n )ich v trin khai :ng )ng gchJ cNn tha' si fil( cu h%nhh.
2' 2' 0 d ng " thu t res%onse-caching trong d ch v We! % 0 d ng " thu t res%onse-caching trong d ch v We! % +59 +59
#eA OZKA AAB JcX >@qZ AAB Jbc hMJ> DU *e9 +M. F`AB JSJ> YVZ QH? B@S QHM
QHR DG Jbc OIQ d>V[AB Q>~J F(
Sg hUAB HfdXAf6JcJ>@AB F`AB JSJ> Q>@jQ YNd Q>ZIJ QaA> Cac.e-uration Jbc L_J
QaA> $!stem.eb.$ervices.ebMet.od(
7rong >*P.NET8 )ich v @e4 :&L h# tr$ r(spons(zcaching giDng ht nh cc trang (&
>*P.NET. whi r(spons(zcaching $c k2ch ho*t8 .S lnh ca &*n chJ th=c hin .t lNn8 v gi
tri tr v ca phMng th:c (& s@ $c lu l*i v $c tr v trong cc lNn g0i tiIp th(o. lDi
vi @e4 Form8 caching $c th=c hin cho tQng for.. lDi vi )ich v @e4 :&L8 caching
$c k2ch ho*t v cu h%nh ri>ng cho .#i phMng th:c (&.
u2 )8 phMng th:c (& )i <' tr v gi tri ng' gi hin hnh tr>n .' s(rv(r. 7h4ng tin
n' $c lu l*i trong .t phGt8 nghqa l cc li '>u cNu tiIp th(o trong khong thi gian n'
s@ nh6n l*i th4ng tin S $c lu trc F.
Using System;
using System.Web.Services;
public class ResponseCaching {
[WebMethod(CacheDuration=60)]
479
Chng 12: <ch }e Oz N? }~ *zoo`ing
public string GetDate() {
return DateTime.Now.ToString();
}
}
HIu phMng th:c (& ca &*n nh6n nhiu Di sD8 >*P.NET s@ sO )ng l*i gi tri S $c lu
chJ khi cc gi tri Di sD c?ng giDng nh thI. HIu &*n cF .t phMng th:c nh6n tN. gi tri
rng th% caching trC n>n kh4ng hiu 9u v 4i khi trC n>n lSng ph28 v% cF 9u nhiu th4ng tin
cNn $c lu nhng 2t khi $c sO )ng l*i. u2 )8 sO )ng caching trong .t phMng th:c
(& th=c hin phXp t2nh )=a tr>n Nu vo )*ng sD kh4ng phi l .t s= l=a ch0n tDt. 7ri l*i8
sO )ng caching trong .t phMng th:c (& nh6n gi tri <E ca .t nhF. nhV sn phx.
ch/c ch/n l .t s= l=a ch0n tDt. Lao gi c?ng v6'8 r(spons(zcaching &V 9ua .S lnh ca
&*n8 khiIn nF trC n>n kh4ng t cch nIu phMng th:c (& ca &*n cNn th=c hin cc hnh
ng khc gch~ng h*n ghi nh6t kBh8 ha' phMng th:c (& ca &*n ph thuc vo .t sD th4ng
tin khc ngoi cc Di sD $c a vo gch~ng h*n th4ng tin ;c th=c ca ngi )eng ha' )K
liu trong phi>n l. vich.
MIQ >eA J>j Jbc HfdXAf6JcJ>@AB Y\ A^ J> J>X d>d FeA fg hUAB Ye@ h? Y@qZ
QHXAB d>eO D@ Jbc OIQ d>V[AB Q>~J F( NjZ FeA OZKA fg hUAB Ye@ h? Y@qZ
QHXAB A>@GZ d>V[AB Q>~J F s>SJ A>cZ, s Q>ZNQ hcQc6JcJ>@AB fm >@qZ ZR >[A(
3' 3' 0 d ng " thu t data-caching trong d ch v We! +59 % 0 d ng " thu t data-caching trong d ch v We! +59 %
#eA JwA J>e] d>V[AB Q>~J F Jbc FeA A>VAB DpA fg hUAB OIQ fK Q>TAB Q@A L}
LVWJ YVZ( HX_J, FeA OZKA AAB JcX >@qZ AAB Jbc hMJ> DU *e9 +M. F`AB JSJ>
YVZ QH? OIQ fK h? Y@qZ, D\ JwA fg hUAB Ye@ h? Y@qZ A\] QHXAB OIQ fK d>V[AB Q>~J(
#eA J^ Q>t YVZ FPQ J~ LK@ QVWAB A\X D\X JcJ> F`AB d>V[AB Q>~J Ensert Jbc LK@
QVWAB $!stem.eb.Cac.ing.Cac.e( #eA J^ Q>t QHZ] vZPQ JcJ> Q>TAB Zc Q>ZIJ
QaA> QA> HttpContext.Current(
Pch th:c l. vic ca )atazcaching vi .t )ich v @e4 :&L c?ng giDng nh vi .t trang
(&. L*n cF th lu trK )K liu vo cach( &5ng .S trang (& v l' nF v trong .t )ich v
@e4 :&L8 ha' ng$c l*i. l cF th>. th4ng tin v )atazcaching v cc kiu ch2nh sch hIt
hiu l=c ge2K"ra/"on KoD")yh . nF h# tr$8 &*n hS' tha. kho .c [.Z`.
li. khc &it )u' nht giKa caching trong .t )ich v @e4 :&L v caching trong .t
trang (& l\ 7rong )ich v @e4 :&L8 &*n kh4ng th thu l' Di t$ng Cache nh .t thuc
t2nh ni t*iT tha' vo F8 &*n cNn tru' ;ut cach( th4ng 9ua thuc t2nh tqnh
HttpContext.Current.
u2 ) )i <' tr%nh &' .t )ich v @e4 :&L vi hai phMng th:c (&\
GetProductCatalog\ 7r v .t DataSet vi cc th4ng tin v sn phx.. DataSet n' cF
th $c l' tQ cach( ho!c $c sinh t= ng gnIu cNnh &5ng h. GetCustomerDataSet.
GetProductList\ P?ng sO )ng DataSet v h. GetCustomerDataSet nhng chJ l' .t
phNn th4ng tin gt>n sn phx.h.
480
Chng 12: <ch }e Oz N? }~ *zoo`ing
P hai phMng th:c (& tr>n u cF th sO )ng chung )K liu S $c lu8 iu n' l.
gi. nh gnh n!ng !t l>n cM sC )K liu.
using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.Services;
using System.Web;
public class DataCachingTest {
private static string connectionString = "Data Source=localhost;" +
"Initial Catalog=Northwind;user ID=sa";
[WebMethod()]
public DataSet GetProductCatalog() {
// Tra v DataSet (tu cache, nu c th).
return GetCustomerDataSet();
}
[WebMethod()]
public string[] GetProductList() {
// Truy xut bang khch hng (tu cache, nu c th).
DataTable dt = GetCustomerDataSet().Tables[0];

// Tao mang cha tn khch hng
string[] names = new string[dt.Rows.Count];
// d liu vo mang.
int i = 0;
foreach (DataRow row in dt.Rows) {
names[i] = row["ProductName"].ToString();
i += 1;
}
481
Chng 12: <ch }e Oz N? }~ *zoo`ing
return names;
}
private DataSet GetCustomerDataSet() {
// Kim tra item d c trong cache cha.
DataSet ds = HttpContext.Current.Cache["Products"] as DataSet;
if (ds == null) {
string SL = "SELECT FROM Products";
// Tao cc di tong ADO.NET.
SqlConnection con = new SqlConnection(connectionString);
SqlCommand com = new SqlCommand(SL, con);
SqlDataAdapter adapter = new SqlDataAdapter(com);
ds = new DataSet();
// Thc thi cu truy vn.
try {
con.Open();
adapter.Fill(ds, "Products");
// Lu item vo cache (trong 60 giy).
HttpContext.Current.Cache.Insert("Products", ds, null,
DateTime.Now.AddSeconds(60), TimeSpan.Zero);
} catch (Exception err) {
System.Diagnostics.Debug.WriteLine(err.ToString());
} finally {
con.Close();
}
}
return ds;
}
}
482
Chng 12: <ch }e Oz N? }~ *zoo`ing
4'
4' T o %h ng th c we! h tr giao d ch T o %h ng th c we! h tr giao d ch
#eA OZKA Q>nJ Q>@ QPQ JR JSJ >\A> LIAB Jbc OIQ d>V[AB Q>~J F QHXAB AB?
JRA> Jbc OIQ d>@CA B@cX hMJ> C3ML fcX J>X J>AB J> J^ >c@ s>R AABz >X_J Y\
Q>\A> JTAB >X_J Y\ Q>PQ Fe@(
3aJ> >XeQ OIQ d>@CA B@cX hMJ> Qn LIAB F`AB JSJ> J>A OIQ B@S QHM Q>ZIJ s@tZ Y@qQ
sC $!stem.0nterprise$ervices.)ransaction(ption D\ Sd hUAB A^ J>X Q>ZIJ QaA>
)ransaction(ption Jbc L_J QaA> ebMet.od(
7rong >*P.NET8 )ich v @e4 :&L h# tr$ cc phi>n giao )ich t= ng gcF th $c k2ch ho*t
tr>n .#i phMng th:ch. whi $c k2ch ho*t8 &t k ngutn )K liu no cF h# tr$ giao )ich
CF&S s@ t= ng $c a vo phi>n giao )ich hin hnh khi nF $c sO )ng trong .S lnh
ca &*n. Rhi>n giao )ich s@ t= ng $c co..it khi phMng th:c (& hon tt. Rhi>n giao
)ich n' $c rollz&ack khi cF &t k ngo*i l chaz$czthzlB no ;' ra ho!c &*n g0i
phMng th:c SetAbort ca lp System.EnterpriseServices.ContextUtil.
l k2ch ho*t vic h# tr$ giao )ich cho .t phMng th:c (&8 &*n cNn thiIt l6p thuc t2nh
TransactionOption ca !c t2nh WebMethod l RequiresNew. u2 )8 phMng th:c (& gh# tr$
giao )ichh )i <' s@ ;Fa cc &n ghi trong .t cM sC )K liu v rti h' &V phi>n giao )ich
n'. l sO )ng o*n .S n'8 &*n phi th>. .t tha. chiIu In
*y8/em.En/erKr"8e*erB")e8.ADD.
using System;
using System.Data.SqlClient;
using System.Web.Services;
using System.EnterpriseServices;
public class TransactionTest {
private static string connectionString = "Data Source=localhost;" +
"Initial Catalog=Northwind;user ID=sa";
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
public void FailedTransaction() {
// Tao kt ni.
SqlConnection con = new SqlConnection(connectionString);
// Tao cu truy vn SL.
SqlCommand cmd = new SqlCommand("DELETE FROM Customers", con);
483
Chng 12: <ch }e Oz N? }~ *zoo`ing
// Thc thi cu truy vn. Tc v ny s t dng doc
// dang k nh mt phn trong phin giao dch.
con.Open();
cmd.ExecuteNonuery();
con.Close();
// Goi mt phng thc no khc.
DoSomething();
// Nu khng c li xay ra, cc thay di trong c so d liu
// s doc commit o dy khi phng thc ny kt thc.
}
private void DoSomething() {
// Huy bo phin giao dch.
ContextUtil.SetAbort();
}
L*n cF th sO )ng tin 2ch ComKonen/ *erB")e gtrong phNn >Am"n"8/ra/"Be TooD8 ca Con/roD
PaneDh th(o )}i phi>n giao )ich tr>n. 7rong tin 2ch n'8 &*n hS' ch0n .c E"8/r"4u/eA
Tran8a)/"on CoorA"na/or ca .' t2nh hin hnh8 v ;(. Tran8a)/"on */a/"8/")8. n%nh Z].]
cho th' .t phi>n giao )ich kh4ng thnh c4ng khi ch*' o*n .S tr>n.
484
Chng 12: <ch }e Oz N? }~ *zoo`ing
0nh 12'2 Theo di mt phin giao djch khng thnh cng

u% &n cht phi tr*ng thi g8/a/eDe88h ca giao th:c ;TTP8 n>n .t phMng th:c (& chJ cF
th gFp phNn l. gDc ca .t phi>n giao )ichT nghqa l &*n kh4ng th a nhiu hMn .t
phMng th:c (& vo ceng .t phi>n giao )ich. "!c )e thuc t2nh TransactionOption chp
nh6n tt c cc gi tri TransactionOption chuxn8 nhng cc gi tri n' kh4ng .ang B nghqa
nh .ong $i. u2 )8 Disabled8 NotSupported8 v Supported u cF ceng tc )ng l v4 hiu
vic h# tr$ giao )ich. 7Mng t=8 c Required v RequiresNew u k2ch ho*t vic h# tr$ giao
)ich v khCi ch*' .t phi>n giao )ich .i. L*n n>n sO )ng RequiresNew trong cc phMng
th:c (& v% t>n ca nF tMng ;:ng vi hnh vi th6t s= gh.
CSJ B@cX hMJ> C3ML Y\O D@qJ OIQ JSJ> QHXAB fZKQ DE@ >wZ >jQ JSJ ABZA h? Y@qZ
Dl J>AB JZAB JPd JSJ FI ZRA Y Q\@ ABZ]CA QV[AB Q>aJ>( N>VAB YZTA A>E H`AB,
AjZ FeA QV[AB QSJ DE@ OIQ Q\@ ABZ]CA s>TAB >x QHW B@cX hMJ>, O} YqA> fm s>TAB
LVWJ HXYY6FcJs( MIQ fK >XeQ LIAB s>TAB d>R@ Y\ B@cX hMJ>z B>@ @Y, L_Q Q>TAB Q@A
D\X QHeAB Q>S@ d>@CA Y\O D@qJ, D\ QHZ] vZPQ OIQ Q>@jQ FM d>wA J~AB iA>V OS] @Ak(
M_Q s>SJ, JSJ Q>cX QSJ h? Y@qZ DE@ >wZ >jQ JSJ >q J[ f h? Y@qZ Enterprise iFcX
BO Microsoft S-. Ser"er D\ 3raclek LGZ Y\ QV[AB Q>aJ> C3ML(
485
Chng 12: <ch }e Oz N? }~ *zoo`ing
5'
5' Thi t l % th,ng tin xc th c cho d ch v We! +59 Thi t l % th,ng tin xc th c cho d ch v We! +59
#eA OZKA Bg@ JSJ Q>TAB Q@A LAB A>Nd Q JY@AQ Jbc hMJ> DU *e9 +M. LjA //S
a%thentication(
Sg hUAB Q>ZIJ QaA> Credentials Jbc YEd dHXv]( #eA J^ Q>t QeX OIQ LK@ QVWAB
=et%or:Credential OE@ J>~c ZfHAcO D\ dcffXHh >X_J fg hUAB
CredentialCac.e Lt YP] JSJ Q>TAB Q@A vSJ Q>nJ Jbc ABVo@ hrAB >@qA >\A>(
P?ng giDng nh trang (&8 )ich v @e4 :&L cF th $c sO )ng ceng vi <<*
au/hen/")a/"on. HhKng g% &*n cNn l. l !t )ich v @e4 :&L vo .t th .c o h*n chI
vic tru' ;ut n!c )anh. 7u' nhi>n8 nIu ngi )eng cF th cung cp cc th4ng tin nh ;* In
.t ti khon ngi )eng h$p l8 ngi )eng n' s@ $c ;c th=c v &*n cF th l' cc
th4ng tin ;c th=c n' th4ng 9ua Di t$ng WebService.User.
whc vi trang (&8 )ich v @e4 :&L kh4ng cF sn phMng th:c no thu l' th4ng tin ;c
th=c tQ cli(nt v% )ich v @e4 :&L $c th=c thi &Ci cc :ng )ng khc8 ch: kh4ng phi &Ci
ngi )eng. Uo F8 :ng )ng ang tMng tc vi )ich v @e4 :&L s@ chiu trch nhi. nh6p
&t k th4ng tin ;c th=c cNn thiIt no.
u2 ) sau .4 phVng .t )ich v @e4 :&L cF th=c hin ;c th=c ngi )eng. GetIISUser tr
v ngi )eng S $c <<* ;c th=c. HIu tru' ;ut n!c )anh $c phXp th% kIt 9u s@ l .t
chu#i r#ng. HIu tru' ;ut n!c )anh &i tQ chDi th% kIt 9u s@ l .t chu#i cF )*ng
eEoma"nNamefHeQ8erNamef ha' eComKu/erNamefHeQ8erNamef.
public class AuthenticationTest : System.Web.Services.WebService {
// Ly thng tin v ngi dung d doc IIS xc thc.
[WebMethod()]
public string GetIISUser() {
return User.Identity.Name;
}
}
Lc cuDi ceng l t*o .t cli(nt cF th cung cp cc th4ng tin ;c th=c. Pc th4ng tin n'
$c nh6p th4ng 9ua thuc t2nh Credentials ca Di t$ng pro;' gthiIt l6p thuc t2nh n'
tMng t= nh thiIt l6p thuc t2nh WebRequest.Credentials khi l' v .t trang (&Etha.
kho .c ZZ.^h. lo*n .S )i <' tr%nh &' cch tru' ;ut .t )ich v @e4 :&L sO )ng
$a8") au/hen/")a/"on g;c th=c cM &nh\
// Tao proxy.
localhost.AuthenticationTest proxy = new localhost.AuthenticationTest();
// Tao thng tin xc thc.
proxy.Credentials = new System.Net.NetworkCredential(
"myUserName", "myPassword");
486
Chng 12: <ch }e Oz N? }~ *zoo`ing
Console.WriteLine(proxy.GetIISUser());
lo*n .S )i <' tr%nh &' cch tru' ;ut .t )ich v @e4 :&L sO )ng <n/egra/eA
@"nAow8 au/hen/")a/"on g;c th=c $c t2ch h$p vi @"nAow8h\
// Tao proxy.
localhost.AuthenticationTest proxy = new localhost.AuthenticationTest();
// Gn thng tin xc thc cua ngi dung hin hnh cho lp proxy.
proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
Console.WriteLine(proxy.GetIISUser());
6' 6' 3 i ! t ng ! m t %h ng th c we! 3 i ! t ng ! m t %h ng th c we!
#eA JwA B@ OIQ d>V[AB Q>~J F QHXAB OIQ Q@tZ QHlA> s>SJ Lt J>V[AB QHlA>
Jbc FeA J^ Q>t Q>nJ >@qA JSJ QSJ DU s>SJ QHXAB s>@ J>o LSd ~AB(
Sg hUAB JSJ d>V[AB Q>~J FPQ LAB FI J^ fA QHXAB YEd dHXv]( CSJ d>V[AB Q>~J
A\] J^ QCA Y\ 6eginXXX D\ 0ndXXX DE@ XXX Y\ QCA Jbc d>V[AB Q>~J LAB FI BKJ(
yp pro;' g$c t*o t= ngh cF cc t2nh nvng cM &n . &*n cNn g0i &t k phMng th:c
(& no .t cch &t tng &. u2 )8 phMng th:c (& )i <' cF ch:c nvng t*. )Qng .t
khong thi gian ng3u nhi>n tQ Zd In Zc gi<'\
using System;
using System.Web.Services;
public class Wait : System.Web.Services.WebService {
[WebMethod]
public int Wait() {
DateTime start = DateTime.Now;
Random rand = new Random();
TimeSpan delay = new TimeSpan(0, 0, rand.Next(10, 20));
while (DateTime.Now start.Add(delay)) {}
return delay.Seconds;
}
}
487
Chng 12: <ch }e Oz N? }~ *zoo`ing
ui o*n .S tr>n8 lp pro;' tMng :ng s@ gt. &a phMng th:c\ Wait8 BeginWait v EndWait.
RhMng th:c Wait g0i phMng th:c (& .t cch tng &. RhMng th:c BeginWait khCi ch*'
phMng th:c (& trong .t tiu tr%nh ri>ng v tr v nga' l6p t:c. RhMng th:c BeginXXX lu4n
nh6n nhiu hMn phMng th:c gDc hai Di sD v tr v .t Di t$ng IAsyncState. nai Di sD
n' $c sO )ng nh6p th4ng tin tr*ng thi v .t call&ack. lDi t$ng IAsyncState cho
phXp &*n ;c inh khi no li g0i kIt thGc. u2 )8 &*n cF th inh k ki. tra thuc t2nh
IAsyncState.IsComplete ;c inh li g0i phMng th:c S hon tt cha. whi nF S hon
tt8 &*n nh6p Di t$ng IAsyncState vo phMng th:c EndWait nh6n gi tri tr v tQ
phMng th:c (&. HIu &*n g0i EndWait trc khi phMng th:c (& hon tt8 .S lnh ca &*n
s@ $i cho In khi nF hon tt.
PF hai .3u &t tng & phs &iIn )eng cho )ich v @e4 :&L. Pch th: nht l g0i vi
phMng th:c &t tng & .t l$t8 rti $i chGng hon tt. Pch n' cho phXp &*n gi. thi
gian $i tsng cng8 v nF l. vic tDt nht vi Di t$ng System.Threading.WaitHandle. u2
) )i <' g0i phMng th:c Wait &a lNn\
using System;
using System.Threading;
public class WaitClient {
[MTAThread]
private static void Main() {
localhost.WaitService proxy = new localhost.WaitService();
DateTime startDate = DateTime.Now;
// Goi ba phng thc mt cch bt dng 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};
// oi cho ca ba phng thc hon tt.
WaitHandle.WaitAll(waitHandle);
int totalDelay = proxy.EndWait(handle1) +
proxy.EndWait(handle2) + proxy.EndWait(handle3);
488
Chng 12: <ch }e Oz N? }~ *zoo`ing
TimeSpan elapsedTime = DateTime.Now - startDate;
Console.WriteLine("Completed after " + elapsedTime.ToString());
Console.WriteLine("Total delay time: " + totalDelay.ToString());
}
}
7rong trng h$p n'8 thi gian S tr4i 9ua nhV hMn thi gian tr% hoSn tsng cng\
Completed after 00:00:20.2591312
Total delay time: 4
Pch th: hai l sO )ng call&ack. L*n cNn nh6p .t ' nhi. chJ inh .t phMng th:c c
th trong .S lnh. whi phMng th:c (& hon tt8 ' nhi. n' s@ $c g0i vi Di sD l .t
Di t$ng IAsyncResult th2ch h$p.
Ui <' l o*n .S g0i phMng th:c BeginWait gceng vi .t call&ackh\
AsyncCallback callback = new AsyncCallback(Callback);
// Goi phng thc mt cch bt dng b.
proxy.BeginWait(callback, proxy);
u <' l call&ack gs@ $c k2ch ho*t khi thao tc hon tth\
public static void Callback(IAsyncResult handle) {
localhost.WaitService proxy =
(localhost.WaitService)handle.AsyncState;
int result = proxy.EndWait(handle);
Console.WriteLine("Waited " + result.ToString());
}
7' 7' T o l % "h -truy-xu t-t -xa T o l % "h -truy-xu t-t -xa
#eA OZKA QeX OIQ YEd J^ Q>t LVWJ QHZ] vZPQ Q OIQ ~AB hUAB s>SJ >c] Q OIQ
OS] QaA> s>SJ QHCA OeAB( TZ] DN], FeA s>TAB JwA QaA> QV[AB Q>aJ> vZ]CA6AGA
D\ FeA OZKA J^ >@qZ AAB QK@ VZ(
L\O J>X YEd A\] QH Q>\A> s>R6QHZ]6vZPQ6Q6vc iremota9lek F`AB JSJ> hpA vZPQ
Q YEd $!stem.Mars.al6!&e*(bJect, D\ QeX OIQ >XfQ Lt LAB s YEd A\] DE@ s@jA
QHJ (NET >emoting(
=emo/"ng cho phXp &*n l. cho .t Di t$ng trC n>n tru' ;ut $c 9ua cc &i>n .' v
&i>n tiIn tr%nh. 7rong khi )ich v @e4 :&L l gii php lB tCng khi &*n cNn chia sj cc ch:c
489
Chng 12: <ch }e Oz N? }~ *zoo`ing
nvng 9ua cc nn ha' cc &i>n tin c6'8 =emo/"ng l l=a ch0n tDt nht cho .t h thDng .
trong F tt c cc thnh phNn u $c ;<' )=ng tr>n nn .NET v h iu hnh @"nAow8.
l sO )ng .NET =emo/"ng8 &*n cNn cc phNn sau g.#i phNn phi thuc v .t ass(.&l'
ri>ng &ith\
yp khztru'z;utztQz;a yp n' cF th $c tru' ;ut tQ cc :ng )ng v cc .'
t2nh khc8 v phi )3n ;ut tQ System.MarshalByRefObject.
ng )ng host ng )ng n' vng kB kiu khztru'z;utztQz;a vi kiIn trGc .NET
=emo/"ng &5ng lp RemotingConfiguration gthuc kh4ng gian t>n
System.Runtime.Remotingh. "irn l :ng )ng host ang ch*'8 cc cli(nt C ;a cF th t*o
ra cc th hin ca lp khztru'z;utztQz;a.
ng )ng cli(nt ng )ng n' cF th t*o ra cc th hin ca lp khztru'z;utztQz;a
trong tiIn tr%nh ca host v tMng tc vi chGng. Pli(nt sO )ng lp
RemotingConfiguration vng kB cc kiu . nF .uDn tru' ;ut tQ ;a.
n%nh sau .4 t s= tMng tc giKa &a phNn tr>n. 7rong v2 ) n'8 chJ cF .t cli(nt. 7u' nhi>n8
c?ng cF th cF nhiu cli(nt t*o ra cc th hin ca lp khztru'z;utztQz;a ceng .t lGc.
7rong trng h$p n'8 .#i cli(nt s@ cF .t Di t$ng khztru'z;utztQz;a ca ch2nh nF8 v tt
c cc Di t$ng n' s@ thuc v .in :ng )ng ca host.
0nh 12'3 S dung mt lp kh-truy-xut-t-xa
Lc Nu ti>n l t*o lp khztru'z;utztQz;a. u2 )8 lp khztru'z;utztQz;a )i <' tr v
.t DataSetT vi cch n'8 .t cli(nt cF th tru' ;ut th4ng tin tQ cM sC )K liu . kh4ng
phi tr=c tiIp kIt nDi In cM sC )K liu ph2a s(rv(r.
using System;
using System.Data;
using System.Data.SqlClient;
public class ProductsDB : MarshalByRefObject {
private static string connectionString = "Data Source=localhost;" +
"Initial Catalog=Northwind;Integrated Security=SSPI";
public DataTable GetProducts() {
string SL = "SELECT FROM Products";
C@#Dnt
J?=#nB?C JAdDct
Co;9onDnt ho<t
RD;otBA@D JAdDct
C?o<<GB99@#cBt#on cB@@
490
Chng 12: <ch }e Oz N? }~ *zoo`ing
// Tao cc di tong ADO.NET.
SqlConnection con = new SqlConnection(connectionString);
SqlCommand com = new SqlCommand(SL, con);
SqlDataAdapter adapter = new SqlDataAdapter(com);
DataSet ds = new DataSet();
// Thc thi cu truy vn.
try {
con.Open();
adapter.Fill(ds, "Products");
} catch (Exception err) {
Console.WriteLine(err.ToString());
} finally {
con.Close();
}
return ds.Tables[0];
}
// Phng thc ny kim tra Remoting c hoat dng hay khng.
public string GetHostLocation() {
return AppDomain.CurrentDomain.FriendlyName;
}
}
yp n' $c inh nghqa trong .t CDa88 L"4rary >88em4Dy cF t>n l =emo/eF4Je)/.ADD.
. O~J Y QVAB, LK@ QVWAB vc fm s>TAB B@? Ye@ FPQ s QHeAB Q>S@ A\X( TaA> J>PQ
A\] J>X d>d FeA fg hUAB J>j LI saJ> >XeQ B@ OIQ YwA isingle?call acti"ationk,
QHXAB L^ LK@ QVWAB fm LVWJ QeX Hc ABc] LwZ Ox@ Yo@ B@ d>V[AB Q>~J D\ fm LVWJ
B@R@ d>^AB s>@ sjQ Q>J iB@KAB A>V QHXAB hMJ> DU *e9 +M.k( !@GZ A\] FRX LRO
JSJ LK@ QVWAB s>TAB J>@jO A>@GZ Q\@ ABZ]CA Jbc fHDH D\ D@qJ ZRA Y Q>o@ B@cA
fKAB Jbc J>AB QH ACA hu h\AB >[A(
wI In8 &*n phi t*o hostE<' l :ng )ng ph2a s(rv(r 9un lB tt c cc th hin ca lp
khztru'z;utztQz;a. L*n cF th sO )ng &t k kiu :ng )ng .NET no l. host g&ao gt.\
:ng )ng )=aztr>nz@"nAow88 )ich v @"nAow88 v :ng )ng Con8oDeh. Ui <' l .t host
Mn gin C )*ng Con8oDe\
491
Chng 12: <ch }e Oz N? }~ *zoo`ing
using System;
using System.Runtime.Remoting;
public class Server {
private static void Main() {
// ang k cc lp kha-truy-xut-tu-xa vi .NET Remoting.
RemotingConfiguration.Configure("Server.exe.config");
// Min l ng dng ny dang chay, cc di tong o xa
// s l kha truy xut.
Console.WriteLine("Press a key to shut down the server.");
Console.ReadLine();
}
}
PhMng tr%nh tr>n sO )ng fil( cu h%nh gaKK.)on?"gh cu h%nh cc lp . nF s@ h# tr$8 cc
csng . nF s@ h# tr$ cho giao tiIp .*ng8 v ia chJ Q=< gQn"?orm =e8our)e <Aen/"?"erh .
cli(nt s@ sO )ng tru' ;ut Di t$ng. Ui <' l .t fil( cu h%nh Mn gin vng kB lp
RemoteObjects.RemoteObject tQ =emo/eF4Je)/.ADD vi ia chJ csng l T0U0 th4ng 9ua giao
th:c TCPX<P. ss(.&l' n' phi n5. trong 6>C g6Do4aD >88em4Dy Ca)heh ho!c trong ceng
th .c vi :ng )ng s(rv(r. il( cu h%nh c?ng cu h%nh Di t$ng C ;a )eng chI k2ch
ho*t g0iz.tzlNn.
configuration
system.runtime.remoting
application

!-- nh ngha di tong kha-truy-xut-tu-xa. --
service
wellknown
mode = "SingleCall"
type="RemoteObject.ProductsDB, RemoteObject"
objectUri="RemoteObject" /
/service

!-- nh ngha giao thc dung cho truy xut mang.
Ban c th su dng knh tcp hay http. --
channels
492
Chng 12: <ch }e Oz N? }~ *zoo`ing
channel ref="tcp" port="9080" /
/channels

/application
/system.runtime.remoting
/configuration
nost kh4ng &ao gi tMng tc tr=c tiIp ti cc Di t$ng C ;a8 nhKng g% nF l. chJ l vng kB
cc kiu th2ch h$p vi kiIn trGc .NET =emo/"ng. |au thi i. F8 :ng )ng cli(nt cF th t*o
ra cc Di t$ng n'8 v :ng )ng s(rv(r cF th tiIp tc th=c hin cc c4ng vic khc. 7u'
nhi>n8 khi host &i Fng8 tt c cc Di t$ng s@ &i h'8 v kh4ng th t*o Di t$ng $c nKa.
ng )ng cli(nt sO )ng fil( cu h%nh tMng t= nh tr>n inh nghqa ia chJ Q=L v kiu
ca Di t$ng C ;a. lia chJ Q=L cF inh )*ng nh sau\
[Protocol]://[Server]:[PortNumber]/[ObjectURI]
Ui <' l fil( cu h%nh ph2a cli(nt\
configuration
system.runtime.remoting
application

! nh ngha di tong m ng dng ny
mun truy xut tu xa. --
client
wellknown type="RemoteObject.ProductsDB, RemoteObject"
url="tcp://localhost:9080/RemoteObject" /
/client

!-- nh ngha giao thc dung cho truy xut mang.
Giao thc ny phai khp vi giao thc doc
dnh ngha pha server, nhng da ch cng c th
khc. a ch cng 0 ngha l "ly bt k
mt da ch cng no cn trng". --
channels
channel ref="tcp" port="0" /
/channels

/application
/system.runtime.remoting
493
Chng 12: <ch }e Oz N? }~ *zoo`ing
/configuration
ng )ng cli(nt sO )ng phMng th:c RemotingConfiguration.Configure vng kB cc Di
t$ng . nF .uDn g0i. |au khi S vng kB ;ong8 cli(nt cF th t*o Di t$ng n' giDng nh
t*o Di t$ng cc & .!c )e nF th6t s= n5. trong .in :ng )ng ca host. lo*n .S )i <'
tr%nh &' cc &c n'\
using System;
using System.Runtime.Remoting;
using System.Data;
using RemoteObject;
public class Client {
private static void Main() {
// ang k cc lp s doc truy xut tu xa.
RemotingConfiguration.Configure("Client.exe.config");
// Tng tc vi di tong o xa thng qua proxy.
ProductsDB proxy = new ProductsDB();

// Hin th tn min ng dng cua host.
Console.WriteLine("Object executing in: " +
proxy.GetHostLocation());
// Ly DataSet v hin th ni dung cua n.
DataTable dt = proxy.GetProducts();

foreach (DataRow row in dt.Rows) {
Console.WriteLine(row[1]);
}
Console.ReadLine();
}
}
l t*o .t Di t$ng C ;a8 cli(nt cNn .t tha. chiIu In ass(.&l' . lp n' $c inh
nghqa trong F. liu n' cNn th>. .t &c trin khai nKa8 &*n cF th trnh i &5ng cch sO
)ng .t giao )in cF inh nghqa cc ch:c nvng $c h# tr$.
494
Chng 12: <ch }e Oz N? }~ *zoo`ing
!t J>Z]tA h? Y@qZ LjA LK@ QVWAB vc i>X_J J>Z]tA h? Y@qZ Q LK@ QVWAB vc DGk,
JSJ s@tZ h? Y@qZ hrAB J>X JSJ Q>cO fK D\ B@S QHM QHR DG d>R@ Y\ s>R6QZwA6Qn6>^c
iserialiBa9leQPQ JR JSJ s@tZ J[ FRA LGZ J^ QaA> J>PQ A\]k( NjZ OZKA fg hUAB
JSJ YEd Qr] F@jA Lt J>Z]tA h? Y@qZ, FeA d>R@ Y\O J>X JSJ YEd A\] QH Q>\A> s>R6
QZwA6Qn6>^c F`AB JSJ> Sd hUAB L_J QaA> $erialiIable ivO OUJ ( Lt F@jQ
Q>CO J>@ Q@jQk(
8' 8' 4ng "* t t c cc l % "h -truy-xu t-t -xa trong m t assem!ly 4ng "* t t c cc l % "h -truy-xu t-t -xa trong m t assem!ly
#eA OZKA LAB s QPQ JR JSJ YEd s>R6QHZ]6vZPQ6Q6vc LVWJ LMA> AB>c QHXAB OIQ
cffOFY] O\ s>TAB d>R@ J> LMA> J>AB QHXAB @Y JPZ >lA>(
Ned cffOFY] iJ^ J>~c JSJ YEd s>R6QHZ]6vZPQ6Q6vck F`AB J[ J>j d>RA J>@jZ
ireflectionk( DZ]qQ Zc QPQ JR JSJ s@tZ QHXAB L^ D\ fg hUAB d>V[AB Q>~J
&emotingCon*iguration.&egisterell;no%n$ervice)!pe Lt LAB s Ox@ YEd s>R6
QHZ]6vZPQ6Q6vc(
.NET cho phXp &*n vng kB cc lp khztru'z;utztQz;a .t cch )r )ng th4ng 9ua vic viIt
fil( cu h%nh ho!c viIt .S chMng tr%nh. {Xt v2 ) trong .c Z].[. l vng kB &5ng .S
chMng tr%nh8 trc hIt &*n phi g &V nhKng khai &o lp trong fil( cu h%nh tr>n s(rv(r nh
sau\
configuration
system.runtime.remoting
application

channels
channel ref="tcp" port="9080" /
/channels

/application
/system.runtime.remoting
/configuration
L<' gi8 &*n cF th sO )ng k thu6t phn chiIu kIt h$p vi phMng th:c
RegisterWellKnownServiceType vng kB tt c cc lp khztru'z;utztQz;a. 7u' nhi>n8 &*n
cNn th>. .t tha. chiIu In *y8/em.=un/"me.=emo/"ng.ADD. lo*n .S )i <' t%. cc lp
khztru'z;utztQz;a trong =emo/eF4Je)/.ADD v vng kB .#i lp\
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
495
Chng 12: <ch }e Oz N? }~ *zoo`ing
using System.Runtime.Remoting.Channels.Tcp;
using System.Reflection;
public class Server {
private static void Main() {
// Su dng file cu hnh d dnh ngha cc tuy chon v mang.
RemotingConfiguration.Configure("Server.exe.config");
// Ly knh Remoting d doc dang k.
TcpChannel channel =
(TcpChannel)ChannelServices.RegisteredChannels[0];
// Nap RemoteObject.dll.
Assembly assembly = Assembly.LoadFrom("RemoteObject.dll");
// Xu l tt ca cc kiu trong RemoteObject.dll.
foreach (Type type in assembly.GetTypes()) {
// Kim tra kiu c phai l kha-truy-xut-tu-xa hay khng.
if (type.IsSubclassOf(typeof(MarshalByRefObject))) {
// ang k kiu (tn kiu l da ch URI).
Console.WriteLine("Registering " + type.Name);
RemotingConfiguration.RegisterWellKnownServiceType(
type, type.Name, WellKnownObjectMode.SingleCall);
// Xc dnh da ch URL (kiu doc publish tai dy).
string[] urls = channel.GetUrlsForUri(type.Name);
Console.WriteLine(urls[0]);
}
}
Console.WriteLine("Press a key to shut down the server.");
Console.ReadLine();
}
496
Chng 12: <ch }e Oz N? }~ *zoo`ing
}
9' 9' 2u n l* cc i t ng xa trong BB0 2u n l* cc i t ng xa trong BB0
#eA OZKA QeX OIQ LK@ QVWAB s>R6QHZ]6vZPQ6Q6vc QHXAB //S iLt J^ Q>t fg hUAB
SS. >c] //S a%thenticationk Q>c] J>X OIQ >XfQ J>Z]CA F@qQ(
!_Q @Y JPZ >lA> D\ cffOFY] D\X OIQ Q>V OUJ RX, D\ Q>c] L@ 7>/ fcX J>X A^
sjQ Q>J F`AB (rem >c] (soap(
7ha' v% t*o .t host chu'>n &it8 &*n cF th 9un lB .t lp khztru'z;utztQz;a trong <<*
g<n/erne/ <n?orma/"on *erB")e8h. liu n' cho phXp &*n &o . cc lp khztru'z;utztQz;a
s@ lu4n cF hiu l=c8 v cho phXp &*n sO )ng cc t2nh nvng ca <<* nh **L En)ryK/"on v
<n/egra/eA @"nAow8 au/hen/")a/"on.
l 9un lB .t lp khztru'z;utztQz;a trong <<*8 trc hIt &*n phi t*o .t th .c o. 7h
.c n' ch:a hai th:\ fil( cu h%nh )eng vng kB cc lp khztru'z;utztQz;a v th .c
4"n )eng ch:a CDa88 L"4rary >88em4Dy tMng :ng gho!c ci !t ass(.&l' vo 6>Ch.
il( cu h%nh n' hon ton tMng t= vi fil( cu h%nh . &*n sO )ng cho .t host te' &iIn.
7u' nhi>n8 &*n phi tu<n th(o cc 9u' t/c\
L*n phi sO )ng k>nh ;TTP g.!c )e cF th sO )ng $"nary ?orma//er Di vi cc k2ch
thc th4ng ip nhV hMnh.
L*n kh4ng th chJ c th ia chJ csng. <<* l/ng ngh( tt c cc csng &*n S cu h%nh
trong <<* &anager gcsng U0 v GGCh.
Q=< phi kIt thGc &5ng .rem ha' .8oaK.
il( cu h%nh phi cF t>n l @e4.)on?"g8 nIu kh4ng nF s@ &i &V 9ua.
il( @e4.)on?"g )i <' s@ vng kB lp S $c tr%nh &' trong .c Z].[\
configuration
system.runtime.remoting
application
service
wellknown mode="SingleCall"
type="RemoteObject.ProductsDB, RemoteObject"
objectUri="RemoteObject.rem" /
/service
channels
channel ref="http"
!-- G bo ch thch di dy d su dng Binary formatter
497
Chng 12: <ch }e Oz N? }~ *zoo`ing
thay cho SOAP formatter (mac dnh). --
!--
serverProviders
formatter ref="binary"/
/serverProviders
--
/channel
/channels
/application
/system.runtime.remoting
/configuration
Pli(nt cF th sO )ng Di t$ng $c 9un lB trong <<* giDng nh Di t$ng $c 9un lB
trong .t host te' &iIn. 7u' nhi>n8 t>n th .c o s@ l .t phNn ca Q=<. u2 )8 nIu fil(
@e4.)on?"g vQa tr%nh &' C tr>n $c !t trong th .c o htt94::@ocB@ho<t:RD;otDJAdDct< th%
Q=L N' s@ l htt94::@ocB@ho<t:RD;otDJAdDct<:RD;otDJAdDct>?D;.
3>@ ZRA Y OIQ LK@ QVWAB DE@ //S, Q\@ s>XRA LVWJ fg hUAB Lt Q>nJ Q>@ LK@ QVWAB
Y\ Q\@ s>XRA ;S,.NET iLVWJ LMA> AB>c QHXAB @Y machine.configk( NjZ Q\@
s>XRA A\] s>TAB J^ Z]GA QHZ] vZPQ J[ f h? Y@qZ iY\ QHeAB Q>S@ O_J LMA>k, FeA
fm B_d Yx@ s>@ J>e] Da hU A\]( !t B@R@ Z]jQ DPA LG A\], FeA >}] vO OUJ ((
10' 10' 1ht sinh s "i n trn "nh truy xu t t xa 1ht sinh s "i n trn "nh truy xu t t xa
#eA JwA QeX OIQ JY@AQ J^ Q>t A>NA OIQ fn s@qA hX LK@ QVWAB vc d>SQ f@A>(
P>R@ J>{J H`AB FeA LcAB fg hUAB JSJ sCA> >c@ J>@GZ i9i&irectional channelk( TeX
OIQ LK@ QVWAB s>R6QHZ]6vZPQ6Q6vc FCA JY@AQ iJ^ Q>t A>NA fn s@qA Q fHDHk(
"!c )e cG php th lB s= kin kh4ng h tha' si khi &*n sO )ng .NET =emo/"ng8 nhng &*n
cNn t*o .t cli(nt cF th th lB s= kin tQ .t Di t$ng C ;a. Ui <' l cc '>u cNu ch2nh\
yp khztru'z;utztQz;a phi sO )ng chI $czcli(ntzk2chzho*t g)D"en/Ia)/"Ba/eAh
ha' chI k2ch ho*t Mnznht g8"ngDe/on a)/"Ba/"onh kh4ng phi chI k2ch ho*t g0iz
.tzlNn g8"ngDeI)aDD a)/"Ba/"onh. liu n' &o . Di t$ng v3n +ckn sDng- giKa cc
lNn g0i phMng th:c8 cho phXp nF pht sinh s= kin In cli(nt.
Pli(nt phi sO )ng k>nh hai chiu nF cF th nh6n cc kIt nDi )o s(rv(r khCi t*o.
lDi t$ng EventArgs phi l khztuNnzt=zhFa nF cF th $c chu'n 9ua cc &i>n
.in :ng )ng.
Pli(nt phi sO )ng .t Di t$ng khztru'z;utztQz;a nh6n s= kin g$c g0i l
list(n(rh. 7h(o F8 list(n(r s@ )=ng .t s= kin cc & . cli(nt cF th ;O lB $c. lDi
498
Chng 12: <ch }e Oz N? }~ *zoo`ing
t$ng C ;a kh4ng th tr=c tiIp pht sinh s= kin In .t lp &%nh thng v% lp &%nh
thng kh4ng th $c tru' ;ut tQ cc .in :ng )ng khc.
L*n phi tha' si cc fil( cu h%nh ca cli(nt v s(rv(r cho phXp +full s(rialioation-
giu n' kh4ng cNn thiIt vi .NET 1.0h.
Ui <' l lp khztru'z;utztQz;a . &*n cF th sO )ng pht sinh .t s= kin In
cli(nt. yp n' cung cp phMng th:c StartTask khCi ch*' .t & inh thi8 pht sinh sau
.t thi gian ng/n gkhong Zd gi<'h. whi & inh thi pht sinh8 Di t$ng khztru'z;utztQz
;a )=ng l>n s= kin TaskComplete.
using System;
using System.Timers;
public delegate void TaskCompleted(object sender,
TaskCompleteEventArgs e);
public class RemoteObject : MarshalByRefObject {
public event TaskCompleted TaskComplete;
private Timer tmr = new Timer();
public void StartTask() {
tmr.Interval = 10000;
tmr.Elapsed += new ElapsedEventHandler(tmrCallback);
tmr.Start();
}
private void tmrCallback(object sender, ElapsedEventArgs e) {
tmr.Enabled = false;
if (TaskComplete != null) {
TaskComplete(this,
new TaskCompleteEventArgs("Task completed on server"));
}
}
public override object InitializeLifetimeService() {
499
Chng 12: <ch }e Oz N? }~ *zoo`ing
return null;
}
}
[Serializable()]
public class TaskCompleteEventArgs : EventArgs {
public string Result;
public TaskCompleteEventArgs(string result) {
this.Result = result;
}
}
Lc kI tiIp l inh nghqa .t lp khztru'z;utztQz;a ch*' tr>n cli(nt v cF th nh6n s= kin
n'. 7h(o F8 lp n' cF th tiIp ;Gc vi cli(nt. yp EventListener )i <' tr%nh &' .t v2
) nh thIEnF chJ Mn gin )=ng l>n s= kin th: hai8 . cli(nt cF th tr=c tiIp ;O lB. P?ng
nh tt c cc Di t$ng khztru'z;utztQz;a8 nF s@ chJ $c tru' ;ut trong ` phGt8 trQ khi
&*n tha' si ch2nh sch +l(as(- gs@ $c .4 t trong .c Z].ZZh. PF .t cch l chXp 1
phMng th:c InitializeLifetimeService cho phXp Di t$ng $c sDng vqnh virn\
public class EventListener : MarshalByRefObject {
public event RemoteObject.TaskCompleted TaskComplete;
// Th l s kin o xa.
public void OnTaskComplete(object sender,
RemoteObject.TaskCompleteEventArgs e) {
TaskComplete(sender, e);
}
public override object InitializeLifetimeService() {
return null;
}
}
yist(n(r phi $c inh nghqa trong .t ass(.&l' ri>ng nF cF th $c tha. chiIu &Ci :ng
)ng cli(nt v lp khztru'z;utztQz;a gc hai u cNn tMng tc vi nFh.
L<' gi :ng )ng cli(nt cF th khCi ch*' tc v &t tng & th4ng 9ua lp RemoteObject v
th lB s= kin th4ng 9ua lp EventListener. lo*n .S )i <' tr%nh &' .t cli(nt chJ Mn
gin hin thi th4ng &o khi nh6n $c s= kin\
500
Chng 12: <ch }e Oz N? }~ *zoo`ing
using System;
using System.Windows.Forms;
using System.Runtime.Remoting;
public class ClientForm : System.Windows.Forms.Form {
private System.Windows.Forms.Button cmdStart;
// (Bo qua phn m designer.)
RemoteObject.RemoteObject remoteObj;
EventListener.EventListener listener;
private void ClientForm_Load(object sender, System.EventArgs e) {
RemotingConfiguration.Configure("Client.exe.config");
remoteObj = new RemoteObject.RemoteObject();
listener = new EventListener.EventListener();
}
private void cmdStart_Click(object sender, System.EventArgs e) {
// Kt ni phng thc th l s kin o xa.
remoteObj.TaskComplete += new
RemoteObject.TaskCompleted(listener.OnTaskComplete);
// Kt ni phng thc th l s kin cc b.
listener.TaskComplete +=
new RemoteObject.TaskCompleted(TaskComplete);
remoteObj.StartTask();
MessageBox.Show("Task has been started.");
}

// nh ngha phng thc th l s kin cc b.
501
Chng 12: <ch }e Oz N? }~ *zoo`ing
private void TaskComplete(object sender,
RemoteObject.TaskCompleteEventArgs e) {
MessageBox.Show("Event received: " + e.Result);
}
}
l cF th l. vic8 &*n phi ch/c r5ng cli(nt ang sO )ng cc k>nh hai chiu. Uo F8 thj
channel trong fil( cu h%nh phi tr4ng giDng nh sau\
channel re*B1tcp1 port="0" /
u kh4ng $c giDng nh cc v2 ) )i <'\
channel re*B1tcp server1 port="0" /
channel re*B1tcp client1 port="0" /
Hgoi ra8 &*n phi k2ch ho*t vic h# tr$ +full s(rialioation-. HIu kh4ng8 s(rv(r s@ kh4ng $c
phXp nh6n ' nhi. cho phMng th:c Listener.TaskCompleted8 v s@ kh4ng th kIt nDi In
phMng th:c th lB s= kin C ;a. l k2ch ho*t vic h# tr$ +full s(rialioation- &>n s(rv(r8 &*n
cNn tha' si fil( cu h%nh ca host nh sau\
configuration
system.runtime.remoting
application

client url="tcp://localhost:9080/Server"
activated type="RemoteObject.RemoteObject, RemoteObject"/
/client

channels
channel ref="tcp" port="0"
serverProviders
formatter ref="binary" typeFilterLevel="Full" /
/serverProviders
/channel
/channels

/application
/system.runtime.remoting
/configuration
l k2ch ho*t vic h# tr$ +full s(rialioation- &>n cli(nt8 &*n cNn tha' si fil( cu h%nh ca
cli(nt nh sau\
configuration
502
Chng 12: <ch }e Oz N? }~ *zoo`ing
system.runtime.remoting
application name="SimpleServer"

service
activated type="RemoteObject.RemoteObject, RemoteObject"/
/service

channels
channel ref="tcp" port="9080"
serverProviders
formatter ref="binary" typeFilterLevel="Full" /
/serverProviders
/channel
/channels

/application
/system.runtime.remoting
/configuration
11'
11' .i m sot th i gian s ng c a m t i t ng xa .i m sot th i gian s ng c a m t i t ng xa
#eA OZKA JPZ >lA> Q>o@ B@cA fKAB Jbc OIQ LK@ QVWAB L[A6A>PQ >c] LVWJ6JY@AQ6
saJ>6>XeQ s>@ A^ s>TAB JyA LVWJ fg hUAB(
C> LMA> JSJ Q>@jQ YNd O_J LMA> DG Q>o@ B@cA fKAB QHXAB @Y JPZ >lA> Jbc >XfQ
J>d L d>V[AB Q>~J EnitialiIe+i*etime$ervice QHXAB YEd vc >X_J >@qA Q>nJ
OIQ J[ J>j s@tO fXSQ Q>o@ B@cA fKAB FCA JY@AQ(
HIu .t Di t$ng sO )ng chI k2ch ho*t g0i .t lNn g8"ngDeI)aDD a)/"Ba/"onh8 nF s@ t=
ng &i h' vo cuDi .#i li g0i phMng th:c. liu n' khc vi cc Di t$ng $czcli(ntz
k2chzho*t g)D"en/Ia)/"Ba/eAh v Mnznht g8"ngDe/onh8 cc Di t$ng n' cF thi gian sDng l<u
hMn v% tu<n th(o +lif(ti.( l(as(- gt*. )ich l +h$p tng cho thu> thi gian sDng-h. ui cc
thiIt l6p .!c inh8 .t Di t$ng C ;a s@ t= ng &i h' nIu nF kh4ng ho*t ng trong hai
phGt8 .irn l nF S ttn t*i 2t nht nv. phGt.
nost8 Di t$ng C ;a8 v cli(nt u cF th tha' si cc thiIt l6p v thi gian sDng.
nost cF th chJ inh cc thiIt l6p .!c inh v thi gian sDng trong fil( cu h%nh. Pc
thiIt l6p n' s@ p )ng cho tt c cc Di t$ng C ;a . nF 9un lB.
yp C ;a cF th chXp 1 phMng th:c GetLifetimeService iu chJnh cc thiIt l6p
l(as( &an Nu &5ng Di t$ng ILease.
503
Chng 12: <ch }e Oz N? }~ *zoo`ing
Pli(nt cF th g0i phMng th:c MarshalByRefObject.GetLifetimeService vi .t Di
t$ng C ;a c th thu l' .t th hin ILease. wI tiIp8 cli(nt cF th g0i phMng th:c
ILease.Renew chJ inh l$ng thi gian tDi thiu . Di t$ng s@ sDng.
u2 ) )i <' sO )ng cch tiIp c6n th: nht g)eng thj lifetime trong fil( cu h%nh ca
hosth. Pc thiIt l6p l(as( p )ng cho tt c cc Di t$ng C ;a )o host t*o ra. |O )ng M
chJ phGt ha' S chJ gi<'. lDi t$ng C ;a cF thi gian sDng &an Nu l Zd phGt. whi cli(nt
tru' ;ut Di t$ng8 thi gian sDng ca nF t= ng $c l. .i 2t nht &a phGt.
configuration
system.runtime.remoting
application

service
wellknown
mode = "Singleton"
type="RemoteObjects.RemoteObject, RemoteObjects"
objectUri="RemoteObject" /
/service

channels
channel ref="tcp" port="9080" /
/channels
Oli*etime lease)ime B 1?@M1
rene%(nCall)ime B 1DM1 /P

/application
/system.runtime.remoting
/configuration
"t cch tiIp c6n khc l chXp 1 phMng th:c InitializeLifetimeService .t Di t$ng
C ;a t= ki. sot thi gian sDng ca nF. L*n cF th th>. o*n .S )i <' vo lp C ;a
nF cF thi gian sDng .!c inh l Zd phGt v thi gian l. .i l ` phGt\
public override object InitializeLifetimeService() {
ILease lease = MyBase.InitializeLifetimeService();
// Lease ch c th doc cu hnh nu n dang o trang thi ban du.
if (lease.CurrentState == LeaseState.Initial) {
lease.InitialLeaseTime = TimeSpan.FromMinutes(10);
lease.RenewOnCallTime = TimeSpan.FromMinutes(5);
}
504
Chng 12: <ch }e Oz N? }~ *zoo`ing
return lease;
}
HIu .uDn Di t$ng cF thi gian sDng v4 h*n8 &*n chJ cNn tr v .t tha. chiIu null tha' v%
l Di t$ng ILease. 7rng h$p th4ng thng nht l &*n .uDn t*o .t Di t$ng Mnznht
ch*' c l6p gv l<u )ih nga' c khi cli(nt kh4ng sO )ng nF.
12' 12' .i m sot %hin ! n c a cc i t ng xa .i m sot %hin ! n c a cc i t ng xa
#eA OZKA QeX OIQ >XfQ J^ Q>t ZRA Y A>@GZ d>@CA FRA Jbc OIQ LK@ QVWAB(
C\@ L_Q QPQ JR JSJ d>@CA FRA Jbc LK@ QVWAB D\X 6;C, D\ LAB s Ox@ d>@CA FRA
Qe@ OIQ AhdX@AQ 7>/ s>SJ F@qQ(
.NET =emo/"ng kh4ng cF s= h# tr$ ni t*i no cho vic nh phi>n &n. whi .t cli(nt t*o
.t Di t$ng C ;a8 host t= ng sO )ng phi>n &n trong th .c cc & ho!c8 trong trng
h$p l .t ass(.&l' )eng chung8 phi>n &n .i nht trong 6>C. l h# tr$ nhiu phi>n &n8
&*n cF &a l=a ch0n\
7*o cc :ng )ng host ri>ng &it. "#i host s@ cF .t phi>n &n khc nhau ca
ass(.&l' +Di t$ng C ;a- v s@ vng kB phi>n &n ca nF vi .t Q=< khc nhau.
Pch n' &uc &*n phi ch*' nhiu :ng )ng host ceng .t lGc v thiIt th=c nht khi
&*n ang sO )ng <<* g$c .4 t trong .c Z].ch.
7*o .t ass(.&l' +Di t$ng C ;a- hon ton .i gtha' v% tha' si phi>n &nh. 7h(o
F8 &*n cF th vng kB cc lp trong hai ass(.&l' t*i cc Q=< khc nhau8 sO )ng ceng
host.
Pi !t tt c cc phi>n &n ca ass(.&l' +Di t$ng C ;a- vo 6>C. 7h(o F8 &*n cF
th t*o .t host nh ;* cc Q=< khc nhau In cc phi>n &n c th ca ass(.&l' +Di
t$ng C ;a-.
7e' ch0n cuDi ceng l linh ho*t nht trong trng h$p &*n cNn h# tr$ nhiu phi>n &n. u2 )8
fil( cu h%nh )i <' vng kB hai phi>n &n ca =emo/eF4Je)/8 t*i hai (n)point khc nhau.
L*n cNn ghi r} sD phi>n &n v tok(n khFa c4ng khai khi sO )ng cc ass(.&l' trong 6>C.
L*n cF th t%. th' th4ng tin n' &5ng cch ;(. ass(.&l' trong @"nAow8 E2KDorer 6>C
KDugI"n gvo th .c CNH@"nAow8H>88em4Dyh.
configuration
system.runtime.remoting
application
service
!-- Thng tin type doc chia thnh ba hng cho hop vi
bin trang. Trong file cu hnh, thng tin ny phai
doc dat trn mt hng. --
505
Chng 12: <ch }e Oz N? }~ *zoo`ing
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
il( cu h%nh ca cli(nt kh4ng phi tha' si g% hIt gtrQ vic c6p nh6t Q=<8 nIu cNnh. Pli(nt
+ch0n- phi>n &n . nF .uDn sO )ng &5ng Q=< tMng :ng.
0nh 12'4 Th muc C:WindowsAssembly
506
Chng 12: <ch }e Oz N? }~ *zoo`ing
13'
13' T o %h ng th c m t chi u T o %h ng th c m t chi u
v i d ch v We! +59 hay Oemoting v i d ch v We! +59 hay Oemoting
#eA OZKA OIQ d>V[AB Q>~J F >c] OIQ Q>\A> d>wA vc Q>nJ >@qA OIQ QSJ DU
sX h\@, D\ FeA s>TAB OZKA F{Q JY@AQ d>R@ LW@ QHXAB YJ O} YqA> LcAB Q>nJ Q>@(
TeX OIQ d>V[AB Q>~J F OIQ J>@GZ F`AB JSJ> Sd hUAB L_J QaA>
$oap-ocumentMet.od >c] $oap&pcMet.od D\ Q>@jQ YNd Q>ZIJ QaA> (nea! Jbc L_J QaA>
A\] Y\ true( TeX OIQ d>V[AB Q>~J >emoting OIQ J>@GZ F`AB JSJ> Sd hUAB L_J
QaA> (nea! Q>ZIJ s>TAB B@cA QCA $!stem.&untime.&emoting.Messaging(
ui cc phMng th:c .t chiu8 cli(nt gOi .t th4ng ip '>u cNu8 v s(rv(r p :ng t:c th%
cho &iIt r5ng phMng th:c S &/t Nu 9u tr%nh ;O lB. Pch l. vic n' cF cc h 9u sau\
Pli(nt kh4ng cNn $i trong lGc .S lnh ang th=c thi.
RhMng th:c kh4ng th tr v th4ng tin no cho cli(nt gth4ng 9ua .t gi tri tr v ha'
.t th4ng sD ByRefh.
HIu phMng th:c nX. .t ngo*i l chaz$czthzlB8 nF s@ kh4ng $c tru'n v cho
cli(nt.
W} rng l cc phMng th:c .t chiu kh4ng phe h$p khi cli(nt cNn nh6n th4ng tin tQ s(rv(r.
7u' nhi>n8 chGng l*i lB tCng khi cNn khCi ch*' .t kiu tc v no F ph2a s(rv(r gch~ng
h*n8 &/t Nu .t c4ng vic ;O lB &Fh.
l t*o .t phMng th:c (& .t chiu8 &*n cNn p )ng !c t2nh SoapDocumentMethod gthuc
kh4ng gian t>n System.Web.Services.Protocolsh cho phMng th:c th2ch h$p v thiIt l6p
thuc t2nh OneWay l true. u2 ) )i <' l .t )ich v @e4 :&L cF hai phMng th:c8 .#i
phMng th:c u g<' tr% hoSn Zd gi<'. "t trong hai phMng th:c n' sO )ng !c t2nh
SoapDocumentMethod g cli(nt kh4ng phi $i Zd gi<'h.
using System;
using System.Web.Services;
using System.Web.Services.Protocols;
public class OneWayTestWebService {
[WebMethod()]
public void DoLongTaskWithWait() {
// (Bt du mt tc v ko di v khin client phai doi.)
Delay(10);
}
[WebMethod, SoapDocumentMethod(OneWay=true)]
public void DoLongTaskWithoutWait() {
507
Chng 12: <ch }e Oz N? }~ *zoo`ing
// (Bt du mt tc v ko di nhng khng khin client phai doi.)
Delay(10);
}
private void Delay(int seconds) {
DateTime currentTime = DateTime.Now;
while (DateTime.Now.Subtract(currentTime).TotalSeconds seconds)
{}
}
}
u2 ) tr>n gi inh )ich v @e4 :&L v cli(nt ang sO )ng *F>P Ao)umen/ g.!c inhh.
HIu ang sO )ng =emo/e Pro)eAure CaDD g=PCh8 &*n hS' sO )ng !c t2nh tMng :ng l
SoapRpcMethod nh )u phMng th:c .t chiu.
l t*o .t phMng th:c .t chiu trong .t thnh phNn tr>n =emo/"ng8 &*n cNn p )ng !c
t2nh OneWay gthuc kh4ng gian t>n System.Runtime.Remoting.Messagingh cho phMng th:c
th2ch h$p. lo*n .S )i <' tr%nh &' .t v2 ) giDng nh tr>n nhng vi .t thnh phNn C
;a\
using System;
using System.Runtime.Remoting.Messaging;
public class OneWayTestRemoting : MarshalByRefObject {
public void DoLongTaskWithWait() {
// (Bt du mt tc v ko di v khin client phai doi.)
Delay(10);
}
[OneWay()]
public void DoLongTaskWithoutWait() {
// (Bt du mt tc v ko di nhng khng khin client phai doi.)
Delay(10);
}
private void Delay(int seconds) {
DateTime currentTime = DateTime.Now;
while (DateTime.Now.Subtract(currentTime).TotalSeconds seconds) {}
}
}
P>V[AB Q>~J OIQ J>@GZ s>TAB d>R@ Y\ JSJ> hZ] A>PQ Lt YXe@ F D@qJ QHl >X}A
JY@AQ( #eA JAB J^ Q>t L@GZ J>A> JY@AQ B@ d>V[AB Q>~J F OIQ JSJ> FPQ LAB
508
Chng 12: <ch }e Oz N? }~ *zoo`ing
FI( THXAB QHVoAB >Wd A\], JY@AQ fm LW@ hMJ> DU *e9 +M. >X\A QPQ, A>VAB A^ fm
LW@ QHCA OIQ Q@tZ QHlA> s>SJ, D\ hX L^ JY@AQ J^ Q>t Q@jd QUJ DE@ JSJ JTAB D@qJ
s>SJ( V@qJ B@ d>V[AB Q>~J FPQ LAB FI L} LVWJ OT QR QHXAB OUJ ((
13
509
Ch01n2 3L4VPJ /hT
510
511
Chng 13: Bfo ox`
c ti>u ch2nh ca &")ro8o?/ .NET Framework l l. cho vic l6p tr%nh trC n>n an
ton hMnE!c &it lu t<. In vic sO )ng .o&il( co)(
`
v cc h thDng ph<n
tn. nNu hIt cc h iu hnh hin *i g&ao gt. &")ro8o?/ @"nAow8h u h# tr$
&o .6t )=aztr>nzngiz)eng gQ8erI$a8eA *e)ur"/yh8 cho phXp &*n ki. sot cc hnh ng
v cc ti ngu'>n . .t ngi )eng tru' ;ut In. 7u' nhi>n8 )o s= pht trin ca .*ng
.' t2nh8 !c &it l nt(rn(t8 s= &o .6t nIu chJ )=a vo inh )anh ca ngi )eng tr>n h
thDng l cha . whi 9uan t<. In &o .6t8 .S lnh kh4ng n>n t= ng nh6n .:c tin c6'
nh .:c tin c6' . &*n S n inh cho ngi ang ch*' .S lnh n'.
"
.NET Framework kIt h$p hai .4 h%nh &o .6t &s sung l3n nhau gth=c hin nhiu vn li>n
9uan In &o .6t ngi )eng v .S lnhh\
C>* gCoAe >))e88 *e)ur"/yELo .6t tru' ;ut .S lnhh
=$* g=oDeI$a8eA *e)ur"/yELo .6t )=aztr>nzvaiztrkh
C>* v =$* kh4ng tha' thI ha' sao l*i cc phMng tin &o .6t )o h iu hnh n5. )i
cung cp. PhGng l cc cM chI c l6p nn8 cp th>. cc kh nvng &o .6t n<ng cao t2nh
&o .6t tsng th trong cc gii php $cz9unzlB.
C>* sO )ng cc th4ng tin v ngutn gDc ca .t ass(.&l' S $c thu th6p lGc th=c thiE<'
l ch:ng c: geB"Aen)ehE ;c inh ;(. .S lnh cF th tru' ;ut cc hnh ng v ti
ngu'>n noE<' l 9u'n gKerm"88"onh. Ph2nh sch &o .6t ca .NET FrameworkE.t t6p
h$p ph<n cp cc 9u' t/c cu h%nhEinh nghqa phXp nh ;* giKa ch:ng c: v 9u'n. 7h
vin lp .NET Framework sO )ng cc '>u cNu 9u'n gKerm"88"on AemanA ha' Kerm"88"on
reMue8/h &o v cc ch:c nvng 9uan tr0ng nht ca nF kh4ng &i tru' ;ut tri phXp. "t
'>u cNu &uc & th=c thi &o . r5ng\ nIu .uDn g0i .t phMng th:c $cz&ozv th% .S
lnh phi cF .t 9u'n c th no F. C>* &o . r5ng\ kh nvng th=c thi ca .S lnh te'
thuc vo .:c tin c6' ca &*n Di vi ngi t*o ra .S v ngutn gDc ca nF8 ch: kh4ng
phi .:c tin c6' Di vi ngi )eng ang ch*' .S. Pc .c li>n 9uan In C>* trong
chMng n' tho lu6n cc vn sau\
Pho phXp .S lnh cFzztinzc6'z.tzphNn gKar/"aDDy /ru8/eA )oAeh tru' ;ut cc
ass(.&l' t>n .*nh ca &*n g.c Z^.Zh.
u4 hiu hon ton C>* g.c Z^.]h ho!c chJ v4 hiu vic ki. tra 9u'n th=c thi g.c
Z^.^h.
m>u cNu cc 9u'n tru' ;ut .S lnh c th v ;c inh ;(. & th=c thi S cp cc
9u'n no cho .S lnh ca &*n g.c Z^._8 Z^.`8 Z^.a8 v Z^.[h.
wi. sot s= thQa kI v chXp 1 thnh vi>n &5ng C>* g.c Z^.bh.
{(. ;Xt v ;O lB ch:ng c: ca ass(.&l' g.c Z^.c v Z^.Zdh.
{O lB &o .6t & th=c thi &5ng .in :ng )ng g.c Z^.ZZ v Z^.Z]h.
=$* cho phXp &*n th=c hin cc 9u'It inh lGc th=c thi grun/"me Ae)"8"onh )=a tr>n inh )anh
g"Aen/"/yh v cc vai trk groDeh ca ngi )eng:ng )ng ang ch*' tr>n )anh nghqa ngi
)eng n'. 7r>n h iu hnh @"nAow88 <' ch2nh l vic th=c hin cc 9u'It inh )=a tr>n t>n
ngi )eng @"nAow8 v cc nhF. @"nAow8 . ngi )eng F thuc v. 7u' nhi>n8 =$*
`
"o&il( co)( l phNn .. $c tru'n 9ua .t h thDng .*ng v sau F $c th=c thi tr>n h thDng
cc &.
512
Chng 13: Bfo ox`
cung cp .t cM chI &o .6t chung kh4ng l thuc vo h iu hnh n5. )i8 cho phXp &*n
t2ch h$p vo &t k h thDng ti khon ngi )eng no. Pc .c trong chMng n' tho lu6n
cc vn sau <' ca .NET =$*\
72ch h$p =$* vi cc ti khon ngi )eng @"nAow8 v ;c inh ;(. .t ngi )eng
cF l thnh vi>n ca .t nhF. @"nAow8 no F ha' kh4ng g.c Z^.Z^h.
wi. sot vic tru' ;ut In cc ch:c nvng ca :ng )ng )=a tr>n ngi )eng hin
hnh v cc vai trk . ngi )eng n' l .t thnh vi>n g.c Z^.Z_h.
pi nh6n .t ngi )eng @"nAow8 th=c hin cc tc v h iu hnh tr>n )anh
nghqa ngi )eng F g.c Z^.Z`h.
Pc .c li>n 9uan In =$* v C>* trong chMng n' tr%nh &' .t sD c4ng vic th4ng
thng . &*n s@ cNn th=c hin trong cc :ng )ng8 nhng chGng chJ .4 t .t phNn nhV
trong cc kh nvng &o .6t ca .NET Framework. l hiu r} hMn8 &*n hS' tha. kho .t
9u'n sch khc chu'>n v &o .6t trong .NET Framework.
1' 1' Cho %h:% m# l nh c'- -tin-c y-m t-%h n Cho %h:% m# l nh c'- -tin-c y-m t-%h n
s d ng assem!ly tn m nh c a ! n s d ng assem!ly tn m nh c a ! n
#eA JwA D@jQ OIQ cffOFY] J>@c f fcX J>X A^ Y\ s>R QHZ] vZPQ LK@ DE@ O} YqA>
J^6LI6Q@A6JN]6OIQ6d>wA iQ>X O_J LMA>, FI Q>nJ Q>@ s>TAB J>X d>d O} YqA> J^6
LI6Q@A6JN]6OIQ6d>wA QHZ] vZPQ JSJ s@tZ D\ JSJ Q>\A> D@CA A`O QHXAB OIQ
cffOFY] QCA OeA>k(
d hUAB L_J QaA> $!stem.$ecurit!.#llo%/artiall!)rustedCallers#ttribute J>X
cffOFY] J>@c f Jbc FeA(
l gi. thiu cc ngu' cM &o .6t )o .S lnh ngu' hi. &' ra8 & th=c thi kh4ng cho phXp
cc ass(.&l' cFzztinzc6'z.tzphNn tru' ;ut In cc ass(.&l' t>n .*nh. n*n chI n' l.
gi. ngu' cM .S lnh ngu' hi. tn c4ng vo h thDng ca &*n8 nhng Di vi .t cch tiIp
c6n p chI nh thI cNn phi cF li gii th2ch.
7h(o 9u' t/c8 cc ass(.&l' t>n .*nh $c ci !t trong 6Do4aD >88em4Dy Ca)he g6>Ch v
ch:a cc ch:c nvng 9uan tr0ng $c )eng chung giKa nhiu :ng )ng. liu n' hon ton
Gng vi cc ass(.&l' cu thnh th vin lp .NET Framework. Pc ass(.&l' t>n .*nh khc
tQ cc sn phx. $czph<nz&szrngzrSi c?ng s@ n5. trong 6>C v l kh tru' ;ut Di vi
cc :ng )ng $cz9unzlB. wh nvng hin )in trong 6>C cao8 t2nh kh tru' ;ut )r )ng8
v tN. 9uan tr0ng Di vi nhiu :ng )ng khc nhau khiIn cho cc ass(.&l' t>n .*nh l .c
ti>u cF kh nvng nht Di vi &t c: hnh ng ph ho*i no ca .S lnh ngu' hi. $cz
9unzlB.
7h4ng thng8 .S lnh cF kh nvng ngu' hi. l .S $c n*p tQ cc nMi ;aEnh nt(rn(tE
C F &*n cF 2t gha' kh4ng cFh s= ki. sot no. ui ch2nh sch &o .6t .!c inh8 tt c .S
lnh ch*' tQ .' cc & u cF tin c6' ton phNn g?uDD /ru8/h8 trong khi .S lnh $c n*p
tQ cc nMi ;a chJ cF tin c6' .t phNn gKar/"aD /ru8/h. Hgvn .S lnh cFzztinzc6'z.tzphNn
tru' ;ut In cc ass(.&l' t>n .*nhT nghqa l .S lnh cFzztinzc6'z.tzphNn kh4ng cF cM
513
Chng 13: Bfo ox`
hi sO )ng cc t2nh nvng ca ass(.&l' cho cc .c 2ch ngu' hi.8 v kh4ng th kho st
ass(.&l' t%. cc l# hsng cF th khai thc $c. Uq nhi>n8 lB thu'It n' gi inh r5ng &*n
9un lB ch2nh sch &o .6t .t cch phe h$p. HIu &*n gn tt c .S lnh cF tin c6' ton
phNn8 kh4ng chJ &t k ass(.&l' no c?ng cF th tru' ;ut ass(.&l' t>n .*nh ca &*n8 .
.S lnh n' ckn cF th tru' ;ut tt c cc ch:c nvng ca .NET Framework. liu n' s@ l
.t tai h0a &o .6t
NjZ FeA Q>@jQ sj, >@qA Q>nJ, D\ Q>g AB>@qO cffOFY] J>@c f Jbc FeA OIQ JSJ>
d>r >Wd F`AB C;S Lt B@E@ >eA D@qJ QHZ] vZPQ LjA JSJ Q>\A> D@CA ZcA QHAB, FeA
s>TAB JwA Sd L_Q OIQ >eA J>j FcX QHrO Lt ABA O} YqA> J^6LI6Q@A6JN]6OIQ6
d>wA fg hUAB cffOFY] Jbc FeA( TZ] A>@CA, LK@ DE@ OIQ cffOFY] FPQ s, s>TAB
Q>t J>~AB O@A> H`AB s>TAB J^ Yx >AB FRX ONQ A\X Lt O} ABZ] >@tO J^ Q>t YW@
hUAB( DX L^, FeA ACA vO vQ JA Q>NA A>Z JwZ J>X d>d O} YqA> J^6LI6Q@A6JN]6
OIQ6d>wA QHZ] vZPQ cffOFY] QCA OeA> QHVEJ s>@ Sd hUAB L_J QaA>
#llo%/artiall!)rustedCallers#ttribute(
L th=c thi ngvn .S lnh cFzztinzc6'z.tzphNn tru' ;ut cc ass(.&l' t>n .*nh &5ng cch
!t LinkDemand vo t6p 9u'n FullTrust tr>n .0i thnh vi>n c4ngzkhai gKu4D")h v $cz&oz
v gKro/e)/eAh ca .#i kiu khztru'z;utzc4ngzkhai $c inh nghqa trong ass(.&l'. liu
n' cF nghqa l chJ nhKng ass(.&l' $c cp cc 9u'n tMng Mng vi t6p 9u'n
FullTrust th% .i cF th tru' ;ut cc kiu v thnh vi>n trong ass(.&l' t>n .*nh. uic p
)ng AllowPartiallyTrustedCallersAttribute vo ass(.&l' t>n .*nh &o vi & th=c thi
kh4ng &uc LinkDemand cF hiu l=c tr>n cc thnh vi>n v cc kiu &>n trong.
#I Q>nJ Q>@ J>MZ QHSJ> A>@qO FZIJ JSJ >XeQ LIAB FRX ONQ ABwO +in:-emand J^
>@qZ YnJ Lt FRX Dq JSJ cffOFY] QCA OeA> C# assem9ler s>TAB f@A> Hc JSJ YqA>
s>c@ FSX +in:-emand YJ F@CA hMJ>(
lo*n .S )i <' tr%nh &' .t :ng )ng cF sO )ng !c t2nh
AllowPartiallyTrustedCallersAttribute. PhG B r5ng8 &*n phi sO )ng tin tD assembly:
&o vi tr%nh &i>n )ich r5ng 2ch ca !c t2nh n' l ass(.&l' gckn $c g0i l !c t2nh ton
ccEgDo4aD a//r"4u/eh. Hgoi ra8 kh4ng cNn th>. phNn Attribute vo t>n ca !c t2nhE.!c
)e &*n cF th th>. vo nIu .uDn. u% &*n nh/. In ass(.&l' n>n !c t2nh n' phi $c !t
sau cc lnh using .:c tr>n8 nhng trc cc khai &o kh4ng gian t>n v kiu.
using System.Security;
[assembly:AllowPartiallyTrustedCallers]
public class AllowPartiallyTrustedCallersExample {

}
T>nJ Qj, QPQ JR JSJ L_J QaA> QX\A JUJ LGZ A`O QHXAB OIQ @Y LIJ YNd DE@ d>wA O}
YqA> JyA Ye@ Jbc ~AB hUAB( Microsoft $is%al St%&io .NET fg hUAB JSJ> Q@jd JNA
A\]z QeX OIQ @Y J^ QCA Y\ ;ssem9l:/nfo.cs Lt J>~c QPQ JR JSJ L_J QaA> QX\A JUJ(
514
Chng 13: Bfo ox`
HIu sau khi p )ng AllowPartiallyTrustedCallersAttribute cho ass(.&l'8 &*n .uDn .S
lnh cFzztinzc6'z.tzphNn chJ g0i $c .t sD thnh vi>n no F8 &*n cNn &s sung
LinkDemand cho t6p 9u'n FullTrust tr>n cc thnh vi>n cNn thiIt8 nh $c tr%nh &' trong
o*n .S )i <'\
[System.Security.Permissions.PermissionSetAttribute
(System.Security.Permissions.SecurityAction.LinkDemand,
Name="FullTrust")]
public void SomeMethod() {

}
2'
2' V, hi u ! o m t truy xu t m# l nh V, hi u ! o m t truy xu t m# l nh
#eA JwA DT >@qZ C;S(
T>@jQ YNd Q>ZIJ QaA> $ecurit!0nabled Jbc YEd $!stem.$ecurit!.$ecurit!Manager Y\
*alse D\ YVZ Ye@ F`AB d>V[AB Q>~J $ecurit!Manager.$ave/olic!( #eA JAB J^ Q>t
fg hUAB JTAB JU Co&e ;ccess Sec%rit: ,olic: iCaspol.e8ek D\ Q>nJ Q>@ YqA> caspol
9s o**(
C>* l phNn th(n chDt trong .4 h%nh &o .6t ca & th=c thi .NET8 v c?ng l phNn !c trng
ca nn tng .NET . nhiu nn tng khc kh4ng cF. "!c )e C>* $c ;<' )=ng vi ti>u ch2
. &o hiu nvng th=c thi cao nht v S $c sO )ng .t cch cxn tr0ng trong th vin
lp .NET8 nhng v3n cF .t chi ph2 cho .#i '>u cNu &o .6t g8e)ur"/y AemanAh v stack alk
gkIt 9uh . & th=c thi phi th=c hin.
l4i lGc8 &o .6t .:cz.Szlnh cF th kh4ng l iu &*n &6n t<.8 ho!c nhu cNu hiu nvng cF
th v$t 9u nhu cNu C>*. 7rong cc trng h$p n'8 &*n cF th v4 hiu hon ton C>* v
lo*i &V chi ph2 cho vic ki. tra &o .6t .:cz.Szlnh. u4 hiu C>* cF tc )ng trao cho .S
lnh kh nvng th=c hin &t k hnh ng no . .NET Framework h# tr$ gtMng Mng vi
t6p 9u'n FullTrusth8 &ao gt. kh nvng n*p .S lnh khc8 g0i cc th vin ngu'>n sinh8 v
sO )ng con trV tr=c tiIp tru' ;ut & nh.
#eA J> ACA DT >@qZ C;S Dl JSJ Y hX >@qZ AAB fcZ s>@ L} Q@CZ >jQ QPQ JR JSJ
J>AB OnJ J^ Q>t s>SJ Lt LeQ LVWJ JSJ L_J L@tO >@qZ AAB O\ ~AB hUAB Jbc
FeA Ly@ >@( V@qJ YNd dHX@Y J>X O} YqA> Q>VoAB fm A>NA F@jQ A>?AB DrAB O\
FeA J^ Q>t JR@ Q>@qA LSAB st >@qZ AAB A>VAB s>TAB d>R@ DT >@qZ C;S( NBX\@ Hc,
FeA JwA FRX LRO JSJ Q\@ ABZ]CA >q Q>KAB L} LVWJ FRX Dq F`AB JSJ J[ J>j FRX
ONQ Jbc >q L@GZ >\A> iA>V *in&ows ;C.sk QHVEJ s>@ DT >@qZ C;S(
Ca8KoD.e2e l .t tin 2ch $c cp ceng vi .NET Framework8 cho phXp &*n cu h%nh ch2nh
sch &o .6t tru' ;ut .S lnh tQ )kng lnh. whi &*n nh6p lnh caspol 9s o** ho!c caspol
9s on8 tin 2ch n' s@ ;c l6p thuc t2nh SecurityEnabled ca lp SecurityManager. yp
SecurityManager cung cp t6p cc phMng th:c tqnh tru' ;ut )K liu v ch:c nvng &o
515
Chng 13: Bfo ox`
.6t 9uan tr0ng. lo*n .S )i <' tr%nh &' cch sO )ng thuc t2nh SecurityEnabled v4
hiu v k2ch ho*t C>*\
// V hiu CAS.
System.Security.SecurityManager.SecurityEnabled = false;

// Lu cu hnh.
System.Security.SecurityManager.SavePolicy();
// Kch hoat CAS.
System.Security.SecurityManager.SecurityEnabled = true;

// Lu cu hnh.
System.Security.SecurityManager.SavePolicy();
l v4 hiu C>*8 .S lnh ca &*n phi cF phNn tO ControlPolicy ca
System.Security.Permissions.SecurityPermission. l k2ch ho*t C>*8 &*n kh4ng cNn phi
cF 9u'n c th no.
7ha' si SecurityEnabled s@ kh4ng nh hCng In ho*t ng ca C>* trong cc tiIn tr%nh
hin cF8 v c?ng kh4ng nh hCng In cc tiIn tr%nh .i cho In khi &*n g0i phMng th:c
SavePolicy lu tr*ng thi ca SecurityEnabled vo @"nAow8 =eg"8/ry. lng tiIc8 .NET
Framework kh4ng &o . nhKng tha' si ca SecurityEnabled s@ tc ng Gng In ho*t
ng ca C>* trong tiIn tr%nh hin hnh. Uo F8 &*n phi tha' si SecurityEnabled rti .C
.t tiIn tr%nh .i cF $c ho*t ng Gng nh .ong .uDn.
0nh 13'1 egistry Editor (CAS d bj v hiu)
THeAB Q>S@ >@qA >\A> Jbc C;S ion-offk LVWJ YVZ QHXAB s>^c C!EMN
.3C;.NM;CC/NE2S3FT*;>E2Microsoft2.NETFramework2Sec%rit:2,olic: Jbc
*in&ows >egistr:( NjZ s>^c A\] s>TAB QA Qe@, O_J LMA> C;S Y\ on(
516
Chng 13: Bfo ox`
3'
3' V, hi u vi c "i m tra )uy n th c thi V, hi u vi c "i m tra )uy n th c thi
#eA JwA ABA FI Q>nJ Q>@ s@tO QHc Ox@ cffOFY] LVWJ Aed D\X J^ Z]GA Q>nJ Q>@
ie8ec%tion permissionk >c] s>TAB(
T>@jQ YNd Q>ZIJ QaA> C.ec:0xecution&ig.ts Jbc YEd $!stem.$ecurit!.
$ecurit!Manager Y\ *alse H@ YVZ Ye@ F`AB d>V[AB Q>~J $ecurit!Manager.
$ave/olic!( #eA JAB J^ Q>t fg hUAB JTAB JU Co&e ;ccess Sec%rit: ,olic:
iCaspol.e8ek D\ Q>nJ Q>@ YqA> caspol 9e o**(
"#i khi n*p ass(.&l'8 & th=c thi &o . grantzs(t ca ass(.&l' n' cF ch:a phNn tO
Execution ca SecurityPermission. L th=c thi hin th=c .t 9u tr%nh ph<n gii ch2nh sch
+li- gDaOy KoD")y re8oDu/"on Kro)e88h8 nghqa l grantzs(t ca .t ass(.&l' kh4ng $c t2nh
cho In khi cF .t '>u cNu &o .6t g8e)ur"/y AemanAh $c th=c hin tr>n ass(.&l' n'.
uic ki. tra 9u'n th=c thi kh4ng chJ &uc & th=c thi ki. tra .#i ass(.&l' cF 9u'n th=c
thi ha' kh4ng8 . ckn gin tiIp t*o ra vic ph<n gii ch2nh sch Di vi .#i ass(.&l' $c
n*p8 ph nh6n l$i 2ch ca vic ph<n gii ch2nh sch +li-. Pc 'Iu tD n' cF th g<' ra s= tr%
hoSn ng k khi cc ass(.&l' $c n*p8 !c &it khi & th=c thi n*p nhiu ass(.&l' ceng
.t lGc.
7rong nhiu trng h$p8 vic cho phXp .S lnh n*p v ch*' kh4ng phi l .t ngu' cM ng
k .irn l tt c cc ho*t ng v cc ti ngu'>n 9uan tr0ng khc S $c &o v &5ng C>*
v &5ng cM chI &o .6t ca h iu hnh. L th=c thi .NET cho phXp &*n v4 hiu vic t= ng
ki. tra cc 9u'n th=c thi nga' &>n trong .S lnh8 ha' &5ng c4ng c Ca8KoD.e2e.
whi &*n nh6p lnh caspol 9e o** ho!c caspol 9e on8 Ca8KoD.e2e s@ ;c l6p thuc t2nh
CheckExecutionRights ca lp SecurityManager. L*n cF th th=c hin c4ng vic n' &>n
trong .S lnh nh sau\
// V hiu vic kim tra quyn thc thi.
System.Security.SecurityManager.CheckExecutionRights = false;

// Lu cu hnh.
System.Security.SecurityManager.SavePolicy();
// Kch hoat vic kim tra quyn thc thi.
System.Security.SecurityManager.CheckExecutionRights = true;

// Lu cu hnh.
System.Security.SecurityManager.SavePolicy();
l tha' si gi tri ca CheckExecutionRights th% .S lnh ca &*n phi cF phNn tO
ControlPolicy ca SecurityPermission. 7ha' si n' s@ cF tc )ng vi tiIn tr%nh hin hnh
nga' t:c th%8 cho phXp &*n n*p cc ass(.&l' trong lGc th=c thi . & th=c thi kh4ng phi
517
Chng 13: Bfo ox`
ki. tra chGng cF 9u'n th=c thi ha' kh4ng. 7u' nhi>n8 tha' si n' s@ kh4ng nh hCng In
cc tiIn tr%nh hin cF. Uo v6'8 &*n phi lu tha' si vo @"nAow8 =eg"8/ry g&5ng phMng th:c
SavePolicyh nF cF tc )ng vi cc tiIn tr%nh .i.
4' 4' < o m ! th c thi c % cho assem!ly m t s )uy n no ' < o m ! th c thi c % cho assem!ly m t s )uy n no '
#eA JwA FRX LRO FI Q>nJ Q>@ JPd J>X cffOFY] Jbc FeA JSJ Z]GA QHZ] vZPQ O}
YqA> ico&e access permissionk O\ JSJ Z]GA A\] Z]jQ LMA> fn Q>\A> JTAB QHXAB
>XeQ LIAB Jbc ~AB hUAB(
Sg hUAB JSJ ]CZ JwZ Z]GA ipermission reE%estk Lt J> LMA> JSJ Z]GA QHZ] vZPQ
O} YqA> O\ cffOFY] JwA d>R@ J^( #eA s>c@ FSX JSJ ]CZ JwZ Z]GA F`AB JSJ L_J
QaA> Z]GA QHZ] vZPQ O} YqA> O~J cffOFY](
Pc '>u cNu 9u'n cho &iIt cc 9u'n . .S lnh phi cF th% .i cF th ch*' $c. u2 )8
nIu &*n viIt .t tr%nh ;(. phi. sao cho ngi )eng cF th sO )ng nF ti v ;(. phi. tQ
.t s(rv(r8 th6t tai h*i nIu ch2nh sch &o .6t ca ngi )eng kh4ng cho phXp chMng tr%nh
n' .C .t kIt nDi .*ng In s(rv(r. PhMng tr%nh ca &*n s@ n*p v ch*'8 nhng khi ngi
)eng kIt nDi In s(rv(r ;(. phi.8 chMng tr%nh s@ crash vi ngo*i l
System.Security.SecurityException. pii php l a vo ass(.&l' '>u cNu 9u'n cNn thiIt
cF th .C .t kIt nDi .*ng In s(rv(r gSystem.Net.WebPermission ha'
System.Net.SocketPermission8 te' thuc vo kiu kIt nDi &*n cNn .Ch.
L th=c thi th=c hin cc '>u cNu 9u'n vi ngu'>n t/c\ khoan n*p .S lnh8 iu n' tDt hMn
l n*p .S lnh v tht &*i sau khi th=c hin .t hnh ng . nF kh4ng cF 9u'n. u% v6'8
nIu sau 9u tr%nh ph<n gii ch2nh sch &o .6t8 & th=c thi ;c inh $c grantzs(t ca
ass(.&l' kh4ng th p :ng cc '>u cNu 9u'n ca ass(.&l'8 nF s@ kh4ng n*p ass(.&l' v
nX. ngo*i l System.Security.Policy.PolicyException.
l khai &o .t '>u cNu 9u'n8 &*n phi sO )ng &n sao !c t2nh ga//r"4u/e )oun/erKar/h ca
9u'n tru' ;ut .S lnh &*n cNn. 7t c cc 9u'n tru' ;ut .S lnh u cF .t &n sao !c
t2nh . &*n cF th sO )ng t*o ra cc lnh &o .6t khai &o gAe)Dara/"Be 8e)ur"/y
8/a/emen/hE&ao gt. cc '>u cNu 9u'n. u2 )8 &n sao !c t2nh ca SocketPermission l
SocketPermissionAttribute8 v &n sao !c t2nh ca WebPermission l
WebPermissionAttributeE7t c cc 9u'n v cc &n sao !c t2nh ca chGng ceng th(o 9u'
c !t t>n v l cc thnh vi>n ca ceng kh4ng gian t>n.
ng )ng PermissionRequestExample )i <' cF hai '>u cNu 9u'n\ .t cho
SocketPermission v .t cho SecurityPermission. L*n cNn nh cc iu sau\
L*n phi khai &o '>u cNu 9u'n sau &t k lnh using .:c tr>n no nhng trc &t
k khai &o kiu ha' kh4ng gian t>n no.
l!c t2nh phi nh/. In ass(.&l' n>n &*n phi th>. tin tD assembly: vo t>n !c t2nh.
wh4ng cNn th>. phNn Attribute vo t>n !c t2nhE.!c )e &*n cF th th>. vo nIu
.uDn.
L*n phi chJ inh SecurityAction.RequestMinimum l Di sD Nu ti>n ca !c t2nhEgi
tri n' cho &iIt <' l .t '>u cNu 9u'n.
518
Chng 13: Bfo ox`
L*n phi cu h%nh !c t2nh .4 t 9u'n tru' ;ut .S lnh . &*n cNn &5ng cc
thuc t2nh ca !c t2nh. L*n hS' tha. kho ti liu .NET Framework *E' &iIt th>.
chi tiIt v cc thuc t2nh )o .#i !c t2nh &o .6t tru' ;ut .S lnh hin th=c.
Pc lnh '>u cNu 9u'n kh4ng $c kIt thGc &5ng )u ch. phx' gTh.
l t*o nhiu '>u cNu 9u'n8 chJ cNn th>. nhiu lnh '>u cNu 9u'n nh $c tr%nh &'
trong v2 ) )i <'\
using System.Net;
using System.Security.Permissions;
// Yu cu SocketPermission (cho php mo mt kt ni
// TCP dn host v port doc ch dnh).
[assembl!:$oc:et/ermission($ecurit!#ction.&eCuestMinimum'
#ccess B 1Connect1' Host B 1%%%.*abri:am.com1'
/ort B 1DMDg1' )ransport B 1)cp1)]
// Yu cu phn tu UnmanagedCode cua SecurityPermission,
// (kim sot kha nang thc thi m lnh khng-doc-quan-l).
[assembl!:$ecurit!/ermission($ecurit!#ction.&eCuestMinimum'
UnmanagedCode B true)]
public class PermissionRequestExample {
public static void Main() {
// Lm g d...
}
}
HIu &*n th=c thi :ng )ng PermissionRequestExample v ch2nh sch &o .6t kh4ng cp cho
ass(.&l' n' cc 9u'n $c '>u cNu8 &*n s@ nh6n $c ngo*i l PolicyException nh )i
<' v :ng )ng s@ kh4ng th=c thi. whi sO )ng ch2nh sch &o .6t .!c inh8 iu n' s@ ;'
ra nIu &*n ch*' ass(.&l' tQ .t .*ng )eng chung v% cc ass(.&l' $c n*p tQ ntran(t
kh4ng $c cp SocketPermission.
Unhandled Exception: System.Security.Policy.PolicyException:
Required permission cannot be acquired.
whi &*n n*p .t ass(.&l' tQ &>n trong .S lnh gt= ng ha' &5ng ta'h8 v ass(.&l' n' cF
ch:a cc '>u cNu 9u'n . ch2nh sch &o .6t kh4ng p :ng th% phMng th:c . &*n sO
)ng n*p ass(.&l' s@ nX. ngo*i l PolicyException8 )o F &*n phi th lB sao cho phe
h$p.
519
Chng 13: Bfo ox`
5'
5' 3i i h n cc )uy n c c % cho assem!ly 3i i h n cc )uy n c c % cho assem!ly
#eA JwA >eA J>j JSJ Z]GA QHZ] vZPQ O} YqA> LVWJ JPd J>X cffOFY] Jbc FeA,
LRO FRX ABVo@ s>SJ D\ d>wA OGO s>SJ s>TAB Q>t O} YqA> Jbc FeA
OIQ J[ J>j O\ Q>TAB Zc L^ Lt Q>nJ >@qA JSJ >\A> LIAB ABZ] >@tO >c] s>TAB
OXAB OZKA(
Sg hUAB JSJ YqA> FRX ONQ s>c@ FSX i&eclarati"e sec%rit: statementk Lt J> LMA>
JSJ ]CZ JwZ Z]GA Qr] J>A ioptional permission reE%estk D\ JSJ ]CZ JwZ YXe@ QH
Z]GA ipermission ref%sal reE%estk QHXAB cffOFY] Jbc FeA( CSJ ]CZ JwZ Z]GA
Qr] J>A LMA> AB>c QNd QK@ Lc JSJ Z]GA O\ FI Q>nJ Q>@ fm JPd J>X cffOFY](
CSJ ]CZ JwZ YXe@ QH Z]GA J> LMA> JSJ Z]GA JU Q>t O\ FI Q>nJ Q>@ fm s>TAB
JPd J>X cffOFY](
HIu 9uan t<. In &o .6t8 th6t lB tCng khi .S lnh ca &*n chJ cF cc 9u'n tru' ;ut .S
lnh cNn th=c hin ch:c nvng ca nF. liu n' gi. thiu ngu' cM ngi khc v .S
lnh khc sO )ng .S lnh ca &*n th=c hin cc hnh ng ngu' hi. ha' kh4ng .ong
.uDn. un l8 & th=c thi ph<n gii cc 9u'n ca .t ass(.&l' &5ng ch2nh sch &o .6t
g)o .t ngi )eng no F ha' ngi 9un tri cu h%nhh. Ph2nh sch &o .6t cF th khc
nhau t*i .#i nMi . :ng )ng ch*'8 v &*n kh4ng th ki. sot cc 9u'n . ch2nh sch &o
.6t n inh cho .S lnh ca &*n.
"!c )e &*n kh4ng th ki. sot ch2nh sch &o .6t t*i tt c cc nMi . .S lnh ch*'8 nhng
.NET Framework cung cp hai cM chI . th4ng 9ua F8 &*n cF th lo*i &V cc 9u'n $c
cp cho ass(.&l' ca &*n\ '>u cNu lo*i trQ gre?u8e reMue8/h v '>u cNu te' ch0n goK/"onaD
reMue8/h. m>u cNu lo*i trQ cho phXp &*n chJ ra cc 9u'n c th . &*n kh4ng .uDn & th=c
thi cp cho ass(.&l'. |au 9u tr%nh ph<n gii ch2nh sch8 nIu grantzs(t ca .t ass(.&l'
ch:a &t k 9u'n no S $c chJ inh trong .t '>u cNu lo*i trQ8 & th=c thi s@ lo*i &V
9u'n F. m>u cNu te' ch0n inh nghqa t6p tDi a cc 9u'n . & th=c thi cF th cp cho
ass(.&l'. HIu grantzs(t ca .t ass(.&l' ch:a &t k 9u'n no khc vi cc 9u'n S $c
chJ inh trong '>u cNu te' ch0n8 & th=c thi s@ lo*i &V 9u'n F. whc vi '>u cNu 9u'n tDi
thiu gS $c tho lu6n trong .c Z^._h8 & th=c thi s@ kh4ng tQ chDi n*p ass(.&l'
nIu nF kh4ng th cp tt c cc 9u'n S $c chJ inh trong '>u cNu te' ch0n.
L*n cF th coi '>u cNu lo*i trQ v '>u cNu te' ch0n l cc cch ch0n l=a thu $c ceng kIt
9uT cch . &*n sO )ng te' thuc vo sD l$ng 9u'n &*n .uDn lo*i &V. HIu .uDn lo*i &V
2t 9u'n8 &*n hS' ch0n '>u cNu lo*i trQ. 7u' nhi>n8 nIu .uDn lo*i &V nhiu 9u'n8 &*n
hS' ch0n '>u cNu te' ch0n.t
.
L*n th>. cc '>u cNu te' ch0n v '>u cNu lo*i trQ vo .S lnh &5ng cc lnh &o .6t khai
&o vi cG php giDng nh cc '>u cNu 9u'n tDi thiu S $c tho lu6n trong .c Z^._.
li. khc &it )u' nht l gi tri ca System.Security.Permissions.SecurityAction . &*n
tru'n cho phMng th:c khCi )=ng ca !c t2nh 9u'n. |O )ng
SecurityAction.RequestOptional khai &o .t '>u cNu te' ch0n v
SecurityAction.RequestRefuse khai &o .t '>u cNu lo*i trQ. P?ng giDng nh cc '>u
cNu 9u'n tDi thiu8 &*n phi khai &o cc '>u cNu te' ch0n v '>u cNu lo*i trQ l cc !c t2nh
ton cc &5ng cch th>. tin tD assembly: vo t>n !c t2nh. Hgoi ra8 tt c cc '>u cNu phi
520
Chng 13: Bfo ox`
;ut hin sau &t k lnh using .:c tr>n no nhng trc &t k khai &o kiu ha' kh4ng
gian t>n no.
u2 ) )i <' .inh h0a .t '>u cNu 9u'n te' ch0n cho t6p 9u'n Internet. l<' l t6p
9u'n $c inh nghqa &Ci ch2nh sch &o .6t .!c inh. whi & th=c thi n*p
OptionalRequestExample8 nF s@ kh4ng cp cho ass(.&l' n' &t c: 9u'n no kh4ng n5.
trong t6p 9u'n Internet gtha. kho ti liu .NET Framework *E' &iIt th>. chi tiIt v
cc 9u'n trong t6p 9u'n Interneth.
using System.Security.Permissions;
[assembly:PermissionSet(SecurityAction.RequestOptional, Name = "Internet")]
public class OptionalRequestExample {
public static void Main() {

// Lm g d...
}
}
7ri vi OptionalRequestExample8 v2 ) )i <' sO )ng .t '>u cNu lo*i trQ lo*i &V
9u'n System.Security.Permissions.FileIOPermission g.4 t 9u'n tru' ;ut ghi Di vi s
qa Ch\
using System.Security.Permissions;
[assembly:FileIOPermission(SecurityAction.RequestRefuse, Write = @"C:")]
public class RefuseRequestExample {
public static void Main() {

// Lm g d...
}
}
6' 6' +em cc yu c u )uy n c t o ! i m t assem!ly +em cc yu c u )uy n c t o ! i m t assem!ly
#eA JwA vO JSJ JSJ YXe@ QH D\ JSJ ]CZ JwZ Z]GA s>c@ FSX LVWJ QeX FCA QHXAB
OIQ cffOFY] Lt J^ Q>t JPZ >lA> J>aA> fSJ> FRX ONQ OIQ JSJ> d>r >Wd, >X_J
521
Chng 13: Bfo ox`
A{O LVWJ JSJ O_Q >eA J>j Jbc OIQ Q>V D@qA O\ FeA OZKA B@ Q O} YqA> Jbc
FeA(
Sg hUAB JTAB JU ,ermissions $iew i,erm"iew.e8eLVWJ JPd JrAB DE@ (NET
Framework S!k(
l cu h%nh ch2nh sch &o .6t .t cch phe h$p8 &*n cNn &iIt cc nhu cNu 9u'n tru' ;ut
.S lnh g)oAe a))e88 Kerm"88"on reMu"remen/8h ca cc ass(.&l' . &*n )= inh s@ ch*'.
liu n' Gng cho c cc th vin v cc ass(.&l' th=c thi $c tru' ;ut tQ :ng )ng ca
&*n. lDi vi th vin8 &*n cNn &iIt ass(.&l' lo*i &V nhKng 9u'n no kh4ng sO )ng th
vin n' th=c hin .t hnh ng &i h*n chI gs@ )3n In ngo*i l
System.Security.SecurityExceptionh.
P4ng c PermB"ew.e2e cung cp .t cM chI Mn gin . th4ng 9ua F8 &*n cF th ;(. cc
'>u cNu 9u'n khai &o gAe)Dara/"Be Kerm"88"on reMue8/h $c t*o &>n trong .t ass(.&l'E
&ao gt. '>u cNu tDi thiu gm"n"mum reMue8/h8 '>u cNu te' ch0n goK/"onaD reMue8/h8 v '>u cNu
lo*i trQ gre?u8aD reMue8/h. u2 )8 lp )i <' khai &o .t cNu tDi thiu8 .t '>u cNu te'
ch0n8 v .t '>u cNu lo*i trQ\
using System.Net;
using System.Security.Permissions;
// Yu cu quyn ti thiu: SocketPermission.
[assembly:SocketPermission(SecurityAction.RequestMinimum,
Unrestricted = true)]
// Yu cu quyn tuy chon: SecurityPermission.
[assembly:SecurityPermission(SecurityAction.RequestOptional,
Unrestricted = true)]
// Yu cu loai tru quyn: FileIOPermission.
[assembly:SecurityPermission(SecurityAction.RequestRefuse,
Unrestricted = true)]
public class PermissionViewExample {
public static void Main() {
// Lm g d...
}
}
7h=c thi lnh permvie% /ermission>ie%0xample.exe s@ sinh ra kIt ;ut nh sau. "!c )e
kh4ng .' th<n thin nhng &*n v3n cF th 0c kIt ;ut ;c inh cc '>u cNu 9u'n $c
t*o &Ci ass(.&l'. "#i kiu trong &a kiu '>u cNu 9u'nEtDi thiu8 te' ch0n8 v lo*i trQE
$c lit k> )i .t ti>u ri>ng v $c kIt cu C )*ng :&L ca .t Di t$ng
System.Security.PermissionSet.
522
Chng 13: Bfo ox`
Microsoft (R) .NET Framework Permission Request Viewer.
Version 1.1.4322.510
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
minimal permission set:
PermissionSet class="System.Security.PermissionSet" version="1"
IPermission class="System.Net.SocketPermission, System,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=ba5c561934e089"
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=ba5c561934e089" 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=ba5c561934e089" version="1" Unrestricted="true"/
/PermissionSet
#`AB JSJ> J> LMA> LK@ fK /decl s>@ J>e] Q@qA aJ> ,erm"iew.e8e, FeA J^ Q>t vO
QPQ JR JSJ YqA> FRX ONQ s>c@ FSX i&eclarati"e sec%rit: statementk A`O QHXAB OIQ
cffOFY]( V@qJ A\] J>X Q>P] H| A>?AB Bl cffOFY] Q>nJ >@qA FCA QHXAB D\ J>X
d>d FeA JPZ >lA> J>aA> fSJ> FRX ONQ OIQ JSJ> d>r >Wd( TZ] A>@CA,
,erm"iew.e8e s>TAB >@tA Q>M JSJ Q>cX QSJ FRX ONQ F{Q FZIJ iimperati"e sec%rit:
operationk A`O QHXAB OIQ cffOFY]( H@qA s>TAB J^ JSJ> A\X Lt QHaJ> D\ QAB sjQ
JSJ Q>cX QSJ FRX ONQ F{Q FZIJ LVWJ Q>nJ Q>@ FCA QHXAB OIQ cffOFY](
7' 7' +c nh m# l nh c' )uy n no ' l;c th c thi hay "h,ng +c nh m# l nh c' )uy n no ' l;c th c thi hay "h,ng
#eA JwA vSJ LMA> cffOFY] Jbc FeA J^ OIQ Z]GA JU Q>t A\X L^ YJ Q>nJ Q>@ >c]
s>TAB(
523
Chng 13: Bfo ox`
TeX D\ JPZ >lA> Z]GA O\ FeA OZKA s@tO QHc H@ QHZ]GA A^ J>X d>V[AB Q>~J
QA> Es7ranted Jbc YEd $!stem.$ecurit!.$ecurit!Manager(
|O )ng '>u cNu 9u'n tDi thiu8 &*n cF th & th=c thi cp cho ass(.&l' t6p
cc 9u'n S $c chJ inhT nIu .S lnh ca &*n ang ch*'8 &*n cF th ch/c r5ng nF cF cc
9u'n tDi thiu S $c '>u cNu. 7u' nhi>n8 &*n cF th .uDn hin th=c .t ch:c nvng cF t2nh
+cM hi- sao cho :ng )ng cF th cung cp ch:c nvng F chJ khi & th=c thi cp cho ass(.&l'
ca &*n cc 9u'n h$p. Pch tiIp c6n n' $c ch2nh th:c hFa .t phNn &5ng cc '>u
cNu 9u'n te' ch0n8 cho phXp &*n inh nghqa .t t6p cc 9u'n . .S lnh ca &*n cF th
)ng nIu ch2nh sch &o .6t cp chGng8 nhng--
g.c Z^.` S tr%nh &' chi tiIt v cc '>u cNu 9u'n te' ch0nh.
un Di vi cc '>u cNu 9u'n te' ch0n l & th=c thi kh4ng cF kh nvng &o cho
ass(.&l' r5ng nF S cp nhKng 9u'n no. L*n cF th sO )ng .t $cz&ozv v
tht &*i .t cch >. ;u4i khi li g0i )3n In ngo*i l
System.Security.SecurityException. 7u' nhi>n8 s@ hiu 9u hMn khi ;c inh ;(. &*n cF
cc 9u'n cNn thiIt ha' kh4ng. |au F8 &*n cF th logic - trong .S lnh trnh
g0i cc thnh vi>n $cz&ozv . s@ g<' ra stack alk v )=ng n>n cc ngo*i l &o
.6t. lo*n .S )i <' tr%nh &' cch sO )ng phMng th:c IsGranted ;c inh ;(.
ass(.&l' hin t*i cF 9u'n ghi vo th .c CNHEa/a ha' kh4ng. L*n cF th t*o .t li g0i
nh thI .#i khi &*n cNn ki. tra 9u'n8 nhng s@ hiu 9u hMn nIu sO )ng gi tri lu6n
lB thiIt l6p .t c cu h%nh cho &iIt cF cho phXp ngi )eng lu fil( ha' kh4ng.
// nh ngha mt bin lun l cho bit assembly c quyn
// truy xut ghi di vi th mc C:Data hay khng.
bool canWrite = false;

// Tao v cu hnh mt di tong FileIOPermission m ta quyn
// truy xut ghi di vi th mc C:Data.
System.Security.Permissions.FileIOPermission fileIOPerm =
new System.Security.Permissions.FileIOPermission(
System.Security.Permissions.FileIOPermissionAccess.Write,
@"C:Data");

// Kim tra assembly hin tai c quyn d doc ch dnh hay khng.
canWrite = System.Security.SecurityManager.IsGranted(fileIOPerm);
8' 8' - n ch ai ' th a " cc l % c a ! n - n ch ai ' th a " cc l % c a ! n
v ch:% = cc thnh vin l % v ch:% = cc thnh vin l %
#eA JwA s@tO fXSQ A>?AB c@ J^ Q>t Q>c sj JSJ YEd Jbc FeA Q>TAB Zc fn Q>c sj
iinheritancek D\ OIQ YEd hpA vZPQ J^ Q>t J>d L A>?AB Q>\A> D@CA A\X(
524
Chng 13: Bfo ox`
Sg hUAB JSJ YqA> FRX ONQ s>c@ FSX i&eclarati"e sec%rit: statementk Lt Sd hUAB
Q>\A> D@CA $ecurit!#ction.En.eritance-emand D\X d>wA s>c@ FSX Jbc JSJ YEd D\
JSJ Q>\A> D@CA FeA JwA FRX Dq(
Pc .o)ifi(r nh sealed8 public8 private8 v virtual cho phXp &*n ki. sot kh nvng ca
cc lp khc khi cc lp n' thQa kI lp ca &*n v chXp 1 cc thnh vi>n ca nF. 7u' nhi>n8
cc .o)ifi(r n' kh4ng linh ho*t8 kh4ng cF kh nvng ch0n l0c khi gii h*n nhKng .S lnh
no cF th thQa kI .t lp ho!c chXp 1 cc thnh vi>n ca nF. u2 )8 &*n .uDn chJ nhKng
.S lnh )o c4ng t' ha' khoa ca &*n viIt th% .i cF th thQa kI cc lp nghip v 9uan tr0ng8
ho!c chJ nhKng .S lnh $c n*p tQ .' cc & th% .i cF th thQa kI cc phMng th:c no
F. L5ng cch p )ng InheritanceDemand vo khai &o lp ha' thnh vi>n8 &*n cF th chJ
inh cc 9u'n glGc th=c thih . .t lp phi cF th% .i cF th thQa kI lp ca &*n ho!c chXp
1 cc thnh vi>n c th no F. Hh r5ng8 cc 9u'n ca .t lp l cc 9u'n ca ass(.&l'
. lp n' $c khai &o trong F.
"!c )e &*n cF th '>u cNu &t k 9u'n ha' t6p 9u'n no trong InheritanceDemand8 nhng
th4ng thng l '>u cNu cc 9u'n inh )anh g"Aen/"/y Kerm"88"onh. Yu'n inh )anh .4 t
ch:ng c: geB"Aen)eh )o .t ass(.&l' a cho & th=c thi. HIu .t ass(.&l' a ra cc kiu
ch:ng c: no F lGc n*p8 & th=c thi s@ t= ng gn cho ass(.&l' n' 9u'n inh )anh phe
h$p. Yu'n inh )anh cho phXp &*n sO )ng cc lnh &o .6t &/t &uc v khai &o
g"mKera/"Be v Ae)Dara/"Be 8e)ur"/y 8/a/emen/h tr=c tiIp ra cc 9u'It inh &o .6t g8e)ur"/y
Ae)"8"onh cvn c: tr>n inh )anh .S g)oAe "Aen/"/yh . kh4ng cNn tr=c tiIp nh gi cc Di
t$ng ch:ng c:. Lng Z^zZ lit k> kiu 9u'n inh )anh $c t*o cho .#i kiu ch:ng c:
gkiu ch:ng c: l thnh vi>n ca kh4ng gian t>n System.Security.Policy8 kiu 9u'n inh
)anh l thnh vi>n ca kh4ng gian t>n System.Security.Permissionsh.
Bfng 13'1 Cc lp chng c v cc quyn djnh danh
rs chcng cc 1uy{n nh danh
ApplicationDirectory wh4ng
Hash wh4ng
Publisher PublisherIdentityPermission
Site SiteIdentityPermission
StrongName StrongNameIdentityPermission
Url UrlIdentityPermission
Zone ZoneIdentityPermission
#I Q>nJ Q>@ BSA JSJ Z]GA LMA> hcA> J>X OIQ cffOFY] hnc QHCA J>~AB J~ hX
cffOFY] A\] LVc Hc( #eA s>TAB Q>t BSA Q>CO Z]GA LMA> hcA> J>X OIQ
cffOFY] Q>TAB Zc D@qJ JPZ >lA> J>aA> fSJ> FRX ONQ(
L*n phi sO )ng cG php &o .6t khai &o gAe)Dara/"Be 8e)ur"/y 8yn/a2h hin th=c .t
InheritanceDemand8 n>n &*n phi sO )ng &n sao !c t2nh ga//r"4u/e )oun/erKar/h ca lp
9u'n . &*n .uDn '>u cNu. 7t c cc lp 9u'n u cF .t &n sao !c t2nh t*o cc
525
Chng 13: Bfo ox`
lnh &o .6t khai &oE&ao gt. InheritanceDemand. u2 )8 &n sao !c t2nh ca
PublisherIdentityPermission l PublisherIdentityPermissionAttribute8 v &n sao !c
t2nh ca StrongNameIdentityPermission l StrongNameIdentityPermissionAttributeEtt c
cc 9u'n v cc &n sao !c t2nh ca chGng ceng th(o 9u' c !t t>n v l cc thnh vi>n
ca ceng kh4ng gian t>n.
l ki. sot nhKng .S lnh no cF th thQa kI lp ca &*n8 hS' p )ng InheritanceDemand
khi khai &o lp. lo*n .S )i <' tr%nh &' .t lp $c &o v &5ng InheritanceDemand.
7h(o F8 chJ nhKng lp &>n trong cc ass(.&l' $c kB &Ci pu&lish(rzc(rtificat( gn5. trong
fil( Ku4)er/.)erh th% .i cF th thQa kI lp InheritanceDemandExample. Hi )ung ca fil(
Ku4)er/.)er $c 0c lGc &i>n )ich8 v cc th4ng tin ch:ng th=c cNn thiIt $c g/n vo
ass(.&l'.
[PublisherIdentityPermission(SecurityAction.InheritanceDemand,
CertFile = @"I:CSharpChuong13pubcert.cer")]
public class InheritanceDemandExample {

}
l ki. sot nhKng .S lnh no cF th chXp 1 cc thnh vi>n no F8 &*n hS' p )ng
InheritanceDemand khi khai &o thnh vi>n. {Xt o*n .S )i <'8 chJ nhKng lp $c cp
t6p 9u'n FullTrust th% .i cF th chXp 1 phMng th:c SomeProtectedMethod.
[PermissionSet(SecurityAction.InheritanceDemand, Name="FullTrust")]
public void SomeProtectedMethod () {

}
9' 9' .i m tra ch ng c c a m t assem!ly .i m tra ch ng c c a m t assem!ly
#eA JwA s@tO QHc J>~AB J~ O\ FI Q>nJ Q>@ L} BSA J>X OIQ cffOFY](
T>Z YP] LK@ QVWAB $!stem.&e*lection.#ssembl! OT QR cffOFY] O\ FeA ZcA
QO( LP] QNd >Wd $!stem.$ecurit!./olic!.0vidence Q Q>ZIJ QaA> 0vidence Jbc
LK@ QVWAB #ssembl!, H@ QHZ] vZPQ JSJ LK@ QVWAB J>~AB J~ FCA QHXAB F`AB d>V[AB
Q>~J 7et0numerator, 7etHost0numerator, >c] 7et#ssembl!0numerator Jbc YEd
0vidence(
yp Evidence .4 t .t t6p h$p cc Di t$ng ch:ng c:. 7huc t2nh chJz0c Evidence ca
lp Assembly tr v .t Di t$ng t6p h$p Evidence ch:a tt c cc Di t$ng ch:ng c: . &
th=c thi S gn cho ass(.&l' khi ass(.&l' n' $c n*p.
7h6t ra8 lp Evidence ch:a hai t6p h$p8 .4 t hai kiu ch:ng c: khc nhau\ ch:ng c: host v
ch:ng c: ass(.&l'. Ph:ng c: host &ao gt. cc Di t$ng ch:ng c: $c gn cho ass(.&l'
&Ci & th=c thi ha' .S lnh S n*p ass(.&l' g.S lnh n' l ng tin c6'h. Ph:ng c:
ass(.&l' .4 t cc Di t$ng ch:ng c: te' &iIn $c nhGng vo ass(.&l' lGc t*o )=ng. yp
Evidence hin th=c &a phMng th:c sau <' lit k> cc Di t$ng ch:ng c: &>n trong\
GetEnumerator
526
Chng 13: Bfo ox`
GetHostEnumerator
GetAssemblyEnumerator
RhMng th:c GetEnumerator tr v .t System.Collections.IEnumerator )eng lit k> tt
c cc Di t$ng ch:ng c: &>n trong t6p h$p Evidence. RhMng th:c GetHostEnumerator v
GetAssemblyEnumerator tr v .t th hin IEnumerator lit k> chJ cc Di t$ng ch:ng c: tQ
t6p h$p tMng :ng.
u2 ) )i <' tr%nh &' cch hin thi ch:ng c: host v ch:ng c: ass(.&l' ca .t
ass(.&l'. PhG B r5ng8 tt c cc lp ch:ng c: chuxn u chXp 1 phMng th:c
Object.ToString &iu )irn tr*ng thi ca Di t$ng ch:ng c:. "!c )e cF li>n 9uan nhng
kh4ng phi lGc no v2 ) n' c?ng hin thi ch:ng c: . .t ass(.&l' s@ cF khi $c n*p tQ
&>n trong chMng tr%nh ca &*n. Wunti.( host gnh &")ro8o?/ >*P.NET ha' &")ro8o?/
<n/erne/ E2KDorer run/"me ho8/h cF th t= B gn th>. ch:ng c: host khi nF n*p .t ass(.&l'.
using System;
using System.Reflection;
using System.Collections;
using System.Security.Policy;
public class ViewEvidenceExample {
public static void Main(string[] args) {
// Nap assembly d doc ch dnh.
Assembly a = Assembly.LoadFrom(args[0]);
// Thu ly tp hop Evidence tu assembly d doc nap.
Evidence e = a.Evidence;
// Hin th chng c host.
IEnumerator x = e.GetHostEnumerator();
Console.WriteLine("HOST EVIDENCE COLLECTION:");
while(x.MoveNext()) {
Console.WriteLine(x.Current.ToString());
}
// Hin th chng c assembly.
x = e.GetAssemblyEnumerator();
Console.WriteLine("ASSEMBLY EVIDENCE COLLECTION:");
while(x.MoveNext()) {
527
Chng 13: Bfo ox`
Console.WriteLine(x.Current.ToString());
}
}
}
7t c cc lp ch:ng c: chuxn )o .NET Framework cp u &t &iIn8 &*n kh4ng th tha' si
cc gi tri ca chGng sau khi & th=c thi S t*o ra rti gn chGng cho ass(.&l'. Hgoi ra8 &*n
kh4ng th th>. ha' lo*i &V cc it(. trong lGc ang lit k> .t t6p h$p &5ng IEnumerator8 nIu
kh4ng8 phMng th:c MoveNext s@ nX. ngo*i l System.InvalidOperationException.
10'
10' + l* ch ng c "hi n % m t assem!ly + l* ch ng c "hi n % m t assem!ly
#eA JwA vg Y J>~AB J~ s>@ Aed OIQ cffOFY] Lt QSJ LIAB LjA JSJ Z]GA O\ FI
Q>nJ Q>@ JPd J>X cffOFY](
TeX JSJ LK@ QVWAB J>~AB J~ O\ FeA OZKA BSA J>X cffOFY], fcZ L^ Q>CO J>AB
D\X OIQ Q>t >@qA Jbc YEd $!stem.$ecurit!./olic!.0vidence, H@ QHZ]GA QNd >Wd
0vidence J>X d>V[AB Q>~J hrAB Lt Aed cffOFY](
Ph:ng c: g$c chiI. hKu &Ci .t ass(.&l'h inh nghqa inh )anh g"Aen/"/yh ca ass(.&l'
v ;c inh & th=c thi cp cc 9u'n no cho ass(.&l'. L n*p ass(.&l' g>88em4Dy LoaAerh
chiu trch nhi. ch2nh trong vic ;c inh gn ch:ng c: g% cho .t ass(.&l'8 nhng .t
host ng tin c6' gnh >*P.NET ha' <n/erne/ E2KDorer run/"me ho8/h c?ng cF th gn ch:ng
c: cho .t ass(.&l'. "S lnh ca &*n cF th gn ch:ng c: khi n*p .t ass(.&l' nIu .S
lnh n' cF phNn tO ControlEvidence ca SecurityPermission.
NjZ FeA Aed OIQ cffOFY] D\X OIQ O@GA ~AB hUAB >c@ YwA A>VAB BSA J>~AB J~
s>SJ D\X cffOFY] A\] Ox@ YwA A>V Q>j, FI Q>nJ Q>@ fm AO ABXe@ Yq
$!stem.E(."ile+oad0xception(
PF nhiu phMng th:c th=c hin vic gn ch:ng c: khi n*p .t ass(.&l'. "t !c i. .
tt c cc phMng th:c n' thng cF l nh6n .t t6p h$p Evidence l. Di sDElp Evidence
l .t & ch:a cho cc Di t$ng ch:ng c:. L*n phi !t tQng Di t$ng ch:ng c: . &*n
.uDn gn cho ass(.&l' vo .t t6p h$p Evidence v tru'n nF cho phMng th:c n*p
ass(.&l'. HIu &*n gn ch:ng c: .i ;ung t vi ch:ng c: $c gn &Ci & n*p ass(.&l'8
ch:ng c: .i s@ tha' thI ch:ng c: c?. Lng Z^z] lit k> cc lp v cc phMng th:c ca
chGng tr=c tiIp ha' gin tiIp n*p .t ass(.&l'. "#i phMng th:c cung cp .t ha' nhiu
phi>n &n n*p chtng chp nh6n .t t6p h$p Evidence.
Bfng 13'2 Cc lp v cc phng thc ca chng cho php ban gn chng c cho mt assembly
rsSPhng `hcc ?i `f
yp System.Activator
Pc phMng th:c n' nh hCng In .in :ng )ng
hin hnh.
CreateInstance
CreateInstanceFrom
7*o .t kiu trong .in :ng )ng hin hnh tQ
ass(.&l' $c chJ inh.
528
Chng 13: Bfo ox`
yp System.AppDomain
Pc phMng th:c n' nh hCng In .in :ng )ng
$c .4 t &Ci Di t$ng AppDomain gphMng th:c $c
g0i tr>n Fh.
CreateInstance
CreateInstanceAndUnwrap
CreateInstanceFrom
CreateInstanceFromAndUnwrap
7*o .t kiu tQ ass(.&l' $c chJ inh.
DefineDynamicAssembly
7*o .t Di t$ng System.Reflection.Emit.
AssemblyBuilder8 &*n cF th sO )ng nF t*o ng
.t ass(.&l' trong & nh.
ExecuteAssembly
H*p v th=c thi .t ass(.&l' cF i. nh6p S $c
inh nghqa gphMng th:c Mainh.
Load
H*p ass(.&l' $c chJ inh.
yp System.Reflection.Assembly
Pc phMng th:c n' nh hCng In .in :ng )ng
hin hnh.
Load
LoadFile
LoadFrom
LoadWithPartialName
H*p ass(.&l' $c chJ inh.
lo*n .S )i <' tr%nh &' cch sO )ng phMng th:c Assembly.Load n*p .t ass(.&l'
vo .in :ng )ng hin hnh. 7rc khi g0i Load8 o*n .S n' t*o .t t6p h$p Evidence v
sO )ng phMng th:c AddHost ca nF th>. cc Di t$ng ch:ng c: Site v Zone gcc thnh
vi>n ca kh4ng gian t>n System.Security.Policyh.
// Tao cc di tong chng c Site v Zone mi.
System.Security.Policy.Site siteEvidence = new
System.Security.Policy.Site("www.microsoft.com");
System.Security.Policy.Zone zoneEvidence = new
System.Security.Policy.Zone(System.Security.SecurityZone.Trusted);
// Tao mt tp hop Evidence mi.
System.Security.Policy.Evidence evidence =
new System.Security.Policy.Evidence();
// Thm cc di tong chng c Site v Zone vo tp hop Evidence
// bng phng thc AddHost.
529
Chng 13: Bfo ox`
evidence.AddHost(siteEvidence);
evidence.AddHost(zoneEvidence);
// Nap assembly c tn l "SomeAssembly" v gn cc di tong Site v
// Zone cho n. Cc di tong ny s chp d cc di tong Site v Zone
// do b nap assembly gn.
System.Reflection.Assembly assembly =
System.Reflection.Assembly.Load("SomeAssembly", evidence);
11' 11' + l* ! o m t ! th c thi ! ng ch ng c c a mi n ng d ng + l* ! o m t ! th c thi ! ng ch ng c c a mi n ng d ng
#eA JwA FZIJ OIQ B@E@ >eA QHCA i%pper limitk YCA JSJ Z]GA LcAB J^ >@qZ YnJ DE@
QPQ JR JSJ cffOFY] LVWJ Aed D\X OIQ O@GA ~AB hUAB JU Q>t(
CPZ >lA> J>aA> fSJ> FRX ONQ Lt JPd JSJ Z]GA d>r >Wd hnc QHCA J>~AB J~ O\
FeA hn LMA> BSA J>X O@GA ~AB hUAB( 3>@ QeX O@GA ~AB hUAB F`AB d>V[AB Q>~J
QA> Create-omain Jbc YEd $!stem.#pp-omain, FeA >}] JZAB JPd OIQ QNd >Wd
$!stem.$ecurit!./olic!.0vidence J>~c JSJ LK@ QVWAB J>~AB J~ Jbc O@GA ~AB
hUAB( ScZ L^, Aed JSJ cffOFY] O\ FeA OZKA B@E@ >eA JSJ Z]GA Jbc J>AB FCA
QHXAB O@GA ~AB hUAB A\](
lGng nh & th=c thi gn 9u'n cho ass(.&l' )=a tr>n ch:ng c: . ass(.&l' n' a ra lGc
n*p8 & th=c thi c?ng gn 9u'n cho cc .in :ng )ng )=a tr>n ch:ng c: ca chGng. L
th=c thi kh4ng gn ch:ng c: cho cc .in :ng )ng th(o cch nh nF gn cho cc ass(.&l'
v% kh4ng cF g% ch:ng c: F t=a vo. 7ha' vo F8 .S lnh t*o .in :ng )ng phi gn
ch:ng c: khi cNn.
#I Q>nJ Q>@ J> fg hUAB JSJ O~J J>aA> fSJ> JTAB Q] ienterprisek, OS] imachinek,
D\ ABVo@ hrAB i%serk Lt QaA> JSJ Z]GA Jbc OIQ O@GA ~AB hUAB JSJ J>aA> fSJ>
FRX ONQ Jbc JSJ O@GA ~AB hUAB >@qA J^ s>TAB B@? Dc@ QHy Bl JR( MUJ -( fm
Q>RX YZNA J>aA> fSJ> FRX ONQ O@GA ~AB hUAB(
Pc .in :ng )ng kh4ng cF ch:ng c: l trong suDt Di vi cc cM chI &o .6t tru' ;ut .S
lnh ca & th=c thi. Pc .in :ng )ng $c gn ch:ng c: cF .t grantzs(t )=a tr>n ch2nh
sch &o .6t v Fng .t vai trk 9uan tr0ng trong vic ph<n gii cc '>u cNu &o .6t C>*.
whi 9u tr%nh th=c thi :ng )ng ;u'>n 9ua .t &i>n .in :ng )ng8 & th=c thi ghi l*i vic
chu'n tiIp tr>n call stack. whi .t '>u cNu &o .6t g<' n>n .t stack alk8 &n ghi chu'n
tiIp .in :ng )ng $c ;O lB giDng nh cc &n ghi stack khcE& th=c thi nh gi grantz
s(t kIt giao vi &n ghi stack &o . nF ch:a cc 9u'n $c '>u cNu. liu n' nghqa l
cc 9u'n ca .t .in :ng )ng nh hCng In tt c .S lnh $c n*p vo .in :ng
)ng. 8 .in :ng )ng thiIt l6p .t gii h*n tr>n l>n cc kh nvng ca tt c .S lnh
$c n*p vo nF.
"t v2 ) 9uan tr0ng trong sO )ng ch:ng c: .in :ng )ng l &")ro8o?/ <n/erne/ E2KDorer.
<n/erne/ E2KDorer t*o .t .in :ng )ng cho .#i sit( . nF )onloa) cc iu ki. $cz
9unzlB tQ F. 7t c cc iu ki. $c )onloa) tQ .t sit( cho trcEc?ng nh cc
ass(.&l' . chGng n*pEch*' trong ceng .in :ng )ng. whi <n/erne/ E2KDorer t*o .in
530
Chng 13: Bfo ox`
:ng )ng cho .t sit(8 nF gn ch:ng c: System.Security.Policy.Site cho .iu :ng )ng
n'. liu n' &o . r5ng8 nIu cc iu ki. $c )onloa) n*p .t ass(.&l' gnga' c tQ
qa cc &h8 cc hnh ng ca ass(.&l' n' &i rng &uc &Ci cc 9u'n $c cp cho .in
:ng )ng )=a tr>n ch:ng c: Site v ch2nh sch &o .6t.
TH s>@ FeA BSA J>~AB J~ J>X O@GA ~AB hUAB OIQ JSJ> QVoAB O@A> s>@ QeX A^,
O@GA ~AB hUAB A\] s>TAB RA> >VAB Bl LjA JSJ ]CZ JwZ FRX ONQ isec%rit:
&eman&k(
l gn ch:ng c: cho .t .in :ng )ng8 &*n hS' t*o .t t6p h$p Evidence v th>. cc Di
t$ng ch:ng c: cNn thiIt vo F &5ng phMng th:c Evidence.AddHost. whi t*o .in :ng )ng
.i8 &*n tru'n t6p h$p Evidence cho .t trong cc phi>n &n n*p chtng ca phMng th:c
tqnh CreateDomain.
grantzs(t ca .in :ng )ng.
ng )ng )i <' tr%nh &' cch gn ch:ng c: cho .t .in :ng )ng. 7rong F8 :ng )ng
n*p .S lnh tQ .t pu&lish(r c th vo .t .in :ng )ng pu&lish(r . L5ng cch gn
cho .iu :ng )ng ch:ng c: System.Security.Policy.Publisher .4 t pu&lish(r ca phNn
..8 v2 ) n' h*n chI cc kh nvng ca .S lnh $c n*p vo .in :ng )ng. |O )ng
ch2nh sch &o .6t8 &*n cF th gn .S lnh ca pu&lish(r .t t6p 9u'n c=c *i tMng ;:ng
vi .:c tin c6' &*n !t vo pu&lish(r.
using System;
using System.Security.Policy;
using System.Security.Cryptography.X509Certificates;
public class AppDomainEvidenceExample {
public static void Main() {

// Tao mt min ng dng mi cho mi publisher m ng dng ny
// s nap m lnh cua n. Truyn cho phng thc CreateAppDomain
// tn cng ty, v tn cua file cha chng ch X.509v3
// cua cng ty ny.
AppDomain appDom1 = CreateAppDomain("Litware", "litware.cer");
AppDomain appDom2 = CreateAppDomain("Fabrikam", "fabrikam.cer");

// Nap m lnh tu cc publisher vo min ng dng phu hop
// d thc thi.

}
531
Chng 13: Bfo ox`
// Phng thc ny tao mt min ng dng mi d nap v chay m lnh
// trong d tu mt publisher c th. i s name ch dnh tn cua
// min ng dng. i s certFile ch dnh tn cua file cha
// mt chng ch X.509v3 cho publisher m m lnh cua n s
// doc chay trong min ng dng mi.
private static AppDomain CreateAppDomain(string name,
string certFile){

// Tao mt di tong X509Certificate mi tu chng ch X.509v3
// nm trong file doc ch dnh.
X509Certificate cert =
X509Certificate.CreateFromCertFile(certFile);

// Tao chng c Publisher mi tu di tong X509Certificate.
Publisher publisherEvidence = new Publisher(cert);
// Tao mt tp hop Evidence mi.
Evidence evidence = new Evidence();
// Thm chng c Publisher vo tp hop Evidence.
evidence.AddHost(publisherEvidence);
// Tammgdgmvtpop Evidence
// gPublisher vravmgdg
// vuduoar.
return AppDomain.CreateDomain(name, evidence);
}
}
12' 12' + l* ! o m t ! th c thi + l* ! o m t ! th c thi
! ng ch7nh sch ! o m t c a mi n ng d ng ! ng ch7nh sch ! o m t c a mi n ng d ng
#eA JwA s@tO fXSQ iF`AB O} YqA>k JSJ Z]GA LVWJ JPd J>X JSJ cffOFY](
CPZ >lA> iF`AB O} YqA>k J>aA> fSJ> FRX ONQ Jbc O@GA ~AB hUAB O\ FeA L} Aed
JSJ cffOFY] D\X L^(
532
Chng 13: Bfo ox`
Ph2nh sch &o .6t g8e)ur"/y KoD")yh &ao gt. &Dn .:c ch2nh sch\ c4ng t' gen/erKr"8eh8 .'
gma)h"neh8 ngi )eng gu8erh8 v .in :ng )ng gaKKD")a/"on Aoma"nh. L th=c thi 9u'It inh
nhKng 9u'n no cp cho .t ass(.&l' &5ng cch ;c inh t6p 9u'n $c cp &Ci .#i
.:c ch2nh sch rti t2nh phXp giao gphXp >NE lu6n lBh ca &Dn t6p 9u'n. Pc 9u'n n5.
trong t6p giao l grantzs(t cuDi ceng ca ass(.&l'.
NBc] JR s>@ JSJ O~J J>aA> fSJ> JTAB Q], OS], >c] ABVo@ hrAB J> LMA> JXh
BHXZd +evel"inal iJ> Q>M FI Q>nJ Q>@ s>TAB LSA> B@S JSJ O~J J>aA> fSJ> Q>Pd
>[Ak, FI Q>nJ Q>@ YZTA fg hUAB O~J J>aA> fSJ> Jbc O@GA ~AB hUAB Lt QaA> BHcAQ6
fQ Jbc OIQ cffOFY](
PhJ cc .:c chinh sch c4ng t'8 .'8 v ngi )eng l $c cu h%nh tqnh &5ng
>Am"n"8/ra/"Be TooD8. u% .in :ng )ng kh4ng ttn t*i &>n ngoi ngK cnh ca & th=c thi n>n
kh4ng th cu h%nh tqnh ch2nh sch .in :ng )ng $c. l cu h%nh ch2nh sch &o .6t ca
.t .in :ng )ng8 &*n phi t*o .t .:c ch2nh sch g&5ng .S lnhh rti gn nF cho .in
:ng )ng.
{<' )=ng .t .:c ch2nh sch &5ng .S lnh cF th l .t c4ng vic l<u )i8 te' thuc vo
ph:c t*p ca ch2nh sch &o .6t . &*n cNn )irn t. yp
System.Security.Policy.PolicyLevel .4 t .t .:c ch2nh sch &o .6t. L>n trong .#i Di
t$ng PolicyLevel8 &*n phi t*o )=ng .t cu trGc ph<n cp cc co)( group8 inh nghqa cc
iu kin thnh vi>n8 cc t6p 9u'n8 v cc !c t2nh ca .#i co)( group. PF rt nhiu kiu
$c sO )ng t*o )=ng .:c ch2nh sch8 v tho lu6n v cc kiu n' l v$t 9u ph*. vi
9u'n sch n'. y6p tr%nh &o .6t .NET8 nh S c6p trc <'8 cung cp th4ng tin chi tiIt
v .#i lp n' v tr%nh &' cch ;<' )=ng .t .:c ch2nh sch &5ng .S lnh.
T>TAB Q>VoAB, FeA fm d>SQ QH@tA OIQ JTAB JU QHW B@d D@qJ QeX OIQ O~J J>aA>
fSJ> D\ B>@ LMA> AB>c O~J J>aA> fSJ> Hc @Y fcZ L^, FeA J^ Q>t Aed LMA> AB>c
A\] Q Lc s>@ JwA( LEd /olic!+evel J^ >c@ d>V[AB Q>~J A>`O L[A B@RA >^c ZS
QHlA> A\]z )o5ml LVc OIQ LK@ QVWAB /olic!+evel DG heAB hu YVZ QH?, D\ "rom5ml
v] hnAB Ye@ OIQ LK@ QVWAB /olic!+evel Q heAB L} LVWJ YVZ QH?(
"t khi S cF Di t$ng PolicyLevel .4 t ch2nh sch &o .6t nh .ong .uDn8 &*n cF th
gn nF cho .t .in :ng )ng. 7hu l' tha. chiIu System.AppDomain In .in :ng )ng .
&*n .uDn cu h%nh8 v tru'n Di t$ng PolicyLevel cho phMng th:c
AppDomain.SetAppDomainPolicy. "S lnh ca &*n phi cF phNn tO ControlDomainPolicy ca
SecurityPermission th% .i cF th g0i SetAppDomainPolicy. L*n chJ cF th g0i
SetAppDomainPolicy .t lNn tr>n .#i .in :ng )ngT nIu &*n g0i SetAppDomainPolicy lNn
th: hai8 nF s@ nX. ngo*i l System.Security.Policy.PolicyException.
L*n kh4ng phi gn Di t$ng PolicyLevel cho .t .in :ng )ng trc khi n*p cc
ass(.&l' vo .in :ng )ng n'. Pc ass(.&l' $c n*p trc khi &*n thiIt l6p ch2nh sch
&o .6t .in :ng )ng cF cc grantzs(t chJ )=a tr>n cc .:c ch2nh sch\ c4ng t'8 .'8 v
ngi )eng. Ph2nh sch .in :ng )ng chJ p )ng cho cc ass(.&l' $c n*p sau khi nF
$c cu h%nh. 7h4ng thng8 &*n sO )ng kh nvng n' n*p cc ass(.&l' chia sj ngz
tinzc6' vo .in :ng )ng . kh4ng &i rng &uc &Ci ch2nh sch .in :ng )ng.
533
Chng 13: Bfo ox`
ng )ng )i <' tr%nh &' 9u tr%nh t*o .t .:c ch2nh sch v gn nF cho .t .in :ng
)ng. ":c ch2nh sch n' cp cc 9u'n )=a tr>n pu&lish(r ca .t ass(.&l'E$c th hin
trong cc khon ca ch:ng c: System.Security.Policy.Publisher.
using System;
using System.Security;
using System.Security.Policy;
using System.Security.Cryptography.X509Certificates;
public class AppDomainPolicyExample {
public static void Main() {

// Tao mt min ng dng mi (d nap cc assembly vo d).
AppDomain domain = AppDomain.CreateDomain("modules");
// Nap cc assembly vo min ng dng m ban khng mun
// b rng buc boi chnh sch bao mt min ng dng.


// Cu hnh chnh sch bao mt cho di tong AppDomain.
SetDomainPolicy(domain);

// Nap cc assembly vo min ng dng doc bao v.

}
// Phng thc ny cu hnh chnh sch bao mt cua di tong
// AppDomain doc truyn cho n. Chnh sch bao mt s gn cc
// quyn khc nhau cho mi assembly da trn publisher cua
// assembly. Nhng assembly tu cc publisher v danh khng doc
// cp quyn no ca.
private static void SetDomainPolicy(AppDomain domain) {
// Tao mt PolicyLevel mi cho min ng dng.
PolicyLevel policy = PolicyLevel.CreateAppDomainLevel();

// Tao mt FirstMatchCodeGroup mi dung lm nt gc cua h
// thng phn cp code group. Cu hnh group ny sao cho
534
Chng 13: Bfo ox`
// n trung khp vi tt ca code. iu ny ngha l tt ca
// cc assembly du khoi du vi mt grant-set rng cho
// mc chnh sch min ng dng.
policy.RootCodeGroup = new FirstMatchCodeGroup(
new AllMembershipCondition(),
new PolicyStatement(policy.GetNamedPermissionSet("Nothing"))
);

// Tao tp cc code group d xc dnh cc quyn no s doc cp
// cho mt assembly do mt publisher tao ra. V code group gc
// l mt FirstMatchCodeGroup, nn qu trnh phn giai chnh sch
// ch so trung assembly trn cc group con cho dn khi tm thy
// trung khp du tin. Mi code group doc tao vi dac tnh
// Exclusive d bao dam rng assembly khng ly thm quyn
// no tu cc code group khc.

// Tao code group cp tp quyn FullTrust cho cc
// assembly doc pht hnh boi Microsoft.
X509Certificate microsoftCert =
X509Certificate.CreateFromCertFile("microsoft.cer");

policy.RootCodeGroup.AddChild(new UnionCodeGroup(
new PublisherMembershipCondition(microsoftCert),
new PolicyStatement(policy.GetNamedPermissionSet("FullTrust"),
PolicyStatementAttribute.Exclusive)
));
// Tao code group cp tp quyn Internet cho cc
// assembly doc pht hnh boi Litware, Inc.
X509Certificate litwareCert =
X509Certificate.CreateFromCertFile("litware.cer");

policy.RootCodeGroup.AddChild(new UnionCodeGroup(
new PublisherMembershipCondition(litwareCert),
new PolicyStatement(policy.GetNamedPermissionSet("Internet"),
PolicyStatementAttribute.Exclusive)
535
Chng 13: Bfo ox`
));
// Tao code group cp tp quyn Execution cho cc
// assembly doc pht hnh boi Fabrikam, Inc.
X509Certificate fabrikamCert =
X509Certificate.CreateFromCertFile("fabrikam.cer");

policy.RootCodeGroup.AddChild(new UnionCodeGroup(
new PublisherMembershipCondition(fabrikamCert),
new PolicyStatement(policy.GetNamedPermissionSet("Execution"),
PolicyStatementAttribute.Exclusive)
));
// Thm mt code group sau cung d bt tt ca cc assembly
// khng khp vi publisher no. Gn group ny vi tp quyn
// Nothing. V group ny l Exclusive nn assembly s khng
// nhn quyn no tu cc group khc, ngay ca tu cc
// mc chnh sch cao hn (cng ty, my, v ngi dung).
policy.RootCodeGroup.AddChild(new UnionCodeGroup(
new AllMembershipCondition(),
new PolicyStatement(policy.GetNamedPermissionSet("Nothing"),
PolicyStatementAttribute.Exclusive)
));

// Gn chnh sch cho min ng dng.
domain.SetAppDomainPolicy(policy);
}
}
13' 13' +c nh ng i d(ng hi n hnh c' l thnh vin +c nh ng i d(ng hi n hnh c' l thnh vin
c a m t nh'm Windows no ' hay "h,ng c a m t nh'm Windows no ' hay "h,ng
#eA JwA vSJ LMA> ABVo@ hrAB >@qA >\A> Jbc ~AB hUAB J^ d>R@ Y\ Q>\A> D@CA Jbc
OIQ A>^O ABVo@ hrAB *in&ows A\X L^ >c] s>TAB(
T>Z YP] LK@ QVWAB $!stem.$ecurit!./rincipal.indo%sEdentit! OT QR ABVo@
hrAB >@qA >\A> F`AB d>V[AB Q>~J QA> indo%sEdentit!.7etCurrent( 3j Q@jd,
QHZ]GA LK@ QVWAB indo%sEdentit! J>X d>V[AB Q>~J s>@ hnAB Jbc YEd
$!stem.$ecurit!./rincipal.indo%s/rincipal Lt Q>Z YP] LK@ QVWAB
536
Chng 13: Bfo ox`
indo%s/rincipal( CZK@ JrAB, B@ d>V[AB Q>~J EsEn&ole Jbc LK@ QVWAB
indo%s/rincipal Lt vSJ LMA> ABVo@ hrAB A\] J^ A`O QHXAB OIQ A>^O *in&ows
A\X L^ >c] s>TAB(
PM chI =$* ca .NET Framework trQu t$ng hFa cc t2nh nvng &o .6t )=aztr>nzngiz)eng
ca h iu hnh n5. )i th4ng 9ua hai giao )in ch2nh sau <'\
System.Security.Principal.IIdentity
System.Security.Principal.IPrincipal
piao )in IIdentity .4 t th=c th . .S lnh hin ang ch*' tr>n )anh nghqa ca th=c th
n'8 ch~ng h*n .t ngi )eng ho!c ti khon )ich v g8erB")e a))oun/h. piao )in
IPrincipal .4 t IIdentity ca th=c th v t6p cc vai trk . th=c th n' thuc v. "t vai
trk chJ l .t s= ph<n lo*i8 )eng nhF. cc th=c th vi cc kh nvng &o .6t tMng t=
nhau8 ch~ng h*n .t nhF. ngi )eng @"nAow8.
l t2ch h$p =$* vi &o .6t ngi )eng @"nAow88 .NET Framework cung cp hai lp sau
<' ghin th=c giao )in IIdentity v IPrincipalh\
System.Security.Principal.WindowsIdentity
System.Security.Principal.WindowsPrincipal
yp WindowsIdentity hin th=c giao )in IIdentity v .4 t .t ngi )eng @"nAow8. yp
WindowsPrincipal hin th=c IPrincipal v .4 t t6p cc nhF. @"nAow8 . ngi )eng n'
thuc v. u% .NET =$* l .t gii php chung $c thiIt kI sao cho c l6p nn8 &*n kh4ng
th tru' ;ut cc t2nh nvng v cc kh nvng ca ti khon ngi )eng @"nAow8 th4ng 9ua giao
)in IIdentity v IPrincipal8 &*n phi sO )ng tr=c tiIp cc Di t$ng WindowsIdentity v
WindowsPrincipal.
l ;c inh ngi )eng hin hnh cF phi l thnh vi>n ca .t nhF. @"nAow8 no F ha'
kh4ng8 trc ti>n &*n phi g0i phMng th:c tqnh WindowsIdentity.GetCurrent. RhMng th:c
n' tr v .t Di t$ng WindowsIdentity .4 t ngi )eng @"nAow8 . tiu tr%nh hin ang
ch*' tr>n )anh nghqa ca ngi )eng n'. wI tiIp8 t*o .t Di t$ng WindowsPrincipal .i
v tru'n Di t$ng WindowsIdentity cho phMng th:c khCi )=ng. PuDi ceng8 g0i phMng
th:c IsInRole ca Di t$ng WindowsPrincipal ki. tra ;(. ngi )eng n' cF n5. trong
.t nhF. gvai trkh c th no F ha' kh4ng. IsInRole tr v true nIu ngi )eng n' l
thnh vi>n ca nhF. S $c chJ inh8 ng$c l*i tr v false.
#eA J^ Q>t Q>Z YP] Q>cO J>@jZ E/rincipal LjA OIQ LK@ QVWAB indo%s/rincipal
F`AB Q>ZIJ QaA> QA> Current/rincipal Jbc YEd $!stem.).reading.).read( TZ]
A>@CA, s Q>ZNQ A\] Qr] Q>ZIJ D\X JPZ >lA> J>aA> fSJ> principal Jbc O@GA ~AB
hUAB >@qA >\A> OUJ -( fm Q>RX YZNA DPA LG A\] J>@ Q@jQ >[A(
RhMng th:c IsInRole cF &a phi>n &n n*p chtng\
Rhi>n &n th: nht nh6n .t chu#i ch:a t>n ca nhF. cNn ki. tra. 7>n nhF. phi cF
)*ng [DomainName][GroupName] Di vi cc nhF. )=aztr>nz.in v phi cF )*ng
[MachineName][GroupName] Di vi cc nhF. $c inh nghqa cc &. HIu .uDn ki.
537
Chng 13: Bfo ox`
tra t cch thnh vi>n ca .t nhF. @"nAow8 chuxn8 &*n hS' sO )ng )*ng
BUILTIN[GroupName]. IsInRole th=c hin ki. tra cF ph<n &it chK hoazthng Di vi
t>n nhF. $c chJ inh.
Rhi>n &n th: hai nh6n .t sD ngu'>n ginth8 sD n' chJ inh .t @"nAow8 =oDe
<Aen/"?"er g=<Eh. =<E cung cp .t cM chI nh6n &iIt cc nhF.8 kh4ng ph thuc vo
ng4n ngK gDanguageh v s= &n ia hFa gDo)aD"Oa/"onh.
Rhi>n &n th: &a nh6n .t thnh vi>n thuc kiu lit k>
System.Security.Principal.WindowsBuiltInRole. wiu lit k> n' inh nghqa cc
thnh vi>n .4 t cc nhF. @"nAow8 cF sn. Lng Z^.^ lit k> t>n8 =<E8 v gi tri
WindowsBuiltInRole cho .#i nhF. @"nAow8 chuxn.
Bfng 13'3 Tn, , v gi trj WindowsBuiltnole ca cc ti khon c sn
Ttn `~i uhofn *"< 0z :i `a OindokBuim`"n*omz
$Q<LT<NH>))oun/ FKera/or8 0222G
AccountOperator
$Q<LT<NH>Am"n"8/ra/or8 02220
Administrator
$Q<LT<NH$a)kuK FKera/or8 0222L
BackupOperator
$Q<LT<NH6ue8/8 02222
Guest
$Q<LT<NHPower Q8er8 0222C
PowerUser
$Q<LT<NHPr"n/ FKera/or8 0222Y
PrintOperator
$Q<LT<NH=eKD")a/or8 0222U
Replicator
$Q<LT<NH*erBer FKera/or8 0222W
SystemOperator
$Q<LT<NHQ8er8 02221
User

LEd indo%sEdentit! JZAB JPd JSJ d>V[AB Q>~J s>@ hnAB Aed J>AB J>X d>d
FeA Q>Z YP] LK@ QVWAB indo%sEdentit! OT QR OIQ ABVo@ hrAB A\X L^ is>@ J>e]
QHCA Microsoft *in&ows Ser"er '(() QH DG fcZk( #eA J^ Q>t fg hUAB LK@ QVWAB
A\] D\ d>V[AB d>Sd LVWJ OT QR QHXAB OUJ A\] Lt vSJ LMA> vO ABVo@ hrAB L^
J^ d>R@ Y\ Q>\A> D@CA Jbc OIQ A>^O *in&ows A\X L^ >c] s>TAB(
NjZ FeA fg hUAB OIQ QHXAB JSJ d>V[AB Q>~J s>@ hnAB A\] s>@ J>e] QHCA OIQ
d>@CA FRA *in&ows J, A^ fm AO ABXe@ Yq $!stem.#rgument0xception( THCA JSJ AGA
*in&ows QHVEJ *in&ows Ser"er '((), FeA d>R@ fg hUAB O} YqA> ABZ]CA f@A>
inati"e co&ek Lt Q>Z YP] *in&ows access token OT QR ABVo@ hrAB JwA Q>@jQ( 3j L^,
FeA J^ Q>t fg hUAB access token A\] Lt QeX LK@ QVWAB indo%sEdentit! OUJ -(
fm QHlA> F\] JSJ> Q>Z YP] *in&ows access token J>X A>?AB ABVo@ hrAB JU Q>t(
ng )ng WindowsGroupExample )i <' tr%nh &' cch ki. tra ngi )eng hin hnh cF l
thnh vi>n ca .t t6p cc nhF. @"nAow8 $c n>u t>n ha' kh4ng. Pc nhF. n' $c chJ
inh trong cc Di sD )kng lnhT &*n nh !t t>n .' t2nh8 t>n .in8 ha' BUILTIN gDi vi cc
nhF. @"nAow8 chuxnh vo trc t>n nhF..
538
Chng 13: Bfo ox`
using System;
using System.Security.Principal;
public class WindowsGroupExample {
public static void Main (string[] args) {

// Thu ly di tong WindowsIdentity
// m ta ngi dung hin hnh.
WindowsIdentity identity = WindowsIdentity.GetCurrent();

// Tao di tong WindowsPrincipal m ta cc kha nang bao mt
// cua di tong WindowsIdentity doc ch dnh.
WindowsPrincipal principal = new WindowsPrincipal(identity);

// Duyt qua cc di s dng lnh (tn nhm) v kim tra xem
// ngi dung hin hnh c l thnh vin cua mi nhm hay khng.
foreach (string role in args) {

Console.WriteLine("Is {0} a member of {1} = {2}",
identity.Name, role, principal.IsInRole(role));
}
}
}
HIu &*n ch*' v2 ) n' vi t cch ngi )eng cF t>n l nnbphuong81 tr>n .t .' t2nh cF
t>n l MACHINE &5ng lnh indo%s7roup0xample 6UE+)E=,#dministrators 6UE+)E=,Users
M#CHE=0,#ccountants8 kIt ;ut cF th nh sau\
Is MACHINEnnbphuong81 a member of BUILTINAdministrators = False
Is MACHINEnnbphuong81 a member of BUILTINUsers = True
Is MACHINEnnbphuong81 a member of MACHINEAccountants = True
14'
14' - n ch nh ng ng i d(ng no ' th c thi m# l nh c a ! n - n ch nh ng ng i d(ng no ' th c thi m# l nh c a ! n
#eA JwA >eA J>j A>?AB ABVo@ hrAB A\X L^ QHZ] vZPQ JSJ d>wA Qg QHXAB O} YqA>
Jbc FeA hnc QHCA QCA ABVo@ hrAB >c] JSJ Dc@ QHy O\ ABVo@ hrAB A\] Y\ Q>\A>
D@CA(
539
Chng 13: Bfo ox`
Sg hUAB YEd $!stem.$ecurit!./ermissions./rincipal/ermission D\ FRA fcX L_J
QaA> $!stem.$ecurit!./ermissions./rincipal/ermission#ttribute Jbc YEd A\] Lt
FRX Dq JSJ d>wA Qg QHXAB J>V[AB QHlA> Jbc FeA DE@ JSJ ]CZ JwZ >5S(
.NET Framework h# tr$ c '>u cNu =$* &/t &uc g"mKera/"Be =$* AemanAh v '>u cNu =$*
khai &o gAe)Dara/"Be =$* AemanAh. yp PrincipalPermission h# tr$ cc lnh &o .6t &/t
&uc8 v &n sao !c t2nh PrincipalPermissionAttribute ca lp n' h# tr$ cc lnh &o .6t
khai &o. Pc '>u cNu =$* sO )ng cG php giDng nh cc '>u cNu C>*8 nhng cc '>u cNu
=$* chJ r} t>n . ngi )eng hin hnh phi cF8 ho!c th4ng thng hMn l cc vai trk .
ngi )eng n' l thnh vi>n. "t '>u cNu =$* lnh cho & th=c thi ;Xt t>n v cc vai trk ca
ngi )eng hin hnh8 v nIu chGng kh4ng *t '>u cNu8 & th=c thi s@ nX. ngo*i l
System.Security.SecurityException.
lo*n .S )i <' tr%nh &' cG php ca .t '>u cNu &o .6t &/t &uc\
// C php cua mt yu cu bao mt bt buc da-trn-vai-tr.
public static void SomeMethod() {

PrincipalPermission perm =
new PrincipalPermission("UserName", "RoleName");

perm.Demand();

}
7rc ti>n8 &*n phi t*o .t Di t$ng PrincipalPermission chJ inh t>n ngi )eng v t>n
vai trk . &*n '>u cNu8 rti g0i phMng th:c Demand ca nF. L*n chJ cF th chJ inh .t t>n
ngi )eng v t>n vai trk cho .#i '>u cNu. HIu t>n ngi )eng ho!c t>n vai trk l null8 &t
k gi tri no c?ng s@ thVa .Sn '>u cNu. whc vi cc 9u'n tru' ;ut .S lnh8 .t '>u cNu
=$* kh4ng cho kIt 9u trong .t stack alkT & th=c thi chJ nh gi t>n ngi )eng v cc
vai trk ca ngi )eng hin hnh.
lo*n .S )i <' tr%nh &' cG php ca .t '>u cNu &o .6t khai &o\
// C php cua mt yu cu bao mt khai bo da-trn-vai-tr.
[PrincipalPermission(SecurityAction.Demand, Name = "UserName",
Role = "RoleName")]
public static void SomeMethod() { /.../}
L*n cF th tha' cc '>u cNu =$* khai &o C .:c lp ha' .:c thnh vi>n. Pc '>u cNu .:cz
lp p )ng cho tt c cc thnh vi>n ca lp trQ khi cF .t '>u cNu .:czthnhzvi>n chXp 1
'>u cNu .:czlp.
HFi chung8 &*n cF th t= ch0n hin th=c cc '>u cNu =$* &/t &uc ha' khai &o. 7u' nhi>n8
cc '>u cNu &o .6t &/t &uc cho phXp &*n t2ch h$p cc '>u cNu =$* vi logic ca .S lnh
th=c hin nhKng '>u cNu =$* ph:c t*p. Hgoi ra8 nIu kh4ng &iIt vai trk ha' t>n ngi )eng
'>u cNu lGc &i>n )ich8 &*n phi sO )ng cc '>u cNu &/t &uc. Pc '>u cNu =$* khai &o cF
thu6n l$i l chGng c l6p vi logic ca .S lnh v )r nh6n &iIt hMn. Hgoi ra8 &*n cF th
540
Chng 13: Bfo ox`
;(. cc '>u cNu =$* khai &o &5ng c4ng c PermB"ew.e2e gS $c tho lu6n trong .c
Z^.ah. Pho )e hin th=c '>u cNu =$* &/t &uc ha' khai &o8 &*n c?ng phi ch/c r5ng & th=c
thi cF th tru' ;ut t>n v cc vai trk ca ngi )eng hin hnh '>u cNu .t cch
phe h$p.
yp System.Threading.Thread .4 t .t tiu tr%nh ca h iu hnh gch*' .S lnh $cz
9unzlBh. 7huc t2nh tqnh CurrentPrincipal ca lp Thread ch:a .t th hin IPrincipalE
.4 t ngi )eng . tiu tr%nh hin ang ch*' tr>n )anh nghqa ca ngi n'. A .:c h iu
hnh8 .#i tiu tr%nh c?ng cF .t @"nAow8 a))e88 /oken kIt giaoE.4 t ti khon @"nAow8
. tiu tr%nh hin ang ch*' tr>n )anh nghqa ca ti khon n'. L*n cNn hiu r5ng th hin
IPrincipal v @"nAow8 a))e88 /oken l hai th=c th ri>ng &it. @"nAow8 sO )ng a))e88
/oken th=c hin cM chI &o .6t h iu hnh8 trong khi & th=c thi .NET sO )ng th hin
IPrincipal nh gi cc '>u cNu =$* C .:c :ng )ng. "!c )e chGng cF th .4 t ceng
.t ngi )eng8 nhng iu n' kh4ng cF nghqa l lu4n lu4n nh v6'.
7h(o .!c inh8 thuc t2nh Thread.CurrentPrincipal l kh4ng ;c inh. u% vic thu l' cc
th4ng tin li>n 9uan In ngi )eng cF th .t nhiu thi gian8 v chJ .t phNn nhV trong sD
cc :ng )ng sO )ng th4ng tin n'8 cc nh thiIt kI .NET ch0n cch khCi )=ng li Di vi
thuc t2nh CurrentPrincipal. 7rc ti>n8 .S lnh thu l' thuc t2nh
Thread.CurrentPrincipal8 & th=c thi gn .t th hin IPrincipal cho thuc t2nh n' th(o
logic sau <'\
Z. HIu .in :ng )ng . tiu tr%nh hin hnh ang th=c thi cF .t Kr"n)"KaD .!c inh8
th% & th=c thi s@ gn Kr"n)"KaD n' cho thuc t2nh Thread.CurrentPrincipal.
7h(o .!c inh8 .in :ng )ng kh4ng cF Kr"n)"KaD .!c inh. L*n cF th thiIt l6p
Kr"n)"KaD .!c inh ca .t .in :ng )ng &5ng cch g0i phMng th:c
SetThreadPrincipal tr>n .t Di t$ng System.AppDomain .4 t .in :ng )ng &*n
.uDn cu h%nh. l g0i SetPrincipalPolicy8 .S lnh ca &*n phi cF phNn tO
ControlPrincipal ca SecurityPermission. L*n chJ cF th thiIt l6p Kr"n)"KaD .!c inh
.t lNn cho .#i .in :ng )ngT li g0i SetThreadPrincipal th: hai )3n In ngo*i l
System.Security.Policy.PolicyException.
]. HIu .in :ng )ng kh4ng cF Kr"n)"KaD .!c inh8 ch2nh sch Kr"n)"KaD ca .in :ng
)ng s@ ;c inh hin th=c IPrincipal no s@ $c t*o ra v gn nF cho
Thread.CurrentPrincipal.
l cu h%nh ch2nh sch Kr"n)"KaD cho .t .in :ng )ng8 &*n cNn thu l' Di t$ng
AppDomain .4 t .in :ng )ng v g0i phMng th:c SetPrincipalPolicy ca Di t$ng
n'. RhMng th:c SetPrincipalPolicy nh6n vo .t thnh vi>n thuc kiu lit k>
System.Security.Principal.PrincipalPolicy8 gi tri n' cho &iIt kiu ca Di t$ng
IPrincipal s@ $c gn cho Thread.CurrentPrincipal. l g0i SetPrincipalPolicy8
.S lnh ca &*n phi cF phNn tO ControlPrincipal ca SecurityPermission. Lng Z^._
lit k> cc gi tri ca PrincipalPolicyT gi tri .!c inh l UnauthenticatedPrincipal.
^. HIu .S lnh ca &*n cF phNn tO ControlPrincipal ca SecurityPermission8 &*n cF th
t= t*o ra Di t$ng IPrincipal v tr=c tiIp gn nF cho thuc t2nh
541
Chng 13: Bfo ox`
Thread.CurrentPrincipal. uic n' s@ ngvn & th=c thi gn cc Di t$ng IPrincipal
.!c inh ho!c t*o ra cc Di t$ng .i )=a tr>n ch2nh sch Kr"n)"KaD.
Bfng 13'4 Cc thnh vin thuc kiu lit k PrincipalPolicy
Ttn `h~nh }itn ?i `f
NoPrincipal
wh4ng cF Di t$ng IPrincipal no $c t*o ra8
Thread.CurrentPrincipal tr v .t tha. chiIu
null.
UnauthenticatedPrincipal
"t Di t$ng System.Security.Principal.
GenericPrincipal r#ng $c t*o ra v $c gn
cho Thread.CurrentPrincipal.
WindowsPrincipal
"t Di t$ng WindowsPrincipal g.4 t ngi
)eng @"nAow8 S vng nh6ph $c t*o ra v
$c gn cho Thread.CurrentPrincipal.
Lt k sO )ng phMng php no thiIt l6p IPrincipal cho tiu tr%nh hin hnh8 &*n c?ng
phi l. nh thI trc khi sO )ng cc '>u cNu &o .6t =$*8 nIu kh4ng th4ng tin v ngi
)eng gIPrincipalh s@ kh4ng cF hiu l=c & th=c thi cF th ;O lB '>u cNu. L%nh thng8 khi
ch*' tr>n nn @"nAow88 &*n thiIt l6p ch2nh sch Kr"n)"KaD ca .t .in :ng )ng l
PrincipalPolicy.WindowsPrincipal thu l' th4ng tin v ngi )eng @"nAow8\
// Thu ly mt tham chiu dn min ng dng hin hnh.
AppDomain appDomain = System.AppDomain.CurrentDomain;

// Cu hnh min ng dng hin hnh sao cho su dng cc
// principal da-trn-Windows.
appDomain.SetPrincipalPolicy(
System.Security.Principal.PrincipalPolicy.WindowsPrincipal);
il( =oDe$a8eA*e)ur"/yE2amKDe.)8 gtrong qa PU 2nh k1.h .inh h0a cch sO )ng cc '>u
cNu =$* &/t &uc v khai &o. RhNn th: nht tr%nh &' &a phMng th:c $c &o v &5ng cc
'>u cNu =$* &/t &uc. HIu Di t$ng Thread.CurrentPrincipal kh4ng thVa cc ki hVi v t>n
ngi )eng v t cch thnh vi>n8 '>u cNu s@ nX. ngo*i l SecurityException.
public static void ProtectedMethod1() {

// Mt yu cu bao mt bt buc da-trn-vai-tr: principal
// hin hnh m ta mt dnh danh vi tn l "nnbphuong81",
// cc vai tr cua principal l khng quan trong.
System.Security.Permissions.PrincipalPermission perm =
new System.Security.Permissions.PrincipalPermission
(@"MACHINEnnbphuong81", null);

perm.Demand();
542
Chng 13: Bfo ox`
}
public static void ProtectedMethod2() {
// Mt yu cu bao mt bt buc da-trn-vai-tr: principal
// hin tai l mt thnh vin cua vai tr "Managers" hay
// "Developers". Khi su dng PrincipalPermission, ban ch c th din
// ta mi quan h OR. l v phng thc PrincipalPolicy.Intersect
// lun tra v mt quyn rng tru khi hai input l nh nhau.
// Tuy nhin, ban c th su dng lgic cua m lnh d hin thc
// cc diu kin phc tap hn. Trong trng hop ny, tn cua dnh
// danh l khng quan trong.
System.Security.Permissions.PrincipalPermission perm1 =
new System.Security.Permissions.PrincipalPermission
(null, @"MACHINEManagers");
System.Security.Permissions.PrincipalPermission perm2 =
new System.Security.Permissions.PrincipalPermission
(null, @"MACHINEDevelopers");
perm1.Union(perm2).Demand();
}
public static void ProtectedMethod3() {
// Mt yu cu bao mt bt buc da-trn-vai-tr: principal
// hin tai m ta mt dnh danh vi tn l "nnbphuong81" v
// l mt thnh vin cua vai tr "Managers".
System.Security.Permissions.PrincipalPermission perm =
new System.Security.Permissions.PrincipalPermission
(@"MACHINEnnbphuong81", @"MACHINEManagers");

perm.Demand();
}
RhNn th: hai tr%nh &' &a phMng th:c $c &o v &5ng cc '>u cNu =$* khai &o8 tMng
Mng vi cc '>u cNu =$* &/t &uc vQa $c tr%nh &' C tr>n\
543
Chng 13: Bfo ox`
// Mt yu cu bao mt khai bo da-trn-vai-tr: principal hin tai
// m ta mt dnh danh vi tn l "nnbphuong81", cc vai tr cua
// principal l khng quan trong.
[PrincipalPermission(SecurityAction.Demand,
Name = @"MACHINEnnbphuong81")]
public static void ProtectedMethod1() { /.../}
// Mt yu cu bao mt khai bo da-trn-vai-tr: principal hin tai
// l mt thnh vin cua vai tr "Managers" hay "Developers". Ban ch
// c th din ta mi quan h OR (khng th din ta mi quan h AND).
// Tn cua dnh danh l khng quan trong.
[PrincipalPermission(SecurityAction.Demand,
Role = @"MACHINEManagers")]
[PrincipalPermission(SecurityAction.Demand,
Role = @"MACHINEDevelopers")]
public static void ProtectedMethod2() { /.../}
// Mt yu cu bao mt khai bo da-trn-vai-tr: principal hin tai
// m ta mt dnh danh vi tn l "nnbphuong81" v l mt thnh vin
// cua vai tr "Managers".
[PrincipalPermission(SecurityAction.Demand,
Name = @"MACHINEnnbphuong81",
Role = @"MACHINEManagers")]
public static void ProtectedMethod3() { /.../}
15'
15' 3i nh n ng i d(ng Windows 3i nh n ng i d(ng Windows
#eA OZKA O} YqA> Jbc FeA J>e] QHXAB AB? JRA> Jbc OIQ ABVo@ hrAB *in&ows
A\X L^ J>~ s>TAB d>R@ Q\@ s>XRA ABVo@ hrAB >@qA LcAB QaJ> JnJ(
T>Z YP] LK@ QVWAB $!stem.$ecurit!./rincipal.indo%sEdentit! OT QR ABVo@
hrAB *in&ows O\ FeA JwA B@R A>NA, H@ B@ d>V[AB Q>~J Empersonate Jbc LK@
QVWAB indo%sEdentit!(
"#i tiu tr%nh @"nAow8 u cF .t a))e88 /oken kIt giaoE.4 t ti khon @"nAow8 . tiu
tr%nh hin ang ch*' tr>n )anh nghqa ca ti khon n'. n iu hnh @"nAow8 sO )ng
a))e88 /oken ;c inh .t tiu tr%nh cF cc 9u'n th2ch ng th=c hin cc thao tc
$cz&ozv tr>n )anh nghqa ca ti khon n' ha' kh4ng8 nh 0c,ghi fil(8 khCi ng l*i h
thDng8 v tha' si thi gian h thDng.
7h(o .!c inh8 .t :ng )ng $cz9unzlB ch*' trong ngK cnh ca ti khon @"nAow8 S
th=c thi :ng )ng. liu n' l hon ton &%nh thng8 nhng 4i lGc &*n .uDn ch*' :ng
544
Chng 13: Bfo ox`
)ng trong ngK cnh ca .t ti khon @"nAow8 khc. liu n' Gng trong trng h$p cc
:ng )ng ph2a s(rv(r cNn ;O lB phi>n giao )ich )=a tr>n )anh nghqa ca cc ngi )eng kIt
nDi In s(rv(r. 7h4ng thng8 .t :ng )ng s(rv(r ch*' trong ngK cnh ca ti khon
@"nAow8 $c t*o ri>ng cho :ng )ngE<' l ti khon )ich v g8erB")e a))oun/h. 7i khon
)ich v n' s@ cF cc 9u'n tDi thiu tru' ;ut cc ti ngu'>n h thDng8 l. cho :ng )ng
ho*t ng nh th F l ngi )eng S kIt nDi cho phXp :ng )ng tru' ;ut cc ho*t ng v
ti ngu'>n phe h$p vi 9u'n h*n ca ngi )eng F. whi .t :ng )ng n/. l' inh )anh
ca .t ngi )eng khc8 <' l s= gi nh6n g"mKer8ona/"onh. HIu $c hin th=c Gng8 s=
gi nh6n s@ Mn gin hFa vic 9un tri &o .6t v thiIt kI :ng )ng8 trong khi v3n )u' tr% vic
gii tr%nh ngi )eng.
N>V L} Q>RX YZNA QHXAB OUJ -(, *in&ows access token D\ .NET principal Jbc
OIQ Q@tZ QHlA> Y\ JSJ Q>nJ Q>t H@CAB F@qQ D\ J^ Q>t OT QR A>?AB ABVo@ hrAB s>SJ
A>cZ( 3 Q>ZNQ B@R A>NA LVWJ OT QR QHXAB OUJ A\] J> Q>c] L@ *in&ows access
token Jbc Q@tZ QHlA> >@qA >\A>, J>~ s>TAB Q>c] L@ principal Jbc Q@tZ QHlA> A\](
!t Q>c] L@ principal Jbc Q@tZ QHlA>, O} YqA> Jbc FeA d>R@ J^ d>wA Qg
Control/rincipal Jbc $ecurit!/ermission D\ BSA OIQ LK@ QVWAB
$!stem.$ecurit!./rincipal.E/rincipal OE@ D\X Q>ZIJ QaA> Current/rincipal Jbc
$!stem.).reading.).read >@qA >\A>(
yp System.Security.Principal.WindowsIdentity cung cp cc ch:c nvng . th4ng 9ua F8
&*n cF th th=c hin s= gi nh6n. 7u' nhi>n8 9u tr%nh n' te' thuc vo :ng )ng ca &*n
ang ch*' tr>n phi>n &n @"nAow8 no. 7r>n @"nAow8 *erBer 200C trC v sau8 lp
WindowsIdentity h# tr$ cc phi>n &n n*p ca chtng phMng th:c khCi )=ng8 cho phXp t*o ra
cc Di t$ng WindowsIdentity )=a tr>n t>n ti khon ca ngi )eng cNn gi nh6n. 7r>n tt
c cc phi>n &n @"nAow8 trc F8 trc hIt &*n phi thu l' System.IntPtr ch:a tha.
chiIu In @"nAow8 a))e88 /oken .4 t ngi )eng cNn gi nh6n. l thu l' tha. chiIu n'8
&*n cNn sO )ng .t phMng th:c ngu'>n sinh nh LogonUser ca @"nC2 >P<.
VPA LG J>b ]jZ s>@ Q>nJ >@qA fn B@R A>NA QHCA *in&ows '((( D\ *in&ows NT Y\
OIQ Q\@ s>XRA d>R@ J^ L_J Z]GA SENTC5NN;ME Q>l OE@ J^ Q>t Q>nJ Q>@
+ogonUser( !@GZ A\] Ly@ >@ FeA JPZ >lA> J>aA> fSJ> FRX ONQ Jbc *in&ows D\
JPd J>X Q\@ s>XRA Z]GA ;ct as part of operating s:stem iO~J Q@A JN] HPQ JcXk(
#eA LAB FcX B@o QHnJ Q@jd JPd L_J Z]GA SENTC5NN;ME J>X JSJ Q\@ s>XRA
ABVo@ hrAB(
"t khi S cF Di t$ng WindowsIdentity .4 t ngi )eng cNn gi nh6n8 &*n hS' g0i
phMng th:c Impersonate ca nF. 7Q lGc n'8 tt c cc hnh ng . .S lnh ca &*n th=c
hin u )irn ra trong ngK cnh ca ti khon @"nAow8 S $c gi nh6n. RhMng th:c
Impersonate tr v Di t$ng System.Security.Principal.WindowsSecurityContext8 Di
t$ng n' .4 t ti khon t2ch c=c trc khi gi nh6n. l trC v ti khon c?8 &*n cNn g0i
phMng th:c Undo ca Di t$ng WindowsSecurityContext n'.
ng )ng )i <' tr%nh &' s= gi nh6n ca .t ngi )eng @"nAow8. ng )ng n' cNn
hai Di sD )kng lnh\ t>n ti khon ca ngi )eng cNn gi nh6n v passor) ca ti khon.
545
Chng 13: Bfo ox`
ng )ng n' sO )ng h. LogonUser ca @"nC2 >P< thu l' @"nAow8 a))e88 /oken cho
ngi )eng $c chJ inh8 gi nh6n ngi )eng n'8 rti trC v ngK cnh ca ngi )eng c?.
u2 )8 lnh Empersonation0xample nnbp.uongg? pass%ord s@ gi nh6n ngi )eng
nnbphuong81 nIu ngi )eng F S ttn t*i trong cM sC )K liu ti khon cc &.
using System;
using System.IO;
using System.Security.Principal;
using System.Security.Permissions;
using System.Runtime.InteropServices;
// Bao dam assembly c quyn truy xut m lnh khng-doc-quan-l
// v c quyn kim sot principal cua tiu trnh.
[assembly:SecurityPermission(SecurityAction.RequestMinimum,
UnmanagedCode=true, ControlPrincipal=true)]
public class ImpersonationExample {
// nh ngha cc hng s doc su dng cung vi hm LogonUser.
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_INTERACTIVE = 2;
// Nhp hm Win32 LogonUser tu advapi32.dll. Ch dnh
// "SetLastError = true" d c th truy xut cc m li cua 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) {
// Tao mt IntPtr mi d gi ly access token
// do hm LogonUser tra v.
IntPtr accessToken = IntPtr.Zero;

// Goi LogonUser d thu ly access token cho ngi dung
// doc ch dnh. Bin accessToken doc truyn cho LogonUser
// bng tham chiu v s cha tham chiu dn Windows access token
// nu LogonUser thnh cng.
int result = LogonUser(
546
Chng 13: Bfo ox`
args[0], // tn ngi dung d dang nhp
".", // su dng CSDL ti khoan cc b
args[1], // password cua ngi dung
LOGON32_LOGON_INTERACTIVE, // tao mt interactive login
LOGON32_PROVIDER_DEFAULT, // su dng logon provider mac dnh
ref accessToken // nhn access token handle
);

// Nu li xay ra (LogonUser tra v zero), hin th li v thot.
if (result == 0) {
Console.WriteLine("LogonUser returned error {0}",
Marshal.GetLastWin32Error());

} else {

// Tao mt WindowsIdentity mi tu Windows access token.
WindowsIdentity identity = new WindowsIdentity(accessToken);

// Hin th dnh danh dang tch cc (trc khi gia nhn).
Console.WriteLine("Identity before impersonation = {0}",
WindowsIdentity.GetCurrent().Name);
// Gia nhn ngi dung d doc ch dnh. i tong
// WindowsImpersonationContext cha cc thng tin
// cn thit d tro v ng canh cua ngi dung c.
WindowsImpersonationContext impContext =
identity.Impersonate();
// Hin th dnh danh dang tch cc (trong lc gia nhn).
Console.WriteLine("Identity during impersonation = {0}",
WindowsIdentity.GetCurrent().Name);
//
// Thc hin cc hnh dng vi danh ngha ngi dung doc gia nhn
//
547
Chng 13: Bfo ox`
// Tro v ngi dung Windows c bng di tong
// WindowsImpersonationContext.
impContext.Undo();as
// Hin th dnh danh dang tch cc (sau khi gia nhn).
Console.WriteLine("Identity after impersonation = {0}",
WindowsIdentity.GetCurrent().Name);
}
}
}
14
548
Ch01n2 3R4/hT /l
549
550
Chng 14: ?x` op
6t .S g)ryK/ograKhyh l .t trong nhKng .!t ph:c t*p nht ca 9u tr%nh pht
trin phNn .. . &t k nh pht trin no c?ng s@ sO )ng. yB thu'It k thu6t
.6t .S hin *i c=c k khF hiu v ki hVi .t .:c kiIn th:c ton h0c . tMng
Di 2t ngi cF $c. "a' ./n l th vin lp .NET Framework cung cp cc hin th=c )r sO
)ng cho hNu hIt cc k thu6t .6t .S th4ng )ng v h# tr$ cc gii thu6t phs &iIn nht.
PhMng n' s@ &n v cc vn sau\
"
7*o sD ng3u nhi>n g.c Z_.Zh.
7*o v ;c .inh cc .S &v. .6t .S v cc .S &v. cF khFa g.c Z_.]8 Z_.^8 Z_._8 v
Z_.`h.
|O )ng gii thu6t Di ;:ng v kh4ng Di ;:ng .6t hFa v gii .6t hFa )K liu
g.c Z_.a v Z_.bh.
7%. l*i8 lu trK8 v chu'n si cc khFa .6t .S g.c Z_.[8 Z_.c8 v Z_.Zdh.
3>@ AB> JSJ> Sd hUAB JSJ s Q>ZNQ QHXAB J>V[AB A\] D\X O} YqA>, FeA ACA A>E
H`AB ONQ O} J>AB d>R@ Y\ JS@ O\ FeA >@qA Q>nJ L[A Y( MNQ O} s>TAB ABcAB
F`AB DE@ FRX ONQ isec%rit:k fg hUAB ONQ O} J> Y\ OIQ d>wA A> QHXAB D@qJ QeX
OIQ B@R@ d>Sd cA QX\A(
lDi vi nhKng ai cha 9u(n thuc vi .6t .S8 )i <' l inh nghqa ca .t sD tQ 9uan
tr0ng\
Encr:pt gng tQ8 t*. )ich l .6t hFah l .S hFa th4ng tin th(o cch no F .0i
ngi kh4ng th 0c $c nF8 trQ nhKng ai cF khFa.
ecr:pt gng tQ8 t*. )ich l gii .6t hFah l gii .S th4ng tin Sz$cz.6tzhFa.
!e: l chu#i cc &it )eng .6t hFa v gii .6t hFa th4ng tin.
,lainte8t l t(;t chaz$cz.6tzhFa ha' Sz$czgiiz.6tzhFa.
Cipherte8t l t(;t Sz$cz.6tzhFa.
1'
1' T o s ng u nhin $ T o s ng u nhin $
#eA JwA QeX OIQ fK ABpZ A>@CA hrAB J>X JSJ ~AB hUAB ONQ O} D\ FRX ONQ(
Sg hUAB OIQ FI QeX fK ABpZ A>@CA ONQ O} icr:ptographic ran&om n%m9er
generatork, J>AB >eA $!stem.$ecurit!.Cr!ptograp.!.&=7Cr!pto$ervice/rovider(
yp System.Random l .t & t*o sD gi ng3u nhi>n8 nF sO )ng .t gii thu6t ton h0c .4
phVng vic t*o sD ng3u nhi>n. 7h=c ra8 gii thu6t n' l tt inh gAe/erm"n"8/")h8 nghqa l &*n
lu4n cF th t2nh $c sD kI tiIp s@ l g% )=a tr>n sD S $c t*o trc F. liu n' nghqa l
cc sD $c t*o &Ci lp Random s@ kh4ng phe h$p khi t2nh &o .6t $c u ti>n8 ch~ng h*n t*o
khFa .6t hFa v passor).
whi cNn .t sD ng3u nhi>n kh4ng tt inh gnonAe/erm"n"8/")h )eng trong cc :ng )ng li>n
9uan In .6t .S ha' &o .6t8 &*n phi sO )ng & t*o sD ng3u nhi>n )3n ;ut tQ lp
551
Chng 14: ?x` op
System.Security.Cryptography.RandomNumberGenerator. l<' l .t lp trQu t$ng . tt c
cc & t*o sD ng3u nhi>n c th u s@ thQa kI tQ nF. nin t*i8 chJ cF .t hin th=c l lp
RNGCryptoServiceProvider. yp n' cung cp .t vV &0c $cz9unzlB cho h.
CryptGenRandom ca @"nC2 CryK/o>P<8 v &*n cF th sO )ng s vo .t .ng &'t( cc
gi tri &'t( ng3u nhi>n.
CSJ fK hX &=7Cr!pto$ervice/rovider f@A> Hc s>TAB Q>NQ fn ABpZ A>@CA( TZ]
A>@CA, J>AB Lb ABpZ A>@CA Lt LSd ~AB ]CZ JwZ J>X JSJ ~AB hUAB ONQ O} D\
FRX ONQ QHXAB >wZ >jQ JSJ OT@ QHVoAB J>aA> d>b D\ Q>V[AB Oe@(
yp cM sC RandomNumberGenerator l .t ?a)/ory cho cc lp hin th=c )3n ;ut tQ F. p0i
RandomNumberGenerator.Create("System.Security.Cryptography.RNGCryptoServiceProvider")
s@ tr v .t th hin ca RNGCryptoServiceProvider8 v &*n cF th sO )ng nF t*o sD
ng3u nhi>n. Hgoi ra8 v% RNGCryptoServiceProvider l hin th=c )u' nht n>n nF s@ l lp
.!c inh $c t*o ra khi &*n g0i phMng th:c Create kh4ng cF Di sD\
RandomNumberGenerator.Create().
u2 ) )i <' t*o .t Di t$ng RNGCryptoServiceProvider v sO )ng nF t*o cc gi tri
ng3u nhi>n. RhMng th:c GetBytes s vo .t .ng &'t( cc gi tri &'t( ng3u nhi>n. L*n cF
th sO )ng phMng th:c GetNonZeroBytes nIu cNn )K liu ng3u nhi>n kh4ng ch:a gi tri
o(ro.
using System;
using System.Security.Cryptography;
public class SecureRandomNumberExample {
public static void Main() {

// Tao mang byte dung d lu tr d liu ngu nhin.
byte[] number = new byte[32];

// Tao b tao s ngu nhin mac dnh.
RandomNumberGenerator rng = RandomNumberGenerator.Create();

// Tao d liu ngu nhin.
rng.GetBytes(number);

// Hin th d liu ngu nhin.
Console.WriteLine(BitConverter.ToString(number));
}
}
552
Chng 14: ?x` op
N>?AB Ax YnJ QaA> QXSA JwA Q>@jQ Lt QeX OIQ fK ABpZ A>@CA DE@
&=7Cr!pto$ervice/rovider YEA >[A A>@GZ fX DE@ &andom( !K@ DE@ OUJ LaJ> Q>VoAB
AB\], fg hUAB &=7Cr!pto$ervice/rovider Y\ ZS O~J JwA Q>@jQ( #eA ACA vO vQ
fK YVWAB fK ABpZ A>@CA JwA QeX D\ OUJ LaJ> Jbc JSJ fK A\] QHVEJ s>@ Z]jQ LMA>
fg hUAB &=7Cr!pto$ervice/rovider( Sg hUAB YEd &=7Cr!pto$ervice/rovider ZS
O~J D\ s>TAB JwA Q>@jQ J^ Q>t RA> >VAB LSAB st YCA >@qZ AAB Jbc ~AB hUAB(
2' 2' T7nh m# !4m c a %assword T7nh m# !4m c a %assword
#eA JwA YVZ QH? dcffXHh Jbc ABVo@ hrAB OIQ JSJ> cA QX\A Lt FeA J^ Q>t fg
hUAB A^ Lt vSJ Q>nJ ABVo@ hrAB L^ QHXAB QV[AB Yc@(
!AB YVZ QH? dcffXHh Jbc ABVo@ hrAB heAB dYc@AQvQ Dl L] Y\ OIQ ABZ] J[
FRX ONQ YEA( T>c] D\X L^, >}] QeX D\ YVZ QH? OIQ O} FO Jbc dcffXHh F`AB
OIQ YEd B@R@ Q>ZNQ FO hpA vZPQ Q YEd
$!stem.$ecurit!.Cr!ptograp.!.Has.#lgorit.m( 3>@ vSJ Q>nJ, QeX O} FO Jbc
dcffXHh D\ fX fSA> A^ DE@ O} FO L} LVWJ YVZ QH?(
Pc gii thu6t &v. l cc h. .6t .S .t chiu8 nh6n plaint(;t cF chiu )i tha' si v t*o
.t gi tri sD cF k2ch thc cD inh. PhGng l .t chiu v% gNn nh kh4ng th t%. l*i
plaint(;t gDc tQ .S &v.. Pc gii thu6t &v. l tt inh gAe/erm"n"8/")hT p )ng ceng gii
thu6t &v. cho .t .xu plaint(;t lu4n t*o ra ceng .S &v.. liu n' khiIn .S &v. trC n>n
hKu 2ch cho vic ;c inh hai khDi plaint(;t gtrong trng h$p n' l passor)h cF giDng
nhau ha' kh4ng. "c 2ch ca cc gii thu6t &v. &o . r5ngE.!c )e kh4ng phi kh4ng
;' raEkh nvng hai .xu plaint(;t khc nhau t*o ra ceng .S &v. l c=c k nhV. Hgoi ra8
kh4ng cF .Di tMng 9uan no giKa s= giDng nhau ca hai .xu plaint(;t v .S &v. ca
chGngT .t khc &it nhV trong plaint(;t c?ng cF th g<' ra khc &it ng k trong .S &v..
whi sO )ng passor) ;c th=c .t ngi )eng8 &*n kh4ng 9uan t<. In ni )ung ca
passor) )o ngi )eng nh6p vo. L*n chJ cNn &iIt r5ng passor) $c nh6p treng khp vi
passor) . &*n S ghi l*i cho ngi )eng F trong cM sC )K liu ti khon. Ln cht ca cc
gii thu6t &v. khiIn chGng trC n>n lB tCng trong vic lu trK passor) .t cch an ton.
whi ngi )eng cung cp .t passor) .i8 &*n phi t*o .S &v. ca passor) v lu trK
.S &v. n'8 rti lo*i &V passor) )*ng t(;t. "#i khi ngi )eng ;c th=c vi :ng )ng ca
&*n8 t2nh .S &v. ca passor) )o ngi F cung cp v so snh nF vi .S &v. . &*n S
lu trK.
NBVo@ Qc Q>VoAB >@ JSJ> Q>Z YP] dcffXHh Q OIQ O} FO( V\ JZ QHR Yo@ Y\
s>TAB Q>t( MUJ LaJ> Jbc O} FO Y\ L^AB Dc@ QHy A>V OIQ QXsA D\ FeA J^ Q>t
Qr] YVZ QH? A^ O\ s>TAB f@A> Hc Yx >AB FRX ONQ A\X( NjZ ABVo@ hrAB ZCA
dcffXHh, FeA s>TAB Q>t QlO Ye@ A^ Q O} FO L} LVWJ YVZ QH? FeA d>R@ HfQ
Q\@ s>XRA A\] Q>\A> B@S QHM O_J LMA> A\X L^, >X_J QeX OIQ dcffXHh OE@ J>X
ABVo@ hrAB(
553
Chng 14: ?x` op
yp trQu t$ng HashAlgorithm cung cp lp cM sC tt c cc hin th=c gii thu6t &v. c
th )3n ;ut tQ F. 7h vin lp .NET Framework cF su hin th=c gii thu6t &v. c th
g$c lit k> trong &ng Z_.Zh8 .#i lp hin th=c l .t thnh vi>n ca kh4ng gian t>n
System.Security.Cryptography. Pc lp vi phNn u4i l CryptoServiceProvider &0c l' cc
ch:c nvng )o @"nC2 CryK/o>P< cung cp8 trong khi cc lp vi phNn u4i l Managed $c
hin th=c hon ton &5ng .S lnh $cz9unzlB.
Bfng 14'1 Cc hin thuc gii thut bm
Ttn gifi `hux` Ttn mrs Yhch `hrc op o i`
&EW
MD5CryptoServiceProvider
Z]b
*;> ha' *;>1
SHA1CryptoServiceProvider
Zad
*;>1&anageA
SHA1Managed
Zad
*;>2WY ha' *;>I2WY
SHA256Managed
]`a
*;>CUG ha' *;>ICUG
SHA384Managed
^b_
*;>W12 ha' *;>IW12
SHA512Managed
`Z]
"!c )e &*n cF th tr=c tiIp t*o ra th hin ca cc lp gii thu6t &v.8 lp cM sC
HashAlgorithm l .t ?a)/ory cho cc lp hin th=c )3n ;ut tQ nF. p0i phMng th:c tqnh
HashAlgorithm.Create vi Di sD l t>n gii thu6t s@ tr v .t Di t$ng thuc kiu S $c
chJ inh. |O )ng ?a)/ory cho phXp &*n ghi .S lnh tsng 9ut v .S lnh n' cF th l. vic
vi &t k hin th=c gii thu6t &v. no.
"t khi &*n S cF Di t$ng HashAlgorithm8 phMng th:c ComputeHash ca nF nh6n .t .ng
&'t( ch:a plaint(;t v tr v .t .ng &'t( .i ch:a .S &v. $c t*o ra. Lng Z_.Z cho &iIt
k2ch thc ca .S &v. gt2nh &5ng &ith $c t*o ra &Ci .#i lp gii thu6t &v..
yp HashPasswordExample )i <' tr%nh &' cch t*o .S &v. tQ .t chu#i gpassor) ch~ng
h*nh. ng )ng n' cNn hai Di sD )kng lnh\ t>n ca gii thu6t &v. cNn sO )ng v chu#i cNn
t*o .S &v.. u% phMng th:c HashAlgorithm.ComputeHash '>u cNu .t .ng &'t( n>n trc
hIt &*n phi .S hFa chu#i nh6p &5ng lp System.Text.Encoding glp n' cung cp cc cM chI
)eng chu'n chu#i thnh,tQ cc inh )*ng .S hFa kB t= khc nhauh.
using System;
using System.Text;
using System.Security.Cryptography;
public class HashPasswordExample {

public static void Main(string[] args) {
// Tao HashAlgorithm cua kiu doc ch dnh boi
// di s dng lnh th nht.
using (HashAlgorithm hashAlg = HashAlgorithm.Create(args[0])) {
554
Chng 14: ?x` op
// Chuyn chui password (di s dng lnh th hai)
// thnh mt mang byte.
byte[] pwordData = Encoding.Default.GetBytes(args[1]);

// Tao m bam cua password.
byte[] hash = hashAlg.ComputeHash(pwordData);

// Hin th m bam cua password.
Console.WriteLine(BitConverter.ToString(hash));
}
}
}
Ph*' lnh Has./ass%ord0xample $H#? ).isEsM!/ass%ord s@ hin thi .S &v. sau <'\
80-36-31-2F-EA-D9-93-45-9-34-C9-FD-21-EE-8D-05-16-DC-A1-E2
3'
3' T7nh m# !4m c a $ile T7nh m# !4m c a $ile
#eA JwA vSJ LMA> AI@ hZAB Jbc OIQ @Y J^ Q>c] L@ Q>X Q>o@ B@cA >c] s>TAB(
TeX O} FO J>X AI@ hZAB Jbc @Y F`AB d>V[AB Q>~J ComputeHas. Jbc YEd
$!stem.$ecurit!.Cr!ptograp.!.Has.#lgorit.m( LVZ QH? O} FO A\] Lt fcZ A\]
fX fSA> DE@ JSJ O} FO LVWJ QeX OE@(
Hgoi vic cho phXp &*n lu trK passor) .t cch an ton gS $c tho lu6n trong .c
Z_.]h8 .S &v. ckn cung cp .t phMng cch rt ha' ;c inh .t fil( cF tha' si ha'
kh4ng. L5ng cch t2nh ton v lu trK .S &v. ca .t fil(8 sau n' &*n cF th t2nh l*i .S
&v. ca fil( n' ;c inh fil( cF tha' si trong thi gian chu'n tiIp ha' kh4ng. pii thu6t
&v. s@ sinh ra .t .S &v. rt khc nga' c chJ vi .t tha' si rt nhV trong fil(8 n>n kh
nvng hai fil( khc nhau cho ra ceng .S &v. l c=c k nhV.
CSJ O} FO J>ZA s>TAB d>r >Wd s>@ Bg@ JrAB DE@ OIQ @Y Lt FRX LRO QaA>
QX\A DA Jbc AI@ hZAB @Y( NjZ c@ L^ J>_A LVWJ @Y QHCA LVoAB L@, ABVo@ A\] J^
Q>t hu h\AB Q>c] L@ @Y D\ QaA> Ye@ O} FO( C>AB Qc fm Q>RX YZNA OIQ F@jA Q>t
Jbc O} FO QHXAB OUJ ( iO} FO J^ s>^ck, O} FO A\] d>r >Wd J>X D@qJ
FRX LRO QaA> QX\A DA Jbc @Y QHCA LVoAB L@(
Ur )ng t*o $c .S &v. ca .t fil( vi lp HashAlgorithm. 7rc hIt8 th hin hFa .t
trong cc hin th=c gii thu6t &v. )3n ;ut tQ lp HashAlgorithm g&*n cNn tru'n t>n gii
thu6t &v. cho phMng th:c HashAlgorithm.CreateE;(. t>n cc gii thu6t &v. h$p l trong
&ng Z_.Zh. wI tiIp8 tha' v% tru'n .t .ng &'t( cho phMng th:c ComputeHash8 &*n hS'
tru'n .t Di t$ng System.IO.Stream .4 t fil( cNn $c t*o .S &v.. lDi t$ng
555
Chng 14: ?x` op
HashAlgorithm ;O lB 9u tr%nh 0c )K liu tQ Stream v tr v .t .ng &'t( ch:a .S &v.
cho fil(.
yp HashStreamExample )i <' tr%nh &' cch t*o .S &v. tQ .t fil(. L*n phi chJ inh t>n
gii thu6t &v. v t>n fil( l. Di sD )kng lnh8 v2 ) Has.$tream0xample $H#?
Has.$tream0xample.cs.
using System;
using System.IO;
using System.Security.Cryptography;
public class HashStreamExample {
public static void Main(string[] args) {
// Tao mt HashAlgorithm vi kiu doc ch dnh trong
// di s dng lnh th nht.
using (HashAlgorithm hashAlg = HashAlgorithm.Create(args[0])) {
// Mo mt FileStream cho file doc ch dnh trong
// di s dng lnh th hai.
using (Stream file = new FileStream(args[1],
FileMode.Open)) {

// Tao m bam cho ni dung cua file.
byte[] hash = hashAlg.ComputeHash(file);

// Hin th m bam.
Console.WriteLine(BitConverter.ToString(hash));
}
}
}
}
4'
4' .i m tra m# !4m .i m tra m# !4m
#eA JwA vSJ O@A> OIQ dcffXHh >X_J vSJ A>NA OIQ @Y DpA s>TAB Q>c] L@ F`AB
JSJ> fX fSA> >c@ O} FO(
C>Z]tA JR O} FO J D\ OE@ Q>\A> J>Zx@ Q>Nd YUJ d>A, J>Zx@ 5ase@4, >c]
ORAB F]Q D\ fX fSA> J>AB(
556
Chng 14: ?x` op
L*n cF th sO )ng .S &v. ;c inh hai .xu )K liu cF giDng nhau ha' kh4ng8 kh4ng
phi lu trK ha' )u' tr% vic tru' ;ut In )K liu gDc. l ;c inh )K liu cF tha' si th(o
thi gian ha' kh4ng8 &*n phi t*o v lu trK .S &v. ca )K liu gDc. |au F8 hS' t*o .t .S
&v. khc cho )K liu n' rti so snh .S &v. c? v .i cho th' cF tha' si no ;' ra
ha' kh4ng. linh )*ng ca .S &v. gDc s@ ;c inh cch th:c phe h$p nht ki. tra .S
&v. .i $c t*o.
N>@GZ OUJ QHXAB J>V[AB A\] fg hUAB d>V[AB Q>~J )o$tring Jbc YEd
$!stem.6itConverter Lt J>Z]tA ORAB F]Q Q>\A> B@S QHM J>Zx@ Q>Nd YUJ d>A s>@
>@tA Q>M( M_J hr hu fg hUAB D\ Q>aJ> >Wd J>X OUJ LaJ> >@tA Q>M, FeA J^ Q>t A>NA
Q>P] JSJ> A\] s>TAB d>r >Wd s>@ YVZ QH? O} FO Dl A^ L_Q hPZ BeJ> AK@ i6k B@?c
Ox@ B@S QHM F]Q iDa hU, G-<hN<D#<CN<k( NBX\@ Hc, YEd 6itConverter s>TAB JZAB
JPd d>V[AB Q>~J A\X Lt d>A QaJ> OIQ F@tZ h@uA J>Zx@ A>V Q>j QH DG OIQ ORAB
F]Q(
"S &v. thng $c lu trK trong fil( t(;t C )*ng chu#i th6p lc ph<n gv2 )8
89D2221310A9CFF09A392F00E2C6C4EDC1B0EF9h ho!c chu#i $c .S hFa th(o $a8eYG gv2 )8
idIiExcKnP8Jo5LwDixsTtwbDvk=h. "S &v. c?ng cF th $c lu trK trong cM sC )K liu C )*ng
gi tri &'t( th4. Lt k &*n lu trK .S &v. th(o cch no8 &c Nu ti>n khi so snh .S &v.
c? v .i l a chGng v .t )*ng chung.
lo*n .S )i <' chu'n .S &v. .i g.ng &'t(h thnh chu#i th6p lc ph<n khi so snh vi
.S &v. c?. Hgoi phMng th:c BitConverter.ToString . chGng ta S tho lu6n C tr>n8 th
vin lp .NET Framework kh4ng cung cp phMng th:c no chu'n .t .ng &'t( thnh
chu#i th6p lc ph<n. L*n phi viIt .t vkng l!p i 9ua cc phNn tO ca .ng &'t(8 chu'n
.#i &'t( thnh chu#i8 v g/n chu#i n' vo &iu )irn chu#i th6p lc ph<n ca .S &v.. |O
)ng System.Text.StringBuilder s@ trnh t*o ra cc chu#i .i kh4ng cNn thiIt .#i khi vkng
l!p g/n gi tri &'t( kI tiIp vo chu#i kIt 9u g;(. .c ].Z &iIt th>. chi tiIth.
// Phng thc dung d so snh m bam mi vi
// m bam c san (doc biu din o dang chui thp lc phn).
private static bool VerifyHexHash(byte[] hash, string oldHashString) {

// Tao biu din chui cho m bam mi.
System.Text.StringBuilder newHashString =
new System.Text.StringBuilder(hash.Length);

foreach (byte b in hash) {
newHashString.AppendFormat("{0:X2}", b);
}

// So snh biu din chui cua m bam c v mi,
// v tra v kt qua.
557
Chng 14: ?x` op
return (oldHashString == newHashString.ToString());
}
7rong o*n .S )i <'8 .S &v. .i l .t .ng &'t( v .S &v. c? l .t chu#i $c .S
hFa th(o $a8eYG. lo*n .S n' s@ .S hFa .S &v. .i thnh chu#i $a8eYG rti th=c hin phXp
so snh chu#i.
// Phng thc dung d so snh m bam mi vi
// m bam c san (doc biu din o dang chui Base64).
private static bool VerifyB64Hash(byte[] hash, string oldHashString) {

// Tao biu din chui Base64 cho m bam mi.
string newHashString = System.Convert.ToBase64String(hash);

// So snh biu din chui cua m bam c v mi,
// ri tra v kt qua.
return (oldHashString == newHashString);
}
PuDi ceng8 o*n .S )i <' so snh hai .S &v. $c &iu )irn C )*ng .ng &'t(. 7h vin
lp .NET Framework kh4ng cF phMng th:c no th=c hin kiu so snh n'8 )o F &*n phi
viIt .t vkng l!p so snh cc phNn tO ca hai .ng. lo*n .S n' cF sO )ng .t vi k
thu6t kh4ng tDn nhiu thi gian nh\ &o . cc .ng &'t( cF ceng chiu )i trc khi &/t
Nu so snh chGng8 v tr v false khi t%. th' khc &it Nu ti>n.
// Phng thc dung d so snh m bam mi vi
// m bam c san (doc biu din o dang mang byte).
private static bool VerifyByteHash(byte[] hash, byte[] oldHash) {

// Nu mt mang l null, hoac hai mang c chiu di khc nhau
// th chng khng bng nhau.
if (hash == null || oldHash == null || hash.Length != oldHash.Length)
return false;

// Duyt qua mang byte v so snh mi gi tr byte.
for (int count = 0; count hash.Length; count++) {
if (hash[count] != oldHash[count]) return false;
}

// Hai m bam bng nhau.
return true;
}
558
Chng 14: ?x` op
5'
5' < o m t7nh ton v n d li u ! ng m# !4m c' "h'a & < o m t7nh ton v n d li u ! ng m# !4m c' "h'a &
#eA JwA J>Z]tA OIQ @Y J>X c@ L^ D\ JPd J>X ABVo@ A\] OIQ d>V[AB JSJ> Lt vSJ
O@A> QaA> QX\A DA Jbc @Y(
CPd J>X ABVo@ A>NA OIQ s>^c Fa ONQ ike:k( 3>^c A\] J^ Q>t Y\ OIQ fK LVWJ f@A>
ABpZ A>@CA, A>VAB A^ JAB J^ Q>t Y\ OIQ A>^O Q O\ FeA D\ ABVo@ A>NA L} Q>c
Q>ZNA( Sg hUAB s>^c JrAB DE@ OIQ QHXAB A>?AB YEd B@R@ Q>ZNQ FO J^ s>^c hpA
vZPQ Q YEd $!stem.$ecurit!.Cr!ptograp.!.;e!edHas.#lgorit.m Lt QeX O} FO J^
s>^c( Gg@ O} FO A\] JrAB DE@ @Y( 3>@ A>NA LVWJ @Y, ABVo@ A>NA fm QeX O}
FO J^ s>^c J>X @Y A\] F`AB s>^c( NjZ >c@ O} FO B@KAB A>cZ, ABVo@ A>NA fm
F@jQ H`AB @Y A\] hX FeA Bg@ LjA D\ A^ s>TAB FM Q>c] L@ QHXAB ZS QHlA> J>Z]tA
B@cX(
"S &v. rt hKu 2ch khi so snh hai .xu )K liu ;c inh chGng cF giDng nhau ha' kh4ng
gc khi &*n kh4ng th tru' ;ut $c )K liu gDch. 7u' nhi>n8 &*n kh4ng th sO )ng .S &v.
ca. oan vi ngi nh6n v t2nh ton vn ca )K liu. HIu cF ai F ch!n $c )K liu8
ngi n' cF th tha' thI )K liu v t*o .S &v. .i. whi ngi nh6n ki. tra .S &v.8 nF cF
vj Gng nhng th=c tI )K liu kh4ng giDng vi nhKng g% &*n gOi lGc &an Nu.
"t gii php Mn gin v hiu 9u cho vn ton vn )K liu l .S &v. cF khFa gkeyeA
ha8h )oAeh. "S &v. cF khFa c?ng tMng t= nh .S &v. &%nh thng gS $c tho lu6n trong
.c Z_.] v Z_.^hT tu' nhi>n8 .S &v. cF khFa kIt h$p th>. .t phNn tO )K liu &2 .6t
gkhFah8 phNn tO n' chJ cF ngi gOi v ngi nh6n &iIt. HIu kh4ng cF khFa8 kh4ng ai cF th
t*o $c .S &v. Gng tQ t6p )K liu cho trc.
3>^c d>R@ LVWJ B@? Fa ONQ( NjZ c@ L^ F@jQ s>^c Q>l J^ Q>t QeX Hc O} FO J^ s>^c
>Wd Yq, AB>c Y\ FeA fm s>TAB Q>t vSJ LMA> > J^ Q>c] L@ AI@ hZAB Jbc Q\@ Y@qZ
>c] s>TAB( Vl Y hX A\], FeA s>TAB ACA J>Z]tA B@cX >c] YVZ QH? s>^c JrAB DE@
Q\@ Y@qZ JwA LVWJ FRX Dq QaA> QX\A DA( MUJ ( fm JZAB JPd OIQ J[ J>j O\ FeA
J^ Q>t fg hUAB Lt QHcX L@ s>^c OIQ JSJ> cA QX\A(
7*o .S &v. cF khFa c?ng tMng t= nh t*o .S &v. &%nh thng v% lp trQu t$ng
System.Security.Cryptography.KeyedHashAlgorithm .C rng lp
System.Security.Cryptography.HashAlgorithm. yp KeyedHashAlgorithm cung cp .t lp
cM sC tt c cc gii thu6t &v. cF khFa )3n ;ut tQ F. 7h vin lp .NET Framework cF
hai hin th=c gii thu6t &v. cF khFa $c lit k> trong &ng Z_.]T .#i hin th=c l .t thnh
vi>n ca kh4ng gian t>n System.Security.Cryptography.
Bfng 14'2 Cc hin thuc gii thut bm c kha
:ifi `hux`STtn mrs Yhch `hrc uhqa i` Yhch `hrc op o i`
HMACSHA1
&t k Zad
MACTripleDES
a_8 Z]b8 Zc] a_
559
Chng 14: ?x` op
P?ng nh cc gii thu6t &v. chuxn8 &*n cF th tr=c tiIp t*o ra cc Di t$ng gii thu6t &v. cF
khFa8 ho!c &*n cF th sO )ng phMng th:c tqnh KeyedHashAlgorithm.Create vi Di sD l t>n
gii thu6t. |O )ng ?a)/ory cho phXp &*n viIt .S lnh tsng 9ut v .S lnh n' cF th l.
vic vi &t k hin th=c gii thu6t &v. cF khFa no8 nhng th(o &ng Z_.]8 .#i lp h# tr$
cc chiu )i khFa khc nhau n>n &*n phi cung cp gi tri n' trong .S lnh tsng 9ut.
HIu sO )ng phMng th:c khCi )=ng t*o Di t$ng &v. cF khFa8 &*n cF th tru'n khFa
cho phMng th:c n'. whi sO )ng ?a)/ory8 &*n phi thiIt l6p khFa &5ng thuc t2nh Key g$c
thQa kI tQ lp KeyedHashAlgorithmh. "t khi S cu h%nh khFa8 g0i phMng th:c ComputeHash
vi Di sD l .t .ng &'t( ha' .t Di t$ng System.IO.Stream. pii thu6t &v. cF khFa s@
;O lB )K liu nh6p v tr v .t .ng &'t( ch:a .S &v. cF khFa. Lng Z_.] cho th' k2ch
thc ca .S &v. )o .#i gii thu6t &v. cF khFa sinh ra.
yp KeyedHashStreamExample )i <' tr%nh &' cch t*o .S &v. cF khFa tQ .t fil(. L*n
phi chJ inh t>n fil( v .t khFa l. Di sD )kng lnh. ng )ng n' sO )ng lp HMACSHA1
t*o .S &v. cF khFa v rti hin thi nF ra cOa ss Con8oDe.
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
public class KeyedHashStreamExample {
public static void Main(string[] args) {
// Tao mang byte tu chui key (l di s dng lnh th hai).
byte[] key = Encoding.Unicode.GetBytes(args[1]);

// Tao mt di tong HMACSHA1
// (truyn key cho phng thc khoi dng).
using (HMACSHA1 hashAlg = new HMACSHA1(key)) {
// Mo mt FileStream d doc file (tn file
// doc ch dnh trong di s dng lnh th nht).
using (Stream file = new FileStream(args[0],
FileMode.Open)) {

// Tao m bam c kha cho ni dung file.
byte[] hash = hashAlg.ComputeHash(file);

// Hin th m bam c kha ra cua s Console.
560
Chng 14: ?x` op
Console.WriteLine(BitConverter.ToString(hash));
}
}
}
}
ynh ;e!edHas.$tream0xample ;e!edHas.$tream0xample.cs secret;e! s@ sinh ra .S &v.
nh sau\
95-95-2A-8E-44-D4-3C-55-6F-DA-06-44-2-9-29-81-15-C-2A-48
ng )ng 'eyeA;a8h&e88ageE2amKDe.)8 gcF trong qa PU 2nh k1.h tr%nh &' cch t*o .t
.S &v. cF khFa tQ .t chu#i. ng )ng n' '>u cNn hai Di sD )kng lnh\ .t th4ng ip v
.t khFa8 v s@ t*o ra .S &v. cF khFa cho chu#i th4ng ip &5ng khFa n'. u2 )8 lnh
;e!edHas.Message0xample 1)%o .undred dollars is m! *inal o**er1 secret;e! s@ sinh ra
.S &v. nh sau\
83-43-0D-9D-0-6F-AA-B-BC-9-CD-6F-AD-B-FA-EA-19-D1-24-44
6' 6' < o v $ile ! ng %h:% m t h'a i x ng < o v $ile ! ng %h:% m t h'a i x ng
#eA JwA ONQ >^c OIQ @Y F`AB B@R@ Q>ZNQ ONQ >^c LK@ v~AB is:mmetric
encr:ptionk(
THVEJ >jQ, FeA d>R@ Q>t >@qA >^c OIQ QHXAB JSJ YEd B@R@ Q>ZNQ LK@ v~AB JU Q>t
hpA vZPQ Q YEd $!stem.$ecurit!.Cr!ptograp.!.$!mmetric#lgorit.m( ScZ L^, B@
d>V[AB Q>~J Create0ncr!ptor >c] Create-ecr!ptor Jbc LK@ QVWAB
$!mmetric#lgorit.m Lt Q>Z YP] OIQ LK@ QVWAB J^ >@qA Q>nJ B@cX h@qA
$!stem.$ecurit!.Cr!ptograp.!.ECr!pto)rans*orm( Sg hUAB LK@ QVWAB
ECr!pto)rans*orm A\] sjQ >Wd DE@ OIQ LK@ QVWAB
$!stem.$ecurit!.Cr!ptograp.!.Cr!pto$tream Lt ONQ >^c >c] B@R@ ONQ >^c h? Y@qZ
LJ Q OIQ @Y iLVWJ QHZ] vZPQ F`AB OIQ LK@ QVWAB $!stem.E(."ile$treamk(
yp trQu t$ng SymmetricAlgorithm cung cp .t lp cM sC tt c cc hin th=c gii thu6t
Di ;:ng c th )3n ;ut tQ F. 7h vin lp .NET Framework cF &Dn hin th=c gii thu6t Di
;:ng c th $c lit k> trong &ng Z_.^8 .#i lp l .t thnh vi>n ca kh4ng gian t>n
System.Security.Cryptography. Pc lp cF u4i l CryptoServiceProvider &0c l' cc ch:c
nvng )o @"nC2 CryK/o>P< cung cp8 trong khi cc lp cF u4i l Managed ghin t*i chJ cF
RijndaelManagedh $c hin th=c hon ton &5ng .S lnh $cz9unzlB. Lng n' c?ng cho
th' chiu )i khFa . .#i gii thu6t h# tr$ gchiu )i .!c inh $c in 6.h. HFi chung8
khFa cng )i8 cng khF gii .6t hFa ciph(rt(;t nIu kh4ng cF khFa8 nhng c?ng cF nhiu 'Iu
tD khc cNn ;(. ;Xt.
Bfng 14'3 Cc hin thuc gii thut di xng
Ttn gifi `hux` Ttn mrs (hi{u d~i uhqa i`
561
Chng 14: ?x` op
EE*
DESCryptoServiceProvider

Tr"KDeEE* ha' CEE*


TripleDESCryptoServiceProvider
Z]b8
=C2
RC2CryptoServiceProvider
_d8 _b `a8 a_8 []8 bd8
bb8 ca8 Zd_8 ZZ]8 Z]d8

="JnAaeD
RijndaelManaged
Z]b8 Zc]8
"!c )e &*n cF th t*o ra cc th hin ca cc lp gii thu6t Di ;:ng .t cch tr=c tiIp8 lp
cM sC SymmetricAlgorithm l .t ?a)/ory cho cc lp hin th=c c th )3n ;ut tQ F. p0i
phMng th:c tqnh SymmetricAlgorithm.Create vi Di sD l t>n gii thu6t s@ tr v .t Di
t$ng thuc kiu S $c chJ inh. |O )ng ?a)/ory cho phXp &*n viIt .S lnh tsng 9ut8 v
.S lnh n' cF th l. vic vi &t k hin th=c gii thu6t Di ;:ng no\
string algName = "3DES";
SymmetricAlgorithm alg = SymmetricAlgorithm.Create(algName);
NjZ FeA B@ $!mmetric#lgorit.m.Create D\ s>TAB J> LMA> QCA B@R@ Q>ZNQ,
$!mmetric#lgorit.m fm QHR DG OIQ LK@ QVWAB &iJndaelManaged( NjZ FeA J> LMA>
OIQ B@S QHM s>TAB >Wd Yq, $!mmetric#lgorit.m fm QHR DG null( #eA J^ Q>t JPZ >lA>
JSJ SA> ve QCA-YEd OE@ F`AB @Y JPZ >lA> ivO Q\@ Y@qZ (NET Framework S! Lt
F@jQ Q>CO J>@ Q@jQk(
7rc khi .6t hFa )K liu vi .t trong cc lp gii thu6t Di ;:ng8 &*n cNn .t khFa gkeyh
v .t v(ctM khCi ng g"n"/"aD"Oa/"on Be)/orh. whFa l th4ng tin &2 .6t )eng .6t hFa v
gii .6t hFa )K liu. u(ctM khCi ng l )K liu ng3u nhi>n $c tru'n cho gii thu6t .6t
hFa. L*n phi sO )ng ceng khFa v v(ctM khCi ng cho c .6t hFa v gii .6t hFa )K liu.
7u' nhi>n8 chJ cF khFa l cNn phi $c giK &2 .6t8 &*n cF th lu trK ha' gOi v(ctM khCi
ng ceng vi )K liu Sz$cz.6tzhFa.
whFa cho .#i lp )3n ;ut tQ SymmetricAlgorithm cF th $c tru' ;ut th4ng 9ua thuc t2nh
Key8 v v(ctM khCi ng cF th $c tru' ;ut th4ng 9ua thuc t2nh IV. Pch Mn gin nht v
2t l#i nht t*o khFa v v(ctM khCi ng .i l lp t= t*o chGng gie. &*n. |au khi S t*o
.t Di t$ng gii thu6t Di ;:ng8 nIu &*n kh4ng thiIt l6p cc thuc t2nh Key v IV cho nF8
Di t$ng n' s@ t= ng t*o ra cc gi tri .i nga' khi &*n cho g0i .t thnh vi>n cF sO
)ng cc gi tri Key v IV. "t khi S $c thiIt l6p8 Di t$ng gii thu6t Di ;:ng s@ tiIp tc
sO )ng cc gi tri Key v IV n'. l tha' si gi tri ca Key v IV8 &*n cF th gn tr=c tiIp
cc gi tri .i ho!c g0i phMng th:c GenerateKey v GenerateIV g&uc Di t$ng gii thu6t
Di ;:ng t*o ra cc gi tri ng3u nhi>n .ih.
L*n kh4ng th tr=c tiIp th=c hin .6t hFa v gii .6t hFa vi .t Di t$ng gii thu6t Di
;:ng. "t khi S t*o v cu h%nh Di t$ng gii thu6t Di ;:ng8 &*n phi g0i phMng th:c
CreateEncryptor ha' CreateDecryptor ca nF thu l' .t Di t$ng cF hin th=c giao )in
System.Security.Cryptography.ICryptoTransform. wI F8 &*n cF th sO )ng cc phMng
th:c ca Di t$ng ICryptoTransform n' .6t hFa v gii .6t hFa )K liu. 7u' nhi>n8 Di
t$ng ICryptoTransform '>u cNu &*n tru'n )K liu th(o tQng khDi gcF k2ch thc cD inhh v
lp g&5ng ta'h khDi )K liu cuDi ceng v% khDi n' 2t khi cF k2ch thc Gng.
562
Chng 14: ?x` op
piao )in ICryptoTransform kh4ng 9u khF sO )ng8 nhng kh4ng .' th<n thinT )o v6'
.NET Framework k1. th>. lp System.Security.Cryptography.CryptoStream. l<' l lp
)3n ;ut tQ System.IO.Stream8 )eng Mn gin hFa vic .6t hFa v gii .6t hFa )K liu
$c 0c tQ cc Di t$ng Stream khc. yp n' cho phXp &*n .6t hFa v gii .6t hFa )K
liu tQ cc fil( v cc kIt nDi .*ng .t cch )r )ng &5ng .t .4 h%nh ;O lB 9u(n thuc8 v
nF cung cp cho &*n tt c cc tin 2ch 9u(n thuc khi tru' ;ut )K liu )=azvozStream.
RhMng th:c khCi )=ng ca CryptoStream '>u cNu &a Di sD\ .t Stream n5. )i8 .t th
hin ca ICryptoTransform8 v .t gi tri thuc kiu lit k>
System.Security.Cryptography.CryptoStreamMode. pi tri CryptoStreamMode cho &iIt chI
ca Di t$ng CryptoStream .iT cc gi tri h$p l l Read v Write. whi &*n g0i phMng th:c
Read ha' Write ca CryptoStream8 CryptoStream s@ sO )ng th hin ICryptoTransform
.6t hFa v gii .6t hFa )K liu ang tru'n 9ua CryptoStream. lDi t$ng CryptoStream &o
. k2ch thc khDi )eng cho th hin ICryptoTransform lu4n Gng.
Pu h%nh ca .t Di t$ng CryptoStream cF t2nh linh ho*t cao8 nhng cF th hMi khF hiu.
Lng Z_._ .4 t ho*t ng ca .t Di t$ng CryptoStream )=a tr>n chI ca
CryptoStream v kiu th hin ICryptoTransform $c sO )ng trong phMng th:c khCi )=ng
ca CryptoStream.
Bfng 14'4 Hoat dng ca di tong CryptoStream
(h| ca
(ays`o.`azao
(h `h ca
"(ays`oTaankoao
?i `f
Read
"6t hFa
Stream n5. )i ch:a plaint(;t ngutn.
CryptoStream.Read ghi ciph(rt(;t ra & . ;ut.
Read
pii .6t hFa
Stream n5. )i ch:a ciph(rt(;t ngutn.
CryptoStream.Read ghi plaint(;t ra & . ;ut.
Write
"6t hFa
CryptoStream.Write chJ inh plaint(;t cNn .6t hFa.
Stream n5. )i nh6n ciph(rt(;t Sz$cz.6tzhFa.
Write
pii .6t hFa
CryptoStream.Write chJ inh ciph(rt(;t cNn gii .6t
hFa. Stream n5. )i nh6n plaint(;t Sz$czgiiz
.6tzhFa.
yp SymmetricEncryptionExample )i <' tr%nh &' cch sO )ng gii thu6t Tr"KDe EE*
.6t hFa .t fil( v rti gii .6t hFa fil( F. RhMng th:c Main nh6n t>n ca fil( cNn .6t hFa
l. Di sD )kng lnh. 7rc ti>n8 nF s@ t*o khFa v v(ctM khCi ngT sau F8 g0i phMng th:c
EncryptFile8 kI tiIp l phMng th:c DecryptFile8 v sinh ra hai fil(\ fil( th: nht ch:a phi>n
&n Sz$cz.6tzhFa ca fil( ngutn8 fil( th: hai ch:a phi>n &n Sz$czgiiz.6tzhFa ca
fil( Sz$cz.6tzhFa ggiDng fil( ngutnh.
using System;
using System.IO;
using System.Security.Cryptography;
563
Chng 14: ?x` op
public class SymmetricEncryptionExample {
public static void Main(string[] args) {

// Tao mt giai thut Triple DES mi d thu ly kha dung cho
// v d ny. Kha ny s doc dung chung trong cc phng thc
// EncryptFile v DecryptFile. Bnh thng, kha doc
// thoa thun gia ngi gui v ngi nhn, hoac doc gui
// (boi ngi gui) cung vi file d-doc-mt-ha.
byte[] key;
byte[] iv;

using(SymmetricAlgorithm alg =
SymmetricAlgorithm.Create("3DES")){

key = alg.Key;
iv = alg.IV;
}

// Mt ha file. Tin t "encrypted" s doc thm vo tn file
// ngun v doc su dng lm tn cua file d-doc-mt-ha.
EncryptFile(args[0], "encrypted"+args[0], (byte[])key.Clone(),
(byte[])iv.Clone());

// Giai mt ha file d-doc-mt-ha. Tin t "decrypted" s doc
// thm vo tn file gc v doc su dng lm tn cua file
// d-doc-giai-mt-ha.
DecryptFile("encrypted"+args[0], "decrypted"+args[0], key, iv);
}
// Phng thc dung d mt ha mt file (bng giai thut Triple DES)
// vi key v iv cho trc.
private static void EncryptFile(string srcFileName,
string destFileName, byte[] key, byte[] iv) {

// Tao cc stream d truy xut file ngun v file dch.
Stream srcFile =
new FileStream(srcFileName, FileMode.Open, FileAccess.Read);
564
Chng 14: ?x` op
Stream destFile =
new FileStream(destFileName, FileMode.Create,
FileAccess.Write);

// Tao mt giai thut Triple DES mi d mt ha file.
using(SymmetricAlgorithm alg =
SymmetricAlgorithm.Create("3DES")){
// Cu hnh thuc tnh Key v IV cua giai thut.
alg.Key = key;
alg.IV = iv;
// Tao mt CryptoStream d mt ha ni dung cua
// Stream ngun khi n doc doc. Goi phng thc
// CreateEncryptor cua SymmetricAlgorithm
// d nhn th hin ICryptoTransform v
// truyn n cho CryptoStream.
CryptoStream cryptoStream = new CryptoStream(srcFile,
alg.CreateEncryptor(),
CryptoStreamMode.Read);
// Khai bo b dm dung d doc d liu tu file ngun
// thng qua CryptoStream v ghi n ra file dch.
int bufferLength;
byte[] buffer = new byte[1024];

// oc file ngun (tung khi 1024 byte) v ghi phin ban
// d-doc-mt-ha ra file dch.
do {
bufferLength = cryptoStream.Read(buffer, 0, 1024);
destFile.Write(buffer, 0, bufferLength);
} while (bufferLength 0);

// ng stream v xa cc d liu b mt.
destFile.Flush();
Array.Clear(key,0,key.Length);
565
Chng 14: ?x` op
Array.Clear(iv,0,iv.Length);
cryptoStream.Clear();
cryptoStream.Close();
srcFile.Close();
destFile.Close();
}
}

// Phng thc dung d giai mt ha mt file d-doc-mt-ha bng
// giai thut Triple DES vi key v iv cho trc.
private static void DecryptFile(string srcFileName,
string destFileName, byte[] key, byte[] iv) {
// Tao cc stream d truy xut file ngun v file dch.
Stream srcFile =
new FileStream(srcFileName, FileMode.Open, FileAccess.Read);
Stream destFile =
new FileStream(destFileName, FileMode.Create,
FileAccess.Write);

// Tao mt giai thut Triple DES mi d giai mt ha file.
using(SymmetricAlgorithm alg =
SymmetricAlgorithm.Create("3DES")){
// Cu hnh thuc tnh Key v IV cua giai thut.
alg.Key = key;
alg.IV = iv;

// Tao mt CryptoStream d giai mt ha ni dung cua d liu
// d-doc-mt-ha khi n doc ghi. Goi phng thc
// CreateDecryptor cua SymmetricAlgorithm d nhn th hin
// ICryptoTransform v truyn n cho CryptoStream.
CryptoStream cryptoStream = new CryptoStream(destFile,
alg.CreateDecryptor(),
CryptoStreamMode.Write);
// Khai bo b dm dung d doc d liu tu file d-doc-
// mt-ha v ghi ra file dch thng qua CryptoStream.
566
Chng 14: ?x` op
int bufferLength;
byte[] buffer = new byte[1024];

// oc file d-doc-mt-ha (tung khi 1024 byte) v ghi
// phin ban d-doc-giai-mt-ha ra file dch.
do {
bufferLength = srcFile.Read(buffer, 0, 1024);
cryptoStream.Write(buffer, 0, bufferLength);
} while (bufferLength 0);

// ng stream v xa cc d liu b mt.
cryptoStream.FlushFinalBlock();
Array.Clear(key,0,key.Length);
Array.Clear(iv,0,iv.Length);
cryptoStream.Clear();
cryptoStream.Close();
srcFile.Close();
destFile.Close();
}
}
}
7' 7' Truy l i "h'a i x ng t %assword Truy l i "h'a i x ng t %assword
#eA JwA QeX OIQ s>^c LK@ v~AB Q OIQ dcffXHh Lt ABVo@ hrAB J> JwA A>E
dcffXHh D\ s>TAB JwA YVZ QH? s>^c(
Sg hUAB YEd $!stem.$ecurit!.Cr!ptograp.!./ass%ord-erive6!tes Lt QeX s>^c LK@
v~AB Q J>Zx@ dcffXHh(
niI. cF ngi no nh $c gi tri ca .t khFa Di ;:ng8 v kh4ng th=c tI khi &/t ngi
)eng nh6p cc sD )i nh thI &5ng ta'. liu n' nghqa l khFa phi $c lu trK C .t )*ng
an ton sao cho :ng )ng cF th tru' ;ut $c gtrong s.art car)8 qa ..8 cM sC )K liu ha'
fil(h. un li>n 9uan vi vic cp8 ph<n &s8 tru' ;ut8 v lu trK khFa l .t trong nhKng
.!t khF nht trong 9u tr%nh hin th=c &t k gii php .6t .S no gvn n' $c 9u'
chung v 9un lB khFah. whi cNn ghi nh .t &2 .6t gkhFah8 &*n kh4ng chJ lo &o v )K liu
. ckn phi lo &o v cc &2 .6t )eng &o v )K liu
"t cch lu trK khFa l cp cho ngi )eng .t passor) )r nh hMn v sO )ng .t giao
th:c tru' l*i khFa gkey Aer"Ba/"on Kro/o)oDh t*o .t khFa Di ;:ng tQ passor). 7h(o F8
567
Chng 14: ?x` op
.#i khi cNn .6t hFa ha' gii .6t hFa )K liu8 ngi )eng chJ cNn nh6p passor) v .' t2nh
s@ t*o ra khFa gnIu ngi )eng nh6p ceng passor)8 giao th:c n' s@ t*o ra ceng khFah.
THZ] Ye@ s>^c Q A>?AB Q >c] A>^O Q hu A>E Y\O B@RO LSAB st QaA> ABpZ
A>@CA Jbc s>^c, hpA LjA B@RO QaA> FRX ONQ LVWJ JPd F@ A>?AB >\O ONQ O} J^
fg hUAB s>^c L^( THXAB QHVoAB >Wd Q@ Qq A>PQ, >cJsH J^ Q>t LXSA LVWJ
dcffXHh, D\ JHcJs h? Y@qZ Jbc FeA Q>TAB Zc D@qJ B@R@ O} ONQ O}
icr:ptanal:sisk(
7h vin lp .NET Framework cF .t hin th=c tru' l*i khFa Di ;:ng\
PasswordDeriveBytes. yp n' sO )ng .t gii thu6t &v. $c p )ng l!p i l!p l*i cho
.t passor) t*o ra .t khFa vi chiu )i nh .ong .uDn. whi cu h%nh .t Di t$ng
PasswordDeriveBytes8 &*n cF th chJ inh t>n gii thu6t &v. c?ng nh sD lNn l!p g.!c inh8
*;>I1 $c p )ng Zdd lNnh. Hgoi ra8 &*n c?ng cNn cung cp gi tri salt. |alt l )K liu
ng3u nhi>n . 9u tr%nh tru' l*i khFa s@ sO )ng l. cho khFa t%. $c trC n>n &n vKng
hMn Di vi cc )*ng tn c4ng &5ng .6t .S. L*n kh4ng cNn giK &2 .6t cho gi tri saltT &*n
phi lu trK v sO )ng nF khi tru' l*i khFa tQ passor) sau n' gnIu kh4ng cF gi tri salt
Gng8 &*n s@ kh4ng th tru' l*i khFa Gng v kh4ng th gii .6t hFa $ch.
#eA s>TAB Q>t QeX s>^c FPQ LK@ v~AB F`AB B@cX Q>~J QHZ] Ye@ s>^c( G@R@ Q>ZNQ
ONQ >^c FPQ LK@ v~AB ias:mmetric encr:ptionk hnc D\X JSJ OK@ Y@CA >q QXSA JU
Q>t B@?c JSJ Q>\A> d>wA s>^c JTAB s>c@ ip%9lic ke:k D\ s>^c H@CAB ipri"ate ke:k(
N>V Q>j, Ox@ B@R@ Q>ZNQ ONQ >^c FPQ LK@ v~AB ]CZ JwZ FeA d>R@ QZA Q>X OIQ
Z] QHlA> H@CAB Lt J^ Q>t QeX Hc JSJ s>^c OE@(
u2 ) )i <' tr%nh &' cch sO )ng lp PasswordDeriveBytes t*o .t khFa Di ;:ng
gt. a_ &it tQ .t chu#i passor). u2 ) n' '>u cNu hai Di sD )kng lnh\ t>n gii thu6t &v.
v passor) gt>n ca cc gii thu6t &v. S $c lit k> trong &ng Z_.Zh.
using System;
using System;
using System.Security.Cryptography;
public class DerivedKeyExample {
public static void Main(string[] args) {

// Su dng mt b tao s ngu nhin d tao gi tr salt.
byte[] salt = new byte[8];
&andom=umber7enerator.Create().7et6!tes(salt);
// Tao mt di tong PasswordDeriveBytes d tao kha tu
// password. Cn cung cp password ngun (l di s dng
// lnh th hai) v salt.
PasswordDeriveBytes pdb =
568
Chng 14: ?x` op
new PasswordDeriveBytes(args[1], salt);
// Thit lp giai thut bam dung d tao kha, tn
// giai thut doc ch dnh trong di s dng lnh th nht.
// Giai thut doc su dng mac dnh l SHA-1.
pdb.HashName = args[0];
// Thit lp s ln lap l 200 (dy l s ln giai thut bam
// doc p dng cho password d tao kha). Mac dnh l 100.
pdb.IterationCount = 200;

// Tao mt kha gm 8 byte (64 bit) tu password.
// Chiu di cua kha b gii han boi chiu di cua
// m bam - 160 bit di vi SHA-1.
byte[] key = pdb.GetBytes(8);

// Hin th kha v salt.
Console.WriteLine("Key = {0}", BitConverter.ToString(key));
Console.WriteLine("Salt = {0}", BitConverter.ToString(salt));
}
}
Ph*' lnh -erived;e!0xample $H#? $@me>eree$tr8nge/8ii%@rd gsO )ng gii thu6t &v.
*;>I1 tru' l*i .t khFa gt. b &'t( tQ chu#i S0meVereeStr@ngeP@w0rdh s@ sinh ra kIt
;ut tMng t= nh sau\
Key = 53-2-4-5B-A4-88-A4-80
Salt = 0-82-9-F4-3B-F9-DF-D2
PhG B r5ng8 .#i khi &*n ch*' ceng .t lnh8 DerivedKeyExample sinh ra khFa khc nhau. lF
l )o tc )ng ca salt. HIu &*n &V i )kng lnh gn .t gi tri ng3u nhi>n vo salt g$c in
6. trong o*n .S tr>nh8 sau F &i>n )ich l*i v ch*' DerivedKeyExample8 &*n s@ nh6n th' v2
) n' lu4n t*o ra ceng .t khFa vi .t passor) cho trc.
8' 8' 3 i m t !7 m t ! ng %h:% m t h'a ! t i x ng 3 i m t !7 m t ! ng %h:% m t h'a ! t i x ng
#eA JwA fg hUAB d>d ONQ >^c FPQ LK@ v~AB ias:mmetric encr:ptionk Lt Bg@ OIQ
Fa ONQ(
T>t >@qA >^c YEd B@R@ Q>ZNQ FPQ LK@ v~AB $!stem.$ecurit!.Cr!ptograp.!.
&$#Cr!pto$ervice/rovider( Sg hUAB d>V[AB Q>~J &$#Cr!pto$ervice/rovider.
569
Chng 14: ?x` op
0ncr!pt D\ s>^c JTAB s>c@ ip%9lic ke:k Jbc ABVo@ A>NA Lt ONQ >^c Q>TAB L@qd(
ScZ LX, ABVo@ A>NA fm fg hUAB d>V[AB Q>~J &$#Cr!pto$ervice/rovider.-ecr!pt
D\ s>^c H@CAB ipri"ate ke:k Lt B@R@ ONQ >^c Fa ONQ L}6LVWJ6ONQ6>^c(
.NET Framework inh nghqa .t h thDng ph<n cp th(o lp cho cc gii thu6t &t Di ;:ng
tMng t= nh S inh nghqa cho cc gii thu6t Di ;:ng gS $c tho lu6n trong .c Z_.ah.
7t c cc gii thu6t &t Di ;:ng phi thQa kI .t lp cM sC trQu t$ng chung cF t>n l
System.Security.Cryptography.AsymmetricAlgorithm. PF hai hin th=c gii thu6t &t Di
;:ng c th\
System.Security.Cryptography.RSACryptoServiceProvider
System.Security.Cryptography.DSACryptoServiceProvider
u% cF u4i l CryptoServiceProvider n>n c hai lp n' u &0c l' cc ch:c nvng )o @"nC2
CryK/o>P< cung cp. 7u' nhi>n8 chJ cF lp RSACryptoServiceProvider l h# tr$ vic .6t hFa
)K liu. yp DSACryptoServiceProvider hin th=c E"g"/aD *"gna/ure >Dgor"/hm gE*>h8 &*n cF
th sO )ng gii thu6t n' chJ t*o chK kB sD g;(. FeAeraD <n?orma/"on Pro)e88"ng
*/anAarA eF<P*f 1UYI2 t*i 8htt94::ZZZ>#t@>n#<t>2om:f#9<9%A<H &iIt th>. chi tiIt v E*>h.
"!c )e &*n cF th t*o .t Di t$ng gii thu6t &t Di ;:ng &5ng phMng th:c tqnh Create
ca lp cM sC AsymmetricAlgorithm8 nhng &e l*i &*n s@ phi tr gi chGt 2t cho vic n'. yp
AsymmetricAlgorithm kh4ng khai &o cc phMng th:c . RSACryptoServiceProvider sO
)ng .6t hFa v gii .6t hFa )K liu. 7ha' vo F8 &*n phi tr=c tiIp th hin hFa lp
RSACryptoServiceProvider &5ng .t trong cc phMng th:c khCi )=ng ca nF.
7rc khi .6t hFa ha' gii .6t hFa )K liu vi Di t$ng RSACryptoServiceProvider8 &*n cNn
tru' ;ut cc khFa th2ch h$p. whFa ca gii thu6t &t Di ;:ng khc nhiu so vi khFa ca gii
thu6t Di ;:ng. 7h: nht8 nF cF hai thnh phNn\ khFa c4ng khai gKu4D") keyh v khFa ri>ng
gKr"Ba/e keyh. 7h: hai8 tha' v% chJ l .t )S' cc &'t( $c sinh ng3u nhi>n8 khFa &t Di
;:ng $c t*o th(o .t cch th:c !c &it. PF .t .Di 9uan h ton !c &it giKa khFa c4ng
khai v khFa ri>ngT .Di 9uan h n' cho phXp gii thu6t &t Di ;:ng .6t hFa )K liu &5ng
.t khFa v gii .6t hFa )K liu &5ng .t khFa khc. "#i gii thu6t &t Di ;:ng sO )ng
cch th:c t*o khFa ca ch2nh nF8 v cc lp hin th=c c th Fng gFi cc ch:c nvng cNn thiIt
t*o ra cc khFa .i.
whFa c4ng khai kh4ng cNn $c giK &2 .6t v ch sC hKu cF th te' B gOi nF cho &*n th4ng
9ua (z.ail8 ho!c post nF l>n .t (&sit( ha' .t s(rv(r ph<n phDi khFa .0i ngi ceng
th'. HhKng ai .uDn gOi &2 .6t th% sO )ng khFa c4ng khai .6t hFa &2 .6t. |au F8 ngi
nh6n sO )ng khFa ri>ng gii .6t hFa &2 .6t. whFa ri>ng phi $c giK &2 .6tT nhKng ai sC
hKu khFa ri>ng u cF th gii .6t hFa )K liu Sz$cz.6tzhFa &5ng khFa c4ng khai.
l t*o .t &2 .6t $cz.6tzhFaz&tzDiz;:ng8 &*n phi cF khFa c4ng khai ca ngi nh6n v
n*p nF vo .t Di t$ng RSACryptoServiceProvider. PF hai cch n*p khFa c4ng khai\
|O )ng phMng th:c RSACryptoServiceProvider.ImportParameters nh6p .t cu
trGc System.Security.Cryptography.RSAParameters8 cu trGc n' ch:a th4ng tin khFa
c4ng khai ca ngi nh6n. Ph sC hKu cF th t*o cu trGc RSAParameters &5ng phMng
th:c RSACryptoServiceProvider.ExportParameters v gOi nF cho &*n. 7u' nhi>n8
ngi n' cF th gOi cho &*n khFa c4ng khai C )*ng &'t(8 v &*n phi t= n*p gi tri n'
vo cu trGc RSAParameters.
570
Chng 14: ?x` op
|O )ng phMng th:c RSACryptoServiceProvider.FromXmlString n*p )K liu khFa
c4ng khai tQ .t chu#i :&L. Ph sC hKu cF th t*o )K liu :&L n' &5ng phMng th:c
RSACryptoServiceProvider.ToXmlString v gOi nF cho &*n.
CR d>V[AB Q>~J 0xport/arameters D\ )o5ml$tring Jbc YEd
&$#Cr!pto$ervice/rovider LGZ A>NA OIQ LK@ fK YZNA Y, AjZ Y\ true, LK@ QVWAB
&$#Cr!pto$ervice/rovider fm vZPQ JR s>^c JTAB s>c@ D\ s>^c H@CAB( #eA J> LMA>
B@S QHM A\] Y\ *alse s>@ JwA vZPQ s>^c J>X OUJ LaJ> d>A d>K@ >c] YVZ QH?(
"t khi S n*p khFa c4ng khai ca ngi nh6n vo Di t$ng RSACryptoServiceProvider8
&*n cF th .6t hFa )K liu. pii thu6t &t Di ;:ng ch6. hMn gii thu6t Di ;:ng khi .6t hFa
v gii .6t hFa )K liu. u% lB )o n'8 &*n kh4ng n>n sO )ng gii thu6t &t Di ;:ng .6t
hFa l$ng )K liu ln. 7h4ng thng8 nIu cNn .6t hFa l$ng )K liu ln8 &*n n>n sO )ng
gii thu6t Di ;:ng v rti .6t hFa khFa Di ;:ng &5ng gii thu6t &t Di ;:ng &*n cF th
gOi khFa Di ;:ng ceng vi )K liu. "c Z_.Zd s@ tho lu6n v vn n'. l &o . t2nh
nht 9un trong vic sO )ng8 lp RSACryptoServiceProvider kh4ng h# tr$ .4 h%nh .6t hFa
v gii .6t hFa )=aztr>nzSystem.IO.Stream gS $c sO )ng trong .c Z_.ah.
l .6t hFa )K liu vi Di t$ng RSACryptoServiceProvider8 &*n hS' g0i phMng th:c
Encrypt8 tru'n cho nF .t .ng &'t( ch:a plaint(;tT Encrypt s@ tr v .t .ng &'t( ch:a
ciph(rt(;t. RhMng th:c Encrypt c?ng .h6n .t Di sD lu6n lB cho &iIt kiu KaAA"ng . Di
t$ng RSACryptoServiceProvider s@ sO )ng. PaAA"ng cho &iIt Di t$ng &t Di ;:ng s@ ;O
lB plaint(;t nh thI no trc khi .6t hFa. PaAA"ng &o . gii thu6t &t Di ;:ng kh4ng
cNn ;O lB tQng khDi )K liu8 v &o v ciph(rt(;t Di vi cc )*ng tn c4ng &5ng .6t .S. Uirn
gii cc )*ng KaAA"ng v$t 9u ph*. vi ca 9u'n sch n'. HFi chung8 nIu ang sO )ng
&")ro8o?/ @"nAow8 :P trC v sau8 &*n n>n chJ inh Di sD KaAA"ng l trueT nIu kh4ng8 &*n
phi chJ inh Di sD KaAA"ng l l false gnIu kh4ng th% Encrypt s@ nX. ngo*i l
System.Security.Cryptography.CryptographicExceptionh.
pii .6t hFa )K liu c?ng Mn gin nh .6t hFa )K liu. Hgi nh6n cNn t*o .t Di t$ng
RSACryptoServiceProvider v n*p nF ceng vi khFa ri>ng. 7h4ng thng8 khFa n' s@ $c
lu trK trong .t kho ch:a khFa gkey )on/a"nerh )o CryK/o>P< 9un lB gs@ $c tho lu6n k
hMn trong .c Z_.ch. Hgi nh6n g0i RSACryptoServiceProvider.Decrypt v tru'n cho nF
ciph(rt(;t . &*n S gOi. Hgi nh6n phi chJ inh cM chI KaAA"ng8 v nF c?ng phi giDng
nh khi .6t hFa )K liu. RhMng th:c Decrypt tr v .t .ng &'t( ch:a plaint(;t Sz$cz
giiz.6tzhFa. HIu plaint(;t .4 t .t chu#i8 ngi nh6n phi chu'n .ng &'t( thnh gi tri
chu#i th2ch h$p &5ng lp System.Text.Encoding.
LEd &$#Cr!pto$ervice/rovider Q>c sj JSJ d>V[AB Q>~J J^ QCA Y\ 0ncr!pt>alue
D\ -ecr!pt>alue Q YEd J>c Jbc A^ Y\ $!stem.$ecurit!.Cr!ptograp.!.&$#( LEd
&$#Cr!pto$ervice/rovider s>TAB >@qA Q>nJ JSJ d>V[AB Q>~J A\] D\ AO ABXe@ Yq
$!stem.=ot$upported0xception AjZ FeA B@ J>AB(
yp AsymmetricEncryptionExample )i <' tr%nh &' cch sO )ng lp
RSACryptoServiceProvider .6t hFa .t chu#i v rti gii .6t hFa\
using System;
571
Chng 14: ?x` op
using System.Text;
using System.Security.Cryptography;
public class AsymmetricEncryptionExample {
public static void Main(string[] args) {
// Khai bo mt bin RSAParameters, bin ny s cha
// thng tin PUBLIC KEY cua ngi nhn.
RSAParameters recipientsPublicKey;
// Khai bo mt bin CspParameters, bin ny s cho bit
// PRIVATE KEY doc lu tr trong kho cha kha no.
// Thng thng, ch c ngi nhn mi c th truy xut
// thng tin ny. Vi mc dch minh hoa, chng ta s tao
// mt cap kha ngay du v d v su dng cc kha ny
// cho ca bn gui v bn nhn.
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = "MyKeys";

// Tao cap kha bt di xng bng lp RSACryptoServiceProvider.
// Lu cc kha ny vo mt kho cha kha c tn l "MyKeys"
// v trch thng tin PUBLIC KEY vo bin recipientsPublicKey.
using (RSACryptoServiceProvider rsaAlg =
new RSACryptoServiceProvider(cspParams)) {
// Cu hnh cho giai thut lu kha vo kho cha kha.
rsaAlg.PersistKeyInCsp = true;

// Trch PUBLIC KEY.
recipientsPublicKey = rsaAlg.ExportParameters(false);
}

// Hin th thng dip plaintext gc.
Console.WriteLine("Original message = {0}", args[0]);
// Chuyn thng dip gc thnh mang byte. Tt nht l khng
// truyn cc thng tin b mt o dang chui gia cc phng thc.
572
Chng 14: ?x` op
byte[] plaintext = Encoding.Unicode.GetBytes(args[0]);

// Mt ha thng dip bng phng thc EncryptMessage.
// Phng thc ny cn PUBLIC KEY cua ngi nhn.
byte[] ciphertext = EncryptMessage(plaintext,
recipientsPublicKey);

// Hin th ciphertext do phng thc EncryptMessage tra v.
// Su dng phng thc BitConverter.ToString method cho dn gian
// mac du n chn du gach ni (-) vo gia cc gi tr byte
// (khng dng vi biu din d liu trong b nh).
Console.WriteLine("Formatted Ciphertext = {0}",
BitConverter.ToString(ciphertext));

// Giai mt ha thng dip (d-doc-mt-ha) bng phng thc
// DecryptMessage. Phng thc ny cn truy xut PRIVATE KEY
// cua ngi nhn (ch c ngi nhn mi c th truy xut doc).
// Chng ta s truyn cho n mt di tong CspParameters
// (cho bit PRIVATE KEY doc lu tr trong kho cha kha no).
// Giai php ny an ton hn l truyn PRIVATE KEY th
// gia cc phng thc.
byte[] decData = DecryptMessage(ciphertext, cspParams);

// Chuyn thng dip d-doc-giai-mt-ha tu mang byte
// thnh chui v hin th n ra cua s Console.
Console.WriteLine("Decrypted message = {0}",
Encoding.Unicode.GetString(decData));
// Nhn Enter d kt thc.
Console.ReadLine();
}
// Phng thc dung d mt ha (theo RSA) mt thng dip bng
// PUBLIC KEY (nm trong mt cu trc RSAParameters).
private static byte[] EncryptMessage(byte[] plaintext,
RSAParameters rsaParams) {
573
Chng 14: ?x` op

// Khai bo mang byte cha ciphertext.
byte[] ciphertext = null;

// Tao mt th hin cua giai thut RSA.
using (RSACryptoServiceProvider rsaAlg =
new RSACryptoServiceProvider()) {

rsaAlg.ImportParameters(rsaParams);
// Mt ha plaintext bng OAEP padding
// (ch doc h tro trn Windows XP tro v sau).
ciphertext = rsaAlg.Encrypt(plaintext, true);
}

// Xa cc gi tr doc gi trong mang byte cha plaintext.
// iu ny bao dam d liu b mt khng cn trong b nh
// sau khi ban giai phng tham chiu dn n.
Array.Clear(plaintext, 0, plaintext.Length);

return ciphertext;
}
// Phng thc dung d giai mt ha mt thng dip (d-doc-mt-ha-
// theo-RSA) bng PRIVATE KEY (do di tong CspParameters ch dnh).
private static byte[] DecryptMessage(byte[] ciphertext,
CspParameters cspParams ) {
// Khai bo mang byte cha plaintext (d-doc-giai-mt-ha).
byte[] plaintext = null;

// Tao mt th hin cua giai thut RSA.
using (RSACryptoServiceProvider rsaAlg =
new RSACryptoServiceProvider(cspParams)) {
// Giai mt ha plaintext bng OAEP padding.
plaintext = rsaAlg.Decrypt(ciphertext, true);
}

574
Chng 14: ?x` op
return plaintext;
}
}
ynh #s!mmetric0ncr!ption0xample 1E love !ouj1 s@ sinh ra kIt ;ut tMng t= nh sau\
Original message = I love you!
Formatted Ciphertext = 1F-53-05-2B-9D-CC-20-6B-5D-D3-D4-0B-C9-5F-CA-FA-C1-61-6C-
3B-5B-9E-EA-B9-D0-AF-E5-2B-05-BC-D4-94-DD-1-D6-21-2A-B0-82-6B-16-C0-89-3E-24-B3-
B3-A3-15-FE-16-A-B0-58-14-43-CD-69-1A-FD-08-39-2D-09-A6-41-86-96-8-B4-3D-D6-C-
39-8A-90-84-D6-68-E6-5D-86-32-14-6-51-A-B-5A-EF-CF-F4-6D-E4-B0-18-6A-16-2A-AF-
54-B-3C-B8-19-6E-A5-86-BF-3E-B2-6D-1-E3-1D-E8-AD-D1-A8-D9-54-93-8E-F1-E8-5D-AC-
4A
Decrypted message = I love you!
NjZ FeA J>e] Da hU A\] A>@GZ YwA DE@ JrAB Q>TAB L@qd D\ s>^c, J@d>HQvQ fm
s>SJ A>cZ( !^ Y\ Dl J[ J>j pa&&ing f@A> Hc h? Y@qZ ABpZ A>@CA Lt QHSA> JSJ heAB
QPA JTAB F`AB ONQ O}( M_J hr >[@ H{J HK@ A>VAB L] J>aA> Y\ JSJ> >\A> vg O\
Qc OXAB LW@(
9'
9' 9 u tr "h'a ! t i x ng m t cch an ton 9 u tr "h'a ! t i x ng m t cch an ton
#eA JwA YVZ QH? J_d s>^c FPQ LK@ v~AB D\X OIQ A[@ cA QX\A Lt ~AB hUAB Jbc FeA
J^ Q>t QHZ] vZPQ LVWJ hu h\AB(
Dnc D\X J>~J AAB YVZ QH? s>^c hX >c@ YEd B@R@ Q>ZNQ FPQ LK@ v~AB JZAB JPd
i&$#Cr!pto$ervice/rovider D\ -$#Cr!pto$ervice/roviderQ>ZIJ s>TAB B@cA QCA
$!stem.$ecurit!.Cr!ptograp.!k(
P hai lp gii thu6t &t Di ;:ngERSACryptoServiceProvider v DSACryptoServiceProvider
Eu &0c l' cc ch:c nvng )o C*P gCryK/ograKh") *erB")e ProB"AerE.t thnh phNn ca
@"nC2 CryK/o>P<h hin th=c. Hgoi cc )ich v nh .6t hFa8 gii .6t hFa8 v chK kB sD8 .#i
C*P ckn cung cp .t kho ch:a khFa gkey )on/a"nerh.
who ch:a khFa l veng lu trK )nh cho cc khFa . C*P 9un lBT C*P sO )ng cM chI &o
.6t ca h iu hnh v phXp .6t hFa .*nh &o v ni )ung ca kho ch:a khFa. who ch:a
khFa cho phXp :ng )ng )r )ng tru' ;ut khFa . kh4ng nh hCng In t2nh &o .6t ca
khFa. whi g0i cc h. ca .t C*P8 :ng )ng cNn chJ inh t>n ca kho ch:a khFa v C*P s@
tru' ;ut cc khFa cNn thiIt. u% khFa kh4ng tru'n tQ C*P In :ng )ng n>n :ng )ng kh4ng
th l. h*i t2nh &o .6t ca khFa.
yp RSACryptoServiceProvider v DSACryptoServiceProvider cho phXp &*n cu h%nh hin
th=c C*P n5. )i &5ng .t th hin ca lp System.Security.Cryptography.
CspParameters. l cu h%nh cho .t Di t$ng RSACryptoServiceProvider ha'
DSACryptoServiceProvider sO )ng .t kho ch:a khFa c th8 &*n phi hon tt cc &c
)i <'\
Z. 7*o .t Di t$ng CspParameters.
575
Chng 14: ?x` op
]. 7hiIt l6p trng KeyContainerName ca Di t$ng CspParameters l .t gi tri chu#i
.4 t t>n ca kho ch:a khFa cNn sO )ngT chu#i cF th ch:a khong tr/ng.
^. 7*o .t Di t$ng RSACryptoServiceProvider ha' DSACryptoServiceProvider8 v
tru'n Di t$ng CspParameters l. Di sD cho phMng th:c khCi )=ng.
HIu kho ch:a khFa ttn t*i &>n trong tN. v=c ca C*P v ch:a cc khFa th2ch h$p8 C*P s@ sO
)ng cc khFa n' khi th=c hin cc thao tc .6t .S. HIu kho ch:a khFa ha' khFa kh4ng ttn
t*i8 C*P s@ t= ng t*o khFa .i. l &uc C*P lu trK cc khFa .i $c t*o vo kho ch:a
khFa8 &*n phi thiIt l6p thuc t2nh PersistKeyInCsp gca Di t$ng
RSACryptoServiceProvider ha' DSACryptoServiceProviderh l true.
RhMng th:c LoadKeys )i <' l .t o*n tr2ch trong fil( */ore>8ymme/r")'eyE2amKDe.)8
g;(. qa PU 2nh k1.h. LoadKeys t*o .t Di t$ng RSACryptoServiceProvider v cu h%nh
cho nF sO )ng .t kho ch:a khFa cF t>n l MyKeys. L5ng cch chJ inh PersistKeyInCsp l
true8 gii thu6t s@ t= ng lu trK cc khFa .i $c t*o vo kho ch:a khFa n'.
// Phng thc ny tao mt di tong RSACryptoServiceProvider
// v nap cc kha tu mt kho cha kha nu chng tn tai; nu khng,
// RSACryptoServiceProvider s t dng tao cc kha mi v lu
// chng vo kho cha kha d su dng sau ny.
public static void LoadKeys(string container) {
// Tao mt di tong CspParameters v thit lp trng
// KeyContainerName l tn cua kho cha kha.
System.Security.Cryptography.CspParameters cspParams =
new System.Security.Cryptography.CspParameters();
cspParams.KeyContainerName = container;

// Tao mt di tong giai thut RSA v truyn di tong
// CspParameters lm di s trong phng thc khoi dng.
using (System.Security.Cryptography.RSACryptoServiceProvider
rsaAlg = new
System.Security.Cryptography.RSACryptoServiceProvider(cspParams)){
// Cu hnh cho di tong RSACryptoServiceProvider
// lu tr kha vo kho cha kha.
rsaAlg.PersistKeyInCsp = true;
// Hin th PUBLIC KEY.
System.Console.WriteLine(rsaAlg.ToXmlString(false));
}
}
576
Chng 14: ?x` op
yp RSACryptoServiceProvider v DSACryptoServiceProvider kh4ng cung cp phMng th:c
no tr=c tiIp g &V kho ch:a khFa. l ;Fa cc khFa S $c lu trK8 &*n hS' thiIt l6p gi tri
ca PersistKeyInCsp l false v g0i phMng th:c Clear ha' Dispose ca Di t$ng
RSACryptoServiceProvider ha' DSACryptoServiceProvider. RhMng th:c DeleteKeys )i
<' s@ tr%nh &' k thu6t n'\
// Phng thc ny tao mt di tong RSACryptoServiceProvider
// v xa cc kha hin c khoi kho cha kha.
public static void DeleteKeys(string container) {

// Tao mt di tong CspParameters v thit lp trng
// KeyContainerName l tn cua kho cha kha cn xa.
System.Security.Cryptography.CspParameters cspParams =
new System.Security.Cryptography.CspParameters();
cspParams.KeyContainerName = container;

// Tao mt di tong giai thut RSA v truyn di tong
// CspParameters lm di s trong phng thc khoi dng.
using (System.Security.Cryptography.RSACryptoServiceProvider
rsaAlg = new
System.Security.Cryptography.RSACryptoServiceProvider(cspParams)){
// Cu hnh cho di tong RSACryptoServiceProvider
// khng lu tr kha vo kho cha kha.
rsaAlg.PersistKeyInCsp = false;
// Hin th PUBLIC KEY. V chng ta goi Dispose()
// sau li goi ny nn cc kha hin c s khng thay di
// cho dn khi phng thc doc goi ln th hai.
System.Console.WriteLine(rsaAlg.ToXmlString(false));
// V m lnh nm trong khi "using" nn Dispose doc goi
// trn di tong RSACryptoServiceProvider. V di tong
// ny doc cu hnh l khng lu tr kha nn kho cha kha
// s b xa. Thay v goi Dispose(), goi rsaAlg.Clear()
// s c cung tc dng, v n gin tip goi Dispose().
}
577
Chng 14: ?x` op
}
@"nC2 CryK/o>P< h# tr$ c u8erIkeyI8/ore v ma)h"neIkeyI8/ore. n iu hnh @"nAow8 &o
. .t u8erIkeyI8/ore chJ cF th $c tru' ;ut &Ci ngi S t*o ra nF8 nhng .t ma)h"neI
keyI8/ore cF th $c tru' ;ut &Ci &t k ngi )eng no ca .'. 7h(o .!c inh8 lp
RSACryptoServiceProvider v DSACryptoServiceProvider s@ sO )ng u8erIkeyI8/ore. L*n cF
th chJ inh sO )ng ma)h"neIkeyI8/ore &5ng cch thiIt l6p thuc t2nh tqnh
UseMachineKeyStore ca lp RSACryptoServiceProvider ha' DSACryptoServiceProvider l
true. liu n' s@ cF tc )ng vi tt c .S lnh ang ch*' trong .in :ng )ng hin hnh.
HIu .uDn ki. sot ch!t ch@ hMn8 &*n cF th thiIt l6p thuc t2nh CspParameters.Flags l gi
tri System.Security.Cryptography.CspProviderFlags.UseMachineKeyStore trc khi t*o Di
t$ng .6t hFa &t Di ;:ng.
#eA ACA vQ JSJ ]CZ JwZ FRX ONQ OIQ JSJ> JA Q>NA QHVEJ s>@ J>A fg hUAB
machine?ke:?store( T>nJ Qj Y\ ABVo@ hrAB A\X J^ Z]GA QHZ] vZPQ OS] LGZ J^ Q>t
B@\A> LVWJ Z]GA QHZ] vZPQ JSJ s>^c QHXAB s>X YVZ QH?, L@GZ A\] d>b LMA> >wZ
>jQ JSJ YW@ aJ> hX d>d ONQ >^c FPQ LK@ v~AB OcAB Ye@(
10'
10' Trao i "h'a %hin i x ng m t cch an ton Trao i "h'a %hin i x ng m t cch an ton
#eA JwA QHcX L@ h? Y@qZ L}6LVWJ6ONQ6>^c6LK@6v~AB DE@ c@ L^, D\ FeA JwA OIQ
F@qA d>Sd cA QX\A Lt d>A F s>^c d>@CA isession ke:k LK@ v~AB JrAB DE@ h? Y@qZ(
Sg hUAB J[ J>j QHcX L@ s>^c hX YEd $!stem.$ecurit!.Cr!ptograp.!.
&$#Cr!pto$ervice/rovider >@qA Q>nJ( T>X J[ J>j A\], s>^c LK@ v~AB fm LVWJ
ONQ >^c FPQ LK@ v~AB F`AB s>^c JTAB s>c@ ip%9lic ke:k Jbc ABVo@ A>NA( T>X L^,
FeA J^ Q>t Bg@ s>^c LK@ v~AB L}6LVWJ6ONQ6>^c JrAB DE@ h? Y@qZ L}6LVWJ6ONQ6
>^c( NBVo@ A>NA d>R@ B@R@ ONQ >^c s>^c LK@ v~AB F`AB s>^c H@CAB ipri"ate ke:k,
H@ OE@ Q@jA >\A> B@R@ ONQ >^c h? Y@qZ(
"#i khi .6t hFa )K liu g&5ng gii thu6t Di ;:ngh chu'n giao8 &*n n>n t*o .t khFa .i8
$c g0i l khFa phi>n g8e88"on keyh. |O )ng khFa phi>n cF hai l$i 2ch ch2nh\
HIu ai F gkh4ng $c phXph l' $c nhiu khDi ciph(rt(;t S $c .6t hFa &5ng
ceng .t khFa Di ;:ng8 kh nvng ngi F gii $c )K liu s@ tvng cao.
HIu ai F t%. $c khFa phi>n ca &*n8 ngi n' chJ cF th tru' ;ut $c .t t6p )K
liu no F Sz$cz.6tzhFa8 ch: kh4ng phi tt c cc &2 .6t ca &*n C 9u kh: v
tMng lai.
un Di vi khFa phi>n l ph<n &s v &o .6t khFa. "t gii php l thVa thu6n .t l$ng
ln khFa phi>n vi nhKng ngi . &*n cNn trao si )K liu vi h0. 7h6t kh4ng .a'8 vic n'
nhanh chFng trC n>n khF 9un lBT v th=c tI l tt c cc khFa ca &*n trong tMng lai u
$c lu trK t*i .t nMi no F8 iu n' tvng kh nvng chGng s@ &i ;<. h*i. Pch tDt hMn l
gOi khFa phi>n th(o .t )*ng $c .6t hFa .*nh ceng vi )K liu . &*n S .6t hFa vi
khFa FE9u tr%nh n' $c g0i l trao si khFa gkey e2)hangeh.
Yu tr%nh trao si khFa sO )ng phXp .6t hFa &t Di ;:ng .6t hFa khFa phi>n Di ;:ng.
HIu .uDn gOi )K liu cho ai F8 &*n t*o .t khFa phi>n Di ;:ng8 .6t hFa )K liu8 v rti .6t
hFa khFa phi>n &5ng khFa c4ng khai ca ngi nh6n. whi nh6n $c )K liu8 ngi nh6n gii
.6t hFa khFa phi>n &5ng khFa ri>ng ca h08 v rti gii .6t hFa )K liu. Yuan tr0ng l vic
578
Chng 14: ?x` op
trao si khFa cho phXp &*n trao si cc l$ng )K liu ln gSz$cz.6tzhFah vi &t c: ai8
th6. ch2 nhKng ngi &*n cha tQng tiIp ;Gc trc <'8 .irn l &*n cF th tru' ;ut khFa
c4ng khai Di ;:ng ca h0.
MIQ JSJ> Y QVAB, FeA fg hUAB OIQ B@R@ Q>ZNQ FPQ LK@ v~AB Lt ONQ >^c QPQ JR h?
Y@qZ, A>V Q>j QHSA> LVWJ A>Z JwZ QHcX L@ JSJ s>^c LK@ v~AB( TZ] A>@CA, QKJ LI
Jbc JSJ B@R@ Q>ZNQ FPQ LK@ v~AB s>@ ONQ >^c D\ B@R@ ONQ >^c h? Y@qZ s>@jA J>AB
s>TAB Q>nJ Qj J>X D@qJ fg hUAB DE@ JSJ YVWAB YEA h? Y@qZ( Sg hUAB JSJ B@R@ Q>ZNQ
FPQ LK@ v~AB Lt ONQ >^c JSJ s>^c d>@CA LK@ v~AB Y\ OIQ B@R@ d>Sd QZ] d>~J Qed
>[A, A>VAB Y\ QKQ A>PQ JR >c@ O_Qz QaA> Y@A> >XeQ D\ QaA> A>cA> J>^AB(
7h vin lp .NET Framework h# tr$ vic trao si khFa chJ vi gii thu6t =*>8 nhng &*n
phi l=a ch0n giKa hai ?orma//"ng 8)heme\ FK/"maD >8ymme/r") En)ryK/"on PaAA"ng gF>EPh
v P'C* #1 B 1.W. Ln v cc ?orma//"ng 8)heme n' v$t 9u ph*. vi ca 9u'n sch n'.
HFi chung8 &*n n>n sO )ng F>EP ?orma//"ng trQ khi &*n cF nhu cNu giao tiIp vi .t h
thDng c? cF sO )ng P'C* ?orma//"ng. nai lp )i <' hin th=c cM chI trao si khFa8 .#i
cM chI :ng vi .t ?orma//"ng 8)heme\
System.Security.Cryptography.RSAOAEPKeyExchangeFormatter
System.Security.Cryptography.RSAPKCS1KeyExchangeFormatter
l chuxn &i .t khFa Di ;:ng )eng cho trao si8 &*n phi t*o .t Di t$ng ?orma//er vi
kiu nh .ong .uDn v rti n inh .t Di t$ng gii thu6t &t Di ;:ng
gRSACryptoServiceProviderh cho ?orma//er &5ng phMng th:c SetKey ca ?orma//er. L*n phi
cu h%nh cho gii thu6t &t Di ;:ng sO )ng khFa c4ng khai ca ngi nh6n. whi S cu h%nh
;ong8 g0i phMng th:c CreateKeyExchange ca ?orma//er v tru'n .t .ng &'t( ch:a khFa
phi>n Di ;:ng . &*n cNn inh )*ng. RhMng th:c CreateKeyExchange tr v .t .ng &'t(
ch:a )K liu &*n s@ gOi i.
pii inh )*ng cho khFa ng$c vi 9u tr%nh inh )*ng. PF hai lp Ae?orma//er8 .#i lp :ng
vi .t ?orma//"ng 8)heme.
System.Security.Cryptography.RSAOAEPKeyExchangeDeformatter
System.Security.Cryptography.RSAPKCS1KeyExchangeDeformatter
l gii inh )*ng .t khFa phi>n S $c inh )*ng8 hS' t*o .t Di t$ng Ae?orma//er vi
kiu phe h$p rti g0i phMng th:c SetKey ca nF n inh .t Di t$ng gii thu6t &t Di
;:ng. L*n phi n*p khFa ri>ng ca &*n vo gii thu6t &t Di ;:ng. PuDi ceng8 g0i phMng
th:c DecryptKeyExchange vi Di sD l )K liu trao si. RhMng th:c n' tr v .t .ng
&'t( ch:a khFa phi>n Di ;:ng gDc.
il( 'eyE2)hangeE2amKDe.)8 ch:a v2 ) .inh h0a cho vic trao si khFa. RhMng th:c Main
.4 phVng vic t*o8 inh )*ng8 trao si8 v gii inh )*ng .t khFa phi>n Di ;:ng. HF s@ t*o
.t c!p khFa &t Di ;:ng sO )ng cho c v2 ) n'. 7h=c tI8 ngi gOi gngi t*o khFa
Di ;:ngh chJ cF khFa c4ng khai ca ngi nh6nT ngi nh6n cF khFa ri>ng g$c giK &2 .6th.
579
Chng 14: ?x` op
CAB A>V ACA fg hUAB OIQ s>^c LK@ v~AB J^ J>@GZ h\@ d>r >Wd DE@ QaA> Fa ONQ
Jbc h? Y@qZ LcAB LVWJ FRX Dq, FeA ACA ONQ >^c s>^c d>@CA F`AB OIQ B@R@ Q>ZNQ
FPQ LK@ v~AB D\ J>@GZ h\@ s>^c aQ A>PQ JAB d>R@ QV[AB LV[AB DE@ s>^c LK@
v~AB( NjZ s>^c FPQ LK@ v~AB ]jZ >[A s>^c LK@ v~AB, J^ s>R AAB s QPA JTAB fm
d>S D B@R@ Q>ZNQ FPQ LK@ v~AB D\ Q>Z YP] s>^c LK@ v~AB Q>c] Dl JK B@R@ ONQ >^c
h? Y@qZ L}6LVWJ6ONQ6>^c6LK@6v~AB( %O [http://www.iet'.o%1/%'c/%'c2.33.t4t]
iJ^ QHXAB Lc CD LaA> sOk Lt F@jQ J>@ Q@jQ DG fn QV[AB LV[AB B@?c J>@GZ h\@
s>^c LK@ v~AB D\ FPQ LK@ v~AB(
wI F8 phMng th:c Main g0i phMng th:c FormatKeyExchange vi Di sD l .t .ng &'t(
ch:a khFa Di ;:ng v .t Di t$ng RSAParameters ch:a khFa c4ng khai ca ngi nh6n.
RhMng th:c FormatKeyExchange tr v .t .ng &'t( ch:a khFa Di ;:ng Sz$cz.6tzhFa
v Sz$czinhz)*ng8 chuxn &i gOi i. wI tiIp8 phMng th:c Main g0i phMng th:c
DeformatKeyExchange vi Di sD l )K liu trao si S $c inh )*ng v Di t$ng
CspParameters ch:a .t tha. chiIu In kho ch:a khFa &y'ey8 gch:a khFa ri>ng ca ngi
nh6nh. 7rong suDt 9u tr%nh n'8 phMng th:c Main s@ hin thi khFa phi>n gDc8 )K liu trao si
S $c inh )*ng8 v cuDi ceng l khFa phi>n S $c gii inh )*ng.
using System;
using System.Text;
using System.Security.Cryptography;
public class KeyExchangeExample {
public static void Main() {
// Khai bo mt bin RSAParameters, bin ny s
// cha thng tin PUBLIC KEY cua ngi nhn.
RSAParameters recipientsPublicKey;
// Khai bo mt bin CspParameters, bin ny s cho bit
// PRIVATE KEY doc lu tr trong kho cha kha no.
// Thng thng, ch c ngi nhn mi c th truy xut
// thng tin ny. Vi mc dch minh hoa, chng ta s tao
// mt cap kha ngay du v d v su dng cc kha ny
// cho ca bn gui v bn nhn.
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = "MyKeys";

// Tao cap kha bt di xng bng lp RSACryptoServiceProvider.
// Lu cc kha ny vo mt kho cha kha c tn l "MyKeys"
580
Chng 14: ?x` op
// v trch thng tin PUBLIC KEY vo bin recipientsPublicKey.
using (RSACryptoServiceProvider rsaAlg =
new RSACryptoServiceProvider(cspParams)) {

// Cu hnh cho giai thut lu kha vo kho cha kha.
rsaAlg.PersistKeyInCsp = true;
// Trch PUBLIC KEY.
recipientsPublicKey = rsaAlg.ExportParameters(false);
}

// Tao giai thut di xng Triple-DES v su dng
// kha doc sinh t dng lm kha phin.
using (SymmetricAlgorithm symAlg =
SymmetricAlgorithm.Create("3DES")) {

// Hin th kha phin gc.
Console.WriteLine("Session Key at Source = {0}nr",
BitConverter.ToString(symAlg.Key));

// Chun b kha phin di xng dung cho trao di
// (su dng phng thc FormatKeyExchange, phng thc
// ny cn kha dung d mt ha v PUBLIC KEY
// cua ngi nhn).
byte[] exchangeData =
FormatKeyExchange(symAlg.Key, recipientsPublicKey);

// Hin th kha phin d-doc-mt-ha (do phng thc
// FormatKeyExchange tra v).
Console.WriteLine("Exchange Data = {0}nr",
BitConverter.ToString(exchangeData));
// GUI KHA
// By gi, kha phin c th doc gui di bng cc
// knh giao tip bnh thng.

581
Chng 14: ?x` op
// Trch kha phin tu d liu trao di bng
// phng thc DeformatKeyExchange.
byte[] sessionKey = DeformatKeyExchange(exchangeData,
cspParams);

// Hin th kha phin vua doc trch.
Console.WriteLine("Session Key at Destination = {0}nr",
BitConverter.ToString(sessionKey));
// Nhn Enter d kt thc.
Console.ReadLine();
}
}
// Phng thc dung d mt ha v dnh dang kha phin di xng.
// mt ha kha phin, chng ta cn truy xut PUBLIC KEY
// cua ngi nhn (trong cu trc RSAParameters).
private static byte[] FormatKeyExchange(byte[] sessionKey,
RSAParameters rsaParams) {

// Tao mt giai thut bt di xng RSA.
using (RSACryptoServiceProvider asymAlg =
new RSACryptoServiceProvider()) {

// Nap PUBLIC KEY cua ngi nhn.
asymAlg.ImportParameters(rsaParams);

// Tao mt RSA OAEP formatter d dnh dang d liu trao di.
RSAOAEPKeyExchangeFormatter formatter
= new RSAOAEPKeyExchangeFormatter();

// Ch dnh giai thut RSA dung d mt ha kha phin.
formatter.SetKey(asymAlg);

// Mt ha v dnh dang kha phin ri tra v kt qua.
return formatter.CreateKeyExchange(sessionKey);
}
582
Chng 14: ?x` op
}
// Phng thc dung d giai mt ha d liu trao di v trch kha phin
// di xng. giai mt ha d liu trao di, chng ta cn truy xut
// PRIVATE KEY (tu kho cha kha do di s cspParams ch dnh).
private static byte[] DeformatKeyExchange(byte[] exchangeData,
CspParameters cspParams) {

// Tao mt giai thut bt di xng RSA.
using (RSACryptoServiceProvider asymAlg =
new RSACryptoServiceProvider(cspParams)) {

// Tao mt RSA OAEP deformatter d trch kha phin
// tu d liu trao di.
RSAOAEPKeyExchangeDeformatter deformatter
= new RSAOAEPKeyExchangeDeformatter();

// Ch dnh giai thut RSA dung d giai mt ha d liu trao di.
deformatter.SetKey(asymAlg);
// Giai mt ha d liu trao di v tra v kha phin.
return deformatter.DecryptKeyExchange(exchangeData);
}
}
}
Ph*' KeyExchangeExample s@ sinh ra kIt ;ut tMng t= nh sau\
Session Key at Source = EE-5B-16-5B-AC-46-3D-2-CC-3-19-D9-0B-8A-19-E2-A6-02-13-
BE-F8-CE-DF-40
Exchange Data = 60-FA-3B-63-41-25-F1-AD-08-F9-FC-6-CD-C6-FB-3E-0F-C3-62-
C6-3F-5C-C0-E-D1-60-2D-19-58-0-EE-BB-C-53-A5-C2-FB-CA-D-64-FF-BA-33--AC-52-
8-5F-5-E-5-99-01-90-CD-0-36-1E-53-0C-82-C6-CE-B8-BC-8B-C9-39-6F-29-39-5F-6C-
A6-43-E5-B0-A1-42-46-1C-9B-1C-2-EB-5E-6-06-44-C0-CE-AB-0-B8-39-8E-9F-01-E8-49-
51-36-D6-2-09-94-DA-42-CE-9-C2-2-88-4D-CE-63-B4-A0-AC-0-AF-26-A-6-DE-21-BE-
A5
Session Key at Destination = EE-5B-16-5B-AC-46-3D-2-CC-3-19-D9-0B-8A-19-E2-A6-
02-13-BE-F8-CE-DF-40
583
Chng 14: ?x` op
15
584
Ch01n2 3X4nHP NoN* LI&N TC /l L(NH nHpN*G
qCGQUPNGLr
585
586
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
")ro8o?/ .NET Framework l .t nn c=c k cao v0ng8 l s= kIt h$p ca .t ng4n
ngK .i gC#h8 .t & th=c thi $cz9unzlB gCL=h8 .t nn cho cc :ng )ng
@e4 g&")ro8o?/ >*P.NETh8 v .t th vin lp rt ln ;<' )=ng tt c cc kiu
:ng )ng. 7u' nhi>n8 .NET Framework kh4ng l!p l*i cc t2nh nvng cF trong .S lnh kh4ngz
$cz9unzlB. nin thi8 .NET Framework kh4ng &ao gt. .0i h. cF trong @"nC2 >P<8
trong khi nhiu )oanh nghip ang sO )ng cc gii php ph:c t*p $c ;<' )=ng vi cc
ng4n ngK )=aztr>nzCF& nh &")ro8o?/ V"8uaD $a8") Y v &")ro8o?/ V"8uaD CSS Y. "a' ./n
l &")ro8o?/ kh4ng cF B nhKng )oanh nghip F &V i nn tng .S lnh . h0 S ;<' )=ng
khi chu'n sang nn .NET. 7ha' vo F8 .NET Framework $c trang &i vi cc t2nh nvng
"n/eroKera4"D"/y gkh nvng li>n tch8 cho phXp &*n sO )ng l*i .S lnh c? gDega)y )oAeh trong
cc :ng )ng .NET Framework v tru' ;ut cc ass(.&l' .NET nh th chGng l cc thnh
phNn CF&. PhMng n' s@ tho lu6n cc vn sau\
&
Pch g0i cc h. thuc ELL kh4ngz$cz9unzlB g.c Z`.Z In Z`.`h.
Pch sO )ng thnh phNn CF& trong :ng )ng .NET Framework g.c Z`.a In Z`.bh.
Pch sO )ng iu ki. >)/"Be: trong :ng )ng .NET Framework g.c Z`.ch.
Pch t*o .t thnh phNn .NET sao cho .t CF&Icli(nt cF th sO )ng nF g.c Z`.Zdh.
1'
1' 3 i m t hm trong m t A99 "h,ng- c-)u n-l* 3 i m t hm trong m t A99 "h,ng- c-)u n-l*
#eA JwA B@ OIQ >\O C QHXAB OIQ ..( !] J^ Q>t Y\ OIQ >\O Jbc *in)' ;,/
>X_J hX FeA D@jQ(
3>c@ FSX OIQ d>V[AB Q>~J QHXAB O} C# O\ FeA fm fg hUAB Lt QHZ] vZPQ >\O
s>TAB6LVWJ6ZRA6Y( 3>c@ FSX d>V[AB Q>~J A\] Y\ static D\ extern, Sd hUAB
L_J QaA> $!stem.&untime.Enterop$ervices.-llEmport#ttribute Lt J> LMA> @Y
.. D\ QCA Jbc >\O JwA hrAB(
l sO )ng .t h. P tQ .t th vin ngoi8 &*n chJ cNn khai &o nF .t cch th2ch h$p.
C=L s@ t= ng . trch phNn vic ckn l*i8 &ao gt. vic ti ELL vo & nh khi h. $c
g0i v chu'n cc th4ng sD tQ kiu )K liu .NET thnh kiu )K liu C.
Uich v .NET h# tr$ vic th=c thi ;u'>nznn n' cF t>n l P<nBoke gPDa/?orm <nBokeh8 v 9u
tr%nh n' thng l trong suDt Di vi ngi sO )ng. 7hJnh thong8 &*n s@ cNn th=c hin th>.
.t sD vic8 ch~ng h*n cNn h# tr$ cu trGc trongz&znh g"nImemory 8/ru)/ureh8 call&ack8 ha'
chu#i cF th tha' si gmu/a4De 8/r"ngh.
P<nBoke thng $c sO )ng tru' ;ut cc h. @"nC2 >P<8 !c &it l cc t2nh nvng
kh4ng cF trong cc lp $cz9unzlB thuc .NET Framework. Pc v2 ) $c tr%nh &' trong
chMng n' s@ sO )ng P<nBoke th(o cch n'. PF &a th vin ch2nh trong @"nC2 >P<\
kerneDC2.ADD gt. cc h. !cztrngzhziuzhnh nh n*p tiIn tr%nh8 chu'n ngK
cnh8 nh6p,;ut fil( v & nh.
u8erC2.ADD gt. cc h. )eng thao tc cOa ss8 tr%nh Mn8 hp tho*i8 &iu t$ng8
587
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
gA"C2.ADD gt. cc h. t h0a )eng v@ tr=c tiIp l>n cOa ss8 tr%nh Mn8 & .!t
iu ki.8 c?ng nh in n.
u2 )8 ;Xt cc h. @"nC2 >P< )eng 0c v ghi cc fil( <N<8 ch~ng h*n
GetPrivateProfileString v WritePrivateProfileString trong kerneDDC2.ADD. .NET
Framework kh4ng cF lp no &0c l' ch:c nvng n'. 7u' nhi>n8 cF th nh6p cc h. n'
&5ng !c t2nh DllImportAttribute nh sau\
[DllImport("kernel32.DLL", EntryPoint="WritePrivateProfileString")]
private static extern bool WritePrivateProfileString(string lpAppName,
string lpKeyName, string lpString, string lpFileName);
Pc Di sD trong phMng th:c WritePrivateProfileString phi tMng th2ch vi h. trong
ELL8 nIu kh4ng s@ cF l#i khi g0i nF. u% phMng th:c WritePrivateProfileString $c khai
&o tha. chiIu In .t h. trong ELL n>n &*n kh4ng $c viIt .S cho nF. RhNn
EntryPoint trong !c t2nh DllImportAttribute trong v2 ) n' l te' ch0n8 v% t>n phMng
th:c $c khai &o S treng vi t>n ca h. trong th vin ngoi.
7rong v2 ) sau8 lp IniFileWrapper khai &o cc phMng th:c ri>ng tha. chiIu ti cc h.
@"nC2 >P<8 sau F g0i chGng tQ cc phMng th:c c4ng khai khc )=a tr>n fil( $c chJ inh\
using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class IniFileWrapper {
private string filename;
public string Filename {
get {return filename;}
}
public IniFileWrapper(string filename) {
this.filename = filename;
}
[DllImport("kernel32.dll", EntryPoint="GetPrivateProfileString")]
private static extern int GetPrivateProfileString(string lpAppName,
string lpKeyName, string lpDefault, StringBuilder lpReturnedString,
int nSize, string lpFileName);
[DllImport("kernel32.dll", EntryPoint="WritePrivateProfileString")]
588
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
private static extern bool WritePrivateProfileString(
string lpAppName, string lpKeyName,
string lpString, string lpFileName);
// Bn hm sau khng doc su dng trong v d ny,
// nhng doc khai bo cho dy du.
[DllImport("kernel32.dll", EntryPoint="WritePrivateProfileInt")]
private static extern int GetPrivateProfileInt(string lpAppName,
string lpKeyName, int iDefault, string lpFileName) ;
[DllImport("kernel32.dll", EntryPoint="GetPrivateProfileSection")]
private static extern int GetPrivateProfileSection(
string lpAppName, byte[] lpReturnedString,
int nSize, string lpFileName);
[DllImport("kernel32.dll", EntryPoint="WritePrivateProfileSection")]
private static extern bool WritePrivateProfileSection(
string lpAppName, byte[] data, string lpFileName);
[DllImport("kernel32.dll",
EntryPoint="GetPrivateProfileSectionNames")]
private static extern int GetPrivateProfileSectionNames(
byte[] lpReturnedString, int nSize, string lpFileName);
public string GetIniValue(string section, string key) {
StringBuilder buffer = new StringBuilder();
string sDefault = "";
if (GetPrivateProfileString(section, key, sDefault,
buffer, buffer.Capacity, filename) != 0) {
return buffer.ToString();
} else {
return null;
}
}
589
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
public bool WriteIniValue(string section, string key, string value) {
return WritePrivateProfileString(section, key, value, filename);
}
}
P>V[AB Q>~J 7et/rivate/ro*ile$tring J^ OIQ Q>TAB fK Q>ZIJ s@tZ $tring6uilder
ilp&eturned$tringk( !^ Y\ Dl J>Zx@ A\] d>R@ Y\ s>R L@s>@ Yo@ B@ >\O >X\A QPQ,
A^ fm J>~c Q>TAB Q@A Jbc @Y /N/( #PQ J~ s>@ A\X JwA J>Zx@ s>R L@, FeA d>R@ fg
hUAB $tring6uilder Q>c] J>X $tring( T>TAB Q>VoAB, FeA JwA QeX $tring6uilder
DE@ OIQ FI LqO s Qn J^ saJ> Q>VEJ vSJ LMA>, H@ QHZ]GA saJ> Q>VEJ A\] in$iIek
J>X d>V[AB Q>~J( #eA J^ Q>t J> LMA> fK YVWAB s Qn QHXAB d>V[AB Q>~J s>@
hnAB Jbc $tring6uilder ivO OUJ ( Lt J^ Q>CO Q>TAB Q@A DG $tring6uilderk(
l thO nghi. lp IniFileWrapper8 &*n hS' t*o .t fil( <N< ch:a th4ng tin sau\
[SampleSection]
Key1=Value1
Key2=Value2
Key3=Value3
u th=c thi o*n .S sau 0c v ghi .t gi tri trong fil( <N<.
public class IniTest {
private static void Main() {
IniFileWrapper ini = new IniFileWrapper(
Application.StartupPath + "initest.ini");
string val = ini.GetIniValue("SampleSection", "Key1");
Console.WriteLine("Value of Key1 in [SampleSection] is: " + val);
ini.WriteIniValue("SampleSection", "Key1", "New Value");
val = ini.GetIniValue("SampleSection", "Key1");
Console.WriteLine("Value of Key1 in [SampleSection] is now: " +
val);
ini.WriteIniValue("SampleSection", "Key1", "Value1");
Console.ReadLine();
}
}
590
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
2'
2' 9 y handle c a m t i u "i m8 c a s 8 ho c $ile 9 y handle c a m t i u "i m8 c a s 8 ho c $ile
#eA JwA B@ OIQ >\O s>TAB6LVWJ6ZRA6Y, D\ >\O A\] JwA >cAhY Jbc OIQ L@GZ
s@tO, Jgc f, >X_J @Y(
N>@GZ YEd, FcX BO YEd "ile$tream D\ QPQ JR YEd hpA vZPQ Q Control, QHR DG
>cAhY iQ>ZIJ JPZ QHJ Ent/trk Q>TAB Zc Q>ZIJ QaA> Handle( CAB J^ YEd QHR DG
Q>TAB Q@A QV[AB Qn Da hU, YEd $!stem.-iagnostics./rocess J^ Q>CO Q>ZIJ QaA>
/rocess.Mainindo%Handle ABX\@ Q>ZIJ QaA> Handle(
.NET Framework kh4ng ch( )u cc chi tiIt n5. )i8 ch~ng h*n han)l( )eng cho cOa ss v
iu ki.. "!c )e kh4ng thng sO )ng th4ng tin n'8 &*n cF th l' nF khi cNn g0i .t
h. kh4ngz$cz9unzlB v h. n' cNn In nF.
{Xt :ng )ng )i <'8 for. ch2nh lu4n hin thi tr>n tt c cc cOa ss khc &t k nF cF focus
ha' kh4ng gcF $c ch:c nvng n' &5ng cch thiIt l6p thuc t2nh Form.TopMost l trueh.
or. ckn cF .t Timer inh k g0i cc h. kh4ngz$cz9unzlB GetForegroundWindow v
GetWindowText l' th4ng tin ca cOa ss hin ang cF focus. Hgoi ra8 han)l( ca for.
ch2nh $c l' th4ng 9ua thuc t2nh Form.Handle8 rti $c so snh vi han)l( ca for. hin
ang t2ch c=c ki. tra for. ch2nh ang cF focus ha' kh4ng.

0nh 15'1 Thng tin v ca s dang tch cuc
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Text;
public class ActiveWindowInfo : System.Windows.Forms.Form {
// (Bo qua phn m designer.)
private System.Windows.Forms.Timer tmrRefresh;
private System.Windows.Forms.Label lblCurrent;
private System.Windows.Forms.Label lblHandle;
591
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
private System.Windows.Forms.Label lblCaption;
[DllImport("user32.dll")]
private static extern int GetForegroundWindow();
[DllImport("user32.dll")]
private static extern int GetWindowText(int hWnd, StringBuilder text,
int count);
private void tmrRefresh_Tick(object sender, System.EventArgs e) {
int chars = 256;
StringBuilder buff = new StringBuilder(chars);
int handle = GetForegroundWindow();
if (GetWindowText(handle, buff, chars) 0) {
lblCaption.Text = buff.ToString();
lblHandle.Text = handle.ToString();
if (new IntPtr(handle) == this.Handle) {
lblCurrent.Text = "True";
} else {
lblCurrent.Text = "False";
}
}
}
}
HcAhY Jbc XHO LVWJ ZRA Y OIQ JSJ> QHXAB fZKQ LK@ DE@ ABVo@ hrAB( T>c] L@
Q>ZIJ QaA> A\X L^ Jbc XHO J^ Q>t s>@jA J>X C>. QeX OIQ >cAhY OE@( DX L^,
FeA ACA YZTA QHZ] vZPQ >cAhY ABc] QHVEJ s>@ fg hUAB A^ is>TAB ACA B@? A^
QHXAB OIQ F@jA Lt fg hUAB QHXAB OIQ Q>o@ B@cA h\@k(
3'
3' 3 i m t hm "h,ng- c-)u n-l* c' s d ng c u tr;c 3 i m t hm "h,ng- c-)u n-l* c' s d ng c u tr;c
#eA JwA B@ OIQ >\O s>TAB6LVWJ6ZRA6Y J^ Q>TAB fK Y\ OIQ JPZ QHJ(
!MA> AB>c JPZ QHJ QHXAB O} C#( Sg hUAB L_J QaA>
$!stem.&untime.Enterop$ervices.$truct+a!out#ttribute Lt JPZ >lA> D@qJ JPd FI
A>E J>X JPZ QHJ( Sg hUAB d>V[AB Q>~J QA> $iIe(* Jbc YEd
592
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
$!stem.&untime.Enterop.Mars.al AjZ OZKA vSJ LMA> saJ> Q>VEJ Jbc JPZ QHJ
Q>X F]Q(
7rong .S C# thuNn tG'8 &*n kh4ng cF kh nvng tr=c tiIp ki. sot vic cp & nh. 7ha' vo
F8 C=L s@ 9u'It inh khi no cNn a )K liu vo & nh tDi u hFa ho*t ng. liu n'
g<' r/c rDi khi l. vic vi cc h. C8 v% cu trGc phi $c trK li>n tc trong & nh. "a'
./n l .NET S gii 9u'It vn n' &5ng !c t2nh StructLayoutAttribute8 cho phXp &*n chJ
inh cc thnh vi>n ca .t lp ha' .t cu trGc cho trc s@ $c s/p ;Ip trong & nh nh
thI no.
u2 )8 ;Xt h. GetVersionEx trong th vin kerneDC2.ADD. n. n' nh6n .t con trV chJ ti
cu trGc OSVERSIONINFO v sO )ng nF tr v th4ng tin phi>n &n ca h iu hnh. l sO
)ng cu trGc OSVERSIONINFO trong .S C#8 &*n phi inh nghqa nF vi !c t2nh
StructLayoutAttribute nh sau\
[StructLayout(LayoutKind.Sequential)]
public class OSVersionInfo {
public int dwOSVersionInfoSize;
public int dwMajorVersion;
public int dwMinorVersion;
public int dwBuildNumber;
public int dwPlatformId;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)]
public String szCSDVersion;
}
PhG B r5ng8 cu trGc n' c?ng sO )ng !c t2nh System.Runtime.InteropServices.
MarshalAsAttribute gcNn cho cc chu#i cF k2ch thc kh4ng sih. A <'8
MarshalAsAttribute chJ inh chu#i s@ $c tru'n &5ng tri v s@ ch:a .t & . gt. Z]b
kB t= $c chJ inh trong cu trGc OSVersionInfo. 7rong v2 ) n'8 LayoutKind.Sequential
$c sO )ng8 nghqa l cc kiu )K liu trong cu trGc $c &D tr2 th(o th: t= . chGng $c
lit k> trong cu trGc ho!c lp.
Hgoi LayoutKind.Sequential8 &*n cF th sO )ng LayoutKind.Explicit. 7rong trng h$p
n'8 &*n phi sO )ng FieldOffsetAttribute inh nghqa )i ca cc trng. Pch n'
hKu 2ch khi &*n .uDn lu trK cc trng .t cch linh ng hMn8 ho!c &*n .uDn &V 9ua
gkh4ng sO )ngh trng no F. u2 ) sau inh nghqa lp OSVersionInfo vi
LayoutKind.Explicit.
[StructLayout(LayoutKind.Explicit)]
public class OSVersionInfo {
[FieldOffset(0)] public int dwOSVersionInfoSize;
593
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
[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;
}
|au khi S inh nghqa cu trGc $c sO )ng &Ci h. GetVersionEx8 &*n cF th khai &o h.
n' v sO )ng nF. ng )ng )i <' s@ tr%nh &' ton & .S lnh cNn thiIt. PhG B8
InAttribute v OutAttribute $c p )ng cho OSVersionInfo &iIt r5ng .arshalling s@
$c th=c hin tr>n cu trGc n' khi nF $c tru'n cho h. v khi nF $c tr v tQ h..
Hgoi ra8 phMng th:c Marshal.SizeOf $c sO )ng t2nh k2ch thc ca cu trGc trong &
nh.
using System;
using System.Runtime.InteropServices;
public class CallWithStructure {
// (Bo qua lp OSVersionInfo.)
[DllImport("kernel32.dll")]
public static extern bool GetVersionEx([In, Out] OSVersionInfo osvi);
private static void Main() {
OSVersionInfo osvi = new OSVersionInfo();
osvi.dwOSVersionInfoSize = Marshal.SizeOf(osvi);

GetVersionEx(osvi);
Console.WriteLine("Class size: " + osvi.dwOSVersionInfoSize);
Console.WriteLine("Major Version: " + osvi.dwMajorVersion);
Console.WriteLine("Minor Version: " + osvi.dwMinorVersion);
Console.WriteLine("Build Number: " + osvi.dwBuildNumber);
Console.WriteLine("Platform Id: " + osvi.dwPlatformId);
Console.WriteLine("CSD Version: " + osvi.szCSDVersion);
Console.WriteLine("Platform: " + Environment.OSVersion.Platform);
Console.WriteLine( "Version: " + Environment.OSVersion.Version);
Console.ReadLine();
}
594
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
}
HIu ch*' :ng )ng n' tr>n h thDng @"nAow8 :P8 &*n s@ th' th4ng tin nh sau\
Class size: 148
Major Version: 5
Minor Version: 1
Build Number: 2600
Platform Id: 2
CSD Version: Service Pack 1
Platform: Win32NT
Version: 5.1.2600.0
4' 4' 3 i m t hm "h,ng- c-)u n-l* c' s d ng call!ac" 3 i m t hm "h,ng- c-)u n-l* c' s d ng call!ac"
#eA JwA B@ OIQ >\O s>TAB6LVWJ6ZRA6Y D\ J>X d>d A^ B@ OIQ >\O s>SJ(
TeX OIQ b] A>@qO J>X JcYYFcJs( Sg hUAB b] A>@qO A\] s>@ LMA> AB>c D\ fg
hUAB >\O s>TAB6LVWJ6ZRA6Y(
Hhiu h. ca @"nC2 >P< sO )ng call&ack. u2 )8 nIu .uDn l' t>n ca tt c cc cOa ss
ang .C8 &*n cF th sO )ng h. EnumWindows trong th vin u8erC2.ADD . whi g0i
EnumWindows8 &*n cNn tru'n cho nF .t con trV chJ In .t h. khc trong .S lnh ca &*n.
n iu hnh @"nAow8 sau F s@ g0i h. n' .#i khi t%. th' .t cOa ss ang .C8 v tru'n
han)l( ca cOa ss cho nF.
.NET Framework cho phXp &*n 9un lB vic sO )ng call&ack . kh4ng cNn cc con trV v
cc khDi .S kh4ng an ton. 7ha' vo F8 &*n cF th inh nghqa v sO )ng .t ' nhi. chJ
In h. call&ack. whi &*n tru'n ' nhi. cho h. EnumWindows8 CL= s@ t= ng .arshal '
nhi. thnh con trV h. kh4ngz$cz9unzlB nh .ong .uDn.
u2 ) )i <' sO )ng EnumWindows ceng vi .t call&ack hin thi t>n ca tt c cc cOa
ss ang .C.
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-doc-quan-l s kch hoat callback
595
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
// khi duyt qua cc cua s dang mo.
[DllImport("user32.dll")]
public static extern int EnumWindows(CallBack callback, int param);

[DllImport("user32.dll")]
public static extern int GetWindowText(int hWnd,
StringBuilder lpString, int nMaxCount);

private static void Main() {
CallBack callBack = new CallBack(DisplayWindowInfo);
// Yu cu h diu hnh duyt qua cc cua s dang mo,
// kch hoat callback vi handle cua mi cua s.
EnumWindows(callBack, 0);
Console.ReadLine();
}

// Hm s nhn callback. Thng s th hai
// khng doc su dng nhng phai doc khai bo d
// tng thch vi ch k cua callback.
public static bool DisplayWindowInfo(int hWnd, int lParam) {
int chars = 100;
StringBuilder buf = new StringBuilder(chars);
if (GetWindowText(hWnd, buf, chars) != 0) {
Console.WriteLine(buf);
}
return true;
}
}
5'
5' 9 y th,ng tin l i "h,ng- c-)u n-l* 9 y th,ng tin l i "h,ng- c-)u n-l*
#eA JwA QHZ] vZPQ Q>TAB Q@A Yx@ iO} Yx@ >X_J Q>TAB L@qd OT QR Yx@k B@R@ Q>aJ> Qe@
fcX OIQ Yo@ B@ *in)' ;,/ Q>PQ Fe@(
THXAB d>wA s>c@ FSX Jbc >\O s>TAB6LVWJ6ZRA6Y, Q>@jQ YNd QHVoAB
$et+ast0rror Jbc L_J QaA> -llEmport#ttribute Y\ true( NjZ J^ Yx@ s>@ Q>nJ Q>@, B@
596
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
d>V[AB Q>~J QA> Mars.al.7et+astinDA0rror Lt QHZ] vZPQ O} Yx@( !t YP] Q>TAB
L@qd OT QR OIQ O} Yx@ JU Q>t, fg hUAB >\O s>TAB6LVWJ6ZRA6Y "ormatMessage(
L*n kh4ng th tr=c tiIp l' th4ng tin l#i &5ng h. kh4ngz$cz9unzlB GetLastError. un
l8 .S l#i )o GetLastError tr v cF th kh4ng phn nh l#i )o h. kh4ngz$cz9unzlB g<'
ra. 7ha' vo F8 nF cF th $c thiIt l6p &Ci cc lp .NET Framework khc ho!c CL=. L*n cF
th l' th4ng tin l#i .t cch an ton &5ng phMng th:c tqnh Marshal.GetLastWin32Error.
RhMng th:c n' cNn $c g0i nga' sau li g0i h. kh4ngz$cz9unzlB8 v nF s@ tr v
th4ng tin l#i chJ .t lNn gcc lNn g0i GetLastWin32Error sau F s@ tr v .S l#i 12Lh. Hgoi
ra8 &*n phi thiIt l6p trng SetLastError ca !c t2nh DllImportAttribute l true8 cho &iIt
nhKng l#i )o h. n' sinh ra s@ $c ghi nh6n.
[DllImport("user32.dll", SetLastError=true)]
|au F8 &*n cF th sO )ng h. FormatMessage trong th vin kerneDC2.ADD l' th4ng ip
.4 t l#i tQ .S l#i @"nC2.
u2 )8 :ng )ng )i <' .uDn hin thi .t MessageBox8 nhng l*i sO )ng han)l( kh4ng
Gng. "S l#i $c l' &5ng Marshal.GetLastWin32Error8 v th4ng ip .4 t l#i $c l'
&5ng FormatMessage.
using System;
using System.Runtime.InteropServices;
public class TestError {
[DllImport("kernel32.dll")]
private unsafe static extern int FormatMessage(int dwFlags,
int lpSource, int dwMessageId, int dwLanguageId,
ref String lpBuffer, int nSize, int Arguments);
[DllImport("user32.dll", SetLastError=true)]
public static extern int MessageBox(int hWnd, string pText,
string pCaption, int uType);
private static void Main() {
int badWindowHandle = 453;
MessageBox(badWindowHandle, "Message", "Caption", 0);
int errorCode = Marshal.GetLastWin32Error();
Console.WriteLine(errorCode);
Console.WriteLine(GetErrorMessage(errorCode));
597
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
Console.ReadLine();
}
// GetErrorMessage tra v thng dip li
// tng ng vi m li errorCode.
public static string GetErrorMessage(int errorCode) {
int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100;
int FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200;
int FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000;
int messageSize = 255;
string lpMsgBuf = "";
int dwFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS;

int retVal = FormatMessage(dwFlags, 0, errorCode, 0,
ref lpMsgBuf, messageSize, 0);
if (0 == retVal) {
return null;
} else {
return lpMsgBuf;
}
}
}
|au <' l kIt ;ut ca :ng )ng\
1400
Invalid window handle.
6' 6' 0 d ng thnh %h n CL5 trong ?N@T-client 0 d ng thnh %h n CL5 trong ?N@T-client
#eA JwA fg hUAB Q>\A> d>wA C3M QHXAB OIQ (NET?JY@AQ(
Sg hUAB OIQ ,rimar: /nterop ;ssem9l:, AjZ J^( NjZ s>TAB, QeX OIQ >%ntime
Calla9le *rapper F`AB T:pe .i9rar: /mporter iTl9imp.e8ek, >X_J QaA> AAB ;&&
>eference QHXAB $is%al St%&io .NET(
598
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
.NET Framework h# tr$ kh nvng li>n tc vi CF&. l cho phXp .NETIcli(nt tMng tc vi
.t thnh phNn CF&8 .NET sO )ng .t =un/"me CaDDa4De @raKKer g=C@hE.t lp pro;'
!c &it Fng vai trk trung gian giKa .S .NET v thnh phNn CF&. =C@ s@ ;O lB tt c chi
tiIt8 &ao gt. vic .arshal cc kiu )K liu8 sO )ng cc giao )in CF& tru'n thDng8 v ;O
lB cc s= kin CF&.
L*n cF &a te' ch0n khi sO )ng .t =C@\
y' =C@ tQ tc gi ca thnh phNn CF&. 7rong trng h$p n'8 =C@ $c g0i l .t
Pr"mary <n/eroK >88em4Dy gP<>h.
7*o =C@ &5ng tin 2ch )kng lnh TD4"mK.e2e ho!c &5ng V"8uaD */uA"o .NET.
7= t*o =C@ th4ng 9ua cc kiu trong kh4ng gian t>n System.Runtime.
InteropServices gcch n' c=c k )i )kng v ph:c t*ph.
HIu .uDn sO )ng V"8uaD */uA"o .NET t*o =C@8 &*n chJ cNn ch0n ProJe)/ >AA =e?eren)e
v sau F ch0n thnh phNn th2ch h$p trong thj CF&. <n/eroK >88em4Dy s@ $c t*o ra v $c
th>. vo cc tha. chiIu ca )= n. |au F8 &*n cF th sO )ng F4Je)/ $row8er kho st
cc kh4ng gian t>n v cc lp cF trong thnh phNn n'.

0nh 15'2 S dung Obect Browser


d xem cc khng gian tn v cc lp c trong thnh phn COM
HIu kh4ng sO )ng V"8uaD */uA"o .NET8 &*n cF th t*o .t @raKKer >88em4Dy &5ng c4ng c
TD4"mK.e2e8 chJ cNn tru'n cho nF t>n fil( ch:a thnh phNn CF&. u2 )8 )kng lnh sau <' s@
t*o .t =C@ vi t>n fil( v kh4ng gian t>n .!c inh8 gi sO fil( &yCF&ComKonen/.ADD ang
n5. trong th .c hin hnh.
tlbimp M!C(MComponent.dll
pi sO &yCF&ComKonen/ ch:a .t th vin kiu cF t>n l &yCDa88e88 fil( =C@ s@ cF t>n l
&yCDa88e8.ADD v s@ trng cc lp ca nF th4ng 9ua .t kh4ng gian t>n cF t>n l &yCDa88e8.
L*n cF th cu h%nh cc te' ch0n n' &5ng cc Di sD )kng lnh g$c .4 t chi tiIt trong ti
599
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
liu &*ENh. u2 )8 &*n cF th sO )ng /out:[Filename] chJ inh t>n fil( ass(.&'8 sO )ng
/namespace:[Namespace] chJ inh kh4ng gian t>n. L*n c?ng cF th sO )ng
/:e!*ile[keyfilename] t*o t>n .*nh cho ass(.&l'8 v !t nF vo 6Do4aD >88em4Dy Ca)he
g6>Ch. |O )ng /primar! t*o .t P<>.
HIu cF th8 &*n n>n sO )ng P<> tha' v% t*o =C@. P<> ho*t ng ng tin c6' hMn v% $c
t*o ra &Ci nh pht hnh thnh phNn8 v c?ng cF th ch:a .t sD t2nh nvng n<ng cao. HIu .t
P<> $c vng kB vi h thDng cho .t thnh phNn CF& th% V"8uaD */uA"o .NET s@ t= ng
sO )ng P<> F khi &*n th>. .t tha. chiIu In thnh phNn CF&. u2 )8 aAoA4.ADD gcF
trong .NET Frameworkh cho phXp &*n sO )ng cc Di t$ng >EF tru'n thDng. HIu &*n
th>. .t tha. chiIu In thnh phNn &")ro8o?/ >)/"Be: Ea/a F4Je)/88 <n/eroK >88em4Dy n'
s@ t= ng $c sO )ng8 . kh4ng sinh ra .t =C@ .i. 7Mng t=8 &")ro8o?/ F??")e :P
cung cp .t P<> n<ng cao s= h# tr$ .NET cho F??")e >u/oma/"on g&*n cF th ti P<> n'
t*i ia chJ 8htt94::;<=n>;#c?o<oft>co;:=oZn@oB=<:@#<t:off#cD>B<9Hh.
u2 ) sau .inh h0a cch sO )ng CF& <n/eroK tru' ;ut cc Di t$ng >EF tru'n thDng
trong :ng )ng .NET Framework.
using System;
public class ADOClassic {
private static void Main() {
ADODB.Connection con = new ADODB.Connection();
string connectionString = "Provider=SLOLEDB.1;" +
"Data Source=localhost;" +
"Initial Catalog=Northwind;Integrated Security=SSPI";
con.Open(connectionString, null, null, 0);
object recordsAffected;
ADODB.Recordset rs = con.Execute("SELECT From Customers",
out recordsAffected, 0);
while (rs.EOF != true) {
Console.WriteLine(rs.Fields["CustomerID"].Value);
rs.MoveNext();
}
Console.ReadLine();
}
}
600
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
7'
7' 3i i %h'ng nhanh thnh %h n CL5 3i i %h'ng nhanh thnh %h n CL5
#eA JwA FRX LRO OIQ Q>\A> d>wA C3M LVWJ v^c s>@ FI A>E ABc] Q~J Q>l,
s>TAB d>R@ J>o FI Q>Z BXO HSJ i6ar9age Collectork Y\O D@qJ( HX_J FeA OZKA
FRX LRO JSJ LK@ QVWAB C3M LVWJ B@R@ d>^AB Q>X OIQ Q>~ Qn vSJ LMA>(
Sg hUAB d>V[AB Q>~J QA> Mars.al.&eleaseCom(bJect D\ QHZ]GA >C* Q>aJ> >Wd
Lt B@R@ d>^AB Q>cO J>@jZ LjA LK@ QVWAB C3M A`O hVE@(
CF& s@ I. cc tha. chiIu In Di t$ng ;c inh khi no Di t$ng s@ $c gii phFng.
whi &*n sO )ng .t =C@8 tha. chiIu s@ $c giK c khi &iIn Di t$ng v$t khVi tN. v=c.
7ha. chiIu n' chJ $c gii phFng khi & thu go. rc gii phFng Di t$ng =C@. Uo F8
&*n kh4ng th ki. sot vic cc Di t$ng CF& s@ $c gii phFng khi no ho!c th(o th: t=
no.
l v$t 9ua h*n chI n'8 &*n cF th sO )ng phMng th:c Marshal.ReleaseComObject. 7rong
v2 ) C .c Z`.a8 &*n hS' th>. hai )kng sau vo cuDi .S lnh gii phFng Di t$ng
Recordset v Connection n5. )i.
Marshal.ReleaseComObject(rs);
Marshal.ReleaseComObject(con);
VG O_Q s Q>ZNQ, d>V[AB Q>~J &eleaseCom(bJect s>TAB Q>nJ fn B@R@ d>^AB LK@
QVWAB C3M, A^ J> B@RO fK YVWAB Q>cO J>@jZ LjA LK@ QVWAB( NjZ fK Q>cO J>@jZ
Y\ (, LK@ QVWAB C3M fm LVWJ B@R@ d>^AB( TZ] A>@CA, AjZ JrAB Q>t >@qA Jbc OIQ
LK@ QVWAB C3M LVWJ fg hUAB Qe@ A>@GZ OZ O} YqA>, A^ d>R@ LVWJ B@R@ d>^AB
JSJ A[@ L^ QHVEJ s>@ LVWJ B@R@ d>^AB s>@ FI A>E(
8'
8' 0 d ng th,ng s t(y ch n 0 d ng th,ng s t(y ch n
#eA JwA B@ OIQ d>V[AB Q>~J QHXAB Q>\A> d>wA C3M O\ s>TAB d>R@ QHZ]GA QPQ
JR JSJ Q>TAB fK JwA Q>@jQ(
Sg hUAB QHVoAB )!pe.Missing(
nNu hIt cc phMng th:c trong .NET Framework u $c n*p chtng nhiu lNn &*n cF th
g0i phi>n &n '>u cNu chJ nhKng th4ng sD )o &*n cung cp. "!t khc8 CF& kh4ng h# tr$ vic
n*p chtng phMng th:c. 7ha' vo F8 cc thnh phNn CF& thng sO )ng cc phMng th:c
vi .t )anh sch )i cc th4ng sD te' ch0n. wh4ng .a' l8 C# kh4ng h# tr$ th4ng sD te'
ch0n8 nghqa l ngi pht trin phi cung cp th>. cc gi tri kh4ng cNn thiIt khi tru' ;ut
.t thnh phNn CF&. u v% cc th4ng sD CF& thng $c tru'n &5ng tha. chiIu n>n .S
lnh ca &*n kh4ng th tru'n .t tha. chiIu null8 . phi khai &o .t &iIn Di t$ng v
rti tru'n &iIn F.
L*n cF th gi. nh vn In .t chQng .=c no F &5ng cch cung cp trng
Type.Missing &t c: khi no .uDn &V 9ua .t th4ng sD te' ch0n. HIu cNn tru'n .t th4ng
601
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
sD &5ng tha. chiIu8 &*n chJ cNn khai &o .t &iIn Di t$ng8 thiIt l6p nF l Type.Missing8 v
sO )ng nF trong .0i trng h$p\
private static object n = Type.Missing;
u2 ) )i <' sO )ng Di t$ng @orA t*o v hin thi .t ti liu. 7rong F8 cF nhiu
phMng th:c '>u cNu cc th4ng sD te' ch0n g$c tru'n &5ng tha. chiIuh. uic sO )ng
trng Type.Missing Mn gin hFa .S lnh rt nhiu.
using System;
public class OptionalParameters {
private static object n = Type.Missing;
private static void Main() {
// Chay Word pha nn.
Word.ApplicationClass app = new Word.ApplicationClass();
app.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone;
// Tao mt ti liu mi (khng kha kin di vi ngi dung).
Word.Document doc = app.Documents.Add(re* n, re* n, re* n,
re* n);
Console.WriteLine();
Console.WriteLine("Creating new document.");
Console.WriteLine();
// Thm mt tiu d v hai hng text.
Word.Range range = doc.Paragraphs.Add(re* n).Range;
range.InsertBefore("Test Document");
string style = "Heading 1";
object objStyle = style;
range.set_Style(ref objStyle);

range = doc.Paragraphs.Add(re* n).Range;
range.InsertBefore("Line one.nLine two.");
range.Font.Bold = 1;
// Hin th Print Preview, lm cho Word tro nn kha kin.
doc.PrintPreview();
app.Visible = true;
602
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
Console.ReadLine();
}
}
9'
9' 0 d ng i u "i m /ctive+ trong ?N@T 0 d ng i u "i m /ctive+ trong ?N@T - -client client
#eA JwA L_Q OIQ L@GZ s@tO ;cti"e+ QHCA OIQ Jgc f ~AB hUAB (NET Framework(
Sg hUAB OIQ >C* iJAB B@KAB A>V DE@ OIQ Q>\A> d>wA C3M FlA> Q>VoABk( !t
Y\O D@qJ DE@ L@GZ s@tO ;cti"e+ s>@ Q>@jQ sj, Q>CO A^ D\X >Id JTAB JU Jbc $is%al
St%&io .NET(
.NET Framework h# tr$ nh nhau Di vi tt c cc thnh phNn CF&8 &ao gt. iu ki.
>)/"Be:. liu khc nhau cM &n l lp =C@ gcho iu ki. >)/"Be:h )3n ;ut tQ kiu .NET
!c &it System.Windows.Forms.AxHost. u .!t k thu6t8 &*n th>. AxHost vo for.8 v nF s@
giao tiIp vi iu ki. >)/"Be: ph2a h6u trng. u% )3n ;ut tQ
System.Windows.Forms.Control8 n>n AxHost c?ng cF cc thuc t2nh8 phMng th:c8 v s= kin
chuxn nh Location8 Size8 Anchor8.. HIu =C@ $c sinh t= ng8 cc lp AxHost lu4n &/t Nu
&5ng Ax.
L*n cF th t*o .t =C@ cho .t iu ki. >)/"Be: c?ng giDng nh cho &t c: thnh phNn
CF& no khc &5ng c4ng c TD4"mK.e2e ho!c t2nh nvng >AA =e?eren)e trong V"8uaD */uA"o
.NET8 sau F l6p tr%nh t*o iu ki.. 7u' nhi>n8 .t cch tiIp c6n )r hMn trong V"8uaD
*/uA"o .NET l th>. iu ki. >)/"Be: vo hp c4ng c g;(. .c ZZ._ &iIt th>. chi tiIth.
Ph~ng cF g% ;' ra khi &*n th>. .t iu ki. >)/"Be: vo hp c4ng c. 7u' nhi>n8 &*n cF
th sO )ng &iu t$ng trong hp c4ng c th>. .t th hin ca iu ki. vo for.. yNn
Nu &*n l. vic n'8 V"8uaD */uA"o .NET s@ t*o .t <n/eroK >88em4Dy v th>. nF vo )= n
ca &*n. u2 )8 nIu &*n th>. iu ki. &")ro8o?/ &a8keA EA"/ gkh4ng cF iu ki. .NET
tMng Mngh8 V"8uaD */uA"o .NET s@ t*o .t =C@ >88em4Dy cF t>n l >2<n/eroK.&*&a8k.ADD.
Ui <' l o*n .S trong veng )(sign(r )eng t*o .t th hin ca iu ki. n' v th>.
nF vo for.\
this.axMaskEdBox1 = new AxMSMask.AxMaskEdBox();
((System.ComponentModel.ISupportInitialize)(this.axMaskEdBox1)).
BeginInit();
//
// axMaskEdBox1
//
this.axMaskEdBox1.Location = new System.Drawing.Point(16, 12);
this.axMaskEdBox1.Name = "axMaskEdBox1";
this.axMaskEdBox1.OcxState = ((System.Windows.Forms.AxHost.State)
603
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
(resources.GetObject("axMaskEdBox1.OcxState")));
this.axMaskEdBox1.Size = new System.Drawing.Size(112, 20);
this.axMaskEdBox1.TabIndex = 0;
this.Controls.Add(this.axMaskEdBox1);
PhG B r5ng8 cc thuc t2nh te' &iIn ca iu ki. >)/"Be: kh4ng $c p )ng tr=c tiIp th4ng
9ua cc lnh thiIt l6p thuc t2nh. 7ha' vo F8 chGng s@ $c thiIt l6p th(o nhF. khi thuc
t2nh OcxState S $c thiIt l6p. 7u' nhi>n8 .S lnh ca &*n cF th sO )ng cc thuc t2nh n'
.t cch tr=c tiIp.
10'
10' T o thnh %h n ?N@T d(ng cho CL5-client T o thnh %h n ?N@T d(ng cho CL5-client
#eA JwA QeX OIQ Q>\A> d>wA (NET fcX J>X OIQ C3M?JY@AQ J^ Q>t B@ A^(
TeX OIQ cffOFY] Q>X JSJ J> hpA QHXAB OUJ A\]( TeX OIQ Q>V D@qA s@tZ J>X
cffOFY] A\] F`AB Q@qA aJ> hyAB YqA> T:pe .i9rar: E8porter iTl9e8p.e8ek(
.NET Framework h# tr$ vic CF&Icli(nt sO )ng thnh phNn .NET. whi CF&Icli(nt t*o .t
Di t$ng .NET8 CL= s@ t*o .t Di t$ng $cz9unzlB v .t CF& CaDDa4De @raKKer
gCC@h &0c l' Di t$ng n'. CF&Icli(nt s@ tMng tc vi Di t$ng th4ng 9ua CC@. CL=
chJ t*o .t CC@ cho .t Di t$ng $cz9unzlB8 &t chp cF &ao nhi>u CF&Icli(nt ang sO
)ng nF.
Pc kiu cNn $c tru' ;ut &Ci CF&Icli(nt phi thVa .Sn cc '>u cNu sau\
Pc kiu $cz9unzlB glp8 giao )in8 cu trGc8 ho!c kiu lit k>h phi $c khai &o l
public.
HIu CF&Icli(nt cNn t*o Di t$ng8 nF phi cF .t phMng th:c khCi )=ng .!c inh
public. CF& kh4ng h# tr$ cc phMng th:c khCi )=ng cF ch:a th4ng sD.
Pc thnh vi>n ca kiu cNn $c tru' ;ut phi l cc thnh vi>n public. CF&Icli(nt
kh4ng tru' ;ut $c cc thnh vi>n private8 protected8 internal8 v static.
Hgoi ra8 &*n n>n tu<n th(o cc kinh nghi. sau\
wh4ng n>n t*o cc 9uan h thQa kI giKa cc lp8 v% cc 9uan h n' s@ kh4ng kh kiIn
Di vi CF&Icli(nt g.!c )e .NET gi l6p 9uan h n' &5ng cch khai &o .t giao
)in lp cM sC )eng chungh.
Pc lp . &*n trng ra n>n hin th=c .t giao )in. ui .c 2ch ki. sot phi>n
&n8 &*n cF th sO )ng !c t2nh System.Runtime.InteropServices.GuidAttribute
chJ inh 6Q<E s@ $c gn cho giao )in.
H>n t*o t>n .*nh cho ass(.&l' nF cF th $c ci !t vo 6>C v $c )eng
chung cho nhiu cli(nt.
l t*o .t Di t$ng .NET8 CF&Icli(nt cNn .t th vin kiu gfil( ./D4h. il( th vin kiu cF
th $c t*o tQ .t ass(.&l' &5ng tin 2ch )kng lnh TD4e2K.e2e. u2 )\
tlbexp Managed+ibrar!.dll
604
Chng 15: Yhf nng mitn `c op mnnh uhing-c-yufn-mv
"t khi S t*o ra th vin kiu8 &*n cF th tha. chiIu nF tQ .t c4ng c pht trin kh4ngz
$cz9unzlB. ui V"8uaD $a8") Y8 &*n tha. chiIu fil( ./D4 tQ hp tho*i ProJe)/ P =e?eren)e.
7rong V"8uaD CSS Y8 &*n cF th sO )ng lnh #import nh6p cc inh nghqa kiu tQ th vin
kiu.
16
605
Ch01n2 3\4CC *IAJ ,I(N VQ /sU THpN* ,-N*
606
607
Chng 16: (c giao dinn }~ ou `hing deng
hMng n' tr%nh &' cch hin th=c cc .3u gKa//ernh s@ $c sO )ng thng ;u'>n
trong 9u tr%nh pht trin cc :ng )ng &")ro8o?/ .NET Framework. "t sD .3u
$c chuxn hFa &5ng cc giao )in $c inh nghqa trong th vin lp .NET
Framework. "t sD khc th% 2t c:ng nh/c hMn8 nhng v3n '>u cNu &*n th=c hin cc cch tiIp
c6n c th thiIt kI v hin th=c cc kiu ca &*n. Pc .c trong chMng n' .4 t cch\
P
7*o cc kiu khztuNnzt=zhFa &*n cF th )r )ng lu trK vo qa8 gOi 9ua .*ng8 ho!c
tru'n &5ng tri 9ua cc &i>n .in :ng )ng g.c Za.Zh.
Pung cp .t cM chI )eng t*o &n sao N' v ch2nh ;c ca Di t$ng g.c
Za.]h.
nin th=c cc kiu sao cho )r )ng so snh v s/p ;Ip g.c Za.^h.
n# tr$ vic lit k> cc phNn tO trong cc t6p h$p te' &iIn g.c Za._h.
Lo . r5ng .t kiu cF sO )ng cc ti ngu'>n kh4ngz$cz9unzlB s@ gii phFng
cc ti ngu'>n F khi kh4ng ckn cNn In chGng nKa g.c Za.`h.
nin thi )*ng chu#i ca cc Di t$ng &iIn si )=a tr>n ?orma/ 8Ke)"?"er g.c Za.ah.
nin th=c cc kiu Di sD s= kin v ngo*i l te' &iIn g&*n s@ thng ;u'>n sO )ng
chGng trong 9u tr%nh pht trin :ng )ngh g.c Za.[ v Za.bh.
nin th=c cc .3u thiIt kI th4ng )ng *"ngDe/on v F48erBer &5ng cc t2nh nvng cF sn
ca C# v th vin lp .NET Framework g.c Za.c v Za.Zdh.
1' 1' -i n th c "i u "h -tu n-t -h'a Qseriali>a!le ty%eR -i n th c "i u "h -tu n-t -h'a Qseriali>a!le ty%eR
#eA JwA >@qA Q>nJ OIQ s@tZ Qr] F@jA s>R6QZwA6Qn6>^c, J>X d>d FeAz
LVZ QH? JSJ Q>t >@qA Jbc s@tZ D\X s>X YVZ QH? i@Y >c] J[ f h? Y@qZk(
C>Z]tA JSJ Q>t >@qA Jbc s@tZ Zc OeAB(
THZ]GA JSJ Q>t >@qA Jbc s@tZ F`AB QHM Zc JSJ F@CA O@GA ~AB hUAB(
!K@ DE@ D@qJ QZwA Qn >^c JSJ s@tZ L[A B@RA, >}] Sd hUAB L_J QaA>
$!stem.$erialiIable#ttribute D\X s>c@ FSX s@tZ( !K@ DE@ JSJ s@tZ d>~J Qed >[A,
>X_J Lt s@tO fXSQ AI@ hZAB D\ JPZ QHJ Jbc h? Y@qZ LVWJ6QZwA6Qn6>^c, >}] >@qA
Q>nJ B@cX h@qA $!stem.&untime.$erialiIation.E$erialiIable(
"c ].Z] S tr%nh &' cch tuNn t= hFa v gii tuNn t= hFa .t Di t$ng &5ng cc lp
?orma//er g$c cp ceng vi th vin lp .NET Frameworkh. 7u' nhi>n8 th(o .!c inh th%
cc kiu kh4ng l khztuNnzt=zhFa. l hin th=c .t kiu te' &iIn l khztuNnzt=zhFa8 &*n
phi p )ng !c t2nh SerializableAttribute vo khai &o kiu. whi tt c cc trng )K liu
trong kiu u l khztuNnzt=zhFa8 vic p )ng SerializableAttribute l tt c nhKng g% cNn
l. khiIn cho kiu te' &iIn ca &*n l khztuNnzt=zhFa. HIu &*n hin th=c .t lp te'
&iIn )3n ;ut tQ .t lp cM sC8 lp cM sC c?ng phi l khztuNnzt=zhFa.
"#i lp ?orma//er ch:a logic cNn thiIt tuNn t= hFa cc kiu $c g/n vi !c t2nh
SerializableAttribute v s@ tuNn t= hFa tt c cc trng public8 protected8 v private.
608
Chng 16: (c giao dinn }~ ou `hing deng
lo*n .S )i <' tr%nh &' cc khai &o kiu v khai &o trng ca .t lp khztuNnzt=z
hFa cF t>n l Employee.
using System;
[Serializable]
public class Employee {
private string name;
private int age;
private string address;

}
CSJ YEd hpA vZPQ Q OIQ s@tZ s>R6QZwA6Qn6>^c s>TAB Q>c sj L_J QaA>
$erialiIable#ttribute( !t s>@jA J>X JSJ s@tZ hpA vZPQ Y\ s>R6QZwA6Qn6>^c, FeA
d>R@ s>c@ FSX J>AB Y\ s>R6QZwA6Qn6>^c F`AB JSJ> Sd hUAB L_J QaA>
$erialiIable#ttribute(
L*n cF th ngvn vic tuNn t= hFa .t trng no F &5ng cch p )ng !c t2nh
System.NonSerializedAttribute cho trng n'. L*n n>n ngvn vic tuNn t= hFa Di vi cc
trng sau\
Ph:a cc kiu )K liu kh4ngzkhztuNnzt=zhFa.
Ph:a cc gi tri cF th kh4ng h$p l khi Di t$ng $c gii tuNn t= hFa8 v2 )\ kIt nDi
cM sC )K liu8 ia chJ & nh8 <E ca tiu tr%nh8 v han)l( ca ti ngu'>n kh4ngz$cz
9unzlB.
Ph:a cc th4ng tin nh*' c. ha' ri>ng t8 v2 )\ .6t khxu8 khFa .6t hFa8 v cc chi
tiIt ri>ng v ngi ha' ts ch:c.
Ph:a cc )K liu )r )ng ti t*o ha' thu l' $c tQ cc ngutn khcE!c &it khi )K
liu ln.
HIu ngvn vic tuNn t= hFa .t sD trng8 &*n phi hin th=c kiu sao cho &e l*i vic nhKng
)K liu no F s@ kh4ng hin )in khi .t Di t$ng $c gii tuNn t= hFa. lng tiIc8 &*n
kh4ng th t*o ha' thu l' cc trng )K liu &i .t trong .t phMng th:c khCi )=ng v%
?orma//er kh4ng g0i phMng th:c khCi )=ng trong 9u tr%nh gii tuNn t= hFa Di t$ng. pii
php th4ng thng nht l hin th=c .3u +LaOy <n"/"aD"Oa/"on-8 trong F kiu ca &*n s@ t*o
ha' thu l' )K liu nga' lNn Nu ti>n cNn In.
lo*n .S )i <' tr%nh &' .t phi>n &n S $c chJnh sOa ca lp Employee vi !c t2nh
NonSerializedAttribute $c p )ng cho trng address8 nghqa l ?orma//er s@ kh4ng tuNn
t= hFa gi tri ca trng n'. yp Employee hin th=c cc thuc t2nh c4ng khai )eng tru'
;ut cc thnh vi>n )K liu ri>ng8 l nMi thu6n tin hin th=c +LaOy <n"/"aD"Oa/"on- cho
trng address.
609
Chng 16: (c giao dinn }~ ou `hing deng
using System;
[Serializable]
public class Employee {
private string name;
private int age;
[NonSerialized]
private string address;
// Phng thc khoi dng dn gian.
public Employee(string name, int age, string address) {

this.name = name;
this.age = age;
this.address = address;
}
// Thuc tnh cng khai dung d truy xut tn cua nhn vin.
public string Name {
get { return name; }
set { name = value; }
}
// Thuc tnh cng khai dung d truy xut tui cua nhn vin.
public int Age {
get { return age; }
set { age = value; }
}

// Thuc tnh cng khai dung d truy xut da ch cua nhn vin.
// Su dng "Lazy Initialization" d thit lp da ch v
// di tong doc-giai-tun-t-ha s khng c gi tr da ch.
public string Address {
get {
if (address == null) {
610
Chng 16: (c giao dinn }~ ou `hing deng
// Nap da ch tu kho lu tr.
}
return address;
}

set {
address = value;
}
}
}
lDi vi phNn ln cc kiu te' &iIn8 vic sO )ng !c t2nh SerializableAttribute v
NonSerializedAttribute s@ p :ng nhu cNu tuNn t= hFa ca &*n. HIu cNn ki. sot 9u
tr%nh tuNn t= hFa8 &*n cNn hin th=c giao )in ISerializable. Pc lp ?orma//er sO )ng logic
khc nhau khi tuNn t= hFa v gii tuNn t= hFa th hin ca cc kiu cF hin th=c
ISerializable. l hin th=c Gng ISerializable8 &*n phi\
whai &o r5ng kiu ca &*n cF hin th=c giao )in ISerializable.
p )ng !c t2nh SerializableAttribute vo khai &o kiu nh vQa $c .4 tT
kh4ng sO )ng NonSerializedAttribute v% nF s@ kh4ng cF tc )ng.
nin th=c phMng th:c ISerializable.GetObjectData g$c sO )ng trong 9u tr%nh
tuNn t= hFah8 phMng th:c n' nh6n cc kiu Di sD sau\
- System.Runtime.Serialization.SerializationInfo
- System.Runtime.Serialization.StreamingContext
nin th=c .t phMng th:c khCi )=ng kh4ng c4ng khai g$c sO )ng trong 9u tr%nh
gii tuNn t= hFah8 phMng th:c n' nh6n ceng Di sD nh phMng th:c GetObjectData.
Hh r5ng8 nIu &*n cF B inh )3n ;ut .t sD lp tQ lp khztuNnzt=zhFa th% phMng
th:c khCi )=ng n' phi l protected.
HIu &*n t*o .t lp khztuNnzt=zhFa tQ .t lp cM sC c?ng cF hin th=c
ISerializable8 th% phMng th:c GetObjectData v phMng th:c khCi )=ng g)eng
gii tuNn t= hFah ca &*n phi g0i cc phMng th:c tMng Mng trong lp cha.
7rong 9u tr%nh tuNn t= hFa8 ?orma//er s@ g0i phMng th:c GetObjectData v tru'n cho nF
cc tha. chiIu SerializationInfo v StreamingContext.
L*n phi s )K liu cNn tuNn t= hFa vo Di t$ng SerializationInfo. yp
SerializationInfo cung cp phMng th:c AddValue )eng th>. )K liu. ui .#i lNn
g0i AddValue8 &*n phi chJ inh t>n )K liu gt>n n' s@ $c sO )ng trong 9u tr%nh
gii tuNn t= hFa thu l' )K liuh. RhMng th:c AddValue cF In Za phi>n &n n*p
chtng8 cho phXp &*n th>. nhiu kiu )K liu khc nhau vo Di t$ng
SerializationInfo.
611
Chng 16: (c giao dinn }~ ou `hing deng
lDi t$ng StreamingContext cung cp cc th4ng tin v ch inh v 2ch ca )K liu
$cztuNnzt=zhFa8 cho phXp &*n ch0n tuNn t= hFa )K liu no. u2 )8 &*n cF th cNn
tuNn t= hFa )K liu ri>ng nIu nF $c )nh cho .t .in :ng )ng khc trong ceng
tiIn tr%nh8 nhng kh4ng cNn nIu )K liu s@ $c ghi ra fil(.
7rong 9u tr%nh gii tuNn t= hFa8 ?orma//er s@ g0i phMng th:c khCi )=ng vic gii tuNn t=
hFa8 l*i tru'n cho nF cc tha. chiIu SerializationInfo v StreamingContext.
wiu ca &*n phi tr2ch )K liu Sz$cztuNnzt=zhFa tQ Di t$ng SerializationInfo
&5ng .t trong cc phMng th:c SerializationInfo.Get8 v2 )\ GetString8 GetInt328
ha' GetBoolean.
lDi t$ng StreamingContext cung cp cc th4ng tin v ngutn gDc ca )K liu Sz$cz
tuNnzt=zhFa8 phn nh logic . &*n S hin th=c cho vic tuNn t= hFa.
THXAB ZS QHlA> QZwA Qn >^c J>ZA, formatter s>TAB fg hUAB s>R AAB Jbc LK@
QVWAB $treamingContext Lt J>X F@jQ JSJ J>@ Q@jQ DG ABZA BKJ, LaJ>, D\ J>b LMA>
Jbc h? Y@qZ LVWJ6QZwA6Qn6>^c( TZ] A>@CA, AjZ OZKA Q>nJ >@qA ZS QHlA> QZwA Qn
>^c Qr] F@jA, FeA J^ Q>t JPZ >lA> LK@ QVWAB $treamingContext Jbc formatter
QHVEJ s>@ F{Q LwZ ZS QHlA> QZwA Qn >^c D\ B@R@ QZwA Qn >^c( T>cO s>RX Q\@ Y@qZ
.NET Framework S! Lt J^ Q>CO Q>TAB Q@A DG YEd $treamingContext(
u2 ) )i <' tr%nh &' phi>n &n S $c chJnh sOa ca lp Employee8 cF hin th=c giao
)in ISerializable. 7rong phi>n &n n'8 lp Employee kh4ng tuNn t= hFa trng address
nIu Di t$ng StreamingContext chJ inh r5ng 2ch ca )K liu $cztuNnzt=zhFa l fil(.
RhMng th:c Main s@ gii th2ch vic tuNn t= hFa v gii tuNn t= hFa ca .t Di t$ng
Employee.
using System;
using System.Runtime.Serialization;
[Serializable]
public class Employee : ISerializable {
private string name;
private int age;
private string address;

// Phng thc khoi dng dn gian.
public Employee(string name, int age, string address) {

this.name = name;
this.age = age;
this.address = address;
}
612
Chng 16: (c giao dinn }~ ou `hing deng
// Phng thc khoi dng dung d kch hoat formatter thc hin vic
// giai tun t ha mt di tong Employee. Ban nn khai bo
// phng thc khoi dng ny l private, hay t nht cng l
// protected d bao dam n khng b goi qu mc cn thit.
private Employee(SerializationInfo info, StreamingContext context) {

// Trch xut tn v tui cua Employee (s lun hin din
// trong d liu d-doc-tun-t-ha bt chp gi tr
// cua StreamingContext).
name = info.GetString("Name");
age = info.GetInt32("Age");

// Thc hin trch xut da ch cua Employee
// (tht bai nu khng c).
try {
address = info.GetString("Address");
} catch (SerializationException) {
address = null;
}
}
// Cc thuc tnh Name, Age, v Address (d trnh by o trn).


// oc khai bo boi giao din ISerializable, phng thc
// GetObjectData cung cp c ch d formatter thu ly
// d liu s-doc-tun-t-ha.
public void GetObjectData(SerializationInfo inf,
StreamingContext con){

// Lun tun t ha tn v tui cua Employee.
inf.AddValue("Name", name);
inf.AddValue("Age", age);
// Khng tun t ha da ch cua Employee nu StreamingContext
// cho bit rng d liu doc-tun-t-ha s doc ghi ra file.
613
Chng 16: (c giao dinn }~ ou `hing deng
if ((con.State & StreamingContextStates.File) == 0) {
inf.AddValue("Address", address);
}
}
// Chp d Object.ToString d tra v chui m ta Employee.
public override string ToString() {

StringBuilder str = new StringBuilder();

str.AppendFormat("Name: {0}nr", Name);
str.AppendFormat("Age: {0}nr", Age);
str.AppendFormat("Address: {0}nr", Address);

return str.ToString();
}

public static void Main(string[] args) {

// Tao mt di tong Employee m ta Phuong.
Employee phuong = new Employee("Phuong", 23, "HCM");

// Hin th Phuong.
Console.WriteLine(phuong);

// Tun t ha Phuong vi dch l mt min ng dng khc.
// a ch cua Phuong s doc tun t ha.
Stream str = File.Create("phuong.bin");
BinaryFormatter bf = new BinaryFormatter();
bf.Context =
new StreamingContext(StreamingContextStates.CrossAppDomain);
bf.Serialize(str, phuong);
str.Close();

// Giai tun t ha v hin th Phuong.
str = File.OpenRead("phuong.bin");
614
Chng 16: (c giao dinn }~ ou `hing deng
bf = new BinaryFormatter();
phuong = (Employee)bf.Deserialize(str);
str.Close();
Console.WriteLine(phuong);
// Tun t ha Phuong vi dch l file. Trong trng hop ny,
// da ch cua Phuong s khng doc tun t ha.
str = File.Create("phuong.bin");
bf = new BinaryFormatter();
bf.Context = new StreamingContext(StreamingContextStates.File);
bf.Serialize(str, phuong);
str.Close();
// Giai tun t ha v hin th Phuong.
str = File.OpenRead("phuong.bin");
bf = new BinaryFormatter();
phuong = (Employee)bf.Deserialize(str);
str.Close();
Console.WriteLine(phuong);
Console.ReadLine();
}

}
2'
2' -i n th c "i u "h -sao-ch:% Qclonea!le ty%eR -i n th c "i u "h -sao-ch:% Qclonea!le ty%eR
#eA JwA QeX OIQ s@tZ Qr] F@jA JZAB JPd OIQ J[ J>j L[A B@RA Lt YNd QHlA> D@CA QeX
FRA fcX J>X JSJ Q>t >@qA Jbc s@tZ(
H@qA Q>nJ B@cX h@qA $!stem.ECloneable(
whi gn .t kiu gi tri sang .t kiu gi tri khc l &*n S t*o .t &n sao ca gi tri F.
wh4ng cF .Di li>n h no giKa hai gi triE.t tha' si tr>n gi tri n' s@ kh4ng nh hCng
In gi tri kia. 7u' nhi>n8 khi gn .t kiu tha. chiIu sang .t kiu tha. chiIu khc gngo*i
trQ chu#iE$c & th=c thi ;O lB !c &ith8 &*n kh4ng t*o .t &n sao .i ca kiu tha.
chiIu. 7ha' vo F8 c hai kiu tha. chiIu u chJ In ceng .t Di t$ng8 v nhKng tha'
si tr>n gi tri ca Di t$ng u $c phn nh trong c hai tha. chiIu. l t*o .t &n sao
th6t ca .t kiu tha. chiIu8 &*n phi +nhi- l*i Di t$ng . nF chJ In.
615
Chng 16: (c giao dinn }~ ou `hing deng
piao )in ICloneable nh6n )*ng .t kiu l khzsaozchXp v khai &o phMng th:c Clone l
.t cM chI . th4ng 9ua F8 &*n cF th thu l' &n sao ca .t Di t$ng. RhMng th:c
Clone kh4ng nh6n Di sD no v tr v .t System.Object8 &t chp kiu ang hin th=c l g%.
liu n' nghqa l .t khi S sao .t Di t$ng8 &*n phi Xp &n sao v Gng kiu.
Pch hin th=c phMng th:c Clone cho .t kiu te' &iIn te' thuc vo cc thnh vi>n )K liu
$c khai &o &>n trong kiu. HIu kiu te' &iIn chJ ch:a cc thnh vi>n )K liu kiu gi tri
gint8 byte...h v System.String8 &*n cF th hin th=c phMng th:c Clone &5ng cch t*o .t
Di t$ng .i v thiIt l6p cc thnh vi>n )K liu ca nF cF gi tri giDng nh Di t$ng hin
t*i. yp Object gtt c cc kiu u )3n ;ut tQ <'h ch:a phMng th:c MemberwiseClone )eng
t= ng hFa 9u tr%nh n'. u2 ) )i <' tr%nh &' .t lp Mn gin cF t>n l Employee8
chJ ch:a cc thnh vi>n chu#i. Uo F8 phMng th:c Clone )=a vo phMng th:c thQa kI
MemberwiseClone t*o &n sao.
using System;
public class Employee : ICloneable {

public string Name;
public string Title;
// Phng thc khoi dng dn gian.
public Employee(string name, string title) {
Name = name;
Title = title;
}

// Tao mt ban sao bng phng thc Object.MemberwiseClone
// v lp Employee ch cha cc tham chiu chui.
public object Clone() {

return MemberwiseClone();
}
}
HIu kiu te' &iIn ca &*n cF ch:a cc thnh vi>n )K liu kiu tha. chiIu8 &*n phi 9u'It
inh ;(. phMng th:c Clone ca &*n s@ th=c hin .t &n sao c*n g8haDDow )oKyh ha' .t
&n sao s<u gAeeK )oKyh. Ln sao c*n nghqa l &t k thnh vi>n )K liu kiu tha. chiIu no
trong &n sao u s@ chJ In Di t$ng giDng nh thnh vi>n )K liu kiu tha. chiIu tMng
:ng trong Di t$ng gDc. Ln sao s<u nghqa l &*n phi sao ton & t thi Di t$ng go4Je)/
graKhh cc thnh vi>n )K liu kiu tha. chiIu ca &n sao chJ In cc &n sao gc l6p v
.!t v6t lBh ca cc Di t$ng $c tha. chiIu &Ci Di t$ng gDc.
616
Chng 16: (c giao dinn }~ ou `hing deng
Ur )ng hin th=c .t &n sao c*nEsO )ng phMng th:c MemberwiseClone vQa $c .4 t.
7u' nhi>n8 .t &n sao s<u thng l ci . l6p tr%nh vi>n .ong $i khi lNn Nu ti>n sao .t
Di t$ngEnhng hiI. khi l ci h0 l'. liu n' !c &it Gng Di vi cc lp t6p h$p
trong kh4ng gian t>n System.Collections8 tt c u hin th=c &n sao c*n trong cc phMng
th:c Clone ca chGng. "!c )e s@ cF 2ch nIu cc t6p h$p n' hin th=c &n sao s<u8 cF hai lB
)o ch2nh cc kiu g!c &it l cc lp t6p h$ph kh4ng hin th=c &n sao s<u\
uic t*o &n sao ca .t t thi Di t$ng ln s@ tDn nhiu & nh v thi gian ;O lB.
Pc t6p h$p th4ng thng cF th ch:a cc t thi Di t$ng s<u v rng8 &ao gt. &t k
kiu Di t$ng no. uic t*o .t hin th=c &n sao s<u phc v nhiu th: nh thI l
kh4ng kh thi v% .t sD Di t$ng trong t6p h$p cF th kh4ng phi l khzsaozchXp8 v
.t sD khc cF th ch:a cc tha. chiIu vkng8 khiIn 9u tr%nh sao chXp trC thnh .t
vkng l!p v4 t6n.
lDi vi cc t6p h$p kiu .*nh8 trong F &n cht ca cc phNn tO $c hiu v $c ki.
sot th% .t &n sao s<u cF th l .t t2nh nvng rt hKu 2ch. u2 )8 System.Xml.XmlNode hin
th=c .t &n sao s<u trong phMng th:c Clone8 iu n' cho phXp &*n t*o Gng &n sao ca
ton & h thDng ph<n cp Di t$ng :&L chJ vi .t lnh Mn.
NjZ JwA fcX OIQ LK@ QVWAB s>TAB >@qA Q>nJ ECloneable A>VAB Ye@ Y\ s>R6QZwA6Qn6
>^c, FeA J^ Q>t QZwA Qn >^c H@ B@R@ QZwA Qn >^c LK@ QVWAB L^ Lt J^ LVWJ JrAB sjQ
ZR A>V s>@ fcX J>d( TZ] A>@CA, ZS QHlA> QZwA Qn >^c J^ Q>t s>TAB QZwA Qn >^c
QPQ JR JSJ Q>\A> D@CA h? Y@qZ iA>V L} LVWJ Q>RX YZNA QHXAB OUJ (k( CAB DN],
AjZ QeX OIQ s@tZ s>R6QZwA6Qn6>^c Qr] F@jA, FeA J^ Q>t fg hUAB ZS QHlA> QZwA Qn
>^c Dc LVWJ OT QR Lt Q>nJ >@qA OIQ FRA fcX fZ FCA QHXAB d>V[AB Q>~J
ECloneable.Clone( !t fcX OIQ LK@ QVWAB s>R6QZwA6Qn6>^c, FeA >}] fg hUAB YEd
$!stem.&untime.$erialiIation."ormatters.6inar!.6inar!"ormatter Lt QZwA Qn
>^c LK@ QVWAB A\] Q>\A> OIQ LK@ QVWAB $!stem.E(.Memor!$tream, D\ H@ B@R@ QZwA
Qn >^c LK@ QVWAB A\] Q $!stem.E(.Memor!$tream(
yp Team )i <' hin th=c phMng th:c Clone th=c hin .t &n sao s<u. yp Team ch:a
.t t6p h$p cc Di t$ng Employe .4 t .t nhF. ngi. whi &*n g0i phMng th:c Clone
ca .t Di t$ng Team8 phMng th:c n' s@ t*o &n sao ca .#i Di t$ng Employee v th>.
nF vo Di t$ng Team $c sao. yp Team cung cp .t phMng th:c khCi )=ng private
Mn gin hFa .S lnh trong phMng th:c Clone gsO )ng phMng th:c khCi )=ng l cch
th4ng thng Mn gin hFa 9u tr%nh sao chXph.
using System;
using System.Collections;
public class Team : ICloneable {

public ArrayList TeamMembers = new ArrayList();

public Team() {
617
Chng 16: (c giao dinn }~ ou `hing deng
}
// Phng thc khoi dng private doc phng thc Clone goi
// d tao mt di tong Team mi v d vo ArrayList cua n
// ban sao cua cc di tong Employee tu mt ArrayList c trc.
private Team(ArrayList members) {

foreach (Employee e in members) {

TeamMembers.Add(e.Clone());
}
}

// Thm mt di tong Employee vo Team.
public void AddMember(Employee member) {

TeamMembers.Add(member);
}
public object Clone() {

// Tao mt ban sao su cua Team bng cch goi phng thc
// khoi dng Team v truyn cho n ArrayList cha
// cc thnh vin cua Team.
return new Team(this.TeamMembers);

// Lnh ny s tao mt ban sao can cua Team:
// return MemberwiseClone();
}
}
3' 3' -i n th c "i u "h -so-snh Qcom%ara!le ty%eR -i n th c "i u "h -so-snh Qcom%ara!le ty%eR
#eA JwA OIQ J[ J>j hrAB Lt fX fSA> JSJ s@tZ Qr] F@jA, J>X d>d FeA hu h\AB f{d
vjd QNd >Wd J>~c JSJ Q>t >@qA Jbc s@tZ A\](
!t JZAB JPd OIQ J[ J>j fX fSA> J>ZA J>X OIQ s@tZ, >@qA Q>nJ B@cX h@qA
$!stem.EComparable( !t >x QHW A>@GZ heAB fX fSA>, QeX H@CAB QAB s@tZ QHW B@d
ihelperk D\ JSJ s@tZ A\] >@qA Q>nJ B@cX h@qA $!stem.Collections.EComparer(
618
Chng 16: (c giao dinn }~ ou `hing deng
HIu .uDn s/p ;Ip kiu ca &*n chJ th(o .t th: t= no F gnh <E tvng )Nn8 ha' t>n th(o th:
t= alpha&(th8 &*n n>n hin th=c giao )in IComparable. piao )in n' inh nghqa phMng th:c
CompareTo nh sau\
int CompareTo(object obj);
lDi t$ng gobjh $c tru'n cho phMng th:c phi ceng kiu vi Di t$ng ang g0i8 nIu
kh4ng CompareTo s@ nX. ngo*i l System.ArgumentException. pi tri )o CompareTo tr v
$c t2nh nh sau\
HIu Di t$ng hin t*i nhV hMn obj8 tr v .t sD <. gch~ng h*n8 zZh.
HIu Di t$ng hin t*i cF ceng gi tri nh obj8 tr v o(ro.
HIu Di t$ng hin t*i ln hMn obj8 tr v .t sD )Mng gch~ng h*n8 Zh.
RhXp so snh n' th=c hin iu g% l te' thuc vo kiu S hin th=c giao )in IComparable.
u2 )8 nIu .uDn s/p ;Ip )=a th(o t>n8 &*n cNn th=c hin phXp so snh chu#i gStringh. 7u'
nhi>n8 nIu .uDn s/p ;Ip )=a th(o ng' sinh8 &*n cNn th=c hin phXp so snh ng'
gSystem.DateTimeh.
l h# tr$ nhiu )*ng s/p ;Ip cho .t kiu c th8 &*n phi hin th=c ri>ng r@ tQng kiu tr$
giGp v cc kiu n' hin th=c giao )in IComparer. piao )in n' inh nghqa phMng th:c
Compare nh sau\
int Compare(object x, object y);
wiu tr$ giGp phi Fng gFi logic cNn thiIt so snh hai Di t$ng v tr v .t gi tri )=a
tr>n logic nh sau\
HIu x nhV hMn y8 tr v .t sD <. gch~ng h*n8 zZh.
HIu x cF ceng gi tri nh y8 tr v o(ro.
HIu x ln hMn y8 tr v .t sD )Mng gch~ng h*n8 Zh.
yp Newspaper )i <' hin th=c c giao )in IComparable v IComparer. RhMng th:c
Newspaper.CompareTo th=c hin phXp so snh kh4ng ph<n &it chK hoazthng hai Di t$ng
Newspaper )=a tr>n trng name ca chGng. "t lp private ltng &>n trong cF t>n l
AscendingCirculationComparer hin th=c IComparer v so snh hai Di t$ng Newspaper )=a
tr>n trng circulation ca chGng. lDi t$ng AscendingCirculationComparer $c thu l'
&5ng thuc t2nh tqnh Newspaper.CirculationSorter.
using System;
using System.Collections;
public class Newspaper : IComparable {
private string name;
private int circulation;
619
Chng 16: (c giao dinn }~ ou `hing deng
private class AscendingCirculationComparer : IComparer {

int IComparer.Compare(object x, object y) {

// Xu l cc tham chiu null.
// Null doc coi nh nho hn bt c gi tr no khc.
if (x == null && y == null) return 0;
else if (x == null) return -1;
else if (y == null) return 1;

// Trng hop x v y tham chiu dn cung mt di tong.
if (x == y) return 0;

// Bao dam x v y du l cc th hin cua 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 dnh rng:
// tra v mt s m nu x y
// tra v zero nu x = y
// tra v mt s dng nu x y
// D dng hin thc logic ny bng php tnh s nguyn.
return newspaperX.circulation - newspaperY.circulation;
}
}

public Newspaper(string name, int circulation) {

620
Chng 16: (c giao dinn }~ ou `hing deng
this.name = name;
this.circulation = circulation;
}
// Khai bo mt thuc tnh ch-doc, tra v mt th hin cua
// AscendingCirculationComparer.
public static IComparer CirculationSorter{
get { return new AscendingCirculationComparer(); }
}

public override string ToString() {

return string.Format("{0}: Circulation = {1}", name,
circulation);
}

// Phng thc CompareTo so snh hai di tong Newspaper da trn
// php so snh trng name (khng phn bit ch hoa-thng).
public int CompareTo(object obj) {

// Mt di tong lun doc coi nh ln hn null.
if (obj == null) return 1;
// Trng hop di tong kia l mt tham chiu dn di tong ny.
if (obj == this) return 0;

// p di tong kia v Newspaper.
Newspaper other = obj as Newspaper;

// Nu "other" l null, n khng phai l mt th hin cua
// Newspaper. Trong trng hop ny, CompareTo phai nm
// ngoai l System.ArgumentException.
if (other == null) {

throw new ArgumentException("Invalid object type", "obj");

} else {
621
Chng 16: (c giao dinn }~ ou `hing deng

// Tnh gi tr tra v bng cch thc hin php so snh
// trng name (khng phn bit ch hoa-thng).

// V name l chui nn cch d nht l da vo kha nang
// so snh cua lp String (thc hin php so snh chui
// c phn bit ban da).
return string.Compare(this.name, other.name, true);
}
}
}
RhMng th:c Main .inh h0a phXp so snh v kh nvng s/p ;Ip nh cF hin th=c giao )in
IComparable v IComparer. RhMng th:c n' s@ t*o .t t6p h$p
System.Collections.ArrayList ch:a nv. Di t$ng Newspaper8 sau F s/p ;Ip ArrayList hai
lNn &5ng phMng th:c ArrayList.Sort. yNn Nu8 thao tc Sort sO )ng cM chI so snh .!c
inh ca Newspaper gth4ng 9ua phMng th:c IComparable.CompareToh. yNn sau8 thao tc Sort
sO )ng Di t$ng AscendingCirculationComparer gth4ng 9ua phMng th:c
IComparer.Compareh.
public static void Main() {

ArrayList newspapers = new ArrayList();

newspapers.Add(new Newspaper("Tuoi Tre", 12580));
newspapers.Add(new Newspaper("Echip", 55230));
newspapers.Add(new Newspaper("Thanh Nien", 235950));
newspapers.Add(new Newspaper("Phu Nu", 8860));
newspapers.Add(new Newspaper("Tiep Thi", 560));

Console.WriteLine("Unsorted newspaper list:");
foreach (Newspaper n in newspapers) {
Console.WriteLine(n);
}

Console.WriteLine(Environment.NewLine);
Console.WriteLine("Newspaper list sorted by name (default order):");
newspapers.Sort();
foreach (Newspaper n in newspapers) {
Console.WriteLine(n);
}
622
Chng 16: (c giao dinn }~ ou `hing deng
Console.WriteLine(Environment.NewLine);
Console.WriteLine("Newspaper list sorted by circulation:");
newspapers.Sort(Newspaper.CirculationSorter);
foreach (Newspaper n in newspapers) {
Console.WriteLine(n);
}
}
Ph*' phMng th:c Main s@ sinh ra kIt 9u nh sau\
Unsorted newspaper list:
Tuoi Tre: Circulation = 12580
Echip: Circulation = 55230
Thanh Nien: Circulation = 235950
Phu Nu: Circulation = 8860
Tiep Thi: Circulation = 560
Newspaper list sorted by name (default order):
Echip: Circulation = 55230
Phu Nu: Circulation = 8860
Thanh Nien: Circulation = 235950
Tiep Thi: Circulation = 560
Tuoi Tre: Circulation = 12580
Newspaper list sorted by circulation:
Tiep Thi: Circulation = 560
Echip: Circulation = 55230
Phu Nu: Circulation = 8860
Tuoi Tre: Circulation = 12580
Thanh Nien: Circulation = 235950
4' 4' -i n th c "i u "h -li t-" Qenumera!le ty%eR -i n th c "i u "h -li t-" Qenumera!le ty%eR
#eA JwA QeX OIQ s@tZ QNd >Wd fcX J>X AI@ hZAB Jbc A^ J^ Q>t LVWJ Y@qQ sC F`AB
YqA> *oreac.(
H@qA Q>nJ B@cX h@qA $!stem.E0numerable QHXAB s@tZ QNd >Wd Jbc FeA( P>V[AB
Q>~J 7et0numerator Jbc B@cX h@qA E0numerable QHR DG OIQ AZOHcQXHOIQ LK@
623
Chng 16: (c giao dinn }~ ou `hing deng
QVWAB J^ >@qA Q>nJ B@cX h@qA $!stem.E0numerator( G@cX h@qA E0numerator LMA>
AB>c JSJ d>V[AB Q>~J fm LVWJ YqA> *oreac. fg hUAB Lt s@qQ sC QNd >Wd(
"t & chJ .c &5ng sD gnumer")aD "nAe2erh cho phXp &*n )u't 9ua cc phNn tO ca .t t6p
h$p &5ng vkng l!p for. 7u' nhi>n8 k thu6t n' kh4ng cung cp .:c trQu t$ng phe h$p vi
cc cu trGc )K liu phi tu'In8 nh c<' v t6p h$p a chiu. ynh foreach cung cp .t cM
chI )u't 9ua cc Di t$ng ca .t t6p h$p . kh4ng 9uan t<. cu trGc &>n trong ca
chGng l g%.
l h# tr$ ngK nghqa foreach8 Di t$ng ch:a t6p h$p phi hin th=c giao )in
System.IEnumerable. piao )in n' khai &o .t phMng th:c cF t>n l GetEnumerator8
phMng th:c n' kh4ng nh6n Di sD v tr v .t Di t$ng System.IEnumerator\
IEnumerator GetEnumerator();
lDi t$ng IEnumerator l Di t$ng h# tr$ vic lit k> cc phNn tO ca t6p h$p. piao )in
IEnumerator cung cp .t con ch*' chJz0c8 chJztiIn greaAIonDyR ?orwarAIonDy )ur8orh )eng
tru' ;ut cc thnh vi>n ca t6p h$p n5. )i. Lng Za.Z .4 t cc thnh vi>n ca giao
)in IEnumerator.
Bfng 16'1 Cc thnh vin ca giao din Enumerator
Th~nh }itn ?i `f
Current
7huc t2nh n' tr v phNn tO )K liu hin t*i. whi (nu.(rator $c t*o
ra8 Current chJ In vi tr2 :ng trc phNn tO )K liu Nu ti>n8 nghqa l &*n
phi g0i MoveNext trc khi sO )ng Current. HIu Current $c g0i v
(nu.(rator ang :ng trc phNn tO Nu ti>n ho!c sau phNn tO cuDi ceng
trong t6p h$p )K liu8 Current s@ nX. ngo*i l
System.InvalidOperationException.
MoveNext
RhMng th:c n' )ich chu'n (nu.(rator sang phNn tO )K liu kI tiIp
trong t6p h$pT tr v true nIu ckn phNn tO8 tr v false nIu kh4ng ckn
phNn tO. HIu ngutn )K liu n5. )i tha' si trong thi gian sDng ca
(nu.(rator8 MoveNext s@ nX. ngo*i l InvalidOperationException.
Reset
RhMng th:c n' )ich chu'n (nu.(rator v vi tr2 :ng trc phNn tO Nu
ti>n trong t6p h$p )K liu. HIu ngutn )K liu n5. )i tha' si trong thi
gian sDng ca (nu.(rator8 Reset s@ nX. ngo*i l
InvalidOperationException.

Pc lp TeamMember8 Team8 v TeamMemberEnumerator .inh h0a vic hin th=c giao )in
IEnumerable v IEnumerator. yp TeamMember .4 t .t thnh vi>n ca .t i\
// Lp TeamMember m ta mt thnh vin trong di.
public class TeamMember {

public string Name;
public string Title;

// Phng thc khoi dng dn gian.
624
Chng 16: (c giao dinn }~ ou `hing deng
public TeamMember(string name, string title) {

Name = name;
Title = title;
}

// Tra v chui m ta TeamMember.
public override string ToString() {

return string.Format("{0} ({1})", Name, Title);
}
}
yp Team g.4 t .t ih l .t t6p h$p cc Di t$ng TeamMember. yp n' hin th=c giao
)in IEnumerable v khai &o .t lp cF t>n l TeamMemberEnumerator cung cp ch:c nvng
lit k>. 7h4ng thng8 cc lp t6p h$p s@ tr=c tiIp hin th=c c giao )in IEnumerable v
IEnumerator. 7u' nhi>n8 sO )ng .t lp (nu.(rator ri>ng &it l cch Mn gin nht cho
phXp nhiu (nu.(ratorEv nhiu tiu tr%nhElit k> tng thi cc phNn tO ca Team.
Team hin th=c .3u F48erBer &5ng cch sO )ng cc thnh vi>n s= kin v ' nhi. &o
cho tt c cc Di t$ng TeamMemberEnumerator &iIt Team n5. )i cF tha' si ha' kh4ng
g;(. .c Za.Zd cF th>. th4ng tin v .3u F48erBerh. yp TeamMemberEnumerator l .t
lp private ltng &>n trong n>n &*n kh4ng th t*o cc th hin ca nF8 trQ khi th4ng 9ua
phMng th:c Team.GetEnumerator. Ui <' l phNn .S cho lp Team v
TeamMemberEnumerator\
// Lp Team m ta tp hop cc di tong TeamMember. Hin thc giao din
// IEnumerable d h tro vic lit k cc di tong TeamMember.
public class Team : IEnumerable {
// TeamMemberEnumerator l mt lp private lng bn trong, cung cp
// chc nang lit k cc di tong TeamMember trong tp hop
// Team. V l lp lng bn trong nn TeamMemberEnumerator
// c th truy xut cc thnh vin private cua lp Team.
private class TeamMemberEnumerator : IEnumerator {
private Team sourceTeam;
// Gi tr lun l cho bit Team nm di c thay di hay khng.
private bool teamInvalid = false;
625
Chng 16: (c giao dinn }~ ou `hing deng
// Gi tr nguyn cho bit TeamMember hin tai (ch s
// trong ArrayList). Gi tr ban du l -1.
private int currentMember = -1;
// Phng thc khoi dng (nhn mt tham chiu dn Team).
internal TeamMemberEnumerator(Team team) {
this.sourceTeam = team;
sourceTeam.TeamChange +=
new TeamChangedEventHandler(this.TeamChange);
}
// Hin thc thuc tnh IEnumerator.Current.
public object Current {
get {
// Nu TeamMemberEnumerator dng trc phn tu du tin
// hoac sau phn tu cui cung th nm ngoai l.
if (currentMember == -1 ||
currentMember (sourceTeam.teamMembers.Count-1)) {
throw new InvalidOperationException();
}
// Nu khng, tra v TeamMember hin tai.
return sourceTeam.teamMembers[currentMember];
}
}
// Hin thc phng thc IEnumerator.MoveNext.
public bool MoveNext() {
// Nu Team nm di bt hop l, nm ngoai l.
if (teamInvalid) {

626
Chng 16: (c giao dinn }~ ou `hing deng
throw new InvalidOperationException("Team modified");
}

// Nu khng, tin dn TeamMember k tip.
currentMember++;
// Tra v false nu ta dch qua khoi TeamMember cui cung.
if (currentMember (sourceTeam.teamMembers.Count-1)) {
return false;
} else {
return true;
}
}
// Hin thc phng thc IEnumerator.Reset. Phng thc ny
// reset v tr cua TeamMemberEnumerator v du tp hop Team.
public void Reset() {
// Nu Team nm di bt hop l, nm ngoai l.
if (teamInvalid) {

throw new InvalidOperationException("Team modified");
}
// Dch con tro currentMember v trc phn tu du tin.
currentMember = -1;
}
// Phng thc th l s kin tp hop Team nm di thay di.
internal void TeamChange(Team t, EventArgs e) {

// Bo hiu Team nm di hin dang bt hop l.
teamInvalid = true;
}
}
627
Chng 16: (c giao dinn }~ ou `hing deng
// Uy nhim dung d ch dnh ch k m tt ca
// cc phng thc th l s kin phai hin thc.
public delegate void TeamChangedEventHandler(Team t, EventArgs e);
// ArrayList dung d cha cc di tong TeamMember.
private ArrayList teamMembers;
// S kin dung d bo cho TeamMemberEnumerator
// bit Team d thay di.
public event TeamChangedEventHandler TeamChange;
// Phng thc khoi dng Team.
public Team() {

teamMembers = new ArrayList();
}
// Hin thc phng thc IEnumerable.GetEnumerator.
public IEnumerator GetEnumerator() {
return new TeamMemberEnumerator(this);
}
// Thm mt di tong TeamMember vo Team.
public void AddMember(TeamMember member) {

teamMembers.Add(member);
if (TeamChange != null) {

TeamChange(this, null);
}
}
}
HIu lp t6p h$p ca &*n ch:a nhiu kiu )K liu khc nhau v &*n .uDn lit k> chGng .t
cch ri>ng r@8 vic hin th=c giao )in IEnumerable tr>n lp t6p h$p n' th% v3n ckn thiIu.
7rong trng h$p n'8 &*n cNn hin th=c .t sD thuc t2nh tr v cc th hin khc nhau ca
628
Chng 16: (c giao dinn }~ ou `hing deng
IEnumerator. u2 )8 nIu lp Team .4 t c cc thnh vi>n v cc .' t2nh trong i8 &*n cF
th hin th=c cc thuc t2nh n' nh sau\
// Thuc tnh dung d lit k cc thnh vin trong di.
public IEnumerator Members {
get {
return new TeamMemberEnumerator(this);
}
}
// Thuc tnh dung d lit k cc computer trong di.
public IEnumerator Computers {
get {
return new TeamComputerEnumerator(this);
}
}
whi F8 &*n cF th sO )ng cc (nu.(rator n' nh sau\
Team team = new Team();

foreach(TeamMember in team.Members) {
// Lm g d...
}
foreach(TeamComputer in team.Computers) {
// Lm g d...
}
LqA> *oreac. JAB >x QHW JSJ s@tZ J^ >@qA Q>nJ OIQ OpZ QV[AB LV[AB DE@ OpZ
LVWJ LMA> AB>c F@ B@cX h@qA E0numerable D\ E0numerator, O_J hr s@tZ L^ s>TAB
>@qA Q>nJ JSJ B@cX h@qA A\]( TZ] A>@CA, O} YqA> Jbc FeA fm H| H\AB >[A D\ hu
>@tZ >[A AjZ FeA >@qA Q>nJ B@cX h@qA E0numerable( #eA >}] vO C# .ang%age
Specification Lt F@jQ J>@ Q@jQ DG JSJ ]CZ JwZ Jbc YqA> *oreac.
[http://msdn.mic%oso't. com/net/ecma](
629
Chng 16: (c giao dinn }~ ou `hing deng
5'
5' -i n th c l % "h -h y Qdis%osa!le classR -i n th c l % "h -h y Qdis%osa!le classR
#eA JwA QeX OIQ YEd J^ Q>cO J>@jZ LjA JSJ Q\@ ABZ]CA s>TAB6LVWJ6ZRA6Y D\
JZAB JPd OIQ J[ J>j Lt ABVo@ hrAB B@R@ d>^AB JSJ Q\@ ABZ]CA L^ OIQ JSJ> QPQ
LMA>(
H@qA Q>nJ B@cX h@qA $!stem.E-isposable, D\ B@R@ d>^AB JSJ Q\@ ABZ]CA s>TAB6
LVWJ6ZRA6Y s>@ O} JY@AQ B@ d>V[AB Q>~J E-isposable.-ispose(
"t Di t$ng kh4ng $c tha. chiIu In v3n ttn t*i tr>n veng nh ng gheaKh v ti>u th
cc ti ngu'>n cho In khi & thu go. rc g6ar4age CoDDe)/orh gii phFng Di t$ng v cc
ti ngu'>n. L thu go. rc s@ t= ng gii phFng cc ti ngu'>n $cz9unzlB gnh & nhh8
nhng nF s@ kh4ng gii phFng cc ti ngu'>n kh4ngz$cz9unzlB gnh fil( han)l( v kIt nDi
cM sC )K liuh $c tha. chiIu &Ci cc Di t$ng $cz9unzlB. HIu .t Di t$ng ch:a cc
thnh vi>n )K liu tha. chiIu In cc ti ngu'>n kh4ngz$cz9unzlB8 Di t$ng n' phi
gii phFng cc ti ngu'>n F.
"t gii php l khai &o .t )(structorEha' finalio(rEcho lp. 7rc khi gii phFng phNn
& nh )o .t th hin ca lp sO )ng8 & thu go. rc s@ g0i finalio(r ca Di t$ng n'.
inalio(r cF th th=c hin cc &c cNn thiIt gii phFng cc ti ngu'>n kh4ngz$cz9unz
lB. u% & thu go. rc chJ sO )ng .t tiu tr%nh th=c thi tt c cc finalio(r8 vic sO )ng
finalio(r cF th &t l$i trong 9u tr%nh thu go. rc v nh hCng In hiu nvng ca :ng )ng.
Hgoi ra8 &*n kh4ng th ki. sot khi & th=c thi gii phFng cc ti ngu'>n kh4ngz$cz
9unzlB v% &*n kh4ng th tr=c tiIp g0i finalio(r ca .t Di t$ng8 v &*n chJ cF 9u'n ki.
sot h*n chI tr>n cc ho*t ng ca & thu go. rc &5ng lp System.GC.
L5ng cch sO )ng finalio(r8 .NET Framework inh nghqa .3u E"8Ko8e nh .t phMng tin
cung cp 9u'n ki. sot khi & th=c thi gii phFng cc ti ngu'>n kh4ngz$cz9unzlB. l
hin th=c .3u E"8Ko8e8 lp phi hin th=c giao )in IDisposable. piao )in n' khai &o .t
phMng th:c cF t>n l DisposeT trong F8 &*n phi hin th=c phNn .S cNn thiIt gii phFng
cc ti ngu'>n kh4ngz$cz9unzlB.
Pc th hin ca cc lp cF hin th=c .3u E"8Ko8e $c g0i l cc Di t$ng khzh'
gA"8Ko8a4De o4Je)/h. whi .S lnh S hon tt vi .t Di t$ng khzh'8 nF s@ g0i phMng
th:c Dispose ca Di t$ng gii phFng cc ti ngu'>n kh4ngz$cz9unzlB8 v3n )=a vo &
thu go. rc gii phFng cc ti ngu'>n $cz9unzlB ca Di t$ng. PNn hiu r5ng & th=c
thi kh4ng &/t &uc h' cc Di t$ngT vic g0i phMng th:c Dispose l nhi. v ca cli(nt.
7u' nhi>n8 v% th vin lp .NET Framework sO )ng .3u E"8Ko8e rng kh/p n>n C# cung cp
lnh using Mn gin hFa vic sO )ng cc Di t$ng khzh'. lo*n .S sau tr%nh &' cu
trGc ca lnh using\
using (FileStream fileStream = new FileStream("SomeFile.txt",
FileMode.Open)) {
// Lm g d vi di tong fileStream...
}
Ui <' l .t sD i. cNn lu B khi hin th=c .3u E"8Ko8e\
630
Chng 16: (c giao dinn }~ ou `hing deng
"S cli(nt n>n cF kh nvng g0i i g0i l*i phMng th:c Dispose . kh4ng g<' ra cc nh
hCng &t l$i.
7rong cc :ng )ng h#ztr$zaztiuztr%nh8 iu 9uan tr0ng l chJ cF .t tiu tr%nh th=c
thi phMng th:c Dispose. 7h4ng thng8 &o . s= tng & tiu tr%nh l nhi. v ca
.S cli(nt8 .!c )e &*n cF th hin th=c s= tng & &>n trong phMng th:c Dispose.
RhMng th:c Dispose kh4ng n>n nX. ngo*i l.
u% phMng th:c Dispose )0n )p tt c n>n kh4ng cNn g0i finalio(r ca Di t$ng.
RhMng th:c Dispose ca &*n n>n g0i phMng th:c GC.SuppressFinalize &o .
finalio(r kh4ng $c g0i trong 9u tr%nh thu go. rc.
nin th=c .t finalio(r sao cho phMng th:c Dispose s@ $c nF g0i th(o .t cM chI
an ton trong trng h$p .S cli(nt g0i Dispose kh4ng Gng. 7u' nhi>n8 n>n trnh tha.
chiIu In cc Di t$ng $cz9unzlB trong finalio(r v% kh4ng r} tr*ng thi ca Di
t$ng.
HIu .t lp khzh' thQa kI .t lp khzh' khc8 phMng th:c Dispose ca lp con
phi g0i phMng th:c Dispose ca lp cha. pFi phNn .S ca lp con trong .t khDi try
v g0i phMng th:c Dispose ca lp cha trong .t .nh finally &o . vic
th=c thi.
Pc phMng th:c v thuc t2nh khc ca lp n>n nX. ngo*i l
System.ObjectDisposedException nIu .S cli(nt th=c thi .t phMng th:c tr>n .t Di
t$ng S &i h'.
yp DisposeExample )i <' .inh h0a .t hin th=c phs &iIn ca .3u E"8Ko8e\
using System;
// Hin thc giao din IDisposable.
public class DisposeExample : IDisposable {
// Phn tu d liu private dung d bo hiu
// di tong d b huy hay cha.
bool isDisposed = false;
// Phn tu d liu private dung d lu gi
// handle cua ti nguyn khng-doc-quan-l.
private IntPtr resourceHandle;
// Phng thc khoi dng.
public DisposeExample() {
// Thu ly tham chiu dn ti nguyn khng-doc-quan-l.
631
Chng 16: (c giao dinn }~ ou `hing deng
// resourceHandle = ...
}
// Destructor/Finalizer.
~DisposeExample() {
// Goi phin ban nap chng protected cua Dispose
// v truyn gi tr "false" d cho bit rng
// Dispose dang doc goi trong qu trnh thu gom rc,
// ch khng phai boi m consumer.
Dispose(false);
}
// Hin thc public cua phng thc IDisposable.Dispose, doc goi
// boi consumer cua di tong d giai phng cc ti nguyn khng-
// doc-quan-l mt cch tt dnh.
public void Dispose() {
// Goi phin ban nap chng protected cua Dispose v truyn
// gi tr "true" d cho bit rng Dispose dang doc goi
// boi m consumer, ch khng phai boi b thu gom rc.
Dispose(true);
// V phng thc Dispose thc hin tt ca vic don dep cn
// thit nn bao dam b thu gom rc khng goi destructor cua lp.
GC.SuppressFinalize(this);
}
// Phin ban nap chng protected cua phng thc Dispose. i s
// disposing cho bit phng thc doc goi boi m consumer (true),
// hay boi b thu gom rc (false).
protected virtual void Dispose(bool disposing) {
if (!isDisposed) {
if (disposing) {
// Phng thc ny doc goi boi m consumer. Goi
632
Chng 16: (c giao dinn }~ ou `hing deng
// phng thc Dispose cua cc thnh vin d liu
// doc-quan-l c hin thc giao din IDisposable.
//
}
// Giai phng tt ca cc ti nguyn khng-doc-quan-l
// v thit lp gi tr cua cc thnh vin d liu
// doc-quan-l thnh null.
// Close(resourceHandle);
}
// Bo rng di tong ny d b huy.
isDisposed = true;
}
// Trc khi thc thi bt k chc nang no, bao dam rng
// Dispose cha doc thc thi trn di tong.
public void SomeMethod() {
// Nm mt ngoai l nu di tong d b huy.
if (isDisposed) {
throw new ObjectDisposedException("DisposeExample");
}
// Thc thi chc nang cua phng thc...
//
}

public static void Main() {
// Lnh using bao dam phng thc Dispose doc goi
// ca khi ngoai l xay ra.
using (DisposeExample d = new DisposeExample()) {
// Lm g d vi d...
633
Chng 16: (c giao dinn }~ ou `hing deng
}
}
}
6' 6' -i n th c "i u "h - nh-d ng Q$ormatta!le ty%eR -i n th c "i u "h - nh-d ng Q$ormatta!le ty%eR
#eA JwA >@qA Q>nJ OIQ s@tZ J^ Q>t LVWJ fg hUAB Q>X JSJ format string, D\ J^ Q>t
QeX Hc A>?AB F@tZ h@uA J>Zx@ s>SJ A>cZ J>X AI@ hZAB Jbc A^ hnc D\X format
specifier(
H@qA Q>nJ B@cX h@qA $!stem.E"ormattable(
lo*n .S )i <' .inh h0a cch sO )ng for.at sp(cifi(r gphNn in 6.h trong phMng th:c
WriteLine ca lp System.Console.
double a = 34568.568;
uint b = 12000;
byte c = 254;
Console.WriteLine("a = k@l, b = k?l, and c = kAl", a, b, c);
Console.WriteLine("a = k@:c@l, b = k?:nGl, and c = kA'?@:xMl", a, b, c);
whi ch*' tr>n .' vi thiIt l6p &n ia l EngD"8h gQ.'.h8 o*n .S n' s@ cho kIt ;ut nh
sau gtha' si ni )ung ca for.at sp(cifi(r s@ tha' si inh )*ng ca kIt ;ut .t cch ng
k .!c )e )K liu v3n kh4ng tha' sih\
a = 34568.568, b = 12000, and c = 254
a = 345,69, b = 12,000.0000, and c = 000fe
l k2ch ho*t vic h# tr$ for.at sp(cifi(r8 &*n phi hin th=c giao )in IFormattable. piao
)in n' khai &o .t phMng th:c cF t>n l ToString vi chK kB nh sau\
string ToString(string format, IFormatProvider formatProvider);
lDi sD format l .t System.String ch:a for.at string gchu#i inh )*ngh. or.at string l
phNn for.at sp(cifi(r ph2a sau )u hai ch.. u2 )8 trong for.at sp(cifi(r {2,10:x5} gC v2 )
tr>nh8 x5 l for.at string. or.at string ch:a nhKng chJ thi . th hin IFormattable s@ sO
)ng khi t*o ra )*ng chu#i cho ni )ung ca nF. 7i liu .NET Framework pht &iu r5ng\
nhKng kiu cF hin th=c IFormattable th% phi h# tr$ for.at string G ggeneraDh8 nhng
nhKng for.at string $c h# tr$ khc th% ph thuc vo hin th=c. lDi sD format l null nIu
for.at sp(cifi(r kh4ng ch:a phNn for.at string8 v2 ) {0} ha' {1,20}.
lDi sD formatProvider l tha. chiIu In .t th hin System.IFormatProvider g)eng tru'
;ut cc th4ng tin &n iap&ao gt. cc )K liu nh &iu t$ng tin t ha' sD l$ng chK sD
th6p ph<nh. 7h(o .!c inh8 formatProvider l null8 nghqa l &*n s@ sO )ng cc thiIt l6p &n
ia ca tiu tr%nh hin hnh gcF th l' $c th4ng 9ua phMng th:c tqnh CurrentCulture ca
lp System.Globalization.CultureInfoh.
.NET Framework ch 'Iu sO )ng IFormattable h# tr$ vic inh )*ng cc kiu gi tri8
nhng nF cF th $c sO )ng cho &t k kiu no. u2 )8 lp Person )i <' cF hin th=c
giao )in IFormattable. yp n' ch:a )anh hiu v t>n ca .t ngi8 v s@ tr v t>n th(o
634
Chng 16: (c giao dinn }~ ou `hing deng
cc inh )*ng khc nhau te' vo for.at string. yp Person kh4ng sO )ng cc thiIt l6p &n
ia )o Di sD formatProvider cung cp.
using System;
public class Person : IFormattable {
// Cc thnh vin private dung d lu tr danh hiu
// v tn cua mt ngi.
private string title;
private string[] names;
// Phng thc khoi dng dung d thit lp danh hiu v tn.
public Person(string title, params string[] names) {
this.title = title;
this.names = names;
}
// Chp d phng thc Object.ToString d tra v
// tn theo dnh dang general.
public override string ToString() {
return ToString("G", null);
}
// Hin thc phng thc IFormattable.ToString d tra v
// tn theo cc dang khc nhau da trn format string.
public string ToString(string format,
IFormatProvider formatProvider) {
string result = null;
// Su dng dnh dang general nu format = null.
if (format == null) format = "G";
// Ni dung cua format string cho bit dnh dang cua tn.
switch (format.ToUpper()[0]) {
635
Chng 16: (c giao dinn }~ ou `hing deng
case 'S':
// Su dng dang short: first-initial v surname.
result = names[0][0] + ". " + names[names.Length-1];
break;
case 'P':
// Su dng dang 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':
// Su dng dang informal: ch c first-name.
result = names[0];
break;
case 'G':
default:
// Su dng dang mac dnh/general: first-name v surname.
result = names[0] + " " + names[names.Length-1];
break;
}
return result;
}
}
lo*n .S )i <' tr%nh &' cch sO )ng kh nvng inh )*ng ca lp Person\
// Tao mt di tong Person m ta mt ngi c tn l
// Mr. Richard Glen David Peters.
Person person =
636
Chng 16: (c giao dinn }~ ou `hing deng
new Person("Mr", "Richard", "Glen", "David", "Peters");
// Hin th tn bng nhiu format string khc nhau.
System.Console.WriteLine("Dear {0:G},", person);
System.Console.WriteLine("Dear {0:P},", person);
System.Console.WriteLine("Dear {0:I},", person);
System.Console.WriteLine("Dear {0},", person);
System.Console.WriteLine("Dear {0:S},", person);
whi $c th=c thi8 o*n .S n' sinh ra kIt ;ut nh sau\
Dear Richard Peters,
Dear Mr. R. G. D. Peters,
Dear Richard,
Dear Richard Peters,
Dear R. Peters,
7' 7' -i n th c l % ngo i l t(y !i n -i n th c l % ngo i l t(y !i n
#eA JwA QeX OIQ YEd ABXe@ Yq Qr] F@jA fcX J>X FeA J^ Q>t fg hUAB J[ J>j Q>U Y
ABXe@ Yq Jbc FI Q>nJ Q>@ Lt Q>U Y JSJ ABXe@ Yq L_J6QHVAB6~AB6hUAB(
TeX OIQ YEd s>R6QZwA6Qn6>^c, Q>c sj YEd $!stem.#pplication0xception D\ >@qA
Q>nJ JSJ d>V[AB Q>~J s>@ hnAB DE@ J>? s A>V fcZz
public Custom0xception() : base() kl
public Custom0xception(string message) : base(message) kl
public Custom0xception(string message' 0xception inner)
: base(message' inner) kl
7h>. &t c: thnh vi>n )K liu te' &iIn no . ngo*i l cNn In8 &ao gt. cc phMng th:c
khCi )=ng v cc thuc t2nh cNn thiIt thao tc cc thnh vi>n )K liu.
Pc lp ngo*i l l )u' nht8 &*n kh4ng $c khai &o cc lp .i hin th=c ch:c nvng
.i ha' .C rng. PM chI th lB ngo*i l ca & th=c thi g$c trng ra &Ci cc lnh\ try8
catch8 v finallyh l. vic )=a tr>n kiu ngo*i l &i nX.8 ch: kh4ng phi cc thnh vi>n
ch:c nvng ha' )K liu $c hin th=c &Ci ngo*i l &i nX..
HIu cNn nX. .t ngo*i l8 &*n n>n sO )ng .t lp ngo*i l cF sn trong th vin lp .NET
Framework gnIu ttn t*i .t lp phe h$ph. Ui <' l .t sD ngo*i l hKu 2ch\
System.ArgumentNullExceptionEkhi .S lnh tru'n .t gi tri Di sD null cho .t
phMng th:c kh4ng h# tr$ Di sD null.
System.ArgumentOutOfRangeExceptionEkhi .S lnh tru'n cho phMng th:c .t gi
tri Di sD kh4ng phe h$p gln 9u ha' nhV 9uh.
637
Chng 16: (c giao dinn }~ ou `hing deng
System.FormatExceptionEkhi .S lnh tru'n cho phMng th:c .t Di sD String ch:a
)K liu kh4ng $c inh )*ng Gng.
HIu kh4ng cF lp ngo*i l no p :ng $c nhu cNu ca &*n8 ho!c &*n c. th' :ng )ng
ca &*n s@ $c l$i tQ vic sO )ng cc ngo*i l !cztrngz:ngz)ng8 &*n cF th t*o .t lp
ngo*i l cho .%nh. l t2ch h$p ngo*i l te' &iIn vi cM chI th lB ngo*i l ca & th=c thi v
v3n giK t2nh nht 9un vi .3u $c hin th=c &Ci cc lp ngo*i l cF sn8 &*n cNn\
l!t .t t>n cF B nghqa cho lp ngo*i l te' &iIn8 kIt thGc &5ng tQ Exception8 ch~ng
h*n8 TypeMismatchException ha' RecordNotFoundException.
7hQa kI lp ApplicationException. u cM &n8 lp ngo*i l te' &iIn phi thQa kI lp
System.Exception8 nIu kh4ng tr%nh &i>n )ich s@ )=ng l>n l#i khi &*n nX. ngo*i l.
ApplicationException thQa kI Exception v $c nghi l. lp sM sC cho tt c cc
lp ngo*i l !cztrngz:ngz)ng.
lnh )u lp ngo*i l te' &iIn l sealed nIu &*n kh4ng .uDn cc lp ngo*i l khc cF
th thQa kI nF.
nin th=c th>. cc thuc t2nh v cc thnh vi>n )K liu h# tr$ cc th4ng tin te' &iIn
. lp ngo*i l n' cung cp.
nin th=c &a phMng th:c khCi )=ng public vi chK kB nh )i <' v &o .
chGng g0i phMng th:c khCi )=ng ca lp cM sC\
public CustomException() : base() {}
public CustomException(string message): base(message) {}
public CustomException(string message, Exception inner)
: base(message, inner) {}
y. cho lp ngo*i te' &iIn trC n>n khztuNnzt=zhFa & th=c thi cF th .arshal cc
th hin ca nF 9ua cc &i>n .in :ng )ng v &i>n .'. p )ng !c t2nh
System.SerializableAttribute thng l S cho cc lp ngo*i l kh4ng hin th=c
cc thnh vi>n )K liu te' &iIn. 7u' nhi>n8 v% Exception hin th=c giao )in
System.Runtime.Serialization.ISerializable n>n nIu ngo*i l ca &*n cF khai &o
cc thnh vi>n )K liu te' &iIn8 &*n phi chXp 1 phMng th:c
ISerializable.GetObjectData ca lp Exception c?ng nh hin th=c .t phMng th:c
khCi )=ng gii tuNn t= hFa vi chK kB nh )i <'. HIu lp ngo*i l ca &*n l
sealed8 nh )u phMng th:c khCi )=ng gii tuNn t= hFa l privateT nIu kh4ng th%
nh )u nF l protected.
private CustomException(SerializationInfo info,
StreamingContext context) {}
RhMng th:c GetObjectData v phMng th:c khCi )=ng gii tuNn t= hFa phi g0i
phMng th:c tMng Mng trong lp cM sC cho phXp lp cM sC th=c hin tuNn t= hFa
v gii tuNn t= hFa )K liu ca nF .t cch Gng /n g;(. .c Za.Z &iIt cch l.
cho .t lp trC n>n khztuNnzt=zhFah.
Ui <' l .t lp ngo*i l te' &iIn cF t>n l CustomException gthQa kI lp
ApplicationExceptionh. yp n' khai &o hai thnh vi>n )K liu te' &iIn\ .t chu#i cF t>n l
stringInfo v .t gi tri lu6n lB cF t>n l booleanInfo.
638
Chng 16: (c giao dinn }~ ou `hing deng
using System;
using System.Runtime.Serialization;
// nh du CustomException l Serializable (kha-tun-t-ha).
[Serializable]
public sealed class CustomException : ApplicationException {
// Cc thnh vin d liu tuy bin cho CustomException.
private string stringInfo;
private bool booleanInfo;
// Ba phng thc khoi dng chun; ch cn goi phng thc
// khoi dng cua lp c so (System.ApplicationException).
public CustomException() : base() {}
public CustomException(string message): base(message) {}
public CustomException(string message, Exception inner)
: base(message, inner) {}
// Phng thc khoi dng giai tun t ha (cn cho giao din
// ISerialization). V CustomException l sealed nn phng thc
// khoi dng ny l private. Nu CustomException khng phai l
// sealed th phng thc khoi dng ny nn doc khai bo l
// protected d cc lp dn xut c th goi n trong qu trnh
// giai tun t ha.
private CustomException(SerializationInfo info,
StreamingContext context) : base (info, context) {
// Giai tun t ha mi thnh vin d liu tuy bin.
stringInfo = info.GetString("StringInfo");
booleanInfo = info.GetBoolean("BooleanInfo");
}
// Cc phng thc khoi dng cho php m lnh thit lp
639
Chng 16: (c giao dinn }~ ou `hing deng
// cc thnh vin d liu tuy bin.
public CustomException(string message, string stringInfo,
bool booleanInfo): this(message) {
this.stringInfo = stringInfo;
this.booleanInfo = booleanInfo;
}
public CustomException(string message, Exception inner,
string stringInfo, bool booleanInfo) : this(message, inner) {
this.stringInfo = stringInfo;
this.booleanInfo = booleanInfo;
}
// Cc thuc tnh ch-doc cho php truy xut dn cc
// thnh vin d liu tuy bin.
public string StringInfo {
get { return stringInfo; }
}
public bool BooleanInfo {
get { return booleanInfo; }
}
// Phng thc GetObjectData (doc khai bo trong giao din
// ISerializable) doc su dng trong qu trnh tun t ha
// CustomException. V CustomException c khai bo cc thnh
// vin d liu tuy bin nn n phai chp d hin thc
// GetObjectData cua lp c so.
public override void GetObjectData(SerializationInfo info,
StreamingContext context) {
// Tun t ha cc thnh vin d liu tuy bin.
info.AddValue("StringInfo", stringInfo);
info.AddValue("BooleanInfo", booleanInfo);
// Goi lp c so d tun t ha cc thnh vin cua n.
base.GetObjectData(info, context);
}
640
Chng 16: (c giao dinn }~ ou `hing deng
// Chp d thuc tnh Message cua lp c so (d km cc
// thnh vin d liu tuy bin vo).
public override string Message {
get {
string message = base.Message;
if (stringInfo != null) {
message += Environment.NewLine +
stringInfo + " = " + booleanInfo;
}
return message;
}
}
}
7rong cc :ng )ng ln8 &*n s@ thng ;u'>n hin th=c .t vi lp ngo*i l te' &iIn. L*n
cNn lu t<. In cch ts ch:c cc ngo*i l te' &iIn v .S lnh s@ sO )ng chGng nh thI no.
HFi chung8 trnh t*o ra cc lp ngo*i l .i trQ khi .S lnh cNn n# l=c &/t ngo*i l FT sO
)ng cc thnh vi>n )K liu thu th4ng tin8 ch: kh4ng phi cc lp ngo*i l. Hgoi ra8 trnh
ph<n cp lp th(o chiu s<u . n>n ph<n cp c*n8 th(o chiu rng.
8'
8' -i n th c i s s "i n t(y !i n -i n th c i s s "i n t(y !i n
3>@ hnAB YCA OIQ fn s@qA, FeA JwA QHZ]GA OIQ QHeAB Q>S@ L_J6QHVAB6fn6s@qA J>X
JSJ d>V[AB Q>~J Q>U Y fn s@qA(
TeX OIQ YEd LK@ fK fn s@qA Qr] F@jA hpA vZPQ Q YEd $!stem.0vent#rg( 3>@ hnAB
YCA fn s@qA, >}] QeX OIQ Q>t >@qA Jbc YEd LK@ fK fn s@qA D\ QHZ]GA A^ J>X JSJ
d>V[AB Q>~J Q>U Y fn s@qA(
whi khai &o cc kiu s= kin8 th4ng thng &*n s@ cNn tru'n tr*ng thi !cztrngzs=zkin
cho cc phMng th:c th lB s= kin. l t*o .t lp Di sD s= kin te' &iIn tu<n th(o .3u
EBen/ )o .NET Framework inh nghqa8 &*n cNn\
U3n ;ut lp Di sD s= kin te' &iIn tQ lp EventArgs. yp EventArgs kh4ng ch:a )K
liu v $c sO )ng ceng vi cc s= kin kh4ng cNn tru'n tr*ng thi.
l!t .t t>n cF B nghqa cho lp Di sD s= kin te' &iIn8 kIt thGc &5ng tQ EventArgsT
ch~ng h*n8 DiskFullEventArgs ha' MailReceivedEventArgs.
lnh )u lp Di sD s= kin l sealed nIu &*n kh4ng .uDn cc lp Di sD s= kin khc
cF th thQa kI nF.
641
Chng 16: (c giao dinn }~ ou `hing deng
nin th=c th>. cc thuc t2nh v cc thnh vi>n )K liu h# tr$ tr*ng thi s= kin .
&*n cNn tru'n cho cc phMng th:c th lB s= kin. 7Dt nht l l. cho tr*ng thi s=
kin trC n>n &t &iIn g"mmu/a4Deh8 nh v6' &*n n>n sO )ng cc thnh vi>n )K liu
private readonly v sO )ng cc thuc t2nh public cho phXp tru' ;ut chJz0c In
cc thnh vi>n )K liu n'.
nin th=c .t phMng th:c khCi )=ng public h# tr$ cu h%nh &an Nu ca tr*ng thi s=
kin.
y. cho lp Di sD s= kin ca &*n trC n>n khztuNnzt=zhFa g8er"aD"Oa4Deh & th=c
thi cF th .arshal cc th hin ca nF 9ua cc &i>n .in :ng )ng v &i>n .'. p
)ng !c t2nh System.SerializableAttribute thng l S cho cc lp Di sD s=
kin. 7u' nhi>n8 nIu lp Di sD s= kin cF cc '>u cNu tuNn t= hFa !c &it8 &*n phi
hin th=c giao )in System.Runtime.Serialization.ISerializable g;(. .c Za.Z
&iIt cch l. cho .t lp trC n>n khztuNnzt=zhFah.
lo*n .S )i <' tr%nh &' .t lp Di sD s= kin te' &iIn cF t>n l MailReceivedEventArgs.
pi sO cF .t .ailzs(rv(r tru'n cc th hin ca lp MailReceivedEventArgs cho cc
phMng th:c th lB s= kin nh6n .t th4ng ip (z.ail. yp n' ch:a cc th4ng tin v ngi
gOi v ch ca th4ng ip (z.ail.
using System;
[Serializable]
public sealed class MailReceivedEventArgs : EventArgs {
// Cc thnh vin private readonly gi trang thi s kin
// (doc phn b cho tt ca cc phng thc th l s kin).
// Lp MailReceivedEventArgs s cho bit ai d gui mail
// v chu d l g.
private readonly string from;
private readonly string subject;
// Phng thc khoi dng (khoi tao trang thi s kin).
public MailReceivedEventArgs(string from, string subject) {
this.from = from;
this.subject = subject;
}
// Cc thuc tnh ch-doc cho php truy xut
// trang thi s kin.
public string From { get { return from; } }
642
Chng 16: (c giao dinn }~ ou `hing deng
public string Subject { get { return subject; } }
}
9'
9' -i n th c m u 0ingleton $ -i n th c m u 0ingleton $
#eA JwA FRX LRO J> J^ OIQ Q>t >@qA Jbc OIQ s@tZ QA Qe@ OIQ Q>o@ L@tO J>X
QHVEJ D\ Q>t >@qA L^ Y\ s>R6QHZ]6vZPQ LK@ DE@ QPQ JR JSJ d>wA Qg Jbc ~AB hUAB(
H@qA Q>nJ s@tZ A\] Q>X OpZ Singleton A>V fcZz
H@qA Q>nJ OIQ Q>\A> D@CA QA> private Lt B@? OIQ Q>cO J>@jZ LjA Q>t >@qA
Jbc s@tZ(
H@qA Q>nJ OIQ Q>ZIJ QaA> QA> s>R6QHZ]6vZPQ6JTAB6s>c@ Lt J>X d>d QHZ]
vZPQ J>6LJ LjA Q>t >@qA(
H@qA Q>nJ OIQ d>V[AB Q>~J s>@ hnAB private Lt O} YqA> s>TAB Q>t QeX
Q>CO JSJ Q>t >@qA Jbc s@tZ(
7rong tt c cc .3u $c &iIt In8 cF l@ .3u *"ngDe/on $c &iIt In nhiu nht v thng
$c sO )ng nht. "c 2ch ca .3u *"ngDe/on l &o . chJ cF .t th hin ca .t kiu
ttn t*i C .t thi i. cho trc v cho phXp tru' ;ut ton cc In cc ch:c nvng ca th
hin F. lo*n .S )i <' tr%nh &' .t hin th=c ca .3u *"ngDe/on cho .t lp cF t>n l
SingletonExample\
public class SingletonExample {
// Thnh vin tnh dung d gi mt tham chiu dn th hin singleton.
private static SingletonExample instance;
// Phng thc khoi dng tnh dung d tao th hin singleton.
// Mt cch khc l su dng "Lazy Initialization" trong
// thuc tnh Instance.
static SingletonExample () {
instance = new SingletonExample();
}

// Phng thc khoi dng private dung d ngan m lnh tao thm
// cc th hin cua kiu singleton.
private SingletonExample () {}

// Thuc tnh public cho php truy xut dn th hin singleton.
public static SingletonExample Instance {
643
Chng 16: (c giao dinn }~ ou `hing deng

get { return instance; }
}

// Cc phng thc public cung cp chc nang cua singleton.
public void SomeMethod1 () { /../ }
public void SomeMethod2 () { /../ }
}
l g0i cc ch:c nvng ca lp SingletonExample8 &*n cF th l' v .t tha. chiIu In
8"ngDe/on &5ng thuc t2nh Instance v rti g0i cc phMng th:c ca nF. L*n c?ng cF th tr=c
tiIp th=c thi cc thnh vi>n ca 8"ngDe/on th4ng 9ua thuc t2nh Instance. lo*n .S )i <'
tr%nh &' c hai cch n'\
// Thu ly tham chiu dn singleton v goi mt phng thc cua n.
SingletonExample s = SingletonExample.Instance;
s.SomeMethod1();

// Thc thi chc nang cua singleton m khng cn tham chiu.
SingletonExample.Instance.SomeMethod2();
10' 10' -i n th c m u L!server $ -i n th c m u L!server $
#eA JwA >@qA Q>nJ OIQ J[ J>j >@qZ ZR Lt OIQ LK@ QVWAB is%9Jectk FSX DE@ JSJ LK@
QVWAB s>SJ io9ser"erk DG A>?AB Q>c] L@ QHeAB Q>S@ Jbc A^(
H@qA Q>nJ OpZ 39ser"er F`AB JSJ s@tZ b] A>@qO iL^AB Dc@ QHy Y\ JSJ JXA QH >\O
cA6QX\A6DG6s@tZ6h?6Y@qZt:pe?safe f%nction pointerk D\ JSJ s@tZ fn s@qA(
Pch tru'n thDng khi hin th=c .3u F48erBer l hin th=c hai giao )in\ .t .4 t
o&s(rv(r gIObserverh v .t .4 t su&(ct gISubjecth. Pc Di t$ng cF hin th=c
IObserver s@ vng kB vi su&(ct8 cho &iIt chGng .uDn $c th4ng &o v cc s= kin 9uan
tr0ng gnh tha' si tr*ng thih tc ng In su&(ct. |u&(ct chiu trch nhi. 9un lB )anh
sch cc o&s(rv(r S vng kB v th4ng &o vi chGng khi p :ng cc s= kin tc ng In
su&(ct. |u&(ct thng th4ng &o vi o&s(rv(r &5ng phMng th:c Notify g$c khai &o
trong giao )in IObserverh. |u&(ct cF th tru'n )K liu cho o&s(rv(r trong phMng th:c
Notify8 ho!c o&s(rv(r cF th cNn g0i .t phMng th:c $c khai &o trong giao )in
ISubject thu l' th>. cc chi tiIt v s= kin.
"!c )e &*n cF th hin th=c .3u F48erBer &5ng C# th(o cch vQa $c .4 t8 nhng v% .3u
F48erBer 9u phs &iIn trong cc gii php phNn .. hin *i n>n C# v .NET Framework
cung cp cc kiu s= kin v ' nhi. Mn gin hFa hin th=c ca nF. |O )ng s= kin v
' nhi. nghqa l &*n kh4ng cNn khai &o giao )in IObserver v ISubject. Hgoi ra8 &*n
kh4ng cNn hin th=c cc logic cNn thiIt 9un lB v th4ng &o vi cc o&s(rv(r S vng kB
E<' ch2nh l phNn )r ;' ra l#i nht khi viIt .S.
644
Chng 16: (c giao dinn }~ ou `hing deng
.NET Framework sO )ng .t hin th=c cho .3u F48erBer )=aztr>nzs=zkin v )=aztr>nz'z
nhi. thng ;u'>n In n#i nF $c !t .t ci t>n\ .3u EBen/. il( F48erBerE2amKDe.)8
ch:a .t hin th=c cho .3u EBen/. u2 ) n' &ao gt.\
yp Thermostat gsu&(cthEth(o )}i nhit hin t*i v th4ng &o vi o&s(rv(r khi cF
s= tha' si nhit .
yp TemperatureChangeEventArgsEl .t hin th=c te' &iIn ca lp
System.EventArgs8 $c sO )ng Fng gFi )K liu cNn ph<n &s cho o&s(rv(r.
' nhi. TemperatureEventHandlerEinh nghqa chK kB ca phMng th:c . tt c
cc o&s(rv(r ca Di t$ng Thermostat phi hin th=c8 v Di t$ng Thermostat s@ g0i
phMng th:c n' trong s= kin tha' si nhit .
yp TemperatureChangeObserver v TemperatureAverageObserverEl cc o&s(rv(r
ca lp Thermostat.
yp TemperatureChangeEventArgs g$c tr%nh &' &>n )ih )3n ;ut tQ lp
System.EventArgs. yp n' s@ ch:a tt c cc )K liu cNn thiIt su&(ct tru'n cho cc
o&s(rv(r khi nF th4ng &o vi chGng v .t s= kin. HIu kh4ng cNn tru'n )K liu8 &*n
kh4ng phi inh nghqa .t lp Di sD .i g&*n chJ cNn tru'n Di sD null khi )=ng n>n s=
kinh. {(. .c Za.b &iIt r} hMn v cch hin th=c lp Di sD s= kin te' &iIn.
// Lp di s s kin cha thng tin v s kin thay di nhit d.
// Mt th hin cua lp ny s doc truyn cung vi mi s kin.
public class TemperatureChangeEventArgs : System.EventArgs {
// Cc thnh vin d liu cha nhit d c v mi.
private readonly int oldTemperature, newTemperature;

// Phng thc khoi dng (nhn gi tr nhit d c v mi).
public TemperatureChangeEventArgs(int oldTemp, int newTemp) {

oldTemperature = oldTemp;
newTemperature = newTemp;
}

// Cc thuc tnh dung d truy xut cc gi tr nhit d.
public int OldTemperature { get { return oldTemperature; } }
public int NewTemperature { get { return newTemperature; } }
}
lo*n .S )i <' tr%nh &' cch khai &o ' nhi. TemperatureEventHandler. U=a tr>n khai
&o n'8 tt c cc o&s(rv(r phi hin th=c .t phMng th:c gt>n kh4ng 9uan tr0ngh8 tr v
645
Chng 16: (c giao dinn }~ ou `hing deng
void v nh6n hai Di sD\ .t Di t$ng Thermostat v .t Di t$ng
TemperatureChangeEventArgs. 7rong 9u tr%nh th4ng &o8 Di sD Thermostat chJ In Di
t$ng Thermostat S )=ng n>n s= kin8 v Di sD TemperatureChangeEventArgs ch:a cc )K
liu v nhit c? v .i.
// Uy nhim cho bit ch k m tt ca cc phng thc
// th l s kin phai hin thc.
public delegate void TemperatureEventHandler(Thermostat s,
TemperatureChangeEventArgs e);
yp Thermostat l Di t$ng &i gi. st trong .3u F48erBer gEBen/h n'. 7h(o lB thu'It8 .t
thiIt &i gi. st thiIt l6p nhit hin t*i &5ng cch g0i thuc t2nh Temperature tr>n .t Di
t$ng Thermostat. whi F8 Di t$ng Thermostat )=ng n>n s= kin TemperatureChange v gOi
.t Di t$ng TemperatureChangeEventArgs In .#i o&s(rv(r. Ui <' l .S lnh cho lp
Thermostat\
// Lp m ta mt b n nhit, l ngun gc cua cc s kin thay di
// nhit d. Trong mu Observer, di tong Thermostat l subject.
public class Thermostat {

// Trng private dung d gi nhit d hin tai.
private int temperature = 0;

// S kin dung d duy tr danh sch cc uy nhim observer v
// dng nn s kin thay di nhit d.
public event TemperatureEventHandler TemperatureChange;
// Phng thc protected dung d dng nn s kin TemperatureChange.
// V s kin ch c th doc pht sinh bn trong kiu cha n nn
// vic su dng phng thc protected cho php cc lp dn xut
// c cch hnh xu tuy bin v vn c th dng nn s kin
// cua lp c so.
virtual protected void RaiseTemperatureEvent
(TemperatureChangeEventArgs e) {

if (TemperatureChange != null) {

TemperatureChange(this, e);
}
}

// Thuc tnh public dung d ly v thit lp nhit d hin tai.
// Pha "set" chu trch nhim dng nn s kin thay di nhit d
646
Chng 16: (c giao dinn }~ ou `hing deng
// d thng bo vi tt ca cc observer v thay di ny.
public int Temperature {

get { return temperature; }

set {
// Tao mt di tong di s s kin mi d cha
// nhit d c v mi.
TemperatureChangeEventArgs e =
new TemperatureChangeEventArgs(temperature, value);

// Cp nht nhit d hin tai.
temperature = value;

// Dng nn s kin thay di nhit d.
RaiseTemperatureEvent(e);
}
}
}
ui .c 2ch .inh h0a .3u F48erBer8 v2 ) n' cF hai kiu o&s(rv(r\
TemperatureAverageObserver ghin thi nhit trung &%nh .#i khi .t s= kin tha' si nhit
;' rah v TemperatureChangeObserver ghin thi th4ng tin v s= tha' si .#i khi .t s=
kin tha' si nhit ;' rah. Ui <' l .S lnh cho hai lp n'\
// Observer hin th thng tin v s thay di nhit d
// khi c mt s kin thay di nhit d xay ra.
public class TemperatureChangeObserver {

// Phng thc khoi dng (nhn mt tham chiu dn di tong
// Thermostat cn doc TemperatureChangeObserver gim st).
public TemperatureChangeObserver(Thermostat t) {

// Tao mt th hin uy nhim TemperatureEventHandler v
// dang k n vi Thermostat d doc ch dnh.
t.TemperatureChange +=
new TemperatureEventHandler(this.TemperatureChange);
}
647
Chng 16: (c giao dinn }~ ou `hing deng

// Phng thc th l s kin thay di nhit d.
public void TemperatureChange(Thermostat sender,
TemperatureChangeEventArgs temp) {

System.Console.WriteLine
("ChangeObserver: Old={0}, New={1}, Change={2}",
temp.OldTemperature, temp.NewTemperature,
temp.NewTemperature - temp.OldTemperature);
}
}
// Observer hin th thng tin v nhit d trung bnh
// khi c mt s kin thay di nhit d xay ra.
public class TemperatureAverageObserver {

// Sum cha tng cc gi tr nhit d.
// Count cha s ln s kin thay di nhit d xay ra.
private int sum = 0, count = 0;

// Phng thc khoi dng (nhn mt tham chiu dn di tong
// Thermostat cn doc TemperatureAverageObserver gim st).
public TemperatureAverageObserver (Thermostat t) {

// Tao mt th hin uy nhim TemperatureEventHandler v
// dang k n vi Thermostat d doc ch dnh.
t.TemperatureChange +=
new TemperatureEventHandler(this.TemperatureChange);
}

// Phng thc th l s kin thay di nhit d.
public void TemperatureChange(Thermostat sender,
TemperatureChangeEventArgs temp) {

count++;
sum += temp.NewTemperature;

System.Console.WriteLine
648
Chng 16: (c giao dinn }~ ou `hing deng
("AverageObserver: Average={0:F}",
(double)sum/(double)count);
}
}
yp Thermostat inh nghqa .t phMng th:c Main g$c tr%nh &' &>n )ih ch*' v2 )
n'. |au khi t*o .t Di t$ng Thermostat v hai Di t$ng o&s(rv(r8 phMng th:c Main s@
nh/c &*n nh6p vo .t nhit . "#i khi &*n nh6p .t nhit .i8 Di t$ng Thermostat s@
&o cho o&s(rv(r hin thi th4ng tin ra cOa ss Con8oDe.
public static void Main() {
// Tao mt di tong Thermostat.
Thermostat t = new Thermostat();

// Tao hai observer.
new TemperatureChangeObserver(t);
new TemperatureAverageObserver(t);

// Lap d ly nhit d tu ngi dung. Bt c gi tr
// no khng phai s nguyn s khin vng lap kt thc.
do {

System.Console.Write("nrEnter current temperature: ");

try {
// Chuyn du vo cua ngi dung thnh mt s
// nguyn v su dng n d thit lp nhit d
// hin tai cua b n nhit.
t.Temperature =
System.Int32.Parse(System.Console.ReadLine());

} catch (System.Exception) {
// Su dng diu kin ngoai l d kt thc vng lap.
System.Console.WriteLine("Terminating ObserverExample.");
return;
}
} while (true);
649
Chng 16: (c giao dinn }~ ou `hing deng
}
Ui <' l kIt ;ut khi ch*' F48erBerE2amKDe.)8 gcc gi tri in 6. l )o &*n nh6p voh\
Enter current temperature: M@
ChangeObserver: Old=0, New=50, Change=50
AverageObserver: Average=50.00
Enter current temperature: A@
ChangeObserver: Old=50, New=20, Change=-30
AverageObserver: Average=35.00
Enter current temperature: G@
ChangeObserver: Old=20, New=40, Change=20
AverageObserver: Average=36.6
650
Chng 16: (c giao dinn }~ ou `hing deng
17
651
Ch01n2 3_4ST HtA Hq5 VI /pI TRN* ]IN,J]S
652
653
Chng 17: .w ha hs }ri oii `ang Oindok
")ro8o?/ .NET Framework $c thiIt kI sao cho cF th ch*' tr>n nhiu h iu
hnh khc nhau8 n<ng cao t2nh kh chu'n ca .S lnh g)oAe mo4"D"/yh v Mn
gin hFa vic t2ch h$p ;u'>nznn g)ro88IKDa/?orm "n/egra/"onh. &
nin t*i8 .NET Framework cF th ch*' tr>n cc h iu hnh\ &")ro8o?/ @"nAow88 Free$*E8
L"nu28 v &a) F* :. 7u' nhi>n8 nhiu &n hin th=c v3n cha hon chJnh ha' cha $c chp
nh6n rng rSi. &")ro8o?/ @"nAow8 hin l h iu hnh . .NET Framework $c ci !t
nhiu nht. Uo F8 cc .c trong chMng n' t6p trung vo cc tc v !c trng cho h iu
hnh @"nAow88 &ao gt.\
y' cc th4ng tin .4i trng @"nAow8 g.c Z[.Z v Z[.]h.
phi vo nh6t kB s= kin @"nAow8 g.c Z[.^h.
7ru' ;ut @"nAow8 =eg"8/ry g.c Z[._h.
7*o v ci !t )ich v @"nAow8 g.c Z[.` v Z[.ah.
7*o shortcut tr>n Ee8k/oK ha' trong */ar/ menu ca @"nAow8 g.c Z[.[h.
P>wA YEA JSJ J>~J AAB LVWJ Q>RX YZNA QHXAB J>V[AB A\] LVWJ C.> FRX Dq
F`AB JSJ Z]GA FRX ONQ QHZ] vZPQ O} YqA> iCo&e ;ccess Sec%rit:k( %O J>V[AB
- DG FRX ONQ QHZ] vZPQ O} YqA>, D\ vO Q\@ Y@qZ (NET Framework S! DG JSJ
Z]GA JwA Q>@jQ Lt Q>nJ Q>@ QAB FI d>NA(
1'
1' Truy xu t th,ng tin m,i tr ng Truy xu t th,ng tin m,i tr ng
#eA JwA QHZ] vZPQ JSJ Q>TAB Q@A DG OT@ QHVoAB Q>nJ Q>@ O\ ~AB hUAB LcAB J>e]
QHXAB L^(
Sg hUAB JSJ Q>\A> D@CA Jbc YEd $!stem.0nvironment(
yp Environment cung cp .t t6p cc thnh vi>n tqnh )eng l' gv trong .t sD trng
h$p8 sOa sih th4ng tin v .4i trng . .t :ng )ng ang ch*' trong F. Lng Z[.Z .4
t cc thnh vi>n thng )eng nht.
Bfng 17'1 Cc thnh vin thng dng ca lp Environment
Th~nh }itn ?i `f
Thuc `hnh
CommandLine
y' chu#i ch:a )kng lnh th=c thi :ng )ng hin t*i8
gt. c t>n :ng )ngT ;(. chi tiIt C .c Z.`.
CurrentDirectory
y' v thiIt l6p chu#i ch:a th .c hin hnh ca
:ng )ng. Lan Nu8 thuc t2nh n' ch:a t>n ca th
.c . :ng )ng S ch*' trong F.
HasShutdownStarted
y' .t gi tri lu6n lB cho &iIt C=L S &/t Nu t/t8
ho!c .in :ng )ng S &/t Nu gii phFng ha' cha.
MachineName
y' chu#i ch:a t>n .'.
654
Chng 17: .w ha hs }ri oii `ang Oindok
OSVersion
y' .t Di t$ng System.OperatingSystem ch:a
cc th4ng tin v nn v phi>n &n ca h iu hnh
n5. )i. {(. chi tiIt &>n )i &ng.
SystemDirectory
y' chu#i ch:a ng )3n N' ca th .c h
thDng.
TickCount
y' .t gi tri kiu int cho &iIt thi gian gt2nh &5ng
.ilizgi<'h tQ khi h thDng khCi ng.
UserDomainName
y' chu#i ch:a t>n .in ca ngi )eng hin hnh.
7huc t2nh n' s@ giDng vi thuc t2nh MachineName
nIu <' l .' c l6p.
UserInteractive
y' .t gi tri lu6n lB cho &iIt :ng )ng cF ang
ch*' trong chI tMng tc vi ngi )eng ha'
kh4ng. 7r v false khi :ng )ng l .t )ich v
ho!c :ng )ng @e4.
UserName
y' chu#i ch:a t>n ngi )eng S khCi ch*' tiu
tr%nh hin hnh.
Version
y' .t Di t$ng System.Version ch:a th4ng tin
v phi>n &n ca C=L.
Phng `hcc
ExpandEnvironmentVariables
7ha' t>n ca cc &iIn .4i trng trong .t chu#i
&5ng gi tri ca &iInT ;(. chi tiIt C .c Z[.].
GetCommandLineArgs
7r v .t .ng kiu chu#i ch:a tt c cc phNn tO
)kng lnh )eng th=c thi :ng )ng hin t*i8 gt.
c t>n :ng )ngT ;(. chi tiIt C .c Z.`.
GetEnvironmentVariable
7r v chu#i ch:a gi tri ca .t &iIn .4i trngT
;(. chi tiIt C .c Z[.].
GetEnvironmentVariables
7r v .t System.Collections.Idictionary ch:a
tt c cc &iIn .4i trng v cc gi tri ca chGngT
;(. chi tiIt C .c Z[.]
GetFolderPath
7r v chu#i ch:a ng )3n In .t th .c h
thDng !c &it8 $c ;c inh &Ci kiu lit k>
System.Environment.SpecialFolder g&ao gt. cc
th .c cho <n/erne/ )a)he8 Cook"e8 ;"8/ory8
Ee8k/oK8 v FaBour"/eT ;(. ti liu .NET
Framework *E' cF )anh sch tt c cc gi tri
n'h.
655
Chng 17: .w ha hs }ri oii `ang Oindok
GetLogicalDrives
7r v .ng kiu chu#i ch:a t>n ca tt c cc s qa
lu6n lB.
lDi t$ng OperatingSystem g)o OSVersion tr vh cF hai thuc t2nh\ Platform v Version.
7huc t2nh Platform tr v .t gi tri thuc kiu lit k> System.PlatformIDE;c inh nn
hin hnhT cc gi tri h$p l l Win32NT8 Win32S8 Win32Windows8 v WinCE. 7huc t2nh Version
tr v .t Di t$ng System.VersionE;c inh phi>n &n ca h iu hnh. l ;c inh
ch2nh ;c t>n h iu hnh8 &*n phi sO )ng c th4ng tin nn v phi>n &n8 &ng Z[.] )i
<' s@ lit k> .t sD th4ng tin chi tiIt.
Bfng 17'2 Xc djnh h diu hnh
Pma`oao"< ?aoa 6zakion ?inoa 6zakion 0n i{u h~nh
Win32Windows
G 10 @"nAow8 TU
Win32Windows
G T0 @"nAow8 &e
Win32NT
G 0 @"nAow8 NT G
Win32NT
W 0 @"nAow8 2000
Win32NT
W 1 @"nAow8 :P
Win32NT
W 2 @"nAow8 *erBer 200C
yp AccessEnvironmentExample trong v2 ) )i <' sO )ng lp Environment hin thi
th4ng tin v .4i trng hin hnh.
using System;
public class AccessEnvironmentExample {
public static void Main() {
// Dng lnh.
Console.WriteLine("Command line : " + Environment.CommandLine);
// Thng tin v phin ban h diu hnh v mi trng thc thi.
Console.WriteLine("OS PlatformID : " +
Environment.OSVersion.Platform);
Console.WriteLine("OS Major Version : " +
Environment.OSVersion.Version.Major);
Console.WriteLine("OS Minor Version : " +
Environment.OSVersion.Version.Minor);
Console.WriteLine("CLR Version : " + Environment.Version);
// Thng tin v ngi dung, my, v min.
656
Chng 17: .w ha hs }ri oii `ang Oindok
Console.WriteLine("User Name : " + Environment.UserName);
Console.WriteLine("Domain Name : " + Environment.UserDomainName);
Console.WriteLine("Machine name : " + Environment.MachineName);
// Cc thng tin mi trng khc.
Console.WriteLine("Is interactive : "
+ Environment.UserInteractive);
Console.WriteLine("Shutting down : "
+ Environment.HasShutdownStarted);
Console.WriteLine("Ticks since startup : "
+ Environment.TickCount);
// Hin th tn cua tt ca cc da lun l.
foreach (string s in Environment.GetLogicalDrives()) {
Console.WriteLine("Logical drive : " + s);
}
// Thng tin v cc th mc chun.
Console.WriteLine("Current folder : "
+ Environment.CurrentDirectory);
Console.WriteLine("System folder : "
+ Environment.SystemDirectory);
// Lit k tt ca cc th mc dac bit.
foreach (Environment.SpecialFolder s in
Enum.GetValues(typeof(Environment.SpecialFolder))) {
Console.WriteLine("{0} folder : {1}",
s, Environment.GetFolderPath(s));
}
// Nhn Enter d kt thc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
}
657
Chng 17: .w ha hs }ri oii `ang Oindok
2'
2' 9 y gi tr c a m t !i n m,i tr ng 9 y gi tr c a m t !i n m,i tr ng
#eA JwA YP] B@S QHM Jbc OIQ F@jA OT@ QHVoAB Lt fg hUAB J>X ~AB hUAB Jbc FeA(
Sg hUAB JSJ d>V[AB Q>~J 7et0nvironment>ariable, 7et0nvironment>ariables, D\
0xpand0nvironment>ariables Jbc YEd 0nvironment(
RhMng th:c GetEnvironmentVariable tr v chu#i ch:a gi tri ca .t &iIn .4i trng8 ckn
phMng th:c GetEnvironmentVariables tr v .t Idictionary ch:a t>n v gi tri ca tt c
cc &iIn .4i trng )i )*ng chu#i. RhMng th:c ExpandEnvironmentVariables cung cp
.t cM chI Mn gin tha' t>n &iIn .4i trng &5ng gi tri ca nF &>n trong .t chu#i8
&5ng cch !t t>n &iIn .4i trng giKa )u phNn trv. gh.
u2 ) sau .inh h0a cch sO )ng &a phMng th:c tr>n\
using System;
using System.Collections;
public class VariableExample {
public static void Main () {
// Ly mt bin mi trng thng qua tn.
Console.WriteLine("Path = " +
Environment.GetEnvironmentVariable("Path"));
Console.WriteLine();
// Thay tn bin mi trng bng gi tr cua n.
Console.WriteLine(Environment.ExpandEnvironmentVariables(
"The Path on computername is Path"));
Console.WriteLine();
// Ly tt ca cc bin mi trng. Hin th gi tr
// cua cc bin mi trng bt du bng k t 'P'.
IDictionary vars = Environment.GetEnvironmentVariables();
foreach (string s in vars.Keys) {
if (s.ToUpper().StartsWith("P")) {
Console.WriteLine(s + " = " + vars[s]);
}
}
Console.WriteLine();
658
Chng 17: .w ha hs }ri oii `ang Oindok
// Nhn Enter d kt thc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
}
3' 3' 3hi m t s "i n vo nh t "* s "i n Windows 3hi m t s "i n vo nh t "* s "i n Windows
#eA JwA B>@ OIQ fn s@qA D\X A>NQ s fn s@qA *in&ows(
Sg hUAB JSJ Q>\A> D@CA Jbc YEd $!stem.-iagnostics.0vent+og Lt QeX OIQ A>NQ s
iAjZ JwAk, LAB s OIQ ABZA fn s@qA ie"ent so%rcek, D\ B>@ fn s@qA(
L*n cF th ghi vo nh6t kB s= kin @"nAow8 &5ng cc phMng th:c tqnh ca lp EventLog8
ho!c cF th t*o .t Di t$ng EventLog v sO )ng cc thnh vi>n ca nF. Ue ch0n cch no8
trc khi ghi &*n cNn phi 9u'It inh s@ sO )ng nh6t kB no v vng kB .t ngutn s= kin
cho nh6t kB F. Hgutn s= kin Mn gin chJ l .t chu#i g)u' nhth nh6n )in :ng )ng ca
&*n. "t ngutn s= kin chJ cF th $c vng kB cho .t nh6t kB t*i .t thi i..
7h(o .!c inh8 nh6t kB s= kin gt. &a lo*i\ >KKD")a/"on8 *y8/em8 v *e)ur"/y. 7h4ng thng8
&*n s@ ghi vo nh6t kB >KKD")a/"on8 nhng c?ng cF th ghi vo .t nh6t kB te' &iIn. L*n
kh4ng cNn phi tr=c tiIp t*o ra nh6t kB te' &iInT khi &*n vng kB .t ngutn s= kin cho .t
nh6t kB8 nIu nh6t kB n' kh4ng ttn t*i8 nF s@ $c t*o .t cch t= ng.
"t khi S ch0n nh6t kB 2ch v S vng kB ngutn s= kin tMng :ng cho nF8 &*n cF th &/t
Nu ghi cc (ntr' nh6t kB &5ng phMng th:c WriteEntry. RhMng th:c n' cung cp cc phi>n
&n n*p chtng cho phXp &*n chJ inh .t vi ho!c tt c cc gi tri sau\
Phu#i ch:a ngutn s= kin cho (ntr' nh6t kB gchJ cF C cc phMng th:c tqnhh.
Phu#i ch:a th4ng ip cho (ntr' nh6t kB.
pi tri thuc kiu lit k> System.Diagnostics.EventLogEntryType8 chJ inh kiu ca
(ntr' nh6t kB. Pc gi tri h$p l l Error8 FailureAlert8 Information8 SuccessAudit8 v
Warning.
pi tri kiu int chJ inh <E ca (ntr' nh6t kB.
pi tri kiu short chJ inh cat(gor' ca (ntr' nh6t kB.
"ng kiu byte ch:a )K liu th4 tMng :ng vi (ntr' nh6t kB.
yp EventLogExample trong v2 ) )i <' tr%nh &' cch sO )ng cc phMng th:c tqnh ca
lp EventLog ghi .t (ntr' vo nh6t kB s= kin ca .' cc &. yp EventLog c?ng cung
cp cc phMng th:c n*p chtng ghi vo nh6t kB s= kin ca cc .' C ;a g;(. ti liu
.NET Framework *E' &iIt th>. chi tiIth.
using System;
using System.Diagnostics;
659
Chng 17: .w ha hs }ri oii `ang Oindok
public class EventLogExample {
public static void Main () {
// Nu ngun s kin khng tn tai, dang k n vi
// nht k Application trn my cc b.
// ang k mt ngun s kin d tn tai s
// sinh ra ngoai l System.ArgumentException.
if (!EventLog.SourceExists("EventLogExample")) {
EventLog.CreateEventSource("EventLogExample","Application");
}
// Ghi mt s kin vo nht k s kin.
EventLog.WriteEntry(
"EventLogExample", // Ngun s kin d dang k
"A simple test event.", // Thng dip cho s kin
EventLogEntryType.Information, // Kiu s kin
1, // ID cua s kin
0, // Category cua s kin
new byte[] {10, 55, 200} // D liu cua s kin
);
// Nhn Enter d kt thc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
}
4'
4' Truy xu t Windows Oegistry Truy xu t Windows Oegistry
#eA JwA LJ Q>TAB Q@A Q >egistr: >X_J B>@ Q>TAB Q@A D\X >egistr:(
Sg hUAB YEd Microso*t.inDA.&egistr! Lt YP] DG LK@ QVWAB Microso*t.inDA.
&egistr!;e! OT QR OIQ s>^c O~J6J[6f( Sg hUAB JSJ Q>\A> D@CA Jbc LK@ QVWAB
&egistr!;e! Lt hZ]qQ J] d>A JPd LJ, fgc, D\ QeX s>^c D\ B@S QHM(
L*n kh4ng th tru' ;ut tr=c tiIp cc khFa v cc gi tri n5. trong =eg"8/ry. 7rc hIt &*n
phi thu l' Di t$ng RegistryKey .4 t .t khFa .:czcMzsC8 sau F )u't 9ua c<' ph<n
cp ca Di t$ng n' In khFa cNn t%.. yp Registry hin th=c &' trng tqnh8 cc
660
Chng 17: .w ha hs }ri oii `ang Oindok
trng n' u tr v Di t$ng RegistryKey .4 t khFa .:czcMzsC. Lng Z[.^ tr%nh &' cc
khFa .:czcMzsC :ng vi cc trng n'.
Bfng 17'3 Cc trng tnh ca lp egistry
Tang Bng }ri
ClassesRoot
;'EVcCL>**E*c=FFT
CurrentConfig
;'EVcCQ==ENTcCFNF<6
CurrentUser
;'EVcCQ==ENTcQ*E=
DynData
;'EVcEVNcE>T>
LocalMachine
;'EVcLFC>Lc&>C;<NE
PerformanceData
;'EVcPE=FF=&>NCEcE>T>
Users
;'EVcQ*E=*
P>V[AB Q>~J QA> &egistr!;e!.(pen&emote6ase;e! J>X d>d FeA O OIQ s>^c
O~J6J[6f QHCA OIQ OS] vc ivO J>@ Q@jQ QHXAB Q\@ Y@qZ (NET Framework S!k(
"t khi S cF Di t$ng RegistryKey .4 t khFa .:czcMzsC8 &*n phi )u't 9ua c<' ph<n cp
In khFa cNn t%.. l h# tr$ vic )u't c<'8 lp RegistryKey cung cp cc thnh vi>n )i
<'\
7huc t2nh SubKeyCountE7r v sD khFa con.
RhMng th:c GetSubKeyNamesE7r v .t .ng kiu chu#i ch:a t>n ca tt c cc
khFa con.
RhMng th:c OpenSubKeyE7r v tha. chiIu In .t khFa con. RhMng th:c n' cF
hai phi>n &n n*p chtng\ phMng th:c th: nht .C khFa trong chI chJz0cT phMng
th:c th: hai nh6n .t Di sD kiu bool8 nIu l true th% cho phXp ghi.
"t khi S cF Di t$ng RegistryKey .4 t khFa cNn t%.8 &*n cF th t*o8 0c8 c6p nh6t8 ho!c
;Fa cc khFa con v cc gi tri &5ng cc phMng th:c trong &ng Z[._. Pc phMng th:c sOa
si ni )ung ca khFa ki hVi &*n phi cF Di t$ng RegistryKey cho phXp ghi.
Bfng 17'4 Cc phng thc ca egistryKey dng d tao, dc, cp nht, v xa cc kha v cc
gi trj egistry
Phng `hcc ?i `f
CreateSubKey
7*o .t khFa .i vi t>n $c chJ inh v tr v Di t$ng
RegistryKey cho phXp ghi. HIu khFa S ttn t*i8 phMng th:c n'
s@ tr v .t tha. chiIu cho phXp ghi In khFa S ttn t*i.
DeleteSubKey
{Fa khFa vi t>n $c chJ inh8 khFa n' phi kh4ng cF khFa
con gnhng cF th cF gi trihT nIu kh4ng8 ngo*i l
System.InvalidOperationException s@ &i nX..
DeleteSubKeyTree
{Fa khFa vi t>n $c chJ inh ceng vi tt c cc khFa con ca
nF.
661
Chng 17: .w ha hs }ri oii `ang Oindok
DeleteValue
{Fa .t gi tri vi t>n $c chJ inh khVi khFa hin t*i.
GetValue
7r v gi tri vi t>n $c chJ inh tQ khFa hin t*i. pi tri tr v
l .t Di t$ng8 &*n phi Xp nF v kiu th2ch h$p. U*ng Mn
gin nht ca GetValue tr v null nIu gi tri kh4ng ttn t*i.
Hgoi ra ckn cF .t phi>n &n n*p chtng cho phXp chJ inh gi
tri tr v .!c inh gtha' cho nullh nIu gi tri kh4ng ttn t*i.
GetValueNames
7r v .ng kiu chu#i ch:a t>n ca tt c cc gi tri trong khFa
hin t*i.
SetValue
7*o gho!c c6p nh6th gi tri vi t>n $c chJ inh. L*n kh4ng th
chJ inh kiu )K liu =eg"8/ry )eng lu trK )K liuT SetValue
s@ t= ng ch0n kiu )=a tr>n kiu )K liu $c lu trK.
yp RegistryKey cF hin th=c giao )in IDisposableT &*n n>n g0i phMng th:c
IDisposable.Dispose gii phFng cc ti ngu'>n ca h iu hnh khi S hon tt vi Di
t$ng RegistryKey.
yp RegistryExample trong v2 ) sau nh6n .t Di sD )kng lnh v )u't 9u' c<' cF gDc
l CurrentUser t%. cc khFa cF t>n treng vi Di sD )kng lnh. whi t%. $c .t khFa8
RegistryExample s@ hin thi tt c cc gi tri kiu chu#i n5. trong khFa n'. yp
RegistryExample c?ng giK .t &iIn I. trong khFa ;'EVcCQ==ENTcQ*E=H
=eg"8/ryE2amKDe.
using System;
using Microsoft.Win32;
public class RegistryExample {
public static void Main(String[] args) {
if (args.Length 0) {
// Mo kha c so CurrentUser.
using(RegistryKey root = Registry.CurrentUser) {
// Cp nht bin dm.
UpdateUsageCounter(root);
// Duyt d quy d tm kha vi tn cho trc.
SearchSubKeys(root, args[0]);
}
}
662
Chng 17: .w ha hs }ri oii `ang Oindok
// Nhn Enter d kt thc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
public static void UpdateUsageCounter(RegistryKey root) {
// Tao mt kha d lu tr bin dm,
// hoac ly tham chiu dn kha d c.
RegistryKey countKey = root.CreateSubKey("RegistryExample");
// oc gi tr cua bin dm hin tai, v ch dnh
// gi tr mac dnh l 0. p di tong v kiu Int32,
// v gn vo mt gi tr int.
int count = (Int32)countKey.GetValue("UsageCount", 0);
// Ghi bin dm d doc cp nht tro lai Registry,
// hoac tao mt gi tr mi nu n cha tn tai.
countKey.SetValue("UsageCount", ++count);
}
public static void SearchSubKeys(RegistryKey root,
String searchKey) {
// Lap qua tt ca cc kha con trong kha hin tai.
foreach (string keyname in root.GetSubKeyNames()) {
try {
using (RegistryKey key = root.OpenSubKey(keyname)) {
if (keyname == searchKey) PrintKeyValues(key);
SearchSubKeys(key, searchKey);
}
} catch (System.Security.SecurityException) {
// Bo qua SecurityException vi chu dnh cua v d ny.
// Mt s kha con cua HKEY_CURRENT_USER doc bao mt
663
Chng 17: .w ha hs }ri oii `ang Oindok
// v s nm SecurityException khi doc mo.
}
}
}
public static void PrintKeyValues(RegistryKey key) {
// Hin th tn cua kha doc tm thy,
// v s long gi tr cua n.
Console.WriteLine("Registry key found : {0} contains {1} values",
key.Name, key.ValueCount);
// Hin th cc gi tr ny.
foreach (string valuename in key.GetValueNames()) {
if (key.GetValue(valuename) is String) {
Console.WriteLine(" Value : {0} = {1}",
valuename, key.GetValue(valuename));
}
}
}
}
whi $c th=c thi tr>n .' ch*' @"nAow8 :P vi )kng lnh &egistr!0xample 0nvironment8
v2 ) n' s@ cho kIt ;ut nh sau\
Registry key found : HKEY_CURRENT_USEREnvironment contains 4 values
Value : TEMP =
C:Documents and Settingsnnbphuong81Local SettingsTemp
Value : TMP =
C:Documents and Settingsnnbphuong81Local SettingsTemp
Value : LIB =
C:Program FilesMicrosoft Visual Studio .NET 2003SDKv1.1Lib
Value : INCLUDE =
C:Program FilesMicrosoft Visual Studio .NET 2003SDKv1.1include
5' 5' T o m t d ch v Windows T o m t d ch v Windows
#eA JwA QeX OIQ ~AB hUAB L^AB Dc@ QHy Y\ OIQ hMJ> DU *in&ows(
TeX OIQ YEd Q>c sj Q YEd $!stem.$ervice/rocess.$ervice6ase( Sg hUAB JSJ
Q>ZIJ QaA> Q>c sj Lt L@GZ s>@tA >\A> D@ Jbc hMJ> DU, D\ J>d L JSJ d>V[AB
664
Chng 17: .w ha hs }ri oii `ang Oindok
Q>~J Q>c sj Lt >@qA Q>nJ JSJ J>~J AAB JwA Q>@jQ( H@qA Q>nJ d>V[AB Q>~J Main,
QHXAB L^ QeX OIQ Q>t >@qA Jbc YEd hMJ> DU D\ QHZ]GA A^ J>X d>V[AB Q>~J QA>
$ervice6ase.&un(
HIu ang sO )ng &")ro8o?/ V"8uaD C# .NET8 &*n cF th )eng .3u )= n @"nAow8 *erB")e
t*o .t )ich v @"nAow8. "3u n' cung cp sn cc .S lnh cM &n cNn cho .t lp )ich v8
v &*n cF th hin th=c th>. cc ch:c nvng te' &iIn.
l t*o .t )ich v @"nAow8 &5ng ta'8 &*n phi hin th=c .t lp )3n ;ut tQ ServiceBase.
yp ServiceBase cung cp cc ch:c nvng cM &n cho phXp @"nAow8 *erB")e Con/roD
&anager g*C&h cu h%nh )ich v8 thi hnh )ich v )i nn8 v iu khin thi gian sDng ca
)ich v. *C& c?ng iu khin vic cc :ng )ng khc cF th iu khin )ich v nh thI no.
LEd $ervice6ase LVWJ LMA> AB>c QHXAB $!stem.$erviceprocess, hX L^ FeA d>R@
Q>CO OIQ Q>cO J>@jZ LjA cffOFY] A\] s>@ v] hnAB YEd hMJ> DU(
0nh 17'1 Mu du n Windows Service
l iu khin )ich v ca &*n8 *E& sO )ng &' phMng th:c protected thQa kI tQ lp
ServiceBase g;(. &ng Z[.`h. L*n cNn chXp 1 cc phMng th:c n' hin th=c cc ch:c
nvng v cch th:c ho*t ng ca )ich v. wh4ng phi tt c )ich v u h# tr$ tt c cc
th4ng ip iu khin. Pc thuc t2nh thQa kI tQ lp ServiceBase s@ &o vi *C& r5ng )ich
v ca &*n h# tr$ cc th4ng ip iu khin noT thuc t2nh iu khin .#i kiu th4ng ip
$c ghi r} trong &ng Z[.`.
Bfng 17'5 Cc phng thc dng d diu khin su hoat dng ca mt djch vu
Phng `hcc ?i `f
665
Chng 17: .w ha hs }ri oii `ang Oindok
OnStart
7t c cc )ich v u phi h# tr$ phMng th:c OnStart8 *C& g0i
phMng th:c n' khCi ng )ich v. *C& tru'n cho )ich v .t
.ng kiu chu#i ch:a cc Di sD cNn thiIt. HIu OnStart kh4ng tr v
trong ^d gi<' th% *C& s@ kh4ng ch*' )ich v.
OnStop
l$c *C& g0i )Qng .t )ich vE*C& chJ g0i OnStop nIu thuc
t2nh CanStop l true.
OnPause
l$c *C& g0i t*. )Qng .t )ich vE*C& chJ g0i OnPause nIu
thuc t2nh CanPauseAndContinue l true.
OnContinue
l$c *C& g0i tiIp tc .t )ich v &i t*. )QngE*C& chJ g0i
OnContinue nIu thuc t2nh CanPauseAndContinue l true.
OnShutdown
l$c *C& g0i khi h thDng ang t/tE*C& chJ g0i OnShutDown nIu
thuc t2nh CanShutdown l true.
OnPowerEvent
l$c *C& g0i khi tr*ng thi ngutn .:czhzthDng tha' si8 ch~ng
h*n .t laptop chu'n sang chI susp(n). *C& chJ g0i
OnPowerEvent nIu thuc t2nh CanHandlePowerEvent l true.
OnCustomCommand
Pho phXp .C rng cM chI iu khin )ich v vi cc th4ng ip iu
khin te' &iInT ;(. chi tiIt trong ti liu .NET Framework *E'.
Hh $c c6p trong &ng Z[.`8 phMng th:c OnStart phi tr v trong vkng ^d gi<'8 )o F
&*n kh4ng n>n sO )ng OnStart th=c hin cc thao tc khCi ng tDn nhiu thi gian. "t
lp )ich v n>n hin th=c .t phMng th:c khCi )=ng th=c hin cc thao tc khCi ng8
&ao gt. vic cu h%nh cc thuc t2nh thQa kI tQ lp ServiceBase. Hgoi cc thuc t2nh khai
&o cc th4ng ip iu khin no $c )ich v h# tr$8 lp ServiceBase ckn hin th=c &a
thuc t2nh 9uan tr0ng khc\
ServiceNameEy t>n $c *C& sO )ng nh6n )*ng )ich v8 v phi $c thiIt l6p
trc khi )ich v ch*'.
AutoLogEliu khin vic )ich v cF t= ng ghi vo nh6t kB s= kin ha' kh4ng khi
nh6n th4ng ip iu khin OnStart8 OnStop8 OnPause8 v OnContinue.
EventLogE7r v .t Di t$ng EventLog $c cu h%nh trc vi t>n ngutn s= kin
geBen/ 8our)eh treng vi thuc t2nh ServiceName $c vng kB vi nh6t kB >KKD")a/"on
g;(. .c Z[.^ cF th>. th4ng tin v lp EventLogh.
Lc cuDi ceng trong vic t*o .t )ich v l hin th=c phMng th:c tqnh Main. RhMng th:c
n' phi t*o .t th hin ca lp )ich v v tru'n nF cho phMng th:c tqnh
ServiceBase.Run. HIu .uDn ch*' nhiu )ich v trong .t tiIn tr%nh8 &*n phi t*o .t .ng
cc Di t$ng ServiceBase v tru'n nF cho phMng th:c ServiceBase.Run. "!c )e cc lp
)ich v u cF phMng th:c Main nhng &*n kh4ng th th=c thi .S lnh )ich v .t cch tr=c
tiIpT &*n s@ nh6n $c hp th4ng &o nh h%nh Z[.] nIu tr=c tiIp ch*' .t lp )ich v. "c
Z[.a s@ tr%nh &' cch ci !t )ich v trc khi th=c thi.
666
Chng 17: .w ha hs }ri oii `ang Oindok
0nh 17'2 Hp thng bo Windows Service Start ailure
yp ServiceExample trong v2 ) )i <' sO )ng .t System.Timers.Timer ghi .t (ntr'
vo nh6t kB s= kin @"nAow8 th(o inh k.
using System;
using System.Timers;
using System.ServiceProcess;
public class ServiceExample : ServiceBase {
// Timer diu khin khi no ServiceExample ghi vo nht k s kin.
private System.Timers.Timer timer;
public ServiceExample() {
// Thit lp thuc tnh ServiceBase.ServiceName.
ServiceName = "ServiceExample";
// Cu hnh cc thng dip diu khin.
CanStop = true;
CanPauseAndContinue = true;
// Cu hnh vic ghi cc s kin quan trong vo
// nht k Application.
AutoLog = true;
}
// Phng thc s doc thc thi khi Timer ht
// hiu lc ghi mt entry vo nht k Application.
private void WriteLogEntry(object sender, ElapsedEventArgs e) {
// Su dng di tong EventLog d ghi vo nht k s kin.
667
Chng 17: .w ha hs }ri oii `ang Oindok
EventLog.WriteEntry("ServiceExample active : " + e.SignalTime);
}
protected override void OnStart(string[] args) {
// Ly chu k ghi s kin tu di s th nht.
// Mac dnh l 5000 mili-giy,
// v ti thiu l 1000 mili-giy.
double interval;
try {
interval = System.Double.Parse(args[0]);
interval = Math.Max(1000, interval);
} catch {
interval = 5000;
}
EventLog.WriteEntry(String.Format("ServiceExample starting. " +
"Writing log entries every {0} milliseconds...", interval));
// Tao, cu hnh, v khoi dng mt System.Timers.Timer
// d goi phng thc WriteLogEntry theo dnh k.
// Cc phng thc Start v Stop cua lp System.Timers.Timer
// gip thc hin cc chc nang khoi dng, tam dung, tip tc,
// v dung dch v.
timer = new Timer();
timer.Interval = interval;
timer.AutoReset = true;
timer.Elapsed += new ElapsedEventHandler(WriteLogEntry);
timer.Start();
}
protected override void OnStop() {
EventLog.WriteEntry("ServiceExample stopping...");
timer.Stop();
// Giai phng ti nguyn h thng do Timer su dng.
668
Chng 17: .w ha hs }ri oii `ang Oindok
timer.Dispose();
timer = null;
}
protected override void OnPause() {
if (timer != null) {
EventLog.WriteEntry("ServiceExample pausing...");
timer.Stop();
}
}
protected override void OnContinue() {
if (timer != null) {
EventLog.WriteEntry("ServiceExample resuming...");
timer.Start();
}
}
public static void Main() {
// Tao mt th hin cua lp ServiceExample d ghi mt
// entry vo nht k Application. Truyn di tong ny
// cho phng thc tnh ServiceBase.Run.
ServiceBase.Run(new ServiceExample());
}
}
6'
6' T o m t ! ci t d ch v Windows T o m t ! ci t d ch v Windows
#eA L} QeX OIQ ~AB hUAB hMJ> DU *in&ows D\ JwA J\@ L_Q A^(
T>c sj YEd $!stem.Con*iguration.Enstall.Enstaller Lt QeX OIQ YEd J\@ L_Q BO
A>?AB Q>TAB Q@A JwA Q>@jQ Lt J\@ L_Q D\ JPZ >lA> YEd hMJ> DU Jbc FeA( Sg hUAB
JTAB JU /nstall%til.e8e Lt Q>nJ >@qA D@qJ J\@ L_Q(
669
Chng 17: .w ha hs }ri oii `ang Oindok
Hh S c6p trong .c Z[.`8 &*n kh4ng th ch*' cc lp )ich v .t cch tr=c tiIp. u% )ich
v $c t2ch h$p .:c cao vi h iu hnh @"nAow8 v th4ng tin $c giK trong =eg"8/ry n>n
)ich v phi $c ci !t trc khi ch*'.
HIu ang sO )ng &")ro8o?/ V"8uaD */uA"o .NET8 &*n cF th t*o .t & ci !t cho )ich v
.t cch t= ng &5ng cch nh/p phi vo khung thiIt kI ca lp )ich v v ch0n >AA
<n8/aDDer tQ .(nu ngK cnh. L ci !t n' cF th $c g0i &Ci cc )= n trin khai ho!c c4ng
c <n8/aDDu/"D.e2e ci !t )ich v.
L*n c?ng cF th t= t*o .t & ci !t cho )ich v @"nAow8 th(o cc &c sau\
Z. 7*o .t lp thQa kI tQ lp Installer.
]. p )ng !c t2nh System.ComponentModel.RunInstallerAttribute(true) cho lp ci
!t.
^. 7rong phMng th:c khCi )=ng ca lp ci !t8 t*o .t th hin ca lp
System.ServiceProcess.ServiceProcessInstaller. 7hiIt l6p cc thuc t2nh Account8
UserName8 v Password ca Di t$ng ServiceProcessInstaller cu h%nh ti khon
. )ich v s@ ch*'.
_. P?ng trong phMng th:c khCi )=ng ca lp ci !t8 t*o .t th hin ca lp
System.ServiceProcess.ServiceInstaller cho .#i )ich v cNn ci !t. |O )ng cc
thuc t2nh ca Di t$ng ServiceInstaller cu h%nh cc th4ng tin v .#i )ich v8
&ao gt.\
$ervice=ameEPhJ inh t>n . @"nAow8 sO )ng nh6n )*ng )ich v. 7>n
n' phi treng vi gi tri $c gn cho thuc t2nh
$ervice6ase.$ervice=ame.
-ispla!=ameEPhJ inh t>n th<n thin cho )ich v.
$tart)!peE|O )ng cc gi tri thuc kiu lit k> $!stem.$ervice/rocess.
$ervice$tartMode iu khin vic )ich v $c khCi ng t= ng ha'
&5ng ta'8 ha' &i v4 hiu.
$ervice-ependsUponEl' .t .ng kiu chu#i ch:a t>n cc )ich v phi
$c ch*' trc khi )ich v hin hnh ch*'.
`. |O )ng thuc t2nh Installers thQa kI tQ lp cM sC Installer l' .t Di t$ng
System.Configuration.Install.InstallerCollection. 7h>. cc Di t$ng
ServiceProcessInstaller v tt c cc Di t$ng ServiceInstaller vo t6p h$p n'.
yp ServiceInstallerExample )i <' l .t & ci !t cho lp ServiceExample trong .c
Z[.`. U= n .3u cho .c n' ch:a c hai lp ServiceExample v ServiceInstallerExample8
v t*o ra fil( th=c thi *erB")e<n8/aDDerE2amKDe.e2e.
using System.ServiceProcess;
using System.Configuration.Install;
using System.ComponentModel;
[RunInstaller(true)]
public class ServiceInstallerExample : Installer {
670
Chng 17: .w ha hs }ri oii `ang Oindok
public ServiceInstallerExample() {
// Tao v cu hnh di tong ServiceProcessInstaller.
ServiceProcessInstaller ServiceExampleProcess =
new ServiceProcessInstaller();
ServiceExampleProcess.Account = ServiceAccount.LocalSystem;
// Tao v cu hnh di tong ServiceInstaller.
ServiceInstaller ServiceExampleInstaller =
new ServiceInstaller();
ServiceExampleInstaller.DisplayName =
"C# Service Example";
ServiceExampleInstaller.ServiceName = "ServiceExample";
ServiceExampleInstaller.StartType = ServiceStartMode.Automatic;
// Thm di tong ServiceProcessInstaller v ServiceInstaller
// vo tp hop Installers (thua k tu lp c so Installer).
Installers.Add(ServiceExampleInstaller);
Installers.Add(ServiceExampleProcess);
}
}
l ci !t ServiceExample8 &*n cNn t*o )=ng )= n8 chu'n In th .c ch:a fil(
*erB")e<n8/aDDerE2amKDe.e2e g.!c inh l 4"nHAe4ugh8 rti th=c thi lnh Enstallutil
$erviceEnstaller0xample.exe. |au F8 &*n cF th sO )ng @"nAow8 ComKu/er &anagemen/
;(. v iu khin )ich v. "!c )e StartType $c chJ inh l Automatic8 )ich v n' v3n
kh4ng $c khCi ng sau khi ci !t. L*n phi khCi ng )ich v &5ng ta' gho!c khCi ng
l*i .'h trc khi )ich v ghi cc (ntr' vo nh6t kB s= kin. "t khi )ich v S ch*'8 &*n cF
th ;(. cc (ntr' . nF S ghi vo nh6t kB >KKD")a/"on &5ng EBen/ V"ewer. l g &V
ServiceExample8 &*n hS' th=c thi lnh Enstallutil /u $erviceEnstaller0xample.exe.
671
Chng 17: .w ha hs }ri oii `ang Oindok
0nh 17'3 Windows Computer Management
7'
7' T o shortcut trn Aes"to% hay trong 0tart menu T o shortcut trn Aes"to% hay trong 0tart menu
#eA JwA QeX OIQ f>XHQJZQ QHCA esktop >c] QHXAB Start men% Jbc ABVo@ hrAB(
672
Chng 17: .w ha hs }ri oii `ang Oindok
Sg hUAB C3M /nterop Lt QHZ] vZPQ JSJ J>~J AAB Jbc *in&ows Script Cost( TeX
D\ JPZ >lA> OIQ Q>t >@qA Es.$.ortcut QV[AB ~AB DE@ f>XHQJZQ( T>V OUJ J>~c
f>XHQJZQ fm vSJ LMA> f>XHQJZQ vZPQ >@qA QHCA esktop >c] QHXAB Start men%(
7h vin lp .NET Framework kh4ng cF ch:c nvng t*o shortcut tr>n Ee8k/oK ha' trong */ar/
menuT tu' nhi>n8 vic n' cF th $c th=c hin )r )ng &5ng thnh phNn @"nAow8 *)r"K/
;o8/ g$c tru' ;ut th4ng 9ua CF& <n/eroKh. Pch t*o <n/eroK >88em4Dy tru' ;ut .t
thnh phNn CF& S $c tr%nh &' trong .c Z`.a. HIu ang sO )ng V"8uaD */uA"o .NET8
&*n hS' th>. .t tha. chiIu In @"nAow8 *)r"K/ ;o8/ F4Je)/ &oAeD g$c lit k> trong thj
CF& ca hp tho*i >AA =e?eren)eh. HIu kh4ng cF V"8uaD */uA"o .NET8 &*n hS' sO )ng c4ng
c TyKe L"4rary <mKor/er gTD4"mK.e2eh t*o .t <n/eroK >88em4Dy cho fil( w8hom.o)2 gfil(
n' thng n5. trong th .c @"nAow8H*y8/emC2h. L*n cF th l' phi>n &n .i nht ca
@"nAow8 *)r"K/ ;o8/ t*i 8htt94::;<=n>;#c?o<oft>co;:<c?#9t#n2H.
0nh 17'4 Chn Windows Script Host Obect Model trong hp thoai Add eference
"t khi S t*o v nh6p <n/eroK >88em4Dy vo )= n8 &*n hS' th=c hin cc &c sau\
Z. 7*o .t Di t$ng WshShell tru' ;ut vo @"nAow8 8heDD.
]. |O )ng thuc t2nh SpecialFolders ca Di t$ng WshShell ;c inh ng )3n In
th .c s@ ch:a shortcut. 7>n ca th .c Fng vai trk l in)(; Di vi thuc t2nh
SpecialFolders. u2 )8 chJ inh gi tri Desktop t*o shortcut tr>n Ee8k/oK8 v chJ
inh gi tri StartMenu t*o shortcut trong */ar/ menu. 7huc t2nh SpecialFolders ckn
673
Chng 17: .w ha hs }ri oii `ang Oindok
cF th $c sO )ng l' ng )3n In .0i th .c !c &it ca h thDngT cc gi
tri thng )eng khc l AllUsersDesktop v AllUsersStartMenu.
^. p0i phMng th:c CreateShortcut ca Di t$ng WshShell8 v tru'n ng )3n N'
ca fil( shortcut cNn t*o gcF phNn .C rng l .Dnkh. RhMng th:c n' s@ tr v .t th
hin IWshShortcut.
_. |O )ng cc thuc t2nh ca th hin IWshShortcut cu h%nh shortcut. u2 )8 &*n cF
th cu h%nh fil( th=c thi $c shortcut tha. chiIu8 &iu t$ng )eng cho shortcut8 li
.4 t8 v ph2. nFng.
`. p0i phMng th:c Save ca th hin IWshShortcut ghi shortcut vo qa. |hortcut s@
n5. tr>n Ee8k/oK ha' trong */ar/ menu gha' .t nMi no khch te' vo ng )3n $c
chJ inh khi t*o th hin IWshShortcut.
yp ShortcutExample trong v2 ) )i <' t*o shortcut cho No/eKaA.e2e tr>n Ee8k/oK v
trong */ar/ menu ca ngi )eng hin hnh. ShortcutExample t*o hai shortcut n' &5ng
phMng th:c CreateShortcut v chJ inh hai th .c khc nhau cho fil( shortcut. Pch n'
giGp &*n t*o fil( shortcut trong &t k th .c !c &it no $c tr v tQ thuc t2nh
WshShell.SpecialFolders.
using System;
using IWshRuntimeLibrary;
public class ShortcutExample {
public static void Main() {
// Tao shortcut cho Notepad trn Desktop.
CreateShortcut("Desktop");
// Tao shortcut cho Notepad trong Start menu.
CreateShortcut("StartMenu");
// Nhn Enter d kt thc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
public static void CreateShortcut(string destination) {
// Tao mt di tong WshShell d truy xut
// cc chc nang cua Windows shell.
WshShell wshShell = new WshShell();
674
Chng 17: .w ha hs }ri oii `ang Oindok
// Ly dng dn s cha file Notepad.lnk. Ban c th
// su dng phng thc System.Environment.GetFolderPath
// d ly dng dn, nhng su dng WshShell.SpecialFolders
// s truy xut doc nhiu th mc hn. Ban cn tao mt
// di tong tam tham chiu dn chui destination
// d thoa mn yu cu cua phng thc Item.
object destFolder = (object)destination;
string fileName =
(string)wshShell.SpecialFolders.Item(ref destFolder)
+ @"Notepad.lnk";
// Tao di tong shortcut. Tuy nhin, chang c g doc
// tao ra trong th mc cho dn khi shortcut doc lu.
IWshShortcut shortcut =
(IWshShortcut)wshShell.CreateShortcut(fileName);
// Cu hnh dng dn file thc thi.
// Su dng lp Environment cho dn gian.
shortcut.TargetPath =
Environment.GetFolderPath(Environment.SpecialFolder.System)
+ @"notepad.exe";
// Thit lp th mc lm vic l Personal (My Documents).
shortcut.WorkingDirectory =
Environment.GetFolderPath(Environment.SpecialFolder.Personal);
// Cung cp li m ta cho shortcut.
shortcut.Description = "Notepad Text Editor";
// Gn phm nng cho shortcut.
shortcut.Hotkey = "CTRL+ALT+N";
// Cu hnh cua s Notepad lun phng to khi khoi dng.
shortcut.WindowStyle = 3;
675
Chng 17: .w ha hs }ri oii `ang Oindok
// Cu hnh shortcut hin th icon du tin trong notepad.exe.
shortcut.IconLocation = "notepad.exe, 0";
// Lu file shortcut.
shortcut.Save();
}
}
676
5H- L-C A4 *II THI(U /WT S) CpN* C- >N`T
hNn ph lc n' gii thiu .t sD c4ng c nhV ghNu hIt l .irn ph2h nhng rt tDt cho
cc nh pht trin .NET8 trong F cF nhKng c4ng c giGp pht trin :ng )ng nhanh
hMn v cF nhKng c4ng c cF th l. tha' si cch th:c viIt .S lnh ca &*n. R
Li>n )ich cc o*n .S ng/n vi *n"KKe/ ComK"Der
{<' )=ng &iu th:c ch2nh 9u' vi =eguDa/or
|inh .S vi CoAe*m"/h
uiIt ki. thO Mn vi vi NQn"/
wi. sot .S lnh vi F2CoK
who st ass(.&l' vi .NET =e?De)/or
y6p ti liu .S lnh vi NEo)
7*o )=ng gii php vi N>n/
Pc c4ng c chu'n si\ >*P.NET Ver8"on *w"/)her8 V"8uaD */uA"o .NET ProJe)/
ConBer/er8 V$.NET /o C# ConBer/er8 v ConBer/ C# /o V$.NET
{<' )=ng (&sit( 9un tri cM sC )K liu vi >*P.NET &aker 1.1
A>3 V#un =vch cwc xoyn ;z n2{n m|# Sn#99Dt Co;9#@D? A>3 V#un =vch cwc xoyn ;z n2{n m|# Sn#99Dt Co;9#@D?
*n"KKe/ ComK"Der l .t :ng )ng nhV )eng viIt8 &i>n )ich8 v ch*' .S lnh. P4ng c n'
hKu 2ch khi &*n cF nhKng o*n .S ng/n v &*n kh4ng .uDn phi t*o ton & )= n V"8uaD
*/uA"o .NET gceng vi cc fil( i k1.h cho chGng.
y' v2 )8 gi sO &*n .uDn ch*' .t :ng )ng no F tQ &")ro8o?/ .NET Framework. 7rong
*n"KKe/ ComK"Der8 &*n hS' t*o .t :ng )ng Con8oDe .i. RhNn .S lnh cF th $c t*o &>n
trong phMng th:c Main ca :ng )ng n'. lo*n .S )i <' tr%nh &' cch t*o .t th hin
ca No/eKaA tQ .NET Framework\
using System;
using System.Collections;
5H- L-C A
:"4" T0"8&
:"4" T0"8&
?MT .9 ([N: (= 'NQT
?MT .9 ([N: (= 'NQT
677
Phu luc A: :iri `hinu o` kj cing ce 'NQT
public class MyClass
{
public static void Main()
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName= "notepad.exe";
proc.Start();
proc.WaitForExit();
}
}
0nh --1 Snippet Compiler
n%nh zZ cho th' o*n .S n' trong *n"KKe/ ComK"Der. l thO nghi. o*n .S n'8 &*n chJ
vic nhn nGt PDay gh%nh ta. gic ;anhh8 v nF s@ ch*' C chI g rDi. lo*n .S n' s@ sinh
ra .t cOa ss popzup g:ng )ng Con8oDeh8 v No/eKaA s@ ;ut hin. whi &*n Fng No/eKaA8
:ng )ng Con8oDe c?ng s@ Fng.
678
Phu luc A: :iri `hinu o` kj cing ce 'NQT
*n"KKe/ ComK"Der $c viIt &Ci be?? 'ey v cF th $c )onloa) t*i
8htt94::ZZZ><@#mD?>co;:=otnDt:Sn#99DtCo;9#@D?H.
A>I Y}C =~n2 A#% thc chnh %C m|# RD2%@Bto? A>I Y}C =~n2 A#% thc chnh %C m|# RD2%@Bto?
=eguDa/or l .t c4ng c vi N' t2nh nvng )eng ;<' )=ng v ki. tra cc &iu th:c
ch2nh 9u'. Liu th:c ch2nh 9u' $c sO )ng inh nghqa cc .3u trong nhKng chu#i )=a
tr>n kB t=8 tNn sD ;ut hin8 v th: t= kB t=. PhGng thng $c sO )ng nhiu nht l.
phMng tin ;c nh6n t2nh t2nh h$p l ca Nu vo )o ngi )eng cung cp ho!c t%. .t
chu#i kB t= &>n trong .t chu#i ln hMnEch~ng h*n8 khi t%. kiI. .t ia chJ Q=L ha' (z
.ail tr>n .t trang (&.
=eguDa/or cho phXp &*n nh6p .t &iu th:c ch2nh 9u' v .t Nu vo no F g&*n s@ ch*'
&iu th:c ch2nh 9u' )=a tr>n Nu vo n'h. L5ng cch n'8 &*n cF th th' cch th:c l. vic
ca &iu th:c ch2nh 9u' v kIt 9u tr v trc khi hin th=c nF trong :ng )ng ca .%nh.
n%nh z] cho th' =eguDa/or vi .t &iu th:c ch2nh 9u' Mn gin.
0nh --2 egulator vi mt biu thc chnh quy dn gin
RhNn )ocu.(nt ch:a &iu th:c ch2nh 9u'8 trong v2 ) n' l [0-9]8 &iu th:c n' treng khp
vi &t k )S' chK sD no. np C ph2a )i phi ch:a Nu vo cho &iu th:c ch2nh 9u'8 v
hp C ph2a )i tri hin thi nhKng treng khp . &iu th:c ch2nh 9u' t%. th' &>n trong cc
Nu vo. uiIt v ki. tra cc &iu th:c ch2nh 9u' trong .t :ng )ng c l6p nh thI n' th%
)r hMn nhiu so vi thao tc chGng trong :ng )ng ca &*n.
"t trong nhKng t2nh nvng ha' nht ca =eguDa/or l kh nvng t%. kiI. th vin &iu th:c
ch2nh 9u' tr=c tu'In t*i 8htt94::?D2D[@#A>co;H. u2 )8 nIu nh6p chu#i Khone vo hp t%.
679
Phu luc A: :iri `hinu o` kj cing ce 'NQT
kiI.8 &*n s@ t%. th' hMn ]d &iu th:c ch2nh 9u' khc nhau treng khp vi cc sD in tho*i8
&ao gt. cc &iu th:c cho nh8 c8 v nhiu sD in tho*i khc.
=eguDa/or $c viIt &Ci =oy F8heroBe v cF th $c )onloa) t*i
8htt94::?D2D[>o<hD?omD>co;H.
A>L S#nh ;z m|# Co=DS;#th A>L S#nh ;z m|# Co=DS;#th
CoAe*m"/h l .t c4ng c sinh .S )=aztr>nzt(.plat( gkhu4n .3uh8 sO )ng .t cG php
tMng t= nh >*P.NET kIt sinh &t k kiu .S ha' t(;t no. whc vi nhiu c4ng c sinh
.S khc8 CoAe*m"/h kh4ng '>u cNu &*n .4 t .t &n thiIt kI ha' kiIn trGc :ng )ng c th.
whi sO )ng CoAe*m"/h8 &*n cF th kIt sinh .0i th:8 tQ .t t6p h$p Mn gin8 $czinhz
kiuz.*nh In ton & .t :ng )ng.
whi ;<' )=ng .t :ng )ng8 &*n thng phi l!p i l!p l*i nhKng tc v no F8 ch~ng h*n
viIt .S tru' ;ut )K liu ha' ;<' )=ng cc t6p h$p te' &iIn. CoAe*m"/h !c &it hKu 2ch trong
nhKng t%nh huDng nh v6'8 v% &*n cF th viIt cc t(.plat( t= ng hFa cc tc v n'8 iu
n' kh4ng chJ ci thin hiu nvng . ckn giGp &*n &t nh. chn.
CoAe*m"/h cF sn .t sD t(.plat(8 &ao gt. nhKng t(.plat( cho tt c cc kiu t6p h$p .NET
c?ng nh nhKng t(.plat( sinh th tc ttn trK8 nhng s:c .*nh th=c s= ca c4ng c n'
ch2nh l kh nvng t*o cc t(.plat( te' &iIn.
7(.plat( ca CoAe*m"/h chJ l fil( vvn &n Mn thuNn gcF th $c t*o &5ng c4ng c so*n
tho vvn &n &t kh8 vi phNn .C rng l .)8/.
7(.plat( $c gii thiu )i <' s@ nh6n .t chu#i v rti ;<' )=ng .t lp )=a vo chu#i
F. Lc Nu ti>n l viIt phNn h(a)(r8 phNn n' khai &o ng4n ngK ca t(.plat(8 ng4n ngK
2ch8 v .4 t v/n t/t v t(.plat(\
@ CodeTemplate Language="C#"
TargetLanguage="C#"
Description="Car Template"
RhNn kI tiIp ca t(.plat( l cc khai &o thuc t2nh8 cc thuc t2nh n' s@ $c chJ inh .#i
khi t(.plat( ch*'. u2 ) )i <' khai &o .t thuc t2nh chu#i\
@ Property Name="ClassName" Type="String" Category="Context"
Description="Class Name"
whai &o n' s@ l. cho thuc t2nh ClassName ;ut hin trong cOa ss thuc t2nh ca
CoAe*m"/h nF cF th $c chJ inh khi t(.plat( ch*'.
Lc tiIp th(o l ;<' )=ng phNn th<n ca t(.plat( gvi .S lnh tMng t= nh >*P.NETh. Hh
&*n cF th th'8 t(.plat( n' nh6n chu#i nh6p v sinh ra .t lp vi t>n F. 7rong phNn th<n
ca t(.plat(8 cc thj Fng v .C $c sO )ng nh trong >*P.NET. 7rong t(.plat( n'8 ta
chJ ch1n gi tri thuc t2nh8 nhng c?ng cF th sO )ng &t k kiu .S .NET no &>n trong cc
thj n'.
public sealed class = ClassName
{
private static volatile = ClassName _instance;
private = ClassName () {}
680
Phu luc A: :iri `hinu o` kj cing ce 'NQT
private static readonly object _syncRoot = new object();
public static = ClassName Value
{
get
{
if (_instance == null)
{
lock(_syncRoot)
{
if (_instance == null)
{
_instance = new = ClassName ();
}
}
}
return _instance;
}
}
}
"t khi t(.plat( S hon tt8 &*n hS' n*p nF vo CoAe*m"/h g;(. h%nh z^h. L*n cF th
nh6n th' thuc t2nh ph2a &>n tri l thuc t2nh . chGng ta S khai &o trong t(.plat(.
HIu &*n nh6p +*"ngDe/onCDa88- l. t>n lp v nh/p nGt 6enera/e8 CoAe*m"/h s@ sinh ra lp
)i <'\
public sealed class SingletonClass
{
private static volatile SingletonClass _instance;
private SingletonClass() {}
private static readonly object _syncRoot = new object();
public static SingletonClass Value
{
get
{
if (_instance == null)
{
681
Phu luc A: :iri `hinu o` kj cing ce 'NQT
lock(_syncRoot)
{
if (_instance == null)
{
_instance = new SingletonClass();
}
}
}
return _instance;
}
}
}
0nh --3 Nap template vo CodeSmith
CoAe*m"/h tMng Di )r sO )ng v cF th sinh ra nhKng kIt 9u tu't vi nIu $c p )ng
.t cch Gng /n. "t trong nhKng phNn phs &iIn nht cNn $c sinh .S l tNng tru' ;ut
)K liu. CoAe*m"/h cF .t ass(.&l' !c &it vi t>n l *)hemaE2KDorer8 ass(.&l' n' cF th
$c sO )ng sinh ra cc t(.plat( tQ &ng8 th tc ttn trK8 ha' hNu nh &t k Di t$ng
*L *erBer no khc.
CoAe*m"/h $c viIt &Ci Er") b. *m"/h v cF th $c )onloa) g&n )eng thOh t*i
8htt94::ZZZ>D?#cd<;#th>nDt:co=D<;#th:=oZn@oB=>B<9[H.
A>R V#t !#; th x1n mv m|# NUn#t A>R V#t !#; th x1n mv m|# NUn#t
NQn"/ l & khung ki. thO Mn vi $c ;<' )=ng cho .NET Framework8 cho phXp &*n viIt
cc phMng th:c ki. thO th(o ng4n ngK )o &*n ch0n ki. tra .t h. c th ca chMng
682
Phu luc A: :iri `hinu o` kj cing ce 'NQT
tr%nh. ng )ng NQn"/ cung cp .t & khung viIt cc ki. thO Mn vi8 c?ng nh .t
giao )in t h0a ch*' cc ki. thO Mn vi v ;(. kIt 9u.
u2 )8 chGng ta cNn ki. tra ch:c nvng ca lp Hashtable trong .NET Framework ;c inh
hai Di t$ng cF th $c th>. vo v l' ra ha' kh4ng. Lc Nu ti>n l tha. chiIu In
ass(.&l' NQn"/.Framework cF th tru' ;ut cc thuc t2nh v phMng th:c ca & khung
NQn"/. Lc kI tiIp l t*o .t lp v nh )u nF vi !c t2nh [TestFixture] NQn"/ &iIt
lp n' cF ch:a phMng th:c ki. thO.
using System;
using System.Collections;
using NUnit.Framework;
namespace NUnitExample
{
[TestFixture]
public class HashtableTest {
public HashtableTest() {

}
}
}
wI tiIp8 chGng ta t*o .t phMng th:c v nh )u nF vi !c t2nh [Test] NQn"/ &iIt <'
l phMng th:c ki. thO. 7rong phMng th:c n'8 chGng ta s@ thiIt l6p .t Hashtable v a
vo F hai gi tri8 sau F sO )ng phMng th:c Assert.AreEqual ;(. chGng ta cF th thu
l' Gng cc gi tri . chGng ta S a vo Hashtable ha' kh4ng\
[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!");
}
l ch*' phMng th:c ki. thO n'8 &*n cNn t*o .t )= n NQn"/8 .C ass(.&l' S $c sinh
ra &>n tr>n v nh/p nGt =un. n%nh z_ cho th' kIt 9u.
683
Phu luc A: :iri `hinu o` kj cing ce 'NQT
7r>n <' chJ l .t ki. thO Mn gin8 nhng cho th' kh nvng ca NQn"/. PF rt nhiu kiu
ki. thO8 c?ng nh nhiu phMng th:c Assert8 cF th $c sO )ng ki. thO .0i phNn
trong .S lnh ca &*n.
"t ki. thO Mn vi cF th lu v ch*' l*i .#i khi &*n sOa si .S lnh8 iu n' giGp &*n
pht hin l#i )r )ng hMn v . &o pht trin :ng )ng tDt hMn.
NQn"/ l .t )= n .S ngutn .C v cF th $c )onloa) t*i 8htt94::ZZZ>n%n#t>o?2H.
0nh --4 NUnit
P?ng cF .t &n a))zin ca NQn"/ cho V"8uaD */uA"o .NET8 a))zin n' cho phXp &*n tr=c tiIp
ch*' cc phMng th:c ki. thO Mn vi tQ V"8uaD */uA"o .NET gcF th $c )onloa) t*i
8htt94::<o%?cDfo?2D>nDt:9?odDct<:n%n#tB==#nHh.
l cF th>. th4ng tin v NQn"/ v vi tr2 ca nF trong vic pht trin t(stz)riv(n gv6n hnh th(o
ki. thOh8 &*n hS' ;(. &i viIt +Te8/IEr"Ben C#N <mKroBe /he Ee8"gn anA FDe2"4"D"/y o? Vour
ProJe)/ w"/h E2/reme Programm"ng Te)hn"Mue8- trong qa PU 2nh k1..
A>X n#; <owt ;z @$nh m|# ^[Co9 A>X n#; <owt ;z @$nh m|# ^[Co9
.NET Framework rt .*nh8 cF nghqa kh nvng t*o ra nhKng :ng )ng tu't vi l rt cao8
nhng kh nvng t*o ra nhKng chMng tr%nh tti c?ng l rt cao. F2CoK l .t trong nhKng
c4ng c cF th $c sO )ng tr$ giGp t*o ra nhKng :ng )ng tDt hMn &5ng vic cho phXp
&*n kho st .t ass(.&l' v ki. tra t2nh tMng th2ch ca nF vi .t sD 9u' lu6t. F2CoK
ch:a t6p cc 9u' lu6t )o &")ro8o?/ t*o ra8 nhng &*n c?ng cF th t*o ra nhKng 9u' lu6t cho
.%nh. Ph~ng h*n8 nIu .uDn tt c cc lp u cF .t phMng th:c khCi )=ng .!c inh
kh4ng Di sD8 &*n cF th viIt .t 9u' lu6t ki. tra phMng th:c khCi )=ng tr>n .#i lp ca
ass(.&l'. l cF th>. th4ng tin v vic t*o nhKng 9u' lu6t te' &iIn8 &*n hS' vo
8htt94::;<=n>;#c?o<oft>co;:;<=n;B2:#<<%D<:fR:f\:A%2<@BCD?H.
u2 )8 chGng ta hS' ;(. F2CoK pht hin ra l#i g% trong ass(.&l' NQn"/E2amKDe gS $c
tr%nh &' .c ._h. 7rc ti>n8 &*n cNn t*o .t )= n F2CoK v a ass(.&l' n' vo. |au
684
Phu luc A: :iri `hinu o` kj cing ce 'NQT
F8 &*n hS' nhn >naDyOe8 F2CoK s@ kho st ass(.&l' n' v a ra cc th4ng &o l#i g;(.
h%nh z`h.
F2CoK nh6n th' .t sD vn vi ass(.&l' n'. L*n cF th nh/p Gp l>n .t l#i ;(.
chi tiIt8 &ao gt. li .4 t 9u' lu6t v nMi . &*n cF th t%. th' nhiu th4ng tin hMn.
F2CoK cF th giGp &*n t*o .S lnh tDt hMn8 nht 9un hMn8 nhng nF kh4ng th sOa chKa vic
thiIt kI tti ha' l6p tr%nh kX.. F2CoK c?ng kh4ng phi l .t s= tha' thI cho vic ki. tra .S
lnh g)oAe reB"ewh8 nhng v% nF cF th &/t nhiu l#i trc khi ki. tra .S lnh n>n &*n cF th
)nh nhiu thi gian cho cc vn h tr0ng hMn l phi lo l/ng v cc 9u' c !t t>n.
0nh --5 xCop da ra cc thng bo khi kho st NUnitExample
F2CoK $c pht trin &Ci &")ro8o?/ v cF th $c )onloa) t*i
8htt94::ZZZ>2ot=otnDt>co;:tDB;:f[co9H.
A>\ nho <wt B<<D;A@C m|# >N`T RDf@Dcto? A>\ nho <wt B<<D;A@C m|# >N`T RDf@Dcto?
.NET =e?De)/or l .t tr%nh )u't lp g)Da88 4row8erh v tr%nh )ich ng$c gAe)omK"Derh8 nF cF
th kho st .t ass(.&l' v cho &*n th' tt c cc +&2 .6t- trong F. .NET Framework S
a ra cM chI phn chiIu gre?De)/"onh kho st &t k .S lnh no )=aztr>nz.NET8 cho )e nF
l .t lp Mn ha' ton & .t ass(.&l'. PM chI phn chiIu c?ng cF th $c sO )ng thu
l' th4ng tin v cc lp8 phMng th:c8 v thuc t2nh khc nhau trong .t ass(.&l' no F. |O
685
Phu luc A: :iri `hinu o` kj cing ce 'NQT
)ng .NET =e?De)/or8 &*n cF th )u't cc lp v cc phMng th:c ca .t ass(.&l'8 &*n cF
th kho st ng4n ngK trung gian g&")ro8o?/ <n/ermeA"a/e Language &*<Lh )o cc lp v
phMng th:c n' sinh ra8 v &*n cF th )ich ng$c cc lp v phMng th:c sang C# ha'
V"8uaD $a8") .NET.
u2 )8 chGng ta s@ sO )ng .NET =e?De)/or kho st ass(.&l' NQn"/E2amKDe gS $c tr%nh
&' C .c ._h. n%nh za th hin ass(.&l' n' khi $c n*p vo .NET =e?De)/or. L>n trong
.NET =e?De)/or ckn cF nhKng c4ng c . &*n cF th sO )ng kho st th>. ass(.&l' n'.
l ;(. &*<L ca .t phMng th:c8 &*n hS' nh/p vo phMng th:c n' v ch0n
E"8a88em4Der.
Hgoi vic ;(. &*<L8 &*n c?ng cF th ;(. phMng th:c C )*ng C# &5ng cch ch0n
Ee)omK"Der tQ tr%nh Mn TooD8. L*n c?ng cF th ;(. phMng th:c n' $c )ich ng$c sang
V"8uaD $a8") .NET ha' EeDKh" &5ng cch tha' si te' ch0n trong tr%nh Mn Language8. Ui
<' l o*n .S )o .NET =e?De)/or sinh ra\
public void HashtableAddTest()
{
Hashtable hashtable1 = new Hashtable();
hashtable1.Add("Key1", "Value1");
hashtable1.Add("Key2", "Value2");
Assert.AreEqual("Value1", hashtable1["Key1"],
"Wrong object returned!");
Assert.AreEqual("Value2", hashtable1["Key2"],
"Wrong object returned!");
}
686
Phu luc A: :iri `hinu o` kj cing ce 'NQT
0nh --6 Kho st NUnitExample vi .NET eflector
lo*n .S tr>n rt giDng vi o*n .S . chGng ta S viIt\
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!");
}
"!c )e cF .t vi khc &it nhV v .S lnh nhng chGng giDng ht nhau v ch:c nvng.
P4ng )ng ha' nht ca .NET =e?De)/or l kho st cc ass(.&l' v phMng th:c ca .NET
Framework. .NET Framework cung cp nhiu cch khc nhau th=c hin cc thao tc tMng
t= nhau. u2 )8 nIu &*n cNn 0c .t t6p )K liu tQ :&L8 cF nhiu cch khc nhau th=c
hin iu n'\ sO )ng XmlDocument8 XPathNavigator8 ha' XmlReader. L5ng cch sO )ng
.NET =e?De)/or8 &*n cF th ;(. &")ro8o?/ S sO )ng g% khi viIt phMng th:c ReadXml ca
DataSet8 ho!c h0 S l. g% khi 0c )K liu tQ fil( cu h%nh. .NET =e?De)/or c?ng rt cF 2ch khi
t%. hiu cch t*o cc Di t$ng nh HttpHandlersT v 9ua F8 &*n &iIt $c cch th:c .
nhF. pht trin ca &")ro8o?/ S ;<' )=ng cc Di t$ng F trong Framework.
.NET =e?De)/or $c viIt &Ci Lu/O =oeAer v cF th $c )onloa) t*i
8htt94::ZZZ>B#<to>co;:?oD=D?:=otnDtH.
A>_ L9 t# @#$% ;z @$nh m|# N,oc A>_ L9 t# @#$% ;z @$nh m|# N,oc
uic l6p ti liu .S lnh gNn nh l .t c4ng vic kh4ng .' h:ng thG. A <' kh4ng nFi v
ti liu thiIt kI . l ti liu cho tQng phMng th:c v thuc t2nh ca lp. P4ng c NEo) s@ s@
t= ng sinh ti liu cho .S lnh ca &*n &5ng cch sO )ng cM chI phn chiIu kho st
ass(.&l' v sO )ng fil( :&L $c sinh tQ cc chG th2ch :&L C# gcc chG th2ch :&L chJ cF
hiu l=c cho C#8 nhng cF .t V"8uaD */uA"o .NET Power Toy vi t>n l V$Commen/er c?ng
s@ th=c hin giDng nh v6' Di vi V"8uaD $a8") .NETh.
ui NEo)8 &*n v3n c: l6p ti liu cho .S lnh8 nhng l6p khi viIt .S gtrong cc chG th2ch
:&Lh. Lc Nu ti>n khi sO )ng NEo) l .C ch:c nvng sinh chG th2ch :&L Di vi
ass(.&l' ca &*n. Hh/p phi vo )= n v ch0n ProKer/"e8 P Con?"gura/"on ProKer/"e8 P $u"DA8
rti nh6p .t ng )3n lu fil( :&L trong te' ch0n :&L Eo)umen/a/"on F"De g;(. h%nh
z[h. whi )= n $c t*o )=ng8 .t fil( :&L s@ $c sinh ra vi tt c cc chG th2ch :&L i
k1..
687
Phu luc A: :iri `hinu o` kj cing ce 'NQT
0nh --7 Chn dng dn d lu ti liu XML
Ui <' l phMng th:c C .c ._\
/// summary
/// This test adds a number of values to the Hashtable collection
/// and then retrieves those values and checks if they match.
/// /summary
[Test]
public void HashtableAddTest()
{
// Phn thn phng thc o dy.
}
RhNn chG th2ch :&L cho phMng th:c n' s@ $c tr2ch ;ut v lu thnh fil( :&L nh sau\
xml version="1.0"
doc
assembly
nameNUnitExample/name
/assembly
members
member name="M:NUnitExample.HashtableTest.HashtableAddTest"
summaryThis test adds a number of values to the Hashtable
collection and then retrieves those values and checks if
they match.
688
Phu luc A: :iri `hinu o` kj cing ce 'NQT
/summary
/member
/members
/doc
Lc kI tiIp l n*p ass(.&l' v fil( :&L vo NEo). |au F8 nh/p nGt $u"DA Eo)umen/a/"on
ch*' 9u tr%nh sinh ti liu g;(. h%nh zbh. n%nh zc l ti liu C;& )o NEo) sinh ra.
0nh --8 Noc
689
Phu luc A: :iri `hinu o` kj cing ce 'NQT
0nh --9 Ti liu CHM do Noc sinh ra
NEo) l .t )= n .S ngutn .C v cF th $c )onloa) t*i
8htt94::n=oc><o%?cDfo?2D>nDtH.
A>a Tyo =~n2 2## 9hw9 m|# NAnt A>a Tyo =~n2 2## 9hw9 m|# NAnt
N>n/ l .t c4ng c t*o )=ng )=aztr>nz.NET8 giGp &*n viIt .t 9u' tr%nh t*o )=ng )= n cho
.%nh. whi cF nhiu nh pht trin ceng l. vic tr>n .t )= n8 &*n kh4ng th phF thc vic
t*o )=ng cho tQng ngi. L*n c?ng kh4ng .uDn phi thng ;u'>n t*o )=ng )= n .t cch
th c4ng. 7ha' vo F8 &*n viIt .t 9u' tr%nh t*o )=ng t= ng ch*' .#i >.. N>n/ cho phXp
&*n t*o )=ng gii php8 chXp fil(8 ch*' cc ki. tra NQn"/8 gOi (z.ail8 v nhiu nKa. lng
tiIc8 N>n/ thiIu giao )in t h0a8 nhng nF cF .t :ng )ng Con8oDe v cc fil( :&L chJ
inh cc tc v no s@ $c hon thnh trong 9u tr%nh t*o )=ng. yu B r5ng &*$u"DA8 .t
nn t*o )=ng .i trong trong phi>n &n V"8uaD */uA"o 200W8 c?ng cF t2nh nvng tMng t= nh
N>n/.
u2 )8 chGng ta cNn viIt fil( t*o )=ng N>n/ cho )= n NQn"/E2amKDe C .c ._. 7rc ti>n8
&*n hS' t*o .t fil( :&L vi phNn .C rng l .4u"DA8 v !t nF trong th .c gDc ca )= n\
xml version="1.0"
project name="NUnit Example" default="build" basedir="."
descriptionThe NUnit Example Project/description
property name="debug" value="true"/
target name="build" description="compiles the source code"
csc target="library" output=".bindebugNUnitExample.dll"
debug="{debug}"
references
includes name="C:Program FilesNUnit 2.2bin
NUnit.Framework.dll" /
/references
sources
includes name="NUnitExample.cs"/
690
Phu luc A: :iri `hinu o` kj cing ce 'NQT
/sources
/csc
/target
/project
7hj project $c sO )ng !t t>n cho )= n8 targ(t .!c inh8 v th .c cM sC. 7hj n'
cNn cF nhKng thj con sau\
7hj description $c sO )ng !t .t .4 t ng/n g0n v )= n.
7hj property $c sO )ng lu trK .t thiIt l6p sao cho nF cF th $c tru' ;ut tQ
&t c: <u trong fil( t*o )=ng. u2 ) n' t*o .t thuc t2nh vi t>n l debug8 v thiIt
l6p nF l true ha' false te' vo &*n cF .uDn )= n $c &i>n )ich C cu h%nh g rDi
ha' kh4ng gthuc t2nh n' kh4ng nh hCng g% In cch th:c t*o )=ng )= nT nF chJ l
.t &iIn sD . &*n cF th thiIt l6p v s@ $c thu v khi &*n th6t s= ;c inh cch th:c
t*o )=ng )= nh.
wI tiIp l thj target. "t )= n cF th cF nhiu targ(t gcF th $c chJ inh khi N>n/
ch*'h. HIu kh4ng cF targ(t no $c chJ inh8 targ(t .!c inh s@ $c sO )ng gta S
thiIt l6p nF trong thj projecth. 7rong v2 ) n'8 targ(t .!c inh l build. L>n trong thj
target8 &*n cNn thiIt l6p t>n ca targ(t v .4 t nhKng g% . targ(t n' s@ th=c hin.
7hj csc $c sO )ng chJ inh nhKng g% s@ $c tru'n cho tr%nh &i>n )ich C#.
7rc ti>n8 &*n phi thiIt l6p targ(t cho thj csc. Uo cNn t*o fil( .ADD n>n v2 ) n' thiIt
l6p targ(t l library. wI tiIp8 &*n phi thiIt l6p output cho thj csc8 <' l nMi . fil(
.ADD s@ $c t*o. PuDi ceng8 &*n cNn thiIt l6p thuc t2nh debug8 cho &iIt )= n cF $c
&i>n )ich C chI g rDi ha' kh4ng. u% S t*o .t thuc t2nh trc F lu trK gi tri
n'8 ta cF th sO )ng chu#i {debug} tru' ;ut gi tri ca thuc t2nh.
7hj csc c?ng cNn cF cc thj con\ thj references cho &iIt nhKng ass(.&l' no cNn
$c tha. chiIuT v thj sources cho &iIt nhKng fil( no i k1.. u2 ) n' tha. chiIu
In ass(.&l' NQn"/.Framework.ADD v ch:a fil( NQn"/E2amKDe.)8.
l t*o )=ng8 &*n cNn In th .c gDc ca )= n v th=c thi N>n/.e2e C F g;(. h%nh zZdh.
HIu t*o )=ng thnh c4ng8 &*n cF th t%. th' fil( cc .ADD v .KA4 trong th .c 4"n ca )=
n.
691
Phu luc A: :iri `hinu o` kj cing ce 'NQT
0nh --10 Thuc thi Nant.exe tai th muc gc ca du n
7u' kh4ng )r )ng nh vic nh/p $u"DA trong V"8uaD */uA"o8 nhng N>n/ l .t c4ng c rt
.*nh khi ;<' )=ng 9u' tr%nh t*o )=ng ch*' t= ng th(o lich &iu. N>n/ c?ng cF cc t2nh
nvng hKu 2ch nh ch*' cc ki. thO Mn vi ha' chXp cc fil( i k1. gcc t2nh nvng n' kh4ng
$c 9u' tr%nh t*o )=ng ca V"8uaD */uA"o 200C h# tr$h.
N>n/ l .t )= n .S ngutn .C v cF th $c )onloa) t*i
8htt94::<o%?cDfo?2D>nDt:9?odDct<:nBntH.
A>c Ch%Cn x# 9h#un An AS5>N`T m|# AS5>N`T VD?<#on SZ#tchD? A>c Ch%Cn x# 9h#un An AS5>N`T m|# AS5>N`T VD?<#on SZ#tchD?
whi th lB .t '>u cNu8 <<* ;(. phNn .C rng ca fil( $c '>u cNuT v rti )=a vo cc nh
;* phNn .C rng ge2/en8"on maKK"ngh cho th .c o ha' (&sit(8 nF ' nhi. '>u cNu cho
.t phNn .C rng <*>P< ho!c t= th lB nF. l<' l cch >*P.NET l. vicT cc nh ;* phNn
.C rng $c vng kB cho tt c cc phNn .C rng >*P.NET v hng chGng In
a8Kne/c"8aK".ADD.
whi &*n ci !t >*P.NET 1.18 nh ;* phNn .C rng $c n<ng cp sang phi>n &n .i ca
a8Kne/c"8aK".ADD. liu n' g<' ra l#i khi .t :ng )ng S $c t*o )=ng tr>n >*P.NET 1.0 l*i
ch*' tr>n phi>n &n 1.1. l gii 9u'It vn n'8 &*n cF th chu'n tt c cc nh ;* phNn
.C rng trC v phi>n &n 1.0 ca a8Kne/c"8aK".ADD8 nhng vi Zb nh ;* phNn .C rng th% 9u
l vt v nIu l. th c4ng. l<' ch2nh l nMi >*P.NET Ver8"on *w"/)her trC n>n hKu )ng.
7in 2ch nhV n' cF th $c sO )ng chu'n phi>n &n .NET Framework ca &t k :ng
)ng >*P.NET no.
|O )ng c4ng c n' rt Mn gin\ &*n hS' ch0n .t :ng )ng v rti ch0n phi>n &n .NET
Framework . &*n .uDn :ng )ng n' sO )ng g;(. h%nh zZZh. |au F8 c4ng c n' s@ sO
)ng tin 2ch )kng lnh a8Kne/creg""8.e2e chu'n :ng )ng v phi>n &n .NET Framework
S $c ch0n. P4ng c n' cng hKu 2ch khi cF th>. cc phi>n &n >*P.NET v .NET
Framework .i trong tMng lai.
692
Phu luc A: :iri `hinu o` kj cing ce 'NQT
0nh --11 ASP.NET Version Switcher
>*P.NET Ver8"on *w"/)her $c viIt &Ci Een"8 $auer v cF th $c )onloa) t*i
8htt94::ZZZ>=Dn#<AB%D?>co;:N`TToo@<:AS5N`TVD?<#onSZ#tchD?>B<9[H.
A>3f Ch%Cn x# 9h#un An =~ wn m|# V#<%B@ St%=#o >N`T 5?odDct ConmD?tD? A>3f Ch%Cn x# 9h#un An =~ wn m|# V#<%B@ St%=#o >N`T 5?odDct ConmD?tD?
V"8uaD */uA"o .NET ProJe)/ ConBer/er g;(. h%nh zZ]h $c sO )ng chu'n si phi>n
&n ca .t fil( )= n V"8uaD */uA"o. "!c )e chJ cF .t 2t khc &it giKa phi>n &n 1.0 v 1.1
ca .NET Framework8 nhng .t khi fil( )= n S $c chu'n tQ V"8uaD */uA"o .NET 2002
sang V"8uaD */uA"o .NET 200C th% kh4ng th chu'n ng$c l*i. l4i khi vic chu'n ng$c l*i
cNn thiIt. P4ng c n' cF th chu'n &t k fil( gii php ha' )= n no tQ V"8uaD */uA"o L.1
gV"8uaD */uA"o .NET 200Ch v V"8uaD */uA"o L.0 gV"8uaD */uA"o .NET 2002h8 v ng$c l*i.
0nh --12 Visual Studio .NET Proect Converter
693
Phu luc A: :iri `hinu o` kj cing ce 'NQT
V"8uaD */uA"o .NET ProJe)/ ConBer/er $c viIt &Ci Ea)r"8 *o?/ware v cF th $c
)onloa) t*i 8htt94::ZZZ>co=D9?odDct>co;:;Bc?o:m<conmD?t>B<9H.
A>33 Ch%Cn ;z n2%n VV>N`T <Bn2 C m|# VV>N`T to C ConmD?tD? A>33 Ch%Cn ;z n2%n VV>N`T <Bn2 C m|# VV>N`T to C ConmD?tD?
V$.NET /o C# ConBer/er $c sO )ng chu'n ton & .t )= n V$.NET sang )= n C#.
PhMng tr%nh n' cF th chu'n $c .t sD i. . cc chMng tr%nh khc kh4ng th=c hin
$cT ch~ng h*n nh cc lnh ReDim8 cc &iIn )eng chung cc &8 cM chI th lB s= kin8 cc
lnh Case ph:c t*p8 cc li g0i >P<

0nh --13 VB.NET to C Converter
e
V$.NET /o C# ConBer/er l tr%nh chu'n si .S ngutn sang .S ngutn. |au khi chu'n si8
.S lnh ca &*n v3n giK l*i t2nh )r 0c vDn cF g&ao gt. cc t>n &iIn v cc chG th2chh. 72nh
tin c6' ca chMng tr%nh c?ng rt cao8 ch2nh ;c tr>n cc trong hNu hIt cc lNn thO nghi..
V$.NET /o C# ConBer/er $c pht trin &Ci V$ConBer8"on8 v cF th $c
)onloa) g&n )eng thOh t*i 8htt94::ZZZ>mAconmD?<#on<>co;H.
A>3I Ch%Cn ;z n2%n C <Bn2 VV>N`T m|# ConmD?t C to VV>N`T A>3I Ch%Cn ;z n2%n C <Bn2 VV>N`T m|# ConmD?t C to VV>N`T
Hg$c vi V$.NET /o C# ConBer/er8 ConBer/ C# /o V$.NET $c sO )ng chu'n .S
ngutn C# sang V$.NET.
694
Phu luc A: :iri `hinu o` kj cing ce 'NQT
0nh --14 Convert C to VB.NET
ConBer/ C# /o V$.NET $c viIt &Ci 'amaD Pa/eD v cF th $c )onloa) t*i
8htt94::ZZZ>!B;B@9BtD@>nDtH.
A>3L Y}C =~n2 ZDA<#tD %n t?v c1 < = @#$% m|# AS5>N`T /B!D? 3>3 A>3L Y}C =~n2 ZDA<#tD %n t?v c1 < = @#$% m|# AS5>N`T /B!D? 3>3
>*P.NET &aker l .t & sinh .S rt .*nh nhng l*i rt )r sO )ng8 giGp &*n nhanh chFng
t*o cc trang 9un tri >*P.NET gng4n ngK C# ha' V$.NETh tQ .t ngutn )K liu gcc cM sC
)K liu $c h# tr$\ &")ro8o?/ >))e888 &")ro8o?/ *L *erBer8 Fra)De8 &t k cM sC )K liu no
vi kIt nDi >EF ha' FE$Ch. >*P.NET &aker $c trang &i rt nhiu t2nh nvng hKu 2ch nh
khung nh%n )rillz)on8 cM chI &o .6t cao cp8 t2ch h$p vi C** v V"8uaD */uA"o .NET
pi sO &*n cNn ;<' )=ng .t (&sit( )eng cho 9un tri cM sC )K liu Ku48 gtrong *L
*erBerh. Ui <' l cc &c cM &n\
7rc ti>n8 vo thj Ea/a4a8e8 nh )u ch0n Conne)/"on */r"ng v nh6p chu#i
+ProB"Aerq*LFLEE$r<n"/"aD Ca/aDogqKu48rEa/a *our)eq12L.0.0.1r Q8er
695
Phu luc A: :iri `hinu o` kj cing ce 'NQT
<Eq8arPa88worAq8a- gkh4ng cF )u ngo!c kXph8 rti nh/p nGt Conne)/. Uanh sch cc
&ng v khung nh%n s@ $c n*p v hin thi ph2a tri g;(. h%nh zZ`h. whi F8 &*n cF
th te' chJnh .#i trng trong cc &ng v khung nh%n sao cho phe h$p.
0nh --15 Nap c s d liu pubs vo ASP.NET Maker
wI tiIp8 vo thj >*P.NET8 rti vo thj .NET *Ke)"?") FK/"on88 ch0n phi>n &n .NET
Framework v ng4n ngK gV$.NET ha' C#h.
0nh --16 Th ASP.NET .NET Specific Options
696
Phu luc A: :iri `hinu o` kj cing ce 'NQT
wI tiIp8 vo thj *e)ur"/y8 nh )u ch0n >Am"n"8/ra/or Log"n8 nh6p Log"n Name v
Pa88worA. l<' l ti khon 9un tri gs@ $c viIt .S c:ngh.
0nh --17 Th Security
PuDi ceng8 vo thj 6enera/e v nh/p nGt 6enera/e. |au khi ;<' )=ng thnh c4ng8 &*n
hS' vo htt94::@ocB@ho<t:9%A< ;(. kIt 9u.
0nh --18 Th Generate
>*P.NET &aker $c pht trin &Ci e.@orDA v cF th $c )onloa) g&n )eng
thOh t*i 8htt94::ZZZ>h!m<to?D>co;H.
697
5H- L-C V4 THUhT N*K ANH G VI(T
&solut( aAJ.................................................................................................. 7u't Di
&stract aAJ................................................................................................ 7rQu t$ng
cc(ss B........................................................................................................ 7ru' ;ut
cc(ss .o)ifi(r............................................................. 7Q khFa tha' si tN. tru' ;ut
cc(ssi&ilit'..................................................................................... wh nvng tru' ;ut
ccount........................................................................................................... 7i khon
Py cc(ss Pontrol yist............................................ Uanh sch iu khin tru' ;ut
).inistrator........................................................................................... Hgi 9un tri
ggr(gat( function..................................................................................... n. t6p h0p
lgorith......................................................................................................... pii thu6t
R pplication Rrogra..ing nt(rfac(........................ piao )in l6p tr%nh :ng )ng
pplication...................................................................................................... ng )ng
pplication )o.ain................................................................................ "in :ng )ng
rgu.(nt.............................................................................................................. lDi sD
rith.(tic............................................................................................................ |D h0c
rra'...................................................................................................................... "ng
ss(.&l'...................................................................................................... pFi kIt h$p
s'..(tric aAJ........................................................................................ Lt Di ;:ng
s'nchronous aAJ..................................................................................... Lt tng &
ttri&ut(............................................................................................................. l!c t2nh
uth(ntication.............................................................................................. |= ;c th=c
uthorioation........................................................................................... |= ph<n 9u'n
vaila&ilit'.............................................................................................. 72nh kh )ng
Linar'............................................................................................................... Hhi ph<n
Llock....................................................................................................................... whDi
Loun)........................................................................................................................ P6n
Loun)ar'................................................................................... lng &i>n , Wanh gii
Lr(akpoint..................................................................................................... li. )Qng
5H- L-C V
T0&UT N:D T0&UT N:D
-N0 6"8T
-N0 6"8T
698
Phu luc B: Thux` ngl -nh - 6in`
Lros(r......................................................................................................... 7r%nh )u't
Luff(r.................................................................................................................. L .
Luiltzin aAJ......................................................................................................... Hi t*i
Pach(...................................................................................who ch:a gtru' ;ut nhanhh
Paching.................................................................................................... PM chI lu giK
P| Po)( cc(ss |(curit'................................................ Lo .6t tru' ;ut .S lnh
P(rtificat(....................................................................................................... Ph:ng chJ
Phann(l................................................................................................................... w>nh
Pharact(r................................................................................................................ wB t=
Plass.......................................................................................................................... yp
Pli(nt............................................................................................................ 7r%nh khch
Plon( B........................................................................................................... |ao chXp
Plon(a&l( aAJ.......................................................................................... wh sao chXp
PyW Po..on yanguag( Wunti.(.................................. L th=c thi ng4n ngK chung
Po)(................................................................................................................... "S lnh
Poll(ction........................................................................................................... 76p h$p
Polu.n...................................................................................................................... Pt
Po..an)................................................................................................................ ynh
Po..unication............................................................................................ |= giao tiIp
Po.para&l( aAJ......................................................................................... wh so snh
Po.par( B........................................................................................................ |o snh
Po.pati&ilit'........................................................................................ 72nh tMng th2ch
Po.pil( B...................................................................................................... Li>n )ich
Po.pil(r................................................................................................. 7r%nh &i>n )ich
Po.pon(nt................................................................................................... 7hnh phNn
Po.pon(nt tra'.................................................................................... wha' thnh phNn
Ponfiguration.................................................................................................... Pu h%nh
Ponn(ction.......................................................................................................... wIt nDi
Ponstant.................................................................................................................. n5ng
Ponstructor................................................................................ RhMng th:c khCi )=ng
Pont(;t............................................................................................................. HgK cnh
Pont(;tzs(nsitiv( h(lp............................................................... 7r$ giGp c.zngKzcnh
Pontrol............................................................................................................ liu ki.
Ponv(rt B.................................................................................................... Phu'n si
Ponv(rti&l( aAJ.................................................................................... wh chu'n si
Pr'ptograph'...................................................................................................... "6t .S
Pultur(....................................................................................................... "in vvn hFa
Pusto. aAJ..................................................................................................... 7e' &iIn
Uata..................................................................................................................... UK liu
Uata &in)ing.................................................................................... w thu6t kIt )K liu
Uata&as(..................................................................................................... PM sC )K liu
U(zco.pil( B.............................................................................................. Uich ng$c
699
Phu luc B: Thux` ngl -nh - 6in`
U(zs(rialio( B...................................................................................... pii tuNn t= hFa
U(cr'pt B.................................................................................................. pii .6t hFa
U(cr'ption.............................................................................................. |= gii .6t hFa
U(&ug B.............................................................................................................. p rDi
U(&ugg(r...................................................................................................... 7r%nh g rDi
U(fault.............................................................................................................. "!c inh
U(l(gat(................................................................................................... ' nhi. h.
U(plo' B....................................................................................................... 7rin khai
U(structor............................................................................................ RhMng th:c h'
U(vic(................................................................................................................. 7hiIt &i
U(riv( B.......................................................................................................... U3n ;ut
Uictionar'........................................................................................................... 7Q in
Uigital signatur(.............................................................................................. PhK kB sD
Uir(ctiv(............................................................................................................... PhJ thi
Uir(ctor'........................................................................................................... 7h .c
Uisposa&l( aAJ................................................................................................. wh h'
Uispos( B................................................................................................................ n'
Uistri&ut() aAJ.................................................................................... PF t2nh ph<n tn
Uocu.(nt............................................................................................................ 7i liu
Uo.ain................................................................................................................... "in
)it B........................................................................................................... niu chJnh
)itor...................................................................................................... 7r%nh so*n tho
ncapsulation............................................................................................... |= Fng gFi
nco)( B........................................................................................................... "S hFa
nco)ing..................................................................................................... RhXp .S hFa
ncr'pt B......................................................................................................... "6t hFa
ncr'ption..................................................................................................... |= .6t hFa
ntr'............................................................................................................. whon .c
nu.(ration.................................................................................................. wiu lit k>
nviron.(nt.................................................................................................. "4i trng
rror........................................................................................................................... y#i
v(nt................................................................................................................... |= kin
v(nt han)(r........................................................................ RhMng th:c th lB s= kin
v(nt log................................................................................................ Hh6t kB s= kin
vi)(nc(.......................................................................................................... Ph:ng c:
;c(ption.............................................................................................................. Lit l
;c(ption han)(r................................................................... RhMng th:c th lB &it l
;piration................................................................................................ |= hIt hiu l=c
;port B................................................................................................................. {ut
;pr(ssion....................................................................................................... Liu th:c
(atur(............................................................................................................ 72nh nvng
i(l).................................................................................................................... 7rng
il(....................................................................................................................... 76p tin
ilt(r...................................................................................................................... L l0c
lag............................................................................................................................. P
700
Phu luc B: Thux` ngl -nh - 6in`
l(;i&ilit'..................................................................................................72nh linh ho*t
or.................................................................................................................. Liu .3u
or.at............................................................................................................ linh )*ng
7R il( 7ransf(r Rrotocol.......................................................... piao th:c tru'n fil(
unction................................................................................................................... n.
unctionalit'.................................................................................................. Ph:c nvng
pP plo&al ss(.&l' Pach(..................................... who ch:a gFi kIt h$p ton cc
pP par&ag( Poll(ctor..........................................................................L thu go. rc
p(n(ralioation................................................................................... 72nh tsng 9ut hFa
plo&al aAJ...................................................................................................... 7on cc
plo&alioation..........................................................................................|= ton cNu hFa
praphics............................................................................................................... lt h0a
proup..................................................................................................................... HhF.
p praphical s(r nt(rfac(........................................ piao )in ngi )eng t h0a
pU plo&all' ni9u( )(ntifi(r................................... linh )anh )u' nht ton cc
nan)l( B............................................................................................................. 7h lB
nan)l(............................................................................................................. "c 9un
nash B.................................................................................................................... Lv.
nash co)(........................................................................................................... "S &v.
nashta&l(......................................................................................................... Lng &v.
n(lp................................................................................................................... 7r$ giGp
n7"y n'p(r7(;t "arkup yanguag(...................... Hg4n ngK nh )u si>u vvn &n
n'p(rlink.................................................................................................... |i>u ki>n kIt
U nt(grat() U(v(lop.(nt nviron.(nt.................."4i trng pht trin t2ch h$p
)(ntifi(r.............................................................................................................. Uin tQ
.p(rson B...................................................................................................... pi nh6n
.p(rsonation............................................................................................... |= gi nh6n
.pl(.(nt B.................................................................................................. nin th=c
.pl(.(ntation......................................................................................... Ln hin th=c
.port B................................................................................................................ Hh6p
n)(;.................................................................................................................. PhJ .c
n)(;(r.......................................................................................................... L chJ .c
nh(ritanc(...................................................................................................... |= thQa kI
nitialio( B....................................................................................................... whCi t*o
nput........................................................................................... lNu vo , UK liu nh6p
ns(rt B.................................................................................................................. Ph1n
nstall B.............................................................................................................. Pi !t
nstanc(............................................................................................................. 7h hin
nt(gration..................................................................................................... |= t2ch h$p
nt(rfac(........................................................................................................... piao )in
nt(rop(ra&ilit'.................................................................................... wh nvng li>n tc
R nt(rn(t Rrotocol......................................................................... piao th:c nt(rn(t
701
Phu luc B: Thux` ngl -nh - 6in`
t(.................................................................................................................. "c ch0n
7 ustzinzti.(....................................................................... 7:c thi , uQa Gng lGc
w('......................................................................................................................... whFa
w('or)............................................................................................................. 7Q khFa
yanguag(......................................................................................................... Hg4n ngK
y(ngth.............................................................................................................. Phiu )i
yi&rar'.............................................................................................................. 7h vin
yif(ti.(................................................................................................... 7hi gian sDng
yink.................................................................................................................... yi>n kIt
yist.................................................................................................................. Uanh sch
yit(ral............................................................................................................... 7r=c kin
yoa) B.................................................................................................................... H*p
yocal aAJ........................................................................................................... Pc &
yocal(.................................................................................................................. Ln ia
yocalioation............................................................................................. |= &n ia hFa
yock......................................................................................................................... PhDt
yogic........................................................................................... "S thi hnh ch:c nvng
yoop.................................................................................................................. ukng l!p
"anag() aAJ........................................................................................... l$c 9un lB
"anag(.(nt................................................................................................... |= 9un lB
"apping....................................................................................................... RhXp nh ;*
"(.&(r......................................................................................................... 7hnh vi>n
"(.&(rship...................................................................................... 7 cch thnh vi>n
"(.or'............................................................................................................... L nh
"(nu............................................................................................................... 7r%nh Mn
"(ssag(........................................................................................................ 7h4ng ip
"(tacharact(r.................................................................................................. |i>u kB t=
"(ta)ata....................................................................................................... |i>u )K liu
"(tho)........................................................................................................ RhMng th:c
"o)(l................................................................................................................. "4 h%nh
"o)ul(............................................................................................................... lMn th
"|y "icrosoft nt(r.()iat( yanguag(..................................... Hg4n ngK trung gian
"ultilingual aAJ....................................................................................... la ng4n ngK
"ultithr(a)ing.............................................................................. y6p tr%nh a tiu tr%nh
Hativ( aAJ................................................................................................. Hgu'>n sinh
Ha.(spac(.............................................................................................. wh4ng gian t>n
H(tork................................................................................................................. "*ng
Ho)(.......................................................................................................................... HGt
&(ct.............................................................................................................. lDi t$ng
&(ctzori(nt() progra..ing............................................... y6p tr%nh hng Di t$ng
p(rating s'st(........................................................................................ n iu hnh
p(rator.............................................................................................................. 7on tO
utput.................................................................................................. lNu ra , wIt ;ut
v(rloa).................................................................................................. Ln n*p chtng
v(rri)( B........................................................................................................ PhXp 1
702
Phu luc B: Thux` ngl -nh - 6in`
Rara.(t(r.......................................................................................................... 7h4ng sD
Rassor).......................................................................................................... "6t khxu
Rath................................................................................................................ lng )3n
Ratt(rn.............................................................................................................. wiu .3u
R(rfor.anc(.................................................................................................... niu nvng
R(r.ission............................................................................................................ Yu'n
Ri;(l................................................................................................................. li. nh
Rlatfor..................................................................................................................... Hn
Roint(r................................................................................................................. Pon trV
Rolic'............................................................................................................. Ph2nh sch
Rol'.orphis.(........................................................................................... 72nh a h%nh
Rool................................................................................................................ who )= trK
Rooling...................................................................................................... PM chI )= trK
RR^ Rost ffic( Rrotocol ^..................................................... piao th:c nh6n .ail ^
Rort......................................................................................................................... Psng
Rostfi;................................................................................................................... n6u tD
Rr(fi;.................................................................................................................... 7in tD
Rrivat( aAJ........................................................................................................... Wi>ng
Rrivil(g(......................................................................................................... l!c 9u'n
Rroc()ur(............................................................................................................ 7h tc
Rroc(ss............................................................................................................. 7iIn tr%nh
Rroc(ssor........................................................................................................... L ;O lB
Rro(ct.................................................................................................................... U= n
Rrop(rt'.......................................................................................................... 7huc t2nh
Rrot(ct() aAJ.............................................................................................l$c &o v
Rrotocol........................................................................................................... piao th:c
Ru&lic aAJ..................................................................................................... P4ng khai
Yu(r'................................................................................................................ 7ru' vn
Yu(u(............................................................................................................... nng $i
Wan)o.......................................................................................................... Hg3u nhi>n
WL| Wol(zLas() |(curit'..................................................... Lo .6t )=aztr>nzvaiztrk
W(cor)................................................................................................. Ln ghi , "xu tin
W(cursion........................................................................................................ |= 9u'
W(f(r(nc(...................................................................................................... 7ha. chiIu
W(fl(ction.......................................................................................... PM chI phn chiIu
W(gist(r B........................................................................................................ lvng kB
W(gular (;pr(ssion.......................................................................... Liu th:c ch2nh 9u'
W(lationship................................................................................................ "Di 9uan h
W(lativ( aAJ................................................................................................. 7Mng Di
W(.ota&l( aAJ................................................................................ wh tru' ;ut tQ ;a
W(sourc(........................................................................................................ 7i ngu'>n
W(usa&ilit'..................................................................................... wh nvng ti sO )ng
703
Phu luc B: Thux` ngl -nh - 6in`
Wol(...................................................................................................................... uai trk
Woutin(....................................................................................................... 7hng tr%nh
Wo............................................................................................................. nng , Ukng
Wunti.(......................................................................................................... L th=c thi
|ch(.a................................................................................................. y$c t , whu4n
|cript................................................................................................................. wich &n
|(curit'......................................................................................................... |= &o .6t
|(rialio( B.................................................................................................. 7uNn t= hFa
|(rialioa&l( aAJ.................................................................................... wh tuNn t= hFa
|(rialioation............................................................................................. |= tuNn t= hFa
|(rv(r............................................................................................................... 7r%nh ch
|(rvic(................................................................................................................ Uich v
|(ssion..................................................................................................... Rhi>n l. vic
|(tting............................................................................................................... 7hiIt l6p
|har() aAJ......................................................................... l$c chia sj , Ueng chung
|ignatur(.............................................................................................................. PhK kB
|"7R |i.pl( "ail 7ransf(r Rrotocol........................ piao th:c tru'n .ail Mn gin
|R |i.pl( &(ct cc(ss Rrotocol........... piao th:c tru' ;ut Di t$ng Mn gin
|olution............................................................................................................ pii php
|p(cialioation....................................................................................... 72nh chu'>n hFa
|Yy |tructur() Yu(r' yanguag(................................. Hg4n ngK tru' vn cF cu trGc
|tack............................................................................................................ Hgvn chtng
|tat(................................................................................................................ 7r*ng thi
|tat( |tat(l(ss aAJ.......................................................... PF tr*ng thi Rhi tr*ng thi
|tat(.(nt......................................................................................... P<u lnh , whai &o
|tatic aAJ............................................................................................................... 7qnh
|tor() proc()ur(..................................................................................... 7h tc ttn trK
|tr(a............................................................................................................. Ukng ch'
|tring..................................................................................................................... Phu#i
|trong na.(.................................................................................................... 7>n .*nh
|trong t'p(..................................................................................................... wiu .*nh
|trongl'zna.() aAJ...................................................................... l$c inh t>n .*nh
|trongl'zt'p() aAJ..................................................................... l$c inh kiu .*nh
|tructur(............................................................................................................ Pu trGc
|'..(tric aAJ............................................................................................... lDi ;:ng
|'nchronioation...................................................................................... |= tng & hFa
|'nchronous aAJ............................................................................................. ltng &
|'st(............................................................................................................... n thDng
|'st(. tra'.............................................................................................. wha' h thDng
7a&l(....................................................................................................................... Lng
7ag............................................................................................................................ 7hj
7ask...................................................................................................................... 7c v
7(.plat(....................................................................................................... whu4n .3u
7hr(a)................................................................... 7iu tr%nh , "*ch tr%nh , 7u'In o*n
7hr(a)zsaf(..................................................................................... n ton v tiu tr%nh
704
Phu luc B: Thux` ngl -nh - 6in`
7hro B................................................................................................................. HX.
7i.(sta.p................................................................................................ 7(. thi gian
7ool.................................................................................................................... P4ng c
7ool&o;....................................................................................................... np c4ng c
7ransaction............................................................................................. Rhi>n giao )ich
7'p(......................................................................................................................... wiu
7'p(zsaf(................................................................................... n ton v kiu )K liu
n.anag() aAJ............................................................................ wh4ng $c 9un lB
p)at(............................................................................................................... P6p nh6t
W nifor. W(sourc( )(ntifi(r...................... L nh6n )*ng ti ngu'>n tng )*ng
Wy nifor. W(sourc( yocator............................. L inh vi ti ngu'>n tng )*ng
s(r.............................................................................................................. Hgi )eng
tilit'................................................................................................................. 7in 2ch
uali)ation.................................................................................. |= ;c nh6n t2nh h$p l
ualu(..................................................................................................................... pi tri
uaria&l(................................................................................................................... LiIn
u(rsion............................................................................................................ Rhi>n &n
uirtual aAJ................................................................................................................ o
uisi&l( aAJ...................................................................................................... wh kiIn
uisual aAJ..................................................................................................... 7r=c 9uan
il)car)................................................................................................... wB t= *i )in
in)o................................................................................................................ POa ss
ork(r...................................................................................................................... 7h$
rapp(r............................................................................................................... uV &0c
|Uy (& |(rvic(s U(scription yanguag(................ Hg4n ngK .4 t )ich v (&
{"y ;t(nsi&l( "arkup yanguag(............................... Hg4n ngK nh )u .C rng
705
TQI LI(U THA/ nHPJ
TI" "8& T0-? Y0HC TI" "8& T0-? Y0HC
C CC C G G P PHP HP L LAP AP T TNH NH C C
Z Allen ones. C# Programmer's Cooboo. Microsoft Press, 2004.
] ohn Connell. Coding !echni"#es $or %icroso$t &is#a' (asic )*+!. Microsoft Press,
2002.
^ Harvey M. eitel, Paul . eitel, & Tem . Nieto. &is#a' (asic )*+! ,o- to Program.
/econd +dition. Prentice Hall, 2002.
_ ose Moica. C# and &( )*+! Conversion Pocet 0e$erence. Oeilly, 2002.
` ames Avery. !en %#st1,ave !oo's +ver2 3eve'oper /ho#'d 3o-n'oad *o-. MSN
Magazine, 2004.
a Karl Moore. !he 4'timate &()*+! and 5/P)*+! Code (oo. Apress, 2003.
[ Matthew Maconald. %icroso$t &is#a' (asic )*+! Programmer's Cooboo. Microsoft
Press, 2003.
b Mark Schmidt & Simon obinson. %icroso$t &is#a' C# )*+! 6778 3eve'oper's
Cooboo. Sams Publishing, 2003.
c ng Quang Thin. 9:p tr;nh &is#a' C# th< no= Nh xut bn Tng Hop TP. H Ch
Minh, 2005.
Zd Nguyn Ngc Bnh Phng & L Trn Nht Quynh. Cc gi>i php ':p tr;nh &is#a'
(asic )*+!. Nh xut bn Giao thng Vn ti, 2006.
ZZ Thi Thanh Phong & Nguyn Ngc Bnh Phng. / ta2 tra c?# &()*+!. Nh xut
bn Giao thng Vn ti, 2004.
Z] V mt s website nh ---)msdn)microso$t)com. ---)codepro@ect)com.
---)msd6d)com. ---)deve'opersdeA)com. ---)-indo-s$orms)net.
---)gotdotnet)com. ---)codeg#r#)com. ---)deve'oper$#sion)com. v.v...
(/( :"H" P0/P UP T*JN0 (
Nguyn Ngc Bnh Phng Thi Thanh Phong
tng hop & bin djch
Chju trch nhim xut bn
T.' Nguyn Nun Thy
Bin tp
0 Nguyn Th Thanh Thy
Trnh by ba
Nguyn Th Thanh Thy
Ch bn & Sa bn in
Nguyn Ngc Bnh Phng
n 1000 cun, kh 19x27cm, tai XN in S 05. S dng k KHXB 180-230/XB-QLXB do Cuc
Xut Bn cp ngy 03 thng 03 nm 2005. n xong v np lu chiu thng 09 nm 2006.

You might also like