0
0
Lập trình
Admin Team
Admin Teamtechmely

Hiểu biết về Assemblies trong .NET

Đăng vào 2 ngày trước

• 5 phút đọc

Giới thiệu

Trong thời đại công nghệ hiện nay, .NET đã trở thành một trong những công nghệ phổ biến nhất trong cộng đồng lập trình viên. Nếu bạn đang làm việc với .NET, chắc chắn bạn sẽ gặp phải khái niệm assemblies. Hiểu rõ về assemblies không chỉ giúp bạn phát triển ứng dụng tốt hơn mà còn đảm bảo quá trình triển khai diễn ra suôn sẻ. Trong bài viết này, chúng ta sẽ khám phá tất cả về assemblies, vai trò của chúng trong dự án phát triển .NET, cách tạo và quản lý chúng, cũng như các kết nối bảo mật liên quan.

Assembly trong .NET là gì?

Assembly trong .NET là một đơn vị cơ bản được triển khai trong khung .NET nhằm giúp quá trình phát triển ứng dụng trở nên mượt mà và hiệu quả hơn. Về mặt kỹ thuật, assembly là một thư viện mã đã được biên dịch với mã thực thi cho việc phát triển ứng dụng thành công. Assembly là đơn vị triển khai nhỏ nhất và đặc biệt, nó có thể được tái sử dụng trong nhiều ứng dụng khác nhau.

Vậy assembly có phải là riêng tư hay chia sẻ? Nó có thể thuộc cả hai loại. Assembly riêng tư được sử dụng bởi một ứng dụng duy nhất và có thể được lưu trữ trong thư mục của ứng dụng đó. Ngược lại, assembly chia sẻ có thể được tái sử dụng cho nhiều ứng dụng khác nhau và thường được lưu trữ trong Global Assembly Cache (GAC). Đối với những ai chưa biết, GAC là một kho lưu trữ trung tâm dành cho các assembly chia sẻ, cho phép các ứng dụng khác nhau dễ dàng truy cập và quản lý.

Một assembly là một tập hợp độc đáo của các loại dữ liệu và tài nguyên được phát triển để hoạt động cùng nhau, nhằm tạo thành một đơn vị chức năng logic. Một số khía cạnh cốt lõi của assemblies bao gồm:

  • Thông tin phiên bản
  • Siêu dữ liệu
  • Manifest

Assemblies có thể là tĩnh hoặc động. Các thành viên tĩnh được phát triển tại thời điểm biên dịch và chứa tất cả thông tin cần thiết để CLR thực thi mã. Trong khi đó, các assembly động có thể được tạo ra trong thời gian chạy, cho phép bạn tạo mã khi cần thiết. Điều này rất hữu ích trong các kịch bản phổ biến như kiến trúc plugin hoặc công cụ tạo mã.

Assembly .NET là một thành phần tiêu chuẩn do Microsoft phát triển, có thể là một tệp thực thi (.exe) hoặc một thư viện liên kết động (DLL). Tất cả các assembly đều chứa các loại dữ liệu, thông tin phiên bản, siêu dữ liệu và manifest.

Các loại assembly trong .NET

.NET hỗ trợ ba loại assembly:

Assembly riêng tư

Assembly riêng tư thường yêu cầu sao chép riêng trong các thư mục ứng dụng nơi mà các tính năng của assembly cần được sử dụng. Điều này có nghĩa là bạn không thể truy cập các tính năng của assembly riêng tư nếu không có bản sao trong thư mục ứng dụng.

Ví dụ:

csharp Copy
// MyLibrary.cs
namespace MyLibrary;
public class Helper
{
    public static string Greet(string name) => $"Hello, {name}";
}

Ứng dụng Console (sử dụng assembly riêng tư)

csharp Copy
using System;
using MyLibrary;

class Program
{
    static void Main()
    {
        Console.WriteLine(Helper.Greet("World"));
    }
}

Assembly chia sẻ

Assembly công khai không cần sao chép trong các thư mục ứng dụng khác nhau. Đây là lý do tại sao nó còn được gọi là assembly chia sẻ. Chỉ cần một bản sao duy nhất là đủ cho toàn bộ hệ thống. Điều đáng chú ý là assembly chia sẻ thường được khuyến nghị cài đặt trong GAC.

