Thưviện lớp .NET Framework không có chức năng tạo shortcut trên Desktop hay trong Start 
menu; tuy nhiên, việc này có thể được thực hiện dễdàng bằng thành phần Windows Script 
Host (được truy xuất thông qua COM Interop). Cách tạo Interop Assembly đểtruy xuất một 
thành phần COM đã được trình bày trong mục 15.6. Nếu đang sửdụng Visual Studio .NET, 
bạn hãy thêm một tham chiếu đến Windows Script Host Object Model(được liệt kê trong thẻ
COMcủa hộp thoại Add Reference). Nếu không có Visual Studio .NET, bạn hãy sửdụng công 
cụ Type Library Importer(Tlbimp.exe) đểtạo một Interop Assemblycho file wshom.ocx(file 
này thường nằm trong thưmục Windows\System32). Bạn có thểlấy phiên bản mới nhất của 
Windows Script Hosttại  
              
                                            
                                
            
 
            
                 32 trang
32 trang | 
Chia sẻ: oanh_nt | Lượt xem: 1776 | Lượt tải: 2 
              
            Bạn đang xem trước 20 trang nội dung tài liệu Các giải pháp lập trình C#, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
530 
Chương 17: Sự hòa hợp với môi trường Windows 
 Sử dụng COM Interop để truy xuất các chức năng của Windows Script Host. Tạo 
và cấu hình một thể hiện IWshShortcut tương ứng với shortcut. Thư mục chứa 
shortcut sẽ xác định shortcut xuất hiện trên Desktop hay trong Start menu. 
Thư viện lớp .NET Framework không có chức năng tạo shortcut trên Desktop hay trong Start 
menu; tuy nhiên, việc này có thể được thực hiện dễ dàng bằng thành phần Windows Script 
Host (được truy xuất thông qua COM Interop). Cách tạo Interop Assembly để truy xuất một 
thành phần COM đã được trình bày trong mục 15.6. Nếu đang sử dụng Visual Studio .NET, 
bạn hãy thêm một tham chiếu đến Windows Script Host Object Model (được liệt kê trong thẻ 
COM của hộp thoại Add Reference). Nếu không có Visual Studio .NET, bạn hãy sử dụng công 
cụ Type Library Importer (Tlbimp.exe) để tạo một Interop Assembly cho file wshom.ocx (file 
này thường nằm trong thư mục Windows\System32). Bạn có thể lấy phiên bản mới nhất của 
Windows Script Host tại []. 
Hình 17.4 Chọn Windows Script Host Object Model trong hộp thoại Add Reference 
Một khi đã tạo và nhập Interop Assembly vào dự án, bạn hãy thực hiện các bước sau: 
1. Tạo một đối tượng WshShell để truy xuất vào Windows shell. 
2. Sử dụng thuộc tính SpecialFolders của đối tượng WshShell để xác định đường dẫn đến 
thư mục sẽ chứa shortcut. Tên của thư mục đóng vai trò là index đối với thuộc tính 
SpecialFolders. Ví dụ, chỉ định giá trị Desktop để tạo shortcut trên Desktop, và chỉ 
định giá trị StartMenu để tạo shortcut trong Start menu. Thuộc tính SpecialFolders còn 
có thể được sử dụng để lấy đường dẫn đến mọi thư mục đặc biệt của hệ thống; các giá 
trị thường dùng khác là AllUsersDesktop và AllUsersStartMenu. 
3. Gọi phương thức CreateShortcut của đối tượng WshShell, và truyền đường dẫn đầy đủ 
của file shortcut cần tạo (có phần mở rộng là .lnk). Phương thức này sẽ trả về một thể 
hiện IWshShortcut. 
531 
Chương 17: Sự hòa hợp với môi trường Windows 
4. Sử dụng các thuộc tính của thể hiện IWshShortcut để cấu hình shortcut. Ví dụ, bạn có 
thể cấu hình file thực thi được shortcut tham chiếu, biểu tượng dùng cho shortcut, lời 
mô tả, và phím nóng. 
5. Gọi phương thức Save của thể hiện IWshShortcut để ghi shortcut vào đĩa. Shortcut sẽ 
nằm trên Desktop hay trong Start menu (hay một nơi nào khác) tùy vào đường dẫn 
được chỉ định khi tạo thể hiện IWshShortcut. 
Lớp ShortcutExample trong ví dụ dưới đây tạo shortcut cho Notepad.exe trên Desktop và 
trong Start menu của người dùng hiện hành. ShortcutExample tạo hai shortcut này bằng 
phương thức CreateShortcut và chỉ định hai thư mục khác nhau cho file shortcut. Cách này 
giúp bạn tạo file shortcut trong bất kỳ thư mục đặc biệt nào được trả về từ thuộc tính 
WshShell.SpecialFolders. 
using System; 
using IWshRuntimeLibrary; 
public class ShortcutExample { 
 public static void Main() { 
 // Tạo shortcut cho Notepad trên Desktop. 
 CreateShortcut("Desktop"); 
 // Tạo shortcut cho Notepad trong Start menu. 
 CreateShortcut("StartMenu"); 
 // Nhấn Enter để kết thúc. 
 Console.WriteLine("Main method complete. Press Enter."); 
 Console.ReadLine(); 
 } 
 public static void CreateShortcut(string destination) { 
 // Tạo một đối tượng WshShell để truy xuất 
 // các chức năng của Windows shell. 
 WshShell wshShell = new WshShell(); 
 // Lấy đường dẫn sẽ chứa file Notepad.lnk. Bạn có thể 
 // sử dụng phương thức System.Environment.GetFolderPath 
 // để lấy đường dẫn, nhưng sử dụng WshShell.SpecialFolders 
 // sẽ truy xuất được nhiều thư mục hơn. Bạn cần tạo một 
 // đối tượng tạm tham chiếu đến chuỗi destination 
 // để thỏa mãn yêu cầu của phương thức Item. 
 object destFolder = (object)destination; 
 string fileName = 
 (string)wshShell.SpecialFolders.Item(ref destFolder) 
 + @"\Notepad.lnk"; 
 // Tạo đối tượng shortcut. Tuy nhiên, chẳng có gì được 
 // tạo ra trong thư mục cho đến khi shortcut được lưu. 
 IWshShortcut shortcut = 
 (IWshShortcut)wshShell.CreateShortcut(fileName); 
 // Cấu hình đường dẫn file thực thi. 
 // Sử dụng lớp Environment cho đơn giản. 
 shortcut.TargetPath = 
 Environment.GetFolderPath(Environment.SpecialFolder.System) 
 + @"\notepad.exe"; 
532 
Chương 17: Sự hòa hợp với môi trường Windows 
 // Thiết lập thư mục làm việc là Personal (My Documents). 
 shortcut.WorkingDirectory = 
 Environment.GetFolderPath(Environment.SpecialFolder.Personal); 
 // Cung cấp lời mô tả cho shortcut. 
 shortcut.Description = "Notepad Text Editor"; 
 // Gán phím nóng cho shortcut. 
 shortcut.Hotkey = "CTRL+ALT+N"; 
 // Cấu hình cửa sổ Notepad luôn phóng to khi khởi động. 
 shortcut.WindowStyle = 3; 
 // Cấu hình shortcut hiển thị icon đầu tiên trong notepad.exe. 
 shortcut.IconLocation = "notepad.exe, 0"; 
 // Lưu file shortcut. 
 shortcut.Save(); 
 } 
} 
533 
PHỤ LỤC A: GIỚI THIỆU MỘT SỐ CÔNG CỤ .NET 
hần phụ lục này giới thiệu một số công cụ nhỏ (hầu hết là miễn phí) nhưng rất tốt cho 
các nhà phát triển .NET, trong đó có những công cụ giúp phát triển ứng dụng nhanh 
hơn và có những công cụ có thể làm thay đổi cách thức viết mã lệnh của bạn. 
 Biên dịch các đoạn mã ngắn với Snippet Compiler 
 Xây dựng biểu thức chính quy với Regulator 
 Sinh mã với CodeSmith 
 Viết kiểm thử đơn vị với NUnit 
 Kiểm soát mã lệnh với FxCop 
 Khảo sát assembly với .NET Reflector 
 Lập tài liệu mã lệnh với NDoc 
 Tạo dựng giải pháp với NAnt 
 Các công cụ chuyển đổi: ASP.NET Version Switcher, Visual Studio .NET Project 
Converter, VB.NET to C# Converter, và Convert C# to VB.NET 
 Xây dựng website quản trị cơ sở dữ liệu với ASP.NET Maker 1.1 
