Partage via


Modifications de code prises en charge (C# et Visual Basic)

Le mécanisme de rechargement à chaud, précédemment appelé Edit and Continue, gère la plupart des types de modifications de code dans les corps de méthode. Toutefois, la plupart des modifications en dehors des corps de méthode et quelques modifications dans les corps de méthode ne peuvent pas être appliquées pendant le débogage. Pour appliquer ces modifications non prises en charge, vous devez arrêter le débogage et redémarrer avec une nouvelle version du code.

Le mécanisme Edit and Continue gère la plupart des types de modifications de code dans les corps de méthode. Toutefois, la plupart des modifications en dehors des corps de méthode et quelques modifications dans les corps de méthode ne peuvent pas être appliquées pendant le débogage. Pour appliquer ces modifications non prises en charge, vous devez arrêter le débogage et redémarrer avec une nouvelle version du code.

Modifications prises en charge pour coder

Le tableau suivant montre les modifications qui peuvent être apportées au code C# et Visual Basic pendant une session de débogage sans redémarrer la session.

Élément ou fonctionnalité de langue Opération de modification prise en charge Limitations
Catégories Ajouter des méthodes, des champs, des constructeurs, etc. Oui
Iterators Ajouter ou modifier Non
Expressions async/await Ajouter ou modifier Oui
Objets dynamiques Ajouter ou modifier Non
Expressions lambda Ajouter ou modifier Oui
Expressions LINQ Ajouter ou modifier Identique aux expressions lambda
Génériques Ajouter ou modifier Oui
Élément ou fonctionnalité de langage Opération de modification prise en charge Limitations
Types Ajouter des méthodes, des champs, des constructeurs, etc. Oui
Itérateurs Ajouter ou modifier Non
Expressions async/await Ajouter ou modifier Oui
Objets dynamiques Ajouter ou modifier Non
Expressions lambda Ajouter ou modifier Oui
Expressions LINQ Ajouter ou modifier Identique aux expressions lambda

Remarque

Les fonctionnalités de langage plus récentes, telles que l’interpolation de chaîne et les opérateurs conditionnels null, sont généralement prises en charge par Edit et Continue. Pour obtenir les informations les plus récentes, consultez la page Modifications prises en charge par Enc .

Améliorations apportées à .NET 6+

Les améliorations apportées à .NET 6+ et Visual Studio 2022 et versions ultérieures incluent la prise en charge d’autres types de modifications qui dépassent ce qui était initialement possible dans les versions antérieures de Visual Studio. Ces améliorations sont disponibles à la fois pour le rechargement à chaud et les expériences Modifier et Continuer.

L'expérience de rechargement à chaud de .NET 6+ repose sur le mécanisme Modifier et Continuer ainsi que sur Roslyn. Modifications prises en charge répertorie les types de modifications actuellement pris en charge par Roslyn et les améliorations futures potentielles.

Modifications non prises en charge pour coder

Les modifications suivantes ne peuvent pas être appliquées au code C# et Visual Basic pendant une session de débogage.

  • Modifications à l'instruction en cours ou à toute autre instruction active.

    Une instruction active est une instruction dans une fonction de la pile des appels qui a été appelée pour accéder à l’instruction actuelle.

    La déclaration actuelle apparaît sur un arrière-plan jaune dans la fenêtre source. D’autres instructions actives apparaissent sur un arrière-plan ombré et sont en mode lecture seule. Ces couleurs par défaut peuvent être modifiées dans la boîte de dialogue Options .

  • Toute modification non prise en charge du code par élément de langage, comme indiqué dans le tableau suivant.

    Élément ou fonctionnalité linguistique Opération de modification non prise en charge
    Tous les éléments de code Renommage
    Espaces de noms Ajouter
    Espaces de noms, types, membres Supprimer
    Interfaces Modifier
    Types Ajouter un membre abstrait ou virtuel, ajouter un remplacement (voir les détails)
    Types Ajouter un destructeur
    Membres - Modifier un membre référençant un type d’interopérabilité incorporé
    - Modifier un membre statique une fois qu’il a déjà été accédé en exécutant du code
    Membres (Visual Basic) - Modifier un membre avec l’instruction En cas d’erreur ou Reprendre
    - Modifier un membre contenant une clause de requête Aggregate, Group By, Simple Join ou Group Join LINQ
    Méthode - Modifier les signatures
    - Rendre une méthode abstraite devenir nonabstract en ajoutant un corps de méthode
    - Supprimer un corps de méthode
    Attributs Ajouter ou modifier
    Événements ou propriétés Modifier un paramètre de type, un type de base, un type délégué ou un type de retour
    Opérateurs ou indexeurs Modifier un paramètre de type, un type de base, un type délégué ou un type de retour
    Blocs catch Modifier lorsqu’elle contient une instruction active
    Blocs try-catch-finally Modifier lorsqu’elle contient une instruction active
    Instructions using Ajouter
    méthodes asynchrones/lambdas Modifier une méthode asynchrone/lambda dans un projet ciblant .NET Framework 4 et inférieur (voir détails)
    Itérateurs Modifier un itérateur dans un projet ciblant .NET Framework 4 et versions antérieures (voir détails)
    Élément ou fonctionnalité de langue Opération de modification non prise en charge
    Tous les éléments de code Changement de nom
    Espaces de noms Ajouter
    Espaces de noms, types, membres Supprimer
    Génériques Ajouter ou modifier
    Interfaces Modifier
    Types Ajouter un membre abstrait ou virtuel, ajouter un remplacement (voir les détails)
    Types Ajouter un destructeur
    Membres - Modifier un membre référençant un type d’interopérabilité incorporé
    - Modifier un membre statique une fois qu’il a déjà été accédé en exécutant du code
    Membres (Visual Basic) - Modifier un membre avec l’instruction En cas d’erreur ou Reprendre
    - Modifier un membre contenant une clause de requête Aggregate, Group By, Simple Join ou Group Join LINQ
    Méthode - Modifier les signatures
    - Rendre une méthode abstraite devenir nonabstract en ajoutant un corps de méthode
    - Supprimer un corps de méthode
    Attributs Ajouter ou modifier
    Événements ou propriétés Modifier un paramètre de type, un type de base, un type délégué ou un type de retour
    Opérateurs ou indexeurs Modifier un paramètre de type, un type de base, un type délégué ou un type de retour
    Blocs catch Modifier lorsqu’elle contient une instruction active
    Blocs try-catch-finally Modifier lorsqu’elle contient une instruction active
    Instructions using Ajouter
    méthodes asynchrones/lambdas Modifier une méthode asynchrone/lambda dans un projet ciblant .NET Framework 4 et inférieur (voir détails)
    Itérateurs Modifier un itérateur dans un projet ciblant .NET Framework 4 et versions antérieures (voir détails)

Code non sécurisé

Les modifications apportées au code non sécurisé ont les mêmes limitations que les modifications apportées au code sécurisé, avec une restriction supplémentaire : Modifier et Continuer ne prend pas en charge les modifications apportées au code non sécurisé qui se termine dans une méthode qui contient l’opérateur stackalloc.

Prise en charge des applications

Les applications prises en charge sont les suivantes :

  • Applications UWP dans Windows 10 ou Windows 11
  • Applications x86 et x64 qui ciblent le .NET Framework 4.6 ou des versions ultérieures sur bureau (le .NET Framework est une version uniquement pour bureau)

Pour .NET 6 et versions ultérieures, la modification est prise en charge pour les types de fichiers suivants :

  • .cshtml
  • .razor

Applications, plateformes et opérations non prises en charge

Les applications ou plateformes non prises en charge sont les suivantes :

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

Pour ASP.NET et ASP.NET Core, la modification n’est pas prise en charge pour les types de fichiers suivants :

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

Scénarios non pris en charge

Modifier et continuer n’est pas disponible dans les scénarios de débogage suivants :

  • Débogage en mode mixte (natif/managé).

  • Débogage sur Arm64 sans cibler .NET 7 ou version ultérieure.

  • Débogage avec la variable d'environnement COR_ENABLE_PROFILING définie.

  • Débogage d’une application à l’aide de l’attachement au processus (Déboguer > Attacher au processus) au lieu d’exécuter l’application en choisissant Démarrer dans le menu Déboguer. Si vous souhaitez utiliser Modifier et continuer lors de l’attachement à un processus, la variable d’environnement COMPLUS_ForceENC doit être définie avant le lancement du processus (set COMPLUS_ForceENC=1).

  • Débogage avec des versions d’assembly non déterministes (par exemple, basées sur le temps). Si vous souhaitez utiliser Edit and Continue, envisagez de définir la version uniquement dans les builds Release (ou CI) et de conserver la version dans les builds Debug.

  • Débogage de code optimisé.

  • Débogage SQL.

  • Débogage d'un fichier dump.

  • Débogage d’une application runtime incorporée.

  • Le débogage d'une ancienne version de votre code après qu'une nouvelle version a échoué à se compiler en raison d'erreurs de compilation.