Assembly chia sẻ, thường được gọi là assembly có tên mạnh, được sao chép vào một vị trí duy nhất; điều này có thể thực hiện thông qua kho lưu trữ assembly toàn cầu.

Nếu bạn cần gọi một assembly nhưng cần thực hiện trong cùng một ứng dụng, phiên bản cùng sẽ được sử dụng từ cùng một vị trí gốc.

Mỗi assembly chia sẻ bao gồm các khía cạnh như tên, phiên bản, khóa công khai và thông tin văn hóa.

Nếu bạn muốn kết hợp hai assembly khác nhau mặc dù chúng có cùng tên, thông tin khóa công khai và phiên bản sẽ không cho phép điều đó.

Ví dụ

csharp Copy
namespace SharedLib;
public class Tools
{
    public static string Hello() => "Hello from Shared Assembly";
}

Gán tên mạnh khi biên dịch (để có thể đưa vào GAC):

bash Copy
sn -k SharedKey.snk

Thêm vào dự án:

xml Copy
<PropertyGroup>
  <SignAssembly>true</SignAssembly>
  <AssemblyOriginatorKeyFile>SharedKey.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>

Ứng dụng sử dụng Assembly chia sẻ

csharp Copy
using System;
using SharedLib;

class Program
{
    static void Main() => Console.WriteLine(Tools.Hello());
}

Assembly vệ tinh (Satellite Assembly)

Cuối cùng nhưng không kém phần quan trọng, assembly vệ tinh rất phổ biến trong ba loại này. Assembly này cho phép triển khai nhanh chóng các tài nguyên ngôn ngữ và văn hóa cụ thể cho bất kỳ ứng dụng nào.

Ví dụ:

Bước 1: Tạo tệp tài nguyên

Strings.resx (mặc định, tiếng Anh)

plaintext Copy
Greeting = Hello

Strings.fr.resx (tiếng Pháp)

plaintext Copy
Greeting = Bonjour

Bước 2: Ứng dụng Console (Assembly chính)

csharp Copy
using System;
using System.Resources;
using System.Reflection;
using System.Globalization;

class Program
{
    static void Main()
    {
        var rm = new ResourceManager("Strings", Assembly.GetExecutingAssembly());

        Console.WriteLine(rm.GetString("Greeting", new CultureInfo("en")));
        Console.WriteLine(rm.GetString("Greeting", new CultureInfo("fr")));
    }
}

Bước 3: Biên dịch → Tạo Assembly vệ tinh

Khi biên dịch, .NET sẽ tạo ra:

plaintext Copy
en\MyApp.resources.dll

fr\MyApp.resources.dll

Đây là các assembly vệ tinh cho việc địa phương hóa.

Một số khía cạnh cốt lõi của assembly cần lưu ý:

  • Assemblies rất dễ hiểu, vì vậy bạn không cần lo lắng về thông tin, mọi thứ đều được giữ lại một cách hợp lý.
  • Các phiên bản và phụ thuộc đều được quản lý.
  • Hỗ trợ tải assembly song song.
  • Việc cài đặt assembly rất dễ dàng, giống như sao chép một tệp.
  • Assemblies có thể là riêng tư hoặc công khai.

Cách tạo một Assembly trong .NET

Hãy xem một ví dụ đơn giản về cách kiểm tra assembly hiện tại tại thời điểm chạy:

csharp Copy
using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        Assembly asm = Assembly.GetExecutingAssembly();

        Console.WriteLine($"Assembly Full Name: {asm.FullName}");
        Console.WriteLine($"Location: {asm.Location}");
    }
}

Kết quả

plaintext Copy
Assembly Full Name: MyApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Location: C:\Projects\MyApp\bin\Debug\net8.0\MyApp.dll

Kết luận

Hiểu biết về assemblies là rất quan trọng và cơ bản trong phát triển ứng dụng .NET. Chúng cung cấp một cách thức phân phối và tái sử dụng mã .NET một cách dễ dàng. Khi bạn đã nắm rõ về assemblies và cách chúng hoạt động, bạn sẽ không gặp khó khăn trong việc tạo ra các ứng dụng .NET an toàn, dễ bảo trì và dễ triển khai.

Hy vọng bài viết này sẽ hữu ích cho bạn. Nếu bạn có bất kỳ câu hỏi nào, hãy để lại ý kiến của mình ở phần bình luận bên dưới.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào