.NET Coreには「未使用コードのトリミング」機能がありますが、これは静的解析を用いて実現されているため、そのトリミング効果は最適とは言えません。以下の3つの欠点があります:
Windows FormsやWPFをサポートしておらず、プログラムトリミング機能を最も必要としているのは、むしろデスクトップアプリケーションの開発者です。
実行時に使用されていないアセンブリを削除できません。例えば、プログラムでAアセンブリを使用し、AアセンブリがB、Cの2つのアセンブリを参照しているとします。Aアセンブリ内ではM1メソッドのみがBアセンブリを使用し、M2メソッドのみがCアセンブリを使用しています。プログラムではAのM1メソッドのみを呼び出し、M2メソッドは一度も呼び出していません。Cアセンブリは呼び出されていないにもかかわらず、「未使用コードのトリミング」機能は静的な参照チェックしか行わないため、Cアセンブリはトリミングされません。
リフレクションを適切にサポートできません。静的解析に依存しているため、実行時にリフレクションで読み込まれるアセンブリがトリミングされる可能性があります。
そこで、私は.NET Coreプログラムを軽量化するアプリケーションを開発しました。これは上記の.NET Coreの「未使用コードのトリミング」問題を解決します。Windows FormsとWPFをサポートしており、実行時にプログラムがロードしたアセンブリを分析することで、どのアセンブリが使用されていないかを把握します。そのため、より多くの未使用アセンブリを削除できるだけでなく、リフレクションも自然にサポートできます。
プログラムトリミング効果の比較:
| 元のサイズ | .NET標準トリミング | Zack.DotNetTrimmer | |
|---|---|---|---|
| 空のCore MVCプロジェクト | 97MB | 50.3MB | 43.6MB |
| 空のWebAPIプロジェクト | 93MB | 46.3MB | 34.5MB |
| 空のWPFプロジェクト | 152 MB | 非対応 | 75.2 MB |
| 空のWinFormsプロジェクト | 152 MB | 非対応 | 50.0 MB |
プロジェクトのオープンソースアドレス:https://github.com/yangzhongke/Zack.DotNetTrimmer/