.NET MethodInfo缓存可以被清除或禁用吗?

3
根据MSDN,调用Type.GetMethods()会将反射方法信息存储在MemberInfo缓存中,以便不必再次执行昂贵的操作。
我有一个应用程序,可以扫描程序集/类型,查找与给定规范匹配的方法。问题在于,由于.NET保留了方法元数据,内存消耗显著增加(特别是引用程序集数量较大时)。
是否有任何方法可以清除或禁用此MemberInfo缓存?

我们在谈论多少方法?需要大量的方法才能造成内存压力。 - ChaosPandion
是的,有相当多的选择 ;) - Anton
2个回答

3

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


我通过调用 AppDomain.CurrentDomain.GetAssemblies() 获取要扫描的程序集列表。如何从不同的 AppDomain 访问当前加载的程序集? - Anton
将AppDomain.CurrentDomain.GetAssemblies().Select(a => a.FullName)的结果传递给另一个AppDomain,然后为每个程序集调用Assembly.ReflectionOnlyLoad。 - dkackman
值得注意的是,这是一个旧的问题和答案,在新的dotnet core运行时中,您可以更轻松地在上下文中加载和卸载程序集。 - justin.m.chase

0

如果你不需要执行方法,可以使用Assembly.ReflectionOnlyLoad(string)来减少内存消耗。但是,卸载程序集仍然需要卸载AppDomain,所以如果你的问题是泄漏(程序保持打开状态,用户不断地传递新的程序集给你),而不仅仅是高内存使用,这并不能解决问题。


很遗憾,我确实需要执行与我正在搜索的签名匹配的方法。 - Anton
我相信你可以进行ReflectionOnlyLoad,然后如果匹配成功,就可以仅加载那个程序集的全部内容。 - justin.m.chase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接