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

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

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

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

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

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

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

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

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

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

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

многопользовательская assembly http://i.msdn.microsoft.com/dynimg/IC125851.gif

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

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

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

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

введите описание изображения здесь Source / IL synced view: левая синяя линия фона соответствует правильному IL Block

В 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», Maarten Balliauw, 19 января 2017 г. – Блог Jetbrains

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

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

он работает очень хорошо!

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

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

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

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

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

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

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

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

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

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

  • Visual Studio «Не удалось скопировать» ... во время сборки
  • Ошибка в построении gradleа после обновления Android Studio с log4j
  • Visual Studio 2010: ссылочные сборки Ориентация на версию с более высокой версией
  • Как я могу перечислить все загруженные сборки?
  • Возможно ли одноуровневое многоязычное развертывание Windows Forms (ILMerge и спутниковые сборки / локализация)?
  • В чем разница между MOV и LEA?
  • Эффективное умножение матрицы 4x4 (C vs assembly)
  • Проверьте, равен ли регистр нулю с помощью CMP reg, 0 против OR reg, reg?
  • x86_64 - Условия сборки и выход из строя
  • Почему XCHG reg, reg 3 инструкции по микрооперации на современных архитектурах Intel?
  • Как точно работает инструкция x86 LOOP?
  • Давайте будем гением компьютера.