Kỹ thuật lập trình C Sharp 2.0

492 939 2
Kỹ thuật lập trình C Sharp 2.0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Learning CSharp Learning CSharp Table of Contents Bảng nội dung Chương 1:Kiến trúc C# NET 2.1 Mối quan hệ C# NET 2.2 The Common Language Runtime 2.3 Assemblies 10 2.4 Tìm hiểu Intermediate Language 12 2.5 Các lớp NET Framework 21 2.6 Tạo ứng dụng NET C# 22 2.7 Vai trò C# kiến trúc NET Enterprise 26 2.8 Tóm tắt 27 Chương 2: Căn C# 28 3.1 Trước bắt đầu 29 3.2 Chương trình C# 29 3.3 Biến 30 3.4 Kiểu liệu tiền đònh nghóa 33 3.5 Câu lệnh điều kiện 36 3.6 Cấu trúc chương trình 41 3.7 Phương thức 43 3.8 Mảng 46 3.9 Toán tử 48 3.10 An toàn kiểu 51 3.11 Kiểu lệt kê 52 3.12 Namespaces 54 3.13 Phương thức Main() 56 3.14 Các tập tin biên dòch C# 57 3.15 Console I/O 58 3.16 Cách dùng giải 59 3.17 Từ đònh danh từ khóa 59 3.18 Tóm tắt 60 Chương 3: Hướng đối tượng C# 60 4.1 Lớp thừa kế 61 4.2 Thuộc tính 65 Learning CSharp 4.3 Lớp đối tượng 67 4.4 Interfaces 69 4.5 Construction and Disposal 74 4.6 Các trường đọc 83 4.7 Structs 84 4.8 Nạp chồng toán hạng 86 4.9 Bộ lập mục 92 4.10 Tóm tắt 94 Chương : Các chủ đề tiến C# 95 5.1 Lỗi xử lí biệt lệ 95 5.2 Ép kiểu người dùng đònh nghóa 113 5.3 Delegates 122 5.4 Các kiện 132 5.5 Chỉ thò tiền xử lí C# 139 5.6 Attributes 141 5.7 Quản lí nhớ C# 144 5.8 Mã không an toàn 148 5.9 Tóm tắt 161 Chương : C# lớp sở 161 6.1 System.Object 162 6.2 Xử lí chuỗi 165 6.3 Regular Expressions 175 6.4 Nhóm đối tượng 182 6.5 Attributes tùy chọn 195 6.6 Reflection 201 6.7 Luồng 210 6.8 Tóm tắt 220 Chương 6: Lập trình mội trường NET 221 7.1 Visual Studio NET 221 7.2 Những công cụ khác NET 243 7.3 Nguyên tắc sử dụng NET 244 7.4 Tóm tắt 247 Chương 7: Các ứng dụng Window 247 8.1 Windows Applications in NET 248 Learning CSharp 8.2 Windows Forms 250 8.3 Windows Controls 276 8.4 Custom Controls 279 8.5 Tóm tắt 282 Chapter 8: Assemblies 282 9.1 Assemblies ? 283 9.2 Cấu trúc Assembly 286 9.3 Hổ trợ xuyên ngôn ngữ 293 9.4 Thêm tài nguyên đến Assembly 297 9.5 Global Assembly Cache 301 9.6 Tạo Shared Assembly 303 9.7 Cấu hình 309 9.8 Triển khai 310 9.9 Tóm tắt 312 10 Chương 9: Truy xuất liệu với NET 313 10.1 Tổng quan ADO.NET 313 10.2 Sử dụng Database Connection 315 10.3 Commands 320 10.4 Truy cập nhanh sở liệu với Data Reader 327 10.5 Quản lí liệu mối quan hệ: The DataSet 330 10.6 Các sơ đồ XML 341 10.7 Tạo DataSet 347 10.8 Các cố gắng thay đổi DataSet 349 10.9 Làm việc với ADO.NET 353 10.10 Tóm tắt 358 11 Chương 10 : Cách xem liệu NET 359 11.1 The DataGrid Control 360 11.2 Gắn kết liệu 372 11.3 Visual Studio and Data Access 378 11.4 Tóm tắt 397 12 Chương 11: Thao tác XML 398 12.1 Các hổ trợ XML chuẩn NET 398 12.2 Giới thiệu khônggian tên System.Xml 399 12.3 sử dụng MSXML NET 400 Learning CSharp 12.4 Sử dụng lớp System.Xml 403 12.5 Đọc ghi Streamed XML 404 12.6 Sử dụng DOM NET 413 12.7 Sử dụng XPath XSLT NET 419 12.8 XML ADO.NET 428 12.9 Tóm tắt 440 13 Chapter 12: File and Registry Operations 440 13.1 Quản lí tập tin hệ thống 441 13.2 Di chuyển,sao chép xoá tập tin 447 13.3 Đọc ghi tập tin 451 13.4 Đọc ghi đến Registry 457 13.5 Tóm tắt 461 14 Chương 13: Làm việc với Active Directory 461 14.1 Kiến trúc Active Directory 462 14.2 Các công cụ quản trò cho Active Directory 468 14.3 Active Directory Service Interfaces (ADSI) 471 14.4 Lập trình với Active Directory 472 14.5 Tìm kiếm đối tượng người dùng 485 14.6 Tóm tắt 490 15 Addenda 491 15.1 Các hỗ trợ XML chuẩn 491 Learning CSharp Bảng nội dung Lập trình với C# Chương 1(See 2.) - Kiến trúc C# NET Chương(See 3.) 2(See 3.) - Căn C# Chương(See 4.) 3(See 4.) (See Hướng đối tượng C# 4.) Chương(See 5.) 4(See 5.) - Những chủ đề tiến C# Chương(See 6.) 5(See 6.) - C# lớp sở Chương(See 7.) 6(See 7.) - Lập trình mơi trường NET Chương(See 8.) 7(See 8.) - Windows Applications Chương(See 9.) 8(See 9.) - Assemblies Chương(See 10.) 9(See 10.) - Truy cập sở liệu với NET Chương(See 11.) 10(See 11.) - Viewing NET Data Chương(See 12.) 11(See 12.) - Thao tác XML Chương(See 13.) 12(See 13.) - File and Registry Operations Chương(See 14.) 13(See 14.) - Làm việc với Active Directory Biên dịch từ Professional C#, 2nd Edition, Xuất Wrox Press Ltd Chương 1:Kiến trúc C# NET Tổng quan: Tơi muốn nhấn mạnh đừng xem xét ngơn ngữ C# cách tách biệt, ln đồng hành với "Bộ khung NET" C# trình biên dịch hướng NET, nghĩa tất mã C# ln ln chạy trên mơi trường NET Framework Điều dẫn đến hệ sau: Learning CSharp   Cấu trúc lập luận C# phản ánh phương pháp luận NET ngầm bên Trong nhiều trường hợp, đặc trưng C# chí định dựa vào đặc trưng NET, thư viện lớp sở NET Chính tầm quan trọng NET, nên bạn cần phải biết sơ qua NET trước vào ngơn ngữ C# Đây mục đích chương Chúng ta tìm hiểu xem chuyện xảy mã ngơn ngữ hướng NET (bao gồm C#) biên dịch thực thi Đây lĩnh vực rộng, tìm hiểu kĩ Microsoft Intermediate Language (MS-IL), ngơn ngữ trung gian NET mã ngơn ngữ khác phải biên dịch ngơn ngữ trước thực thi Cụ thể tìm hiểu xem cách thức mà MS-IL với phần dùng chung Common Type System (CTS) Common Language Specification (CLS) cung cấp cho tương hoạt ngơn ngữ hướng NET Chúng ta trình bày ngơn ngữ biết NET khác bao gồm VB C++ Sau xem xét đặc trưng khác NET, bao gồm assembly, namespace, thư viện lớp NET Chúng ta kết thúc chương việc liệt kê vắn tắt loại ứng dụng mà tạo C# 2.1 Mối quan hệ C# NET C# ngơn ngữ lập trình mới, biết đến với hai lời chào:   Nó thiết kế riêng để dùng cho Microsoft's NET Framework (Một mạnh cho phát triển, triển khai, thực phân phối ứng dụng) Nó ngơn ngữ hồn tồn hướng đối tượng thiết kế dựa kinh nghiệm ngơn ngữ hướng đối tượng khác Một điều quan trọng cần nhớ C# ngơn ngữ độc lập Nó thiết kế để sinh mã đích mơi trường NET, khơng phải phần NET có vài đặc trưng hỗ trợ NET C# khơng hỗ trợ bạn đừng ngạc nhiên có đặc trưng C# hỗ trợ mà NET khơng hỗ trợ (chẳng hạn q tải tốn tử) Để tạo ứng dụng mang tính hiệu cao, xem qua hoạt động NET 2.2 The Common Language Runtime Trung tâm NET framework mơi trường thời gian chạy, gọi Common Language Runtime (CLR) NET runtime Mã điều khiển CLR thường mã có quản Tuy nhiêu, trước thực thi CLR, mã phát triển C# (hoặc ngơn ngữ khác) cần phải biên dịch.Q trình biên dịch NET xảy theo hai bước: Learning CSharp Dịch mã nguồn thành Microsoft Intermediate Language (MS-IL) Dịch IL thành mã cụ thể CLR Mới nhìn dài dòng Nhưng thật sự, tiến trình dịch hai mức cần thiết, trạng thái Microsoft Intermediate Language (mã có quản) chìa khóa cung cấp nhiều lợi ích NET Các lợi ích mã có quản Microsoft Intermediate Language (thường viết tắt là"Intermediate Language", hay "IL") tương tự ý tưởng mã Java byte, ngơn ngữ cấp thấp với cú pháp đơn giản (dựa sở mã số text), điều làm cho q trình dịch sang mã máy nhanh Hiểu kĩ cú pháp mang lại lợi ích đáng kể Độc lập Trước tiên, có nghĩa file chứa mã lệnh chạy nào, vào thời gian chạy trình biên dịch cuối hoạt động mã chạy cụ thể Nói cách khác việc dịch mã nguồn sang Intermediate Language cho phép độc lập NET, giống cách dịch mã nguồn sang Java byte code cung cấp độc lập Java Bạn nên biết độc lập NET lí thuyết thời điểm này, NET có sẵn Windows Tuy nhiên việc chuyển NET sang khác khảo sát tỉ mỉ (xem ví dụ Mono project, cố gắng tạo thực thi mã nguồn mở NET, địa http://www.go-mono.com/) Sự cải tiến thực thi Mặc dù so sánh với Jave, IL thật có chút khả quan Java IL ln trình biên dịch Just-In-Time, ngược lại Java byte code thường thơng dịch Một bất lợi Java vào lúc thực thi q trình dịch từ java byte code sang mã máy tốn nhiều tài ngun Thay phải dịch tồn ứng dụng lần, trình biên dịch JIT biên dịch phần mã gọi Khi mã dịch rồi, mã kết giữ lại khỏi ứng dụng, khơng phải biên dịch lại lần chạy Microsoft cách xử lí có hiệu lực cao dịch tồn ứng dụng, có trường hợp khối lượng lớn mã ứng dụng khơng sử dụng thời gian chạy Khi sử dụng trình biên dịch JIT , đoạn mã khơng dịch Chính hi vọng mã IL thực thi nhanh mã máy Microsof cam kết có thay đổi lớn thực thi Lời lí giải là, lần dịch cuối thời gian chạy, trình biên dịch JIT biết xác loại vi xử lí mà chương trình chạy Có nghĩa tối ưu mã thi hành cuối cách tham chiếu đến đặc trưng lệnh ứng với loại vi xử lí Các trình biên dịch truyền thống có tối ưu mã, chúng tối ưu độc lập khơng quan tâm đến loại vi xử lý mà chương trình chạy Bởi trình biên dịch truyền thống biên dịch tồn ứng dụng sang mã máy trước thực thi Có nghĩa trình biên dịch khơng Learning CSharp biết loại vi xử lí mà chương trình chạy, chẳng hạn vi xử lí tương thích x86 vi xử lí Alpha Visual Studio 6, tối ưu cho cho máy tương thích Pentium, mã mà sinh khơng đem lại lợi ích đặc trưng phần cứng vi xử lí Pentium III Trong đó, trình biên dịch JIT thực tối ưu giống Visual Studio 6, ngồi tối ưu cho loại vi xử lí cụ thể mà mã chương trình chạy Tương hoạt ngơn ngữ Chúng ta biết cách thức IL cho phép độc lập nền, trình biên dịch JIT cải thiện q trình thực thi Tuy nhiên, IL làm cho tương hoạt ngơn ngữ trở nên dễ dàng Bạn biên dịch IL từ ngơn, mã sau tương hoạt với IL biên dịch ngơn ngữ khác Bây bạn tự hỏi ngơn ngữ tương tác với C# NET, xem qua ngơn ngữ biết NET phổ biến sau VB.NET Visual Basic tân trang lại để tương thích với cơng nghệ NET Từ việc phát triển Visual Basic năm gần cho thấy phiên trước, Visual Basic 6, khơng tương thích với lập trình NET Ví dụ, đặt nặng vấn đề tích hợp COM, đưa kiện để phát triển, hầu hết mã khơng có sẵn mã nguồn Khơng thế, khơng thực hỗ trợ tính thừa kế kiểu liệu chuẩn Visual Basic khơng tương thích với NET Visual Basic hồn thiện Visual Basic NET, đừng ngạc nhiên thay đổi xảy diện rộng Về phương diện thực hành bạn xem VB.NET ngơn ngữ Mã VB khơng khơng thể biên dịch mã VB.NET Sự chuyển đổi từ lập trình VB sang VB.NET u cầu thay đổi lớn mã Tuy nhiên hầu hết thay đổi thực cách tự động Visual Studio NET (sự cải tiến VS cho việc sử dụng NET) Nếu bạn cố gắng đọc đề án VB Visual Studio NET, cải tiến đề án bạn, có nghĩa viết lại mã nguồn VB thành mã nguồn VB.NET Điều có nghĩa việc gặp rắc rối bạn cắt ngang, bạn phải kiểm tra lại mã VB.NET để đề án bạn chạy Một hiệu ứng phụ khơng khả biên dịch NET sang mã thực thi VB.NET biên dịch sang IL, giống C# Nếu bạn muốn tiếp tục mã hóa VB 6, bạn làm vậy, mã thực thi q dài lờ NET Framework, bạn cần phải giữ lại Visual Studio cài đồng thời phải hồn tồn tin vào mơi trường phát triển Visual Studio Managed C++ Vào lúc Visual C++ 6, C++ có khối lượng lớn mở rộng Microsoft Windows Với Visual C++ NET, mở rộng tăng thêm cho việc hỗ trợ NET framework Có nghĩa mã nguồn C++ tiếp tục dịch sang mã máy khơng có khác biệt Cũng có nghĩa chạy độc lập mơi trường NET Nếu bạn khơng Learning CSharp muốn mã C++ bạn chạy mơi trường NET Framework, bạn đơn giãn đặt dòng lệnh sau vào đầu mã nguồn bạn: #using Bạn bỏ qua cờ /clr trình biên dịch, cờ cho biết bạn muốn biên dịch sang mã có quản, phát IL thay mã máy Có điều thú vị C++ bạn biên dịch sang mã có quản, trình biên dịch phát IL có nhúng mã máy Điều có nghĩa bạn pha trộn kiểu có quản kiểu khơng quản mã C++ Bằng cách mã C++: class MyClass { Định nghĩa cho lớp C++ , mã: gc class MyClass { cho bạn lớp có quản, giống việc bạn viết lớp C# hay VB.NET Thật vậy, thuận lợi managed C++ so với C# bạn gọi lớp khơng quản C++ từ mã có quản C++ bỏ qua tương thích COM Trình biên dịch phát lỗi bạn cố gắng dùng đặc trưng mà mã có quản NET khơng hỗ trợ (ví dụ, khn mẫu hay đa thừa kế) Bạn nhận bạn phải dùng đặc trưng khơng C++ (chẳng hạn từ khố gc ví dụ trên) sử dụng lớp có quản Bởi VC++ cho phép giải phóng nhớ thủ cơng dạng trỏ, trình biên dịch C++ khơng thể phát mã cho kiểu nhớ an tồn CLR Nếu ứng dụng bạn thật cần phải nhận dạng kiểu nhớ an tồn CLR, bạn cần phải viết mã nguồn ngơn ngữ khác (như C# hay VB.NET) J++ and J# J++ hỗ trợ cho mục đích tương thích trước Microsoft khơng phát triển tảng hỗ trợ việc biện dịch sang máy Java ảo Thay đó, Microsoft phát triển hai cơng nghệ tách biệt Java/J++ phát triển bên cờ JUMP (Java User Migration Path) "JUMP NET" Cơng nghệ Visual J# Về chất thêm vào Visual Studio.NET phép bạn viết biên dịch mã J++ Sự khác biệt thay biên dịch sang Java Virtual Machine, J# biên dịch sang IL, hoạt động ngơn ngữ NET Ngừơi dùng J# hưởng thuận lợi đặc tính VS.NET Microsoft tin người dùng J++ nhanh chóng nhận điều họ thích làm việc với NET Sự lựa chọn thứ hai cơng cụ tự động hỗ trợ việc chuyển mã J++ sang mã C# Sự giống J++ C# làm cho việc chuyển đổi trở nên dễ dàng Learning CSharp using (DirectoryEntry de = new DirectoryEntry()) { de.Path = "LDAP://celticrain/CN=Christian Nagel, " + "OU=Wrox Press, DC=eichkogelstrasse, DC=local"; Console.WriteLine("Name: " + de.Name); Console.WriteLine("GUID: " + de.Guid); Console.WriteLine("Type: " + de.SchemaClassName); Console.WriteLine(); // } Đối tượng Active Directory giữ nhiều thơng tin hơn, với thơng tin có giá trị tuỳ thuộc vào kiểu đối tượng, thuộc tính Propertier trả PropertyCollection thuộc tính tự tập, thuộc tính đơn có nhiều giá trị, ví dụ , đối tượng user có nhiều số điện thoại.Trong ví dụ ta dùng vòng lặp foreach để qt qua giá trị.tập mà trả từ properties [name] đối tượng mảng thuộc tính giá trị strings,numbers,hoặc kiểu khác ta dùng phương thức ToString() để trình bày giá trị: Console.WriteLine("Properties: "); PropertyCollection properties = de.Properties; foreach (string name in properties.PropertyNames) { foreach (object o in properties[name]) { Console.WriteLine(name + ": " + o.ToString()); } } Trong kết ta thấy tất thuộc tính đối tượng user Christian Nagel ta thấy otherTelephone thuộc tính nhiều giá trị mà có nhiều số điện thoại vài giá trị thuộc tính trình bày kiểu đối tượng,System. ComObject, ví dụ lastLogoff,LastLogon, nTSecurityDescriptor để lấy giá trị thuộc tính ta phải dùng interface Active DirectorySICOM trực tiếp từ lớp namespace System.DirectoryServices 477 Learning CSharp Truy xuất thuộc tính trực tiếp từ tên Với DirectoryEntry.Properties ta truy xuất tất thuộc tính biết tên thuộc tính ta truy xuất giá trị cách trực tiếp : foreach (string homePage in de.Properties["wWWHomePage"]) Console.WriteLine("Home page: " + homePage); Object collections Các đối tượng chứa (container) chứa đối tượng ta lấy đối tượng thơng qua thuộc tính Children lớp DirectoryEntry ta lấy đối tượng chứa (container) đối tượng thuộc tính Parent đối tượng khơng chứa đối tượng khác trả tập rỗng thuộc tính Children.thuộc tính Children trả tập DirectoryEntries mà gom đối tượng DirectoryEntry ta qt qua đối tượng DirectoryEntry để trình bày tên đối tượng con: using (DirectoryEntry de = new DirectoryEntry()) { de.Path = "LDAP://celticrain/OU=Wrox Press, " + "DC=eichkogelstrasse, DC=local"; Console.WriteLine("Children of " + de.Name); foreach (DirectoryEntry obj in de.Children) { Console.WriteLine(obj.Name); } } 478 Learning CSharp Trong ví dụ ta thấy tất đối tượng OU ( organization unit) : users,contacts,printers,shares, ta muốn thấy vài kiểu đối tựợng ta dùng thuộc tính SchemaFilter lớp DirectoryEntries thuộc tính SchemaFilter trả SchemaCollection với SchemaCollection ta dùng phương thức Add() để định nghĩa kiểu đối tượng ta muốn thấy ví dụ ta quan tâm đến đối tượng user ,ta thêm user vào tập : using (DirectoryEntry de = new DirectoryEntry()) { de.Path = "LDAP://celticrain/OU=Wrox Press, " + "DC=eichkogelstrasse, DC=local"; Console.WriteLine("Children of " + de.Name); de.Children.SchemaFilter.Add("user"); foreach (DirectoryEntry obj in de.Children) { Console.WriteLine(obj.Name); } } Kết ta thấy đối tượng user OU : 479 Learning CSharp Cache Để giảm bớt việc lưu thơng mạng,Active DirectorySI dùng cache cho thuộc tính đối tượng ta biết, server khơng truy xuất ta tạo đối tượng DirectoryEntry,thay vào lần đầu ta đọc giá trị từ thư mục lưu trữ tất thuộc tính ghi vào cache,để muốn đọc thuộc tính lần khơng phải truy xuất server Khi thay đổi đối tượng thay đổi đối tượng cache,viẹc thiết lập thuộc tính khơng ảnh hưởng đến lưu thơng mạng.để chuyển liệu thay đổi đến server ta dùng DirectoryEntry.CommitChanges() , phương thức flush ( làm bằng) cache.để lấy liệu viết từ thư mục lưu trữ,ta dùng DirectoryEntry.RefreshCache() để đọc thuộc tính.nếu ta thay đổi vài thuộc tính mà khơng gọi ComitChanges() goị RefreshCache() ,tất thay đổi bị qua phương thức RefreshCache() ta đọc lại giá trị từ dịch vụ thư mục ( lúc chưa cập nhật từ cache ) tắt thuộc tính cache cách thiết lập thuộc tính DirectoryEntry.UsePropertyCache false.tuy nhiên ,trừ ta muốn debug ,tốt khơng nên tắt cache làm gia tăng việc truy xuất server Tạo đối tượng Muốn tạo đối tượng Active Directory user,computer,printer,contact ta dùng lớp DirectoryEntry để thêm đối tượng đến thư mục ta phải kết nối đến đối tượng chứa,ví dụ OU ta dùng đối tượng chứa với tên phân biệt CN=Users, DC=eichkogelstrasse, DC=local: DirectoryEntry de = new DirectoryEntry(); de.Path = "LDAP://celticrain/CN=Users, DC=eichkogelstrasse, DC=local"; Ta lấy đối tượng DirectoryEntries thuộc tính Children DirectoryEntry : DirectoryEntries users = de.Children; Với DirectroyEntries ta có phương thức thêm ,bỏ ,tìm đối tượng tập.ở ta tạo đối tượng user phương thức Add(),ta cần tên đối tượng kiểu ta lấy tên kiểu trực tiếp dùng ADSI Edit: DirectoryEntry user = users.Add("CN=John Doe", "user"); Bây đối tượng có giá trị thuộc tính mặc định.để đặc tả giá trị thuộc tính ta thêm thuộc tính phương thức Add() thuộc tính Properties.nếu ta đặc tả thuộc tính khơng tồn có biệt lệ : COMException "The specified directory service attribute or value doesn't exist": user.Properties["company"].Add("Some Company"); user.Properties["department"].Add("Sales"); user.Properties["employeeID"].Add("4711"); user.Properties["samAccountName"].Add("JDoe"); user.Properties["userPrincipalName"].Active Directoryd("JDoe@eichkogelstrasse.local"); user.Properties["givenName"].Add("John"); user.Properties["sn"].Add("Doe"); user.Properties["userPassword"].Add("someSecret"); 480 Learning CSharp Cuối ta viết liệu đến Active Directory, ta phải flush cache : user.CommitChanges(); Cập nhật mục thư mục Sau đọc đối tượng ta thay đổi giá trị để bỏ tất giá trị thuộc tính đơn ta gọi phương thức PropertyValueCollection.Clear() dùng Add() để thêm giá trị đến thuộc tính.dùng Remove() Removeat() để bỏ giá trị đặc tả từ tập thuộc tính Ta thay đổi giá trị đơn giản thiết lập đến giá trị đặc tả.ví dụ sau cho thấy số điện thoại thay đổi dùng indexer PropertyValueCollection.với indexer giá trị thay đổi tồn tại.do ta nên ln kiểm tra DirectoryEntry.Properties.Contains() thuộc tính có trá trị : using (DirectoryEntry de = new DirectoryEntry()) { de.Path = "LDAP://celticrain/CN=Christian Nagel, " + "OU=Wrox Press, DC=eichkogelstrasse, DC=local"; if (de.Properties.Contains("mobile")) { de.Properties["mobile"][0] = "+43(664)3434343434"; } else { de.Properties["mobile"].Add("+43(664)3434343434"); } de.CommitChanges(); } Trong phần else ta thêm thuộc tính có số điện thoại khơng tồn phương thức PropertyValueCollection.Add() ta dùng Add() với thuộc tính tồn kết tuỳ thuộc vào kiểu thuộc tính - đơn hay đa giá trị thuộc tính có giá trị đơn xảy biệt lệ : COMException: A constraint violation occurred đa giá trị chấp nhận xem là giá trị thêm Vì thuộc tính điện thoại đơn giá trị nên khơng thể thêm vào nhiên người dùng có nhiều số điện thoại ta thiết lập thuộc tính otherMobile otherMobile đa giá trị ta gọi Add() nhiều lần.có điểm quan trọng thuộc tính đa giá trị : giá trị khơng giống giống sinh biệt lệ :COMException: The specified directory service attribute or value alreActive Directoryy exists Truy xuất đối tượng ADSI bẩm sinh Lớp DirectoryEntry hổ trợ việc gọi phương thức đối tượng bên trực tiếp cách dùng phương thức Invoke() Thơng số invoke() tên phương thức gọi đối tượng ADSI, từ khố 481 Learning CSharp params thơng số thứ cho phép số đối số thêm truyền vào phương thức ADSI: public object Invoke(string methodName, params object[] args); Trong ví dụ sau ta dùng phương thức IADsUser.SetPassword() để thay đổi password đối tượng user trước tạo : using (DirectoryEntry de = new DirectoryEntry()) { de.Path = "LDAP://celticrain/CN=John Doe, " + "CN=Users, DC=eichkogelstrasse, DC=local"; de.Invoke("SetPassword", "anotherSecret"); de.CommitChanges(); } Thay dùng Invoke() ta dùng trực tiếp đối tượng ADSI bên để làm điều ta phải thêm tham chiếu đến Active DS Type Library cách dùng Project|Add reference tạo lớp gói ( wrapper) lớp ta truy xuất đối tượng ADSI namespace ActiveDs Các đối tượng bẩm sinh đưọc truy xuất thuộc tính NativeObject lớp DirectoryEntry ví dụ , đối tượng de đối tượng user,vì ta ép kiểu thành ActiveDs.IADsUser SetPassword() cách thiết lập thuộc tính AccountDisabled false ta cho phép account ActiveDs.IADsUser user = (ActiveDs.IADsUser)de.NativeObject; user.SetPassword("someSecret"); user.AccountDisabled = false; de.CommitChanges(); Tìm kiếm Active Directory Để tìm kiếm Active Directory, NET framework có lớp DirectorySearcher ta dùng DirectorySearcher với provider LDAP ,nó khơng làm việc với provider khác 482 Learning CSharp NDS IIS Trong hàm dựng lớp DirectorySearcher ta định nghĩa phần quan trọng cho việc tìm kiếm - SearchRoot : gốc tìm kiếm đặc tả nơi bắt đầu tìm kiếm mặc định gốc domain đương thời SearchRoot đưọc đặc tả với path đối tượng DirectoryEntry - Filter :Filter định nghĩa giá trị mà ta muốn lấy filter chuỗi phải nằm dấu ngoặc đơn Các tác tử quan hệ = dùng biểu thức ví dụ (objectClass=contact) tìm tất đối tượng có kiểu contact;(lastName>=Nagel) tìm tất đối tượng có lastname lớn Nagel ( tìm theo Alphabet) biểu thức kết hợp với tác tử tiền tố & | ví dụ : (&(objectClass=user)(description=Auth*)) tìm tất đối tượng kiểu user có thuộc tính description bắt đầu Auth tác tử & | nằm đầu biểu htức nên kết hợp nhiều biểu thức với tác tử tiền tố đơn filter mặc định (objectClass=*) - PropertiesToLoad : với PropertiesToLoad ta định nghĩa StringCollection tất thuộc tính mà ta quan tâm đối tượng có nhiều thuộc tính , hầu hết khơng quan trọng u cầu tìm kiếm ta.ta định nghĩa thuộc tính mà đưọc load vào cache ta lấy thuộc tính mặc định Path Name đối tượng khơng đặc tả - SearchScope : SearchScope bảng liệt kê định nghĩa độ sâu việc tìm kiếm : + SearchScope.Base tìm thuộc tính đối tượng nơi việc tìm bắt đầu với SearchScope.OneLevel việc tìm kiếm tiếp tục tập đối tượng sở + SearchScope.Subtree định nghĩa việc tìm kiếm tìm tồn Mặc định SearchScope Subtree Giới hạn tìm kiếm Việc tìm kiếm trải rộng nhiều domain để giới hạn tìm kiếm hay thời gian tìm kiếm ta định nghĩa số thuộc tính sau : - ClientTimeout : thời gian lớn mà client chờ server trả kết - PageSize : với page search server trả số đối tượng đưọc định nghĩa với Pagesize thay cho kết hồn chỉnh.điều rút gọn thời gian client nhận lần trả lời đầu nhớ cần thiết.server gửi cookies đến client ,mà gửi trả lại server lần phản hồi tìm kiếm lần tiếp theo, để tìm kiếm tiếp tục thời điểm hồn thành - ServerPageTimeLimit : giá trị định nghĩa thời gian tìm kiếm nên tiếp tục để trả lại số đối tượng mà định nghĩa với giá trị pagesize.mặc định -1, nghĩa khơng xác định - ServerTimeLimit : định nghĩa thời gian lớn server tìm đối tượng hết thời gian, đối tượng tìm thấy đến thời điểm trả cho client.mặc định 120 giây, ta khơng thể thiết lập giá trị cao - ReferalChasing : gốc tìm đặc tả thơng qua SearchRoot domain cha hay khơng đặc tả gốc ,việc tìm kiếm tiếp tục domain với thuộc tính ta đặc tả việc tìm kiếm server khác ReferalChasingOption.None : khơng tìm kiếm server khác ReferalchasingOption.Subordinate : đặc tả tìm kiếm tiếp tục domain tìm DC=Wrox, DC=COM server trả tập kết tham chiếu đến 483 Learning CSharp DC=France,DC=Wrox,DC=COM ReferalchasingOption.External: server chuyển client đến server độc lập khơng nằm domain con.đây tuỳ chọn mặc định ReferalchasingOption.All tham chiếu external subordinate trả Ví dụ ta muốn tìm kiếm tất đối tượng user Wrox Press, thuộc tính Description có giá trị Author ta kết nối với Wrox Press.đây nơi bắt đầu tìm kiếm ta tạo đối tượng DirectorySearcher Filter định nghĩa (&(objectClass=user)(description=Auth*)), để tìm đối tượng user với description bắt đầu Auth phạm vi tìm kiếm con, để tổ chức Wrox Press tìm kiếm: using (DirectoryEntry de = new DirectoryEntry("LDAP://OU=Wrox Press, DC=eichkogelstrasse, DC=local")) using (DirectorySearcher searcher = new DirectorySearcher()) { searcher.SearchRoot = de; searcher.Filter = "(&(objectClass=user)(description=Auth*))"; searcher.SearchScope = SearchScope.Subtree; Các thuộc tính ta muốn có tập kết name,description ,givenName,wWWHomePage: searcher.PropertiesToLoActive Directory.Add("name"); searcher.PropertiesToLoActive Directory.Add("description"); searcher.PropertiesToLoActive Directory.Add("givenName"); searcher.PropertiesToLoActive Directory.Add("wWWHomePage"); Để sếp kết ta dùng thuộc tính sort DirectorySearcher ta thiết lập sortoption đối số thuộc tính muốn xếp,thứ hai cách xếp.bao gồm Ascending Descending Để bắt đầu tìm kiếm ta dùng phương thức FindOne() để tìm đối tượng FindAll().FindOne() trả SearchResult FineAll() trả SearchResultCollection ta muốn lấy tất tác giả , nên ta dùng FindAll(): searcher.Sort = new SortOption("givenName", SortDirection.Ascending); SearchResultCollection results = searcher.FindAll(); Ta dùng vòng lặp foreach duyệt qua đối tượng SearchResult SearchResultCollection searchReuslt đối tượng cache tìm kiếm thuộc tính properties trả ResultPropertyCollection ,nơi ta truy xuất tất thuộc tính giá trị với tên thuộc tính indexer: SearchResultCollection results = searcher.FindAll(); foreach (SearchResult result in results) { ResultPropertyCollection props = result.Properties; foreach (string propName in props.PropertyNames) { 484 Learning CSharp Console.Write(propName + ": "); Console.WriteLine(props[propName][0]); } Console.WriteLine(); } } Nếu ta muốn lấy đối tượng hồn chỉnh sau tìm kiếm ta dùng phương thức getdirectoryEntry() SearchResult mà trả DirectoryEntry đối tượng Kết trình bày sau : Code for Download : DirectoryTest (See 14.3) 14.5 Tìm kiếm đối tượng người dùng (See 14.6) (See 14.4) Tìm kiếm đối tượng người dùng Trong phần ta xây dựng Windows Form gọi UserSearch.trong ứng dụng ta nhập domain controller, uesrname ,password để truy nhập Active Directory ta truy nhập vào schema Active Directory để lấy thuộc tính đối tượng user người dùng nhập chuỗi tìm đối tưọng user domain ngồi ta thiết lập thuộc tính đối tượng user nên trình bày Giao diện người dùng Các bước sử dụng : Nhập Username ,PasswordmDomain controller tất tuỳ chọn khơng nhập domain controller kết nối làm việc với liên kết khơng server ( serverless binding).nếu khơng nhập username ngữ cảnh người dùng lấy nút nhấn cho phép tất tên thuộc tính đối tượng user tải vào listbox listboxProperties Sau tên thuộc tính tải ta lựa chọn thuộc tính selectioinmode 485 Learning CSharp listbox đặt MultiSimple Nhập vào filter để giới hạn tìm kiếm giá trị mặc định (objectClass=user) Bắt đầu tìm kiếm Ngữ cảnh tên Schema ( Schema Naming Context) Chương trình có phương thức xử lý : nút nhấn để tải thuộc tính, thứ nút bắt đầu tìm kiếm domain.phần đầu ta đọc thuộc tính schema để trình bày Trong phương thức buttonLoActive DirectoryProperties_Click() ,SetLogonInformation() đọc username,password hostname từ hộp thoại lưu chúng biến thành viên lớp.sau phương thức SetNamingContext() đặt tên LDAP Schema tên LDAP ngữ cảnh mặc định tên Schema LDAP dùng để đặt thuộc tính listbox : SetUserProperties(): private void buttonLoadProperties_Click(object sender, System.EventArgs e) { try { SetLogonInformation(); SetNamingContext(); SetUserProperties(schemaNamingContext); } catch (Exception ex) { MessageBox.Show("Check your inputs! " + ex.Message); } } protected void SetLogonInformation() { username = (textBoxUsername.Text == "" ? null : textBoxUsername.Text); password = (textBoxPassword.Text == "" ? null : textBoxPassword.Text); hostname = textBoxHostname.Text; if (hostname != "") hostname += "/"; 486 Learning CSharp } Hổ trợ cho phương thức SetNamingContext(), ta dùng gốc thư mục để lấy thuộc tính server, ta quan tâm đến giá trị thuộc tính : schemaNamingContext defaultNamingContext : protected string SetNamingContext() { using (DirectoryEntry de = new DirectoryEntry()) { string path = "LDAP://" + hostname + "rootDSE"; de.Username = username; de.Password = password; de.Path = path; schemaNamingContext = de.Properties["schemaNamingContext"][0].ToString(); defaultNamingContext = de.Properties["defaultNamingContext"][0].ToString(); } } Lấy tên thuộc tính lớp User Ta có tên LDAP để truy nhập schema ta dùng tên để truy nhập thư mục đọc thuộc tính ta khơng quan tâm đến lớp user mà lớp sở khác : Organizational-Person, Person, and Top chương trình tên lớp sở hardcoded ( mã định sẵn ) muốn đọc ta dùng thuộc tính subclassof GetSchemaProperties() trả mảng chuỗi với tên tất thuộc tính kiểu đối tượng đặc tả tất tên thuộc tính thu thập vào thuộc tính StringCollection : protected void SetUserProperties(string schemaNamingContext) { StringCollection properties = new StringCollection(); string[] data = GetSchemaProperties(schemaNamingContext, "User"); properties.AddRange(GetSchemaProperties(schemaNamingContext, "Organizational-Person")); properties.AddRange(GetSchemaProperties(schemaNamingContext, "Person")); properties.AddRange(GetSchemaProperties(schemaNamingContext, "Top")); listBoxProperties.Items.Clear(); foreach (string s in properties) { listBoxProperties.Items.Add(s); } } 487 Learning CSharp Trong GetSchemaProperties() ta truy nhập Active Directory lại, lần rootDSE khơng dùng.thuộc tính SystemMayContain giữ tập tất thuộc tính mà cho phép lớp objectType: protected string[] GetSchemaProperties(string schemaNamingContext, string objectType) { string[] data; using (DirectoryEntry de = new DirectoryEntry()) { de.Username = username; de.Password = password; de.Path = "LDAP://" + hostname + "CN=" + objectType + "," + schemaNamingContext; DS.PropertyCollection properties = de.Properties; DS.PropertyValueCollection values = properties["systemMayContain"]; data = new String[values.Count]; values.CopyTo(data, 0); } return data; } Tìm kiếm đối tượng user Nút tìm kiếm gọi pương thức FillReult(): private void buttonSearch_Click(object sender, System.EventArgs e) { try { FillResult(); } catch (Exception ex) { MessageBox.Show("Check your input: " + ex.Message); } } Ta thiết lập FillResult sau : SearhcScope thiết đặt subtree,Filter chuỗi lấy từ textbox thuộc tính tải vào cache chọn dựa vào listbox: protected void FillResult() { using (DirectoryEntry root = new DirectoryEntry()) 488 Learning CSharp { root.Username = username; root.Password = password; root.Path = "LDAP://" + hostname + defaultNamingContext; using (DirectorySearcher searcher = new DirectorySearcher()) { searcher.SearchRoot = root; searcher.SearchScope = SearchScope.Subtree; searcher.Filter = textBoxFilter.Text; searcher.PropertiesToLoad.AddRange(GetProperties()); SearchResultCollection results = searcher.FindAll(); StringBuilder summary = new StringBuilder(); foreach (SearchResult result in results) { foreach (string propName in result.Properties.PropertyNames) { foreach (string s in result.Properties[propName]) { summary.Append(" " + propName + ": " + s + "\r\n"); } } summary.Append("\r\n"); } textBoxResults.Text = summary.ToString(); } } } Kết cho ta tất đối tượng lọc : 489 Learning CSharp Code for Download : UserSearch (See 14.4) 14.6 Tóm tắt (See 14.5) Tóm tắt Trong chương ta đả xem xét kiến trúc Active Directory: Các khái niệmquan trọng domain,tree,forest.Ta truy xuất thơng tin tổ chức hồn chỉnh ( complete enterprise).Viết ứng dụng mà truy xuất Active Directory,ta phải nhậ nthức liệu ta đọc khơng thể đưọc cập nhật replication latency Các lớp namespace System.DirectoryServices cho cách dễ dàng để truy xuất Active Directory cách gói provider ADSI lớp DirecoryEntry đọc viết đối tượng cách trực tiếp vào nơi lưu trữ liệu Với lớp DirectorySearcher ta có thi hành tìm kiếm phức tạp định nghĩa lọc,timeouts,thuộc tính để tải phạm vi.Dùng Global Catalog ta tăng tốc độ tìm kiếm đối tượng tổ chức hồn chỉnh,bởi lưu phiên đọc tất đối tượng forest (See 14.5) 490 Learning CSharp 15 Addenda 15.1 Các hỗ trợ XML chuẩn World Wide Web Consortium (W3C) phát triển chuẩn, XML lựa chọn mạnh mẽ đầy tiềm lực cho chuẩn Nếu khơng có chuẩn này, XML khơng biết đến phát triển mạnh mẽ ngày Trang web W3C (http://www.w3.org/) có nhiều mã nguồn tất lĩnh vực XML Tại thời điểm tháng năm 2002, NET Framework hỗ trợ chuẩn W3C sau đây:         XML 1.0 (http://www.w3.org/TR/1998/REC-xml-19980210), hỗ trợ DTD Các khơng gian tên XML (http://www.w3.org/TR/REC-xml-names), Cả stream-level DOM Sơ đồ XML (http://www.w3.org/2001/XMLSchema) Biểu thức XPath (http://www.w3.org/TR/xpath) Các biến đổi XSLT (http://www.w3.org/TR/xslt) Lõi DOM bậc (http://www.w3.org/TR/REC-DOM-Level-1/) Lõi DOM bậc (http://www.w3.org/TR/DOM-Level-2-Core/) SOAP 1.1 (http://www.w3.org/TR/SOAP) Các hỗ trợ chuẩn thay đổi hồn thiện Framework, cập nhật W3C Bởi vậy, bạn ln cần phải bảo đảm bạn ln cập nhật chẩn hỗ trợ cung cấp Microsoft 491 [...]... trưng c a IL, c thể là định nghĩa kiểu mạnh và hướng đối tượng Chúng tơi đã chú thích c c đ c tính này ảnh hưởng đến c c c c ngơn ngữ hướng NET kh c, bao gồm C# Chúng tơi c ng đã chú thich c ch mà định nghĩ kiểu mạnh c thể hỗ trợ tương hoạt ngơn ngữ chéo, c ng như c c dịch vụ CLR chẳng hạn như trình thu gom r c và bảo mật Ở phần cuối c a chương tơi đã nói về c ch tạo c c ứng dụng C# dựa trên c c cơng... c a c c ngơn biết NET kh c Thứ hai, nó bảo đảm rằng nếu bạn hạn chế c c lớp c a bạn trong những đ c tính c a CLS, thì nó bảo đảm rằng c c mã dùng trong những ngơn ngữ kh c có thể dùng c c lớp này Nét đẹp c a ý tưởng này là vi c giới hạn trong những đ c tính c a CLS chỉ nên áp dụng cho những thành phần public và protected c a c c lớp và chỉ dùng cho c c lớp public Trong c c thành phần th c thi c a c c. .. Runtime Chúng tơi c ng đã trình bày vai trò c a c c đ c tính sau trong NET trong q trình biên dịch và th c thi:      C c Assembly và thư viện lớp c sở c a NET C c thành phần COM Q trình biên dịch JIT C c Application domain Garbage Collection Lưu đồi sau cho ta một c i nhìn về vài trò c a c c đ c tính này trong q trình biên dịch và th c thi: 27 Learning CSharp Chúng tơi c ng đã trình bày những đ c trưng... thế chúng c n cung c p cho chúng ta khả năng chuyển giao ngơn ngữ Sau c ng, C+ + và Java c hai đều dùng những biến thể c a hướng đối tượng, dù vậy chúng vẫn c n đư c quan tâm để c thể th c thi chéo Chúng ta c n tìm hiểu một chút về th c thi chéo ngơn ngữ Trư c tiên chúng ta c n hiểu chính x c th c thi ngơn ngữ chéo là gì Sau c ng, COM cho phép c c thành phần đư c viết bởi c c ngơn ngữ kh c nhau c ... một tiện ích Windows-based, bạn c thể dùng để tham khảo c c lớp, c u tr c, giao diện, kiểu liệt kê trong thư viện NET base class Chúng ta sẽ tìm hiểu WinCV trong chương 6 Dù rằng chủ đề c a chương 5 bàn về c c lớp c sở, nhưng th c tế, chúng tơi chỉ nói về c c cú pháp c a ngơn ngữ C# , chủ yếu quyển sách này chỉ cho c c bạn về c ch dùng c c lớp kh c nhau trong thư viện NET base class Một c ch tổng qt... ngữ cho Microsoft Office và Visual Studio macros COM and COM+ COM và COM+ khơng là c ng nghệ chính c a NET, bởi vì c c thành phần c bản c a chúng khơng thể dịch sang IL (m c dù vẫn c thể làm điều đó khi tổ ch c thành phần COM bằng mã C+ +) Tuy nhiên COM+ vẫn c n là một c ng c quan trọng, từ khi đ c tính c a nó đư c nhân lên trong NET Ngồi ra, thành phần COM vẫn c n làm vi c và NET kết hợp ch c chẽ c c. .. năng chủ chốt c a ngơn ngữ C# Bạn c thể biên dịch chương trình này bằng c ch khỏ vào chương trình soạn thảo văn bản đơn giản, Notepad chẳng hạn, rồi cho c t trữ dưới dạng tập tin với tên mở rộng là cs (tắt chữ C sharp) , rồi cho chạy trình biên dịch C# command_line (scs.exe) ví dụ tập tin First.cs : 29 Learning CSharp using System; namespace Wrox.ProCSharp.Basics { class MyFirstCSharpClass { static void... application, nó phải phản hồi lại với một số lượng c c u c u từ c c trình duyệt Ch c chắn rằng sẽ tồn tại c ng l c nhiều thành phần c khả năng phản hồi để ph c vụ cho c c u c u đó Trư c thời NET, sự lựa chọn giữa cho phép c c thể hiện đó c thể dùng trong một tiến trình, c i mà sẽ mang lại sự rủi ro c thể làm giảm độ an tồn c a trang web, hay là cho phép c c thể hiện đó chạy trên c c tiến trình biệt lập, ... tên c a c ng ty c a bạn, c p hai là tên c a c ng nghệ ho c là phần mềm c a gói sản phẩm đó, chẳng hạn như YourCompanyName.SalesServices.Customer Làm như vậy trong hầu hết c c trường hợp đảm bảo rằng, c c lớp trong ứng dụng c a bạn khơng xung đột tên với c c lớp c a c c tổ ch c kh c Chúng ta sẽ xem xét thêm về namespace ở chương 2 2.6 Tạo ra c c ứng dụng NET bằng C# Tạo c c ứng dụng NET bằng C# C# c ... thể dùng để tạo c c ứng dụng console: c c ứng dụng thuần văn bản chạy trên DOS window Hầu như bạn chỉ tạo c c ứng dụng console khi c n kiểm tra c c thư viện lớp, ho c cho c c tiến trình daemon Unix/Linux Tât nhiên, bạn c ng c thể dùng C# để tạo c c ứng dụng dùng cho c c cơng nghệ tương thích NET Trong phần này, chúng ta xem qua về c c kiểu ứng dụng kh c nhau c thể tạo ra bằng C# Tạo c c ứng dụng ASP.NET

Ngày đăng: 22/03/2016, 09:48

Từ khóa liên quan

Mục lục

  • 1. Bảng nội dung

  • 2. Chương 1:Kiến trúc C# và .NET

    • 2.1 Mối quan hệ giữa C# và .NET

    • 2.2 The Common Language Runtime

    • 2.3 Assemblies

    • 2.4 Tìm hiểu về Intermediate Language

    • 2.5 Các lớp của .NET Framework

    • 2.6 Tạo ra các ứng dụng .NET bằng C#

    • 2.7 Vai trò của C# trong kiến trúc .NET Enterprise

    • 2.8 Tóm tắt

    • 3. Chương 2: Căn bản về C#

      • 3.1 Trước khi bắt đầu

      • 3.2 Chương trình C# đầu tiên

      • 3.3 Biến

      • 3.4 Kiểu dữ liệu tiền đònh nghóa

      • 3.5 Câu lệnh điều kiện

      • 3.6 Cấu trúc chương trình

      • 3.7 Phương thức

      • 3.8 Mảng

      • 3.9 Toán tử

      • 3.10 An toàn kiểu

      • 3.11 Kiểu lệt kê

Tài liệu cùng người dùng

Tài liệu liên quan