2010-12-21 49 views
3

在插件系统中,我实例化对象并根据某些具有某种标识符(仅为字符串)的传入请求调用这些对象的方法。在配置的帮助下,该标识符确定要装入哪个程序集,此程序集中要实例化哪个类以及要调用哪个方法。程序集加载到一个单独的AppDomain中。这发生在该像这样创建一个代理类:维护对Assembly对象的引用以避免不必要的Assembly.LoadFrom调用是好的还是坏主意?

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.LoadFrom的第一个电话后装直到AppDomain被卸载。 (第二个AppDomain的寿命与我的情况一样长。)那么这是否意味着对Assembly.LoadFrom的第二次调用是便宜的,就像字典查找一样便宜或几乎一样便宜?还是它有缺点不调用assembly.LoadFrom并使用保存的引用呢?

(我的感觉是,它并没有真正的问题,除非我有我没有很高的性能要求(每15秒大约一个请求),但我可能是错的。)

谢谢你提前反馈!

编辑:

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

我想补充一个问题:是否为给定装配创建装配对象需要一些沉重的反射,因此总是很昂贵,无论装配是否加载?

+1

CLR已经这样做了。 – 2010-12-21 21:23:21

回答

相关问题