0

次のようにクラスの型情報を解決しようとするアプリケーション ( System.Windows.Forms を参照する)にコードのスニペットがあります。Form

Type tForm = Type.GetType("System.Windows.Forms.Form");
dynamic instance = Activator.CreateInstance(tForm);

がnullでActivator.CreateInstanceあるため失敗します。tForm

これを解決するにはどうすればよいですか?

編集: 型は実行時に解決可能でなければなりません!

4

3 に答える 3

5

タイプのアセンブリ修飾名を使用する必要があります

Type tForm = Type.GetType("System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
于 2012-10-24T11:26:36.947 に答える
3

Type.GetType(string)渡された文字列にアセンブリ情報が含まれている場合、そこを調べます。それ以外の場合は、呼び出し元のアセンブリと他のいくつかのシステム アセンブリがチェックされます (おそらく System と mscorlib)。すべてのアセンブリをチェックするわけではありません。

したがって、いくつかのオプションがあります。

  • 文字列にアセンブリ情報を含めます。つまり、"Namespace.TypeName, AssemblyName"
  • use assembly.GetType(string)assemblyは正しいアセンブリです
  • 現在のにロードされているすべてのアセンブリを手動でループし、AppDomainそれぞれを順番にチェックします
于 2012-10-24T11:27:22.470 に答える
2

このジョンスキートの回答を確認してください:https://stackoverflow.com/a/3758295/314488

using System;
using System.Windows.Forms;

class Test
{
    static void Main()
    {
        string name = typeof(Form).AssemblyQualifiedName;
        Console.WriteLine(name);

        Type type = Type.GetType(name);
        Console.WriteLine(type);
    }
}
Output:

System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
System.Windows.Forms.Form

厳密な名前のアセンブリ (この場合は Form など) を使用している場合は、すべてのアセンブリ情報 (バージョン管理、公開キー トークンなど) を含める必要があることに注意してください。

于 2012-10-24T11:26:44.067 に答える