Tìm hiểu C# và ứng dụng của C# p 29

Chia sẻ: Yukogaru | Ngày: | Loại File: PDF | Số trang:4

0
75
lượt xem
16
download

Tìm hiểu C# và ứng dụng của C# p 29

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Chương 17 Assemblies và Versioning Đơn vị cơ bản trong lập trình .NET là Assembly. Một Assembly là một tập hợp các tập tin mà đối với người sử dụng, họ chỉ thấy đó là một tập tin DLL hay EXE. .NET định nghĩa Assembly là một đơn vị có khả năng tái sử dụng (re-use), mang số hiệu phiên bản (versioning), bảo mật (security) và cuối cùng là khả năng triển khai (deployment) Asssembly có thể chứa đựng nhiều thành phần khác ngoài mã chương trình ứng dụng như tài nguyên (resource, ví dụ tập tin .GIF), thông tin mô...

Chủ đề:
Lưu

Nội dung Text: Tìm hiểu C# và ứng dụng của C# p 29

  1. Assemblies và Versioning Gvhd: Nguyễn Tấn Trần Minh Khang Chương 17 Assemblies và Versioning Đơn vị cơ bản trong lập trình .NET là Assembly. Một Assembly là một tập hợp các tập tin mà đối với người sử dụng, họ chỉ thấy đó là một tập tin DLL hay EXE. .NET định nghĩa Assembly là một đơn vị có khả năng tái sử dụng (re-use), mang số hiệu phiên bản (versioning), bảo mật (security) và cuối cùng là khả năng triển khai (deployment) Asssembly có thể chứa đựng nhiều thành phần khác ngoài mã chương trình ứng dụng như tài nguyên (resource, ví dụ tập tin .GIF), thông tin mô tả kiểu (type definition), siêu dữ liệu (metadata) về mã và dữ liệu. 17.1 Tập tin PE Assembly được lưu trữ trên dĩa từ theo dạng thức tập tin Portable Executable (PE). Dạng thức tập tin PE của .NET cũng giống như tập tin PE bình thường của Windows NT. Dạng thức PE được cài đặt thành dạng thức tập tin DLL và EXE. Về mặt logic, assembly chứa đựng một hay nhiều module. Mỗi module được tổ chức thành một DLL và đồng thời mỗi module là một cấu thành của assembly. Các module tự bản thân chúng không thể chạy được, các module phải kết hợp với nhau thành assembly thì mới có thể làm được việc gì đó hữu ích. 17.2 Metadata Metadata là thông tin được lưu trữ bên trong assembly với mục đích là để mô tả các kiểu dữ liệu, các phương thức và các thông tin khác về assembly. Do có chứa metadata nên assembly có khả năng tự mô tả. 17.3 Ranh giới an ninh Assembly tạo ra một ranh giới an ninh (security boundary). Các kiểu dữ liệu định nghĩa bên trong assembly bị giới hạn phạm vi tại ranh giới assembly. Để có thể sử dụng chung một kiểu dữ liệu giữa 2 assembly, cần phải chỉ định rõ bằng tham chiếu (reference) trong IDE hoặc dòng lệnh. 17.4 Số hiệu phiên bản (Versioning) Mỗi assembly có số hiệu phiên bản riêng. Một “phiên bản” ám chỉ toàn bộ nội dung của một assembly bao gồm cả kiểu dữ liệu và resource. 17.5 Manifest Manifest chính là một thành phần của metadata. Manifest mô tả một assembly chứa những gì, ví dụ như: thông tin nhận dạng (tên, phiên bản), danh sách các kiểu dữ 196
  2. Assemblies và Versioning Gvhd: Nguyễn Tấn Trần Minh Khang liệu, danh sách các resource, danh sách các assembly khác được assembly này tham chiếu đến, … 17.5.1 Các module trong manifest Một assembly có thể chứa nhiều module, do đó manifest trong assembly còn có thể chứa mã băm (hash code) của mỗi module lắp ghép thành assembly để bảo đảm rằng khi thực thi, chỉ có thể nạp các module đúng phiên bản. Chỉ cần một sự thay đổi rất rất nhỏ trong module là mã băm sẽ thay đổi. 17.5.2 Manifest trong module Mỗi module cũng chứa riêng phần manifest mô tả cho chính nó giống như assembly chứa manifest mô tả cho assembly vậy. 17.5.3 Các assembly cần tham chiếu Manifest của assembly cũng có thể chứa tham chiếu đến các assembly khác. Mỗi tham chiếu chứa đựng tên, phiên bản, văn hóa (culture), nguồn gốc (originator),… Thông tin về nguồn gốc chính là chữ ký số (digital signature) của lập trình viên hay của công ty nơi cung cấp assembly mà assembly hiện tại đang tham chiếu đến. Văn hóa là một đối tượng chứa thông tin về ngôn ngữ, cách trình bày của mỗi quốc gia. Ví dụ như cách thể hiện ngày tháng: D/M/Y hay M-D-Y 17.6 Đa Module Assembly Một assembly đơn module là một assembly chỉ gồm một module, module này có thể là một tập tin EXE hoặc DLL. Manifest cho assembly đơn module được nhúng vào trong module. Một assembly đa module là một assembly bao gồm nhiều tập tin (ít nhất một tập tin EXE hoặc DLL). Manifest cho assembly đa module có thể được lưu trữ thành một tập tin riêng biệt hoặc được nhúng vào một module nào đó bất kỳ. 17.6.1 Lợi ích của đa module assembly Nếu một dự án có nhiều lập trình viên mà dự án đó chỉ xây dựng bằng một assembly, việc kiểm lỗi, biên dịch dự án,… là một “ác mộng” vì tất cả các lập trình viên phải hợp tác với nhau, phải kiểm tra phiên bản, phải đồng bộ hóa mã nguồn,… Nếu một ứng dụng lớn được xây dựng bằng nhiều assembly, khi cần cập nhật (update) để sửa lỗi chẳng hạn, thì chỉ cần cập nhật một / vài assembly mà thôi. Nếu một ứng dụng lớn được tổ chức từ nhiều assembly, chỉ có những phần mã chương trình thường sử dụng / quan trọng thuộc một vài assembly là được nạp vào bộ nhớ, do đó làm giảm bớt chi phí bộ nhớ, tăng hiệu suất hệ thống. 197
  3. Assemblies và Versioning Gvhd: Nguyễn Tấn Trần Minh Khang 17.7 Assembly nội bộ (private assembly) Có 2 loại Assembly: nội bộ (private) và chia sẻ (shared). Assembly nội bộ được dự định là chỉ dùng cho một ứng dụng, còn assembly chia sẻ thì ngược lại, dùng cho nhiều ứng dụng. Các assembly nội bộ được ghi trên dĩa từ thành một tập tin EXE hoặc DLL trong cùng thư mục với assembly chính hoặc trong các thư mục con của thư mục chứa assembly chính. Để thực thi trên máy khác chỉ cần sao chép đúng cấu trúc thư mục là đủ, không cần phải đăng ký với Registry. 17.8 Assembly chia sẻ (shared assembly) Khi viết ra một assembly đại loại như một control chẳng hạn, nếu tác giả của control đó có ý định chia sẻ cho các lập trình viên khác thì anh / chị ta phải xây dựng assembly đó đáp ứng các yêu cầu sau: • Assembly đó phải có tên “mạnh” (strong name). Tên mạnh có nghĩa là chuỗi biểu diễn tên đó phải là duy nhất (globally unique) • Phải có thông tin về phiên bản để tránh hiện tượng các phiên bản “dẫm chân lên nhau” • Để có thể chia sẻ assembly, assembly đó phải được đặt vào nơi gọi là Global Assembly Cache (GAC). Đây là nơi được quy định bởi Common Language Runtime (CLR) dùng để chứa assembly chia sẻ. 17.8.1 Chấm dứt “địa ngục DLL” Giả sử bạn cài đặt một ứng dụng A lên một máy và nó chạy tốt. Sau đó bạn cài đặt ứng dụng B, bỗng nhiên ứng dụng A không chịu hoạt động. Sau quá trình tìm hiểu, cuối cùng nguyên nhân là do ứng dụng B đã cài một phiên bản khác đè lên một tập tin DLL mà ứng dụng A sử dụng. Tình huống trên gọi là “địa ngục DLL” Sự ra đời của assembly đã chấm dứt tình trạng trên. 17.8.2 Phiên bản Assembly chia sẻ trong .NET được định vị bằng tên duy nhất (unique) và phiên bản. Phiên bản được biểu diễn bởi 4 số phân cách bằng dấu ‘:’ ví dụ như 1:2:6:1246 Số đầu tiên mô tả phiên bản chính (major version) Số thứ 2 mô tả phiên bản phụ (minor version) Số thứ 3 mô tả thứ tự bản xây dựng (build) Số cuối cùng mô tả lần xem xét cập nhật (revision) để sửa lỗi 198
  4. Assemblies và Versioning Gvhd: Nguyễn Tấn Trần Minh Khang 17.8.3 Tên mạnh Một tên mạnh là một chuỗi các ký tự hexa mang thuộc tính là duy nhất trong toàn cầu (globally unique). Ngoài ra chuỗi đó còn được mã hóa bằng thuật toán khóa công khai 1 để bảo đảm rằng assembly không bị thay đổi vô tình hay cố ý. Để tạo ra tên mạnh, một cặp khóa công khai-bí mật được tạo ra cho assembly. Một mã băm (hash code) được tạo ra từ tên, nội dung của các tập tin bên trong assembly và chuỗi biểu diễn khóa công khai. Sau đó mã băm này được mã hóa bằng khóa bí mật, kết quả mã hóa được ghi vào manifest. Quá trình trên được gọi là ký xác nhận vào assembly (signing the assembly). Khi assembly được CLR nạp vào bộ nhớ, CLR sẽ dùng khóa công khai trong manifest giải mã mã băm để xác định xem assembly có bị thay đổi không. 17.8.4 Global Assembly Cache (GAC) Sau khi đã tạo tên mạnh và ghi vào assembly, việc còn lại để thực hiện chia sẻ assembly là đặt assembly đó vào thư mục GAC. Đó là một thư mục đặc biệt dùng để chứa assembly chia sẻ. Trên Windows, đó là thư mục \WinNT\assembly. 1 Mã hóa khóa công khai – bí mật: đó là một thuật toán mã hóa đặc biệt, đầu tiên dùng một thuật toán riêng tạo ra 2 khóa, một khóa phổ biến rộng rãi nên gọi là khóa công khai, khóa còn lại do chủ nhân của nó cất nơi an toàn nên gọi là bí mật. Sau đó dùng thuật toán mã hóa để mã hóa dữ liệu. Một khi dữ liệu bị mã hóa bằng một khóa thì dữ liệu đó chỉ có thể được giải mã bằng khóa kia và ngược lại. 199
Đồng bộ tài khoản