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

标签 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 类的新实例,尽管第二次创建这个实例可能是基于已经加载的程序集。

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

最佳答案

不,没有必要。

一旦加载到 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/

相关文章:

c# - ServiceProvider 不为 transient EF 上下文释放内存

c# - Entity Framework - C# 或 VB.Net

c# - 无法转换类型为 'Microsoft.Office.Interop.Outlook.ApplicationClass' {00063001-0000-0000-C000-000000000046} HRESULT : 0x80040155 的 COM 对象

.NET 签名程序集 - 如何防止有人删除签名

c# - .NET/C# - 反射帮助 - 程序集中的类

powershell - 如何管理 x86 和 x64 版本的 PowerShell 管理单元的开发

c# - 将字节数组转换为图像 : Parameter is not valid

c# - 使用在 Generic 类中创建的 Func<string> 调用时 RuntimeHelpers.PrepareMethod 不起作用

c# - 反射在C#中是如何实现的?

c# - 反序列化需要类型转换?