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 ou apartamento de aplicativo e, em seguida, passar uma referência para outro domínio ou apartamento de aplicativo, um proxy para o primeiro objeto será usado. 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 gerenciados pode conter uma referência aos objetos COM que expõem INew
e INewer
interfaces.
A imagem a seguir mostra o processo para acessar objetos COM por meio do wrapper chamável em tempo de execução:
Usando metadados derivados de uma biblioteca de tipos, o tempo de execução cria o objeto COM que está sendo chamado e 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 tempo de execução executa a coleta de lixo no RCW.
Entre outras atividades, o RCW controla dados entre código gerenciado e não gerenciado, em nome do objeto encapsulado. Especificamente, o RCW fornece empacotamento para argumentos de método e valores de retorno de método 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 a BSTR
para seu chamador gerenciado, o chamador receberá um string
arquivo . 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 inteiro de 4 bytes entre código gerenciado e não gerenciado sem converter o tipo.
Marshalling 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 interfaces COM e o wrapper chamável em tempo de execução:
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.
Interface | Description |
---|---|
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 gerenciamento de tempo 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.
Interface | Description |
---|---|
IConnectionPoint e IConnectionPointContainer | O RCW converte objetos que expõem o estilo de evento 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, exclusão e chamada de membros que diferenciam maiúsculas de minúsculas. |
IEnumVARIANT | Permite que os tipos COM que suportam enumerações sejam tratados como coleções. |