我们正在使用自定义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