C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: Type.GetType でタイプが取得できない


(過去ログ 63 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■36296 / inTopicNo.1)  Type.GetType でタイプが取得できない
  
□投稿者/ tailer (1回)-(2009/05/26(Tue) 23:10:32)

分類:[VB.NET/VB2005 以降] 

次のようなソリューションがあります。

Sol1 ┬ Prj1 ─ Class1
   └ Prj2 ┬ Class2
       └ (参照設定:Class1)

ここで、

Public Class2
    Private Sub sub1
        Dim myType As Type = Type.GetType("Class1")
        Dim cls1 As New Class1
    End Sub
End Class

というソースを書きました。
これを実行すると、cls1インスタンスは正常に生成されます。ところが、
myTypeにはNothingしか入りません。本当はClass1のタイプがセットされて
ほしいのですが…
なぜでしょう?

引用返信 編集キー/
■36298 / inTopicNo.2)  Re[1]: Type.GetType でタイプが取得できない
□投稿者/ 鶏唐揚 (336回)-(2009/05/26(Tue) 23:19:16)
No36296 (tailer さん) に返信
Type.GetTypeのtypeNameはFullNameが要求されますので
名前空間を足してやってください
引用返信 編集キー/
■36300 / inTopicNo.3)  Re[2]: Type.GetType でタイプが取得できない
□投稿者/ Hongliang (393回)-(2009/05/26(Tue) 23:32:46)
> Type.GetTypeのtypeNameはFullNameが要求されますので
> 名前空間を足してやってください
自分自身のアセンブリおよび mscorlib 内のクラス以外なら、アセンブリ名までを含んだ完全限定名(AssemblyQualifiedName)が必要です。
プロジェクトが違うってことは自分自身のアセンブリじゃないんで、完全限定名が必須ですね。
引用返信 編集キー/
■36335 / inTopicNo.4)  Re[3]: Type.GetType でタイプが取得できない
□投稿者/ tailer (2回)-(2009/05/27(Wed) 15:37:23)
構成図で、1箇所誤りがありました。

Sol1 ┬ Prj1 ─ Class1
   └ Prj2 ┬ Class2
       │ (参照設定:Class1) ×
       └ (参照設定:Prj1)   ○

ご指摘ですが、

Dim myType As Type = Type.GetType("Prj1.Class1")

こういうことでしょうか?これも、結果は同じでした。
関係ないかもしれないんですが、

Dim asm As Reflection.Assembly = Reflection.Assembly.LoadFrom("Class1.exe のフルパス")

をプロシージャー冒頭に入れたんですが、変わりませんでした。(でもこれは、目的のクラスのある
プロジェクトが参照設定で参照されていれば、本来必要ないんですよね?)

引用返信 編集キー/
■36339 / inTopicNo.5)  Re[1]: Type.GetType でタイプが取得できない
□投稿者/ 魔界の仮面弁士 (1092回)-(2009/05/27(Wed) 16:20:07)
No36296 (tailer さん) に返信
> Dim myType As Type = Type.GetType("Class1")
> Dim cls1 As New Class1
myType = GetType(Class1) にすれば済むような気がします。
あるいは、myType = cls1.GetType() とか。


> myTypeにはNothingしか入りません。本当はClass1のタイプがセットされて
> ほしいのですが…
No36300 で Hongliang さんが書かれていますように、
 cls1.GetType().AssemblyQualifiedName
に相当する文字列を指定した場合も駄目ですか?
引用返信 編集キー/
■36341 / inTopicNo.6)  Re[2]: Type.GetType でタイプが取得できない
□投稿者/ tailer (3回)-(2009/05/27(Wed) 16:46:12)
No36339 (魔界の仮面弁士 さん) に返信
> ■No36296 (tailer さん) に返信
>>Dim myType As Type = Type.GetType("Class1")
>>Dim cls1 As New Class1
> myType = GetType(Class1) にすれば済むような気がします。
> あるいは、myType = cls1.GetType() とか。

myType = GetType(Prj1.Class1)

