.NET Reflector là một công cụ khá quen thuộc đối với các lập trình viên .NET, đặc biệt trong việc xem và phân tích các assembly .NET đã được compile.
Với phiên bản NET Reflector 7 Beta 1, chúng ta có thể mở các file .exe hoặc .dll được viết bằng .NET để xem cấu trúc bên trong của assembly, bao gồm namespace, class, method, property, field và các dependency.
Điểm đáng chú ý nhất của Reflector là khả năng decompile assembly về dạng source code dễ đọc, chẳng hạn C#.
Thông thường, khi viết một chương trình C#:
C# Source Code
↓
Compiler
↓
.NET Assembly
(.exe / .dll)
Sau khi compile, source code ban đầu không còn nằm nguyên dạng trong file .exe hoặc .dll. Tuy nhiên, assembly .NET vẫn chứa IL (Intermediate Language) và metadata của chương trình. Reflector có thể sử dụng những thông tin này để hiển thị lại code ở mức gần với source code ban đầu.
Ví dụ, một class trong assembly có thể được Reflector hiển thị như sau:
public class Customer
{
private int id;
public Customer(int id)
{
this.id = id;
}
public int GetId()
{
return id;
}
}
Đây là một tính năng rất hữu ích khi chúng ta cần kiểm tra một DLL nhưng không có source code đi kèm.
Xem cấu trúc của một Assembly
Sau khi mở file .dll hoặc .exe bằng Reflector, chương trình sẽ hiển thị cấu trúc của assembly theo dạng cây.
Ví dụ:
MyApplication.dll
|
+-- MyApplication
| |
| +-- Customer
| | +-- Customer()
| | +-- GetId()
| |
| +-- CustomerService
| +-- GetCustomer()
|
+-- MyApplication.Data
|
+-- CustomerRepository
Từ đây có thể xem được các class và method bên trong assembly mà không cần source code gốc.
Đối với các project lớn, chức năng này khá tiện lợi để tìm hiểu một thư viện .NET của bên thứ ba hoặc kiểm tra xem một DLL thực sự đang thực hiện những gì.
Decompile thành C#
Một trong những chức năng được sử dụng nhiều nhất của Reflector là decompile.
Thay vì chỉ xem IL, Reflector có thể biểu diễn IL thành C# hoặc ngôn ngữ ở mức cao hơn để lập trình viên dễ đọc.
Ví dụ một đoạn code:
public decimal Calculate(decimal price, int quantity)
{
return price * quantity;
}
sau khi compile sẽ không còn được lưu dưới đúng dạng source code này. CLR sẽ làm việc với IL và metadata.
Reflector phân tích assembly và hiển thị lại logic tương ứng:
Assembly
↓
Metadata + IL
↓
.NET Reflector
↓
C# representation
Do đó, Reflector thường được dùng để debug, nghiên cứu thư viện và tìm hiểu các component .NET.
Trường hợp mất source code
Một trường hợp khá thực tế là có một ứng dụng cũ chỉ còn:
Application.exe
SomeLibrary.dll
DataAccess.dll
Business.dll
nhưng source code đã bị mất hoặc không còn đầy đủ.
Nếu các assembly vẫn có thể đọc được, Reflector có thể giúp developer tìm hiểu lại cấu trúc của chương trình.
Chẳng hạn cần tìm xem một method nào đó xử lý dữ liệu như thế nào:
Business.dll
↓
CustomerService
↓
GetCustomer()
↓
CustomerRepository
Developer có thể lần theo các class và method trong Reflector để xác định logic xử lý.
Điều này đặc biệt hữu ích khi maintain các hệ thống .NET cũ hoặc khi phải làm việc với một component mà tài liệu không đầy đủ.
Reflector Add-ins
Một ưu điểm khác của Reflector là khả năng mở rộng thông qua Add-ins.
Các add-in cho phép bổ sung thêm chức năng cho Reflector và phục vụ những nhu cầu phân tích khác nhau.
Thời điểm đó, các add-in cho Reflector được cộng đồng .NET phát triển và chia sẻ, trong đó có dự án Reflector Addins trên CodePlex.
CodePlex khi đó là một trong những nơi khá phổ biến để tìm kiếm các project và extension mã nguồn mở dành cho hệ sinh thái Microsoft.
Một số lưu ý
Cần lưu ý rằng decompile không có nghĩa là lấy lại chính xác 100% source code ban đầu.
Các thông tin như comment, format code, tên một số biến local và cấu trúc source ban đầu có thể đã bị mất trong quá trình compile.
Ví dụ source ban đầu có thể là:
int totalPrice = price * quantity;
return totalPrice;
nhưng sau khi decompile có thể chỉ còn:
return price * quantity;
Logic tương đương nhưng source code không hoàn toàn giống nhau.
Ngoài ra, nếu assembly được sử dụng obfuscator thì việc đọc và decompile cũng sẽ khó khăn hơn.
Kết luận
NET Reflector 7 Beta 1 là một công cụ rất đáng chú ý đối với developer .NET trong việc browse, inspect và decompile các assembly .NET.
Nếu bạn đang làm việc với một DLL không có source code, muốn tìm hiểu một component của bên thứ ba, debug một thư viện hoặc đơn giản là muốn xem bên trong một assembly .NET có những gì, Reflector là một công cụ rất hữu ích.
Download:
NET Reflector:
http://reflector.red-gate.com/download.aspx?TreatAsUpdate=1
Reflector Add-ins:
http://reflectoraddins.codeplex.com/
Note: Việc decompile và sử dụng mã nguồn thu được cần tuân thủ license và quyền sở hữu trí tuệ của phần mềm được phân tích.