A.1 Biên dịch các đoạn mã ngắn với Snippet Compiler 
Snippet Compiler là một ứng dụng nhỏ dùng để viết, biên dịch, và chạy mã lệnh. Công cụ này 
hữu ích khi bạn có những đoạn mã ngắn và bạn không muốn phải tạo toàn bộ dự án Visual 
Studio .NET (cùng với các file đi kèm) cho chúng. 
Lấy ví dụ, giả sử bạn muốn chạy một ứng dụng nào đó từ Microsoft .NET Framework. Trong 
Snippet Compiler, bạn hãy tạo một ứng dụng Console mới. Phần mã lệnh có thể được tạo bên 
trong phương thức Main của ứng dụng này. Đoạn mã dưới đây trình bày cách tạo một thể hiện 
của Notepad từ .NET Framework: 
using System; 
using System.Collections; 
public class MyClass 
{ 
 public static void Main() 
P 
PHỤ LỤC A 
GIỚI THIỆU 
MỘT SỐ CÔNG CỤ .NET 
534 
Phụ lục A: Giới thiệu một số công cụ .NET 
 { 
 System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
 proc.StartInfo.FileName= "notepad.exe"; 
 proc.Start(); 
 proc.WaitForExit(); 
 } 
} 
Hình A-1 Snippet Compiler 
Hình A-1 cho thấy đoạn mã này trong Snippet Compiler. Để thử nghiệm đoạn mã này, bạn chỉ 
việc nhấn nút Play (hình tam giác xanh), và nó sẽ chạy ở chế độ gỡ rối. Đoạn mã này sẽ sinh 
ra một cửa sổ pop-up (ứng dụng Console), và Notepad sẽ xuất hiện. Khi bạn đóng Notepad, 
ứng dụng Console cũng sẽ đóng. 
 Snippet Compiler được viết bởi Jeff Key và có thể được download tại 
[]. 
A.2 Xây dựng biểu thức chính quy với Regulator 
Regulator là một công cụ với đầy đủ tính năng dùng để xây dựng và kiểm tra các biểu thức 
chính quy. Biểu thức chính quy được sử dụng để định nghĩa các mẫu trong những chuỗi dựa 
trên ký tự, tần số xuất hiện, và thứ tự ký tự. Chúng thường được sử dụng nhiều nhất để làm 
phương tiện xác nhận tính tính hợp lệ của đầu vào do người dùng cung cấp hoặc tìm một 
chuỗi ký tự bên trong một chuỗi lớn hơn—chẳng hạn, khi tìm kiếm một địa chỉ URL hay e-
mail trên một trang web. 
535 
Phụ lục A: Giới thiệu một số công cụ .NET 
Regulator cho phép bạn nhập một biểu thức chính quy và một đầu vào nào đó (bạn sẽ chạy 
biểu thức chính quy dựa trên đầu vào này). Bằng cách này, bạn có thể thấy cách thức làm việc 
của biểu thức chính quy và kết quả trả về trước khi hiện thực nó trong ứng dụng của mình. 
Hình A-2 cho thấy Regulator với một biểu thức chính quy đơn giản. 
Hình A-2 Regulator với một biểu thức chính quy đơn giản 
Phần document chứa biểu thức chính quy, trong ví dụ này là [0-9]*, biểu thức này trùng khớp 
với bất kỳ dãy chữ số nào. Hộp ở phía dưới phải chứa đầu vào cho biểu thức chính quy, và 
hộp ở phía dưới trái hiển thị những trùng khớp mà biểu thức chính quy tìm thấy bên trong các 
đầu vào. Viết và kiểm tra các biểu thức chính quy trong một ứng dụng độc lập như thế này thì 
dễ hơn nhiều so với thao tác chúng trong ứng dụng của bạn. 
Một trong những tính năng hay nhất của Regulator là khả năng tìm kiếm thư viện biểu thức 
chính quy trực tuyến tại []. Ví dụ, nếu nhập chuỗi "phone" vào hộp tìm 
kiếm, bạn sẽ tìm thấy hơn 20 biểu thức chính quy khác nhau trùng khớp với các số điện thoại, 
bao gồm các biểu thức cho Anh, Úc, và nhiều số điện thoại khác. 
 Regulator được viết bởi Roy Osherove và có thể được download tại 
