Sách Giải pháp lập trình C# & .NET - Tác giả Nguyễn Ngọc Bình Phương

Chuyên khảo phân tích Giải pháp lập trình, đánh giá các khía cạnh quan trọng, đề xuất hướng nghiên cứu tiếp theo., phục vụ nghiên cứu và ứng dụng thực tiễn

Người đăng

Ẩn danh
706
3
0

Phí lưu trữ

135 Point

Mục lục chi tiết

LỜI NÓI ĐẦU

CẤU TRÚC CỦA SÁCH

YÊU CẦU VỀ HỆ THỐNG

CÁCH SỬ DỤNG ĐĨA CD

1. Chương 1: PHÁT TRIỂN ỨNG DỤNG

1.1. Tạo ứng dụng Console

1.2. Tạo ứng dụng dựa-trên-Windows

1.3. Tạo và sử dụng module

1.4. Tạo và sử dụng thư viện

1.5. Truy xuất các đối số dòng lệnh

1.6. Chọn biên dịch một khối mã vào file thực thi

1.7. Truy xuất một phần tử chương trình có tên trùng với một từ khóa

1.8. Tạo và quản lý cặp khóa tên mạnh

1.9. Tạo tên mạnh cho assembly

1.10. Xác minh một assembly tên mạnh không bị sửa đổi

1.11. Hoãn việc ký assembly

1.12. Ký assembly với chữ ký số Authenticode

1.13. Tạo và thiết lập tin tưởng một SPC thử nghiệm

1.14. Quản lý Global Assembly Cache

1.15. Ngăn người khác dịch ngược mã nguồn của bạn

2. Chương 2: THAO TÁC DỮ LIỆU

2.1. Thao tác chuỗi một cách hiệu quả

2.2. Mã hóa chuỗi bằng các kiểu mã hóa ký tự

2.3. Chuyển các kiểu giá trị cơ bản thành mảng kiểu byte

2.4. Mã hóa dữ liệu nhị phân thành văn bản

2.5. Sử dụng biểu thức chính quy để kiểm tra dữ liệu nhập

2.6. Sử dụng biểu thức chính quy đã được biên dịch

2.7. Tạo ngày và giờ từ chuỗi

2.8. Cộng, trừ, so sánh ngày giờ

2.9. Sắp xếp một mảng hoặc một ArrayList

2.10. Chép một tập hợp vào một mảng

2.11. Tạo một tập hợp kiểu mạnh

2.12. Lưu một đối tượng khả-tuần-tự-hóa vào file

3. Chương 3: MIỀN ỨNG DỤNG, CƠ CHẾ PHẢN CHIẾU, VÀ SIÊU DỮ LIỆU

3.1. Tạo miền ứng dụng

3.2. Chuyển các đối tượng qua lại các miền ứng dụng

3.3. Tránh nạp các assembly không cần thiết vào miền ứng dụng

3.4. Tạo kiểu không thể vượt qua biên miền ứng dụng

3.5. Nạp assembly vào miền ứng dụng hiện hành

3.6. Thực thi assembly ở miền ứng dụng khác

3.7. Thể hiện hóa một kiểu trong miền ứng dụng khác

3.8. Truyền dữ liệu giữa các miền ứng dụng

3.9. Giải phóng assembly và miền ứng dụng

3.10. Truy xuất thông tin Type

3.11. Kiểm tra kiểu của một đối tượng

3.12. Tạo một đối tượng bằng cơ chế phản chiếu

3.13. Tạo một đặc tính tùy biến

3.14. Sử dụng cơ chế phản chiếu để kiểm tra các đặc tính của một phần tử chương trình

4. Chương 4: TIỂU TRÌNH, TIẾN TRÌNH, VÀ SỰ ĐỒNG BỘ

4.1. Thực thi phương thức với thread-pool

4.2. Thực thi phương thức một cách bất đồng bộ

4.3. Thực thi phương thức bằng Timer

4.4. Thực thi phương thức bằng cách ra hiệu đối tượng WaitHandle

4.5. Thực thi phương thức bằng tiểu trình mới

4.6. Điều khiển quá trình thực thi của một tiểu trình

4.7. Nhận biết khi nào một tiểu trình kết thúc

4.8. Đồng bộ hóa quá trình thực thi của nhiều tiểu trình

4.9. Tạo một đối tượng tập hợp có tính chất an-toàn-về-tiểu-trình

4.10. Khởi chạy một tiến trình mới

4.11. Kết thúc một tiến trình

4.12. Bảo đảm chỉ có thể chạy một thể hiện của ứng dụng tại một thời điểm

5. Chương 5: XML

5.1. Hiển thị cấu trúc của một tài liệu XML trong TreeView

5.2. Chèn thêm nút vào tài liệu XML

5.3. Chèn thêm nút vào tài liệu XML một cách nhanh chóng

5.4. Tìm một nút khi biết tên của nó

5.5. Thu lấy các nút XML trong một không gian tên XML cụ thể

5.6. Tìm các phần tử với biểu thức XPath

5.7. Đọc và ghi XML mà không phải nạp toàn bộ tài liệu vào bộ nhớ

5.8. Xác nhận tính hợp lệ của một tài liệu XML dựa trên một Schema

5.9. Sử dụng XML Serialization với các đối tượng tùy biến

5.10. Tạo XML Schema cho một lớp

5.11. Tạo lớp từ một XML Schema

5.12. Thực hiện phép biến đổi XSL

6. Chương 6: WINDOWS FORM

6.1. Thêm điều kiểm vào form lúc thực thi

6.2. Liên kết dữ liệu vào điều kiểm

6.3. Xử lý tất cả các điều kiểm trên form

6.4. Theo vết các form khả kiến trong một ứng dụng

6.5. Tìm tất cả các form trong ứng dụng MDI

6.6. Lưu trữ kích thước và vị trí của form

6.7. Buộc ListBox cuộn xuống

6.8. Chỉ cho phép nhập số vào TextBox

6.9. Sử dụng ComboBox có tính năng auto-complete

6.10. Sắp xếp ListView theo cột bất kỳ

6.11. Liên kết menu ngữ cảnh vào điều kiểm

6.12. Sử dụng một phần menu chính cho menu ngữ cảnh

6.13. Tạo form đa ngôn ngữ

6.14. Tạo form không thể di chuyển được

6.15. Làm cho form không đường viền có thể di chuyển được

6.16. Tạo một icon động trong khay hệ thống

6.17. Xác nhận tính hợp lệ của đầu vào cho một điều kiểm

6.18. Thực hiện thao tác kéo-và-thả

6.19. Sử dụng trợ giúp cảm-ngữ-cảnh

6.20. Áp dụng phong cách Windows XP

