2010-07-24 6 views
97

Tôi mới sử dụng chương trình .NET C#. Tôi đang theo dõi vài cuốn sách. Người ta nói rằng thay vì biên dịch trực tiếp sang mã nhị phân (mã gốc). Mã cấp cao được chuyển thành ngôn ngữ trung gian (gọi là MSIL aka CIL). Nhưng khi tôi biên dịch, tôi nhận được một tập tin exe/Dll.Làm thế nào tôi có thể xem MSIL/CIL được tạo bởi trình biên dịch C#? Tại sao nó được gọi là lắp ráp?

  1. MSIL/CIL này có bị nhiễm trong tệp exe/dll này không?
  2. Tôi muốn xem mã ngôn ngữ trung gian đó. Chỉ để có được cảm giác về sự tồn tại của nó. Làm thế nào để xem nó?
  3. Họ đang gọi tệp exe/dll này là assembly. Có phải họ đang sử dụng từ "ưa thích" này để phân biệt chúng với các tệp exe/dll có chứa mã nhị phân (mã gốc) không?

Trả lời

76
  1. Có, chính xác hơn trong phần .text của PE file (portable executable = * .exe hoặc * .dll). Bạn có thể tìm thêm thông tin here.
  2. Lựa chọn tốt nhất là sử dụng ILSpy (Trình phản chiếu không còn miễn phí). Đó là một bộ tách rời miễn phí có thể tháo rời lắp ráp của bạn thành MSIL nhưng cũng C#, VB (ở một mức độ nào đó). .NET Framework SDK chứa ILDasm, là trình giải mã MSIL chính thức.
  3. Về cơ bản có. Hội đồng là một tệp chứa mã MSIL và siêu dữ liệu tương ứng. Điều này không bị hạn chế đối với các tệp PE, nhưng tất cả các triển khai CLR hiện tại đều sử dụng chúng.

Nếu tôi có thể giới thiệu một cuốn sách hay về vấn đề đó, đó là Expert .NET 2.0 IL Assembler by Serge Lidin. Anh ấy là người thiết kế MSIL.

+0

Chờ đã! Nó không nằm trong '.text' sextion? Nếu không, nội dung '.text' có chứa gì? và whats up với '#' Tôi nghĩ rằng phần được đặt tên bắt đầu bằng '.'. Vì vậy, nó không phải là '.strings' –

+0

Tôi tò mò, tại sao [ILDasm] (https://docs.microsoft.com/en-us/dotnet/framework/tools/ildasm-exe-il-disassembler) không được khuyến khích? Nó chỉ bao gồm (một số phiên bản?) Visual Studio? – Sinjai

+0

Cả hai đều có địa điểm của họ, nhưng đối với hầu hết (> 99,99%) người dùng ILSpy là lựa chọn đúng đắn. Khả năng biên dịch mã IL trở lại C# ist vô giá để nhanh chóng điều hướng và hội đồng kỹ thuật đảo ngược. Nếu bạn đang làm bất cứ điều gì phát ra nguyên IL (ví dụ bạn đang viết một trình biên dịch hoặc viết lại IL, ví dụ như với Mono.Cecil) thì ILDasm có ích vì nó có thể cho bạn thấy cấu trúc thô của IL, các bảng token… , hầu hết các chuyên gia không phải IL sẽ bị nhầm lẫn bởi những người, vì vậy ILSpy có lẽ là tất cả những gì bạn muốn và cần. –

7

Trong nhiều khía cạnh, hội đồng .NET tương tự như gói Java bytecode.

  1. Có. Chúng cũng chứa các tệp kê khai và các dữ liệu khác, nhưng CIL là một phần của tệp exe/dll.
  2. Sử dụng ILDasm hoặc Reflector - hầu hết mọi người đều nói Reflector, vì nó mạnh hơn nhiều. Cả hai sẽ cho bạn thấy những gì CIL đã được sản xuất. Wikipedia có một danh sách của tất cả các CIL instructions, cho một cảm giác tốt hơn (nó được lắp ráp như thế).
  3. Tôi đoán nó có nghĩa là một tập hợp mã. Một cách tốt để phân biệt nó với nguồn gốc.
11
  1. Có nó được lắp ráp.
  2. Bạn cần .NET Reflector hoặc ILDasm.
  3. Thêm chi tiết về kiểm tra lắp ráp HERE.

P.S Khi bạn đang theo dõi một số sách, tôi sẽ đánh giá cao bạn CLR via C#.

2

Từ kinh nghiệm của tôi, nguồn kiến ​​thức liên quan đến IL tốt nhất là Andrew Troelsen “Pro C# và .NET Platform”. Bắt đầu từ phiên bản thứ 3, anh ta thực sự có một chương thực sự nổi bật (khoảng 50 trang) về cách hiểu IL và thậm chí viết mã của riêng bạn và sử dụng ILAsm. Tôi đã sử dụng thông tin đó để điều tra xem có nhiều thừa kế tồn tại trong thế giới .NET không. Ngoài ra, bạn có thể thử sử dụng một số tính năng rất thú vị trong IL (ví dụ: lọc ngoại lệ chỉ tồn tại trong VB nhưng không tồn tại trong C#).

Tôi đặc biệt khuyên bạn nên đọc chương đó.

Cuối cùng, .NET Reflector là tiêu chuẩn doanh nghiệp để điều tra mã IL của hội đồng và sách của Richter chắc chắn là "phải đọc" nội dung. Nhưng từ những cuốn sách khác như đã đề cập ở trên, bạn có thể tiết lộ những điều thực sự hữu ích :)

