Создайте одноразовый метод во время выполнения
Моя программа создает в любое время новые методы (используя MethodBuilder
с массивом байтов \IL), что он выполняет их один раз и отбрасывает ссылку на них. Я обнаружил, что на самом деле они не затронуты GC. Есть ли способ позволить GC собрать их или утилизировать?
Я обнаружил, что проблема заключается в том, что для создания нового метода необходимо загрузить его сборку, которая не может быть выгружена после. Мне нужно запустить эти методы на главном домене приложения. (Он создает объекты или изменяет некоторые) Есть ли альтернатива MethodBuilder
и просто выполнить эти байты \ IL в любом случае?
1 ответ
Использование DynamicMethod
если вам нужно только запустить метод, который можно будет собрать позже. Из документов:
Определяет и представляет динамический метод, который можно компилировать, выполнять и отбрасывать. Отброшенные методы доступны для сборки мусора.
Если вам нужно построить тип динамически, вам нужно определить для него динамическую сборку, которую можно собрать. Для этого используйте AssemblyBuilder.DefineDynamicAssembly
с AssemblyBuilderAccess.RunAndCollect
вариант. Есть некоторые ограничения на то, что вы можете сделать в коллекционном собрании, подробно описанном здесь.