概念を分離しておくことはおそらく良い考えです。
まず、C++ は言語であり、対象となるプラットフォームについては何も指定していません。原則として、ストレートな C++ コードは、ネイティブの x86 アセンブラー、Java バイトコード、MSIL、または考えたいものにコンパイルできます。Adobe は最近、Flash バイトコードを生成する C++ コンパイラを作成したと思います。
2 つ目は、典型的な優柔不断さで、Microsoft は .NET を対象とした 2 つの C++ 派生言語を作成しました。まず、「C++ のマネージ拡張」を作成しました。それから彼らはそれがひどいと判断し、それを捨てて、それが存在しなかったふりをしようとしました.
現在、.NET スタイルの C++ の最善策は C++/CLI と呼ばれていますが、C++ ではありません。これは、多くの非標準的な方法で言語を拡張および変更します。(そして、C++ 標準委員会は、混乱を避けるために名前を変更するように要求したと思いますが、変更しませんでした)
Visual Studio 2005 以降では、C++/CLI がサポートされています。(「プロジェクトの追加」では、Visual C++ -> CLR の下にリストされています)
しかし(それほど単純だとは思いませんでしたよね?)、Microsoft は再びそれを行いました。C++/CLI を指定した後、実際には C++ を CLI に統合するためのかなり適切に設計された試みですが、事実上誰もそれを使用していないことに気付きました! C++ プログラマーでさえ、一般的に、.NET で作業するときは C# を使用し、それ以外の場合は適切なネイティブ C++ を使用することを好むことがわかりました。
そのため現在、ネイティブC++ と .NET 間の相互運用性をよりシンプルかつ強力にすることに注力しています。ただし、C++/CLI がなくなる可能性はありません。それは機能し、場合によっては便利です。彼らが最初に望んでいた C++ キラーではありません。
Visual Studio (これまでずっと) は、.NET によって汚染されていない、x86 マシン コードにコンパイルされたネイティブ C++ アプリケーションもサポートしています。これらは、Visual C++ -> Win32 の下の [プロジェクトの追加] ダイアログに一覧表示されます。
したがって、C++ を学習したい場合は、次の 2 つの選択肢があります。C++/CLI を学習します。MS 専用言語に制限されます。MSIL は、ネイティブ マシン コードではなく MSIL を生成し、.NET を実行する必要がありますが、通常はそうではありません。とにかく.NETに依存するつもりなら、C#で書いてみませんか?
または、.NET とは完全に分離されており、.NET アセンブリを直接参照できない適切な C++ を学習します。
重要なポイントは、それらが別々の言語であるということです。C++/CLI としてコンパイルする (つまり、コンパイラは .NET アセンブリを参照できるようになり、MSIL コードを生成する) か、C++ としてコンパイルします。この場合、.NET の世界は存在しません。
そして最後に注意事項です。上記の私の言い回し (「適切な C++」および「.NET によって汚染されていない」) にもかかわらず、C++ は「優れた」ものではありません。多くの場合、それも速くはありません。C++ はより高速になる可能性がありますが、それはプログラマーに大きく依存します。
C# コンパイラは、ほぼすべてのものを適度に効率的なコードに変換します。一方、C++ には、同等の C#よりもコードを遅くする落とし穴がたくさんあります。
http://blogs.msdn.com/ricom/archive/2005/05/10/416151.aspxおよびそれが参照するブログ投稿は、2 つの言語で記述された同様のコードのパフォーマンスに興味がある人にとっては一読の価値があります。
C++ アプリケーションが一貫して高速になる領域は 1 つだけで、それは起動時です。.NET アプリケーションは、.NET フレームワークをロードし、MSIL コードを JIT する必要がある場合があり、そこでネイティブ アプリケーションが開始されます。
しかし、それ以外では、C++ の方が高速であると想定するのはおそらく間違いです。それはあなたにもう少し制御を与えるので、そうすることができます。しかし、通常、これは、コンパイラがコード内で作成した非効率性からユーザーを救うことができないことを意味します。