Partager via


Guide de migration de Windows Forms pour BinaryFormatter

Suppression de BinaryFormatter

À partir de .NET 9, BinaryFormatter n'est plus pris en charge en raison des risques de sécurité connus qu'il présente et ses API lèvent toujours une exception PlatformNotSupportedException pour tous les types de projets, y compris les applications Windows Forms. Pour plus d'informations sur les risques posés par BinaryFormatter et la raison de sa suppression, voir le guide de migration de BinaryFormatter.

Avec la suppression de BinaryFormatter, on peut prévoir que de nombreuses applications Windows Forms soient impactées, et vous devrez faire le nécessaire pour migrer vers .NET 9 ou une version ultérieure.

Comment BinaryFormatter affecte Windows Forms

Avant .NET 9, Windows Forms utilisait BinaryFormatter pour sérialiser et désérialiser les données pour des scénarios tels que le Presse-papiers, le glisser-déposer et le stockage ou le chargement de ressources au moment du design. Depuis .NET 9, Windows Forms et WPF utilisent un sous-ensemble de l’implémentation de BinaryFormatter en interne pour ces scénarios. Bien que les risques liés à BinaryFormatter ne puissent pas être traités dans la sérialisation/désérialisation générale, des mesures ont été prises pour atténuer les risques dans ces cas d'utilisation très spécifiques avec un ensemble connu de types. Un repli sur BinaryFormatter reste possible pour les types inconnus ou non pris en charge, ce qui lève des exceptions, à moins qu'une migration ne soit mise en œuvre dans l'application.

Les applications Windows Forms et WPF gèrent les types ci-après, ainsi que les tableaux et listes de ces types. Le Presse-papiers, le glisser-déposer et les ressources au moment du design continueront de fonctionner avec ces types sans opération de migration nécessaire.

Windows Forms prend également en charge les types supplémentaires suivants :

Scénarios OLE

Pour plus d'informations sur les effets de la suppression de BinaryFormatter sur les scénarios OLE tels que le Presse-papiers et le glisser-déposer, et obtenir des instructions pour migrer, voir la page Windows Forms and Windows Presentation Foundation BinaryFormatter OLE guidance.

Resources (ResX)

Le Concepteur Windows Forms

Le Concepteur hors processus Windows Forms utilise également BinaryFormatter en interne pour la sérialisation et la désérialisation ResX.

Les types et les propriétés peuvent participer à la sérialisation sans que vous vous en rendiez compte en raison du comportement standard du Concepteur Windows Forms. L'une des utilisations de BinaryFormatter dont vous n'êtes peut-être pas conscient est l'introduction d'une propriété public sur un IComponent, qui est renseignée ou modifiée au moment du design. Cette propriété est sérialisée dans des fichiers de ressources dans les conditions suivantes :

  • Une propriété publique contient des données au moment de l'enregistrement d'un Form dans le Concepteur.
  • Cette propriété n’est pas en lecture seule.
  • Cette propriété n’est pas attribuée avec [DesignerSerializationVisibility(false)].
  • Cette propriété n'a pas d'attribut DefaultValueAttribute.
  • Cette propriété n'a pas de méthode bool ShouldSerialize[PropertyName] qui renvoie false au moment du processus de sérialisation du CodeDOM. (Remarque : la méthode peut avoir une étendue private).
  • Cette propriété est un type qui n’a pas de DesignerSerializer.

Si ces conditions sont vérifiées, le Concepteur détermine si le type de cette propriété a un convertisseur de type. Si c’est le cas, le Concepteur utilise le convertisseur de type pour sérialiser le contenu de la propriété. Sinon, il utilise BinaryFormatter pour sérialiser le contenu dans le fichier de ressources. Windows Forms a ajouté des analyseurs aux côtés des correctifs de code pour aider à sensibiliser à ce type de comportement où la sérialisation BinaryFormatter peut se produire à l'insu du développeur.

Chargement de la ressource pendant l’exécution

Les types précédemment sérialisés dans des fichiers de ressources via BinaryFormatter continuent à se désérialiser comme prévu sans avoir besoin de BinaryFormatter, le contenu des fichiers ResX étant considéré comme du contenu de confiance. Dans les rares cas où la désérialisation ne peut pas se faire sans BinaryFormatter, son rajout est possible avec un package de compatibilité non pris en charge. Pour plus d'informations, voir le guide de migration de BinaryFormatter, page Compatibility Package. Notez qu'une étape supplémentaire, consistant à définir le commutateur de contexte System.Resources.Extensions.UseBinaryFormatter sur true est nécessaire pour utiliser BinaryFormatter pour les ressources.

Création de fichiers de ressources via msbuild

Lors de la création de fichiers de ressources via msbuild, vous pouvez rencontrer une erreur MSB3825 qui indique que vos ressources au format binaire peuvent être désérialisées à l’aide de BinaryFormatter pendant le runtime. Comme indiqué ci-dessus, ces ressources ne vont pas désérialiser à l’aide de BinaryFormatter et cet avertissement peut être désactivé en définissant la propriété GenerateResourceWarnOnBinaryFormatterUse sur false. Dans les rares cas où la désérialisation ne peut pas se faire sans BinaryFormatter, son rajout est possible avec un package de compatibilité non pris en charge. Pour plus d'informations, voir le guide de migration de BinaryFormatter, page Compatibility Package. Notez qu'une étape supplémentaire, consistant à définir le commutateur de contexte de l'application System.Resources.Extensions.UseBinaryFormatter sur true est nécessaire pour utiliser BinaryFormatter pour les ressources.

Faire sans BinaryFormatter

Si des types qui ne sont pas intrinsèquement gérés lors de la sérialisation et la désérialisation sont utilisés dans les scénarios affectés, vous devrez faire le nécessaire pour migrer vers .NET 9 ou une version ultérieure.

Scénarios OLE

Voir la page Windows Forms and Windows Presentation Foundation BinaryFormatter OLE guidance pour plus d’informations sur la façon de faire sans BinaryFormatter dans des scénarios tels que le Presse-papiers et le glisser-déposer.

Chargement et enregistrement des ressources au moment du design

Pour les types qui ne sont pas intrinsèquement gérés lors de la sérialisation dans les ressources, comme dans le cas des scénarios Designer with ResX, la manière prescrite de faire sans BinaryFormatter consiste à s’assurer qu’un TypeConverter est enregistré pour le type ou la propriété qui participe à la sérialisation. Ainsi, lors de la sérialisation et de la désérialisation, le TypeConverter est utilisé en lieu et place de BinaryFormatter. Pour plus d’informations sur l’implémentation d’un convertisseur de type, voir TypeConverter Class.

Les utilisateurs .NET 9 qui ne peuvent pas faire sans BinaryFormatter peuvent installer un package de compatibilité non pris en charge. Pour plus d’informations, voir le guide de migration BinaryFormatter, page Compatibility Package.

Attention

BinaryFormatter est dangereux et non recommandé, car il expose les applications consommatrices à des risques d’attaques, notamment par déni de service (DoS), divulgation d’informations ou encore exécution de code à distance. Pour plus d'informations sur les risques posés par BinaryFormatter, voir la page Deserialization risks in use of BinaryFormatter and related types.

Problèmes

Si vous rencontrez un comportement inattendu sur votre application Windows Forms en lien avec la sérialisation ou la désérialisation BinaryFormatter, rapportez le problème sur github.com/dotnet/winformswinforms en précisant qu'il est lié à la suppression de BinaryFormatter.