Як я можу переглянути MSIL / CIL, створений компілятором C #? Чому це називається збіркою?


130

Я новачок у програмуванні .NET C #. Я стежу за кількома книгами. Кажуть, що замість того, щоб компілювати його безпосередньо у двійковий код (Native code). Код високого рівня перетворюється на проміжну мову (називається MSIL aka CIL). Але коли я компілюю, я отримую файл exe / Dll.

  1. Чи міститься цей MSIL / CIL у файлі exe / dll?
  2. Я хочу побачити цей проміжний код мови. Тільки щоб відчути його існування. Як його переглянути?
  3. Вони називають цей файл exe / dll assembly. Вони використовують це "фантазійне слово" просто для того, щоб відрізнити їх від файлів exe / dll, що містять двійковий код (нативний код)?

Відповіді:


95
  1. Так, точніше в .textрозділі файлу PE (портативний виконуваний файл = * .exe або * .dll). Більше інформації можна знайти тут .
  2. Найкращий вибір - використовувати ILSpy (Reflector вже не безкоштовний). Це безкоштовний розбирач, який може демонтувати вашу збірку на MSIL, але також і C #, VB (певною мірою). .NET Framework SDK містить ILDasm, який є офіційним розбиральником MSIL.
  3. В основному так. Збірка - це файл, що містить код MSIL та відповідні метадані. Це не обмежується лише файлами PE, але всі поточні реалізації CLR використовують їх.

Якщо я можу порекомендувати гарну книгу з цього приводу, це експерт .NET 2.0 IL Assembler від Сергія Лідіна. Він хлопець, який сконструював MSIL.


Зачекайте! Він не розташований у .textстатевому акті? Якщо ні, що .textмістить? і що з того, що #я думав, розділи названі починаючи з .. Так souldn't це буде.strings

Мені цікаво, чому ILDasm не рекомендується? Чи входить він лише у (деякі версії?) Visual Studio?
Сінджай

2
В обох є свої місця, але для більшості (> 99,99%) користувачів ILSpy - це правильний вибір. Його здатність декомпілювати IL-код назад до C # ist неоціненна для швидкої навігації та зворотної інженерії. Якщо ви робите що-небудь, що випускає необроблений IL (наприклад, ви пишете компілятор або переписуєте збірку IL, наприклад, з Mono.Cecil), ILDasm стане в нагоді, оскільки він може показати вам необроблену структуру IL, таблиці токенів тощо. , більшість експертів, що не стосуються ІЛ, будуть плутати їх, тому ILSpy - це, мабуть, все, що вам потрібно і потрібно.
Йоганнес Рудольф

3
Ого, швидка відповідь через 7 років! Я не сильно заплутувався з IL або не порівнював усі варіанти (саме тому я прошу в першу чергу), але чи LINQPad не має цієї функції декомпіляції?
Сінджай

Я встановив його в VS 2017, нічого не трапиться, коли натискаю, щоб побачити код в ILSPY.
Анірудха Гупта

46

Один з моїх улюблених способів побачити IL для фрагмента C # - це використовувати безкоштовний інструмент LINQPad . Ввівши якийсь код і вибравши "C # заяви" у верхній частині (або "Програма C #", залежно від того, що підходить), натисніть кнопку "IL" в області введення коду, і ви побачите створений ІЛ.

Використовувати для цього LINQPad набагато зручніше, ніж завантажувати Visual Studio або запускати компілятор з командного рядка, потім завантажувати ILDASM і відкривати файл .il за допомогою текстового редактора.


Ще одним хорошим інструментом є надбудова Snippy
Thomas Levesque

Хороший! Я голосував, але це трохи складніше, якщо вам доведеться включати будь-які спеціальні класи. Все-таки мені дуже подобається цей!
Ендрю Штайц

28

Якщо ви хочете його в Інтернеті, .NET Fiddle - це чудово. Просто вставте свій код і натисніть View ILопцію вгорі праворуч.


2
Здається, зараз зламаний.
Лука Маурер

@nawfal також прорвався сюди. Раніше я його використовував.
aloisdg переходить на codidact.com

Однак є ще одне онлайн-рішення: sharplab.io . Перевірте цей відповідь для отримання додаткової інформації: stackoverflow.com/a/51457583/1248177
aloisdg переходу до codidact.com

Не знаю, у чому проблема, добре працює для мене .. @ aloisdgmovingtocodidact.com. Це сказав sharplab.io виглядає гладко, дякую, що
вказали