[]. 
A.3 Sinh mã với CodeSmith 
CodeSmith là một công cụ sinh mã dựa-trên-template (khuôn mẫu), sử dụng một cú pháp 
tương tự như ASP.NET để kết sinh bất kỳ kiểu mã hay text nào. Khác với nhiều công cụ sinh 
mã khác, CodeSmith không yêu cầu bạn mô tả một bản thiết kế hay kiến trúc ứng dụng cụ thể. 
Khi sử dụng CodeSmith, bạn có thể kết sinh mọi thứ, từ một tập hợp đơn giản, được-định-
kiểu-mạnh đến toàn bộ một ứng dụng. 
Khi xây dựng một ứng dụng, bạn thường phải lặp đi lặp lại những tác vụ nào đó, chẳng hạn 
viết mã truy xuất dữ liệu hay xây dựng các tập hợp tùy biến. CodeSmith đặc biệt hữu ích trong 
những tình huống như vậy, vì bạn có thể viết các template để tự động hóa các tác vụ này, điều 
này không chỉ cải thiện hiệu năng mà còn giúp bạn bớt nhàm chán. 
536 
Phụ lục A: Giới thiệu một số công cụ .NET 
CodeSmith có sẵn một số template, bao gồm những template cho tất cả các kiểu tập hợp .NET 
cũng như những template để sinh thủ tục tồn trữ, nhưng sức mạnh thực sự của công cụ này 
chính là khả năng tạo các template tùy biến. 
Template của CodeSmith chỉ là file văn bản đơn thuần (có thể được tạo bằng công cụ soạn 
thảo văn bản bất kỳ), với phần mở rộng là .cst. 
Template được giới thiệu dưới đây sẽ nhận một chuỗi và rồi xây dựng một lớp dựa vào chuỗi 
đó. Bước đầu tiên là viết phần header, phần này khai báo ngôn ngữ của template, ngôn ngữ 
đích, và mô tả vắn tắt về template: 
<%@ CodeTemplate Language="C#" 
 TargetLanguage="C#" 
 Description="Car Template" %> 
Phần kế tiếp của template là các khai báo thuộc tính, các thuộc tính này sẽ được chỉ định mỗi 
khi template chạy. Ví dụ dưới đây khai báo một thuộc tính chuỗi: 
<%@ Property Name="ClassName" Type="String" Category="Context" 
 Description="Class Name" %> 
Khai báo này sẽ làm cho thuộc tính ClassName xuất hiện trong cửa sổ thuộc tính của 
CodeSmith để nó có thể được chỉ định khi template chạy. 
Bước tiếp theo là xây dựng phần thân của template (với mã lệnh tương tự như ASP.NET). 
Như bạn có thể thấy, template này nhận chuỗi nhập và sinh ra một lớp với tên đó. Trong phần 
thân của template, các thẻ đóng và mở được sử dụng như trong ASP.NET. Trong template 
này, ta chỉ chèn giá trị thuộc tính, nhưng cũng có thể sử dụng bất kỳ kiểu mã .NET nào bên 
trong các thẻ này. 
public sealed class 
{ 
 private static volatile _instance; 
 private () {} 
 private static readonly object _syncRoot = new object(); 
 public static Value 
 { 
 get 
 { 
 if (_instance == null) 
 { 
 lock(_syncRoot) 
 { 
 if (_instance == null) 
 { 
 _instance = new (); 
 } 
 } 
 } 
 return _instance; 
 } 
 } 
} 
Một khi template đã hoàn tất, bạn hãy nạp nó vào CodeSmith (xem hình A-3). Bạn có thể 
nhận thấy thuộc tính phía bên trái là thuộc tính mà chúng ta đã khai báo trong template. 
537 
Phụ lục A: Giới thiệu một số công cụ .NET 
Nếu bạn nhập “SingletonClass” làm tên lớp và nhắp nút Generate, CodeSmith sẽ sinh ra lớp 
dưới đây: 
public sealed class SingletonClass 
{ 
 private static volatile SingletonClass _instance; 
 private SingletonClass() {} 
 private static readonly object _syncRoot = new object(); 
 public static SingletonClass Value 
 { 
 get 
 { 
 if (_instance == null) 
 { 
 lock(_syncRoot) 
 { 
 if (_instance == null) 
 { 
 _instance = new SingletonClass(); 
 } 
 } 
 } 
 return _instance; 
 } 
 } 
} 
Hình A-3 Nạp template vào CodeSmith 
CodeSmith tương đối dễ sử dụng và có thể sinh ra những kết quả tuyệt vời nếu được áp dụng 
một cách đúng đắn. Một trong những phần phổ biến nhất cần được sinh mã là tầng truy xuất 
dữ liệu. CodeSmith có một assembly đặc biệt với tên là SchemaExplorer, assembly này có thể 
được sử dụng để sinh ra các template từ bảng, thủ tục tồn trữ, hay hầu như bất kỳ đối tượng 
SQL Server nào khác. 
 CodeSmith được viết bởi Eric J. Smith và có thể được download (bản dùng thử) tại 
