Просмотр кода дизассемблирования в отладчике Visual Studio (C#, C++, Visual Basic, F#)
Область применения:
Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
В окне Дизассемблированный код отображается код сборки, соответствующий инструкциям, созданным компилятором. При отладке управляемого кода эти инструкции ассемблера соответствуют присущему данному объекту коду, созданному компилятором JIT, а не промежуточному языку (MSIL), созданному компилятором Visual Studio.
Чтобы воспользоваться всеми возможностями окна Дизассемблированный код, изучите основы программирования на языке ассемблера. Справочные материалы для наборов инструкций Intel находятся в 2-м томе руководства по архитектуре. Этот материал обычно относится к наборам инструкций AMD, а также.
Эта возможность доступна, только если включена отладка на уровне адреса. Она недоступна для отладки скриптов и SQL.
В дополнение к инструкциям ассемблера в окне Дизассемблированный код могут отображаться следующие сведения:
- Адреса в памяти, где располагается каждая из инструкций. Для собственных приложений это фактические адреса в памяти. Для кода на Visual Basic или C# это смещение относительно начала функции.
- Исходный код, из которого получается код сборки.
- Байты кода, то есть байтовое представление реальных инструкций компьютера или языка MSIL.
- Символьные имена для адресов памяти.
- Номера строк, соответствующие исходному коду.
Инструкции на языке ассемблера состоят из мнемоник, представляющих собой сокращения имен инструкций, и символов, которые обозначают переменные, регистры и константы. Каждую инструкцию машинного кода представляет одна мнемоника ассемблера, за которой следует один или несколько необязательных символов.
Код на ассемблере активно использует регистры процессора, а при использовании управляемого кода — регистры среды выполнения. Вы можете использовать окно Дизассемблированный код в сочетании с окном Регистры, которое позволяет изучить содержимое регистров.
Чтобы просмотреть инструкции машинного кода в необработанной числовой форме, а не на языке ассемблера, используйте окно Память или выберите Байты кода в контекстном меню в окне Дизассемблированный код.
Использование окна дизассемблирования
Чтобы включить окно Дизассемблированный код, выберите в разделе Сервис>Параметры>Отладка параметр Включить отладку на уровне адреса.
Чтобы открыть окно Дизассемблированный код во время отладки, выберите Windows>Дизассемблированный код или нажмите сочетание клавиш ALT+8.
В зависимости от установок или выпуска сервера доступные диалоговые окна и команды меню могут отличаться от описанных в справке. Чтобы изменить параметры, выберите Импорт и экспорт параметров в меню Сервис . Дополнительные сведения см. в разделе Сброс параметров.
Чтобы включить или отключить вывод дополнительных сведений, щелкните правой кнопкой в окне Дизассемблированный код и установите или снимите в контекстном меню соответствующие флажки.
Желтая стрелка, расположенная в левом поле, отмечает текущую точку выполнения. Для собственного кода точка выполнения соответствует счетчику команд ЦП. В этом расположении отображается следующая инструкция, которая будет выполнена в программе.
Перемещение вверх или вниз в области памяти
При просмотре содержимого памяти в окне Память или Дизассемблированный код для перемещения вверх и вниз по области памяти можно использовать вертикальную полосу прокрутки.
- Для перемещения на страницу вниз (к старшему адресу памяти) щелкните вертикальную полосу прокрутки ниже того места, где находится бегунок.
- Для перемещения на страницу вверх (к младшему адресу памяти) щелкните вертикальную полосу прокрутки выше того места, где находится бегунок. Обратите внимание, что вертикальная полоса прокрутки работает не в стандартном режиме. Современные персональные компьютеры имеют огромное адресное пространство, поэтому в нем достаточно легко заблудиться, перетаскивая бегунок полосы прокрутки в произвольное расположение. По этой причине бегунок «подпружинен» и всегда остается в центре полосы прокрутки. В приложениях машинного кода можно постранично перемещаться вверх и вниз, однако нельзя свободно использовать полосу прокрутки. В управляемых приложениях дизассемблирование ограничивается одной функцией и прокруткой можно пользоваться в обычном режиме. Обратите внимание, что старшие адреса отображаются в нижней части окна. Для просмотра старших адресов следует перемещаться вниз, а не вверх.
Перемещение вверх или вниз одной инструкции
- Щелкните стрелку, расположенную над или под вертикальной полосой прокрутки.
См. также
- Просмотр данных в отладчике
- Практическое руководство. Использование окна регистров
Как посмотреть ассемблерный код в visual studio
Я читал еще один вопрос, касающийся эффективности двух строк кода, и OP сказал, что он посмотрел на сборку за кодом, и обе линии были идентичны в сборке. Отвлечение в сторону, как я мог просмотреть код сборки, созданный при компиляции программы.
Я использую Microsoft Visual С++, но мне также хотелось бы узнать, можно ли просмотреть сборку за кодом, написанным на Visual Basic.
Итак, как мне просмотреть код сборки за программой, написанной на языках более высокого уровня, таких как С++ и Visual Basic?
Существует несколько подходов:
Обычно вы можете увидеть код сборки во время отладки С++ в visual studio (и затмение тоже). Для этого в Visual Studio поставьте точку останова на код, о котором идет речь, и когда отладчик ударит его по щелчку и найдите «Go To Assembly» (или нажмите CTRL + ALT + D)
Скомпилируйте программу и используйте сторонний отладчик. Вы можете использовать OllyDbg или WinDbg для этого. Также вы можете использовать IDA (интерактивный дизассемблер). Но это хардкорный способ сделать это.
Дополнительное примечание: существует большая разница между выходом ассемблера Debug и Release one. Первый из них хорош, чтобы узнать, как компилятор создает код ассемблера с С++. Во-вторых, хорошо узнать, как компилятор оптимизирует различные конструкции С++. В этом случае некоторые преобразования С++-to-asm не очевидны.
Укажите ключ /FA для компилятора cl. В зависимости от значения коммутатора интегрируется только код сборки или код высокого уровня и код сборки. Имя файла получает расширение .asm файла. Вот поддерживаемые значения:
- /код сборки FA;.asm
- /FAc Машина и код сборки;.COD
- /FAs Код источника и сборки;.asm
- /FAcs Машина, источник и код сборки;.COD
Самый простой способ — запустить отладчик и проверить окно разборки.
Исследователь компилятора Godbolt разработан для удобного форматирования компилятора asm output, устраняя «шум» директив, поэтому я настоятельно рекомендую использовать его для просмотра asm для простых функций, которые принимают аргументы и возвращают значение (поэтому они выиграли ‘t быть оптимизированным прочь).
type — это версия DOS cat . Я не хотел включать больше кода, который затруднял бы поиск функций, которые я хотел увидеть для asm. (Хотя использование std::string и ускорение запуска счетчика для этих целей! Некоторые C-стиль строки манипуляции, которая делает больше предположений о обрабатываемой им строке (и игнорирует безопасность/распределение максимальной длины с помощью большого буфера) по результату GetModuleFileNameA будет намного меньше всего машинного кода.)
Многие из нас изучали ассемблер в университете, но почти всегда это ограничивалось простыми алгоритмами под DOS. При разработке программ для Windows может возникнуть необходимость написать часть кода на ассемблер, в этой статье я хочу рассказать вам, как использовать ассемблер в ваших программах под Visual Studio 2005.

Создание проекта
В статье мы рассмотрим как вызывать ассемблер из С++ кода и обратно, передавать данные, а также использовать отладчик встроенный в Visual Studio 2005 для отладки кода на ассемблер.
Для начала нам нужно создать проект. Включаем Visual Studio, выбираем File > New > Project. В Visual Studio нет языка ассемблер в окне выбора типа проекта, поэтому создаем С++ Win32 проект. В окне настроек нового проекта выбираем «Empty Project».

По умолчанию Visual Studio не распознает файлы с кодом на ассемблер. Для того чтобы включить поддержку ассемблер нам необходимо настроить в проекте условия сборки указав какой программой необходимо компилировать файлы *.asm. Для этого выбираем пункт меню «Custom Build Rules. ».

В открывшемся окне мы можем указать специальные правила компиляции для различных файлов, Visual Studio 2005 уже имеет готовое правило для файлов *.asm, нам необходимо лишь включить его, установив напротив правила «Microsoft Macro Assembler» галочку.

Добавление исходного кода
Перейдем к написанию исходного кода нашего проекта. Начнем с добавления исходного кода на c++. Добавим новый файл в папку Source Files. В качестве Template выбираем C++ File и вводим желаемое имя файла, например main.cpp. Напишем функцию, которая будет считывать имя введенное пользователем, оформив это в виде функции readName() которая будет возвращать ссылку на считанное имя. Мы получим примерно следующее содержимое файла:
Теперь, когда мы знаем имя пользователя мы можем вывести приветствие, его будет выводить функция sayHello() которую мы напишем на ассемблер, чтобы использовать эту функцию сначала мы должны указать что она будет определена в другом файле, для этого добавим блок к main.cpp:
Этот блок говорит компилятору, что функция sayHello() будет объявлена в другом файле и будет иметь правила вызова «C». Компилятор C++ искажает имена функций так, что указание правил вызова обязательно. Кроме того мы хотим использовать функцию readName() из функции sayHello(), для этого необходимо добавить extern «C» перед определением функции readName(), это позволит вызывать эту функцию из других файлов используя правила вызова «C».
Пришло время добавить код на ассемблер, для этого добавим в Source Folder новый файл. Выбираем тип Text File (.txt) и в поле название заменяем .txt на .asm, назовем наш файл hello.asm. Объявим функцию sayHello() и укажем внешние функции, которые мы хотим использовать. Получим следующий код:
Теперь мы можем запустить проект, для этого просто выбираем Debug > Start Without Debugging или нажимаем комбинацию Ctrl-F5. Если все сделано верно, вы увидите окно программы:

Немного усложним задачу, попробуем написать на ассемблер функцию принимающую параметр и возвращающую значение. Для примера напишем функцию calcSumm() которая будет принимать целое число и возвращать сумму его цифр. Изменим наш код на С++ добавив в него информацию о функции calcSumm, ввод числа и собственно вызов функции. Добавим функцию в файл hello.asm, возвращаемое значение помещается в eax, параметры объявляются после ключевого слова PROC. Все параметры можно использовать в коде процедуры, они автоматически извлекутся из стека. Также в процедурах можно использовать локальные переменные. Вы не можете использовать эти переменные вне процедуры. Они сохранены в стеке и удаляются при возврате из процедуры:
Запустив проект мы увидим следующий результат выполнения:

Отладка
Конечно в данной задаче нет ничего сложного и она вовсе не требует использования ассемблер. Более интересным будет рассмотреть, а что же нам дает Visual Studio для разработки на ассемблер. Попробуем включить режим отладки и установим точку остановки в hello.asm, запустим проект, мы увидим следующее:

Окно Disassembly (Debug > Windows > Disassembly) показываем команды ассемблер для данного объектного файла. Код который мы написали на С++ показывается черным цветом. Disassembled code показывается серым после соответствующего ему кода на C++/ассемблер. Окно Disassembly позволяет отлаживать код и осуществлять stepping по нему.
Окно регистров (Debug > Windows > Registers) позволяет посмотреть значение регистров.
Окно памяти (Debug > Windows > Memory) позволяет посмотреть дамп памяти, слева мы видим шестнадцатеричные адрес, справа шеснадцатеричные значения соответствующих ячеек памяти, можно перемещаться, вводя адрес в соответствующее поле в верху окна.
Я читал другой вопрос, касающийся эффективности двух строк кода, и ОП сказал, что он посмотрел на сборку, стоящую за кодом, и обе строки были идентичны в сборке. Отступление в сторону, как мне просмотреть ассемблерный код, созданный при компиляции программы.
Я использую Microsoft Visual C ++, но мне также хотелось бы знать, можно ли просмотреть сборку кода, написанного на Visual Basic.
Итак, как мне просмотреть ассемблерный код программы, написанной на языках более высокого уровня, таких как C ++ и Visual Basic?
Есть несколько подходов:
Обычно вы можете увидеть код сборки при отладке C ++ в Visual Studio (и в Eclipse тоже). Для этого в Visual Studio поставьте точку останова на рассматриваемый код, и когда отладчик попадает в нее, щелкните правой кнопкой мыши и найдите «Перейти к сборке» (или нажмите CTRL + ALT + D).
Второй подход — генерировать листинги сборки во время компиляции. Для этого перейдите в настройки проекта -> C / C ++ -> Выходные файлы -> Расположение списка ASM и введите имя файла. Также выберите «Вывод сборки» на «Сборка с исходным кодом».
Скомпилируйте программу и используйте любой сторонний отладчик. Для этого вы можете использовать OllyDbg или WinDbg. Также вы можете использовать IDA (интерактивный дизассемблер). Но это хардкорный способ сделать это.
Обратите внимание, что подход №2 не работает при компиляции статической библиотеки с включенной оптимизацией всей программы (по крайней мере, в VS2010). Что имеет смысл — компилятор еще не сгенерировал окончательный код. В Visual Studio 2017 это называется «Goto Disassembly» Должен увидеть файл .asm в каталоге отладки, если вы использовали расположение по умолчанию.
Дополнительное примечание: существует большая разница между выводом Debug ассемблера и первым выпуском. Первый полезен, чтобы узнать, как компилятор создает код ассемблера из C ++. Второй полезен, чтобы узнать, как компилятор оптимизирует различные конструкции C ++. В этом случае некоторые преобразования C ++ в asm не очевидны.
Я заметил, что при дизассемблировании исполняемого файла Debug кажется, что код распаковывается во время работы, этого не происходит в версии Release. Также при открытии обоих с помощью PEiD только версия отладки показывает «Microsoft Visual C ++ 8.0 [Debug]». Это абсолютно верно. Но это вообще не отвечает на вопрос.
Укажите переключатель / FA для компилятора cl. В зависимости от значения переключателя интегрируется либо только код сборки, либо код высокого уровня и код сборки. Имя файла получает расширение .asm. Вот поддерживаемые значения:
- / FA Код сборки; .как м
- / FAc Машинно-сборочный код; .COD
- / FAs Исходный и ассемблерный код; .как м
- / FAcs Машинный код, исходный код и ассемблерный код; .COD
Самый простой способ — запустить отладчик и проверить окно разборки .
Обозреватель компилятора Godbolt разработан для красивого форматирования вывода asm компилятора, устранения «шума» директив, поэтому я настоятельно рекомендую использовать его для просмотра asm для простых функций, которые принимают аргументы и возвращают значение (чтобы они не были оптимизирован прочь).
type это версия для DOS cat . Я не хотел включать больше кода, который усложнил бы поиск функций, для которых я хотел видеть asm. (Хотя использование зОго :: строки и счетчика подталкивания запуска для этих целей! Некоторый C-стиль строка манипуляции , что делает больше предположений о последовательности это обработки (и игнорирует макс длиной безопасности / распределение, используя большой буфер) в результате GetModuleFileNameA Would быть намного меньше общего машинного кода.)
Началось все с прочтения мной публикации «Ассемблер для Windows используя Visual Studio» (отсюда и почти идентичный код). Там рассмотрено использование Visual Studio 2005, а для 2013-й студии процесс похожий, но есть несколько отличий, которые заставят неподготовленного пользователя долго искать решения всех проблем со сборкой.
- TL;DR
- Создание проекта
- Настройка подсветки синтаксиса
- Тонкости вызова методов между С++ и Asm
- Приложение
Для тех, у кого совсем нет времени на прочтение: в конце статьи (в приложении) есть ссылка на готовый шаблон проекта и на аддон для подсветки синтаксиса.
Иллюстрированная версияВключаем Visual Studio, выбираем File -> New -> Project. :

Выбираем шаблон Win32 Console Application, кликаем ОК:


Ставим галочку напротив Empty project и жмем Finish:

Создаем исходники. Для этого делаем правый клик на Source Files, выбираем Add -> New Item. :

Выбираем C++ File и жмем Add:

Аналогично, создаем *.asm файл (просто меняем расширение в поле Name):

Важно: имена файлов должны быть разными (не учитывая расширение), иначе при создании файлов *.obj возникнет проблема перезаписи одного обьектного файла другим.
Теперь настройки. Делаем правый клик на проекте, выбираем Build Dependencies -> Build Customizations.

Ставим галочку напротив masm и жмем ОК:

Делаем правый клик на файле *.asm, выбираем Properties. :

В поле Item Type выбираем Microsoft Macro Assembler и жмем ОК:

Выбираем Project -> Properties. :


Выбираем Configuration Properties -> Linker -> Advanced. В поле Image Has Safe Exception Handlers выбираем значение No. Жмем ОК:

На этом этапе проект можно считать созданным. Написание кода рассмотрено в секции Тонкости вызова методов между С++ и Asm.
Только текстВключаем Visual Studio, выбираем File -> New -> Project. .
Выбираем шаблон Win32 Console Application, кликаем ОК.
Ставим галочку напротив Empty project и жмем Finish.
Создаем исходники. Для этого делаем правый клик на Source Files, выбираем Add -> New Item. .
Выбираем C++ File и жмем Add.
Аналогично, создаем *.asm файл (просто меняем расширение в поле Name).
Важно: имена файлов должны быть разными(не учитывая расширение), иначе при создании файлов *.obj возникнет проблема перезаписи одного объектного файла другим.
Теперь настройки. Делаем правый клик на проекте, выбираем Build Dependencies -> Build Customizations.
Ставим галочку напротив masm и жмем ОК.
Делаем правый клик на файле *.asm, выбираем Properties.
В поле Item Type выбираем Microsoft Macro Assembler и жмем ОК.
Выбираем Project -> Properties.
Выбираем Configuration Properties -> Linker -> Advanced. В поле Image Has Safe Exception Handlers выбираем значение No. Жмем ОК.
На этом этапе проект можно считать созданным. Написание кода рассмотрено в секции Тонкости вызова методов между С++ и Asm.
[b]Настройка подсветки синтаксиса[/b]
[b]Тонкости вызова методов между С++ и Asm[/b]
Для того, чтоб избежать ошибок компиляции и/или связывания нужно помнить следующее:
-
Если надо вызывать из ассемблера библиотечные методы, достаточно в начале секции кода указать, какие именно методы мы собираемся использовать.
Далее можно просто использовать call:
Соответственно, в *.asm файле:
EXTRN readName : proc ;and void* readName()
и
call readName ;eax = readName()
Данный прототип соответствует такому объявлению Asm-метода:
call readName ;eax = readName()
lea ebx, helloFormat ;ebx = &helloFormat
;printf(ebx,eax)
push eax
push ebx
call printf
add esp, 8 ;pop x2
Собственно, полный исходный код примера:
call readName; eax = readName()
lea ebx, helloFormat; ebx = &helloFormat
;printf(ebx,eax)
push eax
push ebx
call printf
add esp, 8;pop x2
Читайте также:
- Wps программа для оптимизации виндовс
- Переменная типа word имеет размер
- Как сбросить программу на телефоне
- Самые красивые презентации в powerpoint примеры
- Hotcore driver paragon что это
Как посмотреть код через дизассемблер ildasm? Выдает ошибку
Visual Studio 2015. Хочу посмотреть код через дизассемблер. Ildasm выдает ошибку: отсутствует допустимый заголовок CLR, поэтому дизассемблирование невозможно. Кто-нибудь знает, как решить эту проблему?
Отслеживать
задан 29 мар 2017 в 23:04
tequilarusa tequilarusa
Поправить тот самый заголовок? Без конкретных файлов — гадание на кофейной гуще.
30 мар 2017 в 0:32
А может, ваша программа — нативная программа наC++, а не .NET-сборка?
30 мар 2017 в 0:58
0
Сортировка: Сброс на вариант по умолчанию
Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.
- c++
- visual-studio-2015
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Ildasm.exe (дизассемблер IL)
Дизассемблер IL является сопутствующим инструментом ассемблера IL (Ilasm.exe). Ildasm.exe принимает переносимый исполняемый файл (PE-файл), содержащий код на промежуточном языке (IL), и создает на его основе текстовый файл, который может служить входным файлом для Ilasm.exe.
Эта программа автоматически устанавливается вместе с Visual Studio. Для запуска этого средства используйте Командную строку разработчика или PowerShell для разработчиков в Visual Studio.
В командной строке введите следующее.
Синтаксис
ildasm [options] [PEfilename] [options]
Параметры
Перечисленные ниже параметры допустимы для файлов EXE, DLL, OBJ, LIB и WINMD.
| Параметр | Описание |
|---|---|
| /out= filename | Создает выходной файл с заданным параметром 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-файлов только при выводе в файл или окно консоли.
| Параметр | Описание |
|---|---|
| /objectfile= 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-код для файлов этих типов не дизассемблируется.
Чтобы определить, является ли файл EXE или DLL управляемым, обработайте его программой Ildasm.exe. Если файл не является управляемым, программа выдаст сообщение, что у файла отсутствует допустимый заголовок среды CLR и он не может быть дизассемблирован. Если файл является управляемым, программа будет выполнена без ошибок.
Сведения о версии
Начиная с платформа .NET Framework 4.5 ,Ildasm.exe обрабатывает нераспознанный маршал blOB (большой двоичный объект), отображая необработанное двоичное содержимое. В следующем примере показано, как отображается маршалинговый объект BLOB, созданный программой C#:
public void Test([MarshalAs((short)70)] int test)
// IL from Ildasm.exe output .method public hidebysig instance void Test(int32 marshal(< 46 >) test) cil managed
Начиная с платформа .NET Framework 4.5 , вIldasm.exe отображаются атрибуты, применяемые к реализациям интерфейса, как показано в следующем фрагменте Ildasm.exe выходных данных:
.class public auto ansi beforefieldinit MyClass extends [mscorlib]System.Object implements IMyInterface < .interfaceimpl type IMyInterface .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute. ctor() = ( 01 00 00 00 ) …
Примеры
Следующая команда выводит метаданные и дизассемблированный код PE-файла MyHello.exe в стандартный графический пользовательский интерфейс программы Ildasm.exe.
ildasm myHello.exe
Следующая команда дизассемблирует файл MyFile.exe и сохраняет выходной текст ассемблера IL в файле MyFile.il.
ildasm MyFile.exe /output:MyFile.il
Следующая команда дизассемблирует файл MyFile.exe и выводит выходной текст ассемблера IL в окно консоли.
ildasm MyFile.exe /text
Если файл MyApp.exe содержит внедренные управляемые и неуправляемые ресурсы, при выполнении следующей команды будет создано четыре файла: MyApp.il, MyApp.res, Icons.resources и Message.resources.
ildasm MyApp.exe /output:MyApp.il
Следующая команда дизассемблирует метод MyMethod класса MyClass в файле MyFile.exe и выводит результат в окно консоли.
ildasm /item:MyClass::MyMethod MyFile.exe /text
В предыдущем примере допустимо наличие нескольких методов с именем MyMethod и различными сигнатурами. Следующая команда дизассемблирует метод экземпляра MyMethod с типом возвращаемого значения void и типами параметров int32 и string.
ildasm /item:"MyClass::MyMethod(instance void(int32,string)" MyFile.exe /text
В .NET Framework версии 1.0 и 1.1 открывающей скобке, которая следует за именем метода, должна соответствовать закрывающая скобка после сигнатуры: MyMethod(instance void(int32)) . В .NET Framework 2.0 и более поздних версий закрывающая скобка должна быть опущена: MyMethod(instance void(int32) .
Чтобы извлечь метод static (метод Shared в Visual Basic), следует опустить ключевое слово instance . Типы классов, которые не являются простыми типами (такими как int32 и string ), должны включать пространство имен и перед ними необходимо указывать ключевое слово class . Перед внешними типами должно быть указано имя соответствующей библиотеки в квадратных скобках. Следующая команда дизассемблирует статический метод с именем MyMethod , имеющий один параметр типа AppDomain, и возвращает значение типа AppDomain.
ildasm /item:"MyClass::MyMethod(class [mscorlib]System.AppDomain(class [mscorlib]System.AppDomain)" MyFile.exe /text
Перед вложенным типом необходимо указывать содержащий его класс, отделенный косой чертой (/). Например, если класс MyNamespace.MyClass содержит вложенный класс с именем NestedClass , вложенный класс указывается следующим образом: class MyNamespace.MyClass/NestedClass .
См. также
- Инструменты
- Ilasm.exe (ассемблер IL)
- Процесс управляемого выполнения
- Оболочки командной строки для разработчиков
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
The .NET documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по