Compartilhar via


Interop Marshaling

Interop marshaling controla como os dados são passados em argumentos de método e os valores retornados entre memória gerenciada e durante as chamadas. Interop marshaling é uma atividade de tempo de execução realizada pelo serviço de empacotamento do common language runtime.

A maioria dos tipos de dados tem representações comuns na memória gerenciada e. O empacotador de interoperabilidade lida com esses tipos para você. Outros tipos podem ser ambíguas ou não representado na memória gerenciada.

Um tipo de ambíguo pode ter várias representações não gerenciadas que são mapeados para um único tipo gerenciado ou faltando informações de tipo, como, por exemplo, o tamanho de uma matriz. Para tipos de ambíguos, o empacotador fornece uma representação padrão e representações alternativas, onde existem a várias representações. Você pode fornecer instruções explícitas para o empacotador em como ele é empacotar um tipo ambíguo.

Esta visão geral contém as seções a seguir:

  • Invocação de plataforma e modelos de interoperabilidade COM

  • Marshaling e Apartments COM

  • Empacotamento de chamadas remotas

  • Tópicos relacionados

  • Referência

Invocação de plataforma e modelos de interoperabilidade COM

O common language runtime fornece dois mecanismos para interoperar com código não gerenciado:

  • Invocação de plataforma, que permite que o código gerenciado chamar funções exportadas de uma biblioteca não gerenciada.

  • Interoperabilidade COM, que permite que o código gerenciado interagir com objetos de modelo de objeto componente (COM) por meio de interfaces.

Chamar de ambas as plataformas e COM interoperabilidade use interop marshaling para mover com precisão os argumentos de método entre o chamador e o receptor e o verso, se necessário. Como mostra a ilustração a seguir, uma invocação de plataforma fluxos de chamadas de método de gerenciado para código não gerenciado e nunca de outra forma, exceto quando funções de retorno de chamada estão envolvidos. Apesar de invocação de plataforma chamadas podem fluir somente de gerenciado para código não gerenciado, os dados podem fluir em ambas as direções como parâmetros de entrada ou saídas. Chamadas de método de interoperabilidade COM podem fluir em qualquer direção.

Invocação de plataforma e o fluxo de chamada de interoperabilidade COM

Invocação de plataforma

O nível mais baixo, ambos os mecanismos de usam a interoperabilidade mesma empacotamento de serviço; No entanto, determinados tipos de dados são aceitos exclusivamente pelo COM interop ou invocação de plataforma. Para obter detalhes, consulte:Comportamento de empacotamento padrão.

Voltar ao topo

Marshaling e Apartments COM

O empacotador de interoperabilidade empacota os dados entre a pilha de runtime de linguagem comum e a heap não gerenciada. Empacotamento ocorre sempre que o chamador e o receptor não podem operar na mesma instância de dados. O empacotador de interoperabilidade torna possível para o chamador e o receptor parecem estar operando nos mesmos dados, mesmo que tenham sua própria cópia dos dados.

COM também tem um empacotador que empacota os dados entre apartments COM ou processos de COM diferentes. Ao chamar entre código gerenciado e dentro do mesmo compartimento COM, o empacotador de interoperabilidade é o empacotador somente envolvido. Ao chamar entre código gerenciado e código não gerenciado em um compartimento de COM diferente ou um processo diferente, o empacotador de interoperabilidade e o empacotamento COM estão envolvidos.

COM clientes e servidores gerenciados

Um servidor gerenciado exportado com uma biblioteca de tipo registrado pelo Regasm. exe (ferramenta de registro de Assembly) tem um ThreadingModel a entrada de registro definido como Both. Esse valor indica que o servidor pode ser ativado em um single-threaded apartment (STA) ou um MTA (multithreaded apartment). O objeto de servidor é criado no mesmo compartimento como seu chamador, conforme mostrado na tabela a seguir.

Cliente COM

.NET server

Requisitos de empacotamento.

STA

Bothse torna STA.

Mesmo compartimento de empacotamento.

MTA

Bothse torna o MTA.

Mesmo compartimento de empacotamento.

Como o cliente e servidor estão no mesmo compartimento, o interop marshaling automaticamente o serviço trata todos os dados de empacotamento. A ilustração a seguir mostra o serviço de empacotamento interop operando entre heaps gerenciados e dentro do mesmo compartimento COM estilo.

Processo de marshaling do mesmo compartimento

Marshaling de interoperabilidade

Se você planeja exportar um servidor gerenciado, lembre-se de que o cliente COM determina o apartamento do servidor. Um servidor gerenciado, chamado por um cliente COM inicializado em um MTA deve garantir a segurança do thread.

Gerenciado de clientes e servidores COM

A configuração padrão para apartments do cliente gerenciado for MTA; No entanto, o aplicativo de tipo da.Cliente de rede pode alterar a configuração padrão. Por exemplo, um Visual Basic 2005 Configuração do cliente apartment for STA. Você pode usar o System.STAThreadAttribute, o System.MTAThreadAttribute, o Thread.ApartmentState propriedade, ou o Page.AspCompatMode propriedade para examinar e alterar a configuração de apartamento de um cliente gerenciado.

O autor do componente define a afinidade de segmento de um servidor COM. A tabela a seguir mostra as combinações das configurações de apartamento.NET clientes e servidores COM. Ele também mostra resultando requisitos para as combinações de empacotamento.

