CÁC GIẢI PHÁP LẬP TRÌNH C - TS. NGUYỄN XUÂN THỦY - 9
lượt xem 5
download
Chương 16: Các giao diện và mẫu thông dụng Hiện thực thêm các thuộc tính và các thành viên dữ liệu để hỗ trợ trạng thái sự kiện mà bạn cần truyền cho các phương thức thụ lý sự kiện. Tốt nhất là làm cho trạng thái sự kiện trở nên bất biến (immutable), như vậy bạn nên sử dụng các thành viên dữ liệu private readonly và sử dụng các thuộc tính public để cho phép truy xuất chỉ-đọc đến các thành viên dữ liệu này. Hiện thực một phương thức khởi dựng public hỗ trợ cấu hình ban đầu...
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: CÁC GIẢI PHÁP LẬP TRÌNH C - TS. NGUYỄN XUÂN THỦY - 9
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 641 Chương 16: Các giao diện và mẫu thông dụng • Hiện thực thêm các thuộc tính và các thành viên dữ liệu để hỗ trợ trạng thái sự kiện mà bạn cần truyền cho các phương thức thụ lý sự kiện. Tốt nhất là làm cho trạng thái sự kiện trở nên bất biến (immutable), như vậy bạn nên sử dụng các thành viên dữ liệu private readonly và sử dụng các thuộc tính public để cho phép truy xuất chỉ-đọc đến các thành viên dữ liệu này. • Hiện thực một phương thức khởi dựng public hỗ trợ cấu hình ban đầu của trạng thái sự kiện. • Làm cho lớp đối số sự kiện của bạn trở nên khả-tuần-tự-hóa ( serializable) để bộ thực thi có thể marshal các thể hiện của nó qua các biên miền ứng dụng và biên máy. Áp dụng đặc tính System.SerializableAttribute thường là đã đủ cho các lớp đối số sự kiện. Tuy nhiên, nếu lớp đối số sự kiện có các yêu cầu tuần tự hóa đặc biệt, bạn phải hiện thực giao diện System.Runtime.Serialization.ISerializable (xem mục 16.1 để biết cách làm cho một lớp trở nên khả-tuần-tự-hóa). Đoạn mã dưới đây trình bày một lớp đối số sự kiện tùy biến có tên là MailReceivedEventArgs. Giả sử có một mail-server truyền các thể hiện của lớp MailReceivedEventArgs cho các phương thức thụ lý sự kiện nhận một thông điệp e-mail. Lớp này chứa các thông tin về người gửi và chủ đề của thông điệp e-mail. using System; [Serializable] public sealed class MailReceivedEventArgs : EventArgs { // Các thành viên private readonly giữ trạng thái sự kiện // (được phân bổ cho tất cả các phương thức thụ lý sự kiện). // Lớp MailReceivedEventArgs sẽ cho biết ai đã gửi mail // và chủ đề là gì. private readonly string from; private readonly string subject; // Phương thức khởi dựng (khởi tạo trạng thái sự kiện). public MailReceivedEventArgs(string from, string subject) { this.from = from; this.subject = subject; } // Các thuộc tính chỉ-đọc cho phép truy xuất // trạng thái sự kiện. public string From { get { return from; } }
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 642 Chương 16: Các giao diện và mẫu thông dụng public string Subject { get { return subject; } } } Hiện thực mẫu Singleton 9. Bạn cần bảo đảm chỉ có một thể hiện của một kiểu tồn tại ở một thời điểm cho trước và thể hiện đó là khả-truy-xuất đối với tất cả các phần tử của ứng dụng. Hiện thực kiểu này theo mẫu Singleton như sau: • Hiện thực một thành viên tĩnh private để giữ một tham chiếu đến thể hiện của kiểu. • Hiện thực một thuộc tính tĩnh khả-truy-xuất-công-khai để cho phép truy xuất chỉ-đọc đến thể hiện. • Hiện thực một phương thức khởi dựng private để mã lệnh không thể tạo thêm các thể hiện của kiểu. Trong tất cả các mẫu được biết đến, có lẽ mẫu Singleton được biết đến nhiều nhất và thường được sử dụng nhất. Mục đích của mẫu Singleton là bảo đảm chỉ có một thể hiện của một kiểu tồn tại ở một thời điểm cho trước và cho phép truy xuất toàn cục đến các chức năng của thể hiện đó. Đoạn mã dưới đây trình bày một hiện thực của mẫu Singleton cho một lớp có tên là SingletonExample: public class SingletonExample { // Thành viên tĩnh dùng để giữ một tham chiếu đến thể hiện singleton. private static SingletonExample instance; // Phương thức khởi dựng tĩnh dùng để tạo thể hiện singleton. // Một cách khác là sử dụng "Lazy Initialization" trong // thuộc tính Instance. static SingletonExample () { instance = new SingletonExample(); } // Phương thức khởi dựng private dùng để ngăn mã lệnh tạo thêm // các thể hiện của kiểu singleton. private SingletonExample () {} // Thuộc tính public cho phép truy xuất đến thể hiện singleton. public static SingletonExample Instance {
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 643 Chương 16: Các giao diện và mẫu thông dụng get { return instance; } } // Các phương thức public cung cấp chức năng của singleton. public void SomeMethod1 () { /*..*/ } public void SomeMethod2 () { /*..*/ } } Để gọi các chức năng của lớp SingletonExample, bạn có thể lấy về một tham chiếu đến singleton bằng thuộc tính Instance và rồi gọi các phương thức của nó. Bạn cũng có thể trực tiếp thực thi các thành viên của singleton thông qua thuộc tính Instance. Đoạn mã dưới đây trình bày cả hai cách này: // Thu lấy tham chiếu đến singleton và gọi một phương thức của nó. SingletonExample s = SingletonExample.Instance; s.SomeMethod1(); // Thực thi chức năng của singleton mà không cần tham chiếu. SingletonExample.Instance.SomeMethod2(); Hiện thực mẫu Observer 10. Bạn cần hiện thực một cơ chế hiệu quả để một đối tượng ( subject) báo với các đối tượng khác (observer) về những thay đổi trạng thái của nó. Hiện thực mẫu Observer bằng các kiểu ủy nhiệm (đóng vai trò là các con trỏ hàm an-toàn-về-kiểu-dữ-liệu—type-safe function pointer) và các kiểu sự kiện. Cách truyền thống khi hiện thực mẫu Observer là hiện thực hai giao diện: một để mô tả observer (IObserver) và một để mô tả subject (ISubject). Các đối tượng có hiện thực IObserver sẽ đăng ký với subject, cho biết chúng muốn được thông báo về các sự kiện quan trọng (như thay đổi trạng thái) tác động đến subject. Subject chịu trách nhiệm quản lý danh sách các observer đã đăng ký và thông báo với chúng khi đáp ứng các sự kiện tác động đến subject. Subject thường thông báo với observer bằng phương thức Notify (được khai báo trong giao diện IObserver). Subject có thể truyền dữ liệu cho observer trong phương thức Notify, hoặc observer có thể cần gọi một phương thức được khai báo trong giao diện ISubject để thu lấy thêm các chi tiết về sự kiện. Mặc dù bạn có thể hiện thực mẫu Observer bằng C# theo cách vừa được mô tả, nhưng vì mẫu Observer quá phổ biến trong các giải pháp phần mềm hiện đại nên C# và .NET Framework cung cấp các kiểu sự kiện và ủy nhiệm để đơn giản hóa hiện thực của nó. Sử dụng sự kiện và ủy nhiệm nghĩa là bạn không cần khai báo giao diện IObserver và ISubject. Ngoài ra, bạn không cần hiện thực các logic cần thiết để quản lý và thông báo với các observer đã đăng ký —đây chính là phần dễ xảy ra lỗi nhất khi viết mã.
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 644 Chương 16: Các giao diện và mẫu thông dụng .NET Framework sử dụng một hiện thực cho mẫu Observer dựa-trên-sự-kiện và dựa-trên-ủy- nhiệm thường xuyên đến nỗi nó được đặt một cái tên: mẫu Event. File ObserverExample.cs chứa một hiện thực cho mẫu Event. Ví dụ này bao gồm: • Lớp Thermostat (subject)—theo dõi nhiệt độ hiện tại và thông báo với observer khi có sự thay đổi nhiệt độ. • Lớp TemperatureChangeEventArgs—là một hiện thực tùy biến của lớp System.EventArgs, được sử dụng để đóng gói dữ liệu cần phân bổ cho observer. • Ủy nhiệm TemperatureEventHandler—định nghĩa chữ ký của phương thức mà tất cả các observer của đối tượng Thermostat phải hiện thực, và đối tượng Thermostat sẽ gọi phương thức này trong sự kiện thay đổi nhiệt độ. • Lớp TemperatureChangeObserver và TemperatureAverageObserver—là các observer của lớp Thermostat. Lớp (được trình bày bên dưới) dẫn xuất từ lớp TemperatureChangeEventArgs System.EventArgs. Lớp này sẽ chứa tất cả các dữ liệu cần thiết để subject truyền cho các observer khi nó thông báo với chúng về một sự kiện. Nếu không cần truyền dữ liệu, bạn không phải định nghĩa một lớp đối số mới (bạn chỉ cần truyền đối số null khi dựng nên sự kiện). Xem mục 16.8 để biết rõ hơn về cách hiện thực lớp đối số sự kiện tùy biến. // Lớp đối số sự kiện chứa thông tin về sự kiện thay đổi nhiệt độ. // Một thể hiện của lớp này sẽ được truyền cùng với mỗi sự kiện. public class TemperatureChangeEventArgs : System.EventArgs { // Các thành viên dữ liệu chứa nhiệt độ cũ và mới. private readonly int oldTemperature, newTemperature; // Phương thức khởi dựng (nhận giá trị nhiệt độ cũ và mới). public TemperatureChangeEventArgs(int oldTemp, int newTemp) { oldTemperature = oldTemp; newTemperature = newTemp; } // Các thuộc tính dùng để truy xuất các giá trị nhiệt độ. public int OldTemperature { get { return oldTemperature; } } public int NewTemperature { get { return newTemperature; } } } Đoạn mã dưới đây trình bày cách khai báo ủy nhiệm TemperatureEventHandler. Dựa trên khai báo này, tất cả các observer phải hiện thực một phương thức (tên không quan trọng), trả về
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 645 Chương 16: Các giao diện và mẫu thông dụng và nhận hai đối số: một đối tượng Thermostat và một đối tượng void TemperatureChangeEventArgs. Trong quá trình thông báo, đối số Thermostat chỉ đến đối tượng Thermostat đã dựng nên sự kiện, và đối số TemperatureChangeEventArgs chứa các dữ liệu về nhiệt độ cũ và mới. // Ủy nhiệm cho biết chữ ký mà tất cả các phương thức // thụ lý sự kiện phải hiện thực. public delegate void TemperatureEventHandler(Thermostat s, TemperatureChangeEventArgs e); Lớp Thermostat là đối tượng bị giám sát trong mẫu Observer (Event) này. Theo lý thuyết, một thiết bị giám sát thiết lập nhiệt độ hiện tại bằng cách gọi thuộc tính Temperature trên một đối tượng Thermostat. Khi đó, đối tượng Thermostat dựng nên sự kiện TemperatureChange và gửi một đối tượng TemperatureChangeEventArgs đến mỗi observer. Dưới đây là mã lệnh cho lớp Thermostat: // Lớp mô tả một bộ ổn nhiệt, là nguồn gốc của các sự kiện thay đổi // nhiệt độ. Trong mẫu Observer, đối tượng Thermostat là subject. public class Thermostat { // Trường private dùng để giữ nhiệt độ hiện tại. private int temperature = 0; // Sự kiện dùng để duy trì danh sách các ủy nhiệm observer và // dựng nên sự kiện thay đổi nhiệt độ. public event TemperatureEventHandler TemperatureChange; // Phương thức protected dùng để dựng nên sự kiện TemperatureChange. // Vì sự kiện chỉ có thể được phát sinh bên trong kiểu chứa nó nên // việc sử dụng phương thức protected cho phép các lớp dẫn xuất // có cách hành xử tùy biến và vẫn có thể dựng nên sự kiện // của lớp cơ sở. virtual protected void RaiseTemperatureEvent (TemperatureChangeEventArgs e) { if (TemperatureChange != null) { TemperatureChange(this, e); } } // Thuộc tính public dùng để lấy và thiết lập nhiệt độ hiện tại. // Phía "set" chịu trách nhiệm dựng nên sự kiện thay đổi nhiệt độ
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 646 Chương 16: Các giao diện và mẫu thông dụng // để thông báo với tất cả các observer về thay đổi này. public int Temperature { get { return temperature; } set { // Tạo một đối tượng đối số sự kiện mới để chứa // nhiệt độ cũ và mới. TemperatureChangeEventArgs e = new TemperatureChangeEventArgs(temperature, value); // Cập nhật nhiệt độ hiện tại. temperature = value; // Dựng nên sự kiện thay đổi nhiệt độ. RaiseTemperatureEvent(e); } } } Với mục đích minh họa mẫu Observer, ví dụ này có hai kiểu observer: TemperatureAverageObserver (hiển thị nhiệt độ trung bình mỗi khi một sự kiện thay đổi nhiệt độ xảy ra) và TemperatureChangeObserver (hiển thị thông tin về sự thay đổi mỗi khi một sự kiện thay đổi nhiệt độ xảy ra). Dưới đây là mã lệnh cho hai lớp này: // Observer hiển thị thông tin về sự thay đổi nhiệt độ // khi có một sự kiện thay đổi nhiệt độ xảy ra. public class TemperatureChangeObserver { // Phương thức khởi dựng (nhận một tham chiếu đến đối tượng // Thermostat cần được TemperatureChangeObserver giám sát). public TemperatureChangeObserver(Thermostat t) { // Tạo một thể hiện ủy nhiệm TemperatureEventHandler và // đăng ký nó với Thermostat đã được chỉ định. t.TemperatureChange += new TemperatureEventHandler(this.TemperatureChange); }
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 647 Chương 16: Các giao diện và mẫu thông dụng // Phương thức thụ lý sự kiện thay đổi nhiệt độ. public void TemperatureChange(Thermostat sender, TemperatureChangeEventArgs temp) { System.Console.WriteLine ("ChangeObserver: Old={0}, New={1}, Change={2}", temp.OldTemperature, temp.NewTemperature, temp.NewTemperature - temp.OldTemperature); } } // Observer hiển thị thông tin về nhiệt dộ trung bình // khi có một sự kiện thay đổi nhiệt độ xảy ra. public class TemperatureAverageObserver { // Sum chứa tổng các giá trị nhiệt độ. // Count chứa số lần sự kiện thay đổi nhiệt độ xảy ra. private int sum = 0, count = 0; // Phương thức khởi dựng (nhận một tham chiếu đến đối tượng // Thermostat cần được TemperatureAverageObserver giám sát). public TemperatureAverageObserver (Thermostat t) { // Tạo một thể hiện ủy nhiệm TemperatureEventHandler và // đăng ký nó với Thermostat đã được chỉ định. t.TemperatureChange += new TemperatureEventHandler(this.TemperatureChange); } // Phương thức thụ lý sự kiện thay đổi nhiệt độ. public void TemperatureChange(Thermostat sender, TemperatureChangeEventArgs temp) { count++; sum += temp.NewTemperature; System.Console.WriteLine
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 648 Chương 16: Các giao diện và mẫu thông dụng ("AverageObserver: Average={0:F}", (double)sum/(double)count); } } Lớp Thermostat định nghĩa một phương thức Main (được trình bày bên dưới) để chạy ví dụ này. Sau khi tạo một đối tượng Thermostat và hai đối tượng observer, phương thức Main sẽ nhắc bạn nhập vào một nhiệt độ. Mỗi khi bạn nhập một nhiệt độ mới, đối tượng Thermostat sẽ báo cho observer hiển thị thông tin ra cửa sổ Console. public static void Main() { // Tạo một đối tượng Thermostat. Thermostat t = new Thermostat(); // Tạo hai observer. new TemperatureChangeObserver(t); new TemperatureAverageObserver(t); // Lặp để lấy nhiệt độ từ người dùng. Bất cứ giá trị // nào không phải số nguyên sẽ khiến vòng lặp kết thúc. do { System.Console.Write("\n\rEnter current temperature: "); try { // Chuyển đầu vào của người dùng thành một số // nguyên và sử dụng nó để thiết lập nhiệt độ // hiện tại của bộ ổn nhiệt. t.Temperature = System.Int32.Parse(System.Console.ReadLine()); } catch (System.Exception) { // Sử dụng điều kiện ngoại lệ để kết thúc vòng lặp. System.Console.WriteLine("Terminating ObserverExample."); return; } } while (true);
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 649 Chương 16: Các giao diện và mẫu thông dụng } Dưới đây là kết xuất khi chạy ObserverExample.cs (các giá trị in đậm là do bạn nhập vào): Enter current temperature: 50 ChangeObserver: Old=0, New=50, Change=50 AverageObserver: Average=50.00 Enter current temperature: 20 ChangeObserver: Old=50, New=20, Change=-30 AverageObserver: Average=35.00 Enter current temperature: 40 ChangeObserver: Old=20, New=40, Change=20 AverageObserver: Average=36.67
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 650 Chương 16: Các giao diện và mẫu thông dụng
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 651 Chương 17:SỰ HÒA HỢP VỚI MÔI TRƯỜNG WINDOWS 17
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 652
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 653 Chương 17: Sự hòa hợp với môi trường Windows M icrosoft .NET Framework được thiết kế sao cho có thể chạy trên nhiều hệ điều hành khác nhau, nâng cao tính khả chuyển của mã lệnh ( code mobility) và đơn giản hóa việc tích hợp xuyên-nền (cross-platform integration). Hiện tại, .NET Framework có thể chạy trên các hệ điều hành: Microsoft Windows, FreeBSD, Linux, và Mac OS X. Tuy nhiên, nhiều bản hiện thực vẫn chưa hoàn chỉnh hay chưa được chấp nhận rộng rãi. Microsoft Windows hiện là hệ điều hành mà .NET Framework được cài đặt nhiều nhất. Do đó, các mục trong chương này tập trung vào các tác vụ đặc trưng cho hệ điều hành Windows, bao gồm: Lấy các thông tin môi trường Windows (mục 17.1 và 17.2). Ghi vào nhật ký sự kiện Windows (mục 17.3). Truy xuất Windows Registry (mục 17.4). Tạo và cài đặt dịch vụ Windows (mục 17.5 và 17.6). Tạo shortcut trên Desktop hay trong Start menu của Windows (mục 17.7). Phần lớn các chức năng được thảo luận trong chương này được CLR bảo vệ bằng các quyền bảo mật truy xuất mã lệnh ( Code Access Security). Xem chương 13 về bảo mật truy xuất mã lệnh, và xem tài liệu . NET Framework SDK về các quyền cần thiết để thực thi từng bộ phận. Truy xuất thông tin môi trường 1. Bạn cần truy xuất các thông tin về môi trường thực thi mà ứng dụng đang chạy trong đó. Sử dụng các thành viên của lớp System.Environment. Lớp Environment cung cấp một tập các thành viên tĩnh dùng để lấy (và trong một số trường hợp, để sửa đổi) thông tin về môi trường mà một ứng dụng đang chạy trong đó. Bảng 17.1 mô tả các thành viên thường dùng nhất. Bảng 17.1 Các thành viên thường dùng của lớp Environment Thành viên Mô tả Thuộc tính Lấy chuỗi chứa dòng lệnh thực thi ứng dụng hiện tại, CommandLine gồm cả tên ứng dụng; xem chi tiết ở mục 1.5. Lấy và thiết lập chuỗi chứa thư mục hiện hành của ứng dụng. Ban đầu, thuộc tính này chứa tên của thư CurrentDirectory mục mà ứng dụng đã chạy trong đó. Lấy một giá trị luận lý cho biết CRL đã bắt đầu tắt, HasShutdownStarted hoặc miền ứng dụng đã bắt đầu giải phóng hay chưa. Lấy chuỗi chứa tên máy. MachineName
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 654 Chương 17: Sự hòa hợp với môi trường Windows Lấy một đối tượng System.OperatingSystem chứa các thông tin về nền và phiên bản của hệ điều hành OSVersion nằm dưới. Xem chi tiết bên dưới bảng. Lấy chuỗi chứa đường dẫn đầy đủ của thư mục hệ SystemDirectory thống. Lấy một giá trị kiểu int cho biết thời gian (tính bằng TickCount mili-giây) từ khi hệ thống khởi động. Lấy chuỗi chứa tên miền của người dùng hiện hành. Thuộc tính này sẽ giống với thuộc tính MachineName UserDomainName nếu đây là máy độc lập. Lấy một giá trị luận lý cho biết ứng dụng có đang chạy trong chế độ tương tác với người dùng hay UserInteractive không. Trả về false khi ứng dụng là một dịch vụ hoặc ứng dụng Web. Lấy chuỗi chứa tên người dùng đã khởi chạy tiểu UserName trình hiện hành. Lấy một đối tượng System.Version chứa thông tin Version về phiên bản của CRL. Phương thức Thay tên của các biến môi trường trong một chuỗi ExpandEnvironmentVariables bằng giá trị của biến; xem chi tiết ở mục 17.2. Trả về một mảng kiểu chuỗi chứa tất cả các phần tử dòng lệnh dùng để thực thi ứng dụng hiện tại, gồm GetCommandLineArgs cả tên ứng dụng; xem chi tiết ở mục 1.5. Trả về chuỗi chứa giá trị của một biến môi trường; GetEnvironmentVariable xem chi tiết ở mục 17.2. Trả về một System.Collections.Idictionary chứa tất cả các biến môi trường và các giá trị của chúng; GetEnvironmentVariables xem chi tiết ở mục 17.2 Trả về chuỗi chứa đường dẫn đến một thư mục hệ thống đặc biệt, được xác định bởi kiểu liệt kê System.Environment.SpecialFolder (bao gồm các thư mục cho Internet cache, Cookie, History, GetFolderPath Desktop, và Favourite; xem tài liệu .NET Framework SDK để có danh sách tất cả các giá trị này).
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 655 Chương 17: Sự hòa hợp với môi trường Windows Trả về mảng kiểu chuỗi chứa tên của tất cả các ổ đĩa GetLogicalDrives luận lý. Đối tượng OperatingSystem (do OSVersion trả về) có hai thuộc tính: Platform và Version. Thuộc tính Platform trả về một giá trị thuộc kiểu liệt kê System.PlatformID—xác định nền hiện hành; các giá trị hợp lệ là Win32NT, Win32S, Win32Windows, và WinCE. Thuộc tính Version trả về một đối tượng System.Version—xác định phiên bản của hệ điều hành. Để xác định chính xác tên hệ điều hành, bạn phải sử dụng cả thông tin nền và phiên bản, bảng 17.2 dưới đây sẽ liệt kê một số thông tin chi tiết. Bảng 17.2 Xác định hệ điều hành PlatformID Major Version Minor Version Hệ điều hành 4 10 Windows 98 Win32Windows 4 90 Windows Me Win32Windows 4 0 Windows NT 4 Win32NT 5 0 Windows 2000 Win32NT 5 1 Windows XP Win32NT 5 2 Windows Server 2003 Win32NT Lớp AccessEnvironmentExample trong ví dụ dưới đây sử dụng lớp Environment để hiển thị thông tin về môi trường hiện hành. using System; public class AccessEnvironmentExample { public static void Main() { // Dòng lệnh. Console.WriteLine("Command line : " + Environment.CommandLine); // Thông tin về phiên bản hệ điều hành và môi trường thực thi. Console.WriteLine("OS PlatformID : " + Environment.OSVersion.Platform); Console.WriteLine("OS Major Version : " + Environment.OSVersion.Version.Major); Console.WriteLine("OS Minor Version : " + Environment.OSVersion.Version.Minor); Console.WriteLine("CLR Version : " + Environment.Version); // Thông tin về người dùng, máy, và miền.
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 656 Chương 17: Sự hòa hợp với môi trường Windows Console.WriteLine("User Name : " + Environment.UserName); Console.WriteLine("Domain Name : " + Environment.UserDomainName); Console.WriteLine("Machine name : " + Environment.MachineName); // Các thông tin môi trường khác. Console.WriteLine("Is interactive ? : " + Environment.UserInteractive); Console.WriteLine("Shutting down ? : " + Environment.HasShutdownStarted); Console.WriteLine("Ticks since startup : " + Environment.TickCount); // Hiển thị tên của tất cả các ổ đĩa luận lý. foreach (string s in Environment.GetLogicalDrives()) { Console.WriteLine("Logical drive : " + s); } // Thông tin về các thư mục chuẩn. Console.WriteLine("Current folder : " + Environment.CurrentDirectory); Console.WriteLine("System folder : " + Environment.SystemDirectory); // Liệt kê tất cả các thư mục đặc biệt. foreach (Environment.SpecialFolder s in Enum.GetValues(typeof(Environment.SpecialFolder))) { Console.WriteLine("{0} folder : {1}", s, Environment.GetFolderPath(s)); } // Nhấn Enter để kết thúc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 657 Chương 17: Sự hòa hợp với môi trường Windows Lấy giá trị của một biến môi trường 2. 2. Bạn cần lấy giá trị của một biến môi trường để sử dụng cho ứng dụng của bạn. Sử dụng các phương thức GetEnvironmentVariable, GetEnvironmentVariables, và ExpandEnvironmentVariables của lớp Environment. Phương thức GetEnvironmentVariable trả về chuỗi chứa giá trị của một biến môi trường, còn phương thức GetEnvironmentVariables trả về một Idictionary chứa tên và giá trị của tất cả các biến môi trường dưới dạng chuỗi. Phương thức ExpandEnvironmentVariables cung cấp một cơ chế đơn giản để thay tên biến môi trường bằng giá trị của nó bên trong một chuỗi, bằng cách đặt tên biến môi trường giữa dấu phần trăm (%). Ví dụ sau minh họa cách sử dụng ba phương thức trên: using System; using System.Collections; public class VariableExample { public static void Main () { // Lấy một biến môi trường thông qua tên. Console.WriteLine("Path = " + Environment.GetEnvironmentVariable("Path")); Console.WriteLine(); // Thay tên biến môi trường bằng giá trị của nó. Console.WriteLine(Environment.ExpandEnvironmentVariables( "The Path on %computername% is %Path%")); Console.WriteLine(); // Lấy tất cả các biến môi trường. Hiển thị giá trị // của các biến môi trường bắt đầu bằng ký tự 'P'. IDictionary vars = Environment.GetEnvironmentVariables(); foreach (string s in vars.Keys) { if (s.ToUpper().StartsWith("P")) { Console.WriteLine(s + " = " + vars[s]); } } Console.WriteLine();
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 658 Chương 17: Sự hòa hợp với môi trường Windows // Nhấn Enter để kết thúc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } } Ghi một sự kiện vào nhật ký sự kiện Windows 3. Bạn cần ghi một sự kiện vào nhật ký sự kiện Windows. Sử dụng các thành viên của lớp System.Diagnostics.EventLog để tạo một nhật ký (nếu cần), đăng ký một nguồn sự kiện (event source), và ghi sự kiện. Bạn có thể ghi vào nhật ký sự kiện Windows bằng các phương thức tĩnh của lớp EventLog, hoặc có thể tạo một đối tượng EventLog và sử dụng các thành viên của nó. Dù chọn cách nào, trước khi ghi bạn cần phải quyết định sẽ sử dụng nhật ký nào và đăng ký một nguồn sự kiện cho nhật ký đó. Nguồn sự kiện đơn giản chỉ là một chuỗi (duy nhất) nhận diện ứng dụng của bạn. Một nguồn sự kiện chỉ có thể được đăng ký cho một nhật ký tại một thời điểm. Theo mặc định, nhật ký sự kiện gồm ba loại: Application, System, và Security. Thông thường, bạn sẽ ghi vào nhật ký Application, nhưng cũng có thể ghi vào một nhật ký tùy biến. Bạn không cần phải trực tiếp tạo ra nhật ký tùy biến; khi bạn đăng ký một nguồn sự kiện cho một nhật ký, nếu nhật ký này không tồn tại, nó sẽ được tạo một cách tự động. Một khi đã chọn nhật ký đích và đã đăng ký nguồn sự kiện tương ứng cho nó, bạn có thể bắt đầu ghi các entry nhật ký bằng phương thức WriteEntry. Phương thức này cung cấp các phiên bản nạp chồng cho phép bạn chỉ định một vài hoặc tất cả các giá trị sau: • Chuỗi chứa nguồn sự kiện cho entry nhật ký (chỉ có ở các phương thức tĩnh). • Chuỗi chứa thông điệp cho entry nhật ký. • Giá trị thuộc kiểu liệt kê System.Diagnostics.EventLogEntryType, chỉ định kiểu của entry nhật ký. Các giá trị hợp lệ là Error, FailureAlert, Information, SuccessAudit, và Warning. • Giá trị kiểu int chỉ định ID của entry nhật ký. • Giá trị kiểu short chỉ định category của entry nhật ký. • Mảng kiểu byte chứa dữ liệu thô tương ứng với entry nhật ký. Lớp EventLogExample trong ví dụ dưới đây trình bày cách sử dụng các phương thức tĩnh của lớp EventLog để ghi một entry vào nhật ký sự kiện của máy cục bộ. Lớp EventLog cũng cung cấp các phương thức nạp chồng để ghi vào nhật ký sự kiện của các máy ở xa (xem tài liệu .NET Framework SDK để biết thêm chi tiết). using System; using System.Diagnostics;
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 659 Chương 17: Sự hòa hợp với môi trường Windows public class EventLogExample { public static void Main () { // Nếu nguồn sự kiện không tồn tại, đăng ký nó với // nhật ký Application trên máy cục bộ. // Đăng ký một nguồn sự kiện đã tồn tại sẽ // sinh ra ngoại lệ System.ArgumentException. if (!EventLog.SourceExists("EventLogExample")) { EventLog.CreateEventSource("EventLogExample","Application"); } // Ghi một sự kiện vào nhật ký sự kiện. EventLog.WriteEntry( "EventLogExample", // Nguồn sự kiện đã đăng ký "A simple test event.", // Thông điệp cho sự kiện EventLogEntryType.Information, // Kiểu sự kiện 1, // ID của sự kiện 0, // Category của sự kiện new byte[] {10, 55, 200} // Dữ liệu của sự kiện ); // Nhấn Enter để kết thúc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } } Truy xuất Windows Registry 4. Bạn cần đọc thông tin từ Registry hoặc ghi thông tin vào Registry. Sử dụng lớp Microsoft.Win32.Registry để lấy về đối tượng Microsoft.Win32. RegistryKey mô tả một khóa mức-cơ-sở. Sử dụng các thành viên của đối tượng RegistryKey để duyệt cây phân cấp; đọc, sửa, và tạo khóa và giá trị. Bạn không thể truy xuất trực tiếp các khóa và các giá trị nằm trong Registry. Trước hết bạn phải thu lấy đối tượng RegistryKey mô tả một khóa mức-cơ-sở, sau đó duyệt qua cây phân cấp của đối tượng này để đến khóa cần tìm. Lớp Registry hiện thực bảy trường tĩnh, các
- Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 660 Chương 17: Sự hòa hợp với môi trường Windows trường này đều trả về đối tượng RegistryKey mô tả khóa mức-cơ-sở. Bảng 17.3 trình bày các khóa mức-cơ-sở ứng với các trường này. Bảng 17.3 Các trường tĩnh của lớp Registry Trường Ứng với HKEY_CLASSES_ROOT ClassesRoot HKEY_CURRENT_CONFIG CurrentConfig HKEY_CURRENT_USER CurrentUser HKEY_DYN_DATA DynData HKEY_LOCAL_MACHINE LocalMachine HKEY_PERFORMANCE_DATA PerformanceData HKEY_USERS Users Phương thức tĩnh RegistryKey.OpenRemoteBaseKey cho phép bạn mở một khóa mức-cơ-sở trên một máy ở xa (xem chi tiết trong tài liệu .NET Framework SDK). Một khi đã có đối tượng RegistryKey mô tả khóa mức-cơ-sở, bạn phải duyệt qua cây phân cấp để đến khóa cần tìm. Để hỗ trợ việc duyệt cây, lớp RegistryKey cung cấp các thành viên dưới đây: • Thuộc tính SubKeyCount—Trả về số khóa con. • Phương thức GetSubKeyNames—Trả về một mảng kiểu chuỗi chứa tên của tất cả các khóa con. • Phương thức OpenSubKey—Trả về tham chiếu đến một khóa con. Phương thức này có hai phiên bản nạp chồng: phương thức thứ nhất mở khóa trong chế độ chỉ-đọc; phương thức thứ hai nhận một đối số kiểu bool, nếu là true thì cho phép ghi. Một khi đã có đối tượng RegistryKey mô tả khóa cần tìm, bạn có thể tạo, đọc, cập nhật, hoặc xóa các khóa con và các giá trị bằng các phương thức trong bảng 17.4. Các phương thức sửa đổi nội dung của khóa đòi hỏi bạn phải có đối tượng RegistryKey cho phép ghi. Bảng 17.4 Các phương thức của RegistryKey dùng để tạo, đọc, cập nhật, và xóa các khóa và các giá trị Registry Phương thức Mô tả Tạo một khóa mới với tên được chỉ định và trả về đối tượng RegistryKey cho phép ghi. Nếu khóa đã tồn tại, phương thức này CreateSubKey sẽ trả về một tham chiếu cho phép ghi đến khóa đã tồn tại. Xóa khóa với tên được chỉ định, khóa này phải không có khóa con (nhưng có thể có giá trị); nếu không, ngoại lệ DeleteSubKey System.InvalidOperationException sẽ bị ném. Xóa khóa với tên được chỉ định cùng với tất cả các khóa con của DeleteSubKeyTree nó.
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn