Visual studio как посмотреть il код
Видел как-то на скриншоте, у программиста было открыто окно с IL кодом прямо в visual studio, как он это сделал возможности спросить не было. Подскажите?
Использую Visual Studio 2019
1 ответ 1
Меня этот вопрос тоже заинтересовал, и я постарался поискать информацию. Нашел не сразу.
Благодаря замечанию vitidev к моему ответу - я знаю, что это, скорее всего, решарпер.
В нём эта функция включается через ReSharper -> Windows -> IL Viewer в меню решарпера.
На картинках 7 и 8 показано, как включить, и результат. Конечно, очень красивый - как ивсё у JetBrains.
В VS есть прекрасный "обычный дебаггер" - потому, что это общий дебаггер для всех типов проектов.
Его можно вызвать Debug > Windows > Dissasembly (Ctrl + Alt + D). Вызывается только в режиме отладки.
Он показывает "дизассемблнутый" машинный код, что, конечно же, не является MSIL-ом. Заметим, что есть особенность: MSIL при компиляции в машинный код обрабатыветя еще и JIT'ом, так что однозначного сооветствия между командой MSIL и группой команд ассемблера может не быть.
Как примерно выглядит - показано на картинке 1 в конце ответа.
Следующее, что приходит в голову - это ILDASM. Вызывается как отдельная программа, дизассемблирует сборки (*.dll и *.exe, по простому говоря), написанные на NET, в MSIL. Поскольку эта штука приходит вместе со студией, (или, возможно, вмесие с NET core SDK?) - то поддерживает все версии NET, от старенького NET Framework и до NET Core.
Не позволяет производить отладку, только показывает MSIL-код.
Показан на картинке 2.
Есть прекрасный - судя по отзывам - инструмент, который называется NET Reflector (производства Redgate). Интегрируется с VS. Вызывается прямо из VS. Платный. Но, судя по видео на их сайте, он осуществляет скорее "дизасеемблирование в исходный код" каких то чужих бинарников и отладку на уровне исходного кода. По моему, окна с MSIL там нет. Еслия ошибаюсь - может, кто то, кто с Reflector'ом работал - меня поправит?
Видео с демонстрацией работы - на этой их странице.
Видео про использование на ютьюбе
И последнее, что мне попалось -наверное, самое близкое к "отладке IL кода". Это проект венгерского программиста Zsolt Petrény под названием Dotnet IL Editor (DILE).
Она позволяет загружать и запускать сборки - с теми ограничениями на версию фремворка, которые я только что написал.
При этом есть особенность, которая отражена на картинке 4 в конце ответа - нужно после загрузки сборки в DILE назначить startup assembly.
Потом можно поставить breakpoint и по шагам отлаживать IL - код.
Процесс отладки простого кода (чуть ниже) показан на картинке 5.
Чего не хватает: я не нашел, как посмотреть память (дамп памяти). Самое близкое к этому - просмотр объектов, показанный на картинке 6.
Вообще, штука мощная, учитывая, что это отладчик с исходными кодами - то есть, теоратически, его можно попробовать улучшать под свои нужды.
Если у кого то есть еще идеи - буду рад, если Вы ими поделитесь в комментариях.
Код, котрый я запихивал в отладчик:
Картинка 1 (Windows debugger):
Картинка 2 (ILDASM):
Картинка 3 (LINQPAD):
Картинка 4 (назначаем в DILE startup point):
Картинка 5 (процесс отладки в DILE):
Картинка 6 (просмотр значений полей объекта):
Картинка 7 (победитель - Решарпер, включаем показ IL кода):
Картинка 8 (победитель - Решарпер, вот как он показывает IL код):
В окне Дизассемблированный код отображается код сборки, соответствующий инструкциям, созданным компилятором. При отладке управляемого кода эти инструкции ассемблера соответствуют присущему данному объекту коду, созданному компилятором JIT, а не промежуточному языку (MSIL), созданному компилятором Visual Studio.
Чтобы воспользоваться всеми возможностями окна Дизассемблированный код, изучите основы программирования на языке ассемблера.
Эта возможность доступна, только если включена отладка на уровне адреса. Она недоступна для отладки скриптов и SQL.
В дополнение к инструкциям ассемблера в окне Дизассемблированный код могут отображаться следующие сведения:
Исходный код, из которого получается код сборки.
Байты кода, то есть байтовое представление реальных инструкций компьютера или языка MSIL.
Символьные имена для адресов памяти.
Номера строк, соответствующие исходному коду.
Инструкции на языке ассемблера состоят из мнемоник, представляющих собой сокращения имен инструкций, и символов, которые обозначают переменные, регистры и константы. Каждую инструкцию машинного кода представляет одна мнемоника ассемблера, за которой следует один или несколько необязательных символов.
Код на ассемблере активно использует регистры процессора, а при использовании управляемого кода — регистры среды выполнения. Вы можете использовать окно Дизассемблированный код в сочетании с окном Регистры, которое позволяет изучить содержимое регистров.
Чтобы просмотреть инструкции машинного кода в необработанной числовой форме, а не на языке ассемблера, используйте окно Память или выберите Байты кода в контекстном меню в окне Дизассемблированный код.
Использование окна дизассемблирования
Чтобы включить окно Дизассемблированный код, выберите в разделе Сервис > Параметры > Отладка параметр Включить отладку на уровне адреса.
Чтобы открыть окно Дизассемблированный код во время отладки, выберите Windows > Дизассемблированный код или нажмите сочетание клавиш ALT+8.
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или выпуска. Чтобы изменить параметры, выберите в меню Сервис пункт Импорт и экспорт параметров . Дополнительные сведения см. в разделе Сброс параметров.
Чтобы включить или отключить вывод дополнительных сведений, щелкните правой кнопкой в окне Дизассемблированный код и установите или снимите в контекстном меню соответствующие флажки.
Желтая стрелка, расположенная в левом поле, отмечает текущую точку выполнения. Для собственного кода точка выполнения соответствует счетчику команд ЦП. В этом расположении отображается следующая инструкция, которая будет выполнена в программе.
Дизассемблер IL является сопутствующим инструментом ассемблера IL (Ilasm.exe). Ildasm.exe принимает переносимый исполняемый файл (PE-файл), содержащий код на промежуточном языке (IL), и создает на его основе текстовый файл, который может служить входным файлом для Ilasm.exe.
Эта программа автоматически устанавливается вместе с Visual Studio. Для запуска этого средства используйте Командную строку разработчика или PowerShell для разработчиков в Visual Studio.
В командной строке введите следующее.
Синтаксис
Параметры
Перечисленные ниже параметры допустимы для файлов EXE, DLL, OBJ, LIB и WINMD.
Параметр | Описание |
---|---|
/out = | Создает выходной файл с заданным параметром filename вместо вывода результатов в графический пользовательский интерфейс. |
/rtf | Выводит данные в формате RTF. Не может использоваться с параметром /text. |
/text | Отображает результаты в окне консоли вместо вывода в графический пользовательский интерфейс или выходной файл. |
/html | Выводит данные в формате HTML. Может использоваться только с параметром /output. |
/? | Отображает синтаксис команд и параметров для средства. |
Перечисленные ниже дополнительные параметры допустимы для файлов EXE, DLL и WINMD.
PUB — открытый;
PRI — закрытый;
FAM — семейство;
ASM — сборка;
FAA — семейство и сборка;
FOA — семейство или сборка;
PSC — закрытая область.
Перечисленные ниже параметры допустимы для файлов EXE, DLL и WINMD только при выводе в файл или окно консоли.
Перечисленные ниже параметры допустимы для файлов EXE, DLL, OBJ, LIB и WINMD только при выводе в файл или окно консоли.
MDHEADER — показывать сведения и размеры заголовка метаданных;
HEX — показывать сведения в шестнадцатеричном и текстовом формате;
CSV — показывать количество записей и размеры кучи;
UNREX — показывать неразрешенные внешние элементы;
SCHEMA — показывать сведения о заголовке и схеме метаданных;
RAW — показывать необработанные таблицы метаданных;
HEAPS — показывать необработанные кучи;
VALIDATE — проверять согласованность метаданных.
Перечисленные ниже параметры допустимы для LIB-файлов только при выводе в файл или окно консоли.
Параметр | Описание |
---|---|
/обжектфиле filename | Вывод метаданных отдельного объектного файла из заданной библиотеки. |
Параметры программы Ildasm.exe не учитывают регистр и распознаются по первым трем буквам. Например, команда /quo эквивалентна команде /quoteallnames. Разделителем параметра и его аргумента может служить двоеточие (:) или знак равенства (=). Например, команда /output:filename эквивалентна команде /output=filename.
Примечания
Программа Ildasm.exe работает только с PE-файлами, расположенными на жестком диске. Программа не обрабатывает файлы, установленные в глобальном кэше сборок.
Текстовый файл, созданный программой Ildasm.exe, можно передавать в качестве входных данных в ассемблер IL (Ilasm.exe). Это полезно, к примеру, при компиляции кода на языке программирования, не поддерживающем все атрибуты метаданных среды выполнения. После компиляции кода и обработки результатов с помощью Ildasm.exe можно вручную добавить недостающие атрибуты в полученный текстовый файл IL. Чтобы создать окончательный исполняемый файл, следует обработать этот текстовый файл ассемблером IL.
На данный момент такая технология не применяется к PE-файлам, содержащим встроенный машинный код (например, к PE-файлам, созданным компилятором Microsoft Visual C++).
Для просмотра метаданных и дизассемблированного кода PE-файлов в иерархическом представлении в виде дерева применяется графический пользовательский интерфейс по умолчанию дизассемблера IL. Чтобы запустить графический пользовательский интерфейс, введите в командной строке команду ildasm без аргумента имя_PE-файла и без параметров. В меню Файл можно перейти к PE-файлу, который требуется загрузить в программу Ildasm.exe. Чтобы сохранить метаданные и дизассемблированный код, отображаемый для выбранного PE-файла, выберите в меню Файл команду Дамп. Чтобы сохранить только иерархическое представление в виде дерева, выберите в меню Файл команду Дерево дампа. Дополнительные инструкции по загрузке файла в программу Ildasm.exe и интерпретации выходных данных см. в руководстве по Ildasm.exe, которое находится в папке Samples в Windows SDK.
Если программе Ildasm.exe задан аргумент имя_PE-файла, содержащий внедренные ресурсы, будет создано несколько выходных файлов: текстовый файл с IL-кодом и RESOURCES-файл для каждого внедренного управляемого ресурса (название файла соответствует названию ресурса в метаданных). Если в аргумент имя_PE-файла внедрены неуправляемые ресурсы, будет создан RES-файл с именем, указанным для IL-вывода в параметре /output.
Для входных файлов OBJ и LIB программа Ildasm.exe отображает только описания метаданных. IL-код для файлов этих типов не дизассемблируется.
Сведения о версии
Примеры
Следующая команда вызывает отображение метаданных и декодированного кода для PE MyHello.exe в MyHello.exe графического пользовательского интерфейса по умолчанию.
Следующая команда выполняет десборку файла MyFile.exe и сохраняет полученный текст ассемблера Il в файле MyFile.exe .
Следующая команда дизассемблирует файл MyFile.exe и выводит выходной текст ассемблера IL в окно консоли.
Если файл MyApp.exe содержит внедренные управляемые и неуправляемые ресурсы, следующая команда создает четыре файла: MyApp.exe , MyApp. Res, пиктограммы. Resourcesи Message. Resources:
Следующая команда дизассемблирует метод MyMethod класса MyClass в файле MyFile.exe и выводит результат в окно консоли.
В предыдущем примере допустимо наличие нескольких методов с именем MyMethod и различными сигнатурами. Следующая команда выполняет разбор метода MyMethod экземпляра с типом возвращаемого значения MyMethod и типами параметров Int32 и String.
Чтобы извлечь метод static (метод Shared в Visual Basic), следует опустить ключевое слово instance . Типы классов, которые не являются простыми типами (такими как int32 и string ), должны включать пространство имен и перед ними необходимо указывать ключевое слово class . Перед внешними типами должно быть указано имя соответствующей библиотеки в квадратных скобках. Следующая команда дизассемблирует статический метод с именем MyMethod , имеющий один параметр типа AppDomain, и возвращает значение типа AppDomain.
Перед вложенным типом необходимо указывать содержащий его класс, отделенный косой чертой (/). Например, если класс MyNamespace.MyClass содержит вложенный класс с именем NestedClass , вложенный класс указывается следующим образом: class MyNamespace.MyClass/NestedClass .
The Disassembly window shows assembly code corresponding to the instructions created by the compiler. If you're debugging managed code, these assembly instructions correspond to the native code created by the Just-in-Time (JIT) compiler, not the Microsoft intermediate language (MSIL) created by the Visual Studio compiler.
To take full advantage of the Disassembly window, understand or learn the basics of assembly-language programming.
This feature is only available if address-level debugging is enabled. It isn't available for script or SQL debugging.
In addition to assembly instructions, the Disassembly window can show the following optional information:
Source code from which the assembly code derives.
Code bytes, that is, the byte representations of the actual machine or MSIL instructions.
Symbol names for the memory addresses.
Line numbers corresponding to the source code.
Assembly-language instructions consist of mnemonics, which are abbreviations for instruction names, and symbols for variables, registers, and constants. Each machine-language instruction is represented by one assembly-language mnemonic optionally followed by one or more symbols.
Assembly code relies heavily on processor registers or, for managed code, common language runtime registers. You can use the Disassembly window along with the Registers window, which allows you to examine register contents.
To view machine-code instructions in their raw numeric form, rather than as assembly language, use the Memory window or select Code Bytes from the shortcut menu in the Disassembly window.
Use the Disassembly window
To enable the Disassembly window, under Tools > Options > Debugging, select Enable address-level debugging.
To open the Disassembly window during debugging, select Windows > Disassembly or press Alt+8.
The dialog boxes and menu commands you see might differ from those described in Help depending on your active settings or edition. To change your settings, choose Import and Export Settings on the Tools menu. For more information, see Reset settings.
To turn optional information on or off, right-click in the Disassembly window, and set or clear the desired options in the shortcut menu.
A yellow arrow in the left margin marks the current execution point. For native code, the execution point corresponds to the CPU's program counter. This location shows the next instruction that will be executed in your program.
- Is this MSIL/CIL contained in these exe/dll files?
- I want to see that intermediate language code, just to get feel for its existence. How do I view it?
- They are calling this exe/dll file an assembly . Are they using this "fancy word" just to differentiate these from the exe/dll files that contain native/machine code?
13 Answers 13
Wow, swift response 7 years later! I haven't messed with IL much, or compared all the options (which is why I'm asking in the first place), but does LINQPad not have this decompiling feature?
Using LINQPad for this is much more convenient than loading up Visual Studio or running the compiler from the command line, then loading up ILDASM and opening the .il file with a text editor.
Nice one! I up-voted but it is slightly more complicated if you have to include any custom classes. Still, I really like this one!
Another option: Use ReSharper
Source / IL synced view: left blue background line corresponds with right IL Block
In Visual Studio:
- Choose ReSharper | Windows | IL Viewer
- or Context Menu: Navigate | IL Code
Supports synced view of Source Code and IL - when you click on a statement in source, the corresponding block in IL is highlighted (and vice versa). Displays descriptions for IL from Microsoft Developer Network and "Common Intermediate Language (CIL) instruction set" from ECMA standard specification.
see Viewing Intermediate Language (IL) in Resharper Help. Picture above is from Resharper Help.
Free option is to use Jetbrains dotPeek
see also: "Exploring Intermediate Language (IL) with ReSharper and dotPeek", by Maarten Balliauw, January 19, 2017 - Jetbrains Blog
IL Viewer in ReSharper is great. If you mouse over the IL syntax, it shows rather descriptive tooltips that explain what each keyword is doing. Great for people who are new to IL!
I believe that they are called "assemblies" because an assembly is a set of modules, assembled together by a manifest.
sharplab is an online tool, great for simple use cases. Type your code on the left, IL shows up on the right.
- Yes. They also contain manifests and other data, but the CIL is part of the exe/dll.
- Use ILDasm or Reflector - most people would say Reflector, as it is much more powerful. Both will show you what CIL was produced. Wikipedia has a list of all CIL instructions, for a better feel (it is assembly like).
- I guess it is meant as an assembly of code. A good way to differentiate it from native.
I have just spent a couple of hours searching for the best tool that could let me view the IL code directly inside Visual Studio.
it works quite well!
Otherwise the second best solution, but without visual studio integration, is JetBrains dotPeek, which is quite awesome to be honest.
I know this is an old question, and I'd prefer any of the tools above. However, in a pinch, there has been an MSIL viewer in the box with Visual Studio since at least Version 2005.
The tool is named ildasm.exe , and is located in the following folders after default Visual Studio installations:
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 "
For more information, see: "How to: View Assembly Contents" in the MSDN Library.
I highly recommend to read that chapter.
Eventually, .NET Reflector is an enterprise standard for investigating IL code of assemblies and Richter's book is definitely "must read" stuff. But from other books like mentioned above you could reveal really useful things :)
Читайте также: