gpt4 book ai didi

c# - 维护对 Assembly 对象的引用以避免不必要的 Assembly.LoadFrom 调用是好还是坏?

转载 作者:行者123 更新时间:2023-11-30 18:06:47 24 4
gpt4 key购买 nike

在一个插件系统中,我根据一些传入的请求实例化对象并调用这些对象的方法,这些请求具有一些标识符(只是一个字符串)。在配置的帮助下,此标识符确定要加载哪个程序集、要实例化该程序集中的哪个类以及要调用哪个方法。这些程序集被加载到一个单独的 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 类的新实例,尽管第二次创建这个实例可能是基于已经加载的程序集。

我想补充一个问题:为给定的程序集创建一个程序集对象是否需要大量的反射,因此无论程序集是否加载,它总是很昂贵?

最佳答案

不,没有必要。

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

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

关于c# - 维护对 Assembly 对象的引用以避免不必要的 Assembly.LoadFrom 调用是好还是坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4503900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com