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 アプリはどちらも、次の型、およびこれらの型の配列とリストを処理します。 クリップボード、ドラッグ アンド ドロップ、およびデザイン時のリソースでは、これらの種類を引き続き使用できます。移行ステップは必要ありません。
bool
byte
char
decimal
double
int
sbyte
float
- TimeSpan
- DateTime
uint
string
nint
nuint
long
ulong
short
ushort
- PointF
- RectangleF
Windows Forms では、次の追加の型もサポートされています。
OLE のシナリオ
BinaryFormatter の削除が、クリップボードやドラッグ アンド ドロップなどの OLE シナリオに及ぼす影響と、移行のガイダンスの詳細については、Windows Forms と Windows Presentation Foundation の BinaryFormatter OLE ガイダンスを参照してください。
リソース (ResX)
Windows Forms デザイナー
Windows Forms アウト プロセス デザイナーでは、ResX のシリアル化と逆シリアル化に BinaryFormatter も内部的に使用されます。
Windows Forms デザイナーの標準的な動作により、ユーザーが気付かないうちに型とプロパティがシリアル化に参加する可能性があります。
BinaryFormatter が使用される方法のうち、ユーザーが気付いていない可能性のある方法の 1 つは、public
に IComponent プロパティが導入され、そのプロパティが設計時に設定または編集される場合です。 そのプロパティは、次の条件でリソース ファイルにシリアル化されます。
- パブリック プロパティには、デザイナーの 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 を使用して逆シリアル化されることはありません。 プロパティの GenerateResourceWarnOnBinaryFormatterUse
を false
に設定することで、警告をオフにすることができます。 まれに 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の削除に関連していることを示してください。
.NET