在插件系统中,我实例化对象并根据一些具有一些标识符(只是一个字符串)的传入请求调用这些对象的方法。在配置的帮助下,此标识符确定要加载的程序集,此程序集中要实例化的哪个类以及要调用的方法。程序集将加载到单独的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类实例,尽管第二次创建实例可能是基于已加载的程序集。
我想补充一个问题:为给定的装配体创建装配对象是否需要一些反射,因此无论装配是否加载,都要花费很多?
答案 0 :(得分:1)
不,没有必要。
加载到AppDomain后,可以使用底层AppDomain对象的GetAssemblies()方法访问程序集,该对象返回任何已加载/可用的程序集,s:http://msdn.microsoft.com/en-US/library/system.appdomain.getassemblies.aspx
卸载一个或多个程序集的唯一方法是使用同一类的静态Unload()方法卸载AppDomain。