none
EXE間通信 RRS feed

  • 質問

  • 現在カスタマイズしようとしているソリューションが、フォームの数が
    多い等で、Visual Studio 2008でよく固まります。
    思い切って、メインメニューから先を、別EXE にしてソリューションを分割しようとする場合、

    ログイン情報等をプロパティーとして渡すみたいな、やり取りはどうしたらいいでしょうか?

    DLLにする手法は知っているのですが、全部DLLにするのも違和感があるので、

    昔のActive X EXEみたいにプロパティ,メソッドを公開しているようなものはできないでしょうか?

    通信の知識がないもので、御教授願います。


    開発環境は

    Microsoft Visual Studio 2008
    Version 9.0.30729.1 SP
    Microsoft .NET Framework
    Version 3.5 SP1
    です。

    2010年5月11日 2:49

回答

  • こんにちは。

    >昔のActive X EXEみたいにプロパティ,メソッドを公開しているようなものはできないでしょうか?

    マネージドの世界では、これはまさに、クラスライブラリにしてAssembly登録するという事にあたるのではいないでしょうか。
    ですので、Assembly登録までしないとしても、全てをクラスライブラリ(マネージ DLL)にする事に違和感を持つ必要はないと思います。

    DLLにすると、
    >ログイン情報等をプロパティーとして渡すみたいな、やり取りはどうしたらいいでしょうか?
    このようなことは違和感無くできますし、オブジェクトとして渡すこともできますし。

    Assembly.LoadFrom(だったかな)を利用して、動的にDLLをロードすることもできます。

    また、将来的に.NET Framework 4.0 に移行することがあれば、MEF(Managed Extensibility Framework )が使えるかもしれません。

    マネージドDLLについてはいろいろ便利機能もありますので、DLLにする方が何かと都合が良い気がします。


    K.Oumi
    • 回答としてマーク TAKAPI 2010年5月12日 7:05
    2010年5月11日 6:21

