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

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

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

13 ответов

Решение
  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.

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

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

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

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

Синхронное изображение источника / 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

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

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

http://i.msdn.microsoft.com/dynimg/IC125851.gif

См. Содержимое сборки для деталей.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Теперь есть другой вариант. Вы можете сделать это в VS Code с помощью этого расширения, созданного с помощью Roslyn. В настоящее время это ограничено.NET Core.

Другие вопросы по тегам