Уничтожить EnumBuilder после создания Enum? - PullRequest
1 голос
/ 20 марта 2009

Я пытаюсь уменьшить объем памяти, используемой моим приложением. В моем приложении я использую System.Reflection.Emit.EnumBuilder для создания перечислений на лету из информации, которую я получаю во время выполнения. Я использую только EnumBuilder для создания индивидуального перечисления, и после этого я больше не могу его использовать. При использовании CLRProfiler я заметил, что EnumBuilders никогда не уничтожаются. Мое приложение может выполнять тысячи перечислений во время работы, поэтому объем памяти, используемый этими EnumBuilders, может быть увеличен. EnumBuilder не определяет метод Dispose, поэтому я не могу уничтожить его таким образом. Можно ли как-то удалить остатки EnumBuilders из памяти?

Ответы [ 3 ]

4 голосов
/ 20 марта 2009

EnumBuilder создает перечисление в динамической сборке. Согласно Как: загружать и выгружать сборки (Руководство по программированию в C #), нет способа выгрузить сборку без выгрузки всех доменов приложений, которые ее используют. В частности:

"Даже если сборка выходит из области видимости, фактический файл сборки будет оставаться загруженным до тех пор, пока не будут выгружены все домены приложения, которые его содержат."

2 голосов
/ 20 марта 2009

Мое приложение может выполнять тысячи перечислений во время работы,

Почему? Похоже, вы делаете то, что, вероятно, не должны делать.

1 голос
/ 20 марта 2009

Я заметил то же самое. Это «утечка» в ModuleBuilder, которая висит на байтах и ​​строках IIRC.

Вы можете посмотреть WinDbg с загруженной SOS для лучшей информации о памяти.

...