既知のトリミングの非互換性
この記事では、現在のツールを使用したトリミングと互換性のないパターンの一覧を示します。
リフレクション ベースのシリアライザー
代替手段: リフレクションフリーのシリアライザー。
「トリミングの警告の概要」で説明されているように、リフレクションの多くの使用をトリミングと互換性を持たせることができます。 ただし、シリアライザーではリフレクションが複雑に使用される傾向があります。 これらの使用の多くは、ビルド時に分析可能にすることができません。 残念ながら、多くの場合、最適なオプションは、ソース生成を使用するようにシステムを書き換えることです。
次の表には、一般的なリフレクション ベースのシリアライザーとその推奨される代替手段を示します。
シリアライザー | 代替手段 |
---|---|
Newtonsoft.Json | ソースによって生成されたSystem.Text.Json |
System.Configuration.ConfigurationManager | 構成バインディング ソース ジェネレーター |
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter | セキュリティと信頼性に欠陥があるため、BinaryFormatter シリアル化から移行する。 |
JIT を使用したランタイム コード生成
JIT を使用した (たとえば System.Reflection.Emit を使用した) ランタイム コード生成は、トリミングと互換性がありません。
動的アセンブリの読み込みと実行
プラグインや拡張機能をサポートする (通常は LoadFrom(String) などの API を使用) システムでは、トリミングと動的アセンブリの読み込みが一般的な問題になります。 トリミングは、ビルド時にすべてのアセンブリを確認することに依存するため、どのコードが使用されていてトリミングで除外できないかを認識します。 ほとんどのプラグイン システムでは、サードパーティのコードが動的に読み込まれるため、トリマーが必要なコードを特定することはできません。
Windows プラットフォームの非互換性
次のセクションでは、Windows でのトリミングに関する既知の非互換性の一覧を示します。
C++/CLI による NET プログラミング
C++/CLI による NET プログラミングでは、現在、トリミングがサポートされていません。
組み込みの COM マーシャリング
代替手段: COM ラッパー
.NET Framework 1.0 以降、.NET に自動 COM マーシャリングが組み込まれています。 これは、実行時コード分析を使用して、ネイティブ COM オブジェクトとマネージド .NET オブジェクトの間で自動的に変換を行います。 残念ながら、トリミング分析では、自動 COM マーシャリングのためにどの .NET コードを保持する必要があるかを常に予測できるわけではありません。 ただし、代わりに COM ラッパーを使用すると、トリミング分析により、使用されているすべてのコードが正しく保持されることが保証されます。
WPF
Windows Presentation Foundation (WPF) フレームワークでは、リフレクションがかなり使用されており、一部の機能は実行時コード検査に大きく依存します。 トリミング分析で WPF アプリケーションに必要なすべてのコードを保持することはできません。 残念ながら、トリミング後に実行できる WPF アプリはほとんどないため、現在、.NET SDK では WPF のトリミングのサポートは無効になっています。 WPF のトリミングの有効化の進行状況については、WPF がトリミング互換でない問題を参照してください。
Windows フォーム
Windows フォーム フレームワークでは、リフレクションの使用は最小限に抑えられますが、組み込みの COM マーシャリングに大きく依存します。 残念ながら、組み込みの COM マーシャリングなしで実行できる Windows フォーム アプリはほとんどないため、現在、.NET SDK では Windows フォーム アプリのトリミングのサポートは無効になっています。 Windows フォームのトリミングの有効化の進行状況については、WinForms トリミングに互換性を持たせる問題を参照してください。
.NET