3

私はリフレクションがまったく初めてで、db レコードからクラス名を呼び出して、クラスをロードして実行しようとしていますが、間違っているところに髪を引っ張っています。おそらく本当にばかげたものです行方不明です。

例として、別のプロジェクトとスクリプト フォルダーにクラスを配置し、db レコードからその名前を呼び出します。

className = String.Format("Utilities.Scripts.{0}", script.ScriptClass);

それから私のメインプログラムで私は持っています

// Get a type from the string 
Type type = Type.GetType(className);

// Create an instance of that type
Object obj = Activator.CreateInstance(type);

// Retrieve the method you are looking for
MethodInfo methodInfo = type.GetMethod("start");

// Invoke the method on the instance we created above
methodInfo.Invoke(obj, null);

しかし、デバッグ時に GetType(className) に渡された詳細が表示されるため、エラーが発生していますが、型には何も渡されず、エラーが発生している obj にも渡されません。

4

2 に答える 2

3

クラスは別のプロジェクトにあるため、型のアセンブリ修飾名を指定する必要があります(ここで説明)。また、型を読み込もうとしているアセンブリが、読み込もうとしているアセンブリと同じフォルダーにあるか、GAC にあることを確認してください。

以下のように定義されたクラスの場合:

namespace Foo.Bar
{
    public class Class1
    {

    }
}

完全なクラス名はFoo.Bar.Class1. アセンブリ修飾名は、 のように、アセンブリの完全な名前も指定しFoo.Bar.Class1, Foo.Bar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35ます。次のようなもので、タイプのアセンブリ修飾名を見つけることができます。

Console.WriteLine(typeof(Foo.Bar.Class1).AssemblyQualifiedName)
于 2012-10-05T15:51:27.150 に答える
0

問題は次の行にあります。

Type type = Type.GetType(className);

この特定のメソッドのオーバーロードは、型を解決できないときに例外をスローしません。代わりに、2つのブール値をとるこのオーバーロードthrowOnErrorを使用してください。そのうちの1つはです。このパラメータにtrueを渡すと、渡した文字列からタイプを解決できない理由をデバッグするのに役立つ例外が発生します。

クラス名とアセンブリ名が必要だと思います

Utilities.Scripts.SomeClass, SomeAssemblyName
于 2012-10-08T13:02:25.780 に答える