Как я могу просмотреть MSIL/CIL, сгенерированный компилятором С#? Почему это называется сборкой?
Я новичок в программировании .NET С#. Я читаю несколько книг. Говорят, что вместо того, чтобы компилировать его непосредственно в двоичный код (Native code). Код высокого уровня преобразуется в промежуточный язык (называемый MSIL aka CIL). Но когда я компилирую, я получаю файл exe/dll.
- Этот MSIL/CIL содержится в этом файле exe/dll?
- Я хочу видеть этот код промежуточного языка. Просто чтобы почувствовать его существование. Как просмотреть его?
- Они вызывают этот exe/dll файл
assembly
. Используют ли они это "причудливое слово", чтобы отличать их от файлов exe/dll, содержащих двоичный код (собственный код)?
Ответы
Ответ 1
- Да, это более точно в разделе
.text
файла PE (переносимый исполняемый файл = *.exe или *.dll), Более подробную информацию можно найти здесь.
- Лучший выбор - использовать ILSpy (Reflector больше не свободен). Это бесплатный дизассемблер, который может разобрать вашу сборку в MSIL, но также С#, VB (в некоторой степени). SDK.NET Framework содержит ILDasm, который является официальным MSAS dissasembler.
- В принципе да. Сборка - это файл, содержащий код MSIL и соответствующие метаданные. Это не ограничивается файлами PE как таковыми, но все текущие реализации CLR используют их.
Если я могу порекомендовать хорошую книгу по этому вопросу, это Expert.NET 2.0 IL Assembler от Serge Lidin. Он парень, который проектировал MSIL.
Ответ 2
Один из моих любимых способов увидеть IL для фрагмента С# - использовать бесплатный инструмент
Использование LINQPad для этого гораздо удобнее, чем загрузка Visual Studio или запуск компилятора из командной строки, загрузка ILDASM и открытие файла .il с помощью текстового редактора.
Ответ 3
Если вы хотите его в Интернете, .NET Fiddle отлично. Просто вставьте код и нажмите View IL
в правом верхнем углу.
Ответ 4
P.S Поскольку вы следите за некоторыми книгами, я настоятельно рекомендую вам CLR через С#.
Ответ 5
Я считаю, что они называются "сборками", потому что сборка представляет собой набор модулей, собранных вместе манифестом.
сборка нескольких файлов http://i.msdn.microsoft.com/dynimg/IC125851.gif
Подробнее см. Содержание сборки.
Ответ 6
Во многих отношениях сборки .NET аналогичны пакетам байт-кода Java.
- Да. Они также содержат манифесты и другие данные, но CIL является частью exe/dll.
- Используйте ILDasm или Reflector - большинство людей сказал бы Reflector, так как он намного мощнее. Оба продемонстрируют вам, что было создано CIL. В Википедии есть список всех инструкций CIL, чтобы лучше чувствовать (это похоже на сборку).
- Я предполагаю, что это означает сборку кода. Хороший способ отличить его от родного.
Ответ 7
Я только что потратил пару часов на поиск лучшего инструмента, который мог бы позволить мне просматривать код IL непосредственно внутри Visual Studio.
Единственное решение, которое я нашел до сих пор, это Msiler https://visualstudiogallery.msdn.microsoft.com/60fc53d4-e414-461b-a27c-3d5d2a53f637
он работает очень хорошо!
В противном случае второе лучшее решение, но без интеграции с визуальной студией, - это JetBrains dotPeek, что является довольно удивительным, если честно.
Ответ 8
Я знаю, что это старый вопрос, и я бы предпочел любой из вышеперечисленных инструментов. Тем не менее, в крайнем случае, в окне с 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.
Ответ 9
Другая опция: используйте 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", Maarten Balliauw, 19 января 2017 г. - Блог Jetbrains
Ответ 10
Из моего опыта лучшим источником знаний, связанных с ИЛ, является Andrew Troelsen "Pro С# и .NET Platform". Начиная с 3-го издания у него действительно, действительно выдающаяся глава (около 50 страниц) о том, как понимать ИЛ и даже писать свой собственный код и использовать ILAsm. Ive использовал эту информацию для исследования того, существует ли множественное наследование в мире .NET. Также вы можете попытаться использовать некоторые интересные функции в IL (например, фильтрацию исключений, которые существуют только в VB, но не в С#).
Я настоятельно рекомендую прочитать эту главу.
В конце концов,.NET Reflector - это корпоративный стандарт для расследования IL-кода сборок, и книга Рихтера определенно "должна читать". Но из других книг, как упомянуто выше, вы могли бы показать действительно полезные вещи:)
Да, каждая сборка в мире .NET содержит некоторый код IL (вдоль сайта с манифестом), который можно просмотреть через Reflector или ILDasm. Более того, Reflector может показать вам оптимизированный код С# и VB. Это означает, что любой человек может просматривать исходный код сборки и почему в коммерческих продуктах используются обфускаторы.
Ответ 11
Я хочу просмотреть промежуточный язык, попробуйте скачать JustDecompile от Telerik (который в настоящее время бесплатный, требуется регистрация, хотя).
Перетащите свою DLL и выберите IL
в раскрывающемся списке вверху!
Ответ 12
Теперь есть еще один вариант. Вы можете сделать это в код VS с это расширение построенный с Рослин. Это в настоящее время ограничено .NET Core.