6.21. Thay đổi độ đục của form

7. Chương 7: ASP.NET VÀ WEB FORM

7.1. Chuyển hướng người dùng sang trang khác

7.2. Duy trì trạng thái giữa các yêu cầu của trang

7.3. Tạo các biến thành viên có trạng thái cho trang

7.4. Đáp ứng các sự kiện phía client với JavaScript

7.5. Hiển thị cửa sổ pop-up với JavaScript

7.6. Thiết lập focus cho điều kiểm

7.7. Cho phép người dùng upload file

7.8. Sử dụng IIS authentication

7.9. Sử dụng Forms authentication

7.10. Thực hiện xác nhận tính hợp lệ có-chọn-lựa

7.11. Thêm động điều kiểm vào Web Form

7.12. Trả về động một bức hình

7.13. Nạp điều kiểm người dùng bằng mã lệnh

7.14. Sử dụng page-caching và fragment-caching

7.15. Dùng lại dữ liệu với ASP

7.16. Kích hoạt việc gỡ rối ứng dụng Web

7.17. Thay đổi quyền đã cấp cho mã ASP

8. Chương 8: ĐỒ HỌA, ĐA PHƯƠNG TIỆN, VÀ IN ẤN

8.1. Tìm tất cả các font đã được cài đặt

8.2. Thực hiện “hit testing” với shape

8.3. Tạo form có hình dạng tùy biến

8.4. Tạo điều kiểm có hình dạng tùy biến

8.5. Thêm tính năng cuộn cho một bức hình

8.6. Thực hiện chụp màn hình Desktop

8.7. Sử dụng “double buffering” để tăng tốc độ vẽ lại

8.8. Hiển thị hình ở dạng thumbnail

8.9. Phát tiếng “beep” của hệ thống

8.10. Chơi file audio

8.11. Chơi file video

8.12. Lấy thông tin về các máy in đã được cài đặt

8.13. In văn bản đơn giản

8.14. In văn bản có nhiều trang

8.15. In text dạng wrapping

8.16. Hiển thị print-preview

8.17. Quản lý tác vụ in

8.18. Sử dụng Microsoft Agent

9. Chương 9: FILE, THƯ MỤC, VÀ I/O

9.1. Truy xuất các thông tin về file hay thư mục

9.2. Thiết lập các thuộc tính của file và thư mục

9.3. Chép, chuyển, xóa file hay thư mục

9.4. Tính kích thước của thư mục

9.5. Truy xuất thông tin phiên bản của file

9.6. Sử dụng TreeView để hiển thị cây thư mục just-in-time

9.7. Đọc và ghi file văn bản

9.8. Đọc và ghi file nhị phân

9.9. Đọc file một cách bất đồng bộ

9.10. Tìm file phù hợp một biểu thức wildcard

9.11. Kiểm tra hai file có trùng nhau hay không

9.12. Thao tác trên đường dẫn file

9.13. Xác định đường dẫn tương ứng với một file hay thư mục

9.14. Làm việc với đường dẫn tương đối

9.15. Tạo file tạm

9.16. Lấy dung lượng đĩa còn trống

9.17. Hiển thị các hộp thoại file

9.18. Sử dụng không gian lưu trữ riêng

9.19. Theo dõi hệ thống file để phát hiện thay đổi

9.20. Truy xuất cổng COM

10. Chương 10: CƠ SỞ DỮ LIỆU

10.1. Kết nối cơ sở dữ liệu

10.2. Sử dụng connection-pooling

10.3. Thực thi câu lệnh SQL hoặc thủ tục tồn trữ

10.4. Sử dụng thông số trong câu lệnh SQL hoặc thủ tục tồn trữ

10.5. Xử lý kết quả của truy vấn SQL bằng data-reader

10.6. Thu lấy tài liệu XML từ truy vấn SQL Server

10.7. Nhận biết tất cả các thể hiện SQL Server 2000 trên mạng

10.8. Đọc file Excel với ADO

10.9. Sử dụng Data Form Wizard

10.10. Sử dụng Crystal Report Wizard

11. Chương 11: LẬP TRÌNH MẠNG

11.1. Download file thông qua HTTP

11.2. Download và xử lý file bằng stream

11.3. Lấy trang HTML từ một website có yêu cầu xác thực

11.4. Hiển thị trang web trong ứng dụng dựa-trên-Windows

11.5. Lấy địa chỉ IP của máy tính hiện hành

11.6. Phân giải tên miền thành địa chỉ IP

11.7. “Ping” một địa chỉ IP

11.8. Giao tiếp bằng TCP

11.9. Lấy địa chỉ IP của client từ kết nối socket

11.10. Thiết lập các tùy chọn socket

11.11. Tạo một TCP-server hỗ-trợ-đa-tiểu-trình

11.12. Sử dụng TCP một cách bất đồng bộ

11.13. Giao tiếp bằng UDP

11.14. Gửi e-mail thông qua SMTP

11.15. Gửi và nhận e-mail với MAPI

12. Chương 12: DỊCH VỤ WEB XML VÀ REMOTING

12.1. Tránh viết mã cứng cho địa chỉ URL của dịch vụ Web XML

12.2. Sử dụng kỹ thuật response-caching trong dịch vụ Web XML

12.3. Sử dụng kỹ thuật data-caching trong dịch vụ Web XML

12.4. Tạo phương thức web hỗ trợ giao dịch

12.5. Thiết lập thông tin xác thực cho dịch vụ Web XML

12.6. Gọi bất đồng bộ một phương thức web

12.7. Tạo lớp khả-truy-xuất-từ-xa

12.8. Đăng ký tất cả các lớp khả-truy-xuất-từ-xa trong một assembly

12.9. Quản lý các đối tượng ở xa trong IIS

12.10. Phát sinh sự kiện trên kênh truy xuất từ xa

12.11. Kiểm soát thời gian sống của một đối tượng ở xa

12.12. Kiểm soát phiên bản của các đối tượng ở xa

12.13. Tạo phương thức một chiều với dịch vụ Web XML hay Remoting

13. Chương 13: BẢO MẬT

13.1. Cho phép mã lệnh có-độ-tin-cậy-một-phần sử dụng assembly tên mạnh của bạn

13.2. Vô hiệu bảo mật truy xuất mã lệnh

13.3. Vô hiệu việc kiểm tra quyền thực thi

13.4. Bảo đảm bộ thực thi cấp cho assembly một số quyền nào đó

13.5. Giới hạn các quyền được cấp cho assembly

13.6. Xem các yêu cầu quyền được tạo bởi một assembly

13.7. Xác định mã lệnh có quyền nào đó lúc thực thi hay không

