Windows Forms-Migrationsleitfaden für BinaryFormatter
Entfernen von BinaryFormatter
Ab .NET 9 BinaryFormatterwird es aufgrund bekannter Sicherheitsrisiken nicht mehr unterstützt, und die APIs lösen immer ein PlatformNotSupportedException für alle Projekttypen, einschließlich Windows FormsApps, aus. Weitere Informationen zu den Risiken von BinaryFormatter und zum Grund für die Entfernung finden Sie im BinaryFormatter-Migrationsleitfaden.
Es wird erwartet, dass durch das Entfernen von BinaryFormatter viele Windows Forms-Anwendungen betroffen sind, und Sie müssen Maßnahmen ergreifen, um die Migration zu .NET 9 oder einer höheren Version abzuschließen.
Auswirkungen von BinaryFormatter auf Windows Forms
Vor .NET 9 hat Windows Forms BinaryFormatter zum Serialisieren und Deserialisieren von Daten für Szenarien wie Zwischenablage, Drag & Drop und Speichern oder Laden von Ressourcen zur Entwurfszeit verwendet. Ab .NET 9 verwenden Windows Forms und WPF eine Teilmenge der BinaryFormatter-Implementierung intern für diese Szenarien. Die Risiken von BinaryFormatter können zwar nicht in der allgemeinen Serialisierung/Deserialisierung behoben werden, es wurden aber Maßnahmen ergriffen, um die Risiken in diesen sehr spezifischen Anwendungsfällen mit einer bekannten Gruppe von Typen zu mindern. Ein Fallback auf BinaryFormatter ist weiterhin für unbekannte oder nicht unterstützte Typen vorhanden, die Ausnahmen auslösen, es sei denn, es werden Migrationsschritte in der Anwendung ausgeführt.
Windows Forms- und WPF-Apps behandeln die folgenden Typen zusammen mit Arrays und Listen dieser Typen. Zwischenablage-, Drag & Drop- und Entwurfszeitressourcen funktionieren weiterhin mit diesen Typen, ohne dass Migrationsschritte erforderlich sind.
bool
byte
char
decimal
double
int
sbyte
float
- TimeSpan
- DateTime
uint
string
nint
nuint
long
ulong
short
ushort
- PointF
- RectangleF
Windows Forms unterstützt auch die folgenden zusätzlichen Typen:
OLE-Szenarien
Informationen zu den Auswirkungen, die das Entfernen von BinaryFormatter auf OLE-Szenarien wie Zwischenablage und Drag & Drop hat, und einen Migrationsleitfaden finden Sie unter OLE-Leitfaden für BinaryFormatter in Windows Forms und Windows Presentation Foundation .
Ressourcen (ResX)
Windows Forms-Designer
Der Out-of-Process-Designer von Windows Forms verwendet zudem BinaryFormatter intern für ResX-Serialisierung und -Deserialisierung.
Typen und Eigenschaften können aufgrund des Standardverhaltens des Windows Forms-Designers an der Serialisierung beteiligt sein, ohne dass es Ihnen auffällt. Ein Fall, in dem BinaryFormatter verwendet wird, ohne, dass es Ihnen bewusst ist, ist, wenn eine public
-Eigenschaft für IComponent eingeführt wird und diese Eigenschaft zur Entwurfszeit ausgefüllt oder bearbeitet wird. Diese Eigenschaft wird unter den folgenden Bedingungen in Ressourcendateien serialisiert:
- Eine öffentliche Eigenschaft enthält Daten zu dem Zeitpunkt, zu dem ein Form-Element im Designer gespeichert wird.
- Diese Eigenschaft ist nicht schreibgeschützt.
- Diese Eigenschaft ist nicht mit dem Attribut
[DesignerSerializationVisibility(false)]
versehen. - Diese Eigenschaft hat keine DefaultValueAttribute.
- Diese Eigenschaft verfügt nicht über eine entsprechende
bool ShouldSerialize[PropertyName]
-Methode, die zum Zeitpunkt des CodeDOM-Serialisierungsprozessesfalse
zurückgibt. (Hinweis: Die Methode kann den Bereichprivate
aufweisen.) - Diese Eigenschaft ist ein Typ, der keine DesignerSerializer-Klasse besitzt.
Wenn diese Aussagen zutreffen, bestimmt der Designer, ob der Typ dieser Eigenschaft über einen Typkonverter verfügt. Wenn dies der Fall ist, verwendet der Designer den Typkonverter, um den Eigenschafteninhalt zu serialisieren. Andernfalls wird BinaryFormatter verwendet, um den Inhalt in die Ressourcendatei zu serialisieren. Windows Forms hat Analysetools zusammen mit Codefixes hinzugefügt, um auf diese Art von Verhalten aufmerksam zu machen, bei dem die BinaryFormatter-Serialisierung ohne das Wissen des Entwicklers erfolgt.
Laden der Ressource während der Laufzeit
Typen, die zuvor über BinaryFormatter in Ressourcendateien serialisiert wurden, werden weiterhin erwartungsgemäß deserialisiert, ohne dass BinaryFormatter erforderlich ist, da der Inhalt von ResX-Dateien als vertrauenswürdige Daten betrachtet wird. In dem seltenen Fall, dass die Deserialisierung nicht ohne BinaryFormatter erfolgen kann, kann es mit einem nicht unterstützten Kompatibilitätspaket wieder hinzugefügt werden. Ausführliche Informationen finden Sie unter BinaryFormatter-Migrationsleitfaden: Kompatibilitätspaket. Beachten Sie, dass in einem zusätzlichen Schritt der System.Resources.Extensions.UseBinaryFormatter
-App-Kontextwechsel auf true
festgelegt werden muss, um BinaryFormatter für Ressourcen zu verwenden.
Generieren von Ressourcendateien über msbuild
Beim Erstellen von Ressourcendateien über msbuild tritt möglicherweise ein Fehler vom Typ MSB3825
auf, der darauf hinweist, dass Ihre Ressourcen im Binärformat während der Laufzeit mithilfe von BinaryFormatter deserialisiert werden können. Diese Ressourcen werden, wie oben erwähnt, nicht mithilfe von BinaryFormatter deserialisiert, und diese Warnung kann deaktiviert werden, wenn Sie die Eigenschaft GenerateResourceWarnOnBinaryFormatterUse
auf false
festlegen. In seltenen Fällen, in denen die Deserialisierung nicht ohne BinaryFormatter erfolgen kann, kann es mit einem nicht unterstützten Kompatibilitätspaket wieder hinzugefügt werden. Ausführliche Informationen finden Sie unter BinaryFormatter-Migrationsleitfaden: Kompatibilitätspaket. Beachten Sie, dass in einem zusätzlichen Schritt der System.Resources.Extensions.UseBinaryFormatter
-App-Kontextwechsel auf true
festgelegt werden muss, um BinaryFormatter für Ressourcen zu verwenden.
Migrieren von BinaryFormatter
Wenn Typen, die während der Serialisierung und Deserialisierung nicht systemintern behandelt werden, in den betroffenen Szenarien verwendet werden, müssen Sie Maßnahmen ergreifen, um die Migration zu .NET 9 oder einer höheren Version abzuschließen.
OLE-Szenarien
Weitere Informationen zum Migrieren von BinaryFormatter in Szenarien wie Zwischenablage und Drag & Drop finden Sie unter OLE-Leitfaden für BinaryFormatter in Windows Forms und Windows Presentation Foundation.
Laden und Sparen von Ressourcen während der Entwurfszeit
Bei Typen, die während der Serialisierung nicht systemintern in Ressourcen behandelt werden (etwa bei Szenarien mit dem Designer und ResX), ist die vorgeschriebene Vorgehensweise die Migration von BinaryFormatter, um sicherzustellen, dass TypeConverter
für den Typ oder die Eigenschaft registriert ist, der bzw. die an der Serialisierung beteiligt ist. Auf diese Weise wird bei der Serialisierung und Deserialisierung TypeConverter
verwendet, wo zuvor BinaryFormatter verwendet wurde. Weitere Informationen zum Implementieren eines Typkonverters finden Sie unter TypeConverter
-Klasse.
Kompatibilitätsumgehung (nicht empfohlen)
.NET 9-Benutzer, die nicht von BinaryFormatter migrieren können, können ein nicht unterstütztes Kompatibilitätspaket installieren. Weitere Informationen finden Sie unter BinaryFormatter-Migrationsleitfaden: Kompatibilitätspaket.
Achtung
BinaryFormatter ist gefährlich und wird nicht empfohlen, da es genutzte Apps dem Risiko von Angriffen wie DoS-Angriffen (Denial-of-Service-Angriffe), der Veröffentlichung von Informationen oder der Remotecodeausführung aussetzt. Weitere Informationen zum Risiko, das BinaryFormatter darstellt, finden Sie unter Deserialisierungsrisiken bei der Verwendung von BinaryFormatter und verwandten Typen.
Probleme
Wenn bei Ihrer Windows Forms-App unerwartetes Verhalten bezüglich der BinaryFormatter Serialisierung oder -Deserialisierung auftritt, melden Sie ein Problem auf github.com/dotnet/winforms, und geben Sie an, dass das Problem mit dem Entfernen von BinaryFormatter zusammenhängt.