と書くと、myTypeは取得できました。
ただ、このsub1は、もっというと

Public Class2
    Private Sub sub1(ByVal typeName As String)
        Dim myType As Type = Type.GetType(typeName)
        Dim anyInstance As Object = Activator.CreateInstance(myType)
    End Sub
End Class

という具合に、文字列で受け取った型名のクラスをインスタンス化する、という処理なんです。
なので、指定文字列から型名を取得したいのです。

> 
> 
>>myTypeにはNothingしか入りません。本当はClass1のタイプがセットされて
>>ほしいのですが…
> No36300 で Hongliang さんが書かれていますように、
>  cls1.GetType().AssemblyQualifiedName
> に相当する文字列を指定した場合も駄目ですか?

はい、その文字列が、"Prj1.Class1"でした。

引用返信 編集キー/
■36344 / inTopicNo.7)  Re[3]: Type.GetType でタイプが取得できない
□投稿者/ 魔界の仮面弁士 (1093回)-(2009/05/27(Wed) 17:34:13)
No36341 (tailer さん) に返信
>>No36300 で Hongliang さんが書かれていますように、
>> cls1.GetType().AssemblyQualifiedName
>>に相当する文字列を指定した場合も駄目ですか?
> はい、その文字列が、"Prj1.Class1"でした。

あれ?

 'Object 型を調べた場合
 FullName = "System.Object"
 AssemblyQualifiedName = "System.Object, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

 'Class1 を調べた場合
 FullName = "Proj1.Class1"
 AssemblyQualifiedName = "Proj1.Class1, アセンブリ名" もしくは
 AssemblyQualifiedName = "Proj1.Class1, アセンブリ名, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"

などになりませんでしたか?
引用返信 編集キー/
■36356 / inTopicNo.8)  Re[4]: Type.GetType でタイプが取得できない
□投稿者/ tailer (4回)-(2009/05/27(Wed) 21:18:10)
No36344 (魔界の仮面弁士 さん) に返信
> ■No36341 (tailer さん) に返信
>  'Class1 を調べた場合
>  FullName = "Proj1.Class1"
>  AssemblyQualifiedName = "Proj1.Class1, アセンブリ名" もしくは
>  AssemblyQualifiedName = "Proj1.Class1, アセンブリ名, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
> 
> などになりませんでしたか?

はい、メッセージボックスでAssemblyQualifiedNameを見たところ
 
 "Proj1.Class1, Class1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"

といった表現になりました。完全名は、一番最初の "Proj1.Class1" ですよね?
これを使って Type.GetType したんです。

引用返信 編集キー/
■36358 / inTopicNo.9)  Re[5]: Type.GetType でタイプが取得できない
□投稿者/ Hongliang (398回)-(2009/05/27(Wed) 21:27:42)
> 自分自身のアセンブリおよび mscorlib 内のクラス以外なら、アセンブリ名までを含んだ完全限定名(AssemblyQualifiedName)が必要です。
>プロジェクトが違うってことは自分自身のアセンブリじゃないんで、完全限定名が必須ですね。
「アセンブリ名までを含んだ」完全限定名が必要です。
// MS の日本語資料的には「アセンブリ修飾型名」辺りが定訳になってるのかな?
自分以外のアセンブリにある型の場合、アセンブリ情報は必須です。
引用返信 編集キー/
■36359 / inTopicNo.10)  Re[5]: Type.GetType でタイプが取得できない
□投稿者/ 魔界の仮面弁士 (1096回)-(2009/05/27(Wed) 21:29:00)
No36356 (tailer さん) に返信
> はい、メッセージボックスでAssemblyQualifiedNameを見たところ
>  "Proj1.Class1, Class1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
> といった表現になりました。完全名は、一番最初の "Proj1.Class1" ですよね?

もしかして、
 Type.GetType("Proj1.Class1, Class1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")
ではなく、
 Type.GetType("Proj1.Class1")
と指定していた、ということですか?