[]. 
538 
Phụ lục A: Giới thiệu một số công cụ .NET 
A.4 Viết kiểm thử đơn vị với NUnit 
NUnit là bộ khung kiểm thử đơn vị được xây dựng cho .NET Framework, cho phép bạn viết 
các phương thức kiểm thử theo ngôn ngữ do bạn chọn để kiểm tra một hàm cụ thể của chương 
trình. Ứng dụng NUnit cung cấp một bộ khung để viết các kiểm thử đơn vị, cũng như một 
giao diện đồ họa để chạy các kiểm thử đơn vị và xem kết quả. 
Ví dụ, chúng ta cần kiểm tra chức năng của lớp Hashtable trong .NET Framework để xác 
định hai đối tượng có thể được thêm vào và lấy ra hay không. Bước đầu tiên là tham chiếu 
đến assembly NUnit.Framework để có thể truy xuất các thuộc tính và phương thức của bộ 
khung NUnit. Bước kế tiếp là tạo một lớp và đánh dấu nó với đặc tính [TestFixture] để 
NUnit biết lớp này có chứa phương thức kiểm thử. 
using System; 
using System.Collections; 
using NUnit.Framework; 
namespace NUnitExample 
{ 
 [TestFixture] 
 public class HashtableTest { 
 public HashtableTest() { 
 } 
 } 
} 
Kế tiếp, chúng ta tạo một phương thức và đánh dấu nó với đặc tính [Test] để NUnit biết đây 
là phương thức kiểm thử. Trong phương thức này, chúng ta sẽ thiết lập một Hashtable và đưa 
vào đó hai giá trị, sau đó sử dụng phương thức Assert.AreEqual để xem chúng ta có thể thu 
lấy đúng các giá trị mà chúng ta đã đưa vào Hashtable hay không: 
[Test] 
public void HashtableAddTest() 
{ 
 Hashtable ht = new Hashtable(); 
 ht.Add("Key1", "Value1"); 
 ht.Add("Key2", "Value2"); 
 Assert.AreEqual("Value1", ht["Key1"], "Wrong object returned!"); 
 Assert.AreEqual("Value2", ht["Key2"], "Wrong object returned!"); 
} 
Để chạy phương thức kiểm thử này, bạn cần tạo một dự án NUnit, mở assembly đã được sinh 
ra bên trên và nhắp nút Run. Hình A-4 cho thấy kết quả. 
Trên đây chỉ là một kiểm thử đơn giản, nhưng cho thấy khả năng của NUnit. Có rất nhiều kiểu 
kiểm thử, cũng như nhiều phương thức Assert, có thể được sử dụng để kiểm thử mọi phần 
trong mã lệnh của bạn. 
Một kiểm thử đơn vị có thể lưu và chạy lại mỗi khi bạn sửa đổi mã lệnh, điều này giúp bạn 
phát hiện lỗi dễ dàng hơn và đảm bảo phát triển ứng dụng tốt hơn. 
 NUnit là một dự án mã nguồn mở và có thể được download tại []. 
