Verwaltung der Lebensdauer

Durch die Remotefunktionen des Add-In-Modells gestaltet sich die Verwaltung der Lebensdauer kompliziert. Da die Freigabe von Objekten in mehreren Anwendungsdomänen von der Garbage Collection nicht ausreichend unterstützt wird, bietet das Add-In-Modell ein eigenes System zur Verwaltung der Lebensdauer. Dieses Verwaltungssystem verwendet ein Verweiszählungssystem und die Remotedienste der Common Language Runtime.

Das Lebensdauerverwaltungssystem des Add-In-Modells kann mehrere Anwendungsdomänen und isolierte Prozesse umfassen, um sicherzustellen, dass die Objekte, Verträge und Add-Ins gelöscht und die zugehörigen Anwendungsdomänen entladen werden. Dazu verwendet das System ein Tokenhandle (ContractHandle) für das Add-In, das beibehalten wird, solange das Add-In einen Aufruf vom Host verarbeitet.

Implementierung der Lebensdauerverwaltung

Um die Verwaltung der Lebensdauer zu implementieren, muss ein Lebensdauertoken abgerufen werden, sobald ein Vertrag in einem Vertrag-zu-Ansicht-Adapter verwendet wird. Anschließend muss das Lebensdauertoken widerrufen werden, wenn die Verarbeitung durch den Adapter abgeschlossen ist. Die ContractHandle-Klasse erledigt diese Aufgabe für Sie, wenn sie in den Adaptern verwendet wird. Wenn von der Pipeline benutzerdefinierte Typen übergeben werden, muss das Tokenhandle in allen von Ihnen implementierten Vertrag-zu-Ansicht-Adapterklassen abgerufen werden. Weitere Informationen über Vertrag-zu-Ansicht-Adaptern finden Sie unter Verträge, Ansichten und Adapter.

Die ContractHandle-Klasse verwendet den Vertrag als Konstruktor. Im folgenden Beispiel wird gezeigt, wie das Tokenhandle für die Lebensdauer in einem hostseitigen Adapter festgelegt wird.

Wichtiger HinweisWichtig

ContractHandle ist für die Lebensdauerverwaltung entscheidend.Wenn Sie keinen Verweis auf das ContractHandle-Objekt beibehalten, wird es von der Garbage Collection freigegeben, und die Pipeline wird zu einem für das Programm unerwarteten Zeitpunkt beendet.Dies kann zu Fehlern führen, die schwierig zu diagnostizieren sind, z. B. AppDomainUnloadedException.Das Herunterfahren ist eine normale Phase im Lebenszyklus einer Pipeline, es gibt daher keine Möglichkeit für den Code zum Verwalten des Lebenszyklus festzustellen, dass es sich bei dem Zustand um einen Fehler handelt.

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

Nachdem das Tokenhandle abgerufen wurde, werden alle Funktionen der Lebensdauerverwaltung vom System übernommen, so dass keine zusätzliche Programmierung erforderlich ist.

Im Add-In-Modell verhalten sich Host und Add-Ins so, als würde die eigene Verwaltung der Lebensdauer vom Garbage Collector gesteuert. Ihre lokalen Verweise werden freigegeben, was bewirkt, dass alle Remoteverweise verworfen und der Garbage Collection zugeführt werden.

Beenden von Add-Ins

Die Hostanwendung kann die Anwendungsdomäne eines Add-Ins durch den Aufruf der Shutdown-Methode der AddInController-Klasse herunterfahren.

Die Add-Ins und Anwendungsdomänen werden von der AddInController-Klasse verfolgt, um sicherzustellen, dass sie entladen werden.

Siehe auch

Konzepte

Verträge, Ansichten und Adapter

Pipeline-Entwicklung