l Phuong Lan (Chi biởn) trau Hoỏng Đức Hải
me HELE
LAP TRINH WINDOWS
Trang 3LỜI NGỎ
lợnh thưa quý Bạn đọc gần xa, Ban xuất bõn MK.PUB trước hết xin
bỏy tỏ lúng biết ơn vỏ niềm vinh hạnh trước nhiệt tớnh của đừng đảo Bạn đọc đối với tủ sõch MK.PUB trong thời gian qua
Khẩu hiệu của chỷng từi lỏ: * Lao động khoa học nghiởm tỷc
* Chất lượng vỏ ngỏy cỏng chất lượng hơn * Tất cả vớ Bạn đọc
Rất nhiều Bạn đọc đọ gửi mail cho chỷng từi đụng gụp nhiều ý kiến quý bõu cho tủ sõch
Ban xuất bản MK.PUB xin được kợnh mời quý Bạn đọc tham gia cỳng nóng cao chất lượng tủ sõch của chỷng ta:
Trong quõ trớnh đọc, xin cõc Bạn ghi chỷ lại cõc sai sụt (dỳ nhỏ, lớn)
của cuốn sõch hoặc cõc nhận xờt của riởng Bạn Sau đụ xin gửi về địa chỉ:
E-mail: mk.book@cinet.vnnews.com; mk.pub@cinet.vnnews.com
Hoặc gửi về: Nhỏ sõch Minh Khai
249 Nguyễn Thi Minh Khai, Q.1, Tp Hờ Chi Minh Nếu Bạn ghi chỷ trực tiếp lởn cuốn sõch, rồi gửi cuốn sõch đụ cho chỷng từi thớ chỷng từi sẽ xin hoỏn lại cước phợ bưu điện vỏ gửi lại cho Bạn cuốn sõch khõc
Chỷng từi xin gửi tặng một cuốn sõch của tủ sõch MK.PUB tỳy chọn lựa của Bạn theo một danh mục thợch hợp sẽ được gửi tới Bạn
Với mục đợch ngỏy cỏng nóng cao chất lượng của tủ sõch MK.PUB, chỷng từi rất mong nhận được sự hợp tõc của quý Bạn đọc gần xa
" MK.PUB va Ban doc cing lam !”
Trang 4MỤC LỤC LỜI NGỎ "—" È
MỤC LỤC -: —- sseesecesenseessesesseen Hee secenersvssseeteess 5
Phần 1 MG DAU cssssssssssssssssscsssssessssssssssssusssssssseseessessnnseecenees ssestsnsessnenaneseea 13 MỞ ĐẦU „ ừ_ A 15
Chương 1-1: Bộ khung NET (.NET EFamework) sence
1
Xoõ bụ huyền thoại về một mõy õo net
Ngừn ngữ trung gian Microsoft (MSIL), Quản lý bộ nhớ NETF
Hệ thống kiểu đữ liệu của NET
Cõc đối tượng trong hệ thống của khung NET C# - một ngừn ngữ lập trớnh mới
Cõc đối tượng tự mừ tả như thế nỏo? Tương tõc với thế giới COM
10 Windows Forms, Web Controls.vỏ GDI+ Coonan PF Chương 1.2 : Bộ thực thi ngừn ngữ tổng quõt 1 Tổng quan “ 1.1 Đơn giõn hoõ việc phõt triển Ặ Ă Q SH S2, 21 1,2 Cừng cụ hỗ trợ 1.3 Hỗ trợ đa ngừn ngữ 1.4 Việc triển khai được thực hiện dễ hơn 1.5 Sự tõch biệt cõc phần mềm 1.6 Tợnh an toỏn kiểu vỏ sự kiểm tra 1.7 Tợnh bảo mật 2 Quan hệ của CLR với NET 2.1 Chỉ tiết về CLR Lỏn 2.20101111112120 11011101112 11c 2.2 CLR vỏo lỷc thực thi
2.3 Cõc kiểu đữ liệu được cung cấp bời CLR
2.4 Dữ liệu vỏ mọ lệnh của NT - 50 ch S1 HE Sexy 2.5 Mọ lệnh của COM vỏ việc truy xuất dữ liệu 5 cỏ: 2.6 Cõc thỏnh phần mở rộng của NET đối với C++
Trang 5a Ms MỤC LUC
Chương 1.3 : Ngừn ngữ trung gian IL
1 Liởn tõc (TNTER-OP) ngừn ngữ HELLO IL Ham (FUNCTIONS) Lờp (CLASSES) ILDASM METADATA REFLECTION API 8 Kết chương Chương 1.4 : Lỏm việc với bộ quản lý C++ 1 Cõc từ khoõ mở rộng của C++
Sử dụng trớnh biởn địch C++ cho Managed C++ Cõc lớp thu gom rõc (Garbage Collected) Chỉ dẫn (Directive) #using
Chuỗi (String)
Trộn cõc mọ lệnh được quản lý (Managed) vỏ khừng được quản ly (Unmanagedè) son HH vỗ g1 HH Hit HH hit 7 Chốt chặt (Pinning) cõc mọ lệnh Managed 8 Cõc giao tiếp được quản lý (Managed Interface) nae wn 9 Tạo ra cõc kiểu giõ trị
10 Tạo vỏ sử dụng cõc mừ hớnh ủy thõc (Delegate) : cee tees 11 Gọi cõc DLL NET tỳy biến từ mọ lỏnh Managed C++ của bạn 68 12 Sử dụng DLL C++ được quản lý vỏ khừng được quản lý trong chương trớnh -NET cua ban
13 Ding cõc thuộc tợnh (Properties) trong cõc lớp của bạn 14 Bảo đảm việc sắp xếp vỏ đụng gụi cõc cấu trỷc C++ cua ban IS C N0 7n nh Chương 1.5 : Giới thiệu VISUAL STUDIO NET -.eceeerseeserrrsrree
1 Tợch hợp mừi trường phõt triển (TDE) ục eeeherrerriere
Dự õn (Projects)
Nhiều du õn trong một Solution đơn Ậ
Trang 6CHƯƠNG 1-1: Bộ khung NET 11 12 18 14 15 16 17 Tớm kiếm cõc ký hiệu đặc trưng c tuc SH nu tr ng sườn 96 Chỉ mục vỏ kết quả tớm kiếm
Của sổ gỡ lỗi (Debug)
Trinh trợ giỷp động (Dynamic Help)
e6 0 n Chương trớnh gỡ lỗi (Debugging)
Cỏi đặt breakpoint nóng cao 17.1 Conditional BreakpoinitS cõ ch HH HH Hệ I2.) 3331 18 Lỏm gớ khi mọ chương trớnh bị tạm ngừng 19 Gắn trớnh gỡ lỗi (Debugger) vỏo một tiến trớnh (Process) " 20 JéT' Debugging L SH HH HH HH Hỏ HH HH hư, 298.12 7n Phần II : Ngừn Ngữ C# — ềỒỎ 107 Chương 3.1 : Cõc vấn đề cơ bản của C# so S155 x0x 56 1 Hệ thống kiểu trong C# cv n nh HH HH g1 re
1.1 Cõc kiểu giõ trị trong lập trớnh 1.2 Cõc kiểu tham chiếu
1.3 Bao vỏ khừng bao (Box vỏ Unbox) we 2 Cõc khõi niệm lập trớnh cuc Hỏ Hỏ HH HH HH Hỏ re
2.1 Khừng gian tởn (NamespacẪ) cỏnh Ha hờ 2.2 Cõc phõt biểu lệnh (Statements) 2.3 2.4 Todn tu (Operators) ooo ccc HH HH Ho Hang HH ng hư PT cac ừn P.1 số nh 3 Lớp (Class) œ =1 Ơœ ẲẪœ Kế thừa (Inheritance) Da hinh (Polymorphism) Mừ hớnh chuyển giao (Delegates) Kết chương
Trang 7
MỤC LỤC
Chương 2.2 : C# nóng cao ceceee —1.11.1 1 171 1 Tập hợp (Collection) của NET -.s HH HH HH HH ngư 171 1.1 Stack 1.2 Hỏng đợi (Queue) 1.3 Bảng băm Hashtabl
2 Danh sdch liờn kờt (Link List) cece ccesseessessesessseseesssescacscscacsssssereesescee 174
3 Attributes (dac tinh) 4 XML Serialization
5 C# hờ tro XML Serialization 6 KEt CHUONg cece cece ccc ceceeeneevesersetenssnesissueseeueaeneenersasgensaicitecessessenseentavesncars Phần EI : WINDOWS FORMS u csssssssssssssssseesnescossonscnsessssestecnsssuessnsssnscssscessnesens 193 Chương 8.L : Windows Eorms se s< sec seczmeznes sesse
1 Giới thiệu về Windows Forms của kiến trỷc NET 2 Windows Forms vỏ ứng dụng Hello World 3 Tạo vỏ sử dụng cõc bộ xử lý sự kiện (Event Handler) 4 Định nghĩa cõc kiểu đường viờn (Broder Style) cho Forms
5 Tạo vỏ thởm vỏo trớnh đơn menu ục So nọ n nh Tnhh HH HH He, 6 Tạo vỏ thởm vỏo cõc mục chọn tat (Shortcut Menu)
7 Xử lý sự kiện phõt sinh từ Menu
7.1 Sự kiện điều khiển giao diện người dỳng của Menultems 7.2 Định nghĩa Menultems lỏ thanh phón cõch (Seperator) 207 7.3 Xử lý sự kiện Select
7.4 Thiết kế khung Menu
7.5 Hiờn thi Menu từ phải qua trõi 7.6 Tạo vỏ sử dụng cõc Menu ngữ cảnh (ContextMenu) 214
7.7 Thay thế, sao chờp lại vỏ trộn cõc mục của Menu 215 7.8 Tạo vỏ thởm vỏo cõc Menu con (sub-Menu)
8 Kết chương
Chương 3.2 : Xử lý giao diện dờ hoa (GUD
1 Giới thiệu về thỏnh phần giao diện đồ hoa (GUI) 2 Hộp thoại (Dialog) 2.1 Sử dụng cõc hộp thoại thừng đụng (Common Dialog) 226 2.2 Hộp thoại Print vỏ Print Preview 3 Tạo hộp thoại
3.1 Hộp thoại Model vỏ Modeless , ° 3.2 Chuyển dữ liệu giữa cõc thỏnh phần trong hộp thoại 247 3.8 Kiểm tra hợp lệ (Validati0') cuc HH ga re 249
Trang 8CHƯƠNG 1-1: Bộ khung NET 9 (Ad 4.2 ễ soạn thảo Edit 4.3 ListBox 4.4 TreeView
4.5 Bảng điều khiển Tab detente " 4.6 Quản lý cõc thỏnh phần điều khiển động 2S non neo 258 5 Hết chương HH1 HH2 ng caro 284
Chương 3.3 : Rỏng buộc dữ liệu 2-5 s- 5< s2 193976 EESSE4SrE ch SEkseesrsze 1 Chiến lược rỏng buộc đữ liệu
2 Cõc nguồn đữ liệu rỏng buộc 2.1 Giao tiếp LIList 2.2 Cõc đối tượng NET cỏi đặt IList 3 Rỏng buộc giản đơn 4 Rỏng buộc dữ liệu giản đơn + 5 Rỏng buộc đữ liệu phức hợp 297 6 Rỏng buộc thỏnh phần điều khiển với cơ sở dữ liệu sử dụng ADO.NET 301 7 Tạo ra một khung nhớn cơ sở dữ liệu (Databse Viewer) với Visual Studio vỏ ADO.NET ooo 4 anồšŸẼ 302 8 Kết chương ctnnc20211 21 Hỏ HH2 1 tra neraa 304 Chương 3.4 : Xóy dựng ứng dụng Windows Forms (Scribble NET) 305
1 Cõc tỏi nguyởn trong NET
3 Địa phương hụa sản phẩm một cõch dễ đỏng 3 Cõc lớp quản lý tỏi nguyởn của Net 3.1 Tớm một văn hoõ
cy - Tạo lập cõc tỏi nguyởn văn bản 4.1 Chuỗi tỏi nguyởn văn bản
4.2 Một chương trớnh mẫu dựa trởn tỏi nguyởn v 4.3 Tạo lập vỏ sử dụng gụi kết hợp TH TH HH 211111 5 Dỳng Visual Studio.NET để quốc tế hụa
6 Tỏi nguyởn hớnh ảnh
7 Bử dụng danh sõch hớnh ảnh Ậ 8 Phương cõch lập trớnh truy xuất đến cõc tỏi nguyởn coi 323
9 Đọc vỏ viờt tap tin XML RESX .399
10 Kết chương „338
-339
Trang 9
MỤC LỤC Đối tượng Graphics Cõc hệ tọa độ đồ họa Vẽ đường thẳng vỏ cõc hớnh đơn giản 340 340 341 " 344 346 347 1911811183 2E Tp tk ng KT KH ng th TT E0 1 va 349 357 359 360 11 Cõc phờp biến đổi (Transformationư) Sung re 365 12, Su phối mỏu với giõ trị Alpha (Alpha Blending} 374
Bử đụng bỷt vờ (Pen) va co vờ (Brush) chuyờn mau gam mau Bat vờ va cg vờ cờ chat liệu Lỏm trơn cõc đầu mỷt cua đường thang Đường cong vỏ cõc đường dờ thi 2 3 4 5 6 7 8
9 Đối tượng GraphicsPath
9.1 Thởm văn bản (Text) vỏ cõc đường đừ thị khõc 10 Kỹ thuật cắt bằng đường đường dờ thi va vung (Region)
13 Sự phối mỏu với giõ trị Alpha cho hớnh ảnh 376 14 Những thao tõc xử lý khõc trong khừng gian mỏu + 380 15 Kết chương õc 2n t0 1121112211 n1 cay 384 Chương 3.6 : Thực hỏnh ứng dụng Windows EOorms s2 sssescs xe 385 1 Sử dụng thuộc tợnh 385 2 Nóng cấp thuộc tợnh Experience 390 3 Giải thợch ứng dụng : Formpaint.6Xe@ ccn TH nh re 393 cổ ằ Ả 432 Phờin IV : $9: a/ 7 ` 433 Chutoing 4.1 : ASP.NET 0 435 1 Web một hơi thở mới 485 2 Yởu cầu cần thiết cho ASP.NET 435 3 Hello ASP.NET 486 4 Thởm chỷt hương VỊ 5-5212 HT HH TT TH TH KH TH H121 511 211 xt 441 4.1 Kiểm tra ý tưởng „441 5 Kết chương 450 Chương 4.2 : Truy xuất dữ liệu trởn NET 451 1 Tầng dữ liệu (DataLayer) 451 2 Lớp Employee vỏ lớp Department chu 462 3 Stored Procedures 462 4 Cỏi đặt lớp 463
5 Kiờm tra (Testing) 470 6 Hỗ trợ tớm kiếm giản đơn ch HH He 472
Trang 10CHƯƠNG 1-1: Bộ khung NET 1 Giới thiệu ASP.NET WebForms 1.1 Cõc ỨserControl 479 1.2 HeaderControl .479 1.3 BmployeeViewPagelet: Một cõch tiếp cận khõc 485 2 Cõc trang ASPX 2.1 EmployeeEdit 2.2 EmployeeListing 2.3 Trang tớm kiếm: Nơi bắt đầu tớm thừng tin “ 3 Kết chương vn St 2n H n222211122 Ty H re
Chương 4.4: Cõc địch vụ Web (Webser'VèC@6) ca s2 szyererrrcree 515 1 Dich vu Echo (Echo SerViC@) uc HT TH HH HH HH HH HH HH HH re 515 Xóy dựng lớp Proxy Proxyfactory
Cõc chương trớnh Windows forms sử dụng WebService Trả vẽ kiểu đo người dỳng định nghĩa
- Tạo SerVẻC@ nen, - Tạo ra cõc rỏng buộc cho Client Cae thudc tinh XML Kết chương (Ẫ 0œ È1 Ơ ƠU G2 hộ
Phan V : GOT KET HOP vecccscsssssssscssssssssssscssosssssssssssessssseceesecesssssnsesssussstsseseessassssse 543
Chuong 5.1 : Cõc gụi kết hop (Assembly) .cccsessssscssececsssreccecsecsesncesessenseens 545 1 Gụi kết hợp (Assembly) lỏ gớ?
1.1 Nội dung gụi kết hợp
1.2 Định vị gụi kết hợp " -
2 Gụi kết hợp lưu trong một tập tin đơn nhe re 547
3 Gụi kết hợp lưu trong nhiều tập tin
Trang 11MỤC LỤC 5 Rang buộc tỳy biến: Cấu hớnh ứng dụng - nhe 574 8:19 1 1 B78 Chương 5.38 : Tương tõc với thế giới COM ckoececeeerrrrsceee 579
1 Thế giới của com 2 .NET hỗ trợ com
AI 00 e 4 B81 2.2 Rỏng buộc sớm (Early Binding) SH niuee 585 2.3 Rỏng buộc muộn (Late Binding) che he 585 2.4 [ConnectionPoint
2.5 Những vấn dờ vờ tiờu trinh (Thread) 2.6 So sõnh kiểm NET vỏ COM
3 Xem cõc thỏnh phần NET như lỏ cõc đối tượng COM 3.1 Trớnh RegAsm.exe
3.2 COM Callable Wrapper
4 Cõc vấn để khi đỳng chung net vỏ com với nhau 5, Kết chương Chương 5.4 : Cõc tiểu trớnh (ThreadS) ẬS55 ce<S nem re geee 1 Đa tiểu trớnh
1,1 Tiểu trớnh ứng dụng (Application Thread) coi 1.2 Tiểu trớnh lỏm việc hay tiểu trớnh thợ (Worker Thread)
1.3 Tạo một tiếu trớnh thợ - 1,4 Thuộc tợnh ThreadStatic
1.5 Liởn kết - Đem cõc tiểu trớnh lại bởn nhau ~
2 Đồng bộ tiờu trinh (Thread Syncronization) 2.1 Từ khoõ Loek
2.2 Mutex 2.3, AutoResetEvent
Trang 12^ Phan I MO DAU Trong phần nỏy:
Trang 13MỞ ĐẦU
CHUONG 1-1: BO KHUNG NET (.NET FAMEWORK)
1 GIGI THIEU NHANH VE NET
Trọng cừng nghiệp mõy tợnh, cụ thể nụi rằng Microsoft đọ mang lại những bước đi quan trọng nhất Chợnh hỏnh động can ddm cia Bill Gates vA Steve Ballmer khi họ nụi với ừng lớn IBM rằng họ cụ một hệ điều hỏnh cần bõn đọ đem lại thỏnh cừng vang đội cho DO8 Họ cũng đọ lỏm như thế khợ tạo ra một hệ điều hỏnh Windows phổ biến hầu như khắp toỏn cầu khi “cẩm nhầm” cõi phong cõch An? “nhớn vỏ cảm nhận” (Look and Feel) của Apple Macintosh
Vỏ bóy giờ, cụ thể sẽ lỏ một chuyển biến lớn khi Mierosoft phõt minh lại
một cõch tổng thể phương thức mỏ chỷng ta sẽ lỏm việc, sẽ lập trớnh cho chiếc mõy tợnh thón yởu Nếu bạn đang lỏ một nhỏ lập trớnh C++, hay bạn đang sống nhờ vỏo hệ điều hỏnh Windows hay bộ thư viện MEC, khừng cún nghi ngờ chắc chấn bạn cũng sẽ bị đắm chớm trong thế giới NET
Trởn thực tế ngỏy nay, Internet đọ trở thỏnh phương tiện cho chỷng ta lỏm việc, thăm bạn bộ, sử dụng tỏi khoản ngón hỏng, chơi, tõn ngẫu, rất thực tế vỏ hiệu quả nhờ vỏo cõc phần mờm được viết để thực hiện cõc kết nối IP (Internet Protocol) cho WWW (World Wide Web) Cõc phần mềm được yởu cầu thực hiện hỏng triệu cuộc giao dịch dữ liệu giữa cõc mõy tợnh với nhau, vỏ số lượng cõc cuộc giao dịch nỏy ngỏy cỏng tăng theo sự tăng nhanh của khả năng vỏ sự phức tạp của Web Việc sử dụng thư điện tử, lướt trởn cõc trang Web, trao đổi với cõc cơ sở dữ liệu vỏ sử dụng cõc ứng dụng phón tõn ngỏy cỏng trở nởn phức tạp hơn, vớ thế trớnh độ vỏ kỹ thuật lập trớnh để tạo vỏ bảo dưỡng cõc phần mềm cũng ngỏy cỏng được yởu cầu cao hơn, tỉnh vợ hơn Cõc nhỏ lập trớnh chỷng ta hỏng ngỏy phải đối diện với COM, COM+, DCOM, SP, SOAP, XML, XSL, cũng như phải chiến đấu với hỏng tõ cõc sõch hướng dẫn, cac bo cong cu SDK (Software Developer Kit) phtic tap
Microsoft, cũng như đa số trong chỷng ta, đọ tạo nởn ngỏy cỏng nhiều cõc cừng cụ chuyởn dỳng Hệ điều hỏnh hay cõc ứng dụng Windows đóy đủ tợnh năng hơn, theo yởu cầu của kỹ thuật, cừng nghệ, vỏ do đụ đọ thởm vỏo khừng ợt ede SDK hay cõc tiởu chuẩn ở chỗ nỏy, chỗ nọ Kết quả lỏ hệ điều hỏnh, thư viện, cừng cụ trở nởn khừng cún khả chuyển, quõ nặng nẻ với biết bao cõc mở rộng (extensions), add-in (phần phụ thởm) Thế lỏ bộ khung NET ra đời NET thực sự thay đổi điều kế trởn Đụ khừng chỉ lỏ một bước tiến, một nóng cấp hay một hợp nhất cõc cừng việc Mỏ đụ chợnh lỏ một điều vĩ đại, một sự đũng cảm, một cuộc bứt phõ ngoạn mục Nụ định nghĩa lại tất cả mọi điều bạn đọ biết về lập trớnh cho mõy PC về tất cả mọi hớnh thỳ lẫn kợch thước, kể cả về ngừn ngữ lập trớnh trong đụ
2 XOạ BO HUYEN THOAI VE MOT MAY AO NET
Trang 14
PHẨNI: Mở đóu
mức mọ mõy tương tự như cõc mọ đọ biởn dịch của cõc chương trớnh C Quan niệm phổ biến nhưng sai lắm lỏ NET đọ dỳng một ngừn ngữ trung gian, mỏ thường được gọi lỏ P-Code (pseudo-code) Thật ra, NET cỏi đặt một chế độ biởn dịch nhiều tầng (multistage compilation): trước tiởn, chương trớnh sẽ được biởn dịch sang một đạng trung gian khả chuyển vỏ đến lỷc nụ được thực thi, nụ sẽ được biởn dịch tức thời (just-in-time Compile hay cún gọi lỏ JIT Compile) sang dạng thực thi cuối cỳng (final executable form)
Ghỉ chỷ: Theo chỷng từi cụ lẽ đóy lỏ một cõch nụi cho bhỷc uới dJqua 0ớ ta cũng cụ thể hiểu dạng trung gian khả chuyển gần như lỏ binary-code của Java va JIT cũng gón giống uới daua Runtime
Mặc dỳ vẫn cún khõ phức tạp, hệ thống nỏy cũng đọ đem lại cho cõc nhỏ lập trớnh vừ số thuận tiện Tất cả mọi ngừn ngữ đều cụ một mức chung sau khi biởn dịch sơ khởi 6 dang trung gian Nhờ thế, cõc mừđưn đọ được viết từ cõc ngừn ngữ khõc nhau như C#, Visual Basic, Eiffel, FORTRAN, COBOL hay bất kỳ ngừn ngữ nỏo sẽ được hỗ trợ trong tương lai cụ thể được tợch hợp vỏo trong một ứng dụng duy nhất Lý do của sự thể nỏy lỏ một mừđun một khi được biởn dịch ở dạng ngừn ngif trung gian (Intermediate Language hay gọi tắt lỏ IL) sẽ được đụng gụi với tất cõ mừ tả của mớnh Cõc giao diện, thuộc tợnh, phương thức vỏ cõc lớp của nụ được mừ tả bằng siởu đữ liệu (metadata), Tất cả những thừng tin nỏy sẽ để dỏng đọc được bởi cõc mừi trường lập trớnh nhanh RAD (rapid application development environment) nhu Visual Studio NET
Khi trớnh thực thi, NET được gọi để chạy một chương trớnh đọ được chuyển đổi sang dạng IL, nụ sẽ gọi một trớnh biởn dịch tức thời (JITer) để biởn dịch đoạn IL đụ sang mọ mõy hoỏn toỏn để thực thi trởn bộ vi xử lý của mõy Trớnh JITer lỏm việc rất nhanh vỏ hiệu quả, cả ở việc khừng biởn địch cõc phần khừng được dỳng đến của mọ lệnh IL Hiển nhiởn lỏ việc biởn dịch cũng cần đến thời gian vỏ phụ thuộc vỏo việc chỷng ta xõc định thời gian nạp (load time) chương trớnh hay tợnh khả chuyển (portability) cõi nỏo sẻ cẩn hơn Vỏ khi ta quyết định tợnh khả chuyển khừng quan trọng, hệ thống sẽ cung cấp một trớnh biởn dịch pre-JIT cho phờp ta chuyển đổi [L thỏnh ma mõy thường trực, coi nhu tao nờn cdc tap tin thực thi EXE hay COM quen thuộc
Minh hoạ dưới cho thấy cõc tầng của bộ khung NET, được xem xờt bởi một lập trớnh viởn Cõc phần in xõm lỏ cõc phần được NET thởm vỏo Bộ khung NET “hiện nay cung cấp 4 ngừn ngữ riởng: C#, Visual Basic, C++ với bộ tự quản mở rộng (managed extension) vỏ JScript Một vỏi ngừn ngữ khõc được phõt triển bởi cõc cừng ty,khõc như Eujitsu với COBOL,
Đọ cụ một nhụm cõc trớnh biởn dịch chuyển mọ lệnh của cõc ngừn ngữ hỗ trợ NET thỏnh cõc mừđun ngừn ngữ trung gian Bởn dưới sẽ lỏ cõc trớnh biởn địch tức thời chuyển ngừn ngữ trung gian sang mọ mõy (IL-to-machine-code JITer) Cụ
một trớnh JJTer chuẩn được hệ thống dỳng với nguồn lực vỏ bộ nhớ đừi dỏo, nụ sẽ
Trang 15CHUONG 1-1: Bộ khung NET Mức cao C# VB C++ JScript Cõc ngừn ngữ khõc FÈ Trớnh biởn dịch (Compiler) Ngừn ngữ trung gian TL JIT Compiler econoJIT Compiler preJIT Compiler File thuc thi exe (OS) NET Common Language Runtime Phón cứng V Mức thấp Hớnh 1-1
Kế đụ lỏ trớnh biởn dịch JẻT kinh tế (econoJƑT compiler), nụ biởn dịch rất nhanh nhưng khừng tợnh đến (hay tợnh đến rất ợt) sự tối ưu của lệnh vỏ phụ thuộc vỏo một tập con của ngừn ngữ trung gian tiển tối ưu (Pre-optimized IL)
Trớnh biởn dịch cuối cỳng lỏ trớnh tiền biờn dich (preJIT compiler), đờ nhiệm vụ lỏ tạo ra cõc mọ thực thợ được, cõc mọ mỏ ta cụ thể phón phối thẳng đến người dỳng Phương thức nỏy chỉ được sử dụng đối với những chương trớnh khừng cần thay đổi gớ trởn những nền phần cứng khõc nhau
Cuời cing 14 CLR (.NET Common Language Runtime - tam dich lỏ trớnh thực thi ngừn ngữ phổ quõt) Khối chức năng nỏy cung ứng tất cả cõc dịch vụ mỏ cõc thỏnh tố của chỷng sẽ giao tiếp với mõy hay với hệ điều hỏnh riởng trởn mõy đụ Rất thỷ vị nếu chỷng ta chỷ ý rằng mõy mỏ ta vừa nụi ở trởn khừng chỉ lỏ mõy PC vỏ hệ điều hỏnh cũng khừng chỉ lỏ DOS hay Windows Microsoft đọ cụ một chiến lược “gom thóu thiởn hạ” bằng cõch xóy dựng bộ khung NET trởn mọi nởn, từ cõc dụng cụ nhỏ nhất, cõc thiết bị cầm tay, điện thoại, cõc PDA cho đến cõc hệ UNIX hay LINUX Mặc dỳ đến nay NET vẫn chưa thể đõp ứng ngay với cõc hệ thống khõc hơn lỏ Windows 2000 (I386), nhưng tợnh khả chuyển của nụ cũng đang trở nởn đủ dỳng như lỏ một mừi trường lập trớnh viết-một-lần-chạy-khắp-nơi
8 NGễN NGỮ TRUNG GIAN MICROSOFT (MSIL)
Điều đang nụi lỏ H, của Microsoft khừng ẩn đằng sau cõc tầng của mõy Nụ
Trang 16PHẨN I: Mở đầu
mỏ bạn cụ thể tự viết lấy nếu bạn đủ can đảm DI nhiởn cũng cụ những cừng cụ để bạn cụ thể địch ngược cõc bản ma IL lai dờ xem cõc dúng lệnh của mớnh vỏ cõc đối tượng hệ thống Trong một chương sau chỷng ta sẽ cỳng phón tợch chỉ tiết về IL vỏ thử viết trực tiếp cõc ứng dụng nhỏ bằng IL
4 QUAN LY BO NHG NET
Một đặc điểm đõng bỏn cọi của NET lỏ trớnh quản lý bộ nhớ thực thợ của nụ hoạt động như một hệ thống thu gom rõc (garbage-collected system viết tắt lỏ GC system) Cờ ngudi thi thich thỷ, người lại lo sợ hay chết lặng đi vớ nụ Cụ thể bạn đọ lỏ cõc nhỏ lập trớnh từ lóu lắm, nếu thế, chắc bạn khụ thể mỏ quởn được những õc mộng trong những ngỏy của Lisp, lỷc đợi chờ người dọn rõc đến, mỏ ừng ta chỉ đến vỏo thứ ba: cõ nỷi giấy loại ở chung quanh bạn Cún bạn lỏ lập trớnh viởn C++ thớ hẳn bạn sẽ thấy trớnh quản lý bộ nhớ nhảy loạn xạ vỏ cụ khi đẫn
đến treo mõy khi bạn quởn đi lời nguyễn về sự quản lý việc định vị con trỏ vỏ loại
bỏ cõc vỳng nhớ bạn đọ cấp
Trớnh quản lý bộ nhớ của NET đọ tiếp cận việc định vị bộ nhớ theo một cõch khõc Một khối bộ nhớ được tự động ghi nhớ thừng tin khi nụ được yởu cầu cấp phõt cho đối tượng vỏ cụ những tham chiếu đến nụ Chỉ khi tất cả cõc tham chiếu đến khối nhớ được xoõ thớ đối tượng hay vỳng nhớ mới bị hủy thật sự Cõch giải quyết như thế thật sự đọ giảm nhẹ gõnh nặng quản lý bộ nhớ cho lập trớnh viởn Bạn khừng cún cần phải nhớ lỏ đọ xoõ vỳng nhớ đọ cấp hay chưa: đơn giản lỏ từ nay bạn chỉ cần biết lỏ bạn khừng cún dỳng nụ nữa Một lớp sẽ khừng cún phải chỷ ý theo dửi lượng tham chiếu đến nụ nữa, nụ đọ biết được khi nỏo nụ sẽ tự mớnh huỷ bỏ
Để giảm sự phón mảnh của vỳng nhớ động (heap), trớnh GC cũng đọ hướng mục tiởu vỏo việc củng cố cõc vỳng bộ nhớ đang sử dụng hay cõc vỳng nhớ tự đo chưa được đỳng đến Điều nỏy ngăn ngừa bộ nhớ bị mất vừ lý vỏ nóng cao hiệu quả của một hệ mõy chủ Heap được quản lý cũng chắc chắn rằng tất cả cõc truy xuất bộ nhớ khừng chuẩn, như trỏn bộ nhớ hay treo mõy, sẽ khừng thể tõc động đến đữ liệu của chương trớnh khõc đang chạy trởn cỳng mõy nỏy Vỏ như thế nụ lỏm cho hệ thống trở lởn tin cậy vỏ bảo mật
Bộ GC thường bị coi lỏ chậm vỏ khừng hiệu qua nhưng Microsoft đọ quả quyết rằng GC của NET sẽ khõc, nụ thật sự hoạt động theo thời gian thực GC cia NET sẽ hoạt động tức thời vỏ khừng tõc động đõng kế lởn bộ vị xử lý (CPU) Tổng quõt, trởn một mõy Windows 2000, GC chỉ cần khoảng 1/1000 tổng thời gian xử lý của CPU
Cuối cỳng, cụ cả một hệ thống dự phúng cho cõi gọi lỏ vỳng nhớ hay mọ lệnh khừng được quản lý (hay khừng an toỏn) mỏ cõc lập trớnh viởn cần dỳng con trỏ để định vị vỳng nhớ thường gặp phải Như thế bạn cụ thể dỳng cõc cấu trỷc cổ xưa của C++ ngay trong bộ khung NET
5 HE THONG KIEU DU LIEU CUA NET
Cõc lập trớnh viởn C++ cụ lẽ sẽ cụ nhiều ngạc nhiởn khi biết về cõch quản
Trang 17CHƯƠNG 1-1: Bộ khung NET
lỏ một vỳng nhớ 2-bytes nỏo đụ Thật ra, dữ liệu vẫn được lưu vỏp bộ nhớ với một kợch cỡ nỏo đấy nhưng bóy giờ bạn đọ cụ thể xem chỷng như lỏ những đối tượng thực sự vỏ truy cập đến chỷng theo cõc phương thức mỏ đối tượng cho phờp
Cụ 2 phón biệt nhỏ về nhụm đữ liệu: kiểu giõ trị (Value type) nhu chars,
int, doubles vỏ một số nữa Kiểu tham chiếu (Reference type) như array, interface, class hay string
Một điều thỷ vị lỏ mọi ngừn ngữ trong Visual Studio NET như C#, VB, C++ dờu sut dung cdc kiờu dit liờu nay giống như cõch mỏ NET đọ tự định nghĩa Nghĩa lỏ, inkeger của VB sẽ dỳng hoỏn toỏn như integer của C# vỏ việc chuyển đổi giữa
kiểu thậ (real type) vỏ cõc kiểu như variant lỏ khừng cần thiết
6 CạC ĐỐI TƯỢNG TRONG HỆ THONG CUA KHUNG NET
Mừ hớnh cõc đối tượng của hệ thống của NET được lưu giữ trong một tập cõc tập tin DLL Vỳng khừng gian hệ thống (System namspace) đọ chứa một hệ thống cõc lớp (classes) cho cõc tập hợp, bảo mật, truy xuất tập tin, truy cập cõc hỏm Windows API, XML, Vỏ hiến nhiởn lỏ tất cả hệ thống NET đều đọ sắn sỏng cho C# vỏ VB cũng như cõc ngừn ngữ khõc
Lưu ý:.NET đưa ra một khõi niởm mới ta Namspace hay khừng gian tởn Nụ tương đương uới khõi niệm tổng quõt thư viờn (library)
7 C# - MỘT NGễN NGỮ LẬP TRèNH MỚI
Khởi đầu với tởn gọi lỏ Cool vỏo khoảng năm 2000, C# đọ tạo ra vừ số cõc cuộc tranh luận lớn trởn nởn NET Từ cõc huyền thoại, cõc đồn đại vỏ cõc ước đoõn, C# ngỏy nay đọ thật sự trở thỏnh một ngừn ngữ đơn giản, hoỏn toỏn hướng đối tượng vỏ rất tuyệt vời Cõc đặc trưng nỏy của C# cũng gần giống với những tuyởn bố của Java? Dỳ cụ hay khừng thớ rử rỏng cõc nhỏ thiết kế C# đọ rất muốn tạo ra một ngừn ngữ cụ thể lỏm vừa lúng giới lập trinh C++ C# rất đễ đõp ứng với họ vỏ cụ khừng ợt cõc cấu trỷc gần giống như C++ Dĩ nhiởn ta cũng khừng loại trừ sẽ cụ vỏi thiếu sụt nhỏ nỏo đụ mỏ đối với một số người thớ chỷng trở nởn bất cập vỏ khừng tiện lợi
C# khừng hỗ trợ đa thừa kế (multiple inheritance); Một lớp (class) của C# cụ thể được khai bõo lỏ nụ cụ thể dựng nởn 1 hay nhiều cõc interface (giao điện hay giao tiếp), nhưng tợnh đa kế thừa của cõc lớp (classes) cơ bõn lại khừng được chấp nhận Đối với một số lập trớnh viởn, đặc biệt lỏ những ai yởu thợch ALT, thớ tợnh chất nỏy được xem lỏ một bất cập
Hệ thống C# cũng khừng cho phờp sử dụng bất kỳ cõc kiểu mẫu template nỏo cả Dỳ vậy, chỷng ta sẽ bỏn thởm về vấn để nỏy ở cõc chương sau Đa số cõc cuộc thảo luận về C# hiện nay đều từ phần ứng của những ai đọ gạt bỏ C# như lỏ một cố gắng hiển nhiởn nhằm vỏo việc xoõ bỏ Java Tuy nhiởn, thật ra C# vỏ đava cụ thể được xem như những con ngựa trởn những đường đua khõc nhau, chỷng cụ
thể cỳng tồn tại vỏ chung sống hoỏ bớnh C# vỏ toỏn bộ hệ thống NET sẽ lỏ cừng
cụ tốt hơn cho việc kết hợp cõc ứng dụng khõch vỏ cõc ứng dụng phợa mõy chủ,
cún Java cụ những khuyết điểm rử rỏng cho phần mõy khõch
Chỷng ta cụ thể nụi thởm về C# lỏ một ngừn ngữ hoỏn toỏn hướng đối
tugng (totally object-oriented) C++ bat nguờn tir C: trước hết đụ lỏ một sự bổ sung
phức hợp cho C, sau đụ lỏ một cố gắng thực sự cỷa định hướng đối tượng Để tốt
Trang 18
PHẨNI: Mở đóu
những ham độc lập vỏ cõc biến toỏn cục ễ# thớ khõc, nụ tuyệt giao hoỏn toỏn với
cõc đặc tợnh như thế Mọi kiểu biến, kể cõ kiểu giõ trị đơn giản, đều được xem xờt
như lỏ một đối tượng Mọi hỏm đều phải thuộc một lớp (class) Khừng cún được dỳng cõc biến toỏn cục Tuy thế, xin đừng lo lắng, vớ cõc lớp chứa cõc hỏm tĩnh hay biến tĩnh cụ thể được xem vỏ hỏnh động như cõc hỏm độc lập vỏ cõc biến toỏn cục Ta, họy xemi xờt một vợ dụ vừ cỳng nổi tiếng, vừ cỳng được ưa dỳng-vỏ cũng rất, bị ghờt: chương trớnh nhỏ gọn “Hello World” trong ngừn ngữ C# using System; class helloworld; { public static int Main() { Console WriteLine (“Hello Word”); return 0; } }
Nhu bạn thấy, cõc khai bõo vỏ cóu lệnh khõ giống C, vỏ bạn cụ thể hiểu được dễ đỏng nếu bạn đọ biết lập trớnh C trước đóy Một chương trớnh đơn giản của C# lỏ như vậy Chỷng ta sẽ tớm hiểu nụ trong chương sau
^Z a? wy g CAC DOI TUGNG TỰ Mễ TẢ NHƯ THấ NáO?
Siởu dữ liệu (metadata) lỏ thỏnh phần chợnh yếu trong kiến trỷc đụng gụi của NET Framework Metadata dỳng để mừ tả cõc cấu trỷc dữ liệu, bạn cụ thể xem metadata thuộc loại dữ liệu đỳng mừ tả đữ liệu Nụ dỳng mừ tả cõc lớp, phương thức, danh sõch tham số, cõc thỏnh phần đữ liệu trong file EXE hoặc ‘DLL Bằng mừ tả metadata bất kỳ đối tượng nỏo cũng cụ thể đọc vỏ hiểu được cấu trỷc của đối tượng viết bằng ngừn ngữ khõc Vợ dụ đối tượng C# hoỏn toỏn cụ thể đọc vỏ sử dụng được cõc dời tugng viờt bang Visual Basic hay C++ NET
9 TƯƠNG TạC VỚI THẾ GIỚI COM
Tuy NET lỏ mừ hớnh mới thay thế cho thế giới COM đang cụ trong kiến trỷc của Windows nhưng việc thay thế khừng điễn ra đến nỗi bạn mất hết khả năng sử đụng đối tượng CƠM Nền NET cho phờp bạn sử dụng vỏ gọi cõc đối tượng COM ngay từ cõc đối tượng NET vỏ tạo ra cõc lớp vỏ bọc cho phờp đối
tượng NET cụ thể biến thỏnh đối tượng COM
10 WINDOWS FORMS, WEB CONTROLS VA GDI+
Nếu bạn đọ từng viết chương trớnh Windows trước đóy bạn hẳn đọ quen với lớp thư viện đồ họa cực kỳ bấp dẫn Trong NET' bạn cụ rất nhiều lựa chọn để lập trớnh giao điện đồ bọa, sử dụng lớp Windows Forms, thư viện GDI+ hoặc cõc điều
khiển Web Control để tiếp cận với giao điện đỏnh cho ứng dụng Web Bạn khừng
cún phải mệt nhọc với cõc lớp MŒC, thay vỏo đụ lỏ những lớp thu viờn NET don giản dễ hiểu vỏ hiệu quả hơn rất nhiều Hỏng loạt cừng cụ lập trớnh hiệu quả được thởm vỏo mừi trường Visual Studio NET mỏ bạn khừng hờ tớm thấy trong những mừi trường lập trớnh trước đóy
Trang 19
Chương 1.2
BO THUC THI NGON NGU TONG QUAT
(COMMON LANGUAGE RUNTIME)
Cờe vdn dờ chinh sờ duoc dờ cap dờn
vs Tổng quan vờ kiờn triic NET va ngờn ngit CLR ơ Quan hệ của CLR trong NET
1 TỔNG QUAN
Bộ thực thi ngừn ngữ tổng quõt (Common Language Runtime — CLR) giữ nhiều vai trú trong hệ thống NET Nụ lỏ phần quan trọng trong hệ thống thực
thị, nhưng nụ cũng giữ nhiệm vụ tợch cực trong việc phõt triển vỏ triển khai phón
mềm chạy trởn kiến trỷc nỏy Nụ cung cấp sự hỗ trợ đa ngừn ngữ bằng cõch quản
lý cõc trinh biởn dịch (compiler) được dỳng để biến đổi mọ nguồn thỏnh ngừn ngữ
trung gian (intermediate language- IL) vỏ từ IL đến mọ gốc (native code), vỏ nụ buộc chương trớnh phải thoả tợnh an toỏn vỏ bảo mật
Chỷng ta họy xem xờt những vai trú nỏy chỉ tiết hơn
1.1 Đơn giản hoõ việc phõt triển
Vai trú phõt triển của CLR lỏ quan trọng trong việc giảm gõnh nặng mỏ chỷng ta phải mang trong cừng việc của chỷng ta từ ngỏy nỏy sang ngỏy khõc Dỳng NET, bạn khừng cần phải lo đến chỉ tiết thực chất vấn để của GUIDs, TUnknown, [Dispatch, hay cdc thu viờn kiểu CLR sẽ thay bạn chăm lo tất cả những thứ nỏy
Mọ sẽ đõng tin cậy hơn vớ việc quản lý bộ nhớ cũng lỏ trõch nhiệm của CLR Cõc đối tượng được thể hiện dưới CLR khừng cần tợnh đến tham chiếu tường mớnh; dữ liệu mỏ bạn cấp phõt được thu hồi lại bởi bộ đọn dep rade (Garbage Collector) khi mọ lệnh của bạn khừng sử dung nifa Metadata (siởu đữ liệu — da liệu cơ sở) cũng cho phờp liởn kết động cõc chương trớnh khả thi Điều nỏy muốn nụi rằng cõc trục trặc trong việc kết hợp cõc DLL quõ hạn hoỏn toỏn khừng cún nữa Độ tin cậy cũng được nóng cao qua tợnh an toỏn kiểu Bạn khừng cần xem xờt đến những điều chưa biết như kợch thước cấu trỷc hay tổ chức cõc thỏnh phần trong một đối tượng nỏo đụ, nhờ thế bạn cũng khừng cần lo lắng gớ về cõc sắp xếp
hay hiệu chỉnh Hơn thế, khừng bao giờ bạn cần lo về việc kiểm tra giới hạn của
mảng (array) hay bộ đệm (buffer)
1.2 Cừng cụ hỗ trợ
CLR cộng tõc chặt chẽ với cõc cừng cụ như Visual Studio, cõc trớnh biởn dịch, cõc trớnh gỡ rối, vỏ cõc trớnh tạo profiles để lỏm cho cừng việc của người
phõt triển đễ dỏng hơn nhiều Ngay cả bạn khừng cần Visual Studio NET ma chi
Trang 20PHAN I: Mờ dau
được cung cấp bởi SDK cũng tốt như lỏ trớnh đọ được tợch hợp vỏo VS.NET Cõc cừng cụ khõc, chẳng hạn như bộ dịch ngược ngừn ngữ trung gian (Intermediate Language Disassembler — ILDASM), tan dung tiờn lợi của cõc dich vụ được cung
cấp bởi CLR
1.8 Hỗ trợ đa ngừn ngữ
Van dờ co ban về hỗ trợ đa ngừn ngữ lỏ hệ thống kiểu chung vỏ metadata (siởu đữ liệu - đữ liệu cơ sở) Cõc kiểu dữ liệu cơ bản được sử dụng bởi CLUR lỏ phổ biến đối với tất cả cõc ngừn ngữ Vớ vậy khừng cụ cõc vấn đề chuyển đổi ở cõc kiểu số nguyởn (integer), số chấm động (floating-point), vỏ chuỗi (string) Tất cả cõc ngừn ngữ đởu giải quyết tất cả cõc kiểu dữ liệu theo cỳng một cõch Cũng cụ một cơ
chế để định nghĩa vỏ quản lý cõc kiểu mới
“Tất cả cõc ngừn ngữ cấp cao biởn dịch thỏnh IL Một khi đọ được biởn dịch vỏ metadata được tạo cho đối tượng, cụ thể truy xuất dễ đỏng từ cõc ngừn ngữ khõc Điều nỏy muốn nụi rằng cõc đối tượng được viết bằng một ngừn ngữ cụ thể được kế thừa trong một ngừn ngữ thứ hai Cụ thể viết một lớp bằng VB vỏ kế thừa từ nụ trong C#
Đến nay, cụ khoảng 15 ngừn ngữ được hỗ trợ bởi kiến trỷc NET, kể cả C++, Visual Basic, C#, Perl, Python, Jscript, Pascal, COBOL, va Smalltalk
1.4 Việc triển khai được thực hiện đễ hơn
Với kiến trỷc NET, khừng bao giờ cần phải đăng ký cõc component (thỏnh phần) trong hệ thống Đơn giản bạn cụ thể chờp một component vỏo một thư mục, va CLR sờ bao dam rằng nụ được biởn dịch vỏ chạy đỷng Về phần mọ được viết cho ASP.NET, ban chi cần chờp mọ nguồn C# cơ bản, Jscript, hay VB, va trớnh biởn dịch 1L sẽ được thực thi trởn mọ nguồn đỷng đụ,
Cõc component cụ thể triển khai hay cỏi đặt vỏo 2 nơi Nơi thứ nhất lỏ thư mục mỏ ứng dụng cư trỷ Điểu nỏy cho phờp cõc phiởn bản khõc nhau của ứng dụng cỳng từn tại trởn cỳng một mõy Nơi thứ hai lỏ Global Assembly Cache Đóy lỏ kho lưu trữ trung tóm cho cõc hợp ngữ (assembly) mỏ tất cả cõc ứng dụng của NET cụ thể truy xuất đến
Cho dỳ cõc component được lưu trữ bất cứ nơi đóu, thủ tục cập nhật rất đơn giản Bạn chỉ chờp hợp ngữ (assembly) vỏo đỷng thư mục, dỳ lỏ đối tượng đụ đang chạy (bạn khừng thể lỏm điều nỏy với một DLL của Windows), vỏ hệ thống sẽ khiến nụ hoạt động
1.5 Su tõch biệt cõc phần mềm
.Cõc ứng dụng bị cừ lập với một ứng dụng khõc bởi CLR để chỷng khừng thờ ảnh hưởng lẫn nhau Cõc tỏi nguyởn cụ thể được dỳng chung, nhưng việc dỳng chung được tạo ra một cõch rử rỏng Điều nỏy muốn nụi rằng một hệ thống NET
cụ thế cụ cõch tiếp cận tợnh bảo mật của hệ thống nếu cần Khi chế độ bảo mật
Trang 21
CHƯƠNG 1-2: Bộ thực thi ngừn ngữ tổng quõt
thống, ta cụ thể điều chỉnh việc cho phờp truy xuất cõc tập tin hay cõc tỏi nguyởn
hệ thống khõc chỉ đựa trởn cơ sở ứng dụng
1.6 Tợnh an toỏn kiểu vỏ sự kiểm tra
CLR thực thi tợnh bảo mật vỏ tin cậy qua an toỏn kiểu, sự kiểm tra vỏ uy thõc Mọ lệnh cụ tợnh an toỏn kiểu được xóy dựng phỳ hợp với cõc qui ước mỏ CLR đưa ra Nụ chỉ dỳng cõc kiểu được nhận dạng, chỉ dỳng bộ nhớ được cấp phõt bởi ,trớnh quản lý bộ nhớ (memory manager) vỏ khừng thể truy xuất vỏo dữ liệu cục bệ hay cõc phương thức của cõc ứng dụng khõc hay cõc tiến trớnh (process) khõc Một chương trớnh an toỏn kiểu khừng thể rơi vỏo tớnh trạng vi phạm khừng gian vỏ ghi độ lởn cõc khối bộ nhớ của cõc tiến trớnh khõc Thẩm tra an toỏn kiểu xảy ra khi mọ lệnh được nạp lởn vỏ được thực thi bởi CLR Trong suốt tiến trớnh thừng dịch mỗi phương thức ,, CUR xem xờt cõc đặc tả metadata (đặc tả đữ liệu) của phương thức vỏ kiểm tra tợnh an toỏn kiểu của nụ Cụ một vỏi tớnh huống mỏ việc kiểm tra nỏy lỏ khừng thế, chẳng hạn, khi CLR cần dỳng mọ lệnh bởn ngoỏi NET từ một đối tượng của NET Đóy lỏ trường hợp thừng thường khi một lớp NET gọi một Win32 DLL Trong trường hợp nỏy mọ lệnh phải được ủy thõc (must be trusted) bởi CLR
1.7 Tợnh bảo mật
Vấn để bảo mật của việc quan trắc cõc hệ thống mỏ cụ thể thực thi cõc nội dung hoạt động hay thực hiện cõc script của người dỳng lỏ rất cao Với tư cõch lỏ một client bạn khừng cho phờp một chương trớnh khừng rử nguồn gốc chạy trởn mõy bạn, hủy cõc dữ liệu cụ giõ trị Với tư cõch lỏ một người cung cấp địch vụ bạn khừng cho phờp cõc cuộc tấn cừng hay cõc lỗi đơn giản mỏ người dỳng mang lại cho toỏn bộ hệ thống của bạn
CLR kiểm soõt tợnh bảo mật của hệ thống qua một cặp thừng tin của người dỳng lỏ user vỏ mọ nhận đạng để kiểm tra Việc nhận dạng mọ, vợ dụ như người tạo ra vỏ nguồn gốc của mọ lệnh, cụ thể được biết vỏ việc cho phờp sử dụng cõc tỏi nguyởn sẽ được gõn tương ứng Kiểu bảo mật nỏy được gọi lỏ Evidence Based Security (Bảo mật dựa trởn bằng chứng) vỏ lỏ một đặc tợnh chợnh của NET Kiến trỷc NET cũng cung cấp việc hỗ trợ cho việc bảo mật đựa trởn vai trú (role-based) dỳng trong cõc account vỏ group của Windows NT
2 QUAN HE CUA CLR VOI NET
Sơ đồ khối được trớnh bỏy trong hớnh 1.2-1 cho thấy mời quan hờ cia CLR
với kiến trỷc NET
2.1 Chỉ tiết về CLR
Như lỏ một thỏnh phần con của kiến trỷc NET, bản thón CLR được xóy
dựng từ cõc phần riởng biệt Hớnh 1.2-2 cho thấy cõc phần nỏy quan hệ với nhau
Trang 22PHẦN I: Mở đầu Other languages CH C++ VB JScript The Common Language Specification ` (Đặc tả ngừn ngữ chung)
Web Services User Interface (Cõc dịch vụ Web) (Giao diện người đỳng) Data and XML (Dữ liệu vỏ XML) Visual Studio.NET
Base Class Library (Thư viện lớp cơ sở)
The Common Language Runtime (CLR) (Thực thi ngừn ngữ chung)
Hớnh 1.2-1 : CU# uờ kiến trỷc NET The CLR
Base Class Library support Thread Support COM Marshaler
Trang 23
CHƯƠNG I-2: Bộ thực thi ngừn ngữ tổng quõt
Như bạn cụ thể thấy trong hớnh 1.2-2, chức năng chợnh của CLR như lỏ một bộ nạp lớp (Class loader) Nụ nạp cõc lớp mỏ bạn tạo hay cõc lớp mỏ được cung cấp như lỏ bộ phận của thư viện cõc lớp cơ sở, chuẩn bị chỷng cho việc sử dụng, vỏ sau đụ hoặc lỏ thực thi chỷng hoặc lỏ tham gia vỏo lỷc thiết kế (đesign-time)
Cõc lớp được nạp từ cõc hợp ngữ (assembly), NET tương đương với DLL hay EXE Đừi khi hợp ngữ chứa mọ gốc nhưng hầu như chắc chắn lỏ chứa cõc lớp đọ được biởn dịch thỏnh IL vỏ metadata liởn quan đến chỷng Trong thời gian thiết kế, CLR giao tiếp với cõc cừng cụ như Visual Studio.NET để cung cấp kinh nghiệm về phõt triển ứng dụng trong thời gian ngắn (Rapid Application Development — RAD) mỏ cõc nhỏ viết chương trớnh VB đọ dỳng trong thời gian quõ lóu, mỏ cún cho tất cả cõc module trong tất cả cõc ngừn ngữ Cún trong lỷc thực thi, bộ nạp lớp sẽ tải cõc lớp
2.2 CLR vỏo lỷc thực thi
Khi bộ nạp lớp (class loader) mở một gụi chương trớnh trong lỷc thực thi, nụ cụ một số bước quan trọng để thực hiện trước khi cõc lớp cụ thể thật sự được chạy
Trang 24PHẨN I: Mở đóu
Bộ nạp lớp (class loader) dỳng bộ quản lý mọ (Code Manager) để cấp bộ nhớ cho cõc đối tượng vỏ dữ liệu Bố trợ cõc lớp trong bộ nhớ được tợnh, vỏ mỗi phương thức đọ được lưu trữ như ngừn ngữ trung gian sẽ được coi như lỏ một stub dỳng để gọi trớnh biởn địch (compiler) cho lần thực thi đầu tiởn
CHĩ Ý Bạn sẽ thấy mừ hớnh trong hớnh 12-3 cụ hơi hiểu ngừn ngữ trung gian khõc biệt, MSIL udờ Op(IL, được biởn dịch bởi cõc trớnh biởn dich JIT cua riởng chỷng OptlL lỏ một tập con được tối tu hoõ cao của MSIL, được thiết kế đặc biệt để dỳng bởi hệ thống chủ mỏ khừng cụ sự lăng phợ bộ nhớ lay tốc độ tợnh toõn Vớ cừng uiệc đặc biệt nỏy mỏ trớnh biởn dịch của ngừn ngữ cấp cao cố gắng tối tụ hoõ, OptlL thớ thợch hợp hơn uới cõc PDA, điện thoại thừng mớnh, nỏ những thứ tương tự EconoJIT lỏ trớnh biởn dịch gọn nhẹ để dịch OpIIL thỏnh mọ mõy
Trang 25CHƯƠNG 1-8: Bộ thực thi ngừn ngữ tổng quõt 2.2.1 Bộ tạo mọ lỷc cỏi đặt
Một phón VES khừng được trớnh bỏy trong hớnh 1.2-4 lỏ bộ tạo mọ lỷc cỏi đặt mỏ thỉnh thoảng xuất hiện khi cõc hợp ngữ được đặt lởn mõy chủ lần đầu tiởn Lỷc nỏy sẽ tạo ra mọ gốc (native code) trong hợp ngữ để mỏ giảm thiếu thời gian khởi động một đối tượng cụ thế Thừng thường, việc thẩm định mọ nỏy được thực hiện lỷc cỏi đặt, nhưng nếu một phiởn bản thực thi hay việc kiểm tra tợnh bảo mật lỏ cón thiết, thớ mọ lệnh sẽ được biởn dịch lại bởi trớnh biởn dịch JIT chuẩn theo cõch bớnh thường
2.38 Cõc kiểu dữ Hệu được cung cấp bởi CLR
Như đọ đề cập trước đụ, kiến trỷc NET cụ một tập cõc kiểu đữ liệu cơ sở được dỳng bởi tất cả cõc ngừn ngữ khõc Cõc kiểu nỏy bao gồm cõc kiểu số nguyởn như số nguyởn 8-bit, 16-bit, 32-bit, va 64-bit va char (ky tu) Vỏ kể cả cõc kiểu chấm động (floating — point) vỏ cõc kiểu con trỏ đến cả vỳng nhớ của NET lẫn vỳng nhớ bởn ngoỏi NET
Tất cõ cõc kiểu dữ liệu cơ sở cụ thể được sử dụng bởi mọ lệnh viết bằng IL, vỏ bạn cụ thể tự viết IL IL rất giống với hợp ngữ (assembly language), nởn nếu bạn đọ từng lỏm việc vỏ sử dụng Z80 hay 6502, bạn sẽ cảm thấy thoải mõi với IL Ở phần sau, chỷng từi sẽ trớnh bỏy với bạn một vỏi [L được viết vỏ cõc cừng cụ đi với kiến trỷc NET mỏ cụ thể được dỳng để biởn dịch vỏ dịch ngược lại
Cõc kiểu cơ sở được định nghĩa trong bảng 1.2-1
Bang 1.2-1 Cõc kiểu đữ liệu cơ sở của CLR
Tởn kiểu Mừ tả i Giõ trị 8-bit cụ dấu phần bỳ của 2
Ul Giõ trị nhị phón khừng dấu 8-bit 12 Giõ trị 16-bit cụ đấu phan bỳ của 2 U2 Giõ trị nhị phón khừng dấu 16-bit 14 Giõ trị 32-bit cụ dấu phần bỳ của 2 U4 Giõ trị nhị phón khừng đấu 32-bit 18 Giõ trị 64-bit cụ đấu phần bỳ của 2 Us Giõ trị nhị phón khừng dấu 64-bit R4 Giõ trị chấm động IEEE 754 32-bit R8 Giõ trị chấm động [EEE 754 64-bit
I Giõ trị cụ dấu phần bỳ của 2 cụ kợch thước tự nhiởn
Trang 26PHANI; Mờ dau
R4Result Kợch thước tự nhiởn cho kết quả tợnh toõn chấm động 32-bit R8Result Kich thước tự nhiởn cho kết quả tợnh toõn chấm động 64-bit
Rprecise Giõ trị chấm động cụ độ chợnh xõc cao
0 Đối tượng cụ kợch thước tự nhiởn tham chiếu đến vỳng nhớ của NET
& Con trỏ cụ kợch thước tự nhiởn (cụ thể chỉ đến vỳng nhớ của
.NET)
Bảng 1.2-1 để cập đến cõc kợch thước “tự nhiởn” cho cõc kiểu đữ liệu Điều nỏy nụi đến cõc kợch thước mỏ được ấn định sẵn bởi phần cứng Chẳng hạn như, một mõy cụ đường truyển 16-bit cụ thể sẽ cụ số nguyởn tự nhiởn lỏ 16-bit, vỏ một mõy cụ đường truyền 32-bit sẽ cụ số nguyởn lớn phỳ hợp Điều nỏy cụ thể lỏ một vấn để khi cõc chương trớnh phải nụi chuyện với phón mềm ở đầu kia của một kết nối internet Khừng cụ chỉ thị rử rỏng, thật lỏ khụ để biết một số nguyởn ở đầu kia lớn như thể nỏo, vỏ việc khừng tương thợch về kợch thước kiểu, vỏ khừng liởn kết về cấu trỷc cụ thể xảy ra Để biết điều nỏy vỏ cõc vấn để tương tự khõc, CLR chỉ dỳng một vỏi kiểu dữ liệu dỏnh riởng khi ước lượng vỏ chạy phần mềm thực sự Kiểu cơ sở mỏ khừng vừa với cõc kợch thước ợt được chọn thớ được đụng gụi vỏ mở
gụi một cõch cẩn thận thỏnh những kiểu đữ liệu khả chuyển hơn, Điều nỏy diễn ra ở bởn dưới vỏ bạn khừng phải lo lắng gớ
2.4 Dữ liệu vỏ mọ lệnh của NET
CLR bao gờm bộ quản lý mọ (Code Manager) vỏ bộ đọn đẹp rõc (Carbage Collector — GC) Cac khời chtic nang nay chịu trõch nhiệm quản lý bộ nhớ của tất cả cõc đối tượng cơ sở của NET, kể cả cõc kiểu đữ liệu được quản lý Code Manager cấp phõt khừng gian lưu trữ; Garbage Collector xoõ nụ vỏ lam gon heap để giảm thiểu cõc phón đoạn
Vớ GC chịu trõch nhiệm lỏm gọn heap (vỳng nhớ của chương trớnh), đữ liệu hay cõc đối tượng được sử dụng trong khừng gian được kiểm soõt bởi NET thường bị di chuyển từ nơi nỏy sang nơi khõc trong suốt thời gian sống của chỷng Đụ lỏ tại sao, trong cõc tớnh huống thừng thường, cõc đối tượng luừn luừn được truy xuất bởi tham chiếu (reference) Trong thế giới C++, tham chiếu thớ khừng khõc với con trờ (pointer) Co chờ được dỳng để tớm đối tượng được tham chiếu đến cũng giống như một con trổ chỉ đến một khối bộ nhớ nỏo đụ Cõc tham chiếu C++ lỏ cõch nụi
của trớnh biởn dịch mỏ nụ chấc rằng bạn đang chỉ đến một kiểu cụ thế Trong C++ cụ thể lưu một tham chiếu đến một đối tượng, hủy đối tượng đụ, vỏ sau đụ sử dung
chợnh tham chiếu lỗi thời đụ để truy xuất đến vỳng đọ dỳng cho đối tượng Điều nỏy thường góy ra hư hỏng trầm trọng trong chương trớnh C++
Trang 27
CHƯƠNG 1-3: Bộ thực thi ngừn ngữ tổng quõt 29 (A)
trong bộ nhớ, tất cả cõc tham chiếu đến đối tượng đụ được cập nhật một cõch tự
động Điều nỏy khiến cõc component (thỏnh phần) đang dỳng đối tượng đụ sẽ
nhận được lấy tham chiếu đỷng khi cõc thỏnh phần nỏy truy xuất đến đối tượng ở lần kế
* Qua Code Manager, CLR chịu trõch nhiệm bố trợ bộ nhớ thực của cõc đối tượng vỏ cõc cấu trỷc mỏ nụ lỏm chủ Thường tiến trớnh bố trợ nỏy lỏ tự động, nhưng khi bạn cần lỏm thớ bạn cụ thể chỉ ra thứ tự, sự sắp xếp, vỏ định rử việc bố trợ bộ nhớ trong metadata Rử rỏng lỏ điều nỏy cụ thế được thực hiện vớ metadata thớ luừn cụ sẵn đối với lập trớnh viởn thừng qua tập cõc interface (giao diện) đọ được định nghĩa
2.ử Mọ lệnh của COM vỏ việc truy xuất dữ liệu
Cụ lẽ khừng rử rỏng lỏ tợnh an toỏn kiểu, tợnh bảo mật, vỏ việc kiểm tra của NET cho phờp bạn bảo vệ như thế nỏo sự đầu tư của mớnh trong mọ C++ mỏ từ lóu nay bạn đọ quõ chăm chỷt cho nụ
Như lỏ một hệ quõ, Microsoft ở trong cỳng cảnh ngộ đỷng như vậy vỏ kiến trỷc NET cụ cõc khả năng tuyệt vời cho việc sử đụng lại mọ cụ trước đóy cửa bạn
Cụ ba cơ chế cơ bản dỏnh cho thao tõc liởn kết giữa NET vỏ COM trong NET COM Interop cho phờp cõc đối tượng COM của bạn được sử dụng bởi kiến trỷc NET y như thể chỷng lỏ cõc đối tượng của NET Cơ chế gọi hệ thống (Platform Iavoke - P/Invoke) để cõc đối tượng của NET gọi cõc điểm vỏo tĩnh (static entry) trong cõc DLL giống như LoadLibrary vỏ GetProcAddress Cuối cỳng, IJW (It Just Work — Lỏm việc ngay) trong hầu hết 'cõc hớnh thức cơ bản của nụ cho phờp bạn biởn dịch lại mọ của bạn vỏ nụ lỏm việc ngay Một hớnh thức phức tạp hơn cho phờp bạn nóng cấp mọ lệnh của bạn trong việc sử dụng cõc phần mở rộng của NET đối với C++ Điều nỏy cho phờp bạn tạo đẩy đủ cõc đối tượng GC trong vỳng nhớ của N#T để mọ nguồn C++ cũ của bạn sử dụng
3.8.1 Cơ chế gọi cõc đối tượng COM (COM Interop) qua CLR
Bạn cụ thể thấy trong hớnh 1.2-2 rằng CLR chứa một bộ sắp đặt COM (COM marshaler) Khối chức năng nỏy chịu trõch nhiệm về việc gọi cõc đối tượng COM (COM Interop) trởn NET Cụ hai kịch bản cẩn phải gọi cõc đối tượng COM trởn kiến trỷc NET Kịch bản thứ nhất lỏ khi bạn muốn truy xuất cõc đối tượng COM cũ từ mọ lệnh của C# hay VB mỏ bạn viết Rịch bản thứ hai lỏ khi bạn muốn thực hiện một giao điện (interface) thừng dụng mỏ cụ cõc đối tượng COM của bạn truy xuất đến
Trang 28PHẦN I: Mở đảu 2 CLR tạo một lớp bao thực thị cho cõc giao tiếp COM ` Thế giới COM COM object Thế giới NET Runtime COM wrapper
{ 4 Đối tượng NET lấy tham chiếu được chỉ định từ untime wrapp 3 Lớp bao giữ liởn lạc với COM object Yr
1 Dời tugng NET muờn truy xuất một đối tượng: COM
Hớnh 1.2-5 : Mờ duoc quan lý tới tiến trớnh gọi đối tượng COM
Để sử dụng cõc đối tượng COM với cõc chương trớnh NET của bạn, bạn cần phải đưa vỏo (import) định nghĩa thư viện kiờu (type library) VS.NET sờ lam diờu nay cho bạn một cõch tự động khi bạn thởm một tham chiếu vỏo đối tượng COM trong IDE, theo cỳng một cõch mỏ cõc lập trớnh viởn VB đọ lỏm trong nhiều năm Bạn cũng cụ thể sử dụng cừng cụ TUBImp (Type Library Import) một cõch tường minh TLBImp sẽ chuyển cõc tởn phương thức trong COM thỏnh cõc tởn phương thie trong NET cho ban Vi du, tởn phương thức trong COM
HRESULT MyMethod(BSTR b, int n, [out, retvallint *retval); Được dịch thỏnh
Tnt MyMethod(String b, int n);
Kết quả lỏ, khi bạn gọi phương thức bạn khừng phải lo lắng hiểu
HRESULT, đơn giản bạn cụ thể gõn giõ trị nguyởn trả về vỏo một biến trong mọ
lệnh của bạn Thực tế, toỏn bộ hớnh ảnh tiến trớnh NET-to-COM lỏ rất dễ sử
dụng Bạn khừng phải lo việc chuyển đổi dữ liệu Như bạn cụ thể thấy trong vợ dụ,
Trang 29
CHƯƠNG 1-2: Bộ thực thị ngừn ngữ tổng quõt 31
Khi bạn muốn gọi một đối tượng NET từ cõc đổi tượng CƠM, tiến trớnh mỏ CLR ding để lỏm cho việc kết nối dễ dỏng lỏ tương tự với sơ để được đưa ra trong hớnh 1.2-5 Hớnh 1.2-6 mừ phỏng việc kết nối COM-to-NET 2, CLR tạo một lớp bao cụ tất cả, cõc giao tiếp
4, Đối tượng COM
nhận giao điện TUnknow y COM 7 IDispatehl client Runtime Wrapper | 1ÐaStuff Đối tượng NET thực hiện IDostuff 3 CLR giữ tham chiếu được chỉ định cho đối Lượng NET' 1 COM client car truy xuất một interface trởn đối tượng NET
Hớnh 1.2-6 7ruy xuất một đối tượng NET từ CON
Cõc đối tượng COM chỉ cụ thở truy xuất cõc phương thức toỏn cục của cõc đối tượng NET của bạn, nhưng chỷng cụ thể được sử dụng từ thế giới COM
Đầu tiởn, tạo một typelib từ đối tượng của bạn bằng cõch sử dụng cừng cụ TlbExp của NET Kế đến, đăng ký hợp ngữ được tạo bởi TlbExp bằng cừng cu RegAsm Đóy lỏ lần duy nhất bạn sẽ cần đăng ký cõi gớ đụ dưới NET; COM đang chạy trong phần chưa được quản lý trởn mõy chủ cần phải kợch hoạt đối tượng nỏy theo cõch chuẩn Cuối cỳng, từ COM bạn cụ thể sử dụng CoCreatelnstance va QueryInterface, sử dụng AddRef vỏ Release như thường, vỏ sử dụng HRESULT mỏ lớp wrapper cung cấp
Sau nay, trong phần 5.3, chỷng ta cụ mờt chuong danh cho COM Interop, ta
Trang 3032 PHAN I: Mờ dau
9.5.9 Lời gọi hệ thống (Platform Invoke - P/Invoke) tờ CLR
Một trong những yởu cầu chung nhất đối với hoạt động liởn kết sẽ lỏ việc sử dung một DLL mỏ đọ tổn tại trởn hệ thống cục bộ Chẳng hạn như, bạn cụ thể cẩn phải tiếp tục sử dụng cõc cừng cụ mỏ bạn đọ đầu tư vỏo vỏ chỉ cụ sẵn ở đạng DLL
Riến trỷc NET cung cấp cơ chế P/Invoke cho mục đợch nỏy Cơ chế nội tại thớ rất giống với COM Interop, nhưng vớ cõc DLL mỏ bạn đỳng thớ luừn luừn ở cục bộ (trởn cỳng một mõy), hệ thống dễ sử dụng hơn
Để sử đụng cơ chế P/Invoke, bạn cần một lớp wrapper để uỷ quyền cõc lời gọi từ CLR đến hỏm thực sự của DLL Bạn cụ thể tạo cõc wrapper nỏy bằng cõch sứ dụng cõc thuộc tợnh đặc biệt trong cõc định nghĩa phương thức của bạn
Đoạn mọ trong vợ dụ sau sẽ cho phờp bạn gọi một ham trong một DLL tuỳ biến
MyDI1.DIH chứa một hỏm int Myfunction(int x); Public class MyDllwWrapper
{
[D11TmportE (“MyD11.D11”, EntryPoint="MyFunction”) } public static extern int Myfunction(int x);
}
Bóy giờ bạn cụ thể truy xuất DLI sử dụng cõc lệnh của C#: Tnt r =MyD11Wrapper MyFPunct ion(12);
Trong chương 1.4, “Lỏm việc với cõc phần mở rộng NET vỏ C++", ching ta sẽ khảo sõt cơ chế P/Invoke chỉ tiết hơn khi chỷng ta xem xờt cõc phần mở rộng được quản lý đối với C++
2.5.3 LJW (It just works - Nờ hoat dờng ngay)
Cõch đơn giản nhất để dem cõc ứng dụng C++ của bạn vỏo kiến tric NET lỏ phải tập hợp tất cả cõc mọ nguồn EXE hay DLL của bạn Biởn dịch lại tất cả chỷng với tuỳ chọn /CLR của trớnh biởn địch vỏ chạy chỷng Mierosoft nụi “Nụ hoạt động ngay.” Cụ lẽ điều nỏy đỷng nếu bạn đọ vỏ đang lập trớnh theo phong
cõch hiện đại Nếu mọ của bạn vẫn cún chứa cõc khai bõo kiờu K&R lóu đời, thớ nụ
sẽ khừng hoạt động
Cụ một vỏi giới hạn đối với tiến trớnh nỏy Bạn khừng thể biởn dịch lại tất cõ cõc thư viện lớp của bạn vỏ sau đụ kế thừa từ chỷng trong nơi đọ được kiểm soõt Bạn khừng thể truyền một cõch để dỏng cõc con trỏ của NET vỏo cõc hỏm vỏ cõc ứng dụng của bạn
Cả tiến trớnh IJW lẫn P/Invoke đểu kờo đỏi cuộc sống cõc cừng cụ của bạn vỏ cho bạn một cơ hội để đem vỏo kiến trỷc NET
2.6 Cõc thỏnh phần mở rộng của NET đối với C++
Trang 31
CHƯƠNG 1-8: Bộ thực thi ngừn ngữ tổng quõt
phần mở rộng của NET đối với C++ lỏ giải phõp lý tưởng hoặc lỏ một con đường
đi vỏo NET
Kiến trỷc NET thởm vỏo một vỏi khõi niệm quan trọng để quản lý bộ nhớ vỏ việc sử dụng dữ liệu Tất cả cõc đặc tợnh nỏy thớ cụ sắn trong ngừn ngữ C# vỏ VB nhưng khừng cụ sẩn trong C++ Những đặc tợnh bổ sung nỏy được thảo luận trong cõc phần theo sau
3.6.1 Cõc lớp dọn đẹp rõc (GC)
Cõc lớp GC lỏ cõc đối tượng để mỏ tất cả việc quản lý bộ nhớ được thực hiện bởi CLR Một khi bạn ngưng sử dụng một lớp GC, nụ được đõnh dấu một cõch tự động để hủy vỏ được thu hồi bởi heap của QC Một lớp GC cũng cụ thể cụ phương thức hủy cụ thể được gọi một cõch tường minh
Bạn cụ thể tạo cõc lớp GC bằng cõch sử dụng từ khoõ mới _gc trởn cõc lớp của bạn: _gc class MyClass { public: int m_x; int m_y; Setxy(int x, int y) { MX = KF my-=y; } }
Bóy giờ MyClass lỏ một lớp GC
CẢNH BạO Nếu bạn sit dung _asm hay setimp trong cõc phương thỷc C++ của bạn, trớnh biởn dịch sẽ đưa ra cõc khuyến cõo; thử chạy mũ lệnh nỏy cụ thể dẫn đến hư hỏng nếu phương thức nỏy sử dụng bất kỳ hiếu hay mọ của NET Cõc lớp GC của bạn cụ thể chỉ dỳng sự bế thừa duy nhất Chỷng khừng thể cụ một copy constructor (phương thức khởi dựng chừng) va khừng thể kế thừa chẳng cõc toõn từ (operator) Ẽ& uỏ neu
2.6.2 Cõc lớp giõ trị
Từ khoõ mới _value cho phờp bạn tạo cõc kiểu giõ trị trong mọ lệnh C++ Chẳng hạn, bạn cụ thể cần tạo trởn heap (vỳng nhớ của chương trớnh) một cấu trỷc 8D_Point cụ cõc thỏnh phần x,y,z được dỳng như lỏ một kiểu giõ trị Cõc kiểu nỏy được tạo trởn heap nhưng cụ thể được đụng hay được gụi theo một kiểu bao đối
tượng, sử dụng từ khoõ _box để dỳng chỷng như cõc đối tượng của NET (Cụ một
Trang 32PHẨNI: Mở đóu
Cõc lớp vỏ cõc cấu trỷc với từ khoõ _value kế thừa từ lớp 5ystem.ValueType của kiến trỷc NET vỏ cụ thể định nghĩa chồng bất kỳ phương thức nỏo mỏ đối tượng đụ cần cụ Đặt cõc phương thức virtual trởn lớp giõ trị của bạn lỏ khừng được phờp Chẳng hạn, bạn cụ thể định nghĩa chừng phương thức System ‘ValueType ToString để tạo một chuỗi để mừ tả đối tượng Vợ dụ như, int32.ToStringO trả về số ở đạng chuỗi Như itoa(.) Bạn cũng cụ thể muốn định nghĩa chồng phương thức 8ystem.ValueType.GetHasCode để sử dụng trong một tập hợp õnh xạ
Cõc lớp giõ trị nỏy hoạt động như cõc lớp của C++ khi được sử dụng trong C++ nhưng cũng cụ thể được sử dụng bởi cõc chương trớnh thực thợ của NET Chỷng khừng được cấp phõt trực tiếp từ heap (vỳng nhớ của chương trớnh) của NET, nhưng chỷng cụ thể được sử dụng bởi cõc đối tượng của NET khi được bao lại
Cụ một vỏi qui tắc để mỏ õp dụng cõc lớp nỏy Bạn cụ thể nhận lớp giõ trị từ một hay nhiều interfacs (giao tiếp) của NET Nhưng bạn khừng thể định nghĩa chồng một construetor (khởi dựng) cho nụ Một lớp giõ trị khừng thể cụ từ khoõ _abstract đi kộm Cõc lớp giõ trị được “niởm phong”, cụ nghĩa lỏ chỷng khừng thờ được dẫn xuất Bạn khừng thể khai bõo một con trẻ đến một lớp giõ trị
Như với từ khoõ _gc, bạn khừng nởn dỳng _asm hay setjmp nếu lớp đụ sử dụng bất kỳ mọ lệnh nỏo của NẸT, chấp nhận cõc kiểu của NET như cõc tham số, hay trõ về một kiểu của NET Nụ cụ thể biởn dịch, nhưng nụ sẽ cụ thể khừng hoạt động tốt
9.6.3 Cõc thuộc tợnh (property)
Cõc lớp C# trong NET cụ thể cụ cõc thuộc tợnh cụ cõc phương thức tru xuất get vỏ set Từ khoõ _property cho phờp bạn tạo cõc lớp GC để hỗ trợ cõ: thuộc tợnh Một thuộc tợnh giống như một thỏnh phần dữ liệu trong lớp của bar nhưng lỏ một đoạn mọ thật sự Vợ dụ dưới cho thấy một thuộc tợnh sẽ được tạo vi sử dụng như thế nỏo fusing “mscorlib.dll” _ge class My3Dpoint { // mặc định cõc thỏnh phần lỏ cục bộ int m_x; int my; int m_z; public:
property int get_x() (return m_x;}7
“property void set_x(int value) {m_ x=value;)}; “property int get_y() {return m_y;}7
_property void set_x(int value) {m_y=value; }; _property int get_z() {returnrm z;};
_property void set_x(int value) {m_z=value;};
// cõc phương thức khõc của 3D ở đóy ye
Trang 33vớ mẽ im go woes CHƯƠNG I-3: Bộ thực thi ngừn ngữ tổng quõt { My3Dpoint *pP=new My3Dpoint (); ĐP->x=10; // gọi set x(10);
int X = pP->x; // goi get_x(); 2.6.4 Ghim (pin) cdc gia tri lai
Heap của GC sẽ thường xuyởn đi chuyển cõc đối tượng từ chỗ nỏy đến chỗ khõc trong suốt quõ trớnh hoạt động của nụ Bất cứ khi nỏo bạn cần truyền một con trồ đến một đối tượng của NET hay một hỏm Ơ++ của COM, bạn cụ thờ ghim cõc đối tượng bằng việc sử dụng từ khoõ _pin Thao tõc ghim (pin) nỏy ngăn cấm GC di chuyển đối tượng đụ cho đến khi nụ khừng bị ghim nữa,
2.7 Cac ngoai lờ (Exception)
TAt cA cdc ngoai lờ trong kiờn trac NET duoc xử lý bởi CUR CLR cung cấp một cơ chế mạnh vỏ nhất quõn trong việc theo vết vỏ xử ly lỗi bất cứ khi nỏo
chỷng cụ thể xảy ra
Cõc ngoại lệ trong CLR dỳng cõc đối tượng exception, thường được dẫn xuất từ lớp System.Exception trong kiến trỷc NET vỏ một trong bốn bộ xử lý ngoại lệ Cõc bộ xử lý nỏy lỏ
Ậ Bộ xứ lý fina1ly được thực hiện bất cứ khi nỏo một khối thoõt ra Bộ xử lý nỏy được gọi trong lỷc kết thỷc bớnh thường một đối tượng cũng như khi một lỗi xảy ra
Ậ Bộ xử lý fault chạy khi một ngoại lệ đỷng xảy ra
ẬỔ Bộ xử lý tybpe-filtered phục vụ cho cõc ngoại lệ từ một, lớp cụ thể hay cõc lớp dẫn xuất của nụ Vợ dụ: catch (MyExceptionType e) Ậ Bộ xử lý user-filtered cụ thể phõt hiện ngoại lệ đụ cụ nởn bỏ qua
hay khừng, được xử lý bởi bộ xử lý được liởn Kết, hay được truyền đến ngoại lệ kế tiếp cụ hiệu lực
Mỗi một phương thức của mỗi lớp trong cõc thư viện trong kiến trỷc NET hay trong mọ lệnh của bạn cụ một bảng cõc bộ xử lý ngoại lệ kết hợp với nụ Cõc phần tử trong mảng mừ tả một khối mọ lệnh được bảo vệ vỏ bộ xử lý ngoại lệ liởn kết với nụ Cụ thể hoặc lỏ khừng cụ bộ xử lý nỏo, bộ xtr ly catch, bộ xử lý fina1l1y, hoặc lỏ bộ xử lý fault cho mỗi phần tử của bảng Khi một ngoại lệ xảy ra, CLR tớm một ngoại lệ trong bảng phương thức để đưa cho bộ xử lý Nếu
một ngoại lệ được tớm thấy, quyển điểu khiển được truyền đến bộ xử lý như
thường; nếu khừng, CLR tiếp tục qua ngăn xếp (stack) đi đến phương thức đang gọi vỏ vón vón, giữ lại chuỗi mắt xợch cõc lời gọi cho đến khi một bộ xử lý được tớm thấy Nếu một ngoại lệ khừng được tớm thấy, CLUR sẽ kết thỷc ứng dụng vỏ
tiến hỏnh hiển thị ngăn xếp
Trang 34PHAN I: Mờ dau
2.8 Hỗ trợ việc gỡ rối
Kiến trỷc NET cụ trớnh gỡ rối được xóy dựng trong nụ ở mức rất thấp Khừng như cõc hệ thống gỡ rối khõc mỏ cõc lập trớnh viởn C++ quen sử dụng trước kia, thường lỏ xen vỏo, CLUR thực hiện tất cả cõc mọ lệnh, nụ quần lý việc gỡ rối
vỏ gởi cõc sự kiện đến bộ gỡ rối được kết nối bất cứ khi nỏo cần `
SDK của NET cụ cõc trớnh gỡ rối của riởng nụ, thởm vỏo đụ lỏ trớnh được tợch hợp với Visual Studio.NET Tất cả cõc trớnh gỡ rối hoạt động qua cõc API chung được cung cấp bởi kiến trỷc
3 KẾT CHƯƠNG
CLR la trõi tớm của hệ thống NET Nụ nạp vỏ quản lý cõc mọ lệnh, tương tõc với cõc cừng cụ phõt triển vỏ cõc trớnh gỡ rối cho bạn, tuón thủ tợnh an toỏn vỏ
bảo mật của hệ thống của bạn, vỏ cho phờp phần mềm của bạn tợch hợp với cõc hệ
Trang 35
Chương 1.3
NGON NGU TRUNG GIAN IL
Cõc uấn dờ chợnh sẽ được đở cập đến
_ Liởn kết (Inter-Op) Ngừn ngữ Hello IL Ham (functions) Lờp (classes) ILDASM Metadata Reflection API cSS S S nS
Vỏo thời đại của sự phõt triển phần mềm ngỏy nay, những người phõt triển gần như chỉ sử dụng ngừn ngữ cấp cao như C++, Visual Basic, hay Java để viết cõc ỷng dụng vỏ cõc thỏnh phần (components) Cụ lẽ cún rất ợt người hiểu được cừng việc những người lập trớnh xuyởn phiếu (binary đevelopers) vỏ cũng cụ lẽ chỉ cún dam ba người lập trớnh hợp ngữ
Vay tai sao IL, Intermediate language, quan trọng đối với NET dờn nhu vậy? Để trả lời cóu hỏi nỏy cần đi lướt qua những điều cơ bản (mỏ ta thường gọi lỏ 101 điều) của lý thuyết về trớnh biởn dịch Cừng việc cơ bản của trớnh biởn địch (compiler) lỏ phải dịch mọ nguồn đọc được thỏnh mọ gốc cụ thể thực thi cho một hệ thống (platform) đọ định Quõ trớnh biởn địch bao gồm vỏi giai đoạn, bao gồm mỏ khừng bị giới hạn về việc quờt từ vựng, phón tợch, tạo cóy cỷ phõp trừu tượng (abstract syntax tree), tạo mọ trung gian (intermediate code), phõt sinh mọ (code emission), trớnh dịch hợp ngữ (assembler), vỏ nối kết (inking) Hớnh 1.3-1 trớnh
bỏy một sơ đổ cơ bản của quõ trớnh nỏy L Source code J abstract syntax tree ] assimbling ] | | Ỉ [ Lexieal scanning | [ intermediate code | L linking ] | | { parsing ( code emission [ executable code | Hớnh 1.3-1 Tiến trớnh sự biởn dịch
Trang 36[M] sa PHẨN I: Mở đóu
đụ thớ sao? Đóy lỏ chỗ mỏ IL tờ ra thợch ứng với vấn đẻ đặt ra Khả năng dịch cõc cấu trỷc ngừn ngữ cấp cao thỏnh một đạng chuẩn, như 1L, cụ chỷ ý đến trớnh biởn dịch cơ bản đơn (single underlying compiler) hay trớnh biởn dịch just-in-time (JTT) Đóy lỏ cõch thức được thực hiện do NET
Với lời giới thiệu về Visual Studio NET, Microsoft cung cấp Managed C++, C#, Visual Basic, vỏ ASP.NET, mỗi ngừn ngữ nỏy tạo ra IL từ mọ nguồn tương ứng của chỷng Cũng cụ một vỏi nhỏ cung cấp ngừn ngữ thứ ba đưa ra cõc phiởn bản NET ti những ngừn ngữ tương ứng của họ Hớnh 1.3-2 trớnh bỏy tiến trớnh biởn dich NET cơ bản
Điều quan trọng để chỷ ý đến lỏ IL khừng được thừng dịch Đỷng hơn lỏ, hệ
thống NET (NET platform) sử dụng cõc kiểu khõc nhau của cõc trớnh biởn dịch
just-in-time để đưa ra mọ gốc (native code) tit ma IL Ma gốc chạy trực tiếp trởn phần cứng vỏ khừng cần phải cụ một mõy ảo, như ở trường hợp Java vỏ những phiởn bản ban đầu của Visual Basic Bằng cõch biởn dich IL thanh ma gờc (native code), hiệu năng lỷc thực thợ được tăng cao so với cõc ngừn ngữ thừng dịch chạy trởn một mõy ảo Chỷng ta sẽ khảo sõt cõc kiểu khõc nhau của cõc trớnh biởn dịch just-in-time sau (Từ đóy trở đi chỷng ta sẽ gọi cõc trớnh biởn dịch just-in-time như lỏ jitter) { Managed C++ | ( C# } [ VB.NET oo | | | JIT Compiler Native Code
Hinh 1.3-2 Sự biởn dich NET
IL lỏ ngừn ngữ trọn vẹn, dựa vỏo ngăn xếp (full, stack-based language) mỏ bạn cụ thể sử dụng để cỏi đặt cõc thỏnh phón NET Mặc dỳ nụ khừng chắc chắn được đưa ra vớ mục đợch về hiệu suất, bạn cụ thể sử dung IL để thực hiện những vấn đề mỏ bạn khừng thể thực hiện với C# Vợ dụ, trong IL, bạn cụ thế tạo cõc hỏm toỏn cục vỏ gọi chỷng từ bởn trong IL
1 LIEN TAC (INTER-OP) NGON NGỮ
Trang 37CHƯƠNG 1-3: Ngừn ngữ trung gian II, 39 (Al
Bởi vớ CỌM lỏ một chuẩn nhị phón, bất cứ ngừn ngữ nỏo cụ khả năng sử dụng (of
consuming) những thỏnh phần COM lỏ cụ thể sử dụng chỷng khừng kế đến ngừn
ngữ nỏo đọ tạo nởn thỏnh phón COM
Mặc dỳ COM đọ cho khả năng sử dụng lại cõc thỏnh phần, nhưng nụ cún lóu mới được hoỏn hảo Cõc ngừn ngữ nỏo đụ, như cõc ngừn ngữ script, chỉ cụ thể sử dụng giao điện mặc định được cung cấp bởi đối tượng COM Ngoỏi ra, nụ khừng thể kế thừa (inherit) một thỏnh phần COM để mở rộng chức năng cơ bản của nụ Để mớ rộng một đối tượng nhị phón, những người phõt triển đọ phải bao thỏnh phần COM lại, khừng lỏ một phương phõp hướng đối tượng thật sự
Với sự xuất hiện của NET vỏ IL, những trở ngại như vậy khừng tổn tại lóu
hơn nữa Bởi vớ mỗi ngừn ngữ khi đọ nhằm vỏo nởn tang NET dờu hiểu rử ban chất IL vỏ siởu dữ liệu (metadata) của thỏnh phần NET, một cấp độ mới về khả
năng hoạt động liởn kết (interoperability) ra đời Siởu dữ liệu (metadata} cho phờp đuyệt một thỏnh phần NET để tớm ra cõc lớp (class), cõc phương thức (method), cõc trường (field), vỏ cõc giao diện mỏ nụ chứa Để tỏi của siởu dữ liệu (metadata) sẽ được trớnh bỏy ở cuối phần nỏy
2 HELLO IL
Việc sử dụng IL dờ phõt triển cõc thỏnh phần vỏ cõc ứng dụng NET cụ khả năng lỏ bạn sẽ khừng thực hiện được nhiều việc Tuy nhiởn, để nghiởn cứu thật sự về kiến trỷc NET (NET framework), việc nắm được cơ bản về cấu trỷc HL lỏ quan trọng NET SDK khừng chuyển giao mọ nguễn co sở Điều nỏy khừng cụ nghĩa lỏ bạn khừng thể nghiởn cứu việc thực hiện cõc thỏnh phần khõc Tuy nhiởn, cẩn phải cụ một số kiến thức về IL
Thừng thường, hầu như cần thiết, bước đầu tiởn trong việc học một ngừn ngữ mới lỏ hiển thị thừng bõo “Hello World” mỏ ai cũng biết trởn mỏn hớnh Thực hiện cừng việc nỏy chỉ với IL thớ khừng mất nhiều cừng sức như khi lỏm cho nụ phõt ra óm thanh IL khừng lỏ một ngừn ngữ cấp thấp thực sự, tựa assembly
Tương tự như hầu hết cõc ngừn ngữ hiện đại khõc, đọ cụ một lượng đõng kể cõc
Trang 38PHẨN I: Mở đầu
//tạo một điểm nhập cho exe
-method public static void main( ) il managed { -
.entrvpoint -maxstack 1
//tai chuời 1ờn dờ hiờn thi
ldstr “Hello World IL style\n” //hiển thị ra mỏn hớnh call void [mscorlib] 3ystem.Console: :WirteLine ( class System.String ) 27: ret 28: } 29: Để biởn địch vợ dụ 1.3-1, đưa ra đúng lệnh sau: ilasm hello.cil
Trớnh dịch hợp ngữ IL (IL assembler) tao ra tap tin NET hello.exe
Ma lờnh IL hiển thị thừng b4o “Hello World IL style” bang cach sử dụng phương thức static Write của đối tượng System.Console Lớp Console lỏ một phần của kiến trỷc NET (.NET framework) vỏ, như cõch sử dụng của nụ cho biết, mục đợch của nụ lỏ ghi ra kết xuất chuẩn (standard output)
Chỷ ý rằng khừng cần tạo một lớp IL khừng lỏ một ngừn ngữ hướng đối tượng (object-oriented language), nhưng nụ cung cấp cõc cấu trỷc cần thiết để mừ tả cõc đối tượng vỏ sử dụng chỷng IL được thiết kế để tạo sự tương thợch giữa cõc cấu trỷc ngừn ngữ vỏ cõc kiểu lập trớnh Như vậy tợnh đa dạng vỏ rộng rọi trong thiết kế của nụ sẽ tợnh đến nhiều ngừn ngữ khõc nhau để nhằm vỏo thời gian thực thị của NET
ụ: một số chỉ ,khị (directive) cụ, ý nghĩa đặc biệt trong IL Cac chỉ thị
ý) nỏy được trớnh bỏy ở bằng 1.3-1
Bang 1.3-1 Cac chi thi cia IL duge ding trong “Hello World”
Chi thi Ý nghĩa
-assembly Tờn kờt xuất cha assembly
.entrypoint Bắt đầu sự thực hiện cho một exe assernbly
Trang 39
CHƯƠNG 1-3: Ngừn ngữ trung gian IL
”z/” Chỷ ý rằng chỉ thị entrypoint xõc định điểm bắt đầu việc thực hiện cho bất
cứ exe assembly nỏo Dỳ cho hỏm của chỷng ta cụ tởn main, nụ cụ thể cụ bất cứ tởn nỏo mỏ chỷng ta muốn Khừng giống như C, C++, vỏ cõc ngừn ngữ cấp cao khõc IL khừng định nghĩa một hỏm được dỳng như điểm khởi đầu của việc thực thi Đỷng hơn, IL dỳng chỉ thị entrypoint để đõp ứng mục đợch nỏy
Chỉ thị khõc cần chỷ ý lỏ chỉ thị assermbly IL sử dụng chỉ thị nỏy để đặt tởn kết xuất của assembly Chỉ thị assembly cũng chứa số thứ tự phiởn bản của assembly
3 HáM (FUNCTIONS)
Vi du Helle World của IL chỉ bao hỏm một phương thức Giõ mỏ tất cả
những nhu cầu phõt triển phón mềm đơn giản như thế nỏy! Bởi vớ IL lỏ một ngừn
ngữ dựa vỏo ngăn xếp (stack-based language), cõc tham số của hỏm được đẩy lởn ngăn xếp (stack) vỏ hỏm được gọi Hỏm được gọi cụ trõch nhiệm xoõ bất cứ tham ' số nỏo khỏi ngăn xếp (stack) vỏ đẩy bất cứ giõ trị trả về nỏo trở lại ngăn xếp (stack) cho người gọi hỏm
Quõ trớnh đấy cõc giõ trị vỏo vỏ lấy cõc giõ trị ra từ ngăn xếp gọi (call stack) cụ thể được hớnh dung như đọ trớnh bỏy ở hớnh 1.3-3 Add function Program Code call stack call stack pop 15 Push 10 15 10 Push 15 10 pop localresult push result 25 ret Hớnh 1.38-3 Ngdn xờp goi (the call stack)
Hớnh 13-3 mừ tả một kết xuất rất đơn giản của tiến trớnh thật sự, nhưng
Trang 40PHAN I: Mở đầu Vi du 1.3-2 IL Function Calls 1://File :function.cil 2: 3: assembly function_call 4: { 4: ` 5: -ver 1:0:0:0 6:} 7: 8:
9: //Thởm vỏo phương thức