Как посмотреть MSIL / CIL, сгенерированный компилятором C#? Почему это называется сборка?
Я новичок в программировании на.NET C#. Я слежу за несколькими книгами. Говорят, что вместо того, чтобы компилировать его непосредственно в двоичный код (нативный код). Код высокого уровня преобразуется в промежуточный язык (называемый MSIL или CIL). Но когда я компилирую, я получаю файл exe/Dll.
- Содержится ли этот MSIL/CIL в этих файлах exe/dll?
- Я хочу увидеть этот промежуточный код языка. Просто чтобы почувствовать его существование. Как посмотреть это?
- Они называют этот файл exe/dll
assembly
, Используют ли они это "причудливое слово" просто для того, чтобы отличать их от файлов exe/dll, которые содержат двоичный код (нативный код)?
13 ответов
- Да, именно в
.text
раздел файла PE (переносимый исполняемый файл = *.exe или *.dll). Более подробную информацию можно найти здесь. - Лучший выбор - использовать ILSpy (Reflector больше не является бесплатным). Это бесплатный дизассемблер, который может разбирать вашу сборку на MSIL, а также на C#, VB (в некоторой степени)..NET Framework SDK содержит ILDasm, официальный дизассемблер MSIL.
- В основном да. Сборка - это файл, который содержит код 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 - это онлайн-инструмент, отлично подходящий для простых случаев использования. Введите код слева, IL появится справа.
Я считаю, что они называются "сборками", потому что сборка - это набор модулей, собранных вместе с помощью манифеста.
http://i.msdn.microsoft.com/dynimg/IC125851.gif
См. Содержимое сборки для деталей.
- Да, это в сборе.
- Вам нужен .NET Reflector или ILDasm.
- Подробнее о сборке смотрите ЗДЕСЬ.
PS Поскольку вы читаете некоторые книги, я настоятельно рекомендую вам CLR через C#.
Во многих отношениях сборки.NET похожи на пакеты байт-кода Java.
- Да. Они также содержат манифесты и другие данные, но CIL является частью exe/dll.
- Используйте ILDasm или Reflector - большинство людей скажет Reflector, так как он намного мощнее. Оба покажут вам, что CIL был произведен. Википедия имеет список всех инструкций CIL, для лучшего восприятия (это как сборка).
- Я думаю, это подразумевается как сборка кода. Хороший способ отличить его от родного.
Я только что провел пару часов в поисках лучшего инструмента, который позволил бы мне просматривать код 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.