13.8. Hạn chế ai đó thừa kế các lớp của bạn và chép đè các thành viên lớp

13.9. Kiểm tra chứng cứ của một assembly

13.10. Xử lý chứng cứ khi nạp một assembly

13.11. Xử lý bảo mật bộ thực thi bằng chứng cứ của miền ứng dụng

13.12. Xử lý bảo mật bộ thực thi bằng chính sách bảo mật của miền ứng dụng

13.13. Xác định người dùng hiện hành có là thành viên của một nhóm Windows nào đó hay không

13.14. Hạn chế những người dùng nào đó thực thi mã lệnh của bạn

13.15. Giả nhận người dùng Windows

14. Chương 14: MẬT MÃ

14.1. Tạo số ngẫu nhiên

14.2. Tính mã băm của password

14.3. Tính mã băm của file

14.4. Bảo đảm tính toàn vẹn dữ liệu bằng mã băm có khóa

14.5. Bảo vệ file bằng phép mật hóa đối xứng

14.6. Truy lại khóa đối xứng từ password

14.7. Gửi một bí mật bằng phép mật hóa bất đối xứng

14.8. Lưu trữ khóa bất đối xứng một cách an toàn

14.9. Trao đổi khóa phiên đối xứng một cách an toàn

15. Chương 15: KHẢ NĂNG LIÊN TÁC MÃ LỆNH KHÔNG-ĐƯỢC-QUẢN-LÝ

15.1. Gọi một hàm trong một DLL không-được-quản-lý

15.2. Lấy handle của một điều kiểm, cửa sổ, hoặc file

15.3. Gọi một hàm không-được-quản-lý có sử dụng cấu trúc

15.4. Gọi một hàm không-được-quản-lý có sử dụng callback

15.5. Lấy thông tin lỗi không-được-quản-lý

15.6. Sử dụng thành phần COM trong .

15.7. Giải phóng nhanh thành phần COM

15.8. Sử dụng thông số tùy chọn

15.9. Sử dụng điều kiểm ActiveX trong .

15.10. Tạo thành phần .NET dùng cho COM-client

16. Chương 16: CÁC GIAO DIỆN VÀ MẪU THÔNG DỤNG

16.1. Hiện thực kiểu khả-tuần-tự-hóa (serializable type)

16.2. Hiện thực kiểu khả-sao-chép (cloneable type)

16.3. Hiện thực kiểu khả-so-sánh (comparable type)

16.4. Hiện thực kiểu khả-liệt-kê (enumerable type)

16.5. Hiện thực lớp khả-hủy (disposable class)

16.6. Hiện thực kiểu khả-định-dạng (formattable type)

16.7. Hiện thực lớp ngoại lệ tùy biến

16.8. Hiện thực đối số sự kiện tùy biến

16.9. Hiện thực mẫu Singleton

16.10. Hiện thực mẫu Observer

17. Chương 17: SỰ HÒA HỢP VỚI MÔI TRƯỜNG WINDOWS

17.1. Truy xuất thông tin môi trường

17.2. Lấy giá trị của một biến môi trường

17.3. Ghi một sự kiện vào nhật ký sự kiện Windows

17.4. Truy xuất Windows Registry

17.5. Tạo một dịch vụ Windows

17.6. Tạo một bộ cài đặt dịch vụ Windows

17.7. Tạo shortcut trên Desktop hay trong Start menu

PHỤ LỤC A: GIỚI THIỆU MỘT SỐ CÔNG CỤ

A.1. Biên dịch các đoạn mã ngắn với Snippet Compiler

A.2. Xây dựng biểu thức chính quy với Regulator

A.3. Sinh mã với CodeSmith

A.4. Viết kiểm thử đơn vị với NUnit

A.5. Kiểm soát mã lệnh với FxCop

A.6. Khảo sát assembly với

A.7. Lập tài liệu mã lệnh với NDoc

A.8. Tạo dựng giải pháp với NAnt

A.9. Chuyển đổi phiên bản ASP.NET với ASP.NET Version Switcher

A.10. Chuyển đổi phiên bản dự án với Visual Studio .NET Project Converter

A.11. Chuyển mã nguồn VB.NET sang C# với VB.NET to C# Converter

A.12. Chuyển mã nguồn C# sang VB.NET với Convert C# to VB

A.13. Xây dựng website quản trị cơ sở dữ liệu với ASP

PHỤ LỤC B: THUẬT NGỮ ANH - VIỆT

TÀI LIỆU THAM KHẢO

Tóm tắt

I. Khám phá 5 giải pháp lập trình C nền tảng cho

Trong lĩnh vực phát triển phần mềm, việc tìm kiếm giải pháp lập trình hiệu quả cho các vấn đề thường gặp là yếu tố then chốt. Tài liệu "Các giải pháp lập trình C#" khảo sát chiều rộng của thư viện lớp .NET Framework, cung cấp các phương pháp tiếp cận cụ thể, ngắn gọn. Mỗi giải pháp không nhằm mục đích hướng dẫn lập trình C# từ đầu, mà đóng vai trò như một tài nguyên tham khảo giá trị. Ngay cả những người mới làm quen với lập trình ứng dụng trên nền tảng .NET Framework cũng có thể tìm thấy hướng đi đúng đắn. Lý tưởng nhất, khi đối mặt với một thách thức, tài liệu này sẽ cung cấp một giải pháp hoàn chỉnh hoặc ít nhất là gợi ý một con đường phù hợp. Trọng tâm của phương pháp này là học hỏi thông qua thực hành. Việc chỉ đọc về các lớp trong thư viện .NET là không đủ để trở nên thành thạo. Lập trình viên phải sử dụng, thử nghiệm và viết nhiều chương trình để thực sự hiểu rõ. Các ví dụ và mã lệnh trong tài liệu cung cấp một điểm khởi đầu hoàn hảo, tạo bàn đạp cho quá trình thử nghiệm của mỗi cá nhân. Cấu trúc và nội dung thực tiễn của các giải pháp giúp mở rộng kiến thức một cách hệ thống, từ phát triển ứng dụng cơ bản, thao tác dữ liệu, cho đến các chủ đề nâng cao như lập trình mạng, bảo mật và mật mã. Cách tiếp cận này nhấn mạnh rằng giải pháp lập trình không chỉ là viết mã lệnh, mà còn là việc hiểu và áp dụng đúng các công cụ có sẵn trong một hệ sinh thái lớn như .NET Framework. Tài liệu gốc được xây dựng dựa trên phiên bản .NET Framework 1.1, tuy nhiên nhiều khái niệm và giải pháp vẫn giữ nguyên giá trị cốt lõi trong các phiên bản hiện đại hơn. Sự thành công trong lập trình đòi hỏi sự kết hợp giữa lý thuyết vững chắc và kinh nghiệm thực tiễn, và việc phân tích các giải pháp có sẵn là một con đường hiệu quả để đạt được điều đó.

1.1. Tiếp cận vấn đề theo mô hình Vấn đề Giải pháp

Mỗi giải pháp lập trình được trình bày theo một cấu trúc thống nhất và hiệu quả: "vấn đề/giải pháp". Phương pháp này đi thẳng vào trọng tâm, giúp người đọc nhanh chóng xác định thách thức và tìm thấy câu trả lời tương ứng. Thay vì trình bày lý thuyết dài dòng, cách tiếp cận này cung cấp các đoạn mã ví dụ cụ thể, minh họa trực tiếp cho giải pháp. Trích dẫn từ tài liệu gốc: "Mỗi giải pháp được trình bày theo dạng “vấn đề/giải pháp” một cách ngắn gọn và kèm theo là các ví dụ mẫu." Điều này đặc biệt hữu ích cho các lập trình viên đang làm việc trong các dự án thực tế, nơi thời gian là yếu tố quan trọng. Mô hình này không chỉ cung cấp câu trả lời mà còn khuyến khích tư duy giải quyết vấn đề, một kỹ năng thiết yếu cho bất kỳ nhà phát triển phần mềm nào.

1.2. Vai trò của thư viện lớp .NET Framework trong lập trình

Để trở thành một lập trình viên C# thành thạo, việc hiểu sâu về thư viện lớp .NET Framework là không thể thiếu. Thư viện này là một tập hợp khổng lồ các lớp, giao diện và kiểu giá trị, cung cấp các chức năng đã được xây dựng sẵn cho nhiều tác vụ lập trình. Từ việc thao tác với chuỗi, xử lý file, kết nối cơ sở dữ liệu cho đến xây dựng giao diện người dùng đồ họa (GUI), thư viện này đều có các công cụ hỗ trợ. Việc tận dụng hiệu quả thư viện lớp .NET giúp giảm đáng kể thời gian phát triển, tránh "phát minh lại bánh xe" và đảm bảo mã lệnh tuân thủ các tiêu chuẩn chung. Các giải pháp lập trình được giới thiệu chủ yếu xoay quanh việc khai thác sức mạnh của thư viện này, biến nó thành một nguồn tài nguyên vô giá cho các nhà phát triển.

II. Thách thức thường gặp khi phát triển ứng dụng

Quá trình phát triển một ứng dụng C# trên nền tảng .NET Framework luôn đi kèm với những thách thức cố hữu đòi hỏi các giải pháp lập trình phù hợp. Một trong những quyết định đầu tiên và quan trọng nhất là lựa chọn loại hình ứng dụng. Việc xây dựng một ứng dụng Console không có giao diện đồ họa hoàn toàn khác biệt so với một ứng dụng Windows Form với giao diện người dùng phức tạp. Lựa chọn sai có thể dẫn đến việc phải cấu trúc lại toàn bộ dự án sau này. Một thách thức lớn khác là quản lý và tái sử dụng mã lệnh. Khi dự án phát triển, việc duy trì một khối mã nguồn nguyên khối (monolithic) trở nên cồng kềnh và khó bảo trì. Nhu cầu phân tách mã lệnh thành các thành phần độc lập, có thể tái sử dụng như modulethư viện là rất cấp thiết. Điều này không chỉ giúp mã nguồn gọn gàng hơn mà còn tối ưu hóa hiệu suất bằng cách chỉ nạp các thành phần cần thiết vào bộ nhớ. Cuối cùng, vấn đề bảo mật và toàn vẹn của ứng dụng là một mối quan tâm hàng đầu. Làm thế nào để đảm bảo rằng một assembly (đơn vị triển khai của .NET) không bị sửa đổi sau khi phát hành? Làm sao để cung cấp cho nó một định danh duy nhất và đáng tin cậy? Những câu hỏi này dẫn đến sự ra đời của các kỹ thuật như tạo tên mạnh (strong name), một cơ chế sử dụng mã hóa khóa công khai để ký và xác minh các assembly. Việc giải quyết thành công những thách thức này là nền tảng để xây dựng các ứng dụng mạnh mẽ, hiệu quả và an toàn. Mỗi giải pháp lập trình được đưa ra đều nhằm mục tiêu xử lý một hoặc nhiều khía cạnh của các vấn đề cốt lõi này.

2.1. Lựa chọn giữa ứng dụng Console và ứng dụng GUI

Việc quyết định xây dựng một ứng dụng Console hay một ứng dụng Windows Form (GUI) phụ thuộc hoàn toàn vào mục đích sử dụng. Ứng dụng Console không cần giao diện người dùng đồ họa, hoạt động chủ yếu thông qua dòng lệnh. Loại ứng dụng này phù hợp cho các tác vụ tự động, xử lý hàng loạt, hoặc các công cụ dành cho nhà phát triển. Ngược lại, ứng dụng GUI cung cấp một giao diện trực quan, cho phép người dùng tương tác thông qua các điều khiển như nút bấm, hộp văn bản. Đây là lựa chọn bắt buộc cho hầu hết các ứng dụng dành cho người dùng cuối. Việc triển khai phương thức Main và sử dụng các lệnh biên dịch (/target:exe cho Console và /target:winexe cho GUI) là khác nhau, đòi hỏi một định hướng rõ ràng ngay từ đầu.

2.2. Bài toán tái sử dụng mã lệnh với Module và Thư viện

Khi các dự án phần mềm lớn dần, việc sao chép và dán mã lệnh giữa các phần khác nhau là một thói quen xấu, dẫn đến khó khăn trong việc bảo trì và cập nhật. Giải pháp lập trình cho vấn đề này là cấu trúc mã nguồn thành các modulethư viện (.dll). Một module là một đơn vị biên dịch chứa mã MSIL và siêu dữ liệu, có thể được liên kết để tạo thành một assembly. Một thư viện là một assembly hoàn chỉnh được thiết kế để chia sẻ chức năng cho nhiều ứng dụng khác nhau. Việc sử dụng các thành phần này giúp tăng hiệu quả thực thi, giảm sử dụng bộ nhớ và thúc đẩy khả năng liên tác giữa các ngôn ngữ lập trình khác nhau trên nền tảng .NET.

2.3. Đảm bảo tính toàn vẹn và định danh cho Assembly

Một trong những rủi ro lớn nhất đối với phần mềm phân phối là nguy cơ bị giả mạo hoặc sửa đổi trái phép. Một assembly không được bảo vệ có thể bị dịch ngược, thay đổi mã lệnh và phát hành lại dưới danh nghĩa của nhà phát triển gốc. Để giải quyết vấn đề này, .NET Framework cung cấp một giải pháp lập trình mạnh mẽ là tên mạnh (strong name). Bằng cách sử dụng một cặp khóa công khai/riêng tư để ký vào assembly, một định danh duy nhất và không thể giả mạo được tạo ra. Bất kỳ thay đổi nào đối với assembly sau khi ký sẽ làm cho chữ ký số không hợp lệ, giúp hệ thống và người dùng xác minh được tính nguyên bản của mã lệnh.

III. Hướng dẫn xây dựng các loại ứng dụng C cơ bản nhất

Việc xây dựng một ứng dụng C# bắt đầu bằng việc lựa chọn đúng loại dự án và cấu trúc mã nguồn phù hợp. Hai dạng ứng dụng cơ bản nhất là ứng dụng Consoleứng dụng Windows Form. Đối với ứng dụng Console, điểm khởi đầu là một phương thức tĩnh Main. Đây là nơi mã lệnh bắt đầu thực thi. Trình biên dịch C# (csc.exe) mặc định sẽ tạo ra một ứng dụng Console nếu không có chỉ định nào khác. Lệnh biên dịch điển hình là csc /target:exe YourFile.cs. Khi ứng dụng có nhiều file mã nguồn, cần chỉ định tất cả chúng, đồng thời có thể dùng cờ /out để đặt tên file thực thi và /main để chỉ rõ lớp chứa điểm nhập nếu có nhiều phương thức Main. Mặt khác, việc xây dựng một ứng dụng dựa-trên-Windows yêu cầu một cách tiếp cận khác. Mặc dù vẫn cần một phương thức Main tĩnh, nhiệm vụ chính của nó là khởi tạo và chạy form chính của ứng dụng. Cần tạo một lớp kế thừa từ System.Windows.Forms.Form và truyền một thể hiện của nó vào phương thức Application.Run(). Lệnh biên dịch cho loại ứng dụng này là csc /target:winexe YourForm.cs. Việc sử dụng winexe thay vì exe đảm bảo rằng không có cửa sổ console nào xuất hiện khi ứng dụng chạy, mang lại trải nghiệm người dùng tốt hơn. Trong cả hai trường hợp, việc hiểu rõ các đối số của trình biên dịch và cấu trúc phương thức Main là kiến thức nền tảng, là giải pháp lập trình đầu tiên mà mọi nhà phát triển C# cần nắm vững để biến mã nguồn thành một chương trình thực thi được.

3.1. Phương pháp tạo ứng dụng Console từ dòng lệnh

Để tạo một ứng dụng Console, cần hiện thực một phương thức public static void Main() trong ít nhất một lớp. Phương thức này là điểm nhập của chương trình. Ví dụ, lớp HelloWorld có thể chứa một phương thức Main để in ra dòng chữ "Hello, world". Quá trình biên dịch được thực hiện bằng trình biên dịch C# (csc.exe). Lệnh cơ bản là csc HelloWorld.cs. Nếu có nhiều file mã nguồn, ví dụ ConsoleUtils.csHelloWorld.cs, và cả hai đều có phương thức Main, phải chỉ định rõ điểm nhập. Lệnh biên dịch sẽ là: csc /out:MyApp.exe /main:HelloWorld ConsoleUtils.cs HelloWorld.cs. Đối số /out chỉ định tên file thực thi, và /main xác định lớp chứa điểm nhập chính.

3.2. Quy trình tạo ứng dụng Windows Form GUI cơ bản

Một ứng dụng Windows Form cung cấp giao diện người dùng đồ họa. Để xây dựng nó, cần thực hiện các bước sau: tạo một lớp kế thừa từ System.Windows.Forms.Form, khai báo các điều khiển (controls) như Button, TextBox, và viết các phương thức xử lý sự kiện cho chúng. Trong phương thức khởi dựng của form, các điều khiển này được tạo và cấu hình. Cuối cùng, một phương thức public static void Main() sẽ tạo một thể hiện của lớp form và gọi Application.Run(new MyForm()) để hiển thị form và bắt đầu vòng lặp thông điệp. Để biên dịch, sử dụng lệnh csc /target:winexe /reference:System.Windows.Forms.dll MyForm.cs. Cờ /target:winexe rất quan trọng để ngăn cửa sổ console không cần thiết xuất hiện khi ứng dụng chạy.

IV. Bí quyết quản lý mã lệnh hiệu quả với module và thư viện

Quản lý mã lệnh hiệu quả là một trong những giải pháp lập trình quan trọng nhất để xây dựng các ứng dụng lớn và dễ bảo trì. Thay vì biên dịch toàn bộ mã nguồn vào một file thực thi duy nhất, .NET Framework cho phép phân tách mã thành các đơn vị nhỏ hơn gọi là modulethư viện. Một module là khối xây dựng cơ bản của một assembly. Nó chứa mã ngôn ngữ trung gian (MSIL), siêu dữ liệu (metadata) và các tài nguyên. Việc biên dịch mã nguồn thành module (sử dụng cờ /target:module) mang lại nhiều lợi ích. Thứ nhất, nó giúp tối ưu hóa hiệu suất, vì bộ thực thi sẽ chỉ nạp một module vào bộ nhớ khi các kiểu định nghĩa trong đó thực sự được yêu cầu. Điều này đặc biệt hữu ích cho các ứng dụng lớn có những chức năng ít được sử dụng. Thứ hai, module là cầu nối cho khả năng tương tác ngôn ngữ. Mã nguồn viết bằng các ngôn ngữ .NET khác nhau (như VB.NET) có thể được biên dịch thành các module riêng biệt, sau đó được liên kết lại thành một assembly duy nhất bằng trình biên dịch C# (sử dụng cờ /addmodule). Một khái niệm liên quan nhưng ở cấp độ cao hơn là thư viện (library). Thư viện, thường có phần mở rộng .dll, là một assembly hoàn chỉnh chứa các chức năng có thể được chia sẻ và tái sử dụng bởi nhiều ứng dụng. Việc tạo thư viện (sử dụng cờ /target:library) cho phép đóng gói các lớp và phương thức tiện ích. Các ứng dụng khác sau đó có thể tham chiếu đến thư viện này (sử dụng cờ /reference) để sử dụng các chức năng đó mà không cần phải có mã nguồn gốc. Việc áp dụng các giải pháp lập trình này giúp tạo ra các hệ thống linh hoạt, hiệu quả và dễ dàng mở rộng.

4.1. Cách tạo và sử dụng Module để tối ưu ứng dụng

