Мы используем пользовательский класс RuntimeDataBuilder, который динамически создает тип .NET в памяти с помощью Reflection.Emit для создания простых методов получения/установки свойств для информации, которую мы получаем от универсального WCF DataService. Служба предоставляет структуру типа DataSet, состоящую из 1..m DataTableDefinitions, каждая из которых содержит 1..m DataTableColumnDefinitions. Когда информация получена на стороне клиента, мы генерируем тип с помощью его методов установки/получения свойств, чтобы повысить производительность и упростить привязку к нашему клиенту Silverlight. Все это работает нормально.
Мой вопрос связан с возможной утечкой памяти, связанной с регенерацией типа. Время от времени пользователь может изменять параметры запроса, что может привести к получению большего или меньшего количества информации по сети. Поэтому он делает недействительным предыдущий тип, который мы создали, и я хочу убедиться, что мы можем освободить память, используемую этим предыдущим определением типа. Из этой статьи на MSDN я понял, что если вы используете облегченный код Генерация (LCG) — код размещается в управляемой куче, которая будет утилизирована сборщиком мусора, когда на нее не будет ссылаться ничего. Но LCG, похоже, применим только к динамическим методам. Меня беспокоит тип со всеми его геттерами/сеттерами свойств, которые теперь больше не требуются. Если это выделено в неуправляемой куче, наша единственная надежда на освобождение памяти, по-видимому, состоит в том, чтобы убедиться, что тип загружен во временный домен приложения, который мы можем выгрузить, когда он больше не требуется.
Может кто-нибудь, пожалуйста, подтвердите или выделите другой способ восстановления памяти.
Спасибо