Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
При отладке приложения .NET может потребоваться просмотреть исходный код, который у вас нет. Например, нарушение исключения или использование стека вызовов для перехода к исходному расположению.
Заметка
- Создание исходного кода (декомпиляция) доступно только для приложений .NET и основано на проекте ILS py с открытым исходным кодом.
- Декомпиляция доступна только в Visual Studio 2019 16.5 и более поздних версий.
- Применение атрибута SuppressIldasmAttribute к сборке или модулю запрещает Visual Studio пытаться декомпилировать. Хотя атрибут устарел в .NET 6 и более поздних версиях, Visual Studio учитывает атрибут.
Создание исходного кода
При отладке и отсутствии исходного кода в Visual Studio отображается документ исходный код не найден, или, если у вас нет символов для сборки, документ символы не загружены. Оба документа имеют опцию декомпилировать исходного кода, которая создает код C# для текущего местоположения. Затем созданный код C# можно использовать так же, как и любой другой исходный код. Вы можете просматривать код, проверять переменные, задавать точки останова и т. д.
Символы не загружены
На следующем рисунке показано сообщение "Нет загруженных символов".
Источник не найден
На следующем рисунке показано сообщение Источник не найден.
Код автодекомпиляции
Начиная с версии 17.7 Visual Studio 2022 отладчик Visual Studio поддерживает автодекомпиляцию внешнего кода .NET. При переходе во внешний код или при использовании окна стека вызовов можно выполнить автоматическую декомпиляцию.
При переходе к коду, который был реализован внешним образом, отладчик автоматически декомпилирует его и отображает текущую точку выполнения. Если вы хотите перейти во внешний код, отключите Just My Code.
Вы можете декомпилировать из окна стека вызовов, не отключая функцию "Just My Code."
Чтобы выполнить автоматическую декомпиляцию из окна стека вызовов, выполните следующие действия.
При отладке с открытым окном стека вызовов выберите Показать внешний код.
В окне стека вызовов дважды кликните любой кадр стека. Отладчик декомпилирует код, а затем переходит непосредственно к текущей точке выполнения.
Все декомпилированные коды также отображаются в узле "Внешние источники" в обозревателе решений, что упрощает просмотр внешних файлов при необходимости.
Вы можете выполнить отладку декомпилированного кода и задать точки останова.
Чтобы отключить автоматическую декомпиляцию внешнего кода:
Откройте панель"Параметры>" и разверните раздел"Общие параметры>>всех параметров".
В правой области снимите флажок «Автоматически декомпилироваться в исходный код, если требуется (только для управляемых)».
Откройте диалоговое окно"Параметры>" и разверните раздел"Общие> отладке".
В правой области снимите флажок Автоматически декомпилировать в исходный код по мере необходимости (только для управляемого кода).
Нажмите ОК.
Создание и внедрение источников для сборки
Помимо генерации исходного кода для конкретного местоположения, вы можете создать весь исходный код для указанной сборки .NET. Чтобы выполнить эту задачу, перейдите в окно модулей и в контекстном меню сборки .NET, а затем выберите команду decompile Source to Symbol File. Visual Studio создает файл символов для сборки, а затем внедряет источник в файл символов. На следующем шаге можно извлечь внедренный исходный код.
Извлечение и просмотр внедренного исходного кода
Исходные файлы, встроенные в файл символов, можно извлечь, используя команду Извлечь исходный код в контекстном меню окна Модули.
Извлеченные исходные файлы добавляются в решение как разные файлы. Функция других файлов отключена по умолчанию в Visual Studio. Если функция не включена, нельзя открыть извлеченный исходный код.
Эту функцию можно включить в меню"Параметры>".
Откройте панель Инструменты>Опции и разверните раздел Все настройки>Среда>Документы.
В правой области установите или снимите флажок "Показать другие файлы" в обозревателе решений .
Если выбрать этот параметр, можно указать количество элементов, сохраненных в проекте других файлов.
Чтобы применить изменения, перезапустите Visual Studio.
Откройте диалоговое окно"Параметры> и разверните раздел"Документы>".
В правой области установите или снимите флажок "Показать другие файлы" в обозревателе решений .
Если выбрать этот параметр, можно указать количество элементов, сохраненных в проекте других файлов.
Нажмите ОК.
Извлеченные исходные файлы отображаются в прочих файлах в обозревателе решений.
SourceLink
Для библиотек .NET или пакетов NuGet, включенных для SourceLink, можно также перейти в исходный код, задать точки останова и использовать все функции отладчика. Дополнительные сведения см. в статье Включение отладки и диагностики с помощью SourceLink и Повышение производительности отладки с помощью SourceLink.
Известные ограничения
Требуется режим останова
Создание исходного кода с помощью декомпиляции возможно только в том случае, если отладчик находится в режиме останова и приложение приостановлено. Например, Visual Studio переходит в режим останова, когда программа достигает точки останова или возникает исключение. Вы можете легко заставить Visual Studio приостановить выполнение кода в следующий раз, когда он запустится, используя команду "Остановить все" (иконка
).
Ограничения декомпиляции
Создание исходного кода из промежуточного формата (IL), используемого в сборках .NET, имеет некоторые ограничения. Таким образом, созданный исходный код не выглядит как исходный исходный код. Большинство различий находятся в местах, где информация в исходном исходном исходном коде не требуется во время выполнения. Например, в среде выполнения не требуются такие сведения, как пробелы, комментарии и имена локальных переменных. Рекомендуется использовать созданный источник, чтобы понять, как выполняется программа, а не как замена исходного исходного кода.
Отладка оптимизированных или выпускных сборок
При отладке кода, декомпилированного из сборки, скомпилированной с помощью оптимизаций компилятора, могут возникнуть следующие проблемы:
- Точки останова могут не всегда соответствовать соответствующему исходному местоположению.
- Пошаговое выполнение может не всегда выполняться в правильном расположении.
- Локальные переменные могут не иметь точных имен.
- Некоторые переменные могут быть недоступны для оценки.
Дополнительные сведения можно найти в проблеме на GitHub: интеграции ICSharpCode.Decompiler в VS Debugger.
Надежность декомпиляции
Относительно небольшой процент попыток декомпиляции может привести к сбою. Это поведение связано с ошибкой null-ссылки в точке последовательности в ILSpy. Мы смягчили сбой, перехватив эти проблемы и аккуратно завершив попытку декомпиляции.
Дополнительные сведения можно найти в проблеме на GitHub: интеграции ICSharpCode.Decompiler в VS Debugger.
Ограничения с асинхронным кодом
Результаты декомпиляции модулей с шаблонами кода async/await могут быть неполными или завершаются сбоем. Реализация машин состояний async/await и yield в ILSpy выполнена только частично.
Дополнительные сведения можно найти в проблеме с GitHub: состояние генератора PDB.
Просто мой код
Параметр Just My Code (JMC) позволяет Visual Studio пропускать системные, фреймворковые, библиотечные и другие вызовы, не выполняемые пользователем. Во время сеанса отладки модулях показано, какие модули кода отладчик рассматривает как my Code (пользовательский код).
Декомпиляция оптимизированных или выпускных модулей создает неиспользуемый код. Если отладчик прерывается в декомпилированном коде, не относящемся к пользователю, появится окно No Source. Вы можете отключить функцию Just My Code в меню"Параметры>" или "Параметры отладки>".
Откройте панель"Параметры>" и разверните раздел"Общие параметры>>всех параметров". Снимите флажок "Включить только мой код ".
Откройте диалоговое окно"Параметры>" и разверните раздел"Общие> отладке". Снимите флажок "Включить только мой код ".
Извлеченные источники
Исходный код, извлеченный из сборки, имеет следующие ограничения:
- Имя и расположение созданных файлов не настраивается.
- Файлы являются временными и удаляются Visual Studio.
- Файлы помещаются в одну папку, и иерархия папок, существовавшая в исходных материалах, не используется.
- Имя файла для каждого файла содержит хэш контрольной суммы файла.
Созданный код — это только C#
Декомпиляция создает только файлы исходного кода в C#. Нет возможности создавать файлы на любом другом языке.