- - PR -
別プロジェクトのGetTypeについて
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-08-08 20:55
いつも参考にさせて頂いています。
WindowsフォームのAプロジェクト(Exe)とコントロールライブラリのBプロジェクト(DLL)が同じソリューションにあるとします。 Aプロジェクトからスタートアップをして、そのなかでBプロジェクトのフォームオブジェクトをType.GetTypeで取得したいのですが、取得できませんでした。 例)Dim typForm As Type = Type.GetType("B.FormTest", True, True) '文字列からType取得 Bで生成されたDLLを参照設定に追加していても無理でした。 まず一つ目の質問なのですが、GetTypeできないものなのでしょうか? エラーメッセージを見ると、Aプロジェクト内しか見ていない感じでした。 そこで、どぼんさんのページを参考にさせて頂き、アセンブリを指定して 例)Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile(B.DLLのフルパス) Dim typForm As Type = asm.GetType("B.FormTest", True, True) とする事で可能でした。 この方法でしか不可能なのであれば、もう一つ質問させて下さい。 参照設定しているDLLのフルパスの取得はどの様に行えば良いでしょうか? この後でInvokeMemberメソッドを使用して、CreateInstanceをしようとしていますが、 訳あってこの様な遠回りな方法をしていますが、あまり突っ込まないで下さい。 ちょっと分かりづらい質問になってしまって申し訳ありませんが、 よろしくお願い致します。 | ||||
|
投稿日時: 2005-08-08 21:05
Assemblyインスタンスの取得なら、一番手っ取り早いのは
もちろん参照設定されているという前提の元ですが。 [ メッセージ編集済み 編集者: Hongliang 編集日時 2005-08-08 21:06 ] | ||||
|
投稿日時: 2005-08-09 10:13
Hongliangさん、ご回答ありがとうございます。
申し訳ありませんが、もう少し詳しく教えて頂けないでしょうか? 以下の様にやってみたのですが、エラーになってしまいます。 Dim asm As System.Reflection.Assembly = Type.GetType("B.FormTest").Assembly Aのプロジェクトに対して、B.dllの参照設定もしています。 構文が間違っているのでしょうか? ご教授願います。 よろしくお願い致します。 | ||||
|
投稿日時: 2005-08-09 10:20
私が示したGetTypeは、C#ではtypeof構文で表される、一種の演算子です。
例えばSystem.StringのType型を取得するには Dim t as Type = GetType(System.String) と書きます。 | ||||
|
投稿日時: 2005-08-09 10:20
> Dim assem As Assembly = GetType(アセンブリに含まれる型).Assembly よく比べてみましょう。 | ||||
|
投稿日時: 2005-08-09 10:29
ご回答、ありがとうございます。
GetTypeの引数って、型を指定するはずですが、 今回は「アセンブリに含まれる型」の部分が文字列しか指定できません。 その為、最初の質問にある様に文字列からType.GetTypeしていました。 結局、最初の質問の一つ目は無理と言う事でしょうか? よろしくお願い致します。 | ||||
|
投稿日時: 2005-08-09 10:40
はぇ?
参照設定している以上、何らかのクラスは必ず指定できると思うのですが。 それこそ実装のないダミークラスを作るだけでも良い。 そうでなければ参照設定の意味が全くありません。 私が説明したGetTypeは飽くまでAssemblyインスタンスを取得するための手段であって、最終的に取得したいType型はAssembly.GetTypeで取得すればいいのです。 | ||||
|
投稿日時: 2005-08-09 10:46
ご回答、ありがとうございます。
なるほど、そうですね。 色々ヘルプを見て試していたのですが、 Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile(B.DLLのフルパス) ではなく、 Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.Load("B")にすれば良かったんですね。 ありがとうございました。 |