web-dev-qa-db-ja.com

同じコンピューター上の.NETでのプロセス間通信

C++/CLIアプリケーションを2つの部分に分割したい:

1。通信部分、I/O +テキストファイルへのログオン:

3つのCOMポート、2つのソケット、1つのログファイル

2。COMポート、ソケットなどから受信したデータを処理するUIパーツ...

現時点では、私のアプリケーションは常にすべてのCOMポートから読み取り(必要に応じて書き込みを行います)、2つのサーバーと通信(送受信)し、これらのモジュールから受信したすべてのデータをログに記録しています。 UIもかなり複雑ですが、私の問題には関係ありません。

ここで、COMポートの制限(同時に1つの接続)のために、プログラムの通信部分を分離して、それらを複数のプログラムで使用できるようにしたいと思います。通信部分は、すべてのモジュールと通信し、いつでも(サービスとして)実行できるように、マルチスレッド化する必要があります。

[〜#〜] wcf [〜#〜](このアプリケーションは.NET Frameworkで作成されたため)について読みましたが、よくわかりませんこのソリューションについて:低構成で実行する必要があります(Intel Atom @ 1.66GHz、2GB RAM、Windows XP Embedded、.NET Framework 4.0))。

[〜#〜] wcf [〜#〜]で学習してみることはできますか、または設定が低いために別の解決策を見つける必要がありますか?理想的には、UIパーツに対していくつかのイベントをトリガーできるプログラムを構築したいです。

2
AlfredLamoule

私は現在、WCFをうまく使用しているあなたのソフトウェアに似ているような複雑なソフトウェアに取り組んでいます。 WCFアプリケーションがWebサーバー環境の外で実行される場合、その呼び出されたセルフホスティング、およびVisual Studioが提供するすべてのサービス参照生成ツールを避け、 サーバーとクライアントを手動で構成する をお勧めします。それは維持するのがはるかに簡単であり、あなたのために働く設定を取得したら、それはかなり単純です。

ただし、パフォーマンスの問題があり(ハードウェアを考慮すれば理にかなっている)、アプリケーションの半分がC++であることがわかっている場合は、 名前付きパイプ をお勧めします。名前付きパイプはしばらく前から存在しており、Windowsでは、両方のプロセスが読み書きできるインメモリファイルストリームと同様にOSによって扱われるため、非常に高速です。

両方の世界を最大限に活用するため(または、視点に応じて両方の妥協点、;))WCFには 名前付きパイプバインディング が用意されていますが、これは使用したことがありません。

また、この質問は以前に尋ねられたことにも注意してください。

https://stackoverflow.com/questions/712882/wcf-performance-net-tcp-versus-namedpipes

https://stackoverflow.com/questions/84855/what-is-the-best-choice-for-net-inter-process-communication

2
plast1k

WCFを使用してはならない1つのコンピューターになる場合、WCFは強力ですが複雑です。ハードウェア通信コードをDLLアセンブリに分離することを考えたいと思います。異なる通信ハードウェア用に別々のクラスがあり、すべて同じインターフェイスを実装している可能性があります。

次に、GUIに構成ファイル(3つの異なるCOMポートとその設定など)に基づいてオブジェクトを作成させ、各インスタンスのインターフェースと通信させます。

データ取得モジュールを配布する機能は魅力的かもしれませんが、その場合、結局のところWCFが役立ちます。それはうまくスケーリングし、低レベルTCP LAN経由でhttpをWANまったく同じように使用でき、すべて処理されます。

必要に応じて(同じマシンでの通信用に)名前付きパイプも実行しますが、私の経験では、TCPを超えるパフォーマンスの向上は無視できます。

0
Martin Maat