Một module là một file trung gian không thể thực thi độc lập, chứa mã MSILsiêu dữ liệu. Để tạo một module từ file Utils.cs, sử dụng lệnh: csc /target:module Utils.cs. Lệnh này sẽ tạo ra file Utils.netmodule. Lợi ích chính của module là cho phép nạp các phần của ứng dụng theo yêu cầu (just-in-time), giúp giảm thời gian khởi động và tiết kiệm bộ nhớ. Nhiều module sau đó có thể được kết hợp để tạo thành một assembly đa file. Ví dụ, để xây dựng ứng dụng MyApp.exe từ file Main.cs và module Utils.netmodule, sử dụng lệnh: csc /out:MyApp.exe /addmodule:Utils.netmodule Main.cs. Ứng dụng MyApp.exe sẽ chứa manifest của assembly và phụ thuộc vào file Utils.netmodule khi chạy.

4.2. Xây dựng và tham chiếu Thư viện .dll để tái sử dụng

Một thư viện (.dll) là một assembly có thể tái sử dụng, chứa các lớp và phương thức mà các ứng dụng khác có thể gọi. Để xây dựng file MyLibrary.dll từ các file mã nguồn ConsoleUtils.csWindowsUtils.cs, sử dụng lệnh: csc /out:MyLibrary.dll /target:library ConsoleUtils.cs WindowsUtils.cs. Sau khi thư viện được tạo, một ứng dụng khác có thể sử dụng các chức năng bên trong nó bằng cách thêm một tham chiếu lúc biên dịch. Ví dụ, để biên dịch MyApp.cs sử dụng MyLibrary.dll, lệnh sẽ là: csc /reference:MyLibrary.dll MyApp.cs. Nếu thư viện không nằm trong cùng thư mục, có thể dùng cờ /lib để chỉ định đường dẫn. Việc tạo tên mạnh cho thư viện là rất quan trọng để có thể cài đặt nó vào Global Assembly Cache (GAC) và chia sẻ một cách an toàn.

V. Phương pháp bảo mật Assembly với kỹ thuật tạo tên mạnh

Bảo mật và đảm bảo tính toàn vẹn của mã lệnh là một yêu cầu cơ bản trong phát triển phần mềm hiện đại. Trong môi trường .NET Framework, giải pháp lập trình cốt lõi cho vấn đề này là tạo tên mạnh (strong name) cho một assembly. Một tên mạnh cung cấp cho assembly một định danh duy nhất trên toàn cầu, bao gồm tên văn bản đơn giản, số phiên bản, thông tin văn hóa (culture) và một token khóa công khai. Quan trọng hơn, nó chứa một chữ ký số được tạo bằng khóa riêng của nhà phát triển. Chữ ký này đảm bảo hai điều: tính xác thực (assembly thực sự đến từ nhà phát triển sở hữu khóa riêng) và tính toàn vẹn (assembly không bị thay đổi kể từ khi nó được ký). Quá trình tạo tên mạnh bắt đầu bằng việc tạo một cặp khóa công khai/riêng tư bằng công cụ Strong Name (sn.exe). Khóa riêng phải được giữ bí mật tuyệt đối, trong khi khóa công khai được phân phối cùng với assembly. Sau đó, nhà phát triển sử dụng các thuộc tính (attribute) trong mã nguồn, như AssemblyKeyFileAttribute, để chỉ định file chứa cặp khóa cho trình biên dịch. Khi biên dịch, trình biên dịch sẽ tính toán một mã băm (hash) của manifest assembly, mã hóa mã băm này bằng khóa riêng để tạo chữ ký số, và nhúng cả chữ ký số lẫn khóa công khai vào assembly. Khi bộ thực thi nạp một assembly có tên mạnh, nó sẽ thực hiện quy trình xác minh: giải mã chữ ký bằng khóa công khai để lấy lại mã băm gốc, sau đó tính toán lại mã băm của assembly hiện tại và so sánh hai giá trị. Nếu chúng khớp nhau, assembly được xem là hợp lệ. Kỹ thuật này là nền tảng cho việc cài đặt assembly vào Global Assembly Cache (GAC) và cấu hình các chính sách bảo mật truy xuất mã lệnh.

5.1. Quy trình tạo cặp khóa công khai và riêng tư với sn.exe

Công cụ Dòng lệnh Strong Name (sn.exe) là tiện ích chính để quản lý các khóa cho việc tạo tên mạnh. Để tạo một cặp khóa mới và lưu chúng vào một file, sử dụng lệnh: sn –k MyKey.snk. File MyKey.snk này chứa cả khóa công khai và khóa riêng. Điều cực kỳ quan trọng là phải bảo vệ khóa riêng. Theo tài liệu, "Việc giữ bí mật khóa riêng là cần thiết vì người truy xuất vào khóa riêng của bạn có thể thay đổi assembly và tạo một tên mạnh mới". Khóa công khai có thể được trích xuất từ file này để phân phối cho các nhà phát triển khác trong nhóm mà không gây rủi ro bảo mật.

5.2. Gán tên mạnh cho một Assembly trong quá trình biên dịch

Sau khi có cặp khóa, việc gán tên mạnh cho một assembly được thực hiện bằng cách thêm các thuộc tính vào một trong các file mã nguồn. Nếu cặp khóa được lưu trong file MyKey.snk, sử dụng thuộc tính: [assembly: System.Reflection.AssemblyKeyFileAttribute("MyKey.snk")]. Ngoài ra, có thể chỉ định phiên bản và văn hóa cho assembly bằng AssemblyVersionAttributeAssemblyCultureAttribute. Khi trình biên dịch C# thấy các thuộc tính này, nó sẽ tự động thực hiện quá trình ký trong khi xây dựng file thực thi hoặc thư viện. Kết quả là một assembly có chữ ký số, sẵn sàng để được xác minh và tin cậy.

5.3. Kỹ thuật hoãn ký Assembly Delay Signing trong môi trường nhóm

Trong các môi trường phát triển lớn, việc phân phối khóa riêng cho mọi thành viên trong nhóm là một rủi ro bảo mật lớn. .NET Framework cung cấp một giải pháp lập trình tinh vi gọi là hoãn việc ký assembly (delay signing). Quá trình này cho phép các nhà phát triển biên dịch assembly chỉ với khóa công khai. Assembly được tạo ra sẽ có không gian dành riêng cho chữ ký số nhưng chưa được ký thực sự. Để thực hiện, cần áp dụng thuộc tính [assembly: System.Reflection.AssemblyDelaySignAttribute(true)]. Sau khi quá trình phát triển và kiểm thử hoàn tất, một người có thẩm quyền (signing authority) sẽ sử dụng khóa riêng để thực hiện việc ký cuối cùng trước khi phát hành. Kỹ thuật này cân bằng giữa nhu cầu phát triển linh hoạt và yêu cầu bảo mật nghiêm ngặt.

