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

本文关键字:程序集 加载 最佳 方法 一类 Load Assembly | 更新日期: 2023-09-27 17:56:45

我有一个包含多个方法(例如 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

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

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

没有太大区别,因为程序集将在同一上下文中加载。然后,如果程序集已加载,则即使您调用 Assembly.LoadFrom(path); 也不会重新加载它

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

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

var o = Activator.CreateInstance(type); 

您正在该类型的对象的新实例上调用成员方法。

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