次の方法で共有


BinaryFormatter のための Windows Forms 移行ガイド

BinaryFormatter 削除

.NET 9以降、BinaryFormatter では、既知のセキュリティ リスクがサポートされなくなり、その API は、Windows Forms アプリを含め、すべてのプロジェクト型に対して常に PlatformNotSupportedException をスローします。 BinaryFormatter によってもたらされるリスクとその削除の理由については、 BinaryFormatter 移行ガイドを参照してください。

BinaryFormatter を削除すると、多くの Windows Forms アプリケーションが影響を受けることが予想されるため、.NET 9以降のバージョンへの移行を完了するためのアクションを実行する必要があります。

BinaryFormatter が Windows Forms に与える影響

.NET 9 より前のバージョンでは、Windows Formsは、クリップボード、ドラッグ アンド ドロップ、デザイン時のリソースの保存または読み込みなどのシナリオで、データをシリアル化および逆シリアル化するために BinaryFormatter を使用していました。 .NET 9以降、Windows Forms と WPF では、これらのシナリオに対して BinaryFormatter の実装のサブセットを内部的に使用します。 BinaryFormatterのリスクは、汎用のシリアル化/逆シリアル化では対処できませんが、既知の一連の集合を使用するこれらの非常に特殊なユース ケースでは、リスクを軽減するための対策が取られています。 BinaryFormatter へのフォールバックは、未知の型やサポートされていない型に対してはそのまま適用され、アプリケーションで移行手順が行われない限り例外がスローされます。

Windows Forms と WPF アプリはどちらも、次の型、およびこれらの型の配列とリストを処理します。 クリップボード、ドラッグ アンド ドロップ、およびデザイン時のリソースでは、これらの種類を引き続き使用できます。移行ステップは必要ありません。

Windows Forms では、次の追加の型もサポートされています。

OLE のシナリオ

BinaryFormatter の削除が、クリップボードやドラッグ アンド ドロップなどの OLE シナリオに及ぼす影響と、移行のガイダンスの詳細については、Windows Forms と Windows Presentation Foundation の BinaryFormatter OLE ガイダンスを参照してください。

リソース (ResX)

Windows Forms デザイナー

Windows Forms アウト プロセス デザイナーでは、ResX のシリアル化と逆シリアル化に BinaryFormatter も内部的に使用されます。

Windows Forms デザイナーの標準的な動作により、ユーザーが気付かないうちに型とプロパティがシリアル化に参加する可能性があります。 BinaryFormatter が使用される方法のうち、ユーザーが気付いていない可能性のある方法の 1 つは、IComponentpublic プロパティが導入され、そのプロパティが設計時に設定または編集される場合です。 そのプロパティは、次の条件でリソース ファイルにシリアル化されます。

  • パブリック プロパティには、デザイナーの Form が保存されたときのデータが含まれます。
  • そのプロパティは読み取り専用ではありません。
  • そのプロパティには、[DesignerSerializationVisibility(false)] 属性は設定されていません。
  • そのプロパティには DefaultValueAttribute がありません。
  • そのプロパティには、CodeDOM シリアル化プロセス時に false を返すそれぞれの bool ShouldSerialize[PropertyName] メソッドがありません。 (注: このメソッドには private スコープを設定できます)
  • そのプロパティは、DesignerSerializer を持たない型です。

これらのステートメントが当てはまる場合、デザイナーは、そのプロパティの型に型コンバーターがあるかどうかを判断します。 ある場合、デザイナーは型コンバーターを使用してプロパティの内容をシリアル化します。 そうでなければ、BinaryFormatter を使用してコンテンツをリソース ファイルにシリアル化します。 Windows Forms では、開発者の知らないうちに BinaryFormatter シリアル化が行われている可能性があるこの種の動作を認識できるように、コード修正とともにアナライザーが追加されました。

実行時のリソースの読み込み

以前に BinaryFormatter を介してリソース ファイルにシリアル化された型は、ResX ファイルの内容が信頼できるデータとみなされるため、BinaryFormatter を必要とせずに想定どおりに逆シリアル化を継続します。 BinaryFormatter なしでは逆シリアル化が行われない稀な場合は、サポートされていない互換性パッケージを使用して追加しなおすことができます。 詳細については「BinaryFormatter 移行ガイド: 互換性パッケージ」を参照してください。 リソースに BinaryFormatter を使用するには、System.Resources.Extensions.UseBinaryFormatter アプリ コンテキスト スイッチを true に設定するという追加のステップが必要であることに注意してください。

msbuild を使用したリソース ファイルの生成

msbuild を使用してリソース ファイルを生成する際に、実行時に BinaryFormatter を使用してバイナリ形式のリソースが逆シリアル化される可能性があることを示す MSB3825 エラーが発生することがあります。 前述のように、これらのリソースは BinaryFormatter を使用して逆シリアル化されません。この警告は、プロパティ GenerateResourceWarnOnBinaryFormatterUsefalse に設定することで無効化できます。 まれに BinaryFormatter なしで逆シリアル化を実行できない場合は、サポートされていない互換性パッケージを使用して、これを再度追加できます。 詳細については「BinaryFormatter 移行ガイド: 互換性パッケージ」を参照してください。 リソースに BinaryFormatter を使用するには、System.Resources.Extensions.UseBinaryFormatter アプリ コンテキスト スイッチを true に設定するという追加のステップが必要であることに注意してください。

BinaryFormatter からの移行

シリアル化と逆シリアル化の実行中に本質的に処理されない型が、その影響を受けるシナリオで使用される場合、.NET 9 以降のバージョンへの移行を完了するためのアクションを実行する必要があります。

OLE のシナリオ

クリップボードやドラッグ アンド ドロップなどのシナリオで BinaryFormatter から移行する方法の詳細については、Windows Forms および Windows Presentation Foundation BinaryFormatter OLE ガイダンスを参照してください。

設計時のリソースの読み込みと保存

ResX シナリオを使用したデザイナーの場合など、リソースへのシリアル化の実行中に本質的に処理されない型の場合、BinaryFormatter から移行するための規定の方法は、シリアル化に参加している型またはプロパティに対して TypeConverter が登録されていることを確認することです。 このように、シリアル化と逆シリアル化の実行中に、TypeConverter は、BinaryFormatter が一度使用された場所の代わりに使用されます。 型コンバーターの実装の詳細については、「TypeConverter クラス」を参照してください。

BinaryFormatter から移行できない .NET 9 ユーザーは、サポートされていない互換性パッケージをインストールできます。 詳細については、「BinaryFormatter 移行ガイド: 互換性パッケージ」をご覧ください。

注意事項

BinaryFormatter は、使用するアプリがサービス拒否 (DoS)、情報漏えい、リモート コード実行などの攻撃のリスクにさらされるため危険であり、推奨されません。 BinaryFormatter がもたらすリスクの詳細については、「BinaryFormatter および関連型の使用における逆シリアル化のリスク」を参照してください。

問題

Windows Forms アプリで BinaryFormatter のシリアル化または逆シリアル化に関する予期しない動作が発生した場合は、github.com/dotnet/winforms で問題を報告し、問題が BinaryFormatter の削除に関連していることを示してください。