.NETフレームワークでC ++を使用することは可能ですか?


18

C#とC ++の両方で、GUIプログラミングに関する多くのコメントを読みました。そして、Microsoftの.NETフレームワークがGUIプログラミングに強力であることに気付きました。C ++と.NETフレームワークを使用することは可能ですか?

私が読んだように、C ++は強力な言語であり、WindowsでのGUIプログラミングには.NETフレームワークが好まれるので、素晴らしい組み合わせになると思います。GUIをC#で作成し、機能をC ++で作成することはできますか?


7
C#も非常に強力な言語です。
アダムクロスランド

2
@Ramhound:C ++ / CLIがC#と同じくらい強力であることはまったく真実ではありません。C ++ / CLIコードには、C ++コンパイラからのすべての最適化が含まれており、より高速に実行できますが、C#にはない多くのメタプログラミングおよびプリプロセッサ技術も含まれています。
-DeadMG

2
さらに、C ++が得意であれば、C#を習得することは難しくありません。私は言っていませんが、言っています。
リグ

4
C ++を知っていれば、C ++ / CLIを学習するか、C#を学習するかを選択できます。どちらも実際のC ++ではありません。C ++ / CLIを使用するのではなく、C#を学習することをお勧めします。C ++ / CLIはどこでもネイティブ言語ではないので、C#の本やサポートがたくさんあります。
デビッドソーン

6
@ddacotなし、C ++がされていないもので、すべてのゲーム開発のために。他のすべてのプログラミング言語と同様に、ソフトウェア開発用です。ゲームはたまたまソフトウェアの一種です。
-MattDavey

回答:


21

はい、以前はManaged C ++として知られており、現在はC ++ / CLIとして知られています。バンドルされている他の3つのマネージ言語、C#、F#、VB.NETからアクセスできるように、.NET Framework全体(GUI:WinForms、GDI +など)にアクセスできます。


+1ジェシーの答え。間違っていなければ、C ++ / CLIは多重継承をサポートしていません。したがって、いくつかの予期しない機能に備えてください。これらの機能の一部は、CLIの制限に起因しています。使用を開始する前に、C ++ / CLIと「クラシック」C ++の違いを見つけることをお勧めします。
イゴールSoloydenko

これについては、最初のリンクで詳しく説明します。したがって、要約は次のとおりです。「C ++は時間とともに大きく進化し、言語で書かれたほとんどのソフトウェアはオブジェクト指向です。マネージC ++とクラスおよびクラスベースのオブジェクトの使用は、Visual C ++のように普及しています。マネージC ++での唯一の大きな変更これは、CLRの制限のためです。CLRのガベージコレクターで管理されるクラスは、複数のクラスを継承できません。」
ジェシーC.スライサー

それで大丈夫です。実際、私はC ++が苦手です。私は、問題を引き起こす可能性のある別の重要な違いがあると考えました。
イゴールSoloydenko

前回私がC ++を書いたのは、文字通り前世紀のいつかでした:)
ジェシーC.スライサー

1
@ keykeeper、C ++ / CLIの一般的な使用法は、管理されていないC ++ライブラリと管理された世界の間の細い橋になることです。そのような使用には十分です。もちろん、サイズの大きいものをコーディングすることは意味がありません。
SK-ロジック

6

最も柔軟でシンプルなオプションを忘れないでください。Unixの世界では一般的ですが、何らかの理由で、Windowsでは一般的ではありません。GUIとロジックを異なるプロセスに分割し、合理的な形式のRPC(作業)。できれば、人間が読めるシンプルなテキストプロトコルを使用してください。

この方法で、GUI(またはさまざまなGUI)を好みのテクノロジーで実装し、C ++、スクリプトなど、ニーズに合ったロジックコンポーネントを構築できます。

私は認識していないよ任意の Windowsの世界からモノリシックデザインアプローチの合理的な利点。


4

マネージドC ++の時代に数年前にこれを行いました。umanaged DLLには、C#で記述されたウィザードスタイルのGUIに組み込みたいビジネスロジックがいくつかありました。これを行うには、マネージC ++アセンブリを作成してマネージGUIアプリとアンマネージDLLの間に配置し、そのアセンブリ内でSystem :: Runtime :: InteropServices :: Marshalを使用してマネージ型(System :: Int32)からアンマネージに値を変換しましたタイプ(int)およびその逆。

Managed C ++は非推奨のようですが、同じプリンシパルがC ++ / CLIに適用される場合があります。


3

あんまり。ハイブリッド言語のC ++ / CLIがありますが、相互運用にのみ適しています(Microsoftの公式ポリシー)。.NETフレームワークの設計方法により、CLRでの実行に実際には適合しない多くの言語セマンティクスがあり、C ++はそれらの多くを示します。


7
私はこの声明に同意しません。C ++ / CLIは、多くの実装に最適です。
ラムハウンド

3
@Ramhound:Microsoft自身は相互運用にのみ推奨しています。それが彼らの公式ポリシーです。
-DeadMG

2
@DeadMGはそのためのソースを提供できますか?
sq33G

1
@DeadMG、あなたは間違っています。ネイティブロジックで.NET GUIを実行するには、非常に多くのオプションがあります。
SKロジック

2
@DeadMG-マイクロソフトの公式ポリシーであるという証拠を提供しない限り(1分間は信じられない)、FUDを
すり抜ける-Ramhound

3

C ++ / CLIの角度はこれまで多くの回答でカバーされてきましたが、これを行う別の方法はPInvokeを使用することです。これにより、C#プログラムは、C ++で記述されたdllに含まれる関数を呼び出すことができます。PInvokeの利点は、.Netから呼び出されるという事実についてDLLが完全に不可知であることです。つまり、ソースコードがないDLLを呼び出すことができ、ソースコードを作成した場合でも、/ clrオプションを使用して再コンパイルする必要はありません。これは、このdllをC#プログラムだけでなく他のC ++プログラムでも使用できることを意味します。素晴らしいC / C ++ライブラリがいくつかあります:PInvokeを使用すると、これらを利用できます。Win32ライブラリは、.Netで利用できない機能を提供する場合があります。PInvokeを使用すると、それらを使用できます。

PInvokeを使用する最も難しい部分の1つは、アンマネージシグネチャをマネージシグネチャに変換する方法を知ることです。しかし、それを支援するチートシートがあります。


しかし、P / Invoking C ++を直接使用する場合は、マングリングに注意するか、間に薄いCラッパーを用意することをお勧めします。
SKロジック

0

COM(コンポーネントオブジェクトモデル)を介してC#ディルを操作することもできます。Visual Studio 2010にはManaged C ++用のインテリセンスがないため、私にとってはCOMはManaged C ++を使用するよりも優れていました。私の場合、すでに大規模なC ++アプリケーションがありますが、MFCからWinFormsまたはWPFに移行したいと考えていました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.