Mono.Cecil là gì – Cách truy xuất thông tin Assembly

Cách đọc thông tin DLL? Mono.Cecil là gì? Cecil là một thư viện được viết bởi Jb Evain(anh này được tài trợ bởi Microsoft nên hiểu ha..!) trên nền tảng .NET cũng như chuẩn ECMA CIL. Với Mono.Cecil bạn có thể đọc thông tin của bất kỳ một dll hay assembly nói chung miễn là được viết trên nền tảng .NET hơn thế bạn còn có thể dễ dàng thay đổi thông tin, thêm, sửa nội dung assembly và lưu thành một assembly khác.

Mono Cecil là gì?

Cần nói thêm ECMA là gì?
ECMA là viết tắt của Hiệp hội Các nhà sản xuất máy tính châu Âu (ECMA), được thành lập bởi các công ty lớn nhỏ tại Châu Âu vào năm 1961 và đổi tên như hiện tại là ECMA International vào năm 1994.
Hoạt động như một tổ chức phi lợi nhuận nhằm phát triển / chuẩn hóa các tiêu chuẩn cũng như các báo cáo kỹ thuật trong lĩnh vực Công nghệ thông tin và Truyền thông, Điện tử gia dụng. Cái chúng ta cần quan tâm là mảng Programming Languages.
CIL là một nhánh trong các chuẩn về Programming Languages của ECMA. CIL là viết tắt của Common Intermediate Language – tạm dịch là ngôn ngữ trung gian giữa ngôn ngữ cấp cao và ngôn ngữ máy.


Nuget command:

Install-Package Mono.Cecil

Quay lại với Mono.Cecil, trước kia để có thể đọc thông tin một dll hay assembly bất kỳ, bạn thường phải load assembly đó lên với thư viện System.Reflection. Nhưng nay chuyện đó sẽ dễ hơn với Mono.Cecil. Dưới đây là một vài điểm so sánh giữa Mono.Cecil vs System.Reflection:

  • Bạn có thể load một hay nhiều assembly vào hay unload ra khỏi AppDomain với System.Reflection, Cecil thì không, nó chỉ hỗ trợ đọc, decombine và sửa thông tin assembly(dễ hiểu vì là nó không chính thống).
  • System.Reflection bạn chắc chắn sẽ tốn nhiều chi phí hơn về performance và memory vì mọi dữ liệu trong assembly đều được xem như là code và CLR sẽ quản lý nó trong memory.
  • Đôi khi bạn không thể đọc một số thông tin trong assembly, cái mà được load bởi Reflection vì tất cả Data trong assembly đó đều được xem như là code. Có thể bạn sẽ nhận Code Access Security (CAS) exception.
  • Reflection không thể dịch mã IL.
  • Khi load assembly bằng Reflection, tất cả các assembly liên quan đều sẽ được load theo, có nghĩa là nếu bạn không có sẵn các assembly liên quan, bạn sẽ nhận exception. Với Cecil thì không cần thiết.
Mono.Cecil là gì?

Object Model

Dưới đây là ví dụ:

// Creates an AssemblyDefinition from the "MyLibrary.dll" assembly
AssemblyDefinition myLibrary = AssemblyDefinition.ReadAssembly ("MyLibrary.dll");
 
// Gets all types which are declared in the Main Module of "MyLibrary.dll"
foreach (TypeDefinition type in myLibrary.MainModule.Types) {
    //Writes the full name of a type
    Console.WriteLine (type.FullName);
}

Kết quả đánh giá performance giữa System.Reflection vs Mono.Cecil.
Mono.Cecil tốt hơn về performance

Bạn có thể tham khảo thêm bài đánh giá perfomance tại đây.
Phạm Tuân

IL và MSIL là gì?
WPF - Biến Grid Thành Slide Navigation Menu
Mã OTP Hoạt Động Thế Nào Và Cách Tạo Mã OTP
Hãy bình luận trực tiếp ở đây để được trả lời nhanh hơn. 2 bình luận.

Trả lời