Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сборные сборки — это динамические сборки, которые можно выгрузить без выгрузки домена приложения, в котором они были созданы. Все управляемая и неуправляемая память, используемая сборкой, которая может быть собрана, и типы, которые она содержит, могут быть освобождены. Такие сведения, как название сборки, удаляются из внутренних таблиц.
Чтобы включить выгрузку, используйте AssemblyBuilderAccess.RunAndCollect флаг при создании динамической сборки. Сборка является временной (т. е. не может быть сохранена) и подлежит ограничениям, описанным в разделе "Ограничения на сборные сборки ". Общий язык выполнения (CLR) автоматически выгружает собираемую сборку при освобождении всех объектов, связанных с этой сборкой. Во всех остальных отношениях сборные сборки создаются и используются так же, как и другие динамические сборки.
Срок службы коллекционных сборок
Длительность существования коллекционируемой сборки управляется существованием ссылок на типы, которые она содержит, и объекты, созданные из этих типов. Общее язык среды выполнения не выгружает сборку до тех пор, пока существует один или несколько из следующих элементов (T — это любой тип, определенный в сборке):
Экземпляр
T.Экземпляр массива
T.Экземпляр универсального типа, который имеет
Tв качестве одного из аргументов типа. К ним относятся универсальные коллекцииT, даже если эта коллекция пуста.Экземпляр Type или TypeBuilder представляющий
T.Это важно
Необходимо освободить все объекты, представляющие части сборки. ModuleBuilder определяет
T, который хранит ссылку на объект TypeBuilder, и AssemblyBuilder объект хранит ссылку на ModuleBuilder, поэтому ссылки на эти объекты должны быть освобождены. Даже существование LocalBuilder или ILGenerator, используемых в строительствеT, предотвращает выгрузку.Статическая ссылка на
T, созданная другим динамически определённым типомT1, который всё ещё доступен через выполнение кода. Например,T1может быть производным отT, илиTможет быть типом параметра в методеT1.ByRefдля статического поля, принадлежащегоT.RuntimeTypeHandle, RuntimeFieldHandle, или RuntimeMethodHandle, которые относятся к
Tили компонентуT.Экземпляр любого объекта отражения, который можно использовать косвенно или напрямую для доступа к объекту Type , представляющего
T. Например, объект Type можно получить из типа массива, элементами которого являютсяT, или из универсального типа, включающегоTв качестве аргумента типа.Метод
Mв стеке вызовов любого потока, гдеM— это методTили метод уровня модуля, определенный в сборке.Делегат статического метода, определенного в модуле сборки.
Если только один элемент из этого списка существует только для одного типа или одного метода в сборке, среда выполнения не может выгрузить сборку.
Замечание
Среда выполнения фактически не выгрузит сборку до тех пор, пока методы завершения не будут выполняться для всех элементов в списке.
В целях отслеживания времени существования, созданный универсальный тип, например List<int> (в C#) или List(Of Integer) (в Visual Basic), созданный и используемый в создании сборочной сборки, считается определенным в сборке, содержащей определение универсального типа или в сборке, содержащей определение одного из его аргументов типа. Точная сборка, используемая, это деталь реализации и может измениться.
Ограничения на коллекционные сборки
Следующие ограничения применяются к коллекционным сборкам:
Статические ссылки
Типы в обычной динамической сборке не могут иметь статические ссылки на типы, определенные в собираемой сборке. Например, если определить обычный тип, наследуемый от типа в сборной сборке, NotSupportedException создается исключение. Тип в сборной сборке может иметь статические ссылки на тип в другой сборочной сборке, но это расширяет время существования указанной сборки до времени существования ссылающейся сборки.
Следующие ограничения применяются к сборным сборкам в .NET Framework:
COM-интероп
Интерфейсы COM не могут быть определены в сборной сборке, и никакие экземпляры типов в сборной сборке не могут быть преобразованы в COM-объекты. Тип в коллекционной сборке не может служить оболочкой для вызова COM (CCW) или оболочкой для вызова среды выполнения (RCW). Однако типы в коллекционных сборках могут использовать объекты, реализующие COM-интерфейсы.
Вызов платформы
Методы, обладающие атрибутом DllImportAttribute, не подлежат компиляции, когда они объявлены в собираемой сборке. Инструкцию OpCodes.Calli нельзя использовать в реализации типа в коллекционируемой сборке, и такие типы нельзя передавать в неуправляемый код. Однако можно вызвать нативный код с помощью точки входа, объявленной в неразбираемой сборке.
Маршалинг
Объекты (в частности, делегаты), определенные в коллекционируемых сборках, нельзя маршалировать. Это ограничение на все переходные излучаемые типы.
Загрузка сборок
Reflection.Emit - это единственный поддерживаемый механизм для загрузки коллекционных сборок. Сборки, загруженные любым другим способом загрузки, нельзя выгрузить.
Объекты с привязкой к контексту
Контекстно-статические переменные не поддерживаются. Типы в коллекционной сборке не могут расширяться ContextBoundObject. Однако код в сборочных сборках может использовать объекты с привязкой к контексту, определенные в другом месте.
Потокостатические данные
Не поддерживаются статические переменные потока.
Следующие ограничения применяются к сборным сборкам в версиях .NET Framework и .NET до .NET 9:
Статические поля с
FixedAddressValueTypeAttributeСтатические поля, определенные в коллекционных сборках, не могут иметь применён атрибут FixedAddressValueTypeAttribute.