有効期間管理
更新 : 2008 年 7 月
アドイン モデルのリモート機能は、有効期間管理を複雑にします。ガベージ コレクションでは、複数のアプリケーション ドメインでのオブジェクトの再利用を完全にサポートしていないため、アドイン モデルは有効期間管理のための独自のシステムを用意しています。この管理システムは参照カウント システムと共通言語ランタイムのリモート処理サービスを使用します。
アドイン モデルの有効期間管理システムは複数のアプリケーション ドメインと分離されたプロセスに対応することができ、オブジェクト、コントラクト、アドインが確実に破棄され、そのアプリケーション ドメインがアンロードされるようにします。システムは、アドインがホストからの呼び出しに対応している間、アドインへのトークン ハンドル (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 クラスは、アドインとそのアプリケーション ドメインを追跡して、それらがアンロードされたことを確認します。
参照
概念
履歴の変更
日付 |
履歴 |
理由 |
---|---|---|
2008 年 7 月 |
コントラクトへの参照の保持に関する説明を追加 |
カスタマ フィードバック |