Có, mỗi assembly trong thế giới .NET chứa một số mã IL (cùng với biểu hiện) có thể được xem qua Reflector hoặc ILDasm. Thậm chí nhiều hơn, Reflector có thể cho bạn thấy mã C# và VB được tối ưu hóa. Điều này có nghĩa là bất kỳ người nào cũng có thể xem mã nguồn của một hội đồng và đó là lý do tại sao trong các sản phẩm thương mại obfuscators được sử dụng.

39

Một trong những cách yêu thích của tôi để xem IL cho một đoạn mã của C# là sử dụng miễn phí LINQPad tool. Sau khi nhập một số mã và chọn "C# báo cáo" ở đầu (hoặc "C# Chương trình", nào phù hợp), bấm vào nút "IL" dưới khu vực nhập mã, và bạn sẽ thấy IL tạo ra.

Sử dụng LINQPad cho điều này là nhiều hơn thuận tiện hơn tải lên Visual Studio hoặc chạy trình biên dịch từ dòng lệnh, sau đó tải lên ILDASM và mở tệp .il bằng trình chỉnh sửa văn bản.

+0

Một công cụ tốt khác là trình bổ sung Snippy cho Trình phản xạ: http://jasonhaley.com/blog/post/2008/11/23/ReflectorSnippy-Addin.aspx –

5

Tôi biết đây là câu hỏi cũ và tôi thích bất kỳ công cụ nào ở trên. Tuy nhiên, trong một pinch, đã có một người xem MSIL trong hộp với Visual Studio ít nhất là từ năm 2005. Version

Công cụ này được đặt tên ildasm.exe, và nằm trong các thư mục sau đây sau khi mặc định cài đặt Visual Studio:

Visual Studio 2005 "C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\ildasm.exe"

Visual Studio 2008 " C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\ildasm.exe "

Visual Studio 2010 " C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\ildasm.exe "

Để biết thêm thông tin, hãy xem: "How to: View Assembly Contents" trong Thư viện MSDN.

2

Tôi muốn xem ngôn ngữ trung gian, Thử tải xuống JustDecompile from Telerik (Tiện ích nào hiện đang miễn phí, yêu cầu đăng ký).

Kéo tệp DLL của bạn và chọn IL từ hộp thả xuống ở trên cùng!

14

Nếu bạn muốn trực tuyến, .NET Fiddle thật tuyệt vời. Chỉ cần dán mã của bạn và nhấp vào tùy chọn View IL ở trên cùng bên phải.

6

Tôi vừa dành một vài giờ để tìm kiếm công cụ tốt nhất có thể cho phép tôi xem mã IL trực tiếp bên trong Visual Studio.

Giải pháp duy nhất tôi tìm thấy cho đến nay là Msiler https://visualstudiogallery.msdn.microsoft.com/60fc53d4-e414-461b-a27c-3d5d2a53f637

nó hoạt động khá tốt!

Nếu không, giải pháp tốt nhất thứ hai, nhưng không tích hợp phòng thu trực quan, là JetBrains dotPeek, điều này khá tuyệt vời.

6

Một lựa chọn khác: Sử dụng ReSharper

enter image description here Nguồn/IL đồng bộ hóa xem: trái dòng nền màu xanh tương ứng với quyền IL Khối

Trong Visual Studio:

  • Chọn ReSharper | Windows | Trình xem IL
  • hoặc Trình đơn ngữ cảnh: Điều hướng | Mã IL

Hỗ trợ chế độ xem được đồng bộ hóa của mã nguồn và IL - khi bạn bấm vào một câu lệnh trong nguồn, khối tương ứng trong IL được tô sáng (và ngược lại). Hiển thị mô tả cho IL từ Mạng nhà phát triển Microsoft và tập lệnh "Ngôn ngữ chung trung gian (CIL)" từ đặc tả tiêu chuẩn ECMA.

xem Viewing Intermediate Language (IL) trong Trợ giúp chia sẻ lại. Hình trên là từ Resharper Help.

tùy chọn miễn phí là sử dụng Jetbrains dotPeek

xem thêm: "Khám phá Intermediate Language (IL) với ReSharper và dotPeek", bởi Maarten Balliauw, January 19, 2017-Jetbrains Blog

+0

Đã đánh dấu nhầm câu trả lời của bạn. Chỉnh sửa nó để tôi có thể upvote –