2

.DLL ファイルを動的にロードしてそのメソッドの 1 つを実行しようとしています (実際にはメソッドは 1 つしかありません..) が、Activator.CreateInstance メソッドは「抽象クラスを作成できません」という例外をドロップします。これは私のコードです:

Assembly assembly = Assembly.Load(DLLByteArray);
//Type typeToExecute = assembly.GetType("ClassLibrary1.Class1");
//last line was replaced with the next one to ensure that the name is correct.
Type typeToExecute = assembly.GetTypes()[0];
Object instance = Activator.CreateInstance(typeToExecute);

必要に応じてクラスの減速: " public static unsafe class Class1"。

.DLL クラス コードの何かがこの種の例外を引き起こす可能性はありますか?

4

2 に答える 2

9

あなたがやろうとしていること:

Assembly assembly = Assembly.Load(DLLByteArray);
Type typeToExecute = assembly.GetTypes()[0];
typeToExecute.GetMethod("TheMethod").Invoke(null, theArguments);

object[]これにより、すべてのメソッド引数を含む (theArguments) を使用して静的メソッドが呼び出されます

staticもう1つの解決策は、クラスとメソッドからキーワードを削除することです(これにより、現在のコードが機能します)

于 2011-08-21T08:13:53.877 に答える
5

静的クラスのインスタンスを作成しようとしています。それはできません-コンストラクターがありません(静的クラスは抽象的であり、封印されています)。

これに関するメッセージは非常に明確です:「抽象クラスを作成できません」。

なぜこのクラスのインスタンスを作成しようとしたのですか? メソッドを呼び出したいと言っていますが、なぜインスタンスを作成する必要があると思いましたか? 新しいインスタンスを作成できたとしても、静的メソッドを呼び出すためにそうすべきではありません。そうでなければ、静的クラスに配置できなかったので、メソッドは静的であると想定しています...

リフレクションを使用するときは、正確に何をしたいのかを慎重に検討する必要があります。無意味なことをしているとき、コンパイラはそれを見つけることができないからです。リフレクションがなければ、次のことができたはずです。

// Fails at compile-time
new ClassLibrary1.Class1().WhateverMethod();

リフレクションを使用している場合は、コンパイラのように考える必要があります。コンパイラはそれを行うことができないためです。

于 2011-08-21T08:09:16.247 に答える