Partager via


Problèmes de migration du .NET Framework 4

Cette rubrique décrit les problèmes de migration entre .NET Framework version 3.5 Service Pack 1 et .NET Framework version 4, y compris les correctifs, mises en conformité avec les normes et la sécurité, et modifications basées sur les commentaires des clients. La plupart de ces modifications ne requièrent aucun changement dans la programmation de vos applications. Dans les cas où des changements s'avèrent nécessaires, consultez la colonne Modifications recommandées du tableau.

Cette rubrique décrit des modifications importantes dans les domaines suivants :

  • ASP.NET et Web

  • Fondamentaux

  • Données

  • Windows Communication Foundation (WCF)

  • Windows Presentation Foundation (WPF)

  • XML

Pour une vue d'ensemble globale des problèmes dans cette rubrique, consultez Guide de migration du .NET Framework 4.

Pour les problèmes de migration après Bêta 2, consultez Migration Issues for .NET Framework 4 Applications: Beta 2 to RTM.

Pour plus d'informations sur les nouvelles fonctionnalités, consultez Nouveautés de .NET Framework 4.

ASP.NET et Web

Espaces de noms : System.Web, System.Web.Mobile, System.Web.Security, System.Web.UI.WebControls ; assembly : System.Web (dans System.Web.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Modifications recommandées

Fichiers de définition de navigateur

Les fichiers de définition de navigateur ont été mis à jour pour inclure des informations sur les navigateurs et les appareils récemment sortis sur le marché et mis à jour. Des navigateurs et appareils anciens (comme Netscape Navigator) ont été supprimés tandis que de nouveaux navigateurs et appareils (comme Google Chrome et Apple iPhone) ont été ajoutés.

Si votre application contient des définitions de navigateur personnalisées qui héritent de l'une des définitions de navigateur supprimées, une erreur s'affichera.

L'objet HttpBrowserCapabilities (qui est exposé par la propriété Request.Browser de la page) est régi par les fichiers de définition de navigateur. Par conséquent, les informations retournées lors de l'accès à une propriété de cet objet dans ASP.NET 4 peuvent être différentes de celles retournées dans une version antérieure d'ASP.NET.

Si votre application s'appuie sur les anciens fichiers de définitions de navigateur, vous pouvez les copier à partir du dossier suivant :

Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\Browsers

Copiez les fichiers dans le dossier \CONFIG\Browsers correspondant pour ASP.NET 4. Après avoir copié les fichiers, exécutez l'outil en ligne de commande Aspnet_regbrowsers.exe. Pour plus d'informations, consultez le site Web https://www.asp.net/mobile.

Applications enfants qui fonctionnent sous des versions mixtes d'ASP.NET

Les applications ASP.NET 4 configurées comme enfants d'applications qui exécutent des versions antérieures d'ASP.NET risquent de ne pas démarrer à cause d'erreurs de configuration ou de compilation. L'erreur spécifique qui se produit dépend si l'application s'exécute sous IIS 6.0, IIS 7 ou IIS 7.5.

Vous pouvez apporter des modifications aux fichiers de configuration des applications affectées afin que le système de configuration reconnaisse l'application ASP.NET 4 correctement. Pour plus d'informations sur les modifications que vous devez apporter, consultez la section « ASP.NET 4 Child Applications Fail to Start When Under ASP.NET 2.0 or ASP.NET 3.5 Applications » dans le document ASP.NET 4 Breaking Changes sur le site Web ASP.NET.

Modifications de ClientID

Le nouveau paramètre ClientIDMode dans ASP.NET 4 vous permet de spécifier la façon dont ASP.NET génère l'attribut id pour les éléments HTML. Dans les versions antérieures d'ASP.NET, le comportement par défaut était équivalent au paramètre AutoID de ClientIDMode. Le paramètre par défaut est désormais Predictable. Pour plus d'informations, consultez Identification du contrôle serveur Web ASP.NET.

Si vous utilisez Visual Studio 2010 pour mettre à niveau votre application à partir d'ASP.NET 2.0 ou d'ASP.NET 3.5, l'outil ajoute automatiquement un paramètre au fichier Web.config pour conserver le comportement des versions antérieures du .NET Framework. Toutefois, si vous mettez à niveau une application en modifiant le pool d'applications dans IIS pour cibler .NET Framework 4, ASP.NET utilise le nouveau mode par défaut. Pour désactiver le nouveau mode ID client, ajoutez le paramètre suivant au fichier Web.config :

<pages ClientIDMode="AutoID" / >

Sécurité d'accès du code (CAS, Code Access Security)

Les fonctionnalités ASP.NET 2.0 ajoutées dans ASP.NET 3.5 utilisent le modèle de sécurité d'accès du code (CAS) .NET Framework 1.1 et .NET Framework 2.0. Toutefois, l'implémentation de la sécurité d'accès du code dans ASP.NET 4 a été considérablement revue. Par conséquent, les applications ASP.NET de confiance partielle qui s'appuient sur du code de confiance exécuté dans le Global Assembly Cache peuvent échouer avec différentes exceptions de sécurité. Les applications de confiance partielle qui s'appuient sur d'importantes modifications apportées à la stratégie CAS de l'ordinateur peuvent également échouer et lever des exceptions de sécurité.

Vous pouvez rétablir le comportement ASP.NET 1.1 et 2.0 pour des applications ASP.NET 4 de confiance partielle en utilisant le nouvel attribut legacyCasModel dans l'élément de configuration trust, comme indiqué dans l'exemple suivant :

<trust level= "Medium"

legacyCasModel="true" />

Note de sécuritéNote de sécurité
Un rétablissement au modèle CAS antérieur peut entraîner des problèmes de sécurité.

Pour plus d'informations sur le nouveau modèle ASP.NET 4 de sécurité d'accès du code, consultez Sécurité d'accès du code dans les applications ASP.NET 4.

Fichiers de configuration

Les fichiers de configuration racine (le fichier machine.config et le fichier racine Web.config) pour le .NET Framework et ASP.NET 4 ont été mis à jour pour inclure la plupart des informations de configuration réutilisables qui se trouvaient dans les fichiers d'application Web.config dans ASP.NET 3.5. En raison de la complexité des systèmes de configuration IIS 7 et IIS 7.5 managés, l'exécution d'applications ASP.NET 3.5 sous ASP.NET 4 et sous IIS 7 et IIS 7.5 peut provoquer des erreurs ASP.NET ou des erreurs IIS.

Mettez à niveau vos applications ASP.NET 3.5 vers ASP.NET 4 à l'aide des outils de mise à niveau de projet dans Visual Studio 2010. Visual Studio 2010 modifie automatiquement le fichier Web.config des applications ASP.NET 3.5 pour qu'il contienne les paramètres appropriés pour ASP.NET 4.

Toutefois, vous pouvez exécuter des applications ASP.NET 3.5 à l'aide de .NET Framework 4 sans effectuer de recompilation. Dans ce cas, vous devrez peut-être modifier manuellement le fichier Web.config de l'application avant d'exécuter l'application sous .NET Framework 4 et sous IIS 7 ou IIS 7.5. La modification spécifique à effectuer dépend de la combinaison de logiciels que vous utilisez, notamment les versions de Service Pack (SP). Pour plus d'informations sur les éventuelles combinaisons de logiciels affectées par cette modification et sur la résolution de problèmes à l'aide de combinaisons spécifiques, consultez la section « Configuration Errors Related to New ASP.NET 4 Root Configuration » dans le document ASP.NET 4 Breaking Changes sur le site Web ASP.NET.

Rendu des contrôles

Dans les versions antérieures d'ASP.NET, certains contrôles émettaient un balisage que vous ne pouviez pas désactiver. Par défaut, ce type de balisage n'est plus généré dans ASP.NET 4. Les modifications de rendu affectent les contrôles suivants :

  • Les contrôles Image et ImageButton ne restituent plus d'attribut border="0".

  • La classe BaseValidator et les contrôles de validation dérivés ne restituent plus de texte rouge par défaut.

  • Le contrôle HtmlForm ne restitue pas d'attribut name.

  • Le contrôle Table ne restitue plus d'attribut border="0".

Les contrôles qui ne sont pas conçus pour l'entrée d'utilisateur (par exemple, le contrôle Label ) ne restituent plus l'attribut disabled="disabled" si leur propriété Enabled a la valeur false (ou s'ils héritent de ce paramètre d'un contrôle conteneur).

Si vous utilisez Visual Studio 2010 pour mettre à niveau votre application à partir d'ASP.NET 2.0 ou d'ASP.NET 3.5, l'outil ajoute automatiquement un paramètre au fichier Web.config pour conserver le rendu hérité. Toutefois, si vous mettez à niveau une application en modifiant le pool d'applications dans IIS pour cibler .NET Framework 4, ASP.NET utilise le nouveau mode de rendu par défaut. Pour désactiver le nouveau mode de rendu, ajoutez le paramètre suivant au fichier Web.config :

<pages controlRenderingCompatibilityVersion="3.5" />

Gestionnaires d'événements dans les documents par défaut

ASP.NET 4 restitue la valeur d'attribut action de l'élément HTML form sous la forme d'une chaîne vide lorsqu'une demande est effectuée à une URL sans extension à laquelle est mappé un document par défaut. Dans les premières versions d'ASP.NET, une demande à https://contoso.com entraînait une demande à Default.aspx. Dans ce document, la balise form ouvrante était restituée comme dans l'exemple suivant :

<form action="Default.aspx" />

Dans ASP.NET 4, une demande à https://contoso.com entraîne également une demande à Default.aspx, mais ASP.NET restitue maintenant la balise form HTML ouvrante comme dans l'exemple suivant :

<form action="" />

Lorsque l'attribut action est une chaîne vide, l'objet IIS DefaultDocumentModule crée une demande enfant à Default.aspx. Dans la plupart des conditions, cette demande enfant est transparente pour le code d'application, et la page Default.aspx s'exécute normalement. Toutefois, en raison d'une interaction potentielle entre du code managé et le mode intégré IIS 7 ou IIS 7.5, les pages .aspx managées peuvent cesser de fonctionner correctement pendant la demande enfant. Si les conditions suivantes se produisent, la demande enfant à un document .aspx par défaut provoquera une erreur ou un comportement inattendu :

  • Une page .aspx est envoyée au navigateur dont l'attribut action de l'élément form a la valeur "".

  • Le formulaire est publié sur ASP.NET.

  • Un module HTTP managé lit une partie du corps d'entité, tel que Request.Form ou Request.Params. Le corps d'entité de la demande POST est ainsi lu dans la mémoire managée. Par conséquent, le corps d'entité n'est plus disponible pour les modules de code natif qui s'exécutent en mode intégré IIS 7 ou IIS 7.5.

  • L'objet IIS DefaultDocumentModule finit par s'exécuter et crée une demande enfant au document Default.aspx. Toutefois, étant donné que le corps d'entité a déjà été lu par une partie du code managé, aucun corps d'entité n'est disponible pour un envoi à la demande enfant.

  • Lorsque le pipeline HTTP s'exécute pour la demande enfant, le gestionnaire pour les fichiers .aspx s'exécute pendant la phase d'exécution des gestionnaires.

Étant donné qu'il n'y a pas de corps d'entité, il n'existe aucune variable de formulaire et aucun état d'affichage. Par conséquent, le gestionnaire de page .aspx ne dispose d'aucune information pour déterminer quel événement doit être déclenché (le cas échéant). Par conséquent, aucun des gestionnaires d'événements de publication pour la page .aspx concernée ne s'exécute.

Pour plus d'informations sur les façons de contourner les problèmes liés à cette modification, consultez la section « Event Handlers Might Not Be Not Raised in a Default Document in IIS 7 or IIS 7.5 Integrated Mode » dans le document ASP.NET 4 Breaking Changes sur le site Web ASP.NET.

Algorithme de hachage

ASP.NET utilise des algorithmes de chiffrement et de hachage pour sécuriser des données telles que les cookies d'authentification par formulaire et l'état d'affichage. Par défaut, ASP.NET 4 utilise l'algorithme HMACSHA256 pour les opérations de hachage sur les cookies et l'état d'affichage. Les versions antérieures d'ASP.NET utilisaient l'ancien algorithme HMACSHA1.

Si vous exécutez des applications qui combinent ASP.NET 2.0 et ASP.NET 4 (dans lesquelles des données telles que les cookies d'authentification par formulaire doivent fonctionner sous différentes versions du .NET Framework), configurez une application Web ASP.NET 4 pour qu'elle utilise l'ancien algorithme HMACSHA1 en ajoutant le paramètre suivant dans le fichier Web.config :

<machineKey validation="SHA1" />

Hébergement de contrôles dans Internet Explorer

Vous ne pouvez plus héberger de contrôles Windows Forms dans Internet Explorer, car il existe de meilleures solutions pour l'hébergement de contrôles sur le Web. Par conséquent, les assemblys IEHost.dll et IEExec.exe ont été supprimés du .NET Framework.

Vous pouvez utiliser les technologies suivantes pour le développement de contrôles personnalisés dans les applications Web :

  • Vous pouvez créer une application Silverlight et la configurer pour s'exécuter hors du navigateur. Pour plus d'informations, consultez Out-of-Browser Support.

  • Vous pouvez générer une application du navigateur XAML (XBAP) pour tirer parti de fonctions de WPF (requiert le .NET Framework sur les ordinateurs clients). Pour plus d'informations, consultez Vue d'ensemble des applications de navigateur XAML.

Méthodes HtmlEncode et UrlEncode

Les méthodes HtmlEncode et UrlEncode des classes HttpServerUtility et HttpUtility ont été mises à jour pour encoder le guillemet simple (') comme suit :

  • La méthode HtmlEncode encode les instances du guillemet simple sous la forme &#39;

  • La méthode UrlEncode encode les instances du guillemet simple sous la forme %27

Dans votre code, recherchez les emplacements où vous utilisez les méthodes HtmlEncode et UrlEncode, et vérifiez que la modification d'encodage ne provoque pas un changement susceptible d'affecter le comportement de votre application.

Erreurs HttpException dans les applications ASP.NET 2.0

Une fois ASP.NET 4 activé sur IIS 6, les applications ASP.NET 2.0 qui s'exécutent sur IIS 6 (dans Windows Server 2003 ou Windows Server 2003 R2) peuvent générer des erreurs telles que les suivantes :

System.Web.HttpException: Path '/[yourApplicationRoot]/eurl.axd/[Value]' was not found.

  • Si ASP.NET 4 n'est pas obligatoire pour exécuter le site Web, remappez le site pour utiliser ASP.NET 2.0 à la place.

    ou

  • Si ASP.NET 4 est obligatoire pour exécuter le site Web, déplacez tous les répertoires virtuels ASP.NET 2.0 enfants vers un site Web différent mappé à ASP.NET 2.0.

    ou

  • Désactivez les URL sans extension. Pour plus d'informations, reportez-vous à « ASP.NET 2.0 Applications Might Generate HttpException Errors That Reference eurl.axd » dans le document ASP.NET 4 Breaking Changes sur le site Web ASP.NET.

Types d'appartenance

Certains types (par exemple, System.Web.Security.MembershipProvider) utilisés dans l'appartenance ASP.NET ont été déplacés de System.Web.dll vers l'assembly System.Web.ApplicationServices.dll. Les types ont été déplacés pour résoudre des dépendances de couches architecturales entre des types dans le client et dans des références .NET Framework étendues.

Les bibliothèques de classes mises à niveau à partir de versions antérieures d'ASP.NET et qui utilisent des types d'appartenance déplacés risquent de ne pas être compilées correctement lorsqu'elles sont utilisées dans un projet ASP.NET 4. Si c'est le cas, ajoutez une référence dans le projet de bibliothèque de classes à System.Web.ApplicationServices.dll.

Modifications au contrôle Menu

Les modifications au contrôle Menu entraînent le comportement suivant :

Assembly mobile dans le fichier Web.config

Dans les versions antérieures d'ASP.NET, une référence à l'assembly System.Web.Mobile.dll a été incluse dans le fichier Web.config racine dans la section assemblies sous system.web/compilation. Pour améliorer les performances, la référence à cet assembly a été supprimée.

RemarqueRemarque
L'assembly System.Web.Mobile.dll et les contrôles mobiles ASP.NET sont inclus dans ASP.NET 4, mais ils sont déconseillés.

Si vous souhaitez utiliser des types de cet assembly, ajoutez une référence à l'assembly dans le fichier Web.config racine ou dans un fichier Web.config d'application.

Mise en cache de sortie

Dans ASP.NET 1.0, en raison d'un bogue, les pages mises en cache qui spécifiaient Location="ServerAndClient" en tant que paramètre de cache de sortie émettaient un en-tête HTTP Vary:* dans la réponse. Par conséquent, les navigateurs clients ne mettaient jamais en cache la page localement. La méthode HttpCachePolicy.SetOmitVaryStar ajoutée dans ASP.NET 1.1 pouvait être appelée pour supprimer l'en-tête Vary:*. Toutefois, les rapports de bogues indiquent que les développeurs ignorent le comportement SetOmitVaryStar existant.

Dans ASP.NET 4, l'en-tête HTTP Vary:* n'est plus émis à partir des réponses qui spécifient la directive suivante :

<%@ OutputCache Location="ServerAndClient" %>

Par conséquent, la méthode HttpCachePolicy.SetOmitVaryStar n'est plus requise pour supprimer l'en-tête Vary:*. Dans les applications qui spécifient « ServerAndClient » pour l'attribut Location, les pages pourront être mises en cache dans le navigateur sans que vous ayez besoin d'appeler HttpCachePolicy.SetOmitVaryStar.

Si des pages de l'application doivent émettre Vary:*, appelez la méthode HttpResponse.AppendHeader comme indiqué dans l'exemple suivant :

HttpResponse.AppendHeader("Vary","*");

Vous pouvez également modifier l'attribut Location de mise en cache de sortie en lui affectant la valeur "Server".

Analyse de page

L'analyseur de page pour les pages Web ASP.NET (fichiers .aspx) et les contrôles utilisateur (fichiers .ascx) est plus strict dans ASP.NET 4 que dans les versions antérieures d'ASP.NET et il signale plus de balisages comme non valides que dans les versions antérieures.

Examinez les messages d'erreur produits lorsqu'une page s'exécute et corrigez les erreurs qui résultent d'un balisage non valide.

Types Passport

La prise en charge de Passport intégrée à ASP.NET 2.0 est obsolète et n'est plus gérée en raison des modifications apportées à Passport (kit de développement logiciel de Live ID). Par conséquent, les types liés à Passport dans System.Web.Security sont désormais marqués avec l'attribut ObsoleteAttribute.

Modifiez votre code pour qu'il utilise le Kit de développement logiciel Windows Live ID (page éventuellement en anglais) au lieu des types Passport dans l'espace de noms System.Web.Security (par exemple, System.Web.Security.PassportIdentity).

Informations PathInfo dans la propriété FilePath

ASP.NET 4 n'inclut plus la valeur PathInfo dans les valeurs de retour des propriétés comme HttpRequest.FilePath, HttpRequest.AppRelativeCurrentExecutionFilePath et HttpRequest.CurrentExecutionFilePath. À la place, les informations PathInfo sont disponibles dans HttpRequest.PathInfo. Par exemple, imaginez le fragment d'URL suivant :

/testapp/Action.mvc/SomeAction

Dans les versions antérieures d'ASP.NET, les propriétés System.Web.HttpRequest ont les valeurs suivantes :

Dans ASP.NET 4, les propriétés System.Web.HttpRequest ont plutôt les valeurs suivantes :

Dans votre code, recherchez les cas où vous utilisez les propriétés de la classe System.Web.HttpRequest pour retourner des informations sur les chemins d'accès ; modifiez le code pour qu'il soit conforme aux modifications concernant le retour des informations sur les chemins d'accès.

Validation de la demande

Pour améliorer la validation de la demande, la validation de la demande ASP.NET est appelée plus tôt dans le cycle de vie des demandes. Par conséquent, la validation de la demande s'exécute pour les demandes qui ne concernent pas les fichiers .aspx (par exemple, pour les appels de service Web et les gestionnaires personnalisés). Elle est également active lorsque des modules HTTP personnalisés sont exécutés dans le pipeline de traitement des demandes.

En raison de cette modification, les demandes de ressources qui ne concernent pas les fichiers .aspx peuvent générer des erreurs de validation de la demande. Du code personnalisé qui s'exécute dans le pipeline de demande (par exemple, des modules HTTP personnalisés) peut également générer des erreurs similaires.

Si nécessaire, vous pouvez revenir à l'ancien comportement qui consiste à déclencher une validation des demandes uniquement pour les pages .aspx. Pour ce faire, utilisez le paramètre suivant dans le fichier de configuration Web :

<httpRuntime requestValidationMode="2.0" />

Note de sécuritéNote de sécurité
Si vous rétablissez l'ancien comportement, assurez-vous que tout le code dans les gestionnaires existants, modules et les autres codes personnalisés effectuent des vérifications visant à détecter les entrées HTTP potentiellement dangereuses susceptibles d'être des vecteurs d'attaques XSS.

Routage

Si vous créez un site Web de système de fichiers dans Visual Studio 2010 et que le site Web est situé dans un dossier dont le nom comporte un point (.), les routages d'URL ne fonctionneront pas de manière fiable. Une erreur Http 404 est retournée à partir de certains chemins d'accès virtuel. Cela se produit parce que Visual Studio 2010 lance le serveur Visual Studio Development (Cassini) à l'aide d'un chemin d'accès incorrect pour le répertoire virtuel racine.

  • Dans la page Propriétés pour le site Web basé sur des fichiers, modifiez l'attribut Virtual Path par « / ».

    ou

  • Créez un projet d'application Web et non de site Web. Les projets d'application Web n'ont pas ce problème, et le routage d'URL fonctionne même si le nom du dossier du projet contient un point.

    ou

  • Créez un site Web basé sur Http hébergé dans IIS. Le chemin d'accès virtuel et le dossier de fichier de projet des sites Web hébergés par IIS peuvent contenir un point.

Sites SharePoint

Si vous essayez d'exécuter un site Web ASP.NET 4 déployé comme un enfant d'un site Web SharePoint qui contient un niveau de confiance partielle personnalisé nommé WSS_Minimal, vous obtiendrez l'erreur suivante :

Could not find permission set named 'ASP.Net'.

Actuellement, aucune version de SharePoint n'est compatible avec ASP.NET. Par conséquent, vous ne devez pas essayer d'exécuter un site Web ASP.NET 4 comme un enfant d'un site Web SharePoint.

Normes XHTML 1.1

Pour que les nouveaux sites Web soient conformes à XHTML 1.1, les contrôles ASP.NET dans le .NET Framework 4 généreront un code HTML conforme à XHTML 1.1. Ce rendu est activé à l'aide de l'option suivante dans le fichier Web.config :

<system.Web>

<pages controlRenderingCompatibilityVersion="4.0"/>

</system.Web>

Par défaut, cette option est définie sur 4.0. À des fins de compatibilité, le paramètre 3.5 sera activé pour les projets Web mis à niveau à Visual Studio à partir de Visual Studio 2008.

Aucun

Retour au début

Fondamentaux

Fonctionnalités générales

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Modifications recommandées

CardSpace

Windows CardSpace n'est plus inclus dans le .NET Framework ; il est fourni séparément.

Téléchargez Windows CardSpace à partir du Centre de téléchargement Microsoft.

Fichiers de configuration

Des corrections ont été apportées à la façon dont le .NET Framework accède aux fichiers de configuration de l'application.

Si votre fichier de configuration d'application est nommé application-name.config, renommez-le application-name.exe.config. Par exemple, renommez MyApp.config en MyApp.exe.config.

Compilateur de code C#

Les classes Compiler, CompilerError et ErrorLevel qui étaient dans l'espace de noms Microsoft.CSharp ne sont plus disponibles et leur assembly (cscompmgd.dll) n'est plus inclus dans le .NET Framework.

Utilisez la classe CodeDomProvider et d'autres classes dans l'espace de noms System.CodeDom.Compiler. Pour plus d'informations, consultez Utilisation du CodeDOM.

Hébergement

(API non managée)

Pour améliorer les fonctions d'hébergement, certaines API d'activation d'hébergement sont déconseillées. Des fonctionnalités d'exécution côte à côte in-process permettent à une application de charger et de démarrer plusieurs versions du .NET Framework dans le même processus. Par exemple, vous pouvez exécuter des applications qui chargent des compléments (ou des composants) basés sur le .NET Framework 2.0 SP1 et des compléments basés sur le .NET Framework 4 dans le même processus. Les composants plus anciens continuent à utiliser la version du .NET Framework plus ancienne, et les nouveaux composants utilisent la nouvelle version de celui-ci.

Utilisez les configurations décrites dans Exécution côte à côte in-process.

Nouveau modèle de sécurité

La stratégie de sécurité d'accès du code (CAS) a été désactivée et remplacée par un modèle simplifié, comme décrit dans Modifications de sécurité dans le .NET Framework 4.

Des modifications peuvent être nécessaires si vos applications dépendent de la sécurité d'accès du code. Pour plus d'informations, consultez Compatibilité de la stratégie de sécurité d'accès du code et migration.

Retour au début

Date et heure

Espace de noms : System ; assembly : mscorlib (dans mscorlib.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Modifications recommandées

Heures d'été et d'hiver

Pour garantir une cohérence avec l'horloge système, les propriétés d'heure (telles que TimeZoneInfo.Local et DateTime.Now) utilisent maintenant les règles du système d'exploitation au lieu des autres données .NET Framework pour le passage aux heures d'été et d'hiver.

Aucun

Chaînes de mise en forme

Pour prendre en charge la mise en forme dépendante de la culture, la structure TimeSpan inclut de nouvelles surcharges des méthodes ToString, Parse et TryParse, en plus des nouvelles méthodes ParseExact et TryParseExact.

Aucun

Retour au début

Globalisation

Pour une liste des nouvelles cultures neutres et spécifiques, consultez Nouveautés en matière de globalisation et de localisation.

Espace de noms : System.Globalization ; assembly : mscorlib (dans mscorlib.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Modifications recommandées

Noms de cultures

Les modifications de noms suivantes affectent les cultures allemande, maldivienne et africaine :

  • CurrencyEnglishName : Le nom de la devise pour la culture Allemand (Suisse) (de-CH) est passé de « sFr. » à « Fr. ».

  • LongDatePattern : Le modèle de date longue pour la culture Divehi (Maldives) (dv-MV) est passé de « jj/MMMM/aaaa » à « jj/MM/aaaa ».

  • PMDesignator : L'indicateur PM (APRÈS-MIDI) de la culture Afrikaans (Afrique du Sud) (af-ZA) est passé de « nm » à « PM ».

Notez les changements dans les noms de cultures.

Paramètre LCID

Pour garantir une cohérence avec le comportement attendu dans les paramètres de serveur Automation, le CLR ne passe plus la culture actuelle pour le paramètre LCID aux applications COM non managées. À la place, il passe 1033 (en-us) pour la culture.

Aucune modification nécessaire sauf pour les applications natives qui requièrent une culture spécifiée.

Types de cultures obsolètes

Les types de cultures FrameworkCultures et WindowsOnlyCultures sont désormais obsolètes.

Pour des raisons de compatibilité descendante, FrameworkCultures retourne maintenant les cultures neutres et spécifiques qui étaient incluses dans le .NET Framework précédent, et WindowsOnlyCultures retourne désormais une liste vide.

Utilisez d'autres valeurs de l'énumération CultureTypes.

Récupération de la culture

Depuis Windows 7, .NET Framework 4 recupère les informations de culture à partir du système d'exploitation au lieu de stocker les données lui-même. De plus, le .NET Framework se synchronise avec Windows pour le tri et la casse des données.

Aucun

Normes Unicode 5.1

Le .NET Framework prend désormais en charge tous les caractères Unicode 5.1 (et environ 1400 caractères supplémentaires). Ces nouveaux caractères incluent des symboles, des flèches, des signes diacritiques, des signes de ponctuation, des symboles mathématiques, des idéogrammes et des traits CJC, des chiffres supplémentaires pour le Malayâlam et le Télugu et différents caractères birmans, latins, arabes, grecs, mongols et cyrilliques. Les nouvelles écritures suivantes sont prises en charge avec Unicode 5.1 : sundanais, lepcha, ol tchiki, vaï, saurachtra, kayah li, redjang, gurmukhi, oriya, tamoul, télugu, malayâlam et cham.

Aucun

Retour au début

Exceptions

Espaces de noms : System, System.Runtime.ExceptionServices ; assembly : mscorlib (dans mscorlib.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Modifications recommandées

Exceptions pour un état de processus endommagé

Le CLR n'envoie plus d'exception pour un état de processus endommagé aux gestionnaires d'exceptions en code managé.

Ces exceptions indiquent que l'état d'un processus a été endommagé. Nous vous déconseillons d'exécuter votre application dans cet état.

Pour plus d'informations, consultez HandleProcessCorruptedStateExceptionsAttribute et l'entrée Handling Corrupted State Exceptions dans le blog Les coulisses du CLR.

Exceptions du moteur d'exécution

ExecutionEngineException est désormais obsolète, car une exception saisissable permettra à un processus instable de continuer à fonctionner. Cette modification améliore la prévisibilité et la fiabilité dans le runtime.

Utilisez un InvalidOperationException pour signaler la condition.

Retour au début

Réflexion

Espace de noms : System.Reflection ; assembly : mscorlib (dans mscorlib.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Modifications recommandées

Algorithmes de hachage d'assembly

La propriété AssemblyName.HashAlgorithm retourne désormais AssemblyHashAlgorithm.None, car le runtime ne reconnaît pas l'algorithme de hachage de l'assembly référencé lorsque l'assembly n'est pas chargé. (Cela fait référence à l'utilisation de la propriété sur un assembly référencé tel que celui retourné par la méthode Assembly.GetReferencedAssemblies.)

Aucun

Chargement des assemblys

Pour empêcher le chargement redondant des assemblys et enregistrer l'espace d'adressage virtuel, le CLR charge désormais les assemblys à l'aide de la fonction Win32 MapViewOfFile uniquement. De même, il n'appelle plus la fonction LoadLibrary.

Cette modification affecte les applications de diagnostic des façons suivantes :

  • Un ProcessModuleCollection ne contiendra plus les modules d'une bibliothèque de classes (fichier .DLL), obtenus grâce à un appel à Process.GetCurrentProcess().Modules.

  • Les applications Win32 qui utilisent la fonction EnumProcessModules ne verront pas tous les modules managés répertoriés.

Aucun

Type déclarant

La propriété Type.DeclaringType retourne désormais la valeur Null correctement lorsque le type n'a pas de type déclarant.

Aucun

Délégués

Un délégué lève maintenant un ArgumentNullException au lieu d'un NullReferenceException lorsqu'une valeur Null est passée au constructeur du délégué.

Vérifiez que toutes les gestions d'exceptions interceptent ArgumentNullException.

Modification de l'emplacement du Global Assembly Cache

Pour les assemblys .NET Framework 4, le Global Assembly Cache a été déplacé du répertoire Windows (% WINDIR%) vers le sous-répertoire Microsoft.Net (%WINDIR%\Microsoft.Net). Les assemblys des versions antérieures restent dans l'ancien répertoire.

L'énumération ASM_CACHE_FLAGS non managée contient le nouvel indicateur ASM_CACHE_ROOT_EX. Cet indicateur obtient l'emplacement du cache pour les assemblys .NET Framework 4, qui peut être obtenu par la fonction GetCachePath.

Aucune, à condition que les applications n'utilisent pas de chemins d'accès explicites vers les assemblys, ce qui n'est pas recommandé.

Outil Global Assembly Cache

Le Gacutil.exe (outil Global Assembly Cache) ne prend plus en charge la visionneuse du plug-in du shell.

Aucun

Interopérabilité

Espace de noms : System.Runtime.InteropServices ; assembly : mscorlib (dans mscorlib.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Modifications recommandées

Longueur de la mémoire tampon

(API non managée)

Pour économiser de la mémoire, la fonctionnalité pour le paramètre pBufferLengthOffset de la méthode ICorProfilerInfo2::GetStringLayout a été modifiée pour correspondre au paramètre pStringLengthOffset. Les deux paramètres pointent désormais sur l'emplacement d'offset de la longueur de la chaîne. La longueur de la mémoire tampon a été supprimée de la représentation de la classe de chaîne.

Supprimez toute dépendance sur la longueur de la mémoire tampon.

Débogage juste-à-temps

Afin de simplifier l'inscription pour le débogage juste-à-temps (JIT), le débogueur .NET Framework utilise désormais uniquement la clé de Registre AeDebug, qui contrôle le comportement du débogage JIT pour le code natif. Cette modification entraîne le résultat suivant :

  • Vous ne pouvez plus inscrire deux débogueurs différents pour du code managé et natif.

  • Vous ne pouvez plus démarrer automatiquement le débogueur pour un processus non interactif, mais vous pouvez inviter l'utilisateur à suivre un processus interactif.

  • Vous n'êtes plus averti lorsque le débogueur ne peut pas démarrer ou lorsqu'il n'existe aucun débogueur inscrit à démarrer.

  • Les stratégies de lancement automatique qui dépendent de l'interactivité de l'application ne sont plus prises en charge.

Ajustez les opérations de débogage selon les besoins.

Appel de code non managé

Pour améliorer les performances dans l'interopérabilité avec du code non managé, les conventions d'appel incorrectes dans un appel de code non managé provoquent désormais un échec de l'application. Dans les versions antérieures, la couche de marshaling résolvait ces erreurs en haut de la pile.

Le débogage de vos applications dans Microsoft Visual Studio 2010 vous signalera ces erreurs pour que vous puissiez les corriger.

Si vous avez des binaires qui ne peuvent pas être mises à jour, vous pouvez inclure l'élément <NetFx40_PInvokeStackResilience> dans le fichier de configuration de votre application pour permettre la résolution des erreurs d'appel en haut de la pile, comme dans les versions antérieures. Toutefois, cette opération peut affecter les performances de votre application.

Interfaces supprimées

(API non managée)

Pour simplifier la tâche des développeurs, les interfaces suivantes ont été supprimées, car elles ne fournissaient aucun scénario d'exécution utile et le CLR ne fournissait ou n'acceptait aucune implémentation :

  • INativeImageINativeImageDependency

  • INativeImageInstallInfo

  • INativeImageEvaluate

  • INativeImageConverter

  • ICorModule

  • IMetaDataConverter

Aucun

Retour au début

Données

Cette section décrit des problèmes de migration pour l'utilisation des groupes de données et des clients SQL, Entity Framework, LINQ to SQL et WCF Data Servers (anciennement appelé ADO.NET Data Services).

DataSet et client SQL

Le tableau suivant décrit les améliorations apportées aux fonctionnalités qui présentaient précédemment des limitations ou d'autres problèmes.

Espaces de noms : System.Data, System.Data.Objects.DataClasses, System.Data.SqlClient ; assemblys : System.Data (dans System.Data.dll), System.Data.Entity (dans System.Data.Entity.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Scénarios de gestion des droits numériques (POCO)

L'interface System.Data.Objects.DataClasses.IRelatedEnd a de nouvelles méthodes qui facilitent son utilisation dans des scénarios POCO (Plain Old CLR Object). Ces nouvelles méthodes utilisent un Object au lieu d'une entité IEntityWithRelationships comme paramètre.

Modification de lignes

La méthode IndexOf, telle qu'elle est implémentée par la classe DataView, retourne désormais correctement la valeur d'une ligne modifiée, au lieu de retourner -1.

Événements

L'événement DataRowView.PropertyChanged est maintenant déclenché lorsqu'une ligne est dans un état modifié et que la méthode RejectChanges est appelée. Cette modification facilite la création des contrôles d'interface utilisateur qui exposent le contenu d'un objet DataSet.

Exceptions

La méthode Prepare lève maintenant une InvalidOperationException lorsqu'une connexion n'est pas définie ni ouverte, au lieu d'une NullReferenceException.

Mappage des vues

Les erreurs de mappage de l'affichage des requêtes sont désormais interceptées au moment du design au lieu de lever un NullReferenceException au moment de l'exécution.

La validation de mappage intercepte désormais l'erreur où deux ensembles d'associations dans Conceptual Schema (CSDL) sont mappés à la même colonne.

Transactions

Si une application essaie d'exécuter une instruction sur une connexion une fois qu'une transaction a été effectuée (voire interrompue ou restaurée), un InvalidOperationException est désormais levé. Les versions antérieures ne levaient pas d'exceptions et vous permettaient d'exécuter d'autres commandes même si une transaction était annulée.

Retour au début

Entity Framework

Le tableau suivant décrit les améliorations apportées aux fonctionnalités qui présentaient précédemment des limitations ou d'autres problèmes.

Espaces de noms : System.Data, System.Data.Objects, System.Data.Objects.DataClasses ; assembly : System.Data.Entity (dans System.Data.Entity.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Objets d'entité

Il existe désormais une parité entre la méthode ObjectContext.Detach et l'état de l'objet d'entité lorsque la méthode ObjectContext.SaveChanges est appelée. Cette cohérence améliorée empêche la levée d'exceptions inattendues.

Entity SQL

Les règles ont été améliorées pour les résolutions d'identificateurs dans Entity SQL.

L'analyseur Entity SQL a amélioré la logique de résolution des identificateurs multiparties.

Annotations structurelles

L'Entity Framework reconnaît désormais les annotations structurelles.

Requêtes

Les améliorations suivantes ont été effectuées dans les requêtes :

  • Une requête GroupBy utilisant une clé NULL sur une collection vide ne retournera aucune ligne, qu'il y ait ou non des sélections supplémentaires dans la requête.

  • Le code SQL généré dans les requêtes LINQ et Entity SQL traite désormais les paramètres de chaîne comme des valeurs non Unicode par défaut.

Retour au début

LINQ to SQL

Le tableau suivant décrit les améliorations apportées aux fonctionnalités qui présentaient précédemment des limitations ou d'autres problèmes.

Espace de noms : System.Data.Linq ; assembly : System.Data.Linq (dans System.Data.Linq.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Événements

Une collection System.Data.Linq.EntitySet<TEntity> déclenche désormais l'événement ListChanged pour des opérations d'ajout et de suppression si le EntitySet<TEntity> est déchargé, en plus de déclencher l'événement lorsque la collection est chargée.

Requêtes

Skip(0) n'est plus ignoré dans les requêtes LINQ to SQL. Par conséquent, les requêtes qui ont cette méthode peuvent se comporter différemment. Par exemple, dans certains cas, une clause OrderBy est obligatoire avec Skip(0) et la requête lèvera désormais une exception NotSupportedException si la clause OrderBy n'a pas été incluse.

Retour au début

services de données WCF

Le tableau suivant décrit les améliorations apportées aux fonctionnalités qui présentaient précédemment des limitations ou d'autres problèmes.

Espaces de noms : System.Data.Services, System.Data.Services.Client, System.Data.Services.Common, System.Data.Services.Providers ; assemblys : System.Data.Services (dans System.Data.Services.dll), System.Data.Services.Client (dans System.Data.Services.Client.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Contenu binaire par lot

Les services de données WCF prennent désormais en charge le contenu binaire par lot dans les demandes et les réponses.

Intercepteurs de modification

Les intercepteurs de modification sont désormais exécutés pour une demande de suppression.

Un intercepteur de modification est une méthode qui s'exécute chaque fois que le serveur reçoit une demande de modification pour une entité dans le jeu d'entités. Il s'exécute avant l'exécution de la requête entrante. L'intercepteur de modification fournit un accès à l'entité modifiée et à l'opération exécutée.

Exceptions

Les conditions suivantes lèvent désormais des exceptions plus utiles au lieu d'une NullReferenceException :

Dans vos applications, vous devez modifier la gestion des exceptions pour intercepter les nouvelles exceptions.

Headers

Les améliorations suivantes ont été effectuées dans les en-têtes :

  • Les services de données WCF rejetent désormais correctement un en-tête eTag qui a une valeur non spécifiée.

  • Les services de données WCF retournent désormais une erreur et n'exécutent pas les requêtes de suppression à un lien lorsqu'un en-tête if-* se trouve dans la requête.

  • Les services de données WCF retournent désormais une erreur au client dans le format (Atom, JSON) spécifié par le client dans l'en-tête Accept.

Lecteur JSON

Le lecteur JSON (JavaScript Object Notation) retourne désormais une erreur correctement lorsqu'il lit une seule barre oblique inverse (« \ ») en tant que caractère d'échappement, lorsqu'il traite des charges JSON envoyées à un service de données WCF.

Fusions

Les améliorations suivantes ont été effectuées dans l'énumération MergeOption :

  • L'option de fusion AppendOnly ne modifie plus l'entité sur le client suite aux réponses ultérieures d'un service de données.

  • L'option PreserveChanges est désormais cohérente entre les mises à jour SQL dynamiques et les mises à jour basées sur des procédures stockées.

Demandes

La méthode DataService<T>.OnStartProcessingRequest est maintenant appelée avant qu'une requête aux services de données ne soit traitée. La requête peut ainsi fonctionner correctement pour les services ServiceOperation.

Flux

Les services de données WCF ne ferment plus le flux sous-jacent pour les opérations en lecture et en écriture.

URI

L'échappement des URI par le client des services de données WCF a été corrigé.

Windows Communication Foundation (WCF)

Le tableau suivant décrit les améliorations apportées aux fonctionnalités qui présentaient précédemment des limitations ou d'autres problèmes.

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Fichiers de configuration

Pour permettre l'héritage des comportements via la hiérarchie de fichiers de configuration, WCF prend désormais en charge la fusion dans les fichiers de configuration.

Le modèle d'héritage de configuration est maintenant développé pour permettre aux utilisateurs de définir des comportements qui s'appliqueront à tous les services exécutés sur l'ordinateur.

Vous pouvez rencontrer des changements de comportement si des comportements ont le même nom à différents niveaux de la hiérarchie.

Hébergement de services

Vous ne pouvez plus spécifier l'élément de configuration <serviceHostingEnvironment> au niveau du service en ajoutant l'attribut allowDefinition="MachineToApplication" à la définition de l'élément.

La spécification de l'élément <serviceHostingEnvironment> au niveau du service n'est pas correcte d'un point de vue technique et engendre un comportement incohérent.

Retour au début

Windows Presentation Foundation (WPF)

Applications

Espaces de noms : System.Windows, System.Windows.Controls ; assembly : PresentationFramework (dans PresentationFramework.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Modifications recommandées

Gestion des exceptions

Pour détecter les erreurs plus tôt, WPF lève un TargetInvocationException et définit la propriété InnerException sur des exceptions critiques, telles que NullReferenceException, OutOfMemoryException, StackOverflowException et SecurityException, au lieu d'intercepter l'exception d'origine.

Aucun

Ressources liées

Pour faciliter les liaisons, les fichiers de ressources (tels que des images), non situés dans la structure de dossiers du projet utilisent le chemin d'accès complet du fichier de ressources comme ID lorsque l'application est générée, au lieu d'utiliser simplement le nom de fichier de la ressource. L'application sera en mesure de trouver les fichiers au moment de l'exécution.

Aucun

Applications de confiance partielle

Pour des raisons de sécurité, les applications Windows qui fonctionnent en mode de confiance partielle et qui contiennent un contrôle WebBrowser ou un contrôle Frame contenant HTML lèveront un SecurityException lorsque le contrôle sera créé.

Les applications de navigateur lèveront une exception et afficheront un message si toutes les conditions suivantes sont respectées :

  • l'application s'exécute dans Firefox ;

  • l'application s'exécute en mode de confiance partielle dans la zone Internet à partir de sites non approuvés ;

  • l'application contient un contrôle WebBrowser ou un contrôle Frame contenant HTML.

Notez que les applications qui s'exécutent à partir de sites approuvés ou de la zone intranet ne seront pas affectées.

Dans vos applications de navigateur, vous pouvez atténuer cette modification en effectuant l'une des opérations suivantes :

  • exécutez l'application de navigateur en mode de confiance totale ;

  • invitez les clients à ajouter le site de l'application à la zone de sites approuvée ;

  • invitez les clients à exécuter l'application dans Internet Explorer.

Dictionnaires de ressources

Pour améliorer les dictionnaires de ressources au niveau du thème et les empêcher de changer, des ressources figeables définies dans un dictionnaire de ressources et fusionnées dans un dictionnaire au niveau du thème restent désormais marquées comme figées et sont immuables. Il s'agit du comportement attendu pour les ressources Freezable.

Les applications qui modifient une ressource définie dans un dictionnaire fusionné au niveau du thème doivent cloner la ressource et modifier la copie clonée. La ressource peut aussi être marquée comme x:Shared="false" afin que le ResourceDictionary crée une copie chaque fois que la ressource est interrogée.

Windows 7

Pour permettre un fonctionnement optimal des applications WPF sur Windows 7, les améliorations suivantes ont été effectuées pour corriger le comportement d'une fenêtre :

  • Les états d'ancrage et de mouvement fonctionnent désormais comme prévu selon les interventions de l'utilisateur.

  • Les commandes de la barre des tâches Cascade, Afficher les fenêtres empilées et Afficher les fenêtres côte à côte ont désormais un comportement correct et mettent à jour les propriétés appropriées.

  • Les propriétés Top, Left, Width et Height d'une fenêtre agrandie ou réduite contiennent désormais l'emplacement de restauration correct de la fenêtre au lieu d'autres valeurs, en fonction du moniteur.

Aucun

Style et transparence des fenêtres

Un InvalidOperationException est levé si vous essayez d'affecter à WindowStyle une valeur différente de None lorsque AllowsTransparency est true et que WindowState est Minimized.

Si vous devez modifier le WindowStyle lorsque AllowsTransparency est true, vous pouvez appeler la fonction Win32 SetWindowLongPtr.

Visionneuse XPS

WPF n'inclut pas Microsoft XML Paper Specification Essentials Pack (XPSEP). XPSEP est inclus avec Windows 7 et Windows Vista.

Sur un ordinateur qui exécute Windows XP sans que .NET Framework 3.5 SP1 ne soit installé, l'impression à l'aide d'une API WPF différente de celles dans PrintDialog utilisera le WINSPOOL. Certaines fonctions d'imprimante ne seront pas signalées et certains paramètres de l'imprimante ne seront pas appliqués pendant l'impression.

Si nécessaire, installez le Microsoft XML Paper Specification Essentials Pack.

Retour au début

Contrôles

Espaces de noms : System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input ; assemblys : PresentationFramework (dans PresentationFramework.dll), PresentationCore (dans PresentationCore.dll), WindowsBase (dans WindowsBase.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Modifications recommandées

Boîtes de dialogue

Pour améliorer la fiabilité, la méthode CommonDialog.ShowDialog est appelée sur le même thread qui a créé le contrôle Microsoft.Win32.FileDialog.

Veillez à créer un contrôle FileDialog et à appeler la méthode ShowDialog sur le même thread.

Fenêtres flottantes

Pour corriger la logique de restauration du focus qui réactive sans cesse une fenêtre flottante (en l'affichant comme une boîte de dialogue modale), la restauration du focus est désormais bloquée si le candidat n'est pas un enfant de la fenêtre.

Aucun

Éléments dans les collections

Lorsqu'un élément est déplacé ou ajouté à une collection sous-jacente, il s'affiche dans le CollectionView au même emplacement relatif si le CollectionView n'est pas trié. Cela garantit une cohérence entre la position de l'élément dans la collection et le CollectionView associé.

Utilisez la méthode ItemContainerGenerator.ContainerFromItem ou CollectionView.IndexOf pour trouver l'emplacement d'un élément dans un CollectionView au lieu de vous reposer sur l'emplacement fixe d'un élément.

Dispositions

Pour empêcher des redispositions inutiles, la modification de la Page.ShowsNavigationUI n'invalide plus la disposition et n'engendre plus une autre passe de disposition.

Si vous pensez que ShowsNavigationUI provoquera une autre passe de disposition, appelez UIElement.InvalidateVisual après avoir défini la propriété.

Menus

Pour activer du texte ClearType dans les menus contextuels, des modifications ont été effectuées dans la classe ControlTemplate, le contrôle MenuItem et d'autres contrôles.

Les applications ne doivent pas s'appuyer sur la structure visuelle des modèles de contrôle. Seules les parties nommées d'un ControlTemplate font partie du contrat public. Si une application doit rechercher un certain objet dans un ControlTemplate, recherchez un type spécifique dans l'arborescence d'éléments visuels au lieu de vous reposer sur un emplacement fixe d'un objet dans l'arborescence.

Navigation

Si un Frame navigue directement jusqu'à un emplacement, la propriété IsNavigationInitiator a la valeur true après la navigation initiale. Cette modification empêche des événements supplémentaires d'être déclenchés au cours des scénarios au démarrage.

Aucun

Menus contextuels

Le délégué CustomPopupPlacementCallback peut désormais être appelé plusieurs fois pendant une passe de disposition au lieu d'une seule fois.

Si votre délégué CustomPopupPlacementCallback calcule la position d'un Popup en fonction de sa position précédente, recalculez la position uniquement si les valeurs des paramètres popupSize, targetSize ou offset sont modifiées.

Valeurs de la propriété

La méthode DependencyObject.SetCurrentValue vous permet désormais d'affecter à une propriété une valeur effective même si elle continue de respecter les liaisons, les styles ou les déclencheurs qui affectent la propriété.

Les auteurs de contrôles doivent utiliser SetCurrentValue chaque fois que la valeur de propriété se transforme sous l'effet d'une quelque autre action, notamment une manipulation d'utilisateur.

Zones de texte

Pour des raisons de sécurité, les méthodes TextBoxBase.Copy et TextBoxBase.Cut échouent silencieusement lorsqu'elles sont appelées en mode de confiance partielle.

De plus, l'exécution par programmation de la propriété ApplicationCommands.Copy ou ApplicationCommands.Cut sur un contrôle qui hérite de TextBoxBase sera bloquée en mode de confiance partielle. Toutefois, les commandes de copier et couper initiées par l'utilisateur, telles que le clic sur un bouton dont la propriété ButtonBase.Command est liée à l'une de ces commandes, fonctionneront. Les actions copier et couper standard effectuées via des raccourcis clavier et le menu contextuel continueront de fonctionner comme avant en mode de confiance partielle.

Liez la commande ApplicationCommands.Copy ou ApplicationCommands.Cut à une action initiée par l'utilisateur (par exemple, lorsqu'il clique sur un bouton).

Retour au début

Graphiques

Espaces de noms : System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input, System.Windows.Media.Effects ; assemblys : PresentationFramework (dans PresentationFramework.dll), PresentationCore (dans PresentationCore.dll), WindowsBase (dans WindowsBase.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Modifications recommandées

Effets bitmap

Pour améliorer les performances, la classe BitmapEffect et les classes qui héritent de la classe BitmapEffect, même si elles sont encore présentes, sont désactivées. L'effet sera restitué à l'aide du pipeline de rendu accéléré par le matériel si les conditions suivantes sont vérifiées :

  • L'application utilise un DropShadowBitmapEffect ou un BlurBitmapEffect qui a un jeu de propriétés de rayon inférieur à 100 DIU.

  • la carte vidéo sur l'ordinateur qui exécute l'application prend en charge Pixel Shader 2.0.

Si ces conditions ne sont pas réunies, un objet BitmapEffect n'aura aucun effet.

De même, Visual Studio 2010 produira un avertissement du compilateur lorsqu'il rencontrera l'objet BitmapEffect ou une sous-classe.

La méthode PushEffect est marquée comme obsolète.

Cessez d'utiliser le BitmapEffect hérité et les classes dérivées et, à la place, utilisez les nouvelles classes dérivées de Effect : BlurEffect, DropShadowEffect et ShaderEffect.

Vous pouvez également créer vos propres effets en héritant de la classe ShaderEffect.

Trames bitmap

Les objets clonés BitmapFrame reçoivent désormais les événements DownloadProgress, DownloadCompleted et DownloadFailed. Les images téléchargées à partir d'Internet et appliquées au contrôle Image via un Style peuvent ainsi fonctionner correctement.

Vous constaterez une modification dans le comportement seulement si toutes les instructions suivantes ont la valeur true :

Vérifiez l'émetteur dans le gestionnaire d'événements et intervenez uniquement si l'émetteur est le BitmapFrame d'origine.

Décodage d'images

Pour empêcher un problème de gestion de IOException lorsque des images ne peuvent pas être décodées, la classe BitmapSource déclenchera l'événement DecodeFailed lorsqu'elle ne décodera pas une image.

Supprimez les gestions d'exceptions pour IOException et utilisez l'événement DecodeFailed pour vérifier l'échec du décodage.

Retour au début

Entrée

Espaces de noms : System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input ; assemblys : PresentationFramework (dans PresentationFramework.dll), PresentationCore (dans PresentationCore.dll), WindowsBase (dans WindowsBase.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Modifications recommandées

Liaison d'instances de commande

Pour fournir un mécanisme permettant de lier des instances de commande basées sur le modèle Vue à des mouvements d'entrée basés sur la Vue, la classe InputBinding hérite désormais de Freezable au lieu de DependencyObject. Les propriétés suivantes sont maintenant des propriétés de dépendance :

Cette modification entraîne le résultat suivant :

  • Un objet InputBinding est maintenant figé lorsqu'il est enregistré au lieu de rester mutable.

  • Vous ne pouvez pas accéder aux objets InputBinding au niveau de l'instance à partir de plusieurs threads, en raison des restrictions de la classe DependencyObject.

  • Vous ne pouvez pas muter de liaisons d'entrée au niveau de la classe après leur inscription, en raison des restrictions de la classe Freezable.

  • Vous ne pouvez pas spécifier de liaisons d'entrée sur les instances de commande créées dans un modèle Vue.

Créez des instances distinctes d'une classe InputBinding sur les threads séparés si les liaisons doivent être mutables, sinon figez-les. Ne mutez pas un InputBinding statique de niveau classe après son inscription.

Applications de navigateur

Les applications de navigateur WPF (.XBAP) traitent maintenant de la même manière les événements de touche que les applications WPF autonomes afin que les objets reçoivent des événements routés de touche dans l'ordre correct.

Aucun

Combinaisons de touches mortes

WPF obscurcit les touches mortes, qui ne produisent aucun caractère visible mais indiquent à la place que la touche sera combinée avec la touche suivante afin de produire un caractère. Les événements de saisie, tels que l'événement KeyDown, indiquent lorsqu'une touche est une touche morte en affectant à la propriété Key la valeur DeadCharProcessed. Ce comportement est connu car les applications ne projettent généralement pas de répondre à l'entrée au clavier qui crée un caractère combiné.

Les applications qui s'attendent à lire des touches faisant partie des caractères combinés peuvent obtenir la touche maintenant obscurcie à l'aide de la propriété DeadCharProcessedKey.

Gestionnaire du focus

Lorsque la méthode FocusManager.GetFocusedElement est passée à un élément dont la propriété jointe IsFocusScope a la valeur true, la méthode retourne un élément qui constitue le dernier élément qui a le focus du clavier au sein de cette portée de focus, si et seulement si l'élément retourné appartient au même objet PresentationSource que l'élément qui est passé à la méthode.

Aucun

Retour au début

UI Automation

Espace de noms : System.Windows, System.Windows.Automation.Peers, System.Windows.Automation.Provider, System.Windows.Controls, System.Windows.Data, System.Windows.Input ; assemblys : PresentationFramework (dans PresentationFramework.dll), PresentationCore (dans PresentationCore.dll), UIAutomationProvider (dans UIAutomationProvider.dll), WindowsBase (dans WindowsBase.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Modifications recommandées

Hiérarchie de classes de vues

Les classes TreeViewAutomationPeer et TreeViewItemAutomationPeer héritent de ItemsControlAutomationPeer au lieu de FrameworkElementAutomationPeer.

Si vous héritez des classes TreeViewItemAutomationPeer et substituez la méthode GetChildrenCore, envisagez de retourner un objet qui hérite de la nouvelle classe TreeViewDataItemAutomationPeer.

Conteneurs hors-écran

Pour résoudre une valeur de retour incorrecte, la méthode UIElementAutomationPeer.IsOffscreenCore retourne maintenant correctement la valeur false pour les conteneurs d'éléments qui sortent de l'affichage par défilement. De même, la valeur de la méthode n'est pas affectée par l'occlusion par d'autres fenêtres, ou par le fait que l'élément est visible ou non, sur un écran spécifique.

Aucun

Menus et objets enfants

Pour activer l'UI Automation des menus qui contiennent des enfants différents des objets MenuItem, la méthode GetChildrenCore retourne maintenant l'objet AutomationPeer d'un objet UIElement enfant, au lieu d'un objet MenuItemAutomationPeer.

Aucun

Nouvelles interfaces et nouvel assembly

Pour permettre aux nouvelles fonctions d'utiliser l'UI Automation, les interfaces suivantes ont été ajoutées :

Tout projet qui génère des homologues Automation WPF doit ajouter une référence explicite à UIAutomationProvider.dll.

Types Thumb

La méthode GetClassNameCore retourne une valeur au lieu de la valeur Null. Par conséquent, les contrôles, tels que GridSplitter, qui héritent de la classe Thumb signaleront un nom à l'UI Automation.

Aucun

Éléments virtualisés

Pour améliorer les performances, la méthode UIElementAutomationPeer.GetChildrenCore retourne uniquement les objets enfants qui sont réellement dans l'arborescence d'éléments visuels, au lieu de tous les objets enfants, qu'ils soient virtualisés ou non.

Utilisez ItemContainerPattern pour itérer au sein de tous les éléments d'un ItemsControlAutomationPeer.

Retour au début

XAML

Espaces de noms : System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input, System.Windows.Markup ; assemblys : PresentationFramework (dans PresentationFramework.dll), PresentationCore (dans PresentationCore.dll), WindowsBase (dans WindowsBase.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Modifications recommandées

Extension de balisage

WPF utilise maintenant toujours correctement la valeur de la méthode MarkupExtension.ProvideValue au lieu de retourner l'objet MarkupExtension dans certains cas lorsqu'une extension de balisage est utilisée pour définir une propriété ou créer un élément dans une collection. Une extension de balisage peut se retourner elle-même dans certains cas.

Si votre application accède à une ressource qui a retourné un objet MarkupExtension dans les versions antérieures, référencez l'objet retourné de ProvideValue, plutôt que de l'objet MarkupExtension.

Attributs d'analyse

Les attributs dans XAML peuvent désormais avoir un seul point. Les exemples suivants sont valides :

<Button Background="Red"/> (aucun point)

<Button Button.Background = "Red"/> (un point)

L'exemple suivant n'est plus valide :

<Button Control.Button.Background = "Red"/> (plusieurs points)

Attributs XAML corrects qui ont plusieurs points.

Retour au début

XML

Les lignes de cette table décrivent les améliorations apportées aux fonctionnalités qui présentaient précédemment des limitations ou d'autres problèmes.

Schéma et transformations

Espaces de noms : System.Xml.Linq, System.Xml.Schema, System.Xml.XPath ; assemblys : System.Xml (in System.Xml.dll), System.Xml.Linq (dans System.Xml.Linq.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Schémas caméléons

Pour empêcher une altération des données, les schémas caméléons sont désormais correctement clonés lorsqu'ils sont inclus avec plusieurs schémas.

Les schémas caméléons sont des schémas qui n'ont pas d'espace de noms cible, et lorsqu'ils sont inclus dans un autre XSD, ils utilisent l'espace de noms cible du schéma importateur. Ils sont souvent utilisés pour inclure des types communs dans un schéma.

Fonctions id

La fonction id XSLT retourne désormais la valeur correcte au lieu de la valeur Null lorsqu'un objet XmlReader est passé à un XLST.

Si l'utilisateur créait un objet XmlReader à partir d'une classe LINQ to XML à l'aide de la méthode CreateReader, et que cet objet XmlReader était passé à un XSLT, toutes les instances de la fonction id dans le XSLT retournaient la valeur Null. Ce n'est pas une valeur de retour autorisée pour la fonction id.

Attribut d'espace de noms

Pour empêcher l'altération de données, un objet XPathNavigator retourne désormais correctement le nom local de l'attribut x:xmlns.

Déclarations d'espaces de noms

Un objet XmlReader sur une sous-arborescence ne crée plus de déclarations d'espace de noms en double dans un élément XML.

Validation de schéma

Pour empêcher toute erreur de validation de schéma, la classe XmlSchemaSet permet aux schémas XSD d'être compilés de façon correcte et cohérente. Ces schémas peuvent inclure d'autres schémas ; par exemple, A.xsd peut inclure B.xsd, qui peut inclure C.xsd. Lorsque l'un d'eux est compilé, ce graphique de dépendances est parcouru.

Fonctions de script

La fonction function-available ne retourne plus une valeur false incorrecte lorsque la fonction est réellement disponible.

URI

La méthode XElement.Load retourne maintenant la BaseURI correcte dans les requêtes LINQ.

Retour au début

Validation

Espaces de noms : System.Xml.Linq, System.Xml.Schema, System.Xml.XPath ; assemblys : System.Xml (in System.Xml.dll), System.Xml.Linq (dans System.Xml.Linq.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Résolveurs d'espace de noms

La méthode XmlReader.ReadContentAs n'ignore plus le résolveur IXmlNamespaceResolver qui lui est passé.

Dans les versions antérieures, le résolveur d'espace de noms spécifié était ignoré, et le XmlReader était utilisé à la place.

Espace blanc

Pour empêcher toute perte de données lorsque vous créez un lecteur, la méthode XmlReader.Create ne supprime plus l'espace significatif.

La validation XML reconnaît le mode de contenu mixte, où du texte peut être inséré dans le balisage XML. En mode mixte, tout espace est significatif et doit être signalé.

Retour au début

Écriture

Espaces de noms : System.Xml.Linq, System.Xml.Schema, System.Xml.XPath ; assemblys : System.Xml (in System.Xml.dll), System.Xml.Linq (dans System.Xml.Linq.dll)

Fonctionnalité

Différences par rapport à la version 3.5 SP1

Références d'entité

Pour empêcher l'altération de données, les références d'entité ne sont plus décomposées deux fois en entités dans les attributs XML.

Si l'utilisateur essayait d'écrire une entité dans un attribut xmlns, xml:lang ou xml:space à l'aide de la méthode WriteEntityRef, l'entité était décomposée deux fois en entités dans la sortie, ce qui endommagait les données.

Gestion du retour à la ligne

Pour empêcher l'altération de données, les objets XmlWriter respectent l'option None.

Retour au début

Voir aussi

Concepts

Nouveautés de .NET Framework 4

Migration de solutions Office vers .NET Framework 4

Autres ressources

Guide de migration du .NET Framework 4

Compatibilité de versions dans le .NET Framework

Éléments obsolètes dans le .NET Framework

Nouveaux types et membres dans le .NET Framework 4

Migration Issues for .NET Framework 4 Applications: Beta 2 to RTM

Historique des modifications

Date

Historique

Motif

Août 2010

Ajout de problèmes relatifs à l'hébergement des contrôles dans le navigateur Web, les classes de compilateur et CodeDOM et la visionneuse du cache d'assembly global.

Améliorations apportées aux informations.