none
VB6との通信方法について RRS feed

  • 質問

  • VB6.0にて開発されたフォームアプリケーションとVS2010 C#(.Net4.0)で開発中のフォームアプリケーションがあります。

    このアプリケーション間で通信する必要が発生しました。

    具体的にはVB6.0側から.Net側のアプリケーションへ値を送り、受け取った側はその値を基にDB接続し、結果をフォームへ表示させるという処理です。

     .NET リモーティング (System.Runtime.Remoting) 等で実現できないため、どのような方法が適切かがわかりません。

    VS2010においてC#で記述したActiveX DLLをVB6側のアプリで使用できるのかもわかりません。

    アドバイスをお願いします。

    2012年3月5日 7:43

回答

  • 「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
    2012年3月5日 8:49
  • C#でVB6側のためのActiveX DLLを作るのなら、プロセス間通信自体は.NET RemotingやらWCFやらでも実現できることになりますが。
    • 回答としてマーク TwSoft 2012年3月6日 8:20
    2012年3月6日 8:17
  • よっぽど日本語が不得手なのでしょうか…。「そのような事情もありました」という過去形は、現在はそのような事情はない、という意味でしょうか?

    というのも、質問文前半を読む限りVB6(アプリケーションAと書かれていたもの)とC#(アプリケーションB)との通信方法についての質問に読み取れます。しかし、C# DLLを作成しVB6からそのDLLを呼び出すということになると、C# DLLとC#アプリケーション(アプリケーションB)との通信になります。
    こうなると、C#同士の通信になりますので、質問に挙げられている.NETリモーティングも使用可能です。VB6からC#の呼び出しもActiveX DLLの呼び出しになり、別段、質問するほどのことではなくなります。

    結局、どことどこの通信について質問したいのですか? また、作成されるモジュール・プロセスを明確にしてください。
    # ついでに日本語を勉強し直すこともお勧めします。

    • 回答としてマーク TwSoft 2012年3月6日 8:21
    2012年3月6日 8:18

すべての返信

  • 「VB6.0にて開発された」と過去形で書かれていることが気になりました。(文字通りに日本語を読むと)VB6アプリケーションは既に書き終わっているわけですよね。であれば、VB6の通信方法に従ってC#を記述するだけではありませんか?
    2012年3月5日 8:16
  • アドバイス、ありがとうございます。

    VB6側は外部の企業が開発したアプリケーションで、その企業に通信方法を提供する必要があります。

    VB6の通信方法に従ったC#の記述とは具体的にどのようなものでしょうか。

    参考になるサイト等があればご紹介ください。

    よろしくお願いします。

    2012年3月5日 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
    2012年3月5日 8:49
  • ありがとうございます。

    方法を列挙していただきましたので、これらの特徴を調べつつ実現方法を検討します。

    まずは名前付きパイプについて調べてみます。

    ありがとうございました。

    2012年3月5日 8:53
  • これから開発されるのであれば「VB6.0にて開発された」という過去形は間違っていませんか? それと既にVB6.0はサポート期限が終了していて、これから開発されるのはどうかと思います。

    Hongliangさんがいろいろ挙げられましたが、どれもプロセス間通信に使われるもの、場合によってはPCをまたいで通信するものです。しかし質問文にある「VS2010においてC#で記述したActiveX DLLをVB6側のアプリで使用できるのか」という記述が気になります。この方法は可能ですし、同一プロセス内に閉じたものになりますが、逆にHongliangさんの提案はどれもあまり適切ではないということになります。
    # 例えば標準入出力は同一プロセス内での通信には使えません。

    そこで確認ですが、C#とVB6とは同一プロセスで動作するのですか? それとも別プロセスになるのですか?(もしかして別PCですか?)質問の前提になる条件を明確にしてください。

    2012年3月5日 10:19
  • 佐祐理様。ご指摘ありがとうございます。

    2つのアプリケーションは同一PCで動作するもので、別PCとは一切通信しません。

    VB6.0のサポートが終了していることは私も開発した開発元も承知しておりますが、現時点で先方が新しいバージョンを出す予定がないとの理由から、OSの動作確認をしながらWindows7、XPの環境下で使用を継続しております。

    アプリケーションA(VB6)の起動時にアプリケーションBを同時に起動させ、AのイベントでBのメソッドを呼び出すという関係です。

    この構成では名前付きパイプは適切ではありませんか。

    2012年3月6日 2:53
  • 「起動」という言葉があいまいです。質問文には「VS2010においてC#で記述したActiveX DLLをVB6側のアプリで使用できるのか」とありましたが、この場合は「起動」ではありませんよね?

    C#とVB6とは同一プロセスで動作するのですか? それとも別プロセスになるのですか? に答えていただけたらと。

    2012年3月6日 3:47
  • 別プロセスです。
    2012年3月6日 4:22
  • そうすると何故最初の投稿でActiveX DLLという言葉が出てきたのでしょうか?

    VB6側のリモート処理もTwSoftさんの方で作成して、メソッド一つ呼び出すだけという形にしなければならない、といった事情でも?

    2012年3月6日 7:00
  • おっしゃるとおり、そのような事情もありました。
    2012年3月6日 7:21
  • C#でVB6側のためのActiveX DLLを作るのなら、プロセス間通信自体は.NET RemotingやらWCFやらでも実現できることになりますが。
    • 回答としてマーク TwSoft 2012年3月6日 8:20
    2012年3月6日 8:17
  • よっぽど日本語が不得手なのでしょうか…。「そのような事情もありました」という過去形は、現在はそのような事情はない、という意味でしょうか?

    というのも、質問文前半を読む限りVB6(アプリケーションAと書かれていたもの)とC#(アプリケーションB)との通信方法についての質問に読み取れます。しかし、C# DLLを作成しVB6からそのDLLを呼び出すということになると、C# DLLとC#アプリケーション(アプリケーションB)との通信になります。
    こうなると、C#同士の通信になりますので、質問に挙げられている.NETリモーティングも使用可能です。VB6からC#の呼び出しもActiveX DLLの呼び出しになり、別段、質問するほどのことではなくなります。

    結局、どことどこの通信について質問したいのですか? また、作成されるモジュール・プロセスを明確にしてください。
    # ついでに日本語を勉強し直すこともお勧めします。

    • 回答としてマーク TwSoft 2012年3月6日 8:21
    2012年3月6日 8:18