質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

12212閲覧

C++とC#の共存につて

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

3クリップ

投稿2020/05/25 00:12

windwosのアプリケーションを作成する時
GUIをC#、処理をC++で作成する場合
私の調べた限り
C++/CLIを使用する方法
C++のDLLを作成しC#でDLLimportを使用する方法
2通りありますが、
どちらを使用した方がいいのかよくわかりません。

個人的に調べた結果
DLL作成はDLLimport宣言がその都度必要になり手間だが、分割して作成するのが楽なので、大人数の作業ならこっちのほうがいい?
C++/CLIは毎回DLLimport宣言がないので小規模のプロジェクトではこちらの方が連携し易い。
32,64bit問題に関しては両方法とも作業は同じのかなと思いました。

この2つのメリットデメリット、向き不向き等、将来性、結論としてどっちを使ったほうがいいのか教えていただけませんでしょうか?
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/05/25 00:14

興味本位の確認ですが、どちらか一方だけで作らないのはどういう理由からでしょうか
Zuishin

2020/05/25 00:20

C++/CLI は C++ から .NET を使いたいときにやむなく選択するものです。C# と比べて速いものが作れるわけではないので、可能なら全部 C# で作りましょう。どうしても C++ が必要なら DLL を作りましょう。
退会済みユーザー

退会済みユーザー

2020/05/25 00:23

C#のみで作成する方法が簡単でいいのですが、 C++のみでしか提供していないライブラリーや、負荷のかかる処理、動画等を扱う場合C#で挙動が少し不安定なためです。
Zuishin

2020/05/25 00:24

> どうしても C++ が必要なら DLL を作りましょう。
Zuishin

2020/05/25 00:28 編集

また C# で不安定になるなら C++/CLI でも不安定になると思います。C++/CLI は C++ ではありません。C# で作るものと同じものを C++ を拡張した文法で作るものだと思っていればほぼ間違いありません。
退会済みユーザー

退会済みユーザー

2020/05/25 01:01

C++/CLIのソースのメンテを考えると嫌な気持ちになるので、私はC++側は必要最小限のコードにして通常のDLLエクスポートして、C#側でラッパークラス作る方が好みですね。
退会済みユーザー

退会済みユーザー

2020/05/27 00:05

たくさんの回答ありがとうございます。 正直全ての意見がとても参考になりました。 個人的な結論としまして基本DLLをメインでするのがいい気がします。しかしそのほかの連携方法もいい面があるので適材適所ですね。
guest

回答4

0

僕はハイブリッドです:

  • GUIをC#
  • 処理をC++
  • C#からC++を呼ぶための窓口をC++/CLI

で作成します。

言うてC++/CLIはメンドクサイのであんまり書きたくないから両者を繋ぐ継手のとこだけ。
C++で書いた処理はC++からも呼べますし。

投稿2020/05/25 00:27

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こんにちは。

C++/CLIを使用する方法

他の方もおっしゃっていますが、C++/CLIは .NETを C++をマイクロソフトが独自に拡張した文法で記述できるようにしたものに過ぎません。C#とC++の間を繋ぐために使われることはあるようです。

C++のDLLを作成しC#でDLLimportを使用する方法

こちらが一般的と思います。
他に、C#とC++をどちらとも通常のプロセスで開発し、パイプで通信させてことがあります。
C#のガベージコレクションの影響からC++側をほぼ完全に独立させることも可能ですから、応答性能がシビアな(平均的に1mSecの応答性能が問題になるような)システムに有用です。

投稿2020/05/25 04:48

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C++/CLIで作成した場合は、ほぼ.NET専用のライブラリになります。
通常のDLLで関数をエクスポートする場合は、DLLが呼び出せる言語ならどれからでも使えます。
(cdecl, stdcall等呼び出し規約の違いには注意する必要はありますが)

C++/CLIが利用されるケースは、大掛かりなCOMコンポーネント(DirectX、DirectShow など)を.NETと連携させる場合に見受けられます。C#からもCOMを呼び出す事は可能なのですが、タイプライブラリが無い場合に結構大変です。

将来性は良く分かりませんが、C++側から公開する機能が多いなら、C#からの使い勝手を考えて C++/CLI でクラス化、関数少し公開するだけでいいなら、通常のDLLでエクスポートが楽かなぁと個人的に思います。

投稿2020/05/25 00:15

編集2020/05/25 00:46
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

// ほかの方の回答のほうが参考になるかと存じます。
// 個人的にはC# → C++/CLI → C++(ハイブリッド)に票を入れます。

C#→C++

ご存じでしょうが....
C++直だと、メソッド名をエンコードしなくてはならないため、いったんCで書いたほうが良いです。
なので、実際にはC#→C→C++という流れです。
再配布パッケージを別途インストールさせたくない場合はこの方法のみとなります。(要確認:私の調べた限りではできなかった)

なお、DllImportを使用し、C#プロジェクトで静的解析を行う場合は
NativeMethods等クラス内に集約しないと指摘( CA1060 )を食らいます。
※気にせず呼んでるコードが多いので、なんだかなと、思う部分もあります

参考文献:
C#からアンマネージドDLL関数の呼び出しとコールバック関数渡し hateblo
※C#からコールバック関数渡しをするときは、GCに注意してください。対策なしだと、光の速さで回収されていきます。

DLLをフォルダパスを指定してロード(3246行目付近) - SQLite
※32bit/64bit切り替えの参考コード

プロセス分離する(参考)

いっそうのこと、C++をコマンドラインインターフェイス化する(他の方法もあり)という方法もあります。
C#からの呼び出しでC++側で例外が発生したときは取り返しがつかない(アプリケーション終了しかない)ので、プロセスごと分離しちゃうという手もあります。
なお、インターフェイスが完全に分離されるので、利用ケースはかなり限られると思われます。
※呼び出し回数が多いと、プロセスの起動に時間がかかります

投稿2020/05/25 16:53

testset

総合スコア221

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問