539 
Phụ lục A: Giới thiệu một số công cụ .NET 
Hình A-4 NUnit 
Cũng có một bản add-in của NUnit cho Visual Studio .NET, add-in này cho phép bạn trực tiếp 
chạy các phương thức kiểm thử đơn vị từ Visual Studio .NET (có thể được download tại 
[]). 
Để có thêm thông tin về NUnit và vị trí của nó trong việc phát triển test-driven (vận hành theo 
kiểm thử), bạn hãy xem bài viết “Test-Driven C#: Improve the Design and Flexibility of Your 
Project with Extreme Programming Techniques” trong đĩa CD đính kèm. 
A.5 Kiểm soát mã lệnh với FxCop 
.NET Framework rất mạnh, có nghĩa khả năng tạo ra những ứng dụng tuyệt vời là rất cao, 
nhưng khả năng tạo ra những chương trình tồi cũng là rất cao. FxCop là một trong những 
công cụ có thể được sử dụng để trợ giúp tạo ra những ứng dụng tốt hơn bằng việc cho phép 
bạn khảo sát một assembly và kiểm tra tính tương thích của nó với một số quy luật. FxCop 
chứa tập các quy luật do Microsoft tạo ra, nhưng bạn cũng có thể tạo ra những quy luật cho 
mình. Chẳng hạn, nếu muốn tất cả các lớp đều có một phương thức khởi dựng mặc định 
không đối số, bạn có thể viết một quy luật kiểm tra phương thức khởi dựng trên mỗi lớp của 
assembly. Để có thêm thông tin về việc tạo những quy luật tùy biến, bạn hãy vào 
[]. 
Ví dụ, chúng ta hãy xem FxCop phát hiện ra lỗi gì trong assembly NUnitExample (đã được 
trình bày mục A.4). Trước tiên, bạn cần tạo một dự án FxCop và đưa assembly này vào. Sau 
đó, bạn hãy nhấn Analyze, FxCop sẽ khảo sát assembly này và đưa ra các thông báo lỗi (xem 
hình A-5). 
FxCop nhận thấy một số vấn đề với assembly này. Bạn có thể nhắp đúp lên một lỗi để xem 
chi tiết, bao gồm lời mô tả quy luật và nơi mà bạn có thể tìm thấy nhiều thông tin hơn. 
FxCop có thể giúp bạn tạo mã lệnh tốt hơn, nhất quán hơn, nhưng nó không thể sửa chữa việc 
thiết kế tồi hay lập trình kém. FxCop cũng không phải là một sự thay thế cho việc kiểm tra mã 
lệnh (code review), nhưng vì nó có thể bắt nhiều lỗi trước khi kiểm tra mã lệnh nên bạn có thể 
dành nhiều thời gian cho các vấn đề hệ trọng hơn là phải lo lắng về các quy ước đặt tên. 
540 
Phụ lục A: Giới thiệu một số công cụ .NET 
Hình A-5 FxCop đưa ra các thông báo khi khảo sát NUnitExample 
 FxCop được phát triển bởi Microsoft và có thể được download tại 
