トップ回答者
VB6との通信方法について

質問
-
VB6.0にて開発されたフォームアプリケーションとVS2010 C#(.Net4.0)で開発中のフォームアプリケーションがあります。
このアプリケーション間で通信する必要が発生しました。
具体的にはVB6.0側から.Net側のアプリケーションへ値を送り、受け取った側はその値を基にDB接続し、結果をフォームへ表示させるという処理です。
.NET リモーティング (System.Runtime.Remoting) 等で実現できないため、どのような方法が適切かがわかりません。VS2010においてC#で記述したActiveX DLLをVB6側のアプリで使用できるのかもわかりません。
アドバイスをお願いします。
回答
-
「VB6の通信方法に従って」というのは、そのVB6のアプリケーションが実装済みの、という注釈付きなので、こちらが提案する側(VB6アプリに新たに実装追加をお願いする立場)なら関係ない話です。
プロセス間通信としては、WM_COPYDATA、名前付きパイプ、メールスロット、標準入出力、TCPソケット、ファイルを介して、と言った辺りがまず考えられます。これらのうち .NET 4で標準ライブラリから直接扱えるのは、標準入出力 (System.Console) と名前付きパイプ (System.IO.Pipes.NamedPipeServerStream)、TCP (System.Net.Sockets.TcpListener)、あとはファイルですね。
相互の実装容易性も含めてどれが良いかは一概には言えませんが(ですのでそれぞれのメリットデメリットについてよく調べることをお勧めします)、個人的には名前付きパイプかなぁ。
- 回答としてマーク TwSoft 2012年3月5日 8:53
-
よっぽど日本語が不得手なのでしょうか…。「そのような事情もありました」という過去形は、現在はそのような事情はない、という意味でしょうか?
というのも、質問文前半を読む限りVB6(アプリケーションAと書かれていたもの)とC#(アプリケーションB)との通信方法についての質問に読み取れます。しかし、C# DLLを作成しVB6からそのDLLを呼び出すということになると、C# DLLとC#アプリケーション(アプリケーションB)との通信になります。
こうなると、C#同士の通信になりますので、質問に挙げられている.NETリモーティングも使用可能です。VB6からC#の呼び出しもActiveX DLLの呼び出しになり、別段、質問するほどのことではなくなります。結局、どことどこの通信について質問したいのですか? また、作成されるモジュール・プロセスを明確にしてください。
# ついでに日本語を勉強し直すこともお勧めします。- 回答としてマーク TwSoft 2012年3月6日 8:21
すべての返信
-
「VB6の通信方法に従って」というのは、そのVB6のアプリケーションが実装済みの、という注釈付きなので、こちらが提案する側(VB6アプリに新たに実装追加をお願いする立場)なら関係ない話です。
プロセス間通信としては、WM_COPYDATA、名前付きパイプ、メールスロット、標準入出力、TCPソケット、ファイルを介して、と言った辺りがまず考えられます。これらのうち .NET 4で標準ライブラリから直接扱えるのは、標準入出力 (System.Console) と名前付きパイプ (System.IO.Pipes.NamedPipeServerStream)、TCP (System.Net.Sockets.TcpListener)、あとはファイルですね。
相互の実装容易性も含めてどれが良いかは一概には言えませんが(ですのでそれぞれのメリットデメリットについてよく調べることをお勧めします)、個人的には名前付きパイプかなぁ。
- 回答としてマーク TwSoft 2012年3月5日 8:53
-
これから開発されるのであれば「VB6.0にて開発された」という過去形は間違っていませんか? それと既にVB6.0はサポート期限が終了していて、これから開発されるのはどうかと思います。
Hongliangさんがいろいろ挙げられましたが、どれもプロセス間通信に使われるもの、場合によってはPCをまたいで通信するものです。しかし質問文にある「VS2010においてC#で記述したActiveX DLLをVB6側のアプリで使用できるのか」という記述が気になります。この方法は可能ですし、同一プロセス内に閉じたものになりますが、逆にHongliangさんの提案はどれもあまり適切ではないということになります。
# 例えば標準入出力は同一プロセス内での通信には使えません。そこで確認ですが、C#とVB6とは同一プロセスで動作するのですか? それとも別プロセスになるのですか?(もしかして別PCですか?)質問の前提になる条件を明確にしてください。
-
よっぽど日本語が不得手なのでしょうか…。「そのような事情もありました」という過去形は、現在はそのような事情はない、という意味でしょうか?
というのも、質問文前半を読む限りVB6(アプリケーションAと書かれていたもの)とC#(アプリケーションB)との通信方法についての質問に読み取れます。しかし、C# DLLを作成しVB6からそのDLLを呼び出すということになると、C# DLLとC#アプリケーション(アプリケーションB)との通信になります。
こうなると、C#同士の通信になりますので、質問に挙げられている.NETリモーティングも使用可能です。VB6からC#の呼び出しもActiveX DLLの呼び出しになり、別段、質問するほどのことではなくなります。結局、どことどこの通信について質問したいのですか? また、作成されるモジュール・プロセスを明確にしてください。
# ついでに日本語を勉強し直すこともお勧めします。- 回答としてマーク TwSoft 2012年3月6日 8:21