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
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