Changements de runtime pour la migration vers .NET Framework 4.6.x
Cet article répertorie les problèmes de compatibilité des applications introduits dans .NET Framework 4.6, 4.6.1 et 4.6.2.
.NET Framework 4.6
ASP.NET
Les contrôles GridView avec la valeur true définie pour AllowCustomPaging peuvent déclencher l’événement PageIndexChanging en quittant la dernière page de la vue
Détails
Un bogue dans .NET Framework 4.5 contraint parfois System.Web.UI.WebControls.GridView.PageIndexChanging à ne pas se déclencher pour les System.Web.UI.WebControls.GridView qui ont activé System.Web.UI.WebControls.GridView.AllowCustomPaging.
Suggestion
Ce problème a été corrigé dans .NET Framework 4.6 et vous pouvez le résoudre en effectuant la mise à niveau vers cette version du .NET Framework. Comme solution de contournement, l’application peut effectuer une opération BindGrid explicite sur n’importe quel Page_Load
qui répond à ces conditions (le contrôle System.Web.UI.WebControls.GridView figure dans la dernière page et LastSystem.Web.UI.WebControls.GridView.PageSize est différent de System.Web.UI.WebControls.GridView.PageSize). L’application peut également être modifiée pour autoriser la pagination (au lieu de la pagination personnalisée), comme ce scénario ne présente pas le problème.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4,5 |
Type | Runtime |
API affectées
Core
Un ConcurrentDictionary sérialisé dans .NET Framework 4.5 avec NetDataContractSerializer ne peut pas être désérialisé par .NET Framework 4.5.1 ni 4.5.2
Détails
En raison des modifications internes apportées au type, les objets ConcurrentDictionary<TKey,TValue> qui sont sérialisés avec .NET Framework 4.5 à l’aide de System.Runtime.Serialization.NetDataContractSerializer ne peuvent pas être désérialisés dans .NET Framework 4.5.1 ni .NET Framework 4.5.2. Notez toutefois que l’inverse fonctionne (c’est-à-dire sérialiser avec .NET Framework 4.5.x et désérialiser avec .NET Framework 4.5). De même, toutes les sérialisations interversions 4.x fonctionnent avec .NET Framework 4.6. La sérialisation et la désérialisation à l’aide d’une même version du .NET Framework ne sont pas affectées.
Suggestion
S’il est nécessaire de sérialiser et de désérialiser System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> entre .NET Framework 4.5 et .NET Framework 4.5.1/4.5.2, un sérialiseur comme System.Runtime.Serialization.DataContractSerializer doit être utilisé au lieu de System.Runtime.Serialization.NetDataContractSerializer. Étant donné que ce problème a été résolu dans le .NET Framework 4.6, vous pouvez également mettre à niveau votre version du .NET Framework.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.5.1 |
Type | Runtime |
API affectées
Non détectable via l’analyse des API.
AppDomainSetup.DynamicBase n’est plus aléatoire en activant UseRandomizedStringHashAlgorithm
Détails
Avant .NET Framework 4.6, la valeur de DynamicBase était aléatoire entre les domaines d’application, ou entre les processus, si UseRandomizedStringHashAlgorithm était activé dans le fichier de configuration de l’application. À compter de .NET Framework 4.6, DynamicBase retourne un résultat stable entre différentes instances d’une application en cours d’exécution et entre différents domaines d’application. Les bases dynamiques seront toujours différentes pour différentes applications ; cette modification supprime uniquement l’élément de nommage aléatoire pour différentes instances de la même application.
Suggestion
Gardez à l’esprit que l’activation de UseRandomizedStringHashAlgorithm
ne rendra pas DynamicBase aléatoire. Si une base aléatoire est nécessaire, elle doit être générée dans le code de votre application plutôt que via cette API.
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4.6 |
Type | Runtime |
API affectées
L’appel d’Attribute.GetCustomAttributes sur une propriété d’indexeur ne lève plus d’exception AmbiguousMatchException si l’ambiguïté peut être résolue par type d’index
Détails
Avant le .NET Framework 4.6, l’appel de GetCustomAttribute(s)
sur une propriété d’indexeur qui différait d’une autre propriété uniquement par son type d’index entraînait une System.Reflection.AmbiguousMatchException. À compter de la version 4.6 du .NET Framework, les attributs de la propriété sont correctement retournés.
Suggestion
Notez que GetCustomAttribute(s) fonctionne plus fréquemment à présent. Si une application comptait sur l’exception System.Reflection.AmbiguousMatchException, utilisez la réflexion pour rechercher explicitement plusieurs indexeurs.
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4.6 |
Type | Runtime |
API affectées
- Attribute.GetCustomAttribute(MemberInfo, Type)
- Attribute.GetCustomAttribute(MemberInfo, Type, Boolean)
- Attribute.GetCustomAttributes(MemberInfo)
- Attribute.GetCustomAttributes(MemberInfo, Boolean)
- Attribute.GetCustomAttributes(MemberInfo, Type)
- Attribute.GetCustomAttributes(MemberInfo, Type, Boolean)
- CustomAttributeExtensions.GetCustomAttribute(MemberInfo, Type)
- CustomAttributeExtensions.GetCustomAttribute(MemberInfo, Type, Boolean)
- CustomAttributeExtensions.GetCustomAttribute<T>(MemberInfo)
- CustomAttributeExtensions.GetCustomAttribute<T>(MemberInfo, Boolean)
- CustomAttributeExtensions.GetCustomAttributes(MemberInfo)
- CustomAttributeExtensions.GetCustomAttributes(MemberInfo, Boolean)
- CustomAttributeExtensions.GetCustomAttributes(MemberInfo, Type)
- CustomAttributeExtensions.GetCustomAttributes(MemberInfo, Type, Boolean)
- CustomAttributeExtensions.GetCustomAttributes<T>(MemberInfo)
- CustomAttributeExtensions.GetCustomAttributes<T>(MemberInfo, Boolean)
Les membres COR_PRF_GC_ROOT_HANDLE ne sont pas énumérés par les profileurs
Détails
Dans .NET Framework 4.5.1, l’API de profilage RootReferences2()
ne retourne jamais correctement COR_PRF_GC_ROOT_HANDLE
(ils sont retournés comme COR_PRF_GC_ROOT_OTHER
à la place). Ce problème est résolu depuis .NET Framework 4.6.
Suggestion
Ce problème a été corrigé dans .NET Framework 4.6 et vous pouvez le résoudre en effectuant la mise à niveau vers cette version du .NET Framework.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.5.1 |
Type | Runtime |
API affectées
Non détectable via l’analyse des API.
Les EventListeners ETW ne capturent pas les événements provenant de fournisseurs avec des mots clés explicites (comme le fournisseur TPL)
Détails
Les EventListeners ETW avec un masque de mot clé vide ne capturent pas correctement les événements provenant de fournisseurs ayant des mots clés explicites. Dans le .NET Framework 4.5, le fournisseur TPL fournissait des mots clés explicites et provoquait ce problème. Dans le .NET Framework 4.6, les EventListeners ont été mis à jour pour ne plus causer ce problème.
Suggestion
Pour contourner ce problème, remplacez les appels à EnableEvents(EventSource, EventLevel) par les appels à la surcharge EnableEvents qui spécifie explicitement le masque « any keywords » à utiliser : EnableEvents(eventSource, level, unchecked((EventKeywords)0xFFFFffffFFFFffff))
.
Étant donné que ce problème a été résolu dans le .NET Framework 4.6, vous pouvez également mettre à niveau votre version du .NET Framework.
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4,5 |
Type | Runtime |
API affectées
Le calendrier persan utilise désormais l’algorithme solaire hégirien
Détails
À compter de .NET Framework 4.6, la classe System.Globalization.PersianCalendar utilise l’algorithme solaire hégirien. La conversion de dates entre le calendrier System.Globalization.PersianCalendar et les autres calendriers peut produire un résultat légèrement différent à compter de .NET Framework 4.6 pour les dates antérieures à 1800 ou postérieures à 2023 (calendrier grégorien). De plus, PersianCalendar.MinSupportedDateTime est désormais March 22, 0622
au lieu de March 21, 0622
.
Suggestion
Notez que certaines dates anciennes ou futures peuvent être légèrement différentes quand vous utilisez le calendrier persan dans .NET Framework 4.6. En outre, quand vous sérialisez des dates dans plusieurs processus qui peuvent s’exécuter sur des versions différentes du .NET Framework, ne les stockez pas sous forme de chaînes de date PersianCalendar (puisque ces valeurs peuvent être différentes).
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6 |
Type | Runtime |
API affectées
Les objets de réflexion ne peuvent plus être passés du code managé aux clients DCOM hors processus
Détails
Les objets de réflexion ne peuvent plus être passés du code managé aux clients DCOM hors processus. Les types suivants sont concernés :
- System.Reflection.Assembly
- System.Reflection.MemberInfo (et ses types dérivés, dont System.Reflection.FieldInfo, System.Reflection.MethodInfo, System.Type et System.Reflection.TypeInfo)
- System.Reflection.MethodBody
- System.Reflection.Module
- System.Reflection.ParameterInfo
Les appels à IMarshal
pour l’objet retournent E_NOINTERFACE
.
Suggestion
Mettez à jour le code de marshaling pour qu’il fonctionne avec des objets sans réflexion.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6 |
Type | Runtime |
API affectées
- System.Reflection.Assembly
- System.Reflection.FieldInfo
- System.Reflection.MemberInfo
- System.Reflection.MethodBody
- System.Reflection.MethodInfo
- System.Reflection.Module
- System.Reflection.ParameterInfo
- System.Reflection.TypeInfo
- System.Type
Dans le domaine d’application par défaut, TargetFrameworkName ne prend plus la valeur Null par défaut quand il n’est pas défini
Détails
Avant, System.AppDomainSetup.TargetFrameworkName était défini sur la valeur Null dans le domaine d’application par défaut quand il n’était pas défini explicitement. À compter de la version 4.6, la valeur par défaut de la propriété System.AppDomainSetup.TargetFrameworkName du domaine d’application par défaut est dérivée de TargetFrameworkAttribute (si celui-ci est présent). Les domaines d’application autres que ceux par défaut continuent d’hériter leur valeur System.AppDomainSetup.TargetFrameworkName du domaine d’application par défaut (qui n’aura pas la valeur Null par défaut dans la version 4.6), sauf si cette valeur est substituée explicitement.
Suggestion
Le code doit être mis à jour pour ne pas attendre que TargetFrameworkName ait la valeur Null par défaut. Si vous avez besoin que cette propriété continue de prendre la valeur Null, vous pouvez la définir explicitement sur cette valeur.
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4.6 |
Type | Runtime |
API affectées
X509Certificate2.ToString(Boolean) ne lève plus d’exception quand .NET ne peut pas gérer le certificat
Détails
Dans .NET Framework 4.5.2 et antérieur, cette méthode levait une exception quand la valeur true
était passée au paramètre verbose alors que des certificats non pris en charge par le .NET Framework étaient installés. À présent, la méthode n’échoue plus et retourne une chaîne valide qui omet les parties inaccessibles du certificat.
Suggestion
Le code qui dépend de X509Certificate2.ToString(Boolean) doit être mis à jour pour s’attendre à ce que la chaîne retournée omette certaines données du certificat (telles que la clé publique, la clé privée et les extensions), ce qui aurait auparavant entraîné la levée d’une exception par l’API.
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4.6 |
Type | Runtime |
API affectées
Données
Une tentative de connexion TCP/IP à une base de données SQL Server qui se résout en localhost
échoue
Détails
Dans .NET Framework 4.6 et 4.6.1, une tentative de connexion TCP/IP à une base de données SQL Server qui se résout en localhost
échoue avec l’erreur « Une erreur liée au réseau ou spécifique à l’instance s’est produite lors de l’établissement d’une connexion au Serveur SQL. Le serveur est introuvable ou inaccessible. Vérifiez que le nom de l’instance est correct et que SQL Server est configuré pour autoriser les connexions à distance. (Fournisseur : interface réseau SQL, Erreur : 26 - Erreur lors de la localisation du serveur/de l’instance spécifiés) »
Suggestion
Ce problème a été résolu et le comportement précédent a été restauré dans .NET Framework 4.6.2. Pour vous connecter à une base de données SQL Server qui se résout en localhost
, effectuez une mise à niveau vers .NET Framework 4.6.2.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6 |
Type | Runtime |
API affectées
Non détectable via l’analyse des API.
Débogueur
Les valeurs de fusion Null ne sont pas visibles dans le débogueur jusqu’à une étape ultérieure
Détails
Un bogue dans.NET Framework 4.5 empêche de voir les valeurs définies via une opération de fusion Null dans le débogueur immédiatement après le déroulement de l’opération d’assignation lors de l’exécution de la version 64 bits du .NET Framework.
Suggestion
Une nouvelle exécution pas à pas dans le débogueur entraînera la mise à jour correcte de la valeur locale/du champ. Par ailleurs, ce problème a été corrigé dans .NET Framework 4.6 et vous pouvez le résoudre en effectuant la mise à niveau vers cette version du .NET Framework.
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4,5 |
Type | Runtime |
API affectées
Non détectable via l’analyse des API.
Mise en réseau
Les DateTime ContentDisposition retournent une chaîne légèrement différente
Détails
À compter de la version 4.6, les représentations sous forme de chaîne des System.Net.Mime.ContentDisposition ont été mises à jour pour toujours représenter le composant d’heure d’une valeur System.DateTime avec deux chiffres. Ce changement a pour but de se conformer aux normes RFC822 et RFC2822. ToString() retourne à présent une chaîne légèrement différente dans la version 4.6, lorsque l’un des éléments d’heure de la disposition est antérieur à 10:00. Notez que les ContentDisposition sont parfois sérialisés lors de leur conversion en chaînes. Pour cette raison, les opérations ToString(), les sérialisations et les appels GetHashCode doivent être examinés.
Suggestion
Ne vous attendez pas à ce que les représentations sous forme de chaîne des ContentDisposition issues de différentes versions du .NET Framework puissent être comparées correctement. Reconvertissez les chaînes en ContentDisposition, si possible, avant d’effectuer une comparaison.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6 |
Type | Runtime |
API affectées
Sérialisation
Le message d’exception a été modifié pour l’échec de la sérialisation de DataContract dans le cas d’un type inconnu
Détails
À compter de .NET Framework 4.6, le message d’exception affiché si un System.Runtime.Serialization.DataContractSerializer ou System.Runtime.Serialization.Json.DataContractJsonSerializer ne parvient pas à sérialiser ni à désérialiser en l’absence de « types connus » a été clarifié.
Suggestion
Les applications ne doivent pas dépendre de messages d’exceptions spécifiques. Si une application dépend de ce message, mettez-la à jour pour qu’elle attende le nouveau message ou (de préférence) modifiez-la pour qu’elle dépende uniquement du type d’exception.
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4.6 |
Type | Runtime |
API affectées
- DataContractJsonSerializer(Type)
- DataContractJsonSerializer(Type, IEnumerable<Type>)
- DataContractJsonSerializer(Type, DataContractJsonSerializerSettings)
- DataContractJsonSerializer(Type, String)
- DataContractJsonSerializer(Type, String, IEnumerable<Type>)
- DataContractJsonSerializer(Type, XmlDictionaryString)
- DataContractJsonSerializer(Type, XmlDictionaryString, IEnumerable<Type>)
- DataContractJsonSerializer(Type, IEnumerable<Type>, Int32, Boolean, IDataContractSurrogate, Boolean)
- DataContractJsonSerializer(Type, String, IEnumerable<Type>, Int32, Boolean, IDataContractSurrogate, Boolean)
- DataContractJsonSerializer(Type, XmlDictionaryString, IEnumerable<Type>, Int32, Boolean, IDataContractSurrogate, Boolean)
- DataContractSerializer(Type)
- DataContractSerializer(Type, DataContractSerializerSettings)
- DataContractSerializer(Type, IEnumerable<Type>)
- DataContractSerializer(Type, String, String)
- DataContractSerializer(Type, String, String, IEnumerable<Type>)
- DataContractSerializer(Type, XmlDictionaryString, XmlDictionaryString)
- DataContractSerializer(Type, XmlDictionaryString, XmlDictionaryString, IEnumerable<Type>)
- DataContractSerializer(Type, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate)
- DataContractSerializer(Type, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate, DataContractResolver)
- DataContractSerializer(Type, String, String, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate)
- DataContractSerializer(Type, String, String, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate, DataContractResolver)
- DataContractSerializer(Type, XmlDictionaryString, XmlDictionaryString, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate)
- DataContractSerializer(Type, XmlDictionaryString, XmlDictionaryString, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate, DataContractResolver)
Configuration et déploiement
Modifications de la gestion de versions de produit dans .NET Framework 4.6 et versions ultérieures
Détails
La gestion des versions de produit a changé depuis les mises en production précédentes du .NET Framework, notamment par rapport à .NET Framework 4, 4.5, 4.5.1 et 4.5.2. Voici le détail des modifications :
- La valeur de l’entrée
Version
dans la cléHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
a été remplacée par4.6.xxxxx
pour .NET Framework 4.6 et ses versions intermédiaires, et par4.7.xxxxx
pour .NET Framework 4.7 et 4.7.1. Dans .NET Framework 4.5, 4.5.1 et 4.5.2, elle était au format4.5.xxxxx
. - La gestion de versions de produit et de fichier pour les fichiers du .NET Framework est passée de l’ancien schéma 4.0.30319.x au schéma 4.6.X.0 pour .NET Framework 4.6 et ses versions intermédiaires, et au schéma 4.7.X.0 pour .NET Framework 4.7 et 4.7.1. Pour voir ces nouvelles valeurs, cliquez avec le bouton droit sur un fichier, puis affichez ses propriétés.
- Les attributs AssemblyFileVersionAttribute et AssemblyInformationalVersionAttribute pour les assemblys managés ont des valeurs Version au format 4.6.X.0 pour .NET Framework 4.6 et ses versions intermédiaires, et 4.7.X.0 pour .NET Framework 4.7 et 4.7.1.
- Dans .NET Framework 4.6, 4.6.1, 4.6.2, 4.7 et 4.7.1, la propriété Environment.Version retourne la chaîne de version fixe
4.0.30319.42000
. Dans le .NET Framework 4, 4.5, 4.5.1 et 4.5.2, elle retourne les chaînes de version au format4.0.30319.xxxxx
(par exemple, « 4.0.30319.18010 »). Notez que nous ne recommandons pas que le code d’application prenne de nouvelles dépendances sur la propriété Environment.Version.
Pour plus d’informations, consultez Guide pratique pour déterminer les versions du .NET Framework installées.
Suggestion
En général, les applications doivent s'appuyer sur les techniques recommandées pour la détection d'éléments tels que la version de runtime du .NET Framework et le répertoire d'installation :
- Pour détecter la version de runtime du .NET Framework, consultez Guide pratique pour déterminer les versions .NET Framework installées.
- Pour déterminer le chemin d'installation du .NET Framework, utilisez la valeur de l'entrée
InstallPath
dans la cléHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
.
Important
Le nom de la sous-clé est NET Framework Setup
, et non .NET Framework Setup
.
- Pour déterminer le chemin d'accès du répertoire du Common Language Runtime du .NET Framework, appelez la méthode RuntimeEnvironment.GetRuntimeDirectory().
- Pour obtenir la version du CLR, appelez la méthode RuntimeEnvironment.GetSystemVersion(). Pour .NET Framework 4 et ses versions intermédiaires (.NET Framework 4.5, 4.5.1, 4.5.2 ainsi que .NET Framework 4.6, 4.6.1, 4.6.2, 4.7 et 4.7.1), elle retourne la chaîne v4.0.30319.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6 |
Type | Runtime |
API affectées
Non détectable via l’analyse des API.
.NET Framework 4.6 n’utilise pas une version 4.5.x.x lors de son inscription dans le Registre
Détails
Comme prévu, la clé de version définie dans le Registre (au niveau HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v4\Full
) pour .NET Framework 4.6 commence par 4.6 et non 4.5. Les applications qui dépendent de ces clés de Registre pour savoir quelles versions du .NET Framework sont installées sur un ordinateur doivent être mises à jour afin de comprendre que 4.6 est une nouvelle version possible et qui est compatible avec les précédentes versions 4.5.x.
Suggestion
Mettez à jour les applications qui cherchent à découvrir une installation de .NET Framework 4.5 en recherchant les clés de Registre 4.5 pour accepter également 4.6.
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4.6 |
Type | Runtime |
API affectées
Non détectable via l’analyse des API.
Windows Communication Foundation (WCF)
Services WCF qui utilisent NETTCP avec la sécurité SSL et l’authentification par certificat MD5
Détails
Le .NET Framework 4.6 ajoute TLS 1.1 et TLS 1.2 à la liste des protocoles WCF SSL par défaut. Quand .NET Framework 4.6 ou ultérieur est installé sur les ordinateurs client et serveur, TLS 1.2 est utilisé à des fins de négociation. TLS 1.2 ne prend pas en charge l’authentification par certificat MD5. Par conséquent, si un client utilise un certificat MD5, le client WCF ne parviendra pas à se connecter au service WCF.
Suggestion
Vous pouvez contourner ce problème afin qu’un client WCF puisse se connecter à un serveur WCF en effectuant une des opérations suivantes :
- Mettez à jour le certificat pour ne pas utiliser l’algorithme MD5. Il s'agit de la solution recommandée.
- Si la liaison n’est pas configurée dynamiquement dans le code source, mettez à jour le fichier de configuration de l’application pour utiliser TLS 1.1 ou une version antérieure du protocole. Cela vous permet de continuer à utiliser un certificat avec l’algorithme de hachage MD5.
Avertissement
Cette solution de contournement n’est pas recommandée, car un certificat avec l’algorithme de hachage MD5 est considéré comme non sécurisé.
Le fichier de configuration suivant effectue ceci :
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding>
<security mode= "None/Transport/Message/TransportWithMessageCredential" >
<transport clientCredentialType="None/Windows/Certificate"
protectionLevel="None/Sign/EncryptAndSign"
sslProtocols="Ssl3/Tls1/Tls11">
</transport>
</security>
</binding>
</netTcpBinding>
</bindings>
</system.ServiceModel>
</configuration>
- Si la liaison est configurée dynamiquement dans le code source, mettez à jour la propriété TcpTransportSecurity.SslProtocols pour utiliser TLS 1.1 (SslProtocols.Tls11 ou une version antérieure du protocole dans le code source.
Avertissement
Cette solution de contournement n’est pas recommandée, car un certificat avec l’algorithme de hachage MD5 est considéré comme non sécurisé.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6 |
Type | Runtime |
API affectées
Non détectable via l’analyse des API.
Windows Presentation Foundation (WPF)
L’accès aux éléments sélectionnés d’un DataGrid WPF à partir d’un gestionnaire de l’événement UnloadingRow du DataGrid peut provoquer une exception NullReferenceException
Détails
En raison d’un bogue dans .NET Framework 4.5, les gestionnaires d’événements pour les événements DataGrid impliquant la suppression d’une ligne peuvent entraîner la levée d’une System.NullReferenceException s’ils accèdent aux propriétés System.Windows.Controls.Primitives.Selector.SelectedItem ou System.Windows.Controls.Primitives.MultiSelector.SelectedItems de DataGrid.
Suggestion
Ce problème a été corrigé dans .NET Framework 4.6 et vous pouvez le résoudre en effectuant la mise à niveau vers cette version du .NET Framework.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4,5 |
Type | Runtime |
API affectées
L’appel d’Items.Refresh dans un contrôle WPF ListBox, ListView ou DataGrid contenant des éléments sélectionnés peut provoquer l’apparition d’éléments en double.
Détails
Dans le .NET Framework 4.5, si vous appelez ListBox.Items.Refresh à partir du code alors que des éléments sont sélectionnés dans une System.Windows.Controls.ListBox, les éléments en question peuvent apparaître deux fois dans la liste. Un problème similaire se produit avec System.Windows.Controls.ListView et System.Windows.Controls.DataGrid. Ce problème a été résolu dans le .NET Framework 4.6.
Suggestion
Pour contourner ce problème, vous pouvez désélectionner programmatiquement les éléments avant d’appeler System.Windows.Data.CollectionView.Refresh(), puis les resélectionner une fois l’appel effectué. Étant donné que ce problème a été résolu dans le .NET Framework 4.6, vous pouvez également mettre à niveau votre version du .NET Framework.
Valeur | |
---|---|
Portée | Secondaire |
Version | 4,5 |
Type | Runtime |
API affectées
CoerceIsSelectionBoxHighlighted
Détails
Certaines séquences d’actions impliquant un System.Windows.Controls.ComboBox et sa source de données peut entraîner un System.NullReferenceException.
Suggestion
Si possible, mettre à niveau vers .NET Framework 4.6.2.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6 |
Type | Runtime |
API affectées
Problème de liaison ListBoxItem IsSelected avec ObservableCollection<T>.Move
Détails
L’appel de Move(Int32, Int32) ou de MoveItem(Int32, Int32) sur une collection liée à un System.Windows.Controls.ListBox avec des éléments sélectionnés peut entraîner un comportement imprévisible avec une sélection ultérieure ou la désélection d’éléments de System.Windows.Controls.ListBox.
Suggestion
L’appel de System.Collections.ObjectModel.Collection<T>.Remove(T) et de System.Collections.ObjectModel.Collection<T>.Insert(Int32, T) au lieu de Move(Int32, Int32) permet de contourner ce problème. Étant donné que ce problème a été résolu dans le .NET Framework 4.6, vous pouvez également mettre à niveau votre version du .NET Framework.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4,5 |
Type | Runtime |
API affectées
Un clic droit sur l’en-tête de ligne d’un DataGrid WPF modifie la sélection de la grille de données
Détails
Un clic droit sur un en-tête de ligne de System.Windows.Controls.DataGrid sélectionné alors que plusieurs lignes sont sélectionnées fait que la sélection de System.Windows.Controls.DataGrid est réduite à cette seule ligne.
Suggestion
Ce problème a été corrigé dans .NET Framework 4.6 et vous pouvez le résoudre en effectuant la mise à niveau vers cette version du .NET Framework.
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4,5 |
Type | Runtime |
API affectées
WPF génère un processus wisptis.exe qui peut figer la souris
Détails
Un problème a été introduit dans 4.5.2, qui génère un exécutable wisptis.exe
qui peut figer les entrées de la souris.
Suggestion
Un correctif pour résoudre ce problème est disponible dans une version de maintenance de .NET Framework 4.5.2 (correctif cumulatif 3026376) ou via la mise à niveau vers .NET Framework 4.6
Nom | Valeur |
---|---|
Étendue | Majeure |
Version | 4.5.2 |
Type | Runtime |
API affectées
Non détectable via l’analyse des API.
La correction orthographique WPF dans les contrôles acceptant du texte ne fonctionne pas dans Windows 10 pour les langues qui ne figurent pas dans la liste des langues d’entrée du système d’exploitation
Détails
Lors de l’exécution sur Windows 10, le vérificateur orthographique peut ne pas fonctionner pour les contrôles WPF acceptant du texte, car les fonctionnalités de vérification orthographique de la plateforme sont disponibles seulement pour les langues présentes dans la liste des langues d’entrée. Dans Windows 10, quand une langue est ajoutée à la liste des claviers disponibles, Windows télécharge et installe automatiquement un package correspondant de fonctionnalités à la demande qui fournit les fonctionnalités de vérification orthographique. En ajoutant la langue à la liste des langues d'entrée, le vérificateur d'orthographe est pris en charge.
Suggestion
Pour que cela fonctionne dans Windows 10, n’oubliez pas que la langue ou le texte à vérifier doit être ajouté comme langue d’entrée pour la vérification orthographique.
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4.6 |
Type | Runtime |
API affectées
Non détectable via l’analyse des API.
Les fenêtres WPF sont restituées sans découpage lors de l’extension en dehors d’un même écran
Détails
Dans .NET Framework 4.6 s’exécutant sur Windows 8 et ultérieur, la totalité de la fenêtre est restituée sans découpage quand elle s’étend en dehors d’un même écran dans un scénario à plusieurs écrans. Ceci diffère des versions précédentes du .NET Framework, qui découpait les fenêtres WPF étendues au-delà d’un même écran.
Suggestion
Ce comportement (découper ou non) peut être défini explicitement avec l’élément <EnableMultiMonitorDisplayClipping>
de <appSettings>
dans le fichier de configuration d’une application, ou en définissant la propriété EnableMultiMonitorDisplayClipping
au démarrage de l’application.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6 |
Type | Runtime |
API affectées
Non détectable via l’analyse des API.
.NET Framework 4.6.1
Outils
Contract.Invariant ou Contract.Requires<TException> ne considèrent pas String.IsNullOrEmpty comme pure
Détails
Pour les applications qui ciblent .NET Framework 4.6.1, si le contrat d’invariant de Contract.Invariant ou le contrat de condition préalable de Requires appelle la méthode String.IsNullOrEmpty, le module de réécriture émet l’avertissement CC1036 du compilateur : « Appel détecté à la méthode 'System.String.IsNullOrWhiteSpace(System.String)' sans [Pure] dans la méthode ». Il s’agit d’un avertissement du compilateur plutôt que d’une erreur de celui-ci.
Suggestion
Ce comportement est abordé dans le problème 339, sur le site GitHub. Pour éviter cet avertissement, vous pouvez télécharger et compiler une version mise à jour du code source pour l’outil Contrats de code sur le site GitHub. Des informations sur le téléchargement se trouvent au bas de la page.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6.1 |
Type | Runtime |
API affectées
Windows Presentation Foundation (WPF)
Défilement des éléments d’une liste plate avec des éléments de différentes hauteurs en pixels
Détails
Quand un System.Windows.Controls.ItemsControl affiche une collection avec la virtualisation (IsVirtualizing=true
) et le défilement d’éléments (ScrollUnit=Item
), et quand le contrôle fait défiler pour afficher un élément dont la hauteur en pixels diffère de celle de ses voisins, le System.Windows.Controls.VirtualizingStackPanel effectue une itération sur tous les éléments de la collection. L’interface utilisateur ne répond pas pendant cette itération. L’itération se produit dans d’autres circonstances, même dans les versions précédentes du .NET Framework. Par exemple, elle se produit lors du défilement de pixels (ScrollUnit=Pixel
) quand un élément avec une hauteur en pixels différente est rencontré et lors du défilement d’éléments de données hiérarchiques (comme dans un System.Windows.Controls.TreeView ou un System.Windows.Controls.ItemsControl avec le regroupement activé) quand un élément avec un nombre d’éléments descendants différent de celui de ses voisins est rencontré. Pour le cas du défilement d’éléments et d’une hauteur en pixels différente, l’itération a été introduite dans le .NET Framework 4.6.1 pour corriger des bogues dans la présentation des données hiérarchiques. Elle n’est pas nécessaire si les données sont plates (pas de hiérarchie) et .NET Framework 4.6.2 ne l’effectue donc pas dans ce cas.
Suggestion
Si l’itération se produit dans .NET Framework 4.6.1 mais pas dans les versions antérieures, c’est-à-dire si System.Windows.Controls.ItemsControl effectue le défilement d’éléments d’une liste plate comportant des éléments avec des hauteurs en pixels différentes, vous avez deux solutions :
- Installer .NET Framework 4.6.2
- Installer le correctif HR 1605 pour .NET Framework 4.6.1
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6.1 |
Type | Runtime |
API affectées
ObjectDisposedException levée par le vérificateur orthographique de WPF
Détails
Les applications WPF plantent parfois lors de l’arrêt de l’application avec une System.ObjectDisposedException levée par le vérificateur orthographique. Ce problème est résolu dans .NET Framework 4.7 WPF via une gestion différente de l’exception, qui permet aux applications de ne plus en être affectée de cette façon. Notez que des exceptions occasionnelles continuent d’être observées dans les applications s’exécutant sous un débogueur.
Suggestion
Mettre à niveau vers .NET Framework 4.7
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4.6.1 |
Type | Runtime |
API affectées
Non détectable via l’analyse des API.
La correction orthographique dans WPF échoue de façon inattendue
Détails
Ceci inclut plusieurs problèmes du vérificateur orthographique de WPF :
- Le vérificateur orthographique de WPF lève parfois System.Runtime.InteropServices.COMException
- Le vérificateur orthographique de WPF échoue avec UnauthorizedAccessException quand les applications sont lancées avec « Exécuter en tant qu’autre utilisateur »
- Le vérificateur orthographique de WPF identifie incorrectement des fautes d’orthographe dans les mots composés, comme « Hausnummer » en allemand.
Suggestion
Problème n° 1 : ce problème a été corrigé dans le .NET Framework 4.6.2. Problème n° 2 : le vérificateur orthographique de WPF n’est plus pris en charge quand les applications sont lancées avec « Exécuter en tant qu’autre utilisateur ». À compter du .NET Framework 4.6.2, les applications lancées de cette manière ne plantent plus de façon inattendue : à la place, le vérificateur orthographique est désactivé en mode silencieux. Problème n° 3 : ce problème a été corrigé dans le .NET Framework 4.6.2.
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4.6.1 |
Type | Runtime |
API affectées
Non détectable via l’analyse des API.
.NET Framework 4.6.2
Données
Une tentative de connexion TCP/IP à une base de données SQL Server qui se résout en localhost
échoue
Détails
Dans .NET Framework 4.6 et 4.6.1, une tentative de connexion TCP/IP à une base de données SQL Server qui se résout en localhost
échoue avec l’erreur « Une erreur liée au réseau ou spécifique à l’instance s’est produite lors de l’établissement d’une connexion au Serveur SQL. Le serveur est introuvable ou inaccessible. Vérifiez que le nom de l’instance est correct et que SQL Server est configuré pour autoriser les connexions à distance. (Fournisseur : interface réseau SQL, Erreur : 26 - Erreur lors de la localisation du serveur/de l’instance spécifiés) »
Suggestion
Ce problème a été résolu et le comportement précédent a été restauré dans .NET Framework 4.6.2. Pour vous connecter à une base de données SQL Server qui se résout en localhost
, effectuez une mise à niveau vers .NET Framework 4.6.2.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6 |
Type | Runtime |
API affectées
Non détectable via l’analyse des API.
La période de blocage du pool de connexions pour les bases de données Azure SQL Database est supprimée
Détails
À compter de .NET Framework 4.6.2, pour les demandes d’ouverture de connexion envoyées aux bases de données Azure SQL Database connues (*.database.windows.net, *.database.chinacloudapi.cn, *.database.usgovcloudapi.net, *.database.cloudapi.de), la période de blocage du pool de connexions est supprimée et les erreurs d’ouverture de connexion ne sont pas mises en cache. Chaque nouvelle tentative de demande d’ouverture de connexion se produira presque immédiatement après les erreurs de connexion temporaires. Ce changement permet aux demandes d’ouverture de connexion d’être retentées immédiatement pour les bases de données Azure SQL Database, ce qui améliore les performances des applications cloud. Pour toutes les autres tentatives de connexion, la période de blocage du pool de connexions continue d’être appliquée.
Dans .NET Framework 4.6.1 et versions antérieures, quand une application rencontre un échec temporaire durant la connexion à une base de données, la connexion ne peut pas être retentée rapidement, car le pool de connexions met l’erreur en cache, puis l’affiche de nouveau pendant une durée comprise entre 5 secondes et 1 minute. Pour plus d’informations, consultez Regroupement de connexions SQL Server (ADO.NET). Ce comportement pose problème pour les connexions aux bases de données SQL Azure, qui échouent souvent avec des erreurs temporaires, généralement rétablies au bout de quelques secondes. La fonctionnalité de blocage du pool de connexions signifie que l’application ne peut pas se connecter à la base de données pendant une période prolongée, même si la base de données est disponible et que l’application doit être affichée en quelques secondes.
Suggestion
Si ce comportement n’est pas souhaitable, la période de blocage du pool de connexions peut être configurée en définissant la propriété System.Data.SqlClient.SqlConnectionStringBuilder.PoolBlockingPeriod introduite dans .NET Framework 4.6.2. La valeur de la propriété est un membre de l’énumération System.Data.SqlClient.PoolBlockingPeriod qui peut prendre l’une des trois valeurs suivantes :
Vous pouvez restaurer le comportement précédent en affectant la valeur AlwaysBlock à la propriété System.Data.SqlClient.SqlConnectionStringBuilder.PoolBlockingPeriod.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6.2 |
Type | Runtime |
API affectées
Globalisation
Catégories de version Unicode standard 8.0 maintenant prises en charge
Détails
Dans .NET Framework 4.6.2, les données Unicode ont été mises à niveau de la version Unicode Standard 6.3 vers la version 8.0. Quand vous demandez des catégories de caractères Unicode dans .NET Framework 4.6.2, certains résultats peuvent ne pas correspondre à ceux des versions précédentes du .NET Framework. Ce changement affecte principalement les syllabes Cherokee et voyelles diacritiques nouveau taï-lue ainsi que les accents toniques.
Suggestion
Passez en revue le code et supprimez ou modifiez la logique qui varie selon les catégories de caractères Unicode codées en dur.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6.2 |
Type | Runtime |
API affectées
- Char.GetUnicodeCategory(Char)
- CharUnicodeInfo.GetUnicodeCategory(Char)
- CharUnicodeInfo.GetUnicodeCategory(String, Int32)
Sécurité
RSACng et DSACng sont à nouveau utilisables dans les scénarios de confiance partielle
Détails
CngLightup (utilisé dans plusieurs API de chiffrement de niveau supérieur, telles que System.Security.Cryptography.Xml.EncryptedXml) et System.Security.Cryptography.RSACng dans certains cas s’appuient sur la confiance totale. Ces éléments comprennent P/Invokes sans l’assertion d’autorisations SecurityPermissionFlag.UnmanagedCode et des chemins de code où System.Security.Cryptography.CngKey a des demandes d’autorisation pour SecurityPermissionFlag.UnmanagedCode. À compter de .NET Framework 4.6.2, CngLightup a été utilisé pour basculer vers System.Security.Cryptography.RSACng autant que possible. Par conséquent, les applications de confiance partielle qui utilisaient correctement System.Security.Cryptography.Xml.EncryptedXml ont commencé à échouer et à lever des exceptions SecurityException. Cette modification ajoute les assertions nécessaires afin que toutes les fonctions utilisant CngLightup disposent des autorisations requises.
Suggestion
Si cette modification dans .NET Framework 4.6.2 a eu un impact négatif sur vos applications de confiance partielle, effectuez la mise à niveau vers .NET Framework 4.7.1.
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4.6.2 |
Type | Runtime |
API affectées
- DSACng(CngKey)
- DSACng.Key
- DSACng.LegalKeySizes
- DSACng.CreateSignature(Byte[])
- DSACng.VerifySignature(Byte[], Byte[])
- RSACng(CngKey)
- RSACng.Key
- RSACng.Decrypt(Byte[], RSAEncryptionPadding)
- RSACng.SignHash(Byte[], HashAlgorithmName, RSASignaturePadding)
RSACng.VerifyHash retourne maintenant la valeur False pour tout échec de vérification
Détails
À compter de .NET Framework 4.6.2, cette méthode retourne False si le format de la signature proprement dite n’est pas correct. Elle retourne maintenant False pour tout échec de vérification. Dans .NET Framework 4.6 et 4.6.1, la méthode lève une System.Security.Cryptography.CryptographicException si le format de la signature proprement dite n’est pas correct.
Suggestion
Tout code dont l’exécution dépend de la gestion de System.Security.Cryptography.CryptographicException doit s’exécuter à la place si la validation échoue et que la méthode retourne False.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6.2 |
Type | Runtime |
API affectées
Modifications avec rupture pour SignedXml et EncryptedXml
Détails
Dans .NET Framework 4.6.2, les correctifs de sécurité dans System.Security.Cryptography.Xml.SignedXml et System.Security.Cryptography.Xml.EncryptedXml entraînent des comportements d’exécution différents. Par exemple :
- Si un document contient plusieurs éléments avec le même attribut
id
et qu’une signature cible l’un de ces éléments comme racine de la signature, le document est désormais considéré comme non valide. - Les documents utilisant des algorithmes de transformation XPath non canoniques dans les références sont désormais considérés comme non valides.
- Les documents utilisant des algorithmes de transformation XSLT non canoniques dans les références sont désormais considérés comme non valides.
- N’importe quel programme tirant parti des signatures détachées des ressources externes ne pourra plus le faire.
Suggestion
Les développeurs peuvent examiner l’utilisation de XmlDsigXsltTransform et XmlDsigXsltTransform, ainsi que les types dérivés de Transform, car un destinataire du document risque de ne pas pouvoir le traiter.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6.2 |
Type | Runtime |
API affectées
- System.Security.Cryptography.Xml.Transform
- System.Security.Cryptography.Xml.XmlDsigXPathTransform
- System.Security.Cryptography.Xml.XmlDsigXsltTransform
Windows Communication Foundation (WCF)
Suppression de Ssl3 de TransportDefaults dans WCF
Détails
Quand vous utilisez NetTcp avec la sécurité du transport et un type d’informations d’identification de certificat, le protocole SSL 3 n’est plus celui utilisé par défaut quand il s’agit de négocier une connexion sécurisée. Dans la majorité des cas, cela ne devrait pas avoir de conséquences sur les applications existantes, car TLS 1.0 a toujours figuré dans la liste de protocoles pour NetTcp. Tous les clients existants doivent pouvoir négocier une connexion en utilisant au moins TLS 1.0.
Suggestion
Si Ssl3 est exigé, utilisez l’un des mécanismes de configuration suivants pour l’ajouter à la liste des protocoles négociés.
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4.6.2 |
Type | Runtime |
API affectées
Windows Presentation Foundation (WPF)
La modification de la propriété IsEnabled du parent d’un contrôle TextBlock affecte tous les contrôles enfants
Détails
À compter du.NET Framework 4.6.2, la modification de la propriété System.Windows.UIElement.IsEnabled du parent d’un contrôle System.Windows.Controls.TextBlock affecte tous les contrôles enfants (comme les liens hypertexte et les boutons) du contrôle System.Windows.Controls.TextBlock. Dans le .NET Framework 4.6.1 et antérieur, les contrôles à l’intérieur d’une System.Windows.Controls.TextBlock ne reflétaient pas toujours l’état de la propriété System.Windows.UIElement.IsEnabled du parent de System.Windows.Controls.TextBlock.
Suggestion
Aucune. Cette modification est conforme au comportement attendu pour les contrôles à l’intérieur d’un contrôle System.Windows.Controls.TextBlock.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6.2 |
Type | Runtime |
API affectées
CoerceIsSelectionBoxHighlighted
Détails
Certaines séquences d’actions impliquant un System.Windows.Controls.ComboBox et sa source de données peut entraîner un System.NullReferenceException.
Suggestion
Si possible, mettre à niveau vers .NET Framework 4.6.2.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6 |
Type | Runtime |
API affectées
DataGridCellsPanel.BringIndexIntoView lève une exception ArgumentOutOfRangeException
Détails
ScrollIntoView(Object) fonctionne de façon asynchrone quand la virtualisation des colonnes est activée, mais que les largeurs de colonne n’ont pas encore été déterminées. Si des colonnes sont supprimées avant le travail asynchrone, une System.ArgumentOutOfRangeException peut se produire.
Suggestion
Effectuez une des actions suivantes :
- Mise à niveau vers .NET Framework 4.7
- Installation du dernier correctif pour .NET Framework 4.6.2
- Évitez de supprimer des colonnes jusqu’à ce que la réponse asynchrone à ScrollIntoView(Object) soit effective.
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4.6.2 |
Type | Runtime |
API affectées
Défilement horizontal et virtualisation
Détails
Cette modification s’applique à un System.Windows.Controls.ItemsControl qui effectue sa propre virtualisation dans le sens orthogonal vers la direction de défilement principale (l’exemple classique est System.Windows.Controls.DataGrid avec EnableColumnVirtualization="True"). Le résultat de certaines opérations de défilement horizontal a été changé afin de produire des résultats qui sont plus intuitifs et plus analogues par rapport aux résultats des opérations verticales comparables.
Les opérations comprennent « Défilement ici » et « Bord droit » (il s’agit là des noms mentionnés dans le menu obtenu en cliquant avec le bouton droit sur une barre de défilement horizontale). Toutes deux calculent un décalage candidat et appellent SetHorizontalOffset(Double).
Après le défilement vers le nouveau décalage, la notion de « ici » ou de « bord droit » peut avoir changé, car le nouveau contenu dévirtualisé a changé la valeur de System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth.
Avant .NET Framework 4.6.2, l’opération de défilement utilisait simplement le décalage candidat, même si ce n’est plus « ici » ou le « bord droit ». Cela entraîne des effets tels que le « rebondissement » du curseur de défilement, comme illustré dans l’exemple. Supposons qu’un System.Windows.Controls.DataGrid a ExtentWidth=1000 et Width=200. Un défilement vers « Bord droit » utilise un décalage candidat de 1000-200 = 800. Lors du défilement jusqu’à ce décalage, les nouvelles colonnes sont dévirtualisées. Supposons qu’elles sont très larges, de sorte que System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth passe à 2000. Le défilement se termine avec HorizontalOffset=800, et le curseur « rebondit » à proximité du centre de la barre de défilement (précisément à 800/2000 = 40 %).
Le changement consiste à recalculer un nouveau décalage candidat quand cette situation se produit, puis à réessayer. (C’est déjà comme cela que le défilement vertical fonctionne.)
Le changement génère une expérience plus prévisible et intuitive pour l’utilisateur final, mais il peut aussi affecter toute application qui dépend de la valeur exacte de System.Windows.Controls.Primitives.IScrollInfo.HorizontalOffset après un défilement horizontal, qu’il s’agisse d’un appel explicite à SetHorizontalOffset(Double) ou d’un appel effectué par l’utilisateur final.
Suggestion
Une application qui utilise une valeur prédite pour System.Windows.Controls.Primitives.IScrollInfo.HorizontalOffset doit être changée afin de récupérer la valeur réelle (et la valeur de System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth) après un défilement horizontal susceptible de modifier System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth en raison de la dévirtualisation.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6.2 |
Type | Runtime |
API affectées
Items.Clear ne supprime pas les doublons de SelectedItems
Détails
Supposons qu’un sélecteur (avec la sélection multiple activée) a des doublons dans sa collection System.Windows.Controls.Primitives.MultiSelector.SelectedItems - le même élément apparaît plusieurs fois. La suppression de ces éléments de la source de données (par exemple en appelant Items.Clear) échoue à les supprimer de System.Windows.Controls.Primitives.MultiSelector.SelectedItems. Seule la première instance est supprimée. De plus, une utilisation ultérieure de System.Windows.Controls.Primitives.MultiSelector.SelectedItems (par exemple SelectedItems.Clear()) peut rencontrer des problèmes comme System.ArgumentException, car System.Windows.Controls.Primitives.MultiSelector.SelectedItems contient des éléments qui ne sont plus dans la source de données.
Suggestion
Si possible, mettez à niveau vers .NET Framework 4.6.2.
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4,5 |
Type | Runtime |
API affectées
Défilement des éléments d’une liste plate avec des éléments de différentes hauteurs en pixels
Détails
Quand un System.Windows.Controls.ItemsControl affiche une collection avec la virtualisation (IsVirtualizing=true
) et le défilement d’éléments (ScrollUnit=Item
), et quand le contrôle fait défiler pour afficher un élément dont la hauteur en pixels diffère de celle de ses voisins, le System.Windows.Controls.VirtualizingStackPanel effectue une itération sur tous les éléments de la collection. L’interface utilisateur ne répond pas pendant cette itération. L’itération se produit dans d’autres circonstances, même dans les versions précédentes du .NET Framework. Par exemple, elle se produit lors du défilement de pixels (ScrollUnit=Pixel
) quand un élément avec une hauteur en pixels différente est rencontré et lors du défilement d’éléments de données hiérarchiques (comme dans un System.Windows.Controls.TreeView ou un System.Windows.Controls.ItemsControl avec le regroupement activé) quand un élément avec un nombre d’éléments descendants différent de celui de ses voisins est rencontré. Pour le cas du défilement d’éléments et d’une hauteur en pixels différente, l’itération a été introduite dans le .NET Framework 4.6.1 pour corriger des bogues dans la présentation des données hiérarchiques. Elle n’est pas nécessaire si les données sont plates (pas de hiérarchie) et .NET Framework 4.6.2 ne l’effectue donc pas dans ce cas.
Suggestion
Si l’itération se produit dans .NET Framework 4.6.1 mais pas dans les versions antérieures, c’est-à-dire si System.Windows.Controls.ItemsControl effectue le défilement d’éléments d’une liste plate comportant des éléments avec des hauteurs en pixels différentes, vous avez deux solutions :
- Installer .NET Framework 4.6.2
- Installer le correctif HR 1605 pour .NET Framework 4.6.1
Nom | Valeur |
---|---|
Étendue | Secondaire |
Version | 4.6.1 |
Type | Runtime |
API affectées
L’arrière-plan de RibbonGroup est défini sur Transparent dans les versions localisées
Détails
L’arrière-plan de System.Windows.Controls.Ribbon.RibbonGroup sur les versions localisées était toujours dessiné avec le pinceau Transparent, ce qui offrait une expérience assez pauvre de l’interface utilisateur. Ce point est résolu dans le correctif de .NET Framework 4.7 WPF par le biais d’une mise à jour des ressources localisées pour System.Windows.Controls.Ribbon.RibbonGroup, qui à son tour garantit que le bon pinceau est sélectionné.
Suggestion
Mettre à niveau vers .NET Framework 4.7
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4.6.2 |
Type | Runtime |
API affectées
Non détectable via l’analyse des API.
La correction orthographique dans WPF échoue de façon inattendue
Détails
Ceci inclut plusieurs problèmes du vérificateur orthographique de WPF :
- Le vérificateur orthographique de WPF lève parfois System.Runtime.InteropServices.COMException
- Le vérificateur orthographique de WPF échoue avec UnauthorizedAccessException quand les applications sont lancées avec « Exécuter en tant qu’autre utilisateur »
- Le vérificateur orthographique de WPF identifie incorrectement des fautes d’orthographe dans les mots composés, comme « Hausnummer » en allemand.
Suggestion
Problème n° 1 : ce problème a été corrigé dans le .NET Framework 4.6.2. Problème n° 2 : le vérificateur orthographique de WPF n’est plus pris en charge quand les applications sont lancées avec « Exécuter en tant qu’autre utilisateur ». À compter du .NET Framework 4.6.2, les applications lancées de cette manière ne plantent plus de façon inattendue : à la place, le vérificateur orthographique est désactivé en mode silencieux. Problème n° 3 : ce problème a été corrigé dans le .NET Framework 4.6.2.
Nom | Valeur |
---|---|
Étendue | Edge |
Version | 4.6.1 |
Type | Runtime |
API affectées
Non détectable via l’analyse des API.