Partilhar via


Wrapper chamável em tempo de execução

O common language runtime expõe objetos COM por meio de um proxy chamado runtime callable wrapper (RCW). Embora o RCW pareça ser um objeto comum para clientes .NET, sua função principal é organizar chamadas entre um cliente .NET e um objeto COM.

O tempo de execução cria exatamente um RCW para cada objeto COM, independentemente do número de referências existentes nesse objeto. O tempo de execução mantém um único RCW por processo para cada objeto. Se você criar um RCW em um domínio de aplicação ou área de trabalho e, em seguida, passar uma referência para outro domínio de aplicação ou área de trabalho, um proxy para o primeiro objeto será utilizado. Observe que esse proxy é um novo objeto gerenciado e não é o mesmo que o RCW inicial; isso significa que os dois objetos gerenciados não são iguais, mas representam o mesmo objeto COM. Como mostra a ilustração a seguir, qualquer número de clientes geridos pode manter uma referência aos objetos COM que expõem as interfaces INew e INewer.

A imagem a seguir mostra o processo para acessar objetos COM através do invólucro acionável em tempo de execução:

Processo para acessar objetos COM através do RCW.

Usando metadados derivados de uma biblioteca de tipos, em tempo de execução, cria-se tanto o objeto COM que está a ser chamado como um wrapper para esse objeto. Cada RCW mantém um cache de ponteiros de interface no objeto COM que encapsula e libera sua referência no objeto COM quando o RCW não é mais necessário. O ambiente de execução executa a coleta de lixo no RCW.

O RCW organiza dados entre código gerenciado e não gerenciado, em nome do objeto encapsulado, entre outras atividades. Especificamente, o RCW fornece organização para argumentos de métodos e valores de retorno dos mesmos, sempre que o cliente e o servidor têm representações diferentes dos dados passados entre eles.

O invólucro padrão impõe regras de empacotamento incorporadas. Por exemplo, quando um cliente .NET passa um string tipo como parte de um argumento para um objeto não gerenciado, o wrapper converte o string em um BSTR tipo. Se o objeto COM retornar um BSTR ao seu chamador gerenciado, o chamador receberá um string. Tanto o cliente quanto o servidor enviam e recebem dados que lhes são familiares. Outros tipos não requerem conversão. Por exemplo, um wrapper padrão sempre passará um integer de 4 bytes entre código gerido e não gerido sem converter o tipo.

Organização de interfaces selecionadas

O objetivo principal do runtime callable wrapper (RCW) é ocultar as diferenças entre os modelos de programação gerenciados e não gerenciados. Para criar uma transição perfeita, o RCW consome interfaces COM selecionadas sem expô-las ao cliente .NET, conforme mostrado na ilustração a seguir.

A imagem a seguir mostra as interfaces COM e um wrapper chamável em tempo de execução.

Captura de ecrã do wrapper chamável em tempo de execução com interfaces.

Quando criado como um objeto de ligação antecipada, o RCW é um tipo específico. Ele implementa as interfaces que o objeto COM implementa e expõe os métodos, propriedades e eventos das interfaces do objeto. Na ilustração, o RCW expõe a interface INew, mas consome as interfaces IUnknown e IDispatch . Além disso, o RCW expõe todos os membros da interface INew ao cliente .NET.

O RCW consome as interfaces listadas na tabela a seguir, que são expostas pelo objeto que ele encapsula.

Interfaz Descrição
IDispatch Para ligação tardia a objetos COM através de reflexão.
IErrorInfo Fornece uma descrição textual do erro, sua origem, um arquivo de Ajuda, contexto da Ajuda e o GUID da interface que definiu o erro (sempre GUID_NULL para classes .NET).
IProvideClassInfo Se o objeto COM que está sendo encapsulado implementa IProvideClassInfo, o RCW extrai as informações de tipo dessa interface para fornecer uma melhor identidade de tipo.
IUnknown Para identidade de objeto, coerção de tipo e gestão do ciclo de vida:

- Identidade do objeto
O tempo de execução distingue entre objetos COM comparando o valor da interface IUnknown para cada objeto.
- Tipo coerção
O RCW reconhece a descoberta de tipo dinâmico realizada pelo método QueryInterface .
- Gestão do tempo de vida
Usando o método QueryInterface , o RCW obtém e mantém uma referência a um objeto não gerenciado até que o tempo de execução execute a coleta de lixo no wrapper, que libera o objeto não gerenciado.

O RCW consome opcionalmente as interfaces listadas na tabela a seguir, que são expostas pelo objeto que ele encapsula.

Interfaz Descrição
IConnectionPoint e IConnectionPointContainer O RCW converte objetos que expõem o modelo de eventos de ponto de conexão em eventos baseados em delegação.
IDispatchEx (somente .NET Framework) Se a classe implementa IDispatchEx, o RCW implementa IExpando. A interface IDispatchEx é uma extensão da interface IDispatch que, ao contrário de IDispatch, permite enumeração, adição, eliminação e chamadas de membros distinguindo maiúsculas de minúsculas.
IEnumVARIANT Permite que os tipos COM que suportam enumerações sejam tratados como coleções.

Ver também