Cấu trúc Assembly
Một assembly thường bao gồm nhiều thành phần như:
•
Một Assembly metadata mô tả trọn vẹn assembly
•
Một Type Metadata mô tả các kiểu dữ liệu và các phương thức
•
Một MSIL code là đoạn mã viết theo ngôn ngữ trung gian
•
Các Resources là những tài nguyên như hình ảnh, chuỗi . . .
Được thể hiện như hình dưới đây :
Hình trên đây chỉ gồm một file component.dll duy nhất, tất cả nằm trọn trong một
tâp tin.
Tuy nhiên một assembly cũng có thể trải dài trên nhiều tập tin mà ta gọi là multifile
assembly Ở hình dưới đây assembly được trải dài trên ba tập tin và ba tập tin kể trên hình
thành một assembly duy nhất.
Metadata là gì ?
Metadata là thông tin được lưu trữ trên assembly mô tả những kiểu dữ liệu và
những phương thức thuộc assembly cung cấp những tin tức hữu ích khác liên quan đến
assembly .
Chính nhờ metadata nên các assembly thường được gọi là seft-describing (mô tả bản
thân) vì nó mô tả một cách trọn vẹn mỗi module.
Assembly Manifests
Mỗi assembly đều có một mainfest được gắn liền còn được gọi là assembly
metadata mô tả những gì được chứa trong assembly, bao gồm :
•
Tên nhận diện (identity name)
•
Một danh sách các tập tin thuộc assembly. Một assembly đơn lẻ phải có ít nhất
một tập tin, nhưng có thể chứa số các tập tin.
•
Một danh sách các assembly được qui chiếu. tất cả các tập tin khác được dùng bởi
assembly này bao gồm số phiên bản và các khoá dùng chung. Khoá dùng chung
được sử dụng duy nhất để xác định assemblies.
•
Một bộ các yêu cầu cho phép (permission request) những quyền hạn cần có dể
được phép chạy assembly này.
•
Một danh sách các kiểu dữ liệu và nguồn lực trong assembly, một bản đồ nối liền
các kiểu dữ liệu public với các đoạn mã thi công.
Private and Shared Assemblies
Assemblies nằm ở hai dạng: private assembly và shared assembly. Dạng thứ nhất
private assembly là một tập hợp (collection) những kiểu dữ liệu chỉ dành riêng cho một
ứng dụng sử dụng. Dạng thứ hai shared assembly thì lại được chia sẽ sử dụng bởi nhiều
ứng dụng.
Viewing Assemblies
Assemblies có thể được hiển thị khi sử dụng tiện ích command-line ildasm dưới
hỗ trợ của MSIL . Một assembly được mở khi bắt đầu ildasm từ command_line với đối
số assembly hoặc chọn lựa từ File | open menu
hình sau sẽ miêu tả một ildasm khi chúng ta xây dựng HelloCSharp.exe. ildasm hiển
thị the manifest, và HelloCSharp type trong
Wrox.ProCSharp.Assemblies.CrossLanguage namespace. Chúng ta có thể thấy the
version number, và thuộc tính assembly ngay khi mở assemblies và versions của chúng.
Mở phương thức của lớp , chúng ta có thể thấy đ
uợc đoạn mã MSIL
ildasm Symbols
Các kí hiệu được sử dụng với ildasm trình bày dưới đây:
Symbol Description
Biểu diễn một namespace.
Biểu diễn một kiểu tham chiếu một lớp.Tương tự các ký hiệu được
sử dụng bởi các kiểu giá trị, nó có màu sáng
Biểu diễn một phương thức nhận và thiết lập các accessors của
một thuộc tính; "S" trong đồ hoạ có nghĩa là phương thức tĩnh
Biểu diễn một trường
Biểu diễn một sự kiện
Biểu diễn một thuộc tính
Có nghĩa là có nhiều thông tin có giá trị như thông tin manifest
hoặc thông tin về miêu tả một lớp
Xây dựng (Building Assemblies)
Chúng ta vừa biết được assembly tiếp theo chúng ta biết cách để xây dụng chúng.
chúng ta sẽ xây dựng xuyên suốt bời vì .NET có khả năng thi hành assembly phức
tạp.nhưng chúng ta hãy xem trường hợp cụ thể cho assemblies.
Tạo các Modules và Assemblies
Tất cả dự án (project) C# trong Visual Studio .NET đều tạo một assembly. Cho
dù bạn chọn một kiểu dự án DLL hoặc EXE , một assembly luôn được tạo. Với trình biên
dịch command-line C# csc, Nó cũng có khả năng tạo modules. Một module là
một DLL assembly không thuộc tính (nên nó không có assembly, nh
ưng nó được thêm
vào một assemblies lúc sau). Dòng lệnh như sau:
csc /target:module hello.cs
Tạo một module hello.netmodule. Nó có thể nhìn thấy module này khi sử dụng ildasm.
Một module cũng có một manifest, Nhưng chúng không có phần .assembly bên
trong the manifest (ngoại trừ assemblies nội , Chúng được kham khảo), Vì một module
không có assembly thuộc tính. Nó không thể được cấu hình versions hoặc chấp nhận với
modules; Chúng chỉ có thể tại assembly gốc. Trong manifest của module, kham khảo
đến assemblies có thể được tìm thấy.
Để so sánh modules của assemblies, Ta tạo một lớp A và biên dịch nó:
csc /target:module A.cs
Biên dịch tạo ra một file A.netmodule, Nó không có thông tin của assembly (như
chúng ta thấy khi sử dụng ildasm nhìn thấy ở manifest). The manifest của module miêu tả
kham khảo assembly mscorlib và the .module entry:
Tiếp theo ,Ta tạo một assembly B nó bao gồm module A.netmodule. Nó không cần
thiết source file để sinh ra assembly này. Dòng lệnh sinh assembly là:
csc /target:library /addmodule:A.netmodule /out:B.dll
Khi nhìn vào assembly sử dụng ildasm, chỉ có một manifest có thể thấy. Trong
manifest, assembly mscorlib là kham khảo .Tiếp theo chúng ta thấy assembly section với
một thuật toán (algorithm) và version. số lượng algorithm phụ thuộc loại algorithm
được sử dụng để tạo ra code của assembly. Khi tạo một assembly lập trình đi vào chọn
lựa algorithm. Phần của manifest là một danh sách tất cả modules đang thuộc assembly.
Ta thấy .module A.netmodule phụ thuộc assembly. Các lớp xuất ra ngoài từ các modules
là phần assembly manifest;
Mục đ
ích của modules là cái gì? Modules có thể giúp khởi động nhanh
hơn assemblies bởi vì không phải tất cả ở trong một file đơn lẻ. modules chỉ kích hoạt
khi cần. Một lí do khác của modules là nếu bạn muốn tạo 1 assembly với nhiều hơn 1
ngôn ngữ lập trình; một module có thể được viết sử dụng VB.NET, module khác sử
dụng C#,và cả hai modules có thể được chứa trong 1 assembly đơn lẻ.
Tạo Assemblies sử dụng Visual Studio .NET
Như vừa đề c
ập tất cả loại dự án (project types) trong Visual Studio .NET tạo
assemblies. Với Visual Studio .NET 7.0 chúng không hổ trợ để tạo thư mục modules.
Khi tạo một Visual Studio .NET project, Nguồn file AssemblyInfo.cs được sinh ra
một cách tự động. Chúng ta sử dụng sourcecode bình thường soạn thảo để cấu hình
assembly thuộc tính file này. Đây là file được sinh ra từ wizard:
using System.Reflection;
using System.Runtime.CompilerServices;
//