- PR -

Type.GetType アセンブリはロードされていない?

投稿者投稿内容
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2007-02-21 16:11
引用:

未記入さんの書き込み (2007-02-21 16:04) より:
実行するJediMasterChildにロードされていればよいだろうと考え、上のソースになりました。

#考え方が正しいとしたら、なぜ動かないのか。。。



引用:

アセンブリがその時点でロード済みかどうかは通常は意識するべきではないし、
ロード済みだという判断だけで、アセンブリを指定しないType.GetTypeを使用しても正しく動作しません。


考え方が間違っています。
参照先の記事もおそらく間違っています、もしくはかなり誤解を招く表現をしています。

Type.GetType()は、ロード済みのアセンブリからTypeを取得するメソッドではありません。
直接の呼び出し元のアセンブリ(まさにType.GetType()と記述しているコードを含むアセンブリ)か、mscorlibアセンブリからTypeを取得します。

これらのアセンブリは、Type.GetTypeを呼び出す時点で必ずロード済みですので、
未ロードだったためロードできない、という状況は起こりえません。

何度も言いますが、アセンブリ名を明示的に指定したType.GetTypeか、
アセンブリ名を指定したAssembly.LoadとAssemblyGetTypeの組み合わせで使ってください。
未記入
会議室デビュー日: 2004/08/31
投稿数: 12
投稿日時: 2007-02-22 17:18
引用:

なちゃさんの書き込み (2007-02-21 16:11) より:
Type.GetType()は、ロード済みのアセンブリからTypeを取得するメソッドではありません。
直接の呼び出し元のアセンブリ(まさにType.GetType()と記述しているコードを含むアセンブリ)か、mscorlibアセンブリからTypeを取得します。




理解できました。ありがとうございました。


また、[Assembly]を調べていて、実行プロセスのアセンブリを取得することができることを知りました。
インスタンス生成処理を実装しているクラスを下記に変更することで目的の動作を実装できました。

コード:
Public MustInherit Class JediMasterParent
    Public Function Create(ByVal className As String) As JediClass
        'Dim masterType As Type = Type.GetType(className)
        '実行プロセスの Assemblyを取得
        Dim asm As [Assembly] = [Assembly].GetEntryAssembly()
        'タイプ取得 
        Dim masterType As Type = asm.GetType(className)
        'インスタンス生成
        Dim instance As Object = Activator.CreateInstance(masterType)
        'キャスト
        Dim Jedi As JediClass = CType(instance, JediClass)
        Return Jedi
    End Function
End Class


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