[]. 
A.6 Khảo sát assembly với .NET Reflector 
.NET Reflector là một trình duyệt lớp (class browser) và trình dịch ngược (decompiler), nó có 
thể khảo sát một assembly và cho bạn thấy tất cả các “bí mật” trong đó. .NET Framework đã 
đưa ra cơ chế phản chiếu (reflection) để khảo sát bất kỳ mã lệnh nào dựa-trên-.NET, cho dù 
nó là một lớp đơn hay toàn bộ một assembly. Cơ chế phản chiếu cũng có thể được sử dụng để 
thu lấy thông tin về các lớp, phương thức, và thuộc tính khác nhau trong một assembly nào 
đó. Sử dụng .NET Reflector, bạn có thể duyệt các lớp và các phương thức của một assembly, 
bạn có thể khảo sát ngôn ngữ trung gian (Microsoft Intermediate LanguageMSIL) do các 
lớp và phương thức này sinh ra, và bạn có thể dịch ngược các lớp và phương thức sang C# 
hay Visual Basic .NET. 
Ví dụ, chúng ta sẽ sử dụng .NET Reflector để khảo sát assembly NUnitExample (đã được 
trình bày ở mục A.4). Hình A-6 thể hiện assembly này khi được nạp vào .NET Reflector. Bên 
trong .NET Reflector còn có những công cụ mà bạn có thể sử dụng để khảo sát thêm assembly 
này. Để xem MSIL của một phương thức, bạn hãy nhắp vào phương thức này và chọn 
Disassembler. 
Ngoài việc xem MSIL, bạn cũng có thể xem phương thức ở dạng C# bằng cách chọn 
Decompiler từ trình đơn Tools. Bạn cũng có thể xem phương thức này được dịch ngược sang 
Visual Basic .NET hay Delphi bằng cách thay đổi tùy chọn trong trình đơn Languages. Dưới 
đây là đoạn mã do .NET Reflector sinh ra: 
541 
Phụ lục A: Giới thiệu một số công cụ .NET 
public void HashtableAddTest() 
{ 
 Hashtable hashtable1 = new Hashtable(); 
 hashtable1.Add("Key1", "Value1"); 
 hashtable1.Add("Key2", "Value2"); 
 Assert.AreEqual("Value1", hashtable1["Key1"], 
 "Wrong object returned!"); 
 Assert.AreEqual("Value2", hashtable1["Key2"], 
 "Wrong object returned!"); 
} 
Hình A-6 Khảo sát NUnitExample với .NET Reflector 
Đoạn mã trên rất giống với đoạn mã mà chúng ta đã viết: 
public void HashtableAddTest() 
{ 
 Hashtable ht = new Hashtable(); 
 ht.Add("Key1", "Value1"); 
 ht.Add("Key2", "Value2"); 
 Assert.AreEqual("Value1", ht["Key1"],"Wrong object returned!"); 
 Assert.AreEqual("Value2", ht["Key2"],"Wrong object returned!"); 
} 
Mặc dù có một vài khác biệt nhỏ về mã lệnh nhưng chúng giống hệt nhau về chức năng. 
Công dụng hay nhất của .NET Reflector là khảo sát các assembly và phương thức của .NET 
Framework. .NET Framework cung cấp nhiều cách khác nhau để thực hiện các thao tác tương 
tự nhau. Ví dụ, nếu bạn cần đọc một tập dữ liệu từ XML, có nhiều cách khác nhau để thực 
hiện điều này: sử dụng XmlDocument, XPathNavigator, hay XmlReader. Bằng cách sử dụng 
.NET Reflector, bạn có thể xem Microsoft đã sử dụng gì khi viết phương thức ReadXml của 
DataSet, hoặc họ đã làm gì khi đọc dữ liệu từ file cấu hình. .NET Reflector cũng rất có ích khi 
542 
Phụ lục A: Giới thiệu một số công cụ .NET 
tìm hiểu cách tạo các đối tượng như HttpHandlers; và qua đó, bạn biết được cách thức mà 
nhóm phát triển của Microsoft đã xây dựng các đối tượng đó trong Framework. 
 .NET Reflector được viết bởi Lutz Roeder và có thể được download tại 
[]. 
A.7 Lập tài liệu mã lệnh với NDoc 
Việc lập tài liệu mã lệnh gần như là một công việc không mấy hứng thú. Ở đây không nói về 
tài liệu thiết kế mà là tài liệu cho từng phương thức và thuộc tính của lớp. Công cụ NDoc sẽ 
sẽ tự động sinh tài liệu cho mã lệnh của bạn bằng cách sử dụng cơ chế phản chiếu để khảo sát 
assembly và sử dụng file XML được sinh từ các chú thích XML C# (các chú thích XML chỉ có 
hiệu lực cho C#, nhưng có một Visual Studio .NET Power Toy với tên là VBCommenter cũng 
sẽ thực hiện giống như vậy đối với Visual Basic .NET). 
Với NDoc, bạn vẫn cứ lập tài liệu cho mã lệnh, nhưng lập khi viết mã (trong các chú thích 
XML). Bước đầu tiên khi sử dụng NDoc là mở chức năng sinh chú thích XML đối với 
assembly của bạn. Nhắp phải vào dự án và chọn Properties | Configuration Properties | 
Build, rồi nhập một đường dẫn để lưu file XML trong tùy chọn XML Documentation File 
(xem hình A-7). Khi dự án được tạo dựng, một file XML sẽ được sinh ra với tất cả các chú 
thích XML đi kèm. 
Hình A-7 Chọn đường dẫn để lưu tài liệu XML 
Dưới đây là phương thức ở mục A.4: 
/// 
/// This test adds a number of values to the Hashtable collection 
/// and then retrieves those values and checks if they match. 
/// 
[Test] 
public void HashtableAddTest() 
{ 
 // Phần thân phương thức ở đây. 
} 
543 
Phụ lục A: Giới thiệu một số công cụ .NET 
Phần chú thích XML cho phương thức này sẽ được trích xuất và lưu thành file XML như sau: 
 NUnitExample 
 This test adds a number of values to the Hashtable 
 collection and then retrieves those values and checks if 
 they match. 
