最近、システムを .NET Framework 4.8 から .NET 7/8 に移行しようとしたのですが、いくつかの大きな課題に直面しました。新しい言語機能を活用し、モダンな環境へ移行することには魅力がありましたが、特に Windows Forms アプリケーションの移行に関しては「まだ時期尚早」という結論に至ったので、その経緯を共有します。
現状:ClickOnce 配布と遺産プロジェクト
私のシステムには、複数の内部プロジェクトが統合されたソリューションがあり、クライアントへのアプリ配布には長年 ClickOnce を使用してきました。この中には、15年ほど前に作成した VB プロジェクト(いわゆる技術的負債)も含まれており、その保守が今でも必要です。
移行に伴う課題
移行には、いくつかの技術的なハードルがありました。以下が主なものです:
- データベース接続ライブラリの問題
これまで System.Data.SqlClient を使用してきましたが、新しい .NET への移行に際して、これを再構成する必要がありました。また、独自の TableAdapterTransaction クラスを利用しているため、これも新環境に適応させるのが課題でした。 - VB プロジェクトから C# への変換
長い間 VB で書かれていたプロジェクトを C# に変換する必要がありました。古いコードは移行作業で不具合が発生しやすく、これが大きな作業負担となりました。 - ClickOnce の互換性
SDK スタイルプロジェクトに変換すると、.NET Framework 上では ClickOnce が使えなくなるという問題が発生しました。これに対処するため、.NET 7/8 に移行した後の対応が必要となり、その点も時間と労力がかかりました。 - ClickOnce ライブラリの挙動が異なる
.NET 7/8 への移行後も、ClickOnce の挙動が従来と異なり、配布に関する細かい調整が必要でした。
最大の問題:パフォーマンスの劣化
これらの技術的な課題をなんとか乗り越えたとしても、最終的に一番の問題となったのが「パフォーマンスの劣化」です。
具体例:大量データの読み込み処理での違い
例えば、500列×2万行(約150MB)のCSVファイルを読み込んで処理を行うプログラムをアップデートした際に、.NET Framework 4.8 ではメモリ消費が約1.5GBだったのに対し、.NET 8 では4GBにも達してしまいました。
さらに、DataGridView で全選択を行う操作において、.NET 8 では数秒間の無反応状態が発生。おそらく、大量のメモリ消費によりガベージコレクション(GC)が頻繁に発生しているため、アプリ全体のパフォーマンスが著しく低下していました。また、途中から処理が急に遅くなることもあり、これも大きな問題です。
なぜ移行は慎重にすべきか?
新しい .NET への移行は、確かに多くのメリットがあります。最新の言語機能や、今後のサポートを考えれば移行は避けられないと思っていました。しかし、今回の一連の作業で分かったのは、現時点では、特に Windows Forms アプリケーションに関しては、パフォーマンスや最適化がまだ不十分だということです。
- Windows 関連のコントロールが最適化されていない
DataGridView や DataTable のような Windows Forms の主要コントロールが、まだ新しい .NET に十分適応していないと感じました。 - メモリ使用量の増加
プロジェクトによっては、メモリの使用量が著しく増加し、パフォーマンスにも悪影響を及ぼしています。 - AIアシスタントの提案もまだ古い
Copilot などのAIツールの提案も、まだ .NET Framework に依存したものが多く、完全に新しい環境に最適化された提案が得られていません。
結論:移行は2030年まで待つべきか?
これらの問題を総合的に考えると、.NET Framework からの移行は急がない方が良いのではないかと感じています。特に Windows Forms アプリケーションを多く抱えている場合、.NET 8 への移行はまだ時期尚早かもしれません。パフォーマンスや互換性の問題が解決されるまで、現行の .NET Framework 4.8 を利用し続ける方が安定して運用できると考えています。
2030年までサポートされているので、しばらくは .NET Framework 4.8 を使い続け、より最適化されたタイミングで移行を検討しても遅くはないでしょう。
コメントを残す