引用返信 編集キー/
■36380 / inTopicNo.11)  Re[3]: Type.GetType でタイプが取得できない
□投稿者/ biac (106回)-(2009/05/28(Thu) 10:34:56)
biac さんの Web サイト
No36341 (tailer さん) に返信
> Private Sub sub1(ByVal typeName As String)
> Dim myType As Type = Type.GetType(typeName)
> Dim anyInstance As Object = Activator.CreateInstance(myType)
> End Sub

> という具合に、文字列で受け取った型名のクラスをインスタンス化する、という処理なんです。

そして、 目的のクラスは別のアセンブリに入っている、 と。
で、 たぶん、 そのアセンブリは、 この sub1() 実行時には (というか、アプリケーション起動時に) 読み込み済みなのではありませんか?
それなら、 AppDomain.CurrentDomain.GetAssemblies() を使って読み込まれているアセンブリを全部列挙して、 それぞれで GetType() してみればよいのでは?

…って、 ぴったりのサンプルコードが、 日本語サイトでは見つからん。 なぜだ〜? f(^^;
英文だけど、 このへん↓とか見てやってください。
http://csharpfeeds.com/post/6142/Dynamic_Type_Invokation_in_.NET.aspx
> CSharp Feeds: Dynamic Type Invokation in .NET
※ このページ内の "Invoking by String" のところ。
引用返信 編集キー/
■36381 / inTopicNo.12)  Re[6]: Type.GetType でタイプが取得できない
□投稿者/ tailer (5回)-(2009/05/28(Thu) 10:36:32)
No36359 (魔界の仮面弁士 さん) に返信
> ■No36356 (tailer さん) に返信
>>はい、メッセージボックスでAssemblyQualifiedNameを見たところ
>> "Proj1.Class1, Class1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
>>といった表現になりました。完全名は、一番最初の "Proj1.Class1" ですよね?
>
> もしかして、
>  Type.GetType("Proj1.Class1, Class1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")
> ではなく、
>  Type.GetType("Proj1.Class1")
> と指定していた、ということですか?
>

はい、Type.GetType("Proj1.Class1") と指定していました。

Type.GetType("Proj1.Class1, Class1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")

でないとダメだったんですね。Type.GetType("System.String") は取得できたので、Type.GetType("Proj1.Class1") も当然取得できると
思っていました。いったい何が違うんでしょう??よくわかりません。。

とりあえず、解決しました。
ありがとうございます。
引用返信 編集キー/
■36387 / inTopicNo.13)  Re[7]: Type.GetType でタイプが取得できない
□投稿者/ Hongliang (399回)-(2009/05/28(Thu) 11:14:35)
> Type.GetType("System.String") は取得できたので、Type.GetType("Proj1.Class1") も当然取得できると
> 思っていました。いったい何が違うんでしょう??よくわかりません。。

> 自分自身のアセンブリおよび mscorlib 内のクラス以外なら
って書いてますやん。
引用返信 編集キー/
■36423 / inTopicNo.14)  Re[4]: Type.GetType でタイプが取得できない
□投稿者/ tailer (7回)-(2009/05/28(Thu) 19:26:28)
解決しました
解決済み
引用返信 編集キー/
■36430 / inTopicNo.15)  Re[5]: Type.GetType でタイプが取得できない
□投稿者/ なちゃ (285回)-(2009/05/28(Thu) 21:37:53)
>で、 たぶん、 そのアセンブリは、 この sub1() 実行時には (というか、アプリケーション起動時に) 読み込み済みなのではありませんか?
>それなら、 AppDomain.CurrentDomain.GetAssemblies() を使って読み込まれているアセンブリを全部列挙して、 それぞれで GetType() してみればよいのでは?

こういうやり方はあんまりお薦めではないですね。
そのうち読み込んでないアセンブリを対象にしようとしてはまりそうな気がします。

あと、厳密にバージョン管理を行っていないのであれば、
Type.GetType("Proj1.Class1, Class1")
でいいと思います(あえて指定する意味はないので)。

※"Proj1.Class1, Proj1" じゃなくて "Proj1.Class1, Class1" なのがなんか気になるなぁ…

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -