質問

.NET アセンブリをプラグインとして使用する無関係なプロセスが 2 つあります。ただし、どちらのプロセスもいつでも開始/停止できます。特定のプロセスがサーバーであることに依存できません。実際、プロセスの 1 つでは複数のコピーが実行されていても、もう 1 つは 1 つだけ実行されている可能性があります。

私は最初に以下に基づいてソリューションを実装しました この記事. 。ただし、これには、サーバーを実装するサーバーがクライアントよりも前に実行されている必要があります。

クライアントが最初に実行されているときに、サーバーに何らかの通知を実装する最良の方法は何ですか?

役に立ちましたか?

解決

共有メモリの使用は、共有メモリ バッファのサイズを管理する (または十分な量を事前に割り当てる) 必要があるため、さらに困難になります。そこに配置するデータ構造も手動で管理する必要があります。ただし、一度テストして動作させると、そのシンプルさのおかげで使用とテストが容易になります。

リモート処理のルートを選択する場合は、名前付きパイプを使用した単一システム通信に、TCP チャネルまたは HTTP チャネルの代わりに IpcChannel を使用できます。 http://msdn.microsoft.com/en-us/library/4b3scst2.aspx. 。このソリューションの問題は、プロセスがエンドポイントを登録できるレジストリ タイプのソリューション (共有メモリまたはその他の永続ストアのいずれか) を考え出す必要があることです。そうすることで、エンドポイントを探すときに、システム上で実行されているすべてのエンドポイントをクエリする方法が見つかり、探しているものを見つけることができます。リモーティングを使用する利点は、シリアル化とメソッド呼び出しがすべて非常に簡単であることです。また、ネットワーク上の複数のマシンに移動する場合は、スイッチを切り替えるだけで、代わりにネットワーク チャネルを使用できます。短所は、「リモート」呼び出しと「ローカル」呼び出しを明確に区別しないと、リモーティングがイライラする可能性があることです。

WCF についてはあまり詳しくありませんが、それも検討する価値があるかもしれません。スパイダーセンスは、おそらくこの問題に対してもっと洗練された解決策があるだろうと言います...多分。

あるいは、他のすべてのプロセスから独立して起動される「サーバー」プロセスを作成し (複数のプロセスが起動されないようにシステム Mutex を使用します)、すべてのプロセスの仲介および登録ハブとして機能することもできます。他のプロセス。

イベントのパブリッシュ/サブスクライブ モデル (Pub/Sub) について調べることがもう 1 つあります。この手法は、イベント ソースが使用可能になる前にリスナーが起動されるが、イベントへの登録を待ちたくない場合に役立ちます。「サーバー」プロセスはイベント レジストリを処理して、パブリッシャーとサブスクライバーをリンクします。

他のヒント

サーバーとクライアントを両方でホストし、最初に起動した方がサーバーになれるのはなぜでしょうか?また、サーバーがドロップアウトすると、まだアクティブなクライアントが役割を切り替えます。

IPC (.net かどうか) を処理するには多くの方法があり、TCP/HTTP トンネル経由は 1 つの方法ですが、(状況や環境によっては) 非常に悪い選択になる可能性があります。

共有メモリと名前付きパイプの 2 つの方法 (もちろん、.Net でも実行できます) は、あなたにとってより良い解決策となる可能性があります。.Net Framework には IPC クラスもあります...しかし、AppDomain の問題のため、個人的には好きではありません...

ガロさんの意見に同意します。

pub/sub サービスを使用することは優れた解決策になります。これは明らかに、このサービスは他の 2 つのサービスのいずれかよりも前に起動して実行する必要があることを意味します。

パブリッシュ/サブスクライブをスキップしたい場合は、異なるエンドポイントを持つ両方のアプリケーションにサービスを実装するだけです。いずれかのアプリケーションが起動されると、IPC プロキシ経由で他の既知のオブジェクトにアクセスしようとします。プロキシが失敗すると、他のオブジェクトは起動しません。

-スコット

私は、全二重 IPC を実行するための信頼性が高く、シンプルで、高速な方法を探しながら、IPC で利用可能なすべてのオプションを 2 日間かけて調べてきました。 IPCライブラリ, Codeplex.com で見つけた、これまでのところ、私が試したすべてのオプションの中で完璧に機能しています。すべてわずか 7 行のコードで済みます。:D 全二重 IPC を見つけようとしてこれに遭遇した人がいたら、時間を大幅に節約して、このライブラリを試してみてください。ソース コードを取得し、data.dll をコンパイルし、指定された例に従います。

Hth、cir

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top