.NET – Strong Named Assembly là gì?

Tìm hiểu về các khái niệm liên quan cũng như cách tạo một strong named assembly trong .NET.

DLL Hell

Đây là một rắc rối được nhắc đến từ lâu của Windows trong việc quản lý các thư viện dùng chung của hệ thống. Các tập tin thư viện thường được đặt trong một thư mục chung (như System32) để sử dụng cho toàn hệ thống. Đối mặt với những phần mềm được cài đặt và gỡ bỏ thường xuyên khỏi hệ thống, không ít trường hợp các ứng dụng khác nhau sử dụng những thư viện trùng tên tập tin (hoặc cùng một thư viện nhưng khác phiên bản) và chép đè nhau trong thư mục chung đó.
Kết quả là một vài ứng dụng sẽ tham chiếu đến sai thư viện và khiến nó hoạt động sai hoặc thậm chí không thể hoạt động được. Và các thư viện nằm trong hệ thống đôi khi trở thành “rác” khi việc xóa bỏ chúng tương đối “nhạy cảm” và có thể gây ảnh hướng đến các ứng dụng khác.

DLL Hell

Weak Named và Strong Named assembly

Để không gặp phải vấn đề “DLL Hell”, CLR hỗ trợ hai loại assembly là weak name và strong name. Điểm khác biệt duy nhất của hai loại này nằm ở việc strong named assembly được định danh với một cặp khóa public/private.

Tìm việc làm .NET lương cao up to 1500USD

Tương ứng với hai loại này, có hai cách để bạn sử dụng chúng:

  • Private: với weak named assembly, bạn chỉ có thể sử dụng nó trong cùng thư mục với chương trình.
  • Public (hay Shared): assembly được đặt vào một thư mục chung (gọi là GAC – Global Assembly Cache) trong hệ thống và các ứng dụng có thể sử dụng nó. với strong named assembly, bạn có thể sử dụng nó dưới dạng Private lẫn Public.

Dĩ nhiên chỉ dựa vào tên tập tin để định danh cho các assembly thì không đủ. Chính vì vậy một strong named assembly được định danh dựa vào 4 thuộc tính:

  • Tên tập tin (không bao gồm phần mở rộng).
  • Số hiệu phiên bản (version).
  • Văn hóa (culture).
  • Một khóa public.

Bởi vì một khóa public khá lớn nên nó sẽ được hash để tạo ra một chuỗi giá trị gọi là “public key token”, dựa vào đây bạn sẽ xác định được một assembly có phải là strong name hay không. Bạn có thể coi thuộc tính Assembly.FullName để thấy được 4 giá trị định danh này. Ví dụ với một weak named assembly:

typeof(Foo).Assembly.FullName

// Output: ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

Với một strong named assembly, bạn sẽ thấy được giá trị của PublicKeyToken:

typeof(Console).Assembly.FullName

// Output: mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

Tạo và cài đặt strong named assembly vào GAC

Trong Visual Studio, bạn có thể tạo một strong named assembly bằng cách mở cửa sổ Properties của project. Trong thẻ Signing, bạn đánh dấu chọn Sign the assembly. Trong mục Choose a strong name key file bên dưới, bạn có thể tạo hoặc chọn một khóa public có sẵn.

Visualstudio - Signing assembly

Ngoài ra bạn có thể tạo thông qua cửa sổ dòng lệnh với Visual Studio Command Prompt.

Sau đó bạn có thể cài đặt assembly vào GAC bằng cách dùng công cụ GACUtil.exe.

gacutil /i MyLibrary.dll
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.0
Copyright (c) Microsoft Corporation. All rights reserved.

Assembly successfully added to the cache

Để gỡ assembly ra khỏi GAC, bạn cần sử dụng tên đầy đủ của assembly với tùy chọn /u:

gacutil /u “ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b14988ec222fb4a1”
Uninstalled: ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b14988ec222fb4a1, processorArchitecture=MSIL
Number of assemblies uninstalled = 1
Number of failures = 0

TopDev via Yinyangit

Lọc các vị trí việc làm cho ngành it hấp dẫn tại Topdev