Assemblies
Tạo các Assembly chia sẽ
Assemblies thđược tách bit cho người sử dụng bởi một ng dụng
độc lp không chia smột assembly là mặc định. Khi sdụng assemblies
nó không cn 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 mt assembly chia sẽ
Tên Assembly chia s
Mục đích của tên assembly chia s phải là duy nht, và phải khả năng
để bảo vệ n. Tránh 1 lúc nào đó người lạ tạo một assembly sử dụng
cùng 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 thể được chia sẻ sử dụng bởi nhiều nhà
triển khai khác, đó là bn đang thực hiện một shared assembly.
Trước tiên, assembly của bạn phi một strong name, một tên duy nhất
được chia ssdụng. Thứ đến, shared assembly ca bạn phải được bảo vệ
không cho các phiên bản mi phá bĩnh, như vậy phải cách kiểm tra phiên
bản trước khi được nạp vào theo u cu của ứng dụng client. Cuối cùng,
mun cho chia sẻ sử dụng assembly bạn tạo ra, bạn phải đưa assembly y
vào Global Assembly Cache (GAC). Đây một vùng ký ức của hệ thng
các tập tin được dành riêng bi CLR để trữ c shared assembly. Bản thân
GAC nm tmụ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 nim về Strong Name
Để có thsử dụng shared assembly, bn cần tuân thủ 3 đòi hi sau đay:
Bạn phi khả năng báo đúng assembly mà bn muốn nạp vào. Do
đó, bạn cần 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 kng bgiả mạo. Nghĩa là, bạn cần
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 bn đang nạp o đúng assembly
được phép của tác gitạo ra assembly. Do đó, bạn cần ghi nhận mã nhn
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 nht đối với assembly, Tên này được gi là strong name
thường chứa những thông tin sau đây:
Một tên kiu string mang tính thân thiện và thông tin tu chọn về
culture (ging như với private assembly)
Một mã nhn din 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 mt
hoá chun mục khoá ng cộng (standard public key encryption). Khi
bạn tạo một shared assembly bạn phi 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 tnhững tên nội dung
của các tập tin trong assembly. Mã băm này sđược mt mã h vi một
private key đi với assembly đượ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. i m li, 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 dch .NET, trình y s liệt kê mt
token ca public key trên manifest của assembly (thông qua tag
[.publickeytoken]). Private key skhông được liệt kê ra trên manifest nhưng
li được "ký tên" vi public key. Dấu n kết quả sđược trữ tập tin định
nghĩa assembly manifest).
Khi mt ứng dụng cho nạp assembly vào, tCLR sdù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ả mo. Việc này cũng bảo vệ chống đụng độ về tên.
Tạo một shared assembly
Mun kết sinh một strong name bạn sdụng trình tin ích sn.exe. (nm
trên t mục C:\program Files\Microsoft.NET\SDK\v1.1\bin).
Mc dù trình tiện ích này có nhiu mục chọn, ta chỉ cần dùng flag "-k"
yêu cu 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 th đặt tên tp tin bất cứ tên bn muốn. Bạn nh cho strong
name là một chui kexadecimal digit và không dành cho người đọc. Nếu bạn
quan t nội dung của tập tin mới này (example.snk), bn thấy binary
markings ca 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 bn tạo một C# project
workspace, thể bạn để ý một trong những tập tin khi scủa dán mang
tên "AssemblyInfo.cs",
Tập tin này chứa một số attributes được tiêu thbởi một trình bn dch .
NET. Nếu bạn quan sát tập tin này, bn sẽ thấy attribute AssemblyKeyFile
này.
Muốn khaio mt 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:)]
Sdụng assembly level attribute này, C# compiler gi đây trộn với nhau
thông tin cn thiết vào manifest tương ng. Bạn 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: