2010-06-17 40 views
2

根據MSDN,調用Type.GetMethods()將反映的方法信息存儲在MemberInfo緩存中,因此不必再次執行昂貴的操作。可以清除或禁用.NET MethodInfo緩存?

我有一個應用程序掃描程序集/類型,尋找符合給定規範的方法。問題在於內存消耗顯着增加(特別是大量的引用程序集),因爲.NET會掛起方法元數據。

有什麼方法可以清除或禁用這個MemberInfo緩存?

+0

我們在這裏談論多少種方法?引起內存壓力需要很多時間。 – ChaosPandion 2010-06-17 20:35:01

+0

是的,有不少;; – Anton 2010-06-17 20:49:51

回答

2

我不這麼認爲。一個竅門是在AppDomain中完成這項工作。您可以創建一個新的AppDomain,完成所有工作,報告結果,然後卸載AppDomain。這不是一項簡單的任務,而且速度相當慢,但它是有效卸載程序集或反射相關緩存(我知道的)的唯一方法。

+0

我得到一個程序集清單,通過調用'AppDomain.CurrentDomain.GetAssemblies()'進行掃描。如何從另一個AppDomain訪問當前加載的程序集? – Anton 2010-06-17 21:10:46

+0

傳遞AppDomain.CurrentDomain.GetAssemblies()的結果。選擇(a => a.FullName)到另一個AppDomain,然後爲每個AppDomain調用Assembly.ReflectionOnlyLoad。 – dkackman 2010-06-18 00:27:18

+0

超級慢,但它的作品。我的項目太慢了。 – Anton 2010-06-18 17:22:18

0

如果您不需要通過使用Assembly.ReflectionOnlyLoad(string)來執行這些方法,則可以稍微減少內存消耗。然而,卸載程序集仍然需要卸載AppDomain,所以如果你的問題是泄漏(你的程序保持打開狀態,用戶不斷傳遞給你新的程序集來無限期地查看),而不是僅僅使用高內存,這將無濟於事。

+0

不幸的是,我確實需要執行匹配我正在搜索的簽名的方法。 – Anton 2010-06-18 17:06:27