Поделиться через


Поддерживаемые изменения кода (C# и Visual Basic)

Механизм горячей перезагрузки, ранее называвшийся "Изменить и продолжить", обрабатывает большинство изменений кода в теле метода. Большинство изменений вне тел методов и некоторые изменения внутри тел методов, однако, не могут быть применены во время отладки. Чтобы применить неподдерживаемые изменения, необходимо остановить отладку и перезапустить с помощью новой версии кода.

Механизм "Изменить и продолжить" обрабатывает большинство типов изменений кода в телах методов. Тем не менее, большинство изменений, которые находятся вне тел методов, и некоторые изменения внутри тел методов, не могут применяться во время отладки. Чтобы применить неподдерживаемые изменения, необходимо остановить отладку и перезапустить с помощью новой версии кода.

Поддерживаемые изменения в коде

В следующей таблице показаны изменения, которые могут быть внесены в код C# и Visual Basic во время сеанса отладки без перезапуска сеанса.

Элемент языка или компонент Поддерживаемая операция редактирования Ограничения
Типы Добавление методов, полей, конструкторов и т. д. Да
Итераторы Добавление или изменение Нет
выражения async/await Добавление или изменение Да
Динамические объекты Добавление или изменение Нет
лямбда-выражения Добавление или изменение Да
Выражения LINQ Добавление или изменение То же, что и лямбда-выражения
Обобщения Добавление или изменение Да
Элемент языка или компонент Поддерживаемая операция редактирования Ограничения
Типы Добавление методов, полей, конструкторов и т. д. Да
Итераторы Добавление или изменение Нет
выражения async/await Добавление или изменение Да
Динамические объекты Добавление или изменение Нет
лямбда-выражения Добавление или изменение Да
Выражения LINQ Добавление или изменение То же, что и лямбда-выражения

Заметка

Более новые языковые функции, такие как интерполяция строк и null-условные операторы, обычно поддерживаются функцией "Редактировать и продолжить." За самой актуальной информацией см. страницу Enc поддерживаемые изменения.

Улучшения .NET 6+

Улучшения в .NET 6 и Visual Studio 2022 и более поздних версиях включают поддержку дополнительных типов изменений, которые выходят за рамки того, что изначально возможно в более ранних версиях Visual Studio. Эти улучшения доступны как для горячей перезагрузки, так и для возможностей редактирования и продолжения.

Механизм горячей перезагрузки в .NET 6+ основан на технологии "Редактирование и Продолжение" и Roslyn. Поддерживаемые изменения показывают типы изменений, которые в настоящее время поддерживаются Roslyn, а также возможные будущие улучшения.

Неподдерживаемые изменения кода

Следующие изменения нельзя применить к коду C# и Visual Basic во время сеанса отладки.

  • Изменения в текущем заявлении или любом другом активном заявлении.

    Активная инструкция — это любая инструкция в функции в стеке вызовов, которая была вызвана для получения текущей инструкции.

    Текущая инструкция отображается на желтом фоне в окне источника. Другие активные утверждения отображаются на затенированном фоне и доступны только для чтения. Эти цвета по умолчанию можно изменить в диалоговом окне Параметры.

  • Любые неподдерживаемые изменения кода по элементу языка, как описано в следующей таблице.

    Элемент языка или компонент Неподдерживаемая операция редактирования
    Все элементы кода Переименование
    Пространства имен Добавить
    Пространства имен, типы, члены Удалить
    Интерфейсы Модифицировать
    Типы Добавить абстрактного или виртуального члена, добавить переопределение (см. сведения в и)
    Типы Добавить деструктор
    Члены — Измените элемент, ссылающийся на встроенный тип взаимодействия
    — Измените статический элемент после обращения к нему путем выполнения кода.
    Члены (Visual Basic) — Модификация члена с помощью инструкции On Error или Resume
    — Изменение элемента, содержащего предложение запроса LINQ "Агрегирование", "Группирование по", "Простое соединение" или "Объединение группы"
    Методика — изменение подписей
    — Сделать абстрактный метод неабстрактным путем добавления текста метода
    — Удаление текста метода
    Атрибуты Добавление или изменение
    События или свойства Изменение параметра типа, базового типа, типа делегата или возвращаемого типа
    Операторы или индексаторы Изменение параметра типа, базового типа, типа делегата или возвращаемого типа
    Блоки `catch` Изменить, когда содержит активное утверждение
    Блоки try-catch-finally Измените, если содержит активное утверждение
    инструкции using Добавить
    асинхронные методы/лямбда-методы Измените асинхронный метод/лямбда-выражение в проекте, нацеленном на .NET Framework 4 и более ранние версии (подробные сведения см. в )
    Итераторы Изменение итератора в проекте, предназначенного для .NET Framework 4 и более ранних версий (см. сведения )
    Элемент языка или компонент Неподдерживаемая операция редактирования
    Все элементы кода Переименование
    Пространства имен Добавь
    Пространства имен, типы, члены Удалить
    Генерики Добавление или изменение
    Интерфейсы Модифицировать
    Типы Добавление абстрактного или виртуального члена, добавление переопределения (см. сведения )
    Типы Добавьте деструктор
    Члены — Изменение элемента, ссылающегося на внедренный тип взаимодействия
    — Измените статический член после того, как к нему был получен доступ путем выполнения кода.
    Члены (Visual Basic) — Модификация члена с использованием операторов On Error или Resume
    — Изменение элемента, содержащего предложение запроса LINQ "Агрегирование", "Группирование по", "Простое соединение" или "Объединение группы"
    Методика — изменение подписей
    — Сделать абстрактный метод неабстрактным путем добавления текста метода
    — Удаление текста метода
    Атрибуты Добавление или изменение
    События или свойства Изменение параметра типа, базового типа, типа делегата или возвращаемого типа
    Операторы или индексаторы Изменение параметра типа, базового типа, типа делегата или возвращаемого типа
    Блоки catch Измените, если оно содержит активное утверждение
    Операторы обработки исключений try-catch-finally Измените, если оно включает активную инструкцию
    инструкции using Добавить
    асинхронные методы/лямбда-методы Изменение асинхронного метода или лямбды в проекте, предназначенном для .NET Framework 4 и более ранних версий (см. подробнее)
    Итераторы Изменение итератора в проекте, предназначенного для .NET Framework 4 и более ранних версий (см. сведения )

Небезопасный код

Изменения в небезопасном коде имеют те же ограничения, что и изменения в безопасном коде, с одним дополнительным ограничением: Изменение и продолжение не поддерживает изменения в небезопасном коде, выходя из метода, содержащего оператор stackalloc.

Поддержка приложений

К поддерживаемым приложениям относятся:

  • Приложения UWP в Windows 10 или Windows 11
  • приложения x86 и x64, предназначенные для настольных версий .NET Framework 4.6 или более поздних (.NET Framework — это только настольная версия)

Для .NET 6 и более поздних версий редактирование поддерживается для следующих типов файлов:

  • CSHTML
  • .razor

Неподдерживаемые приложения, платформы и операции

Неподдерживаемые приложения или платформы включают:

  • F#
  • .NET Native
  • Silverlight 5
  • Windows 8.1
  • Xamarin.Forms (iOS и Android)

Для ASP.NET и ASP.NET Core редактирование не поддерживается для следующих типов файлов:

  • .aspx
  • .ascx
  • .aspx
  • .ascx
  • .cshtml
  • .razor

Неподдерживаемые сценарии

Изменение и продолжение недоступно в следующих сценариях отладки:

  • Отладка в смешанном режиме (собственный или управляемый).

  • Отладка в Arm64 без назначения .NET 7 или более поздней версии.

  • Отладка с помощью набора переменных среды COR_ENABLE_PROFILING.

  • Отладка приложения с помощью подключения к процессу (отладка > присоединение к процессу) вместо запуска приложения путем выбора запуска в меню отладки. Если вы хотите использовать функцию "Редактировать и продолжить" при подключении к процессу, перед запуском процесса необходимо задать переменную среды COMPLUS_ForceENC (set COMPLUS_ForceENC=1).

  • Отладка с недетерминированными версиями сборок (например, основанными на времени). Если вы хотите использовать Edit and Continue, попробуйте задавать версию только в сборках Release (или CI) и сохраняйте версию в сборках Debug постоянной.

  • Отладка оптимизированного кода.

  • Отладка SQL.

  • Отладка файла дампа.

  • Отладка внедренного приложения среды выполнения.

  • Отладка старой версии кода после сбоя сборки новой версии из-за ошибок сборки.