新しいC ++プロジェクトにATL、MFC、Win32、またはCLRを使用するかどうかを決定するにはどうすればよいですか?
質問
最初のC ++プロジェクトを開始しました。 Visual Studio 2008 を使用しています。いくつかのデータベースにアクセスし、WebSphere MQトランザクションを開始する単一フォームのWindowsアプリケーションです。私は基本的に、ATL、MFC、Win32(実際にはその点で少し曖昧です)とCLRの違いを理解していますが、選択方法については迷っています。
これらの1つまたは複数は、後方互換性のためだけにありますか?
CLRは悪いアイデアですか?
ご意見をお寄せください。
編集: このプロジェクトにC ++を選択したのは、投稿で説明しなかった理由です。完全に技術的ではありません。したがって、C ++が唯一の/最良のオプションであると仮定して、想定、どちらを選択すべきですか?
解決
それはあなたのニーズに依存します。
CLRを使用すると、実行時に.NETフレームワークをインストールする必要があることを制限するだけでなく、最も表現力豊かなライブラリセット(.NETフレームワーク全体)が提供されます。 Windowsプラットフォーム(ただし、リストされている4つのテクノロジーはすべてWindowsのみであるため、プラットフォームの制限はおそらく最も面倒ではありません)。
ただし、CLRではC ++言語のC ++ / CLI拡張機能を使用する必要があるため、これを使用するためには、本質的にいくつかの追加の言語機能を学習する必要があります。これにより、多くの「エクストラ」が得られます。 .netライブラリへのアクセス、フルガベージコレクションなど。
ATL& MFCはどちらを選択するかがやや複雑です。 MSDNの選択ページを参照してください。それらの間で決定するために。 ATL / MFCの良いところは、.NETフレームワークを必要とせず、展開のためにVC / MFCランタイムのみをインストールすることです。
Win32を直接使用すると、最小の依存関係を持つ最小の実行可能ファイルが提供されますが、作成するのはより手間がかかります。ヘルパーライブラリの数が最も少ないため、より多くのコードを記述しています。
他のヒント
Win32は、生の、ベアメタルな方法です。退屈で使いにくく、覚えておく必要のある細かい部分がたくさんあります。そうしないと、物事が比較的不可解な方法で失敗します。
MFCはWin32上に構築され、アプリケーションを構築するオブジェクト指向の方法を提供します。これはWin32の代わりではなく、拡張機能です-大変な労力を必要とします。
System.Windows.Forms(私があなたがCLRによって意味したと仮定するもの)は完全に異なりますが、基本構造からMFCと大きな類似点があります。これは間違いなく最も簡単に使用できますが、.NETフレームワークが必要です。これは、場合によっては障害になる場合もあれば、そうでない場合もあります。
私の推奨事項:.NETを回避する必要がある場合は、MFCを使用します。
C ++に関する限り、WTLを使用します。これは軽量であり、依存関係は(もしあれば)ほとんどなく、出荷とインストールが簡単です。私のアプリがWindowsのほとんどのバージョンで実行される単一のEXEで構成されている場合、非常に満足していますが、これは心配する必要はないかもしれません。
代わりに.NETへの移行を選択した場合、C#がほぼ確実に移行する方法です。
WTLの詳細はこちら:
C ++でこれを行う理由について非常に興味があります。簡単な説明に基づいて、C#はより適切な選択肢のように思えます。
少し詳しく説明するために、C ++ CLRについて説明したリンクを見てください。 C ++は「カーネル、ゲーム、高性能、およびサーバーアプリ」に適していると、最高評価の回答ノート(私の意見では正確に)。 -どれもあなたがしていることを説明していないようです。
MFC、ATLなどは、将来のバージョンのVisual Studioでアプリをコンパイルし、将来のバージョンのWindowsで実行できるという意味でサポートされます。ただし、CLRやC#と同じようにAPIや言語で新しい開発があまり行われていないという意味ではサポートされていません。
CLRに問題はありません。ここで他の人と同じようにC#をお勧めしますが、C ++に固執する理由があるので、.NETフレームワークの使用は、それらにまだ慣れていない場合(IMO)にATL / MFCをいじるよりも数千倍簡単です。
C ++ / CLRを使用している場合、実際にはC ++をまったく使用していないことに言及する価値があります。 C ++ / CLRは、C#と同様にCILにコンパイルされます。私は自分で使ったことはありませんが、その目的は、新しいコードを古いC ++実行可能ファイルで動作させるのではなく、レガシーコードをコンパイルし、新しい.NETコードで簡単に利用できるようにすることだと思います。 .NETからネイティブコードを呼び出す方法は他にもありますが、おそらくこれを検討する必要があります。