Управление жизненным циклом объекта
Удаленные возможности модели надстройки делают управление жизненным циклом более сложным. Так как сборка мусора не полностью поддерживает сбор объектов в нескольких доменах приложения, модель надстройки предоставляет собственную систему управления жизненным циклом объекта. Эта система управления использует систему подсчета ссылок и удаленные службы среды 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 отслеживает настройки и их домены приложения, чтобы убедиться в их выгрузке.