-1

いくつかのメソッド(たとえば、Method1、Method2、Method3)を持つクラスがあり、各メソッド内でアセンブリ(各メソッドに同じもの)をロードし、次のような特定のメソッド(リフレクション)を呼び出します。

void Method1() // error handling etc. omitted
{
    Assembly asm = Assembly.LoadFrom(path);

    Type type = asm.GetType(classname);
    MethodInfo methodInfo = type.GetMethod("MethodName", ...);
    var o = Activator.CreateInstance(type); 
    var result = methodInfo.Invoke(o, parameters);
}

これらすべてのメソッドが同じアセンブリをロードする場合、この方法でリフレクションを実行してもパフォーマンス的には問題ありませんか?コードは次のようになります。

obj.Method1(); // calls Assembly.Load()
obj.Method2(); // calls Assembly.Load()
obj.Method3(); // calls Assembly.Load()

または、アセンブリ(および場合によってはGetType)を別のメソッドに1回だけロードし、クラスAssemblyプロパティへの参照を格納し、メソッド(Method1、Method2、Method3 ..)内で、常にAssemblyを呼び出す代わりにこの参照を使用することをお勧めします。ロード()?このように、コードは次のようになります。

obj.LoadMyAssembly(); // calls Assembly.Load() and uses obj.MyAssembly property to store the reference
obj.Method1() // doesn't call Assembly.Load(), uses obj.MyAssembly instead
obj.Method2() // doesn't call Assembly.Load(), uses obj.MyAssembly instead
obj.Method3() // doesn't call Assembly.Load(), uses obj.MyAssembly instead

違いはありますか?ドメインなどは、コード内で変更(または使用)されることはありません。

4

2 に答える 2

1

アセンブリは同じコンテキストでロードされるため、大きな違いはありません。次に、アセンブリがすでにロードされている場合は、呼び出しても再ロードされませんAssembly.LoadFrom(path);

ただし、すべてのメソッドが同じアセンブリ内にあることがすでにわかっている場合は、1回だけ呼び出す方がよい場合がありますAssembly.LoadFrom

于 2013-01-30T15:19:14.663 に答える
1

私の知る限り、同じアセンブリを複数回ロードしても、パフォーマンスの問題は発生しません。しかし、あなたの方法を調べてください、

var o = Activator.CreateInstance(type); 

この型のオブジェクトの間違いなく新しいインスタンスで、メンバーメソッドを呼び出しています。

問題は発生しないかもしれませんが、冗長な動作ですよね。私はただ無駄にしていると思います、そしてあなたのヒープに集めるためにゴミを増やしてください。

于 2013-01-30T15:48:52.213 に答える