Assemblies
Một assembly là một đơn vị luận lí chứa mã đã được biên dịch sang .NET. Chúng ta sẽ
bàn kĩ về các assemblie trong chương 8, ở đây chúng ta sẽ nói sơ về nó.
Một assembly là một tự mô tả đầy đủ, và nó giống một đơn vị luận lí hơn là một đơn vị
vật lí, điều đó có nghĩa là nó có thể chứa trong nhiều file (thật vậy các assemblie động
được lưu trong bộ
nhớ không phải trong file). Nếu một assembly được lưu trong nhiều
file, thì sẽ có một file chính chứa các con trỏ và các mô tả về các file khác của assembly.
Chú ý rằng, câu trúc assembly được dùng chung cho cả mã thi hành và mã thư viện. Sự
khác biệt duy nhất là assembly thi hành chứa lối vào chương trình chính trong khi
assembly thư viện thì không có.
Một điểm quan trọng trong các assembly là chúng chứa metadata dùng để mô tả các kiểu
và phương thức được định nghĩa trong mã tương ứng. Một assembly, tất nhiên cũng chứ
assembly metadata dùng để
mô tả chính assembly đó. Assembly metadata này, chứa một
vùng đựơc hiểu như là manifest, cho phép kiểm tra phiên bản và tình trạng của assembly.
ildasm, một tiện ích có sẵn của Windows, có thể dùng để nghiên cứu nội dung của một
assembly, bao gồm manifest metadata. Chúng ta sẽ lấy vi dụ về ildasm trong chương 8.
Thật vậy một assembly chứa metadata của chương trình nghĩa là các ứng dụng hoặc các
assembly khác có thể gọi mã trong môt assembly mà không cần tham chiếu đến Registry,
hoặc một dữ liệ
u nguồn khác,. Một điểm quan trọng trong cách làm của COM cũ, các
GUID của các thành phần và giao diện interfaces không thể đạt được từ Registry.
Việc dàn trải dự liệu thành 3 định vị khác nhau đồng nghĩa với việc tạo ra mối nguy hiểm
trong đồng bộ hoá, nó ngăn không cho các thành phần khác sử dụng. Với assemblies, sẽ
không còn những mối nguy hiểm như vậy, bởi vì tất các các metadata được lưu trong bộ
lệnh thi hành của chươ
ng trình. Chú ý rằng dù cho các assemblie được lưu thành một vài
file, chúng vẫn không gây vấn đề gì về đồng bộ hoá dữ liệu. Đó là vì nhờ vào file
assembly chính, file này chứa đường dẫn, các thông tin chi tiết, mã băm, và nội dung của
• Tranh chấp tên, khi một công ty tạo ra các shared assembly trùng tên với các
shared assembly sẵn có của bạn. Về mặt lí thuyết mã của bạn có thể truy xuất vào
cả hai assembly này song đây có thể là một vấn đề phức tạp.
• Lỗi của một assembly có thể bị ghi đè bởi một phiên bản khác của cùng same
assembly - một phiên bản mới không tương thích với những gì sẵn có.
Giải pháp cho những vấn đề trên là đặt các shared assembly trong một cây thư mục đặt
biệt của hệ thống, có thể xem như là assembly cache toàn cục. Không giống như các
private assembly, nó không đơn giản là copy assembly sang một thư mục thích hợp - nó
cần được cài đặt rõ ràng vào cache. Tiến trình này có thể đượ
c thực thi bởi một số tiện
ích của .NET, bao gồm luôn quá trình kiểm tra trên assembly, tương tự như cài đặt một
thư mục trong assembly cache để đảm bảo tính toàn vẹn của assembly.
Để tránh tranh chấp tên, shared assemblies đưa ra một được quản lí dựa trên một khóa
mật mã chính. Tên này được gọi là strong name, được bảo đảm về tính độc nhất, và phải
được trích dẫn bởi ứng dụng muốn tham chiếu đến một shared assembly.
Vấn đề về tương thích với lỗi do ghi đè một assembly được đánh địa chỉ theo thông tín
phiên bản trong assembly manifest, và cho phép cài đặt song song.
Reflection
Từ khi các assembly được lưu dưới dạng metadata, bao gồm chi tiết về tất cả các kiểu và
thành viên của những kiểu này, thì nó có thể được truy xuất được các metadata
programmatically. Để biết chi tiết hơn, xin hãy xem reflection - mã quả có thể xem xét
các mã quản khác, hoặc xem xét chính nó, để nhận ra các thông tin về mã. Bạn có thể
dùng các attribute, để
có thể sử dụng phương thức trong lúc chạy điều này tốt hơn là
trong lúc biên dịch.