수명 관리
추가 기능 모델의 원격 서비스 기능을 사용하면 수명 관리가 복잡해집니다. 추가 기능 모델에서는 가비지 수집을 통해 여러 응용 프로그램 도메인의 개체를 적절히 회수하지 못하기 때문에 고유한 수명 관리 시스템을 제공합니다. 이 관리 시스템에서는 참조 횟수 시스템과 공용 언어 런타임의 원격 서비스를 사용합니다.
추가 기능 모델의 수명 관리 시스템은 여러 응용 프로그램 도메인 및 격리된 프로세스를 확장하여 개체, 계약 및 추가 기능이 삭제되고 해당 응용 프로그램 도메인이 언로드되도록 할 수 있습니다. 시스템은 이를 위해 추가 기능이 호스트의 호출을 처리할 때 해당 추가 기능에 대한 토큰 핸들(ContractHandle)을 유지 관리합니다.
수명 관리 구현
수명 관리를 구현하려면 계약-뷰 어댑터에 계약이 사용될 때마다 수명 토큰을 가져온 후 어댑터가 작업을 마치면 해당 수명 토큰을 취소해야 합니다. ContractHandle 클래스를 사용자 어댑터에 사용하면 해당 클래스에서 이 작업을 수행합니다. 파이프라인에서 사용자 지정 형식을 전달하는 경우에는 구현하는 모든 계약-뷰 어댑터 클래스의 토큰 핸들을 가져와야 합니다. 계약-뷰 어댑터에 대한 자세한 내용은 계약, 뷰 및 어댑터를 참조하십시오.
ContractHandle 클래스에서는 계약을 생성자로 사용합니다. 다음 예제에서는 호스트측 어댑터에서 수명 토큰 핸들을 설정하는 방법을 보여 줍니다.
중요 |
---|
ContractHandle은 수명 관리에 필수적입니다.ContractHandle 개체에 대한 참조를 유지하지 못하는 경우 가비지 수집을 통해 이를 회수하게 되며 프로그램에서 더 이상 필요로 하지 않는 파이프라인은 종료됩니다.이로 인해 AppDomainUnloadedException 같이 진단하기 어려운 오류가 발생할 수 있습니다.종료는 파이프라인 수명의 정상적인 단계이므로 수명 관리 코드에서 이 상태가 오류인지 여부를 감지할 수는 없습니다. |
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 클래스는 추가 기능과 해당 응용 프로그램 도메인을 추적하여 언로드되었는지 확인합니다.