Padrão de empacotamento para Classes
Classes podem ser empacotados somente pelo COM interop e sempre são empacotadas como interfaces. Em alguns casos, a interface usada para empacotar a classe é conhecida como a interface de classe. Para obter informações sobre como substituir a interface de classe com uma interface de sua preferência, consulte apresentando a Interface de classe.
Classes de passagem COM
Quando uma classe gerenciada é passada para o COM, o empacotador de interoperabilidade encapsula a classe com um proxy de COM e passa a interface de classe produzida pelo proxy para a chamada de método COM automaticamente. O proxy, em seguida, delega todas as chamadas na interface de classe de volta para o objeto gerenciado. O proxy também expõe a outras interfaces que não são explicitamente implementadas pela classe. O proxy automaticamente implementa interfaces como IUnknown e IDispatch em nome de classe.
Classes de passagem para.NET de código
Coclasses de não são normalmente usados como argumentos de método em COM. Em vez disso, uma interface padrão geralmente é passada em vez do coclass.
Quando uma interface é passada para código gerenciado, o empacotador de interoperabilidade é responsável por dispor a interface com o wrapper adequada e passando o wrapper para o método gerenciado. Determinando qual wrapper para usar pode ser difícil. Cada instância de um objeto COM tem um invólucro único e exclusivo, não importa quantas interfaces que o objeto implementa. Por exemplo, um único objeto COM que implementa interfaces distintas de cinco tem apenas um invólucro. O mesmo wrapper expõe todas as interfaces de cinco. Se duas instâncias do objeto COM forem criadas, duas instâncias do wrapper são criadas.
Para o wrapper manter o mesmo tipo em toda a sua vida útil, o empacotador de interoperabilidade deve identificar o wrapper correto na primeira vez que uma interface exposta pelo objeto é passada para o empacotador. O empacotador identifica o objeto observando que o objeto implementa interfaces.
Por exemplo, o empacotador determina que o wrapper de classe deve ser usado para dispor a interface que foi passada para código gerenciado. Quando a interface do primeiro for transmitida para o empacotador, o empacotador verifica se a interface é proveniente de um objeto conhecido. Essa verificação ocorre em duas situações:
Uma interface está sendo implementada por outro objeto gerenciado que foi passado para COM em outro lugar. O empacotador possa identificar prontamente interfaces expostas por objetos gerenciados e é capaz de corresponder à interface com o objeto gerenciado que fornece a implementação. O objeto gerenciado é então passado para o método e nenhum wrapper é necessária.
Um objeto que já foi quebrado está implementando a interface. Para determinar se esse for o caso, o empacotador de consulta o objeto para seu IUnknown interface e o compara a interface retornada para as interfaces de outros objetos que já estão quebradas. Se a interface é o mesmo que um wrapper de outro, os objetos têm a mesma identidade e o invólucro existente é passado para o método.
Se uma interface não for de um objeto conhecido, o empacotador faz o seguinte:
O empacotador consultará o objeto para o IProvideClassInfo2 interface. Se fornecido, o empacotador usa o CLSID retornado de IProvideClassInfo2.GetGUID para identificar o coclass fornecendo a interface. Com o CLSID empacotador pode localizar o wrapper do registro, se o assembly foi registrado anteriormente.
O empacotador consultará a interface para o IProvideClassInfo interface. Se fornecido, o empacotador usa o ITypeInfo retornado de IProvideClassInfo.GetClassinfo para determinar o CLSID da classe expondo a interface. O empacotador pode usar o CLSID para localizar os metadados para o wrapper.
Se o empacotador ainda não conseguir identificar a classe, ela envolve a interface com uma classe de invólucro genérica chamada System.__ComObject.
Consulte também
Conceitos
Blittable e tipos de não-Blittable