Năm 2002 là một cái nắm dấu ấn trong nền công nghệ phần mềm bởi vì nó đánh dấu sự ra đời của một công nghệ mới là .NET.
MS đã đưa ra một môi trường phát triển phần mềm mới, cùng với nó là sự ra đời của một số ngôn ngữ như C#.NET, VB.NET,…
Nhưng .NET là gì thì mình sẽ bàn luận trong vấn đề này.
PHẦN I. WHAT IS THE .NET FRAMEWORK?
Chỉ mất vài phút google bạn sẽ dễ dàng nhanh chóng tìm ra một câu trả lời bằng những trang viết Việt Nam cũng rất rõ ràng.
Và tất cả những gì mình biết về .NET chỉ nhỏ gọn trong 20 trang của cuốn sách “Visual C++ CLI and the.NET 2.0 Platform - S. Fraser - Apress – 2005”, do đó chắn chắn mình sẽ không thể nào đưa ra đầy đủ được.
.NET theo tôi là một nền tảng, nó cung cấp cho người lập trình một khung ứng dụng (frameworks) và mục tiêu của nó là những phần mềm chạy trên môi trường dot NET.
Kiến trúc của .NET gồm 3 layer như sau:
![](http://i227.photobucket.com/albums/dd75/eXective87/NETView.jpg)
LAYER 1: NỀN TẢNG .NET
1. Web Services (Dịch vụ WEB):
Web Services nói cho dễ hiểu thì là những chương trình hoạt động theo dạng Client – Server và sử dụng 2 giao thức (protocol):
- HTTP (Hypertext Transfer Protocol)
- SOAP (Simple Object Access Protocol).
Web Services thì có rất nhiều chức năng. Trong đó với .NET thì thì mục tiêu của Web Services là XML Web Services hỗ trợ cho ASP.NET hoặc Windows Foms (để viết các APP dạng Client – Server). Nó giống như là một thư viện, tức là khi cần, chúng ta có thể gọi nó như gọi một function.
Chúng ta có thể sử dụng các ngôn ngữ trên .NET để viết những hàm. Kết quả trả về của những hàm này có thể là 1 Database hoặc 1 giá trị nào đó. Web Services sẽ được biên dịch ra dạng file *.asmx. Và khi cần thì ASP.NET sẽ tham chiếu (references) đến nó cho các forms trong trang Web của mình. File *.asmx được hiểu như là 1 object và trong object đó là các member function do mình viết ra…
2. Web Forms:
Chính xác hơn thì đây chính là ASP.NET. Một ngôn ngữ lập trình WEB theo công nghệ của MS. Hiện nay thì 2 ngôn ngữ lập trình chính là VB.NET và C# đản nhiệm việc này. Chúng ta có thể nhìn rõ ràng hơn về kiến trúc của .NET với WEB Forms bào gồm Services và ASP.NET dưới cái hình này.
![](http://i227.photobucket.com/albums/dd75/eXective87/DotNET.gif)
Nhưng nói chung thì kiến thức về Web của mình cũng không nhiều nên mình cũng không thể đi sâu vào vấn đề này được. Và theo mình thì mình thấy PHP có phần thiện cảm hơn ASP.NET rất nhiều bởi những yếu tố như Free và không phục thuộc vào hệ điều hành mặc dù mình công nhận ASP.NET rất mạnh. Vả lại trong TOPIC này mình đang nói về “pointer of C++”
3. Windows Forms:
Đây là nơi để các ngôn ngữ chính của .NET như C#, VB.NET, C++.NET, J#,… xây dựng các ứng dụng chạy trên windows.
Khi ra đời người ta đã thấy được những ưu điểm của Forms so với kiến trúc 3 ứng dụng Dialog, SDI, MDI của C++/MFC trước đây bởi tính năng dễ thiết kế, có giao diện đẹp…
Do đó nên ngày nay các ứng dụng đang dần chuyển qua Forms. Chúng ta có thể thấy được sự khác biệt rất nhiều như giữa MS Word 98 về trước và MS Word XP trở về sau (đặc biệt là MS Word 2007).
LAYER 2: CÁC LỚP HỢP NHẤT (Unified Programming Classes)
Layer thứ 2 này nói cho dễ hiểu là các thư viện để giúp 3 nền tảng trên có thể phát triển được.
Thư mục Windows\Assembly chứa các thư viện này.
![](http://i227.photobucket.com/albums/dd75/eXective87/ASM.jpg)
Vấn đề tôi muốn nói ở đây là các thư viên này được MS viết bằng ngôn ngữ nào? Không phải C++ mà chính là các ngôn ngữ .NET như C# và VB.NET… Tại sao khi tôi phân tích Layer 3 sẽ có lời giải đáp.
Ở C++ khi người ta muốn sử dụng các hàm thì chắc chắn phải biết hàm đó ở thư viện nào. Ví dụ như String.h có strcat,strcpy… hay Math.h,… để tính sin, cos.
Tuy nhiên với .Net ta chỉ cần 1 khai báo chính
Code:
#using <mscorlib.dll>
Là hoàn toàn sử dụng các đối tượng hay namespace cơ bản của .NET
Ngoài khi cần thiết ta có thể khai báo thêm một số thư viện nếu mình cần.
Code:
#using <system.data.dll>
#using <system.xml.dll>
Ví dụ như một số Object cơ bản sau.
Namespace Convert như sau.
![](http://i227.photobucket.com/albums/dd75/eXective87/Convert.jpg)
Bên trong nó chứa các hàm để chuyển đổi kiểu dữ liệu. Ví dụ như từ string -> int, hoặc ngược lại…
.NET hỗ trợ nhiều lớp đối tượng Int32,Single, String, Double … Người lập trình .Net vẫn thích sử dụng nó để thay thế cho int,char… của C++. Bởi lẽ nó là đối tượng nên sẽ có các function rất hữu ích.
![](http://i227.photobucket.com/albums/dd75/eXective87/Int32.jpg)
<String.h> và <Math.h> có thể xem như 2 namespace của .Net chuyên dụng này.
![](http://i227.photobucket.com/albums/dd75/eXective87/StringMath.jpg)
Rõ ràng .NET rất dễ lập trình và autocomplie thì tuyệt vời nữa. Đó là ưu thế của các ngôn ngữ như C#, VB.NET
Tôi sẽ đi nhanh qua các class và namespace của .Net và có lẽ nó cũng giúp chúng ta hiểu thêm về .NET
Code:
System::Collections
Đây là hàng loạt các đối tượng cho chúng ta tổ chức cấu trúc dữ liệu như danh sách liên kết, hasttable,… rất nhanh chóng mà không cần phải dày công cài đặt như ở C++.
- System::Collections “mscorlib.dll”
- System::Collections::Specialized “system.dll”
- System::Collections::Generic “system.dll”
System::Data
Là namespace gốc của ADO.NET. Nó cung cấp cho ta các đối tượng làm việc với hệ quản trị cơ sở dữ liệu.
Khai báo sử dụng:
#using <system.data.dll>
#using <system.xml.dll>
Một số đối tượng ADO.NET:
- System::Data::SqlClient : Microsoft SQL Server
- System::Data::SqlClientCe : Microsoft SQL Server CE Edition
- System::Data::Odbc : ODBC database (Access, Foxpro)
- System::Data::OleDb : OLE DB database
- System::Data::OracleClient : Oracle database
System::Drawing
Hay là thư viện GDI+. Chủ yếu là xử lý đồ hoạ trên Windows Forms.
System::Drawing::Drawing2D : Các hàm vẽ cơ bản
System::Drawing::Imaging : Xử lý hình ảnh.
System::Drawing::Printing : Thao tác với máy in
System::Drawing::Text : Xử lý đồ họa text
Khai báo sử dụng:
#using <System.Drawing.dll>
System::Globalization
Giúp chúng ta xử lý các thông tin liên quan tới ngày, tháng, thời gian,…
- Calendar: Làm việc với ngày, tuần,…
- DateTimeFormatInfo: Định dạng ngày, giờ,…
- NumberFormatInfo: Định dạng cấu trúc số như ‘.’ ‘,’ …
- RegionInfo: Chứ thông tin về ngày giờ các quốc gia..
System::IO
Làm việc với file như ghi, đọc, di chuyển, copy, xoá file hay thư mục,…
#using <system.dll>
- BinaryReader: Đọc file dưới hệ nhị phân.
- BinaryWriter: Ghi file dưới hệ nhị phân.
- Directory, DirectoryInfo: Di chuyển, xoá thư mục,…
- File, FileInfo: Tạo xoá file, copy…
- FileStream: Sử dụng để đọc và ghi file,…
- MemoryStream: Sử dụng để đua file lên bộ nhớ
- Path: Làm việc với các đường dẫn file.
- StreamReader: Đọc hỗ trợ UTF-8.
- StreamWriter: Ghi hỗ trợ UTF-8.
- TextReader: Đọc file dươi dạng Text.
- TextWriter: Ghi gile dưới dạng Text.
System::IO::Port: Đọc và ghi dữ liệu ra SerialPort,..
System::Management
Là namespace cho chúng ta truy vấn, lấy các thông tin liên quan tới hệ thống, thiết bị và các ứng dụng,… như dung lượng đĩa cứng, CPU, tên thiết bị chia sẽ,…
#using <system.Management.dll>
System::Net
Cung cấp cho chúng ta các đối tượng để làm việc trên các protocols. Như Mail, HTML, FTP, DNS,… và Sockets để viết các ứng dụng có liên quan tới mạng.
System::Security
Với Security chúng ta có thể viết các chương trình thực hiện thao tác cấp quyền, sửa đổi với dữ liệu hay làm việc trên Active Directory,…
System::Threading
Giúp chúng ta giải quyết các vấn đề xử lý song song…
System::Web
Chủ yếu dùng trong công nghệ WEB như xử lý request, response của HTTP…
System::Windows:Forms
Là đối tượng giúp chúng ta xây dựng nên các cửa sổ, textbox,… để giao tiếp với người sử dụng.
System::Xml
Dùng để làm việc với XML. XML như là một công nghệ mới của .NET, có thể hiểu nó như là một loại cơ sở dữ liệu đơn giản.
#using <System.Xml.Dll>
Microsoft::Win32
Cung cấp cho ta 2 đối tượng là Registry và RegistryKey để chúng ta có thể làm việc với Windows Registry.
LAYER 3: NGÔN NGỮ THỰC THI CHUNG (Common Language Runtime)
Với kiến trúc COM trước đây của C++. Người lập trình luôn phải quan tâm đến vấn đề bộ nhớ và cấp phát thread cho ứng dụng. Xong việc thì phải giải phóng… Mạnh với con trỏ nhưng dường như với pointer làm người lập trình chịu quá nhiều gánh nặng.
-> Ý tưởng bắt đầu từ Java. Sun đã hủy hủy bỏ chức năng pointer của C/C++ và thay bằng references. Nhưng như vậy ai chịu trách nhiệm quản lý bộ nhớ cho Java -> Trả lời luôn thì đó là Java Virtual Machine.
.NET ngày nay cũng giống như JVM của Java vậy. Trong đó Common Language Runtime chịu trách nhiệm quản lý bộ nhớ cho các ngôn ngữ như C#,VB.NET,C++.NET…
-> Tại sao Java có thể chạy trên nhiều HDH? Bởi vì chương trình Java được biên dịch ra thành các *.class chứ không phải là các *.exe và *.dll như C++. Và khi chạy thì JVM sẽ dịch tiếp *.class này thành các file thi hành ứng với từng hệ điều hành.
.NET cũng có cơ chế tương tự. Tất cả các ứng dụng .NET khi chạy mặc dù được biên dịch thành các *.dll và *.exe nhưng nó không chứa code ASM mà chứa code của một ngôn ngữ trung gian là MSIL ().
Ví dụ một đoạn code như sau:
Code:
// C#
using System;
class MainApp
{
public static void Main()
{
Console.WriteLine( "Hello World!" );
}
}
Sẽ dịch ra như sau: phần trong /* */ chính là nội dung khi biên dịch như 0x72 0x28 0x2A ...
// MSIL
.method public hidebysig static void Main() cil managed
{
/* 72 | (70)000001*/ ldstr "Hello World!"
/* 28 | (0A)000002*/ call void System.Console::WriteLine(string)
/* 2A | */ ret
}
Và khi chương trình chạy thì CLR biên dịch lần cuối ra chương trình ASM thật.
Như vậy chắc chắn 1 điều là chương trình chạy trên .NET sẽ thi hành chậm hơn chương trình viết trên C++.
Một điều lưu ý là code viết trên .NET người ta gọi là “Managed Code” bởi vì nó bị quản lý hoàn toàn bởi CLR còn C++ code trước đây thì gọi là “Native Code”.
Bookmarks