【问题标题】:Can the .NET MethodInfo cache be cleared or disabled?.NET MethodInfo 缓存可以清除或禁用吗?
【发布时间】:2011-03-05 04:04:36
【问题描述】:

根据MSDN,调用Type.GetMethods() 会将反射的方法信息存储在MemberInfo 缓存中,因此不必再次执行昂贵的操作。

我有一个扫描程序集/类型的应用程序,寻找与给定规范匹配的方法。问题是内存消耗显着增加(尤其是在引用大量程序集的情况下),因为 .NET 挂在方法元数据上。

有没有办法清除或禁用这个MemberInfo 缓存?

【问题讨论】:

  • 我们在这里讨论了多少种方法?造成内存压力需要很多时间。
  • 是的,有不少;)

标签: .net caching assemblies types methodinfo


【解决方案1】:

我不这么认为。一个技巧是在 AppDomain 中完成这项工作。您可以创建一个新的 AppDomain,完成所有工作,报告您的结果,然后卸载 AppDomain。这不是一项微不足道的任务而且相当缓慢,但它是有效卸载程序集或反射相关缓存的唯一方法(据我所知)。

【讨论】:

  • 我正在通过调用 AppDomain.CurrentDomain.GetAssemblies() 获取要扫描的程序集列表。如何从不同的 AppDomain 访问当前加载的程序集?
  • 将 AppDomain.CurrentDomain.GetAssemblies().Select(a => a.FullName) 的结果传递给另一个 AppDomain,然后为每个 AppDomain 调用 Assembly.ReflectionOnlyLoad。
  • 值得注意的是,这是一个老问题和答案,在新的 dotnet 核心运行时中,您可以更轻松地在上下文中加载程序集并卸载它们。
【解决方案2】:

如果您不需要执行这些方法,可以使用Assembly.ReflectionOnlyLoad(string) 来减少内存消耗。但是,卸载程序集仍需要卸载 AppDomain,因此,如果您的问题是泄漏(您的程序保持打开状态,用户不断将新程序集传递给您以无限期查看),而不仅仅是高内存使用,这将无济于事。

【讨论】:

  • 不幸的是,我确实需要执行与我正在搜索的签名匹配的方法。
  • 我相信你可以做一个反射加载,然后如果它匹配你就可以完全加载那个程序集。
猜你喜欢
  • 2022-11-28
  • 2012-07-30
  • 2012-02-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
相关资源
最近更新 更多