33

私は2つのプログラムを持っています。1 つは C# で、もう 1 つは Java です。これらのプログラムは、ほとんどの場合、常に同じマシンで実行されます。

彼らがお互いに話せるようにするための最良の方法は何でしょうか?

したがって、問題を明確にするために:

これは個人的なプロジェクトです (そのため、専門的/高価なライブラリは使用できません)。メッセージの量は少なく、1 秒あたり約 1 ~ 2 件のメッセージが送信されます。メッセージは小さく、いくつかのプリミティブ型でうまくいくはずです。複雑さを低く抑えたいと思います。Java アプリケーションは、別のアプリケーションのプラグインとして単一の jar としてデプロイされます。そのため、マージする必要がある外部ライブラリが少ないほど良いのです。私は C# アプリケーションを完全に制御できます。前述のように、両方のアプリケーションを同じコンピューターで実行する必要があります。現在、私の解決策は、ある種の csv のような形式でソケットを使用することです。

4

9 に答える 9

19

私は、JVM と CLR の間のオープン ソースのインタープロセス ブリッジであるjni4netの作成者です。JNI と PInvoke の上に構築されています。C/C++ コードは必要ありません。お役に立てば幸いです。

于 2009-10-31T18:37:10.033 に答える
9

カイルは、相互作用について尋ねる際に正しいアプローチをしています。どのような使用パターンが考えられるかを知らずに「正解」はありません。

アーキテクチャ上の決定は、特にこのレベルではトレードオフです。

次のことを自問する必要があります。

  • システム間でどのようなメッセージをやり取りする必要がありますか?
  • どのような種類のデータを共有する必要がありますか?
  • 複雑なモデル オブジェクトをサポートするための重要な要件はありますか、それともプリミティブ + 配列で対応できますか?
  • データの量は?
  • 相互作用はどのくらいの頻度で発生しますか?
  • 許容可能な通信遅延は?

これらの質問に対する答え、または潜在的な答えを理解するまで、実装アーキテクチャを選択することは困難です。どの要素が重要かがわかれば、実行中のシステムの要件を反映した、より適切な実装候補を選択するのがはるかに簡単になります。

于 2008-08-19T20:16:50.030 に答える
7

.NET で作成された JVM であるIKVMについて良いことを聞いたことがあります。

于 2008-08-19T18:41:12.843 に答える
4

ZeroC のIceは、特に Java と .net をサポートする非常に高性能な「エンタープライズ」相互運用レイヤーです。私はこれを更新された Corba と考えています。Sliceと呼ばれる独自のオブジェクト指向インターフェース定義言語さえ備えています(Corba の IDL に似ていますが、実際には非常に読みやすい)。

機能セットは広範で、Web サービスよりもはるかに多くの機能が提供されていますが、オープン スタンダードではないことは明らかであるため、安易に決定することはできません。それが吐き出す生成コードもやや醜いです...

于 2008-08-19T19:32:30.057 に答える
4

あなたが同じマシン上のプログラムについて話していることは承知していますが、HTTP を介して XML でメッセージを渡すというアイデアは常に気に入っています。

サーバーは、XML ペイロードを受け入れる準備ができている Web サーバーである可能性があります。クライアントは、本文に XML を含む HTTP メッセージを送信し、XML を含む HTTP 応答を受信できます。

私がこれを気に入っている理由の 1 つは、HTTP が非常に広く使用されているプロトコルであるため、任意の言語で HTTP POST または GET 要求を簡単に受け入れたり作成したりできることです (将来、クライアントまたはサーバーの言語を変更することにした場合)。HTTP と XML はしばらく前から存在していたので、今後も定着すると思います。

私が気に入っているもう 1 つの理由は、他のクライアントが HTTP と XML を知っている限り、そのサーバーを他のクライアントからも使用できることです。

于 2008-08-20T02:19:53.450 に答える
3

私は比較的単純なプロジェクトで JNBridge ( http://www.jnbridge.com/jnbpro.htm ) を使用しました。移植したくないビジネス オブジェクト ロジックでいっぱいの比較的重要な jar ファイルを使用する .NET クライアント アプリがありました。 . これは非常にうまく機能しましたが、JNBridge の機能を十分に活用できたとは言えません。

于 2008-08-19T18:35:04.757 に答える
1

私は、Facebook の相互運用スタックであるThriftの大ファンです。あなたは、彼らのコードはおそらく同じマシン上で実行されると言ったので、やり過ぎかもしれませんが、それでも使用できます。

于 2008-08-19T18:34:19.347 に答える
0

それらが別個のプログラムであり、独立したアプリケーションとして実行されている場合は、ソケットを使用できます。通信プロトコルを定義するのは少し複雑ですが、非常に簡単です。

ただし、2 つの別個のプログラムしかなく、それらを 1 つのアプリケーションとして実行したい場合は、marxidad が提案するように、IKVM の方が優れたアプローチであると思います。

于 2008-08-26T08:01:59.290 に答える
0

スタックオーバーフローについて以前に非常によく似た質問があったようです(私はGoogleでJava Windows共有メモリを検索していました):

Windows での Java から C++ への効率的なデータ転送

答えから、調査することをお勧めします:

「最速の解決策は、メモリの共有セグメントをメモリマッピングし、リングバッファまたはその他のメッセージパッシングメカニズムを実装することです。C++ではこれは簡単で、Javaではそれを可能にするFileChannel.mapメソッドがあります。」

于 2009-11-16T03:34:22.590 に答える