.Cliente de rede

Servidor COM

Requisitos de empacotamento.

MTA (padrão)

MTA

STA

Interop marshaling.

Interoperabilidade e COM o empacotamento.

STA

MTA

STA

Interoperabilidade e COM o empacotamento.

Interop marshaling.

Quando um cliente gerenciado e o servidor não gerenciado são do mesmo compartimento, a serviço de empacotamento de interoperabilidade lida com todos os dados de empacotamento. No entanto, quando o cliente e servidor são inicializados em apartments diferentes, COM o empacotamento também é necessário. A ilustração a seguir mostra os elementos de uma chamada entre apartamento.

Chamada de apartamento cruzados entre um.Cliente de rede e o objeto COM

Marshaling COM

Para empacotamento de cross-apartamento, você pode fazer o seguinte:

  • Aceite a sobrecarga de empacotamento de cross-apartamento, que é notada somente quando há muitas chamadas entre o limite. Você deve registrar a biblioteca de tipos do componente COM para chamadas com êxito cruzar o limite de apartamento.

  • Altera o segmento principal definindo o segmento do cliente STA ou MTA. Por exemplo, se seu cliente C# chama muitos de componentes COM STA, você pode evitar entre apartment de empacotamento, definindo o thread principal para STA.

    Observação

    Depois que o thread de um cliente C# for definido como STA, chamadas para componentes COM MTA exigirá entre apartment de empacotamento.

Para obter instruções sobre como selecionar explicitamente um modelo de apartment, consulte Gerenciado e Threading.

Voltar ao topo

Empacotamento de chamadas remotas

Com apartamento entre empacotamento, COM o empacotamento está envolvido em cada chamada entre código gerenciado e sempre que os objetos residem em processos separados. Por exemplo:

  • Um cliente COM que invoca um servidor gerenciado em um host remoto usa o COM distribuído (DCOM).

  • Um cliente gerenciado que chama um servidor COM em um host remoto usa o DCOM.

A ilustração a seguir mostra como interop marshaling e COM o empacotamento fornecer canais de comunicação entre os limites de processo e de host.

Empacotamento de processo cruzado

Marshaling COM

Preservação da identidade

O common language runtime preserva a identidade de referências gerenciadas e não gerenciadas. A ilustração a seguir mostra o fluxo de referências diretas não gerenciadas (linha superior) e referências diretas gerenciadas (linha inferior) através de limites de processo e de host.

Passando nos limites de processo e o host de referência

CCW (COM Callable wrapper) e RCW (Runtime Callable Wrapper)

Nesta ilustração:

  • Um cliente não gerenciado obtém uma referência a um objeto COM a partir de um objeto gerenciado que obtém essa referência a partir de um host remoto. O mecanismo de remoting é DCOM.

  • Um cliente gerenciado obtém uma referência a um objeto gerenciado a partir de um objeto COM que obtém essa referência a partir de um host remoto. O mecanismo de remoting é DCOM.

    Observação

    Biblioteca de tipos exportados do servidor gerenciado deve ser registrada.

O número de limites de processo entre o chamador e o receptor é irrelevante; a mesma referência direta ocorre para chamadas em processo e fora de processo.

Remoting gerenciado

O runtime também fornece comunicação remota gerenciada, você pode usar para estabelecer um canal de comunicação entre objetos gerenciados através de limites de processo e de host. O remoting gerenciado pode acomodar um firewall entre os componentes de comunicação, como mostra a ilustração a seguir.

Chamadas remotas através de firewalls usando SOAP ou a classe TcpChannel

SOAP ou TcpChannel

Algumas chamadas não gerenciadas podem ser encapsuladas SOAP, como, por exemplo, as chamadas entre componentes atendidos e com. Para obter informações adicionais sobre como usar o remoting gerenciado, consulte .NET Remoting Overview.

Voltar ao topo

Tópicos relacionados

Título

Descrição

Comportamento de empacotamento padrão

Descreve as regras que o serviço de empacotamento interop usa para empacotar dados.

Empacotamento de dados com a plataforma chamar

Descreve como declarar parâmetros de método e passar argumentos para funções exportadas pelas bibliotecas não gerenciadas.

O empacotamento de dados com a interoperabilidade COM

Descreve como personalizar wrappers COM para alterar o comportamento de empacotamento.

Como: Map HRESULTs and Exceptions

Descreve como mapear HRESULTs exceções personalizadas e fornece o mapeamento completo de cada HRESULT à sua classe de exceção comparável na.NET Framework.

Interoperando usar tipos genéricos

Descreve quais ações são suportadas quando usar tipos genéricos para interoperabilidade COM.

Interoperação com Código Não Gerenciado

Descreve serviços de interoperabilidade fornecidos pelo common language runtime.

Interoperabilidade de COM avançadas

Fornece links para obter mais informações sobre como incorporar componentes COM ao seu.Aplicativo do NET Framework.

Considerações de design de interoperação

Fornece dicas para escrever componentes integrados de COM.

.NET Remoting

Descreve os vários métodos disponíveis na.NET Framework para comunicações remotas.

Voltar ao topo

Referência

System.Runtime.InteropServices

Voltar ao topo