保持对Assembly对象的引用以避免不必要的Assembly.LoadFrom调用是一个好主意还是坏主意?

时间:2010-12-21 21:06:15

标签: c# .net assemblies assembly-loading

在插件系统中,我实例化对象并根据一些具有一些标识符(只是一个字符串)的传入请求调用这些对象的方法。在配置的帮助下,此标识符确定要加载的程序集,此程序集中要实例化的哪个类以及要调用的方法。程序集将加载到单独的AppDomain中。这发生在代理类中,如下所示:

secondDomain.CreateInstanceFromAndUnwrap(Assembly.GetExecutingAssembly().CodeBase,
    typeof(SecondDomainProxy).FullName) as SecondDamainProxy;

在类SecondDomainProxy中,我加载了与上面提到的identifier相关的程序集:

string assemblyFileName = GetAssemblyFileNameFromConfig(identifier);
Assembly assembly = Assembly.LoadFrom(assemblyFileName);
// Instantiate and run something in assembly

问题:加载程序集后,对此Assembly对象的引用是否有意义?例如,使用词典......

Dictionary<string, Assembly> _assemblyDict;

...并将上面的代码更改为:

Assembly assembly;
if (!_assemblyDict.TryGetValue(identifier, out assembly))
{
    string assemblyFileName = GetAssemblyFileNameFromConfig(identifier);
    assembly = Assembly.LoadFrom(assemblyFileName);
    _assemblyDict[identifier] = assembly;
}
// Instantiate and run something in assembly

我知道在第一次调用Assembly.LoadFrom之后加载程序集,直到卸载AppDomain。 (在我的情况下,第二个AppDomain和主应用程序一样长。)那么这是否意味着对Assembly.LoadFrom的第二次调用是便宜的,便宜或几乎和字典查找一样便宜?或者它是否有缺点不调用assembly.LoadFrom并使用保存的引用?

(我的感觉是,除非我有高性能要求,否则它并不重要(大约每15秒一次请求)。但我可能错了。)

提前感谢您的反馈!

修改

Assembly是一个“普通”的.NET类。我想,如果我没有对这个类的实例的任何引用,就会收集垃圾。但是组件本身仍然保持加载状态。所以Assembly.LoadFrom至少需要创建一个新的Assembly类实例,尽管第二次创建实例可能是基于已加载的程序集。

我想补充一个问题:为给定的装配体创建装配对象是否需要一些反射,因此无论装配是否加载,都要花费很多?

1 个答案:

答案 0 :(得分:1)

不,没有必要。

加载到AppDomain后,可以使用底层AppDomain对象的GetAssemblies()方法访问程序集,该对象返回任何已加载/可用的程序集,s:http://msdn.microsoft.com/en-US/library/system.appdomain.getassemblies.aspx

卸载一个或多个程序集的唯一方法是使用同一类的静态Unload()方法卸载AppDomain。