Bước kế tiếp là nạp assembly và file XML vào NDoc. Sau đó, nhắp nút Build Documentation 
để chạy quá trình sinh tài liệu (xem hình A-8). Hình A-9 là tài liệu CHM do NDoc sinh ra. 
Hình A-8 NDoc 
544 
Phụ lục A: Giới thiệu một số công cụ .NET 
Hình A-9 Tài liệu CHM do NDoc sinh ra 
 NDoc là một dự án mã nguồn mở và có thể được download tại 
[]. 
A.8 Tạo dựng giải pháp với NAnt 
NAnt là một công cụ tạo dựng dựa-trên-.NET, giúp bạn viết một quy trình tạo dựng dự án cho 
mình. Khi có nhiều nhà phát triển cùng làm việc trên một dự án, bạn không thể phó thác việc 
tạo dựng cho từng người. Bạn cũng không muốn phải thường xuyên tạo dựng dự án một cách 
thủ công. Thay vào đó, bạn viết một quy trình tạo dựng tự động chạy mỗi đêm. NAnt cho 
phép bạn tạo dựng giải pháp, chép file, chạy các kiểm tra NUnit, gửi e-mail, và nhiều nữa. 
Đáng tiếc, NAnt thiếu giao diện đồ họa, nhưng nó có một ứng dụng Console và các file XML 
chỉ định các tác vụ nào sẽ được hoàn thành trong quá trình tạo dựng. Lưu ý rằng MSBuild, 
một nền tạo dựng mới trong trong phiên bản Visual Studio 2005, cũng có tính năng tương tự 
như NAnt. 
Ví dụ, chúng ta cần viết file tạo dựng NAnt cho dự án NUnitExample ở mục A.4. Trước tiên, 
bạn hãy tạo một file XML với phần mở rộng là .build, và đặt nó trong thư mục gốc của dự án: 
 The NUnit Example Project 
 <csc target="library" output=".\bin\debug\NUnitExample.dll" 
 debug="${debug}"> 
 <includes name="C:\Program Files\NUnit 2.2\bin 
 \NUnit.Framework.dll" /> 
Thẻ project được sử dụng để đặt tên cho dự án, target mặc định, và thư mục cơ sở. Thẻ này 
cần có những thẻ con sau: 
• Thẻ description được sử dụng để đặt một mô tả ngắn gọn về dự án. 
545 
Phụ lục A: Giới thiệu một số công cụ .NET 
• Thẻ property được sử dụng để lưu trữ một thiết lập sao cho nó có thể được truy xuất từ 
bất cứ đâu trong file tạo dựng. Ví dụ này tạo một thuộc tính với tên là debug, và thiết 
lập nó là true hay false tùy vào bạn có muốn dự án được biên dịch ở cấu hình gỡ rối 
hay không (thuộc tính này không ảnh hưởng gì đến cách thức tạo dựng dự án; nó chỉ là 
một biến số mà bạn có thể thiết lập và sẽ được thu về khi bạn thật sự xác định cách thức 
tạo dựng dự án). 
• Kế tiếp là thẻ target. Một dự án có thể có nhiều target (có thể được chỉ định khi NAnt 
chạy). Nếu không có target nào được chỉ định, target mặc định sẽ được sử dụng (ta đã 
thiết lập nó trong thẻ project). Trong ví dụ này, target mặc định là build. Bên trong 
thẻ target, bạn cần thiết lập tên của target và mô tả những gì mà target này sẽ thực 
hiện. 
Thẻ csc được sử dụng để chỉ định những gì sẽ được truyền cho trình biên dịch C#. 
Trước tiên, bạn phải thiết lập target cho thẻ csc. Do cần tạo file .dll nên ví dụ này thiết 
lập target là library. Kế tiếp, bạn phải thiết lập output cho thẻ csc, đây là nơi mà file 
.dll sẽ được tạo. Cuối cùng, bạn cần thiết lập thuộc tính debug, cho biết dự án có được 
biên
            Các file đính kèm theo tài liệu này:
 cac_giai_phap_lap_trinh_c_sharp_split_11.pdf cac_giai_phap_lap_trinh_c_sharp_split_11.pdf