Condividi tramite


Gestione della durata

Le funzionalità di accesso remoto del modello di componente aggiuntivo complicano la gestione della durata. Poiché l'operazione di Garbage Collection non supporta in modo adeguato il recupero degli oggetti in più domini applicazione, il modello di componente aggiuntivo fornisce il proprio sistema di gestione della durata che utilizza un sistema di conteggio dei riferimenti e i servizi remoti di Common Language Runtime.

Il sistema di gestione della durata del modello di componente aggiuntivo può essere esteso a più domini applicazione e processi isolati per garantire che oggetti, contratti e componenti aggiuntivi vengano eliminati e i relativi domini applicazione vengano scaricati. Per eseguire queste operazioni, il sistema gestisce un handle token (ContractHandle) per il componente aggiuntivo mentre tale componente risponde a una chiamata dell'host.

Implementazione della gestione della durata

Per implementare la gestione della durata è necessario acquisire un token di durata ogni volta che si utilizza un contratto in un adattatore contratto-visualizzazione e quindi revocare il token quando l'adattatore non ne richiede più l'utilizzo. Se utilizzata negli adattatori, la classe ContractHandle esegue queste operazioni automaticamente. Se la pipeline passa tipi personalizzati, è necessario acquisire l'handle token in tutte le classi dell'adattatore contratto-visualizzazione che si implementano. Per ulteriori informazioni sugli adattatori contratto-visualizzazione, vedere Contratti, visualizzazioni e adattatori.

La classe ContractHandle accetta il contratto come proprio costruttore. Nell'esempio riportato di seguito viene illustrato come impostare l'handle token di durata in un adattatore sul lato host.

Nota importanteImportante

L'oggetto ContractHandle è di importanza fondamentale nella gestione della durata.Se non si riesce a mantenere un riferimento all'oggetto ContractHandle, quest'ultimo verrà recuperato dalla Garbage Collection e la pipeline verrà interrotta in un momento non previsto dal programma.Ciò può comportare errori difficili da diagnosticare, ad esempio AppDomainUnloadedException.L'arresto è una fase normale del ciclo di vita di una pipeline. Pertanto, non esiste alcun modo in cui il codice di gestione della durata sia in grado di rilevare questa condizione come un errore.

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);
}

Dopo aver acquisito l'handle token, tutte le funzioni di gestione della durata verranno eseguite tramite il sistema, senza necessità di ulteriore programmazione.

Nel modello di componente aggiuntivo l'host e i componenti aggiuntivi operano come se la relativa gestione della durata fosse controllata dal Garbage Collector. I riferimenti locali vengono eliminati e di conseguenza anche gli eventuali riferimenti remoti vengono eliminati e raccolti.

Chiusura del componente aggiuntivo

L'applicazione host può chiudere il dominio applicazione di un componente aggiuntivo con una chiamata al metodo Shutdown della classe AddInController.

La classe AddInController tiene traccia dei componenti aggiuntivi e dei relativi domini applicazione per verificare che vengano scaricati.

Vedere anche

Concetti

Contratti, visualizzazioni e adattatori

Sviluppo pipeline