Share via


Atributos direcionais

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

InAttribute e OutAttribute estão localizados na System.Runtime.InteropServices atributos de interface de namespace e são equivalentes a Interface Definition Language (IDL) [in], [out], [in/out], e [out, retval].

Observação

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

Atributos direcionais são opcionais. Aplicá-las aos parâmetros de método quando desejar alterar o comportamento padrão de empacotamento. Se você omitir os 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.

Algumas linguagens fornecem as palavras-chave que permitem modificar o fluxo direcional de parâmetros do método. A seguinte tabela lista as palavras-relacionadas à direção chave fornecidas pelo Visual Basic 2005 e C# e mostra o equivalente IDL interface 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, e check-out argumentos de método para ser empacotado por referência, em vez de fazê-lo pelo valor de causar modificadores de parâmetro. Os argumentos do método passados por valor são empacotados para código não gerenciado, como valores na pilha; os argumentos passados por referência são empacotados como ponteiros na pilha. A ilustração a seguir mostra o padrão de empacotamento de comportamento de tipos de valor e tipos de referência com modificadores de parâmetro.

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

Comportamento de marshaling padrão

Por padrão, os tipos de referência (classes, matrizes, cadeias de caracteres e interfaces) passados por valor são empacotados como nos parâmetros por motivos de desempenho. Não há alterações a esses tipos, a menos que você aplicar InAttribute e OutAttribute (ou simplesmente OutAttribute) para o parâmetro do método. O StringBuilder classe, que é uma exceção a essa regra é empacotado como um parâmetro In/Out.

O empacotador de interoperabilidade garante o seguinte comportamento com relação aos atributos direcionais:

  • O empacotador de interoperabilidade nunca gera uma operação de gravação para um parâmetro no passado do código não gerenciado. Assim, o 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, como um BSTR, o empacotador sempre executa a seqüência correta de alocações e destructions exigidos pelo In/Out configurações.

É importante aplicar atributos direcionais com precisão em seu código. Aplicar adequadamente InAttribute e OutAttribute parâmetros de código gerenciado, garante que o Type Library Exporter (Tlbexp. exe) usa esses bits para definir a /out bits na biblioteca de tipos correspondente; Isso é particularmente importante para os tipos de referência podem ser fixados, como, por exemplo, algumas classes e arrays.

Consulte também

Conceitos

Gerenciamento de memória com o empacotador de interoperabilidade

Blittable e tipos de não-Blittable

Copiando e fixando

Outros recursos

Comportamento de empacotamento padrão