- PR -

DLLを動的に使いたい

投稿者投稿内容
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2006-01-13 01:07
msoです。

現在、VisualStudio2003+VB.NETで開発を行っております。

悩んでいることがあり、どのようにすれば現実にすることが
できるのか相談にのってください。

1:EXEと同じところに複数のDLLを設置します。
2:DBにクラス名を登録し、EXEから取得する。
3:DBから取得したクラス名のDLLを動的に参照し、
  NewしてDLLの中のクラスのメソッドを実行する。

現状、いろいろと調べているのですがうまくできていません。
何か方向性だけでも良いのでアドバイスをいただけないでしょうか?

よろしくおねがいします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-13 01:38
引用:

msoさんの書き込み (2006-01-13 01:07) より:

DBから取得したクラス名のDLLを動的に参照し、
NewしてDLLの中のクラスのメソッドを実行する。


System.Refrection.Assembly.Load〜 などで、アセンブリを Load します。
このアセンブリの型を取得し、Invoke してください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2006-01-13 02:30
引用:

1:EXEと同じところに複数のDLLを設置します。
2:DBにクラス名を登録し、EXEから取得する。
3:DBから取得したクラス名のDLLを動的に参照し、
  NewしてDLLの中のクラスのメソッドを実行する。


どういうことを目的とされているかは質問文からはわかりませんが、もしかしたらEnterprise Libraryが使えるかもしれません。
XMLに記述されているクラス名とアセンブリ名から動的にDLLを選択して、そのなかのプログラムを呼び出す部分がありますので、使えなくてもかなり参考にはなると思います。
以下のリンクからソースもダウンロードできます。
このコードはかなり勉強になりますよ。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag2/html/entlib.asp?frame=true

_________________
たつごろー
codeseek
こみゅぷらす
清華
ベテラン
会議室デビュー日: 2005/12/21
投稿数: 50
投稿日時: 2006-01-13 08:25
Pluginを作りたいのだと解釈しました。

DOBONさんのところで詳しくやさしく解説されています。
http://dobon.net/vb/dotnet/programing/plugin.html

PluginInfo.FindPluginsの
コード:

'.dllファイルを探す
Dim dlls As String() = _
System.IO.Directory.GetFiles(folder, "*.dll")


の部分をDBからプラグインファイル名を読み出すようにすればできるのではないでしょうか?


また、pluginは別のフォルダにまとめたいが同じdllを二つも用意するのはいやだという場合は .NET のつぼ
http://park16.wakwak.com/~mimi/dotnet/misc/dll_into_dir.html
が参考になるのではないでしょうか?(試していないので分かりませんが)
ちなみに.NET のつぼ、見ているだけで楽しいのですが、残念なことに親が閉鎖しているようです、いつ消えるか分からないのでローカルに取り込んじゃっておいたほうがいいかもしれません?

_________________
9uiet Design - http://quietdesign.rental.allinoneserver.net/
デザインにこだわったソフトの配布とプログラミングTipsの公開(予定)をしています。
9uiet Blog - http://seiga.blog44.fc2.com/
笑ったことやプログラミングのことなど書�

[ メッセージ編集済み 編集者: 清華 編集日時 2006-01-13 08:30 ]
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2006-01-19 19:42
msoです。

皆様からアドバイスをいただいてなんとなく
イメージはできたのですがいまだにうまく動作することができません。

コード:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim path As String = "HelloWorldLibrary.dll"

        Dim asm As [Assembly]
        asm.LoadFrom(path)

        Dim objClass As New Object
        objClass = asm.CreateInstance("HelloWorldLibrary.Hello")

        Dim mi As MethodInfo = objClass.GetType.GetMethod("GetHello")

        Dim objInvoke As Object = mi.Invoke(objClass, Nothing)

        System.Windows.Forms.MessageBox.Show(objInvoke.ToString())


    End Sub




現在、テスト用のプログラムとして上記のようなプログラムを作成していますが、
objClass = asm.CreateInstance("HelloWorldLibrary.Hello")
の部分で
追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。
というエラーが表示されますが、原因と対応策がわかりません。

参照しているDLLにHelloWorldLibrary.Helloがあるのは確認をしています。
何かおかしいことをやっていると思いますが、
自力ではどうにもならなさそうなのでアドバイスを
いただけないでしょうか?

lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2006-01-19 20:05
引用:

objClass = asm.CreateInstance("HelloWorldLibrary.Hello")
の部分で
追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。
というエラーが表示されますが、原因と対応策がわかりません。
コード:
        Dim path As String = "HelloWorldLibrary.dll"

        Dim asm As [Assembly]
        asm.LoadFrom(path)





asmに代入してないような:
コード:
asm = [Assembly].LoadFrom(path)


とかじゃね?
lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2006-01-19 20:06
参考:
http://www.atmarkit.co.jp/fdotnet/dotnettips/386createinstance/createinstance.html
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-01-19 20:07
引用:

msoさんの書き込み (2006-01-19 19:42) より:
objClass = asm.CreateInstance("HelloWorldLibrary.Hello")
の部分で
追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。


とかかれてますが、間違ってるのはそこではなくて

asm.LoadFrom(path)

です。
LoadFromメソッドは静的メソッドなので、
本来は、
Assembly.LoadFrom(path)
です(asmはAssembly型の変数であるため、asm.でも呼び出せてしまいますが)。
で、戻り値がロードされたアセンブリなので、
asm = Assembly.LoadFrom(path)
としなければなりません。

msoさんのプログラムでは、asmに代入が行われてないので、null参照になったわけです。

ついでですが、メソッドの実行はInvokeなんか使うよりも、
何らかのインターフェイス辺りを規定して、DLLのクラスがインターフェイスを
実装するようにしたほうがいいです。

そうすれば、CreateInstanceでクラスのインスタンスを作成した後、
規定のインターフェイス方の変数で参照してやれば、あとは普通にメソッドなどを
実行できます(実行するメソッドはインターフェイスで規定しておく)。

スキルアップ/キャリアアップ(JOB@IT)