Làm cách nào tôi có thể xem MSIL / CIL được tạo bởi trình biên dịch C #? Tại sao gọi là lắp ráp?


130

Tôi mới sử dụng lập 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 nó trực tiếp thành mã nhị phân (mã gốc). Mã cấp cao được chuyển đổi sang ngôn ngữ trung gian (được gọi là MSIL aka CIL). Nhưng khi tôi biên dịch, tôi nhận được một tệp exe / DLL.

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

Câu trả lời:


95
  1. Đúng vậy, chính xác hơn là trong .textphần của tệp PE (tệp thực thi di động = * .exe hoặc * đậm). Thêm thông tin có thể được tìm thấy ở đây .
  2. Sự lựa chọn tốt nhất là sử dụng ILSpy (Reflector không còn miễn phí). Đó là một trình phân tách miễn phí có thể phân tách hội đồng của bạn thành MSIL mà còn C #, VB (ở một mức độ nào đó). .NET Framework SDK chứa ILDasm, đây là trình phân tích MSIL chính thức.
  3. Về cơ bản là có. Tập hợp 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 mỗi se, 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ũng có thể giới thiệu một cuốn sách hay về vấn đề đó, thì đó là Expert .NET 2.0 IL Trình biên dịch của Serge Lidin. Anh ấy là người đã thiết kế MSIL.


Chờ đợi! Nó không nằm trong .textgiới tính? Nếu không, cái gì .textchứa? và những gì với phần #tôi nghĩ được đặt tên bắt đầu bằng .. Vì vậy, không phải vậy.strings

Tôi tò mò, tại sao ILDasm không được khuyến nghị? Có phải nó chỉ được bao gồm với (một số phiên bản của?) Visual Studio?
Sinjai

2
Cả hai đều có vị trí của họ, nhưng đối với hầu hết (> 99,99%) người dùng ILSpy là lựa chọn phù hợp. Khả năng dịch ngược mã IL của nó trở lại C # ist vô giá để điều hướng nhanh chóng và lắp ráp kỹ thuật đảo ngược. Nếu bạn đang làm bất cứ điều gì phát ra IL thô (ví dụ: bạn đang viết trình biên dịch hoặc viết lại lắp ráp IL, ví dụ như với Mono.Cecil) thì ILDasm sẽ có ích vì nó có thể hiển thị cho bạn cấu trúc thô của IL, bảng mã thông báo, v.v. , hầu hết các chuyên gia không thuộc 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.
Julian Rudolph

3
Wow, phản ứng nhanh chóng 7 năm sau! Tôi đã không nhầm lẫn với IL nhiều, hoặc so sánh tất cả các tùy chọn (đó là lý do tại sao tôi hỏi ngay từ đầu), nhưng LINQPad không có tính năng dịch ngược này?
Sinjai

Tôi đã cài đặt nó trong VS 2017, không có gì xảy ra khi tôi nhấp vào để xem mã trong ILSPY.
Anirudha Gupta

46

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

Sử dụng LINQPad cho điều này là nhiều thuận tiện hơn so với 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 tin .il với một trình soạn thảo văn bản.


Một công cụ tốt khác là bổ trợ Snippy cho Reflector: jasonhaley.com/blog/post/2008/11/23/ReflectorSnippy-Addin.aspx
Thomas Levesque

Đẹp quá Tôi đã bình chọn nhưng sẽ phức tạp hơn một chút nếu bạn phải bao gồm bất kỳ lớp tùy chỉnh nào. Tuy nhiên, tôi thực sự thích cái này!
Andrew Steitz

28

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


2
Có vẻ như bị phá vỡ bây giờ.
Luke Maurer

@nawfal đã phá vỡ ở đây quá. Tôi đã từng sử dụng nó.
aloisdg chuyển đến codidact.com

Có một giải pháp trực tuyến khác: sharplab.io . Kiểm tra câu trả lời này để biết thêm thông tin: stackoverflow.com/a/51457583/1248177
aloisdg chuyển sang codidact.com

Không chắc vấn đề là gì, hoạt động tốt với tôi .. @ aloisdgmovingtocodidact.com. Điều đó nói rằng sharplab.io trông lắt léo, cảm ơn vì đã chỉ ra :)
nawfal

