Padrão de marshaling para classes de
Classes podem ser empacotados somente pelo interoperabilidade COM e sempre são empacotadas sistema autônomo interfaces.Em alguns casos, a interface usada para realizar realizar marshaling a classe é conhecida sistema autônomo a interface de classe.Para obter informações sobre como substituir a interface de classe com uma interface de sua escolha, consulte Apresentando a interface de classe.
Classes de passagem para com.
Quando uma classe gerenciada é passada para COM, interop marshaler automaticamente envolve a classe com um proxy de COM e passa a interface de classe produzida pelo proxy para a telefonar de método COM.O proxy, em seguida, delega todas as chamadas na interface de classe de volta para o objeto gerenciado.O proxy também expõe outras interfaces que não esteja explicitamente implementados pela classe.O proxy implementa interfaces, sistema autônomo automaticamenteIUnknown and IDispatch em nome de classe.
Classes de passagem ao código .NET
Coclasses não são normalmente usados sistema autônomo argumentos de método no COM.Em vez disso, uma interface padrão geralmente é passada em vez do coclass.
Quando uma interface é passada em código gerenciado, o interop marshaler é responsável por dispor a interface com o wrapper adequado e passando o wrapper para o método gerenciado.Determinando qual wrapper para usar pode ser difícil.Cada ocorrência de um objeto COM tem uma única e exclusiva wrapper, independentemente de quantas interfaces implementa o objeto.Por exemplo, um único objeto COM que implementa interfaces distintas cinco tem apenas um wrapper.O mesmo wrapper expõe todas as interfaces de cinco.Se forem criadas duas instâncias do objeto COM, duas instâncias do wrapper são criadas.
De wrapper manter o mesmo tipo em todo seu ciclo de vida, interop marshaler deve identificar o wrapper correto na primeira vez em uma interface exposta pelo objeto é passada pelo empacotador.O empacotador identifica o objeto observando as interfaces que implementa o objeto.
Por exemplo, o empacotador determina que a classe wrapper deve ser usado para dispor a interface que foi passada para código gerenciado.Quando a interface é passada pela primeira vez o empacotador, o empacotador verifica se a interface é proveniente de um objeto conhecido.Essa verificação ocorre em duas situações:
Uma interface é que está sendo implementada por outro objeto gerenciado que foi passado para COM em outro lugar.O empacotador pode identificar prontamente interfaces expostas por objetos gerenciados e é capaz de corresponder à interface com o objeto gerenciado que oferece a implementação.O objeto gerenciado é então passado para o método e nenhum conteúdo adicional é necessário.
Um objeto que já foi quebrado está implementando a interface.Para determinar se esse é o caso, o empacotador consulta o objeto para o 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 outro wrapper, sistema autônomo 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 consulta o objeto para o IProvideClassInfo2 interface.Se fornecido, o empacotador usa o CLSID retornado de IProvideClassInfo2.GetGUID para identificar coclass fornecer a interface.Com o CLSID empacotamento 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 expor 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, ele encapsula a interface com uma classe de invólucro genérica chamada sistema.__ComObject.
Consulte também
Conceitos
Blittable e tipos Blittable não