Share via


有効期間管理

アドイン モデルのリモート機能は、有効期間管理を複雑にします。 ガベージ コレクションでは、複数のアプリケーション ドメインでのオブジェクトの再利用を完全にサポートしていないため、アドイン モデルは有効期間管理のための独自のシステムを用意しています。 この管理システムは参照カウント システムと共通言語ランタイムのリモート処理サービスを使用します。

アドイン モデルの有効期間管理システムは複数のアプリケーション ドメインと分離されたプロセスに対応することができ、オブジェクト、コントラクト、アドインが確実に破棄され、そのアプリケーション ドメインがアンロードされるようにします。 システムは、アドインがホストからの呼び出しに対応している間、アドインへのトークン ハンドル (ContractHandle) を保持することによって、これを行います。

有効期間管理の実装

有効期間管理を実装するには、コントラクトとビューの間のアダプターでコントラクトが使用されるときには常に有効期間トークンを獲得し、アダプターがコントラクトの処理を終了するときにその有効期間トークンを廃棄する必要があります。 ContractHandle クラスをアダプターで使用する場合、アダプターがこの作業を行います。 パイプラインがカスタムの型を渡す場合、実装するすべてのコントラクトとビュー間のアダプター クラスでトークン ハンドルを獲得する必要があります。 コントラクトとビューの間のアダプターに関する詳細については、「コントラクト、ビュー、およびアダプター」を参照してください。

ContractHandle クラスはコントラクトをそのコンストラクターとして取ります。 以下に示す例は、有効期間トークン ハンドルをホスト側のアダプターに設定する方法を示します。

重要 :重要

有効期間の管理には、ContractHandle が重要です。ContractHandle オブジェクトへの参照を保持していないと、ガベージ コレクションによってオブジェクトが再利用され、プログラムで予期していないタイミングでパイプラインがシャットダウンすることになります。これは、AppDomainUnloadedException のような診断が困難なエラーの原因となる可能性があります。シャットダウンはパイプラインの正常な段階の 1 つであるため、有効期間を管理するコードでこの状態をエラーとして検出する方法はありません。

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

いったんトークン ハンドルを獲得すると、システムはすべての有効期間管理機能を実行できるようになるので、追加のプログラミングは必要ありません。

アドイン モデルでは、ホストとアドインは、独自の有効期間管理がガベージ コレクターによって制御されているように機能します。 それらのローカル参照は破棄され、これにより、リモート参照が破棄され、収集されます。

アドインのシャットダウン

ホスト アプリケーションは、AddInController クラスの Shutdown メソッドを呼び出すことにより、アドインのアプリケーション ドメインをシャットダウンできます。

AddInController クラスは、アドインとそのアプリケーション ドメインを追跡して、それらがアンロードされたことを確認します。

参照

概念

コントラクト、ビュー、およびアダプター

パイプラインの開発