- PR -

別プロジェクトのGetTypeについて

投稿者投稿内容
koseki
ベテラン
会議室デビュー日: 2002/08/01
投稿数: 93
投稿日時: 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をしようとしていますが、
訳あってこの様な遠回りな方法をしていますが、あまり突っ込まないで下さい。
ちょっと分かりづらい質問になってしまって申し訳ありませんが、
よろしくお願い致します。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-08-08 21:05
Assemblyインスタンスの取得なら、一番手っ取り早いのは
コード:
Dim assem As Assembly = GetType(アセンブリに含まれる型).Assembly

です。
もちろん参照設定されているという前提の元ですが。

[ メッセージ編集済み 編集者: Hongliang 編集日時 2005-08-08 21:06 ]
koseki
ベテラン
会議室デビュー日: 2002/08/01
投稿数: 93
投稿日時: 2005-08-09 10:13
Hongliangさん、ご回答ありがとうございます。

申し訳ありませんが、もう少し詳しく教えて頂けないでしょうか?

以下の様にやってみたのですが、エラーになってしまいます。
Dim asm As System.Reflection.Assembly = Type.GetType("B.FormTest").Assembly
Aのプロジェクトに対して、B.dllの参照設定もしています。

構文が間違っているのでしょうか?
ご教授願います。

よろしくお願い致します。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-08-09 10:20
私が示したGetTypeは、C#ではtypeof構文で表される、一種の演算子です。
例えばSystem.StringのType型を取得するには
Dim t as Type = GetType(System.String)
と書きます。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2005-08-09 10:20
引用:

kosekiさんの書き込み (2005-08-09 10:13) より:

Dim asm As System.Reflection.Assembly = Type.GetType("B.FormTest").Assembly


> Dim assem As Assembly = GetType(アセンブリに含まれる型).Assembly
よく比べてみましょう。
koseki
ベテラン
会議室デビュー日: 2002/08/01
投稿数: 93
投稿日時: 2005-08-09 10:29
ご回答、ありがとうございます。

GetTypeの引数って、型を指定するはずですが、
今回は「アセンブリに含まれる型」の部分が文字列しか指定できません。
その為、最初の質問にある様に文字列からType.GetTypeしていました。

結局、最初の質問の一つ目は無理と言う事でしょうか?

よろしくお願い致します。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-08-09 10:40
はぇ?
参照設定している以上、何らかのクラスは必ず指定できると思うのですが。
それこそ実装のないダミークラスを作るだけでも良い。
そうでなければ参照設定の意味が全くありません。

私が説明したGetTypeは飽くまでAssemblyインスタンスを取得するための手段であって、最終的に取得したいType型はAssembly.GetTypeで取得すればいいのです。
koseki
ベテラン
会議室デビュー日: 2002/08/01
投稿数: 93
投稿日時: 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")にすれば良かったんですね。

ありがとうございました。

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