C ++。Netは広く使用されていますか?


25

私は伝統的にC ++コーダーです。過去12か月ほどで、私は多くのC#コーディングを行っており、C#の実用的なアプローチに驚きました(「ガベージコレクションを使用したC ++」であるかのようにコーディングしようとするのをやめました)。

最近、卒業生が何人かいますが、そのうちの1人を助けると、C ++で.Netを使用していることに気付きました。理由を尋ねた後、彼女は「マネージャーからC ++を使用するように言われた」と言いました。明らかなコミュニケーションの問題は別として、彼女が.Netを使用していたのは、それが彼女にさらされた唯一のフレームワークだからです。

その後、C ++を使用してFormsフロントエンドを駆動する上級開発者による古いプロジェクトに出会いました。これは.Netが最初に登場した頃に書かれていたので、.Netをいじるのは彼の側の学習課題だったと思います。それは小さなユーティリティアプリでした。

このアプリでいくつかの小さな変更を行う必要があったため、C ++を使用して.Netを駆動すると、両方の世界で最悪の事態が発生するように思えました。ガベージコレクションやメモリの安全性はありませんが、マネージドフレームワークを扱っているため、同様に実際の速度/最適化の機会はありません。

だから私の質問は、人々がC ++ .Netを大規模なスタンドアロン(つまり非配管)プロダクションコードに使用するかどうかであり、そうであればあなたの理由は何ですか?私はC ++ .Net拡張機能を深く掘り下げたことがないので、私はそれを害しているのではないかと自由に認めています。

回答:


32

C ++。NET(正確にはC ++ / CLI)に、.NET上で実行される他のすべてのものと同様にガベージコレクションあります。C ++との互換性を保ちながらこれを実現するために、^構文とgcnewガベージコレクション(「安全」)ポインターを使用します。

C ++ / CLIは多くの人にとって忌まわしいものと見なされており、C#またはC ++の適切なものよりも作業するのが著しく不愉快であり、どちらよりも複雑です(単にC ++自体の複雑さをテーブルにもたらし、動作に必要なものを追加するため) .NETを組み合わせて)。通常、C#の学習は、単一の中規模プロジェクトの範囲内でも成果を上げます。ただし、C#もネイティブC ++もできないことの1つは、既存のC ++を.NETに対してコンパイルし、他の.NETコンポーネントと通信させることです。

そのため、最初からプロジェクトにC ++ / CLIを使用することはあまり意味がありません。C#で実行できる.NET関連の処理はすべて、C#でも実行できます。デフォルトでポインター。最も顕著な存在理由は、既存のコードベースを.NETに移植することです。.NETの使用を開始するが、これまでに作成したすべてのソフトウェアを書き換えたくない(またはリソースと時間の制約のためにできない)企業は、C ++ / CLIを使用して、最小限の変更のみで既存のコードベースを使用し続けることができます。システムのコンポーネントをC#で1つずつ書き換えます。少なくともそれは理論です。私は実際にそれを実際に行ったことを見たことがないので、どれだけうまく機能しているかはわかりません。

また、C#自体がネイティブライブラリとインターフェイスできるため、既存のC ++コードベースを使用する必要がある場合でも、必ずしも.NETに対してそれらを再コンパイルする必要はありません。多くの場合、COMまたはP / Invokeを介してインターフェイスする方が良いソリューションです。


10
P / Invokeを使用した「ネイティブライブラリとのインターフェイス」は、静的機能を備えたdllに限定されており、COMはそれ自体が煩わしいことに注意してください。C ++ / CLRのラッパーを使用すると、C#コードでフルサイズのネイティブバックエンド/プロジェクトに制限なくわずかにアクセスできます。開発には使用しませんが、接着剤として、P / Invokeよりもはるかにクリーンで、マーシャリングします。
マックス

出向-そして、MicrosoftがC ++をネイティブ開発の正当な位置に再調整した方法から判断すると、暗黙のうちに同意したと思います。
ジョシュグライファー

2
この言語は、実際にはC ++。NETではなくC ++ / CLIと呼ばれることに注意してください。
svick

@svick:正しい。編集済み。
-tdammers

1
@Max TBH Microsoftはすべてをネイティブにしています。したがって、C ++ / CLIはまったく必要ありません。C#をネイティブコードにインターフェイスするための厄介なラッパーを作成する必要はありません。WinRT/ COMオブジェクトであることを確認するだけで完了です。
gbjbaanb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.