Assembly.Load()在同一个类中的多个方法中加载相同的程序集 - 最佳与否?

时间:2013-01-30 15:15:00

标签: c# .net reflection assembly.load

我有一个包含多种方法的类(例如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),将引用存储到类Assembly属性和内部方法(Method1,Method2,Method3 ..)中使用此引用而不是总是调用Assembly.Load()?这样,代码看起来像:

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

它有什么不同吗?在代码中永远不会更改(甚至使用)域等。

2 个答案:

答案 0 :(得分:1)

没有太大的区别,因为程序集将在相同的上下文中加载。然后,如果已加载程序集,即使您调用Assembly.LoadFrom(path);

,也不会重新加载它

但是,如果您已经知道所有方法都在同一个程序集中,那么最好只调用Assembly.LoadFrom一次。

答案 1 :(得分:1)

据我所知,多次加载同一个程序集不会导致性能问题。 但是,看看你的方法,有

var o = Activator.CreateInstance(type); 

您正在调用一个成员方法,肯定是该类型的对象的新实例。

虽然它可能不会引起问题,但只是一种冗余行为,不是吗? 我认为只是浪费,并增加垃圾收集在你的堆上。