16

Tùy chọn khác: Sử dụng ReSharper

nhập mô tả hình ảnh ở đây Chế độ xem được đồng bộ hóa nguồn / IL: dòng nền màu xanh bên trái tương ứng với Khối IL bên phải

Trong Visual Studio:

  • Chọn ReSharper | Windows | Trình xem IL
  • hoặc Menu 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 nhấp vào 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ị các mô tả cho IL từ Microsoft Developer Network và "Tập lệnh ngôn ngữ trung gian chung (CIL)" từ thông số kỹ thuật tiêu chuẩn ECMA.

xem Xem Ngôn ngữ trung gian (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á ngôn ngữ trung gian (IL) với ReSharper và dotPeek", bởi Maarten Balliauw, ngày 19 tháng 1 năm 2017 - Blog Jetbrains


Sai lầm hạ thấp câu trả lời của bạn. Chỉnh sửa nó để tôi có thể nâng cấp
Rudresha Parameshappa

Trình xem IL trong ReSharper rất tuyệt. Nếu bạn di chuột qua cú pháp IL, nó sẽ hiển thị các chú giải công cụ khá mô tả giải thích mỗi từ khóa đang làm gì. Tuyệt vời cho những người mới biết đến IL!
UnlimitedBrainException


11

Tôi tin rằng chúng được gọi là "tập hợp" bởi vì tập hợp là một tập hợp các mô-đun, được lắp ráp với nhau bởi một bảng kê khai.

lắp ráp nhiều tập tin
(nguồn: microsoft.com )

Xem nội dung hội để biết chi tiết.


9

Sharplab sharplab là một công cụ trực tuyến, tuyệt vời cho các trường hợp sử dụng đơn giản. Nhập mã của bạn ở bên trái, IL hiển thị bên phải.


Công cụ tốt nhất từng có +1
Emad

7

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

  1. Đúng. Chúng cũng chứa các bảng kê khai và dữ liệu khác, nhưng CIL là một phần của exe / dll.
  2. Sử dụng ILDasm hoặc Reflector - hầu hết mọi người sẽ 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 tất cả các hướng dẫn CIL , để có cảm giác tốt hơn (nó giống như lắp ráp).
  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 bản địa.

7

Tôi vừa dành 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 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!

Mặt khác, giải pháp tốt nhất thứ hai, nhưng không có tích hợp phòng thu trực quan, là JetBrains dotPeek, một điều khá tuyệt vời để thành thật.


5

Tôi biết đây là một 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 tình huống khó khăn, đã có một trình xem MSIL trong hộp với Visual Studio kể từ ít nhất là Phiên bản 2005.

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

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

Phòng thu hình ảnh 2008 " C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\ildasm.exe"

Phòng thu hình ảnh 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: " Cách: Xem nội dung hội " trong Thư viện MSDN.


2

Từ kinh nghiệm của tôi, nguồn kiến ​​thức tốt nhất liên quan đến IL là Andrew Troelsen trộm Pro C # và .NET Platform. Bắt đầu từ phiên bản thứ 3, anh ta có một chương thực sự, 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 kế thừa tồn tại trong thế giới .NET hay 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 các ngoại lệ chỉ tồn tại trong VB nhưng không có trong C #).

Tôi rất khuyên bạn nên đọc chương đó.

Cuối cùng, .NET Reflector là một tiêu chuẩn doanh nghiệp để điều tra mã IL của các hội đồng và cuốn sách của Richter chắc chắn là thứ "phải đọc". 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 hội đồng trong thế giới .NET chứa một số mã IL (cùng trang web với bảng kê khai) có thể được xem qua Reflector hoặc ILDasm. Thậm chí, Reflector còn có thể hiển thị cho bạn mã được tối ưu hóa C # và VB. Điều này có nghĩa là bất kỳ ai 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.


2

Tôi muốn xem ngôn ngữ trung gian, Hãy thử tải xuống JustDecompile từ Telerik (Hiện tại miễn phí, yêu cầu phải đăng ký).

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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.