Tóm tắt và mô tả trên trang này được tạo với sự hỗ trợ của AI. Nếu bạn thấy nội dung không chính xác hoặc có vấn đề, vui lòng Báo lỗi nội dung.

16/07/2025
Giải pháp lập trình

Trích đoạn nội dung tài liệu

Chương 1: Phát triển ứng dụng Để xây dựng lớp ConsoleUtils thành một ứng dụng Console có tên là ConsoleUtils.exe, sử dụng lệnh: csc /target:exe ConsoleUtils.cs Bạn có thể chạy file thực thi trực tiếp từ dòng lệnh. Khi chạy, phương thức Main của ứng dụng ConsoleUtils.exe yêu cầu bạn nhập tên và sau đó hiển thị thông điệp chào mừng như sau: Please enter your name : Binh Phuong Welcome to Microsoft .NET Framework, Binh Phuong Thực tế, ứng dụng hiếm khi chỉ gồm một file mã nguồn. Ví dụ, lớp HelloWorld dưới đây sử dụng lớp ConsoleUtils để hiển thị thông điệp “Hello, world” lên màn hình (HelloWorld nằm trong file HelloWorld. public class HelloWorld { public static void Main() { ConsoleUtils.WriteString("Hello, world"); } } Để xây dựng một ứng dụng Console gồm nhiều file mã nguồn, bạn phải chỉ định tất cả các file mã nguồn này trong đối số dòng lệnh.

Ví dụ, lệnh sau đây xây dựng ứng dụng MyFirstApp.exe từ các file mã nguồn HelloWorld.cs và ConsoleUtils.cs: csc /target:exe /main:HelloWorld /out:MyFirstApp.cs Đối số /out chỉ định tên của file thực thi sẽ được tạo ra. Nếu không được chỉ định, tên của file thực thi sẽ là tên của file mã nguồn đầu tiên—trong ví dụ trên là HelloWorld. Vì cả hai lớp HelloWorld và ConsoleUtils đều có phương thức Main, trình biên dịch không thể tự động quyết định đâu là điểm nhập cho file thực thi. Bạn phải sử dụng đối số /main để chỉ định tên của lớp chứa điểm nhập cho ứng dụng của bạn.

Tạo ứng dụng dựa-trên-Windows  Bạn cần xây dựng một ứng dụng cung cấp giao diện người dùng đồ họa (GUI) dựa-trên-Windows Form.  Hiện thực một phương thức tĩnh Main trong ít nhất một file mã nguồn. Trong Main, tạo một thể hiện của một lớp thừa kế từ lớp System. Truyền đối tượng này cho phương thức tĩnh Run của lớp System.

Sử dụng đối số /target:winexe khi biên dịch assembly của bạn bằng trình biên dịch C# (csc. Việc xây dựng một ứng dụng có giao diện người dùng đồ họa Windows đơn giản hoàn toàn khác xa việc phát triển một ứng dụng dựa-trên-Windows hoàn chỉnh. Tuy nhiên, bất kể viết 34 Chương 1: Phát triển ứng dụng một ứng dụng đơn giản như Hello World hay viết phiên bản kế tiếp cho Microsoft Word, bạn cũng phải thực hiện những việc sau: • Tạo một lớp thừa kế từ lớp System.Form cho mỗi form cần cho ứng dụng. • Trong mỗi lớp form, khai báo các thành viên mô tả các điều kiểm trên form, ví dụ Button, Label, ListBox, TextBox.

Các thành viên này nên được khai báo là private hoặc ít nhất cũng là protected để các phần tử khác của chương trình không truy xuất trực tiếp chúng được. Nếu muốn cho phép truy xuất các điều kiểm này, hiện thực các thành viên cần thiết trong lớp form để cung cấp việc truy xuất gián tiếp (kiểm soát được) đến các điều kiểm nằm trong. • Trong lớp form, khai báo các phương thức thụ lý các sự kiện do các điều kiểm trên form sinh ra, chẳng hạn việc nhắp vào Button, việc nhấn phím khi một TextBox đang tích cực. Các phương thức này nên được khai báo là private hoặc protected và tuân theo mẫu sự kiện .NET chuẩn (sẽ được mô tả trong mục 16.

Trong các phương thức này (hoặc trong các phương thức được gọi bởi các các phương thức này), bạn sẽ định nghĩa các chức năng của ứng dụng. • Khai báo một phương thức khởi dựng cho lớp form để tạo các điều kiểm trên form và cấu hình trạng thái ban đầu của chúng (kích thước, màu, nội dung…). Phương thức khởi dựng này cũng nên liên kết các phương thức thụ lý sự kiện của lớp với các sự kiện tương ứng của mỗi điều kiểm. • Khai báo phương thức tĩnh Main—thường là một phương thức của lớp tương ứng với form chính của ứng dụng.

Phương thức này là điểm bắt đầu của ứng dụng và có các dạng như đã được đề cập ở mục 1. Trong phương thức Main, tạo một thể hiện của form chính và truyền nó cho phương thức tĩnh Application. Phương thức Run hiển thị form chính và khởi chạy một vòng lặp thông điệp chuẩn trong tiểu trình hiện hành, chuyển các tác động từ người dùng (nhấn phím, nhắp chuột…) thành các sự kiện gửi đến ứng dụng. Lớp WelcomeForm trong ví dụ dưới đây minh họa các kỹ thuật trên.

Khi chạy, nó yêu cầu người dùng nhập vào tên rồi hiển thị một MessageBox chào mừng.Forms; public class WelcomeForm : Form { // Các thành viên private giữ tham chiếu đến các điều kiểm. private Label label1; private TextBox textBox1; private Button button1; // Phương thức khởi dựng (tạo một thể hiện form 35 Chương 1: Phát triển ứng dụng // và cấu hình các điều kiểm trên form). public WelcomeForm() { // Tạo các điều kiểm trên form.label1 = new Label(); this.textBox1 = new TextBox(); this.button1 = new Button(); // Tạm hoãn layout logic của form trong khi // chúng ta cấu hình và bố trí các điều kiểm.Location = new System.Name = "label1"; this.Size = new System.Text = "Please enter your name:"; // Cấu hình TextBox (nhận thông tin từ người dùng).Location = new System.Name = "textBox1"; this.Text = ""; // Cấu hình Buton (người dùng nhấn vào sau khi nhập tên).Location = new System.Name = "button1"; this.Text = "Enter"; this.Click += new System.button1_Click); // Cấu hình WelcomeForm và thêm các điều kiểm.ClientSize = new System.Name = "form1"; 36 Chương 1: Phát triển ứng dụng this.NET Framework"; // Phục hồi layout logic của form ngay khi // tất cả các điều kiểm đã được cấu hình. public static void Main() { Application.

private void button1_Click(object sender, System.EventArgs e) { // Ghi ra Console.WriteLine("User entered: " + textBox1.Text); // Hiển thị lời chào trong MessageBox.Show("Welcome to Microsoft .NET Framework, " + textBox1.NET Framework"); } } 37 Chương 1: Phát triển ứng dụng Hình 1.1 Một ứng dụng Windows Form đơn giản Để xây dựng lớp WelcomeForm (trong file WelcomeForm.cs) thành một ứng dụng, sử dụng lệnh: csc /target:winexe WelcomeForm.cs Đối số /target:winexe báo cho trình biên dịch biết đây là ứng dụng dựa-trên-Windows. Do đó, trình biên dịch sẽ xây dựng file thực thi sao cho không có cửa sổ Console nào được tạo ra khi bạn chạy ứng dụng. Nếu bạn sử dụng /target:exe khi xây dựng một ứng dụng Windows Form thay cho /target:winexe thì ứng dụng vẫn làm việc tốt, nhưng sẽ tạo ra một cửa sổ Console khi chạy. Mặc dù điều này không được ưa chuộng trong một ứng dụng hoàn chỉnh, cửa sổ Console vẫn hữu ích nếu bạn cần ghi ra các thông tin gỡ rối hoặc đăng nhập khi đang phát triển và thử nghiệm một ứng dụng Windows Form.

Bạn có thể ghi ra Console bằng phương thức Write và WriteLine của lớp System. Ứng dụng WelcomeForm.exe trong hình 1.1 hiển thị lời chào người dùng có tên là Binh Phuong. Phiên bản này của ứng dụng được xây dựng bằng đối số /target:exe, nên có cửa sổ Console để hiển thị kết quả của dòng lệnh Console.WriteLine trong phương thức thụ lý sự kiện button1_Click.  Việc xây dựng một ứng dụng GUI đồ sộ thường tốn nhiều thời gian do phải tạo đối tượng, cấu hình và liên kết nhiều form và điều kiểm.

Nhưng may mắn là Microsoft Visual Studio .NET tự động hóa hầu hết các hoạt động này. Nếu không có công cụ như Microsoft Visual Studio .NET thì việc xây dựng một ứng dụng đồ họa đồ sộ sẽ rất lâu, nhàm chán và dễ sinh ra lỗi. Tạo và sử dụng module  Bạn cần thực hiện các công việc sau: • Tăng hiệu quả thực thi và sử dụng bộ nhớ của ứng dụng bằng cách bảo đảm rằng bộ thực thi nạp các kiểu ít được sử dụng chỉ khi nào cần thiết. 38 Chương 1: Phát triển ứng dụng • Biên dịch các kiểu được viết trong C# thành một dạng có thể sử dụng lại được trong các ngôn ngữ.

• Sử dụng các kiểu được phát triển bằng một ngôn ngữ khác bên trong ứng dụng C# của bạn.  Sử dụng đối số /target:module (của trình biên dịch C#) để xây dựng mã nguồn C# của bạn thành một module. Sử dụng đối số /addmodule để kết hợp các module hiện có vào assembly của bạn. Module là các khối cơ bản tạo dựng nên các assembly.

Module bao gồm một file đơn chứa: • Mã ngôn ngữ trung gian (Microsoft Intermediate Language—MSIL): Được tạo từ mã nguồn C# trong quá trình biên dịch. • Siêu dữ liệu (metadata): Mô tả các kiểu nằm trong module. • Các tài nguyên (resource): Chẳng hạn icon và string table, được sử dụng bởi các kiểu trong module. Assembly gồm một hay nhiều module và một manifest.

Khi chỉ có một module, module và manifest thường được xây dựng thành một file cho thuận tiện. Khi có nhiều module, assembly là một nhóm luận lý của nhiều file được triển khai như một thể thống nhất. Trong trường hợp này, manifest có thể nằm trong một file riêng hay chung với một trong các module. Việc xây dựng một assembly từ nhiều module gây khó khăn cho việc quản lý và triển khai assembly; nhưng trong một số trường hợp, cách này có nhiều lợi ích, bao gồm: • Bộ thực thi sẽ chỉ nạp một module khi các kiểu định nghĩa trong module này được yêu cầu.

Do đó, khi có một tập các kiểu mà ứng dụng ít khi dùng, bạn có thể đặt chúng trong một module riêng mà bộ thực thi chỉ nạp khi cần. Việc này có các lợi ích sau: ▪ Tăng hiệu quả thực thi, đặc biệt khi ứng dụng được nạp qua mạng. ▪ Giảm thiểu nhu cầu sử dụng bộ nhớ. • Khả năng sử dụng nhiều ngôn ngữ khác nhau để viết các ứng dụng chạy trên bộ thực thi ngôn ngữ chung (Common Language Runtime—CLR) là một thế mạnh của.

Tuy nhiên, trình biên dịch C# không thể biên dịch mã nguồn được viết bằng Microsoft Visual Basic .NET hay COBOL .NET trong assembly của bạn. Bạn phải sử dụng trình biên dịch của ngôn ngữ đó biên dịch mã nguồn thành MSIL theo một cấu trúc mà trình biên dịch C# có thể hiểu được—đó là module. Tương tự, nếu muốn lập trình viên của các ngôn ngữ khác sử dụng các kiểu được phát triển bằng C#, bạn phải xây dựng chúng thành một module. Để biên dịch file nguồn ConsoleUtils.cs thành một module, sử dụng lệnh: csc /target:module ConsoleUtils.cs Lệnh này sẽ cho kết quả là một file có tên là ConsoleUtils.

Phần mở rộng netmodule là phần mở rộng mặc định cho module, và tên file trùng với tên file nguồn C#. 39 Chương 1: Phát triển ứng dụng Bạn cũng có thể xây dựng một module từ nhiều file nguồn, cho kết quả là một file (module) chứa MSIL và siêu dữ liệu cho các kiểu chứa trong tất cả file nguồn. Ví dụ, lệnh: csc /target:module ConsoleUtils.cs biên dịch hai file nguồn ConsoleUtils.cs và WindowsUtils.cs thành một module có tên là ConsoleUtils. Tên của module được đặt theo tên file nguồn đầu tiên trừ khi bạn chỉ định cụ thể bằng đối số /out.

Ví dụ, lệnh: csc /target:module /out:Utilities.cs sẽ cho kết quả là file Utilities. Để xây dựng một assembly gồm nhiều module, sử dụng đối số /addmodule.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