Создание исходного кода из сборок .NET во время отладки
При отладке приложения .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."
Чтобы выполнить автоматическую декомпиляцию из окна стека вызовов, выполните следующие действия.
При отладке с открытым окном стека вызовов выберите Показать внешний код.
В окне стека вызовов дважды кликните любой кадр стека. Отладчик декомпилирует код, а затем переходит непосредственно к текущей точке выполнения.
Все декомпилированные коды также отображаются в узле "Внешние источники" в обозревателе решений, что упрощает просмотр внешних файлов при необходимости.
Вы можете выполнить отладку декомпилированного кода и задать точки останова.
Чтобы отключить автоматическую декомпиляцию внешнего кода, перейдите к разделу Tools > Options > Отладка > General и отключить автоматически декомпилировать источник при необходимости (только управляемый).
Создание и внедрение источников для сборки
Помимо генерации исходного кода для конкретного местоположения, вы можете создать весь исходный код для указанной сборки .NET. Чтобы выполнить эту задачу, перейдите в окно модулей и в контекстном меню сборки .NET, а затем выберите команду decompile Source to Symbol File. 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, перейдите в меню Инструменты>Параметры (или Отладка>Параметры) >Отладка>Общие, а затем снимите флажок с Включить Just My Code.
Извлеченные источники
Исходный код, извлеченный из сборки, имеет следующие ограничения:
- Имя и расположение созданных файлов не настраивается.
- Файлы являются временными и удаляются Visual Studio.
- Файлы помещаются в одну папку, и иерархия папок, существовавшая в исходных материалах, не используется.
- Имя файла для каждого файла содержит хэш контрольной суммы файла.
Созданный код — это только C#
Декомпиляция создает только файлы исходного кода в C#. Нет возможности создавать файлы на любом другом языке.