Compartilhar via


Blittable e tipos de não-Blittable

A maioria dos tipos de dados têm uma representação comum na memória gerenciada e e não exigem tratamento especial pelo interop marshaler. Esses tipos são chamados tipos blittable porque eles não exigem a conversão quando eles são passados entre gerenciados e código não gerenciado.

Chamadas de invocação de estruturas que são retornadas de plataforma deve ser tipos blittable. Invocação de plataforma não oferece suporte a estruturas de não-blittable como tipos de retorno.

Os seguintes tipos da System espaço para nome são tipos blittable:

Além disso, os seguintes tipos complexos são tipos blittable:

  • Matrizes unidimensionais de tipos blittable, como, por exemplo, uma matriz de inteiros. No entanto, um tipo que contém uma matriz de variável de tipos blittable não é propriamente dito blittable.

  • Tipos de valores formatados que contêm tipos blittable somente (e classes), se eles são empacotados como tipos formatados. Para obter mais informações sobre os tipos de valor formatado, consulte Padrão de empacotamento de tipos de valor.

Referências de objeto não são blittable. Isso inclui uma matriz de referências a objetos que são blittable por si só. Por exemplo, você pode definir uma estrutura que é blittable, mas não é possível definir um tipo blittable que contém uma matriz de referências a essas estruturas.

Como uma otimização, matrizes de tipos blittable e classes que contêm somente os membros blittable são fixado em vez de copiados durante o empacotamento. Esses tipos podem aparecer para ser empacotado como In/Out parâmetros quando o chamador e o receptor estão no mesmo compartimento. No entanto, na verdade, esses tipos são empacotados como nos parâmetros, e você deve aplicar o InAttribute e OutAttribute atributos se você quiser empacotar o argumento como um parâmetro In/Out.

Alguns tipos de dados gerenciados precisam de uma representação diferente em um ambiente não gerenciado. Esses tipos de dados não-blittable devem ser convertidos em um formulário que pode ser empacotado. Por exemplo, seqüências de caracteres gerenciadas são tipos de não-blittable, porque eles devem ser convertidos em objetos string antes que pode ser empacotados.

A tabela a seguir lista os tipos de não-blittable a System namespace. Delegados, que são estruturas de dados para se referir a um método estático ou a uma instância de classe também são não-blittable.

Tipo não-blittable

Descrição

System.Array

Converte em uma matriz de estilo c ou um SAFEARRAY.

System. Boolean

Converte um 1, 2 ou 4 bytes valor com true como 1 ou -1.

System. Char

Converte um caractere Unicode ou ANSI.

System.class

Converte em uma interface de classe.

System.Object

Converte uma variante ou uma interface.

System.Mdarray

Converte em uma matriz de estilo c ou um SAFEARRAY.

System. String

Converte uma seqüência de terminação em uma referência nula ou um BSTR.

ValueType

Converte uma estrutura com um layout de memória fixa.

System.Szarray

Converte em uma matriz de estilo c ou um SAFEARRAY.

Tipos de classe e objeto são suportados somente pelo COM interop. Para tipos correspondentes no Visual Basic 2005, C# e C++, consulte o Visão geral sobre biblioteca classes do .NET Framework.

Consulte também

Outros recursos

Comportamento de empacotamento padrão

Histórico de alterações

Date

History

Motivo

Maio de 2010

Esclarecido que a restrição de tipos de retorna se aplica às estruturas.

Correção de bug de conteúdo.