Changements de runtime pour la migration vers .NET Framework 4.8.x

Cet article répertorie les problèmes de compatibilité des applications qui ont été introduits dans .NET Framework 4.8 et 4.8.1.

.NET Framework 4.8

ASP.NET

Correctif ASP.NET sur la gestion de InputAttributes et LabelAttributes du contrôle WebForms CheckBox

Détails

Pour les applications qui ciblent .NET Framework 4.7.2 et versions antérieures, CheckBox.InputAttributes et CheckBox.LabelAttributes qui sont ajoutés programmatiquement à un contrôle CheckBox WebForms sont perdus après la publication (postback). Pour les applications qui ciblent .NET Framework 4.8 ou versions ultérieures, ils sont conservés après la publication (postback).

Suggestion

Pour obtenir le bon comportement de restauration des attributs lors de la publication (postback), définissez targetFrameworkVersion sur 4.8 ou ultérieur. Par exemple :

<configuration>
<system.web>
<httpRuntime targetFramework="4.8"/>
</system.web>
</configuration>

La définir avec une version antérieure ou ne pas la définir du tout revient à conserver l’ancien comportement incorrect.

Nom Valeur
Étendue Unknown
Version 4.8
Type Runtime

API affectées

La mauvaise gestion multipartite d’ASP.NET peut entraîner la perte de données de formulaire.

Détails

Dans les applications qui ciblent .NET Framework 4.7.2 et versions antérieures, ASP.NET risque de mal analyser les valeurs limites multipartites, ce qui entraîne l’indisponibilité de données de formulaire pendant l’exécution de la requête. Les applications qui ciblent .NET Framework 4.8 ou versions ultérieures analysent correctement les données multipartites pour que les valeurs de formulaire soient disponibles lors de l’exécution de la requête.

Suggestion

À compter des applications qui s’exécutent sur .NET Framework 4.8, quand vous ciblez .NET Framework 4.8 ou ultérieur à l’aide de l’élément targetFrameworkVersion, le comportement par défaut change pour supprimer les délimiteurs. Lorsque vous ciblez des versions de Framework précédentes ou n’utilisez pas targetFrameworkVersion, les délimiteurs de fin pour certaines valeurs sont toujours retournés.

Ce comportement peut également être contrôlé explicitement avec un appSetting :

<configuration>
<appSettings>
...
<add key="aspnet:UseLegacyMultiValueHeaderHandling"  value="true"/>
...
</appSettings>
</configuration>
Nom Valeur
Étendue Unknown
Version 4.8
Type Runtime

API affectées

ASP.NET ValidationContext.MemberName n’est pas NULL lors de l’utilisation d’un DataAnnotations.ValidationAttribute personnalisé

Détails

Dans .NET Framework 4.7.2 et versions antérieures, quand vous utilisez un System.ComponentModel.DataAnnotations.ValidationAttribute personnalisé, la propriété ValidationContext.MemberName retourne null. Dans les versions de .NET Framework 4.8 antérieures à la mise à jour d’octobre 2019, elle retourne le nom du membre. À compter de .NET Framework October 2019 Preview of Quality Rollup pour .NET Framework 4.8, elle retourne par défaut null, mais vous pouvez choisir de retourner le nom du membre.

Suggestion

Ajoutez le paramètre suivant à votre fichier web.config pour que la propriété retourne le nom du membre dans .NET Framework 2019 Preview of Quality Rollup pour NET Framework 4.8 et ultérieur :

<configuration>
<appSettings>
...
<add key="aspnet:GetValidationMemberName"  value="true"/>
...
</appSettings>
</configuration>

Dans les versions de .NET Framework 4.8 antérieures à la mise à jour d’octobre 2019, cet ajout à votre fichier web.config restaure le comportement précédent et la propriété retourne null.

Nom Valeur
Étendue Unknown
Version 4.8
Type Runtime

API affectées

Core

.NET COM marshale avec succès les paramètres ByRef SafeArray sur les événements

Détails

Dans .NET Framework 4.7.2 et versions antérieures, le marshaling en code natif d’un paramètre ByRef SafeArray sur un événement COM était voué à l’échec. Avec cette modification, le SafeArray est maintenant correctement marshalé.

  • [ x ] Quirked

Suggestion

Si les paramètres ByRef SafeArray correctement marshalés sur des événements COM interromptent l’exécution, vous pouvez désactiver ce code en ajoutant le commutateur de configuration suivant à la configuration de votre application :

<appSettings>
  <add key="Switch.System.Runtime.InteropServices.DoNotMarshalOutByrefSafeArrayOnInvoke" value="true" />
</appSettings>
Nom Valeur
Étendue Secondaire
Version 4.8
Type Runtime

API affectées

Non détectable via l’analyse des API.

.NET Interop effectue désormais un QI pour IAgileObject (interface WinRT)

Détails

Lorsque vous utilisez un événement WinRT avec un délégué .NET, Windows effectue un QI (QueryInterface) pour IAgileObject à compter de .NET Framework 4.8. Dans les versions précédentes de .NET Framework, le runtime échouait et l’événement ne pouvait pas être inscrit.

  • [ x ] Quirked

Suggestion

Si l’activation de QI pour IAgileObject arrête l’exécution, vous pouvez désactiver ce code en définissant la configuration suivante.

Méthode 1 : Variable d’environnement