16

Інший варіант: Використовуйте ReSharper

введіть тут опис зображення Джерело / ІЛ синхронізований вигляд: ліва синя лінія фону відповідає правому блоку IL

У Visual Studio:

  • Виберіть ReSharper | Windows | IL Viewer
  • або контекстне меню: Навігація | Код ІЛ

Підтримує синхронізований вигляд вихідного коду та IL - при натисканні на заяву в джерелі відповідний блок в IL виділяється (і навпаки). Відображає описи ІР із мережі розробників Microsoft та набір інструкцій загального проміжного мови (CIL) із стандартної специфікації ECMA.

див. перегляд проміжної мови (IL) у довідці Resharper. Зображення вище - з довідки Resharper.

Безкоштовний варіант - використання Jetbrains dotPeek

див. також: "Вивчення проміжних мов (IL) за допомогою ReSharper та dotPeek", автор Маартен Балльо, 19 січня 2017 р. - Блог Jetbrains


Помилково відхилили вашу відповідь. Відредагуйте його, щоб я міг подати заяву
Рудреша Парамешаппа

IL Viewer в ReSharper чудовий. Якщо навести курсор миші на синтаксис IL, він відображає досить описові підказки, які пояснюють, що робить кожне ключове слово. Чудово підходить для нових людей в ІЛ!
InvalidBrainException



9

Шарплаб sharplab - це онлайн-інструмент, чудовий для простих випадків використання. Введіть код зліва, IL - праворуч.


Найкращий інструмент коли-небудь +1
Емад

7

Багато в чому .NET збірки схожі на пакети байт-кодів Java.

  1. Так. Вони також містять маніфести та інші дані, але CIL є частиною exe / dll.
  2. Використовуйте ILDasm або Reflector - більшість людей сказали б Reflector, оскільки він набагато потужніший. Обидва покажуть, що CIL було вироблено. У Вікіпедії є список усіх інструкцій CIL , для кращого відчуття (це як збірка).
  3. Я думаю, це розуміється як збірка коду. Хороший спосіб відрізнити його від рідного.

7

Я щойно витратив пару годин на пошуки найкращого інструменту, який міг би дозволити мені переглянути IL-код прямо у Visual Studio.

Єдине рішення, яке я знайшов поки що - це Msiler https://visualstudiogallery.msdn.microsoft.com/60fc53d4-e414-461b-a27c-3d5d2a53f637

це працює досить добре!

Інакше другим найкращим рішенням, але без візуальної інтеграції студії, є JetBrains dotPeek, що є надзвичайно чудовим, якщо бути чесним.


5

Я знаю, що це давнє питання, і я вважаю за краще будь-який із наведених вище інструментів. Однак, у крайньому випадку, у вікні з Visual Studio був переглядач MSIL, щонайменше, з версії 2005 року.

Інструмент названий ildasm.exeта розташований у таких папках після встановлення 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"

Для отримання додаткової інформації дивіться: " Як: Переглянути зміст складання " в бібліотеці MSDN.


2

З мого досвіду найкращим джерелом знань, пов'язаних з ІЛ, є Ендрю Трольсен «Pro C # і .NET Platform». Починаючи з 3-го видання, у нього є дійсно, дійсно видатна глава (приблизно 50 сторінок) про те, як зрозуміти IL і навіть написати власний код та використовувати ILAsm. Я використовував цю інформацію, щоб дослідити, чи існує багатократне успадкування у світі .NET. Крім того, ви можете спробувати використовувати деякі дуже цікаві функції в IL (наприклад, фільтрація винятків, яка існує лише у VB, але не в C #).

Я настійно рекомендую прочитати цю главу.

Врешті-решт, .NET Reflector - це корпоративний стандарт для дослідження коду IL в зборах, і книга Ріхтера, безумовно, "обов'язково читати" речі. Але з інших згаданих вище книг ви могли б виявити справді корисні речі :)

Так, кожна збірка у світі .NET містить якийсь код IL (разом із маніфестом), який можна переглянути через Reflector або ILDasm. Навіть більше, Reflector може показати вам код, оптимізований під C # та VB. Це означає, що будь-яка людина могла переглянути вихідний код збірки, і тому в комерційних продуктах використовуються обскусатори.


2

Я хочу переглянути проміжну мову. Спробуйте завантажити JustDecompile з Telerik (який наразі безкоштовний, хоча потрібна реєстрація).

Перетягніть DLL і виберіть ILспадне поле вгорі!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.