Gerenciamento da vida útil
Recursos de remoting o add-in do modelo complicam o gerenciamento da vida útil. Como coleta de lixo não não adequadamente suporte recuperar objetos em vários domínios de aplicativo, o modelo de suplemento fornece seu próprio sistema de gerenciamento da vida útil. Este sistema de gerenciamento usa um sistema de contagem de referência e os serviços de comunicação remota do common language runtime.
Sistema de gerenciamento do ciclo de vida o add-in do modelo pode abranger vários domínios de aplicativos e processos isolados para certificar-se de que o add-ins, contratos e objetos sejam descartados e seus domínios de aplicativo são descarregados. O sistema faz isso mantendo um identificador de token (ContractHandle) para o suplemento durante o tempo que o add-in Serviços uma chamada a partir do host.
Implementação de gerenciamento do ciclo de vida
Para implementar o gerenciamento da vida útil, você deve adquirir um token de tempo de vida, sempre que um contrato é usado em um adaptador de exibição de contrato e revogar o token de tempo de vida quando o adaptador é terminado com ele. O ContractHandle classe isso funciona se você usá-lo em seus adaptadores. Se o pipeline passa tipos personalizados, você deve adquirir o identificador de token em todas as classes de adaptador de exibição de contrato que você implementar. Para obter mais informações sobre adaptadores de contrato para exibição, consulte Contratos, exibições e adaptadores.
O ContractHandle classe leva o contrato como o construtor. O exemplo a seguir mostra como definir o identificador de token de tempo de vida em um adaptador de host.
Importante |
---|
O ContractHandle é fundamental para o gerenciamento do ciclo de vida.Se você deixar de manter uma referência para o ContractHandle , coleta de lixo será solicitá-lo, e objeto pipeline será desligado quando o seu programa não espera o proprietário.Isso pode levar a erros que são difíceis de diagnosticar, como AppDomainUnloadedException.Desligamento é um estágio normal na vida de um pipeline, portanto não há nenhuma maneira para o código de gerenciamento da vida útil detectar que essa condição é um erro. |
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);
}
Depois de adquirir o identificador de token, o sistema se encarrega de todas as funções de gerenciamento do ciclo de vida e não requer nenhuma programação adicional.
Sob o modelo de suplemento, o host e o add-ins operam como se o seu próprio gerenciamento da vida útil foi controlado pelo coletor de lixo. Suas referências de locais obtém descartadas e o que faz com que quaisquer referências remotas ser descartado e coletados.
Suplemento de desligamento
O aplicativo host pode desligar domínio de aplicativo de um add-in, chamando o Shutdown método o AddInController classe.
O AddInController classe mantém o controle de suplementos e seus domínios de aplicativo para certificar-se de que eles são descarregados.