8

C++ での寿命が近づいているモノリシック MFC GUI アプリがあります。C# で新しい機能を構築し、各アプリ間でデータを渡すことを計画しています。

質問: C++ と C# の間でデータを渡すための最良の方法は何ですか?

注:
両端には GUI フロント エンドがあり、おそらく Id のような単純なデータを渡すだけで済み、使用するプロセス/機能を他のアプリに示すメカニズムを備えている可能性があります。
たとえば、アプリケーションの 1 つは C# の CRM システムで、グリッド内の行をダブルクリックすると、customerId とメッセージが渡され、MFC アプリの顧客フォームでその顧客を開くことができます。

少し調べてみましたが、オプションは、Windows Messaging、Memory Mapping、Named Pipes、または Windows Sockets などのようです。この段階では、名前付きパイプに傾倒していますが、他のアドバイスやヒント、または他の人々の経験を本当に感謝しています.

4

9 に答える 9

7

個人的には、名前付きパイプのようなものを C++ 側から使いやすく、.NET 側でも System.IO.Pipes を使用することを考えています。

また、時間の経過とともにアプリの他の非 .NET ビットを置き換えることを計画している場合、これはおそらく最も抵抗の少ない方法です。

于 2008-10-08T20:41:26.230 に答える
6

好きなのを選びな:

  • ファイル
  • 名前付きパイプ <-- 私の推奨事項
  • 共有メモリ
  • ソケット
  • COM
  • Windows メッセージ

なぜ名前付きパイプ?

  • 無料で作業するFIFO方式を提供します(ソケットと同様ですが、共有メモリとは異なります)
  • 双方向で簡単に通信できます
  • すべてのプラットフォームで十分にサポートされています
  • 使いやすい
  • 信頼性の高いデータの受け渡しと配信
  • ブロッキングとノンブロッキングが可能
  • (ソケットとは異なり)取り外さずにデータを読み取ることができます
  • 拡張して、3 つ目のアプリを簡単に含めることができます。

.Net では、System.IO.Pipes を使用するだけです。

C++ では、CreateNamedPipe と CreateFile を使用します。

于 2008-10-08T20:47:22.690 に答える
2

私はソケット (TCP) を使用します。MFC と .NET の両方がそれらを直接サポートしています。

于 2008-10-08T20:54:18.917 に答える
2

マネージ側から P/Invoke を使用することもできます。これは、MFC アプリに C API がある場合に役立ちます。また、どちらからでも COM を使用できます。

于 2008-10-08T20:40:57.977 に答える
2

リストしたオプションは確かに有効ですが、COM を検討することもできます。

于 2008-10-08T20:40:59.177 に答える
1

本当に2つのプロセスが必要ですか?

アンマネージド C++ とマネージド C# コードは、同じプロセスで完全に動作することができ、マネージド C++/CLI の小さなレイヤーを使用すると、プロセス間通信の複雑さを単純な関数呼び出しに置き換えることができます。

于 2008-10-08T21:00:27.297 に答える
0

私の選択は、標準のウィンドウ メッセージ (WM_FOO など) または DCOM のいずれかです。

  • メッセージは、通信が非常に単純であり、セットアップのオーバーヘッドが最小限である限り機能します。通信をメッセージごとに 1 つまたは 2 つの整数に要約できる場合は、おそらくここから始めるのがよいでしょう。両方のアプリが既にウィンドウ化されたアプリケーションである場合、両方とも既にメッセージ ループを持っているので、ほとんどの場合、既にそこにいます。

  • DCOM では、プログラマーのオーバーヘッドが大幅に増えますが、より豊富なインターフェイスを定義でき、複雑なメッセージをバイナリ形式に変換したりバイナリ形式から変換したりする必要がなくなるという点で優れています。このルートに進む場合、CoRegisterClassObject は、DCOM を介してオブジェクトを発行するための開始点です。C#アプリからこれを試したことはありませんが、原則として完全に可能です

于 2008-10-08T20:57:12.780 に答える
0

アプリが実行されるすべてのシステムに .NET フレームワークが存在することを心配する必要がない場合は C++/CLI を使用し、それ以外の場合は COM を使用します。ただし、それはあなたが最も快適で慣れ親しんでいるものに本当に依存します. 私は C++/CLI と COM の既存の「関数呼び出し」構造が (他のプロトコルで構築するのではなく) 好きですが、それは私だけです。

現在、COM を使用して .NET コンポーネントの機能を追加しています。これは主に、.NET が存在しない場合でもフォールバックで機能する必要があるためですが、これは、最大の展開が望ましい私のニーズに固有のものです。

于 2008-10-09T05:20:33.700 に答える
0

レガシ アプリのソースがあると仮定して、すべての「主力」コードを DLL としてコンパイルできないかどうかを確認し、そこから個々の関数/ウィンドウを呼び出します。これが機能したら、必要な関数の周りにマネージ C++ ラッパーを記述し、C# コードから呼び出すことができます。運が良ければ、プロセス全体が 1 日もかからないことがあります。

于 2008-10-08T21:08:37.140 に答える