Compartilhar via


Ativação de contexto

Em COM+, cada objeto COM é criado com um contexto associado. Isso significa que um novo contexto deve ser criado e inicializado ou um contexto existente apropriado é usado. Esse processo é conhecido como ativação. Em COM+, um objeto é ativado em seu próprio contexto ou no de seu criador (um objeto que solicitou que o objeto fosse ativado — por exemplo, chamando CoCreateInstance).

Em algumas circunstâncias, como no pool de objetos, um objeto é ativado sem ser criado do zero. Nesse caso, uma instância em execução é ativada dentro de um contexto. Ao longo de sua vida, ele pode ser ativado repetidamente em diferentes contextos.

O mecanismo básico é o mesmo em ambos os casos — um objeto é associado a um contexto e esse contexto é inicializado corretamente para representar as necessidades de tempo de execução do objeto.

Fluxo de propriedades de contexto

Quando um objeto está sendo ativado em resposta a uma solicitação de criação de outro objeto, COM+ precisa mediar entre eles para ativar corretamente o objeto downstream. COM+ tem que comparar o contexto do chamador com a configuração do componente chamado e, em seguida, decidir onde ativar o componente downstream e como inicializar suas propriedades de contexto.

Para descobrir a configuração do componente, COM+ o procura no banco de dados de registro de classe COM+, que é otimizado para pesquisas de tempo de execução extremamente rápidas. (Isso é determinado pela forma como você configurou um componente ao instalá-lo em um aplicativo COM+.) A configuração do componente é então examinada em relação ao estado das propriedades de contexto do chamador.

Em alguns casos, a configuração é consistente com o contexto do chamador e o componente pode ser ativado dentro do contexto do chamador. Isso pode acontecer somente se o contexto do chamador satisfizer todos os requisitos de tempo de execução do novo objeto.

Quando o componente a jusante não pode ser ativado dentro do contexto do chamador, ele é ativado em seu próprio contexto em um apartamento apropriado. Quando isso ocorre, determinadas propriedades de contexto podem fluir do chamador para o chamado. Por exemplo, se o chamador estiver associado a uma transação e o destinatário oferecer suporte a transações, o novo objeto obterá seu próprio contexto (para votar na transação, ele precisa ter seu próprio sinalizador consistente) e herdará o ID da transação e o ID da atividade do chamador (que residem no mesmo domínio de transação e sincronização).

Propriedades de contexto ignoradas

Dependendo de como um componente é configurado, algumas propriedades de contexto podem não desempenhar nenhum papel na determinação se ele está ativado no contexto do criador ou em seu próprio contexto. Por exemplo, as configurações Transações Desabilitadas e Sincronização Desabilitada, indicando a presença de uma transação ou de um domínio de sincronização, não desempenharão nenhum papel na ativação do componente. Essas propriedades são fundamentalmente ignoradas quando o contexto é fluído. Ou, se um componente usar apenas a verificação de acesso em nível de processo, sua propriedade de contexto de segurança será ignorada — a configuração de segurança do componente nunca desempenhará um papel em sua ativação.

Forçando a ativação no contexto do chamador

Em algumas circunstâncias, você pode querer que um objeto seja ativado apenas no contexto de seu chamador, ou seja, nunca ativado em seu próprio contexto. Por exemplo, talvez você queira controlar o comportamento do objeto quando ele é chamado através de um limite de contexto.

Você pode garantir que um objeto não possa ser ativado em seu próprio contexto selecionando a opção Deve ser ativado no contexto de chamadores na guia Ativação da página Propriedades do componente, usando a ferramenta administrativa Serviços de Componentes. (Veja Impondo a ativação no contexto do chamador para obter instruções passo a passo.) Quando você seleciona essa opção, se o objeto não puder ser ativado no contexto do chamador, CoCreateInstance falhará, retornando CO_E_ATTEMPT_TO_CREATE_OUTSIDE_CLIENT_CONTEXT.

Contexto padrão

Existem contextos padrão para oferecer suporte a componentes não configurados, ou seja, componentes COM não instalados em aplicativos COM+ e não registrados no banco de dados de registro de classe COM+. Se os componentes não configurados tiverem um modelo de threading compatível, eles serão ativados no contexto do chamador. Caso contrário, eles são ativados em um contexto padrão no apartamento apropriado. Cada apartamento tem um contexto padrão para oferecer suporte a objetos COM que não usam serviços COM+.

Ativação de gancho

Ao implementar IObjectControl::Activate e IObjectControl::D eactivate, você pode conectar ativação e desativação para executar inicialização especial no novo contexto. Esses métodos são chamados por COM+ em determinados pontos do ciclo de vida de um objeto, quando o objeto é configurado para usar ativação JIT ou pool de objetos. Consulte Ativação Just-in-Time COM+ e Pool de Objetos COM+ para obter mais detalhes.

Interceptação de chamadas entre contextos