すべての返信

  • ログイン情報等をプロパティーとして渡すみたいな、やり取りはどうしたらいいでしょうか?

    起動時パラメタにIDとパスワードを指定する。
    http://blogs.wankuma.com/hatsune/
    2010年5月11日 3:17
  • コマンドライン引数とかのパラメーターでなく、プロパティーで、たとえばログイン時の情報をLoginDataクラスに設定し、 そのクラスをセッションオブジェクトに設定し、画面間で受け渡す。 みたいなやり取りできますでしょうか。
    2010年5月11日 4:26
  • コマンドライン引数とかのパラメーターでなく、プロパティーで、たとえばログイン時の情報をLoginDataクラスに設定し、 そのクラスをセッションオブジェクトに設定し、画面間で受け渡す。 みたいなやり取りできますでしょうか。

    プロセス間通信になってくるとデータの管理もかなりややこしくなるような気がします。それよりも気になったのが・・・

    現在カスタマイズしようとしているソリューションが、フォームの数が多い等で、Visual Studio 2008でよく固まります。
    思い切って、メインメニューから先を、別EXE にしてソリューションを分割しようとする場合・・・

    開発環境で固まるからといって、ソリューションを分割して別EXEにするって発想がよくわからないのですが。

    フォームの数が多いってどれくらいですか?また作業するとき、フォームを全てデザイナーで開いて作業しているのでしょうか?メモリはどのくらい積んでます?

    私のプロジェクトでも フォームやユーザーコントロールの数が大変多いのですが、マシンにメモリを2G積んでますから、そうそう固まることはありません。
    試しにユーザーコントロールとフォーム、テンプレートにレポート等、合わせて100個くらい開いて作業してみたら、少々動作が重くなった感があっても、固まったり遅くなるなんてことはありませんでした。


    ひらぽん http://d.hatena.ne.jp/hilapon/
    2010年5月11日 5:25
    モデレータ
  • こんにちは。

    >昔のActive X EXEみたいにプロパティ,メソッドを公開しているようなものはできないでしょうか?

    マネージドの世界では、これはまさに、クラスライブラリにしてAssembly登録するという事にあたるのではいないでしょうか。
    ですので、Assembly登録までしないとしても、全てをクラスライブラリ(マネージ DLL)にする事に違和感を持つ必要はないと思います。

    DLLにすると、
    >ログイン情報等をプロパティーとして渡すみたいな、やり取りはどうしたらいいでしょうか?
    このようなことは違和感無くできますし、オブジェクトとして渡すこともできますし。

    Assembly.LoadFrom(だったかな)を利用して、動的にDLLをロードすることもできます。

    また、将来的に.NET Framework 4.0 に移行することがあれば、MEF(Managed Extensibility Framework )が使えるかもしれません。

    マネージドDLLについてはいろいろ便利機能もありますので、DLLにする方が何かと都合が良い気がします。


    K.Oumi
    • 回答としてマーク TAKAPI 2010年5月12日 7:05
    2010年5月11日 6:21

  • あまり詳しくないのですが、必要なパラメータやオブジェクトをあるEXEがDLLにセットして
    ほかのEXEも そのDLL インスタンスと共有して、参照することができないでしょうか。
    http://msdn.microsoft.com/ja-jp/library/h90dkhs0(VS.80).aspx
    の記事はそのことらしいのですが、C++なので、よくわかりません。

    VB.Netで実現できないでしょうか?

     

     

    2010年5月11日 9:44
  • いろいろなコンポーネントがあり、フォームやレポートも100を超え、それとは別に、機能追加もつづくので、

    いろいろなことを考えて、分割したいです。

    2010年5月11日 9:47
  • なるほど。でしたら K.Oumi さんの仰るとおり、クラスライブラリに分割して管理すればいいだけのような気がしますが。
    ライブラリごとにソリューションを分割して管理してもいいわけですし、その方が .NET の流儀に合っているように思えます。わざわざ EXE で分割する意味がよくわかりません。

    もしどうしても EXE 分割してデータを共有したいというなら、メモリマップドファイルを利用する方法もあるようです。
    C#ですが、VB.NET にもすぐ応用できるでしょう。

    http://codezine.jp/article/detail/4279

    それとも EXE を COM 化する?パフォーマンスを考慮すると、COM 化するよりクラスライブラリにした方が、よっぽどパフォーマンスがいいかと思います。


    ひらぽん http://d.hatena.ne.jp/hilapon/
    2010年5月11日 10:26
    モデレータ
  • .NET Remoting も候補に挙がるのかなぁ。
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年5月11日 15:24
    モデレータ
  • .NET Remoting も候補に挙がるのかなぁ。


    知らなかったので、いろいろ調べてみました。これはなかなか面白そうです。

    http://codezine.jp/article/detail/530

    しかし .NET も奥が深いですねぇ。こんな技術があったとは・・・


    ひらぽん http://d.hatena.ne.jp/hilapon/
    2010年5月11日 20:05
    モデレータ
  • 稚拙な方法かもしれませんが、APIのSendMessageが簡単そうでチャレンジしてますが、

    こういうことはどうしたらいいでしょうか、

    1.A.exeでオブジェクトを動的につくる。(構造体データーとか)

    2.AexeからそのオブジェクトのポインタをSendMessageでB.exe

    3.B.exeでWndProcでメッセージを取得して、同じ型の構造体を受け取ったポインタで参照する。

    これができたら、EXE間で自由にオブジェクト参照できないでしょうか。

    2010年5月12日 1:58
  • データベースに書いてはどうでしょうか。
    2010年5月12日 4:44
  • Remoting ときたら、この際、WCFでプロセス間通信でも(><)b

    というか、どうしてもEXEとして独立した動作を求められるのであれば、WCFでNamedPipeを使って分散指向な感じもありかなぁという気もしてきちゃいますね・・・


    K.Oumi
    2010年5月12日 7:10
  • DBかぁ、しごく真っ当な考えに見えます。


    K.Oumi
    2010年5月12日 7:11
  • VB.NETだけで、プラグマを使う方法は今のところ無いと思います。

    メモリマップドファイルは、.NET Framework 4.0から標準で利用可能となります。

    ですので、.NET Framework 3.5以下であれば、いくつかあがっているような方法から、選択するしか無いんじゃないかなぁと思います。

    ・起動時パラメタにIDとパスワードを指定する
    ・DLLにする
    ・リモーティングなどの通信
    ・COMを介した通信
    ・.NET Framework 4.0にする!
    ・DB(をはじめとして永続化可能なデータソース)に書く
    ・SendMessage(個人的にはお勧めできない)

    このなかから、よさそうなものを選択という事になるのでしょう・・・


    K.Oumi
    • 編集済み K.Oumi 2010年5月12日 7:35 字間違え
    2010年5月12日 7:33
  • 老婆心かもしれませんが、SendMessageを使うのであれば、Windows Server 2008 / Vista / Windows7 のセッション0分離への配慮が必要かもしれません。


    K.Oumi
    2010年5月12日 7:34
  • 2.AexeからそのオブジェクトのポインタをSendMessageでB.exe
    3.B.exeでWndProcでメッセージを取得して、同じ型の構造体を受け取ったポインタで参照する。

    まず、.NET Framework に限らず、異なるプロセス間で同じポインタを共有することはできません。
    メモリ空間がプロセスごとに分けられていますので、ポインタを渡しても使えません。
    また、.NET Framework でのオブジェクトは、ガベージコレクタによって移動されることがありますので、永続的なポインタを取得することはできないと思って頂いた方が良いでしょう。

    似たようなことがしたいのであれば、.NET Remoting、WCF などのキーワードで調べてみてください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年5月12日 14:26
    モデレータ