トップ回答者
EXE間通信

質問
-
現在カスタマイズしようとしているソリューションが、フォームの数が
多い等で、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
です。
回答
-
こんにちは。
>昔の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
すべての返信
-
コマンドライン引数とかのパラメーターでなく、プロパティーで、たとえばログイン時の情報をLoginDataクラスに設定し、 そのクラスをセッションオブジェクトに設定し、画面間で受け渡す。 みたいなやり取りできますでしょうか。
プロセス間通信になってくるとデータの管理もかなりややこしくなるような気がします。それよりも気になったのが・・・
現在カスタマイズしようとしているソリューションが、フォームの数が多い等で、Visual Studio 2008でよく固まります。
思い切って、メインメニューから先を、別EXE にしてソリューションを分割しようとする場合・・・開発環境で固まるからといって、ソリューションを分割して別EXEにするって発想がよくわからないのですが。
フォームの数が多いってどれくらいですか?また作業するとき、フォームを全てデザイナーで開いて作業しているのでしょうか?メモリはどのくらい積んでます?
私のプロジェクトでも フォームやユーザーコントロールの数が大変多いのですが、マシンにメモリを2G積んでますから、そうそう固まることはありません。
試しにユーザーコントロールとフォーム、テンプレートにレポート等、合わせて100個くらい開いて作業してみたら、少々動作が重くなった感があっても、固まったり遅くなるなんてことはありませんでした。
ひらぽん http://d.hatena.ne.jp/hilapon/- 編集済み ひらぽんModerator 2010年5月11日 5:34 ちょっと修正
-
こんにちは。
>昔の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
-
あまり詳しくないのですが、必要なパラメータやオブジェクトをあるEXEがDLLにセットして
ほかのEXEも そのDLL インスタンスと共有して、参照することができないでしょうか。
http://msdn.microsoft.com/ja-jp/library/h90dkhs0(VS.80).aspx
の記事はそのことらしいのですが、C++なので、よくわかりません。VB.Netで実現できないでしょうか?
-
なるほど。でしたら K.Oumi さんの仰るとおり、クラスライブラリに分割して管理すればいいだけのような気がしますが。
ライブラリごとにソリューションを分割して管理してもいいわけですし、その方が .NET の流儀に合っているように思えます。わざわざ EXE で分割する意味がよくわかりません。もしどうしても EXE 分割してデータを共有したいというなら、メモリマップドファイルを利用する方法もあるようです。
C#ですが、VB.NET にもすぐ応用できるでしょう。http://codezine.jp/article/detail/4279
それとも EXE を COM 化する?パフォーマンスを考慮すると、COM 化するよりクラスライブラリにした方が、よっぽどパフォーマンスがいいかと思います。
ひらぽん http://d.hatena.ne.jp/hilapon/ -
.NET Remoting も候補に挙がるのかなぁ。
知らなかったので、いろいろ調べてみました。これはなかなか面白そうです。http://codezine.jp/article/detail/530
しかし .NET も奥が深いですねぇ。こんな技術があったとは・・・
ひらぽん http://d.hatena.ne.jp/hilapon/ -
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 字間違え
-
2.AexeからそのオブジェクトのポインタをSendMessageでB.exe
3.B.exeでWndProcでメッセージを取得して、同じ型の構造体を受け取ったポインタで参照する。まず、.NET Framework に限らず、異なるプロセス間で同じポインタを共有することはできません。
メモリ空間がプロセスごとに分けられていますので、ポインタを渡しても使えません。
また、.NET Framework でのオブジェクトは、ガベージコレクタによって移動されることがありますので、永続的なポインタを取得することはできないと思って頂いた方が良いでしょう。似たようなことがしたいのであれば、.NET Remoting、WCF などのキーワードで調べてみてください。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。