Partager via


Gestion de la durée de vie

Les fonctions de communication à distance du modèle de complément compliquent la gestion de la durée de vie. Puisque le garbage collection ne prend pas correctement en charge la récupération d'objets dans plusieurs domaines d'application, le modèle de complément fournit son propre système de gestion de la durée de vie. Ce système de gestion utilise un système de décompte de références et les services de communication à distance du Common Language Runtime.

Le système de gestion de la durée de vie du modèle de complément peut couvrir plusieurs domaines d'application et processus isolés pour garantir que les objets, contrats et compléments sont supprimés et leurs domaines d'application déchargés. Le système procède en maintenant un handle de jeton (ContractHandle) sur le complément pendant la durée durant laquelle le complément traite un appel de l'hôte.

Implémentation de la gestion de la durée de vie

Pour implémenter la gestion de la durée de vie, vous devez acquérir un jeton de durée de vie chaque fois qu'un contrat est utilisé dans un adaptateur de contrat en vue, puis révoquer le jeton de durée de vie lorsque l'adaptateur ne s'en sert plus. La classe ContractHandle se charge de cette tâche à votre place si vous l'utilisez dans vos adaptateurs. Si votre pipeline passe des types personnalisés, vous devez acquérir le handle de jeton dans toutes les classes d'adaptateur de contrat en vue que vous implémentez. Pour plus d'informations sur les adaptateurs de contrat en vue, consultez Contrats, vues et adaptateurs.

La classe ContractHandle prend le contrat comme son constructeur. L'exemple suivant indique comment définir le handle du jeton de la durée de vie dans un adaptateur côté hôte.

Remarque importanteImportant

ContractHandle est critique pour la gestion de la durée de vie.Si vous ne parvenez pas à conserver une référence à l'objet ContractHandle, le garbage collection la récupérera, et le pipeline s'arrêtera quand le programme ne s'y attend pas.Cela peut provoquer des erreurs difficiles à diagnostiquer, telles que AppDomainUnloadedException.L'arrêt est une étape normale dans la vie d'un pipeline ; il est donc impossible pour le code de gestion de la durée de vie de détecter que cette condition est une erreur.

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

Lorsque vous acquérez le handle de jeton, le système se charge de toutes les fonctions de gestion de la durée de vie et ne requiert aucune programmation supplémentaire.

Sous le modèle de complément, l'hôte et les compléments fonctionnent comme si la gestion de leur propre durée de vie était contrôlée par le garbage collector. Leurs références locales sont supprimées et ceci provoque la suppression et la collecte de toutes les références hors programme.

Arrêt du complément

L'application hôte peut arrêter le domaine d'application d'un complément en appelant la méthode Shutdown de la classe AddInController.

La classe AddInController conserve une trace des compléments et de leurs domaines d'application pour s'assurer qu'ils sont déchargés.

Voir aussi

Concepts

Contrats, vues et adaptateurs

Développement de pipeline