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

130

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

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

Ответы:

95
  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 от Сержа Лидина. Он парень, который разработал MSIL.

Йоханнес Рудольф
источник
Подождите! Не находится в .textсекстион? Если нет, что там .textсодержится? и как дела, #я думал, что разделы названы, начиная с .. Так не может быть.strings
Мне любопытно, почему не рекомендуется использовать ILDasm ? Включено ли оно только в (некоторые версии?) Visual Studio?
Sinjai
2
У обоих есть свои места, но для большинства (> 99,99%) пользователей ILSpy - правильный выбор. Его способность декомпилировать код IL обратно в C # неоценима для быстрой навигации и обратного проектирования сборок. Если вы делаете что-то, что испускает чистый IL (например, вы пишете компилятор или переписываете сборочный IL, например, с помощью Mono.Cecil), то ILDasm пригодится, потому что он может показать вам необработанную структуру IL, таблицы токенов и т. Д. , большинство экспертов, не связанных с IL, будут сбиты с толку этим, поэтому ILSpy, вероятно, все, что вам нужно и нужно.
Johannes Rudolph
3
Ух ты, быстрый ответ 7 лет спустя! Я не особо связывался с IL и не сравнивал все варианты (именно поэтому я спрашиваю в первую очередь), но разве LINQPad не имеет этой функции декомпиляции?
Sinjai
Я установил его в VS 2017, при нажатии на код в ILSPY ничего не происходит.
Anirudha Gupta
46

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

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

Марк Рушаков
источник
Еще один хороший инструмент - надстройка Snippy для Reflector: jasonhaley.com/blog/post/2008/11/23/ReflectorSnippy-Addin.aspx
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 выглядит гладко, спасибо за указание :)
nawfal
16

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

введите описание изображения здесь Синхронизированный вид источника / IL: левая синяя фоновая линия соответствует правому блоку IL

В Visual Studio:

  • Выберите ReSharper | Windows | Просмотрщик IL
  • или контекстное меню: переход | Кодекс IL

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

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

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

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

Майкл Брукс
источник
Ошибочно проголосовали против вашего ответа. Отредактируйте его, чтобы я мог проголосовать за
Рудреша Парамешаппа
IL Viewer в ReSharper великолепен. Если вы наведете курсор на синтаксис IL, он покажет довольно информативные всплывающие подсказки, объясняющие, что делает каждое ключевое слово. Отлично подходит для новичков в IL!
InvalidBrainException
12
  1. Да, это в сборке.
  2. Вам нужен .NET Reflector или ILDasm .
  3. Подробнее о сборке читайте ЗДЕСЬ .

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

Инкогнито
источник
11

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

многофайловая сборка
(источник: microsoft.com )

Подробности см. В разделе « Содержимое сборки» .

Джон Сондерс
источник
9

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

Colin
источник
Лучший инструмент на свете +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, что, честно говоря, довольно круто.

Sebas
источник
5

Я знаю, что это старый вопрос, и я бы предпочел любой из перечисленных выше инструментов. Однако, в крайнем случае, программа просмотра 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.

bopapa_1979
источник
2

По моему опыту, лучший источник знаний, связанных с IL, - это Andrew Troelsen «Pro C # and .NET Platform». Начиная с 3-го издания, у него действительно, действительно выдающаяся глава (около 50 страниц) о том, как понимать IL и даже писать свой собственный код и использовать ILAsm. Я использовал эту информацию, чтобы выяснить, существует ли множественное наследование в мире .NET. Также вы можете попробовать использовать некоторые очень интересные функции в IL (например, фильтрацию исключений, которая существует только в VB, но не в C #).

Я очень рекомендую прочитать эту главу.

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

Да, каждая сборка в мире .NET содержит некоторый код IL (вместе с манифестом), который можно просмотреть через Reflector или ILDasm. Более того, Reflector может показать вам код, оптимизированный для C # и VB. Это означает, что любой человек может просмотреть исходный код сборки, поэтому в коммерческих продуктах используются обфускаторы.

xenn_33
источник
2

Если вы хотите просмотреть промежуточный язык, попробуйте загрузить JustDecompile с Telerik (который в настоящее время бесплатен, однако требует регистрации).

Перетащите свою DLL и выберите ILиз раскрывающегося списка вверху!

Люк
источник