Tipos blittable e não blittable

A maioria dos tipos de dados tem uma representação comum na memória gerenciada e não gerenciada e não exige tratamento especial pelo marshaler de interoperabilidade. Esses tipos são chamados tipos blittable porque não exigem conversão quando são passados entre o código gerenciado e não gerenciado.

Estruturas retornadas de chamadas de invocação de plataforma devem ser tipos blittable. A invocação de plataforma não dá suporte a estruturas não blittable como tipos de retorno.

Os seguintes tipos do namespace System são tipos blittable:

Os seguintes tipos complexos também são tipos blittable:

  • Matrizes unidimensionais de tipos primitivos blittable, como uma matriz de inteiros. No entanto, um tipo que contém uma matriz variável de tipos blittable não é blittable em si.

  • Tipos de valor formatados que contêm somente tipos blittable (e classes, se elas tiverem o marshaling realizado como tipos formatados). Para obter mais informações sobre os tipos de valor formatados, confira Marshaling padrão para 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 mesmos. Por exemplo, é possível definir uma estrutura 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, as matrizes de tipos primitivos blittable e as classes que contêm somente membros blittable são fixadas, em vez de copiadas durante o marshaling. Esses tipos podem parecer como se tivessem o marshaling realizado como parâmetros de Entrada/Saída quando o chamador e o receptor estão no mesmo apartment. No entanto, esses tipos, na verdade, têm o marshaling realizado como parâmetros de Entrada e será necessário aplicar os atributos InAttribute e OutAttribute de você quiser realizar marshaling do argumento como um parâmetro de Entrada/Saída.

Alguns tipos de dados gerenciados exigem uma representação diferente em um ambiente não gerenciado. Esses tipos de dados não blittable devem ser convertidos em um formato que pode ter o marshaling realizado. Por exemplo, cadeias de caracteres gerenciadas não são tipos blittable porque devem ser convertidas em objetos de cadeia de caracteres antes que possam ter o marshaling realizado.

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

Tipo não bittable Descrição
System.Array Converte em uma matriz C-style ou em um SAFEARRAY.
System.Boolean Converte em um valor de 1, 2 ou 4 bytes com true como 1 ou -1.
System.Char Converte em um caractere Unicode ou ANSI.
System.Class Converte em uma interface de classe.
System.Object Converte em uma variante ou uma interface.
System.Mdarray Converte em uma matriz C-style ou em um SAFEARRAY.
System.String Converte em uma cadeia de caracteres que termina em uma referência nula ou em um BSTR.
System.Valuetype Converte em uma estrutura com um layout de memória fixo.
System.Szarray Converte em uma matriz C-style ou em um SAFEARRAY.

Há suporte para tipos de objeto e de classe apenas na interoperabilidade COM. Para tipos correspondentes no Visual Basic, C# e C++, consulte a Visão geral da biblioteca de classes.

Confira também