次の方法で共有


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

BinaryFormatter 削除

.NET 9以降、BinaryFormatter では、既知のセキュリティ リスクがサポートされなくなり、その API は、PlatformNotSupportedException アプリを含め、すべてのプロジェクト型に対して常に Windows Forms をスローします。 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 つは、publicIComponent プロパティが導入され、そのプロパティが設計時に設定または編集される場合です。 そのプロパティは、次の条件でリソース ファイルにシリアル化されます。

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

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

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

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

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

MSBuild を使用してリソース ファイルを生成すると、 MSB3825 エラーが発生する可能性があります。 このエラーは、実行時にバイナリ形式のリソースが BinaryFormatter を使用して逆シリアル化される可能性があることを指定します。 警告は .NET 9 以降を対象とするビルドから削除されていますが、.NET 9 のすべてのリリースで削除はまだ完了していません。 警告は、.NET 8 以前を対象とする場合にのみ考慮する必要があります。 前述のように、これらのリソースは、.NET 9 以降のバージョンの実行時に BinaryFormatter を使用して逆シリアル化されることはありません。 プロパティの GenerateResourceWarnOnBinaryFormatterUsefalseに設定することで、警告をオフにすることができます。 まれに BinaryFormatter なしで逆シリアル化を実行できない場合は、サポートされていない互換性パッケージを使用して、これを再度追加できます。 詳細については、「 BinaryFormatter 移行ガイド: 互換性パッケージ」を参照してください。 リソースにSystem.Resources.Extensions.UseBinaryFormatterを使用するには、trueアプリ コンテキストスイッチをBinaryFormatterに設定する追加の手順が必要であることに注意してください。

BinaryFormatter からの移行

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

OLE のシナリオ

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

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

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

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

注意事項

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

問題

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