Professional Documents
Culture Documents
Cac Giai Phap Lap Trinh C# Final - PDF
Cac Giai Phap Lap Trinh C# Final - PDF
Nh sch t Vit
a ch: 225 Nguyn Tri Phng, Q.5, TP. H Ch Minh
in thoi: (08) 2 652 039
E-mail: datviet@dvpub.com.vn
3
Website: www.dvpub.com.vn
4
Nguyn Ngc Bnh Phng - Thi
Thanh Phong
tng hp & bin dch
http://www.dvpub.com.vn/dv/details.aspx?itemid=243
5
LI NI U
LI NI U
CU TRC CA SCH
CU TRC CA SCH
QUY C
QUY C
YU CU V H THNG
YU CU V H THNG
CCH S DNG A CD
CCH S DNG A CD
MC LC
MC LC
LI NI U................................................................................................................................ 7
CU TRC CA SCH..............................................................................................................10
QUY C................................................................................................................................... 12
YU CU V H THNG.......................................................................................................... 15
CCH S DNG A CD...........................................................................................................18
MC LC.................................................................................................................................... 20
1
30
31
Chng 1: Pht trin ng dng
C hng ny trnh by mt s kin thc nn tng, cn thit trong qu trnh pht trin mt
ng dng C#. Cc mc trong chng s trnh by chi tit cc vn sau y:
Xy dng cc ng dng Console v Windows Form (mc 1.1 v 1.2).
To v s dng n th m lnh v th vin m lnh (mc 1.3 v 1.4).
Truy xut i s dng lnh t bn trong ng dng (mc 1.5).
S dng cc ch th bin dch ty bin vic bin dch m ngun (mc 1.6).
Truy xut cc phn t chng trnh (c xy dng trong ngn ng khc) c tn xung
t vi cc t kha C# (mc 1.7).
To v xc minh tn mnh cho assembly (mc 1.8, 1.9, 1.10, v 1.11).
K mt assembly bng ch k s Microsoft Authenticode (mc 1.12 v 1.13).
Qun l nhng assembly chia s c lu tr trong Global Assembly Cache (mc
1.14).
Ngn ngi dng dch ngc assembly ca bn (mc 1.15).
Tt c cc cng c c tho lun trong chng ny u c trong Microsoft
.NET Framework hoc .NET Framework SDK.
Cc cng c thuc Framework nm trong th mc chnh ca phin bn
Framework m bn ang s dng (mc nh l \WINDOWS\Microsoft.NET\
Framework\v1.1.4322 nu bn s dng .NET Framework version 1.1). Qu trnh
ci t .NET s t ng thm th mc ny vo ng dn mi trng ca h
thng.
Cc cng c c cung cp cng vi SDK nm trong th mc Bin ca th mc ci
t SDK (mc nh l \Program Files\Microsoft Visual Studio .NET 2003\
SDK\v1.1\Bin). Th mc ny khng c thm vo ng dn mt cch t ng,
v vy bn phi t thm n vo d dng truy xut cc cng c ny.
Hu ht cc cng c trn u h tr hai dng i s dng lnh: ngn v di.
Chng ny lun trnh by dng di v d hiu hn (nhng b li bn phi g
nhiu hn). i vi dng ngn, bn hy tham kho ti liu tng ng trong .NET
Framework SDK.
1. To ng dng Console
Bn mun xy dng mt ng dng khng cn giao din ngi dng ha
(GUI), thay vo hin th kt qu v c d liu nhp t dng lnh.
Hin thc mt phng thc tnh c tn l Main di cc dng sau trong t nht
mt file m ngun:
public static void Main();
Console.Write(msg);
return System.Console.ReadLine();
}
System.Console.WriteLine(msg);
}
Bn c th chy file thc thi trc tip t dng lnh. Khi chy, phng thc Main ca ng dng
ConsoleUtils.exe yu cu bn nhp tn v sau hin th thng ip cho mng nh sau:
Please enter your name : Binh Phuong
Welcome to Microsoft .NET Framework, Binh Phuong
ConsoleUtils.WriteString("Hello, world");
}
}
2. To ng dng da-trn-Windows
Bn cn xy dng mt ng dng cung cp giao din ngi dng ha (GUI)
da-trn-Windows Form.
Hin thc mt phng thc tnh Main trong t nht mt file m ngun. Trong
Main, to mt th hin ca mt lp tha k t lp System.Windows.Forms.Form
(y l form chnh ca ng dng). Truyn i tng ny cho phng thc tnh
Run ca lp System.Windows.Forms.Application. S dng i s /target:winexe
khi bin dch assembly ca bn bng trnh bin dch C# (csc.exe).
Vic xy dng mt ng dng c giao din ngi dng ha Windows n gin hon ton
khc xa vic pht trin mt ng dng da-trn-Windows hon chnh. Tuy nhin, bt k vit
34
Chng 1: Pht trin ng dng
mt ng dng n gin nh Hello World hay vit phin bn k tip cho Microsoft Word, bn
cng phi thc hin nhng vic sau:
To mt lp tha k t lp System.Windows.Forms.Form cho mi form cn cho ng
dng.
Trong mi lp form, khai bo cc thnh vin m t cc iu kim trn form, v d
Button, Label, ListBox, TextBox. Cc thnh vin ny nn c khai bo l private
hoc t nht cng l protected cc phn t khc ca chng trnh khng truy xut
trc tip chng c. Nu mun cho php truy xut cc iu kim ny, hin thc cc
thnh vin cn thit trong lp form cung cp vic truy xut gin tip (kim sot
c) n cc iu kim nm trong.
Trong lp form, khai bo cc phng thc th l cc s kin do cc iu kim trn
form sinh ra, chng hn vic nhp vo Button, vic nhn phm khi mt TextBox ang
tch cc. Cc phng thc ny nn c khai bo l private hoc protected v tun
theo mu s kin .NET chun (s c m t trong mc 16.10). Trong cc phng thc
ny (hoc trong cc phng thc c gi bi cc cc phng thc ny), bn s nh
ngha cc chc nng ca ng dng.
Khai bo mt phng thc khi dng cho lp form to cc iu kim trn form v
cu hnh trng thi ban u ca chng (kch thc, mu, ni dung). Phng thc
khi dng ny cng nn lin kt cc phng thc th l s kin ca lp vi cc s kin
tng ng ca mi iu kim.
Khai bo phng thc tnh Mainthng l mt phng thc ca lp tng ng vi
form chnh ca ng dng. Phng thc ny l im bt u ca ng dng v c cc
dng nh c cp mc 1.1. Trong phng thc Main, to mt th hin ca
form chnh v truyn n cho phng thc tnh Application.Run. Phng thc Run hin
th form chnh v khi chy mt vng lp thng ip chun trong tiu trnh hin hnh,
chuyn cc tc ng t ngi dng (nhn phm, nhp chut) thnh cc s kin gi
n ng dng.
Lp WelcomeForm trong v d di y minh ha cc k thut trn. Khi chy, n yu cu ngi
dng nhp vo tn ri hin th mt MessageBox cho mng.
using System.Windows.Forms;
Application.Run(new WelcomeForm());
}
// Ghi ra Console.
System.Console.WriteLine("User entered: " + textBox1.Text);
3. To v s dng module
Bn cn thc hin cc cng vic sau:
Tng hiu qu thc thi v s dng b nh ca ng dng bng cch bo
m rng b thc thi np cc kiu t c s dng ch khi no cn
thit.
38
Chng 1: Pht trin ng dng
4. To v s dng th vin
Bn cn xy dng mt tp cc chc nng thnh mt th vin n c th c
tham chiu v ti s dng bi nhiu ng dng.
to th vin, s dng i s /target:library khi bin dch assembly ca bn
bng trnh bin dch C# (csc.exe). tham chiu th vin, s dng i s
/reference v ch nh tn ca th vin khi bin dch ng dng.
Trc khi phn phi th vin cho ngi khc s dng, bn nn to tn mnh (strong-name)
khng ai c th chnh sa assembly ca bn. Vic t tn mnh cho th vin cn cho php
ngi khc ci t n vo Global Assembly Cache, gip vic ti s dng d dng hn (xem
mc 1.9 v cch t tn mnh cho th vin ca bn v mc 1.14 v cch ci t mt th vin
c tn mnh vo Global Assembly Cache). Ngoi ra, bn c th nh du th vin ca bn vi
ch k Authenticode ngi dng bit bn l tc gi ca th vin (xem mc 1.12 v cch
nh du th vin vi Authenticode).
bin dch mt assembly c s dng cc kiu c khai bo trong cc th vin khc, bn
phi bo cho trnh bin dch bit cn tham chiu n th vin no bng i s /reference. V
d, bin dch file HelloWorld.cs (trong mc 1.1) trong trng hp lp ConsoleUtils nm
trong th vin ConsoleUtils.dll, s dng lnh:
csc /reference:ConsoleUtils.dll HelloWorld.cs
Bn cn ch ba im sau:
Nu tham chiu nhiu hn mt th vin, bn cn phn cch tn cc th vin bng du
phy hoc chm phy, nhng khng s dng khong trng. V d:
/reference:ConsoleUtils.dll,WindowsUtils.dll
Khi chy, i s args s cha mt chui cho mi gi tr c nhp trn dng lnh v nm sau
tn ng dng. Phng thc Main trong v d di y s duyt qua mi i s dng lnh c
truyn cho n v hin th chng ra ca s Console:
public class CmdLineArgExample {
using System;
Console.WriteLine(platformName);
}
}
Ton t V d M t
Vic thc hin php AND lun l cn s dng phng thc iu kin trung gian, khin cho
m tr nn qu phc tp, kh hiu v kh bo tr. V d di y cn phng thc trung gian
DumpState2 nh ngha c hai k hiu DEBUG v TEST.
[System.Diagnostics.Conditional("DEBUG")]
public static void DumpState() {
DumpState2();
}
[System.Diagnostics.Conditional("TEST")]
public static void DumpState2() {//...}
45
Chng 1: Pht trin ng dng
.NET Framework cho php bn s dng cc thnh phn phn mm (software component)
c pht trin bng cc ngn ng .NET khc bn trong ng dng C# ca bn. Mi ngn ng
u c mt tp t kha (hoc t dnh ring) cho n v c cc hn ch khc nhau i vi cc
tn m lp trnh vin c th gn cho cc phn t chng trnh nh kiu, thnh vin, v bin.
Do , c kh nng mt thnh phn c pht trin trong mt ngn ng khc tnh c s dng
mt t kha ca C# t tn cho mt phn t no . K hiu @ cho php bn s dng mt
t kha ca C# lm nh danh v khc phc vic ng tn. on m sau to mt i tng
kiu operator v thit lp thuc tnh volatile ca n l true (c operator v volatile u l
t kha ca C#):
// To i tng operator.
@operator Operator1 = new @operator();
Public key is
07020000002400005253413200040000010001008bb302ef9180bf717ace00d570dd649821f24ed578
fdccf1bc4017308659c126570204bc4010fdd1907577df1c2292349d9c2de33e49bd991a0a5bc9b69e
5fd95bafad658a57b8236c5bd9a43be022a20a52c2bd8145448332d5f85e9ca641c26a4036165f2f35
3942b643b10db46c82d6d77bbc210d5a7c5aca84d7acb52cc1654759c62aa34988...
Token ca kha cng khai l 8 byte cui ca m bm c tnh ra t kha cng khai. V kha
cng khai qu di nn .NET s dng token cho mc ch hin th, v l mt c ch ngn gn
cho cc assembly khc tham chiu kha cng khai (chng 14 s tho lun tng qut v m
bm).
Nh tn gi ca n, kha cng khai (hoc token ca kha cng khai) khng cn c gi b
mt. Khi bn to tn mnh cho assembly (c tho lun trong mc 1.9), trnh bin dch s s
dng kha ring to mt ch k s (mt m bm -c-mt-ha) ca assembly manifest.
Trnh bin dch nhng ch k s v kha cng khai vo assembly ngi dng c th kim
tra ch k s.
Vic gi b mt kha ring l cn thit v ngi truy xut vo kha ring ca bn c th thay
i assembly v to mt tn mnh mikhin cho khch hng ca bn khng bit m ngun
b sa i. Khng c c ch no loi b cc kha tn mnh b tn hi. Nu kha
ring b tn hi, bn phi to kha mi v phn phi phin bn mi ca assembly (c t
tn mnh bng cc kha mi). Bn cng cn thng bo cho khch hng bit l kha b tn
hi v h nn s dng phin bn notrong trng hp ny, bn b mt c tin bc v uy tn.
C nhiu cch bo v kha ring ca bn; s dng cch no l ty vo cc yu t nh:
Cu trc v tm c ca t chc.
Qu trnh pht trin v phn phi ng dng.
Phn mm v phn cng hin c.
Yu cu ca khch hng.
Thng thng, mt nhm nh cc c nhn ng tin cy (c gi l signing
authority) s c trch nhim m bo an ton cho cc kha tn mnh ca cng ty
v k mi assembly trc khi chng c phn phi. Kh nng tr hon k
assembly (s c tho lun mc 1.11) to iu kin thun li cho vic ng
dng m hnh ny v trnh c vic bn phi phn phi kha ring cho mi
thnh vin ca nhm pht trin.
47
Chng 1: Pht trin ng dng
Cng c Strong Name cn cung cp tnh nng s dng kho cha kha CSP n gin ha
vic bo mt cc kha tn mnh. Mt khi to mt cp kha trong mt file, bn c th ci
t cc kha ny vo kho cha kha CSP v xa file i. V d, lu tr cp kha nm trong
file MyKey.snk vo mt kho cha kha CSP c tn l StrongNameKeys, s dng lnh sn -i
MyKeys.snk StrongNameKeys (mc 1.9 s gii thch cch s dng cc kha tn mnh c lu
tr trong mt kho cha kha CSP).
Mt kha cnh quan trng ca kho cha kha CSP l c cc kho cha kha da-theo ngi-
dng v c cc kho cha kha da-theo-my. C ch bo mt ca Windows bo m ngi
dng ch truy xut c kho cha kha da-theo-ngi-dng ca chnh h. Tuy nhin, bt k
ngi dng no ca my u c th truy xut kho cha kha da-theo-my.
Theo mc nh, cng c Strong Name s dng kho cha kha da-theo-my, ngha l mi
ngi ng nhp vo my v bit tn ca kho cha kha u c th k mt assembly bng cc
kha tn mnh ca bn. cng c Strong Name s dng kho cha kha da-theo-ngi-
dng, s dng lnh sn m n; khi mun tr li kho cha kha da-theo-my, s dng lnh sn
m y. Lnh sn m s cho bit cng c Strong Name hin c cu hnh l s dng kho cha
kha da-theo-ngi-dng hay da-theo-my.
xa cc kha tn mnh t kho StrongNameKeys (cng nh xa c kho ny), s dng lnh
sn d StrongNameKeys.
[assembly:AssemblyKeyName("MyKeys")]
[assembly:AssemblyCulture("")]
[assembly:AssemblyVersion("1.0.0.0")]
Console.WriteLine("Hello, world");
}
}
Ngoi vic to v qun l cc kha tn mnh ( c tho lun trong mc 1.8), cng c
Strong Name cn cho php xc minh cc assembly tn mnh. xc minh assembly tn mnh
HelloWorld.exe khng b sa i, s dng lnh sn -vf HelloWorld.exe. i s -v yu cu
cng c Strong Name xc minh tn mnh ca mt assembly xc nh, i s -f buc thc hin
vic xc minh tn mnh ngay c n b v hiu trc cho mt assembly no . (Bn c
th s dng i s -Vr v hiu vic xc minh tn mnh i vi mt assembly, v d sn -Vr
HelloWorld.exe; mc 1.11 s trnh by l do ti sao cn v hiu vic xc minh tn mnh).
Nu assembly ny c xc minh l khng i, bn s thy kt xut nh sau:
Microsoft (R) .NET Framework Strong Name Utility Version 1.1.4322.573
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
[assembly:AssemblyKeyFile("MyPublicKey.snk")]
[assembly:AssemblyCulture("")]
[assembly:AssemblyVersion("1.0.0.0")]
51
Chng 1: Pht trin ng dng
[assembly:AssemblyDelaySign(true)]
Console.WriteLine("Hello, world");
}
}
cng khai ca SPC vo assembly (bao gm kha cng khai). Khi xc minh mt assembly,
ngi dng s dng kha cng khai gii mt ha m bm -c-mt-ha, tnh ton li
m bm ca assembly, v so snh hai m bm ny bo m chng l nh nhau. Khi hai m
bm ny trng nhau, ngi dng c th chc chn rng bn k assembly, v n khng b
thay i t khi bn k.
V d, k mt assembly c tn l MyAssembly.exe vi mt SPC nm trong file MyCert.spc
v kha ring nm trong file MyPrivateKey.pvk, s dng lnh:
signcode -spc MyCert.spc -v MyPrivateKey.pvk MyAssembly.exe
Hnh 1.5 Cng c File Signing yu cu nhp mt khu khi truy xut file cha kha ring
Bn cng c th truy xut kha v chng ch trong cc kho cha. Bng 1.2 lit k cc i s
thng dng nht ca cng c File Signing. Bn hy tham kho ti liu .NET Framework
SDK xem tt c cc i s.
Bng 1.2 Cc i s thng dng ca cng c File Signing
i s M t
Nu bn nhp Yes, hoc trc chn l lun tin tng SPC, cng c Certificate
Verification xc nhn tnh hp l ca ch k v assembly.
Hnh 1.7 Cng c Certificate Creation nhc nhp mt khu bo v file cha kha ring
Nu bn ghi kha ring vo file, cng c Certificate Creation s nhc bn nhp mt khu
bo v file ny (xem hnh 1.7).
Cng c Certificate Creation h tr nhiu i s, bng 1.3 lit k mt vi i s thng dng.
Xem thm ti liu .NET Framework SDK v cng c Certificate Creation.
Bng 1.3 Cc i s thng dng ca cng c Certificate Creation
i s M t
.NET Framework s dng GAC ch khi thc thi, trnh bin dch C# s khng tm
trong GAC bt k tham chiu ngoi no m assembly ca bn tham chiu n.
Trong qu trnh pht trin, trnh bin dch C# phi truy xut c mt bn sao
cc b ca bt k assembly chia s no c tham chiu n. Bn c th chp
assembly chia s vo th mc m ngun ca bn, hoc s dng i s /lib ca
trnh bin dch C# ch nh th mc m trnh bin dch c th tm thy cc
assembly cn thit trong .
Nu vic xy dng cc gii php da-trn-server l khng ph hp, bn c hai ty chn sau
y:
S dng mt obfuscator khin cho assembly ca bn kh b dch ngc (Visual
Studio .NET 2003 c cha phin bn Community ca mt obfuscator, c tn l
Dotfuscator). Obfuscator s dng nhiu k thut khc nhau khin cho assembly kh b
dch ngc; nguyn l ca cc k thut ny l:
i tn cc trng v cc phng thc private nhm gy kh khn cho vic c v
hiu mc ch ca m lnh.
Chn cc lnh dng iu khin khin cho ngi khc kh c th ln theo logic ca
ng dng.
Chuyn nhng phn ca ng dng m bn mun gi b mt thnh cc i tng COM
hay cc DLL nguyn sinh, sau s dng P/Invoke hoc COM Interop gi chng t
ng dng c-qun-l ca bn (xem chng 15 v cch gi m lnh khng-c-
qun-l).
Khng c cch tip cn no ngn c nhng ngi c k nng v quyt tm dch ngc m
ngun ca bn, nhng chng s lm cho cng vic ny tr nn kh khn ng k v ngn
c hu ht nhng k t m thng thng.
Nguy c mt ng dng b dch ngc khng ch ring cho C# hay .NET. Mt ngi quyt tm
c th dch ngc bt k phn mm no nu anh ta c k nng v thi gian.
58
Chng 1: Pht trin ng dng
59
2
60
61
Chng 2: Thao tc d liu
// Tr v chui c o.
return revStr.ToString();
}
// To file gi cc kt qu.
using (StreamWriter output = new StreamWriter("output.txt")) {
output.Close();
}
}
}
Phng thc tnh GetBytes ca lp BitConverter cung cp nhiu phin bn np chng cho
php chuyn hu ht cc kiu gi tr c bn sang mng kiu byte. Cc kiu c h tr l
bool, char, double, short, int, long, float, ushort, uint, v ulong. Lp BitConverter cng
cung cp cc phng thc tnh cho php chuyn cc mng kiu byte thnh cc kiu gi tr
chun nh ToBoolean, ToUInt32, ToDouble,... V d sau minh ha cch chuyn cc gi tr bool
v int thnh mng kiu byte, v ngc li. i s th hai trong ToBoolean v ToUInt32 cho
bit v tr (tnh t 0) trong mng byte m BitConverter s ly cc byte k t to gi tr
d liu.
byte[] b = null;
// To mt BinaryReader c t stream.
using (BinaryReader reader = new BinaryReader(stream)) {
// c v tr v gi tr decimal t
// BinaryReader/MemoryStream.
return reader.ReadDecimal();
}
}
}
// Tr v chui Unicode.
return Encoding.Unicode.GetString(b);
}
// M ha Base64 vi gi tr decimal.
public static string DecimalToBase64 (decimal src) {
byte[] b = DecimalToByteArray(src);
// Tr v gi tr decimal.
return ByteArrayToDecimal(b);
}
// M ha Base64 vi gi tr int.
public static string IntToBase64 (int src) {
// Tr v gi tr int.
return BitConverter.ToInt32(b,0);
}
70
Chng 2: Thao tc d liu
Khi d liu cn kim tra cng phc tp th c php ca biu thc chnh quy cng cng phc
tp. V d, d dng kim tra d liu nhp ch cha s hay c chiu di ti thiu, nhng kim
tra mt URL kh phc tp. Bng 2.3 lit k mt s biu thc chnh quy dng kim tra cc
kiu d liu thng dng.
Bng 2.3 Mt s biu thc chnh quy thng dng
Kiu d liu nhp M t Biu thc chnh quy
// Kim tra d liu nhp c trng vi biu thc chnh quy hay khng.
return r.IsMatch(input);
}
Bn c th s dng i tng Regex kim tra nhiu chui, nhng khng th thay i biu
thc chnh quy c gn cho n; bn phi to mt i tng Regex mi tng ng vi mt
cu trc mi. Phng thc ValidateInput trn to ra mt i tng Regex mi mi ln c
gi, thay vo bn c th s dng phng thc tnh np chng IsMatch.
public static bool ValidateInput(string regex, string input) {
// Kim tra d liu nhp c trng vi biu thc chnh quy hay khng.
return Regex.IsMatch(input, regex);
}
Ngoi ra, phng thc tnh Regex.CompileToAssembly cho php bn to mt biu thc chnh
quy c bin dch v ghi n vo mt assembly khc. Ngha l bn c th to mt assembly
cha cc biu thc chnh quy s dng cho nhiu ng dng sau ny. bin dch mt biu
thc chnh quy v lu n vo mt assembly, thc hin cc bc sau:
1. To mt mng System.Text.RegularExpressions.RegexCompilationInfo ln
cha cc i tng RegexCompilationInfo, mi i tng ng vi mt biu thc chnh
quy cn c bin dch.
2. To mt i tng RegexCompilationInfo cho mi biu thc chnh quy v truyn i s
cho phng thc khi dng xc nh cc thuc tnh ca biu thc chnh quy ny.
Cc thuc tnh thng dng l:
IsPublic gi tr bool xc nh lp biu thc chnh quy c to ra c tm vc
l cng khai hay khng.
Name mt String xc nh tn ca lp.
Namespace mt String xc nh khng gian tn ca lp.
Pattern mt String xc nh mu m biu thc chnh quy s so trng (xem chi
tit mc 2.5).
Options mt gi tr thuc kiu lit k System.Text.RegularExpressions.
RegexOptions xc nh cc ty chn cho biu thc chnh quy.
74
Chng 2: Thao tc d liu
}
}
7. To ngy v gi t chui
Bn cn to mt th hin System.DateTime m t gi, ngy c ch nh trong
mt chui.
S dng phng thc Parse hoc ParseExact ca lp DateTime.
C nhiu cch m t ngy, gi; v d 1st June 2004, 1/6/2004, 6/1/2004, 1-Jun-2004 cng ch
mt ngy; 16:43 v 4:43 PM cng ch mt gi. Lp DateTime cung cp phng thc tnh
Parse rt linh hot, cho php to th hin DateTime t nhiu cch m t khc nhau trong
chui.
Phng thc Parse rt mnh trong vic to i tng DateTime t mt chui cho trc. N c
th x l mt chui ch cha mt phn thng tin hay cha thng tin sai, v thay th cc gi tr
thiu bng cc gi tr mc nh. Ngy mc nh l ngy hin ti, gi mc nh l 12:00:00
AM. Nu sau mi c gng, Parse khng th to i tng DateTime, n s nm ngoi l
System.FormatException. V d sau minh ha tnh linh hot ca Parse:
// 01/09/2004 12:00:00 AM
DateTime dt1 = DateTime.Parse("Sep 2004");
// 05/09/2004 02:15:33 PM
DateTime dt2 = DateTime.Parse("Sun 5 September 2004 14:15:33");
// 05/09/2004 12:00:00 AM
DateTime dt3 = DateTime.Parse("5,9,04");
// 05/09/2004 02:15:33 PM
DateTime dt4 = DateTime.Parse("5/9/2004 14:15:33");
Phng thc Parse linh hot v c th t sa li. Tuy nhin, mc linh hot ny khng cn
thit trong trng hp bn mun bo m cc chui phi theo mt nh dng nht nh. Khi
, s dng phng thc ParseExact thay cho Parse. Dng n gin nht ca ParseExact
nhn ba i s: chui cha ngy gi, chui nh dng xc nh cu trc m chui cha ngy
gi phi tun theo, v mt tham chiu IFormatProvider cung cp thng tin c th v bn a.
Nu IFormatProvider l null, thng tin v bn a ca tiu trnh (thread) hin hnh s c
s dng.
Nu ngy gi trong chui ang xt khng ng vi nh dng quy nh, ParseExact s nm
ngoi l System.FormatException. Chui nh dng c s dng tng t nh khi bn ch
76
Chng 2: Thao tc d liu
Cng mt TimeSpan vo mt
Cng (+) Cng hai i tng TimeSpan.
DateTime.
Tr mt DateTime cho mt
Tr (-) Tr hai i tng TimeSpan.
DateTime hoc mt TimeSpan.
Cu trc DateTime cng hin thc cc phng thc AddTicks, AddMilliseconds, AddSeconds,
AddMinutes, AddHours, AddDays, AddMonths, v AddYears. Mi phng thc ny cho php bn
cng (hoc tr bng cc gi tr m) phn t thi gian thch hp vi i tng DateTime. Cc
phng thc ny v cc ton t c lit k trong bng 2.4 khng lm thay i DateTime gc
thay vo chng s to mt i tng mi vi gi tr c thay i. on m di y
trnh by cch s dng cc ton t thao tc cc cu trc DateTime v TimeSpan:
// To mt TimeSpan m t 2.5 ngy.
TimeSpan timespan1 = new TimeSpan(2,12,0,0);
// To mt TimeSpan m t 4.5 ngy.
TimeSpan timespan2 = new TimeSpan(4,12,0,0);
// To mt TimeSpan m t 1 tun.
TimeSpan oneWeek = timespan1 + timespan2;
// Sp xp mng.
Array.Sort(array);
// Sp xp ArrayList.
list.Sort();
sp xp cc i tng khng hin thc IComparable, bn cn truyn cho phng thc Sort
mt i tng hin thc giao din System.Collections.IComparer. Hin thc ca IComparer
phi c kh nng so snh cc i tng nm trong mng hoc ArrayList (xem mc 16.3
bit cch hin thc IComparable v IComparer).
Cc phng thc ICollection.CopyTo v ToArray c cng chc nng, chng chp cc phn t
trong mt tp hp vo mt mng. S khc bit nm ch CopyTo chp vo mt mng c,
trong khi ToArray to ra mt mng mi ri chp vo .
CopyTo nhn hai i s: mt mng v mt ch s. Mng ny l ch ca qu trnh sao chp v
phi c kiu tng thch vi cc phn t ca tp hp. Nu kiu khng tng thch hay khng
c s chuyn i ngm t kiu phn t ca tp hp sang kiu phn t ca mng th ngoi l
System.InvalidCastException s b nm. Ch s l mt v tr trong mng m bt u t cc
phn t ca tp hp s c chp vo. Nu ch s ny ln hn hoc bng chiu di ca mng,
hoc s phn t ca tp hp vt qu sc cha ca mng th ngoi l
System.ArgumentException s b nm. on m sau minh ha cch s dng CopyTo chp
ni dung ca mt ArrayList vo mt mng:
// To mt ArrayList mi v thm phn t vo.
ArrayList list = new ArrayList(5);
list.Add("Phuong");
list.Add("Phong");
list.Add("Nam");
list.Add("Tam");
list.Add("Nhan");
Cc lp ArrayList, Stack, v Queue cng hin thc phng thc ToArray, phng thc ny t
ng to mt mng vi kch thc cha cc phn t ca ca tp hp. Nu bn khng
truyn i s cho ToArray, n s tr v mt object[] bt chp kiu ca cc i tng trong
tp hp. Tuy nhin, bn c th truyn mt i tng System.Type ch nh kiu ca mng
(Bn phi p mng kiu mnh v ng kiu). V d sau minh ha cch s dng ToArray cho
ArrayList trn:
80
Chng 2: Thao tc d liu
return this.List.Add(value);
}
this.List.Remove(value);
}
get {
return (AssemblyName)this.List[index];
}
set {
this.List[index] = value;
}
}
return this.List.Contains(value);
}
this.List.Insert(index, value);
}
}
people.Add("Phong");
people.Add("Nam");
System.Console.WriteLine(s);
}
}
}
3
87
88
Chng 3: Min ng dng, c ch phn chiu, v siu d liu
S c mnh v tnh linh hot ca Microsoft .NET Framework c nng cao bi kh nng
kim tra v thao tc cc kiu v siu d liu lc thc thi. Cc mc trong chng ny s
trnh by cc kha cnh thng dng ca min ng dng (application domain), c ch
phn chiu (reflection), v siu d liu (metadata), bao gm:
To v hy cc min ng dng (mc 3.1 v 3.9).
Lm vic vi cc kiu v cc i tng khi s dng nhiu min ng dng (mc 3.2,
3.3, 3.4, v 3.8).
Lm vic vi thng tin Type (mc 3.10 v 3.11).
To ng cc i tng v np ng cc assembly lc thc thi (mc 3.5, 3.6, 3.7, v
3.12).
To v kim tra cc c tnh ty bin (cc mc 3.13 v 3.14).
1. To min ng dng
Bn cn to mt min ng dng mi.
S dng phng thc tnh CreateDomain ca lp System.AppDomain.
Dng thc n gin nht ca phng thc CreateDomain nhn mt i s kiu string ch nh
tn thn thin cho min ng dng mi. Cc dng thc khc cho php bn ch nh chng c
(evidence) v cc thit lp cu hnh cho min ng dng mi. Chng c c ch nh bng i
tng System.Security.Policy.Evidence; mc 13.11 trnh by cc tc ng ca chng c khi
bn to mt min ng dng. Cc thit lp cu hnh c ch nh bng i tng
System.AppDomainSetup.
Lp AppDomainSetup cha cc thng tin cu hnh cho mt min ng dng. Bng 3.1 kit k
cc thuc tnh thng c s dng nht ca lp AppDomainSetup khi to cc min ng dng.
Cc thuc tnh ny c th c truy xut sau khi to thng qua cc thnh vin ca i tng
AppDomain, v mt s c th thay i lc thc thi; bn hy tham kho ti liu .NET
Framework SDK v lp AppDomain hiu chi tit hn.
Bng 3.1 Cc thuc tnh thng dng ca lp AppDomainSetup
Thuc tnh M t
H thng .NET Remoting (s c tho lun trong chng 12) gip vic gi cc i tng qua
li cc min ng dng tr nn d dng. Tuy nhin, nu bn cha quen vi .NET Remoting, kt
qu c th rt khc so vi mong i. Thc ra, vn gy kh khn khi dng nhiu min ng
dng l s tng tc vi .NET Remoting v cch thc lun chuyn i tng qua cc min
ng dng.
Tt c cc kiu d liu c th chia thnh ba loi: nonremotable, marshal-by-value (MBV), v
marshal-by-reference (MBR). Kiu nonremotable khng th vt qua bin min ng dng v
khng th dng lm cc i s hay cc gi tr tr v ca cc li gi trong mi trng lin min
ng dng. Kiu nonremotable s c tho lun trong mc 3.4.
Kiu MBV l kiu kh-tun-t-ha. Khi mt i tng kiu MBV c chuyn qua mt min
ng dng khc nh l i s hay gi tr tr v, h thng .NET Remoting s tun t ha trng
thi hin ti ca i tng, chuyn d liu sang min ng dng ch, v to mt bn sao
ca i tng vi cng trng thi nh i tng gc. Kt qu l tn ti bn sao ca i tng
c hai min ng dng. Hai i tng ny ban u ging nhau hon ton, nhng c lp
nhau, nn vic thay i i tng ny khng nh hng n i tng kia. Di y l v d
mt kiu kh-tun-t-ha c tn l Employee, c chuyn qua mt min ng dng khc bng
tr (xem mc 16.1 bit cch to kiu kh-tun-t-ha).
[System.Serializable]
public class Employee {
// ng gi DataSet.
System.Runtime.Remoting.ObjectHandle objHandle =
new System.Runtime.Remoting.ObjectHandle(data1);
Khi phng thc Load c gi, b thc thi thc hin qu trnh nh v v np assembly. Di
y s tm tt qu trnh ny; bn tham kho ti liu .NET Framework SDK bit thm chi
tit.
1. Nu bn ch nh assembly tn mnh, phng thc Load s p dng version policy
(chnh sch phin bn) v publisher policy (chnh sch nh pht hnh) cho phep kha
nng chuyn tip (redirect) n mt phin ban assembly khc. Version policy c
ch nh trong file cu hnh my tnh hay ng dng ca bn bng phn t
<bindingRedirect>. Publisher policy c ch nh trong cc assembly c bit c
ci t bn trong GAC (Global Assembly Cache).
2. Mt khi xc nh ng phin bn ca assembly cn s dng, b thc thi s c gng
np cc assembly tn mnh t GAC.
3. Nu assembly khng c tn mnh hoc khng c tm thy trong GAC, b thc thi s
tm phn t <codeBase> trong cc file cu hnh my tnh v ng dng. Phn t
<codeBase> nh x tn ca assembly thnh mt file hay mt URL. Nu assembly c tn
mnh, <codeBase> c th ch n bt k v tr no k c cc URL da-trn-Internet; nu
94
Chng 3: Min ng dng, c ch phn chiu, v siu d liu
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName +
" : " + s);
}
}
}
Vic s dng phng thc ExecuteAssembly ( c tho lun trong mc 3.6) khng my
kh khn; nhng khi pht trin cc ng dng phc tp c s dng nhiu min ng dng, chc
chn bn mun kim sot qu trnh np cc assembly, to cc kiu d liu, v triu gi cc
thnh vin ca i tng bn trong min ng dng.
Cc phng thc CreateInstance v CreateInstanceFrom cung cp nhiu phin bn np
chng gip bn kim sot qu trnh to i tng. Cc phin bn n gin nht s dng
phng thc khi dng mc nh ca kiu, nhng c hai phng thc ny u thit t cc
phin bn cho php bn cung cp i s s dng bt k phng thc khi dng no.
Phng thc CreateInstance np mt assembly c tn xc nh vo min ng dng bng qu
trnh c m t cho phng thc Assembly.Load trong mc 3.5. Sau , CreateInstance
to i tng cho kiu v tr v mt tham chiu n i tng mi c ng gi trong
ObjectHandle (c m t trong mc 3.3). Tng t nh th i vi phng thc
CreateInstanceFrom; tuy nhin, CreateInstanceFrom np assembly vo min ng dng bng
qu trnh c m t cho phng thc Assembly.LoadFrom trong mc 3.5.
AppDomain cng cung cp hai phng thc rt tin li c tn l
CreateInstanceAndUnwrap v CreateInstanceFromAndUnwrap, chng s t ng khi
phc tham chiu n i tng c to t i tng ObjectHandle; bn phi
p i tng tr v cho ng kiu trc khi s dng.
Nu bn s dng CreateInstance hay CreateInstanceFrom to i tng kiu MBV trong
mt min ng dng khc, i tng s c to nhng tham chiu tr v s khng ch n i
tng . Do cch thc i tng MBV vt qua bin min ng dng, tham chiu ny s ch
n mt bn sao ca i tng c to t ng trong min ng dng cc b. Ch khi bn to
mt kiu MBR th tham chiu tr v mi ch n i tng trong min ng dng khc (xem
mc 3.2 bit thm chi tit v kiu MBV v MBR).
K thut chung n gin ha vic qun l cc min ng dng l s dng lp iu khin
(controller class). Mt lp iu khin l mt kiu MBR ty bin. Bn hy to mt min ng
dng ri to i tng lp iu khin trong min ng dng ny bng phng thc
CreateInstance. Lp iu khin hin thc cc chc nng cn thit cho ng dng thao tc
min ng dng v cc ni dung ca n. Cc chc nng ny c th bao gm: np assembly, to
thm min ng dng, dn dp trc khi xa min ng dng, hay lit k cc phn t chng
trnh (bn khng th thc hin bn ngoi min ng dng).
V d di y trnh by cch s dng mt lp iu khin c tn l PluginManager. Khi
c to trong mt min ng dng, PluginManager cho php bn to i tng ca cc lp c
hin thc giao din IPlugin, chy v dng cc plug-in , v tr v danh sch cc plug-in hin
c np.
using System;
using System.Reflection;
97
Chng 3: Min ng dng, c ch phn chiu, v siu d liu
using System.Collections;
using System.Collections.Specialized;
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName +
": SimplePlugin stopping...");
}
}
// Np cc plug-in c ch nh.
foreach (string plugin in pluginList.Keys) {
this.LoadPlugin((string)pluginList[plugin], plugin);
}
}
try {
// Np assembly.
Assembly assembly = Assembly.Load(assemblyName);
// To plug-in mi.
IPlugin plugin =
99
Chng 3: Min ng dng, c ch phn chiu, v siu d liu
(IPlugin)assembly.CreateInstance(pluginName, true);
if (plugin != null) {
return true;
} else {
return false;
}
} catch {
return false;
}
}
// Ly mt plug-in t ListDictionary v
// gi phng thc Start.
((IPlugin)plugins[plugin]).Start();
}
100
Chng 3: Min ng dng, c ch phn chiu, v siu d liu
// Ly mt plug-in t ListDictionary v
// gi phng thc Stop.
((IPlugin)plugins[plugin]).Stop();
}
// Np mt plug-in mi vo NewAppDomain1.
manager1.LoadPlugin("CreateInstanceExample", "SimplePlugin");
min ng dng gi phng thc SetData hay GetData truy xut vung m d liu ca min
ng dng khc, th i tng d liu phi h tr ng ngha marshal-by-value hay marshal-by-
reference, nu khng th ngoi l System.Runtime.Serialization.SerializationException
s b nm (xem mc 3.3 bit thm chi tit v cch truyn i tng qua cc min ng
dng). on m sau trnh by cch s dng phng thc SetData v GetData truyn mt
System.Collections.ArrayList gia hai min ng dng.
using System;
using System.Reflection;
using System.Collections;
public ListModifier () {
Tn kiu khng c t trong du nhy kp v phai kha phn giai i vi trnh bin dch. V
tham chiu c phn gii lc bin dch nn assembly cha kiu ny tr thnh phn ph thuc
tnh cua assembly v s c lit k nh th trong assembly manifest ca bn.
Mt cch khc l s dng phng thc tnh Type.GetType, nhn vo mt chui cha tn kiu.
V s dng chui ch nh kiu nn bn c th thay i n lc thc thi, iu ny m ra cnh
ca n vi th gii lp trnh ng bng c ch phn chiu (xem mc 3.12). Nu bn ch nh
tn kiu, b thc thi phi tm kiu ny trong mt assembly c np. Bn cng c th ch
nh mt tn kiu theo tiu chun assembly (tham kho ti liu .NET Framework SDK v
phng thc Type.GetType bit cch kt cu tn kiu theo tiu chun assembly). Cc lnh
sau trnh by cch s dng phng thc GetType:
// C phn bit ch hoa-thng, tr v null nu khng tm thy.
Type t2 = Type.GetType("System.String");
105
Chng 3: Min ng dng, c ch phn chiu, v siu d liu
Bng 3.2 tm tt cc phng thc khc cng cung cp kh nng truy xut i tng Type.
Bng 3.2 Cc phng thc tr v i tng Type
Phng thc M t
Ly i tng Type m t mt kiu lng bn trong i tng
Type.GetNestedType
Type hin c
C# cung cp ton t is thc hin nhanh vic kim tra nh trn. Ngoi ra, is s tr v true
nu i tng cn kim tra dn xut t lp c ch nh. on m di y kim tra xem
someObject l mt th hin ca System.IO.TextReader, hay mt lp dn xut t TextReader
(nh StringReader):
// Kim tra xem someObject l TextReader,
// hay dn xut t TextReader bng ton t is.
if (someObject is System.IO.TextReader) {
// Lm g .
}
Bc u tin trong vic to mt i tng bng c ch phn chiu l thu ly i tng Type
m t kiu ca i tng cn to (xem mc 3.10 bit thm chi tit). Khi c c i tng
Type, hy gi phng thc GetConstructor thu ly i tng ConstructorInfo m t mt
trong cc phng thc khi dng ca kiu ny. Dng thc thng dng nht ca phng thc
GetConstructor l nhn mt mng Type lm i s, v tr v i tng ConstructorInfo m
t phng thc khi dng nhn cc i s c ch nh trong mng Type. thu ly i
tng ConstructorInfo m t phng thc khi dng mc nh (khng c i s), bn hy
truyn cho phng thc GetConstructor mt mng Type rng (s dng trng tnh
Type.EmptyTypes); ng s dng null, nu khng GetConstructor s nm ngoi l
System.ArgumentNullException. Nu GetConstructor khng tm thy phng thc khi dng
no c ch k ph hp vi cc i s c ch nh th n s tr v null.
108
Chng 3: Min ng dng, c ch phn chiu, v siu d liu
Chc nng phn chiu thng c s dng hin thc cc factory. Trong , bn s dng
c ch phn chiu th hin ha cc lp tha k mt lp c s ph bin hay hin thc mt
giao din ph bin. Thng thng, c lp c s chung v giao din chung u c s dng.
Lp c s tru tng s hin thc giao din v bt k chc nng chung no, sau mi hin
thc c th s tha k lp c s.
Khng c c ch no khai bo rng mi lp c th phi hin thc cc phng thc khi
dng vi cc ch k c th. Nu mun ngi khc (hng th ba) hin thc cc lp c th th
bn phi ch r (trong ti liu hng dn) ch k ca phng thc khi dng m factory ca
bn gi. Cch thng thng trnh vn ny l s dng phng thc khi dng mc nh
(khng c i s), sau cu hnh i tng bng phng thc v thuc tnh. V d di y
s hin thc mt factory dng to cc i tng c hin thc giao din IPlugin.
using System;
using System.Reflection;
void Start();
void Stop();
}
return plugin;
}
}
Thng s Kiu M t Mc nh
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly,
AllowMultiple = true, Inherited = false)]
public class AuthorAttribute : System.Attribute {
112
Chng 3: Min ng dng, c ch phn chiu, v siu d liu
[Author("Stephen Chau")]
[Author("Square Nguyen", Company = "Goldsoft Ltd.")]
public class GetCustomAttributesExample {
object[] attrs =
type.GetCustomAttributes(typeof(AuthorAttribute), true);
// Lit k cc c tnh.
foreach (AuthorAttribute a in attrs) {
Console.WriteLine(a.Name + ", " + a.Company);
}
4
116
117
Chng 4: Tiu trnh, tin trnh, v s ng b
// Phng thc khi dng nhn cc thit lp cu hnh cho tiu trnh.
public MessageInfo(int iterations, string message) {
this.iterations = iterations;
119
Chng 4: Tiu trnh, tin trnh, v s ng b
this.message = message;
}
} else {
Console.WriteLine(config.Message);
ThreadPool.QueueUserWorkItem(workMethod, info);
Blockingdng qu trnh thc thi ca tiu trnh hin hnh cho n khi phng thc
thc thi bt ng b kt thc. iu ny rt ging vi s thc thi ng b. Tuy nhin,
nu linh hot chn thi im chnh xc a m lnh ca bn vo trng thi dng
(block) th bn vn cn c hi thc hin thm mt s vic trc khi m lnh i vo
trng thi ny.
Pollinglp i lp li vic kim tra trng thi ca phng thc thc thi bt ng b
xc nh n kt thc hay cha. y l mt k thut rt n gin, nhng nu xet v mt
x ly thi khng c hiu qua. Bn nn trnh cc vng lp cht lm lng ph thi gian
ca b x l; tt nht l nn t tiu trnh thc hin polling vo trng thi ngh (sleep)
trong mt khong thi gian bng cch s dng Thread.Sleep gia cc ln kim tra
trng thi. Bi ky thut polling oi hoi bn phai duy tri mt vong lp nn hot ng cua
tiu trnh ch se bi gii hn, tuy nhin bn co th d dng cp nht tin cng vic.
Waitings dng mt i tng dn xut t lp System.Threading.WaitHandle bo
hiu khi phng thc thc thi bt ng b kt thc. Waiting l mt ci tin ca k thut
polling, n cho php bn ch nhiu phng thc thc thi bt ng b kt thc. Bn
cng c th ch nh cc gi tr time-out cho php tiu trnh thc hin waiting dng li
nu phng thc thc thi bt ng b din ra qu lu, hoc bn mun cp nht nh
k b ch trng thi.
CallbacksCallback l mt phng thc m b thc thi s gi khi phng thc thc
thi bt ng b kt thc. M lnh thc hin li gi khng cn thc hin bt k thao tc
kim tra no, nhng vn c th tip tc thc hin cc cng vic khc. Callback rt linh
hot nhng cng rt phc tp, c bit khi c nhiu phng thc thc thi bt ng b
chy ng thi nhng s dng cng mt callback. Trong nhng trng hp nh th,
bn phi s dng cc i tng trng thi thch hp so trng cc phng thc
hon tt vi cc phng thc khi to.
Lp AsyncExecutionExample trong v d di y m t c ch thc thi bt ng b. N s
dng mt y nhim c tn l AsyncExampleDelegate thc thi bt ng b mt phng thc
c tn l LongRunningMethod. Phng thc LongRunningMethod s dng Thread.Sleep m
phng mt phng thc c thi gian thc thi di.
// y nhim cho php bn thc hin vic thc thi bt ng b
// ca AsyncExecutionExample.LongRunningMethod.
public delegate DateTime AsyncExampleDelegate(int delay, string name);
AsyncExecutionExample cha nm phng thc din t cc cch tip cn khc nhau v vic
kt thc phng thc thc thi bt ng b. Di y s m t v cung cp m lnh cho cc
phng thc .
1. Phng thc BlockingExample
Phng thc BlockingExample thc thi bt ng b phng thc LongRunningMethod v
tip tc thc hin cng vic ca n trong mt khong thi gian. Khi x l xong cng
vic ny, BlockingExample chuyn sang trang thi dng (block) cho n khi phng
thc LongRunningMethod kt thc. vo trng thi dng, BlockingExample thc thi
phng thc EndInvoke ca th hin y nhim AnsyncExampleDelegate. Nu phng
thc LongRunningMethod kt thc, EndInvoke tr v ngay lp tc, nu khng,
BlockingExample chuyn sang trng thi dng cho n khi phng thc
LongRunningMethod kt thc.
public static void BlockingExample() {
Console.WriteLine(Environment.NewLine +
"*** Running Blocking Example ***");
DateTime.Now.ToString("HH:mm:ss.ffff"));
Thread.Sleep(200);
}
Console.WriteLine(Environment.NewLine +
"*** Running Polling Example ***");
Console.WriteLine(Environment.NewLine +
"*** Running Waiting Example ***");
Console.WriteLine(Environment.NewLine +
"*** Running WaitAll Example ***");
// Gi ba ln LongRunningMethod mt cch bt ng b.
// Truyn null cho c y nhim callback v i tng
// trng thi bt ng b. Thm th hin IAsyncResult
// cho mi phng thc vo ArrayList.
AsyncExampleDelegate longRunningMethod =
127
Chng 4: Tiu trnh, tin trnh, v s ng b
new AsyncExampleDelegate(LongRunningMethod);
asyncResults.Add(longRunningMethod.BeginInvoke(3000,
"WaitAll 1", null, null));
asyncResults.Add(longRunningMethod.BeginInvoke(2500,
"WaitAll 2", null, null));
asyncResults.Add(longRunningMethod.BeginInvoke(1500,
"WaitAll 3", null, null));
waitHandles[count] =
((IAsyncResult)asyncResults[count]).AsyncWaitHandle;
}
Console.WriteLine(Environment.NewLine +
"*** Running Callback Example ***");
Console.WriteLine("{0} : {1}",
DateTime.Now.ToString("HH:mm:ss.ffff"), state);
}
int period;
try {
period = Int32.Parse(Console.ReadLine());
} catch {
period = 0;
}
Mc d Timer thng c s dng gi thc thi cc phng thc nhng thi khong,
nhng n cng cung cp cch thc thc thi mt phng thc mt thi im xc nh.
Bn cn phi tnh ton khong thi gian t thi im hin ti n thi im cn thc thi. V d
di y s thc hin iu ny:
public static void RunAt(DateTime execTime) {
Console.WriteLine("{0} : {1}",
DateTime.Now.ToString("HH:mm:ss.ffff"), state);
}
}
WaitOrTimerCallback handler =
new WaitOrTimerCallback(EventHandler);
// Hy b vic ng k qu trnh i.
Console.WriteLine("Unregistering wait operation.");
handle.Unregister(null);
tng linh hot v mc kim sot khi hin thc cc ng dng h-tr-a-tiu-trnh, bn
phi trc tip to v qun l cc tiu trnh. y l cch tip cn phc tp nht trong vic lp
trnh h-tr-a-tiu-trnh, nhng cng l cch duy nht vt qua nhng hn ch c hu
trong cc cch tip cn s dng cc tiu trnh trong thread-pool, nh c tho lun trong
bn mc trc. Lp Thread cung cp mt c ch m qua bn c th to v kim sot cc
tiu trnh. to v chy mt tiu trnh mi, bn hy tin hnh theo cc bc sau:
1. To mt i tng y nhim ThreadStart tham chiu n phng thc cha m lnh
m bn mun dng mt tiu trnh mi chy n. Ging nh cc y nhim khc,
ThreadStart c th tham chiu n mt phng thc tnh hay phng thc ca mt i
tng. Phng thc c tham chiu phi tr v void v khng c i s.
2. To mt i tng Thread, v truyn th hin y nhim ThreadStart cho phng thc
khi dng ca n. Tiu trnh mi c trng thi ban u l Unstarted (mt thnh vin
thuc kiu lit k System.Threading.ThreadState).
3. Gi thc thi phng thc Start ca i tng Thread chuyn trng thi ca n sang
ThreadState.Running v bt u thc thi phng thc c tham chiu bi th hin y
nhim ThreadStart (nu bn gi phng thc Start qu mt ln, n s nm ngoi l
System.Threading.ThreadStateException).
V y nhim ThreadStart khai bo khng c i s, bn khng th truyn d liu trc tip cho
phng thc c tham chiu. truyn d liu cho tiu trnh mi, bn phi cu hnh d liu
l kh truy xut i vi m lnh ang chy trong tiu trnh mi. Cch tip cn thng thng l
to mt lp ng gi c d liu cn cho tiu trnh v phng thc c thc thi bi tiu trnh.
Khi mun chy mt tiu trnh mi, bn hy to mt i tng ca lp ny, cu hnh trng thi
cho n, v ri chy tiu trnh. Di y l mt v d:
using System;
using System.Threading;
this.iterations = iterations;
this.message = message;
this.delay = delay;
}
Console.WriteLine("{0} : {1}",
DateTime.Now.ToString("HH:mm:ss.ffff"), message);
Thread.Sleep(delay);
}
}
137
Chng 4: Tiu trnh, tin trnh, v s ng b
// To mt i tng ThreadExample.
ThreadExample example =
new ThreadExample(5, "A thread example.", 500);
Phng thc M t
using System;
using System.Threading;
while (true) {
try {
// Ngh 2 giy.
Thread.Sleep(2000);
} catch (ThreadInterruptedException) {
// Mc d ThreadAbortException c th l,
// b thc thi s nm n ln na bo m
// tiu trnh kt thc.
}
}
}
do {
switch (command) {
case 'S':
// Tm hon tiu trnh th hai.
Console.WriteLine("{0} : Suspending second thread.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
thread.Suspend();
break;
case 'R':
// Phc hi tiu trnh th hai.
try {
Console.WriteLine("{0} : Resuming second " +
"thread.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
thread.Resume();
141
Chng 4: Tiu trnh, tin trnh, v s ng b
} catch (ThreadStateException) {
Console.WriteLine("{0} : Thread wasn't " +
"suspended.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
}
break;
case 'I':
// Gin on tiu trnh th hai.
Console.WriteLine("{0} : Interrupting second " +
"thread.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
thread.Interrupt();
break;
case 'E':
// Hy b tiu trnh th hai v truyn mt i tng
// trng thi cho tiu trnh ang b hy,
// trong trng hp ny l mt thng bo.
Console.WriteLine("{0} : Aborting second thread.",
DateTime.Now.ToString("HH:mm:ss.ffff"));
thread.Abort("Terminating example.");
Cch d nht kim tra mt tiu trnh kt thc hay cha l kim tra thuc tnh
Thread.IsAlive. Thuc tnh ny tr v true nu tiu trnh c khi chy nhng cha kt
thc hay b hy.
Thng thng, bn s cn mt tiu trnh i mt tiu trnh khc hon tt vic x l ca n.
Thay v kim tra thuc tnh IsAlive trong mt vng lp, bn c th s dng phng thc
Thread.Join. Phng thc ny khin tiu trnh ang gi dng li (block) cho n khi tiu
trnh c tham chiu kt thc. Bn c th ty chn ch nh mt khong thi gian (gi tr int
hay TimeSpan) m sau khong thi gian ny, Join s ht hiu lc v qu trnh thc thi ca tiu
trnh ang gi s phc hi li. Nu bn ch nh mt gi tr time-out, Join tr v true nu tiu
trnh kt thc, v false nu Join ht hiu lc.
V d di y thc thi mt tiu trnh th hai v ri gi Join i tiu trnh th hai kt thc.
V tiu trnh th hai mt 5 giy thc thi, nhng phng thc Join ch nh gi tr time-out
l 3 giy, nn Join s lun ht hiu lc v v d ny s hin th mt thng bo ra ca s
Console.
using System;
using System.Threading;
// Ngh 1 giy.
Thread.Sleep(1000);
}
}
143
Chng 4: Tiu trnh, tin trnh, v s ng b
hai ngi dng nhn Enter, Monitor.PulseAll s c gi gii phng tt c cc tiu trnh
ang ch cn li.
using System;
using System.Threading;
Monitor.Enter(consoleGate);
Console.WriteLine("{0} : {1}",
DateTime.Now.ToString("HH:mm:ss.ffff"),
"Acquired consoleGate lock, waiting...");
} finally {
Monitor.Exit(consoleGate);
}
}
Thread.Sleep(1000);
Console.ReadLine();
Console.ReadLine();
lock (consoleGate) {
Bng 4.2 Cc phng thc ca WaitHandle dng ng b ha qu trnh thc thi ca cc tiu
trnh
Phng thc M t
startInfo.FileName = "notepad.exe";
startInfo.Arguments = "file.txt";
startInfo.WorkingDirectory = @"C:\Temp";
startInfo.WindowStyle = ProcessWindowStyle.Maximized;
startInfo.ErrorDialog = true;
// Gn ProcessStartInfo vo Process.
process.StartInfo = startInfo;
try {
ngi dng ng ca s chnh bng trnh n h thng, v n cho c hi ng dng thc hin
vic tt mt cch bnh thng. CloseMainWindow s khng kt thc cc ng dng khng c ca
s chnh hoc cc ng dng c ca s chnh b v hiu (c th v mt hp thoi hin ang
c m). Vi nhng tnh hung nh th, CloseMainWindow s tr v false.
CloseMainWindow tr v true nu thng ip c gi thnh cng, nhng khng bo m tin
trnh tht s kt thc. V d, cc ng dng dng son tho d liu thng s cho c hi
ngi dng lu li cc d liu cha c lu nu nhn c thng ip ny. Ngi dng
thng c c hi hy b vic ng ca s vi nhng tnh hung nh th. iu ny ngha l
CloseMainWindow s tr v true, nhng ng dng vn c chy khi ngi dng hy b. Bn c
th s dng phng thc Process.WaitForExit bo hiu vic kt thc tin trnh v thuc
tnh Process.HasExited kim tra tin trnh kt thc hay cha. V bn cng c th s
dng phng thc Kill.
Phng thc Kill kt thc mt tin trnh ngay lp tc; ngi dng khng c c hi dng vic
kt thc, v tt c cc d liu cha c lu s b mt. Kill l ty chn duy nht kt thc
cc ng dng da-trn-Windows khng p li CloseMainWindow v kt thc cc ng dng
khng-da-trn-Windows.
V d di y khi chy mt th hin mi ca Notepad, i 5 giy, sau kt thc tin trnh
Notepad. Trc tin, v d ny kt thc tin trnh bng CloseMainWindow. Nu
CloseMainWindow tr v false, hoc tin trnh Notepad vn c chy sau khi CloseMainWindow
c gi, v d ny s gi Kill v buc tin trnh Notepad kt thc; bn c th buc
CloseMainWindow tr v false bng cch b mc hp thoi File Open m.
using System;
using System.Threading;
using System.Diagnostics;
// Gi mt thng ip n ca s chnh.
154
Chng 4: Tiu trnh, tin trnh, v s ng b
if (!process.CloseMainWindow()) {
} else {
12. Bo m ch c th chy
mt th hin ca ng dng ti mt thi im
Bn cn bo m rng, ti mt thi im ch c th chy mt th hin ca ng
dng.
To mt i tng System.Threading.Mutex v bo ng dng thu ly quyn s
hu i tng ny lc khi ng.
Mutex cung cp mt c ch ng b ha qu trnh thc thi ca cc tiu trnh vt qua bin
tin trnh v cn cung cp mt c ch tin li bo rng ch mt th hin ca ng dng ang
chy. Bng cch c thu ly quyn s hu mt i tng Mutex lc khi ng v thot nu
155
Chng 4: Tiu trnh, tin trnh, v s ng b
Console.ReadLine();
} else {
}
}
Chng 5:XML
5
158
159
Chng 5: XML
// Xa cy.
treeXml.Nodes.Clear();
// Np ti liu XML.
XmlDocument doc = new XmlDocument();
try {
doc.Load(txtXmlFile.Text);
}catch (Exception err) {
161
Chng 5: XML
MessageBox.Show(err.Message);
return;
}
// d liu vo TreeView.
ConvertXmlNodeToTreeNode(doc, treeXml.Nodes);
// M rng tt c cc nt.
treeXml.Nodes[0].ExpandAll();
}
case XmlNodeType.ProcessingInstruction:
case XmlNodeType.XmlDeclaration:
newTreeNode.Text = "<?" + xmlNode.Name + " " +
xmlNode.Value + "?>";
break;
case XmlNodeType.Element:
newTreeNode.Text = "<" + xmlNode.Name + ">";
break;
case XmlNodeType.Attribute:
newTreeNode.Text = "ATTRIBUTE: " + xmlNode.Name;
break;
case XmlNodeType.Text:
case XmlNodeType.CDATA:
newTreeNode.Text = xmlNode.Value;
break;
case XmlNodeType.Comment:
newTreeNode.Text = "<!--" + xmlNode.Value + "-->";
162
Chng 5: XML
break;
}
</product>
</products>
</productCatalog>
// To mt ti liu mi rng.
XmlDocument doc = new XmlDocument();
XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
doc.AppendChild(docNode);
// Lu ti liu.
doc.Save(Console.Out);
Console.ReadLine();
}
}
166
Chng 5: XML
if (textContent != null) {
XmlNode content;
content = parent.OwnerDocument.CreateTextNode(textContent);
node.AppendChild(content);
}
return node;
}
XmlAttribute attribute;
attribute = parent.OwnerDocument.CreateAttribute(attributeName);
attribute.Value = textContent;
parent.Attributes.Append(attribute);
return attribute;
}
}
// To ti liu.
XmlDocument doc = new XmlDocument();
XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
doc.AppendChild(docNode);
XmlNode products = doc.CreateElement("products");
doc.AppendChild(products);
// Lu ti liu.
doc.Save(Console.Out);
Console.ReadLine();
}
}
// 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";
4. Tm mt nt khi bit tn ca n
Bn cn thu ly mt nt c th trong mt XmlDocument, v bn bit tn ca n
nhng khng bit v tr ca n.
S dng phng thc XmlDocument.GetElementsByTagName, phng thc ny s d
tm ton b ti liu v tr v tp hp System.Xml.XmlNodeList cha cc nt c
so trng.
Lp XmlDocument cung cp phng thc GetElementsByTagName dng tm ra cc nt c tn
cho trc. N tr v kt qu l mt tp hp cc i tng XmlNode.
on m di y trnh by cch s dng GetElementsByTagName tnh tng gi cc item
trong mt danh mc bng cch thu ly tt c cc phn t c tn l "productPrice":
using System;
using System.Xml;
// Np ti liu.
XmlDocument doc = new XmlDocument();
doc.Load("ProductCatalog.xml");
// Thu ly tt c price.
XmlNodeList prices = doc.GetElementsByTagName("productPrice");
decimal totalPrice = 0;
foreach (XmlNode price in prices) {
trng khp). s dng phng thc ny, trc ht ly mt XmlNode tng ng vi mt phn
t, k p i tng ny thnh mt XmlElement. V d di y trnh by cch tm nt price
bn di phn t product u tin:
// Thu ly tham chiu n product u tin.
XmlNode product = doc.GetElementsByTagName("products")[0];
<cli:client>
171
Chng 5: XML
<cli:firstName>Sally</cli:firstName>
<cli:lastName>Sergeyeva</cli:lastName>
</cli:client>
<ord:orderItem itemNumber="3211"/>
<ord:orderItem itemNumber="1155"/>
</ord:order>
// Np ti liu.
XmlDocument doc = new XmlDocument();
doc.Load("Order.xml");
// Thu ly tt c cc th t hng.
XmlNodeList matches = doc.GetElementsByTagName("*",
"http://mycompany/OrderML");
Console.Write(node.Name + "\t");
foreach (XmlAttribute attribute in node.Attributes) {
Console.Write(attribute.Value + " ");
}
Console.WriteLine();
}
172
Chng 5: XML
Console.ReadLine();
}
}
Lp XmlNode nh ngha hai phng thc dng tm kim da vo biu thc Xpath l
SelectNodes v SelectSingleNode. Hai phng thc ny thao tc trn tt c cc nt con. V
XmlDocument tha k t XmlNode nn bn c th gi XmlDocument.SelectNodes d tm ton
b mt ti liu.
Xt ti liu XML m t mt n t hng gm hai item:
<?xml version="1.0"?>
<Order id="2004-01-30.195496">
<Client id="ROS-930252034">
<Name>Remarkable Office Supplies</Name>
</Client>
<Items>
<Item id="1001">
<Name>Electronic Protractor</Name>
<Price>42.99</Price>
</Item>
<Item id="1002">
<Name>Invisible Ink</Name>
173
Chng 5: XML
<Price>200.25</Price>
</Item>
</Items>
</Order>
// Np ti liu.
XmlDocument doc = new XmlDocument();
doc.Load("orders.xml");
// Thu ly tn ca tt c cc item.
// Vic ny khng th hon tt d dng vi phng thc
// GetElementsByTagName(), v cc phn t Name c s dng
// bn trong cc phn t Item v cc phn t Client, v do
// c hai kiu ny u s c tr v.
XmlNodeList nodes = doc.SelectNodes("/Order/Items/Item/Name");
Console.ReadLine();
}
}
biu thc XPath v cc v d m t cch lm vic ca chng vi ti liu XML trn. hiu
chi tit hn, bn hy tham kho ti liu W3C XPath ti [http://www.w3.org/TR/xpath].
Bng 5.1 C php ca biu thc XPath
Biu thc M t
Kt hp nhiu ng dn.
| /Order/Items/Item/Name|Order/Client/Name chn cc nt Name dng
m t mt Client v cc nt Name dng m t mt Item.
Cho bit nt (mc nh) hin hnh.
. Nu nt hin hnh l mt Order, biu thc ./Items ch n cc item lin
quan vi n t hng .
Cho bit nt cha.
.. //Name/.. chn phn t l cha ca mt Name, gm cc phn t Client v
Item.
nhn bit mt phn t c cc c tnh hay khng, bn phi kim tra thuc tnh
HasAttributes v ri s dng phng thc GetAttribute thu ly cc c tnh theo tn hay
theo ch s. Lp XmlTextReader ch c th truy xut mt nt ti mt thi im, v n khng
th dch chuyn ngc hay nhy sang mt nt bt k. Do , tnh linh hot ca n km hn
lp XmlDocument.
ng dng di y ghi v c mt ti liu XML bng lp XmlTextWriter v XmlTextReader.
Ti liu ny ging vi ti liu c to trong mc 5.2 v 5.3 bng lp XmlDocument.
using System;
using System.Xml;
using System.IO;
using System.Text;
// To file v writer.
FileStream fs = new FileStream("products.xml", FileMode.Create);
XmlTextWriter w = new XmlTextWriter(fs, Encoding.UTF8);
// Khi ng ti liu.
w.WriteStartDocument();
w.WriteStartElement("products");
// Ghi mt product.
w.WriteStartElement("product");
w.WriteAttributeString("id", "1001");
w.WriteElementString("productName", "Gourmet Coffee");
w.WriteElementString("productPrice", "0.99");
w.WriteEndElement();
w.WriteEndElement();
// Kt thc ti liu.
w.WriteEndElement();
w.WriteEndDocument();
w.Flush();
fs.Close();
// c tt c cc nt.
while (r.Read()) {
if (r.NodeType == XmlNodeType.Element) {
Console.WriteLine();
Console.WriteLine("<" + r.Name + ">");
if (r.HasAttributes) {
Mt XML Schema (gin XML) nh ngha cc quy tc m mt kiu ti liu XML cho trc
phi tun theo. Cc quy tc ny nh ngha:
Cc phn t v c tnh c th xut hin trong ti liu.
Cc kiu d liu cho phn t v c tnh.
Cu trc ca ti liu, bao gm cc phn t no l con ca cc phn t khc.
Th t v s lng cc phn t con xut hin trong ti liu.
Cc phn t no l rng, c th cha text, hay i hi cc gi tr c nh.
Bn su v cc ti liu XML Schema vt qu phm vi ca chng ny, nhng bn c th tm
hiu n thng qua mt v d n gin. Mc ny s s dng ti liu XML m t danh mc sn
phm c trnh by trong mc 5.1.
mc c bn nht, XML Schema Definition (XSD) c s dng nh ngha cc phn t
c th xut hin trong ti liu XML. Bn thn ti liu XSD c vit theo dng XML, v bn s
dng mt phn t c nh ngha trc (c tn l <element>) ch nh cc phn t s
cn thit trong ti liu ch. c tnh type cho bit kiu d liu. V d di y l tn sn
phm:
<xsd:element name="productName" type="xsd:string" />
V v d di y l gi sn phm:
<xsd:element name="productPrice" type="xsd:decimal" />
<xsd:element name="products">
180
Chng 5: XML
<xsd:complexType>
<xsd:sequence>
<xsd:element name="product" type="product"
maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
// To validator.
XmlTextReader r = new XmlTextReader(xmlFilename);
XmlValidatingReader validator = new XmlValidatingReader(r);
validator.ValidationType = ValidationType.Schema;
// Np Schema vo validator.
XmlSchemaCollection schemas = new XmlSchemaCollection();
schemas.Add(null, schemaFilename);
validator.Schemas.Add(schemas);
failed = false;
try {
// c tt c d liu XML.
while (validator.Read())
{}
}catch (XmlException err) {
// iu ny xy ra khi ti liu XML c cha k t bt
// hp l hoc cc th lng nhau hay ng khng ng.
Console.WriteLine("A critical XML error has occurred.");
Console.WriteLine(err.Message);
failed = true;
}finally {
validator.Close();
}
return !failed;
}
failed = true;
// Hin th li validation.
Console.WriteLine("Validation error: " + args.Message);
Console.WriteLine();
}
}
Console.ReadLine();
}
}
<products>
<product id="1001">
<productName>Magic Ring</productName>
<productPrice>$342.10</productPrice>
<inStock>true</inStock>
</product>
<product id="1002">
<productName>Flying Carpet</productName>
<productPrice>982.99</productPrice>
<inStock>Yes</inStock>
</product>
</products>
</productCatalog>
Nu bn kim tra ti liu ny, bin success s c thit lp thnh false v kt xut s cho
bit cc li:
Validating ProductCatalog_Invalid.xml.
Validation error: The 'expiryDate' element has an invalid value according to its
data type. An error occurred at file:///I:/CSharp/Chuong05/05-08/
bin/Debug/ProductCatalog_Invalid.xml, (4, 30).
Validation error: The 'productPrice' element has an invalid value according to its
data type. An error occurred at file:///I:/CSharp/Chuong05/05-08/
bin/Debug/ProductCatalog_Invalid.xml, (9, 36).
Validation error: The 'inStock' element has an invalid value according to its data
type. An error occurred at file:///I:/CSharp/Chuong05/05-08/
bin/Debug/ProductCatalog_Invalid.xml, (15, 27).
Validation failed.
// Np Schema vo validator.
validator.ValidationType = ValidationType.Schema;
184
Chng 5: XML
[XmlRoot("productCatalog")]
public class ProductCatalog {
[XmlElement("catalogName")]
public string CatalogName;
// Cu hnh tn th.
[XmlArray("products")]
[XmlArrayItem("product")]
public Product[] Products;
public ProductCatalog() {
// Phng thc khi dng mc nh (dng khi gii tun t ha).
}
this.ExpiryDate = expiryDate;
}
}
[XmlElement("productName")]
public string ProductName;
[XmlElement("productPrice")]
public decimal ProductPrice;
[XmlElement("inStock")]
public bool InStock;
[XmlAttributeAttribute(AttributeName="id", DataType="integer")]
public string Id;
public Product() {
// Phng thc khi dng mc nh (dng khi gii tun t ha).
}
1
Pascal casing: Mu t u tin ca cc ch u vit hoa, v d SomeOtherName
2
Camel casing: Mu t u tin ca ch u vit thng, mu t u tin ca cc ch i sau vit hoa, v
d someOtherName
187
Chng 5: XML
tun t ha i tng thnh ti liu XML, gii tun t ha ti liu thnh i tng, v ri hin
th ti liu ny:
using System;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
// To danh mc sn phm.
ProductCatalog catalog = new ProductCatalog("New Catalog",
DateTime.Now.AddYears(1));
Product[] products = new Product[2];
products[0] = new Product("Product 1", 42.99m);
products[1] = new Product("Product 2", 202.99m);
catalog.Products = products;
catalog = null;
<xsl:template match="Order">
<html><body><p>
Order <b><xsl:value-of select="Client/@id"/></b>
for <xsl:value-of select="Client/Name"/></p>
<table border="1">
190
Chng 5: XML
<td>ID</td><td>Name</td><td>Price</td>
<xsl:apply-templates select="Items/Item"/>
</table></body></html>
</xsl:template>
<xsl:template match="Items/Item">
<tr>
<td><xsl:value-of select="@id"/></td>
<td><xsl:value-of select="Name"/></td>
<td><xsl:value-of select="Price"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
<td>Price</td>
<tr>
<td>1001</td>
<td>Electronic Protractor</td>
<td>42.99</td>
</tr>
<tr>
<td>1002</td>
<td>Invisible Ink</td>
<td>200.25</td>
</tr>
</table>
</body>
</html>
// Np XSL stylesheet.
transform.Load("orders.xslt");
6
194
195
Chng 6: Windows Form
// To mng.
string[] foods = {"Grain", "Bread", "Beans", "Eggs",
"Chicken", "Milk", "Fruit", "Vegetables",
197
Chng 6: Windows Form
using System.IO;
// Ly tt c cc file trong th mc gc a C.
DirectoryInfo directory = new DirectoryInfo("C:\\");
FileInfo[] files = directory.GetFiles();
// G b i tng form.
OpenForms.MainForm = null;
}
.NET Framework c hai li tt thun li cho vic qun l cc ng dng MDI: thuc tnh
MdiChildren v MdiParent ca lp Form. Bn c th xt thuc tnh MdiParent ca bt k form
202
Chng 6: Windows Form
get {
return label.Text;
}
}
label.Text = DateTime.Now.ToString();
}
203
Chng 6: Windows Form
Ch rng, khi on m duyt qua tp hp cc form con, n phi chuyn (p kiu) tham
chiu Form thnh MDIChild c th s dng thuc tnh LabelText.
this.regPath = registryPath;
this.formName = formName;
key.SetValue("Height", form.Height);
key.SetValue("Width", form.Width);
key.SetValue("Left", form.Left);
key.SetValue("Top", form.Top);
}
formSettings.SaveSettings(this);
}
int counter = 0;
counter++;
listBox1.Items.Add("Item " + counter.ToString());
}
listBox1.TopIndex = listBox1.Items.Count - 1;
}
}
if (Char.IsDigit(e.KeyChar) || Char.IsControl(e.KeyChar)) {}
else if (e.KeyChar == decimalString &&
textBox1.Text.IndexOf(decimalString) == -1) {}
else {
e.Handled = true;
}
base.OnKeyPress(e);
if (e.KeyChar == (int)Keys.Escape) {
// Xa text.
this.SelectedIndex = -1;
this.Text = "";
controlKey = true;
209
Chng 6: Windows Form
}
else if (Char.IsControl(e.KeyChar)) {
controlKey = true;
}
else {
controlKey = false;
}
}
base.OnTextChanged(e);
this.SelectedIndex = match;
Column = columnIndex;
}
if (Numeric) {
try {
listYVal = Decimal.Parse(listY.SubItems[Column].Text);
}
catch {
listYVal = 0;
}
Thc ra, logic dng hin th menu ng cnh hon ton ging nhau, khng quan tm n
iu kim g. Mi iu kim u h tr thuc tnh ContextMenu (c tha k t lp c s
Control), ngha l bn c th d dng vit c mt phng thc th l s kin chung hin
th cc menu ng cnh cho tt c cc iu kim.
V d, xt mt form gm mt Label, mt PictureBox, v mt TextBox. Bn c th vit mt
phng thc th l s kin MouseDown cho tt c cc i tng ny. on m di y kt ni
tt c cc s kin ny vo mt phng thc th l s kin tn l Control_MouseDown:
this.label1.MouseDown += new MouseEventHandler(this.Control_MouseDown);
this.pictureBox1.MouseDown += new
MouseEventHandler(this.Control_MouseDown);
this.textBox1.MouseDown += new MouseEventHandler(this.Control_MouseDown);
Phn m th l s kin hon ton c dng chung. N ch p kiu sender thnh Control,
kim tra menu ng cnh, v hin th n.
private void Control_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e) {
if (e.Button == MouseButtons.Right) {
// Ly iu kim ngun.
Control ctrl = (Control)sender;
if (ctrl.ContextMenu != null) {
Trong nhiu ng dng, menu ng cnh ca mt iu kim sao li mt phn ca menu chnh.
Tuy nhin, .NET khng cho php bn to mt i tng MenuItem cng lc nm trong nhiu
menu.
Gii php l to bn sao ca mt phn menu chnh bng phng thc CloneMenu. Phng thc
ny khng ch chp cc item MenuItem (v cc submenu), m cn ng k mi i tng
MenuItem vi cng phng thc th l s kin. Do , khi ngi dng nhp vo mt item
trong menu ng cnh (bn sao), phng thc th l s kin tng ng s c thc thi nh
th ngi dng nhp vo item trong menu chnh.
V d, xt ng dng th nghim trong hnh 6.6. Trong v d ny, menu ng cnh cho TextBox
hin th cc item ging nh trong menu File. y chnh l bn sao ca cc i tng
MenuItem, nhng khi ngi dng nhp vo mt item, phng thc th l s kin tng ng s
c thc thi.
Di y l phn m cho form to v d ny. N s sao li cc item trong menu chnh khi
form c np (ng tic l khng th thao tc vi cc item bn sao lc thit k).
using System;
using System.Windows.Forms;
using System.Drawing;
mnuContext.MenuItems.Add(mnuItem.CloneMenu());
}
if (e.Button == MouseButtons.Right){
using System;
using System.Windows.Forms;
using System.Drawing;
public class DragForm : System.Windows.Forms.Form {
if (e.Button == MouseButtons.Left) {
dragging = true;
pointClicked = new Point(e.X, e.Y);
}
else {
dragging = false;
}
}
if (dragging) {
Point pointMoveTo;
pointMoveTo.Offset(-pointClicked.X, -pointClicked.Y);
// Di chuyn form.
this.Location = pointMoveTo;
}
}
dragging = false;
}
this.Close();
}
}
// Np vo tm icon.
images = new Icon[8];
images[0] = new Icon("moon01.ico");
images[1] = new Icon("moon02.ico");
images[2] = new Icon("moon03.ico");
images[3] = new Icon("moon04.ico");
images[4] = new Icon("moon05.ico");
images[5] = new Icon("moon06.ico");
images[6] = new Icon("moon07.ico");
images[7] = new Icon("moon08.ico");
}
// Thay i icon.
// Phng thc th l s kin ny pht sinh mi giy mt ln.
notifyIcon.Icon = images[offset];
offset++;
if (offset > 7) offset = 0;
}
}
using System;
using System.Windows.Forms;
using System.Text.RegularExpressions;
Regex regex;
regex = new Regex(@"\S+@\S+\.\S+");
if (errProvider.GetError(ctrl) != "")
{
errorText += " * " + errProvider.GetError(ctrl) + "\n";
invalidInput = true;
}
}
if (invalidInput) {
MessageBox.Show(
"The form contains the following unresolved errors:\n\n" +
errorText, "Invalid Input", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
}
else {
this.Close();
}
226
Chng 6: Windows Form
}
}
txt.SelectAll();
txt.DoDragDrop(txt.Text, DragDropEffects.Copy);
}
if (e.Data.GetDataPresent(DataFormats.Text)) {
e.Effect = DragDropEffects.Copy;
}
else {
e.Effect = DragDropEffects.None;
}
}
Nu ngi dng nhn phm F1 trong khi mt iu kim no ang nhn focus, file tr gip
s c m mt cch t ng v ch lin kt vi iu kim ny s c hin th trong ca
229
Chng 6: Windows Form
s tr gip. Nu ngi dng nhn phm F1 trong khi ang trn mt iu kim khng c ch
tr gip (v d, GroupBox hoc Panel), cc thit lp tr gip cho iu kim nm bn trong
s c s dng. Nu khng c iu kim no nm bn trong hoc iu kim nm bn trong
khng c thit lp tr gip no, cc thit lp tr gip cho form s c s dng. Nu cc thit
lp tr gip cho form cng khng c, HelpProvider s m bt k file tr gip no c nh
ngha mc d n. Bn cng c th s dng cc phng thc ca HelpProvider thit lp
hoc sa i nh x tr gip cm-ng-cnh lc thc thi.
Nu ang s dng .NET Framework phin bn 1.0, bn khng c s tr gip ca phng thc
Application.EnableVisualStyles. Tuy nhin, bn vn c th s dng phong cch ny bng
cch to mt file manifest cho ng dng ca bn. File manifest ny (ch l mt file vn bn
thng thng vi ni dung XML) s bo vi Windows XP rng ng dng ca bn yu cu
phin bn mi ca file comctl32.dll (file ny c trn tt c cc my tnh Windows XP).
Windows XP s c v p dng cc thit lp t file manifest mt cch t ng, nu file
manifest c t trong th mc ng dng v c tn trng vi tn file thc thi ng dng cng
230
Chng 6: Windows Form
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*" />
</dependentAssembly>
</dependency>
</assembly>
Phong cch Windows XP s khng xut hin trong mi trng thit k ca Visual Studio
.NET. Do , th nghim k thut ny, bn cn phi chy ng dng. Tuy nhin, bn vn c
th lm cho mi trng thit k ca Visual Studio .NET hin th theo phong cch Windows XP
bng cch thm file devenv.exe.manifest vo th mc \Program Files\Microsoft Visual Studio
.NET 2003\Common7\IDE.
231
Chng 6: Windows Form
Nu ch mun trong sut nhng vng no trn form, bn hy s dng thuc tnh
TransparencyKey. Bn nh ngha thuc tnh ny l mt mu no . Nu bt k phn no ca
form trng vi mu , n s tr nn trong sut. Hnh 6.15 trnh by mt form vi c
80%. Chng ta t mt iu kim Panel ln form v thit lp mu nn ca Panel l mu m ta
nh ngha trong thuc tnh TransparencyKey ca form. Nh th, form s trong sut trn
vng thuc Panel.
6.15. Trn y l mt cch to form c hnh dng bt thng, mt cch khc s c trnh
by trong mc 8.3.
234
7
235
236
Chng 7: ASP.NET v Web Form
Response.Redirect("newpage.aspx");
}
Phng thc Redirect c th lm vic vi URL tng i (ch n nhng ti nguyn trong
cng th mc o), v vi URL y . URL c th ch n trang ASP.NET khc, kiu ti liu
khc (nh trang HTML hoc hnh nh), v web-server khc.
Phng thc Redirect gi ch th chuyn hng n trnh duyt. K , trnh duyt s yu cu
trang mi. Kt qu l trnh duyt phi thc hin hai chuyn n web-server, v web-server
phi x l thm mt yu cu na. Mt ty chn hiu qu hn l s dng phng thc
HttpServerUtility.Transfer, phng thc ny s chuyn s thc thi n mt trang ASP.NET
khc trn cng web-server. V d:
private void cmdRedirect_Click(object sender, System.EventArgs e) {
Server.Transfer("newpage.aspx");
}
Phng thc Transfer khng cn thm mt chuyn n client, nhng n s khng lm vic
nu bn cn chuyn s thc thi n mt server khc hoc mt kiu ti nguyn khc vi Web
Form (bao gm trang ASP c in).
ASP.NET cung cp nhiu cch lu tr thng tin, hay trng thi, gia cc yu cu (request).
Kiu trng thi m bn s dng cho bit: thng tin s sng bao lu, s c lu tr u, v
s c bo mt nh th no. Bng 7.1 lit k nhng ty chn trng thi khc nhau c cp
bi ASP.NET. Bng ny khng cha i tng Cache, i tng ny cung cp kho lu tr tm
thi v s c m t trong mc 7.5.
C php cho cc phng php lu tr d liu l nh nhau. D liu c lu tr trong mt i
tng tp hp v c nh ch mc bng mt tn chui.
Bng 7.1 Cc kiu qun l trng thi
Kiu D liu
V tr lu tr Thi gian sng Bo mt
trng thi c php
Mc nh l khng
Tt c cc an ton. Tuy nhin,
kiu d liu Mt trng n B mt khi ngi bn c th s dng
View state kh-tun- trong trang web dng chuyn sang cc ch th trang
t-ha hin hnh. mt trang khc. thc hin mt ha
.NET. v bm ngn d
liu b ph.
B mt khi ngi
dng nhp mt URL
mi hoc ng trnh Ngi dng c th
Query D liu Chui URL ca
duyt. Tuy nhin, n nhn thy c v
string chui. trnh duyt.
c th c lu tr chnh sa d dng.
trong mt
bookmark.
Ht hiu lc sau mt
B nh server
Tt c cc khong thi gian
(c th c cu
kiu d liu c nh ngha An ton v d liu
Session hnh cho mt
kh-tun- trc (thng l 20 khng bao gi c
state tin trnh hoc
t-ha pht, nhng khong chuyn cho client.
c s d liu
.NET. thi gian ny c th
bn ngoi).
thay i c).
My tnh client
c thit lp bi
(trong b nh
lp trnh vin. C
hoc mt file Khng an ton, v
D liu th c s dng
Cookie text, ty thuc c th b ngi
chui. trong nhiu trang v
vo cc thit lp dng chnh sa.
c th vn cn gia
cho thi gian
cc ln ving thm.
sng ca n).
239
Chng 7: ASP.NET v Web Form
Hnh 7.1 trnh by mt trang web th nghim cc kiu qun l trng thi khc nhau. Khi
ngi dng nhp vo nt Store Data, mt i tng System.DateTime s c to ra v c
lu tr trong view state, session state, v mt cookie ty bin. Khi ngi dng nhp vo nt
Get Data, thng tin ny s c ly ra v hin th. Cui cng, nt Clear Data s xa thng tin
ny trong tt c cc trng thi.
// To i tng th nghim.
DateTime now = DateTime.Now;
// To cookie.
HttpCookie cookie = new HttpCookie("07-02");
// Gn cookie vo p ng.
// N s c cung cp vi tt c cc yu cu n
// site ny cho n khi ht hiu lc.
Response.Cookies.Add(cookie);
241
Chng 7: ASP.NET v Web Form
}
}
lblData.Text = "";
}else {
}else {
cookieData + "<br>";
}else {
ViewState["TestData"] = null;
Session["TestData"] = null;
// (Bn cng c th s dng Session.Abandon xa tt c
// thng tin trong session state.)
Mt kiu trng thi m trang ny khng th hin l query string (chui truy vn). Query string
i hi mt chuyn hng trang, l tng cho vic chuyn thng tin t trang ny n trang
khc. thit lp thng tin, bn phi chuyn hng ngi dng n mt trang mi v thm
cc i s query string vo cui URL. Bn c th s dng phng thc
HttpServerUtility.UrlEncode v UrlDecode bo m d liu chui l URL hp l.
DateTime now = DateTime.Now;
string data = Server.UrlEncode(now.ToString());
Response.Redirect("newPage.aspx?TestData=" + data);
}
}
// Hin th gi tr.
lblCurrent.Text = memberValue.ToString();
}
Trong trng hp ny, bn s dng hm JavaScript alert (ni ti) v s kin JavaScript
onBlur (pht sinh khi mt iu kim mt focus). Hu ht cc phn t HTML u h tr cc s
kin sau y:
onFocus xy ra khi mt iu kim nhn focus.
onBlur xy ra khi mt iu kim mt focus.
onClick xy ra khi ngi dng nhp vo mt iu kim.
onChange xy ra khi ngi dng thay i gi tr ca iu kim no .
onMouseOver xy ra khi ngi dng di chuyn con tr chut trn mt iu kim.
Mt cch khc chn m JavaScript l nh ngha mt hm JavaScript trong mt bin chui
ri lnh cho ASP.NET chn n vo trang web c tr v. Nu lm theo cch ny, bt k iu
kim no cng c th gi hm p ng cho mt s kin JavaScript.
V d di y s lm r k thut ny bng mt trang web gm mt bng v mt bc hnh
(xem hnh 7.2). Khi ngi dng di chuyn chut ln cc trong bng th hai hm JavaScript
ty bin s c s dng: mt to highlight cho hin ti v mt g b highlight khi trc
. Ngoi ra, hm to highlight cn thay i URL ca bc hnh ty thuc vo ct no ang
c chn. Nu ngi dng a chut ln ct th nht, hnh mt ci s c hin th. Nu
ngi dng a chut ln ct th hai hoc th ba, hnh quyn sch vi du chm hi nhp
nhy s c hin th.
using System;
using System.Web;
using System.Web.UI.WebControls;
// nh ngha cc hm JavaScript.
string highlightScript =
"<script language=JavaScript> " +
"function HighlightCell(cell) {" +
"cell.bgColor = '#C0C0C0';" +
"if (cell.cellIndex == 0) {" +
"document.Form1.Image1.src='happy_animation.gif';}" +
"else {" +
"document.Form1.Image1.src='question_animation.gif';}" +
246
Chng 7: ASP.NET v Web Form
";}" +
"</script>";
string unhighlightScript =
"<script language=JavaScript> " +
"function UnHighlightCell(cell) {" +
"cell.bgColor = '#FFFFFF';" +
"}" +
"</script>";
if (!this.IsClientScriptBlockRegistered("UnHighlight")) {
Page.RegisterClientScriptBlock("UnHighlight",
unhighlightScript);
}
cell.Attributes.Add("onMouseOver", "HighlightCell(this);");
cell.Attributes.Add("onMouseOut", "UnHighlightCell(this);");
}
}
}
247
Chng 7: ASP.NET v Web Form
cmdPopUp.Attributes.Add("onClick", popupScript);
Page.RegisterStartupScript("PopupScript", popupScript);
if (!this.IsPostBack) {
// Chuyn focus n mt TextBox c th.
SetFocus(TextBox1);
}
}
250
Chng 7: ASP.NET v Web Form
V ASP.NET thc thi trn server nn khng c cch no truy xut cc ti nguyn trn my
client, bao gm file. Tuy nhin, bn c th s dng iu kim System.Web.UI.
HtmlControls.HtmlInputFile cho php ngi dng upload mt file. iu kim ny tr v
phn t HTML <input type="file">, hin th mt nt Browse v mt hp cha tn file.
Ngi dng nhp vo nt Browse v chn mt file. Bc ny din ra mt cch t ng v
khng i hi bt k on m ty bin no. Sau , ngi dng phi nhp vo mt nt khc
(bn phi to nt ny) bt u qu trnh upload.
to mt trang cho php upload file, bn cn thc hin cc bc sau y:
Thit lp kiu m ha ca form l multipart/form-data. thc hin thay i ny, tm
th <form> trong file .aspx v iu chnh nh sau:
<form id="Form1" enctype="multipart/form-data" runat="server">
if (FileInput.PostedFile.FileName == "") {
try {
// Cm cc file ln hn 1 megabyte.
lblInfo.Text = "File is too large.";
}else {
// File c lu vn gi li tn file gc ca n.
string fileName =
Path.GetFileName(FileInput.PostedFile.FileName);
lblInfo.Text = err.Message;
}
}
}
}
252
Chng 7: ASP.NET v Web Form
</system.web>
</configuration>
Bn c th kch hot nhiu phng php xc thc, trong trng hp ny client s s dng
phng php c h tr mnh nht. Nu Anonymous access c kch hot th n lun c
s dng. Cc phng php xc thc khc nhau c m t trong bng 7.2.
Bng 7.2 Cc kiu xc thc
255
Chng 7: ASP.NET v Web Form
Ch M t
<authorization>
<deny roles="Guest,Associate" />
<allow users="nnbphuong81" />
<deny users="*" />
256
Chng 7: ASP.NET v Web Form
</authorization>
</system.web>
</configuration>
ASP.NET xt qua cc quy tc phn quyn theo th t chng xut hin v dng khi tm thy
mt trng khp. Trong v d ny, ngi dng trong cc nhm Guest hoc Associate s t
ng b t chi. Ngi dng nnbphuong81 s c php (tr khi anh ta l thnh vin ca mt
trong hai nhm b cm trn). Tt c cc ngi dng khc s b t chi. Trong trng hp
ny, y l cc nhm v ti khon ngi dng cc b. Nu mun ni n mt ti khon min,
bn hy s dng c php [DomainName]\[UserName].
trong v d ny, file Web.config khng cha phn <authentication>. l v phn ny
c cu hnh trong file Web.config thuc th mc ng dng Web. Cc th mc con c th
thit lp cc quy tc phn quyn ca chng, nhng chng khng th thay i ch xc thc.
Mt ty chn khc khng cho truy xut n cc trang c th l s dng c tnh <location>:
<configuration>
<system.web>
<!-- B qua cc thit lp khc. -->
</system.web>
<location path="SecurePage.aspx">
<system.web>
<authorization>
<deny roles="Guest" />
</authorization>
</system.web>
</location>
</configuration>
Cui cng, bn c th vit logic xc thc bng cch kim tra identity ca ngi dng trong
phn m trang web (s dng thuc tnh Page.User, thuc tnh ny cung cp i tng
WindowsPrincipal). Bn c th ly tn ngi dng t thuc tnh
WindowsPrincipal.Identity.Name, v bn c th kim tra vai tr thnh vin trong nhm bng
phng thc WindowsPrincipal.IsInRole. Phn m cho trang web di y s trnh by cc
k thut ny:
using System;
using System.Web;
using System.Web.UI.WebControls;
257
Chng 7: ASP.NET v Web Form
using System.Web.Security.Principal;
mt cookie cho ngi dng c xc thc. Ngi dng khng c cookie s b chuyn
hng sang trang ng nhp khi truy xut mt trang c bo v.
hin thc Forms authentication, bn phi thc hin cc bc sau y:
Cu hnh Forms authentication bng th <authentication> trong file Web.config ca
ng dng.
S dng cc thit lp trong file Web.config hn ch ngi dng nc danh truy xut
vo mt trang hoc th mc c th.
To trang ng nhp, v thm logic xc thc ca bn vo (s dng lp
FormsAuthentication thuc khng gian tn System.Web.Security).
Bc u tin l cu hnh file Web.config trong th mc gc ca ng dng kch hot
Forms authentication, nh c trnh by trong on m di y. Bn cng cn ch nh
trang ng nhp ty bin (ngi dng cha c xc thc s b chuyn hng sang trang ny)
v thi gian tr (sau thi gian ny, cookie s b loi b). Authentication cookie t ng c
lm mi vi mi yu cu web.
<configuration>
<system.web>
<authentication mode="Forms">
<forms loginUrl="login.aspx" timeout="30" />
</authentication>
</system.web>
</configuration>
K n, bn cn thm quy tc phn quyn t chi ngi dng nc danh. Cch d nht
bo ton cc trang l to mt th mc con cng vi file Web.config ca n. File Web.config
ny s t chi vic truy xut ca cc ngi dng nc danh, nh c trnh by di y:
<configuration>
<system.web>
<authorization>
<deny users="?" />
</authorization>
<location path="SecurePage.aspx">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>
</configuration>
Bn cng c th t chi cc ngi dng c th bng cch nhp danh sch tn ngi dng
(phn cch bng du phy) thay vo k t ? (? ngha l tt c cc ngi dng nc danh).
K tip, bn cn to trang ng nhp. Trang ng nhp c th xc thc ngi dng bng
password c vit cng (ph hp cho cc th nghim n gin), c s d liu pha server,
hoc bt k kiu logic xc thc ty bin no. Mt khi ngi dng c xc thc thnh
cng, bn cn gi phng thc tnh FormsAuthentication.RedirectFromLoginPage. Phng
thc ny s thit lp authentication cookie v chuyn hng ngi dng n trang c yu
cu lc u.
Di y l trang ng nhp s b, ch kim tra mt password c th khi ngi dng nhp
vo nt Login:
using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.Security;
if (txtPassword.Text.ToLower() == "secret") {
FormsAuthentication.RedirectFromLoginPage(
txtName.Text, false);
}else {
lblStatus.Text = "Try again.";
}
}
}
if (!Page.IsValid) {
lblCustomSummary.Text = "";
foreach (BaseValidator validator in this.Validators) {
if (!validator.IsValid) {
lblCustomSummary.Text +=
"The page contains the following error: <b>" +
validator.ErrorMessage + "</b>.<br>" +
"The invalid input is: <b>" +
invalidControl.Text + "</b>." + "<br><br>";
}
}
}else {
lblCustomSummary.Text = "Validation succeeded.";
}
}
}
263
Chng 7: ASP.NET v Web Form
nhp (input) s dng view state, thng tin view state s c tr li cho iu kim sau khi s
kin Page.Load pht sinh. Tng t, v s kin Page.Load lun pht sinh trc khi s kin no
khc din ra, bn c th ti to mt iu kim dng nn cc s kin pha server, v phn m
th l s kin ca n s din ra ngay sau s kin Page.Load.
V d di y (xem hnh 7.9) s to ng ba iu kim (hai Button v mt TextBox) v nh
v chng bng iu kim trc kin (ng vai tr l du phn cch). Hai Button c kt ni
vi cc phng thc th l s kin ring bit. TextBox c cp mt nh danh duy nht
phn text ca n c th c thu ly sau ny (trong p ng cho c nhp chut vo Button).
// To Button.
Button dynamicButton = new Button();
dynamicButton.Text = "Dynamic Button A";
// To Button th hai.
dynamicButton = new Button();
dynamicButton.Text = "Dynamic Button B";
dynamicButton.Click += new EventHandler(cmdDynamicB_Click);
pnl.Controls.Add(dynamicButton);
// To TextBox.
TextBox dynamicText = new TextBox();
pnl.Controls.Add(dynamicText);
// Gn ID cho TextBox.
dynamicText.ID = "DynamicText";
}
12. Tr v ng mt bc hnh
Bn cn tr v ng mt bc hnh (chng hn, to dng kt xut dng biu
hoc th).
To dng bc hnh bng GDI+ v mt i tng System.Drawing.Bitmap trong-
b-nh. K , bn c th ghi n ra dng kt xut (output stream), hoc lu n
vo a cng ca server v hin th n vi iu kim web Image.
Bn c th v ng cc bc hnh trong mt ng dng Web bng cch s dng cng on m
GDI+ s dng trong mt ng dng da-trn-Windows. Ch c im khc l cch thc bn
tr v bc hnh cui cng nh th no. V c bn, c hai cch tip cn m bn c th s dng:
Bn c th a trc tip ni dung nh phn ca bc hnh vo thuc tnh OutputStream
ca i tng HttpResponse. y l mt cch tip cn hay nu bn khng mun lm
y a cng ca server vi cc file hnh khng h c s dng li. y cng l s
la chn tt nht nu bn cn to ng cc bc hnh c thit k ph hp vi u
vo ca ngi dng.
267
Chng 7: ASP.NET v Web Form
rng ch c phn text ca banner l do ngi dng cung cp (thng qua chui truy vn).
Font, mu, v kch thc c vit m cng (mc d chng c th c thit lp d dng da
vo cc i s chui truy vn khc hoc da vo file Web.config).
on m di y s trnh by cch tip cn ny:
using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Drawing.Drawing2D;
Response.Redirect(Request.Url + "?image=" +
Server.UrlEncode("This is a test image"));
}
else {
text = Server.UrlDecode(Request.QueryString["image"]);
}
// V mt hnh ch nht.
graphics.FillRectangle(new SolidBrush(Color.Olive), 5, 5,
width - 10, height - 10);
// V text.
graphics.DrawString(text, fontBanner,
new SolidBrush(Color.LightYellow),
new Rectangle(0, 0, width, height), stringFormat);
269
Chng 7: ASP.NET v Web Form
graphics.Dispose();
bitmap.Dispose();
}
}
// Thit lp tn file.
// Gi s chui truy vn cha cc k t hp l cho tn file.
string fileName = Request.QueryString["image"] + ".gif";
// Np bc hnh hin c.
try {
bitmap = new Bitmap(fileName);
}catch {
bitmap = GenerateBanner();
}
}
else {
bitmap = GenerateBanner();
// Lu bc hnh.
bitmap.Save(fileName,
System.Drawing.Imaging.ImageFormat.Gif);
}
// Hin th bc hnh.
imageControl.ImageUrl = fileName;
}
}
iu kim ngi dng l cc nhm iu kim c lp. Nh Web Form, iu kim ngi dng
bao gm phn layout nh ngha cc iu kim bn trong (file .ascx) v phn code-behind
cng vi logic th l s kin (file .cs). iu kim ngi dng cho php bn s dng li cc
phn t giao din thng thng trn nhiu trang v to dng cc giao din phc tp t cc
khi nh hn. Mt c im hu ch ca iu kim ngi dng l chng c th c np bng
m lnh, iu ny cho php bn to mt giao din cu hnh cao do bn thit k ng y theo
ngi dng. Bn ch cn np iu kim, cu hnh cc thuc tnh ca n, v ri thm n vo
mt iu kim container.
V d, xt trang web to ng cc bc hnh trong mc 7.12. Mt gii php theo cch hng
i tng hn c th hin thc c l to mt iu kim ngi dng ty bin ng gi bc
hnh c-to-ng. iu kim ngi dng ny cho php trang thit lp text, font, mu...
thng qua cc thuc tnh khc nhau.
using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Drawing.Drawing2D;
return borderColor;
}
set {
borderColor = value;
}
}
if (ImageText == "")
return;
// V mt hnh ch nht.
graphics.FillRectangle(new SolidBrush(BackColor), 5, 5,
ImageSize.Width - 10, ImageSize.Height - 10);
// V text.
graphics.DrawString(ImageText, TextFont,
new SolidBrush(ForeColor),
new Rectangle(0, 0, ImageSize.Width, ImageSize.Height),
stringFormat);
274
Chng 7: ASP.NET v Web Form
graphics.Dispose();
bitmap.Dispose();
}
}
Web Form np iu kim ngi dng ny trong phng thc th l s kin Page.Load. iu
kim ngi dng c t trong mt Panel. Phng thc LoadControl tr v mt i tng
Control, v n c p kiu thnh lp iu kim ngi dng thch hp.
using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Drawing;
// Np iu kim.
DynamicGraphicControl ctrl;
ctrl = (DynamicGraphicControl)
Page.LoadControl("DynamicGraphicControl.ascx");
Trong Visual Studio .NET, lp iu kim ngi dng lun c hiu lc v cc lp c bin
dch thnh .dll. Tuy nhin, nu iu kim ngi dng khng phi mt b phn ca d n, bn
s khng c lp iu kim ngi dng v bn s khng th truy xut bt k thuc tnh hay
phng thc no ca iu kim ngi dng. khc phc vn ny, bn c th to mt lp
c s hoc mt giao din nh ngha cc chc nng c bn c th truy xut vo bt k iu
kim ngi dng ty bin no.
Ht hiu lc trt (sliding expiration) g b cc i tng sau mt khong thi gian khng
dng n. Trong trng hp ny, mi khi i tng c truy xut, thi gian sng ca n s
c reset. Ht hiu lc trt lm vic tt khi bn c cc thng tin lun c hiu lc nhng
lun khng c s dng (nh d liu thuc v qu kh). Thng tin ny khng cn c lm
ti, nhng khng nn gi n trong cache nu n khng c s dng.
277
Chng 7: ASP.NET v Web Form
Bn c th ly cc item t cache bng tn kha. Tuy nhin, bn phi lun kim tra trc xem
item c tn ti hay khng v ri p n thnh kiu nh mong mun.
Khi thm cc i tng vo cache, cch tt nht l to mt hm c lp c th ti to i
tng khi cn. V d, nu ang lu gi mt DataSet, bn cn to mt hm kim tra cache v
ch truy vn li c s d liu khi khng tm thy DataSet. iu ny cho php bn trnh i
phn x l tn nhiu thi gian nhttruy vn c s d liutrong khi vn cho php m lnh
ca bn thay i hin th (chng hn, ngi dng yu cu sp th t) hoc thc hin cc hnh
ng khc.
V d di y s hin th mt bng cha thng tin v khch hng c ly t mt DataSet.
Phn then cht l lp CustomerDatabase, ng gi cc chc nng cn thit d liu vo
DataSet v qun l cache. V lp ny khng tha k t Page nn n cn s dng thuc tnh
tnh HttpContext.Current ly tham chiu n i tng Cache.
using System;
using System.Data;
using System.Web;
using System.Configuration;
using System.Diagnostics;
using System.Web.Caching;
using System.Data.SqlClient;
public CustomerDatabase() {
DataSet customersDS;
// Ly DataSet t c s d liu.
customersDS = GetCustomersFromDatabase();
}else {
// Ly item.
customersDS = (DataSet)cache["Customers"];
}
// Tr v DataSet.
return customersDS;
}
// To DataSet.
DataSet customersDS = new DataSet();
279
Chng 7: ASP.NET v Web Form
// d liu vo DataSet.
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", con);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
try {
con.Open();
adapter.Fill(customersDS, "Customers");
}catch {
customersDS = null;
}
finally {
con.Close();
}
Li Unable to start debugging on the Web server cho bit rng Visual Studio .NET c th
bin dch ng dng Web nhng khng th thc thi n ch g ri (debug mode). Vn
ny pht sinh v nhiu l do:
IIS cha c ci t hoc ci t khng ng.
Ngi dng ang chy Visual Studio .NET khng phi l thnh vin ca nhm
Debugger Users trn web-server.
Ngi dng ang chy Visual Studio .NET khng c quyn (permission) g ri tin
trnh ASP.NET. V d, nu tin trnh ASP.NET ang chy di ti khon h thng cc
b, ngi dng phi c c quyn Administrator th mi c th g ri n.
Web-server ang chy trn phin bn Windows khng h tr g ri, nh Microsoft
Windows NT v Windows XP Home Edition (Windows 2000, Windows XP Professional,
Windows XP Server, v Windows Server 2003 u h tr g ri).
ng dng Web khng c file Web.config, hoc file Web.config khng kch hot g ri.
Bn ang chy Visual Studio .NET, v bn khng kch hot Integrated Windows
authentication cho th mc o.
Bc u tin bn cn thc hin khi chn on l do khng th g ri mt ng dng Web l
kim tra vic ci t IIS trn web-server. thc hin iu ny, bn hy m
http://localhost/localstart.asp trong trnh duyt (localhost l mt b danh cho my tnh hin
hnh). Nu trang th nghim ny khng xut hin th c ngha l IIS khng c ci t hoc
khng c kch hot. Bn cng c th bt u ng dng Web m khng thc hin g ri
bng cch chn Debug | Start Without Debugging t thanh trnh n ca Visual Studio .NET.
Nu th nghim ny thnh cng th c ngha l IIS c ci t ng.
281
Chng 7: ASP.NET v Web Form
Nu ci t IIS sau khi ci t Visual Studio .NET hoc .NET Framework, bn cn phi "sa"
.NET Framework bng a ci t gc. bt u qu trnh ny, bn hy g lnh sau y vo
ca s dng lnh (hoc ca s Run), nu ang dng phin bn DVD ca Visual Studio .NET:
<DVD Drive>:\wcu\dotNetFramework\dotnetfx.exe /t:c:\temp
/c:"msiexec.exe /fvecms c:\temp\netfx.msi"
Nu ang dng phin bn CD ca Visual Studio .NET, bn hy s dng dng lnh sau y
cng vi a Windows Component Update:
<CD Drive>:\dotNetFramework\dotnetfx.exe /t:c:\temp
/c:"msiexec.exe /fvecms c:\temp\netfx.msi"
</system.web>
</configuration>
Mt vn khc v cu hnh IIS c th xy ra trong Visual Studio .NET l khng thc hin
xc thc. Visual Studio .NET truy xut web-server cc b bng Integrated Windows
authentication, ngay c khi bn kch hot Anonymous authentication cho th mc o. iu
ny ngha l th mc o ca bn phi cho php c Anonymous authentication v Integrated
Windows authentication. cho php c hai phng php ny, bn cn thc hin cc bc
sau y:
1. Trong IIS Manager, nhp phi vo th mc o cho ng dng ca bn v chn
Properties (bn c th cu hnh kiu xc thc cho tt c cc th mc nu nhp phi vo
th mc Web Sites v chn Properties).
2. Chn th Directory Security (xem hnh 7.13).
3. Trong phn Anonymous access and authentication control, nhp nt Edit.
4. Trong hp thoi Authentication Methods, bn di Authenticated access, chn
Integrated Windows authentication (xem hnh 7.14).
5. Nhp OK.
283
Chng 7: ASP.NET v Web Form
</system.web>
</configuration>
Nh rng, i vi kiu gi nhn ny, ti khon ngi dng s yu cu truy xut c/ghi n
th mc Temporary ASP.NET Files (ni lu tr cc file ASP.NET c bin dchc
nh v ti \[WindowsDirectory]\Microsoft.NET\Framework\ [version]\Temporary ASP.NET
Files).
Cui cng, bn cng c th s dng k thut gi nhn bng m lnh (vn ny s c m
t chi tit trong mc 13.15). Tuy vy, v d di y s lm vic cng vi Windows
authentication. Nu IIS xc thc ngi dng (c m t trong mc 7.8), identity s
c tha nhn khi s dng phng thc WindowsIdentity.Impersonate. s dng on
m ny, bn phi nhp khng gian tn System.Security.Principal.
if (User.GetType() == typeof(WindowsPrincipal)) {
WindowsIdentity id = (WindowsIdentity)User.Identity;
WindowsImpersonationContext impersonate = id.Impersonate();
// Tr li ID.
impersonate.Undo();
} else {
8
288
289
Chng 8: ha, a phng tin, v in n
1. Tm tt c cc font c ci t
Bn cn ly danh sch tt c cc font c ci t trn my tnh hin hnh.
To i tng System.Drawing.Text.InstalledFontCollection, tp hp ny cha
cc i tng FontFamily m t tt c cc font c ci t.
Lp InstalledFontCollection cho php bn ly thng tin v cc font c ci t. on
m di y duyt qua tp hp font va c to; mi khi tm thy mt font, n s to mt
Label mi hin th tn font vi din mo cho trc (kch thc 14 point). Label c thm
vo mt Panel cun c, cho php ngi dng cun qua danh sch cc font hin c.
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Text;
// To tp hp font.
InstalledFontCollection fontFamilies =
new InstalledFontCollection();
try {
}catch {
// nh ngha cc bt v.
Brush highlightBrush = Brushes.HotPink;
Brush defaultBrush = Brushes.LightBlue;
// To cc shape.
path = new GraphicsPath();
path.AddEllipse(10, 10, 100, 60);
path.AddCurve(new Point[] {new Point(50, 50),
new Point(10,33), new Point(80,43)});
path.AddLine(50, 120, 250, 80);
path.AddLine(120, 40, 110, 50);
path.CloseFigure();
293
Chng 8: ha, a phng tin, v in n
Graphics g = e.Graphics;
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);
}
Graphics g = this.CreateGraphics();
if (!inRectangle) {
294
Chng 8: ha, a phng tin, v in n
inRectangle = true;
// i mu nn hnh ch nht.
g.FillRectangle(highlightBrush, rectangle);
g.DrawRectangle(Pens.Black, rectangle);
}
}else if (inRectangle) {
inRectangle = false;
if (!inPath) {
inPath = true;
// i mu nn path.
g.FillPath(highlightBrush, path);
g.DrawPath(Pens.Black, path);
}
}else if (inPath) {
inPath = false;
// Phc hi path.
g.FillPath(defaultBrush, path);
295
Chng 8: ha, a phng tin, v in n
g.DrawPath(Pens.Black, path);
}
g.Dispose();
}
}
Ch rng hot ng ny din ra trc tip bn trong phng thc th l s kin MouseMove.
Vic v ch c thc hin nu phn chn hin ti thay i. i vi mt on m n gin,
bn c th lm mt hiu lc ton b form mi khi con tr chut di chuyn vo trong hoc ra
khi mt vng v th l tt c vic v trong phng thc th l s kin Form.Paint, nhng
iu ny dn n vic phi v nhiu hn v to nn hin tng rung hnh (flicker) khi ton b
form c v li.
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
path.CloseAllFigures();
this.Region = new Region(path);
}
this.Close();
}
}
using System.Drawing.Drawing2D;
base.OnResize(e);
RefreshPath();
this.Invalidate();
}
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);
}
}
}
thit k. Tuy nhin, ngay c khng thc hin bc ny, cng d dng to c mt ng dng
th nghim n gin. V d di y to hai ellipse v cho php ngi dng ko r c hai
vng quanh form bng cch gi chut xung v di chuyn con tr.
ellipseB.BackColor = Color.Azure;
this.Controls.Add(ellipseB);
if (e.Button == MouseButtons.Left) {
}else {
isDraggingB = true;
}
}
}
isDraggingA = false;
isDraggingB = false;
301
Chng 8: ha, a phng tin, v in n
// Ly offset.
Point point = (Point)control.Tag;
// Di chuyn iu kim.
control.Left = e.X + control.Left - point.X;
control.Top = e.Y + control.Top - point.Y;
}
}
}
Hnh 8.5 Thm tnh nng cun cho bc hnh vi ni dung ty bin
using System;
using System.Windows.Forms;
using System.Drawing;
string text = "The quick brown fox jumps over the lazy dog.";
Font font = new Font("Tahoma", 20);
[DllImport("user32.dll")]
private extern static IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
private extern static IntPtr GetDC(IntPtr windowHandle);
[DllImport("gdi32.dll")]
private extern static IntPtr GetCurrentObject(IntPtr hdc,
ushort objectType);
[DllImport("user32.dll")]
private extern static void ReleaseDC( IntPtr hdc );
304
Chng 8: ha, a phng tin, v in n
Bc k tip l to mt client c th s dng chc nng ny. Form di y (xem hnh 8.6) s
hin th bc hnh chp c trong mt PictureBox (nm trong mt Panel cun c, nh
c m t trong mc 8.5).
public class ScreenCapture : System.Windows.Forms.Form {
pictureBox1.Image = DesktopCapture.Capture();
pictureBox1.Size = pictureBox1.Image.Size;
}
}
// Lu tr logo s c v ln form.
private Image image;
}else {
imageSize++;
}
// V li form.
this.Invalidate();
}
Graphics g;
Bitmap drawing = null;
if (chkUseDoubleBuffering.Checked) {
}else {
g.SmoothingMode = SmoothingMode.HighQuality;
// V nn.
g.FillRectangle(Brushes.Yellow,
new Rectangle(new Point(0, 0), this.ClientSize));
// V bc hnh logo.
g.DrawImage(image, 50, 50, 50 + imageSize, 50 + imageSize);
e.Graphics.DrawImageUnscaled(drawing, 0, 0);
g.Dispose();
}
}
// Khng lm g c.
}
}
Lp Image cung cp chc nng to thumbnail thng qua phng thc GetThumbnailImage. Bn
ch cn truyn chiu rng v chiu cao ca hnh thumbnail bn mun (tnh bng pixel), v lp
Image s to mt i tng Image mi ph hp vi tiu chun ny. Vic kh mo dng rng
ca (antialiasing) c s dng khi thu nh bc hnh bo m cht lng bc hnh tt nht
c th c, mc d mt s vt m v thiu ht mt vi tiu tit l khng th trnh khi (kh
mo dng rng ca l qu trnh loi b cc ra lm chm, thng c trong cc bc hnh
c thay i kch thc, bng cch t bng vi mt mu trung gian). Ngoi ra, bn c th
cung cp mt callback to thumbnail mt cch bt ng b.
Khi to mt thumbnail, vic quan trng l phi bo m t s gia hai chiu vn nh c (hng
s). V d, nu bn thu nh mt bc hnh kch thc 200x100 thnh mt thumbnail kch thc
50x50, chiu rng s b nn cn mt phn t v chiu cao b nn cn mt na, iu ny lm
mo bc hnh. bo m t l ny vn nh c, bn c th thay i chiu rng hoc chiu cao
thnh mt kch thc c nh ri iu chnh chiu cn li cho cn xng.
V d di y c mt file bitmap v to mt thumbnail kch thc khng ln hn 50x50
(vn bo ton t l gc):
using System;
using System.Drawing;
using System.Windows.Forms;
Image thumbnail;
thumbnailWidth = 50;
thumbnailHeight = Convert.ToInt32(((50F / img.Width) *
img.Height));
310
Chng 8: ha, a phng tin, v in n
}else {
thumbnailHeight = 50;
thumbnailWidth = Convert.ToInt32(((50F / img.Height) *
img.Width));
}
thumbnail = img.GetThumbnailImage(thumbnailWidth,
thumbnailHeight, null, IntPtr.Zero);
}
using System;
using System.Runtime.InteropServices;
using Microsoft.VisualBasic;
[DllImport("kernel32.dll")]
private static extern bool Beep(int freq, int dur);
[STAThread]
private static void Main(string[] args) {
Hnh 8.7 Chn ActiveMovie control type library trong hp thoi Add Reference
class PlayAudio {
// Ch nh tn file.
mc.RenderFile(filename);
if (DialogResult.OK == openFileDialog.ShowDialog()) {
// Np file movie.
FilgraphManager graphManager = new FilgraphManager();
graphManager.RenderFile(openFileDialog.FileName);
videoWindow = (IVideoWindow)graphManager;
videoWindow.Owner = (int) pictureBox1.Handle;
videoWindow.WindowStyle = WS_CHILD | WS_CLIPCHILDREN;
videoWindow.SetWindowPosition(
pictureBox1.ClientRectangle.Left,
pictureBox1.ClientRectangle.Top,
pictureBox1.ClientRectangle.Width,
pictureBox1.ClientRectangle.Height);
316
Chng 8: ha, a phng tin, v in n
} catch {
// Li c th xy ra nu file khng c
// video source (chng hn, file MP3).
// Bn c th b qua li ny v vn cho php
// playback tip tc (khng c hnh).
}
if (videoWindow != null) {
try {
videoWindow.SetWindowPosition(
pictureBox1.ClientRectangle.Left,
pictureBox1.ClientRectangle.Top,
pictureBox1.ClientRectangle.Width,
pictureBox1.ClientRectangle.Height);
} catch {
// Hin th tn my in.
Console.WriteLine("Printer: {0}", printerName);
// Ly cc thit lp my in.
PrinterSettings printer = new PrinterSettings();
printer.PrinterName = printerName;
if (Enum.IsDefined(size.Kind.GetType(), size.Kind)) {
319
Chng 8: ha, a phng tin, v in n
[PrinterResolution Draft]
[PrinterResolution X=72 Y=72]
[PrinterResolution X=144 Y=144]
[PrinterResolution X=300 Y=300]
[PrinterResolution X=600 Y=600]
[PrinterResolution X=1200 Y=1200]
[PrinterResolution X=2400 Y=2400]
[PrinterResolution X=3600 Y=3600]
[PrinterResolution X=4000 Y=4000]
Bn khng cn thc hin cch lm ny khi to mt ng dng cung cp chc nng in. Theo
mc 8.13, bn c th s dng PrintDialog nhc ngi dng chn mt my in v cc thit
lp cho n. Lp PrintDialog c th t ng p dng cc thit lp ca n cho PrintDocument
m khng cn vit thm m lnh.
13. In vn bn n gin
Bn cn in text hoc hnh.
Th l s kin PrintDocument.PrintPage, v s dng cc phng thc DrawString
v DrawImage ca lp Graphics in d liu ra trang.
.NET s dng m hnh in da-trn-s-kin bt ng b (asynchronous event-based printing
model). in mt vn bn, bn cn to mt i tng
System.Drawing.Printing.PrintDocument, cu hnh cc thuc tnh ca n, v ri gi phng
thc Print thc hin tc v in. B thc thi s pht sinh cc s kin BeginPrint, PrintPage,
v EndPrint ca lp PrintDocument trn mt tiu trnh mi. Bn th l cc s kin ny v s
dng i tng System.Drawing.Graphics xut d liu ra trang. Hnh v text c ghi ra
trang theo cng cch nh bn v ln ca s bng GDI+. Tuy nhin, bn c th cn phi theo
vt v tr ca bn trn trang, v mi phng thc ca lp Graphics u yu cu ta ch nh
ni cn v.
Cc thit lp cho my in c cu hnh thng qua cc thuc tnh
PrintDocument.PrinterSettings v PrintDocument.DefaultPageSettings. Thuc tnh
PrinterSettings tr v mt i tng PrinterSettings ( c m t trong mc 8.12) cho
bit my in s c s dng. Thuc tnh DefaultPageSettings cung cp i tng
PageSettings cho bit phn gii (resolution), l (margin), hng trang (orientation)... Bn
c th cu hnh cc thuc tnh ny trong m lnh, hoc bn c th s dng lp
System.Windows.Forms.PrintDialog ngi dng thc hin cc thay i thng qua hp
thoi in chun ca Windows (xem hnh 8.9). Trong hp thoi in, ngi dng c th chn mt
my in v chn s lng bn in (number of copies). Ngi dng cng c th nhp vo nt
Properties cu hnh cc thit lp nng cao nh cch b tr trang (layout) v phn gii
my in (resolution). Cui cng, ngi dng c th chp thun hoc hy b thao tc in bng
cch nhp OK hoc Cancel.
// nh ngha font.
Font font = new Font("Tahoma", 30);
// Xc nh v tr trn trang.
// Trong trng hp ny, chng ta c cc thit lp l
// (mc d khng c g ngn chng ta vt qua bin l).
float x = e.MarginBounds.Left;
float y = e.MarginBounds.Top;
// In nm dng text.
for (int i=0; i < 5; i++) {
// V hnh.
e.Graphics.DrawImage(Image.FromFile(Application.StartupPath +
"\\test.bmp"), x, y);
}
}
// To vn bn gm 100 dng.
string[] printText = new string[100];
for (int i=0; i < 100; i++) {
printText[i] = i.ToString();
printText[i] +=
": Thp Din Mai Phc (House of Flying Daggers)";
}
e.Graphics.DrawString(doc.Text[doc.Offset], font,
Brushes.Black, x, y);
}else {
// To vn bn gm 100 dng.
string[] printText = new string[100];
for (int i=0; i < 100; i++) {
printText[i] = i.ToString();
printText[i] +=
": The quick brown fox jumps over the lazy dog.";
}
lstZoom.Text = "100";
printPreviewControl.Zoom = 1;
printPreviewControl.Document = doc;
printPreviewControl.Rows = 2;
333
Chng 8: ha, a phng tin, v in n
// Thit lp zoom.
printPreviewControl.Zoom = Single.Parse(lstZoom.Text) / 100;
// Gn li PrintDocument lm ti preview.
printPreviewControl.Document = doc;
}
}
17. Qun l tc v in
Bn cn tm dng hoc phc hi mt tc v in hoc mt hng i in.
S dng Windows Management Instrumentation. Bn c th ly thng tin t
hng i in bng mt truy vn vi lp Win32_PrintJob, v bn c th s dng cc
phng thc Pause v Resume ca cc lp Win32_PrintJob v Win32_Printer
qun l hng i.
Windows Management Instrumentation (WMI) cho php bn ly mt lng ln cc thng tin
h thng bng mt c php ging truy vn. Mt trong cc cng vic m bn c th thc hin
vi WMI l ly danh sch cc tc v in ang ch, cng vi thng tin v mi tc v. Bn cng
c th thc hin cc thao tc nh in v phc hi mt tc v hoc tt c cc tc v cho mt my
in. s dng WMI, bn cn thm mt tham chiu n System.Management.dll.
ng dng di y thc hin mt truy vn WMI ly danh sch tt c cc tc v in ang ch
trn my tnh v hin th ID cho mi tc v trong mt ListBox. Khi ngi dng chn mt
item, mt truy vn y hn s c thc hin, v cc chi tit v tc v in ny c hin th
trong mt TextBox. Cui cng, ngi dng c th nhp nt Pause v Resume sau khi chn mt
tc v thay i trng thi ca n.
using System;
using System.Windows.Forms;
using System.Management;
using System.Collections;
334
Chng 8: ha, a phng tin, v in n
cmdRefresh_Click(null, null);
}
try {
// Chn tc v in ph hp.
string query = "SELECT * FROM Win32_PrintJob " +
"WHERE JobID='" + lstJobs.Text + "'";
ManagementObjectSearcher jobQuery =
new ManagementObjectSearcher(query);
ManagementObjectCollection jobs = jobQuery.Get();
IEnumerator enumerator = jobs.GetEnumerator();
enumerator.MoveNext();
return (ManagementObject)enumerator.Current;
}catch (InvalidOperationException){
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;
}
// Tm dng tc v.
int returnValue = Int32.Parse(
job.InvokeMethod("Pause", null).ToString());
}else {
MessageBox.Show(
"Unrecognized return value when pausing job.");
337
Chng 8: ha, a phng tin, v in n
}
}
if ((Int32.Parse(job["StatusMask"].ToString()) & 1) == 1) {
// Phc hi tc v.
int returnValue = Int32.Parse(
job.InvokeMethod("Resume", null).ToString());
}else if (returnValue == 5) {
MessageBox.Show("Access denied.");
}else {
MessageBox.Show(
"Unrecognized return value when resuming job.");
}
}
}
}
338
Chng 8: ha, a phng tin, v in n
Microsoft Agent l mt k thut dng thm cc nhn vt hot hnh c tnh tng tc vo
ng dng hay trang web. Tnh tng tc l chc nng chnh yu ca k thut Microsoft Agent:
cc nhn vt Microsoft Agent c th ni v p li u vo ca ngi dng thng qua vic
nhn dng v tng hp ging ni. Microsoft s dng k thut ny trong cc ng dng nh
Word, Excel, v PowerPoint; gip ngi dng tm cu tr li cho nhng cu hi v hiu cch
thc hot ng ca ng dng. Microsoft cung cp thng tin v k thut Microsoft Agent ti
[www.microsoft.com/msagent].
iu kim Microsoft Agent cho php ngi dng tng tc vi cc ng dng v trang web
thng qua ging nidng giao tip t nhin nht ca con ngi. Khi ngi dng ni vo
micro, iu kim ny s dng mt b my nhn dng ging niy l ng dng dch m
thanh u vo t micro thnh ngn ng m my tnh hiu c. iu kim Microsoft Agent
339
Chng 8: ha, a phng tin, v in n
Hnh 8.15 Chn Microsoft Agent Control 2.0 trong ca s Customize Toolbox
{
// (B qua phn m designer.)
if (e.KeyCode == Keys.Enter)
{
// Thit lp ni lu tr nhn vt vo txtLocation.
string location = txtLocation.Text;
mSpeaker.Show(0);
}
catch (FileNotFoundException)
{
MessageBox.Show("Invalid character location", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
{
ChangeCharacter(characterCombo.Text);
}
// Xa actionsCombo.
actionsCombo.Items.Clear();
mSpeaker.Commands.RemoveAll();
mSpeaker.Commands.Add(Convert.ToString(enumerator.Current), ""
voiceString, true, false);
}
{
ChangeCharacter(command.Voice);
return;
}
// Gi agent n chut.
if (command.Name == "MoveToMouse")
{
mSpeaker.MoveTo(Convert.ToInt16(Cursor.Position.X - 60),
Convert.ToInt16(Cursor.Position.Y - 60), null);
return;
}
9
347
348
Chng 9: File, th mc, v I/O
C c lp I/O ca Microsoft .NET gm hai loi chnh. Loi th nht truy xut thng tin
t h thng file v cho php thc hin cc thao tc trn h thng file (nh chp file,
chuyn th mc). Hai lp tiu biu l FileInfo v DirectoryInfo. Loi th hai quan
trng hn, gm rt nhiu lp cho php c v ghi d liu t mi kiu stream. Stream c th
tng ng vi mt file nh phn hay vn bn, mt file trong khng gian lu tr ring, mt kt
ni mng, hoc mt vng m b nh. Trong mi trng hp, cch thc tng tc vi stream
u nh nhau. Trong chng ny, chng ta s xem xt cc lp h thng file v cc lp da-
trn-stream.
Cc mc trong chng ny trnh by cc vn sau:
Truy xut v sa i cc thng tin ca mt file hay mt th mc (cc mc 9.1, 9.2, 9.4,
9.5, v 9.16).
Chp, di chuyn, xa file hay th mc (mc 9.3).
Hin th ng mt cy th mc trong mt ng dng da-trn-Windows (mc 9.6) v s
dng cc hp thoi file (mc 9.17).
c v ghi file vn bn (mc 9.7) v file nh phn (mc 9.8), cng nh to file tm
(mc 9.15) v file trong mt khng gian lu tr ring ca ngi dng (mc 9.18).
c file mt cch bt ng b (mc 9.9).
Tm file (mc 9.10) v kim tra hai file c trng nhau hay khng (mc 9.11).
Lm vic vi cc chui c cha thng tin ng dn (mc 9.12 n 9.14).
Theo di s thay i ca h thng file (mc 9.19).
Ghi ra cng COM (mc 9.20).
using System;
using System.IO;
if (args.Length == 0) {
if (file.Exists) {
}
Console.WriteLine();
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();
}
}
// iu kin di y ng, v n ch lc ra
// thuc tnh read-only.
if ((file.Attributes & FileAttributes.ReadOnly) ==
FileAttributes.ReadOnly) {
Console.WriteLine("File is read-only (correct test).");
}
Console.ReadLine();
}
}
To th mc c ch nh. Nu ng dn ch nh nhiu th
Create
mc cha tn ti, tt c s c to mt lt.
To mt th mc vi tn c th bn trong th mc c m t
CreateSubdirectory bi i tng DirectoryInfo. N cng tr v mt i tng
DirectoryInfo m t th mc con.
Lp DirectoryInfo khng c phng thc no dng sao chp th mc. Tuy nhin, bn c
th d dng vit c mt phng thc nh th da trn k thut quy v phng thc
CopyTo ca i tng FileInfo:
using System;
using System.IO;
if (!destination.Exists) {
destination.Create();
}
// Chp tt c file.
FileInfo[] files = source.GetFiles();
foreach (FileInfo file in files) {
file.CopyTo(Path.Combine(destination.FullName, file.Name));
}
// X l cc th mc con.
DirectoryInfo[] dirs = sourceDir.GetDirectories();
foreach (DirectoryInfo dir in dirs) {
// Ly th mc ch.
string destinationDir = Path.Combine(destination.FullName,
dir.Name);
// Gi quy CopyDirectory().
CopyDirectory(dir, new DirectoryInfo(destinationDir));
}
}
}
if (args.Length != 2) {
357
Chng 9: File, th mc, v I/O
Console.WriteLine("usage: " +
"CopyDir [sourcePath] [destinationPath]");
return;
}
FileSystemUtil.CopyDirectory(new DirectoryInfo(sourceDir),
new DirectoryInfo(destinationDir));
Console.WriteLine("Copy complete.");
Console.ReadLine();
}
}
long totalSize = 0;
// Duyt tt c cc th mc con.
if (includeSubdirectories) {
return totalSize;
}
}
if (args.Length == 0) {
}
}
.NET Framework cho php bn truy xut cc thng tin v file m khng cn da vo
Windows API. Bn ch cn s dng lp FileVersionInfo v gi phng thc GetVersionInfo
vi i s l tn file. K , bn c th truy xut thng tin thng qua cc thuc tnh ca
FileVersionInfo.
using System;
using System.Diagnostics;
if (args.Length == 0) {
Console.ReadLine();
}
}
// Mt ngoi l c th b nm nu bn khng c
// quyn thao tc trn file hay th mc.
// Bn c th bt v b qua ngoi l ny.
foreach (DirectoryInfo dirItem in dir.GetDirectories()) {
// Thit lp nt u tin.
TreeNode rootNode = new TreeNode("C:\\");
treeDirectory.Nodes.Add(rootNode);
e.Node.Nodes.Clear();
Fill(e.Node);
}
}
}
7. c v ghi file vn bn
Bn cn ghi d liu vo mt file vn bn theo kiu m ha ASCII, Unicode, hay
UTF-8.
To mt i tng System.IO.FileStream tham chiu n file. ghi file, hy gi
FileStream trong mt System.IO.StreamWriter v s dng phng thc np
chng Write. c file, hy gi FileStream trong mt System.IO.StreamReader
v s dng phng thc Read hay ReadLine.
.NET cho php bn ghi hay c vn bn bng lp StreamWriter v StreamReader. Khi ghi d
liu vi StreamWriter, hy s dng phng thc StreamWriter.Write. Phng thc ny c
np chng h tr tt c cc kiu d liu thng thng trong C# .NET, bao gm chui, k
t, s nguyn, s thc du chm ng, s thp phn,... Tuy nhin, phng thc Write lun
chuyn d liu thnh vn bn. Nu mun chuyn vn bn ny tr v kiu ban u th bn nn
s dng WriteLine bo m mi gi tr c t trn mt dng ring.
C nhiu cch m t mt chui di dng nh phn, ty thuc vo cch m ha. Cc kiu m
ha thng thng l:
ASCIIs dng 7 bit m ha mi k t trong chui. D liu c m ha theo
ASCII khng th cha cc k t Unicode m rng. Khi s dng kiu m ha ASCII
trong .NET, cc bit c m thm mng byte kt qu s c 1 byte cho mi k t.
Full Unicode, hay UTF-16s dng 16 bit m ha mi k t trong chui, nn mng
byte kt qu s c 2 byte cho mi k t.
UTF-7 Unicodes dng 7 bit cho cc k t ASCII bnh thng v nhiu cp 7 bit cho
cc k t m rng. Kiu m ha ny ch yu dng cho cc giao thc 7 bit, chng hn
mail.
UTF-8 Unicodes dng 8 bit cho cc k t ASCII bnh thng v nhiu cp 8 bit cho
cc k t m rng. Mng byte kt qu s c 1 byte cho mi k t (gi s khng c k
t m rng).
.NET cung cp mt lp cho mi kiu m ha trong khng gian tn System.Text. Khi s dng
StreamReader v StreamWriter, bn c th ch nh kiu m ha hoc s dng kiu mc nh
l UTF-8.
Khi c thng tin, s dng phng thc Read hay ReadLine ca lp StreamReader. Phng
thc Read c mt k t, hay s k t do bn ch nh, v tr v mt k t hay mng k t.
Phng thc ReadLine tr v mt chui cha ton b ni dung mt hng.
ng dng Console di y minh ha vic ghi v c mt file vn bn:
using System;
using System.IO;
using System.Text;
// To file mi.
FileStream fs = new FileStream("test.txt", FileMode.Create);
// ng file.
w.Close();
fs.Close();
r.Close();
fs.Close();
365
Chng 9: File, th mc, v I/O
Console.ReadLine();
}
}
// To file v to writer.
FileStream fs = new FileStream("test.txt", FileMode.Create);
BinaryWriter w = new BinaryWriter(fs);
// ng file.
w.Close();
fs.Close();
fs.Close();
Console.ReadLine();
}
}
367
Chng 9: File, th mc, v I/O
9. c file mt cch bt ng b
Bn cn c d liu t mt file m khng phi dng qu trnh thc thi m lnh
ca bn. K thut ny thng c s dng khi file c lu tr trong mt ni
c tc truy xut chm (chng hn mt a mng).
To mt lp c file mt cch bt ng b. Bt u c mt khi d liu bng
phng thc FileStream.BeginRead, v truyn phng thc callback. Khi
callback c kch hot, gi FileStream.EndRead truy xut d liu, x l n,
v c khi d liu k tip vi BeginRead.
FileStream h tr hot ng bt ng b thng qua phng thc BeginRead v EndRead. S
dng cc phng thc ny, bn c th c mt khi d liu trn mt trong cc tiu trnh do
thread-pool cung cp m khng cn s dng trc tip cc lp tiu trnh trong khng gian tn
System.Threading.
Khi c file mt cch bt ng b, bn cn xc nh kch thc khi d liu trong mt ln
c. Ty trng hp, bn c th mun c mt khi d liu nh (v d, chp tng khi mt
sang file khc) hoc khi d liu tng i ln (v d, bn cn mt lng thng tin nht nh
trc khi x l vic g ). Bn ch nh kch thc khi khi gi BeginRead, v truyn mt b
m cha d liu. V BeginRead v EndRead cn truy xut nhiu mu thng tin ging nhau
(chng hn FileStream, b m, kch thc khi,...), bn nn ng gi m lnh c file bt
ng b trong mt lp.
Vi lp AsyncProcessor trong v d di y, phng thc cng khai StartProcess bt u
qu trnh c bt ng b. Mi khi qu trnh c hon tt, OnCompletedRead c kch hot v
khi d liu c x l. Nu cn d liu trong file, mt qu trnh c bt ng b mi s
c khi chy. Kch thc khi b nh l 2 KB (2048 byte).
using System;
using System.IO;
using System.Threading;
// B m cha d liu.
private byte[] buffer;
// Bt u qu trnh c bt ng b.
inputStream.BeginRead(buffer, 0, buffer.Length,
new AsyncCallback(OnCompletedRead), null);
}
// Bt u c khi k tip.
inputStream.BeginRead(buffer, 0, buffer.Length,
new AsyncCallback(OnCompletedRead), null);
}else {
369
Chng 9: File, th mc, v I/O
// Kt thc.
Console.WriteLine("\t[ASYNC READER]: Complete.");
inputStream.Close();
}
}
}
// Xa file th.
File.Delete("test.txt");
}
370
Chng 9: File, th mc, v I/O
if (args.Length != 2) {
Console.WriteLine(
371
Chng 9: File, th mc, v I/O
Console.ReadLine();
}
}
using System.Security.Cryptography;
if (args.Length != 2) {
Console.WriteLine("USAGE: CompareFiles [fileName] " +
[fileName]");
return;
}
// To i tng bm.
HashAlgorithm hashAlg = HashAlgorithm.Create();
// So snh m bm.
if (BitConverter.ToString(hashBytesA) ==
BitConverter.ToString(hashBytesB)) {
Console.WriteLine("Files match.");
}else {
Console.WriteLine("No match.");
}
373
Chng 9: File, th mc, v I/O
Console.ReadLine();
}
}
Cc m bm c so snh bng cch chuyn chng thnh chui. Bn cng c th duyt qua
mng v so snh tng byte. Cch ny nhanh hn mt t, nhng vic chuyn 20 byte thnh
chui khng tn nhiu chi ph nn khng cn thit.
// filename by gi l "MyFile.txt".
filename = Path.GetFileName(filename);
fullPath = Path.Combine(fullPath, filename);
// fullPath by gi l "c:\Temp\myfile.txt".
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();
}
}
Path.GetFullPath("file.txt") + "'");
Console.WriteLine();
Console.ReadLine();
}
}
15. To file tm
Bn cn to mt file s c t trong th mc tm ca ngi dng c th v s
c tn duy nht, n khng ng vi cc file tm c sinh ra bi cc
chng trnh khc.
S dng phng thc tnh GetTempFileName ca lp System.IO.Path, phng thc
ny tr v mt ng dn kt hp ng dn n th mc tm vi mt tn file
c to nhu nhin.
C nhiu cch to file tm. Trong cc trng hp n gin, bn ch cn to mt file trong
th mc ng dng, c th s dng mt GUID hoc mt tem thi gian kt hp vi mt gi tr
ngu nhin lm tn file. Tuy nhin, lp Path h tr mt phng thc gip bn tn cng
hn. N s to ra mt file vi tn duy nht trong th mc tm ca ngi dng hin hnh,
chng hn C:\Documents and Settings\username\Local Settings\Temp\tmpac9.tmp.
377
Chng 9: File, th mc, v I/O
using System;
using System.IO;
// (Ghi d liu.)
fs.Close();
// Xa file.
File.Delete(tempFile);
Console.ReadLine();
}
}
[DllImport("kernel32.dll", EntryPoint="GetDiskFreeSpaceExA" )]
private static extern long GetDiskFreeSpaceEx(
string lpDirectoryName, out long lpFreeBytesAvailableToCaller,
out long lpTotalNumberOfBytes, out long lpTotalNumberOfFreeBytes);
if (result != 0) {
if (dlg.ShowDialog() == DialogResult.OK) {
rtDoc.LoadFile(dlg.FileName);
rtDoc.Enabled = true;
}
}
if (dlg.ShowDialog() == DialogResult.OK) {
rtDoc.SaveFile(dlg.FileName);
}
}
this.Close();
}
382
Chng 9: File, th mc, v I/O
Console.ReadLine();
}
}
Theo mc nh, mi khng gian lu tr ring c tch bit bi ngi dng v assembly.
iu ny c ngha l khi cng mt ngi chy cng mt ng dng, ng dng ny s truy xut
d liu trong cng khng gian lu tr ring. Tuy nhin, bn c th tch bit thm bi min
ng dng nhiu th hin ca cng mt ng dng nhn cc khng gian lu tr ring khc
nhau, nh v d sau:
// Truy xut khng gian lu tr ring ca ngi dng
// v assembly hin ti (tng t v d trn).
store = IsolatedStorageFile.GetStore(IsolatedStorageScope.User |
IsolatedStorageScope.Assembly, null, null);
// Cu hnh FileSystemWatcher.
FileSystemWatcher watch = new FileSystemWatcher();
watch.Path = Application.StartupPath;
watch.Filter = "*.*";
watch.IncludeSubdirectories = true;
if (File.Exists("test.bin")) {
File.Delete("test.bin");
}
try {
// Cu hnh cho cng.
387
Chng 9: File, th mc, v I/O
port.BaudRate = 9600;
port.Parity = 0;
port.PortNum = 1;
port.ReadTimeout = 10;
port.StopBits = 1;
port.ByteSize = 1;
// M cng.
port.Open();
// Ghi d liu.
port.Write(new byte[1]);
// ng cng.
port.Close();
Console.WriteLine(err.Message);
}
388
Chng 9: File, th mc, v I/O
389
10
390
391
Chng 10: C s d liu
T rong Microsoft .NET Framework, vic truy xut n cc loi data-source (ngun d
liu) c cho php thng qua mt nhm cc lp c tn l Microsoft ADO.NET. Mi
loi data-source c h tr thng qua mt data-provider (b cung cp d liu). Mi
data-provider gm tp cc lp khng ch hin thc tp giao din chun, m cn cung cp chc
nng duy nht ca data-source m n h tr. Cc lp ny m t v kt ni, cu lnh, thng s,
data-adapter (b iu hp d liu), v data-reader (b c d liu) m qua , bn c th
tng tc vi mt loi data-source. Bng 10.1 lit k cc hin thc data-provider trong .NET.
Bng 10.1 Cc hin thc data-provider trong .NET Framework
Data-provider M t
.NET Framework
Cung cp kt ni n Oracle. Cc lp data-provider nm trong khng
Data Provider
gian tn System.Data.OracleClient v c tin t Oracle.
for Oracle
Cung cp kt ni n Microsoft SQL Server phin bn 7 v mi hn
.NET Framework
(gm c MSDE) bng cch lin lc trc tip vi SQL Server m khng
Data Provider
cn s dng ODBC hay OLE DB. Cc lp data-provider nm trong
for SQL Server
khng gian tn System.Data.SqlClient v c tin t Sql.
.NET Compact
Cung cp kt ni n Microsoft SQL Server CE. Cc lp data-provider
Framework Data
nm trong khng gian tn System.Data.SqlServerCe v c tin t
Provider for SQL
SqlCe.
Server CE
1. Kt ni c s d liu
Bn cn m mt kt ni n mt c s d liu.
To mt i tng kt ni ph hp vi kiu c s d liu m bn cn kt ni; tt
c cc i tng kt ni u hin thc giao din System.Data.IDbConnection. Cu
hnh i tng kt ni bng cch thit lp thuc tnh ConnectionString ca n.
M kt ni bng cch gi phng thc Open ca i tng kt ni.
Bc u tin trong vic truy xut c s d liu l m mt mt kt ni n c s d liu. Giao
din IDbConnection m t mt kt ni c s d liu, v mi data-provider cha mt hin thc
duy nht. Di y l danh sch cc hin thc IDbConnection cho nm data-provider chun:
System.Data.Odbc.OdbcConnection
System.Data.OleDb.OleDbConnection
System.Data.OracleClient.OracleConnection
System.Data.SqlServerCe.SqlCeConnection
System.Data.SqlClient.SqlConnection
// M kt ni c s d liu.
con.Open();
// M kt ni c s d liu.
con.Open();
2. S dng connection-pooling
Bn mun duy tr mt pool cha cc kt ni ang m ci thin hiu nng v
tnh quy m cho mt h thng ln.
Cu hnh pool bng cch s dng cc thit lp trong chui kt ni ca i tng
kt ni.
Connection-pooling lm gim ng k tng ph lin hp vi vic to v hy kt ni c s d
liu. Connection-pooling cng ci thin tnh quy m ca cc gii php bng cch gim s
lng kt ni ng thi m mt c s d liu phi duy tra s thng ngi khng sut
mt phn ng k thuc thi gian sng ca chng. Vi connection-pooling, thay v to v m
mt i tng kt ni mi mi khi cn, bn c th ly kt ni m t pool. Khi bn hon
tt vic s dng kt ni, thay v ng n, bn tr n v cho pool v cho php on m khc s
dng n.
Theo mc nh, SQL Server v Oracle Data Provider cung cp chc nng connection-pooling.
Mt pool s hin din i vi mi chui kt ni do bn ch nh khi m mt kt ni mi. Mi
khi bn m mt kt ni mi vi chui kt ni c s dng qua, n s c ly t pool
395
Chng 10: C s d liu
// M kt ni c s d liu.
con.Open();
// M kt ni c s d liu.
con.Open();
ODBC v OLE DB Data Provider cng h tr connection-pooling, nhng chng khng hin
thc connection-pooling bn trong cc lp .NET, nn bn khng th cu hnh pool theo cch
nh SQL Server hay Oracle Data Provider. Connection-pooling trong ODBC c qun l
bi ODBC Driver Manager v c cu hnh bng cng c ODBC Data Source
Administrator trong Control Panel. Connection-pooling trong OLE DB c qun l bi hin
thc OLE DB nguyn sinh; bn c th lm mt hiu lc pooling bng cch thm thit lp OLE
DB Services=-4; vo chui kt ni. SQL Server CE Data Provider khng h tr connection-
pooling, v ti mt thi im SQL Server CE ch h tr mt kt ni.
if (result == 1) {
Console.WriteLine("Employee title updated.");
} else {
Console.WriteLine("Employee title not updated.");
}
}
while (reader.Read()) {
Nu mun thc thi mt truy vn, nhng ch cn gi tr thuc ct u tin ca hng u tin
trong d liu kt qu, bn hy s dng phng thc ExecuteScalar. Gi tr tr v l mt tham
chiu i tng v bn cn p n v ng kiu. Di y l v d:
public static void ExecuteScalarExample(IDbConnection con) {
Cc hin thc IDbCommand trong Oracle v SQL Data Provider c hin thc cc
phng thc thc thi cu lnh b sung. Mc 10.6 s m t cch s dng phng
thc ExecuteXmlReader do lp SqlCommand cung cp. Bn hy tham kho ti liu
.NET Frameworks SDK bit thm chi tit v cc phng thc b sung
ExecuteOracleNonQuery v ExecuteOracleScalar do lp OracleCommand cung cp.
System.Data.Odbc.OdbcParameter
System.Data.OleDb.OleDbParameter
System.Data.OracleClient.OracleParameter
System.Data.SqlServerCe.SqlCeParameter
System.Data.SqlClient.SqlParameter
IsNullable Gi tr bool, cho bit thng s c chp nhn gi tr null hay khng.
ParameterName Chui cha tn thng s.
Value i tng cha gi tr ca thng s.
Khi s dng thng s thc thi th tc tn tr, bn phi cung cp cc i tng thng s p
ng cho mi i s do th tc tn tr yu cugm c i s input v output. Bn phi thit
lp thuc tnh Direction ca mi thng s nh c m t trong bng 10.4 (mc nh l
Input). Nu th tc tn tr c gi tr tr v, thng s gi gi tr tr v (vi thuc tnh
Direction l ReturnValue) phi l thng s u tin c thm vo tp hp thng s. V d
di y s dng thng s thc thi th tc tn tr:
public static void StoredProcedureExample(SqlConnection con,
string category, string year) {
Data-reader Server v Oracle cng cha cc phng thc thc hin vic ly d liu thuc cc
kiu d liu c trng ca data-source. V d, SqlDataReader cha cc phng thc nh
GetSqlByte, GetSqlDecimal, v GetSqlMoney, v OracleDataReader cha cc phng thc nh
GetOracleLob, GetOracleNumber, v GetOracleMonthSpan. Bn hy tham kho ti liu .NET
Framework SDK bit thm chi tit.
Khi hon tt vi data-reader, bn nn gi phng thc Close c th s dng li kt ni
c s d liu. IDataReader tha k System.IDisposable; ngha l mi lp data-reader u
hin thc phng thc Dispose. Phng thc ny s t ng gi Close, cho nn lnh using l
mt cch rt r rng v hiu qu khi s dng data-reader.
406
Chng 10: C s d liu
// X l tp kt qu u tin
// v hin th ni dung ca tp kt qu.
Console.WriteLine("Employee Birthdays (By Age).");
407
Chng 10: C s d liu
while (reader.Read()) {
}
}
Console.ReadLine();
}
}
try {
// M kt ni c s d liu.
con.Open();
while (reader.Read()) {
reader.MoveToAttribute(i);
Console.Write(" {0}: {1}",
reader.Name, reader.Value);
}
410
Chng 10: C s d liu
reader.MoveToElement();
Console.WriteLine();
}
}
} catch (Exception ex) {
Console.WriteLine(ex.ToString());
} finally {
// Bo m reader ng.
if (reader != null) reader.Close();
}
}
Console.ReadLine();
}
}
// M kt ni c s d liu.
con.Open();
doc.DocumentElement.AppendChild(newNode);
newNode = doc.ReadNode(reader);
}
}
Th vin lp .NET Framework khng c chc nng tm cc SQL Server cha bit; tuy nhin,
cng vic ny khng my kh khn vi Microsoft SQLDMO Object Library (c truy xut
qua COM Interop). Mc 15.6 s trnh by chi tit cch to mt Interop Assembly thc hin
vic truy xut n mt thnh phn COM. Nu ang s dng Microsoft Visual Studio .NET,
bn hy thm mt tham chiu n Microsoft SQLDMO Object Library c lit k trong th
COM ca hp thoi Add Reference (xem hnh 10.1).
Hnh 10.1 Chn Microsoft SQLDMO Object Library trong hp thoi Add Reference
// X l tp hp NameList.
if (names.Count == 0) {
} else {
Console.ReadLine();
}
}
Khng c OLE DB provider hay provider c-qun-l no cho Excel. Tuy nhin, bn c th
s dng Microsoft Excel ODBC Driver (c ci t mc nh cng vi Excel) kt hp vi
ODBC .NET provider (i km vi .NET Framework 1.1 v Visual Studio .NET 2003).
Trong chui kt ni, bn cn ch nh driver m bn ang s dng v tn file Excel. V d
di y ch n file test.xls trong th mc startup ca ng dng:
private string ConnectionString = "Driver={Microsoft Excel Driver
(*.xls)};DriverId=790;Dbq=" + Application.StartupPath + "\\test.xls;";
Sau khi kt ni, bn c th thc hin hai kiu thao tc: SELECT hay INSERT. Thay v s dng
bng, bn chn hay chn da vo tn sheet. Tn sheet phi kt thc bng du la ( $) v c
t trong du ngoc vung (nu khng, s sinh ra li c php). nh dng b b qua, v hng
u tin t ng c s dng lm cc tn ct.
V d di y trch v hin th tt c cc hng trong Sheet1. Hnh 10.2 l file Excel gc. Hnh
10.3 l d liu c trnh by trn form.
private void ExcelView_Load (System.Object sender, System.EventArgs e)
{
try
{
Con.Open();
Adapter.Fill(Ds, "Sheet1");
}
catch (Exception Err)
{
MessageBox.Show(Err.ToString());
}
finally
{
Con.Close();
}
grid.DataSource = Ds.Tables["Sheet1"];
}
415
Chng 10: C s d liu
8. Thm bng Categories v Products vo danh sch Selected Item(s) (xem hnh 10.9).
Nhp Next.
420
Chng 10: C s d liu
10. Trong ca s k, chng ta chn cc bng v cc trng d liu cn hin th. Gi nguyn
tt c cc trng d liu tr trng Picture thuc bng Categories (xem hnh 10.11).
Nhp Next.
11. Chng ta mun hin th tt c cc bn ghi trong mt khung li, cho nn gi nguyn
cc thit lp mc nh (xem hnh 10.12). Nhp Finish kt thc trnh thut s. Sau vi
giy, DataForm mi s c kt sinh v hin th (xem hnh 10.13).
12. Cui cng, bn phi bo cho ng dng bit form Data Form Wizard s l i tng
startup. Nhp phi vo d n trong Solution Explorer, v chn Properties. Chn
DataFormWiz.DataForm1 t danh sch Startup object. Nhp OK.
2. Crystal Report Wizard s nhc ta chn kiu bo co cn xy dng (xem hnh 10.17).
Gi nguyn bo co chun mc nh, ri nhp OK.
4. Bn s thy hp thoi OLE DB (ADO) (xem hnh 10.19). Chn Microsoft OLE DB
Provider for SQL Server, ri nhp Next.
427
Chng 10: C s d liu
Hnh 10.22 Kha chnh trong Categories c nh x n kha ngoi trong Products
10. Nhp Next nhiu ln chp nhn cc thit lp mc nh cho cc th Total, Top N,
Chart, v Select. Khi n th cui cng (th Style), g tiu Category - Product
Report (xem hnh 10.25).
431
Chng 10: C s d liu
11
436
437
Chng 11: Lp trnh mng
.NET Framework cung cp vi c ch dng gi d liu thng qua HTTP. Mt trong nhng
cch d nht l s dng lp System.Net.WebClient. N cung cp nhng phng thc mc-cao
nh DownloadFile v UploadFile. Cc phng thc ny khng c s h tr ni ti no cho
giao tip bt ng b, hay xc thc. Nu cn cc tnh nng ny, bn c th s dng cc chc
nng phc tp hn do lp WebRequest v WebResponse cung cp (s c m t trong mc
11.2 v 11.3).
Chng trnh v d di y s download file winXP.gif t localhost v lu vo a.
using System;
using System.Net;
using System.IO;
string remoteUri =
"http://localhost/winXP.gif";
string localFileName = "winXP.gif";
Console.ReadLine();
}
}
string picUri =
"http://localhost/winXP.gif";
string htmlUri =
"http://localhost/iishelp/iis/misc/default.asp";
// To yu cu.
WebRequest requestPic = WebRequest.Create(picUri);
WebRequest requestHtml = WebRequest.Create(htmlUri);
// c response stream.
Image downloadedImage =
Image.FromStream(responsePic.GetResponseStream());
StreamReader r =
new StreamReader(responseHtml.GetResponseStream());
string htmlContent = r.ReadToEnd();
r.Close();
// Hin th nh.
picBox.Image = downloadedImage;
Mt s website yu cu thng tin xc thc t ngi dng. Khi kt ni thng qua trnh duyt,
thng tin ny c th c cung cp mt cch trong sut (v d, mt intranet-site cc b c s
dng Integrated Windows authentication), hoc trnh duyt c th yu cu thng tin ny thng
qua mt hp thoi ng nhp. Khi truy xut mt trang web bng lp trnh th m lnh ca bn
cn phi cung cp cc thng tin ny.
441
Chng 11: Lp trnh mng
requestC.ClientCertificates.Add(cert);
// (By gi bt u ly v x l p ng.)
}
}
.NET Framework khng cung cp iu kim no dng dch ni dung HTML. Tuy nhin,
chc nng ny li rt cn thit cho vic hin th mt ni dung HTML cc b (k c nhng ti
liu HTML ng gi theo nh dng file tr gip ca Windows) cng nh cc thng tin no
t web.
hin th mt trang HTML, bn c th thm mt ca s Internet Explorer vo ng dng
da-trn-Windows. Ca s ny khng ch h tr HTML, m cn h tr JavaScript, Microsoft
Visual Basic Scripting Edition (VBScript), ActiveX control, v rt nhiu plug-in khc, ty
thuc vo cu hnh h thng ca bn (c th gm c Microsoft Word, Microsoft Excel, v
Adobe Acrobat Reader). Bn cn c th s dng iu kim Web Browser duyt mt th
mc trong a cc b, hay hin th cc file trn mt FTP (File Transfer Protocol) site.
thm Web Browser vo mt d n trong Microsoft Visual Studio .NET, bn hy nhp phi
vo hp cng c v chn Add/Remove Items. Sau , chn th COM Components, v chn
Microsoft Web Browser (xem hnh 11.2). Theo , iu kim Microsoft Web Browser s c
thm vo hp cng c. Khi bn th iu kim ny vo form, cc Interop Assembly cn thit s
c to ra v thm vo d n ca bn.
443
Chng 11: Lp trnh mng
Hnh 11.2 Chn Microsoft Web Browser trong hp thoi Customize Toolbox
explorer.GoHome();
}
try {
explorer.GoForward();
} catch {
MessageBox.Show("Already on last page.");
}
}
try {
explorer.GoBack();
} catch {
MessageBox.Show("Already on first page.");
}
}
}
Console.ReadLine();
}
}
foreach (IPAddress ip in
Dns.GetHostByName("www.microsoft.com").AddressList) {
Console.ReadLine();
}
}
7. Ping mt a ch IP
Bn mun kim tra mt my tnh c online hay khng v o thi gian p ng
(response time) ca n.
Gi mt thng ip ping. Thng ip ny c gi bng giao thc Internet
Control Message Protocol (ICMP) vi mt raw-socket.
Mt thng ip ping giao tip vi mt thit b ti mt a ch IP c th, gi mt thng ip
th nghim, v yu cu thit b ny p ng li. o thi gian kt ni gia hai my tnh, bn
c th o thi gian cho mt p ng.
Mc d thng ip ping n gin hn cc kiu giao tip khc, nhng hin thc mt tin ch
ping trong .NET i hi mt lng ln m lnh networking mc-thp v phc tp. Th vin
lp .NET khng c sn gii php nothay vo , bn phi s dng raw-socket v mt s
m lnh cc k di.
Tuy nhin, c t nht mt nh pht trin gii quyt c vn ping. Di y l m
lnh do Lance Olson, mt nh pht trin ca Microsoft, cung cp. M lnh ny cho php
ping mt host bng tn hay a ch IP v o lng mili-giy cho mt p ng.
using System;
using System.Net;
using System.Net.Sockets;
// To mt raw-socket.
Socket socket = new Socket(AddressFamily.InterNetwork,
SocketType.Raw, ProtocolType.Icmp);
// To packet.
int PacketSize = 0;
IcmpPacket packet = new IcmpPacket();
for (int j = 0; j < 1; j++) {
packet.Type = ICMP_ECHO;
packet.SubCode = 0;
packet.CheckSum = UInt16.Parse("0");
packet.Identifier = UInt16.Parse("45");
packet.SequenceNumber = UInt16.Parse("0");
PacketSize = PingData + 8;
cksum_buffer[i] = BitConverter.ToUInt16(icmp_pkt_buffer,
icmp_header_buffer_index);
icmp_header_buffer_index += 2;
}
// Tun t ha packet.
byte[] sendbuf = new byte[PacketSize];
index = Serialize(packet, sendbuf, PacketSize, PingData);
// Bt u tnh gi.
dwStart = System.Environment.TickCount;
socket.SendTo(sendbuf, PacketSize, 0, epServer);
Console.ReadLine();
}
}
Th nghim ping cho php bn xc minh cc my tnh khc c online hay khng. N cng
c th hu ch khi ng dng ca bn cn nh gi nhng my tnh khc nhau ( xa) nhng
cho cng ni dung xc nh my no c thi gian giao tip mng thp nht.
TCP l mt giao thc ng tin cy da-trn-kt-ni, cho php hai my tnh giao tip thng qua
mt network. to mt kt ni TCP, mt my tnh phi ng vai tr l server v bt u
lng nghe trn mt endpoint c th (endpoint c nh ngha l mt a ch IP, cho bit my
tnh v s port). Mt my tnh khc phi ng vai tr l client v gi mt yu cu kt ni n
endpoint m my tnh th nht ang lng nghe trn . Mt khi kt ni c thit lp, hai my
tnh c th trao i cc thng ip vi nhau. C hai my tnh ch n gin c/ghi t mt
System.Net.Sockets.NetworkStream.
try {
// i yu cu kt ni, v tr v TcpClient.
TcpClient client = listener.AcceptTcpClient();
Console.WriteLine("Connection accepted.");
// To BinaryReader c t stream.
BinaryReader r = new BinaryReader(stream);
if (r.ReadString() == ClientMessages.RequestConnect) {
w.Write(ServerMessages.AcknowledgeOK);
Console.WriteLine("Connection completed.");
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.");
Console.ReadLine();
}
}
try {
// To BinaryReader c t stream.
BinaryReader r = new BinaryReader(stream);
w.Write(ClientMessages.RequestConnect);
if (r.ReadString() == ServerMessages.AcknowledgeOK) {
Console.WriteLine("Connected.");
Console.WriteLine("Press Enter to disconnect.");
Console.ReadLine();
Console.WriteLine("Disconnecting...");
456
Chng 11: Lp trnh mng
w.Write(ClientMessages.Disconnect);
} else {
Console.WriteLine("Connection not completed.");
}
// ng connection socket.
client.Close();
Console.WriteLine("Port closed.");
} catch (Exception err) {
Console.WriteLine(err.ToString());
}
Console.ReadLine();
}
}
Disconnecting...
Port closed.
457
Chng 11: Lp trnh mng
9. Ly a ch IP ca client t kt ni socket
ng dng server cn xc nh a ch IP ca client sau khi n chp nhn mt kt
ni.
S dng phng thc AcceptSocket ca lp TcpListener ly lp mc-thp l
System.Net.Sockets.Socket thay v l TcpClient. S dng thuc tnh
Socket.RemoteEndPoint ly a ch IP ca client.
Lp TcpClient khng cho php bn thu ly socket nm di hay bt c thng tin no v port
v a ch IP ca client. Lp ny c cung cp thuc tnh Socket, nhng thuc tnh ny l
c-bo-v (protected) v do khng th truy xut c t cc lp phi dn xut. truy
xut socket nm di, bn c hai ty chn:
To mt lp ty bin dn xut t TcpClient. Lp ny c th truy xut thuc tnh c-
bo-v Socket v trng n ra thng qua mt thuc tnh mi. Sau , bn phi s dng
lp ty bin ny thay cho TcpClient.
B qua lp TcpClient bng cch s dng phng thc TcpListener.AcceptSocket. Bn
vn c th s dng cc lp mc-cao l BinaryReader v BinaryWriter c/ghi d
liu, nhng bn cn phi to NetworkStream trc (s dng socket).
Mc ny s dng cch th hai. Di y l phin bn sa i ca server trong mc 11.8:
using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
using SharedComponent;
try {
458
Chng 11: Lp trnh mng
// i yu cu kt ni, v tr v mt Socket.
Socket socket = listener.AcceptSocket();
Console.WriteLine("Connection accepted.");
// To network stream.
NetworkStream stream = new NetworkStream(socket);
// To BinaryReader c t stream.
BinaryReader r = new BinaryReader(stream);
if (r.ReadString() == ClientMessages.RequestConnect) {
w.Write(ServerMessages.AcknowledgeOK);
Console.WriteLine("Connection completed.");
// Ly a ch IP ca client.
Console.WriteLine("The client is from IP address: " +
((IPEndPoint)socket.RemoteEndPoint).Address.ToString());
Console.Write("The client uses local port: " +
((IPEndPoint)socket.RemoteEndPoint).Port.ToString());
Console.WriteLine();
Console.WriteLine("Disconnect request received.");
w.Write(ServerMessages.Disconnect);
} else {
Console.WriteLine("Could not complete connection.");
}
// ng socket.
socket.Close();
459
Chng 11: Lp trnh mng
Console.WriteLine("Connection closed.");
Console.ReadLine();
}
}
cung cp thuc tnh Socket, nhng kh nng truy xut ca n l protected, ngha l bn
khng th truy xut n mt cch trc tip. Thay vo , bn phi dn xut mt lp mi t
TcpListener:
public class CustomTcpListener : TcpListener {
listener.Socket.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout, 1000);
using System.Threading;
using SharedComponent;
this.client = client;
this.ID = ID;
}
// To BinaryReader c t stream.
BinaryReader r = new BinaryReader(stream);
if (r.ReadString() == ClientMessages.RequestConnect) {
w.Write(ServerMessages.AcknowledgeOK);
Console.WriteLine(ID + ": Connection completed.");
while (r.ReadString() != ClientMessages.Disconnect) {}
}else {
Console.WriteLine(ID + ": Could not complete connection.");
}
462
Chng 11: Lp trnh mng
// ng socket.
client.Close();
Console.WriteLine(ID + ": Client connection closed.");
Console.ReadLine();
}
}
K tip, thay i m lnh ca server sao cho n lp lin tc, to ra cc th hin ClientHandler
mi khi cn v chy chng trong cc tiu trnh mi. Di y l m lnh c sa i:
public class TcpServerTest {
TcpListener listener =
new TcpListener(IPAddress.Parse("127.0.0.1"), 8000);
Console.WriteLine("Server: About to initialize port.");
listener.Start();
Console.WriteLine("Server: Listening for a connection...");
int clientNum = 0;
while (true) {
try {
// i yu cu kt ni, v tr v mt TcpClient.
TcpClient client = listener.AcceptTcpClient();
Console.WriteLine("Server: Connection accepted.");
// To mt i tng mi x l kt ni ny.
clientNum++;
ClientHandler handler =
new ClientHandler(client, "Client " +
clientNum.ToString());
if (r.ReadString() == ClientMessages.RequestConnect) {
w.Write(ServerMessages.AcknowledgeOK);
Console.WriteLine(ID + ": Connection completed.");
message = r.ReadString();
if (message == ClientMessages.RequestData) {
}
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();
}
if (asyncResult != null) {
// Mt khi c ghi mt cch bt ng b.
networkStream.EndWrite(asyncResult);
}
Console.WriteLine();
try {
string text;
do {
text = Console.ReadLine();
if (text != "") {
}
} while (text != "");
} catch (Exception err) {
Console.WriteLine(err.ToString());
}
Console.ReadLine();
}
try {
// Nhn d liu (byte).
IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
byte[] data = client.Receive(ref anyIP);
Hi there!
>> Hi there!
SmtpMail.SmtpServer = "test.mailserver.com";
SmtpMail.Send(myMessage);
12
475
476
Chng 12: Dch v Web XML v Remoting
4
in-house system: H thng cng ngh thng tin do phng IT ca mt cng ty xy dng nn.
477
Chng 12: Dch v Web XML v Remoting
<configuration>
<appSettings>
<add key="AppName.ServerName.ServiceName"
value="http://localhost/WebServices/MyService.asmx"/>
</appSettings>
</configuration>
[WebMethod(CacheDuration=60)]
479
Chng 12: Dch v Web XML v Remoting
return DateTime.Now.ToString();
}
}
[WebMethod()]
public DataSet GetProductCatalog() {
[WebMethod()]
public string[] GetProductList() {
// d liu vo mng.
int i = 0;
foreach (DataRow row in dt.Rows) {
names[i] = row["ProductName"].ToString();
i += 1;
}
481
Chng 12: Dch v Web XML v Remoting
return names;
}
if (ds == null) {
// To cc i tng ADO.NET.
SqlConnection con = new SqlConnection(connectionString);
SqlCommand com = new SqlCommand(SQL, con);
SqlDataAdapter adapter = new SqlDataAdapter(com);
ds = new DataSet();
con.Open();
adapter.Fill(ds, "Products");
Trong ASP.NET, dch v Web XML h tr cc phin giao dch t ng (c th c kch hot
trn mi phng thc). Khi c kch hot, bt k ngun d liu no c h tr giao dch
COM+ s t ng c a vo phin giao dch hin hnh khi n c s dng trong m lnh
ca bn. Phin giao dch s t ng c commit khi phng thc web hon tt. Phin giao
dch ny c roll-back khi c bt k ngoi l cha-c-th-l no xy ra hoc bn gi
phng thc SetAbort ca lp System.EnterpriseServices.ContextUtil.
kch hot vic h tr giao dch cho mt phng thc web, bn cn thit lp thuc tnh
TransactionOption ca c tnh WebMethod l RequiresNew. V d, phng thc web (h tr
giao dch) di y s xa cc bn ghi trong mt c s d liu v ri hy b phin giao dch
ny. s dng on m ny, bn phi thm mt tham chiu n
System.EnterpriseServices.dll.
using System;
using System.Data.SqlClient;
using System.Web.Services;
using System.EnterpriseServices;
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
public void FailedTransaction() {
// To kt ni.
SqlConnection con = new SqlConnection(connectionString);
// To cu truy vn SQL.
SqlCommand cmd = new SqlCommand("DELETE * FROM Customers", con);
483
Chng 12: Dch v Web XML v Remoting
V bn cht phi trng thi (stateless) ca giao thc HTTP, nn mt phng thc web ch c
th gp phn lm gc ca mt phin giao dch; ngha l bn khng th a nhiu hn mt
phng thc web vo cng mt phin giao dch. Mc d thuc tnh TransactionOption chp
nhn tt c cc gi tr TransactionOption chun, nhng cc gi tr ny khng mang ngha
nh mong i. V d, Disabled, NotSupported, v Supported u c cng tc dng l v hiu
vic h tr giao dch. Tng t, c Required v RequiresNew u kch hot vic h tr giao
dch v khi chy mt phin giao dch mi. Bn nn s dng RequiresNew trong cc phng
thc web v tn ca n tng xng vi hnh vi tht s (!).
Cng ging nh trang web, dch v Web XML c th c s dng cng vi IIS
authentication. Nhng g bn cn lm l t dch v Web XML vo mt th mc o hn ch
vic truy xut nc danh. Tuy nhin, nu ngi dng c th cung cp cc thng tin nh x n
mt ti khon ngi dng hp l, ngi dng ny s c xc thc v bn c th ly cc
thng tin xc thc ny thng qua i tng WebService.User.
Khc vi trang web, dch v Web XML khng c sn phng thc no thu ly thng tin xc
thc t client v dch v Web XML c thc thi bi cc ng dng khc, ch khng phi bi
ngi dng. Do , ng dng ang tng tc vi dch v Web XML s chu trch nhim nhp
bt k thng tin xc thc cn thit no.
V d sau m phng mt dch v Web XML c thc hin xc thc ngi dng. GetIISUser tr
v ngi dng c IIS xc thc. Nu truy xut nc danh c php th kt qu s l mt
chui rng. Nu truy xut nc danh b t chi th kt qu s l mt chui c dng
[DomainName]\[UserName] hay [ComputerName]\[UserName].
public class AuthenticationTest : System.Web.Services.WebService {
Console.WriteLine(proxy.GetIISUser());
Console.WriteLine(proxy.GetIISUser());
[WebMethod]
public int Wait() {
[MTAThread]
private static void Main() {
Trong trng hp ny, thi gian tri qua nh hn thi gian tr hon tng cng:
Completed after 00:00:20.2591312
Total delay time: 47
localhost.WaitService proxy =
(localhost.WaitService)handle.AsyncState;
int result = proxy.EndWait(handle);
Console.WriteLine("Waited " + result.ToString());
}
7. To lp kh-truy-xut-t-xa
Bn mun to mt lp c th c truy xut t mt ng dng khc hay t mt
my tnh khc trn mng. Tuy vy, bn khng cn tnh tng thch xuyn-nn
v bn mun c hiu nng ti u.
Lm cho lp ny tr thnh kh-truy-xut-t-xa (remotable) bng cch dn xut
t lp System.MarshalByRefObject, v to mt host ng k lp ny vi kin
trc .NET Remoting.
Remoting cho php bn lm cho mt i tng tr nn truy xut c qua cc bin my v
bin tin trnh. Trong khi dch v Web XML l gii php l tng khi bn cn chia s cc chc
489
Chng 12: Dch v Web XML v Remoting
nng qua cc nn hay cc bin tin cy, Remoting l la chn tt nht cho mt h thng m
trong tt c cc thnh phn u c xy dng trn nn .NET v h iu hnh Windows.
s dng .NET Remoting, bn cn cc phn sau (mi phn phi thuc v mt assembly
ring bit):
Lp kh-truy-xut-t-xa Lp ny c th c truy xut t cc ng dng v cc my
tnh khc, v phi dn xut t System.MarshalByRefObject.
ng dng host ng dng ny ng k kiu kh-truy-xut-t-xa vi kin trc .NET
Remoting bng lp RemotingConfiguration (thuc khng gian tn
System.Runtime.Remoting). Min l ng dng host ang chy, cc client xa c th to
ra cc th hin ca lp kh-truy-xut-t-xa.
ng dng client ng dng ny c th to ra cc th hin ca lp kh-truy-xut-t-xa
trong tin trnh ca host v tng tc vi chng. Client s dng lp
RemotingConfiguration ng k cc kiu m n mun truy xut t xa.
Hnh sau m t s tng tc gia ba phn trn. Trong v d ny, ch c mt client. Tuy nhin,
cng c th c nhiu client to ra cc th hin ca lp kh-truy-xut-t-xa cng mt lc.
Trong trng hp ny, mi client s c mt i tng kh-truy-xut-t-xa ca chnh n, v tt
c cc i tng ny s thuc v min ng dng ca host.
Cross-application call
Client Component host
// To cc i tng ADO.NET.
SqlConnection con = new SqlConnection(connectionString);
SqlCommand com = new SqlCommand(SQL, con);
SqlDataAdapter adapter = new SqlDataAdapter(com);
DataSet ds = new DataSet();
return ds.Tables[0];
}
using System;
using System.Runtime.Remoting;
</application>
</system.runtime.remoting>
</configuration>
</application>
</system.runtime.remoting>
493
Chng 12: Dch v Web XML v Remoting
</configuration>
Console.ReadLine();
}
}
<channels>
<channel ref="tcp" port="9080" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
using System.Runtime.Remoting.Channels.Tcp;
using System.Reflection;
// Ly knh Remoting c ng k.
TcpChannel channel =
(TcpChannel)ChannelServices.RegisteredChannels[0];
// Np RemoteObject.dll.
Assembly assembly = Assembly.LoadFrom("RemoteObject.dll");
<channels>
<channel ref="http">
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
tng xa khng th trc tip pht sinh s kin n mt lp bnh thng v lp bnh
thng khng th c truy xut t cc min ng dng khc.
Bn phi thay i cc file cu hnh ca client v server cho php full serialization
(iu ny khng cn thit vi .NET 1.0).
Di y l lp kh-truy-xut-t-xa m bn c th s dng pht sinh mt s kin n
client. Lp ny cung cp phng thc StartTask khi chy mt b nh thi, pht sinh sau
mt thi gian ngn (khong 10 giy). Khi b nh thi pht sinh, i tng kh-truy-xut-t-
xa dng ln s kin TaskComplete.
using System;
using System.Timers;
tmr.Interval = 10000;
tmr.Elapsed += new ElapsedEventHandler(tmrCallback);
tmr.Start();
}
tmr.Enabled = false;
if (TaskComplete != null) {
TaskComplete(this,
new TaskCompleteEventArgs("Task completed on server"));
}
}
return null;
}
}
[Serializable()]
public class TaskCompleteEventArgs : EventArgs {
// Th l s kin xa.
public void OnTaskComplete(object sender,
RemoteObject.TaskCompleteEventArgs e) {
TaskComplete(sender, e);
}
using System;
using System.Windows.Forms;
using System.Runtime.Remoting;
RemoteObject.RemoteObject remoteObj;
EventListener.EventListener listener;
RemotingConfiguration.Configure("Client.exe.config");
remoteObj = new RemoteObject.RemoteObject();
listener = new EventListener.EventListener();
}
remoteObj.StartTask();
MessageBox.Show("Task has been started.");
}
c th lm vic, bn phi chc rng client ang s dng cc knh hai chiu. Do , th
<channel> trong file cu hnh phi trng ging nh sau:
<channel ref="tcp" port="0" />
V khng c ging nh cc v d di y:
<channel ref="tcp server" port="0" />
<channel ref="tcp client" port="0" />
Ngoi ra, bn phi kch hot vic h tr full serialization. Nu khng, server s khng c
php nhn y nhim cho phng thc Listener.TaskCompleted, v s khng th kt ni n
phng thc th l s kin xa. kch hot vic h tr full serialization bn server, bn
cn thay i file cu hnh ca host nh sau:
<configuration>
<system.runtime.remoting>
<application>
<client url="tcp://localhost:9080/Server">
<activated type="RemoteObject.RemoteObject, RemoteObject"/>
</client>
<channels>
<channel ref="tcp" port="0">
<serverProviders>
<formatter ref="binary" typeFilterLevel="Full" />
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
<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>
<service>
<wellknown
mode = "Singleton"
type="RemoteObjects.RemoteObject, RemoteObjects"
objectUri="RemoteObject" />
</service>
<channels>
<channel ref="tcp" port="9080" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
return lease;
}
Nu mun i tng c thi gian sng v hn, bn ch cn tr v mt tham chiu null thay v
l i tng ILease. Trng hp thng thng nht l bn mun to mt i tng n-nht
chy c lp (v lu di) ngay c khi client khng s dng n.
<wellknown mode="SingleCall"
type="RemoteObjects.RemoteObject, RemoteObjects,
Version 1.0.0.1, Culture=neutral,
PublicKeyToken=8b5ed84fd25209e1"
objectUri="RemoteObj" />
<wellknown mode="SingleCall"
type="RemoteObjects.RemoteObject, RemoteObjects,
Version 2.0.0.1, Culture=neutral,
PublicKeyToken=8b5ed84fd25209e1"
objectUri="RemoteObj_2.0" />
</service>
<channels>
<channel ref="tcp server" port="9080" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
File cu hnh ca client khng phi thay i g ht (tr vic cp nht URI, nu cn). Client
chn phin bn m n mun s dng bng URI tng ng.
[WebMethod()]
public void DoLongTaskWithWait() {
// (Bt u mt tc v ko di v khin client phi i.)
Delay(10);
}
[WebMethod, SoapDocumentMethod(OneWay=true)]
public void DoLongTaskWithoutWait() {
507
Chng 12: Dch v Web XML v Remoting
V d trn gi nh dch v Web XML v client ang s dng SOAP document (mc nh).
Nu ang s dng Remote Procedure Call (RPC), bn hy s dng c tnh tng ng l
SoapRpcMethod nh du phng thc mt chiu.
to mt phng thc mt chiu trong mt thnh phn trn Remoting, bn cn p dng c
tnh OneWay (thuc khng gian tn System.Runtime.Remoting.Messaging) cho phng thc
thch hp. on m di y trnh by mt v d ging nh trn nhng vi mt thnh phn
xa:
using System;
using System.Runtime.Remoting.Messaging;
[OneWay()]
public void DoLongTaskWithoutWait() {
// (Bt u mt tc v ko di nhng khng khin client phi i.)
Delay(10);
}
b. Trong trng hp ny, client s i dch v Web XML hon tt, nhng n s
i trn mt tiu trnh khc, v do client c th tip tc vi cc cng vic
khc. Vic gi phng thc bt ng b c m t trong mc 12.6.
509
Chng 13:BO MT
13
510
511
Chng 13: Bo mt
5
Mobile code l phn mm c truyn qua mt h thng mng v sau c thc thi trn h thng
cc b.
512
Chng 13: Bo mt
B thc thi ngn m lnh c--tin-cy-mt-phn truy xut cc assembly tn mnh bng cch
t LinkDemand vo tp quyn FullTrust trn mi thnh vin cng-khai (public) v c-bo-
v (protected) ca mi kiu kh-truy-xut-cng-khai c nh ngha trong assembly. iu
ny c ngha l ch nhng assembly c cp cc quyn tng ng vi tp quyn
FullTrust th mi c th truy xut cc kiu v thnh vin trong assembly tn mnh. Vic p
dng AllowPartiallyTrustedCallersAttribute vo assembly tn mnh bo vi b thc thi
khng buc LinkDemand c hiu lc trn cc thnh vin v cc kiu bn trong.
[assembly:AllowPartiallyTrustedCallers]
CAS l phn then cht trong m hnh bo mt ca b thc thi .NET, v cng l phn c trng
ca nn tng .NET m nhiu nn tng khc khng c. Mc d CAS c xy dng vi tiu ch
m bo hiu nng thc thi cao nht v c s dng mt cch cn trng trong th vin
lp .NET, nhng vn c mt chi ph cho mi yu cu bo mt (security demand) v stack walk
(kt qu) m b thc thi phi thc hin.
i lc, bo mt mc-m-lnh c th khng l iu bn bn tm, hoc nhu cu hiu nng c
th vt qu nhu cu CAS. Trong cc trng hp ny, bn c th v hiu hon ton CAS v
loi b chi ph cho vic kim tra bo mt mc-m-lnh. V hiu CAS c tc dng trao cho m
lnh kh nng thc hin bt k hnh ng no m .NET Framework h tr (tng ng vi
tp quyn FullTrust), bao gm kh nng np m lnh khc, gi cc th vin nguyn sinh, v
s dng con tr trc tip truy xut b nh.
// Lu cu hnh.
System.Security.SecurityManager.SavePolicy();
// Lu cu hnh.
System.Security.SecurityManager.SavePolicy();
// Lu cu hnh.
System.Security.SecurityManager.SavePolicy();
// Lu cu hnh.
System.Security.SecurityManager.SavePolicy();
kim tra chng c quyn thc thi hay khng. Tuy nhin, thay i ny s khng nh hng n
cc tin trnh hin c. Do vy, bn phi lu thay i vo Windows Registry (bng phng thc
SavePolicy) n c tc dng vi cc tin trnh mi.
xut hin sau bt k lnh using mc trn no nhng trc bt k khai bo kiu hay khng
gian tn no.
V d di y minh ha mt yu cu quyn ty chn cho tp quyn Internet. y l tp
quyn c nh ngha bi chnh sch bo mt mc nh. Khi b thc thi np
OptionalRequestExample, n s khng cp cho assembly ny bt c quyn no khng nm
trong tp quyn Internet (tham kho ti liu .NET Framework SDK bit thm chi tit v
cc quyn trong tp quyn Internet).
using System.Security.Permissions;
// Lm g ...
}
}
// Lm g ...
}
}
8. Hn ch ai tha k cc lp ca bn
v chp cc thnh vin lp
Bn cn kim sot nhng ai c th tha k cc lp ca bn thng qua s tha k
(inheritance) v mt lp dn xut c th chp nhng thnh vin no.
524
Chng 13: Bo mt
GetHostEnumerator
GetAssemblyEnumerator
Phng thc GetEnumerator tr v mt System.Collections.IEnumerator dng lit k tt
c cc i tng chng c bn trong tp hp Evidence. Phng thc GetHostEnumerator v
GetAssemblyEnumerator tr v mt th hin IEnumerator lit k ch cc i tng chng c t
tp hp tng ng.
V d di y trnh by cch hin th chng c host v chng c assembly ca mt
assembly. Ch rng, tt c cc lp chng c chun u chp phng thc
Object.ToString biu din trng thi ca i tng chng c. Mc d c lin quan nhng
khng phi lc no v d ny cng hin th chng c m mt assembly s c khi c np t
bn trong chng trnh ca bn. Runtime host (nh Microsoft ASP.NET hay Microsoft
Internet Explorer runtime host) c th t gn thm chng c host khi n np mt assembly.
using System;
using System.Reflection;
using System.Collections;
using System.Security.Policy;
// Np assembly c ch nh.
Assembly a = Assembly.LoadFrom(args[0]);
Console.WriteLine(x.Current.ToString());
}
}
}
To mt i tng System.Reflection.Emit.
DefineDynamicAssembly AssemblyBuilder, bn c th s dng n to ng
mt assembly trong b nh.
ExecuteAssembly
Np v thc thi mt assembly c im nhp c
nh ngha (phng thc Main).
// To mt tp hp Evidence mi.
System.Security.Policy.Evidence evidence =
new System.Security.Policy.Evidence();
evidence.AddHost(siteEvidence);
evidence.AddHost(zoneEvidence);
// To mt tp hp Evidence mi.
Evidence evidence = new Evidence();
Ngay c khi cc mc chnh sch cng ty, my, hay ngi dng ch nh code
group LevelFinal (ch th b thc thi khng nh gi cc mc chnh sch thp
hn), b thc thi lun s dng mc chnh sch ca min ng dng tnh grant-
set ca mt assembly.
Ch cc mc chinh sch cng ty, my, v ngi dng l c cu hnh tnh bng
Administrative Tools. V min ng dng khng tn ti bn ngoi ng cnh ca b thc thi nn
khng th cu hnh tnh chnh sch min ng dng c. cu hnh chnh sch bo mt ca
mt min ng dng, bn phi to mt mc chnh sch (bng m lnh) ri gn n cho min
ng dng.
Xy dng mt mc chnh sch bng m lnh c th l mt cng vic lu di, ty thuc vo
phc tp ca chnh sch bo mt m bn cn din t. Lp
System.Security.Policy.PolicyLevel m t mt mc chnh sch bo mt. Bn trong mi i
tng PolicyLevel, bn phi to dng mt cu trc phn cp cc code group, nh ngha cc
iu kin thnh vin, cc tp quyn, v cc c tnh ca mi code group. C rt nhiu kiu
c s dng to dng mc chnh sch, v tho lun v cc kiu ny l vt qu phm vi
quyn sch ny. Lp trnh bo mt .NET, nh cp trc y, cung cp thng tin chi tit
v mi lp ny v trnh by cch xy dng mt mc chnh sch bng m lnh.
Thng thng, bn s pht trin mt cng c tr gip vic to mt mc chnh
sch v ghi nh ngha mc chnh sch ra file; sau , bn c th np nh ngha
ny t a khi cn. Lp PolicyLevel c hai phng thc nhm n gin ha qu
trnh ny: ToXml a mt i tng PolicyLevel v dng d lu tr, v FromXml
xy dng li mt i tng PolicyLevel t dng c lu tr.
Mt khi c i tng PolicyLevel m t chnh sch bo mt nh mong mun, bn c th
gn n cho mt min ng dng. Thu ly tham chiu System.AppDomain n min ng dng m
bn mun cu hnh, v truyn i tng PolicyLevel cho phng thc
AppDomain.SetAppDomainPolicy. M lnh ca bn phi c phn t ControlDomainPolicy ca
SecurityPermission th mi c th gi SetAppDomainPolicy. Bn ch c th gi
SetAppDomainPolicy mt ln trn mi min ng dng; nu bn gi SetAppDomainPolicy ln
th hai, n s nm ngoi l System.Security.Policy.PolicyException.
Bn khng phi gn i tng PolicyLevel cho mt min ng dng trc khi np cc
assembly vo min ng dng ny. Cc assembly c np trc khi bn thit lp chnh sch
bo mt min ng dng c cc grant-set ch da trn cc mc chnh sch: cng ty, my, v
ngi dng. Chnh sch min ng dng ch p dng cho cc assembly c np sau khi n
c cu hnh. Thng thng, bn s dng kh nng ny np cc assembly chia s ng-
tin-cy vo min ng dng m khng b rng buc bi chnh sch min ng dng.
533
Chng 13: Bo mt
// To mt FirstMatchCodeGroup mi dng lm nt gc ca h
// thng phn cp code group. Cu hnh group ny sao cho
534
Chng 13: Bo mt
policy.RootCodeGroup.AddChild(new UnionCodeGroup(
new PublisherMembershipCondition(microsoftCert),
new PolicyStatement(policy.GetNamedPermissionSet("FullTrust"),
PolicyStatementAttribute.Exclusive)
));
policy.RootCodeGroup.AddChild(new UnionCodeGroup(
new PublisherMembershipCondition(litwareCert),
new PolicyStatement(policy.GetNamedPermissionSet("Internet"),
PolicyStatementAttribute.Exclusive)
535
Chng 13: Bo mt
));
policy.RootCodeGroup.AddChild(new UnionCodeGroup(
new PublisherMembershipCondition(fabrikamCert),
new PolicyStatement(policy.GetNamedPermissionSet("Execution"),
PolicyStatementAttribute.Exclusive)
));
System.Security.Principal.IPrincipal
Giao din IIdentity m t thc th m m lnh hin ang chy trn danh ngha ca thc th
ny, chng hn mt ngi dng hoc ti khon dch v (service account). Giao din
IPrincipal m t IIdentity ca thc th v tp cc vai tr m thc th ny thuc v. Mt vai
tr ch l mt s phn loi, dng nhm cc thc th vi cc kh nng bo mt tng t
nhau, chng hn mt nhm ngi dng Windows.
tch hp RBS vi bo mt ngi dng Windows, .NET Framework cung cp hai lp sau
y (hin thc giao din IIdentity v IPrincipal):
System.Security.Principal.WindowsIdentity
System.Security.Principal.WindowsPrincipal
using System;
using System.Security.Principal;
perm.Demand();
}
Mt i tng System.Security.Principal.
UnauthenticatedPrincipal GenericPrincipal rng c to ra v c gn
cho Thread.CurrentPrincipal.
Mt i tng WindowsPrincipal (m t ngi
WindowsPrincipal dng Windows ng nhp) c to ra v
c gn cho Thread.CurrentPrincipal.
Bt k s dng phng php no thit lp IPrincipal cho tiu trnh hin hnh, bn cng
phi lm nh th trc khi s dng cc yu cu bo mt RBS, nu khng thng tin v ngi
dng (IPrincipal) s khng c hiu lc b thc thi c th x l yu cu. Bnh thng, khi
chy trn nn Windows, bn thit lp chnh sch principal ca mt min ng dng l
PrincipalPolicy.WindowsPrincipal thu ly thng tin v ngi dng Windows:
// Thu ly mt tham chiu n min ng dng hin hnh.
AppDomain appDomain = System.AppDomain.CurrentDomain;
perm.Demand();
542
Chng 13: Bo mt
System.Security.Permissions.PrincipalPermission perm2 =
new System.Security.Permissions.PrincipalPermission
(null, @"MACHINE\Developers");
perm1.Union(perm2).Demand();
}
perm.Demand();
}
Phn th hai trnh by ba phng thc c bo v bng cc yu cu RBS khai bo, tng
ng vi cc yu cu RBS bt buc va c trnh by trn:
543
Chng 13: Bo mt
ng dng ny s dng hm LogonUser ca Win32 API thu ly Windows access token cho
ngi dng c ch nh, gi nhn ngi dng ny, ri tr v ng cnh ca ngi dng c.
V d, lnh ImpersonationExample nnbphuong81 password s gi nhn ngi dng
nnbphuong81 nu ngi dng tn ti trong c s d liu ti khon cc b.
using System;
using System.IO;
using System.Security.Principal;
using System.Security.Permissions;
using System.Runtime.InteropServices;
} else {
// ***************************************************************
// Thc hin cc hnh ng vi danh ngha ngi dng c gi nhn
// ***************************************************************
547
Chng 13: Bo mt
Chng 14:MT M
14
549
550
Chng 14: Mt m
1. To s ngu nhin
Bn cn to mt s ngu nhin dng cho cc ng dng mt m v bo mt.
S dng mt b to s ngu nhin mt m (cryptographic random number
generator), chng hn System.Security.Cryptography.RNGCryptoServiceProvider.
Lp System.Random l mt b to s gi ngu nhin, n s dng mt gii thut ton hc m
phng vic to s ngu nhin. Thc ra, gii thut ny l tt nh (deterministic), ngha l bn
lun c th tnh c s k tip s l g da trn s c to trc . iu ny ngha l
cc s c to bi lp Random s khng ph hp khi tnh bo mt c u tin, chng hn to
kha mt ha v password.
Khi cn mt s ngu nhin khng tt nh (nondeterministic) dng trong cc ng dng lin
quan n mt m hay bo mt, bn phi s dng b to s ngu nhin dn xut t lp
551
Chng 14: Mt m
2. Tnh m bm ca password
Bn cn lu tr password ca ngi dng mt cch an ton bn c th s
dng n xc thc ngi dng trong tng lai.
ng lu tr password ca ngi dng dng plaintext v y l mt nguy c
bo mt ln. Thay vo , hy to v lu tr mt m bm ca password bng
mt lp gii thut bm dn xut t lp
System.Security.Cryptography.HashAlgorithm. Khi xc thc, to m bm ca
password v so snh n vi m bm c lu tr.
Cc gii thut bm l cc hm mt m mt chiu, nhn plaintext c chiu di thay i v to
mt gi tr s c kch thc c nh. Chng l mt chiu v gn nh khng th tm li
plaintext gc t m bm. Cc gii thut bm l tt nh (deterministic); p dng cng gii
thut bm cho mt mu plaintext lun to ra cng m bm. iu ny khin m bm tr nn
hu ch cho vic xc nh hai khi plaintext (trong trng hp ny l password) c ging
nhau hay khng. Mc ch ca cc gii thut bm bo m rngmc d khng phi khng
xy rakh nng hai mu plaintext khc nhau to ra cng m bm l cc k nh. Ngoi ra,
khng c mi tng quan no gia s ging nhau ca hai mu plaintext v m bm ca
chng; mt khc bit nh trong plaintext cng c th gy ra khc bit ng k trong m bm.
Khi s dng password xc thc mt ngi dng, bn khng quan tm n ni dung ca
password do ngi dng nhp vo. Bn ch cn bit rng password c nhp trng khp vi
password m bn ghi li cho ngi dng trong c s d liu ti khon. Bn cht ca cc
gii thut bm khin chng tr nn l tng trong vic lu tr password mt cch an ton.
Khi ngi dng cung cp mt password mi, bn phi to m bm ca password v lu tr
m bm ny, ri loi b password dng text. Mi khi ngi dng xc thc vi ng dng ca
bn, tnh m bm ca password do ngi cung cp v so snh n vi m bm m bn
lu tr.
// To HashAlgorithm ca kiu c ch nh bi
// i s dng lnh th nht.
using (HashAlgorithm hashAlg = HashAlgorithm.Create(args[0])) {
554
Chng 14: Mt m
// To m bm ca password.
byte[] hash = hashAlg.ComputeHash(pwordData);
// Hin th m bm ca password.
Console.WriteLine(BitConverter.ToString(hash));
}
}
}
3. Tnh m bm ca file
Bn cn xc nh ni dung ca mt file c thay i theo thi gian hay khng.
To m bm cho ni dung ca file bng phng thc ComputeHash ca lp
System.Security.Cryptography.HashAlgorithm. Lu tr m bm ny sau ny
so snh vi cc m bm c to mi.
Ngoi vic cho php bn lu tr password mt cch an ton ( c tho lun trong mc
14.2), m bm cn cung cp mt phng cch rt hay xc nh mt file c thay i hay
khng. Bng cch tnh ton v lu tr m bm ca mt file, sau ny bn c th tnh li m
bm ca file ny xc nh file c thay i trong thi gian chuyn tip hay khng. Gii thut
bm s sinh ra mt m bm rt khc ngay c ch vi mt thay i rt nh trong file, nn kh
nng hai file khc nhau cho ra cng m bm l cc k nh.
// Hin th m bm.
Console.WriteLine(BitConverter.ToString(hash));
}
}
}
}
4. Kim tra m bm
Bn cn xc minh mt password hoc xc nhn mt file vn khng thay i bng
cch so snh hai m bm.
Chuyn c m bm c v mi thnh chui thp lc phn, chui Base64, hay
mng byte v so snh chng.
556
Chng 14: Mt m
Cui cng, on m di y so snh hai m bm c biu din dng mng byte. Th vin
lp .NET Framework khng c phng thc no thc hin kiu so snh ny, do bn phi
vit mt vng lp so snh cc phn t ca hai mng. on m ny c s dng mt vi k
thut khng tn nhiu thi gian nh: bo m cc mng byte c cng chiu di trc khi bt
u so snh chng, v tr v false khi tm thy khc bit u tin.
// Phng thc dng so snh m bm mi vi
// m bm c sn (c biu din dng mng byte).
private static bool VerifyByteHash(byte[] hash, byte[] oldHash) {
// To mt i tng HMACSHA1
// (truyn key cho phng thc khi dng).
using (HMACSHA1 hashAlg = new HMACSHA1(key)) {
Console.WriteLine(BitConverter.ToString(hash));
}
}
}
}
DES DESCryptoServiceProvider 64
using(SymmetricAlgorithm alg =
SymmetricAlgorithm.Create("3DES")){
key = alg.Key;
iv = alg.IV;
}
Stream destFile =
new FileStream(destFileName, FileMode.Create,
FileAccess.Write);
// To mt CryptoStream mt ha ni dung ca
// Stream ngun khi n c c. Gi phng thc
// CreateEncryptor ca SymmetricAlgorithm
// nhn th hin ICryptoTransform v
// truyn n cho CryptoStream.
CryptoStream cryptoStream = new CryptoStream(srcFile,
alg.CreateEncryptor(),
CryptoStreamMode.Read);
Array.Clear(iv,0,iv.Length);
cryptoStream.Clear();
cryptoStream.Close();
srcFile.Close();
destFile.Close();
}
}
int bufferLength;
byte[] buffer = new byte[1024];
Bn khng th to kha bt i xng bng giao thc truy li kha. Gii thut
mt ha bt i xng (asymmetric encryption) da vo cc mi lin h ton c
th gia cc thnh phn kha cng khai (public key) v kha ring (private key).
Nh th, mi gii thut mt ha bt i xng yu cu bn phi tun theo mt
quy trnh ring c th to ra cc kha mi.
V d di y trnh by cch s dng lp PasswordDeriveBytes to mt kha i xng
gm 64 bit t mt chui password. V d ny yu cu hai i s dng lnh: tn gii thut bm
v password (tn ca cc gii thut bm c lit k trong bng 14.1).
using System;
using System;
using System.Security.Cryptography;
Ch rng, mi khi bn chy cng mt lnh, DerivedKeyExample sinh ra kha khc nhau.
l do tc dng ca salt. Nu bn b i dng lnh gn mt gi tr ngu nhin vo salt (c in
m trong on m trn), sau bin dch li v chy DerivedKeyExample, bn s nhn thy v
d ny lun to ra cng mt kha vi mt password cho trc.
Encrypt v kha cng khai (public key) ca ngi nhn mt ha thng ip.
Sau o, ngi nhn s s dng phng thc RSACryptoServiceProvider.Decrypt
v kha ring (private key) gii mt ha b mt -c-mt-ha.
.NET Framework nh ngha mt h thng phn cp theo lp cho cc gii thut bt i xng
tng t nh nh ngha cho cc gii thut i xng ( c tho lun trong mc 14.6).
Tt c cc gii thut bt i xng phi tha k mt lp c s tru tng chung c tn l
System.Security.Cryptography.AsymmetricAlgorithm. C hai hin thc gii thut bt i
xng c th:
System.Security.Cryptography.RSACryptoServiceProvider
System.Security.Cryptography.DSACryptoServiceProvider
V c ui l CryptoServiceProvider nn c hai lp ny u bc ly cc chc nng do Win32
CryptoAPI cung cp. Tuy nhin, ch c lp RSACryptoServiceProvider l h tr vic mt ha
d liu. Lp DSACryptoServiceProvider hin thc Digital Signature Algorithm (DSA), bn c
th s dng gii thut ny ch to ch k s (xem Federal Information Processing
Standard [FIPS] 186-2 ti [http://www.itl.nist.gov/fipspubs] bit thm chi tit v DSA).
Mc d bn c th to mt i tng gii thut bt i xng bng phng thc tnh Create
ca lp c s AsymmetricAlgorithm, nhng b li bn s phi tr gi cht t cho vic ny. Lp
AsymmetricAlgorithm khng khai bo cc phng thc m RSACryptoServiceProvider s
dng mt ha v gii mt ha d liu. Thay vo , bn phi trc tip th hin ha lp
RSACryptoServiceProvider bng mt trong cc phng thc khi dng ca n.
Trc khi mt ha hay gii mt ha d liu vi i tng RSACryptoServiceProvider, bn cn
truy xut cc kha thch hp. Kha ca gii thut bt i xng khc nhiu so vi kha ca gii
thut i xng. Th nht, n c hai thnh phn: kha cng khai (public key) v kha ring
(private key). Th hai, thay v ch l mt dy cc byte c sinh ngu nhin, kha bt i
xng c to theo mt cch thc c bit. C mt mi quan h ton c bit gia kha cng
khai v kha ring; mi quan h ny cho php gii thut bt i xng mt ha d liu bng
mt kha v gii mt ha d liu bng mt kha khc. Mi gii thut bt i xng s dng
cch thc to kha ca chnh n, v cc lp hin thc c th ng gi cc chc nng cn thit
to ra cc kha mi.
Kha cng khai khng cn c gi b mt v ch s hu c th ty gi n cho bn thng
qua e-mail, hoc post n ln mt website hay mt server phn phi kha mi ngi cng
thy. Nhng ai mun gi b mt th s dng kha cng khai mt ha b mt. Sau , ngi
nhn s dng kha ring gii mt ha b mt. Kha ring phi c gi b mt; nhng ai s
hu kha ring u c th gii mt ha d liu -c-mt-ha bng kha cng khai.
to mt b mt c-mt-ha-bt-i-xng, bn phi c kha cng khai ca ngi nhn v
np n vo mt i tng RSACryptoServiceProvider. C hai cch np kha cng khai:
S dng phng thc RSACryptoServiceProvider.ImportParameters nhp mt cu
trc System.Security.Cryptography.RSAParameters, cu trc ny cha thng tin kha
cng khai ca ngi nhn. Ch s hu c th to cu trc RSAParameters bng phng
thc RSACryptoServiceProvider.ExportParameters v gi n cho bn. Tuy nhin,
ngi ny c th gi cho bn kha cng khai dng byte, v bn phi t np gi tr ny
vo cu trc RSAParameters.
570
Chng 14: Mt m
using System.Text;
using System.Security.Cryptography;
rsaAlg.ImportParameters(rsaParams);
return ciphertext;
}
return plaintext;
}
}
System.Security.Cryptography.RSAPKCS1KeyExchangeFormatter
System.Security.Cryptography.RSAPKCS1KeyExchangeDeformatter
15
585
586
Chng 15: Kh nng lin tc m lnh khng-c-qun-l
[DllImport("kernel32.dll", EntryPoint="GetPrivateProfileString")]
private static extern int GetPrivateProfileString(string lpAppName,
string lpKeyName, string lpDefault, StringBuilder lpReturnedString,
int nSize, string lpFileName);
[DllImport("kernel32.dll", EntryPoint="WritePrivateProfileString")]
588
Chng 15: Kh nng lin tc m lnh khng-c-qun-l
[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);
return buffer.ToString();
} else {
return null;
}
}
589
Chng 15: Kh nng lin tc m lnh khng-c-qun-l
.NET Framework khng che du cc chi tit nm di, chng hn handle dng cho ca s v
iu kim. Mc d khng thng s dng thng tin ny, bn c th ly n khi cn gi mt
hm khng-c-qun-l v hm ny cn n n.
Xt ng dng di y, form chnh lun hin th trn tt c cc ca s khc bt k n c focus
hay khng (c c chc nng ny bng cch thit lp thuc tnh Form.TopMost l true).
Form cn c mt Timer nh k gi cc hm khng-c-qun-l GetForegroundWindow v
GetWindowText ly thng tin ca ca s hin ang c focus. Ngoi ra, handle ca form
chnh c ly thng qua thuc tnh Form.Handle, ri c so snh vi handle ca form hin
ang tch cc kim tra form chnh ang c focus hay khng.
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Text;
[DllImport("user32.dll")]
private static extern int GetForegroundWindow();
[DllImport("user32.dll")]
private static extern int GetWindowText(int hWnd, StringBuilder text,
int count);
lblCaption.Text = buff.ToString();
lblHandle.Text = handle.ToString();
if (new IntPtr(handle) == this.Handle) {
lblCurrent.Text = "True";
} else {
lblCurrent.Text = "False";
}
}
}
}
// (B qua lp OSVersionInfo.)
[DllImport("kernel32.dll")]
public static extern bool GetVersionEx([In, Out] OSVersionInfo osvi);
GetVersionEx(osvi);
Nu chy ng dng ny trn h thng Windows XP, bn s thy thng tin nh sau:
Class size: 148
Major Version: 5
Minor Version: 1
Build Number: 2600
Platform Id: 2
CSD Version: Service Pack 1
Platform: Win32NT
Version: 5.1.2600.0
// Ch k cho hm callback.
public delegate bool CallBack(int hwnd, int lParam);
[DllImport("user32.dll")]
public static extern int GetWindowText(int hWnd,
StringBuilder lpString, int nMaxCount);
Console.ReadLine();
}
[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);
Console.ReadLine();
}
// GetErrorMessage tr v thng ip li
// tng ng vi m li errorCode.
public static string GetErrorMessage(int errorCode) {
if (0 == retVal) {
return null;
} else {
return lpMsgBuf;
}
}
}
object recordsAffected;
ADODB.Recordset rs = con.Execute("SELECT * From Customers",
out recordsAffected, 0);
Console.WriteLine(rs.Fields["CustomerID"].Value);
rs.MoveNext();
}
Console.ReadLine();
}
}
600
Chng 15: Kh nng lin tc m lnh khng-c-qun-l
Console.WriteLine();
Console.WriteLine("Creating new document.");
Console.WriteLine();
Console.ReadLine();
}
}
//
// axMaskEdBox1
//
this.axMaskEdBox1.Location = new System.Drawing.Point(16, 12);
this.axMaskEdBox1.Name = "axMaskEdBox1";
this.axMaskEdBox1.OcxState = ((System.Windows.Forms.AxHost.State)
603
Chng 15: Kh nng lin tc m lnh khng-c-qun-l
(resources.GetObject("axMaskEdBox1.OcxState")));
this.Controls.Add(this.axMaskEdBox1);
Ch rng, cc thuc tnh ty bin ca iu kim ActiveX khng c p dng trc tip thng
qua cc lnh thit lp thuc tnh. Thay vo , chng s c thit lp theo nhm khi thuc
tnh OcxState c thit lp. Tuy nhin, m lnh ca bn c th s dng cc thuc tnh ny
mt cch trc tip.
16
606
607
Chng 16: Cc giao din v mu thng dng
[Serializable]
public class Employee {
using System;
[Serializable]
public class Employee {
[NonSerialized]
private string address;
this.name = name;
this.age = age;
this.address = address;
}
// Thuc tnh cng khai dng truy xut tui ca nhn vin.
public int Age {
get { return age; }
set { age = value; }
}
// Np a ch t kho lu tr.
}
return address;
}
set {
address = value;
}
}
}
Hin thc mt phng thc khi dng khng cng khai (c s dng trong qu trnh
gii tun t ha), phng thc ny nhn cng i s nh phng thc GetObjectData.
Nh rng, nu bn c nh dn xut mt s lp t lp kh-tun-t-ha th phng
thc khi dng ny phi l protected.
Nu bn to mt lp kh-tun-t-ha t mt lp c s cng c hin thc
ISerializable, th phng thc GetObjectData v phng thc khi dng (dng
gii tun t ha) ca bn phi gi cc phng thc tng ng trong lp cha.
Trong qu trnh tun t ha, formatter s gi phng thc GetObjectData v truyn cho n
cc tham chiu SerializationInfo v StreamingContext.
Bn phi d liu cn tun t ha vo i tng SerializationInfo. Lp
SerializationInfo cung cp phng thc AddValue dng thm d liu. Vi mi ln
gi AddValue, bn phi ch nh tn d liu (tn ny s c s dng trong qu trnh
gii tun t ha thu ly d liu). Phng thc AddValue c n 16 phin bn np
chng, cho php bn thm nhiu kiu d liu khc nhau vo i tng
SerializationInfo.
611
Chng 16: Cc giao din v mu thng dng
[Serializable]
public class Employee : ISerializable {
this.name = name;
this.age = age;
this.address = address;
}
612
Chng 16: Cc giao din v mu thng dng
// Phng thc khi dng dng kch hot formatter thc hin vic
// gii tun t ha mt i tng Employee. Bn nn khai bo
// phng thc khi dng ny l private, hay t nht cng l
// protected bo m n khng b gi qu mc cn thit.
private Employee(SerializationInfo info, StreamingContext context) {
inf.AddValue("Address", address);
}
}
return str.ToString();
}
// Hin th Phuong.
Console.WriteLine(phuong);
bf = new BinaryFormatter();
phuong = (Employee)bf.Deserialize(str);
str.Close();
Console.WriteLine(phuong);
Console.ReadLine();
}
Giao din ICloneable nhn dng mt kiu l kh-sao-chp v khai bo phng thc Clone l
mt c ch m thng qua , bn c th thu ly bn sao ca mt i tng. Phng thc
Clone khng nhn i s no v tr v mt System.Object, bt chp kiu ang hin thc l g.
iu ny ngha l mt khi sao mt i tng, bn phi p bn sao v ng kiu.
Cch hin thc phng thc Clone cho mt kiu ty bin ty thuc vo cc thnh vin d liu
c khai bo bn trong kiu. Nu kiu ty bin ch cha cc thnh vin d liu kiu gi tr
(int, byte...) v System.String, bn c th hin thc phng thc Clone bng cch to mt
i tng mi v thit lp cc thnh vin d liu ca n c gi tr ging nh i tng hin
ti. Lp Object (tt c cc kiu u dn xut t y) cha phng thc MemberwiseClone dng
t ng ha qu trnh ny. V d di y trnh by mt lp n gin c tn l Employee,
ch cha cc thnh vin chui. Do , phng thc Clone da vo phng thc tha k
MemberwiseClone to bn sao.
using System;
Name = name;
Title = title;
}
return MemberwiseClone();
}
}
Nu kiu ty bin ca bn c cha cc thnh vin d liu kiu tham chiu, bn phi quyt
nh xem phng thc Clone ca bn s thc hin mt bn sao cn (shallow copy) hay mt
bn sao su (deep copy). Bn sao cn ngha l bt k thnh vin d liu kiu tham chiu no
trong bn sao u s ch n i tng ging nh thnh vin d liu kiu tham chiu tng
ng trong i tng gc. Bn sao su ngha l bn phi sao ton b th i tng (object
graph) cc thnh vin d liu kiu tham chiu ca bn sao ch n cc bn sao (c lp v
mt vt l) ca cc i tng c tham chiu bi i tng gc.
616
Chng 16: Cc giao din v mu thng dng
public Team() {
617
Chng 16: Cc giao din v mu thng dng
TeamMembers.Add(e.Clone());
}
}
TeamMembers.Add(member);
}
i tng (obj) c truyn cho phng thc phi cng kiu vi i tng ang gi, nu
khng CompareTo s nm ngoi l System.ArgumentException. Gi tr do CompareTo tr v
c tnh nh sau:
Nu i tng hin ti nh hn obj, tr v mt s m (chng hn, -1).
Nu i tng hin ti c cng gi tr nh obj, tr v zero.
Nu i tng hin ti ln hn obj, tr v mt s dng (chng hn, 1).
Php so snh ny thc hin iu g l ty thuc vo kiu hin thc giao din IComparable.
V d, nu mun sp xp da theo tn, bn cn thc hin php so snh chui (String). Tuy
nhin, nu mun sp xp da theo ngy sinh, bn cn thc hin php so snh ngy
(System.DateTime).
h tr nhiu dng sp xp cho mt kiu c th, bn phi hin thc ring r tng kiu tr
gip v cc kiu ny hin thc giao din IComparer. Giao din ny nh ngha phng thc
Compare nh sau:
int Compare(object x, object y);
// Bo m x v y u l cc th hin ca Newspaper.
Newspaper newspaperX = x as Newspaper;
if (newspaperX == null) {
this.name = name;
this.circulation = circulation;
}
} else {
621
Chng 16: Cc giao din v mu thng dng
Phng thc Main minh ha php so snh v kh nng sp xp nh c hin thc giao din
IComparable v IComparer. Phng thc ny s to mt tp hp
System.Collections.ArrayList cha nm i tng Newspaper, sau sp xp ArrayList hai
ln bng phng thc ArrayList.Sort. Ln u, thao tc Sort s dng c ch so snh mc
nh ca Newspaper (thng qua phng thc IComparable.CompareTo). Ln sau, thao tc Sort
s dng i tng AscendingCirculationComparer (thng qua phng thc
IComparer.Compare).
public static void Main() {
Console.WriteLine(Environment.NewLine);
Console.WriteLine("Newspaper list sorted by name (default order):");
newspapers.Sort();
foreach (Newspaper n in newspapers) {
Console.WriteLine(n);
}
622
Chng 16: Cc giao din v mu thng dng
Console.WriteLine(Environment.NewLine);
Console.WriteLine("Newspaper list sorted by circulation:");
newspapers.Sort(Newspaper.CirculationSorter);
foreach (Newspaper n in newspapers) {
Console.WriteLine(n);
}
}
Name = name;
Title = title;
}
// Tr v chui m t TeamMember.
public override string ToString() {
this.sourceTeam = team;
sourceTeam.TeamChange +=
new TeamChangedEventHandler(this.TeamChange);
}
// Nu Team nm di bt hp l, nm ngoi l.
if (teamInvalid) {
626
Chng 16: Cc giao din v mu thng dng
// Nu Team nm di bt hp l, nm ngoi l.
if (teamInvalid) {
// y nhim dng ch nh ch k m tt c
// cc phng thc th l s kin phi hin thc.
public delegate void TeamChangedEventHandler(Team t, EventArgs e);
teamMembers.Add(member);
if (TeamChange != null) {
TeamChange(this, null);
}
}
}
foreach(TeamMember in team.Members) {
// Lm g ...
}
foreach(TeamComputer in team.Computers) {
// Lm g ...
}
// resourceHandle = ...
}
// Destructor/Finalizer.
~DisposeExample() {
if (!isDisposed) {
if (disposing) {
// Lm g vi d...
633
Chng 16: Cc giao din v mu thng dng
}
}
}
kch hot vic h tr format specifier, bn phi hin thc giao din IFormattable. Giao
din ny khai bo mt phng thc c tn l ToString vi ch k nh sau:
string ToString(string format, IFormatProvider formatProvider);
this.title = title;
this.names = names;
}
case 'S':
// S dng dng short: first-initial v surname.
result = names[0][0] + ". " + names[names.Length-1];
break;
case 'P':
// S dng dng polite: title, initials, v surname.
if (title != null && title.Length != 0) {
result = title + ". ";
}
for (int count = 0; count < names.Length; count++) {
if ( count != (names.Length - 1)) {
result += names[count][0] + ". ";
} else {
result += names[count];
}
}
break;
case 'I':
// S dng dng informal: ch c first-name.
result = names[0];
break;
case 'G':
default:
// S dng dng mc nh/general: first-name v surname.
result = names[0] + " " + names[names.Length-1];
break;
}
return result;
}
}
Phng thc GetObjectData v phng thc khi dng gii tun t ha phi gi
phng thc tng ng trong lp c s cho php lp c s thc hin tun t ha
v gii tun t ha d liu ca n mt cch ng n (xem mc 16.1 bit cch lm
cho mt lp tr nn kh-tun-t-ha).
Di y l mt lp ngoi l ty bin c tn l CustomException (tha k lp
ApplicationException). Lp ny khai bo hai thnh vin d liu ty bin: mt chui c tn l
stringInfo v mt gi tr lun l c tn l booleanInfo.
638
Chng 16: Cc giao din v mu thng dng
using System;
using System.Runtime.Serialization;
// Phng thc khi dng gii tun t ha (cn cho giao din
// ISerialization). V CustomException l sealed nn phng thc
// khi dng ny l private. Nu CustomException khng phi l
// sealed th phng thc khi dng ny nn c khai bo l
// protected cc lp dn xut c th gi n trong qu trnh
// gii tun t ha.
private CustomException(SerializationInfo info,
StreamingContext context) : base (info, context) {
Hin thc thm cc thuc tnh v cc thnh vin d liu h tr trng thi s kin m
bn cn truyn cho cc phng thc th l s kin. Tt nht l lm cho trng thi s
kin tr nn bt bin (immutable), nh vy bn nn s dng cc thnh vin d liu
private readonly v s dng cc thuc tnh public cho php truy xut ch-c n
cc thnh vin d liu ny.
Hin thc mt phng thc khi dng public h tr cu hnh ban u ca trng thi s
kin.
Lm cho lp i s s kin ca bn tr nn kh-tun-t-ha (serializable) b thc
thi c th marshal cc th hin ca n qua cc bin min ng dng v bin my. p
dng c tnh System.SerializableAttribute thng l cho cc lp i s s
kin. Tuy nhin, nu lp i s s kin c cc yu cu tun t ha c bit, bn phi
hin thc giao din System.Runtime.Serialization.ISerializable (xem mc 16.1
bit cch lm cho mt lp tr nn kh-tun-t-ha).
on m di y trnh by mt lp i s s kin ty bin c tn l MailReceivedEventArgs.
Gi s c mt mail-server truyn cc th hin ca lp MailReceivedEventArgs cho cc
phng thc th l s kin nhn mt thng ip e-mail. Lp ny cha cc thng tin v ngi
gi v ch ca thng ip e-mail.
using System;
[Serializable]
public sealed class MailReceivedEventArgs : EventArgs {
this.from = from;
this.subject = subject;
}
oldTemperature = oldTemp;
newTemperature = newTemp;
}
if (TemperatureChange != null) {
TemperatureChange(this, e);
}
}
set {
// To mt i tng i s s kin mi cha
// nhit c v mi.
TemperatureChangeEventArgs e =
new TemperatureChangeEventArgs(temperature, value);
System.Console.WriteLine
("ChangeObserver: Old={0}, New={1}, Change={2}",
temp.OldTemperature, temp.NewTemperature,
temp.NewTemperature - temp.OldTemperature);
}
}
count++;
sum += temp.NewTemperature;
System.Console.WriteLine
648
Chng 16: Cc giao din v mu thng dng
("AverageObserver: Average={0:F}",
(double)sum/(double)count);
}
}
// To mt i tng Thermostat.
Thermostat t = new Thermostat();
// To hai observer.
new TemperatureChangeObserver(t);
new TemperatureAverageObserver(t);
try {
// Chuyn u vo ca ngi dng thnh mt s
// nguyn v s dng n thit lp nhit
// hin ti ca b n nhit.
t.Temperature =
System.Int32.Parse(System.Console.ReadLine());
} catch (System.Exception) {
// S dng iu kin ngoi l kt thc vng lp.
System.Console.WriteLine("Terminating ObserverExample.");
return;
}
} while (true);
649
Chng 16: Cc giao din v mu thng dng
17
652
653
Chng 17: S ha hp vi mi trng Windows
Thuc tnh
// Dng lnh.
Console.WriteLine("Command line : " + Environment.CommandLine);
// Hin th tn ca tt c cc a lun l.
foreach (string s in Environment.GetLogicalDrives()) {
Console.WriteLine("Logical drive : " + s);
}
// Lit k tt c cc th mc c bit.
foreach (Environment.SpecialFolder s in
Enum.GetValues(typeof(Environment.SpecialFolder))) {
2. Ly gi tr ca mt bin mi trng
Bn cn ly gi tr ca mt bin mi trng s dng cho ng dng ca bn.
S dng cc phng thc GetEnvironmentVariable, GetEnvironmentVariables, v
ExpandEnvironmentVariables ca lp Environment.
EventLog.CreateEventSource("EventLogExample","Application");
}
To mt kha mi vi tn c ch nh v tr v i tng
CreateSubKey RegistryKey cho php ghi. Nu kha tn ti, phng thc ny
s tr v mt tham chiu cho php ghi n kha tn ti.
Xa kha vi tn c ch nh, kha ny phi khng c kha
DeleteSubKey con (nhng c th c gi tr); nu khng, ngoi l
System.InvalidOperationException s b nm.
if (args.Length > 0) {
// M kha c s CurrentUser.
using(RegistryKey root = Registry.CurrentUser) {
// Cp nht bin m.
UpdateUsageCounter(root);
// To mt kha lu tr bin m,
// hoc ly tham chiu n kha c.
RegistryKey countKey = root.CreateSubKey("RegistryExample");
try {
using (RegistryKey key = root.OpenSubKey(keyname)) {
if (keyname == searchKey) PrintKeyValues(key);
SearchSubKeys(key, searchKey);
}
} catch (System.Security.SecurityException) {
// B qua SecurityException vi ch nh ca v d ny.
// Mt s kha con ca HKEY_CURRENT_USER c bo mt
663
Chng 17: S ha hp vi mi trng Windows
// v s nm SecurityException khi c m.
}
}
}
// Hin th cc gi tr ny.
foreach (string valuename in key.GetValueNames()) {
if (key.GetValue(valuename) is String) {
Console.WriteLine(" Value : {0} = {1}",
valuename, key.GetValue(valuename));
}
}
}
}
Khi c thc thi trn my chy Windows XP vi dng lnh RegistryExample Environment,
v d ny s cho kt xut nh sau:
Registry key found : HKEY_CURRENT_USER\Environment contains 4 values
Value : TEMP =
C:\Documents and Settings\nnbphuong81\Local Settings\Temp
Value : TMP =
C:\Documents and Settings\nnbphuong81\Local Settings\Temp
Value : LIB =
C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Lib\
Value : INCLUDE =
C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\include\
5. To mt dch v Windows
Bn cn to mt ng dng ng vai tr l mt dch v Windows.
To mt lp tha k t lp System.ServiceProcess.ServiceBase. S dng cc
thuc tnh tha k iu khin hnh vi ca dch v, v chp cc phng
664
Chng 17: S ha hp vi mi trng Windows
thc tha k hin thc cc chc nng cn thit. Hin thc phng thc Main,
trong to mt th hin ca lp dch v v truyn n cho phng thc tnh
ServiceBase.Run.
Nh c cp trong bng 17.5, phng thc OnStart phi tr v trong vng 30 giy, do
bn khng nn s dng OnStart thc hin cc thao tc khi ng tn nhiu thi gian. Mt
lp dch v nn hin thc mt phng thc khi dng thc hin cc thao tc khi ng,
bao gm vic cu hnh cc thuc tnh tha k t lp ServiceBase. Ngoi cc thuc tnh khai
bo cc thng ip iu khin no c dch v h tr, lp ServiceBase cn hin thc ba
thuc tnh quan trng khc:
ServiceNameL tn c SCM s dng nhn dng dch v, v phi c thit lp
trc khi dch v chy.
AutoLogiu khin vic dch v c t ng ghi vo nht k s kin hay khng khi
nhn thng ip iu khin OnStart, OnStop, OnPause, v OnContinue.
EventLogTr v mt i tng EventLog c cu hnh trc vi tn ngun s kin
(event source) trng vi thuc tnh ServiceName c ng k vi nht k Application
(xem mc 17.3 c thm thng tin v lp EventLog).
Bc cui cng trong vic to mt dch v l hin thc phng thc tnh Main. Phng thc
ny phi to mt th hin ca lp dch v v truyn n cho phng thc tnh
ServiceBase.Run. Nu mun chy nhiu dch v trong mt tin trnh, bn phi to mt mng
cc i tng ServiceBase v truyn n cho phng thc ServiceBase.Run. Mc d cc lp
dch v u c phng thc Main nhng bn khng th thc thi m lnh dch v mt cch trc
tip; bn s nhn c hp thng bo nh hnh 17.2 nu trc tip chy mt lp dch v. Mc
17.6 s trnh by cch ci t dch v trc khi thc thi.
666
Chng 17: S ha hp vi mi trng Windows
public ServiceExample() {
try {
interval = System.Double.Parse(args[0]);
interval = Math.Max(1000, interval);
} catch {
interval = 5000;
}
EventLog.WriteEntry("ServiceExample stopping...");
timer.Stop();
timer.Dispose();
timer = null;
}
if (timer != null) {
EventLog.WriteEntry("ServiceExample pausing...");
timer.Stop();
}
}
if (timer != null) {
EventLog.WriteEntry("ServiceExample resuming...");
timer.Start();
}
}
6. To mt b ci t dch v Windows
Bn to mt ng dng dch v Windows v cn ci t n.
Tha k lp System.Configuration.Install.Installer to mt lp ci t gm
nhng thng tin cn thit ci t v cu hnh lp dch v ca bn. S dng
cng c Installutil.exe thc hin vic ci t.
669
Chng 17: S ha hp vi mi trng Windows
[RunInstaller(true)]
public class ServiceInstallerExample : Installer {
670
Chng 17: S ha hp vi mi trng Windows
public ServiceInstallerExample() {
S dng COM Interop truy xut cc chc nng ca Windows Script Host. To
v cu hnh mt th hin IWshShortcut tng ng vi shortcut. Th mc cha
shortcut s xc nh shortcut xut hin trn Desktop hay trong Start menu.
Th vin lp .NET Framework khng c chc nng to shortcut trn Desktop hay trong Start
menu; tuy nhin, vic ny c th c thc hin d dng bng thnh phn Windows Script
Host (c truy xut thng qua COM Interop). Cch to Interop Assembly truy xut mt
thnh phn COM c trnh by trong mc 15.6. Nu ang s dng Visual Studio .NET,
bn hy thm mt tham chiu n Windows Script Host Object Model (c lit k trong th
COM ca hp thoi Add Reference). Nu khng c Visual Studio .NET, bn hy s dng cng
c Type Library Importer (Tlbimp.exe) to mt Interop Assembly cho file wshom.ocx (file
ny thng nm trong th mc Windows\System32). Bn c th ly phin bn mi nht ca
Windows Script Host ti [http://msdn.microsoft.com/scripting].
Hnh 17.4 Chn Windows Script Host Object Model trong hp thoi Add Reference
// Lu file shortcut.
shortcut.Save();
}
}
676
PH LC A
GII THIU
MT S CNG C .NET
P
PH LC A: GII THIU MT S CNG C .NET
Phn document cha biu thc chnh quy, trong v d ny l [0-9]*, biu thc ny trng khp
vi bt k dy ch s no. Hp pha di phi cha u vo cho biu thc chnh quy, v
hp pha di tri hin th nhng trng khp m biu thc chnh quy tm thy bn trong cc
u vo. Vit v kim tra cc biu thc chnh quy trong mt ng dng c lp nh th ny th
d hn nhiu so vi thao tc chng trong ng dng ca bn.
Mt trong nhng tnh nng hay nht ca Regulator l kh nng tm kim th vin biu thc
chnh quy trc tuyn ti [http://regexlib.com]. V d, nu nhp chui "phone" vo hp tm
679
Ph lc A: Gii thiu mt s cng c .NET
kim, bn s tm thy hn 20 biu thc chnh quy khc nhau trng khp vi cc s in thoi,
bao gm cc biu thc cho Anh, c, v nhiu s in thoi khc.
Regulator c vit bi Roy Osherove v c th c download ti
[http://regex.osherove.com].
Khai bo ny s lm cho thuc tnh ClassName xut hin trong ca s thuc tnh ca
CodeSmith n c th c ch nh khi template chy.
Bc tip theo l xy dng phn thn ca template (vi m lnh tng t nh ASP.NET). Nh
bn c th thy, template ny nhn chui nhp v sinh ra mt lp vi tn . Trong phn thn
ca template, cc th ng v m c s dng nh trong ASP.NET. Trong template ny, ta
ch chn gi tr thuc tnh, nhng cng c th s dng bt k kiu m .NET no bn trong cc
th ny.
public sealed class <%= ClassName %>
{
private static volatile <%= ClassName %> _instance;
private <%= ClassName %>() {}
680
Ph lc A: Gii thiu mt s cng c .NET
lock(_syncRoot)
{
if (_instance == null)
{
_instance = new SingletonClass();
}
}
}
return _instance;
}
}
}
namespace NUnitExample
{
[TestFixture]
public class HashtableTest {
public HashtableTest() {
}
}
}
ht.Add("Key1", "Value1");
ht.Add("Key2", "Value2");
Trn y ch l mt kim th n gin, nhng cho thy kh nng ca NUnit. C rt nhiu kiu
kim th, cng nh nhiu phng thc Assert, c th c s dng kim th mi phn
trong m lnh ca bn.
Mt kim th n v c th lu v chy li mi khi bn sa i m lnh, iu ny gip bn
pht hin li d dng hn v m bo pht trin ng dng tt hn.
NUnit l mt d n m ngun m v c th c download ti [http://www.nunit.org].
Cng c mt bn add-in ca NUnit cho Visual Studio .NET, add-in ny cho php bn trc tip
chy cc phng thc kim th n v t Visual Studio .NET (c th c download ti
[http://sourceforge.net/projects/nunitaddin]).
c thm thng tin v NUnit v v tr ca n trong vic pht trin test-driven (vn hnh theo
kim th), bn hy xem bi vit Test-Driven C#: Improve the Design and Flexibility of Your
Project with Extreme Programming Techniques trong a CD nh km.
ht.Add("Key1", "Value1");
ht.Add("Key2", "Value2");
Phn ch thch XML cho phng thc ny s c trch xut v lu thnh file XML nh sau:
<?xml version="1.0" ?>
<doc>
<assembly>
<name>NUnitExample</name>
</assembly>
<members>
<member name="M:NUnitExample.HashtableTest.HashtableAddTest">
<summary>This test adds a number of values to the Hashtable
collection and then retrieves those values and checks if
they match.
688
Ph lc A: Gii thiu mt s cng c .NET
</summary>
</member>
</members>
</doc>
</sources>
</csc>
</target>
</project>
Tuy khng d dng nh vic nhp Build trong Visual Studio, nhng NAnt l mt cng c rt
mnh khi xy dng quy trnh to dng chy t ng theo lch biu. NAnt cng c cc tnh
nng hu ch nh chy cc kim th n v hay chp cc file i km (cc tnh nng ny khng
c quy trnh to dng ca Visual Studio 2003 h tr).
NAnt l mt d n m ngun m v c th c download ti
[http://sourceforge.net/projects/nant].
VB.NET to C# Converter l trnh chuyn i m ngun sang m ngun. Sau khi chuyn i,
m lnh ca bn vn gi li tnh d c vn c (bao gm cc tn bin v cc ch thch). Tnh
tin cy ca chng trnh cng rt cao, chnh xc trn 99% trong hu ht cc ln th nghim.
VB.NET to C# Converter c pht trin bi VBConversions v c th c
download (bn dng th) ti [http://www.vbconversions.com].
A.12 Chuyn m ngun C# sang VB.NET vi Convert C# to VB.NET
Ngc vi VB.NET to C# Converter, Convert C# to VB.NET c s dng chuyn m
ngun C# sang VB.NET.
694
Ph lc A: Gii thiu mt s cng c .NET
Cui cng, vo th Generate v nhp nt Generate. Sau khi xy dng thnh cng, bn
hy vo http://localhost/pubs xem kt qu.
PH LC B
THUT NG
ANH VIT
Browser.........................................................................................................Trnh duyt
Buffer.................................................................................................................. B m
Built-in [adj]......................................................................................................... Ni ti
Cache...................................................................................Kho cha (truy xut nhanh)
Caching.................................................................................................... C ch lu gi
CAS [Code Access Security]................................................ Bo mt truy xut m lnh
Certificate....................................................................................................... Chng ch
Channel................................................................................................................... Knh
Character................................................................................................................ K t
Class..........................................................................................................................Lp
Client............................................................................................................ Trnh khch
Clone [v]........................................................................................................... Sao chp
Cloneable [adj].......................................................................................... Kh sao chp
CLR [Common Language Runtime].................................. B thc thi ngn ng chung
Code................................................................................................................... M lnh
Collection........................................................................................................... Tp hp
Column...................................................................................................................... Ct
Command................................................................................................................ Lnh
Communication............................................................................................ S giao tip
Comparable [adj]......................................................................................... Kh so snh
Compare [v]........................................................................................................ So snh
Compatibility........................................................................................ Tnh tng thch
Compile [v]...................................................................................................... Bin dch
Compiler................................................................................................. Trnh bin dch
Component................................................................................................... Thnh phn
Component tray.................................................................................... Khay thnh phn
Configuration.................................................................................................... Cu hnh
Connection.......................................................................................................... Kt ni
Constant.................................................................................................................. Hng
Constructor................................................................................ Phng thc khi dng
Context.............................................................................................................Ng cnh
Context-sensitive help............................................................... Tr gip cm-ng-cnh
Control............................................................................................................ iu kim
Convert [v].................................................................................................... Chuyn i
Convertible [adj].................................................................................... Kh chuyn i
Cryptography...................................................................................................... Mt m
Culture....................................................................................................... Min vn ha
Custom [adj]..................................................................................................... Ty bin
Data..................................................................................................................... D liu
Data binding.................................................................................... K thut kt d liu
Database.....................................................................................................C s d liu
De-compile [v].............................................................................................. Dch ngc
699
Ph lc B: Thut ng Anh - Vit
Item................................................................................................................. Mc chn
JIT [just-in-time]....................................................................... Tc thi / Va ng lc
Key......................................................................................................................... Kha
Keyword.............................................................................................................T kha
Language......................................................................................................... Ngn ng
Length.............................................................................................................. Chiu di
Library.............................................................................................................. Th vin
Lifetime................................................................................................... Thi gian sng
Link.................................................................................................................... Lin kt
List.................................................................................................................. Danh sch
Literal...............................................................................................................Trc kin
Load [v].................................................................................................................... Np
Local [adj]........................................................................................................... Cc b
Locale.................................................................................................................. Bn a
Localization............................................................................................. S bn a ha
Lock......................................................................................................................... Cht
Logic........................................................................................... M thi hnh chc nng
Loop.................................................................................................................. Vng lp
Managed [adj]........................................................................................... c qun l
Management................................................................................................... S qun l
Mapping....................................................................................................... Php nh x
Member......................................................................................................... Thnh vin
Membership...................................................................................... T cch thnh vin
Memory............................................................................................................... B nh
Menu............................................................................................................... Trnh n
Message........................................................................................................ Thng ip
Metacharacter..................................................................................................Siu k t
Metadata....................................................................................................... Siu d liu
Method........................................................................................................ Phng thc
Model................................................................................................................. M hnh
Module............................................................................................................... n th
MSIL [Microsoft Intermediate Language]..................................... Ngn ng trung gian
Multilingual [adj]....................................................................................... a ngn ng
Multithreading.............................................................................. Lp trnh a tiu trnh
Native [adj]................................................................................................. Nguyn sinh
Namespace.............................................................................................. Khng gian tn
Network................................................................................................................. Mng
Node.......................................................................................................................... Nt
Object.............................................................................................................. i tng
Object-oriented programming...............................................Lp trnh hng i tng
Operating system....................................................................................... H iu hnh
Operator.............................................................................................................. Ton t
Output.................................................................................................. u ra / Kt xut
Overload.................................................................................................. Bn np chng
Override [v]........................................................................................................ Chp
702
Ph lc B: Thut ng Anh - Vit
Parameter..........................................................................................................Thng s
Password.......................................................................................................... Mt khu
Path................................................................................................................ ng dn
Pattern.............................................................................................................. Kiu mu
Performance.................................................................................................... Hiu nng
Permission............................................................................................................ Quyn
Pixel................................................................................................................. im nh
Platform.................................................................................................................... Nn
Pointer................................................................................................................. Con tr
Policy............................................................................................................. Chnh sch
Polymorphisme........................................................................................... Tnh a hnh
Pool................................................................................................................ Kho d tr
Pooling...................................................................................................... C ch d tr
POP3 [Post Office Protocol 3].....................................................Giao thc nhn mail 3
Port......................................................................................................................... Cng
Postfix................................................................................................................... Hu t
Prefix.................................................................................................................... Tin t
Private [adj]........................................................................................................... Ring
Privilege......................................................................................................... c quyn
Procedure............................................................................................................ Th tc
Process............................................................................................................. Tin trnh
Processor........................................................................................................... B x l
Project.................................................................................................................... D n
Property..........................................................................................................Thuc tnh
Protected [adj].............................................................................................c bo v
Protocol........................................................................................................... Giao thc
Public [adj]..................................................................................................... Cng khai
Query................................................................................................................ Truy vn
Queue............................................................................................................... Hng i
Random......................................................................................................... Ngu nhin
RBS [Role-Based Security]..................................................... Bo mt da-trn-vai-tr
Record................................................................................................. Bn ghi / Mu tin
Recursion........................................................................................................ S quy
Reference...................................................................................................... Tham chiu
Reflection.......................................................................................... C ch phn chiu
Register [v]........................................................................................................ ng k
Regular expression.......................................................................... Biu thc chnh quy
Relationship................................................................................................ Mi quan h
Relative [adj]................................................................................................. Tng i
Remotable [adj]................................................................................ Kh truy xut t xa
Resource........................................................................................................ Ti nguyn
Reusability.....................................................................................Kh nng ti s dng
703
Ph lc B: Thut ng Anh - Vit
Role...................................................................................................................... Vai tr
Routine....................................................................................................... Thng trnh
Row.............................................................................................................Hng / Dng
Runtime......................................................................................................... B thc thi
Schema................................................................................................. Lc / Khun
Script................................................................................................................. Kch bn
Security......................................................................................................... S bo mt
Serialize [v].................................................................................................. Tun t ha
Serializable [adj].................................................................................... Kh tun t ha
Serialization............................................................................................. S tun t ha
Server............................................................................................................... Trnh ch
Service................................................................................................................ Dch v
Session..................................................................................................... Phin lm vic
Setting............................................................................................................... Thit lp
Shared [adj]......................................................................... c chia s / Dng chung
Signature.............................................................................................................. Ch k
SMTP [Simple Mail Transfer Protocol]........................ Giao thc truyn mail n gin
SOAP [Simple Object Access Protocol]........... Giao thc truy xut i tng n gin
Solution............................................................................................................ Gii php
Specialization....................................................................................... Tnh chuyn ha
SQL [Structured Query Language].................................Ngn ng truy vn c cu trc
Stack............................................................................................................ Ngn chng
State................................................................................................................ Trng thi
State | Stateless [adj].......................................................... C trng thi | Phi trng thi
Statement......................................................................................... Cu lnh / Khai bo
Static [adj]............................................................................................................... Tnh
Stored procedure..................................................................................... Th tc tn tr
Stream............................................................................................................ Dng chy
String..................................................................................................................... Chui
Strong name.................................................................................................... Tn mnh
Strong type..................................................................................................... Kiu mnh
Strongly-named [adj]......................................................................c nh tn mnh
Strongly-typed [adj]..................................................................... c nh kiu mnh
Structure............................................................................................................ Cu trc
Symmetric [adj]............................................................................................... i xng
Synchronization......................................................................................S ng b ha
Synchronous [adj]............................................................................................. ng b
System.............................................................................................................. H thng
System tray.............................................................................................. Khay h thng
Table....................................................................................................................... Bng
Tag............................................................................................................................ Th
Task...................................................................................................................... Tc v
Template....................................................................................................... Khun mu
Thread................................................................... Tiu trnh / Mch trnh / Tuyn on
Thread-safe..................................................................................... An ton v tiu trnh
704
Ph lc B: Thut ng Anh - Vit
Throw [v]................................................................................................................. Nm
Timestamp................................................................................................ Tem thi gian
Tool.................................................................................................................... Cng c
Toolbox....................................................................................................... Hp cng c
Transaction............................................................................................. Phin giao dch
Type......................................................................................................................... Kiu
Type-safe................................................................................... An ton v kiu d liu
Unmanaged [adj]............................................................................ Khng c qun l
Update............................................................................................................... Cp nht
URI [Uniform Resource Identifier]...................... B nhn dng ti nguyn ng dng
URL [Uniform Resource Locator]............................. B nh v ti nguyn ng dng
User.............................................................................................................. Ngi dng
Utility................................................................................................................. Tin ch
Validation.................................................................................. S xc nhn tnh hp l
Value..................................................................................................................... Gi tr
Variable................................................................................................................... Bin
Version............................................................................................................ Phin bn
Virtual [adj]................................................................................................................ o
Visible [adj]...................................................................................................... Kh kin
Visual [adj]..................................................................................................... Trc quan
Wildcard................................................................................................... K t i din
Window................................................................................................................ Ca s
Worker...................................................................................................................... Th
Wrapper............................................................................................................... V bc
WSDL [Web Services Description Language]................ Ngn ng m t dch v Web
XML [Extensible Markup Language]............................... Ngn ng nh du m rng
705