我們正在使用自定義RuntimeDataBuilder類,它使用Reflection.Emit爲我們從泛型WCF DataService接收到的信息創建簡單的屬性獲取器/設置器,從而動態地構造內存中的.NET類型。該服務公開了由1..m DataTableDefinitions組成的「DataSet like」結構,每個DataTableDefinitions都包含1..m DataTableColumnDefinitions。當接收到客戶端信息時,我們使用其屬性設置器/獲取器生成類型,以提高性能並促進綁定到我們的Silverlight客戶端。所有這些工作正常。MSIL內存泄漏
我的問題是與可能的內存泄漏有關的再生類型。有時用戶可以更改查詢參數,這可能會導致更多/更少的信息通過線路。因此它使我們創建的以前的類型無效,並且我想確保我們能夠釋放此前類型定義所使用的內存。我從this article on MSDN瞭解到,如果您使用輕量級代碼生成(LCG),代碼將分配到託管堆上,當GC沒有任何引用時,將由GC回收這些代碼。但LCG似乎只適用於動態方法。我擔心的是現在不再需要所有屬性獲得者/設置者的類型。如果這是在非託管堆上分配的,我們唯一希望回收內存的方式似乎是確保將該類型加載到臨時AppDomain中,以便在不再需要時可以卸載該臨時AppDomain。
有人可以確認或突出顯示回收內存的另一種方式。
THX
ExpandoObject當然是一個選項,但正如您提到的SL4中不支持的那樣。 Thx雖然確認。 – Carel 2010-10-01 04:40:28