- - PR -
DLLを動的に使いたい
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-01-13 01:07
msoです。
現在、VisualStudio2003+VB.NETで開発を行っております。 悩んでいることがあり、どのようにすれば現実にすることが できるのか相談にのってください。 1:EXEと同じところに複数のDLLを設置します。 2:DBにクラス名を登録し、EXEから取得する。 3:DBから取得したクラス名のDLLを動的に参照し、 NewしてDLLの中のクラスのメソッドを実行する。 現状、いろいろと調べているのですがうまくできていません。 何か方向性だけでも良いのでアドバイスをいただけないでしょうか? よろしくおねがいします。 | ||||||||||||
|
投稿日時: 2006-01-13 01:38
System.Refrection.Assembly.Load〜 などで、アセンブリを Load します。 このアセンブリの型を取得し、Invoke してください。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-01-13 02:30
どういうことを目的とされているかは質問文からはわかりませんが、もしかしたらEnterprise Libraryが使えるかもしれません。 XMLに記述されているクラス名とアセンブリ名から動的にDLLを選択して、そのなかのプログラムを呼び出す部分がありますので、使えなくてもかなり参考にはなると思います。 以下のリンクからソースもダウンロードできます。 このコードはかなり勉強になりますよ。 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag2/html/entlib.asp?frame=true _________________ たつごろー codeseek こみゅぷらす | ||||||||||||
|
投稿日時: 2006-01-13 08:25
Pluginを作りたいのだと解釈しました。
DOBONさんのところで詳しくやさしく解説されています。 http://dobon.net/vb/dotnet/programing/plugin.html PluginInfo.FindPluginsの
の部分を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 ] | ||||||||||||
|
投稿日時: 2006-01-19 19:42
msoです。
皆様からアドバイスをいただいてなんとなく イメージはできたのですがいまだにうまく動作することができません。
現在、テスト用のプログラムとして上記のようなプログラムを作成していますが、 objClass = asm.CreateInstance("HelloWorldLibrary.Hello") の部分で 追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。 というエラーが表示されますが、原因と対応策がわかりません。 参照しているDLLにHelloWorldLibrary.Helloがあるのは確認をしています。 何かおかしいことをやっていると思いますが、 自力ではどうにもならなさそうなのでアドバイスを いただけないでしょうか? | ||||||||||||
|
投稿日時: 2006-01-19 20:05
asmに代入してないような:
とかじゃね? | ||||||||||||
|
投稿日時: 2006-01-19 20:06
参考:
http://www.atmarkit.co.jp/fdotnet/dotnettips/386createinstance/createinstance.html | ||||||||||||
|
投稿日時: 2006-01-19 20:07
とかかれてますが、間違ってるのはそこではなくて asm.LoadFrom(path) です。 LoadFromメソッドは静的メソッドなので、 本来は、 Assembly.LoadFrom(path) です(asmはAssembly型の変数であるため、asm.でも呼び出せてしまいますが)。 で、戻り値がロードされたアセンブリなので、 asm = Assembly.LoadFrom(path) としなければなりません。 msoさんのプログラムでは、asmに代入が行われてないので、null参照になったわけです。 ついでですが、メソッドの実行はInvokeなんか使うよりも、 何らかのインターフェイス辺りを規定して、DLLのクラスがインターフェイスを 実装するようにしたほうがいいです。 そうすれば、CreateInstanceでクラスのインスタンスを作成した後、 規定のインターフェイス方の変数で参照してやれば、あとは普通にメソッドなどを 実行できます(実行するメソッドはインターフェイスで規定しておく)。 |