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


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

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

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

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

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

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

Заметка

Более новые языковые функции, такие как интерполяция строк и операторы условного доступа с значением NULL, обычно поддерживаются функцией Edit and Continue. Актуальную информацию см. на странице Enc Supported Edits.

Улучшения .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, попробуйте задать версию только в сборках Релиз (или CI) и сохранить версию в отладочных сборках постоянной.

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

  • Отладка SQL.

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

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

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