大規模な UI アプリケーションの将来性を確保するには、2008 フィーチャー パックを備えた MFC、それとも C# と Winforms を使用しますか?
-
08-06-2019 - |
質問
私の会社は、UI 開発の事実上の標準として Visual C++ の MFC を使用して、長年にわたって製品を開発してきました。私たちのコードベースには、運用を維持する必要があるレガシー/古いコードが大量に含まれています。このコードの一部は私よりも古いもの (もともと 70 年代後半に書かれたもの) で、チームのメンバーの中にはまだ Visual Studio 6 を使用している人もいます。
しかし、ありがたいことに、当社の製品は競合他社の製品と比べてやや時代遅れに見えるため、何かを行う必要があるという結論が社内で得られました。
私は現在、製品の残りの部分とはまったく別の UI の新しい領域に取り組んでいます。したがって、UI の残りの部分を移行する長いプロセスが始まる前に、一種の実験場として「新しい」テクノロジー スタックを試す機会が与えられました。
私はしばらくの間、暇なときに Windows フォームと .net Framework で C# を使用して楽しんでいますが、相互運用性によって引き起こされる頭痛の種がやや心配です。UI のこの特定のブランチでは、従来の C++ コードベースとの相互運用性はそれほど必要ありませんが、これが将来的に問題になることが予想されます。
別の方法としては、MFC をそのまま使い続けることですが、VS2008 に同梱されている新しい機能パックを活用してみてください。これが最も簡単なオプションだと思いますが、寿命が長くなり、.net の利点を活用できないのではないかと心配しています...
さて、どれを選べばいいでしょうか?私たちは小さなチームなので、私の提案はおそらく将来の開発の方向性として受け入れられるでしょう。私はそれを正しくしたいと思っています。
MFCは死んだのか?C#/Winforms が前進する方法でしょうか?他に何か完全に欠けているものはありますか?大変助かりました!
解決
私は大量のレガシー MFC コードを含むアプリの開発者であり、皆さんと同じ懸念を抱いています。私たちの戦略の大きな推進力は、リスクと不確実性をできる限り排除することであり、これは大規模な書き換えを回避することを意味します。ご存知のとおり、TBR はほとんどの場合失敗します。そこで、現在のリリースで変更されないモジュールを保持し、管理対象の新機能を記述し、強化された機能を管理対象に移植できる増分アプローチを選択しました。
これはいくつかの方法で実行できます。
MFC ビューで WPF コンテンツをホストします (「 ここ)
MFC MDI アプリの場合は、新しい WinForms フレームワークを作成し、MFC MDI ビューをホストします (「 ここ)
MFC ダイアログとビューで WinForms ユーザー コントロールをホストします (「MFC ダイアログとビュー」を参照) ここ)
WPF (オプション 1) を採用する場合の問題は、すべての UI を一度に書き直す必要があることです。そうしないと、かなり統合失調症のように見えてしまいます。
2 番目のアプローチは実行可能に見えますが、非常に複雑です。
3 番目のアプローチは私たちが選択したもので、非常にうまく機能しています。これにより、全体的な一貫性を維持し、壊れていない部分には触れずに、アプリの領域を選択的に更新できます。
Visual C++ 2008 Feature Pack は面白そうですが、私はまだ試していません。見た目の古さの問題を解決できるかもしれません。「リボン」がユーザーにとって不快すぎる場合は、サードパーティの MFC や WinForms コントロール ベンダーを検討してください。
私の全体的な推奨事項は、全面的な変更よりも相互運用 + 増分変更の方が断然望ましいということです。
あなたのフォローアップを読んだ後、フレームワークによる生産性の向上は、フレームワークを学習するための投資をはるかに上回っていることを確信できます。この取り組みの開始時点ではチームの誰も C# を使用していませんでしたが、今では全員が C# を好んでいます。
他のヒント
アプリケーションと、.NET をインストールする顧客の意欲に応じて (すべての顧客がそうであるわけではありません)、私は間違いなく WinForms または WPF に移行するでしょう。C++ コードとの相互運用性は、C++/CLI を使用して非 UI コードをクラス ライブラリにリファクタリングすることによって大幅に簡素化されます (タグの選択で指摘したとおり)。
WPF の唯一の問題は、現在のルック アンド フィールを維持するのが難しい可能性があることです。WinForms への移行は、GUI の現在の外観を維持したまま行うことができます。WPF は非常に異なるモデルを使用しているため、現在のレイアウトを維持しようとしてもおそらく無駄であり、明らかに WPF の精神に反しています。また、WPF は、複数の WPF プロセスが実行されている場合、Vista 以前のマシンでパフォーマンスが低下するようです。
私の提案は、クライアントが何を使用しているかを調べることです。ほとんどが Vista に移行しており、チームが多くの GUI 作業を行う準備ができている場合は、WinForms をスキップして WPF に移行すると思います。それ以外の場合は、WinForms を真剣に検討してください。どちらの場合でも、C++/CLI のクラス ライブラリが相互運用性の懸念に対する答えになります。
従来のコードが何を行うのか、どのように構造化されているのかについてはあまり詳しく説明しません。特定のパフォーマンス基準がある場合は、コードベースの一部を C++ で維持することをお勧めします。古いコードが正しい方法で公開されていれば、相互運用が容易になります。今日から C# から既存のコードベースを呼び出すことができますか?この構造を正しくするためのプロジェクトを検討する価値があるかもしれません。
WPF の観点から言えば、WinForms の方が適切であるかもしれないと主張する人もいるでしょう。WinForms への移行は、あなたとあなたのチームにとって大きな一歩です。おそらく彼らは WinForms への移行により快適になるのではないでしょうか?これは、より文書化されており、市場での経験が豊富で、Windows 2000 クライアントをサポートする必要がある場合に役立ちます。
興味があるかもしれません .NET Framework を使用した MFC アプリケーションの拡張
他に考慮すべきことは、 C++/CLI, しかし、私には経験がありません。
ご回答いただきありがとうございました。概ね私の考え方に沿った意見が一致していることがわかり、安心しました。幸運なことに、当社のソフトウェアは (放送業界向けの) 独自のカスタム ハードウェアでも実行できるため、OS の選択は実際には当社のものであり、お客様に委ねられています。現在 XP/2000 を実行していますが、すぐに Vista に移行したいという欲求がわかります。
ただし、GPU パフォーマンスを非常に細かく制御する必要もあります。これにより、WPF とハードウェア アクセラレーションが自動的に除外されると思います。元の投稿でその点を指摘すべきでした - 申し訳ありません。もしかしたらGPUを2つも使えるのかもしれない…しかし、それは全く別の質問です...
チームには C# に関する重要な経験はなく、私自身も専門家ではありませんが、管理された環境の全体的な長期的なメリットは、おそらくスピードを習得するのにかかる時間よりも大きいと思います。
今のところ Winforms と C# にはそれがあるようです。
C# への移行、つまり .NET への移行を検討している場合は、WinForms ではなく Windows Presentation Foundation を検討します。WPF は .NET のスマート クライアントの未来であり、ブラウザーでホストされる Silverlight アプリケーションを作成する場合に習得したスキルを再利用できます。
私も WPF の意見に同意します。タグ/XML ベースの UI は、WinForms よりも移植性が若干高いように思えます。
現在の C# スキルがそれほど多くない場合は、チームのことも考慮する必要があると思います。しかし、将来的には MFC 開発者の市場は縮小し、C# は成長します。
おそらく、ある種の部分的なアプローチは可能でしょうか?私はレガシー アプリケーションを C# に再コーディングすることにかなり携わってきましたが、特にレガシー コードを保持している場合や、チームが C# にそれほど精通していない場合は、予想よりもずっと時間がかかります。