DOBON.NET DOBON.NETプログラミング掲示板過去ログ

2つの DLLを連携させたいです。

環境/言語:[XP ProSP3 .NET 2.0 VS2005 C#]
分類:[.NET]

お世話になります。いろいろ調べたり実験したものの
解決の糸口を見つけることができませんでした。
お知恵をお貸しいただければありがたく思います。

内容なのですが
ABC.exe というアプリがあり A.dll と B.dll に対する参照設定があります。

ボタンAをクリックすると A.dll のダイアログが表示され機能します。
ボタンBをクリックすると B.dll のダイアログが表示され機能します。
A.dll も B.dll も任意のタイミングでいたりいなかったりします。

質問は A.dllを起動したときに B.dll が既に起動していれば
A.dllのダイアログに B.dllが持っているメソッドを実行するための
ボタンが有効になり押せば機能し、起動していなければ無効になっている

ABC.exe を介さないで A.dll と B.dll をこのような
形で連携させることはできるのでしょうか?
できるとすればどのような方法があるでしょうか?
概略やヒントだけでも助かります。
ご存じの方がおられましたらよろしくお願いします。

環境
Windows XP Pro SP3
VS2005 C# .NET 2.0
■No29892に返信(どんぐりの記事)

スミマセン
A.dll のプロジェクトに B.dllを参照設定して
色々試しているうちにできてしまいました。
お騒がせしました。m(_ _)m
■No29893に返信(どんぐりさんの記事)
> ■No29892に返信(どんぐりの記事)
解決にチェックが入ってませんでした。
解決済み!
■No29893に返信(どんぐりさんの記事)
> A.dll のプロジェクトに B.dllを参照設定して
> 色々試しているうちにできてしまいました。

A.DLL が B.DLL を参照した(A.DLL が B.DLL に依存)したのですね。
一方向だけで済むのであればそれでいけると思いますが、双方向になったとたん破綻するのでご注意ください。

# 双方向の場合は仲介する何かが必要になるはず。
解決済み!
■No29900に返信(Azuleanさんの記事)
> ■No29893に返信(どんぐりさんの記事)
>>A.dll のプロジェクトに B.dllを参照設定して
>>色々試しているうちにできてしまいました。
>
> A.DLL が B.DLL を参照した(A.DLL が B.DLL に依存)したのですね。
> 一方向だけで済むのであればそれでいけると思いますが、双方向になったとたん破綻するのでご注意ください。
>
> # 双方向の場合は仲介する何かが必要になるはず。

Azuleanさん こんにちは コメントありがとうございます。

今から双方向を考えていたところです。
破綻するのはやはり参照が循環するような形になるからでしょうか?
そうなるとやはり ABC.exe を介するのが自然ということですね
ABC.exe は違う部署が作っているのでそれはそれで話がややこしくて・・
> 質問は A.dllを起動したときに B.dll が既に起動していれば
> A.dllのダイアログに B.dllが持っているメソッドを実行するための
> ボタンが有効になり押せば機能し、起動していなければ無効になっている

「dllが起動した」とは、具体的にどのような状態を指すのでしょうか?
私の理解では、exeは起動する、dllは呼び出されるというイメージなので、
「dllが起動した」という表現がピンときませんでした。

また、A.DLLとB.DLLを双方向で参照したくなるとのことですが、それはどうしてなのでしょうか?
いずれにしろ、参照元のexeの修正は必至だと思いますが。
■No29907に返信(どんぐりさんの記事)
> 今から双方向を考えていたところです。
> 破綻するのはやはり参照が循環するような形になるからでしょうか?

まず、プロジェクト参照で相互の参照は設定できません。
一方をビルドするにも、他方が必要という状態が両方に設定されることになるので、ビルドできなくなりますからね。


> そうなるとやはり ABC.exe を介するのが自然ということですね
> ABC.exe は違う部署が作っているのでそれはそれで話がややこしくて・・

両者を使用する exe を変えることが正攻法でしょうね。
相互に依存せずに済む形をうまく工夫して作り出すか、A/B 両方が共通して依存する何かを用意して工夫するかということも考えられますが、具体案については言及しかねます。いろいろとややこしく、わかりづらくなるので…。
■No29914に返信(ズッカさんの記事)

> 「dllが起動した」とは、具体的にどのような状態を指すのでしょうか?
> 私の理解では、exeは起動する、dllは呼び出されるというイメージなので、
> 「dllが起動した」という表現がピンときませんでした。

呼び方についてはあまり意識したことはないのですが
おっしゃるように DLLに関してはロードするとか呼び出すとかの表現が一般的
かも知れないのですが今回は GUIを持った DLLの事なので単に呼び出すでは
サイレントな感じがするため A.DLLを起動して と言ってますね・・
サイレントな DLLの場合は A.DLLをロード、あるいは呼び出すと言ってます。



> また、A.DLLとB.DLLを双方向で参照したくなるとのことですが、それはどうしてなのでしょうか?

A.DLL のダイアログを操作している時に B.DLLに実装されている機能を使いたい時やその逆のケースがあるからです。
つまりは、AからB、BからAなどある程度どこからでも必要で有効な機能が呼び出せるよう使い勝手を上げるのが目的です。
本来は ABC.exe に実装したり C.DLLを作って常駐させそこに Aと Bにとって必要な機能を実装するのが現実的と言うのも理解しているのですが、DLLの登録ルールとか政治的な問題がありまして
■No29917に返信(Azuleanさんの記事)

Azuleanさん
アドバイスありがとうございます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板