Как я могу просмотреть MSIL / CIL, сгенерированный компилятором C #? Почему это называется сборка? - PullRequest
117 голосов
/ 24 июля 2010

Я новичок в программировании на .NET C #. Я слежу за несколькими книгами. Говорят, что вместо того, чтобы компилировать его непосредственно в двоичный код (нативный код). Код высокого уровня преобразуется в промежуточный язык (называемый MSIL или CIL). Но когда я компилирую, я получаю файл exe / Dll.

  1. Содержится ли этот MSIL / CIL в этих файлах exe / dll?
  2. Я хочу увидеть этот промежуточный код языка. Просто чтобы почувствовать его существование. Как посмотреть?
  3. Они называют этот exe / dll файл assembly. Используют ли они это «причудливое слово» просто для того, чтобы отличать их от файлов exe / dll, содержащих двоичный код (нативный код)?

Ответы [ 13 ]

89 голосов
/ 24 июля 2010
  1. Да, точнее, в разделе .text PE-файла (переносимый исполняемый файл = * .exe или * .dll).Дополнительную информацию можно найти здесь .
  2. . Лучший выбор - использовать ILSpy (Reflector больше не бесплатен).Это бесплатный дизассемблер, который может разбирать вашу сборку на MSIL, а также на C #, VB (в некоторой степени)..NET Framework SDK содержит ILDasm, который является официальным дизассемблером MSIL.
  3. В основном да.Сборка - это файл, который содержит код MSIL и соответствующие метаданные.Это не ограничивается PE-файлами как таковыми, но все текущие реализации CLR используют их.

Если можно порекомендовать хорошую книгу по этому вопросу, то это Expert .NET 2.0 IL Assembler от Serge Lidin.Он парень, который разработал MSIL.

46 голосов
/ 25 июля 2010

Один из моих любимых способов увидеть IL для фрагмента C # - использовать бесплатный LINQPad tool .После ввода некоторого кода и выбора «операторов C #» вверху (или «Программы C #», в зависимости от того, что подходит), нажмите кнопку «IL» под областью ввода кода, и вы увидите сгенерированный IL.

Использование LINQPad для этого намного удобнее, чем загрузка Visual Studio или запуск компилятора из командной строки, затем загрузка ILDASM и открытие файла .il с помощью текстового редактора.

23 голосов
/ 30 июня 2015

Если вы хотите онлайн, .NET Fiddle отлично.Просто вставьте свой код и нажмите View IL в правом верхнем углу.

12 голосов
/ 24 июля 2010
  1. Да, это в сборке.
  2. Вам нужен .NET Reflector или ILDasm .
  3. Подробнее о проверке сборки ЗДЕСЬ .

P.S. Поскольку вы читаете несколько книг, я настоятельно рекомендую вам CLR через C # .

11 голосов
/ 08 марта 2017

Другой вариант: использовать ReSharper

enter image description here Вид источника / синхронизированного IL: левая синяя линия фона соответствует правой блокировке IL

В Visual Studio:

  • Выберите ReSharper | Windows | IL Viewer
  • или контекстное меню: навигация | IL код

Поддерживает синхронизированное представление исходного кода и IL - когда вы нажимаете на оператор в источнике, соответствующий блок в IL выделяется (и наоборот). Отображает описания для IL из Microsoft Developer Network и «Набор команд Common Intermediate Language (CIL)» из спецификации стандарта ECMA.

см. Просмотр промежуточного языка (IL) в справке Resharper. Изображение выше из справки Resharper.

Бесплатным вариантом является использование Jetbrains dotPeek

см. Также: «Изучение промежуточного языка (IL) с помощью ReSharper и dotPeek», Мартен Баллиау, 19 января 2017 г. - Блог Jetbrains

11 голосов
/ 25 июля 2010

Я считаю, что их называют "сборками", потому что сборка - это набор модулей, собранных вместе с помощью манифеста.

многофайловая сборка http://i.msdn.microsoft.com/dynimg/IC125851.gif

Подробнее см. Содержимое сборки .

7 голосов
/ 25 декабря 2015

Я только что потратил пару часов в поисках лучшего инструмента, который позволил бы мне просматривать код IL непосредственно в Visual Studio.

Единственное решение, которое я нашел до сих пор, - это Msiler https://visualstudiogallery.msdn.microsoft.com/60fc53d4-e414-461b-a27c-3d5d2a53f637

это работает довольно хорошо!

В противном случае второе лучшее решение, но без визуальной студийной интеграции, - это JetBrains dotPeek, который, честно говоря, просто потрясающий.

7 голосов
/ 24 июля 2010

. Во многих отношениях сборки .NET аналогичны пакетам байт-кода Java.

  1. Да. Они также содержат манифесты и другие данные, но CIL является частью exe / dll.
  2. Используйте ILDasm или Reflector - большинство людей скажет Reflector, так как он намного мощнее. Оба покажут вам, что CIL был произведен. В Википедии есть список всех инструкций CIL , для лучшего восприятия (это похоже на сборку).
  3. Я думаю, это подразумевается как сборка кода. Хороший способ отличить его от родного.
5 голосов
/ 14 августа 2012

Я знаю, что это старый вопрос, и я бы предпочел любой из вышеперечисленных инструментов.Тем не менее, в крайнем случае, в окне имеется средство просмотра MSIL с Visual Studio по крайней мере начиная с версии 2005.

Инструмент называется ildasm.exe и располагается в следующих папках после установок 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 "

Подробнеесм. « Как просмотреть содержимое сборки » в библиотеке MSDN.

2 голосов
/ 21 июля 2018

Sharplab sharplab - это онлайн-инструмент, отлично подходящий для простых случаев использования.Введите код слева, IL появится справа.

...