Управление жизненным циклом объекта

Удаленные возможности модели надстройки делают управление жизненным циклом более сложным. Так как сборка мусора не полностью поддерживает сбор объектов в нескольких доменах приложения, модель надстройки предоставляет собственную систему управления жизненным циклом объекта. Эта система управления использует систему подсчета ссылок и удаленные службы среды CLR.

Система управления жизненным циклом в модели надстройки может охватывать несколько доменов приложения и изолированные процессы, чтобы гарантировать удаление объектов, контрактов и надстроек, а также выгрузку соответствующих им доменов приложения. Это достигается посредством поддержки дескриптора маркера (ContractHandle) в надстройке во время работы надстройки с вызовом из основного приложения.

Реализация управления жизненным циклом объекта

Чтобы реализовать управления жизненным циклом объекта, необходимо получить маркер жизненного цикла при использовании контракта в адаптере "контракт-представление", а затем возвратить маркер жизненного цикла после завершения работы с ним этого адаптера. Класс ContractHandle выполняет эту работу при использовании его в адаптерах. Если конвейер передает пользовательские типы, необходимо получить дескриптор маркера во всех реализованных классах адаптера "контракт-представление". Дополнительные сведения об адаптерах "контракт-представление" см. в разделе Контракты, представления и адаптеры.

Класс ContractHandle принимает контракт в качестве конструктора. В следующем примере показано, как задать дескриптор маркера жизненного цикла в адаптере на стороне основного приложения.

Важно!

Дескриптор ContractHandle играет ключевую роль в управлении временем существования.Если не сохранить ссылку на объект ContractHandle, он будет удален при сборке мусора, и конвейер закроется неожиданно для программы.Это может вызвать ошибки, которые сложно диагностировать, например AppDomainUnloadedException.Завершение работы является неотъемлемым этапом жизненного цикла конвейера, поэтому с помощью кода управления временем существования невозможно определить такое состояние как ошибку.

Private _contract As ICalc2Contract
Private _handle As ContractHandle

Public Sub New(ByVal contract As ICalc2Contract)
    _contract = contract
    _handle = New ContractHandle(contract)
End Sub
private CalculatorContracts.ICalc2Contract _contract;

private System.AddIn.Pipeline.ContractHandle _handle;

public CalculatorContractToViewHostAdapter(ICalc2Contract contract) {
    _contract = contract;
    _handle = new System.AddIn.Pipeline.ContractHandle(contract);
}

После получения дескриптора маркера система берет на себя все функции управления жизненным циклом объекта и не нуждается в дополнительном программировании.

В соответствие с моделью надстройки основное приложение и надстройки работают так, как будто их управление жизненными циклами контролируется сборщиком мусора. Их локальные ссылки удаляются, что приводит к удалению и сборке всех внешних ссылок.

Завершение работы надстройки

Основное приложение может завершить работу в домене приложения надстройки путем вызова метода Shutdown класса AddInController class.

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

См. также

Основные понятия

Контракты, представления и адаптеры

Разработка конвейера