1

リフレクションを使用して実行時に型をロードしたい。手順は次のとおりです。

  1. を使用してアセンブリをロードしますAssembly.LoadFile(assemblyPath);
  2. GetTypeメソッドを使用して型を取得する
  3. Activator.CreateInstanceタイプのインスタンスを作成するために使用します。

以下は私のコードです:

Assembly assembly = Assembly.LoadFile(assemblyName);
Type type = assembly.GetType("RomanConerter.Converter");
object obj = Activator.CreateInstance(type);

私が直面している問題は、最後の行にあります。私のコンバーターには 1 つのメソッド名がありAddます。しかし、obj を使用してこのメ​​ソッドにアクセスすることはできません。

注:他のプロジェクトで読み込もうとしているアセンブリで、パスをコード化しました。

誰でも私を助けてくれますか?

4

7 に答える 7

2

動的これ:

dynamic obj = Activator.CreateInstance(type);
于 2012-10-10T10:43:22.633 に答える
1

これはすべて、型RomanConverter.Converterが呼び出し元のアプリケーション (つまり、投稿したコードを含む) で使用できるかどうかによって異なります。もしそうなら、あなたはただキャストするだけです。

そうでない場合は、(他の人が言ったように)dynamicリフレクションを使用してメソッドを遅延バインドするか、 を使用できますが、共通のベースまたはインターフェイスを使用する方がよいでしょう。

/* common interface used in both your code and the external DLL */
public interface ICanAdd {
  object Add(object source);
}

(ここはサインだと思います)

次に、このプラグインの種類を次のように変更します。

namespace RomanConverter {
  public class Converter : ICanAdd {
    object Add(object source){
      //TODO: implement
    }
  }
}

オブジェクトを取得したら、次のActivator.CreateInstanceようにキャストしICanAddます。

ICanAdd obj = (ICanAdd)Activator.CreateInstance(type);

これで、メソッドを呼び出すことができます。

于 2012-10-10T10:46:41.810 に答える
1

選択肢は 2 つあります。dynamicまたは、大量の反射です。

これを試して:

Assembly assembly = Assembly.LoadFile(assemblyName);
Type type = assembly.GetType("RomanConerter.Converter");
dynamic obj = Activator.CreateInstance(type);

obj.Add("stuff");
于 2012-10-10T10:43:39.500 に答える
1

リフレクションを使用したい場合は、次のように使用できます。

Type objType = obj.GetType();
objType.InvokeMember("Add", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod,
    null, obj, new object[] { /*comma-separated arguments here*/ });

ここでそれについて読むことができます:Type.InvokeMember

于 2012-10-10T10:46:40.233 に答える
0

これはいくつかの方法で実行できるようです。

  1. カスタム型にインターフェイスを実装し、コンパイル時にインターフェイスを使用できるようにします。
  2. キーワードを使用するdynamicと、問題のオブジェクトへの遅延バインディングが提供されます。
于 2012-10-10T10:47:23.117 に答える
0

動的を使用したくない (または以前のバージョンの C# を使用している) 場合は、いくつかのリフレクションを使用できます。これは、単純なメソッド呼び出しにはそれほど複雑ではありません。

obj.GetType().GetMethod("MethodName", System.Reflection.BindingFlags.Public |  System.Reflection.BindingFlags.Instance).Invoke(obj, null);
于 2012-10-10T10:48:12.590 に答える
0

作成している型に明示的にキャストする必要があります。

RomanConerter.Converter obj = (RomanConerter.Converter)Activator.CreateInstance(type);
于 2012-10-10T10:42:31.387 に答える