Définissez la variable d’environnement suivante : COMPLUS_DisableCCWSupportIAgileObject=1

Cette méthode affecte tout environnement qui hérite de cette variable d’environnement. Elle peut affecter juste une session de console ou affecter l’ordinateur entier si vous définissez la variable d’environnement de façon globale. Le nom de la variable d’environnement ne respecte pas la casse.

Méthode 2 : Registre

À l’aide de l’Éditeur de Registre (regedit.exe), recherchez l’une des sous-clés suivantes :

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework
  • HKEY_CURRENT_USER\SOFTWARE\Microsoft.NETFramework

Ajoutez ensuite l’entrée suivante :

Nom : DisableCCWSupportIAgileObject Type : Valeur DWORD (32 bits) (également appelée REG_DWORD) Données : 1

Vous pouvez utiliser l’outil Windows REG.EXE pour ajouter cette valeur à partir d’une ligne de commande ou d’un environnement de script. Par exemple :

reg add HKLM\SOFTWARE\Microsoft.NETFramework /v DisableCCWSupportIAgileObject /t REG_DWORD /d 1

Dans ce cas, HKLM peut être utilisé à la place de HKEY_LOCAL_MACHINE. Utilisez reg add /? pour afficher l’aide sur cette syntaxe. Le nom de la valeur de Registre ne respecte pas la casse.

Nom Valeur
Étendue Edge
Version 4.8
Type Runtime

API affectées

Non détectable via l’analyse des API.

Windows Communication Foundation (WCF)

Changement du contraste élevé des contrôles ComboBox svcTraceViewer

Détails

Dans l’outil Microsoft Service Trace Viewer, les contrôles ComboBox n’étaient pas affichés dans la bonne couleur dans certains thèmes à contraste élevé. Le problème a été résolu dans .NET Framework 4.7.2. Toutefois, en raison des besoins de compatibilité descendante des kits SDK du .NET Framework, le correctif n’était pas visible pour les clients par défaut. .NET 4.8 fait apparaître ce changement en ajoutant les commutateurs de configuration AppContext suivants dans le fichier svcTraceViewer.exe.config :

<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false" />

Suggestion

Si vous ne voulez pas accepter ce changement de comportement du contraste élevé, vous pouvez le désactiver en supprimant la section suivante du fichier svcTraceViewer.exe.config :

<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false" />
Nom Valeur
Étendue Edge
Version 4.8
Type Runtime

API affectées

Non détectable via l’analyse des API.

Windows Presentation Foundation (WPF)

Amélioration de la liaison de données pour KeyedCollection

Détails

Correction d’une mauvaise utilisation de Binding par l’indexeur IList quand l’objet source déclare un indexeur personnalisé avec la même signature (par exemple, KeyedCollection<int,TItem>).

Suggestion

Pour qu’une application ciblant une ancienne version tire parti de ce changement, elle doit s’exécuter sur .NET Framework 4.8 ou ultérieur et accepter le changement en ajoutant le commutateur AppContext suivant à la section <runtime> du fichier de configuration d’application et en le définissant sur false :

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
</startup>
<runtime>
<!-- AppContextSwitchOverrides value attribute is in the form of key1=true/false;key2=true/false  -->
<AppContextSwitchOverrides value="Switch.System.Windows.Data.Binding.IListIndexerHidesCustomIndexer=false" />
</runtime>
</configuration>
Nom Valeur
Étendue Majeure
Version 4.8
Type Runtime

API affectées

Non détectable via l’analyse des API.

Correction d’un problème où ListBox cesse de répondre s’il contient des types de valeurs en doublon

Détails

Correction d’un problème où un ItemsControl de virtualisation peut cesser de répondre pendant le défilement quand sa collection Items contient des objets de valeurs en doublon.

Nom Valeur
Étendue Majeure
Version 4.8
Type Runtime

API affectées

Non détectable via l’analyse des API.

Améliorations de l’algorithme d’allocation d’espace aux lignes étoile d’une grille

Détails

Correction d’un bogue dans l’algorithme d’allocation de tailles à ) dans une Grid introduite dans .NET Framework 4.7. Dans certains cas, comme dans une grille avec Height=&quot;Auto&quot; contenant des lignes vides, les lignes ont été réorganisées à la mauvaise position, peut-être même en dehors de la grille.

Suggestion

L’application doit s’exécuter sur .NET Framework 4.8 ou ultérieur pour tirer parti de ces changements.

Nom Valeur
Étendue Majeure
Version 4.8
Type Runtime

API affectées

Non détectable via l’analyse des API.

Détails

Correction du résultat d’un appui sur une touche de direction quand le focus est sur un lien hypertexte dans un élément qui n’est pas l’élément sélectionné du ItemsControl parent.

Nom Valeur
Étendue Majeure
Version 4.8
Type Runtime

API affectées

Non détectable via l’analyse des API.

Amélioration des performances dans l’arborescence Automation pour regrouper les ItemsControls

Détails

Performances améliorées de la reconstruction de l’arborescence Automation d’un ItemsControl, tel qu’un ListBox ou un DataGrid, dans lequel le regroupement est activé.

Nom Valeur
Étendue Majeure
Version 4.8
Type Runtime

API affectées

Non détectable via l’analyse des API.

.NET Framework 4.8.1

Aucun problème de compatibilité des applications n’a été introduit dans .NET Framework 4.8.1.