Atributos direcionais

Cada parâmetro do método pode ser associado a uma configuração para o InAttribute atributo, o OutAttribute atributo, ou ambos. Você pode aplicar atributos direcionais em time de design para modificar o time de execução de marshaling entre memória gerenciada e.

InAttribute and OutAttribute está localizado no System.Runtime.InteropServices namespace e são equivalente aos atributos de interface Interface Definition linguagem (IDL) [in], [out], [in/out], and [out, retval].

Observação:

O valor retornado de uma assinatura do método gerenciado sempre mapeia para [out, retval] uma biblioteca de tipos.Não há nenhum atributo direcional equivalente, você pode aplicar.

Atributos direcionais são opcionais.Você aplicá-los em parâmetros do método quando desejar alterar o comportamento padrão de empacotamento.Se você omitir atributos direcionais de um parâmetro de método, o empacotador determina o fluxo direcional com base no tipo do parâmetro (valor ou referência) e seus modificadores, se houver.

Alguns idiomas fornecem as palavras-chave que permitem que você modifique o fluxo direcional dos parâmetros do método.A tabela a seguir lista as palavras-chave de relacionadas à direção fornecidas por Visual Basic 2005 e translation from VPE for Csharp e mostra o equivalente IDL de interface de atributo.

Visual Basic 2005

C#

Atributo IDL

ByVal

Não há equivalente.

[in]

ByRef

Ref

[in/out]

Não há equivalente.

Limite

[out]

ByRef, ref, and check-out parâmetro modificadores causar argumentos do método ser empacotado por referência, em vez de por valor.Argumentos de método passados por valor são empacotados para código não gerenciado sistema autônomo valores na pilha; argumentos passados por referência são empacotados sistema autônomo ponteiros na pilha.A ilustração a seguir mostra o padrão de marshaling de comportamento de tipos de valor and tipos de referência com modificadores de parâmetro.

Padrão de marshaling de argumentos de método para código não gerenciado

Por padrão, sistema autônomo tipos de referência (classes, matrizes, cadeias de caracteres e interfaces) passados por valor são empacotados sistema autônomo in parâmetros por motivos de desempenho.Você não vir esses tipos de alterações, a menos que você aplicar InAttribute and OutAttribute (ou apenas OutAttribute) o parâmetro do método.The StringBuilder classe, que é uma exceção a essa regra, é empacotado sistema autônomo um parâmetro de entrada/saída.

Interop marshaler garante o seguinte comportamento com relação aos atributos direcionais:

  • Interop marshaler nunca gera uma operação de gravar para um parâmetro em passados do código não gerenciado.Dessa forma, código não gerenciado com segurança pode passar um ponteiro para uma página de somente leitura ou um ponteiro para dados acessados simultaneamente.

  • Quando o objeto copiado contém um objeto alocado, sistema autônomo um BSTR, o empacotador sempre executa a sequência correta de alocações e destructions exigidos pelas configurações de entrada/saída.

É importante aplicar atributos direcionais com precisão no seu código.Aplicar adequadamente InAttribute and OutAttribute parâmetros em código gerenciado que garante o Tipo Library Exporter (Tlbexp.exe) usa esses bits para conjunto sistema autônomo bits in/out na biblioteca de tipos correspondente; isso é particularmente importante para tipos de referência que podem ser fixados, sistema autônomo algumas matrizes e classes.

Consulte também

Conceitos

Gerenciamento de memória com interop marshaler

Blittable e tipos Blittable não

Copiando e fixação

Outros recursos

Comportamento de marshaling padrão