
Assemblies
Tạo các Assembly chia sẽ
Assemblies có thể được tách biệt cho người sử dụng bởi một ứng dụng
độc lập – không chia sẽ một assembly là mặc định. Khi sử dụng assemblies
nó không cần thiết lưu ý các yêu cầu dành cho chia sẽ.
Nội dung chính chúng ta sẽ được khảo sát:
Strong names
Tạo shared assemblies
Cài đặt shared assemblies trong global assembly cache
Sử dụng một assembly chia sẽ
Tên Assembly chia sẽ
Mục đích của tên assembly chia sẽ phải là duy nhất, và nó phải có khả năng
để bảo vệ tên. Tránh 1 lúc nào đó có người lạ tạo một assembly sử dụng

cùng tên. Bạn có thể tạo ra những assembly được chia sẻ sử dụng bởi những
ứng dụng khác. Nếu bạn viết ra một ô control mang tính chung chung
(general control) hoặc một lớp có thể được chia sẻ sử dụng bởi nhiều nhà
triển khai khác, đó là bạn đang thực hiện một shared assembly.
Trước tiên, assembly của bạn phải có một strong name, một tên duy nhất
được chia sẻ sử dụng. Thứ đến, shared assembly của bạn phải được bảo vệ
không cho các phiên bản mới phá bĩnh, như vậy phải có cách kiểm tra phiên
bản trước khi được nạp vào theo yêu cầu của ứng dụng client. Cuối cùng,
muốn cho chia sẻ sử dụng assembly bạn tạo ra, bạn phải đưa assembly bày
vào Global Assembly Cache (GAC). Đây là một vùng ký ức của hệ thống
các tập tin được dành riêng bởi CLR để trữ các shared assembly. Bản thân
GAC nằm ở thư mục <ổ đia>:\WINNT\Assembly. Trên .NET, các shared
assembly đều được tập trung đưa vào một nơi là GAC.
Khái niệm về Strong Name
Để có thể sử dụng shared assembly, bạn cần tuân thủ 3 đòi hỏi sau đay:
Bạn phải có khả năng báo đúng assembly mà bạn muốn nạp vào. Do
đó, bạn cần có một tên duy nhất mang tính toàn cục (global unique name)
được gán cho shared asembly.
Bạn cần bảo đảm là assembly không bị giả mạo. Nghĩa là, bạn cần có
một digital signature (dấu ấn kỹ thuật số) khi assembly được tạo dựng.

Bạn cần bảo đảm là assembly bạn đang nạp vào đúng là assembly
được phép của tác giả tạo ra assembly. Do đó, bạn cần ghi nhận mã nhận
diện người sáng tác (originator).
Do đó, khi bạn muốn tạo ra một assembly có thể được chia sẻ sử dụng bởi
nhiều ứng dụng khác nhau trên một máy tính nào đó, bước đầu tên là tạo ra
một tên chia sẻ duy nhất đối với assembly, Tên này được gọi là strong name
thường chứa những thông tin sau đây:
Một tên kiểu string mang tính thân thiện và thông tin tuỳ chọn về
culture (giống như với private assembly)
Một mã nhận diện phiên bản
Một cặp mục khoá public-private
Một dấu ấn kỹ thuật số (digital signature).
Việc hình thành một strong name đều được dựa trên một phương thức mật
mã hoá chuẩn mục khoá công cộng (standard public key encryption). Khi
bạn tạo một shared assembly bạn phải kết sinh một cặp mục khoá public-
private. Một đoạn mã băm (hash code) được lấy ra từ những tên và nội dung
của các tập tin trong assembly. Mã băm này sẽ được mật mã hoá với một
private key đối với assembly và được đưa vào manifest. Đây được biết là ký
tên assembly (signing the assembly). Public key sẽ được sát nhập vào strong

name của assembly. Nói tóm lại, một cặp mục khoá sẽ được bao gồm trong
chu kỳ build sử dụng mọt trình biên dịch .NET, trình này sẽ liệt kê một
token của public key trên manifest của assembly (thông qua tag
[.publickeytoken]). Private key sẽ không được liệt kê ra trên manifest nhưng
lại được "ký tên" với public key. Dấu ấn kết quả sẽ được trữ tập tin định
nghĩa assembly manifest).
Khi một ứng dụng cho nạp assembly vào, thì CLR sẽ dùng public key để
giải mã đoạn mã băm đối với các tập tin thuộc assembly bảo đảm là chúng
không bị giả mạo. Việc này cũng bảo vệ chống đụng độ về tên.
Tạo một shared assembly
Muốn kết sinh một strong name bạn sử dụng trình tiện ích sn.exe. (nằm
trên thư mục C:\program Files\Microsoft.NET\SDK\v1.1\bin).
Mặc dù trình tiện ích này có nhiều mục chọn, ta chỉ cần dùng flag "-k"
yêu cầu trình tiện ích kết sinh một strong name mới và được trữ trên một tập
tin được khai báo.
vi du: sn -k d:\vidu_C#\chuong8\example.snk
Bạn có thể đặt tên tập tin bất cứ tên gì bạn muốn. Bạn nhớ cho strong
name là một chuỗi kexadecimal digit và không dành cho người đọc. Nếu bạn

quan sát nội dung của tập tin mới này (example.snk), bạn thấy binary
markings của cặp key.
Bước kế tiếp là cho ghi nhận public key lên assembly manifest. Cách dễ
nhất là sử dụng attribute AssemblyKeyfile. Khi bạn tạo một C# project
workspace, có thể bạn để ý một trong những tập tin khởi sự của dự án mang
tên "AssemblyInfo.cs",
Tập tin này chứa một số attributes được tiêu thụ bởi một trình biên dịch .
NET. Nếu bạn quan sát tập tin này, bạn sẽ thấy attribute AssemblyKeyFile
này.
Muốn khai báo một strong name đối với một shared assembly, bạn chỉ cần
nhập từ trị của attribute này cho biết nơi tá túc của tập tin *.snk.
[asssembly:AssemblyKeyFile(@"D:\vidu_C#\chuong8\example.snk:)]
Sử dụng assembly level attribute này, C# compiler giờ đây trộn với nhau
thông tin cần thiết vào manifest tương ứng. Bạn có thể dùng ILDasm.exe để
xem tag [.publickey].
Ví dụ: ta có file mykey.snk
sn -k mykey.snk
Ở đây ta thay thành AssemblyInfo.cs. Thuộc tính AssemblyKeyFile được
thiết lập đến file mykey.snk: