Wrappers COM
O COM difere do modelo de objeto de runtime do .NET de várias maneiras importantes:
Os clientes de objetos COM devem gerenciar o tempo de vida desses objetos; o Common Language Runtime gerencia o tempo de vida de objetos em seu ambiente.
Os clientes de objetos COM descobrem se um serviço está disponível solicitando uma interface que fornece esse serviço e recebendo um ponteiro de interface ou não. Os clientes de objetos .NET podem obter uma descrição da funcionalidade de um objeto usando a reflexão.
Os objetos .NET residem na memória gerenciada pelo ambiente de execução do runtime do .NET. O ambiente de execução pode mover objetos na memória por motivos de desempenho e atualizar todas as referências nos objetos movidos por ele. Os clientes não gerenciados, depois de obter um ponteiro para um objeto, dependem do objeto para permanecerem no mesmo local. Esses clientes não têm nenhum mecanismo para lidar com um objeto cujo local não é fixo.
Para superar essas diferenças, o runtime fornece classes wrapper para fazer com que os clientes gerenciados e não gerenciados acreditem que estão chamando objetos em seus respectivos ambientes. Sempre que o cliente gerenciado chama um método em um objeto COM, o tempo de execução cria um RCW (Runtime Callable Wrapper). Os RCWs eliminam as diferenças entre os mecanismos de referência gerenciada e não gerenciada, entre outras coisas. O runtime também cria um CCW (COM Callable Wrapper) para reverter o processo, permitindo que um cliente COM chame um método em um objeto .NET diretamente. Como mostra a ilustração a seguir, a perspectiva do código de chamada determina qual classe wrapper é criada pelo runtime.
Na maioria dos casos, o RCW padrão ou o CCW gerado pelo runtime fornece o marshaling adequado para chamadas que cruzam o limite entre o COM e o runtime do .NET. Usando atributos personalizados, opcionalmente, você pode ajustar a maneira como o runtime representa o código gerenciado e não gerenciado.