Copiando e fixação
Quando se faz o marshaling de dados, interop marshaler pode copiar ou fixar os dados sendo empacotados.Cópia dos dados coloca uma cópia de dados de um local de memória em outro local de memória.A ilustração a seguir mostra as diferenças entre a cópia de um tipo de valor e copiar um tipo passado por referência do gerenciado de memória não gerenciada.
Tipos de valores passados por valor e por referência
Argumentos de método passados por valor são empacotados para código não gerenciado sistema autônomo valores na pilha.O processo de cópia é direto.Argumentos passados por referência são passados sistema autônomo ponteiros na pilha.Tipos de referência também são passados por valor e por referência.sistema autônomo mostra a ilustração a seguir, tipos de referência passados por valor são copiados ou fixados.
Tipos de referência passados por valor e por referência
Fixando temporariamente bloqueia os dados em seu local corrente de memória, impedindo, portanto, ele realocados pelo coletor de lixo do common linguagem tempo de execução.O empacotador fixa dados para reduzir a sobrecarga de copiar e melhorar o desempenho.O tipo de dados determina se ele é copiado ou fixado durante o processo de marshaling.Fixação é executada automaticamente durante o marshaling de objetos, sistema autônomo String, porém você pode também manualmente marcar memória usando o GCHandle classe.
Classes Blittable formatado
Formatado blittable classes resolveu layout (formatada) e a representação de dados comuns em ambos gerenciado e un gerenciado memória.Quando esses tipos requerem marshaling, um ponteiro para o objeto no heap é passado para o computador chamado diretamente.O computador chamado pode alterar o Sumário do local de memória que está sendo referenciado pelo ponteiro.
Observação: |
---|
O computador chamado pode alterar o Sumário da memória se o parâmetro está marcado como out ou in/out.Por outro lado, o chamador deve evitar a alteração do Sumário quando o parâmetro é conjunto realizar marshaling sistema autônomo in, que é o padrão para tipos blittable formatado.Modificar um objeto em gera problemas quando a mesma classe é exportada para uma biblioteca de tipos e usado para fazer chamadas de apartment cruzada. |
Classes Blittable não formatado
Formatado não blittable classes resolveu layout (formatada) mas a representação de dados é diferente na memória gerenciada e.Os dados podem exigir transformação sob as seguintes condições:
Se uma classe não blittable é empacotada por valor, o computador chamado recebe um ponteiro para uma cópia da estrutura de dados.
Se uma classe não blittable é empacotada por referência, o chamador recebe um ponteiro para um ponteiro para uma cópia da estrutura de dados.
Se o InAttribute atributo estiver definido, essa cópia é sempre inicializada com estado da instância, marshaling sistema autônomo necessário.
Se o OutAttribute o atributo é conjunto, o estado sempre será copiado de volta para a instância no retorno, marshaling conforme necessário.
Se ambos os InAttribute and OutAttribute são definidas, ambas as cópias são necessárias.Se o atributo for omitido, o empacotador pode otimizar, eliminando qualquer cópia.
Tipos de referência
Tipos de referência podem ser passados por valor ou referência.Quando eles são passados por valor, um ponteiro para o tipo é transmitido na pilha.Quando passados por referência, um ponteiro para um ponteiro para o tipo é transmitido na pilha.
Tipos de referência têm o seguinte comportamento condicional:
Se um tipo de referência é passado por valor e ele tem membros de tipos blittable não, os tipos são convertidos duas vezes:
Quando um argumento é passado para o lado não gerenciado.
No retorno de telefonar.
Para evitar desnecessariamente cópia e a conversão, esses tipos são empacotados sistema autônomo parâmetros.Você deve aplicar explicitamente o InAttribute and OutAttribute atributos para um argumento para o chamador ver as alterações feitas pelo computador chamado.
Se um tipo de referência é passado por valor e ele tem somente membros de tipos blittable, podem ser fixado durante o marshaling e todas as alterações efetuadas para membros do tipo, o computador chamado são vistas pelo chamador.Aplicar InAttribute and OutAttribute explicitamente se desejar que esse comportamento.Sem esses atributos direcionais, interop marshaler não exporta informações direcionais para a biblioteca de tipos (ele exporta sistema autônomo in, que é o padrão) e isso pode causar problemas com o marshaling de apartment cruzada COM.
Se um tipo de referência é passado por referência, ele será empacotado sistema autônomo in/out por padrão.
sistema.String e sistema.Texto.StringBuilder
Quando dados são empacotados para código não gerenciado por valor ou referência, o empacotador normalmente copia os dados para um buffer secundário (possivelmente convertendo conjuntos de caractere durante a cópia) e passa uma referência para o buffer para o computador chamado.A menos que a referência é um BSTR alocadosSysAllocString, sempre é alocada a referência CoTaskMemAlloc.
sistema autônomo uma otimização quando qualquer tipo de seqüência de caractere é empacotado por valor (sistema autônomo uma seqüência de caractere Unicode), o empacotador passa o computador chamado um ponteiro direto para gerenciado cadeias de caractere no buffer interno de Unicode em vez de copiá-lo para um novo buffer.
Cuidado: |
---|
Quando uma seqüência de caracteres é passada por valor, o computador chamado nunca deve alterar a referência passada pelo empacotador.Isso pode corromper o gerenciado heap. |
Quando um System.String é passado por referência, o empacotador copia o Sumário a seqüência de caracteres para um buffer secundário antes de fazer a telefonar. Em seguida, ele copia o Sumário do buffer de para uma nova seqüência de caracteres no retorno de telefonar.Essa técnica garante que a cadeia gerenciada imutável permanecerá inalterada.
Quando um System.Text.StringBuilder é passado por valor, o empacotador passar uma referência para o buffer interno da StringBuilder diretamente para o chamador.O chamador e o computador chamado devem concordar no dimensionar do buffer.O chamador é responsável por criar um StringBuilder de tamanho adequado.O computador chamado deve levar as precauções necessárias para garantir que o buffer for saturado não.StringBuilder é uma exceção à regra que tipos de referência passados por valor são passados sistema autônomo in parâmetros por padrão.Sempre é passado como In / out.
Consulte também
Conceitos
Gerenciamento de memória com interop marshaler
marshaling de interoperabilidade visão geral