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

Механизм Горячая перезагрузка, ранее называемый Edit and Continue, обрабатывает большинство типов изменений кода в телах методов. Однако большинство изменений вне тел методов и несколько изменений в телах методов не могут применяться во время отладки. Чтобы такие неподдерживаемые изменения вступили в силу, необходимо остановить отладку и заново запустить ее для обновленной версии кода.

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

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

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

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

Примечание.

Новые функции языка, например интерполяция строк и условные операторы со значением NULL, обычно поддерживаются в режиме "Изменить и продолжить". См. актуальные сведения о правках, поддерживаемых в режиме "Изменить и продолжить".

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

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

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

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

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

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

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

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

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

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

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

  • отладка SQL;

  • отладка с использованием файла дампа;

  • отладка вложенного приложения времени выполнения;

  • отладка старой версии кода после того, как новую версию не удалось собрать из-за ошибок сборки.