Freigeben über


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.

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-Serialisierungsprozesses false zurückgibt. (Hinweis: Die Methode kann den Bereich private 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.

.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.