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

遅延バインディングについて

環境/言語:[VB.NET]
分類:[.NET]

.NET Tipsの「文字列で指定されたクラスのインスタンスを作成する」を
参考にしてDLLを起動するプログラムを作成しました。

通常のフォームは起動することは出来たのですが、
継承したフォームを同様に起動しようとするとエラーになります。

------------以下が呼び出しているコードです。------------

Dim Asm As System.Reflection.Assembly = _
System.Reflection.Assembly.LoadFile("D:\Test.Dll")

Dim t As Type = Asm.GetType("Test.Form1")

Dim target As Object = t.InvokeMember(Nothing, _
Reflection.BindingFlags.CreateInstance, _
Nothing, _
Nothing, _
Nothing)

t.InvokeMember("Show", _
Reflection.BindingFlags.InvokeMethod, _
Nothing, _
Target, _
Nothing)

--------------------------------------------------------

Dim t As Type = Asm.GetType("Test.Form1")

継承したフォームの場合はタイプを取得しようとしてNothingになっています。
同じDLLを継承させずに作成した場合は問題なく動きます。

継承したフォームは遅延バインディングで呼び出すことが出来ないのでしょうか?
回避策などがあれば教えてもらえないでしょうか。
お願いします。
まずは、そのDLLに指定した名前のTypeが確実に存在するか確認してください。「アセンブリ内のすべての型を取得する」のような方法で調べてみると分かりやすいのではないかと思います。

DOBON.NET .NET Tips - アセンブリ内のすべての型を取得する
http://dobon.net/vb/dotnet/programing/assemblygettypes.html
言われたように「アセンブリ内のすべての型を取得する」を使用して
Typeが存在しているか見たところ継承したフォームの場合Typeが一つも
取れていませんでした。

それで呼び出すAPで親フォームを参照設定して継承したフォームを呼び出すよう
にしたら呼べるようには、なりました。

参照設定しているDLLをプログラムでロードする方法ってないんでしょうか?
お手数かけますがよろしくお願いします。
継承フォームだから取得できないということはまずありません。別の理由があると思います。

しつこいようですが、まずはD:\Test.Dll内に本当にその型が存在しているのか確かめてください。参照設定しているのはD:\Test.Dllでなく、プロジェクトフォルダ内の別のDLLということはありませんか?また、型名は確実ですか?
書き忘れました。参照しているアセンブリは、Assembly.GetReferencedAssembliesメソッドで取得できます。
D:\Test.Dll内にTYPEは存在していません。

分かりにくいので名前を変えてみて実行して
以下のような結果になります。

親DLL OYA.DLL
子DLL KO.DLL

KO.DLLをロードするのにOYA.DLLを参照設定して
呼び出すと呼び出しに成功します。

KO.DLLをロードするのにOYA.DLLを参照設定せずに
呼び出すと呼び出しに失敗します。

子DLLを呼び出す時には親DLLを参照設定して呼び出すというのが
普通なのでしょうか?
よく分かってなくてすいません・・・
> 子DLLを呼び出す時には親DLLを参照設定して呼び出すというのが
> 普通なのでしょうか?

普通でも異常でもありません。

OYA.DLL と KO.DLL に「どんな関係があるか」によって変わります。
申し訳ありませんが、意味が全く分からなくなってしまいました。

> D:\Test.Dll内にTYPEは存在していません。

それではどこにあるのでしょうか?

> KO.DLLをロードするのにOYA.DLLを参照設定して
> 呼び出すと呼び出しに成功します。

何を呼び出すのでしょうか?またこの呼び出しは静的でしょうか、動的でしょうか?
> 継承したフォームの場合はタイプを取得しようとしてNothingになっています。

まさかとは思うけど、Test.Form1 クラスを public にしてないとか。
> まさかとは思うけど、Test.Form1 クラスを public にしてないとか。

publicでなくても取得できると思います。やはり、ただ単に指定したDLL内に指定した名前の型がないということが一番疑わしいのではないでしょうか。
>>まさかとは思うけど、Test.Form1 クラスを public にしてないとか。
>
> publicでなくても取得できると思います。

のはずですよねー
やっぱり .dll を取り違えているかなんかして、型が存在してないのかな。

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